diff --git a/.editorconfig b/.editorconfig index 27259f5155..3d0b97c090 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,3 +2,12 @@ root = true [*] indent_style = tab + +[*.cs] +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_indent_switch_labels = true +csharp_indent_case_contents = true +csharp_indent_labels = one_less_than_current diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..85668e0f61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,43 @@ +--- +name: Bug report +about: Crashes, inaccurate emulation, nitpicks, or regressions +title: '(issue title -- summarise the summary)' +labels: '' +assignees: '' + +--- + +[//]: # "This issue description supports Markdown syntax (this is what comments look like). There's a cheatsheet here: https://guides.github.com/features/mastering-markdown/" +[//]: # "You can leave these comments here or delete them. Also, please remember to search for similar issues before writing anything, including in closed issues!" +[//]: # "One more thing: if you're on Linux, please comment on #1430 instead of opening an issue so we don't annoy the other devs." + +### Summary +[//]: # "Briefly describe what's broken. Include relevant details: loaded core, loaded rom's hash, open tools, running scripts... You can embed a screenshot if it's easier to show the bug, but if you need more than one please put them at the end." +Whenever my cat sits on the left side of my keyboard, games run too fast for me to react to. + +### Repro +[//]: # "If you can't figure out the list of steps, delete this section and put 'heisenbug' in the summary somewhere. If a Lua script can cause the bug, you can embed that instead (as simple as possible please)." +1. first step +2. second step +3. et cetera + +### Output +[//]: # "Paste the contents of the error dialog if there is one (try Ctrl+C, it usually works), or paste the output from the Lua Console, or delete this section." +``` +System.InvalidOperationException: o noes + at BizHawk.Client.EmuHawk.HawkBiz.Crash() + at BizHawk.Client.EmuHawk.HawkBiz.RunWithoutCrashing() +``` + +### Host env. +[//]: # "List the computers you've found the bug with. If there's a version that doesn't have the bug, please put that in too. Here are some examples:" +- BizHawk 2.3.2; Win10 Pro 1903; Intel/AMD +- BizHawk dev build at 92847b1d1; Win10 Home 1809; AMD/NVIDIA +- BizHawk 2.3.2; Fedora 30; AMD/AMD +- BizHawk 2.3.2; macOS 10.15; Intel/AMD +- BizHawk 1.13.2; Win7 SP1; Intel/NVIDIA + +[//]: # "(screenshots, if applicable)" + +[//]: # "That's it! If you'd like to help more, you could try a dev build (see Testing in the readme) or an older release. Click submit now and you can edit it later." + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..e73a91c88b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: true +contact_links: + - name: "BEFORE OPENING AN ISSUE: Search for duplicates" + url: "https://github.com/TASVideos/BizHawk/issues?q=is:issue+" + about: "Opens the issue tracker here on GitHub. Use `is:issue ` to find open or closed issues that might be similar to your problem." + - name: "Report issues with the Linux port" + url: "https://github.com/TASVideos/BizHawk/issues/1430" + about: "Linux users: please comment here on #1430 instead of opening a new issue." + - name: "Chat with us on IRC" + url: "https://webchat.freenode.net/#bizhawk" + about: "Joins #bizhawk on freenode with your browser. Please be patient as there isn't always somebody online." diff --git a/.gitignore b/.gitignore index 20ffa86c34..cd43b53c28 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ /snes9xgit svnrev.cs -.vs/** +**/.vs/** **/bin/** **/obj/** /output/** @@ -12,6 +12,7 @@ svnrev.cs **/ipch/** *.ilk +*.il *.tlog *.obj *.o @@ -74,3 +75,12 @@ libsnes/vs2015/libsnes.VC.db waterbox/**/*.wbx waterbox/**/*.wbx.in /BizHawkTool_template.zip + +mono_crash* + +.idea + +packages + +BizHawk.Emulation.Common/BizHawk.Emulation.Common.csproj.nuget.* +BizHawk.Emulation.Common/project.assets.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..e0e87bae3e --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,33 @@ +image: mcr.microsoft.com/dotnet/core/sdk:3.1 + +stages: + - build + - deploy + +build: + artifacts: + expire_in: "30 minutes" + name: "BizHawk_tempbuild_$CI_COMMIT_REF_SLUG" + paths: + - output + when: always + script: + - Dist/BuildRelease.sh -p:MachineRunAnalyzersDuringBuild=true + stage: build + +deploy_artifact: + artifacts: + expire_in: "1 month" + name: "BizHawk_devbuild_$CI_COMMIT_REF_SLUG" + paths: + - output + only: + - master + script: + - '' + stage: deploy + +cache: + key: "$CI_COMMIT_REF_SLUG" + paths: + - packages diff --git a/.gitmodules b/.gitmodules index 3c3d417821..26d57d3ff1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,4 +14,8 @@ [submodule "mgba"] path = mgba url = https://github.com/TASVideos/mgba.git - branch = bizhawk-0.6 + branch = bizhawk-0.9 +[submodule "melonds"] + path = melonds + url = https://github.com/TASVideos/melonDS.git + branch = SuuperW_DSHawk diff --git a/.stylecop.json b/.stylecop.json new file mode 100644 index 0000000000..9ca62ad341 --- /dev/null +++ b/.stylecop.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/1.2.0-beta.113/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "documentExposedElements": false, + "documentInterfaces": false, + "documentInternalElements": false + }, + "indentation": { + "useTabs": true + }, + "layoutRules": { + "allowConsecutiveUsings": false, + "newlineAtEndOfFile": "require" + }, + "maintainabilityRules": { + "topLevelTypes": [] + }, + "namingRules": { + "allowedHungarianPrefixes": [ "dx", "dy", "k", "sa" ] + }, + "orderingRules": { + "usingDirectivesPlacement": "outsideNamespace" + } + } +} diff --git a/Assets/EmuHawkMono.sh b/Assets/EmuHawkMono.sh index a42a52a5f6..b1b5ddfa47 100755 --- a/Assets/EmuHawkMono.sh +++ b/Assets/EmuHawkMono.sh @@ -8,11 +8,20 @@ libpath="" if [ "$(command -v lsb_release)" ]; then case "$(lsb_release -i | cut -c17- | tr -d "\n")" in "Arch"|"ManjaroLinux") libpath="/usr/lib/wine";; - "Debian"|"Ubuntu"|"LinuxMint") libpath="/usr/lib/x86_64-linux-gnu/wine";; + "Debian"|"LinuxMint"|"Ubuntu") libpath="/usr/lib/x86_64-linux-gnu/wine"; export MONO_WINFORMS_XIM_STYLE=disabled;; # see https://bugzilla.xamarin.com/show_bug.cgi?id=28047#c9 esac +else + printf "Distro does not provide LSB release info API! (You've met with a terrible fate, haven't you?)\n" fi if [ -z "$libpath" ]; then printf "%s\n" "Unknown distro, assuming WINE library location is /usr/lib/wine..." libpath="/usr/lib/wine" fi -LD_LIBRARY_PATH="$libpath" mono ./EmuHawk.exe +export LD_LIBRARY_PATH="$libpath" +if [ "$1" = "--mono-no-redirect" ]; then + shift + printf "(received --mono-no-redirect, stdout was not captured)\n" >EmuHawkMono_laststdout.txt + mono ./EmuHawk.exe "$@" +else + mono ./EmuHawk.exe "$@" >EmuHawkMono_laststdout.txt +fi diff --git a/Assets/Lua/GBA/SonicAdvance_CamHack.lua b/Assets/Lua/GBA/SonicAdvance_CamHack.lua new file mode 100644 index 0000000000..c861f29c72 --- /dev/null +++ b/Assets/Lua/GBA/SonicAdvance_CamHack.lua @@ -0,0 +1,32 @@ +-- feos, 2019 + +local offX, offY, camX, camY +local addr_offX = 0x5B96 +local addr_offY = 0x5B98 +local addr_camX = 0x59D0 +local addr_camY = 0x59D2 + +while true do + client.invisibleemulation(true) + local memorystate = memorysavestate.savecorestate() + + offX = mainmemory.read_u16_le(addr_offX) + offY = mainmemory.read_u16_le(addr_offY) + camX = mainmemory.read_u16_le(addr_camX) + camY = mainmemory.read_u16_le(addr_camY) + + Xval = camX + offX - 128 + Yval = camY + offY - 80 + + mainmemory.write_u16_le(addr_camX, Xval) + mainmemory.write_u16_le(addr_camY, Yval) + + client.seekframe(emu.framecount()+1) + client.invisibleemulation(false) + client.seekframe(emu.framecount()+1) + client.invisibleemulation(true) + memorysavestate.loadcorestate(memorystate) + memorysavestate.removestate(memorystate) +-- client.invisibleemulation(false) + emu.frameadvance() +end \ No newline at end of file diff --git a/Assets/Lua/Genesis/Gargoyles.lua b/Assets/Lua/Genesis/Gargoyles.lua index cae3a84fbc..dcb4ca070f 100644 --- a/Assets/Lua/Genesis/Gargoyles.lua +++ b/Assets/Lua/Genesis/Gargoyles.lua @@ -1,448 +1,522 @@ --- Gargoyles, Genesis (BizHawk) --- feos, 2015-2016 - ---== Shortcuts ==-- -rb = memory.read_u8 -rw = memory.read_u16_be -rws = memory.read_s16_be -r24 = memory.read_u24_be -rl = memory.read_u32_be -box = gui.drawBox -text = gui.pixelText -line = gui.drawLine -AND = bit.band -SHIFT = bit.rshift - ---== RAM addresses ==-- -levnum = 0xff00ba -LevelFlr = 0xff00c0 -LevelCon = 0xff00c4 -mapline_tab = 0xff0244 -GlobalBase = 0xff1c76 -GolBase = 0xff2c76 -MapA_Buff = 0xff4af0 - ---== Camera Hack ==-- -camhack = false -div = 1 -- scale -size = 16/div -- block size - ---== Block cache ==-- -col = 0 -- block color -opout = 0x33000000 -- outer opacity -opin = 0x66000000 -- inner opacity -op = 0xff000000 -cache = {} - ---== Other stuff ==-- -XposLast = 0 -YposLast = 0 -room = 0 -workinglast = 0 -lagcount = emu.lagcount() -gui.defaultPixelFont("fceux") - -function main() - rnd1 = rl (0xff001c) - rnd2 = rw (0xff0020) - working = rb (0xff0073) - xblocks = rw (0xff00d4) - mapw = rw (0xff00d4)*8 - maph = rw (0xff00d6)*8 - Xpos = rws(0xff0106) - Ypos = rws(0xff0108) - camx = rws(0xff010c)+16 - camy = rws(0xff010e)+16 - run = rb (0xff1699) - inv = rw (0xff16d2) - health = rws(0xff2cc6) - backx = camx - backy = camy - Xspd = Xpos-XposLast - Yspd = Ypos-YposLast - facing = AND(rb(GolBase+0x48),2) -- object flag 1 - - Background() - CamhackHUD() - Objects() - PlayerBoxes() - HUD() - RoomTime() - Input() -end - -function RoomTime() - local start11 = 894--767 - local start12 = 2294 - local start13 = 4101 - local startl4 = 6000 - timer = emu.framecount() - - if timer < start11 then room = timer - elseif timer < start12 then room = timer - start11 - elseif timer < start13 then room = timer - start12 - elseif timer < startl4 then room = timer - start13 - end - text(160,214,"room cnt: "..room, "white") -end - -function HUD() - text(1, 0,emu.framecount(), framecol) - text(1,20,emu.lagcount(), "red") - text(1,30,movie.rerecordcount(),"orange") - - if working>0 then return end - if rndlast ~= rnd1 then rndcol = "red" else rndcol = "white" end - - text( 0,214,"rnd: ","yellow") - text( 26,214,string.format("%08X %04X",rnd1,rnd2),rndcol) - text(277, 0,string.format( - "x: %4d\ny: %4d\ndx: %3d\ndy: %3d\nhp: %3d\nrun:%3d\ninv:%3d", - Xpos,Ypos,Xspd,Yspd,health,run,inv) - ) -end - -function CamhackHUD() - if working==0 then - -- screen edge - box((backx-camx- 1)/div, - (backy-camy- 1)/div, - (backx-camx+320)/div, - (backy-camy+224)/div, - 0xff0000ff) - -- map edge - box( 0-camx/div+size, - 0-camy/div+size, - mapw/div-camx/div, - maph/div-camy/div, - 0xff0000ff) - end - - text(260,206,string.format("cHack: %s\nscale: %d",ch,div)) -end - -function Background() - if working>0 then - cache = {} - return - end - - if camhack then - camx = Xpos-320/2*div - camy = Ypos-224/2*div - box(0,0,320,240,0,0x66000000) - ch = "on" - else - ch = "off" - end - - local border = 0 - local offset = 32 - local basex = camx+border - local basey = camy+border - local basei = PosToIndex(basex-offset,basey-offset) - local boundx = 320*div-border - local boundy = 224*div-border - local xblockstockeck = ((camx+boundx+offset)-(basex-offset))/size/div - local yblockstockeck = ((camy+boundy+offset)-(basey-offset))/size/div - - for yblock = 0,yblockstockeck do - for xblock = 0,xblockstockeck do - local i = yblock*xblocks+xblock+basei - local x = basex+xblock*size*div - local y = basey+yblock*size*div - - if InBounds(x,basex-offset,camx+boundx+offset) then - local unit = cache[i] - - if unit == nil or workinglast>0 then - if InBounds(x,basex,camx+boundx) - and InBounds(y,basey,camy+boundy) - then cache[i] = GetBlock(x,y) - end - else - if not InBounds(x,basex,camx+boundx) - and not InBounds(y,basey,camy+boundy) - then cache[i] = nil - end - end - - if unit ~= nil then - DrawBG(unit,x,y) - end - elseif cache[i] ~= nil - then cache[i] = nil - end - end - end -end - -function DrawBG(unit, x, y) - local val= 0 - local x1 = x/div-camx/div-(camx%16)/div - local x2 = x1+size-1 - local y1 = y/div-camy/div-(camy%16)/div - local y2 = y1+size-1 - - if unit.contour ~= nil then - box(x1,y1,x2,y2,0x5500ff00,0x5500ff00) - - for pixel=0,15 do - val = unit.contour[pixel] - if val>0 then - gui.drawPixel( - x1+pixel/div, - y1+val/div-1/div, - 0xffffff00) - end - end - end - - if unit.block>0 then - local Fn = DrawBlock[unit.block] or DrawBlockDefault - Fn(x1,y1,x2,y2) - box(x1,y1,x2,y2,col+opin,col+opout) - end -end - -function GetBlock(x,y) - if working>0 then return nil end - - local final = { contour={}, block=0 } - - if x>0 and x0 and y0 or rb(a1+8)>0 then - for pixel=0,15 do - final.contour[pixel] = rb(a1+pixel) - end - else - final.contour = nil - end - else - return nil - end - - return final -end - -function PosToIndex(x,y) - return math.floor(x/16)+math.floor(y/16)*xblocks -end - -function IndexToPos(i) - return { x=(i%xblocks)*16, y=math.floor(i/xblocks)*16 } -end - -function InBounds(x,minimum,maximum) - if x>=minimum and x<=maximum - then return true - else return false - end -end - -DrawBlock = { - [0x80] = function(x1,y1,x2,y2) -- WALL - col = 0x00ffffff -- white - line(x1,y1,x1,y2,col+op) -- left - line(x2,y1,x2,y2,col+op) -- right - end, - [0x81] = function(x1,y1,x2,y2) -- CEILING - col = 0x00ffffff -- white - line(x1,y2,x2,y2,col+op) -- bottom - end, - [0x82] = function(x1,y1,x2,y2) -- CLIMB_U - col = 0x0000ffff -- cyan - line(x1,y2,x2,y2,col+op) -- bottom - end, - [0x83] = function(x1,y1,x2,y2) -- CLIMB_R - col = 0x0000ffff -- cyan - line(x1,y1,x1,y2,col+op) -- left - end, - [0x84] = function(x1,y1,x2,y2) -- CLIMB_L - col = 0x0000ffff -- cyan - line(x2,y1,x2,y2,col+op) -- right - end, - [0x85] = function(x1,y1,x2,y2) -- CLIMB_LR - col = 0x0000ffff -- cyan - line(x1,y1,x1,y2,col+op) -- left - line(x2,y1,x2,y2,col+op) -- right - end, - [0x86] = function(x1,y1,x2,y2) -- CLIMB_R_STAND_R - col = 0x00ffffff -- white - line(x1,y1,x2,y1,col+op) -- top - col = 0x0000ffff -- cyan - line(x1,y1,x1,y2,col+op) -- left - end, - [0x87] = function(x1,y1,x2,y2) -- CLIMB_L_STAND_L - col = 0x00ffffff -- white - line(x1,y1,x2,y1,col+op) -- top - col = 0x0000ffff -- cyan - line(x2,y1,x2,y2,col+op) -- right - end, - [0x88] = function(x1,y1,x2,y2) -- CLIMB_LR_STAND_LR - col = 0x00ffffff -- white - line(x1,y1,x2,y1,col+op) -- top - col = 0x00ff00ff -- cyan - line(x1,y1,x1,y2,col+op) -- left - col = 0x0000ffff -- cyan - line(x2,y1,x2,y2,col+op) -- right - end, - [0x70] = function(x1,y1,x2,y2) -- GRAB_SWING - col = 0x0000ff00 -- green - box(x1,y1,x2,y2,col,col+opout) - end, - [0x7f] = function(x1,y1,x2,y2) -- EXIT - col = 0x00ffff00 -- yellow - end, - [0xd0] = function(x1,y1,x2,y2) -- SPIKES - col = 0x00ff0000 -- red - box(x1,y1,x2,y2,col,col+opout) - end, - [0xd1] = function(x1,y1,x2,y2) -- SPIKES - col = 0x00ff0000 -- red - box(x1,y1,x2,y2,col,col+opout) - end -} - -function DrawBlockDefault(x1,y1,x2,y2)-- LEVEL_SPECIFIC - col = 0x00ff8800 -- orange - box(x1,y1,x2,y2,col+opin,col+opout) -end - -function Objects() - if working>0 then return end - - for i=0,63 do - local base = GlobalBase+i*128 - local flag2 = AND(rb(base+0x49),0x10) -- active - - if flag2==0x10 then - local xpos = rw (base+0x00) - local ypos = rw (base+0x02) - local dmg = rb (base+0x10) - local type = rw (base+0x40) - local hp = rw (base+0x50) - local cRAM = r24(base+0x75) -- pointer to 4 collision boxes per object - local col = 0 -- collision color - local xscr = (xpos-camx)/div - local yscr = (ypos-camy)/div - - for boxx=0,4 do - local x1 = (rws(cRAM+boxx*8+0)-camx)/div - local y1 = (rws(cRAM+boxx*8+2)-camy)/div - local x2 = (rws(cRAM+boxx*8+4)-camx)/div - local y2 = (rws(cRAM+boxx*8+6)-camy)/div - - if boxx==0 then - col = 0xff00ff00 -- body - if type==282 or type==258 then hp = 1 end -- archer hp doesn't matter - if hp>0 and type>0 then - text(x1+2,y1+1,string.format("%d",hp),col,0x88000000,"gens") - end - elseif boxx==1 then - col = 0xffffff00 -- floor - elseif boxx==2 then - if dmg>0 - then col = 0xffff0000 -- projectile - else col = 0xff8800ff -- item - end - if dmg>0 then - text(x1+2,y2+1,string.format("%d",dmg),col,0x88000000,"gens") - end - else - col = 0xffffffff -- other - end - - if x1~=0x8888 and x2<320 and x1>0 and y2<224 and y1>0 then - box(x1,y1,x2,y2,col) - end - end - end - end -end - -function PlayerBoxes() - if working>0 then return end - - local xx = (Xpos-camx)/div - local yy = (Ypos-camy)/div - local col = 0xff00ffff - local swcol = col -- usual detection - - if Yspd>0 then -- gimme swings to grab! - swcol = 0xff00ff00 - elseif Yspd==0 then -- can tell that too - swcol = 0xffffffff - end - - if facing==2 then - box(xx-0xf /div-2,yy-0x2c/div-1,xx-0xf /div+0,yy-0x2c/div+1,swcol) -- lefttop - else - box(xx+0xf /div-1,yy-0x2c/div-1,xx+0xf /div+1,yy-0x2c/div+1,swcol) -- rightttop - end - - box(xx -1,yy-0x2c/div-1,xx +1,yy-0x2c/div+1,col) -- top - box(xx-0xf /div-2,yy-0x1f/div-1,xx-0xf /div+0,yy-0x1f/div+1,col) -- left - box(xx+0x10/div-1,yy-0x1f/div-1,xx+0x10/div+1,yy-0x1f/div+1,col) -- right --- box(xx -1,yy-0x1f/div-1,xx +1,yy-0x1f/div+1,col) -- center - box(xx -1,yy-0x0f/div-1,xx +1,yy-0x0f/div+1,col) -- bottom - box(xx -1,yy -1,xx +1,yy +1,0xffffff00) -- feet --- box(xx -1,yy+0x10/div-1,xx +1,yy+0x10/div+1,col) -- ground -end - -function Input() - local i,u,d,l,r,a,b,c,s - - if movie.isloaded() then - i = movie.getinput(emu.framecount()-1) - else - i = joypad.getimmediate() - end - - if i["P1 Up" ] then u = "U" else u = " " end - if i["P1 Down" ] then d = "D" else d = " " end - if i["P1 Left" ] then l = "L" else l = " " end - if i["P1 Right"] then r = "R" else r = " " end - if i["P1 A" ] then a = "A" else a = " " end - if i["P1 B" ] then b = "B" else b = " " end - if i["P1 C" ] then c = "C" else c = " " end - if i["P1 Start"] then s = "S" else s = " " end - - text(1,10,u..d..l..r..a..b..c..s,"yellow") -end - -event.onframeend(function() - emu.setislagged(rb(0xfff6d4)==0) - - if rb(0xfff6d4)==0 then - lagcount = lagcount+1 - framecol = "red" - else - framecol = "white" - end - - emu.setlagcount(lagcount) - - rndlast = rnd1 - workinglast = working - XposLast = Xpos - YposLast = Ypos -end) - -while true do - main() - emu.frameadvance() +-- Gargoyles, Genesis (BizHawk) +-- feos, 2015-2017 + +--== Shortcuts ==-- +local rb = memory.read_u8 +local rw = memory.read_u16_be +local rws = memory.read_s16_be +local r24 = memory.read_u24_be +local rl = memory.read_u32_be +local box = gui.drawBox +local text = gui.text +local ptext = gui.pixelText +local line = gui.drawLine +local AND = bit.band +local SHIFT = bit.rshift + +--== RAM addresses ==-- +local levnum = 0xff00ba +local LevelFlr = 0xff00c0 +local LevelCon = 0xff00c4 +local mapline_tab = 0xff0244 +local GlobalBase = 0xff1c76 +local GolBase = 0xff2c76 +local MapA_Buff = 0xff4af0 + +--== Camera Hack ==-- +local camhack = false +local div = 1 -- scale +local size = 16/div -- block size + +--== Block cache ==-- +local col = 0 -- block color +local opout = 0x33000000 -- outer opacity +local opin = 0x66000000 -- inner opacity +local op = 0xff000000 +local cache = {} + +--== Other stuff ==-- +local MsgCutoff = 20 +local MsgTime = 1 +local MsgStep = 14 +local MsgOffs = 2 +local MsgTable = {} +local XposLast = 0 +local YposLast = 0 +local room = 0 +local workinglast = 0 +local wSize = client.getwindowsize() +local lagcount = emu.lagcount() +gui.defaultTextBackground(0xff000000) + +--== Object types ==-- +local types = { + "Goliath","Orb","Health1PLR","Health2PLR","Health1NME","Health2NME","Numeral", + "BigExplode","SmallExplode","GlassDebris","MetalDebris","WoodDebris", + "WallDebris","SignPiece","SteamVent","BreakWall","SkyLight","BreakLight", + "ThrowCrate","BreakEdgeLeft","BreakEdgeRight","Spark","Spark2","Sparks", + "Sparks2","Fireball","HomingProj1","HorzProj1","VertProj1","DirProj1", + "DirProj2","DropMine","Scratch","Icon","RaptorBot","SniperBot","SpiderBot", + "WaspBot","Xanatos","PlasmaBot","RabidHH","MorningStar","Archer","Arrow", + "Valkyrie","Axe","WeaponExp","Couldron","SpittingCouldron","FireballHead", + "FireballTrail","BigFireballHead","BigFireballTrail","Oil","OilGenerator", + "Claw","Stump","StumpBubble","StumpFire","ClawStump","StumpFireGen","Vent", + "VentSparks","Chain","FlameLick","Floor","MutVikBody","MutVikHead", + "MutVikHammer","EyeOfOdin","EyeOfOdinTrail","L1BreakWall","Catapult", + "L1BreakFloor","Gate","GateCrusher","Weight","WeightCrusher","WallFire", + "Balista","BalistaLog","PasteWall","FlameBoulder","CastlePiece", + "MutantSpiderBot","MutSpiLegs","MutSpiHead","MutSpiHeadFlame","MutSpiProj", + "MutSpiElecV","MutSpiElecH","PlasmaBall","PlasmaBallTail","PlasmaDeadHead", + "VertFlame","WallFlame","FloorFlame","OPPlatform","OPLink","OPOrb", + "Furnace","RobotGenerator","RockGenerator","BigRock","MediumRock", + "SmallRock","BigCouldronGen","BigCouldron","Trough","TroughGen","Energizer", + "Demona","TrajectoryProj","WallPaste","EdgePaste","Tentacle","Infuser", + "BigGuns","BigGunsProj","HighSignPole","HighSign","LowLight","L5Skylight", + "L5Wall","ElecGenerator","Electricity","WaspGenerator","TunnelEdge", + "ForegroundPost","Sorcerer","LightningTop","LightningBot","MDemonaWallFire", + "MDemonaFloorFire","EyeRooftopUp","EyeRooftopDn","EyeRaptor" +} + +local function RoomTime() + local start11 = 894--767 + local start12 = 2294 + local start13 = 5468 -- 4254 -- 4101 + local startl4 = 5506 + local startl5 = 7117 + local startl6 = 8412 + local startl7 = 17117 + local timer = emu.framecount() + if timer < start11 then room = timer + elseif timer < start12 then room = timer - start11 + elseif timer < start13 then room = timer - start12 + elseif timer < startl4 then room = timer - start13 + elseif timer < startl5 then room = timer - startl4 + elseif timer < startl6 then room = timer - startl5 + elseif timer < startl7 then room = timer - startl6 + end + text(2, 2, string.format("cx:%5d\ncy:%5d\nroom:%d", camx, camy, room), "white", "bottomright") +end + +local function HUD() + --if working > 0 then return end + local rndcol = "white" + if rndlast ~= rnd1 then rndcol = "red" end + text(0, 2, string.format("RNG:%08X %04X", rnd1, rnd2), rndcol, "bottomleft") + text(2, 0, string.format( + "x: %4d\ny: %4d\ndx: %3d\ndy: %3d\nhp: %3d\nrun:%3d\ninv:%3d", + Xpos, Ypos, Xspd, Yspd, health, run, inv), + "white", "topright") +end + +local function CamhackHUD() + if working == 0 then + -- screen edge + box((backx-camx- 1)/div, + (backy-camy- 1)/div, + (backx-camx+320)/div, + (backy-camy+224)/div, + 0xff0000ff, 0) + -- map edge + box( 0-camx/div+size, + 0-camy/div+size, + mapw/div-camx/div, + maph/div-camy/div, + 0xff0000ff, 0) + end + if camhack or div > 1 then + text(0, 0, string.format("div:%d", div), "white", "topleft") + end +end + +local function PosToIndex(x, y) + return math.floor(x/16)+math.floor(y/16)*xblocks +end + +local function IndexToPos(i) + return { x=(i%xblocks)*16, y=math.floor(i/xblocks)*16 } +end + +local function InBounds(x, minimum, maximum) + if x >= minimum and x <= maximum + then return true + else return false + end +end + +local function GetBlock(x, y) + if working > 0 then return nil end + local final = { contour={}, block=0 } + if x > 0 and x < mapw + and y > 0 and y < maph then + local pixels = 0 + local x1 = x/div-camx/div + local x2 = x1+size-1 + local y1 = y/div-camy/div + local y2 = y1+size-1 + local d4 = rw(mapline_tab+SHIFT(y, 4)*2) + local a1 = r24(LevelFlr+1) + local d1 = SHIFT(rw(MapA_Buff+d4+SHIFT(x, 4)*2), 1) + final.block = rb(a1+d1+2) + d1 = rw(a1+d1) + a1 = r24(LevelCon+1)+d1 + if rb(a1) > 0 or rb(a1+8) > 0 then + for pixel=0, 15 do + final.contour[pixel] = rb(a1+pixel) + end + else + final.contour = nil + end + else + return nil + end + return final +end + +local DrawBlock = { + [0x80] = function(x1, y1, x2, y2) -- WALL + col = 0x00ffffff -- white + line(x1, y1, x1, y2, col+op) -- left + line(x2, y1, x2, y2, col+op) -- right + end, + [0x81] = function(x1, y1, x2, y2) -- CEILING + col = 0x00ffffff -- white + line(x1, y2, x2, y2, col+op) -- bottom + end, + [0x82] = function(x1, y1, x2, y2) -- CLIMB_U + col = 0x0000ffff -- cyan + line(x1, y2, x2, y2, col+op) -- bottom + end, + [0x83] = function(x1, y1, x2, y2) -- CLIMB_R + col = 0x0000ffff -- cyan + line(x1, y1, x1, y2, col+op) -- left + end, + [0x84] = function(x1, y1, x2, y2) -- CLIMB_L + col = 0x0000ffff -- cyan + line(x2, y1, x2, y2, col+op) -- right + end, + [0x85] = function(x1, y1, x2, y2) -- CLIMB_LR + col = 0x0000ffff -- cyan + line(x1, y1, x1, y2, col+op) -- left + line(x2, y1, x2, y2, col+op) -- right + end, + [0x86] = function(x1, y1, x2, y2) -- CLIMB_R_STAND_R + col = 0x00ffffff -- white + line(x1, y1, x2, y1, col+op) -- top + col = 0x0000ffff -- cyan + line(x1, y1, x1, y2, col+op) -- left + end, + [0x87] = function(x1, y1, x2, y2) -- CLIMB_L_STAND_L + col = 0x00ffffff -- white + line(x1, y1, x2, y1, col+op) -- top + col = 0x0000ffff -- cyan + line(x2, y1, x2, y2, col+op) -- right + end, + [0x88] = function(x1, y1, x2, y2) -- CLIMB_LR_STAND_LR + col = 0x00ffffff -- white + line(x1, y1, x2, y1, col+op) -- top + col = 0x00ff00ff -- cyan + line(x1, y1, x1, y2, col+op) -- left + col = 0x0000ffff -- cyan + line(x2, y1, x2, y2, col+op) -- right + end, + [0x70] = function(x1, y1, x2, y2) -- GRAB_SWING + col = 0x0000ff00 -- green + box(x1, y1, x2, y2, col, col+opout) + end, + [0x7f] = function(x1, y1, x2, y2) -- EXIT + col = 0x00ffff00 -- yellow + end, + [0xd0] = function(x1, y1, x2, y2) -- SPIKES + col = 0x00ff0000 -- red + box(x1, y1, x2, y2, col, col+opout) + end, + [0xd1] = function(x1, y1, x2, y2) -- SPIKES + col = 0x00ff0000 -- red + box(x1, y1, x2, y2, col, col+opout) + end +} + +local function DrawBlockDefault(x1, y1, x2, y2) -- LEVEL_SPECIFIC + col = 0x00ff8800 -- orange + box(x1, y1, x2, y2, col+opin, col+opout) +end + +local function DrawBG(unit, x, y) + local val= 0 + local x1 = x/div-camx/div-(camx%16)/div + local x2 = x1+size-1 + local y1 = y/div-camy/div-(camy%16)/div + local y2 = y1+size-1 + if unit.contour ~= nil then + box(x1, y1, x2, y2, 0x5500ff00, 0x5500ff00) + for pixel=0, 15 do + val = unit.contour[pixel] + --[ [-- + if val > 0 then + gui.drawPixel( + x1+pixel/div, + y1+val/div-1/div, + 0xffffff00) + end + --]]-- + end + end + if unit.block > 0 then + local Fn = DrawBlock[unit.block] or DrawBlockDefault + Fn(x1, y1, x2, y2) + box(x1, y1, x2, y2, col+opin, col+opout) + end +end + +local function Background() + if working > 0 then + cache = {} + return + end + if camhack then + camx = Xpos-320/2*div + camy = Ypos-224/2*div + box(0, 0, 320, 240, 0, 0x66000000) + end + local border = 0 + local offset = 32 + local basex = camx+border + local basey = camy+border + local basei = PosToIndex(basex-offset, basey-offset) + local boundx = 320*div-border + local boundy = 224*div-border + local xblockstockeck = ((camx+boundx+offset)-(basex-offset))/size/div + local yblockstockeck = ((camy+boundy+offset)-(basey-offset))/size/div + for yblock = 0, yblockstockeck do + for xblock = 0, xblockstockeck do + local i = yblock*xblocks+xblock+basei + local x = basex+xblock*size*div + local y = basey+yblock*size*div + if InBounds(x, basex-offset, camx+boundx+offset) then + local unit = cache[i] + if unit == nil or workinglast > 0 then + if InBounds(x, basex, camx+boundx) + and InBounds(y, basey, camy+boundy) + then cache[i] = GetBlock(x, y) + end + else + if not InBounds(x, basex, camx+boundx) + and not InBounds(y, basey, camy+boundy) + then cache[i] = nil + end + end + if unit ~= nil then + DrawBG(unit, x, y) + end + elseif cache[i] ~= nil + then cache[i] = nil + end + end + end + CamhackHUD() +end + +local function Clamp(v, vmin, vmax) + if v < vmin then v = vmin end + if v > vmax then v = vmax end + return v +end + +local function Objects() + if working > 0 then return end + for i=0, 63 do + local base = GlobalBase+i*128 + local flag2 = AND(rb(base+0x49), 0x10) -- active + if flag2 == 0x10 then + local xpos = rw (base+0x00) + local ypos = rw (base+0x02) + local state = rw (base+0x0c) + local dmg = rb (base+0x10) + local id = rw (base+0x40) + local hp = rw (base+0x50) + local cRAM = r24(base+0x75) -- pointer to 4 collision boxes per object + local xscr = (xpos-camx)/div + local yscr = (ypos-camy)/div + local num = id/6 + local name = types[num] + local col = 0 -- collision color + for boxx=0, 4 do + local x0 = rw (cRAM+boxx*8) + local x1 = (rws(cRAM+boxx*8+0)-camx)/div + local y1 = (rws(cRAM+boxx*8+2)-camy)/div + local x2 = (rws(cRAM+boxx*8+4)-camx)/div + local y2 = (rws(cRAM+boxx*8+6)-camy)/div + if boxx == 0 then + col = 0xff00ff00 -- body + -- archer hp doesn't matter + if id == 282 or id == 258 then hp = 1 end + if hp > 0 and id > 0 and x0 ~= 0x8888 then + local xx = Clamp(xscr, 0, 318-string.len(name)*4) + local yy = Clamp(yscr, 0, 214) + ptext(xx, yy+2, string.format("%d", hp), col) + end + elseif boxx == 1 then + col = 0xffffff00 -- floor + elseif boxx == 2 then + if dmg > 0 + then col = 0xffff0000 -- projectile + else col = 0xff8800ff -- item + end + if dmg > 0 then + text(x1*wSize+2, y2*wSize+1, + string.format("%d", dmg), col, 0x88000000) + end + else + col = 0xffffffff -- other + end + if x1 ~= 0x8888 + and x1 <= 320 and x2 >= 0 + and y1 <= 224 and y2 >= 0 then + box(x1, y1, x2, y2, col, 0) + end + end + end + end +end + +local function PostRndRoll() + for i = 1,#MsgTable do + if MsgTable[i] and MsgTable[i].index == i then + local base = MsgTable[i].base + local xpos = rw(base+0x00) + local ypos = rw(base+0x02) + local id = rw(base+0x40) + local x = (xpos-camx)/div + local y = (ypos-camy)/div + local num = id/6 + local ymsg = 0 + local yoffs = math.floor((i-1)/MsgCutoff)*14 + local name = types[num] + local color = 0xffffff00 + + if base == GolBase then + name = "Goliath" + elseif not name then + name = string.format("%X", base) + color = 0xff00ffff + end + if y < 224/2 then + yoffs = -yoffs + ymsg = 210 + end + + x = Clamp(x, 2, 320-string.len(name)*4) + y = Clamp(y, 20, 214) + + line ((i-1)%MsgCutoff*MsgStep+3 +MsgOffs, ymsg+yoffs+4, x, y, color-0x88000000) + ptext((i-1)%MsgCutoff*MsgStep*wSize+MsgOffs, ymsg+yoffs, i, color) + + MsgTable[i].timer = MsgTable[i].timer-1 + if MsgTable[i].timer <= 0 then + MsgTable[i] = nil + end + end + end +end + +local function PlayerBoxes() + if working > 0 then return end + local xx = (Xpos-camx)/div + local yy = (Ypos-camy)/div + local col = 0xff00ffff + local swcol = col -- usual detection + if Yspd > 0 then -- gimme swings to grab! + swcol = 0xff00ff00 + elseif Yspd == 0 then -- can tell that too + swcol = 0xffffffff + end + if facing == 2 + then box(xx-0xf /div-2, yy-0x2c/div-1, xx-0xf/div+0, yy-0x2c/div+1, swcol, 0) -- lefttop + else box(xx+0xf /div , yy-0x2c/div-1, xx+0xf/div+2, yy-0x2c/div+1, swcol, 0) -- rightttop + end + box(xx -1, yy-0x2c/div-1, xx +1, yy-0x2c/div+1, col, 0) -- top + box(xx-0xf /div-2, yy-0x1f/div-1, xx-0xf /div+0, yy-0x1f/div+1, col, 0) -- left + box(xx+0x10/div-1, yy-0x1f/div-1, xx+0x10/div+1, yy-0x1f/div+1, col, 0) -- right +-- box(xx -1, yy-0x1f/div-1, xx +1, yy-0x1f/div+1, col, 0) -- center + box(xx -1, yy-0x0f/div-1, xx +1, yy-0x0f/div+1, col, 0) -- bottom + box(xx -1, yy -1, xx +1, yy +1,0xffffff00, 0) -- feet +-- box(xx -1, yy+0x10/div-1, xx +1, yy+0x10/div+1, col, 0) -- ground +end + +local function Input() + local i, u, d, l, r, a, b, c, s + if movie.isloaded() + then i = movie.getinput(emu.framecount()-1) + else i = joypad.getimmediate() + end + if i["P1 Up" ] then u = "U" else u = " " end + if i["P1 Down" ] then d = "D" else d = " " end + if i["P1 Left" ] then l = "L" else l = " " end + if i["P1 Right"] then r = "R" else r = " " end + if i["P1 A" ] then a = "A" else a = " " end + if i["P1 B" ] then b = "B" else b = " " end + if i["P1 C" ] then c = "C" else c = " " end + if i["P1 Start"] then s = "S" else s = " " end + text(1, 10, u..d..l..r..a..b..c..s, "yellow") +end + +event.onframeend(function() + emu.setislagged(rb(0xfff6d4) == 0) + if rb(0xfff6d4) == 0 then + lagcount = lagcount+1 + framecol = "red" + else + framecol = "white" + end + emu.setlagcount(lagcount) + wSize = client.getwindowsize() + rndlast = rnd1 + workinglast = working + XposLast = Xpos + YposLast = Ypos +end) + +event.onmemoryexecute(function() + local a0 = AND(emu.getregister("M68K A0"), 0xffffff) + if a0 ~= 0xff4044 then + for i = 1, 200 do + if MsgTable[i] == nil then + MsgTable[i] = { index = i, timer = MsgTime, base = a0 } + break + end + end + end +end, 0x257A, "RNGseed") + +local function main() + rnd1 = rl (0xff001c) + rnd2 = rw (0xff0020) + working = rb (0xff0073) + xblocks = rw (0xff00d4) + mapw = rw (0xff00d4)*8 + maph = rw (0xff00d6)*8 + Xpos = rws(0xff0106) + Ypos = rws(0xff0108) + camx = rws(0xff010c)+16 + camy = rws(0xff010e)+16 + run = rb (0xff1699) + inv = rw (0xff16d2) + health = rws(0xff2cc6) + backx = camx + backy = camy + Xspd = Xpos-XposLast + Yspd = Ypos-YposLast + facing = AND(rb(GolBase+0x48), 2) -- object flag 1 + if working > 0 then MsgTable = {} end + Background() + PlayerBoxes() + Objects() + PostRndRoll() + HUD() + RoomTime() +end + +while true do + main() + emu.frameadvance() end \ No newline at end of file diff --git a/Assets/Lua/NDS/StylusInputDisplay.lua b/Assets/Lua/NDS/StylusInputDisplay.lua new file mode 100644 index 0000000000..8e5f6cb58e --- /dev/null +++ b/Assets/Lua/NDS/StylusInputDisplay.lua @@ -0,0 +1,50 @@ +-- Gives a cross hair UI for the stylus for DS games + +local upColor = 'white' +local downColor = 'green' +local dotColor = 'red' + +function Draw(x, y, maxX, maxY, isDown) + color = upColor + if isDown then + color = downColor + end + + gui.drawLine(0, y, maxX, y, color) + gui.drawLine(x, 0, x, maxY, color) + + if isDown then + gui.drawPixel(x, y, dotColor) + end +end + +while true do + if emu.getsystemid() ~= "NDS" then + console.log('This script is for Nintendo DS only') + break + end + + local btns = joypad.get() + + if movie.mode() == "PLAY" and emu.framecount() > 0 then + btns = movie.getinput(emu.framecount() - 1) + end + + local x = btns['TouchX'] + local y = btns['TouchY'] + local isDown = btns['Touch'] + + -- A bit of a hack to ensure it is not drawing while mouse moving + -- on the top screen + if y == 0 then + x = 0 + end + + pts = client.transformPoint(x, y) + local tx = pts["x"]; + local ty = pts["y"]; +gui.DrawNew("native") + Draw(tx, ty, 10000, 10000, isDown) + + emu.frameadvance() +end \ No newline at end of file diff --git a/Assets/defctrl.json b/Assets/defctrl.json index dabbc31374..f377fd07d3 100644 --- a/Assets/defctrl.json +++ b/Assets/defctrl.json @@ -1,12 +1,12 @@ { "AllTrollers": { "LibRetro Controls": { - "P1 RetroPad Up": "UpArrow,J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 RetroPad Down": "DownArrow,J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 RetroPad Left": "LeftArrow,J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 RetroPad Right": "RightArrow,J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 RetroPad Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 RetroPad Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 RetroPad Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 RetroPad Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 RetroPad Select": "Space, J1 B9, X1 Back", - "P1 RetroPad Start": "Return, J1 B10, X1 Start", + "P1 RetroPad Start": "Enter, J1 B10, X1 Start", "P1 RetroPad Y": "A, J1 B1, X1 X", "P1 RetroPad B": "Z, J1 B2, X1 A", "P1 RetroPad X": "S, J1 B4, X1 Y", @@ -26,10 +26,10 @@ "P2 RetroPad L": "", "P2 RetroPad R": "", "Pointer Pressed": "WMouse L", - "Key Backspace": "Backspace", + "Key Backspace": "BackSpace", "Key Tab": "Tab", "Key Clear": "", - "Key Return": "Return", + "Key Return": "Enter", "Key Pause": "", "Key Escape": "Escape", "Key Space": "Space", @@ -47,29 +47,29 @@ "Key Minus": "Minus", "Key Period": "Period", "Key Slash": "Slash", - "Key 0": "D0", - "Key 1": "D1", - "Key 2": "D2", - "Key 3": "D3", - "Key 4": "D4", - "Key 5": "D5", - "Key 6": "D6", - "Key 7": "D7", - "Key 8": "D8", - "Key 9": "D9", + "Key 0": "Number0", + "Key 1": "Number1", + "Key 2": "Number2", + "Key 3": "Number3", + "Key 4": "Number4", + "Key 5": "Number5", + "Key 6": "Number6", + "Key 7": "Number7", + "Key 8": "Number8", + "Key 9": "Number9", "Key Colon": "", "Key Semicolon": "Semicolon", "Key Less": "", - "Key Equals": "Equals", + "Key Equals": "Plus", "Key Greater": "", "Key Question": "", "Key At": "", - "Key LeftBracket": "LeftBracket", - "Key Backslash": "Backslash", - "Key RightBracket": "RightBracket", + "Key LeftBracket": "BracketLeft", + "Key Backslash": "BackSlash", + "Key RightBracket": "BracketRight", "Key Caret": "", "Key Underscore": "", - "Key Backquote": "Grave", + "Key Backquote": "Tilde", "Key A": "A", "Key B": "B", "Key C": "C", @@ -97,27 +97,27 @@ "Key Y": "Y", "Key Z": "Z", "Key Delete": "Delete", - "Key KP0": "NumberPad0", - "Key KP1": "NumberPad1", - "Key KP2": "NumberPad2", - "Key KP3": "NumberPad3", - "Key KP4": "NumberPad4", - "Key KP5": "NumberPad5", - "Key KP6": "NumberPad6", - "Key KP7": "NumberPad7", - "Key KP8": "NumberPad8", - "Key KP9": "NumberPad9", - "Key KP_Period": "NumberPadPeriod", - "Key KP_Divide": "NumberPadSlash", - "Key KP_Multiply": "NumberPadStar", - "Key KP_Minus": "NumberPadMinus", - "Key KP_Plus": "NumberPadPlus", - "Key KP_Enter": "NumberPadEnter", + "Key KP0": "Keypad0", + "Key KP1": "Keypad1", + "Key KP2": "Keypad2", + "Key KP3": "Keypad3", + "Key KP4": "Keypad4", + "Key KP5": "Keypad5", + "Key KP6": "Keypad6", + "Key KP7": "Keypad7", + "Key KP8": "Keypad8", + "Key KP9": "Keypad9", + "Key KP_Period": "KeypadDecimal", + "Key KP_Divide": "KeypadDivide", + "Key KP_Multiply": "KeypadMultiply", + "Key KP_Minus": "KeypadSubtract", + "Key KP_Plus": "KeypadAdd", + "Key KP_Enter": "KeypadEnter", "Key KP_Equals": "", - "Key Up": "UpArrow", - "Key Down": "DownArrow", - "Key Left": "LeftArrow", - "Key Insert": "LeftControl", + "Key Up": "Up", + "Key Down": "Down", + "Key Left": "Left", + "Key Insert": "ControlLeft", "Key Home": "Home", "Key End": "End", "Key PageUp": "PageUp", @@ -140,12 +140,12 @@ "Key NumLock": "NumberLock", "Key CapsLock": "CapsLock", "Key ScrollLock": "ScrollLock", - "Key RShift": "RightShift", - "Key LShift": "LeftShift", - "Key RCtrl": "RightControl", - "Key LCtrl": "LeftControl", - "Key RAlt": "RightAlt", - "Key LAlt": "LeftAlt", + "Key RShift": "ShiftRight", + "Key LShift": "ShiftLeft", + "Key RCtrl": "ControlRight", + "Key LCtrl": "ControlLeft", + "Key RAlt": "AltRight", + "Key LAlt": "AltLeft", "Key RMeta": "", "Key LMeta": "", "Key LSuper": "", @@ -160,14 +160,14 @@ "Key Power": "", "Key Euro": "", "Key Undo": "", - "Key Right": "RightArrow" + "Key Right": "Right" }, "NES Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Select": "Space, J1 B9, X1 Back", "P1 B": "Z, J1 B1, X1 X", "P1 A": "X, J1 B2, X1 A", @@ -188,12 +188,12 @@ "SNES Controller": { "Reset": "", "Power": "", - "P1 Up": "UpArrow,J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow,J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow,J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow,J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 Select": "Space, J1 B9, X1 Back", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Y": "A, J1 B1, X1 X", "P1 X": "S, J1 B4, X1 Y", "P1 B": "Z, J1 B2, X1 A", @@ -207,23 +207,23 @@ "P2 Turbo": "A, J1 B3 X1 Y", "P2 Pause": "S, J1 B4 X1 B" }, - "Nintento 64 Controller": { - "P1 A Up": "UpArrow, J1 POV1U", - "P1 A Down": "DownArrow, J1 POV1D", - "P1 A Left": "LeftArrow, J1 POV1L", - "P1 A Right": "RightArrow, J1 POV1R", + "Nintendo 64 Controller": { + "P1 A Up": "Up, J1 POV1U", + "P1 A Down": "Down, J1 POV1D", + "P1 A Left": "Left, J1 POV1L", + "P1 A Right": "Right, J1 POV1R", "P1 DPad U": "X1 DpadUp", "P1 DPad D": "X1 DpadDown", "P1 DPad L": "X1 DpadLeft", "P1 DPad R": "X1 DpadRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Z": "D, J1 B3, X1 B", "P1 B": "S, J1 B1, X1 X", "P1 A": "A, J1 B2, X1 A", - "P1 C Up": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P1 C Down": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P1 C Left": "NumberPad4, J1 Z-, X1 RStickLeft", - "P1 C Right": "NumberPad6, J1 Z+, X1 RStickRight", + "P1 C Up": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P1 C Down": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P1 C Left": "Keypad4, J1 Z-, X1 RStickLeft", + "P1 C Right": "Keypad6, J1 Z+, X1 RStickRight", "P1 L": "Q, J1 B5, X1 LeftShoulder", "P1 R": "W, J1 B6, X1 RightShoulder", "P2 X Axis": "", @@ -290,49 +290,49 @@ "Power": "" }, "Gameboy Controller": { - "Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "Start": "Return, J1 B10, X1 Start", + "Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "Start": "Enter, J1 B10, X1 Start", "Select": "Space, J1 B9, X1 Back", "B": "Z, J1 B1, X1 X", "A": "X, J1 B2, X1 A", "Power": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Select": "Space, J1 B9, X1 Back", "P1 B": "Z, J1 B1, X1 X", "P1 A": "X, J1 B2, X1 A" }, "Gameboy Controller H": { - "Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "Start": "Return, J1 B10, X1 Start", + "Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "Start": "Enter, J1 B10, X1 Start", "Select": "Space, J1 B9, X1 Back", "B": "Z, J1 B1, X1 X", "A": "X, J1 B2, X1 A", "Power": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Select": "Space, J1 B9, X1 Back", "P1 B": "Z, J1 B1, X1 X", "P1 A": "X, J1 B2, X1 A" }, "GBA Controller": { - "Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "Start": "Return, J1 B10, X1 Start", + "Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "Start": "Enter, J1 B10, X1 Start", "Select": "Space, J1 B9, X1 Back", "B": "Z, J1 B1, X1 X", "A": "X, J1 B2, X1 A", @@ -340,54 +340,70 @@ "R": "E, J1 B6, X1 RightShoulder", "Power": "" }, + "NDS Controller": { + "A": "X, J1 B3, X1 B", + "B": "Z, J1 B2, X1 A", + "X": "S, J1 B4, X1 Y", + "Y": "A, J1 B1, X1 X", + "Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "L": "W, J1 B5, X1 LeftShoulder", + "R": "E, J1 B6, X1 RightShoulder", + "Select": "Space, J1 B9, X1 Back", + "Start": "Return, J1 B10, X1 Start", + "Lid": "", + "Touch": "WMouse L" + }, "Atari 2600 Basic Controller": { "Reset": "D, J1 B9, X1 Back", "Select": "S, J1 B10, X1 Start", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow,J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow,J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 Button": "Z, J1 B1, X1 X", - "P2 Up": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P2 Down": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P2 Left": "NumberPad4, J1 Z-, X1 RStickLeft", - "P2 Right": "NumberPad6, J1 Z+, X1 RStickRight", - "P2 Button": "NumberPad1, J1 B2, X1 A" + "P2 Up": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P2 Down": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P2 Left": "Keypad4, J1 Z-, X1 RStickLeft", + "P2 Right": "Keypad6, J1 Z+, X1 RStickRight", + "P2 Button": "Keypad1, J1 B2, X1 A" }, "Atari 7800 ProLine Joystick Controller": { "Power": "", "Reset": "D, J1 B9, X1 Back", "Select": "S, J1 B10, X1 Start", "Pause": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 Trigger": "Z, J1 B1, X1 X", "P1 Trigger 2": "X, J1 B2, X1 A", - "P2 Up": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P2 Down": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P2 Left": "NumberPad4, J1 Z-, X1 RStickLeft", - "P2 Right": "NumberPad6, J1 Z+, X1 RStickRight", - "P2 Trigger": "NumberPad1, J1 B4, X1 Y", - "P2 Trigger 2": "NumberPad3, J1 B3, X1 B" + "P2 Up": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P2 Down": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P2 Left": "Keypad4, J1 Z-, X1 RStickLeft", + "P2 Right": "Keypad6, J1 Z+, X1 RStickRight", + "P2 Trigger": "Keypad1, J1 B4, X1 Y", + "P2 Trigger 2": "Keypad3, J1 B3, X1 B" }, "Atari 7800 Joystick Controller": { "Power": "", "Reset": "D, J1 B9, X1 Back", "Select": "S, J1 B10, X1 Start", "Pause": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 Trigger": "Z, J1 B1, X1 X", "P1 Trigger 2": "X, J1 B2, X1 A", - "P2 Up": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P2 Down": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P2 Left": "NumberPad4, J1 Z-, X1 RStickLeft", - "P2 Right": "NumberPad6, J1 Z+, X1 RStickRight", - "P2 Trigger": "NumberPad1, J1 B4, X1 Y" + "P2 Up": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P2 Down": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P2 Left": "Keypad4, J1 Z-, X1 RStickLeft", + "P2 Right": "Keypad6, J1 Z+, X1 RStickRight", + "P2 Trigger": "Keypad1, J1 B4, X1 Y" }, "Atari 7800 Light Gun Controller": { "Power": "", @@ -401,14 +417,14 @@ "Reset": "D, J1 B9, X1 Back", "Select": "S, J1 B10, X1 Start", "Pause": "", - "P2 Trigger": "NumberPad1, J1 B4, X1 Y" + "P2 Trigger": "Keypad1, J1 B4, X1 Y" }, "Commodore 64 Controller": { - "P1 Up": "NumberPad8, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "NumberPad2, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "NumberPad4, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "NumberPad6, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Button": "NumberPad1, J1 B1, X1 X", + "P1 Up": "Keypad8, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Keypad2, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Keypad4, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Keypad6, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Button": "Keypad1, J1 B1, X1 X", "P2 Up": "", "P2 Down": "", "P2 Left": "", @@ -418,22 +434,22 @@ "Key F3": "F3", "Key F5": "F5", "Key F7": "F7", - "Key Left Arrow": "Grave", - "Key 1": "D1", - "Key 2": "D2", - "Key 3": "D3", - "Key 4": "D4", - "Key 5": "D5", - "Key 6": "D6", - "Key 7": "D7", - "Key 8": "D8", - "Key 9": "D9", - "Key 0": "D0", - "Key Plus": "Equals", + "Key Left Arrow": "Tilde", + "Key 1": "Number1", + "Key 2": "Number2", + "Key 3": "Number3", + "Key 4": "Number4", + "Key 5": "Number5", + "Key 6": "Number6", + "Key 7": "Number7", + "Key 8": "Number8", + "Key 9": "Number9", + "Key 0": "Number0", + "Key Plus": "Plus", "Key Minus": "Minus", "Key Pound": "Insert", "Key Clear/Home": "Delete", - "Key Insert/Delete": "Backspace", + "Key Insert/Delete": "BackSpace", "Key Control": "Tab", "Key Q": "Q", "Key W": "W", @@ -445,9 +461,9 @@ "Key I": "I", "Key O": "O", "Key P": "P", - "Key At": "LeftBracket", - "Key Asterisk": "RightBracket", - "Key Up Arrow": "Backslash", + "Key At": "BracketLeft", + "Key Asterisk": "BracketRight", + "Key Up Arrow": "BackSlash", "Key Restore": "", "Key Run/Stop": "CapsLock", "Key Lck": "", @@ -461,11 +477,11 @@ "Key K": "K", "Key L": "L", "Key Colon": "Semicolon", - "Key Semicolon": "Apostrophe", - "Key Equal": "RightControl", - "Key Return": "Return", - "Key Commodore": "LeftControl", - "Key Left Shift": "LeftShift", + "Key Semicolon": "Quote", + "Key Equal": "ControlRight", + "Key Return": "Enter", + "Key Commodore": "ControlLeft", + "Key Left Shift": "ShiftLeft", "Key Z": "Z", "Key X": "X", "Key C": "C", @@ -476,31 +492,31 @@ "Key Comma": "Comma", "Key Period": "Period", "Key Slash": "Slash", - "Key Right Shift": "RightShift", - "Key Cursor Up/Down": "DownArrow", - "Key Cursor Left/Right": "RightArrow", + "Key Right Shift": "ShiftRight", + "Key Cursor Up/Down": "Down", + "Key Cursor Left/Right": "Right", "Key Space": "Space" }, "ZXSpectrum Controller": { - "P1 Up": "NumberPad8, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "NumberPad2, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "NumberPad4, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "NumberPad6, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Button": "NumberPad1, J1 B1, X1 X", + "P1 Up": "Keypad8, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Keypad2, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Keypad4, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Keypad6, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Button": "Keypad1, J1 B1, X1 X", "Key True Video": "", "Key Inv Video": "", - "Key 1": "D1", - "Key 2": "D2", - "Key 3": "D3", - "Key 4": "D4", - "Key 5": "D5", - "Key 6": "D6", - "Key 7": "D7", - "Key 8": "D8", - "Key 9": "D9", - "Key 0": "D0", + "Key 1": "Number1", + "Key 2": "Number2", + "Key 3": "Number3", + "Key 4": "Number4", + "Key 5": "Number5", + "Key 6": "Number6", + "Key 7": "Number7", + "Key 8": "Number8", + "Key 9": "Number9", + "Key 0": "Number0", "Key Break": "Delete", - "Key Delete": "Backspace", + "Key Delete": "BackSpace", "Key Graph": "", "Key Q": "Q", "Key W": "W", @@ -523,8 +539,8 @@ "Key J": "J", "Key K": "K", "Key L": "L", - "Key Return": "Return", - "Key Caps Shift": "LeftShift, RightShift", + "Key Return": "Enter", + "Key Caps Shift": "ShiftLeft, ShiftRight", "Key Caps Lock": "", "Key Z": "Z", "Key X": "X", @@ -534,20 +550,20 @@ "Key N": "N", "Key M": "M", "Key Period": "Period", - "Key Symbol Shift": "LeftControl, RightControl", + "Key Symbol Shift": "ControlLeft, ControlRight", "Key Semi-Colon": "Semicolon", "Key Inverted-Comma": "", - "Key Left Cursor": "LeftArrow", - "Key Right Cursor": "RightArrow", + "Key Left Cursor": "Left", + "Key Right Cursor": "Right", "Key Space": "Space", - "Key Up Cursor": "UpArrow", - "Key Down Cursor": "DownArrow", + "Key Up Cursor": "Up", + "Key Down Cursor": "Down", "Key Comma": "Comma", "Play Tape": "F1", "Stop Tape": "F2", "RTZ Tape": "F3", "Record Tape": "", - "Key Quote": "Shift+D2", + "Key Quote": "Shift+Number2", "Insert Next Tape": "F6", "Insert Previous Tape": "F5", "Next Tape Block": "F8", @@ -558,24 +574,24 @@ "Get Disk Status": "F12" }, "Intellivision Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 L": "Z, J1 B1, X1 X", "P1 R": "X, J1 B2, X1 A", - "P1 Key0": "NumberPad0", - "P1 Key1": "NumberPad1", - "P1 Key2": "NumberPad2", - "P1 Key3": "NumberPad3", - "P1 Key4": "NumberPad4", - "P1 Key5": "NumberPad5", - "P1 Key6": "NumberPad6", - "P1 Key7": "NumberPad7", - "P1 Key8": "NumberPad9", - "P1 Key9": "NumberPad9", - "P1 Enter": "NumberPadEnter", - "P1 Clear": "NumberPadPeriod", + "P1 Key0": "Keypad0", + "P1 Key1": "Keypad1", + "P1 Key2": "Keypad2", + "P1 Key3": "Keypad3", + "P1 Key4": "Keypad4", + "P1 Key5": "Keypad5", + "P1 Key6": "Keypad6", + "P1 Key7": "Keypad7", + "P1 Key8": "Keypad9", + "P1 Key9": "Keypad9", + "P1 Enter": "KeypadEnter", + "P1 Clear": "KeypadDecimal", "P2 Up": "", "P2 Down": "", "P2 Left": "", @@ -596,10 +612,10 @@ "P2 Clear": "" }, "PC-FX Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 I": "C, J1 B1, X1 X", "P1 II": "X, J1 B2, X1 A", "P1 III": "Z, J1 B4, X1 Y", @@ -607,11 +623,11 @@ "P1 V": "S, J1 B11, X1 X", "P1 VI": "A, J1 B12, X1 X", "P1 Select": "Space, J1 B9, X1 Back", - "P1 Run": "Return, J1 B10, X1 Start", + "P1 Run": "Enter, J1 B10, X1 Start", "P1 Mode 1": "", "P1 Mode 2": "", - "P2 Mouse Left": "NumberPad1", - "P2 Mouse Right": "NumberPad2", + "P2 Mouse Left": "Keypad1", + "P2 Mouse Right": "Keypad2", "Power": "", "Reset": "", "Previous Disk": "", @@ -622,11 +638,11 @@ "Saturn Controller": { "Power": "", "Reset": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 X": "D, J1 B3, X1 B", "P1 Y": "S, J1 B11, X1 X", "P1 Z": "A, J1 B12, X1 X", @@ -651,21 +667,21 @@ "P1 F10": "F10", "P1 F11": "F11", "P1 F12": "F12", - "P1 Grave`": "Grave", - "P1 1(One)": "D1", - "P1 2": "D2", - "P1 3": "D3", - "P1 4": "D4", - "P1 5": "D5", - "P1 6": "D6", - "P1 7": "D7", - "P1 8": "D8", - "P1 9": "D9", - "P1 0(Zero)": "D0", + "P1 Grave`": "Tilde", + "P1 1(One)": "Number1", + "P1 2": "Number2", + "P1 3": "Number3", + "P1 4": "Number4", + "P1 5": "Number5", + "P1 6": "Number6", + "P1 7": "Number7", + "P1 8": "Number8", + "P1 9": "Number9", + "P1 0(Zero)": "Number0", "P1 Minus-": "Minus", - "P1 Equals=": "Equals", - "P1 Backslash\\": "Backslash", - "P1 Backspace": "Backspace", + "P1 Equals=": "Plus", + "P1 Backslash\\": "BackSlash", + "P1 Backspace": "BackSpace", "P1 Tab": "Tab", "P1 Q": "Q", "P1 W": "W", @@ -677,9 +693,9 @@ "P1 I": "I", "P1 O": "O", "P1 P": "P", - "P1 LeftBracket[": "LeftBracket", - "P1 RightBracket]": "RightBracket", - "P1 Enter": "Return", + "P1 LeftBracket[": "BracketLeft", + "P1 RightBracket]": "BracketRight", + "P1 Enter": "Enter", "P1 CapsLock": "CapsLock", "P1 A(Key)": "A", "P1 S": "S", @@ -691,8 +707,8 @@ "P1 K": "K", "P1 L(Key)": "L", "P1 Semicolon;": "Semicolon", - "P1 Quote'": "Apostrophe", - "P1 LeftShift": "LeftShift", + "P1 Quote'": "Quote", + "P1 LeftShift": "ShiftLeft", "P1 Z(Key)": "Z", "P1 X(Key)": "X", "P1 C(Key)": "C", @@ -703,12 +719,12 @@ "P1 Comma,": "Comma", "P1 Period.": "Period", "P1 Slash/": "Slash", - "P1 RightShift": "RightShift", - "P1 LeftCtrl": "LeftControl", - "P1 LeftAlt": "LeftAlt", + "P1 RightShift": "ShiftRight", + "P1 LeftCtrl": "ControlLeft", + "P1 LeftAlt": "AltLeft", "P1 Space": "Space", - "P1 RightAlt": "RightAlt", - "P1 RightCtrl": "RightControl", + "P1 RightAlt": "AltRight", + "P1 RightCtrl": "ControlRight", "P1 PrintScreen": "", "P1 ScrollLock": "ScrollLock", "P1 Pause": "Pause", @@ -718,39 +734,39 @@ "P1 End": "End", "P1 PageUp": "PageUp", "P1 PageDown": "PageDown", - "P1 Up": "UpArrow", - "P1 Down": "DownArrow", - "P1 CursorLeft": "LeftArrow", - "P1 Right": "RightArrow", + "P1 Up": "Up", + "P1 Down": "Down", + "P1 CursorLeft": "Left", + "P1 Right": "Right", "P1 NumLock": "NumberLock", - "P1 KeypadSlash(Divide)": "NumberPadSlash", - "P1 KeypadAsterisk(Multiply)": "NumberPadStar", - "P1 KeypadMinus": "NumberPadMinus", - "P1 KeypadHome/7": "NumberPad7", - "P1 KeypadUp/8": "NumberPad8", - "P1 KeypadPageup/9": "NumberPad9", - "P1 KeypadPlus": "NumberPadPlus", - "P1 KeypadLeft/4": "NumberPad4", - "P1 KeypadCenter/5": "NumberPad5", - "P1 KeypadRight/6": "NumberPad6", - "P1 KeypadEnd/1": "NumberPad1", - "P1 KeypadDown/2": "NumberPad2", - "P1 KeypadPagedown/3": "NumberPad3", - "P1 KeypadEnter": "NumberPadEnter", - "P1 KeypadInsert/0": "NumberPad0", - "P1 KeypadDelete": "NumberPadPeriod" + "P1 KeypadSlash(Divide)": "KeypadDivide", + "P1 KeypadAsterisk(Multiply)": "KeypadMultiply", + "P1 KeypadMinus": "KeypadSubtract", + "P1 KeypadHome/7": "Keypad7", + "P1 KeypadUp/8": "Keypad8", + "P1 KeypadPageup/9": "Keypad9", + "P1 KeypadPlus": "KeypadAdd", + "P1 KeypadLeft/4": "Keypad4", + "P1 KeypadCenter/5": "Keypad5", + "P1 KeypadRight/6": "Keypad6", + "P1 KeypadEnd/1": "Keypad1", + "P1 KeypadDown/2": "Keypad2", + "P1 KeypadPagedown/3": "Keypad3", + "P1 KeypadEnter": "KeypadEnter", + "P1 KeypadInsert/0": "Keypad0", + "P1 KeypadDelete": "KeypadDecimal" }, "PC Engine Controller": { "Reset": "", "Power": "", - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 B2": "Z, J1 B1, X1 X", "P1 B1": "X, J1 B2, X1 A", "P1 Select": "V, J1 B9, X1 Back", - "P1 Run": "Return, J1 B10, X1 Start", + "P1 Run": "Enter, J1 B10, X1 Start", "P2 Up": "", "P2 Down": "", "P2 Left": "", @@ -785,24 +801,24 @@ "P5 Run": "" }, "ColecoVision Basic Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 L": "Z, J1 B5, X1 LeftShoulder", "P1 R": "X, J1 B6, X1 RightShoulder", - "P1 Key 1": "NumberPad1, J1 B1, X1 X", - "P1 Key 2": "NumberPad2, J1 B2, X1 A", - "P1 Key 3": "NumberPad3, J1 B3, X1 B", - "P1 Key 4": "NumberPad4, J1 B4, X1 Y", - "P1 Key 5": "NumberPad5, J1 RotationZ-, X1 RStickUp", - "P1 Key 6": "NumberPad6, J1 RotationZ+, X1 RStickDown", - "P1 Key 7": "NumberPad7, J1 Z-, X1 RStickLeft", - "P1 Key 8": "NumberPad8, J1 Z+, X1 RStickRight", - "P1 Key 9": "NumberPad9, J1 B11, X1 LeftThumb", - "P1 Star": "NumberPadEnter, J1 B9, X1 Back", - "P1 Key 0": "NumberPad0, J1 B12, X1 RightThumb", - "P1 Pound": "NumberPadPeriod, J1 B10, X1 Start", + "P1 Key 1": "Keypad1, J1 B1, X1 X", + "P1 Key 2": "Keypad2, J1 B2, X1 A", + "P1 Key 3": "Keypad3, J1 B3, X1 B", + "P1 Key 4": "Keypad4, J1 B4, X1 Y", + "P1 Key 5": "Keypad5, J1 RotationZ-, X1 RStickUp", + "P1 Key 6": "Keypad6, J1 RotationZ+, X1 RStickDown", + "P1 Key 7": "Keypad7, J1 Z-, X1 RStickLeft", + "P1 Key 8": "Keypad8, J1 Z+, X1 RStickRight", + "P1 Key 9": "Keypad9, J1 B11, X1 LeftThumb", + "P1 Star": "KeypadEnter, J1 B9, X1 Back", + "P1 Key 0": "Keypad0, J1 B12, X1 RightThumb", + "P1 Pound": "KeypadDecimal, J1 B10, X1 Start", "P2 Up": "", "P2 Down": "", "P2 Left": "", @@ -823,10 +839,10 @@ "P2 Pound": "" }, "SMS Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 B1": "Z, J1 B1, X1 X", "P1 B2": "X, J1 B2, X1 A", "Reset": "J1 B9, X1 Back", @@ -839,8 +855,8 @@ "P2 B2": "" }, "SMS Paddle Controller": { - "P1 Left": "LeftArrow, J1 POV1L", - "P1 Right": "RightArrow, J1 POV1R", + "P1 Left": "Left, J1 POV1L", + "P1 Right": "Right, J1 POV1R", "P1 B1": "Z, J1 B1, X1 X", "Reset": "J1 B9, X1 Back", "Pause": "J1 B10, X1 Start" @@ -851,10 +867,10 @@ "Pause": "J1 B10, X1 Start" }, "SMS Sports Pad Controller": { - "P1 Up": "UpArrow, J1 POV1U", - "P1 Down": "DownArrow, J1 POV1D", - "P1 Left": "LeftArrow, J1 POV1L", - "P1 Right": "RightArrow, J1 POV1R", + "P1 Up": "Up, J1 POV1U", + "P1 Down": "Down, J1 POV1D", + "P1 Left": "Left, J1 POV1L", + "P1 Right": "Right, J1 POV1R", "P1 B1": "Z, J1 B1, X1 X", "P1 B2": "X, J1 B2, X1 A", "Reset": "J1 B9, X1 Back", @@ -867,19 +883,19 @@ "P2 B2": "" }, "SMS Keyboard Controller": { - "Key 1": "D1", - "Key 2": "D2", - "Key 3": "D3", - "Key 4": "D4", - "Key 5": "D5", - "Key 6": "D6", - "Key 7": "D7", - "Key 8": "D8", - "Key 9": "D9", - "Key 0": "D0", + "Key 1": "Number1", + "Key 2": "Number2", + "Key 3": "Number3", + "Key 4": "Number4", + "Key 5": "Number5", + "Key 6": "Number6", + "Key 7": "Number7", + "Key 8": "Number8", + "Key 9": "Number9", + "Key 0": "Number0", "Key Minus": "Minus", - "Key Caret": "Equals", - "Key Yen": "Backspace", + "Key Caret": "Plus", + "Key Yen": "BackSpace", "Key Break": "Delete", "Key Function": "Tab", @@ -893,10 +909,10 @@ "Key I": "I", "Key O": "O", "Key P": "P", - "Key At": "LeftBracket", - "Key Left Bracket": "RightBracket", - "Key Return": "Return", - "Key Up Arrow": "UpArrow", + "Key At": "BracketLeft", + "Key Left Bracket": "BracketRight", + "Key Return": "Enter", + "Key Up Arrow": "Up", "Key Control": "CapsLock", "Key A": "A", @@ -909,12 +925,12 @@ "Key K": "K", "Key L": "L", "Key Semicolon": "Semicolon", - "Key Colon": "Apostrophe", - "Key Right Bracket": "Backslash", - "Key Left Arrow": "LeftArrow", - "Key Right Arrow": "RightArrow", + "Key Colon": "Quote", + "Key Right Bracket": "BackSlash", + "Key Left Arrow": "Left", + "Key Right Arrow": "Right", - "Key Shift": "LeftShift", + "Key Shift": "ShiftLeft", "Key Z": "Z", "Key X": "X", "Key C": "C", @@ -925,8 +941,8 @@ "Key Comma": "Comma", "Key Period": "Period", "Key Slash": "Slash", - "Key PI": "RightShift", - "Key Down Arrow": "DownArrow", + "Key PI": "ShiftRight", + "Key Down Arrow": "Down", "Key Graph": "PageUp", "Key Kana": "PageDown", @@ -950,57 +966,57 @@ "P2 B2": "" }, "GG Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 B1": "Z, J1 B1, X1 X", "P1 B2": "X, J1 B2, X1 A", "Reset": "J1 B9, X1 Back", - "P1 Start": "Return, J1 B10, X1 Start" + "P1 Start": "Enter, J1 B10, X1 Start" }, "Dual Gameboy Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 Select": "Space, J1 B9, X1 Space", "P1 B": "Z, J1 B1, X1 X", "P1 A": "X, J1 B2, X1 A", "P1 Power": "", - "P2 Up": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P2 Down": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P2 Left": "NumberPad4, J1 Z-, X1 RStickLeft", - "P2 Right": "NumberPad6, J1 Z+, X1 RStickRight", - "P2 Start": "RightBracket, J1 B5, X1 LeftShoulder", - "P2 Select": "LeftBracket, J1 B6, X1 RightShoulder", + "P2 Up": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P2 Down": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P2 Left": "Keypad4, J1 Z-, X1 RStickLeft", + "P2 Right": "Keypad6, J1 Z+, X1 RStickRight", + "P2 Start": "BracketRight, J1 B5, X1 LeftShoulder", + "P2 Select": "BracketLeft, J1 B6, X1 RightShoulder", "P2 B": "C, J1 B4, X1 Y", "P2 A": "V, J1 B3, X1 B", "P2 Power": "" }, "TI83 Controller": { - "0": "NumberPad0", - "1": "NumberPad1", - "2": "NumberPad2", - "3": "NumberPad3", - "4": "NumberPad4", - "5": "NumberPad5", - "6": "NumberPad6", - "7": "NumberPad7", - "8": "NumberPad8", - "9": "NumberPad9", - "DOT": "NumberPadPeriod", + "0": "Keypad0", + "1": "Keypad1", + "2": "Keypad2", + "3": "Keypad3", + "4": "Keypad4", + "5": "Keypad5", + "6": "Keypad6", + "7": "Keypad7", + "8": "Keypad8", + "9": "Keypad9", + "DOT": "KeypadDecimal", "ON": "Space", - "ENTER": "Return, NumberPadEnter", - "DOWN": "DownArrow", - "UP": "UpArrow", - "LEFT": "LeftArrow", - "RIGHT": "RightArrow", - "PLUS": "NumberPadPlus", - "MINUS": "NumberPadMinus", - "MULTIPLY": "NumberPadStar", - "DIVIDE": "NumberPadSlash", + "ENTER": "Enter, KeypadEnter", + "DOWN": "Down", + "UP": "Up", + "LEFT": "Left", + "RIGHT": "Right", + "PLUS": "KeypadAdd", + "MINUS": "KeypadSubtract", + "MULTIPLY": "KeypadMultiply", + "DIVIDE": "KeypadDivide", "CLEAR": "Escape", "EXP": "6", "DASH": "Minus", @@ -1012,7 +1028,7 @@ "PRGM": "R", "STAT": "S", "SIN": "Period", - "MATRIX": "LeftBracket", + "MATRIX": "BracketLeft", "X": "X", "STO": "Insert", "LN": "L", @@ -1032,14 +1048,14 @@ "COMMA": "Comma" }, "GPGX Genesis Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 A": "Z, J1 B1, X1 X", "P1 B": "X, J1 B2, X1 A", "P1 C": "C, J1 B4, X1 Y", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 X": "A, J1 B3, X1 B", "P1 Y": "S, J1 B5, X1 LeftShoulder", "P1 Z": "D, J1 B6, X1 RightShoulder", @@ -1057,23 +1073,23 @@ "P2 Z": "", "P2 Mode": "", "P2 Lightgun Trigger": "WMouse L", - "P2 Lightgun Start": "NumberPad5", + "P2 Lightgun Start": "Keypad5", "P2 Mouse Left": "WMouse L", "P2 Mouse Center": "WMouse M", "P2 Mouse Right": "WMouse R", - "P2 Mouse Start": "NumberPad5", + "P2 Mouse Start": "Keypad5", "Power": "", "Reset": "" }, "PicoDrive Genesis Controller": { - "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 Left": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 Right": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", "P1 A": "Z, J1 B1, X1 X", "P1 B": "X, J1 B2, X1 A", "P1 C": "C, J1 B4, X1 Y", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 X": "A, J1 B3, X1 B", "P1 Y": "S, J1 B5, X1 LeftShoulder", "P1 Z": "D, J1 B6, X1 RightShoulder", @@ -1094,92 +1110,92 @@ "Reset": "" }, "WonderSwan Controller": { - "P1 X1": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P1 X3": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P1 X4": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P1 X2": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P1 Y1": "NumberPad8, J1 RotationZ-, X1 RStickUp", - "P1 Y3": "NumberPad2, J1 RotationZ+, X1 RStickDown", - "P1 Y4": "NumberPad4, J1 Z-, X1 RStickLeft", - "P1 Y2": "NumberPad6, J1 Z+, X1 RStickRight", - "P1 Start": "Return, J1 B10, X1 Start", + "P1 X1": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 X3": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 X4": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 X2": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Y1": "Keypad8, J1 RotationZ-, X1 RStickUp", + "P1 Y3": "Keypad2, J1 RotationZ+, X1 RStickDown", + "P1 Y4": "Keypad4, J1 Z-, X1 RStickLeft", + "P1 Y2": "Keypad6, J1 Z+, X1 RStickRight", + "P1 Start": "Enter, J1 B10, X1 Start", "P1 B": "Z, J1 B1, X1 X", "P1 A": "X, J1 B2, X1 A", "P2 X1": "", "P2 X3": "X, J1 B2, X1 A", "P2 X4": "Z, J1 B1, X1 X", "P2 X2": "", - "P2 Y1": "LeftArrow, J1 POV1L, X1 DpadLeft, X1 LStickLeft", - "P2 Y3": "RightArrow, J1 POV1R, X1 DpadRight, X1 LStickRight", - "P2 Y4": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", - "P2 Y2": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", - "P2 Start": "Return, J1 B10, X1 Start", + "P2 Y1": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P2 Y3": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P2 Y4": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P2 Y2": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P2 Start": "Enter, J1 B10, X1 Start", "P2 B": "", "P2 A": "", "Power": "" }, "PSX DualShock Controller": { - "P1 Up": "X1 DpadUp,UpArrow", - "P1 Down": "X1 DpadDown,DownArrow", - "P1 Left": "X1 DpadLeft,LeftArrow", - "P1 Right": "X1 DpadRight,RightArrow", - "P1 Select": "X1 Back,Space", - "P1 Start": "X1 Start,Return", - "P1 Square": "X1 X,A", - "P1 Triangle": "X1 Y,S", - "P1 Circle": "X1 B,X", - "P1 Cross": "X1 A,Z", - "P1 L1": "X1 LeftShoulder,Q", - "P1 R1": "X1 RightShoulder,W", - "P1 L2": "X1 LeftTrigger,E", - "P1 R2": "X1 RightTrigger,R", - "P1 L3": "X1 LeftThumb,T", - "P1 R3": "X1 RightThumb,Y", + "P1 Up": "X1 DpadUp, Up", + "P1 Down": "X1 DpadDown, Down", + "P1 Left": "X1 DpadLeft, Left", + "P1 Right": "X1 DpadRight, Right", + "P1 Select": "X1 Back, Space", + "P1 Start": "X1 Start, Enter", + "P1 Square": "X1 X, A", + "P1 Triangle": "X1 Y, S", + "P1 Circle": "X1 B, X", + "P1 Cross": "X1 A, Z", + "P1 L1": "X1 LeftShoulder, Q", + "P1 R1": "X1 RightShoulder, W", + "P1 L2": "X1 LeftTrigger, E", + "P1 R2": "X1 RightTrigger, R", + "P1 L3": "X1 LeftThumb, T", + "P1 R3": "X1 RightThumb, Y", "P1 MODE": "D" }, "Lynx Controller": { - "Up": "UpArrow", - "Down": "DownArrow", - "Left": "LeftArrow", - "Right": "RightArrow", + "Up": "Up", + "Down": "Down", + "Left": "Left", + "Right": "Right", "A": "X", "B": "Z", "Option 1": "A", "Option 2": "S", - "Pause": "Return", + "Pause": "Enter", "Power": "" }, "Apple IIe Keyboard": { "Delete": "Delete", - "Left": "LeftArrow", + "Left": "Left", "Tab": "Tab", - "Down": "DownArrow", - "Up": "UpArrow", - "Return": "Return", - "Right": "RightArrow", + "Down": "Down", + "Up": "Up", + "Return": "Enter", + "Right": "Right", "Escape": "", "Space": "Space", - "'": "Apostrophe", + "'": "Quote", ",": "Comma", "-": "Minus", ".": "Period", "/": "Slash", - "0": "NumberPad0", - "1": "NumberPad1", - "2": "NumberPad2", - "3": "NumberPad3", - "4": "NumberPad4", - "5": "NumberPad5", - "6": "NumberPad6", - "7": "NumberPad7", - "8": "NumberPad8", - "9": "NumberPad9", + "0": "Keypad0", + "1": "Keypad1", + "2": "Keypad2", + "3": "Keypad3", + "4": "Keypad4", + "5": "Keypad5", + "6": "Keypad6", + "7": "Keypad7", + "8": "Keypad8", + "9": "Keypad9", ";": "Semicolon", - "=": "Equals", - "[": "LeftBracket", - "\\": "Backslash", - "]": "RightBracket", - "`": "Grave", + "=": "Plus", + "[": "BracketLeft", + "\\": "BackSlash", + "]": "BracketRight", + "`": "Tilde", "A": "A", "B": "B", "C": "C", @@ -1206,39 +1222,79 @@ "X": "X", "Y": "Y", "Z": "Z", - "Control": "RightControl", - "Shift": "RightShift", + "Control": "ControlRight", + "Shift": "ShiftRight", "Caps Lock": "CapsLock", "Previous Disk": "", "Next Disk": "" }, "VirtualBoy Controller": { - "L_Up": "UpArrow, X1 DpadUp, X1 LStickUp", - "L_Down": "DownArrow, X1 DpadDown, X1 LStickDown", - "L_Left": "LeftArrow, X1 DpadLeft, X1 LStickLeft", - "L_Right": "RightArrow, X1 DpadRight, X1 LStickRight", - "R_Up": "NumberPad8, X1 RStickUp", - "R_Down": "NumberPad2, X1 RStickDown", - "R_Left": "NumberPad4, X1 RStickLeft", - "R_Right": "NumberPad6, X1 RStickRight", + "L_Up": "Up, X1 DpadUp, X1 LStickUp", + "L_Down": "Down, X1 DpadDown, X1 LStickDown", + "L_Left": "Left, X1 DpadLeft, X1 LStickLeft", + "L_Right": "Right, X1 DpadRight, X1 LStickRight", + "R_Up": "Keypad8, X1 RStickUp", + "R_Down": "Keypad2, X1 RStickDown", + "R_Left": "Keypad4, X1 RStickLeft", + "R_Right": "Keypad6, X1 RStickRight", "B": "Z, X1 X", "A": "X, X1 A", "R": "W, X1 LeftShoulder", "L": "E, X1 RightShoulder", "Select": "Space, X1 Back", - "Start": "Return, X1 Start", + "Start": "Enter, X1 Start", "Power": "" }, "NeoGeo Portable Controller": { - "Up": "UpArrow, X1 DpadUp, X1 LStickUp", - "Down": "DownArrow, X1 DpadDown, X1 LStickDown", - "Left": "LeftArrow, X1 DpadLeft, X1 LStickLeft", - "Right": "RightArrow, X1 DpadRight, X1 LStickRight", + "Up": "Up, X1 DpadUp, X1 LStickUp", + "Down": "Down, X1 DpadDown, X1 LStickDown", + "Left": "Left, X1 DpadLeft, X1 LStickLeft", + "Right": "Right, X1 DpadRight, X1 LStickRight", "B": "Z, J1 B1, X1 X", "A": "X, J1 B2, X1 A", - "Option": "Return, J1 B10, X1 Start", + "Option": "Enter, J1 B10, X1 Start", "Power": "" - } + }, + "Vectrex Digital Controller": { + "Reset": "", + "Power": "", + "P1 Up": "Up, J1 POV1U, X1 DpadUp, X1 LStickUp", + "P1 Down": "Down, J1 POV1D, X1 DpadDown, X1 LStickDown", + "P1 Left": "Left, J1 POV1L, X1 DpadLeft, X1 LStickLeft", + "P1 Right": "Right, J1 POV1R, X1 DpadRight, X1 LStickRight", + "P1 Button 1": "Z, J1 B2, X1 A", + "P1 Button 2": "X, J1 B3, X1 B", + "P1 Button 3": "A, J1 B1, X1 X", + "P1 Button 4": "S, J1 B4, X1 Y" + }, + "Vectrex Analog Controller": { + "Reset": "", + "Power": "", + "P1 Button 1": "Z, J1 B2, X1 A", + "P1 Button 2": "X, J1 B3, X1 B", + "P1 Button 3": "A, J1 B1, X1 X", + "P1 Button 4": "S, J1 B4, X1 Y" + }, + "O2 Joystick": { + "P1 Up": "Up", + "P1 Down": "Down", + "P1 Left": "Left", + "P1 Right": "Right", + "P1 F": "Z", + "0": "Keypad0", + "1": "Keypad1", + "2": "Keypad2", + "3": "Keypad3", + "4": "Keypad4", + "5": "Keypad5", + "6": "Keypad6", + "7": "Keypad7", + "8": "Keypad8", + "9": "Keypad9", + "YES": "Y", + "NO": "N", + "ENT": "KeypadEnter" + } }, "AllTrollersAutoFire": { "NES Controller": { @@ -1439,7 +1495,7 @@ "Tab": "", "Down": "", "Up": "", - "Return": "Return", + "Return": "Enter", "Right": "", "Escape": "", "Space": "", @@ -1576,14 +1632,26 @@ "Deadzone": 0.0 } }, - "Nintento 64 Controller": { + "NDS Controller": { + "TouchX": { + "Value": "WMouse X", + "Mult": 1.0, + "Deadzone": 0.0 + }, + "TouchY": { + "Value": "WMouse Y", + "Mult": 1.0, + "Deadzone": 0.0 + } + }, + "Nintendo 64 Controller": { "P1 X Axis": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Y Axis": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, @@ -1644,22 +1712,22 @@ "Lynx Controller": {}, "DualShock Controller": { "P1 LStick X": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 LStick Y": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 RStick X": { - "Value": "X1 RightThumbX", + "Value": "X1 RightThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 RStick Y": { - "Value": "X1 RightThumbY", + "Value": "X1 RightThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 } @@ -1689,24 +1757,24 @@ }, "PC-FX Controller": { "P2 Mouse X": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P2 Mouse Y": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 } }, "SNES Controller": { "P1 Mouse X": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Mouse Y": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, @@ -1725,7 +1793,7 @@ "NeoGeo Portable Controller": {}, "Saturn Controller": { "P1 Right Stick Horizontal": { - "Value": "X1 RightThumbX", + "Value": "X1 RightThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, @@ -1735,17 +1803,17 @@ "Deadzone": 0.1 }, "P1 Right Throttle": { - "Value": "X1 RightThumbY", + "Value": "X1 RightThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Left Stick Horizontal": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Left Stick Vertical": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, @@ -1755,22 +1823,22 @@ "Deadzone": 0.1 }, "P1 Wheel": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Stick Horizontal": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Stick Vertical": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Throttle": { - "Value": "X1 RightThumbX", + "Value": "X1 RightThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, @@ -1787,7 +1855,7 @@ }, "SMS Paddle Controller": { "P1 Paddle": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 } @@ -1806,22 +1874,22 @@ }, "SMS Sports Pad Controller": { "P1 X": { - "Value": "X1 LeftThumbX", + "Value": "X1 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P1 Y": { - "Value": "X1 LeftThumbY", + "Value": "X1 LeftThumbY Axis", "Mult": -1.0, "Deadzone": 0.1 }, "P2 X": { - "Value": "X2 LeftThumbX", + "Value": "X2 LeftThumbX Axis", "Mult": 1.0, "Deadzone": 0.1 }, "P2 Y": { - "Value": "X2 LeftThumbY", + "Value": "X2 LeftThumbY Axis", "Mult": -1.0, "Deadzone": 0.1 } diff --git a/Assets/dll/libquicknes.dll.so.0.7.0 b/Assets/dll/libquicknes.dll.so.0.7.0 new file mode 100644 index 0000000000..6b57ce9c9a Binary files /dev/null and b/Assets/dll/libquicknes.dll.so.0.7.0 differ diff --git a/Assets/gamedb/gamedb.txt b/Assets/gamedb/gamedb.txt index 5b6a8ab82b..b532c108b7 100644 --- a/Assets/gamedb/gamedb.txt +++ b/Assets/gamedb/gamedb.txt @@ -8,10 +8,12 @@ #include gamedb_gba.txt #include gamedb_gbc.txt #include gamedb_lynx.txt -#include gamedb_msx1.txt -#include gamedb_msx2.txt +#include gamedb_msx.txt +;#include gamedb_msx1-L.txt (legacy?) +;#include gamedb_msx2-L.txt (legacy?) #include gamedb_n64.txt #include gamedb_nes.txt +#include gamedb_Odyssey2.txt #include gamedb_pce_cd.txt #include gamedb_pce_hucards.txt #include gamedb_psx.txt @@ -21,11 +23,13 @@ #include gamedb_sega_md.txt #include gamedb_snes.txt #include gamedb_user.txt +#include gamedb_vectrex.txt #include gamedb_ws.txt #include gamedb_wsc.txt #include gamedb_zxspectrum.txt #include gamedb_amstradcpc.txt #include gamedb_ngp.txt +#include gamedb_channelf.txt ; ************ TI-83 ************ diff --git a/Assets/gamedb/gamedb_Odyssey2.txt b/Assets/gamedb/gamedb_Odyssey2.txt new file mode 100644 index 0000000000..f8a1adbf05 --- /dev/null +++ b/Assets/gamedb/gamedb_Odyssey2.txt @@ -0,0 +1,283 @@ +;;; +;;; From the old gamedb file - uncomment if needed +;;; + +;;; Homebrew (but not derived from TOSEC) +SHA1:26A044C68FF08F574F6649B731B82CACA8C0E797 D Death Race O2 US +SHA1:E04D12B6290370B76F90E76D9DE75B6470B4F913 D redgreen O2 US +SHA1:38D4AAB263E10B1DAC3410C120536EE079826BCB D Fatso 2 O2 US +SHA1:3720DD6B5EE3DC62C5AF2EA9D915A2B83DE9463D D Chief Chef O2 US +SHA1:FEB358E28587DE70D1E89BF0F9A3209CE0B67C57 D Haunted House O2 US +SHA1:B1D65BEDB56FE7A9CF60AA054A9FD9BB7F65B77C D 3D Box O2 US +SHA1:0270047E2B1FC07581BF0FF9E55035925CF0EFF0 D Guiseppe apr14 O2 US +SHA1:0D6B44E2445DBB3BF70C4E05F222822845C29762 D Boob O2 US +SHA1:DE888B7AA2716C3134CFF812A4E07E86B2479537 D Shoot the B O2 US +SHA1:85A44A99B254D92A7433EE46E4CAA91483D7FEA2 D Go Sub 2 O2 US +SHA1:2B34EF0E1A8C0371F00A33D6950E0807F3CB886E D Happy Emu O2 US +SHA1:03C846187581A44CE4F7B056C05186520C2DB1B4 D Happy Bird O2 US +SHA1:42AD0C57BD16B7F24C242F60B5C0E9988D8DFBA8 D Kill The Attacking Aliens O2 US + + + + + +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: Magnavox Odyssey2 - Applications (TOSEC-v2011-02-22) +;;; FileGen: 2020-02-20 10:52:18 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +1E7035584D19AAA53EB3795D92FA6215 Computer Intro (1980)(Philips)(US) O2 US +908E01082D7E30B7CE79DF2DD85ACFED Computer Programmer (1980)(Philips)(EU) O2 EU +84AE1A8159716266F7AAE16AD7DFD062 Keyboard Creations (1980)(Philips)(US) O2 US +F93D43B0E30539BA6FAB14CE6A57AAE3 Musician (1981)(Philips)(EU) O2 EU +F2EDA19FFC8E52C5C2D13C7106A06303 Newscaster (1980)(Philips)(EU) O2 EU +49ABEE5DDD1B475FE4CBB997F7EE83EF Type & Tell (1978)(Philips)(US) O2 US +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: Magnavox Odyssey2 - Educational (TOSEC-v2011-02-22) +;;; FileGen: 2020-02-20 10:52:18 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +A3C4D975FCABBEE4FDB253EB414242EE I've Got Your Number (1980)(Philips)(EU-US) O2 EU-US +E074C77E2A2A8BE6D7BCAB50E11D6948 Kinder im Verkehr 1 (1982)(CSV - Philips)(DE) O2 DE +9AA512409F1E3D10BFE2C2F2924C7A31 Math-A-Magic + Echo (1980)(Philips)(EU-US) O2 EU-US +FE079714C9529588FF999910BDABC89E Mathematicien + Echo (1980)(Philips)(FR) O2 FR +6FD09253957EC9018F2C80B7663BC8E4 Morse (1983)(Philips)(EU) O2 EU +441F68A94B7B92FD5E7CCCAD07256E4C Morse (1983)(Philips)(FR) O2 FR +98B2ED525AA9C060E8BE6C6210D16E41 Nimble Numbers Ned (1978)(Philips)(US) O2 US +23BA6403E7206063D65DEC507A30664A Sid the Spellbinder (1978)(Philips)(US) O2 US +49ABEE5DDD1B475FE4CBB997F7EE83EF Type & Tell (1978)(Philips)(US) O2 US +317644C85BA8F8FDE8F7B60114A03288 Verkehrsspiele Traffic Games 1 (1982)(CSV - Philips)(DE) O2 DE +A465615508DFB5EA1C5B0E18C97711A5 Verkehrsspiele Traffic Games 2 (1982)(CSV - Philips)(DE) O2 DE +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: Magnavox Odyssey2 - Firmware (TOSEC-v2011-02-22) +;;; FileGen: 2020-02-20 10:52:18 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +562D5EBF9E030A40D6FABFC2F33139FD Magnavox Odyssey2 BIOS (1978)(Philips)(EU-US) O2 EU-US +F1071CDB0B6B10DDE94D3BC8A6146387 Philips C52 BIOS (19xx)(Philips)(FR) O2 FR +A465615508DFB5EA1C5B0E18C97711A5 Verkehrsspiele Traffic Games 2 (1982)(CSV - Philips)(DE) O2 DE +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: Magnavox Odyssey2 - Games (TOSEC-v2011-02-22) +;;; FileGen: 2020-02-20 10:52:18 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +1C2718C163781D675ABE7E7AA27D21B5 B 4 in 1 Row (1982)(Philips)(EU)[b] O2 EU +66B54641B5786EA3FF0215AA39D61E01 B K.C. Munchkin (1982)(Philips)(US)[b] O2 US +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +66E27CF1A0CDC9AD19AE20B537C4D3D8 4 en 1 Ligne (1982)(Philips)(FR) O2 FR +61923D4FA32F8A6C3531A77031BD1494 4 in 1 Row (1982)(Philips)(EU) O2 EU +4D6CFB7DA66C8D9327B3CCDCE9852509 Alien Invaders - Plus (1980)(Philips)(EU-US) O2 EU-US +55D7B6575645BFB5890A39491F823FEA Alpine Skiing (1980)(Philips)(EU-US) O2 EU-US +2D0D4CD8E699FCF97CAC366B867420F6 Amok (1998)(Dondzilla, John) O2 +8B4C318129A28E313DC89FE73269BE61 Armored Encounter + Sub Chase (1980)(Philips)(EU-US) O2 EU-US +7D23DF55DFACA55BC4C87677855F4A45 Atlantis (1983)(Imagic)(EU-US) O2 EU-US +4AC71DCC25881BF4D34D0A3C385568C8 Attack of the Timelord (1983)(Philips)(US) O2 US +FF418E9819CBCD10F02225F7FA3B2362 Baseball (1980)(Philips)(EU-US) O2 EU-US +3F71651BDF999AD414B0F122F643078A Billard Electrique (1980)(Philips)(FR) O2 FR +7BF1A49928971514A73E674FF0356E02 Billiard Americain (1981)(Philips)(FR) O2 FR +3430691FB9C0367505634909BE0297BE Blackjack (1980)(Philips)(FR) O2 FR +5F36EBA1EFE84CD06012C0B8BF4C05CB Blockout + Breakdown (1981)(Philips)(EU-US) O2 EU-US +B46E596A81E394246C45A0EA6DF1A1AD Bombardeio Submarino + Tiro ao Alvo (1980)(Philips)(BR) O2 BR +16652634E75560DC830A0C38D7FE1711 Bowling + Basketball (1980)(Philips)(EU-US) O2 EU-US +397EF93F7E804A32569006C8A50D6B7C Buraco Negro (19xx)(Philips)(BR) O2 BR +31A6C912B7AD75ECD0B9387DE6F0FBE9 Casino Slot Machine (1980)(Philips)(EU-US) O2 EU-US +DC6159188F940EED42DC3EB8336DFAFD Catch the Ball + Noughts and Crosses (1980)(Philips)(EU) O2 EU +DFC578D793300DEC00847326DAEBC4C4 Chat et Souris (1983)(Philips)(FR) O2 FR +78604F22CACFA1A7F3D5BFD1E7E75B3F Chess (19xx)(Philips)(EU) O2 EU +248FCAD810254EAAC9E4550C0DA576A3 Chinese Logic (1980)(Philips)(EU) O2 EU +77EA6C8C52837B0699CA50D26A181043 Clay Pigeon (19xx)(Philips)(BR) O2 BR +CCA258910C9AF919FB62252C4B2817D0 Comando Noturno (1983)(Philips)(BR) O2 BR +8B1B91361F92725B7587ED41FAC6D3E0 Computer Golf (1980)(Philips)(US) O2 US +789E1D6CC41A8C830EA6900DDBBB7918 Conflit Cosmique (1980)(Philips)(CA) O2 CA +619C1545BD9C7C9DE15E73A1BD23BDAF Conquest of the World (1981)(Philips)(EU-US) O2 EU-US +43DCDD77FB09D69E9A65B874CD5F13FA Cosmic Conflict (1980)(Philips)(EU) O2 EU +0FC7DED34DF6578680590559BFC2D636 Cosmic Conflict (1980)(Philips)(EU)[a] O2 EU +86AC9DAF92ECF01996C56F1E75D558BD Cosmic Conflict (1980)(Philips)(US) O2 US +65A02F5B349D00E9CB298A232C2B8905 Course de Voitures + Autodrome + Cryptogramme (1980)(Philips)(FR) O2 FR +EF55AF1C7164948A245EEB71F804BED8 Demon Attack (1983)(Imagic)(EU-US) O2 EU-US +94FC4722C6594DCC805E3B63C6257591 Depth Charge + Marksman (1980)(Philips)(EU) O2 EU +11B36C560C5C677E11C8BD7BB6DF2D0C Desafio Chines (1980)(Philips)(BR) O2 BR +B976C87CA8B790ABD2D6E2000D80CB02 Dynasty (1980)(Philips)(US) O2 US +2F83125F4E5F1F5E87423CF52E6A2A1A Electronic Table Soccer (1981)(Philips)(EU-US) O2 EU-US +5A64C4EA84E12A04A7F0070ED13A9507 Football (1980)(Philips)(EU-US) O2 EU-US +5F149C42701F574203078983F1A47BBE Football Electronique + Hockey Electronique (1981)(Philips)(FR) O2 FR +D85945B5E8C37E4298BD962D87728580 Freedom Fighters (1982)(Philips)(EU-US) O2 EU-US +893CEC7B572160E81EAB8A6DAD37F7D3 Frogger (1983)(Parker Brothers)(BR) O2 BR +88FB5E81BF58BC1195B31906CCEBEFF8 Frogger (1983)(Parker Brothers)(EU) O2 EU +A251791690A6F2EFDD26F924DCF45928 Golf (1980)(Philips)(EU) O2 EU +E3A89962603ED28584D3270D700B3A31 Great Wall Street Fortune Hunt, The (1983)(Philips)(EU-US) O2 EU-US +DC3257CA69427B534A926373328CF58C Guerre Laser (1980)(Philips)(FR) O2 FR +08C002AD3CC5B4D9163AD3EA4A7508C7 Gunfighter (1980)(Philips)(EU) O2 EU +BB393FBE922CD34D81ECCDAEE40CBC4D Hockey + Soccer (1981)(Philips)(EU-US) O2 EU-US +30B569D9AAD9F85F782AB2F427C3B94C Interpol (19xx)(Philips)(EU) O2 EU +5F21DD12F47AC805EC69DC5CD3B977F1 Invaders from Hyperspace (1980)(Philips)(US) O2 US +A8416AC5493FAC70848225DBBCA1FD35 Jeu de Quilles + Basketball (1980)(Philips)(FR) O2 FR +E36FE0511F92B1CE3FB4C0F438356520 Jumping Acrobats (1981)(Philips)(EU) O2 EU +8D7691607AA2DFD994AC098A0DFED416 Jumping Acrobats (1981)(Philips)(EU)[a] O2 EU +2E528BD850F9A658B0AF6BFE1891A4FA K.C. Munchkin (1982)(Philips)(US) O2 US +27EADDEDA2F30AD4A5310C6E9BDD9DC2 K.C.'s Krazy Chase (1982)(Philips)(EU-US) O2 EU-US +5E7A037E1AA1F59AD2BE80452F81CC38 Killer Bees (1983)(Philips)(US) O2 US +331B299E3B041884BD59C3BAD2D3F507 La Quete des Anneaux (1981)(Philips)(FR) O2 FR +91B1F44DF0281147132535D9EA1D5590 Labyrinth Game, A + Supermind (1981)(Philips)(EU) O2 EU +8E5B178B4ED546530FB0E40739A41EF4 Las Vegas (1980)(Philips)(FR) O2 FR +972D38914E5AA8E80460B7D32C7C94B5 Las Vegas Blackjack (1980)(Philips)(EU-US) O2 EU-US +D7723B9A0D15AE574CD0AF0136DDA5AD Laser War (1980)(Philips)(EU) O2 EU +F7A034B2FCA71A6D1A4EBBA0B7AF5870 Loony Balloon (1983)(Philips)(EU)(proto) O2 EU +6FB2F39CD702B9E05FC0F81305D3BBC0 Martian Threat (19xx)(Philips)(EU) O2 EU +103681BA9EF22B1392865DCC355F0199 Martian Threat (19xx)(Philips)(EU)[a] O2 EU +73A584CA53FAD9289CA01A58ECCC52B5 Matchmaker + Logix + Buzzword (1980)(Philips)(US) O2 US +DEC3F2D19CA2E5D5F7D96C0BAF23144F Missao Impossivel (19xx)(Ectron)(BR) O2 BR +4388131DBCE3B68A7D46F80BAFC4A828 Monkeyshines (1982)(Philips)(EU-US) O2 EU-US +ACE64D75C07CD5C663AD422FDB25D1C8 Mousing Cat, The (1983)(Philips)(EU) O2 EU +663BAA0B829F717D42DE4C1011BBFCD3 Munchkin (1982)(Philips)(EU) O2 EU +02CF18672C21E2D0E68D331507BE9DE1 Mur Magique, Le (1981)(Philips)(FR) O2 FR +F60FA7D5ED0E8E6A262F0136DB60268A Neutron Star (1983)(Philips)(EU)(proto) O2 EU +AF5B0F0E38252C7391284D9671EB6518 Nightfighter (19xx)(-)(EU) O2 EU +6E7A98BAFAB8A0B71DA7BA0321E1B5E9 Nightmare (1983)(Philips)(EU) O2 EU +3FE371CAD9B660C0A76969BC53D17F9B O Malabarista + Jogo da Velha (1980)(Philips)(BR) O2 BR +5EB860E357DB069A2CBC3FC51D022326 O Segredo do Farao (1980)(Philips)(BR) O2 BR +21A8E6A7441A2990052E38F85A606DB4 Out of This World + Helicopter Rescue (1980)(Philips)(US) O2 US +0812533CE84C9E28E699AF8BAEC7DF25 P.T. Barnum's Acrobats (1981)(Philips)(US) O2 US +E00CA4155B88AACB044A2598C2180158 Pachinko (1981)(Philips)(EU-US) O2 EU-US +0B5A7506275E49B3EDE60AF2B6C31098 Pairs + Space Rendezvous + Logic (1980)(Philips)(EU) O2 EU +F1071CDB0B6B10DDE94D3BC8A6146387 Philips C52 BIOS (19xx)(Philips)(FR) O2 FR +FFA665173861C544219565E000F79173 Pickaxe Pete (1982)(Philips)(EU-US) O2 EU-US +B93F4CE768CF934774FDD895EAB59323 Pinball (19xx)(-)(US) O2 US +C5D7C7B6D6F465610405082E35572F62 Play Tag (19xx)(Philips)(EU) O2 EU +3F0223DD8609FE320264E45EEEEFE367 Pocket Billiards (1981)(Philips)(EU-US) O2 EU-US +3D8310D2AB62A5A7BCC0ECF088133291 Popeye (1983)(Parker Brothers)(BR) O2 BR +2A0A3E9AED2885A4E4798B380DBB64C3 Popeye (1983)(Parker Brothers)(EU) O2 EU +8200734B7A6217B4847939ACD3CC1601 Power Lords (1978)(Philips)(US) O2 US +67943D1BBA7CDF707305EDC14FEABC46 Power Lords (1978)(Philips)(US)[a] O2 US +1F5F15CB9E0D1E65915D0C2263195284 Prendre l'Argent et Fuir (1980)(Philips)(FR) O2 FR +18CABE4F94787A8A8E9F1EC6C6451E4C Qbert (1983)(Parker Brothers)(EU) O2 EU +0B105A40C8FF6AE7728006CF80C4DDB7 Quest for the Rings (1981)(Philips)(EU-US) O2 EU-US +1BACE5B9E272032F898563FB7EF33BC9 Red Baron (19xx)(-)(EU) O2 EU +79FFBFD676F12A6B4DDE396345D354F1 Red Baron (19xx)(-)(EU)[a] O2 EU +08B65F525E0064334F449F1971D83414 Robot City (19xx)(Philips)(EU) O2 EU +75A751E527FA8DDF8FADDBDAA6357582 Samurai (1980)(Philips)(EU) O2 EU +8E631FAE193F572B9D7E52C96B648D58 Satellite Attack (1981)(Philips)(EU) O2 EU +676423953EF6EE953A999778C0BA0FF9 Secret of the Pharaohs (1980)(Philips)(EU) O2 EU +1EC617026BC9562826F075D9AD15824E Shark Hunter (19xx)(Philips)(EU) O2 EU +ADD9A7CFAC93608DB1845E49F3594964 Showdown in 2100 A.D. (1980)(Philips)(US) O2 US +EA86B958C37DA876BB178DCAA92A8EE7 Skiing (1980)(Philips)(FR) O2 FR +ED77BEEB30711F8EE03A23A4577F403A Smithereens (1980)(Philips)(US) O2 US +BC66AB63FB5CE04A79AEF9E8FA445225 Speedway + Spin-out + Crypto-logic (1978)(Philips)(EU-US) O2 EU-US +263B77AA79980BD0CB53A0625A2637EB Spider-Man (19xx)(Parker Brothers - Philips)(EU) O2 EU +A0BA087F4A47B71C41E876B5069B8BA0 Spider-Man (19xx)(Parker Brothers - Philips)(EU)[a] O2 EU +A7BFD5FA3233A3DF36742A368736727D Stone Sling (1980)(Philips)(EU) O2 EU +EF316AF0ED3D1736129C53C1231B8569 Super Bee (1983)(Philips)(BR) O2 BR +E201F5DF4BAA81A8D0ED25D58F5399FA Super Bee (1983)(Philips)(EU) O2 EU +F274F1ED857324C1B3AC55B0C67A1BA2 Super Cobra (1983)(Parker Brothers)(BR) O2 BR +8E4A6C96D67BBA26F41EE856DD919118 Super Cobra (1983)(Parker Brothers)(EU) O2 EU +B2D810DCB97E38192A6DD3D213DBCE10 Take the Money and Run (1980)(Philips)(EU-US) O2 EU-US +0602FD990F5E43BBAB23004286319B60 Thunderball (1980)(Philips)(EU-US) O2 EU-US +817D89146F3B9914E7D502212917CC23 Turtles (1983)(Philips)(EU) O2 EU +07737E70C041742DBCD8C52EFDA4EDAB Turtles (1983)(Philips)(US) O2 US +C9590BFFC9A2C5A5B49D4FDA32524EDA Tutankham (19xx)(Parker Brothers)(EU) O2 EU +7EBD2526D8C17B01B882E39E972C2691 UFO (1981)(Philips)(US) O2 US +8F2B2EADCC1BD72366DB49C89B576EB4 Volleyball (1981)(Philips)(EU-US) O2 EU-US +E9D2F13DABDCADE4C7D09E5DC8728C28 Volleyball Electronique (1981)(Philips)(FR) O2 FR +4F0DD7AB05C033C27ECBDA05B14BF619 Wall Street (1983)(Philips)(BR) O2 BR +30249D4A85B18F0320F1B5A00E55B5C7 War of Nerves (1981)(Philips)(EU-US) O2 EU-US + + + + + + + + + + + diff --git a/Assets/gamedb/gamedb_a2600.txt b/Assets/gamedb/gamedb_a2600.txt index 604912bc87..6afc385507 100644 --- a/Assets/gamedb/gamedb_a2600.txt +++ b/Assets/gamedb/gamedb_a2600.txt @@ -50,9 +50,9 @@ sha1:a65f487740069640952803218b70580b2fb724b7 A-Team, The (Atari) (Prototype) ( sha1:821cffe5f5940b2951f280d07d2691e140f54ad2 A-Team, The (Atari) (Prototype) (PAL-60) [!] A26 m=F8;NTSC=true sha1:53413577afe7def1d390e3892c45822405513c07 A-Team, The (Atari) (Prototype) [!] A26 m=F8;NTSC=true sha1:3607f46475f4b1b8989f7327f90ca53a4ac0e9fe A-VCS-tec Challenge (beta 5) (PD) A26 m=F8;NTSC=true -sha1:d7c62df8300a68b21ce672cfaa4d0f2f4b3d0ce1 Acid Drop (1992) (Salu) (PAL) [!] A26 m=F6;PAL=true -sha1:66216ed98295f3fde35a0cc9398b4f2fc79f2375 Acid Drop (1992) (Salu) (PAL) [b1] A26 m=F8;PAL=true -sha1:2ad5e47e360842bb5f9c23bbe2c19866d890f427 Acid Drop (NTSC Conversion) (TJ) A26 m=F8;NTSC=true +sha1:d7c62df8300a68b21ce672cfaa4d0f2f4b3d0ce1 Acid Drop (1992) (Salu) (PAL) [!] A26 SP_RESET=true;m=F6;PAL=true +sha1:66216ed98295f3fde35a0cc9398b4f2fc79f2375 Acid Drop (1992) (Salu) (PAL) [b1] A26 SP_RESET=true;m=F8;PAL=true +sha1:2ad5e47e360842bb5f9c23bbe2c19866d890f427 Acid Drop (NTSC Conversion) (TJ) A26 SP_RESET=true;m=F8;NTSC=true sha1:9e6fb047ee9fa0a454ca23673ed9693430032dc6 Action Force (1983) (Parker Bros) (PAL) [!] A26 m=4K;PAL=true sha1:bfcc35feee3713f5028122844d027c88a84772b6 2 Pak Special Red - Motocross,Boom Bang (1990) (PAL) [!] A26 m=F6;PAL=true sha1:8a503416ca6f2404bc52382e337f31238bba9534 3-D Corridor Demo 2 (29-03-2003) (MP) A26 m=4K;NTSC=true @@ -68,13 +68,13 @@ sha1:317a7b8693af44095c23437253a32cc748824ccf Adventure (Color Scrolling) [h1] sha1:4ffe36c5113305714e27c72d7f3abecc9b08a630 Adventure (New Graphics) [h1] A26 m=4K;NTSC=true sha1:0b0875ad1bd494c9dd8de4ff0a06938e699f60d5 Adventure 34 by Kurt Howe (Adventure Hack) A26 m=4K;NTSC=true sha1:8501444b12f7f9e2103cd2bcf0c8d3f5b7536569 Adventure II (Adventure Hack) A26 m=4K;NTSC=true -sha1:03a495c7bfa0671e24aa4d9460d232731f68cb43 Adventures of Tron (1983) (Mattel) A26 m=4K;NTSC=true +sha1:03a495c7bfa0671e24aa4d9460d232731f68cb43 Adventures of Tron (1983) (Mattel) A26 SP_RESET=true;m=4K;NTSC=true sha1:6e420544bf91f603639188824a2b570738bb7e02 Adventures on GX-12 (Telegames) (PAL) [!] A26 m=4K;PAL=true sha1:3b02e7dacb418c44d0d3dc77d60a9663b90b0fbc Air Raid (Men-A-Vision) A26 m=4K;NTSC=true -sha1:e65a0c6c5a1f9f05ebcfaaa7b2c9ee6625bf2d83 Air Raiders (1982) (Mattel) (PAL) [p1][!] A26 m=4K;PAL=true -sha1:29f5c73d1fe806a4284547274dd73f9972a7ed70 Air Raiders (1982) (Mattel) [!] A26 m=4K;NTSC=true -sha1:a9a51405b521ae0b465f521fa098e8b3aedd018b Air Raiders (1982) (Mattel) [a1][!] A26 m=4K;NTSC=true -sha1:39a98b42f0670dfe6a842645f09f24583ae8ee60 Air Raiders (1982) (Mattel) [h1] A26 m=4K;NTSC=true +sha1:e65a0c6c5a1f9f05ebcfaaa7b2c9ee6625bf2d83 Air Raiders (1982) (Mattel) (PAL) [p1][!] A26 SP_RESET=true;m=4K;PAL=true +sha1:29f5c73d1fe806a4284547274dd73f9972a7ed70 Air Raiders (1982) (Mattel) [!] A26 SP_RESET=true;m=4K;NTSC=true +sha1:a9a51405b521ae0b465f521fa098e8b3aedd018b Air Raiders (1982) (Mattel) [a1][!] A26 SP_RESET=true;m=4K;NTSC=true +sha1:39a98b42f0670dfe6a842645f09f24583ae8ee60 Air Raiders (1982) (Mattel) [h1] A26 SP_RESET=true;m=4K;NTSC=true sha1:b96c7a509bf610f61f82377bfd506db3dba2b423 Air-Sea Battle (1977) (Atari) (PAL) [!] A26 m=2K;PAL=true sha1:a746fdc82b336a9d499bf17f50b41e0193ba595e Air-Sea Battle (1977) (Atari) [!] A26 m=2K;NTSC=true sha1:d3897fc60585e420ae816a2db909400f6cbadd88 Air-Sea Battle (1977) (Atari) [o1] A26 m=2K;NTSC=true @@ -323,9 +323,9 @@ sha1:67387d0d3d48a44800c44860bf15339a81f41aa9 Bugs (1982) (Data Age) [!] A26 m sha1:a8aedea627c67c38032cdde441fb98dad226916a Bugs (1983) (Gameworld) (PAL) [!] A26 m=4K;PAL=true sha1:9c0e13af336a986c271fe828fafdca250afba647 Bugs Bunny (Atari) (Prototype) [!] A26 m=F8;NTSC=true sha1:13534da5c382ed20d070ffe93f35c4c11b36e1bc Bullet Demo (20-12-2002) (CT) A26 m=4K;NTSC=true -sha1:5614c32e76c8b272c38c16720ebbb1818d3d3103 Bump 'N' Jump (1983) (Mattel) [b1] A26 m=F6;NTSC=true -sha1:1819ef408c1216c83dcfeceec28d13f6ea5ca477 Bump 'N' Jump (1983) (Mattel) A26 m=E7;NTSC=true -sha1:35bc4048f58bb170313872a0bce44fb1ca3217cc Bump 'N' Jump (Telegames) (PAL) [!] A26 m=F8;PAL=true +sha1:5614c32e76c8b272c38c16720ebbb1818d3d3103 Bump 'N' Jump (1983) (Mattel) [b1] A26 SP_RESET=true;m=F6;NTSC=true +sha1:1819ef408c1216c83dcfeceec28d13f6ea5ca477 Bump 'N' Jump (1983) (Mattel) A26 SP_RESET=true;m=E7;NTSC=true +sha1:35bc4048f58bb170313872a0bce44fb1ca3217cc Bump 'N' Jump (Telegames) (PAL) [!] A26 SP_RESET=true;m=F8;PAL=true sha1:ad48f4952e867a2b97900d965b69f50fddf8ba2d Bumper Bash (1983) (Spectravideo) (PAL) [!] A26 m=4K;PAL=true sha1:6c199782c79686dc0cbce6d5fe805f276a86a3f5 Bumper Bash (1983) (Spectravideo) A26 m=4K;NTSC=true sha1:49e01b8048ae344cb65838f6b1c1de0e1f416f29 Burgertime (1982) (Mattel) A26 SP_RESET=true;m=E7;NTSC=true @@ -855,8 +855,8 @@ sha1:6b9e591cc53844795725fc66c564f0364d1fbe40 Frogger II - Threedeep! (1983) (P sha1:bce92de22fc8950f0eebb643d96fe9fa5dba2b72 Frogger II - Threedeep! (1984) (Parker Bros) (PAL) [!] A26 m=E0;PAL=true sha1:5215cf9051e833482e115d16ff90fee5f01c3e84 Frogger Preview (1982) (Starpath) [a1] A26 m=AR;NTSC=true sha1:2edb64be1bb6f4215f520ec2f487b19f29724b8d Frogger Preview (1982) (Starpath) A26 m=AR;NTSC=true -sha1:7682b4b6d45865b7eec1244e5d76f0f2efdb17e7 Frogs and Flies (1982) (Mattel) (PAL) [p1][!] A26 m=4K;PAL=true -sha1:f344d5a8dc895c5a2ae0288f3c6cb66650e49167 Frogs and Flies (1982) (Mattel) [!] A26 m=4K;NTSC=true +sha1:7682b4b6d45865b7eec1244e5d76f0f2efdb17e7 Frogs and Flies (1982) (Mattel) (PAL) [p1][!] A26 SP_RESET=true;m=4K;PAL=true +sha1:f344d5a8dc895c5a2ae0288f3c6cb66650e49167 Frogs and Flies (1982) (Mattel) [!] A26 SP_RESET=true;m=4K;NTSC=true sha1:cf32bfcd7f2c3b7d2a6ad2f298aea2dfad8242e7 Front Line (1982) (Coleco) A26 m=F8;NTSC=true sha1:58a6f82434ccf49ca420596809ce9545373845a2 Frostbite (1983) (Activision) (PAL) [!] A26 m=4K;PAL=true sha1:8ad03667bbf73d3c7760cb82f2c4442f8745483c Frostbite (1983) (Activision) (PAL) [p1][!] A26 m=4K;PAL=true @@ -1256,9 +1256,9 @@ sha1:128c3a98d78b043edabe8964cf7998955342fa2d Kiss Meets Pacman (Cody Pittman) sha1:45623a1c8fb5074de98c37f005edd5b1d0937dae Klax (1990) (Atari) (PAL) [!] A26 m=F6SC;PAL=true sha1:3162259c6dbfbb57a2ea41d849155702151ee39b Klax (1990) (Atari) A26 m=F6SC;NTSC=true sha1:759597d1d779cfdfd7aa30fd28a59acc58ca2533 Knight on the Town (1982) (Playaround) A26 m=4K;NTSC=true -sha1:2f550743e237f6dc8c75c389a01b02e9a396fdad Kool Aid Man (1982) (Mattel) A26 m=4K;NTSC=true -sha1:f5c193ed00bf557ddd5ab698d92a7483b89c6519 Kool Aid Man (Fixed) (15-11-2002) (CT) A26 m=4K;NTSC=true -sha1:38f55fc76bec14eb661a7b594301c271aa5f5f3b Kool Aid Man (PAL Conversion) (16-11-2002) (Fabrizio Zavagli) A26 m=4K;NTSC=true +sha1:2f550743e237f6dc8c75c389a01b02e9a396fdad Kool Aid Man (1982) (Mattel) A26 SP_RESET=true;m=4K;NTSC=true +sha1:f5c193ed00bf557ddd5ab698d92a7483b89c6519 Kool Aid Man (Fixed) (15-11-2002) (CT) A26 SP_RESET=true;m=4K;NTSC=true +sha1:38f55fc76bec14eb661a7b594301c271aa5f5f3b Kool Aid Man (PAL Conversion) (16-11-2002) (Fabrizio Zavagli) A26 SP_RESET=true;m=4K;NTSC=true sha1:82e64366795b011c2a2f1755bf899cc2c0617fe8 Krieg Der Sterne (Atlantis-Ariola) (PAL) [!] A26 m=4K;PAL=true sha1:4bdf1cf73316bdb0002606facf11b6ddcb287207 Krull (1983) (Atari) [!] A26 m=F8;NTSC=true sha1:07a1c1b1a2297c4edde0e16f610b5ec23c775217 Krull (CCE) A26 m=F8;NTSC=true @@ -1305,9 +1305,9 @@ sha1:4f3e51f68c10d2fa7c4b9764b0cb81fdded0fde4 Lilly Adventure (Starsoft) (NTSC sha1:63f4776aa4c35d124001918b733cdb4d46dfbe9b Lilly Adventure (Starsoft) (PAL) [!] A26 m=4K;PAL=true sha1:5425578808363ee72dbba6195533549679137777 Lines Demo (Eckhard Stolberg) (PAL) (PD) A26 m=2K;PAL=true sha1:fe208ad775cbf9523e7a99632b9f10f2c9c7aa87 Lochjaw (1982) (Apollo) A26 m=4K;NTSC=true -sha1:119171935ed9ea877de4f2a68aee31cd55bc697d Lock 'N' Chase (1982) (Mattel) (PAL) [p1][!] A26 m=4K;PAL=true -sha1:fc3d75d46d917457aa1701bf47844817d0ba96c3 Lock 'N' Chase (1982) (Mattel) [!] A26 m=4K;NTSC=true -sha1:075ec3678ceabbee46a7d576fdd199a4ab908cc0 Lock 'N' Chase (1982) (Telegames) (PAL) [!] A26 m=4K;PAL=true +sha1:119171935ed9ea877de4f2a68aee31cd55bc697d Lock 'N' Chase (1982) (Mattel) (PAL) [p1][!] A26 SP_RESET=true;m=4K;PAL=true +sha1:fc3d75d46d917457aa1701bf47844817d0ba96c3 Lock 'N' Chase (1982) (Mattel) [!] A26 SP_RESET=true;m=4K;NTSC=true +sha1:075ec3678ceabbee46a7d576fdd199a4ab908cc0 Lock 'N' Chase (1982) (Telegames) (PAL) [!] A26 SP_RESET=true;m=4K;PAL=true sha1:ef02fdb94ac092247bfcd5f556e01a68c06a4832 Lord of The Rings (1983) (Parker Bros) (Prototype) A26 m=E0;NTSC=true sha1:43575ed97f8a585c5bae6fb1a7b2133c87b4d256 Lord of the Rings - Fellowship of the Ring by Adam Thornton (Dark Mage Hack) (PD) [a1] A26 m=4K;NTSC=true sha1:721514e5c31c8f2b30b4a2bf2cda69a810cac75b Lord of the Rings - Fellowship of the Ring by Adam Thornton (Dark Mage Hack) (PD) A26 m=4K;NTSC=true @@ -1359,8 +1359,8 @@ sha1:6ef010513e01520560616994cbe3f10995490996 Max3 (2001) (Maxime Beauvais) (PD sha1:a2b13017d759346174e3d8dd53b6347222d3b85d Maze (AKA Slot Racers) (1978) (Sears) [!] A26 m=2K;NTSC=true sha1:05f8d0e9f9bec192dfe5947965039817c8c390df Maze (AKA Slot Racers) (1978) (Sears) [o1] A26 m=2K;NTSC=true sha1:365a3af336d71f8f80345de9fcebb100f5141182 Maze 003 Demo (PD) A26 m=4K;NTSC=true -sha1:4a255c1d277f9ceb98dfe61ec2c6f7537ca4e7bf Maze Craze (1978) (Atari) (PAL) [!] A26 m=4K;PAL=true -sha1:aba25089d87cd6fee8d206b880baa5d938aae255 Maze Craze (1978) (Atari) A26 m=4K;NTSC=true +sha1:4a255c1d277f9ceb98dfe61ec2c6f7537ca4e7bf Maze Craze (1978) (Atari) (PAL) [!] A26 SP_FRAME=true;m=4K;PAL=true +sha1:aba25089d87cd6fee8d206b880baa5d938aae255 Maze Craze (1978) (Atari) A26 SP_FRAME=true;m=4K;NTSC=true sha1:43c309177fde4adf59c99ba5d3865df2a588a79e Maze Demo 1 (PD) A26 m=4K;NTSC=true sha1:648e91958afdf264e8e6b45521ecb542fb340586 Maze Demo 2 (PD) A26 m=4K;NTSC=true sha1:0103b35b1aef6b10c1c0a44b213ebf30af708df6 McDonald's (1983) (Parker Bros) (Prototype) [!] A26 m=4K;NTSC=true @@ -1559,9 +1559,9 @@ sha1:03eb4a3b3db04c1782e1a91d27ea515163d258fb Oink! (CCE) A26 m=4K;NTSC=true sha1:7feef3965706bc64f0f0a940149b2523e0735ce6 Okie Dokie (4K) (PD) A26 m=4K;NTSC=true sha1:7bd1cbddefcf3bd24da570be015234d0c444a7e5 Okie Dokie (Older) (PD) A26 m=2K;NTSC=true sha1:8a47b1930971f271a935c50d423e152aaea6ac59 Okie Dokie (PD) A26 m=2K;NTSC=true -sha1:ca4f26716120d2e4ba531c2ea50b570b9980756e Omega Race (1983) (CBS Electronics) [o1] A26 m=F6SC;NTSC=true -sha1:dcaab259e7617c7ac7d349893451896a9ca0e292 Omega Race (1983) (CBS Electronics) A26 m=FA;NTSC=true -sha1:c7a9ecad6c1a82048de54d33b231abd89fb08bd8 Omega Race JS (TJ) A26 m=FA;NTSC=true +sha1:ca4f26716120d2e4ba531c2ea50b570b9980756e Omega Race (1983) (CBS Electronics) [o1] A26 SP_RESET=true;m=F6SC;NTSC=true +sha1:dcaab259e7617c7ac7d349893451896a9ca0e292 Omega Race (1983) (CBS Electronics) A26 SP_RESET=true;m=FA;NTSC=true +sha1:c7a9ecad6c1a82048de54d33b231abd89fb08bd8 Omega Race JS (TJ) A26 SP_RESET=true;m=FA;NTSC=true sha1:fbf180f8f35178099244bc1ae341ccff87838907 One Blue Bar Demo (PD) A26 m=4K;NTSC=true sha1:e52ca6e73c931ef71c63e164704fb398086e4308 One On One by Angelino (Basketball Hack) A26 m=2K;NTSC=true sha1:98007f26356b4032a2ae4e9fddea5a38a988eb13 Oscar's Trash Race (1983) (Atari) (PAL) [!] A26 m=F8;PAL=true @@ -2302,8 +2302,8 @@ sha1:7c2a2ddbdef639ed2985ce66ae717b2285a94ae0 Star Raiders (1982) (Atari) (PAL) sha1:e10cce1a438c82bd499e1eb31a3f07d7254198f5 Star Raiders (1982) (Atari) A26 m=F8;NTSC=true sha1:d2b6290afb81bad126321d923d222c26e2de5fa8 Star Ship - Outer Space (1977) [o1] A26 m=2K;NTSC=true sha1:878e78ed46e29c44949d0904a2198826e412ed81 Star Ship - Outer Space (1977) A26 m=2K;NTSC=true -sha1:de05d1ca8ad1e7a85df3faf25b1aa90b159afded Star Strike (1982) (Mattel) A26 m=4K;NTSC=true -sha1:a0e29405a92773bf3baa2845788a8add8f3bc0b1 Star Strike (Telegames) (PAL) [!] A26 m=4K;PAL=true +sha1:de05d1ca8ad1e7a85df3faf25b1aa90b159afded Star Strike (1982) (Mattel) A26 SP_RESET=true;m=4K;NTSC=true +sha1:a0e29405a92773bf3baa2845788a8add8f3bc0b1 Star Strike (Telegames) (PAL) [!] A26 SP_RESET=true;m=4K;PAL=true sha1:667a528e8cf3fd7f533cf67993f48bcc3c100e0d Star Trek - Strategic Operations Simulator (1983) (Sega) (PAL) [!] A26 m=F8;PAL=true sha1:61a3ebbffa0bfb761295c66e189b62915f4818d9 Star Trek - Strategic Operations Simulator (1983) (Sega) A26 m=F8;NTSC=true sha1:417bb89e1117413321ffba48a17e005b2687680b Star Voyager (1982) (CCE) [!] A26 m=4K;NTSC=true @@ -2554,8 +2554,8 @@ sha1:ccf422636180f24becaa8af0cc391f95e599a330 Tunnel Demo (28-03-2003) (AD) A26 sha1:0f6552a0afe40cc1c448313569db8c9a8cda6d21 Tunnel Demo (Cycling Colours 2) (29-03-2003) (AD) A26 m=4K;NTSC=true sha1:8dad50a3918c7462811c2def42f289cd123822af Tunnel Demo (Red Spiral) (30-03-2003) (AD) A26 m=4K;NTSC=true sha1:4df103678f9c88b017e64f1e14e741fc6e15340c Tunnel Demo 2 (27-03-2003) (CT) A26 m=4K;NTSC=true -sha1:fc1a0b58765a7dcbd8e33562e1074ddd9e0ac624 Tunnel Runner (1983) (CBS Electronics) [!] A26 m=FA;NTSC=true -sha1:460094d7689ac0c4435b72e3e390f4b6f2ef112c Tunnel Runner (1983) (CBS Electronics) [a1][!] A26 m=FA;NTSC=true +sha1:fc1a0b58765a7dcbd8e33562e1074ddd9e0ac624 Tunnel Runner (1983) (CBS Electronics) [!] A26 SP_RESET=true;m=FA;NTSC=true +sha1:460094d7689ac0c4435b72e3e390f4b6f2ef112c Tunnel Runner (1983) (CBS Electronics) [a1][!] A26 SP_RESET=true;m=FA;NTSC=true sha1:0921fab66ce4b712701326ce105e1a84ac47b497 Turbo (Coleco) Prototype Fake v0.1 (TJ) A26 m=2K;NTSC=true sha1:b594a9acedd4734070776bf69d0f08abb5c261bf Turbo WIP (TJ) A26 m=F8;NTSC=true sha1:1162fe46977f01b4d25efab813e0d05ec90aeadc Turmoil (1982) (20th Century Fox) [!] A26 m=4K;NTSC=true @@ -2596,7 +2596,7 @@ sha1:082a7bc7d0fdbf307501cd146e18ed3d03b9ec0f Vertical Ship Demo 1 (PD) A26 m= sha1:1d641abfb95e3b4b7abaad42a8760c8c9ce993a6 Vertically Scrolling Playfield (02-02-2003) (Aaron Bergstrom) A26 m=4K;NTSC=true sha1:24c1c6e1a495137bec53818c2cd8bd83c8336d21 Video Checkers (1978) (Atari) (PAL) [!] A26 m=4K;PAL=true sha1:babae88a832b76d8c5af6ea63b8f10a0da5bb992 Video Checkers (1978) (Atari) A26 m=4K;NTSC=true -sha1:043ef523e4fcb9fc2fc2fda21f15671bf8620fc3 Video Chess (1978) (Atari) A26 m=4K;NTSC=true +sha1:043ef523e4fcb9fc2fc2fda21f15671bf8620fc3 Video Chess (1978) (Atari) A26 SP_FRAME=true;m=4K;NTSC=true sha1:3f2ad3666eb713b20484e3677d8e1cac8fbd323e Video Cube (CCE) A26 m=4K;NTSC=true sha1:1554b146d076b64776bf49136cea01f60eeba4c1 Video Jogger (Exus) (PAL) A26 m=4K;PAL=true sha1:19d4f52d399c2ab70e411be51b715341db7a41bf Video Life (CommaVid) [h1] A26 m=CV;NTSC=true @@ -2698,4 +2698,10 @@ sha1:9CD8217DCCBE60F9A25A930D614EE5384F432A83 Boulder Dash (2005) (Andrew Davie sha1:00CCF622E7BA4D0A39DCBABAB771CE815B0FB8FE Boulder Dash (2005) (Andrew Davie) (WIP) (PAL A26 m=3E;NTSC=true sha1:650DA2339D41D1D2F180A6CAFE8DC311AC588ACD Boulder Dash Intro Tune (2005) (Erik Ehrling) A26 m=4K;NTSC=true sha1:F28E52921646A18467577370808454F494C15EFE 0840 EconoBanking A26 m=0840;NTSC=true -sha1:2A9647E27AB27E6CF82B3BF122EDF212FA34AE86 Halo2600 Final A26 m=m4K +sha1:2A9647E27AB27E6CF82B3BF122EDF212FA34AE86 Halo2600 Final A26 m=4K +sha1:341BB93E67C21063F3910845D1AF59FEA129FF21 Bang! A26 m=F4SC +sha1:62E7A3CE40BE1C29870D892639FBD394977281F5 DHmoveValues(rev2) A26 m=F6SC +sha1:FBB0FE0A859BF764D060E264561734B8F7CFC9D7 REF A26 m=4K;NTSC=true +sha1:58AA6BBA1D0D26C1287135FC9237B684A984B6BE Princess Rescue A26 m=F4;NTSC=true +sha1:29404640B4579938057969D93A77C9A676AF9965 Crazy Balloon A26 m=4K;NTSC=true + diff --git a/Assets/gamedb/gamedb_channelf.txt b/Assets/gamedb/gamedb_channelf.txt new file mode 100644 index 0000000000..e57abc0c17 --- /dev/null +++ b/Assets/gamedb/gamedb_channelf.txt @@ -0,0 +1,58 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: NO-INTRO +;;; Source: Fairchild - Channel F - 20120223-000000 +;;; FileGen: 2019-04-16 13:59:49 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +F7BF7D55A7660FFA80D08AD1BA903FF7 Alien Invasion (USA) ChannelF USA +D89B48AE8C906488CAAC2B2AE1D63D88 Backgammon, Acey-Deucey (USA) ChannelF USA +4FA83F734C139963AA02BDBB7A52E500 Baseball (USA) ChannelF USA +25E231E7A464A32B4715BFB47AF89240 Bowling (USA) ChannelF USA +BB7F7BBBE21F142591CDCAFA98D7F6E4 Casino Poker (USA) ChannelF USA +35D61D40EF7EC337CBA092AABAC74DBD Checkers (USA) ChannelF USA +54CF17C48707467295749490D458EAFB Demonstration Cartridge (USA) ChannelF USA +F6916B665893AA8138CDE57C37E50ADA Demonstration Cartridge 2 (USA) ChannelF USA +4F11F13CBCA685CB20E888F87B3B1586 Desert Fox, Shooting Gallery (USA) ChannelF USA +6FFEDAED3C5CD8BA74D98901849CC451 Dodge It (USA) ChannelF USA +F80AF74B09D058B90E719BB7DFBDD50E Drag Race (USA) ChannelF USA +9E0711B140E22729687DB1E1354980AB Galactic Space Wars, Lunar Lander (USA) ChannelF USA +0124CD0B61DF5502AABD59029CCB6D5A Hangman (USA) ChannelF USA +4C10FA5C7316C59EFA241043FC67DFA8 Magic Numbers - Mind Reader + Nim (USA) ChannelF USA +A8E6103FCAE4D0F9E14D9EDCFC3FC493 Math Quiz I - Addition + Subtraction (USA) ChannelF USA +86B77EAFDF7B806E19E01724987E384F Math Quiz II - Multiplication + Division (USA) ChannelF USA +6565DF74539476D66FD78DE1BAC0259C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) ChannelF USA +53E4CC2DA0F2C167E0692B794CB7692C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) (Alt 1) ChannelF USA +2B3CA549E27579E4519A765FD8F52D0F Memory Match 1 & 2 (USA) ChannelF USA +1FBD86DCCA0E4619963B902C48AE77F2 Muehle, Tontauben-Schiessen, Kreatives Malspiel, Videoscope (Germany) ChannelF Germany +C2A44D22D3865B036479E9311C74D3AD Ordtaevling (Sweden) ChannelF Sweden +E90339B7068C6227D54F3C0CA637E017 Pinball Challenge (USA) ChannelF USA +5CBCDA1C44F0DAD02B0DFE209B6325D5 Pinball Challenge (USA) (Alt 1) ChannelF USA +9A894D745356A050F95410983C3BC54A Pro Football (USA) ChannelF USA +913ECBAA30816C6D78DE8651251761FC Rat' Mal (Germany) ChannelF Germany +3783B6AC359E21B99CFA17773AA811C6 Robot War, Torpedo Alley (USA) ChannelF USA +5568205F926333914DEDC8EF8BF16AF2 Schach (Germany) ChannelF Germany +DFB66EE145FAB65062FDEADAFC8DC34C Slot Machine (USA) ChannelF USA +4CB12EDAE37DF23851884B82CA410754 Sonar Search (USA) ChannelF USA +32CCA8FF09041A39251D7AADE21EE22F Space War (USA) ChannelF USA +1B409FE1154584F4D1AB76B344A73D99 Spitfire (USA) ChannelF USA +7E5C26A6D1F9A90C68669A9800BA522D Tic-Tac-Toe, Shooting Gallery, Doodle, Quadra-Doodle (USA) ChannelF USA +B074C867F235FB69CED96C6916673B45 Video Blackjack (USA) ChannelF USA +90A9B3952568F91502A7088BFB0AE07E Video Whizball (USA) ChannelF USA diff --git a/Assets/gamedb/gamedb_goodnes.txt b/Assets/gamedb/gamedb_goodnes.txt index 6c1262745c..f89ab9dae5 100644 --- a/Assets/gamedb/gamedb_goodnes.txt +++ b/Assets/gamedb/gamedb_goodnes.txt @@ -179,7 +179,7 @@ acc01149108010328c2839783c09b030650696a8 G 2-in-1 - Cosmo Cop + Cyber Monster (S 7c4d0353d9f3ff2f064a47b11497fb159f41b1f0 U 2-in-1 - Donkey Kong Country + Jungle Book (Unl) NES 33930c8fd186490d99ee2fe387b987ac0831c123 G 2-in-1 - Donkey Kong Country 4 + Jungle Book 2 (Unl) [!] NES 25943e4d0130c62aed75d92fafab75f8470c0e75 C 2-in-1 - Donkey Kong Country 4 + Jungle Book 2 (Unl) [t1] NES -47fcca3baebba912638d0eda77fb1676e5f0bc8e G 2-in-1 - Family Kid & Aladdin 4 (Ch) [!] NES +47fcca3baebba912638d0eda77fb1676e5f0bc8e G 2-in-1 - Family Kid & Aladdin 4 (Ch) [!] NES fdc4b64f9d981bf024c93c0bf39c332e2189eb2e G 2-in-1 - Mortal Kombat 3 Extra 60 People + Super Shinobi (King005) (Ch) [!] NES ec5e8712f994f929218cea18dc9d7dff7eb55495 G 2-in-1 - Mortal Kombat V Turbo 30 + Super Aladdin (Unl) [p1][!] NES 754512f9474fba9a3bf50cf315ff5b33d106b29c U 2-in-1 - Mortal Kombat VI + Mortal Kombat VII (NT-639) (Ch) NES @@ -521,7 +521,7 @@ ebd9d408ae00cc23b460a60a77c39336008c5671 H Abarenradin (Abarenbou Tengu Hack) NE eafc03f2f232660ed3e9eccf27c2f2527c8fe50b U ABM Study Card v5.0 (Ch) NES 0f75aec9810879bdc65269bbb1596542bd23ddf5 H Abnormal Contra (Hack) NES 64a897591d15f88ffd05773baf690dfa60f0d0d2 U About 8 Eyes (R) (PD) NES -f8287728e18eefd9b190597555f1f370b183a388 U About Advanced Dungeons & Dragons - Heroes of the Lance (R) (PD) NES +f8287728e18eefd9b190597555f1f370b183a388 U About Advanced Dungeons & Dragons - Heroes of the Lance (R) (PD) NES 9f194dc9272c92ffa84f2ac2eee4dd0548f56c54 U About Adventures in the Magic Kingdom (R) (PD) NES c9671a576386702a8dc2242bd2b8f20e53025ffd U About Adventures of Bayou Billy, The (R) (PD) NES 2835208676b1e9ac56a06389762b58cd4caf186b U About Armadillo (R) (PD) NES @@ -563,7 +563,7 @@ a7db1747bc516ed061c4d5c70afcaa474ddb5cb0 U Action53 Games 0.03 by Damian Yerrick e2e0219e2da3727d01306e46d358f69ef83c92e1 U Action53 Games MGC2012_2MBIT by Damian Yerrick (PD) NES d94968e5a043ff6a75d22a4351f86963c444b56f U Action53 Games MGC2012_4MBIT by Damian Yerrick (PD) NES 906b9c03ebb1fdb7ccfe263efcbb97ac19608757 H Actual Haou no Tairiku (Haou no Tairiku Hack) NES -45bb116d48c9726104def6268a49384e628054fe U Add & Sub (Unl) NES +45bb116d48c9726104def6268a49384e628054fe U Add & Sub (Unl) NES 22ad5c56344105eee089b6fa8d00657180ed0e00 U Add Em Up (Ch) (Wxn) NES 08c039c6114ee51b987b27d301b273c3c20114cc G Addams Family, The (E) (M3) [!] NES c831410a86a9b759a1e5ec53e8e1ee6789c79569 G Addams Family, The (U) [!] NES @@ -587,39 +587,39 @@ ec1811b0248129413f5be023c0b0d81a87f6e0d2 T Addams Family, The - Pugsley's Scaven cd6914dd1a78ba33570b4e578f4347df2f4e31b6 C Addams Family, The - Pugsley's Scavenger Hunt (U) [t1] NES cf504f5bc99886f933161057a20a9539b6f86ed6 B Adoventoro Tcheco v1.0 (Kero Kero Keroppi no Daibouken 2 Hack) [o1] NES 93985ed946c8f21bb18f8b88c4830eaf8b62d551 H Adoventoro Tcheco v1.0 (Kero Kero Keroppi no Daibouken 2 Hack) NES -273f99684dbdfcf27cfca58136132898217bfbc5 G Advanced Dungeons & Dragons - Dragon Strike (U) [!] NES -7a888c56b64ffd5a1b2653fa6b6d9c207fb6006f B Advanced Dungeons & Dragons - Dragon Strike (U) [b1] NES -d8737a92ad99191fa6653dc2094be81e6c9a1b9e B Advanced Dungeons & Dragons - Dragon Strike (U) [o1] NES -cca11ec6eb0721d6d2e7decbca51b66d5d8548c8 B Advanced Dungeons & Dragons - Dragon Strike (U) [o2] NES -00ae1a7b6cdf1c9b624b29488f54485103b8dcf1 C Advanced Dungeons & Dragons - Dragon Strike (U) [t1] NES -fba99cd8cfb0d44eaaee300dcd194520b41a92b2 G Advanced Dungeons & Dragons - Dragons of Flame (J) [!] NES -f788bbc014cd740449e1a0299feae7234d69a5cf B Advanced Dungeons & Dragons - Dragons of Flame (J) [b1] NES -071c57824564e1081f721ced5db1981c6d3ca034 B Advanced Dungeons & Dragons - Dragons of Flame (J) [o1] NES -25f20b279a150136b337b10f618a251a34c90b73 T Advanced Dungeons & Dragons - Dragons of Flame (J) [T+Eng1.03_DvD Translations] NES -e40073be785c7cce9c256e4be575b425e8719340 G Advanced Dungeons & Dragons - Heroes of the Lance (J) [!] NES -963bea44db79635410a56faa0eefcec79509ca93 U Advanced Dungeons & Dragons - Heroes of the Lance (U) (Prototype) NES -d9328b02916d365c97ed21074333257968e55f91 G Advanced Dungeons & Dragons - Heroes of the Lance (U) [!] NES -b091cd121984c85dd850979948401f6c10613e5a B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b1] NES -e5564fb5a4b54dbd103803e2e15acd6d390b1cdf B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b2] NES -cc4a023e907b5fa3f415ebb284d64f7b95f92114 B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b3] NES -5207100c4d9eb4dd9cd2e2f8b5814fa4ed3aca6e B Advanced Dungeons & Dragons - Heroes of the Lance (U) [o1] NES -9c2a89479470349deddb38cdbda242b26b6589fd B Advanced Dungeons & Dragons - Heroes of the Lance (U) [o2] NES -2611badd4923ab1ef83db2e98b6c944416dc1367 T Advanced Dungeons & Dragons - Heroes of the Lance (U) [T+Rus0.30_Chief-Net] NES -5bc6b4d5e2b27983e678376a95b041ecb3abe819 G Advanced Dungeons & Dragons - Hillsfar (J) [!] NES -5f86c4b515c1cdaf18dd22f60a2d59116e9b2f05 B Advanced Dungeons & Dragons - Hillsfar (J) [b1] NES -988c9199cafb56b54691af8bedaf161fbf9353d1 B Advanced Dungeons & Dragons - Hillsfar (J) [b2] NES -94af82688883d02b83733b36e300d1e742940e1a B Advanced Dungeons & Dragons - Hillsfar (J) [o1] NES -806eb65696593368bef9b62e63b1d8624c637030 G Advanced Dungeons & Dragons - Hillsfar (U) [!] NES -4aedc8efec6f8df4bfbab548a9523778b6fc9594 B Advanced Dungeons & Dragons - Hillsfar (U) [o1] NES -22261fef73fb2161c513632ff614af0ca17d8105 G Advanced Dungeons & Dragons - Pool of Radiance (J) [!] NES -7eca79e1a9684dbbf30dd282c3b44f0fd25deae4 B Advanced Dungeons & Dragons - Pool of Radiance (J) [b1] NES -8612381815f8d64128310ee201bb1b8560c98ab9 B Advanced Dungeons & Dragons - Pool of Radiance (J) [b1][o1] NES -28eaac4e09ed87fa70a10cca7f70a112502f5c8f B Advanced Dungeons & Dragons - Pool of Radiance (J) [o1] NES -a056d59aae542b15ce5361ab49954e746863029b B Advanced Dungeons & Dragons - Pool of Radiance (J) [o2] NES -81eefb9fa6552b95bb086552a043097d6ecdd051 G Advanced Dungeons & Dragons - Pool of Radiance (U) [!] NES -7ddd3a1811b62e94a59d1f5c17045dfd786640a7 B Advanced Dungeons & Dragons - Pool of Radiance (U) [b1] NES -995527d6333875de6ab0d99b00a77b3b6901db8c B Advanced Dungeons & Dragons - Pool of Radiance (U) [b2] NES -b9aab0a607081b9409da575ce15aa5e1517e52d9 B Advanced Dungeons & Dragons - Pool of Radiance (U) [o1] NES +273f99684dbdfcf27cfca58136132898217bfbc5 G Advanced Dungeons & Dragons - Dragon Strike (U) [!] NES +7a888c56b64ffd5a1b2653fa6b6d9c207fb6006f B Advanced Dungeons & Dragons - Dragon Strike (U) [b1] NES +d8737a92ad99191fa6653dc2094be81e6c9a1b9e B Advanced Dungeons & Dragons - Dragon Strike (U) [o1] NES +cca11ec6eb0721d6d2e7decbca51b66d5d8548c8 B Advanced Dungeons & Dragons - Dragon Strike (U) [o2] NES +00ae1a7b6cdf1c9b624b29488f54485103b8dcf1 C Advanced Dungeons & Dragons - Dragon Strike (U) [t1] NES +fba99cd8cfb0d44eaaee300dcd194520b41a92b2 G Advanced Dungeons & Dragons - Dragons of Flame (J) [!] NES +f788bbc014cd740449e1a0299feae7234d69a5cf B Advanced Dungeons & Dragons - Dragons of Flame (J) [b1] NES +071c57824564e1081f721ced5db1981c6d3ca034 B Advanced Dungeons & Dragons - Dragons of Flame (J) [o1] NES +25f20b279a150136b337b10f618a251a34c90b73 T Advanced Dungeons & Dragons - Dragons of Flame (J) [T+Eng1.03_DvD Translations] NES +e40073be785c7cce9c256e4be575b425e8719340 G Advanced Dungeons & Dragons - Heroes of the Lance (J) [!] NES +963bea44db79635410a56faa0eefcec79509ca93 U Advanced Dungeons & Dragons - Heroes of the Lance (U) (Prototype) NES +d9328b02916d365c97ed21074333257968e55f91 G Advanced Dungeons & Dragons - Heroes of the Lance (U) [!] NES +b091cd121984c85dd850979948401f6c10613e5a B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b1] NES +e5564fb5a4b54dbd103803e2e15acd6d390b1cdf B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b2] NES +cc4a023e907b5fa3f415ebb284d64f7b95f92114 B Advanced Dungeons & Dragons - Heroes of the Lance (U) [b3] NES +5207100c4d9eb4dd9cd2e2f8b5814fa4ed3aca6e B Advanced Dungeons & Dragons - Heroes of the Lance (U) [o1] NES +9c2a89479470349deddb38cdbda242b26b6589fd B Advanced Dungeons & Dragons - Heroes of the Lance (U) [o2] NES +2611badd4923ab1ef83db2e98b6c944416dc1367 T Advanced Dungeons & Dragons - Heroes of the Lance (U) [T+Rus0.30_Chief-Net] NES +5bc6b4d5e2b27983e678376a95b041ecb3abe819 G Advanced Dungeons & Dragons - Hillsfar (J) [!] NES +5f86c4b515c1cdaf18dd22f60a2d59116e9b2f05 B Advanced Dungeons & Dragons - Hillsfar (J) [b1] NES +988c9199cafb56b54691af8bedaf161fbf9353d1 B Advanced Dungeons & Dragons - Hillsfar (J) [b2] NES +94af82688883d02b83733b36e300d1e742940e1a B Advanced Dungeons & Dragons - Hillsfar (J) [o1] NES +806eb65696593368bef9b62e63b1d8624c637030 G Advanced Dungeons & Dragons - Hillsfar (U) [!] NES +4aedc8efec6f8df4bfbab548a9523778b6fc9594 B Advanced Dungeons & Dragons - Hillsfar (U) [o1] NES +22261fef73fb2161c513632ff614af0ca17d8105 G Advanced Dungeons & Dragons - Pool of Radiance (J) [!] NES +7eca79e1a9684dbbf30dd282c3b44f0fd25deae4 B Advanced Dungeons & Dragons - Pool of Radiance (J) [b1] NES +8612381815f8d64128310ee201bb1b8560c98ab9 B Advanced Dungeons & Dragons - Pool of Radiance (J) [b1][o1] NES +28eaac4e09ed87fa70a10cca7f70a112502f5c8f B Advanced Dungeons & Dragons - Pool of Radiance (J) [o1] NES +a056d59aae542b15ce5361ab49954e746863029b B Advanced Dungeons & Dragons - Pool of Radiance (J) [o2] NES +81eefb9fa6552b95bb086552a043097d6ecdd051 G Advanced Dungeons & Dragons - Pool of Radiance (U) [!] NES +7ddd3a1811b62e94a59d1f5c17045dfd786640a7 B Advanced Dungeons & Dragons - Pool of Radiance (U) [b1] NES +995527d6333875de6ab0d99b00a77b3b6901db8c B Advanced Dungeons & Dragons - Pool of Radiance (U) [b2] NES +b9aab0a607081b9409da575ce15aa5e1517e52d9 B Advanced Dungeons & Dragons - Pool of Radiance (U) [o1] NES 1e28999c356e61b1df86830e6a44a28064b5c817 G Adventure Island (E) [!] NES 22ee75b82f4a6412aa6bb940e109704975b95185 G Adventure Island (U) [!] NES 1fda3bdfb434a51ce1b0d8ecc1048bead586aa78 B Adventure Island (U) [b1] NES @@ -762,7 +762,7 @@ a13dd4b5b89d9409f17cddac89d6cd9565ce515f G Adventures of Gilligan's Island, The 3ab83784dae8e89b6008210e0b5cfbd70819afcf C Adventures of Gilligan's Island, The (U) [t1] NES 38b3d3a93b7d6f586eea866323bd3fb9e4eca3a8 H Adventures of Ice Mario (SMB1 Hack) [a1] NES 6f8e6102756ba3bc48ae2a859f6f9d0b29f790df H Adventures of Ice Mario (SMB1 Hack) NES -31c22dc41dc70de595ba39e4851a71072d6c5f2c U Adventures of Lex & Grim, The (PD) NES +31c22dc41dc70de595ba39e4851a71072d6c5f2c U Adventures of Lex & Grim, The (PD) NES c43118388202bf348bae335eb2311ab8a0562bcb U Adventures of Lolo (E) (VC) NES d37c8003bf052404248ffaca106f7d32c75c8076 G Adventures of Lolo (E) [!] NES ad9ef7f61d97ecfc837f5f1eeb952935867306d7 G Adventures of Lolo (J) [!] NES @@ -887,8 +887,8 @@ f532c6e8d7d0443005f236bcfa2e6da52c0ac538 G Ai Senshi Nicol (FDS Conversion) [p2] df393788cf372f5b2e173ae3ee2b488d5d8b9efb B Aigiina no Yogen - From The Legend of Balubalouk (J) [b1] NES e277bdd8af36aaef9637477498834b1ed2074ae8 B Aigiina no Yogen - From The Legend of Balubalouk (J) [b2] NES e58d3146df2f09b3f98e4a35d132e05aa3347843 B Aigiina no Yogen - From The Legend of Balubalouk (J) [p1] NES -a4f42cbcb63f4d827055cbe1ced904ae0ccac4f7 T Aigiina no Yogen - From The Legend of Balubalouk (J) [T+Eng0.30_KP Hacks&Trans] NES -6305751b6a7c3b24aa7f5f182dec3a4358bf3bcc T Aigiina no Yogen - From The Legend of Balubalouk (J) [T+Eng0.30_KP Hacks&Trans][t1] NES +a4f42cbcb63f4d827055cbe1ced904ae0ccac4f7 T Aigiina no Yogen - From The Legend of Balubalouk (J) [T+Eng0.30_KP Hacks&Trans] NES +6305751b6a7c3b24aa7f5f182dec3a4358bf3bcc T Aigiina no Yogen - From The Legend of Balubalouk (J) [T+Eng0.30_KP Hacks&Trans][t1] NES 4bf385b7915e35d7fef3cd311caf9fdc7cb38048 C Aigiina no Yogen - From The Legend of Balubalouk (J) [t1] NES 93e4145c080847cf0d1c95e69d0f78e957fa4101 H Air (SMB1 Hack) NES e6aa612a23d571cf1b2196d13f0a4ec420d15efb U AIR - NES Visual Novel System V20040617 by NES Hack Factory (PD) NES @@ -1558,14 +1558,14 @@ c1dd041495a2ea02ffbbc583344b87137df8e984 B Back to the Future (U) [b4] NES 48404a7e46e0070aa1920130858315926d31b97e B Back to the Future (U) [o1] NES 5f262291edbcb4b4a72ca057bf8b379853af4556 T Back to the Future (U) [T+Pol] NES 24cc7674f742deec05ed246824f1bd6511ffdad6 H Back to the Future 4 by RyanVG (Back to the Future Hack) NES -641de451615a4f7004039308628c043b5ade6c31 H Back to the Future 5 & 6 by RyanVG (Back to the Future II & III Hack) NES +641de451615a4f7004039308628c043b5ade6c31 H Back to the Future 5 & 6 by RyanVG (Back to the Future II & III Hack) NES 4c79761269d0b9aaff4f9f9dcb28d8a106fa92b6 G Back to the Future IV (Unl) [!] NES -42ac1fcea405552892bed982a90a99d1292e4cdb G Back to the Future Part II & III (U) [!] NES -8338134a546f6c068c2b9e1bfdec45cab78d9571 B Back to the Future Part II & III (U) [b1] NES -4476ea6bbd674b081d4b36574c2746afad97abd6 B Back to the Future Part II & III (U) [b2] NES -060e5dde73dc19d931d561b28251a7c501771182 B Back to the Future Part II & III (U) [b3] NES -22ee09afdc4cb6f9790b9f87b0f49bcb19c6dce7 B Back to the Future Part II & III (U) [o1] NES -081f5da36bb4aaa0ad0b3bfafbf71a2ff1062697 C Back to the Future Part II & III (U) [t1] NES +42ac1fcea405552892bed982a90a99d1292e4cdb G Back to the Future Part II & III (U) [!] NES +8338134a546f6c068c2b9e1bfdec45cab78d9571 B Back to the Future Part II & III (U) [b1] NES +4476ea6bbd674b081d4b36574c2746afad97abd6 B Back to the Future Part II & III (U) [b2] NES +060e5dde73dc19d931d561b28251a7c501771182 B Back to the Future Part II & III (U) [b3] NES +22ee09afdc4cb6f9790b9f87b0f49bcb19c6dce7 B Back to the Future Part II & III (U) [o1] NES +081f5da36bb4aaa0ad0b3bfafbf71a2ff1062697 C Back to the Future Part II & III (U) [t1] NES 798d3f6cc1bf9a2dfcbb586c92fbd3e63ae7c172 U Background Music by Tony Young (PD) NES 86d389f46bde561394a7e69ff960f747a5ef297b U Backstroke (Ch) (Wxn) NES 92584bffe7d2ee47a01b480826466f78ff59f7dc U Bad Apple 2 v2009-12-24 (PD) NES @@ -1988,9 +1988,9 @@ fc950662b264fea1ad9f240360fde542283f04e1 U Batman Title Screen Remake by Macbee 91643c910a8c26b65e32cd8e4e8426d78d33713c H Batman V1.1 by Macbee (Batman Hack) NES e517ce0acda2a46341290b96fec12b2be51924ee H Batman V1.2 by Macbee (Batman Hack) NES 1a9fe00ebc831950bced93c556d1116543456460 U Bator Demo (PD) NES -f6177c581ed0b1d4625ec478caec3aa5939dc229 G Batsu & Terii - Makyou no Tetsujin Race (J) [!] NES -6a7a694a7bbcf59df990eec4be2c1157f104d43c B Batsu & Terii - Makyou no Tetsujin Race (J) [o1] NES -b7256a34856009ac3cdfeeb8142dd3fcc9c17c2e G Batsu & Terii - Makyou no Tetsujin Race (R) [!] NES +f6177c581ed0b1d4625ec478caec3aa5939dc229 G Batsu & Terii - Makyou no Tetsujin Race (J) [!] NES +6a7a694a7bbcf59df990eec4be2c1157f104d43c B Batsu & Terii - Makyou no Tetsujin Race (J) [o1] NES +b7256a34856009ac3cdfeeb8142dd3fcc9c17c2e G Batsu & Terii - Makyou no Tetsujin Race (R) [!] NES e3b20fb71dc6b44c911627cd321968a36578ea66 U Battle Ball (1-0) by UDISI (PD) NES 5915f487be763881a1f06cfdce689b1e1a503dd2 U Battle Ball (1-1) by UDISI (PD) NES 19fbe1d547f0cf085c99a80bbd3073f4d1ed33a0 U Battle Ball (1-21) by UDISI (PD) NES @@ -2161,16 +2161,16 @@ bd753272dcf11cb9b4c5d1e8d45436754897c97d B Battleship (U) [b2] NES 086e81e018013de624c9d18fb24771e503d68c47 B Battleship (U) [b4] NES 94dca436e97e7b6bfcfd4e13da6f08c5c81f2e2c B Battletank 2000 (Joust Hack) [o1] NES 5f0c7a2228e747d174590dc54a090daa73c74761 H Battletank 2000 (Joust Hack) NES -a5ab91d6a0df0bce2349a6322c536f4705287a4f G Battletoads & Double Dragon - The Ultimate Team (E) [!] NES -61832d0f955cff169ff059bd557be4f522b15b7c G Battletoads & Double Dragon - The Ultimate Team (U) [!] NES -b87d42a12a0f94a08b8476b1b2a0f1a36e050e3c B Battletoads & Double Dragon - The Ultimate Team (U) [o1] NES -a2f86721e107a039157724de5f69d3c1625ca214 G Battletoads & Double Dragon - The Ultimate Team (U) [p1][!] NES -3af7d0f3d2c7a105f958b205ae71fee6fa31536d B Battletoads & Double Dragon - The Ultimate Team (U) [p2] NES -dfe30b43464bb61470b4306d9f24f6ef43c685c2 B Battletoads & Double Dragon - The Ultimate Team (U) [p3] NES -ecdfa52d66575bede303075206e73c4a0aeb619a C Battletoads & Double Dragon - The Ultimate Team (U) [t1] NES -01ba0fa9342c6f8e196eeb8dbf49a3407df37a34 C Battletoads & Double Dragon - The Ultimate Team (U) [t2] NES -4cea01a1ca8d219a696c4c8b0f04465da3aa872f C Battletoads & Double Dragon - The Ultimate Team (U) [t3] NES -1b7750a413fcd4d907da8654a9b78c7aa0ed423c H Battletoads & Double Dragon - The Ultimate Team by myaso (Hack) NES +a5ab91d6a0df0bce2349a6322c536f4705287a4f G Battletoads & Double Dragon - The Ultimate Team (E) [!] NES +61832d0f955cff169ff059bd557be4f522b15b7c G Battletoads & Double Dragon - The Ultimate Team (U) [!] NES +b87d42a12a0f94a08b8476b1b2a0f1a36e050e3c B Battletoads & Double Dragon - The Ultimate Team (U) [o1] NES +a2f86721e107a039157724de5f69d3c1625ca214 G Battletoads & Double Dragon - The Ultimate Team (U) [p1][!] NES +3af7d0f3d2c7a105f958b205ae71fee6fa31536d B Battletoads & Double Dragon - The Ultimate Team (U) [p2] NES +dfe30b43464bb61470b4306d9f24f6ef43c685c2 B Battletoads & Double Dragon - The Ultimate Team (U) [p3] NES +ecdfa52d66575bede303075206e73c4a0aeb619a C Battletoads & Double Dragon - The Ultimate Team (U) [t1] NES +01ba0fa9342c6f8e196eeb8dbf49a3407df37a34 C Battletoads & Double Dragon - The Ultimate Team (U) [t2] NES +4cea01a1ca8d219a696c4c8b0f04465da3aa872f C Battletoads & Double Dragon - The Ultimate Team (U) [t3] NES +1b7750a413fcd4d907da8654a9b78c7aa0ed423c H Battletoads & Double Dragon - The Ultimate Team by myaso (Hack) NES 37e99fa67463140b2875d1079ade1ea7f3f2821f G Battletoads (E) [!] NES cbe809d8091d4421548e63c7b5e0b7ae972b45cf G Battletoads (J) [!] NES a9fd5d06382c88293462161bd8d882eb859b98d0 C Battletoads (J) [t2] NES @@ -2195,7 +2195,7 @@ a5b0bf325118b719367f8d7816504e04877452e7 B Be-Bop-Highschool - Koukousei Gokurak f07f637a55fa92b6875adb08ab9864446141440c H Beast Machines (Ikari Hack) NES b44a2ba9f96d3810d10801e6e3a4f68f112fbb6a G Beat n Box (K) (Unl) [!] NES 8bd8815ac4c09077145f2640bc37a5ac0e2b41ef G Beauty and the Beast (E) [!] NES -062f1bca6345f1346f96bf776768cb4a5fec7f2b U Beavis & Butt-head Title Screen by Macbee 1.0 (PD) NES +062f1bca6345f1346f96bf776768cb4a5fec7f2b U Beavis & Butt-head Title Screen by Macbee 1.0 (PD) NES b47df8791af3e39ac486b5d09b313109e8aeebcf G Bee 52 (Camerica) [!] NES 4af2961903378200d6db3ebc2cb77a28af7e3c3c B Bee 52 (Camerica) [o1] NES 48a7de1e5288428c6efb51c2d036efcce7f13384 T Bee 52 (Camerica) [T+Rus_Magicteam] NES @@ -2255,16 +2255,16 @@ b77195b1c6bfc9be2e2b7c8e00a4f1e4eb717f52 B Bible Adventures (Wisdom Tree) (V1.3) 9459027fe75f19e2bf8f6c86ffd3410445a2f28e B Bible Buffet (Wisdom Tree) (V6.0) [b1] NES f28787091c0a1d219de7c1ac574b5f8ba94dfe04 B Bible Buffet (Wisdom Tree) (V6.0) [o1] NES 10e4ad1a87f4522960574d651f2a832596ce156f H Bicycle Race (F-1 Race Hack) NES -75c71cc6d187c855b3e982edcea8eccb729ee917 G Big Bird's Hide & Speak (U) [!] NES -12eb07f634424deb6a2336c2c3f0ce34722ebbca B Big Bird's Hide & Speak (U) [b1] NES -396b8bad5215abd2ce509edaf5cd4a65ed0c6548 B Big Bird's Hide & Speak (U) [b1][o1] NES -1fdbfdda17130146dc78c3914976de451726d0e1 B Big Bird's Hide & Speak (U) [b2] NES -5002d3ce6a5c809969e6eda26f58c872045e017c B Big Bird's Hide & Speak (U) [b3] NES -f529a06bd217c6e5678a6eb3e4bf6db5120a7d43 B Big Bird's Hide & Speak (U) [b4] NES -56564ef56008813863efeb82acc0f9008c9a7175 B Big Bird's Hide & Speak (U) [b6] NES -8d9dda7bfb0ee4192f8e1c6ddfed3167b565bb75 B Big Bird's Hide & Speak (U) [b7] NES -91201e10a1e91f10a06b98512275108ebd7d3f1d B Big Bird's Hide & Speak (U) [o1] NES -89d7f554a62ce24f3442b64cfea4cc7bd5ecb0d1 B Big Bird's Hide & Speak (U) [o2] NES +75c71cc6d187c855b3e982edcea8eccb729ee917 G Big Bird's Hide & Speak (U) [!] NES +12eb07f634424deb6a2336c2c3f0ce34722ebbca B Big Bird's Hide & Speak (U) [b1] NES +396b8bad5215abd2ce509edaf5cd4a65ed0c6548 B Big Bird's Hide & Speak (U) [b1][o1] NES +1fdbfdda17130146dc78c3914976de451726d0e1 B Big Bird's Hide & Speak (U) [b2] NES +5002d3ce6a5c809969e6eda26f58c872045e017c B Big Bird's Hide & Speak (U) [b3] NES +f529a06bd217c6e5678a6eb3e4bf6db5120a7d43 B Big Bird's Hide & Speak (U) [b4] NES +56564ef56008813863efeb82acc0f9008c9a7175 B Big Bird's Hide & Speak (U) [b6] NES +8d9dda7bfb0ee4192f8e1c6ddfed3167b565bb75 B Big Bird's Hide & Speak (U) [b7] NES +91201e10a1e91f10a06b98512275108ebd7d3f1d B Big Bird's Hide & Speak (U) [o1] NES +89d7f554a62ce24f3442b64cfea4cc7bd5ecb0d1 B Big Bird's Hide & Speak (U) [o2] NES 6208f86f22c8445d3936ad5fd715069083ab6ab8 H Big Kids Pro-Wrestling by RyanVG (Tag Team Pro-Wrestling Hack) NES 91cf3e24b02ae75b7be395e524d9545bee50ab81 G Big Nose Freaks Out (Camerica) (Aladdin) [!] NES 60550d03da8eba47778b2c6ea708ca96364d0148 B Big Nose Freaks Out (Camerica) (Aladdin) [o1] NES @@ -2312,10 +2312,10 @@ ed31a87395748473cc106d7fa454ba04a53f1dbd B Bikkuriman World - Gekitou Sei Senshi dab4f077c1220c1cee5c56d8c9fdaf797af78d15 B Bikkuriman World - Gekitou Sei Senshi (J) [o2] NES d07fc347b34340ec3bee5b5366d51a97d235f0f5 H Bikkuriman World - Gekitou Sei Senshi (J) [p1][hM02] NES 14de52da6383e9f6c72d812c728d8be95cc4d8ff T Bikkuriman World - Gekitou Sei Senshi (J) [T+Eng] NES -bb3a2c8fcc6801a3658b5cd4e5c10bbbe1a96cb1 G Bill & Ted's Excellent Video Game Adventure (U) [!] NES -e1abcfdf970177b00e8a3c8a37f433bbd66c6f58 B Bill & Ted's Excellent Video Game Adventure (U) [b1] NES -1fd46ea2cb68aa9a02eb7e42703df393af6c65ef B Bill & Ted's Excellent Video Game Adventure (U) [b2] NES -b6e33ffe9574e09443c80bd07f20aa7cbdce98c8 B Bill & Ted's Excellent Video Game Adventure (U) [o1] NES +bb3a2c8fcc6801a3658b5cd4e5c10bbbe1a96cb1 G Bill & Ted's Excellent Video Game Adventure (U) [!] NES +e1abcfdf970177b00e8a3c8a37f433bbd66c6f58 B Bill & Ted's Excellent Video Game Adventure (U) [b1] NES +1fd46ea2cb68aa9a02eb7e42703df393af6c65ef B Bill & Ted's Excellent Video Game Adventure (U) [b2] NES +b6e33ffe9574e09443c80bd07f20aa7cbdce98c8 B Bill & Ted's Excellent Video Game Adventure (U) [o1] NES a677abfc4fa5ddd76092e41ae02cf3fd7eb05f9b G Bill Elliott's NASCAR Challenge (U) [!] NES e81f0dd2d7982ca6caefe8bc9afb09235cc58a47 B Bill Elliott's NASCAR Challenge (U) [b1] NES 3320ccda897692e186aa559d4939dea6cab7aafd B Bill Elliott's NASCAR Challenge (U) [b2] NES @@ -2689,8 +2689,8 @@ ea8923de0101a2fa05aa86b193244e06746d5a9f C Booby Kids (J) [t1] NES d73bff0c21555d9d313b3adaf95e56dcba0fdf94 B Boogerman II (Rex-Soft) [o1] NES 1569ea8845e6bb128da9823fcb493d3aec0cc130 G Boogerman II (Rex-Soft) [U][!].unf NES b2d980ac5e1a19e11e8240fb627973c8642311b7 B Boogerman II (Rex-Soft) [U][o1].unf NES -f3908331337357ec80b4a24f49b73ebbb0f3048d T Boris & Boa Boa (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -a7346085c5d6b761d04b9b2744a2ede13603fe3e H Boris & Boa Boa (Nuts & Milk Hack) NES +f3908331337357ec80b4a24f49b73ebbb0f3048d T Boris & Boa Boa (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +a7346085c5d6b761d04b9b2744a2ede13603fe3e H Boris & Boa Boa (Nuts & Milk Hack) NES fbfd34bb9a3a36789b5dac2d7aed0bf85217c2fc H Boss Rush (Castlevania Hack) [a1] NES 1d8a29a5d9c203e7d735696ef2099a9e746226ab H Boss Rush (Castlevania Hack) NES 0096f2938f633e1708c5e310dd0d80e2ec628b67 U Boss Test (PD) NES @@ -2780,7 +2780,7 @@ b65d1ff7c15dc37808fdc6c92919c868b1694b65 B BreakThru (U) [b4] NES bb336fb04e0003ea495afdc19cb13aad1007a230 B BreakThru (U) [o5] NES 8e43fc66fb280ac4330320f2a979a0e48e34fa9a T BreakThru (U) [T+Rus1.2_Multisoft] NES 58114b87cd95478361eb22ce3b0f173ca81729fc G Brilliant Com Pack 2 (K) [!] NES -0538fdcac01639743e5fc053ef83089b6d7654cd G Bruce & Leo (Tom & Jerry) (Unl) [!] NES +0538fdcac01639743e5fc053ef83089b6d7654cd G Bruce & Leo (Tom & Jerry) (Unl) [!] NES c3637f75754e7c3c665f5d9583502663dccf1ea0 B Brush Roller (Unl) [b1] NES 1895e8d17b8721e49f802c0c247765f3dca1a1eb B Brush Roller (Unl) [o1] NES 314700b6c4e1006b4f48ba856fd290b07c54c6d2 U Brush Roller (Unl) NES @@ -3139,8 +3139,8 @@ dc441137c9c0cf5fde9cb7fd8d8ae795777ca372 H Captain Tsubasa Vol. II - Chin3 by Zi 54d55d350114fd3346020c3f11b57774c9b7ea00 H Captain Tsubasa Vol. II - China vs Japan (Hack) NES d9d049618757de596a2e3230726cf7c4a099c961 H Captain Tsubasa Vol. II - Chinese Team Going Forward in Rainstorm (Hack) NES cd12f75b44883312c1c92817a47ca97bb082e585 H Captain Tsubasa Vol. II - Chinese Team Running in the Rain (Hack) NES -45a1cded0f8ab9763fe99476e6c7d7192ad92f37 H Captain Tsubasa Vol. II - Circle & Cross (Hack) NES -b915156298b2e589b7fa1711a19fb61d19f9ff8b H Captain Tsubasa Vol. II - Club Plus & Fix Edition (Hack) NES +45a1cded0f8ab9763fe99476e6c7d7192ad92f37 H Captain Tsubasa Vol. II - Circle & Cross (Hack) NES +b915156298b2e589b7fa1711a19fb61d19f9ff8b H Captain Tsubasa Vol. II - Club Plus & Fix Edition (Hack) NES ca77e6d6d0f3762fb0e28ef8393a6dfb3a859720 B Captain Tsubasa Vol. II - Comback of Twins J Edition (Hack) [o1] NES a94d3768b57d1037b76cae5e559937cea1152f22 H Captain Tsubasa Vol. II - Comback of Twins J Edition (Hack) NES ad449f5d79a68b2b98b0ace2907dd58d36e13011 H Captain Tsubasa Vol. II - Comback of Twins K Edition (Hack) NES @@ -3257,7 +3257,7 @@ ed65670dcfadc367c4d141669654d27a29907aaa H Captain Tsubasa Vol. II - New Artists 497c6fe476abef31de7d1e692aa5fb9ad31ad7ec H Captain Tsubasa Vol. II - New Platinum Partner (Hack) NES 72b411a5e93105c1c02f16419513884b547c550b H Captain Tsubasa Vol. II - New Road of Emperor Plus (Hack) NES a02b202044bff2c06f9649e45adea5c10f88c764 H Captain Tsubasa Vol. II - New Road of Emperor Remake Run Wildly Edition (Hack) NES -4ae227e0d97577b4f1d0a4386a7f2833b70bbede H Captain Tsubasa Vol. II - Nippon no Ovari by sisqo & kral 89 (Hack) NES +4ae227e0d97577b4f1d0a4386a7f2833b70bbede H Captain Tsubasa Vol. II - Nippon no Ovari by sisqo & kral 89 (Hack) NES af9d5e442cac049bc6ee97bef21832c915f8fcbe H Captain Tsubasa Vol. II - OMG by Heroy (Hack) NES 1c7d72b8019bf8977f3694121c94de3a05707348 H Captain Tsubasa Vol. II - Onur Edition 2011 (Hack) NES c4947d4d58cffc8d80e6b3240e0f2e775d0e6a92 H Captain Tsubasa Vol. II - Orbit of Honor (Hack) NES @@ -3275,7 +3275,7 @@ ad0c06288f4ac3427524ee33f72c64e2026828ce H Captain Tsubasa Vol. II - Prince Nye 2025ce107819e051765845e15bdabbdcabb2450b H Captain Tsubasa Vol. II - Prince with Unlimited Allure (Hack) NES 6641d0f7166219e302b53a0391e78f2bdca0c942 H Captain Tsubasa Vol. II - Prologue of New Legend (Hack) NES 32f51d3c805b1594bca7a5128663fcbe377f9df9 H Captain Tsubasa Vol. II - Prologue of New Tanaru Legend (Hack) NES -1f229c31596e5dec91d410c72b616d519aea78d5 H Captain Tsubasa Vol. II - Raiju & Ocelot Edition (Hack) NES +1f229c31596e5dec91d410c72b616d519aea78d5 H Captain Tsubasa Vol. II - Raiju & Ocelot Edition (Hack) NES ce161826da7f3e46f3943bc05da23b5c866aaaae H Captain Tsubasa Vol. II - Raise of Western (Hack) NES adddaf33336b9721aa4dafb07eda260fd5229bdf H Captain Tsubasa Vol. II - Rampion Edition (Hack) NES a0759a83d16996fc6084eb95af2f0db1b2f345e9 H Captain Tsubasa Vol. II - Relin Edition v1.1 by mazong1123 (Hack) NES @@ -3313,7 +3313,7 @@ e8e48b44700c1efaf8c03e1752b03190febecc4f H Captain Tsubasa Vol. II - Sino-Korean e4d0b8f696fca5c834215e8f1c92ca7008687a46 H Captain Tsubasa Vol. II - Soccer Kiss (Hack) NES 9de5ffb7096c436ec5914d1d6dbbff508487638b H Captain Tsubasa Vol. II - Soccer Master in Argentina (Hack) NES 15a5fc93c408ca75e9c7af3ec20355b101566941 H Captain Tsubasa Vol. II - Sonunda Basardim Ilk Hackim (Hack) NES -dacfa7746cd9772000bf7a7797727bf69003b447 H Captain Tsubasa Vol. II - Speed of Ball Controlable & All Footballer (Hack) NES +dacfa7746cd9772000bf7a7797727bf69003b447 H Captain Tsubasa Vol. II - Speed of Ball Controlable & All Footballer (Hack) NES ae4dcc4971b095da02cdd15506a95a848ad0994e H Captain Tsubasa Vol. II - Speed of Ball Controlable (Hack) NES 90f3a515d7fc88faa4dcecc02544df6dcfb28fff H Captain Tsubasa Vol. II - Star 4 (Hack) NES 390b7a42c5a05cb85ef3758886aec39e0433be95 H Captain Tsubasa Vol. II - Story of Ryuji Amamiya (Hack) NES @@ -3359,7 +3359,7 @@ f1110e5206ebe7261caca6bf65dc8629ba3aa643 H Captain Tsubasa Vol. II - The New Joi 78d3750224ac99d57c8c549f49daf8bd4327f5e3 H Captain Tsubasa Vol. II - The Road to the King of World Cup of Romania (Hack) NES 08d80198896115199a243fd8989549eb824bf19f H Captain Tsubasa Vol. II - The World of King (Hack) NES fec3bd3b15e2c178ba6ccddf168321b86a5b4b90 H Captain Tsubasa Vol. II - The World of Master (Hack) NES -d638f9a142c98b9a295a303e5de3a9fb32731daf H Captain Tsubasa Vol. II - The World of Matsuyama & Emperor (Hack) NES +d638f9a142c98b9a295a303e5de3a9fb32731daf H Captain Tsubasa Vol. II - The World of Matsuyama & Emperor (Hack) NES db23d6e2e46a103a98ab28da85c9d8ca6ff46177 H Captain Tsubasa Vol. II - Three Musketeers of Uruguay (Hack) NES 9bc51e53dcb4a006d4548909b3d0d8046a1b80ab H Captain Tsubasa Vol. II - Tiger Arrive by hy1897 (Hack) NES 263445f5044a2ecda0da9bb742033c143d8111ae H Captain Tsubasa Vol. II - Tiger Arrive III (Hack) NES @@ -3369,9 +3369,9 @@ bea5f2dd7f36a90f796bfb4b5dbb8caec26cc8cf H Captain Tsubasa Vol. II - Tiger Threa dec1df219d5440f0dfd1bb89bf8c9cf112052187 H Captain Tsubasa Vol. II - Tiger Wake Up (Hack) NES abcc4f5e5956bd4b81907417f9c9449627cbb209 H Captain Tsubasa Vol. II - To Cleave a Path Toward the World (Hack) NES 4b938a7c140412a36d901ec34d4e6e3ab2316733 H Captain Tsubasa Vol. II - Tong's Final Perfect Edition (Hack) NES -1fbd50eac32baa20a3c691607e2b7dccabc5a988 H Captain Tsubasa Vol. II - True & False Poland (Hack) NES +1fbd50eac32baa20a3c691607e2b7dccabc5a988 H Captain Tsubasa Vol. II - True & False Poland (Hack) NES c56e2fc9b792d1d4955f09d9406645f4dda3b422 H Captain Tsubasa Vol. II - Two Brothers Edition (Hack) NES -909592b6fa254e85e6dfdd39450602ccd087d337 H Captain Tsubasa Vol. II - Two Dragons Among Sky & Land (Hack) NES +909592b6fa254e85e6dfdd39450602ccd087d337 H Captain Tsubasa Vol. II - Two Dragons Among Sky & Land (Hack) NES 3ce8b238c3112085e1c8fb7803c37dfeeb5121c0 H Captain Tsubasa Vol. II - Two Stars (Hack) NES 9dc7a0de94dc1533aa787cb326ae285b1cf3100c H Captain Tsubasa Vol. II - Ucuncu Edition (Hack) NES f12da591683afe725fbd7c31f6dcb96d943c1be1 H Captain Tsubasa Vol. II - United Team (Hack) NES @@ -3413,8 +3413,8 @@ d78d1b5a76ba5e791ed37678b0099bfb51c69e09 H Captain Tsubasa Vol. II by EricPonti fc72f4d7e9b57f86d30510db962162cee3d81ad7 H Captain Tsubasa Vol. II by Farouk (Hack) NES 5278e84254d596732eabccb63f59133f98cbc700 H Captain Tsubasa Vol. II by Greatsocrar (90807) (Hack) NES 84f25e8916f06b02034f0f2d1629f6a26c2f5db6 H Captain Tsubasa Vol. II by Hambg (Hack) NES -19fdc8c7b290cc0b4baa05217c4003a26caff94c H Captain Tsubasa Vol. II by Kral89 & Sisqo (101003) (Hack) NES -ece3a2266a8274efcae34d605821c526573418a8 H Captain Tsubasa Vol. II by Kral89 & Sisqo (90824) (Hack) NES +19fdc8c7b290cc0b4baa05217c4003a26caff94c H Captain Tsubasa Vol. II by Kral89 & Sisqo (101003) (Hack) NES +ece3a2266a8274efcae34d605821c526573418a8 H Captain Tsubasa Vol. II by Kral89 & Sisqo (90824) (Hack) NES 509f6256210049d730719f86852393dd51459352 H Captain Tsubasa Vol. II by RUI (V071103) (Hack) NES 5723575f7f28cac92ea1b620eec3f5e5c0769d37 H Captain Tsubasa Vol. II by Shinigami (120419) (Hack) NES f895c25e330122f9d848bc3c19dbec92c0fa6a9c H Captain Tsubasa Vol. II by Xiangfuxi (081104) (Hack) NES @@ -3828,12 +3828,12 @@ f53c5c4f9e6b3d0bdb9960157aef5deba002c8f7 U Chinese Character Demo (PD) NES 4f68fe97f00351696f83fb6a4b1ad868474316e9 G Chinese Checkers (Sachen-JAP) [U][!].unf NES 6662918d3ca6b789b71b7dffd0288d04edeb617a G Chinese Checkers (Sachen-USA) [!] NES a58b71b4b9ff14be13f3539405b23bccbca93b69 G Chinese Checkers (Sachen-USA) [U][!].unf NES -0db90c9ca321bb3accc6e376cab46018d934e149 G Chip & Dale 3 (Heavy Barrel) (Unl) [p1][!] NES -f874f6cceea1b5bfb950ae05e636238550c8b5f0 U Chip & Dale 3 (Heavy Barrel) (Unl) [p1][a1] NES -711ce9a3c6672fc26f5d3715fd6b240a1c2c2d42 U Chip & Dale 3 (Heavy Barrel) (Unl) [p1][a2] NES -9137af6f4a6da817eb5fd40ff4d5bdc9899151d5 B Chip & Dale 3 (Heavy Barrel) (Unl) [p1][o1] NES -9bc93a75bd86efa25173dc0190cb22f70f897890 T Chip & Dale 3 (Heavy Barrel) (Unl) [p1][T+Rus_Cool-Spot] NES -0b3ae3706a2038e6396cddd64c1a5f66f3db4634 T Chip & Dale 3 (Heavy Barrel) (Unl) [p1][T+Rus_Paha13] NES +0db90c9ca321bb3accc6e376cab46018d934e149 G Chip & Dale 3 (Heavy Barrel) (Unl) [p1][!] NES +f874f6cceea1b5bfb950ae05e636238550c8b5f0 U Chip & Dale 3 (Heavy Barrel) (Unl) [p1][a1] NES +711ce9a3c6672fc26f5d3715fd6b240a1c2c2d42 U Chip & Dale 3 (Heavy Barrel) (Unl) [p1][a2] NES +9137af6f4a6da817eb5fd40ff4d5bdc9899151d5 B Chip & Dale 3 (Heavy Barrel) (Unl) [p1][o1] NES +9bc93a75bd86efa25173dc0190cb22f70f897890 T Chip & Dale 3 (Heavy Barrel) (Unl) [p1][T+Rus_Cool-Spot] NES +0b3ae3706a2038e6396cddd64c1a5f66f3db4634 T Chip & Dale 3 (Heavy Barrel) (Unl) [p1][T+Rus_Paha13] NES 0752c8fa49ef9ca6828ba2e08b22f2a673e5469c G Chip 'n Dale Rescue Rangers (E) [!] NES 93140bf336c482ec8bbec50fcd586a2889830e6b T Chip 'n Dale Rescue Rangers (E) [T+Fre100%_Terminus] NES c16130b878cb7f4b799ba5eb373e066ac7e5b7d7 T Chip 'n Dale Rescue Rangers (E) [T+Ger_TischlDeckDich] NES @@ -4008,10 +4008,10 @@ df432e5bd5c9afa1c91e7c76ff5e5521d136643d U Chu Chu Rocket V.d by DWEdit (PD) NES d07c459890ae980bf2cd0ddfcb793ff9bdcbec74 U Chu Chu Rocket V.h by DWEdit (PD) NES 681f4869dbee15da0f71d1ea6aca743b1acc787e U Chu Chu Rocket V.xx by DWEdit (PD) NES 828b78d6b479566b2e58c8764fcc8a8b08a1292f U Chu Da D (Ch) NES -d4f3b7146af41e6e6914002569d0952a00dd9a7c U Chu Han Zheng Ba - The War Between Chu & Han (Ch) (Wxn) NES -cc5f73da064f2d9960a4992b23c188e84fae7577 B Chu Han Zheng Ba - The War Between Chu & Han (Ch) [b1] NES -1cf6a0e4337112405be96cad63a673d1193376dc H Chu Han Zheng Ba - The War Between Chu & Han (Ch) [f1] NES -3c7099746e8a9e63a6f2dcc86d1610944458a5fe U Chu Han Zheng Ba - The War Between Chu & Han (Ch) NES +d4f3b7146af41e6e6914002569d0952a00dd9a7c U Chu Han Zheng Ba - The War Between Chu & Han (Ch) (Wxn) NES +cc5f73da064f2d9960a4992b23c188e84fae7577 B Chu Han Zheng Ba - The War Between Chu & Han (Ch) [b1] NES +1cf6a0e4337112405be96cad63a673d1193376dc H Chu Han Zheng Ba - The War Between Chu & Han (Ch) [f1] NES +3c7099746e8a9e63a6f2dcc86d1610944458a5fe U Chu Han Zheng Ba - The War Between Chu & Han (Ch) NES 8aeac2380737ada73c4b6e87f751751785e416bf H Chu Liu Xiang (Ch) (Wxn) [f1] NES 2abe3e855bc7d3ee0c38fd16f8d4fc387d3a991e U Chu Liu Xiang (Ch) (Wxn) NES f69a7ff64f4f2c6f6ab89925b267e199152c00cd U Chu Liu Xiang (Ch) NES @@ -4517,7 +4517,7 @@ e283f529f23c1defcfdcf27b2eda4289f3c9d920 T Cosmo Genesis (J) [T-Eng1.0_Aeon Gene fd3d9f8a6c862773194c3e23b420aabe9453d2d6 T Cosmo Police Galivan (J) [T+Eng1.00_Jair] NES 6f38d0ada341f86f3055f689dd0f90c62556d91e U Cosmo Police Galivan (J) NES ec493cbab694b87477ff240d3b86bca0c4e62451 G Cosmos Cop (CN-08) (Unl) [!] NES -c4020f7aa09357974739e640673ef60af8386e21 H Counteroffensive of Mamoru Izawa & Kazuki Sorimachi (Captain Tsubasa II Hack) NES +c4020f7aa09357974739e640673ef60af8386e21 H Counteroffensive of Mamoru Izawa & Kazuki Sorimachi (Captain Tsubasa II Hack) NES 08c1a73e515cf5d3cc3573b6406a8ef351bc34f7 U Cow Boy (Unl) NES 3f12e2ac5e074e7970735d896331bb7e5ef5bb73 G Cowboy Kid (U) [!] NES 80eadde91d7172ef7694662aaaede874ecac7379 B Cowboy Kid (U) [o1] NES @@ -5047,8 +5047,8 @@ eb9b77ea091d80f61a612f3b0a04fdc68ba2a23f B Dian Shi Ma Li (Ch) [b2] NES fcfc928aecb25f3ee16dc42018b1c73d5283b5b4 B Dian Shi Ma Li (Ch) [b2][o1] NES 4eccc37c236b3f18c308631c68c7b2ce1614d28c B Dian Shi Ma Li (Ch) [b3] NES 050671f45712f65fec84dc490214a6942a8c53ff B Dian Shi Ma Li (Ch) [p1] NES -1c3b08f68ebe4981b84c074520b96a42d3b45d79 B Dick & Milk (Nuts & Milk Hack) [o1] NES -717328a839ca5aecc45cc1bdb48f5a0a87d913b9 H Dick & Milk (Nuts & Milk Hack) NES +1c3b08f68ebe4981b84c074520b96a42d3b45d79 B Dick & Milk (Nuts & Milk Hack) [o1] NES +717328a839ca5aecc45cc1bdb48f5a0a87d913b9 H Dick & Milk (Nuts & Milk Hack) NES 6ac01a581a1fd6b74ed6092943bd63066e14dbf0 H Dick Baseball (Baseball Hack) NES 29ecd49dc1a66ffc0a1abf9117a84a96a5f976a3 B Dick Dug (Dig Dug Hack) [o1] NES 1cff27dd1346d2a068e56c26d0282a7773738fb9 B Dick Dug (Dig Dug Hack) [o2] NES @@ -5257,11 +5257,11 @@ c26482ee39405d332aafcfff65fd378cbfd49cf6 T Donkey Kong (W) (PRG1) [T+Nor1.00_Jus e745fda35e90bcbbe470fa62f5dfd9b7cadefa5a T Donkey Kong (W) (PRG1) [T+Rus_Cool-Spot] NES 037b98dffd8203777ec37a8acd54945f4baae3ae T Donkey Kong (W) (PRG1) [T+Spa_PaladinKnights] NES 7156d06e0e1cea71c71005aad8160939fa12efdf H Donkey Kong - Dendyman's Revenge (Hack) NES -b2ba46743405fd399e86b34211310805a17986b6 H Donkey Kong 2 (Nuts & Milk Hack) [a1] NES -ea58fb27efbcc20f34ecb7781de299766b9ee76a T Donkey Kong 2 (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -800163f4b72901412b6a1899c2ba13123375abfb H Donkey Kong 2 (Nuts & Milk Hack) NES -f0e1d4d624573b4f7be5273947871417d87cfe5a T Donkey Kong 2 Demo Ver.5 (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -50b7580c05843cea716cf2624057df6bb9cfe061 H Donkey Kong 2 Demo Ver.5 (Nuts & Milk Hack) NES +b2ba46743405fd399e86b34211310805a17986b6 H Donkey Kong 2 (Nuts & Milk Hack) [a1] NES +ea58fb27efbcc20f34ecb7781de299766b9ee76a T Donkey Kong 2 (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +800163f4b72901412b6a1899c2ba13123375abfb H Donkey Kong 2 (Nuts & Milk Hack) NES +f0e1d4d624573b4f7be5273947871417d87cfe5a T Donkey Kong 2 Demo Ver.5 (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +50b7580c05843cea716cf2624057df6bb9cfe061 H Donkey Kong 2 Demo Ver.5 (Nuts & Milk Hack) NES c4e4062a91ea9fdbd575b77535bc7a4194e46694 U Donkey Kong 3 (U) (GBA e-Reader) NES 2fdc5f68313f0fb619fa1f741cd517cc0cb18c56 T Donkey Kong 3 (U) [T+Rus_Cool-Spot][a1] NES ec6fa944c672a2522c8bc270a25842281c65ff5d G Donkey Kong 3 (W) [!] NES @@ -5446,7 +5446,7 @@ dd3490d98b8ced80263db9d17721e34dbf12db85 T Double Dragon II - The Revenge (U) (P c46342b03cec7f9a895db964125760237340f116 H Double Dragon II - The Revenge - Classic Strengthened Edition (Hack) NES 35844839991c094e86ab59205d5c0c29dda490f3 H Double Dragon II - The Revenge - Clone of Bosses Edition (Hack) NES a3c419051711233cd192405f14986059805626a4 H Double Dragon II - The Revenge - Ultimate Strengthened Edition (Hack) NES -c19b034e5886c97da670b1381bb94dfa9873e96e H Double Dragon II - The Revenge by D.S.ghtMaster&KRIZAL (Hack) NES +c19b034e5886c97da670b1381bb94dfa9873e96e H Double Dragon II - The Revenge by D.S.ghtMaster&KRIZAL (Hack) NES 3a0fadff2b3beec2dc1f13b12eb7840af588aad7 H Double Dragon II - The Revenge by KRIZAL (Hack) NES dd37c6f3de1ceaed9a8bd1abcf9aafbf47b74059 H Double Dragon II - The Revenge Control Hack by Evgeny (Hack) NES 9fca8eb7eb3a635ad71afa3e719aa5cd1ba9a7c3 H Double Dragon III - Skip Level (Hack) [a1] NES @@ -5465,7 +5465,7 @@ f878cbd0d7065df4a4ca1733085f03955b64819f C Double Dragon III - The Rosetta Stone a0ccc44a8723ceb83a644c45fd6e724b4dadcb90 C Double Dragon III - The Rosetta Stone (J) [t3] NES 9ad84eeb300efaf15a69955ffbc6d65dfc50f99c H Double Dragon III - The Rosetta Stone - Additional Moves by shinwa (Hack) NES 88d2150bac12098680e23e92be8f5de8869cc421 H Double Dragon III - The Rosetta Stone - Bosses Usable Edition by shinwa (Hack) NES -f57e4ae9c12e05343b6dee3e4af21b2513971345 H Double Dragon III - The Rosetta Stone - Combined Skill & Enemies Changed Edition (Hack) NES +f57e4ae9c12e05343b6dee3e4af21b2513971345 H Double Dragon III - The Rosetta Stone - Combined Skill & Enemies Changed Edition (Hack) NES 2a88c78e830290d901a4010e5950f9149ab0db2d H Double Dragon III - The Rosetta Stone - Combined Skill Edition (Hack) NES f2fdc2ae7491dec5c9980678645dbd9b65160709 H Double Dragon III - The Rosetta Stone - Shuang Zai Long 3 by madcell (Hack) NES a1da64a21156c537b75162f0b64da651eee1a6b8 H Double Dragon III - The Rosetta Stone - Super Skill Edition (Hack) NES @@ -5995,7 +5995,7 @@ e81a4d42dd06ba171ef5e812623115b291f295b6 T Dream Master (J) [T+Eng] NES 5a71c261b50146962940fbbd840be8617b47e07b G DreamGEAR 75-in-1 (Unl) [U][!].unf NES 907564f256368d67d9ce6b361896e7d375ad7589 U Dreamworld Pogie (Prototype) NES 7525ca4bb891940d308164dee33c497d826c1960 H Dreamworld Pogie Revival (Dreamworld Pogie Hack) NES -882a3686982874112af0d20875e3f7e9496a7392 U Driar by Stefan Adolfsson & David Eriksson (PD) NES +882a3686982874112af0d20875e3f7e9496a7392 U Driar by Stefan Adolfsson & David Eriksson (PD) NES 0cc28dc56c8ee9bb5114708b98348a592da9aec4 U Dringle (Unl) NES af8febe0ef1011e5838bf3c38933ecea06721042 U Drip for NES Ported by quietust (2006-08-16) (PD) [U].unf NES 54261d0c387cd62161d5a0ad4cff9b0d3f48c3c7 U Drip for NES Ported by quietust (2006-10) (PD) [U].unf NES @@ -6089,9 +6089,9 @@ bfcf258c012d2369ec581038abae2021f147f531 U Duel, The by Bokudono (PD) NES d6c42a64492dd75bf31b07fd8f0dba421b30ba99 B Dumbass (PD) [b1] NES 19af20fc254fe8ff443f7db8d4461b7d71dee0cf U Dune War (Unl) (VT03) NES 26b782d3f6d080bb0fb0cbd236be3d0e7ad174b2 U Dung Dung No 1 (Ch) NES -04295f33c9555d4694c57aa6423dbe1466b98836 G Dungeon & Magic - Swords of Element (J) [!] NES -d8054f63f849e6b01497450d763867ba43423a26 B Dungeon & Magic - Swords of Element (J) [b1] NES -f4b42da49b97bf4d93fde1016602087fe5c5b0cb B Dungeon & Magic - Swords of Element (J) [o1] NES +04295f33c9555d4694c57aa6423dbe1466b98836 G Dungeon & Magic - Swords of Element (J) [!] NES +d8054f63f849e6b01497450d763867ba43423a26 B Dungeon & Magic - Swords of Element (J) [b1] NES +f4b42da49b97bf4d93fde1016602087fe5c5b0cb B Dungeon & Magic - Swords of Element (J) [o1] NES 427506826bf9cf2ef144100be2e3f98d9e979798 G Dungeon Kid (J) [!] NES 602ca2cada36025c04562dc174f7ceca284885b3 B Dungeon Kid (J) [b1] NES d8519092cf52b7a4f0fc94a9829ada12681c0279 C Dungeon Kid (J) [t1] NES @@ -6219,8 +6219,8 @@ c4085b7a4aabd8ac27fdc2b647715d451a2bc04a B Eliminator Boat Duel (U) [b1] NES d0ef1150ab6cdcb076a528cf2b18a780864d4bb3 B Eliminator Boat Duel (U) [o1] NES 00009ecaf75344e39cc9a94805f5113c10f270a2 B Eliminator Boat Duel (U) [o2] NES 02b277caef0970078dfb3f2dbb7ced731380ecfd G Elite (E) [!] NES -aa3b7bbb929efd9c2b364e63000ccb1cc107c2a0 B Elite (E) [f1] (NTSC by Ian Bell & David Braben) [o1] NES -17c4f91469931ea309bfff4faba3f3c34deed3c7 H Elite (E) [f1] (NTSC by Ian Bell & David Braben) NES +aa3b7bbb929efd9c2b364e63000ccb1cc107c2a0 B Elite (E) [f1] (NTSC by Ian Bell & David Braben) [o1] NES +17c4f91469931ea309bfff4faba3f3c34deed3c7 H Elite (E) [f1] (NTSC by Ian Bell & David Braben) NES 092849f8d75ac1206f63bb82e43c4f670fb8eed1 H Elite Tecmo League (Tecmo Super Bowl Hack) NES 4d4faac62a455dfa8ada73480e6c67906b3957e1 H Elite Tecmo League Clock (Tecmo Super Bowl Hack) NES 8bb770863ccded715de87dbccbf26e36c8363572 H Elite Tecmo League S1 Week 03 (Tecmo Super Bowl Hack) NES @@ -6261,7 +6261,7 @@ f59d7b0cf20d9abaf6a7b7f1b66744ea55f9d2fa G Erika to Satoru no Yume Bouken (J) [! c42a1191d0292f208873e0e1ab122d7354c7925e H Erika to Satoru no Yume Bouken (J) [f1] NES 222ac701664930f295da954393e8eb9376017f33 B Erika to Satoru no Yume Bouken (J) [f1][o1] NES bc59e706bc0cda456e496b2403a41df61eebfdbb B Erika to Satoru no Yume Bouken (J) [hM04][b1] NES -00222d1ea57c7ee4bb614536642d03f02cbca769 H Ernie & The Muppets Take It All Off (Sesame Street ABC Hack) NES +00222d1ea57c7ee4bb614536642d03f02cbca769 H Ernie & The Muppets Take It All Off (Sesame Street ABC Hack) NES 4f4355afcfde87e651c32eda7610d67c02396ff8 G Erunaaku no Zaihou (J) [!] NES aff3198813f2e25c9684b63354f1da6bdf2d7c6d B Erunaaku no Zaihou (J) [b1] NES 8d68935e94134eec22a4259080b3ce5590e4f7a3 B Erunaaku no Zaihou (J) [b2] NES @@ -6419,7 +6419,7 @@ a0375e7e0da9093417a9d081b7606ed9f5c71ac3 B F-15 Strike Eagle (U) [o1] NES 96ab957763051c6b8d952567450469c9af99e3d4 B F22 (Ch) [b1] NES 63c23c5bb78d256a0361e7a7a0ffb24d8c87cc11 T Facemaker (Dr. PC Jr.) (Ch) [T+Rus_Cool-Spot] NES dc8fde977a5a06d579f80d0861b235014b678a53 U Facemaker (Dr. PC Jr.) (Ch) NES -ea97d054a53c65428d1c1ee27c2fc5c945944843 U Fade to Black by Frederik Schultz & Morgan Johansson (PD) NES +ea97d054a53c65428d1c1ee27c2fc5c945944843 U Fade to Black by Frederik Schultz & Morgan Johansson (PD) NES 9f3d83c3b6e620d9e67cf5cd49428c3f88a71ca4 H Fall of the Moon v1.0 (Zelda Hack) NES 508dfa36b062dfd1a465301ada3a876acc402582 U Falldown by Sivak (2008) (PD) NES 45543a0aed48f5d0943a8ee33ea8a9709c3bfa3d H Falling Mario by WA (SMB1 Hack) NES @@ -6441,7 +6441,7 @@ f07d48f7355480f855a60d0e8c65621f4e4c643d H Famicom Jump II - Saikyou no 7 Nin (J 9c5381325383bf6c074b2c3cdcc825e138615a19 G Famicom Meijin Sen (J) [!] NES 44c1d079b75deeb3e858240a0d4a10d5d7add87c U Famicom Meijin Sen (J) [a1] NES aaf74b17bfe8c18fd672fcae18741956d1c3380e B Famicom Meijin Sen (J) [a1][o1] NES -6992f115820264ceaaff988cb4bfbe3c5e35ecc9 U Famicom Pro Action Rocky Encoder-Decoder by Chris Covell, ReaperSMS & Jamethiel (PD) NES +6992f115820264ceaaff988cb4bfbe3c5e35ecc9 U Famicom Pro Action Rocky Encoder-Decoder by Chris Covell, ReaperSMS & Jamethiel (PD) NES 21727912fe4ae683da2c7aadb029f355079964fd U Famicom Sequencer V0.5 (PD) NES 052e6915a4b6c15982d5b134fce7581210c7d8de U Famicom Shougi - Ryuuousen (J) (Prototype) NES e4cc5f8e013fae686d97f3901c261b5abfcc9d5b B Famicom Shougi - Ryuuousen (J) [o1] NES @@ -6580,10 +6580,10 @@ a3d852930db34bb76c1ac1531311dd5552b8e7be G Fantasy Zone (Tengen) [!] NES 96aca644fb0450542d35573e99afdd1534f8191f H Fantasy Zone 2 - The Teardrop of Opa-Opa (J) [hFFE] NES 7b7b333f5f4da08f523256518b5244006c994090 B Fantasy Zone 2 - The Teardrop of Opa-Opa (J) [o1] NES 808cc9050dcee35fa499d601e8567166bda4493a C Fantasy Zone 2 - The Teardrop of Opa-Opa (J) [t1] NES -2841d46704680033b183c7c07945dbbcb68427ed G Faria - A World of Mystery & Danger! (U) [!] NES -b9350d2ca19c4185b8cb32ffa5e51b114a5702fc B Faria - A World of Mystery & Danger! (U) [b1] NES -6129ba26219de2586562234e8f16a29ad6c586db B Faria - A World of Mystery & Danger! (U) [o1] NES -24027380173f2004a44870c8fee3eb9dd1027d76 C Faria - A World of Mystery & Danger! (U) [t1] NES +2841d46704680033b183c7c07945dbbcb68427ed G Faria - A World of Mystery & Danger! (U) [!] NES +b9350d2ca19c4185b8cb32ffa5e51b114a5702fc B Faria - A World of Mystery & Danger! (U) [b1] NES +6129ba26219de2586562234e8f16a29ad6c586db B Faria - A World of Mystery & Danger! (U) [o1] NES +24027380173f2004a44870c8fee3eb9dd1027d76 C Faria - A World of Mystery & Danger! (U) [t1] NES e7fdd7976a9c834f171b3ac39ab69259e05a0afa G Faria - Fuuin no Tsurugi (J) [!] NES d87116e7aee1b8fac894b30b4aaa50539aaedab9 B Faria - Fuuin no Tsurugi (J) [b1] NES 2235a01f54223dd2609cef3dc3dc82b7775b9bfb B Faria - Fuuin no Tsurugi (J) [b2] NES @@ -6631,7 +6631,7 @@ e86add4e0badb9396c18bbc2b786b08a044dd83d H Faxanadu Uncensored Edition by Safari 0db354cc152ff3413e401160d5f51871326628aa C FC Genjin - Freakthoropus Computerus (J) [t1] NES 99e513dba565f5b4f648bc0a1a0f52aff5a48946 U FC Genjin - Freakthoropus Computerus (J) NES 99d5f61fc8fda02db984308368277a326c123977 U FC Intro by emumax (PD) NES -416b236dd5babc127555185e15a22f70e718186e U FC WIN2000 (for Infrared Mouse & Keyboard) (Ch) NES +416b236dd5babc127555185e15a22f70e718186e U FC WIN2000 (for Infrared Mouse & Keyboard) (Ch) NES 07252ffa0df0f65d681e79ab2ba38250ec85c08b U FC-Subor V3.0 Music Demo (Unl) NES e0d0eaaf0523d3442072134667198ea5ee342934 H Fedsvd MLB (R.B.I. Baseball Hack) [a1] NES 6411512f09c63c6679c258b9c8cbd87791581f1f H Fedsvd MLB (R.B.I. Baseball Hack) NES @@ -6664,7 +6664,7 @@ c2add8e26655ba9b6774197dc1a6e730f0a92c0b U Feng Se Huan Xiang (ES-1138) (Ch) NES 083793f71533db327cbcbe0ae27d4a1483733777 U Feng Yun (Ch) (Decrypted) NES 1a0ced71e62f11bccb4b2de3fe0433240e75357b U Feng Yun (Ch) (Wxn) NES ea0d9f0df87a2c5b518642bb793d67b544ae5165 U Feng Yun (Ch) NES -8008cd3ff792a2c7e5e34c34543394d6ffbf48b5 U Fengli Dance 12-in-1 & 24-in-1 (Ch) NES +8008cd3ff792a2c7e5e34c34543394d6ffbf48b5 U Fengli Dance 12-in-1 & 24-in-1 (Ch) NES 1f3c590a05e3897f4266302f744dd65e70e501b0 G Ferrari - Grand Prix Challenge (E) [!] NES 146e39e962c6fff24724fe55d632ba4217cc3b67 G Ferrari - Grand Prix Challenge (J) [!] NES bee319db995fc25dd6ee88217e10420aab7310ca G Ferrari - Grand Prix Challenge (U) [!] NES @@ -6829,13 +6829,13 @@ b0f164556d8cb71b2c04bd7d9d306c0e7c026772 H Final Fantasy Epica V2.0 by Clomax Do edafdca67ae322a086386b219d67c526de592f73 H Final Fantasy Gaiden (FF1 Hack) NES 083294dfaa5238c750110ce0d95b57ebcd9c9ce6 H Final Fantasy Hard Type by Red Wizard (FF1 Hack) NES 5b46b541851eefc0954bd7f15ef860dc43bf1fac H Final Fantasy Hardtype V1.1 (FF1 Hack) NES -4b22c2c88fc71eacf270ea51ef218944bb4c536a G Final Fantasy I & II (J) [!] NES -b3c2be46b4118df618a90969aec3836c36213187 B Final Fantasy I & II (J) [b1] NES -f68f71e3475a0d2a3455eb4ea55aa7c6b4989329 B Final Fantasy I & II (J) [b2] NES -e0a971450a7907f8e5ac1749638d03800c371cce B Final Fantasy I & II (J) [o1] NES -5c86afaee19c4d564be583d19639af9e3308a6c6 B Final Fantasy I & II (J) [o1][T+Eng1.00_Demiforce] NES -704d46eb311a7d07268ea57de26cdacc3a83711a T Final Fantasy I & II (J) [T+Eng1.00_Demiforce,Grond] NES -ff5a216e3da57ee7133449a4ac6b0e8957a23595 T Final Fantasy I & II (J) [T+Eng1.00_Demiforce] NES +4b22c2c88fc71eacf270ea51ef218944bb4c536a G Final Fantasy I & II (J) [!] NES +b3c2be46b4118df618a90969aec3836c36213187 B Final Fantasy I & II (J) [b1] NES +f68f71e3475a0d2a3455eb4ea55aa7c6b4989329 B Final Fantasy I & II (J) [b2] NES +e0a971450a7907f8e5ac1749638d03800c371cce B Final Fantasy I & II (J) [o1] NES +5c86afaee19c4d564be583d19639af9e3308a6c6 B Final Fantasy I & II (J) [o1][T+Eng1.00_Demiforce] NES +704d46eb311a7d07268ea57de26cdacc3a83711a T Final Fantasy I & II (J) [T+Eng1.00_Demiforce,Grond] NES +ff5a216e3da57ee7133449a4ac6b0e8957a23595 T Final Fantasy I & II (J) [T+Eng1.00_Demiforce] NES ae373debd5a1d787eec28214c221fa4590c20844 U Final Fantasy II (J) (VC) NES 1a9e01a29472f1161bd16e1b4d76994346a505f6 G Final Fantasy II (J) [!] NES de129faa757050a925e5060f65bdc390d3978eb4 H Final Fantasy II (J) [hM02] NES @@ -6876,7 +6876,7 @@ ddc7b6b85ab0eaf26586d5a97aaa04c3620c2d1e H Final Fantasy II (J) [hM02][T-Eng1.0] 20079a629ff38fb2e76cf3a6e78c782588c890ef T Final Fantasy II (J) [T+Bra100%_Thirteen Traducoes] NES 90a5ccc3119aa91947f086c3c9fc069a7f80ef09 T Final Fantasy II (J) [T+Eng0.36_Toma,AlanMidas] NES 62ed16088e5293a9f238161c12fe59eaa196f1f8 T Final Fantasy II (J) [T+Eng1.03_Demiforce] NES -b7a849df213b59cd43066d15eeec4df983c0b5f5 T Final Fantasy II (J) [T+Eng1.03_Demiforce][f1] (Title & Weapon-Magic Exploit by Parasyte) NES +b7a849df213b59cd43066d15eeec4df983c0b5f5 T Final Fantasy II (J) [T+Eng1.03_Demiforce][f1] (Title & Weapon-Magic Exploit by Parasyte) NES de7fecb42947a24fbf632e2ccfccbdba69a857fb T Final Fantasy II (J) [T+Eng1.03_Demiforce][f1] (Title by Parasyte v1.0) NES 73f8436f78cec36f4d205a2dc5cc25fe949efc22 T Final Fantasy II (J) [T+Eng1.03PasoFami_Demiforce] NES 4e68ee5da3dbe2ed7348be072825364c87d2ab6a T Final Fantasy II (J) [T+Ita0.99a_Weapon Hunter] NES @@ -7085,7 +7085,7 @@ b7b3054034234ffaea975e4158f32f0f6bd12721 B Fire Emblem Gaiden (J) [T+Eng97b2_J2E de04536e3fa70d9dbccf62e0dc2e58bf02ac94f4 H Fire Emblem Gaiden by jibo818 (070502) (Hack) NES ead6701e3998cd7f81c8e8fccd1bb12a0bd90169 H Fire Emblem Gaiden by Lewis GT (070806) (Hack) NES d0c52c96c29dd6144215e63047b39972982894d1 H Fire Emblem Gaiden by scorpioywk v3.0a (Hack) NES -44b79228f44efc9acf9f878a08e8d8493c311ca7 H Fire Emblem Map & Enemy by One Talent (Hack) NES +44b79228f44efc9acf9f878a08e8d8493c311ca7 H Fire Emblem Map & Enemy by One Talent (Hack) NES 209f7ca3f4f9e179881aa9387dc6ad5dea4f4575 B Fire Emblem Two Dragon Edition (Hack) [b1] NES efa0e83b2bcb0f02fc81fc7b434ffe56209d3d67 H Fire Emblem Two Dragon Edition (Hack) NES 85438df235e84b38452282aa2f96624f31986b59 B Fire Flight Z (Formation Z Hack) [o1] NES @@ -7127,17 +7127,17 @@ c212375ac4a48de955e608af2ccc9cd36cc040fe T Fleet Commander (J) [T+Rus_Chief-Net] 18e4116d04aa688a8a8629f3b6770ec8436d2778 G Flight of the Intruder (U) [!] NES 425d371df518c142c9dfc9764e02ac53ada94d0e B Flight of the Intruder (U) [b1] NES b823ee04d31bdf6937ddfc3a1e81f2fa8ea3cf2f B Flight of the Intruder (U) [o1] NES -9695b227545fca9cd6c95abf348ff51b175634f6 G Flintstones, The - The Rescue of Dino & Hoppy (E) [!] NES -66b701bcf13ea261cf459058d141f078fc66652c C Flintstones, The - The Rescue of Dino & Hoppy (E) [t1] NES -9d1ba8a9cb5afe378bf4cdf94dee5eecd80ccf6b U Flintstones, The - The Rescue of Dino & Hoppy (J) NES -549de66388ff02e33a40bf7ef83e207f98a50888 G Flintstones, The - The Rescue of Dino & Hoppy (U) [!] NES -db9f7f37cac7a00752beffe5a14c295f1722823e B Flintstones, The - The Rescue of Dino & Hoppy (U) [b1] NES -c0a6a7cbf5de4451aed7f5f8fe6b67df97c4c11b B Flintstones, The - The Rescue of Dino & Hoppy (U) [b2] NES -18c335127d0338318ac04d43b6ee434623db761c B Flintstones, The - The Rescue of Dino & Hoppy (U) [o1] NES -805737b473814baeeaf98bdacd2de810dae5c8e5 G Flintstones, The - The Rescue of Dino & Hoppy (U) [p1][!] NES -ad651e65a9e7333a415f1071f0783a3f4ea53218 B Flintstones, The - The Rescue of Dino & Hoppy (U) [p2] NES -deb230107c87863a7226d4466470aa5b824d6d0c C Flintstones, The - The Rescue of Dino & Hoppy (U) [t1] NES -4c2199ab578faf2cb1f244e5a562ecc0918f27ca C Flintstones, The - The Rescue of Dino & Hoppy (U) [t2] NES +9695b227545fca9cd6c95abf348ff51b175634f6 G Flintstones, The - The Rescue of Dino & Hoppy (E) [!] NES +66b701bcf13ea261cf459058d141f078fc66652c C Flintstones, The - The Rescue of Dino & Hoppy (E) [t1] NES +9d1ba8a9cb5afe378bf4cdf94dee5eecd80ccf6b U Flintstones, The - The Rescue of Dino & Hoppy (J) NES +549de66388ff02e33a40bf7ef83e207f98a50888 G Flintstones, The - The Rescue of Dino & Hoppy (U) [!] NES +db9f7f37cac7a00752beffe5a14c295f1722823e B Flintstones, The - The Rescue of Dino & Hoppy (U) [b1] NES +c0a6a7cbf5de4451aed7f5f8fe6b67df97c4c11b B Flintstones, The - The Rescue of Dino & Hoppy (U) [b2] NES +18c335127d0338318ac04d43b6ee434623db761c B Flintstones, The - The Rescue of Dino & Hoppy (U) [o1] NES +805737b473814baeeaf98bdacd2de810dae5c8e5 G Flintstones, The - The Rescue of Dino & Hoppy (U) [p1][!] NES +ad651e65a9e7333a415f1071f0783a3f4ea53218 B Flintstones, The - The Rescue of Dino & Hoppy (U) [p2] NES +deb230107c87863a7226d4466470aa5b824d6d0c C Flintstones, The - The Rescue of Dino & Hoppy (U) [t1] NES +4c2199ab578faf2cb1f244e5a562ecc0918f27ca C Flintstones, The - The Rescue of Dino & Hoppy (U) [t2] NES 354415e5472c4cbf4978744c97a9a53c6b61cb49 G Flintstones, The - The Surprise at Dinosaur Peak! (E) [!] NES 5a6ae3e6897414758a8791783f3a482e5a2dd0fb G Flintstones, The - The Surprise at Dinosaur Peak! (U) [!] NES a3bdfaa4d67de0f1468d9fe701a8988e2e732744 B Flintstones, The - The Surprise at Dinosaur Peak! (U) [o1] NES @@ -7284,9 +7284,9 @@ ff9ba69080f51331a10df9c2f7531ab5a9a34e58 B Front Line (J) [T-Chi][b1] NES 2b257fa8049678600b4db8461b56bfceee1056aa H Front Line 2 Hardcore (Front Line Hack) NES a9966b9065b29defc48a2566136b634f74dd31e7 U FS Demo by KZ-S (PD) NES 3759f6d43be742defb5b52117e5378645332c816 H Fucked Up Bros 2 (SMB2 Hack) NES -0bc48f6ceee853de3535bb49227415e5d817ba0e H Fucked Up North & South (Hack) NES +0bc48f6ceee853de3535bb49227415e5d817ba0e H Fucked Up North & South (Hack) NES 794d30faa4ba81046405f3c6599b73c3a297b2ad H Fucker's Quest by Shitdic (Fester's Quest Hack) NES -b346af0a6ef44db9e251ed18a3925f8396868496 H Fudan Mario by DU-6&Hi (SMB1 Hack) NES +b346af0a6ef44db9e251ed18a3925f8396868496 H Fudan Mario by DU-6&Hi (SMB1 Hack) NES 1ae0646964ad522f78427d5f29401b197020a4df G Fudou Myouou Den (J) [!] NES 54f3061ca2ccc87342d44cec098a4c07d530d6ce B Fudou Myouou Den (J) [hFFE][b1] NES 056280af7a109617d1f0d21e228dcb9dbe394693 H Fudou Myouou Den (J) [hM80] NES @@ -7525,8 +7525,8 @@ c6954c8d5030bd3f446644e2a02b3135d3bbff93 B Garou Densetsu Special (Unl) [hM04][b fe0d1d3f7662bcba4c550440696d6fb24b3181a9 B Garou Densetsu Special (Unl) [hM04][b5] NES aec04b867e7de8dc7ace8563bd693b9199c4a33a H Garou Densetsu Special (Unl) [hM04][f1] NES de38a34367495ff5e899b574e15495f78a5e5678 U Garou Densetsu Special (Unl) NES -7f95489c35713f1befb5bfbfc6a51b523eaa1b50 T Gary's Nuts (J) (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -468e874670c5b8e7db979db02d5eb5d4bae256a4 H Gary's Nuts (J) (Nuts & Milk Hack) NES +7f95489c35713f1befb5bfbfc6a51b523eaa1b50 T Gary's Nuts (J) (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +468e874670c5b8e7db979db02d5eb5d4bae256a4 H Gary's Nuts (J) (Nuts & Milk Hack) NES b5a669ea96249a23ca3b868ac1c7555e611ee83b U Gauntlet (PC10) NES d3a2ad975e2e955e39fb3fd64e93ff983af81e0d G Gauntlet (Tengen) [!] NES debb19b46939a296bad008cffbb3bb0f8d6608d3 B Gauntlet (Tengen) [b1] NES @@ -7978,7 +7978,7 @@ bc39a2546b530fc84e90052d4077676da97ed679 T Grand Master (J) [T-Eng_Stardust Crus aa0fb9dd052ee687ff02ed2713ed92a3887e76f0 U Grand Master (J) NES 0f01b092ce5d02d5c6e3ea553290a06c8281ee24 U Grandia (Ch) (Wxn) NES 8bcdc14b93f52cd4a657c18fee21cdc4ed6298a1 H Graros (Seicross Hack) NES -f5d968639bb462819500cb33a3644487f177740b U Grave Digger by Tarnow, Hollis, Gillotti & Subramanian (PD) NES +f5d968639bb462819500cb33a3644487f177740b U Grave Digger by Tarnow, Hollis, Gillotti & Subramanian (PD) NES d0da677def74b64e1b2d25748e2bce691566c4b0 B Great Adventures of Weiny, The (Mario Bros Hack) [o1] NES b0b0a350e4360fb03cf536c961f2f4fa68f98dbf H Great Adventures of Weiny, The (Mario Bros Hack) NES a55e9323d89d855672dcb20dc29efd2f53ded972 G Great Battle Cyber (J) [!] NES @@ -8019,9 +8019,9 @@ e327e3e3814f0ea008d347eeee1b72e378abb857 B Gremlins 2 - The New Batch (U) [b1] N abc3dfd1cc1fab09eb5edb6223570a26f974c9e8 C Gremlins 2 - The New Batch (U) [t1] NES 34eea8840f666fca69d85f6dfa5fdf77a297b3b3 U Greys Demo by Chris Covell (PD) NES 3b3dea215ac51563b049f9f5a643bc1e5e88c8aa H Grond's Final Fantasy (FF1 Hack) NES -3d1098ccc2250e8e007170d2143112d61f348a31 H Grond's Final Fantasy Bugfix & Balancing (FF1 Hack) [a1] NES -076003fdac7b73059f8e45c9d9f8ae5a04af5c9c H Grond's Final Fantasy Bugfix & Balancing (FF1 Hack) NES -1e18667e99767f3ab6acf54b685986b230696722 H Grond's Final Fantasy Bugfix & Balancing (v1.1) (FF1 Hack) NES +3d1098ccc2250e8e007170d2143112d61f348a31 H Grond's Final Fantasy Bugfix & Balancing (FF1 Hack) [a1] NES +076003fdac7b73059f8e45c9d9f8ae5a04af5c9c H Grond's Final Fantasy Bugfix & Balancing (FF1 Hack) NES +1e18667e99767f3ab6acf54b685986b230696722 H Grond's Final Fantasy Bugfix & Balancing (v1.1) (FF1 Hack) NES 0828f94fedee148987ac3cfa4a270d26306bc6b0 U GSD Super Student Computer Cartridge (Ch) NES f8229677bfad4050a24bfb9a78521a6e36d3cac4 G Gu Ba Zhan Shi Xi Hua (Ch) [!] NES bd147f4eeafe37d73524a0d0a6735a422376e482 U Gu Ba Zhan Shi Xi Hua (Ch) [a1] NES @@ -8203,7 +8203,7 @@ e545041ff87271f56f975d73d7b772d37f06d2bb H Hanjuku Eiyuu (J) [hM02] NES 810a86d04016eeba01cdc826f80babb86619b8d7 H Hanjuku Eiyuu (J) [hM02][a1] NES e7305030fe0261de587b16c85a0acab9386bc858 B Hanjuku Eiyuu (J) [o1] NES 11777a01cdb2d242233742d4a302c1af51f759e4 H Hanjuku Eiyuu by fenglianxilin (070808) (Hack) NES -fbb406a103e79df26ac4ef208b7f9df16006ee44 H Hansel & Gretel (SMB1 Hack) NES +fbb406a103e79df26ac4ef208b7f9df16006ee44 H Hansel & Gretel (SMB1 Hack) NES 9be59e3c120046c2b9e68bb5f25d21f1b2dc8386 U Happy Angel Legend (Unl) NES 9a07441300f5f13898f777020fe8cb04361d3ca6 H Happy Birthday - BMF x 28 (SMB1 Hack) NES 65855650819327782bce279dbaea220090deeb6e G Happy Birthday Bugs (J) [!] NES @@ -9118,10 +9118,10 @@ af45f13c326ce6e8b5e29eb583faf5d9a74349b7 B Iron Tank - The Invasion of Normandy 3b4a5cb92fc0df0cb8e6fb4528a5414004005116 B Iron Tank - The Invasion of Normandy (U) [o2] NES f745f07efda10a0c685f693df47ed8b15b3aa458 C Iron Tank - The Invasion of Normandy (U) [t1] NES c8c011ab830e9aefd2c6335a40857fda48186356 C Iron Tank - The Invasion of Normandy (U) [t2] NES -bf7b26e28cecc6a46131971210bfb10123ab9dab G Ironsword - Wizards & Warriors II (E) [!] NES -97b79e432f62403fb9f877090850c41112a9a168 G Ironsword - Wizards & Warriors II (U) [!] NES -cdc3da09fdd4478b5c8f1640ea26604cdf096a62 B Ironsword - Wizards & Warriors II (U) [b1] NES -84f6af51c04d27e877480bc9136d4c0401bb2461 B Ironsword - Wizards & Warriors II (U) [o1] NES +bf7b26e28cecc6a46131971210bfb10123ab9dab G Ironsword - Wizards & Warriors II (E) [!] NES +97b79e432f62403fb9f877090850c41112a9a168 G Ironsword - Wizards & Warriors II (U) [!] NES +cdc3da09fdd4478b5c8f1640ea26604cdf096a62 B Ironsword - Wizards & Warriors II (U) [b1] NES +84f6af51c04d27e877480bc9136d4c0401bb2461 B Ironsword - Wizards & Warriors II (U) [o1] NES 5d9402702b33d226e822dd4a39b9004dcd90b787 U IRQ Flag Operation Test by Shay Green (30 Jun 2005) (PD) NES 7fbd5c094f63d8d0ad9cfb0730e809875bcdace6 U IRQ Flag Timing Test by Shay Green (30 Jun 2005) (PD) NES 5b87d2e908ae68348ccb306764ac7ec9067395e3 U IRQ Handler Test by Shay Green (30 Jun 2005) (PD) NES @@ -9390,15 +9390,15 @@ e54091563b9f39863a93f8c0260b3b5518628576 T JJ - Tobidase Daisakusen Part 2 (J) [ f19a702eefcb6467176916a6f612974dcba0fb19 T JJ - Tobidase Daisakusen Part 2 (J) [T+Rus] NES 6c2aee3bfe22bdbcab6f707720b3675c2d439c42 T JJ - Tobidase Daisakusen Part 2 (J) [T+Rus][t1] NES 90dd8e45ade16e684489d34343856b6a0b8dac26 C JJ - Tobidase Daisakusen Part 2 (J) [t1] NES -935a56567d1e8516c104ead5e9ecbc6d8e9b0a1f G Joe & Mac - Caveman Ninja (E) [!] NES -36bafdf6f8d531fecb3553c1923eeafac4a05c28 G Joe & Mac - Caveman Ninja (U) [!] NES -79a02ad09b776734e9e341d91137e989ea482f8e B Joe & Mac - Caveman Ninja (U) [b1] NES -6edbe6c00f8246a1f8c1a6fa543e9e2e83ea666e B Joe & Mac - Caveman Ninja (U) [o1] NES -e3b06ee583b47c55b5a1c9354482a27ad2cfbfde G Joe & Mac - Caveman Ninja (U) [p1][!] NES -bcf23b47befc698b9c8e1c2e1aa48529ac6ecf06 B Joe & Mac - Caveman Ninja (U) [p2] NES -ef454083c6720b6f0a541257eb9a41758f27746c B Joe & Mac - Caveman Ninja (U) [p3] NES -f8139f01b7c3ca2b14cefec784ae64781c8f956d C Joe & Mac - Caveman Ninja (U) [t1] (No Time) NES -9031b847c51320960655849c750f027b20d05a80 C Joe & Mac - Caveman Ninja (U) [t2] NES +935a56567d1e8516c104ead5e9ecbc6d8e9b0a1f G Joe & Mac - Caveman Ninja (E) [!] NES +36bafdf6f8d531fecb3553c1923eeafac4a05c28 G Joe & Mac - Caveman Ninja (U) [!] NES +79a02ad09b776734e9e341d91137e989ea482f8e B Joe & Mac - Caveman Ninja (U) [b1] NES +6edbe6c00f8246a1f8c1a6fa543e9e2e83ea666e B Joe & Mac - Caveman Ninja (U) [o1] NES +e3b06ee583b47c55b5a1c9354482a27ad2cfbfde G Joe & Mac - Caveman Ninja (U) [p1][!] NES +bcf23b47befc698b9c8e1c2e1aa48529ac6ecf06 B Joe & Mac - Caveman Ninja (U) [p2] NES +ef454083c6720b6f0a541257eb9a41758f27746c B Joe & Mac - Caveman Ninja (U) [p3] NES +f8139f01b7c3ca2b14cefec784ae64781c8f956d C Joe & Mac - Caveman Ninja (U) [t1] (No Time) NES +9031b847c51320960655849c750f027b20d05a80 C Joe & Mac - Caveman Ninja (U) [t2] NES 5e44cea620e33e3c7c04c67163b0a9c612939c47 G John Elway's Quarterback (U) [!] NES d0e8588498ff005c311492c221b3c67721b8d42d B John Elway's Quarterback (U) [o1] NES f67733b11991cc1c2301bf9d97df7c2b25a6bfdf B John Elway's Quarterback (U) [o2] NES @@ -9413,11 +9413,11 @@ e53a42ac93b757541e853695dd0c7ae50b437874 B Jongbou (J) [f1][o1] NES 1c07244a8b98dde1f4ecb176097ca6aacd8c785d B Jongbou (J) [f1][o3] NES ce8415b6a7585a752d1979ef87d4227591789e97 G Jordan Vs Bird - One On One (U) [!] NES 538668aaa59db38e072cd1f499dead9236bbe13f B Jordan Vs Bird - One On One (U) [o1] NES -011a7ce0c86929a5788a67ed49c5dc587c53f991 U Joshua & the Battle of Jericho (Wisdom Tree) (V5.0 CHR 6.0) NES -4d838a393823b2ab2fcca48b6cda6292f2992880 G Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [!] NES -4856a12ba4f01e0ca41bfa6c95039fc302a60724 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [b1] NES -e598d9753a823d39fda3cddc486a56ffb0ebee33 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [b2] NES -eb320ad334f8f26044eb1084b070003bafc4e7d1 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [o1] NES +011a7ce0c86929a5788a67ed49c5dc587c53f991 U Joshua & the Battle of Jericho (Wisdom Tree) (V5.0 CHR 6.0) NES +4d838a393823b2ab2fcca48b6cda6292f2992880 G Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [!] NES +4856a12ba4f01e0ca41bfa6c95039fc302a60724 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [b1] NES +e598d9753a823d39fda3cddc486a56ffb0ebee33 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [b2] NES +eb320ad334f8f26044eb1084b070003bafc4e7d1 B Joshua & the Battle of Jericho (Wisdom Tree) (V6.0) [o1] NES 85f64db051e8c173a18905066052d412a8eb1d6c G Journey to Silius (E) [!] NES 275244538589393b552b159ab1d380090c8e8996 G Journey to Silius (U) [!] NES 08c67ce185d2a4230d6c954bd90587192d2e34d2 B Journey to Silius (U) [b1] NES @@ -9990,10 +9990,10 @@ f324e7c8c3ad102ecdcca011ecc494f6f345d768 G Kirby's Adventure (U) (PRG1) [!] NES 455a81e5644317409d6047a7dccff56cb07cde89 H Kirby's Adventure 2 (SMB1 Hack) NES c6f778708182114b4f58093575cf51b5de9926b7 H Kirby's Adventure FUCKED (Hack) NES 15175dfe4b255b3ffc1003e7ffc3d87888fd3acc U Kirby's Dreamland 3 Title Screen Demake by Macbee v1.0 (PD) NES -c445072c3362fa3fb2cc481706d5b1b96b368798 B Kirby's Nuts (Nuts & Milk Hack) [o1] NES -67c1d833caa09444555711fdb32e7f16dfe61389 T Kirby's Nuts (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -d875bd8977d6486ac3c5c874d9d4f2cdcdc0841a T Kirby's Nuts by Kidwhatever (Nuts & Milk Hack) [T+Rus_Multisoft] NES -046d3a72942639a1a0c8a6eaa8c0a049051ea113 H Kirby's Nuts by Kidwhatever (Nuts & Milk Hack) NES +c445072c3362fa3fb2cc481706d5b1b96b368798 B Kirby's Nuts (Nuts & Milk Hack) [o1] NES +67c1d833caa09444555711fdb32e7f16dfe61389 T Kirby's Nuts (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +d875bd8977d6486ac3c5c874d9d4f2cdcdc0841a T Kirby's Nuts by Kidwhatever (Nuts & Milk Hack) [T+Rus_Multisoft] NES +046d3a72942639a1a0c8a6eaa8c0a049051ea113 H Kirby's Nuts by Kidwhatever (Nuts & Milk Hack) NES 576b13815dbcfdb621b2654ab14b30a8080a8a4a H Kiri5 Star (SMB1 Hack) [a1] NES 58f4d00498313f5179fd5749e9c15efeef0b5910 H Kiri5 Star (SMB1 Hack) NES 226da664994cee80f3af52fe98f77b92df291766 H Kiri7 (SMB1 Hack) NES @@ -10182,7 +10182,7 @@ b338354bf584e2abccb625d88f543d27d5d9e542 H Kunio-kun no Nekketsu Soccer League - 340c0dc4d29883152e31a79aa5477b851dbdfeb2 H Kunio-kun no Nekketsu Soccer League - Striker (Hack) NES d39199f9c1550add08c12d5a13bbb59fcb6b3b2c H Kunio-kun no Nekketsu Soccer League - Super Maltreatment Edition (Hack) NES 4f78b071b96bf1b2c5e8098bf1529b1b333e246d H Kunio-kun no Nekketsu Soccer League - Super Striker (Hack) NES -f407cdd3308b4dd5ab48c74db33a8879e880f588 H Kunio-kun no Nekketsu Soccer League - To Change Skill & Hit Keeper (Hack) NES +f407cdd3308b4dd5ab48c74db33a8879e880f588 H Kunio-kun no Nekketsu Soccer League - To Change Skill & Hit Keeper (Hack) NES 3ca8ef95f367374000aa14223b7c0fd746a7f584 H Kunio-kun no Nekketsu Soccer League - TT (Hack) NES d64b96f6171876119a5af8bf0ead7e879ed8770d H Kunio-kun no Nekketsu Soccer League - Twin Shot by altinfener38 (Hack) NES e45275579fd75471bd6c2f8ce8980c7bd6b907ab H Kunio-kun no Nekketsu Soccer League by oktucu (110806) (Hack) NES @@ -10272,7 +10272,7 @@ e6226a1bdf7c304438f4444df242f5ab5b4a1f67 B Lagrange Point (J) [b1][o1] NES ab6818c5e75516264d3a285ecbec5a4884683612 B Lagrange Point (J) [b1][t1] NES 65557407307ca0313775510120b9e8b09f08e860 C Lagrange Point (J) [t1] NES cc44c4f1b8f8075e428389cde3b2c3ee583942e2 U Lair's Secret (Unl) NES -bce119365efcbcab4bc03f7dc4f6dae5514ac172 H Lam by darkdata (Milk & Nuts Hack) NES +bce119365efcbcab4bc03f7dc4f6dae5514ac172 H Lam by darkdata (Milk & Nuts Hack) NES 6a0005e1bfd16f99cc79766e543dc624248d6cf8 U LAN Master bu shiru (PD) (2011-06-10) NES 81763892417f2b2a89bfbac83b240ef5da322369 U LAN Master by shiru (PD) NES 62fac07016d534852c9da61c060e8bd19ba5e6f0 G Laser Invasion (U) [!] NES @@ -10339,7 +10339,7 @@ a86fb55799df29a70132e35ba305dad820068022 T Legend of Kage, The (U) [T+Rus_Shedev f2755fe982e51a7f31a237aee03b91d364795629 H Legend of Prince Valiant, The (E) [hM04] NES 773fefddc1a15ab045bc0e23151bf5d157e98bc5 C Legend of Prince Valiant, The (E) [t1] NES 60bf4889b5b99b7441b91b4c9f4e8820bc4d0c7a U Legend of Robin Hood, The (U) (Prototype) NES -961e2890880a2185fd21ca25b6874c5d6ffcc6b8 H Legend of Sean, The (Master Chu & The Drunkard Hu Hack) NES +961e2890880a2185fd21ca25b6874c5d6ffcc6b8 H Legend of Sean, The (Master Chu & The Drunkard Hu Hack) NES ee3a7feabc22fa45256416681496626493b7a2e9 H Legend of Super Pikachu Bros 3 (SMB3 Hack) NES 2cc6cc45fa63f9354acd4f6b9d9deadfa88900c8 U Legend of the Black Shawarma Medley (Music Demo) by Snowbro (PD) NES 1d195beeb4b3edbf8d1d53df8f7b756ad77890cf H Legend of the Blob Bros. 2 V1.0 by BMF54123 (SMB2 Hack) NES @@ -10700,7 +10700,7 @@ e1308b338c2b75bb5674547312d445cadcafa40c U Luan Shi San Guo (Ch) NES 7ed2f88638929b7e81a93510e19560ce0f4decf5 H Luigi and the Christmas Quest (Final) (SMB1 Hack) NES f880b618845829fe41d313d7386bea4545a97246 H Luigi and the Christmas Quest (SMB1 Hack) [a1] NES fcd6b2a1d32aca07ff8a1caa4a7e7ab09f8f243d H Luigi and the Christmas Quest (SMB1 Hack) NES -8fc67b2f8613c711def655519a390b41f5614ce0 H Luigi and the New Quest (Level & Graphics Patch) (SMB1 Hack) NES +8fc67b2f8613c711def655519a390b41f5614ce0 H Luigi and the New Quest (Level & Graphics Patch) (SMB1 Hack) NES 76515328e14754247618e9aed6cac87a49a2e494 H Luigi and the New Quest (New Level Patch) (SMB1 Hack) NES 56bd3d597f4024ed558e34c5fa1e7dbee4c7f63d H Luigi and the New Quest (Partial Levels Patch) (SMB1 Hack) NES b38c3b1d8bddf46e382ebfc8b13248214ba081a8 H Luigi and the New Quest (SMB1 Hack) [a1] NES @@ -10751,10 +10751,10 @@ c8e128a54bf9aba9d9dd0f28a45f34e443ff0cdc T Lupin Sansei - Pandora no Isan (J) [T 1d1f04e0bed7113be71d78eedc4cbd2a92bad32e C Lupin Sansei - Pandora no Isan (J) [t1] NES 18d0afcb194f5a7eca06efac29473fa22a499014 C Lupin Sansei - Pandora no Isan (J) [t2] NES 96edd908d86043c856d189c3db7a95998771aae6 H M Mario (SMB1 Hack) NES -e0064546070f426da5fdc9d05a1affa74d955882 U M&M Heroes (Ch) (Wxn) NES -7bc4d849ea854df4ec39bc632d38ab888cfa30a0 H M&M Heroes (Unl) [f1] NES -f63e163ed15f5bd977c0132679cb5f5a7f23f45a T M&M Heroes (Unl) [T+Rus_FedX IV] NES -a7ab98cadb51b86837fc9a71e72619c0d27a9a9d U M&M Heroes (Unl) NES +e0064546070f426da5fdc9d05a1affa74d955882 U M&M Heroes (Ch) (Wxn) NES +7bc4d849ea854df4ec39bc632d38ab888cfa30a0 H M&M Heroes (Unl) [f1] NES +f63e163ed15f5bd977c0132679cb5f5a7f23f45a T M&M Heroes (Unl) [T+Rus_FedX IV] NES +a7ab98cadb51b86837fc9a71e72619c0d27a9a9d U M&M Heroes (Unl) NES 9f026896275121d4cfb8ac34bd9e0cba96372508 U M-Day (Ch) (Wxn) NES afac4a56c2cf511e3cf983e16890adbf2f896bfd G M.C Kids (U) (Prototype) [!] NES 0fabf7ee8ed5bdc855daa5b16c49efc4b94497ba G M.C Kids (U) [!] NES @@ -10778,7 +10778,7 @@ deade5ae2b4f0948763b7e77b6561dfed5fdc8ff B M.U.S.C.L.E. (U) [o3] NES 0579081f3d7c4b5b756351bff82fd42f9e1eb54e B M.U.S.C.L.E. (U) [o4] NES 0414719a4ad314926d8d9b9fc8461d7303501ba0 B M.U.S.C.L.E. (U) [o5] NES 4d7786106e6e550d993f20319428f27cae6ba998 U M82 Game Selectable Working Product Display (E) NES -a58de11d0f58995d642fc3d556b3b554c3cb6493 U Ma Bu Mi Zhen & Qu Wei Cheng Yu Wu (Ch) NES +a58de11d0f58995d642fc3d556b3b554c3cb6493 U Ma Bu Mi Zhen & Qu Wei Cheng Yu Wu (Ch) NES 6b1d4795428ca175d83abcf06b4d6def3d7b9e11 B Ma Li 12 (Yoshi no Cookie) [p1] NES 7c9daf77487a885367666c4f9dbc7714b0ce1439 B Ma Li 12 (Yoshi no Cookie) [p1][o1] NES 39fcdb90ab5fe745eeebef591127dae761b02e81 U Mac OS Demo (Large) by Chris Covell (PD) NES @@ -10994,9 +10994,9 @@ b8eabd4dfe1710ea8d74a990a2701ccda27d07d2 B Making Love (Battle City Hack) [o1] N 0792c8302caf2641f3644146500d669bd21ef0d1 T Making Love (Battle City Hack) [T+Rus_Cool-Spot][a1] NES 6efde8835d2f8c34875e24de8cdc353452d9f9b5 H Making Love (Battle City Hack) NES e5c0edeec0c4c45e4cfcf0ff0d48304ee90c215c H Male Lover Eon Man (Time Diver Eon Man Hack) NES -f76c5b3598b7869e57f438b861b6a198ef59a80e B Maluex (Nuts & Milk Hack) [o1] NES -544a5ed93d8ec8c34822f827126961377087e58d B Maluex (Nuts & Milk Hack) [o2] NES -4f26475c03365c125f9f9590bced09e3158f6a9a H Maluex (Nuts & Milk Hack) NES +f76c5b3598b7869e57f438b861b6a198ef59a80e B Maluex (Nuts & Milk Hack) [o1] NES +544a5ed93d8ec8c34822f827126961377087e58d B Maluex (Nuts & Milk Hack) [o2] NES +4f26475c03365c125f9f9590bced09e3158f6a9a H Maluex (Nuts & Milk Hack) NES 76edf6482110b1dcfebb2c57e00993ad80cc7878 U Mandelbrot (PD) NES 3764bbd627f1a6b5790712019e06efa3a011d4e4 U Manhole by KZ-S (PD) [a1] NES b01b5adc58b6b81cae093e3ad43ad6fc4065237a U Manhole by KZ-S (PD) NES @@ -11072,8 +11072,8 @@ fca0c2983073ae17f1034077b0769e64dc33e179 B Marble Madness (U) [o1] NES 14565b90be871acba746be154cdfc254c9c79193 H Maria's Golf (Golf Hack) NES 038103f080bd837c11b8e82d03a57909006e2d4f H Marilunker (Spelunker Hack) NES a86de28534e8d6b80a4e193a34073a6a58c30626 H Marilunker by Tsurumidou (Spelunker Hack) NES -9ca35258a3637b43c45ef7f17a75c7b32ea969a8 G Mario & Yoshi (E) [!] NES -5f69d6fe6299cd09e359f0db360495a40f8359fa H Mario + Toad (Nuts & Milk Hack) NES +9ca35258a3637b43c45ef7f17a75c7b32ea969a8 G Mario & Yoshi (E) [!] NES +5f69d6fe6299cd09e359f0db360495a40f8359fa H Mario + Toad (Nuts & Milk Hack) NES 0c2494b25620c81cf4a514ed9659429e59b4c6ef H Mario 1337 (SMB1 Hack) NES ff70fcbdf643b0c71cb2f8c170f315a4af755531 B Mario 16 (1993) (Unl) [b1] NES 3a6f026690bbf5f13b1066e5b100f783a6928c8b B Mario 16 (1993) (Unl) [o1] NES @@ -11096,8 +11096,8 @@ e972a5ee5b0f8f68a08106bce39ae1c82d34e1d2 H Mario a la Caza del Tesoro V1.0 Spani 69b006cd318393e610e77ee22fd29ee4f10f0fda H Mario Adventure Island (Takahashi Meijin no Bouken Shima Hack) NES 34edbd53301273a8a31f1fade92003bf197d2926 T Mario and Goombas by Cool-Spot (Mappy Hack) [T+Rus_Cool-Spot] NES bc2eafe7d8c3b63595ecb75f19760e4ab5634e56 H Mario and Goombas by Cool-Spot (Mappy Hack) NES -fdd6a65ea316ec531c0f96804bd02941add01b44 T Mario and Luigi (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES -01b81f8e7ba17db3298822035435cd0c1ab87de6 H Mario and Luigi (Nuts & Milk Hack) NES +fdd6a65ea316ec531c0f96804bd02941add01b44 T Mario and Luigi (Nuts & Milk Hack) [T+Rus_Cool-Spot] NES +01b81f8e7ba17db3298822035435cd0c1ab87de6 H Mario and Luigi (Nuts & Milk Hack) NES e9bd0d304d265fa5a25c47cfed2d847605d3de76 H Mario Bomb Jack (Mighty Bomb Jack Hack) NES ef30e7d464a79dd4482b0da82c41504f46e477d2 H Mario Bros in the Clouds (SMB1 Hack) NES 1bf3152946f6b697dd80aa9ba5b16bddab8ac0c2 G Mario Bros. (E) (PRG1) [!] NES @@ -11235,7 +11235,7 @@ c90404b3c08265dfbc0677e7eb8a91eda8cf9a19 H Mario Runner by Y.Project (Championsh 441f1355cc8d159de0f82bd5471b5e25efac9448 H Mario Satanic Freak Bros 2 (SMB2 Hack) NES 35cc22c2861cb67e3feee8bb10bcc22bf1c611e3 H Mario Spy vs Spy (Spy vs Spy Hack) NES 38550a3ca3fc7f3263b26758ed37a9e3ba7e87fe B Mario Tails (SMB1 Hack) [b1] NES -fcd488c8f40e2956b1030d2b0e9ca4565694a5be H Mario Tank & Sub (SMB1 Hack) NES +fcd488c8f40e2956b1030d2b0e9ca4565694a5be H Mario Tank & Sub (SMB1 Hack) NES 764d9f6c2d2f9130c8de46fe9a0a408d3e96b13e H Mario Tokes A Doobie (SMB1 Hack) NES 2b5135b41e78505abf5489a2ab52faefee4a65fa H Mario Tower (SMB1 Hack) NES 48b8f691f3d73d8d2aa35c2f1e9c869c97d8b97b H Mario vs Monkey by Hax0r Kyo (Mario Bros Hack) NES @@ -11310,11 +11310,11 @@ a2b6008b8c2a65cd6e2312614505c463e1f4615f B Mashou (J) [hM02][b1] NES 1f1b2f43de9c29e41a9514a6019978529a9bfac8 C Mashou (J) [t1] NES 1d9757ab82c6e1095bc88765e3ff012d0ad7375a U Masmix v0.06, The by Wojciech Andralojc (PD) NES 2a493dcfeeb0d7f928cb8862b8e8be295ed3c685 U Master Chess (Ch) (Wxn) NES -62918362f30e4840ed4e7719339520cfefc92a2a G Master Chu & The Drunkard Hu (Color Dreams) [!] NES -569065844ea9f5c29fb80becef94190358dc9fe3 B Master Chu & The Drunkard Hu (Color Dreams) [o1] NES -de04b54e6bb4bcfc3cb8a40669cf52499c51ff89 U Master Chu & The Drunkard Hu (Joy Van) NES -9c98deede6eaa1c352d75c9cd8d1ca67ba16f77a G Master Chu & The Drunkard Hu (Sachen) [!] NES -08a2fbefe2e5543b9ef3e8342009456d67500884 G Master Chu & The Drunkard Hu (Sachen) [U][!].unf NES +62918362f30e4840ed4e7719339520cfefc92a2a G Master Chu & The Drunkard Hu (Color Dreams) [!] NES +569065844ea9f5c29fb80becef94190358dc9fe3 B Master Chu & The Drunkard Hu (Color Dreams) [o1] NES +de04b54e6bb4bcfc3cb8a40669cf52499c51ff89 U Master Chu & The Drunkard Hu (Joy Van) NES +9c98deede6eaa1c352d75c9cd8d1ca67ba16f77a G Master Chu & The Drunkard Hu (Sachen) [!] NES +08a2fbefe2e5543b9ef3e8342009456d67500884 G Master Chu & The Drunkard Hu (Sachen) [U][!].unf NES 00e58c05c1ddc011418b762e203283ba61510549 U Master Fighter 3 (Unl) [a1] NES 0aeb922bd4bfe12fde656729e0ee0058276b7a95 U Master Fighter 3 (Unl) NES 89ec66a8c33722a5bd1120bc69393b237e72de03 G Master Fighter II (Unl) (UT1374 PCB) [!] NES @@ -11785,11 +11785,11 @@ b64e5757c43c4270c7ec4656823b3dd7f506a31c U Metal Max (J) (VC) NES 9a9401b7e009d560978053035ba854484258453f H Metal Max - Shining Strengthened Edition (Hack) NES f0ded676241e773791a3209281b6290ca6c2a115 H Metal Max by ZTOUYIA (090214) (Hack) NES 7af64b80c8857dba498a520298ab438b92a27a0d H Metal Max Night Edition by MISAKA KEN (Hack) NES -491f6a151cb43c794f1e0984e3645e946b5f5600 G Metal Mech - Man & Machine (U) [!] NES -c46b547aaa2295d6e6daa978b971a47a1ea12906 B Metal Mech - Man & Machine (U) [b1] NES -b5806e8504f79d790fc67bc31e6d2ccca2990011 B Metal Mech - Man & Machine (U) [o1] NES -3e06e7b5db6da401ec312ab490b7069e8624a62f B Metal Mech - Man & Machine (U) [o2] NES -079f970b54f70e2144b5c9f197331f08a46b9aa2 B Metal Mech - Man & Machine (U) [o3] NES +491f6a151cb43c794f1e0984e3645e946b5f5600 G Metal Mech - Man & Machine (U) [!] NES +c46b547aaa2295d6e6daa978b971a47a1ea12906 B Metal Mech - Man & Machine (U) [b1] NES +b5806e8504f79d790fc67bc31e6d2ccca2990011 B Metal Mech - Man & Machine (U) [o1] NES +3e06e7b5db6da401ec312ab490b7069e8624a62f B Metal Mech - Man & Machine (U) [o2] NES +079f970b54f70e2144b5c9f197331f08a46b9aa2 B Metal Mech - Man & Machine (U) [o3] NES 5aa98fc076e38002f08bfb3130cca0fbbe03058f U Metal Slader Glory (J) (VC) NES a62908e4873cf88f4a3c571c2b06d3d7c51e7450 G Metal Slader Glory (J) [!] NES c62cc944e7cfac05ac9b99170dadfe1d8b5a3965 B Metal Slader Glory (J) [b1] NES @@ -11828,7 +11828,7 @@ b0e1e0cd36b40aab2f9fecf057098abdad718cd3 T Metroid (U) [T+Fre_Terminus] NES 6170e1db74b46a77ad701c0ec87bd129adccd037 T Metroid (U) [T+Spa050_PaladinKnights] NES 574117fa7c66279a1373e25d792a40f45286fce2 T Metroid (U) [T+Spa100b_ereza] NES 0d589c18ee0e59b7c7d17d7b6a698dcd968eb56e T Metroid (U) [T+Swe1.0_TheTranslator] NES -180d37be77a6bcbb5a572364ab214defe84ca0b8 H Metroid - Unused GFX Tiles & 99 Energy Units by Grond (Metroid Hack) NES +180d37be77a6bcbb5a572364ab214defe84ca0b8 H Metroid - Unused GFX Tiles & 99 Energy Units by Grond (Metroid Hack) NES e7980c189177ab863b254a2a7a9683440557e3c0 H Metroid - Wart's Invasion (Metroid Hack) NES fe72d83deeb11b4579f7b07fb2e231137af396f0 H Metroid - Zebian Illusion (Metroid Hack) NES 0be24e45e1ef766d67701aae299e1315c66e0979 H Metroid 2000 (Metroid Hack) NES @@ -11994,7 +11994,7 @@ b47d159f82fe0ec2b458ead44337255f387f5179 C Mighty Final Fight (U) [t1] NES 855f819f6745c64532be84cb771dcda43bed5abc C Mighty Final Fight (U) [t4] NES c54abb5f91ff22e164510adb94be037661ffe0ee C Mighty Final Fight (U) [t5] NES b63f9117a0d864ecf028c79cf0b759d02ca12dc7 H Mighty Final Fight - Rock (Hack) NES -da6b671f63e0884a06edc4ffab18e80ef3815e5c H Mighty Final Fight - Skill & Enemies Changed (Hack) NES +da6b671f63e0884a06edc4ffab18e80ef3815e5c H Mighty Final Fight - Skill & Enemies Changed (Hack) NES 706a4d92a6f892f50768216222deb0943cf1c8fb H Mikamari 1 (SMB1 Hack) NES 291ecdfa63678f47489874c3b68bdbfe47a8651c H Mikamari 2 (SMB1 Hack) NES 4eaa8f7c55b779ffd5310062d0f6012b77fcb0d2 H Mikamari 3 (SMB1 Hack) NES @@ -12469,7 +12469,7 @@ e9ebfd1a44a8b62ab774e421770f0caee34c34d4 U Mr Brownstone by Snowbro (PD) NES 363c095b7d6b0b035365d55bbcd822c911adecf2 H Mr. Happyface (Ms. Pac-Man Hack) [a1] NES 141991d10b5c2424d44bc2e8dfd62cd528e710ae H Mr. Happyface (Ms. Pac-Man Hack) NES b5bf9531fe5900dc946e92114f7983088bfe232f H Mr. Men (Dig Dug II Hack) NES -141f8ddc64afb5f28a51b7265268ef76c1f11f4a H Mr. Pac-Man by Dave Augusta & Googie (v1.0) (Ms. Pac-Man Hack) NES +141f8ddc64afb5f28a51b7265268ef76c1f11f4a H Mr. Pac-Man by Dave Augusta & Googie (v1.0) (Ms. Pac-Man Hack) NES 7893f168fd56adad3546b5db267b286ff659a349 H Mr. Sandman! by The Eadernator (SMB1 Hack) NES 697d523d2db7f1ebdcf91bf501422c6a033fbd44 B Mr. Saturn's Dragon Quest v1.21 (Dragon Warrior PRG0 Hack) [o1] NES 93c5f1cb016f46ba5e1033997a8cd8bfdfa43e89 H Mr. Saturn's Dragon Quest v1.21 (Dragon Warrior PRG0 Hack) NES @@ -12682,7 +12682,7 @@ cecd61c0a2321d44500bee546e04e382259b93f7 T Nekketsu! Street Basket - Ganbare Dun 13e673bd83bff5923729e259c42fed0995d989be T Nekketsu! Street Basket - Ganbare Dunk Heroes (J) [T-Eng.50] NES 7e129fa870424cbc23f274f373ae0e389c7d127f U Nekketsu! Street Basket - Ganbare Dunk Heroes (J) NES ffd1705e5919b87d5a26d49a8f48d35d57497796 H Nekketsu! Street Basket - Ganbare Dunk Heroes - Spirit Edition (Hack) NES -f5f295588ef93bb1ac44d16df184ac67ab678167 H Nekketsu! Street Basket - Ganbare Dunk Heroes by AXI&AHE (v0.9) (Hack) NES +f5f295588ef93bb1ac44d16df184ac67ab678167 H Nekketsu! Street Basket - Ganbare Dunk Heroes by AXI&AHE (v0.9) (Hack) NES 6a50ac4d84116cd39b57531a44f6509ef151829a H Nekketsu! Street Basket - Ganbare Dunk Heroes by D.S.ghtMaster+KRIZAL (Hack) NES fbfa57623728465fd3c2582c8fc5930430502da9 H Nekketsu! Street Basket - Ganbare Dunk Heroes by PU (100426) (Hack) NES fb0a992bc148de44d82277b5cf4e3aba40ad6e38 G Nemo - Pajama Hero (J) [!] NES @@ -13233,20 +13233,20 @@ ca1f630cfcf80e817e6e395b5bd52497f1604e63 B Nobunaga's Ambition 2 (U) [o1] NES a8fd3c5c20777b94d1204145104f72a93f83d225 U Nomolos - Storming the Catsle Demo (PD) NES 9c5d4c2654998e874b3eda5e3f0af8b5e353575e U Nong Chang Xiao Jing Ling (NJ025) (Ch) NES 4e48b65b60f94a054b865f9e1cb3fd47cf9b4949 H Normal (Lolo1 Hack) NES -766a602e239895343819c2980ecd296da14613e1 G North & South (E) [!] NES -3c1f1f3ba8ce62899c2153116c3bd73ae058e554 T North & South (E) [T+FreFinal_Generation IX] NES -023b6b9ac517453541324e3cca279588b94d5016 G North & South (J) [!] NES -2a7f6052219e8ed69f307b8eb3d724fdded74ae1 G North & South (U) [!] NES -da1d5fb3d856cee918a57e510a93d32e33af2843 B North & South (U) [b1] NES -f2f1257a99f9fe3788851e62577798b7cb400cfb B North & South (U) [b1][o1] NES -58346ef19200fce9be100cc21284f31b6a1dad61 B North & South (U) [b1][o2] NES -2342eec6311f597ea24bf418a9ff26030b5edd43 B North & South (U) [b2] NES -7df0cc39d279659e4df9319aa74e24152a4db884 B North & South (U) [b3] NES -2a08ba115a2ee1b6a7f07829bde5049dde11ec6c B North & South (U) [b4] NES -7dee9233fc66d18c92ac477965ba3f15892bda78 B North & South (U) [b5] NES -f7ab568fd4b65dfcc89aeba81e7b127740967700 B North & South (U) [b6] NES -1a38e957fc2953c987ea4f129f17edc6adc133f6 B North & South (U) [b7] NES -53cbaf5517f6aba9a5eeba311ddfa03680898ac0 T North & South (U) [T+Swe1.0_TheTranslator] NES +766a602e239895343819c2980ecd296da14613e1 G North & South (E) [!] NES +3c1f1f3ba8ce62899c2153116c3bd73ae058e554 T North & South (E) [T+FreFinal_Generation IX] NES +023b6b9ac517453541324e3cca279588b94d5016 G North & South (J) [!] NES +2a7f6052219e8ed69f307b8eb3d724fdded74ae1 G North & South (U) [!] NES +da1d5fb3d856cee918a57e510a93d32e33af2843 B North & South (U) [b1] NES +f2f1257a99f9fe3788851e62577798b7cb400cfb B North & South (U) [b1][o1] NES +58346ef19200fce9be100cc21284f31b6a1dad61 B North & South (U) [b1][o2] NES +2342eec6311f597ea24bf418a9ff26030b5edd43 B North & South (U) [b2] NES +7df0cc39d279659e4df9319aa74e24152a4db884 B North & South (U) [b3] NES +2a08ba115a2ee1b6a7f07829bde5049dde11ec6c B North & South (U) [b4] NES +7dee9233fc66d18c92ac477965ba3f15892bda78 B North & South (U) [b5] NES +f7ab568fd4b65dfcc89aeba81e7b127740967700 B North & South (U) [b6] NES +1a38e957fc2953c987ea4f129f17edc6adc133f6 B North & South (U) [b7] NES +53cbaf5517f6aba9a5eeba311ddfa03680898ac0 T North & South (U) [T+Swe1.0_TheTranslator] NES f25301c5586eaf0bd53f95cbf264a0e4207731e2 U Nothing Demo (PD) NES 7b3ff58b8684313b775fcffcdd24347060be5d38 G Novel Diamond 999999-in-1 [U][p1][!].unf NES 077c8e387d2c605e4a1fb3b7a3b8e743feaffc64 U NROM Template 0.01 by Damian Yerrick (2011) (PD) NES @@ -13278,28 +13278,28 @@ f67c0b6e6386ab3672759b7e1edbca7cfeecf4d5 H Nude Punch Out (Punch-Out!! Hack) NES 9072be68ee2eaa942c474a7eba228640d7693ba9 U Nuevo Tipo de Computadora (Game Star) NES 44b74d6a242b6446fa5a937884fb5a01da15a1cb U Nullsleep - Kuribos Requiem (PD) NES 15bb5ad31ef26025bb744e53e238f9880c90b9bd U NumberGuess by Vincent van der Leun (PD) NES -cca97fba72ca56809dd216618f5962eb6ea2f1aa G Nuts & Milk (J) [!] NES -38ad30d95aaa4376b282f98efd89df92846bb940 B Nuts & Milk (J) [o1] NES -50ce8cec6085dd639292ae274bb5e913c9e1fc24 B Nuts & Milk (J) [o2] NES -73b1aeb8c794ae7c1f662411c34d7ff11b362369 B Nuts & Milk (J) [p1] NES -c01df7f32a0724e2258786a114f948e5d5ec7963 B Nuts & Milk (J) [p1][o1] NES -e5a0ad38498935f360997c0925b539014618aa8a T Nuts & Milk (J) [T+Bra_JM-trad] NES -8a5022c666bab63216563f76ca202125af6cb0ba T Nuts & Milk (J) [T+Chi_MS emumax] NES -f8c39e1b575a1ff6775329bbca4b723059b42ed0 T Nuts & Milk (J) [T+FreFinal_ks151] NES -7b84df69272bc4e29327c037ffd2d3d129df39be T Nuts & Milk (J) [T+Rus_CARI] NES -4a7726cbad59730bf05715e6549ddd0616637a1b T Nuts & Milk (J) [T+Rus_Cool-Spot] NES -4929bc380983b6b5cd0602c45b1964381e8ac170 T Nuts & Milk (J) [T+Rus_Mario Soft] NES -bcff20a94a6d026ac3d061e90599a1c881ef0a1c T Nuts & Milk (J) [T+Rus_Multisoft] NES -5a93e79325dd52cceb312ad84ced5b0c055cd9b6 T Nuts & Milk (J) [T-Chi_MS emumax] NES -5cccfd9cd3b6ab918003e46c8faf210255d5736a T Nuts & Milk (J) [T-Chi_MS emumax][a1] NES -b3d5d4f11b7d68d82c8ca5240f8239f930b1c688 T Nuts & Milk (J) [T-Chi_MS emumax][a2] NES -e878b5c62b83cc13acf466480bc037c5d99b77e7 T Nuts & Milk (J) [t1][T+Rus_Cool-Spot] NES -9a229b126f0573659448bba903a13048dd21c99a C Nuts & Milk (J) [t2] (9 Lives) NES -d8289a152855628af82aafefe5e3e9ed765d6523 C Nuts & Milk (J) [t3] (50 Lives) NES -573df023388af04977b8ffd787987e66ea16efc6 C Nuts & Milk (J) [t4] (100 Lives) NES -0b00c2eef9ed256599f9584b0ba366f838065fec B Nuts & Milk by PE (Hack) [o1] NES -bcff4b0d1d7dfea58018434e6a9aca29568a7844 T Nuts & Milk by PE (Hack) [T+Rus_Cool-Spot] NES -8cdde663a326c50ab9d8cb434628dcd5490f3797 H Nuts & Milk by PE (Hack) NES +cca97fba72ca56809dd216618f5962eb6ea2f1aa G Nuts & Milk (J) [!] NES +38ad30d95aaa4376b282f98efd89df92846bb940 B Nuts & Milk (J) [o1] NES +50ce8cec6085dd639292ae274bb5e913c9e1fc24 B Nuts & Milk (J) [o2] NES +73b1aeb8c794ae7c1f662411c34d7ff11b362369 B Nuts & Milk (J) [p1] NES +c01df7f32a0724e2258786a114f948e5d5ec7963 B Nuts & Milk (J) [p1][o1] NES +e5a0ad38498935f360997c0925b539014618aa8a T Nuts & Milk (J) [T+Bra_JM-trad] NES +8a5022c666bab63216563f76ca202125af6cb0ba T Nuts & Milk (J) [T+Chi_MS emumax] NES +f8c39e1b575a1ff6775329bbca4b723059b42ed0 T Nuts & Milk (J) [T+FreFinal_ks151] NES +7b84df69272bc4e29327c037ffd2d3d129df39be T Nuts & Milk (J) [T+Rus_CARI] NES +4a7726cbad59730bf05715e6549ddd0616637a1b T Nuts & Milk (J) [T+Rus_Cool-Spot] NES +4929bc380983b6b5cd0602c45b1964381e8ac170 T Nuts & Milk (J) [T+Rus_Mario Soft] NES +bcff20a94a6d026ac3d061e90599a1c881ef0a1c T Nuts & Milk (J) [T+Rus_Multisoft] NES +5a93e79325dd52cceb312ad84ced5b0c055cd9b6 T Nuts & Milk (J) [T-Chi_MS emumax] NES +5cccfd9cd3b6ab918003e46c8faf210255d5736a T Nuts & Milk (J) [T-Chi_MS emumax][a1] NES +b3d5d4f11b7d68d82c8ca5240f8239f930b1c688 T Nuts & Milk (J) [T-Chi_MS emumax][a2] NES +e878b5c62b83cc13acf466480bc037c5d99b77e7 T Nuts & Milk (J) [t1][T+Rus_Cool-Spot] NES +9a229b126f0573659448bba903a13048dd21c99a C Nuts & Milk (J) [t2] (9 Lives) NES +d8289a152855628af82aafefe5e3e9ed765d6523 C Nuts & Milk (J) [t3] (50 Lives) NES +573df023388af04977b8ffd787987e66ea16efc6 C Nuts & Milk (J) [t4] (100 Lives) NES +0b00c2eef9ed256599f9584b0ba366f838065fec B Nuts & Milk by PE (Hack) [o1] NES +bcff4b0d1d7dfea58018434e6a9aca29568a7844 T Nuts & Milk by PE (Hack) [T+Rus_Cool-Spot] NES +8cdde663a326c50ab9d8cb434628dcd5490f3797 H Nuts & Milk by PE (Hack) NES 4381f42f7b69e00e4d44ba643331f0b8d4d6af12 U Nyancat V1 by DerekB (PD) NES 486b47656c93db07fae5a8749278414531efb6ce U Nyancat V2 by DerekB (PD) NES ab7e39224ff304c4619329c026cf9c079002921e H Oaty Invaders by Pope Hentai (Space Invaders Hack) NES @@ -14127,14 +14127,14 @@ fad06695ceb4520547470a3df1a7b5c561d056ca U Pattern Table Pixel-Flickering Demo F f052c4486726c3abac420bd6f411fbecd551d4ab H PCGC Tank Chinese (Battle City Hack) NES c1df3c306ed45974b45c4832f72e93382f38a0e8 U PCM Demo (PD) [a1] NES 72f4b89acfb66e7abeafc894507b8c8b8f3d4225 U PCM Demo (PD) NES -9d75e5dcaa20e302b0820331d0995d1cb9b4c50d H Peach & Daisy - The Royal Quest (Alpha) (SMB1 Hack) [a1] NES -83e35177b4c0cbcb92d6ab975a2d876964eba303 H Peach & Daisy - The Royal Quest (Alpha) (SMB1 Hack) NES -84701b4567b09170bdb5dd7eb0a0fd54afa64a50 H Peach & Daisy and The Royal Games (SMB1 Hack) NES -8559c0dc7d22d61b77306d0f270e0bb3e27ca620 H Peach & Daisy and The Royal Games with Hacked Music (SMB1 Hack) NES -2488999a27d64decba8545ad41b6884cf8b02fac H Peach & Daisy in The Ultimate Quest (SMB3 PRG0 Hack) NES -91ffa269fa5ffb549e9a12cc14bf7574b95b2226 H Peach & Daisy in The Ultimate Quest (SMB3 PRG1 Hack) [a1] NES -6ac4ce8f754326ce7d6e1bc33f90528eeebd82cd H Peach & Daisy in The Ultimate Quest (SMB3 PRG1 Hack) NES -1218041ff94ed80d91b5b83f760bd78645791233 H Peach & Daisy in The Ultimate Quest V2b (SMB3 PRG1 Hack) NES +9d75e5dcaa20e302b0820331d0995d1cb9b4c50d H Peach & Daisy - The Royal Quest (Alpha) (SMB1 Hack) [a1] NES +83e35177b4c0cbcb92d6ab975a2d876964eba303 H Peach & Daisy - The Royal Quest (Alpha) (SMB1 Hack) NES +84701b4567b09170bdb5dd7eb0a0fd54afa64a50 H Peach & Daisy and The Royal Games (SMB1 Hack) NES +8559c0dc7d22d61b77306d0f270e0bb3e27ca620 H Peach & Daisy and The Royal Games with Hacked Music (SMB1 Hack) NES +2488999a27d64decba8545ad41b6884cf8b02fac H Peach & Daisy in The Ultimate Quest (SMB3 PRG0 Hack) NES +91ffa269fa5ffb549e9a12cc14bf7574b95b2226 H Peach & Daisy in The Ultimate Quest (SMB3 PRG1 Hack) [a1] NES +6ac4ce8f754326ce7d6e1bc33f90528eeebd82cd H Peach & Daisy in The Ultimate Quest (SMB3 PRG1 Hack) NES +1218041ff94ed80d91b5b83f760bd78645791233 H Peach & Daisy in The Ultimate Quest V2b (SMB3 PRG1 Hack) NES a3714d4067896c3eafdc820fb75d72b2e9a44600 H Peach's Nightmare - No Mercy (Beta) (SMB1 Hack) NES 9485ea0fca9c569c50b12c1bbdaf58d188ebca3f H Peach's Nightmare - No Mercy (SMB1 Hack) NES c2f75c845b3ed54285153bf66cfa649ff9525931 H Peachy Mario by Mana (SMB1 Hack) NES @@ -14151,12 +14151,12 @@ f8d094394bb036ffb0d7f4c6572c876d481eaaec U Pegasus 5-in-1 (Golden Five) (Unl) NE 8bb6485cafa110f01e60da35ce5d537b886c5cc3 U Pegs by Sly Dog Studios (PD) NES 4d3d00d774ee6153d55878112c3aeeb48189b819 U Penalty Kick (Ch) (Wxn) NES cee202c3fbcc89608d6e333bdc290bd6224cc53e H Pencilvania (CV Hack) NES -f828bba945c4291586c9843a7bcff4400125cc88 U Penguin & Seal, The (Dung Dung No 1) (Sachen) (Ch) NES -eac74d9de2001baa8fa76e740f9866d612612e33 G Penguin & Seal, The (Sachen-HES) [!] NES -dab87920067b13c1252b47673ff078c882651ed0 B Penguin & Seal, The (Sachen-HES) [o1] NES -41994a3c8f15bfbba09fe48ce2f98b9691fbfd7b G Penguin & Seal, The (Sachen-HES) [U][!].unf NES +f828bba945c4291586c9843a7bcff4400125cc88 U Penguin & Seal, The (Dung Dung No 1) (Sachen) (Ch) NES +eac74d9de2001baa8fa76e740f9866d612612e33 G Penguin & Seal, The (Sachen-HES) [!] NES +dab87920067b13c1252b47673ff078c882651ed0 B Penguin & Seal, The (Sachen-HES) [o1] NES +41994a3c8f15bfbba09fe48ce2f98b9691fbfd7b G Penguin & Seal, The (Sachen-HES) [U][!].unf NES 74a1ae73ec743bc20f9959c3f4434b8c2a9b3cd5 U Penguin (Ch) (Wxn) NES -84e0889f31db8949d9e4281a6dc84350d5caef19 H Penguin (Nuts & Milk Hack) NES +84e0889f31db8949d9e4281a6dc84350d5caef19 H Penguin (Nuts & Milk Hack) NES 8226578f38034a45a2023d7340115149ed2d96bf H Penguin Shoot (Battle City Hack) NES 19f3aa482f2ed6f46d81fcb55960c9e56c039cf2 B Penguin-kun Wars (J) [b1] NES f04547d268c367e4bf42c47b2c15a7fa41a60ee7 B Penguin-kun Wars (J) [p1] NES @@ -14178,15 +14178,15 @@ ed96ab727ba734cda8f619ff171f5eeaf100c0f1 B Perfect Bowling (J) [o1] NES e2798f1b0f34fb4177b032ad37c6117632a2b8f7 G Pesterminator - The Western Exterminator (Color Dreams) [!] NES 6427975ec1a6c8eb2b44fbd23727ca4673dee6f1 B Pesterminator - The Western Exterminator (Color Dreams) [o1] NES ec5b7cea33ded1afa919a8e2d975ba25e7cb2d8e U Pet 4-in-1 (Unl) NES -faf1e63eaf03dba975d9f40cccbe446a71386ab2 G Peter Pan & The Pirates (U) [!] NES -bcf8aca930e0edfe72da7e836f121cce7ecfb0cd B Peter Pan & The Pirates (U) [b1] NES -0f71b02b1828d6fa3cf477b304e2e49c90333a40 B Peter Pan & The Pirates (U) [b2] NES -6f633431bcb0ec6a5d2883ea742c4281f6fe7351 B Peter Pan & The Pirates (U) [b3] NES -4596be40277f40d4c8c7546a25a08f912dbf7645 B Peter Pan & The Pirates (U) [o1] NES -acc8e6a5efee672e34b11ad2d699ba2adbe91770 B Peter Pan & The Pirates (U) [o2] NES -c51d1b51e599b5cf5743458ec7248c7653b461c2 B Peter Pan & The Pirates (U) [o3] NES -4eac15442ca9bc0ba7591e219e5d24176df1fa57 B Peter Pan & The Pirates (U) [o4] NES -93b0e1be6669692c19d51d35d4b8a31bdbf90573 C Peter Pan & The Pirates (U) [t1] NES +faf1e63eaf03dba975d9f40cccbe446a71386ab2 G Peter Pan & The Pirates (U) [!] NES +bcf8aca930e0edfe72da7e836f121cce7ecfb0cd B Peter Pan & The Pirates (U) [b1] NES +0f71b02b1828d6fa3cf477b304e2e49c90333a40 B Peter Pan & The Pirates (U) [b2] NES +6f633431bcb0ec6a5d2883ea742c4281f6fe7351 B Peter Pan & The Pirates (U) [b3] NES +4596be40277f40d4c8c7546a25a08f912dbf7645 B Peter Pan & The Pirates (U) [o1] NES +acc8e6a5efee672e34b11ad2d699ba2adbe91770 B Peter Pan & The Pirates (U) [o2] NES +c51d1b51e599b5cf5743458ec7248c7653b461c2 B Peter Pan & The Pirates (U) [o3] NES +4eac15442ca9bc0ba7591e219e5d24176df1fa57 B Peter Pan & The Pirates (U) [o4] NES +93b0e1be6669692c19d51d35d4b8a31bdbf90573 C Peter Pan & The Pirates (U) [t1] NES 1c6ebffde98f4afaba4032d68a6d2713d7ce6c01 H Phantasy Star The Hopeless (Air Fortress Hack) NES de763651d0d6ab670935b86f412e24d853f4a6d1 G Phantom Air Mission (E) [!] NES 373b6c4721e73142ea77be78439e741d6f86ad29 G Phantom Fighter (U) [!] NES @@ -14609,7 +14609,7 @@ e5c46255f9723358115d9a15142a1d2ed8e2123f U Powerpak Boot Loader V1.10 (PD) NES 99155590ec76d5541aff7e49ed3f998517130ac2 U Powerpak Boot Loader V1.11 (PD) NES 949f5a882611b0dd79333c5ba338e587d9fc986e U Powerpak NSF V1.20 (PD) NES 2e360a03a7b1e38dca4bf8d1153549b42a15bbf4 U Powerpak NSF V1.34 (PD) NES -9e470702ad1466d62245453dc8c6bb50b92c30c2 U PPU Palette RAM Access & Mirroring Test by Shay Green (15 Sep 2005) (PD) NES +9e470702ad1466d62245453dc8c6bb50b92c30c2 U PPU Palette RAM Access & Mirroring Test by Shay Green (15 Sep 2005) (PD) NES 4aad1a570833e0365592ac54ea13019dcd3d15e4 U PPU Timing V2 by Kevin Horton (PD) NES a376886d844d36e0a073d39fb343c3955fa908e5 U PR2_test (PD) NES 502923edd8e4efd7ff1b3c1eef302997ef3cff0b U PR8 NES Drum Synth v0.99 by Neil Baldwin (2011) (PD) NES @@ -14848,7 +14848,7 @@ d9492dd8f558b7db25e6fee6b95f008e9f7e6061 G Qix (U) [!] NES 84ef8209b0dc88bf9794e3373c35e64dd7bbf375 B Qix (U) [b2] NES 5411c6741a26912adcc0b5ec87813dca9cb77cce B Qix (U) [o1] NES 9440b56316739c25dd4a1470c36eb29fe41a7c11 H Quadruple Dragons (FF1 Hack) NES -05dbd91abd97b747b4470f1ea2109274714b6532 U Quadz by Michael Blain, Mark Schmit & Phil Yam (PD) NES +05dbd91abd97b747b4470f1ea2109274714b6532 U Quadz by Michael Blain, Mark Schmit & Phil Yam (PD) NES b053482f9ced7a1835fe961cc2373ff9521b74a2 U Quantum Disco Brothers by wAMMA (PD) (PAL) NES 93efdadedba42f4ec7a6cdf5634187ff38b66f91 G Quarter Back Scramble (J) [!] NES 10532a9c32080431fb5711ff42ef83187cf13639 G Quarth (J) [!] NES @@ -14941,7 +14941,7 @@ ecd19585722f8985b1e898dae23231aa2f75cdc5 H R.B.I. Baseball - Fantasy Baseball Le 949b63ad49546c59901f143d6331dcb0f290fdad H R.B.I. Baseball - Greats of College Baseball by fightonusc (Hack) NES 4599d3da7bf2968980000c6dc6ba9fc4a1bc67a0 H R.B.I. Baseball - Heaven Vs Hell by Britznoc (Hack) NES a9947effb0e21f56beb66b771dc8f62d06ac33ba H R.B.I. Baseball - Hunt for October '06 by Fryak (Hack) NES -da4bb9c9b18ff1e37c13852824b28ed5563dfb51 H R.B.I. Baseball - Japanese League & Negro League by DrNick (Hack) NES +da4bb9c9b18ff1e37c13852824b28ed5563dfb51 H R.B.I. Baseball - Japanese League & Negro League by DrNick (Hack) NES 2d94e410ca61c704bb319ea7e4fc8980765fe97e H R.B.I. Baseball - Mexican League 1979 - Northern Division by Cafetero (Hack) NES 79230b44c7a4429f96bba1bce5da3306d04cdbf0 H R.B.I. Baseball - Mexican League 1979 - Southern Division by Cafetero (Hack) NES cd415b9405d8ae4d52038ef086b017c498fdbc3d H R.B.I. Baseball - Same Team Fix (Hack) NES @@ -15037,7 +15037,7 @@ e875c71d507573f1c4559e7b8e797a5f05adc6d2 B Racket Attack (U) [b6] NES f55f2a192bc6d0927fedd445cb0515c5284467f2 B Racket Attack (U) [b8] NES 90716b3b6b4bb2bfb39f16248a257fe07557ba70 B Racket Attack (U) [o1] NES a2bc61169a2c21a68bc6d48441538e178bcb563b B Racket Attack (U) [o2] NES -b1197945728949126af2049e96d2433a7813a9da G Rackets & Rivals (E) [!] NES +b1197945728949126af2049e96d2433a7813a9da G Rackets & Rivals (E) [!] NES 66a0be81eb404220b2c519dcc3ca3432e883ac5a G Rad Racer (E) [!] NES cda80a93a5fa2622064056b5bc5e93eeb1c811de B Rad Racer (PC10) [b1] NES 7e0332479069fe729f44f61d8f337d228efc2a07 U Rad Racer (PC10) NES @@ -15202,12 +15202,12 @@ b00813ed6a0b4602b1384d6f7418052dc496dead G Reigen Doushi (J) [!] NES cb58b0109a4dc4c1f757035842da3b79744f4e9e B Remote Control (U) [o1] NES 068c2b2053974a7cad3e7a0637bc6354f32694e0 B Remote Control (U) [o2] NES 075b4a6af861726f45d0da61052769886a080e35 B Remote Control (U) [o3] NES -982f6bc24423ecc04199c8fa3f8d156c9af1a9b3 G Ren & Stimpy Show, The (U) [!] NES -07a8119abea8e83455f8aa45224418cc3af784a4 B Ren & Stimpy Show, The (U) [b1] NES -2476bf9fed478b6612c50be88448cd14cf694a17 B Ren & Stimpy Show, The (U) [b2] NES -ce765eceee5a44dbf2112f3e986c8cb0d11ac54d B Ren & Stimpy Show, The (U) [b3] NES -04b8201def7ae785ea69e592fa66f9a3f6838093 B Ren & Stimpy Show, The (U) [o1] NES -14c3f7970827f6f231f142396843966a0be4478f B Ren & Stimpy Show, The (U) [o2] NES +982f6bc24423ecc04199c8fa3f8d156c9af1a9b3 G Ren & Stimpy Show, The (U) [!] NES +07a8119abea8e83455f8aa45224418cc3af784a4 B Ren & Stimpy Show, The (U) [b1] NES +2476bf9fed478b6612c50be88448cd14cf694a17 B Ren & Stimpy Show, The (U) [b2] NES +ce765eceee5a44dbf2112f3e986c8cb0d11ac54d B Ren & Stimpy Show, The (U) [b3] NES +04b8201def7ae785ea69e592fa66f9a3f6838093 B Ren & Stimpy Show, The (U) [o1] NES +14c3f7970827f6f231f142396843966a0be4478f B Ren & Stimpy Show, The (U) [o2] NES c3e3e30408fda21ee2383e128b13e1b0f5650c32 U Renegade (U) (VC) NES bce48217b901a2bbd81fb89586661da6a442a179 G Renegade (U) [!] NES 3da61d5ef055b8fb8f0eb9605b7bb08f3cbbd21c B Renegade (U) [b1] NES @@ -15234,7 +15234,7 @@ ce9be360c843606897cba2878e8ad3bd57134369 H Retro Mario Bros 3 (Older) (SMB3 PRG1 47958c4b9b18116ffd4aafad43aeb4bfa3ec173d H Retro Mario Bros 3 (SMB3 PRG1 Hack) NES 85e5e4241d7fb3cb4bd03f2ec44c3439960e2f49 U Retrocoders' Demo for Y2Kode (PD) NES 5e4eb9f1a8b2a9dc60308c380659aa040d164545 U Retrocoders' Music ROMS - Years Behind (PD) NES -482360d347ba7c0deb945f93d43cc85377fc3654 H Return BC by Bishop & Multisoft (Battle City Hack) NES +482360d347ba7c0deb945f93d43cc85377fc3654 H Return BC by Bishop & Multisoft (Battle City Hack) NES 4be8bc2dfd966d52c3dc27042813eaaadf4217e3 H Return BC by Bishop (Battle City Hack) NES caa8da6dcf9d28028dfd6d2e6e86537fd0be3eb1 B Return of the Black Mage by Redrum (Warpman Hack) [o1] NES 717c53d094d0d7f01358568a92e938934a82960c H Return of the Black Mage by Redrum (Warpman Hack) NES @@ -16117,8 +16117,8 @@ c1332faaa9e40f1953a8f470b851f2a1f869715c H Sansuu 3 Nen - Keisan Game (J) [hM03] a9ce58ea73e0f63d264d0f79f23a077797fd52ff B Sansuu 3 Nen - Keisan Game (J) [hM03][o1] NES dafe0132cf7850ddbc50bc3a0f516d8a0b6049c6 G Sansuu 4 Nen - Keisan Game (J) (Prototype) [!] NES 7c5b6f8b54790e73d72088854253395360625d7f G Sansuu 4 Nen - Keisan Game (J) [!] NES -c6ac68e9dfaf87f774f8ff94a7a0eef3591e2d68 G Sansuu 5 & 6 Nen - Keisan Game (J) (Prototype) [!] NES -6020dc7df0e63dc00293d2fea63aef698f608942 U Sansuu 5 & 6 Nen - Keisan Game (J) NES +c6ac68e9dfaf87f774f8ff94a7a0eef3591e2d68 G Sansuu 5 & 6 Nen - Keisan Game (J) (Prototype) [!] NES +6020dc7df0e63dc00293d2fea63aef698f608942 U Sansuu 5 & 6 Nen - Keisan Game (J) NES 4631b718863e7e0819f8a5a20871df489667894f U Santa Claus (Ch) (Wxn) NES 4dd9861f9e77fd1d79058ec168d3659765f9b9a1 B SARS Kung Fu 2003 by Jeremiah Johnson (Kung Fu Hack) [o1] NES 5d2b88a9b421114ee9161a32a4a4be36e4d33c95 H SARS Kung Fu 2003 by Jeremiah Johnson (Kung Fu Hack) NES @@ -16151,8 +16151,8 @@ e0f27eda215acd60fd3333d971f353ade4022774 H Schneider (Captain Tsubasa II Hack) N e31b969724dc19ade8c2e82bd36b506653de7b58 U Screen Saver Demo by KZ-S (PD) NES 49735dfc8bcbb6a53b484832f6ee8a2b3379935e U Screen2NES Zelda Demo V2 by Afroman (PD) NES ac503144a0cf452f71a5ba3076f6c2ee130d58f0 U Scroll Demo by HollowOne11 (PD) NES -31f013891c2daa44cda80afc5fe9ed632823750a U ScrollNES 0.1 2010 by NO CARRIER & Batsly Adams (PD) [a1] NES -64a95d6b75ee8a90df670e3740980063289a81a5 U ScrollNES 0.1 2010 by NO CARRIER & Batsly Adams (PD) NES +31f013891c2daa44cda80afc5fe9ed632823750a U ScrollNES 0.1 2010 by NO CARRIER & Batsly Adams (PD) [a1] NES +64a95d6b75ee8a90df670e3740980063289a81a5 U ScrollNES 0.1 2010 by NO CARRIER & Batsly Adams (PD) NES 5ced0cb435fb8c3e28f3f3bbfe55b6ca196970ba G SD Battle Oozumou - Heisei Hero Basho (J) [!] NES 077c2d4b9ef42e915e13c40bf7e88fce098d0f14 G SD Gundam - Gachapon Senshi 2 - Capsule Senki (J) [!] NES 382496bc94169a2e13ddf946cdee66a8f15035f8 B SD Gundam - Gachapon Senshi 2 - Capsule Senki (J) [b1] NES @@ -16664,8 +16664,8 @@ dc06b62c59901190ad2f04f6a9b857c16c2400ec H Skinhead Fight (Nekketsu Kakutou Dens d25f42a6f677399c05e08b8c164dfd43cb6be2b5 H Skinhead on Ice (Nekketsu Hockey Hack) NES 1fd7896dfa2af88a0056fa712074b43f59c0e4da H Skinhead Racing (Downtown - Nekketsu Koushin Kyoku Hack) NES d383d346725ed66ea41d619daa311867c9dc5c58 G Sklad Nomer 18 (Unl) [!] NES -b191e5d30e31e1f8613c4b3fb40b770f97ae92ed G Skull & Crossbones (Tengen) [!] NES -6b05670da10c0ba5eb33c94fb931a5464741239e B Skull & Crossbones (Tengen) [o1] NES +b191e5d30e31e1f8613c4b3fb40b770f97ae92ed G Skull & Crossbones (Tengen) [!] NES +6b05670da10c0ba5eb33c94fb931a5464741239e B Skull & Crossbones (Tengen) [o1] NES 8427c83a22306c0ee376f782e948601985f49f5a B Skullanoid by Evan Lucore (Arkanoid Hack) [o1] NES 146cb857051c2fc6892e0a65b8246abf0bceabf3 H Skullanoid by Evan Lucore (Arkanoid Hack) NES 3fc678eae782f6337e6522285b9b78b0541067a9 G Sky Destroyer (J) [!] NES @@ -16974,11 +16974,11 @@ eb60b5015be750db9484d7f5a74fdd23ec22d150 G Solar Jetman - Hunt for the Golden Wa 65f10ecade7082e8cebd1e2cc9c18ba67746691c B Solar Jetman - Hunt for the Golden Warpship (U) [o1] NES 195959f8fc5daf5ed05dc8b7fd72a5e5a748a8bb T Solar Jetman - Hunt for the Golden Warpship (U) [T+Bra1.0_TraduROMS] NES a632ae12fec13637ee1824bad5e4f6e180add3d8 T Solar Jetman - Hunt for the Golden Warpship (U) [T+Rus_Chief-Net] NES -c05e8c0f26044ee2ed8873b9939f1a97e71fc29f U Solar Wars 2001 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES -4d42ecc70c481f7fe68a8a2961ac27860fa97575 U Solar Wars by Chris Covell, Joey Parsell & Michel Iwaniec (PD) [a1] NES -da5ecfca8ee9f6a313039266fe0c705db84978d3 U Solar Wars by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES -ce8b4818719ecad6b35ce9ca4ef573467e160126 U Solar Wars Silent V.1 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES -728e45acb68985ce8cc73c5f97ab226992ccfc09 U Solar Wars Silent V.2 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES +c05e8c0f26044ee2ed8873b9939f1a97e71fc29f U Solar Wars 2001 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES +4d42ecc70c481f7fe68a8a2961ac27860fa97575 U Solar Wars by Chris Covell, Joey Parsell & Michel Iwaniec (PD) [a1] NES +da5ecfca8ee9f6a313039266fe0c705db84978d3 U Solar Wars by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES +ce8b4818719ecad6b35ce9ca4ef573467e160126 U Solar Wars Silent V.1 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES +728e45acb68985ce8cc73c5f97ab226992ccfc09 U Solar Wars Silent V.2 by Chris Covell, Joey Parsell & Michel Iwaniec (PD) NES dc50b0576187261030236687f37540cd429749ae H Soldier VS Mario (SMB1 Hack) NES 67bd42b43a2e0fc012569c02ab18bf7ec679443f T Solitair (from Nuevo Tipo de Computadora) (Unl) [T+Rus_Cool-Spot] NES b3fcfd458cb9ad4c69414b37b17b4c9cdd3d7abd T Solitair (from Nuevo Tipo de Computadora) (Unl) [T+Rus_Cool-Spot][a1] NES @@ -17245,7 +17245,7 @@ c9374202764fa52c749144b7ddcf26a9687a7d8a B Sqoon (U) [o3] NES 9bf0d67acdfde71eb391c7d35b6e45671c4fe35d U Square (Ch) (Wxn) NES 4072c52beeb14b128e0f1f497b4a72377fe59923 U Square Box by Quietust (PD) NES a864d3b913cefc885e01e0dacc53077ea7f5c727 U Square Box by Quietust [U] (PD).unf NES -7517bed4dbdc71c3184a9632e460f223b7a2191f U Square City by Mankeli, Zonzki & Bananmos (PD) NES +7517bed4dbdc71c3184a9632e460f223b7a2191f U Square City by Mankeli, Zonzki & Bananmos (PD) NES 90c1266a1bfc51c6a8fd5ae75a90bd9b6d491949 G Square Force (Unl) [!] NES f00d2feb353450bd6294bb431a54cee729e56689 G Square no Tom Sawyer (J) [!] NES af6443e035e95a7917b773fc2a32a9d7709caae5 B Square no Tom Sawyer (J) [b1] NES @@ -17566,11 +17566,11 @@ b3ed4ba03dba257229c68c4ea0173f8961bc00a2 B Strider (U) [o1] NES be18c598d75b1b8504952154938868723b045daa C Strider (U) [t1] NES a25bfd8f0cf77ee96f6b07deebe6313eb3787ea3 G Strike Wolf (MGC-014) (Unl) [!] NES 80cdb522e0d2adc41595c6dcec9fe330816b077e H Strip Aerobics (beta) by Golden Gun (Dance Aerobics Hack) NES -356fa145d802faa849c66b1c0e549de850cdffb1 U Stroke & Match Golf (Ladies) (VS) NES -53ed0cca26f766bbeb6d10bf90dd2891bda93ebe G Stroke & Match Golf (VS) [!] NES -c988eb9e17969812cd4d09896fd28da9ae3a6a13 U Stroke & Match Golf (VS) [a1] NES -6c756c8e4263a5b4dc8cc2502dc4e63fac6fab29 B Stroke & Match Golf (VS) [a1][b1] NES -7bbd19e207a78c833f8ae5ff535cbf974f299d73 B Stroke & Match Golf (VS) [a1][b2] NES +356fa145d802faa849c66b1c0e549de850cdffb1 U Stroke & Match Golf (Ladies) (VS) NES +53ed0cca26f766bbeb6d10bf90dd2891bda93ebe G Stroke & Match Golf (VS) [!] NES +c988eb9e17969812cd4d09896fd28da9ae3a6a13 U Stroke & Match Golf (VS) [a1] NES +6c756c8e4263a5b4dc8cc2502dc4e63fac6fab29 B Stroke & Match Golf (VS) [a1][b1] NES +7bbd19e207a78c833f8ae5ff535cbf974f299d73 B Stroke & Match Golf (VS) [a1][b2] NES 7bba18f6c4970a841fcca61cfa0c137fe4d79156 U Strong Pill (Ch) (Wxn) NES 8af29c451a88c37520a3ba67289b0ea984f1799a H Stronghold (SMB1 Hack) NES 0b1ff1e0010dfebe2e8a072df96ae1ce7af0595e H Stronghold, The (SMB1 Hack) NES @@ -17582,7 +17582,7 @@ b9a9a64cf606bba1fb70b3da70926ae2f22781f6 B Stunt Kids (Camerica) [o1] NES 75f1475b12ab45bd82aff0d46224dfec8b6ad663 H Subcon 2000 (Final) (SMB2 Hack) NES 13e7f2ca2c7ee1aea28245af364ce4fa6ac8b592 H Subcon 2000 (SMB2 Hack) NES 488d37154efc7611de0cded75aade267222777a6 U Submarine War (Ch) (Wxn) NES -8d24486170a3ffc5f36d89bae423a1d9fa173b60 U Subor Figure Ratiocination & IQ Puzzle (Ch) NES +8d24486170a3ffc5f36d89bae423a1d9fa173b60 U Subor Figure Ratiocination & IQ Puzzle (Ch) NES 88318d936361115b784f072ec7f1bddb0e6728ba U Subor V1.0 (R) [a1] NES 786f2da157861fd6db2aaf84fe95cc83244594fa U Subor V1.0 (R) NES 406a458af2f51a1b44ea18e1999781ca22b5b3c7 B Subor V3.0 (Ch) [b1] NES @@ -17649,8 +17649,8 @@ add98da0583a4a1cb6d5bfecf305fa64457d7b90 H SUP-Noid (Arkanoid Hack) NES 60081d0d62971348268c68f3c352c1da7cfc0d88 B Super 1997 4-in-1 [p1] NES 5e5ce5cbd73ea88ee012c88c0e7be30130f55ebd G Super 1998 3-in-1 (NT-008 PCB) [p1][!] NES fb947bf2f88e9cb8d33c0a7de8c243969bb54fdb G Super 1998 3-in-1 (VT-850, NT-008 PCB) [p1][!] NES -b103bd0b66e8ea798e64295e799fefe6b69cfd2b G Super 2-in-1 (Soccer Game & Crazy Dance) (Unl) [!] NES -3d580c1ce546b60664f2c6367d804a673478bc8d H Super 2-in-1 (Soccer Game & Crazy Dance) (Unl) [f1] NES +b103bd0b66e8ea798e64295e799fefe6b69cfd2b G Super 2-in-1 (Soccer Game & Crazy Dance) (Unl) [!] NES +3d580c1ce546b60664f2c6367d804a673478bc8d H Super 2-in-1 (Soccer Game & Crazy Dance) (Unl) [f1] NES a21a620a1eaed19ef52e8f184dec2872cee2005a U Super 2-in-1 (Unl) NES 997bbb9a3e52507fa488810ed90b613e5ba1f4cd B Super 22-in-1 [p1] NES 5830ff9449a0388450718d014a9034e32645bdec G Super 24-in-1 [U][p1][!].unf NES @@ -18009,7 +18009,7 @@ c48a6d63859327ffb4d7aac6ac4fb15f9d663c37 H Super Luigi - The Red Coin Quest Demo ea69228d23f05be1205ed891e558485069060736 H Super Mari 2 by Maikami (SMB1 Hack) NES 8301685fec5dc281b46b32acc1fadde588ca59bc H Super Mari by Maikami (SMB1 Hack) [a1] NES 749484a5d999730184edd0c5b1d234a841d08c63 H Super Mari by Maikami (SMB1 Hack) NES -9c2562be31541ef7df69e4133daaa3e2531cdedf U Super Mario & Sonic 2 (Ch) NES +9c2562be31541ef7df69e4133daaa3e2531cdedf U Super Mario & Sonic 2 (Ch) NES bf0ddfe1e564829c52d7aff0560721231994e786 U Super Mario 14 (Unl) NES 9f9f52fd92b660721b0ccccab1d99fc22729b289 H Super Mario 3 Challenge (SMB3 PAL Hack) NES 8a812f75451c88130424e39b4e38972dbbfa0b2a H Super Mario 4 (SMB1 Hack) [a1] NES @@ -18899,15 +18899,15 @@ fd7b1e21e33988714e0c6e5d881c40d11bc651cd B Swords and Serpents (U) [b1] NES a737d3984b88328a5d5f9709547b931f99e3f32d B Swords and Serpents (U) [b2] NES 297d50d7296544ab74ccf019aca1869424b99932 B Swords and Serpents (U) [o1] NES 77f4ea6ebcdd71a5dab45b014dd300458e625b19 B Swords and Serpents (U) [o2] NES -592c8b6be5816ba771b4fc18ec6a72cfee06d2c7 G T&C 2 - Thrilla's Surfari (U) [!] NES -55e8093bbbe53bd9d8d0d90952fcb6aeb9240b23 B T&C 2 - Thrilla's Surfari (U) [b1] NES -846b6b442ec5532c53d198da7c7d5909c97aff3c B T&C 2 - Thrilla's Surfari (U) [b2] NES -6a101fb054fbe93b6c6ca33245e3f8b8710e45a8 B T&C 2 - Thrilla's Surfari (U) [o1] NES -ec1ac46af157cbe49383402373ab04a483105980 B T&C 2 - Thrilla's Surfari (U) [p1] NES -7114bc8b0aad3094e59ccedba2845c1c032b15cc G T&C Surf Design (U) [!] NES -a8d63aa540cf74d966b465036f9a423136c8536b B T&C Surf Design (U) [b1] NES -006c8859d1ab3429daa1228cd6161af3cdabb236 B T&C Surf Design (U) [b2] NES -aff91bfb462c2aa10cc2d51ce93a04f050d7f84d B T&C Surf Design (U) [o1] NES +592c8b6be5816ba771b4fc18ec6a72cfee06d2c7 G T&C 2 - Thrilla's Surfari (U) [!] NES +55e8093bbbe53bd9d8d0d90952fcb6aeb9240b23 B T&C 2 - Thrilla's Surfari (U) [b1] NES +846b6b442ec5532c53d198da7c7d5909c97aff3c B T&C 2 - Thrilla's Surfari (U) [b2] NES +6a101fb054fbe93b6c6ca33245e3f8b8710e45a8 B T&C 2 - Thrilla's Surfari (U) [o1] NES +ec1ac46af157cbe49383402373ab04a483105980 B T&C 2 - Thrilla's Surfari (U) [p1] NES +7114bc8b0aad3094e59ccedba2845c1c032b15cc G T&C Surf Design (U) [!] NES +a8d63aa540cf74d966b465036f9a423136c8536b B T&C Surf Design (U) [b1] NES +006c8859d1ab3429daa1228cd6161af3cdabb236 B T&C Surf Design (U) [b2] NES +aff91bfb462c2aa10cc2d51ce93a04f050d7f84d B T&C Surf Design (U) [o1] NES fdbe721de58985fa9388e8dacaab2b9bbd2594bb G Taan Hak Fung Wan King Tank (Ch) [!] NES 07d463406d853ee92d196bedbf1c9d304fbfc442 T Taan Hak Fung Wan King Tank (Ch) [T+Rus_Cool-Spot] NES 09f2fc1c42469212c6867ae1a8049716f59e8773 U Table Tennis (Ch) (Wxn) NES @@ -19076,12 +19076,12 @@ cda500269bb162b0724f974b104cdc1573cd69dd C TaleSpin (U) [t4] NES ba0f38461b625da1b4d2d87ffe2d425e4300c7bc U Tall Pixel Demo by Damian Yerrick (PD) NES dab071f1829851c34483f02b1da737ee3ccd13b6 G Tamura Koushou Mahjong Seminar (J) [!] NES 21047b05fe5387b1c08834439f8fb153735da6ff B Tamura Koushou Mahjong Seminar (J) [b1] NES -4a6a524759ca64e2983cb188ff439178075e304c U Tanespot by Jonathan & Hans Knektar (PD) NES +4a6a524759ca64e2983cb188ff439178075e304c U Tanespot by Jonathan & Hans Knektar (PD) NES 74bb1012db87e69d6deb37de19446c668886049b U Tang Bo Hu Dian Qiu Xiang (NJ069) (Ch) NES 61c396d07aae17b391121f07cf9ba92bec0ca736 U Tang Mu Li Xian Ji (Ch) NES eac84b8189e3ec871f6974376e158737c2a376c7 G Tanigawa Kouji no Shougi Shinan II (J) [!] NES 9c3c6e0dd492ae7ea8f38224089a3f0b0b979880 G Tanigawa Kouji no Shougi Shinan III (J) [!] NES -d061ab6624edb4fdaf4d2a1df75499d1238eccf5 H Tank & Sub Mario (SMB1 Hack) NES +d061ab6624edb4fdaf4d2a1df75499d1238eccf5 H Tank & Sub Mario (SMB1 Hack) NES 459a8d83e8d0d992a2685ce6da135a2e691ed1a6 H Tank (Battle City Hack) NES 7f7888211e30b4dc296ee5addfbf8c62985bd9f9 U Tank (Ch) (Wxn) NES b5544d657fadef726ada69718407ab509dc69c47 U Tank 1990 (Ch) [a1] NES @@ -19112,8 +19112,8 @@ e30f43730fd9b74ebe5dc5c88e5bc0f72dc19fef H Tank Duel (Chi Title) (Battle City Ha e5f6c4aebfa1123554d4e3ef984f0a7e0bfdaef8 H Tank Duel 2 (Battle City Hack) NES 74ca37027c5e461fc88adc33fa428d832a5b225e B Tank Z by TOF (Battle City Hack) [o1] NES 007775f70b0726f7e20241484bf59e84cb35ce6f H Tank Z by TOF (Battle City Hack) NES -b5b01322bde1c061a76471fb544f90ecfbd0622b T Tanks & Milk (Nuts & Milk Hack) [T+Rus_Mitz] NES -832900808ad3add22e973fbb65408139abc0ed1a H Tanks & Milk (Nuts & Milk Hack) NES +b5b01322bde1c061a76471fb544f90ecfbd0622b T Tanks & Milk (Nuts & Milk Hack) [T+Rus_Mitz] NES +832900808ad3add22e973fbb65408139abc0ed1a H Tanks & Milk (Nuts & Milk Hack) NES b07bd06624f56133c87610a8bb722be10e495147 G Tantei Jinguuji Saburou - Toki no Sugiyuku Mama ni (J) [!] NES 2c0a885c049a4de54a31f51086cb20006e11beb8 U Tantei Jinguuji Saburou - Yokohamakou Renzoku Satsujin Jiken (J) (VC) NES be8ae507a738cc2059a598f2cfe68a0e848939c4 G Tantei Jinguuji Saburou - Yokohamakou Renzoku Satsujin Jiken (J) [!] NES @@ -19446,7 +19446,7 @@ f0a930d6451dd861698c153e2e4af341b506942a H Tecmo Rose Bowl 2002 1-AA College Foo b7d7e496ca9dfa023d79dcc973208c1c63477125 G Tecmo Super Bowl (U) [!] NES 09d7268535053f7ba16f94f4e4846a0d2705ee41 B Tecmo Super Bowl (U) [b1] NES 4f197e5d60df3bb0df051e46614b3de55edd0d7d B Tecmo Super Bowl (U) [o1] NES -ac3da734fa5eda62df44ecfb8912c18cb0f6623f H Tecmo Super Bowl 1962 Edit by Denny, Jstout & Elway7 (Hack) NES +ac3da734fa5eda62df44ecfb8912c18cb0f6623f H Tecmo Super Bowl 1962 Edit by Denny, Jstout & Elway7 (Hack) NES 761290f53aa1bfee1f9ddabbbdc70482dd415d1c H Tecmo Super Bowl 1968 by Carther (Hack) NES ea38b12e3cd3192d07637f32055ce1a3a82be32f H Tecmo Super Bowl 1968 Even Team - Online Tecmo Tourney Version (Hack) NES 6f4441535cc711207a204ee375bc7d0b535a9d19 H Tecmo Super Bowl 1983-1984 - BO FB Offtackle Left (Hack) NES @@ -19502,7 +19502,7 @@ cab90185c6f732f922f915cada0e9010a1330f6a H Tecmo Super Bowl 2006 - AFC Champions ce0e7ecec10a711a0e3afc31155ef920adc28cb9 H Tecmo Super Bowl 2006 by GRG (Hack) NES b75b315ca3c96ec8a2632a0373928979c4aefeab H Tecmo Super Bowl 2006 v.2 by RBPD5015 (Hack) NES 59783d5c20f9f046738532d7323f5c2dadaae333 H Tecmo Super Bowl 2006 v.final by mattjones18 (Hack) NES -9d2c88538919d6e1a2fc60215b721ff7d3e2b9b9 H Tecmo Super Bowl 2006 v.update - Title Screen by mattjones18&andrewmarsh13 (Hack) NES +9d2c88538919d6e1a2fc60215b721ff7d3e2b9b9 H Tecmo Super Bowl 2006 v.update - Title Screen by mattjones18&andrewmarsh13 (Hack) NES 40efbfe8bbb00f3db078fdcf522957653020fd4f H Tecmo Super Bowl 2006 v1 by drummer4god (Hack) NES bc25eaf09228d5a1c6a0f692898509b1de119534 H Tecmo Super Bowl 2006 v1 by mattjones18 (Hack) NES 95ddb60aaa75a8d2adb03c4f6d63dceca65dcadb H Tecmo Super Bowl 2006 v2 by drummer4god (Hack) NES @@ -19739,7 +19739,7 @@ bed34bf7c2bda653eda7a3eb1181c6a7c4cb0a65 H Tecmo Super Bowl X Globe Bowl (Hack) 10c4e09361a27a527dd4337ff62a49409670343c H Tecmo Super Bowl X IHSAA (Hack) NES 058e6dd332cc20282b87b001ee554f01666a939b H Tecmo Super Bowl X Mutant League (Hack) NES a2ddbeb71c07961cf875f0f01a3eca1b1dc7dd8f H Tecmo Super Bowl X Olympics (Hack) NES -3f5d28fe0591911ff8b60b59a80502572407af62 H Tecmo Super Bowl X World & USFL (Hack) NES +3f5d28fe0591911ff8b60b59a80502572407af62 H Tecmo Super Bowl X World & USFL (Hack) NES 07e33fb37a8ef1ef32582fc3ade1a1d42750c891 H Tecmo Super Bowl X World League (Hack) NES 1dccdc47be881eda06fc80bb6ee95b769177a814 H Tecmo Super Bowl X XFL (Hack) NES 30b6033e6ef01cbd8099beff41a10dfeda91436e H Tecmo Super Bowl XFL - Updated by GRG (Hack) NES @@ -20036,7 +20036,7 @@ d9e05cd3cb72d02352ce907f65137c161f000d51 H Tenchi wo Kurau II - Star and Rainbow 606b6c26886e37f674ba0b076825a0c18e51b838 H Tenchi wo Kurau II - Valiant General Edition by lmjny (Hack) NES 947659dcc3aa847b7abcd701e7328c13aff76941 H Tenchi wo Kurau II - Weiruwei's Final Edition (Hack) NES 7ce8f14c477da953cb66f7f0bfb89772de574e8f H Tenchi wo Kurau II - Woman Edition (Hack) NES -53bbb3a3def86ddf00d763c1ed171282d10dd29b H Tenchi wo Kurau II - Wu Jin & Guo Tai (Hack) NES +53bbb3a3def86ddf00d763c1ed171282d10dd29b H Tenchi wo Kurau II - Wu Jin & Guo Tai (Hack) NES 81be25d041c91f81e1b6df190b6baf886ee9a75c H Tenchi wo Kurau II - Yellow Turban Story (Hack) NES 17c71e03f6423c5f706e616182b1eea779913fd7 H Tenchi wo Kurau II - Yuan Luzhi Story (Hack) NES fa8396969fd18af4606f9a6d36cadc45eb747987 H Tenchi wo Kurau II - Yuan Shao Story (Hack) NES @@ -20252,16 +20252,16 @@ c697f7159f401fa736320a25a4f1b06233198f81 B Three Stooges (U) [o1] NES 2d2dd56f453715fc2fd8d0abf95bc2459f1d6082 B Three Stooges (U) [o2] NES 8c30cfc34cf89bae61591f599f6f24b3b255cb00 B Three Stooges (U) [o3] NES 1a618d99702421566c04e14096bf23ab25207f83 B Three Stooges (U) [o4] NES -5203dd2cbaafba9e5d4581a8252f2d47413902d8 G Thunder & Lightning (U) [!] NES -537819f97ddad1210614b59bffc81a6ef045a9ed B Thunder & Lightning (U) [b1] NES -cec96de01564f5bd14ace8668cd616f5f54094c8 B Thunder & Lightning (U) [b1][o1] NES -2eef9579430f9c00a59504715ebe3f4b3b4fbc4f B Thunder & Lightning (U) [b1][o2] NES -0a7c1edf9d2b26497de3aec1aa67a600795b72ca B Thunder & Lightning (U) [b2] NES -e6a90c84a3bd1e6c4e34d08df3ef4ff74c2206a3 B Thunder & Lightning (U) [b3] NES -2ea8b553bda94064f8142e8e2ea1d258db857da7 B Thunder & Lightning (U) [b4] NES -f04edfb835d9b14827f2e3359c81b7678b16b71b B Thunder & Lightning (U) [b5] NES -da657ecdd900b9b0d4ddc0473b9e9a92624d0659 B Thunder & Lightning (U) [b6] NES -468c6e236ddcab75bdc31e18f1731ffa52a62ade C Thunder & Lightning (U) [t1] NES +5203dd2cbaafba9e5d4581a8252f2d47413902d8 G Thunder & Lightning (U) [!] NES +537819f97ddad1210614b59bffc81a6ef045a9ed B Thunder & Lightning (U) [b1] NES +cec96de01564f5bd14ace8668cd616f5f54094c8 B Thunder & Lightning (U) [b1][o1] NES +2eef9579430f9c00a59504715ebe3f4b3b4fbc4f B Thunder & Lightning (U) [b1][o2] NES +0a7c1edf9d2b26497de3aec1aa67a600795b72ca B Thunder & Lightning (U) [b2] NES +e6a90c84a3bd1e6c4e34d08df3ef4ff74c2206a3 B Thunder & Lightning (U) [b3] NES +2ea8b553bda94064f8142e8e2ea1d258db857da7 B Thunder & Lightning (U) [b4] NES +f04edfb835d9b14827f2e3359c81b7678b16b71b B Thunder & Lightning (U) [b5] NES +da657ecdd900b9b0d4ddc0473b9e9a92624d0659 B Thunder & Lightning (U) [b6] NES +468c6e236ddcab75bdc31e18f1731ffa52a62ade C Thunder & Lightning (U) [t1] NES ff9a9dadbc051dba184bb2b75898d0b1e2003fa9 H Thunder Mario v0.1 (SMB1 Hack) [a1] NES ca34b25a91844a3553460f5c8a2c9c965aa2aa5c H Thunder Mario v0.1 (SMB1 Hack) NES e14b6ba27655313943a2bb440aa753bb6ca6fed5 U Thunder Warrior (Unl) NES @@ -20288,7 +20288,7 @@ cb0899ae2d9a0ad60edd0ada2b0a62c79be46893 U Thwaite V0.03 by Damian Yerrick (2011 276a18af8b307acd1edf98594e29710eeccf1c8c U Tian Long Ba Bu (NJ035) (Ch) NES cac9a7bb24890cc9cd7ab020581a5b609e1e1d0d U Tian Wang Xiang Mo Zhuan (Ch) (Decrypted) NES ab39d3fe1be075db59fe77abfb225249cfefcf90 U Tiao Wu Tan (Ch) NES -93e851e78f811175edb368d37dd7060c82fcfc3a T Tic & Tac 2 - Rangers du Risque (Chip 'n Dale 2 Hack) [T+Fre] NES +93e851e78f811175edb368d37dd7060c82fcfc3a T Tic & Tac 2 - Rangers du Risque (Chip 'n Dale 2 Hack) [T+Fre] NES 9bff3f91adf6fce47baae595be44fcd9c906884b U Tic-Tac by Sly Dog Studios (PD) NES 3bdb74f3a9f0620ca6581a7ad8a9864b810e3772 U Tic-Tac XO by Sly Dog Studios (PD) NES 15ac45742f1830dd6ba727cf41a4a9d9676a6d2a B Tie Fighter (Older) (SMB1 Hack) [b1] NES @@ -20430,7 +20430,7 @@ b4bc7b0867d9ecc88fe89bb6b4c564c495455363 H Toaster Bros (SMB1 Hack) NES 6e89817eb2531c4260120a609b89de354a5fd39d H Tobi (SMB1 Hack) NES b01ede8636ad9642476c09541b85ffb3d6bbb11a U Tobidase Daisakusen (FDS Conversion) NES c1307b51a96018211ef8105cbbbe90cd3e16a67b H Todos Contra TCHECO 2.0 by Macbee (Rockin' Kats Hack) NES -bf27c3c6ea6f06ff6d3071eb0e105608038e8052 U ToeJam & Earl Title Screen (PD) NES +bf27c3c6ea6f06ff6d3071eb0e105608038e8052 U ToeJam & Earl Title Screen (PD) NES 3d03d92a8f68a8d0619de48b710c9d514663b63e H Toilet Mario (SMB1 Hack) [a1] NES 8af0f78307042ecb8d938600b83daca6f76f004c H Toilet Mario (SMB1 Hack) NES f11c1240a664c5424a8c7eba7eeb42343c792350 U Toita Basketball (Unl) NES @@ -20464,30 +20464,30 @@ aef80dedb58085fc4b779e3747d69492f3b666bf G Tokoro San no Mamoru mo Semeru mo (J) b42120ffa11f8c809db4e6dd0ba11a8eebcd65bd H Tokoro San no Mamoru mo Semeru mo (Saitama Hack) NES ecf1fd4135beebe35c7ca8036e1a085dacdc4f5d U Tokumaru Raycaster 00 (PD) NES 2fca78b0d4a436579b3ed6c72dfe3888f3154644 U Tokumaru Raycaster 01 (PD) NES -d67f0beeb7603c224177264f13fc4b2d08ad679b G Tom & Jerry (E) [!] NES -7e1048cd8d868d1df56ed613f660b8513a6d71ea T Tom & Jerry (J) [T+Chi_MS emumax] NES -709016db8902eb4c6a99cd462fd1627babbbfbe4 U Tom & Jerry (J) NES -d6ebfe209995e8db14e82df952e8c5b10b025460 G Tom & Jerry (U) [!] NES -8620b79e4f0087a6a44ac3c31d2746292e573d49 B Tom & Jerry (U) [b1] NES -201867ffc992c4038021d8510fe8beea4f3e305a B Tom & Jerry (U) [b2] NES -936d84aafd680e4b52cfd006fd0f3ec8abfa2c24 B Tom & Jerry (U) [b3] NES -fe4ed3c8f29cbdb649a233b85e224f04f6a7f533 B Tom & Jerry (U) [o1] NES -6f8965f2e332e96a43de03ccca6a12b982f4a95a B Tom & Jerry (U) [p1] NES -7e984e9696e8d089ad870c68944ff2b95f053732 T Tom & Jerry (U) [p1][T+Rus_2R Team] NES -623f8b48b17e34653a0d9cd1db0b0facb8429b8f B Tom & Jerry (U) [p2] NES -8ecbe4a0a6b94542409c0990357de968e2e85f22 T Tom & Jerry (U) [T+Ara_Hisoka] NES -22c95df30f90c68b0d64b412029f9e905195bca1 T Tom & Jerry (U) [T+Pol] NES -28ceb78e1a2f2646bb47a8c5ed293605a7fa8a5f T Tom & Jerry (U) [T+Rus] NES -c3a972e3cd3f9832f7f46756d68744952e1585e9 C Tom & Jerry (U) [t1] NES -168e14e08574662823d6e4604540225205e29301 U Tom & Jerry 3 (Unl) NES +d67f0beeb7603c224177264f13fc4b2d08ad679b G Tom & Jerry (E) [!] NES +7e1048cd8d868d1df56ed613f660b8513a6d71ea T Tom & Jerry (J) [T+Chi_MS emumax] NES +709016db8902eb4c6a99cd462fd1627babbbfbe4 U Tom & Jerry (J) NES +d6ebfe209995e8db14e82df952e8c5b10b025460 G Tom & Jerry (U) [!] NES +8620b79e4f0087a6a44ac3c31d2746292e573d49 B Tom & Jerry (U) [b1] NES +201867ffc992c4038021d8510fe8beea4f3e305a B Tom & Jerry (U) [b2] NES +936d84aafd680e4b52cfd006fd0f3ec8abfa2c24 B Tom & Jerry (U) [b3] NES +fe4ed3c8f29cbdb649a233b85e224f04f6a7f533 B Tom & Jerry (U) [o1] NES +6f8965f2e332e96a43de03ccca6a12b982f4a95a B Tom & Jerry (U) [p1] NES +7e984e9696e8d089ad870c68944ff2b95f053732 T Tom & Jerry (U) [p1][T+Rus_2R Team] NES +623f8b48b17e34653a0d9cd1db0b0facb8429b8f B Tom & Jerry (U) [p2] NES +8ecbe4a0a6b94542409c0990357de968e2e85f22 T Tom & Jerry (U) [T+Ara_Hisoka] NES +22c95df30f90c68b0d64b412029f9e905195bca1 T Tom & Jerry (U) [T+Pol] NES +28ceb78e1a2f2646bb47a8c5ed293605a7fa8a5f T Tom & Jerry (U) [T+Rus] NES +c3a972e3cd3f9832f7f46756d68744952e1585e9 C Tom & Jerry (U) [t1] NES +168e14e08574662823d6e4604540225205e29301 U Tom & Jerry 3 (Unl) NES 67e2781b74c0771c377bfd11308662ab906e7a09 G Tom Sawyer no Bouken (J) [!] NES da0a506fda6aba44a56ac998b613176a7b8f8919 T Tom Sawyer no Bouken (J) [T+Rus_Guyver] NES a506f23a0f5905fe85051e14e9ad1e0e181163ed C Tom Sawyer no Bouken (J) [t1] NES 2ffc983e94e5ec9fc654052a442297c2b1ab24a1 H Tom Servo (Megaman III Hack) NES -9c1de5cd49641d025d75c4024ee303ed0135673e G Tombs & Treasure (U) [!] NES -582a21a4e41a0e844d66cd3c7e75bc75939c0cb5 B Tombs & Treasure (U) [o1] NES -2e819d9c061ab801c931ef547ce737de8f92403a B Tombs & Treasure (U) [o2] NES -6a1536f70666a52075e967ed24b1e48cbd7fa8a1 C Tombs & Treasure (U) [t1] NES +9c1de5cd49641d025d75c4024ee303ed0135673e G Tombs & Treasure (U) [!] NES +582a21a4e41a0e844d66cd3c7e75bc75939c0cb5 B Tombs & Treasure (U) [o1] NES +2e819d9c061ab801c931ef547ce737de8f92403a B Tombs & Treasure (U) [o2] NES +6a1536f70666a52075e967ed24b1e48cbd7fa8a1 C Tombs & Treasure (U) [t1] NES ea4f4ddf8d26245a0a16078f913d0074a080261c U Tommy T's Play Me Sound Editor (PD) NES 3b287cb938e58a77c6d5aefdfb47fe9027c17055 G Toobin' (Tengen) [!] NES df8f7e23d1cca410226951d89fd6d4cdbd8aaf4e B Toobin' (Tengen) [b1] NES @@ -20520,11 +20520,11 @@ ee7747f09f98e6fc1717652a7a485982f5b2d6d6 G Top Gun - The Second Mission (U) [!] 3dfdd953c496287d95c38a5e8653b6fdaadc0ede B Top Gun - The Second Mission (U) [o1] NES 9f92f4d56710b97b79525b7d055041a7ff302697 H Top Gun Altered (Hack) NES 334e4ff5070846b5db6f1f0d1eba80cb1a1141c8 U Top Gun III (Unl) NES -d3de04f554a5ae57750f12aedc810c0c3db3d2ea G Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [!] NES -1dc84f0db89649761867fb52711d31566ff26883 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b1] NES -e42950f3b54f3368e3fdc54e03bfe9e728334561 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b2] NES -ef32f202aa300422587ce967621b3a7afeb9065a B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b3] NES -50a9b1a803d4c5c55799657c340e942dc976e3f4 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [o1] NES +d3de04f554a5ae57750f12aedc810c0c3db3d2ea G Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [!] NES +1dc84f0db89649761867fb52711d31566ff26883 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b1] NES +e42950f3b54f3368e3fdc54e03bfe9e728334561 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b2] NES +ef32f202aa300422587ce967621b3a7afeb9065a B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [b3] NES +50a9b1a803d4c5c55799657c340e942dc976e3f4 B Top Players' Tennis - Featuring Chris Evert & Ivan Lendl (U) [o1] NES d4d46dc4d99459c8dd57f30eeb16aa03358540f3 G Top Rider (J) [!] NES fd4d0f89989a257c35fc243eeb6f5c6d3f36b88a B Top Rider (J) [b1] NES cf633f8b8571bead545ed8d72da9b22771c1b255 H Top Rider (J) [hM04] NES @@ -20588,26 +20588,26 @@ d67238510c7f9b72eec13d5269a0158ffa975055 C Toxic Crusaders (U) [t1] NES aad697dda0e00fd508d0e9469660194701f25a2a H Toxic Crusaders Debug by dragon2snow (Hack) NES 7c748e5a83fb07905cadc427d1909a04af8c51ec H Toy Story (Unl) [hM219] NES e3a08bd0e03b4b395410ec1ccdd9c0f49400a410 U Toy Story (Unl) NES -f036a0ba914cac462525480fe583e2a7871d192c B Track & Field (PC10) [b1] NES -95f499762d567ca9c8373cff73253937529baeab U Track & Field (PC10) NES -df8425d96b3ac613eec604d66b32e91b001488d0 G Track & Field (U) [!] NES -ac29221519765ec4a10e5f6ef5549dd1393436c7 B Track & Field (U) [b1] NES -5a7c68d213dd96b2e4f4cedd3de4165c711ba945 B Track & Field (U) [o1] NES -c2d8a7573451d64681d2baa10b83e7d1e3c1c04a B Track & Field (U) [p1] NES -abee2b7e0513ba2e55a522a0105e461f2f5cb267 T Track & Field (U) [T+Bra100%_BRGames] NES -70b74fc1f7623f133a7f49f9e1b54418164f4056 G Track & Field II (E) [!] NES -29bd3871447df2ad02a5ab1ec2c9256e85a5c359 G Track & Field II (U) (PRG0) [!] NES -316a53f846cdbf55c021f8e9497f06e2b08245e4 B Track & Field II (U) (PRG0) [b1] NES -97e6822b57a61ed4f1f763582a1fb2f556f44632 B Track & Field II (U) (PRG0) [b2] NES -921d31753740408fe8b3cce41e36609ada225068 B Track & Field II (U) (PRG0) [b3] NES -817ca6d0d790458dfa248763170dd05b0408ab25 B Track & Field II (U) (PRG0) [b4] NES -16994d0c5085bc91e0768b39c462c8920fdfdb26 B Track & Field II (U) (PRG0) [o1] NES -dda552f0a6b95dbcc891cff98220fad2fd08eaad B Track & Field II (U) (PRG0) [o2] NES -62ce1b905f5bcf37d65c6126f962a8088c1ce171 T Track & Field II (U) (PRG0) [T+Bra1.0_ROMHackBR] NES -533cd4effd292961c38d5d3bec9bf4bab4acaa32 T Track & Field II (U) (PRG0) [T+Swe1.0_TheTranslator] NES -a3ca238ef9744175b1bdc70bcdb70aafe97239bc T Track & Field II (U) (PRG0) [T+Swe1.0_TheTranslator][a1] NES -768e8707b2af9167cfd2851c968988185d463f98 G Track & Field II (U) (REVA) [!] NES -830d9875c723a15fb322b4f12a750f618268e80b G Track & Field in Barcelona (E) [!] NES +f036a0ba914cac462525480fe583e2a7871d192c B Track & Field (PC10) [b1] NES +95f499762d567ca9c8373cff73253937529baeab U Track & Field (PC10) NES +df8425d96b3ac613eec604d66b32e91b001488d0 G Track & Field (U) [!] NES +ac29221519765ec4a10e5f6ef5549dd1393436c7 B Track & Field (U) [b1] NES +5a7c68d213dd96b2e4f4cedd3de4165c711ba945 B Track & Field (U) [o1] NES +c2d8a7573451d64681d2baa10b83e7d1e3c1c04a B Track & Field (U) [p1] NES +abee2b7e0513ba2e55a522a0105e461f2f5cb267 T Track & Field (U) [T+Bra100%_BRGames] NES +70b74fc1f7623f133a7f49f9e1b54418164f4056 G Track & Field II (E) [!] NES +29bd3871447df2ad02a5ab1ec2c9256e85a5c359 G Track & Field II (U) (PRG0) [!] NES +316a53f846cdbf55c021f8e9497f06e2b08245e4 B Track & Field II (U) (PRG0) [b1] NES +97e6822b57a61ed4f1f763582a1fb2f556f44632 B Track & Field II (U) (PRG0) [b2] NES +921d31753740408fe8b3cce41e36609ada225068 B Track & Field II (U) (PRG0) [b3] NES +817ca6d0d790458dfa248763170dd05b0408ab25 B Track & Field II (U) (PRG0) [b4] NES +16994d0c5085bc91e0768b39c462c8920fdfdb26 B Track & Field II (U) (PRG0) [o1] NES +dda552f0a6b95dbcc891cff98220fad2fd08eaad B Track & Field II (U) (PRG0) [o2] NES +62ce1b905f5bcf37d65c6126f962a8088c1ce171 T Track & Field II (U) (PRG0) [T+Bra1.0_ROMHackBR] NES +533cd4effd292961c38d5d3bec9bf4bab4acaa32 T Track & Field II (U) (PRG0) [T+Swe1.0_TheTranslator] NES +a3ca238ef9744175b1bdc70bcdb70aafe97239bc T Track & Field II (U) (PRG0) [T+Swe1.0_TheTranslator][a1] NES +768e8707b2af9167cfd2851c968988185d463f98 G Track & Field II (U) (REVA) [!] NES +830d9875c723a15fb322b4f12a750f618268e80b G Track & Field in Barcelona (E) [!] NES d974155c893375bdc5701e18b2feac774c4a59e5 B TradeMark Mario (SMB1 Hack) [o1] NES 1263a4459dfa4722581a46d94bf1429f1465f683 H TradeMark Mario (SMB1 Hack) NES c953cb58d25ed19b477779b81b1962bb25e06cdb H Tranny Tramps - The Family Jewels (Double Dragon III Hack) NES @@ -21002,7 +21002,7 @@ f6642a2ee4fd9cf1a8c4f991d9e427627fe5ea3b U Variable Width Font Demo v0.01 by Dam 8548c230871abaf39c965bc3f87488ec1ca13fff U Variable Width Font Demo v0.02 by Damian Yerrick+Blargg (PD) NES 582450682d233eb3b1279b1e11a0e0137602be6b U Variable Width Font Demo v0.03 by Damian Yerrick+Blargg (PD) NES afd24e18c113309cbc0917c73fdb2c7865511990 U VBL Flag Clearing Timing Test by Shay Green (6 Nov 2005) (PD) NES -6e1faa816c80462f5ee293c1847ee829683ea8a9 U VBL Flag Operation & PPU Timing Test by Shay Green (7 Nov 2005) (PD) NES +6e1faa816c80462f5ee293c1847ee829683ea8a9 U VBL Flag Operation & PPU Timing Test by Shay Green (7 Nov 2005) (PD) NES 3aef088d11ce1b6b8b2db07aba9aa79b6d8526e3 U VBL Timing Test by Shay Green (6 Nov 2005) (PD) NES 45585124fb0ba1b93995c4c15ec48382c90af165 U Vectest3 (PD) NES 2d55988a0e29604c90c844df15da34764688fbf0 U Vector Demo (PD) NES @@ -21094,7 +21094,7 @@ a99e0bc1b9087b3f2540c1b18425af6083e74f0e T Volleyball (UE) [T+FreBeta_ks151] NES 2b711242f71bdee2a9ec5045c4863b2b030bbbd8 T Volleyball (UE) [T+Ita1.0_ZombiKiller] NES 028bfd4d3228343a992cecf5fdd9d4805d8a3cc2 G Volshebnaya Palitra (R) [!] NES 58832f2ce7232a8e476b5376f533300eb6b702de U Vote for Oniken on Greenlight (PD) NES -c81a649f330e3de4784d94e5ea00b502a207716c U VRAM Access & Internal Read Buffer Operation Test by Shay Green (15 Sep 2005) (PD) NES +c81a649f330e3de4784d94e5ea00b502a207716c U VRAM Access & Internal Read Buffer Operation Test by Shay Green (15 Sep 2005) (PD) NES 475ec5c8f610793d2ec555021e18f9230b151d63 U VRC6 Sound Demo by Siudym (PD) (PAL) NES 3e6154c79f27c5c9b2d4eba11c78570c9c5425cb H VS. Airman (SMB1 Hack) NES f9db1a17425dcd34a7bc68c0f86d5c338e58e795 B VS. Blink (VS SMB1 Hack) [o1] NES @@ -21190,9 +21190,9 @@ abae2b3ed342bc069abee73137744e5b36b4b0ab B Wall Street Kid (U) [b1] NES 7aca04613ec4e14df9c954f3e08605b5d981fadc B Wall Street Kid (U) [o2] NES 3b07de583fdf353d0e78f46b161e1e0c955b45d1 B Wall Street Kid (U) [o3] NES 1f5b5b4552ad51bc07a8aa99345b25190527995e B Wall Street Kid (U) [o4] NES -7d60a48aa52afcdf64ea9b249ade7cc8e83301c6 U Wally Bear & the No Gang (AVE) (Prototype) NES -cd1ee26c0cef8c48b72cc4000ac7a577b8c4c0b5 G Wally Bear & the No Gang (AVE) [!] NES -6603d08ee41b39350184cdf03537eb36162e2f01 B Wally Bear & the No Gang (AVE) [o1] NES +7d60a48aa52afcdf64ea9b249ade7cc8e83301c6 U Wally Bear & the No Gang (AVE) (Prototype) NES +cd1ee26c0cef8c48b72cc4000ac7a577b8c4c0b5 G Wally Bear & the No Gang (AVE) [!] NES +6603d08ee41b39350184cdf03537eb36162e2f01 B Wally Bear & the No Gang (AVE) [o1] NES dd8c8a387158230df68e20bd90b6c729589a5116 H Waluigi's Adventure by Googie (SMB1 Hack) [a1] NES 0de42862be2fea4d569700db9a01ef7745e2d97a H Waluigi's Adventure by Googie (SMB1 Hack) [a2] NES a9c35c50a1a447728621fffbad42f32a521c09ed B Waluigi's Adventure by Googie (SMB1 Hack) [b1] NES @@ -21267,7 +21267,7 @@ ad680a185bed1fdb8f6f885deaad6ed3ae565ea1 H Waterboy, The (Harry's Legend Hack) N dc88673fb3defcf60fcbbc5b2968dab20a188ad8 U WAV2NES Sample (PD) NES 831595bf54bf5dc41031358b87c7a3f30b2da765 U Wavetable5 Demo by Blargg (PD) NES 0b8582204c535c3b9c7d1b89342f22efb455a757 U Wavetable6 4-Channel Music Demo by Blargg (PD) NES -f5391038938d1c8577e572f0480ebf600bfd6482 U Wavy & Stretch Demo V0.3 by Chris Covell (PD) NES +f5391038938d1c8577e572f0480ebf600bfd6482 U Wavy & Stretch Demo V0.3 by Chris Covell (PD) NES c3c8bc28a11c11e45d48bdb8dd6b03d9e1974c47 U Way Out (Ch) (Wxn) NES 2470ce28d144f6d1320a81e8f1faeabd07bed462 G Wayne Gretzky Hockey (U) [!] NES 2be91df36a683e1e09f3f897ba5170fff22f2ac7 B Wayne Gretzky Hockey (U) [b1] NES @@ -21385,14 +21385,14 @@ d3040b0e2e70f426236cf76e3dbc7bc23967eb28 T Willow (U) [T+Fre100] NES 5e108abf60f2f8467c5a7f962cf11f0702c370a5 T Willow (U) [T+Rus_arsen13,Tigran] NES c6639a7b826fc3c85167334d7e3902db896a4779 T Willow (U) [T-Fre010] NES 3352a0493d4d40de75b3036ee01133e2fbe8e602 C Willow (U) [t1] NES -d94557741ae526a0cc7b4a3be5aa4a825baf9a85 G Wily & Light no Rockboard - That's Paradise (J) [!] NES -be4507a270fb3406cd483f2fd4e34da74a22d7a7 B Wily & Light no Rockboard - That's Paradise (J) [b1] NES -f44c84c330d5d84ec5410ad81e4300e4be9578a9 B Wily & Light no Rockboard - That's Paradise (J) [b1][o1] NES -40bce9f07c099e021bc1a7c73e5cd81de026c630 T Wily & Light no Rockboard - That's Paradise (J) [T+Eng1.1(Megaman)_Interordi] NES -0cedcf804a8fce45e56ec7f4d8be454838589cc2 T Wily & Light no Rockboard - That's Paradise (J) [T+Eng1.1(Rockman)_Interordi] NES -8166ad98dc32344e803d662333bda1b2acc29035 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng(Megaman)_Interordi] NES -479364d2a6bb8db8c3343ce813157a8024a2ab92 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng(Rockman)_Interordi] NES -35993e347372d4496ccc387b5a29f71a1f0bdba2 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng0.10_Interordi] NES +d94557741ae526a0cc7b4a3be5aa4a825baf9a85 G Wily & Light no Rockboard - That's Paradise (J) [!] NES +be4507a270fb3406cd483f2fd4e34da74a22d7a7 B Wily & Light no Rockboard - That's Paradise (J) [b1] NES +f44c84c330d5d84ec5410ad81e4300e4be9578a9 B Wily & Light no Rockboard - That's Paradise (J) [b1][o1] NES +40bce9f07c099e021bc1a7c73e5cd81de026c630 T Wily & Light no Rockboard - That's Paradise (J) [T+Eng1.1(Megaman)_Interordi] NES +0cedcf804a8fce45e56ec7f4d8be454838589cc2 T Wily & Light no Rockboard - That's Paradise (J) [T+Eng1.1(Rockman)_Interordi] NES +8166ad98dc32344e803d662333bda1b2acc29035 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng(Megaman)_Interordi] NES +479364d2a6bb8db8c3343ce813157a8024a2ab92 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng(Rockman)_Interordi] NES +35993e347372d4496ccc387b5a29f71a1f0bdba2 T Wily & Light no Rockboard - That's Paradise (J) [T-Eng0.10_Interordi] NES 49773466c4296d77f0697c073ed66d4fe3375459 G Win, Lose or Draw (U) [!] NES 8f37e6b4dbbfcbb1c9b4e1620f0dd459837e0e06 B Win, Lose or Draw (U) [b1] NES 8993dafeff608f9c2f9a4508ac9e334795ae87be B Win, Lose or Draw (U) [o1] NES @@ -21432,17 +21432,17 @@ f324f1977d4b7840c37821990247993c26fa46fc G Wizardry - Proving Grounds of the Mad 9a7adb06a54e7bccb74583a6217b47e5a9525520 B Wizardry II - Llylgamyn no Densetsu (J) [b1] NES 56fbae974686e83054fafe06e9d8a2b6bbb82ce9 B Wizardry II - Llylgamyn no Densetsu (J) [b2] NES 026ae09c426d6eb689270b384349f20890578a82 G Wizardry III - Diamond no Kishi (J) [!] NES -61ff5043afb71553b21f04378b0e9f3179b5ef81 G Wizards & Warriors (E) [!] NES -5c135a7971013cf6e3a2243bcdd6938cf5ba4b5b G Wizards & Warriors (U) (PRG0) [!] NES -5c8df2859ddc204537fd83cadcee540faacf175e B Wizards & Warriors (U) (PRG0) [o1] NES -59e36195a3fb2a3d5fd3db02cedb0e71b54bb3cd T Wizards & Warriors (U) (PRG0) [T+Rus_Guyver] NES -f1e061a739ed0a1963a357c8df3f19fffd9b77c3 G Wizards & Warriors (U) (PRG1) [!] NES -c6f1bed4cf59c155cd8e03109cefc0f451426450 G Wizards & Warriors III - Kuros - Visions of Power (E) [!] NES -9c04e7357e5b39cfd9d0a119c52102197b4a1be0 G Wizards & Warriors III - Kuros - Visions of Power (U) [!] NES -f4c54e865c9b76e7b96045d285a0b8a81a1e8095 B Wizards & Warriors III - Kuros - Visions of Power (U) [b1] NES -5a5063fa947b0755dfb5f8313e6b7cd0384bb424 B Wizards & Warriors III - Kuros - Visions of Power (U) [b2] NES -7f2093ea1e427e54b42ef0e607f64c0cc4bce2d7 B Wizards & Warriors III - Kuros - Visions of Power (U) [o1] NES -f12e91ee96a101aad014bda73933a053219a33c3 C Wizards & Warriors III - Kuros - Visions of Power (U) [t1] NES +61ff5043afb71553b21f04378b0e9f3179b5ef81 G Wizards & Warriors (E) [!] NES +5c135a7971013cf6e3a2243bcdd6938cf5ba4b5b G Wizards & Warriors (U) (PRG0) [!] NES +5c8df2859ddc204537fd83cadcee540faacf175e B Wizards & Warriors (U) (PRG0) [o1] NES +59e36195a3fb2a3d5fd3db02cedb0e71b54bb3cd T Wizards & Warriors (U) (PRG0) [T+Rus_Guyver] NES +f1e061a739ed0a1963a357c8df3f19fffd9b77c3 G Wizards & Warriors (U) (PRG1) [!] NES +c6f1bed4cf59c155cd8e03109cefc0f451426450 G Wizards & Warriors III - Kuros - Visions of Power (E) [!] NES +9c04e7357e5b39cfd9d0a119c52102197b4a1be0 G Wizards & Warriors III - Kuros - Visions of Power (U) [!] NES +f4c54e865c9b76e7b96045d285a0b8a81a1e8095 B Wizards & Warriors III - Kuros - Visions of Power (U) [b1] NES +5a5063fa947b0755dfb5f8313e6b7cd0384bb424 B Wizards & Warriors III - Kuros - Visions of Power (U) [b2] NES +7f2093ea1e427e54b42ef0e607f64c0cc4bce2d7 B Wizards & Warriors III - Kuros - Visions of Power (U) [o1] NES +f12e91ee96a101aad014bda73933a053219a33c3 C Wizards & Warriors III - Kuros - Visions of Power (U) [t1] NES 175b452b31adac390d5a36c654aaf4de49ec19c9 B Wizzy (Formation Z Hack) [o1] NES eae3e42bc9b02382207f39edfd71b77b5228c4d4 B Wizzy (Formation Z Hack) [o2] NES 2f416726d94f7541709b61a1f1e8a4ae8d2ef14d B Wizzy (Formation Z Hack) [o3] NES @@ -21993,7 +21993,7 @@ f52a4b77d37156db3d470b7a2acf1625d041520c U Zero Pong V3.0 by Zero-Soul (PD) NES 9119581a22ac8fe03a546f0088132eaa55692abd U Zhan Guo Qun Xiong Chuan (Ch) NES 349e2e47a59a14151c190fd687de973f82ea8c69 B Zhan Guo Qun Xiong Zhuan (Ch) [b1] NES 9680484cd6a1aba6164bb07a7b556c1a90b1d9d7 U Zhan Guo Qun Xiong Zhuan (Ch) NES -54b371871d45aad6219e6394ed379dd9db24b6b8 U Zhan Guo Si Chuan Sheng (C&E) (Unl) NES +54b371871d45aad6219e6394ed379dd9db24b6b8 U Zhan Guo Si Chuan Sheng (C&E) (Unl) NES be6140cc9fb99c7ab5388dfe5c7c13fa4cfe2a3f G Zhen Ben Xi You Ji (Asder) [!] NES 902dd1345e1440b4297b1046ce0c2db26fbbca5e C Zhen Jia Hou Wang (ES-1061) (Ch) (Decrypted) [t1] NES af9e06787f450260f9810c3d4a54674f24adea1b U Zhen Jia Hou Wang (ES-1061) (Ch) (Decrypted) NES diff --git a/Assets/gamedb/gamedb_msx.txt b/Assets/gamedb/gamedb_msx.txt new file mode 100644 index 0000000000..e168c54aa9 --- /dev/null +++ b/Assets/gamedb/gamedb_msx.txt @@ -0,0 +1,28 @@ +#include gamedb_msx_msx1_rom.txt +#include gamedb_msx_msx1_dsk.txt +#include gamedb_msx_msx1_cas.txt +#include gamedb_msx_msx2_rom.txt +#include gamedb_msx_msx2_dsk.txt +#include gamedb_msx_msx2_cas.txt + +;;;;---------------------------------------------- +;;;; Currently the above gamesdb files are generated automatically from TOSEC dat files +;;;; Each file is commented automatically and split up first into the various files that were imported, then by RomStatus +;;;; +;;;; NOTE TO DEVS: +;;;; Any overrides should be placed below. +;;;; Bizhawk (I believe) takes the last entry it sees when duplicates are present, so this should work. +;;;; +;;;;---------------------------------------------- + +;;;;---------------------------------------------- +;;;; Overrides (dont edit the included files above directly!) +;;;;---------------------------------------------- + +;;; BAD + +;;; Actually GOOD + +;;; Actually TRANSLATED + +;;; Games NOT present in TOSEC \ No newline at end of file diff --git a/Assets/gamedb/gamedb_msx1-L.txt b/Assets/gamedb/gamedb_msx1-L.txt new file mode 100644 index 0000000000..1dd7ce0981 --- /dev/null +++ b/Assets/gamedb/gamedb_msx1-L.txt @@ -0,0 +1,941 @@ +;MSX SHA-1 +FC71561A64F73DA0E0043D256F67FD18D7FC3A7F [BIOS] Kanji Rom - JIS 1st Class (Japan) MSX +33536DAC686B375BA13FAF76A3BAF2D6978904E0 10-Yard Fight (Japan) MSX +FD15698518172BCDE3318F08EE032531CBBB9F5D 10-Yard Fight (Japan) (Alt 1) MSX +0733CD627467A866846E15CAF1770A5594EAF4CC 1942 (Japan) MSX +DA397E783D677D1A78FFF222D9D6CB48B915DADA 1942 (Japan) (Alt 1) MSX +F8164D3872B5D54EAEAFC6DE3BB98A472F0C828D 3-D Golf Simulation (Japan) MSX +9A63D48C4FC05E76C9DE25E5C5F2A0C99B5D1BE4 3-D Golf Simulation (Japan) (High Speed) MSX +6FE8C1725C35D85A5E489C0C8D21134DEF09ECFB 3-D Golf Simulation (Japan) (Alt 1) MSX +8F71DDDD429173DF7CE52C5245AF1A76B482A901 3D Tennis (Japan) MSX +6B8A684DDBADD798A8E599449B823BCECA9CDB58 A.E. (Japan) MSX +937464EB371C68ADD2236BCEF91D24A8CE7C4ED1 A1 Spirit - The Way to Formula-1 (Japan) MSX +CB48969F27EAEBF24C61F651399EC2433D85BCBC Actman (Japan) MSX +3CA4A1AB35B3CBE3DDB238CE88CA9DF258AE37D6 Actman (Japan) (Alt 1) MSX +AE0C0B0C9468E137EBA5B52F96241ACD55D9746A Adven' Chuta! (Japan) MSX +EC5111E3B06D64EF51196FF87448E1C62BE4CDD8 Albatros (Japan) (Alt 1) MSX +13D38CC80112BAA9BCBF03569988C163015D434C Albatros (Japan) MSX +807676038CBBA043B8099EBA9C5840A4811A7E59 Alcazar - The Forgotten Fortress (Japan) MSX +F3815211C6183B4F9C26B9E7D0A12C3B3870BDDA Alcazar - The Forgotten Fortress (Japan) (Alt 1) MSX +639CB280544B060A618AF23DAF234A44BAAF88DE Alibaba and 40 Thieves (Japan) MSX +ACC14E9886A3281B658DC458C1AE93FA9F24DB04 Alibaba and 40 Thieves (Japan) (Alt 1) MSX +41B3B1830084EF00B61339C46C96BD0EF62CD6D3 Alibaba and 40 Thieves (Japan) (Alt 2) MSX +3DE0CEA6A4575E631FEE0DB985E0F0F584761980 Alien 8 (Japan) (Alt 1) MSX +5FB90BE078E432DB92DD39E621D12F612DBEA4A8 Alien 8 (Japan) MSX +2639792DF6F7C7CFAFFC2616B0E1849F18897ACE Aliens - Alien 2 (Japan) (Alt 1) MSX +5380E913D8DAC23470446844CAB21F6921101AF8 Aliens - Alien 2 (Japan) MSX +0D9C472CF7687B86F3FE2E5AF6545A26A0EFD5FC Aliens - Alien 2 (Japan) (Alt 2) MSX +627E4D311DFE8A43A629E63F444A6F41EEBAD835 Alpha Roid (Japan) (Alt 1) MSX +97E7D0EE40C7D6CE1A8EDF7B06E5014E6745CFDA Alpha Roid (Japan) MSX +1D81E6CC165B3330B9B3C8B4F4DA0417B1AB901E Alpha Squadron (Japan) MSX +FD6CC08D4842A85A3C741CF9C30883DDFC378895 American Truck (Japan) (Alt 2) MSX +88FA967C420F7090A11E5DE1D3674F4527F53D52 American Truck (Japan) (Alt 1) MSX +076ABC988D51FAEF30143750DD41318A8A48C5C4 American Truck (Japan) MSX +27C40EC7013C1AD1F9A7E1AC1E0C8BE99F1E703F Anaza - Kaleidoscope Special (Japan) MSX +A1ABFC53A36D387B9F0687E3F5897C1EBDF21517 Angelo (Japan) MSX +3A4A65DC6D540297A7AAE0A9914897AACF740807 Angelo (Japan) (Alt 1) MSX +495876C504BDC4DE24860EA15B25DDA8F3B06C49 Animal Land (Japan) MSX +E894A38F3E2AD435CC5D17A66600E6016B5E47FB Antarctic Adventure (Japan) MSX +44DEAEF747C572A4550681FCCCC1BBBDC46A1FFC Antarctic Adventure (Europe) (Alt 1) MSX +2185BE579CB51729F66BF02BDF3A7B6A3CBD7B40 Antarctic Adventure (Europe) MSX +F236345F43828597739F4A326318B6A3876FF73F Anty (Japan) MSX +1A00EEF3DF449D71ABF4BE5A4C8D01BA9DCD6B79 Anty (Japan) (Alt 1) MSX +633CB458EEAB0FEA59A70A9A620B7783A44EB0A6 Aqua Polis SOS (Japan) MSX +93462AC9A322C2E5E0D996FDDBE9EBA2F3436931 Aquattack (Japan) MSX +EC53D72E41E114574F4C116CAB19E1633F3DA207 Aramo (Japan) MSX +45CE64A455A2B07F3C8A6D541CDA3B0E058CC732 Arkanoid (Japan) (Alt 1) MSX +E1527AE16D33A09D9CF3D4EA52E63337D2273910 Arkanoid (Japan) (Alt 2) MSX +5002BA598469B34AF25BFF5011CCC70ED3723B0D Arkanoid (Japan) (Alt 3) MSX +2183F07FA3BA87360100B2FA21FDA0F55C0F8814 Arkanoid (Japan) MSX +FBE43D67A5BC0AEDB2E194A4E5F9497B7488362B Athletic Ball (Japan) MSX +90BDD12D632D2E909AC5D69235AD0366F430B734 Athletic Land (Japan) MSX +DE9EB0E9EF183F49E9D9B631F8818F9CAC5DF409 Athletic Land (Japan) (Beta) MSX +866CB3AB10F17E4FB356FBD7277BBF17C4E27EBE Athletic Land (Japan) (Alt 1) MSX +C5F1897C416F62CD58CD6257282E3428155CD698 Attack Four Volley Ball (Japan) MSX +4C8A97669017296C2360FF9D53694A292197991E B.C.'s Quest (Japan) MSX +0D504C359661AC731DE07A7319AFD0E31F01A5D7 B.C.'s Quest (Japan) (Alt 1) MSX +C345357E71D1B8F2C9663BF28ABB5A3A2957D49F Back Gammon (Japan) (Alt 1) MSX +2B8878609BCC0D1555AE250D621BA6E9DF4AFC52 Back Gammon (Japan) MSX +469B07EEF08348C9ACC14E63BA0CD35AEF236983 Back to the Future (Japan) MSX +1A6A751334C663FBFDF93F617A7D779F76F488CE Back to the Future (Japan) (Alt 1) MSX +363B5A8C94CDB63A7EE72B9D25F7B5053CAB319A Backgammon (Europe) MSX +CD452442338366411F6B24739FE59E20F3AC24DC Balance (Japan) MSX +B103D4248729AEDA9EBF5766C1791B1950246968 Balance (Japan) (Alt 4) MSX +28323E06A402747A1E131DC30CE031A339F6C947 Balance (Japan) (Alt 3) MSX +134A6FAF1592978608B55269AEA101D5FAD68760 Balance (Japan) (Alt 2) MSX +6D73EE99AC367A2558FD9366AF75AD39ED0D4E69 Balance (Japan) (Alt 1) MSX +7A40237867F62611D0E976666451648EDB80753C Banana (Japan) MSX +B0956B97C9087AABAB333C271C7AFD9754AE84CD Bank Panic (Japan) MSX +B337EA56278523F984D1B000CD00F339D82017A0 Bank Panic (Japan) (Alt 1) MSX +9F0CBB1191235ECCA4985DE976A0993744B57930 Basic Lessons 1 (Japan) MSX +01CF858888F5A0D3AEE08F42A66C515AB0D06400 Basic Lessons 2 (Japan) MSX +709FB35338F21897E275237CC4C5615D0A5C2753 Batman (Japan) MSX +EE7DBD36A2B0BBAE11C68AC4DE75077F283BED05 Batten Tanuki no Daibouken (Japan) (Alt 2) MSX +F86A7945B34C97CC58D5EE27964968870BFCEF93 Batten Tanuki no Daibouken (Japan) (Alt 1) MSX +9B58C70B976CA1D841185DE862E7D663EC9DB56B Batten Tanuki no Daibouken (Japan) (v1.03) MSX +8B63F36BE31D7D021C19103EBE8C68B69AAE699C Battle Cross (Japan) MSX +0F214EA9E8D673EE0C66CB6615032E57920D588B Battleship Clapton II (Japan) (Alt 1) MSX +59BC608B1CB5BDE2230BCA0EB045CD6C58650774 Battleship Clapton II (Japan) MSX +1BDB1898796E2B48B62A356035192B163113962C Beach-Head (Europe) MSX +1231984AE24BF35F9F38596B864420D8CCD3F30B Beam Rider (Japan) MSX +F51F936887498D21F6EE9FE8A7701633BE67E79D Beam Rider (Japan) (Alt 1) MSX +01EBDD5981C4841ABDDF6F76EB1F73E237E7688F Becky (Japan) (Alt 2) MSX +702D8F1762D4EFE994F520E21E8867ADAE13B817 Becky (Japan) (Alt 1) MSX +D69D4A6F2834B20DF3A2AFBD7A927220E96E31E1 Becky (Japan) MSX +3197D73A5400A72420F91DEF6D3AA8BDCB392754 Bee & Flower (Japan) MSX +250D4C7C6565B0C4935F6301E8DE2C182E659FD0 Bee & Flower (Japan) (Alt 1) MSX +A2DE457567E87C794FBA8E35C992EAC352DA78BE Bee & Flower (Japan) (Alt 2) MSX +4806E6BC1FD24D5A62C6DF57EA8FD1B51D6E4B80 Bifamu (Japan) (Alt 1) MSX +EBFF5D2B4253F62D3A00F1A6D6B4D81053C7B8A6 Bifamu (Japan) MSX +EF476E25FB6B7221CA778A379117885450DD36F0 Binary Land (Japan) MSX +2588B9ADE775B93F03FD4B17FD3F78BA70B556D6 Black Onyx II, The - Search for the Fire Crystal (Japan) MSX +5400C0C929B31A70E76AAC676B91D40445F1B427 Black Onyx, The (Japan) MSX +65AF16D35B8D8454EC07718E9F8948335CA73BAD Blagger MSX (Europe) (Converted From Tape) MSX +8E3E05E8928B5B77FA61F3B833E164BF5222A5FB Block Hole (Korea) (Unl) MSX +BD4B8C48F1D8107F11AE680A787D7B3825669B7C Blockade Runner (Japan) MSX +E2EF32F2FC312F96B8424569E9E85A6EA3B21CE4 Boggy '84 (Japan) (Alt 1) MSX +5C96169207E197237AA728D8CE4E24C0635D5904 Boggy '84 (Japan) MSX +04283AE02107917DA6F54A0F38D3A28254F7AB69 Boggy '84 (Japan) (Alt 2) MSX +D7E2A4F78B3E240309C6367AC9DD9C9AEB95E3EE Boing Boing (Spain) MSX +E5171C368883DE03FC8D75E61BF23D954EC1BBA4 Bokosuka Wars (Japan) MSX +5503D23FAF94F076410D252F69F6BF5ECE4DA292 Bokosuka Wars (Japan) (Alt 1) MSX +482CD650220E6931F85EE8532C61DAC561365E30 Bomber King (Japan) MSX +5324E053709FF8DA6C18AE4AFBA6A2E0C3A722BA Bomber Man (Japan) MSX +E700493E1C4C14F711E9C1C262FE3E8D76931CA3 Bomber Man Special (Japan) MSX +0B3241202F0E2BE470E5F2E6139C01983A895BC8 Boogie Woogi Jungle (Japan) MSX +05B7A1DB1FF15F712E619FD1C79FD7710E93CB3B Boogie Woogi Jungle (Japan) (Alt 1) MSX +86F8E3250CDCBADCCF131255A1EF59ED291BE8E9 Boogie Woogi Jungle (Japan) (Alt 2) MSX +EF535AB6013D9B6E38227272F2EBE6A0F0B33CB5 Boomerang (Japan) MSX +DA7CFD16DD1A76AE6B551CEABFD7053CA8E3412F Boomerang (Japan) (Alt 1) MSX +16C3CED0FB2E360BC7C43D372A0A30EB6BD3963D Borfesu (Japan) MSX +451CBB072011B26A7E0BC9931E67995A71F5FD6F Bosconian (Japan) MSX +33AD6D1BF1FB816B232EA706D149327E363C7B21 Bosconian (Japan) (Alt 1) MSX +0BF7B432DC132F9A7BC74106261BCA07D5F99690 Bosconian (Japan) (Alt 2) MSX +B15E73A5FF1AE17AC67F2CEBB5862D5E5BD80BC0 Bouken Roman - Dota (Japan) MSX +1FFEF57E6C06068B330027294AAE173103C8F141 Bouken Roman - Dota (Japan) (Alt 1) MSX +14FAE375B81C86F71E872ADCA792C23AAFAC66A0 Boulder Dash (Japan) MSX +F1F571C1D9360839450C26D73C6AEF89E1E052EB Bouncing Block (Spain) MSX +B76FFB94A08457DF0A51897CD87CD8A91610224C Bouncing Block (Spain) (Alt 1) MSX +208CE6CBFF7402BFE52B1062E6B10AE09C0A3179 Brain, The (Japan) MSX +BCFDB43B275C62A76856AAB94FB1B53BD92B2DB2 Break In (Japan) MSX +3D065377F11B23410282B6B76F26BD93B9D05184 Break Out (Japan) MSX +C64F2FAD6417C64595BC204D843527E17A58776F Brother Adventure (Korea) (Unl) MSX +6F9B4D791F4A43D7182650F21A7BFE88D1C5C2B4 Brother Adventure (Korea) (Alt 1) (Unl) MSX +621EA075A534584361C9E9D640E39007A79DFD78 Bruce Lee (Japan) MSX +D1ECE8B5FFEB9B99230E640AF32CB488FEE51E35 Bubble Bobble (Korea) (Unl) MSX +58551545E73C838A2E995E6951AB644ED2590786 Bubble Bobble (Korea) (Alt 1) (Unl) MSX +CE1376941359471CAE41887FE11F10D3B696A926 Burgertime (Japan) MSX +613C741535C92DFB01AFEC4135EF8EBDDB49F999 Buru To Marty Kikiippatsu - Inspecteur Z (Japan) MSX +B755D7DB109CD0A9392ACCD1C83E6D995A8A04D6 Butam Pants (Japan) MSX +2F7FF0438F1A8D80292C9E1CB8D77A92C600B505 Butam Pants (Japan) (Alt 1) MSX +E6A1D90A7A8B4E4B8A8E1AFB3D971866931B986D Butam Pants (Japan) (Alt 2) MSX +CD69CE70747BC0DEEBBA9FD307A07F5DFB926CC3 C-So! (Japan) MSX +2A0F9899A4D8DBA76DB501D6E3435546CC7CD9AA Cabbage Patch Kids (Japan) (Alt 1) MSX +C06DE0EDA82E1DAA3EA3CBC5EBA5D884FD0CE8E8 Cabbage Patch Kids (Japan) MSX +69710F4B9CC3440E58C54BD4C562B3E90FF323E0 Candoo Ninja (Japan) MSX +77F3F6758BD4CF5D2B44C51DE958AA967C41A9D7 Candoo Ninja (Japan) (Alt 1) MSX +D32279E01FB5762778D696ACC2053B9503D5A715 Cannon Ball (Japan) (Alt 1) MSX +B36C925005F1E530CAB2B5F6E2A5DDFD182C0140 Cannon Ball (Japan) MSX +31D80470C8D23EC8B14256AA32F3D54DBC532D76 Cannon Fighter (Japan) MSX +F025C9C2DB97DCE608FCC1050426BEFF0DEA43EB Captain Chef (Japan) MSX +E93C396649BF6328103E8DA0247952EBEF2A04E9 Car Fighter (Japan) MSX +11E2F95D1B58E1244EFDA761603A2AE6D0090D18 Car Jamboree (Japan) MSX +8A158CDEC0923B81CE13AF2DFFA5D1B7E096A469 Car Jamboree (Japan) (Alt 1) MSX +97AF4F422A283AC8BA387EB0B1B29395C2C966EB Car-Race (Japan) MSX +AB7354C9CED9782D572C4DD69249B76A1244E5CE Car-Race (Japan) (Alt 2) MSX +E7396AD700F7EDF98CC2B0EC2E6127A68D3CD9BA Car-Race (Japan) (Alt 1) MSX +5B17CB69697CF55DFF1F0B8777E19D5ABC1771FC Casio Daishogai Keiba (Japan) MSX +CAD653766B597A4AA130A9A1956ECE77BA4D52BC Casio Pachinko-U.F.O. (Japan) MSX +17D6DB13D7D76FBD110F53B168AB0001C7E65817 Casio Ski Command (Japan) MSX +FE53D85ADB758103097FD56132E71C7F4CB32313 Casio Ski Command (Japan) (Alt 1) MSX +0A2209E0A71684493998F6618AF032BA580D4FF9 Casio Worldopen (Japan) MSX +811DCA8FC14A2B00F503FBEF74FDEAE4F2873D4C Castle Excellent (Japan) MSX +D55E9E237504BC6444C6B62894BF88292150042A Castle Excellent (Japan) (Alt 1) MSX +615C08820B926E28B143CD7812852E011D3EEFFB Castle, The (Japan) MSX +B6F10B6BEDC26D9415335997493139CE7A2C7916 Chack'n Pop (Japan) (Alt 1) MSX +0B9A870D1E6CC712A3EFCE2349FB1C1CF6902D22 Chack'n Pop (Japan) MSX +3ABAE41CB742B76FF45DD178BD7DB346137FE0FA Challenge Derby (Japan) MSX +39CB046A9B6B6EF4E769CDC6FDF36B274CD44039 Champion Boxing (Japan) MSX +EBB46DD4CF36407AD82D9F50D9BEF3E938DC144E Champion Ice Hockey (Japan) MSX +F9E9A6E517EE0B9B3147ABB6144B31ED2CA8DBDA Champion Kendou (Japan) MSX +A502E37F580BD287ED8338FCB1D809B8DC90BBE0 Champion Kendou (Japan) (Alt 1) MSX +AF1A6F4DD12D726A7A4377753CE3DB82BF24EBA4 Champion Pro Wrestling (Japan) MSX +D1E3AFECDE1656099DADFF99C6ED2AA8FA6DD834 Champion Pro Wrestling (Japan) (Alt 1) MSX +0C364C3499DF76F2E15D2AEB744A0DE3730FF47B Champion Pro Wrestling (Japan) (Alt 2) MSX +821C611B851DDD4CF8CFB4E77CECBC882F12EB72 Champion Soccer (Japan) MSX +650381B96F36E74A4EAF5AE3F924F6F8DEAC7100 Championship Lode Runner (Japan) MSX +A4BE5763CDF2DCD647B87E3AECBAB28ECC69776E Checkers in Tantan Tanuki (Japan) MSX +DD5C2D2D5F0947159B7615F647FB8121F3B037A2 Cheese (Japan) (Program) MSX +2C0C71C549738D668518DB317DD70AECEFD4AA72 Chess (Japan) MSX +20AEB411AB5ADB9BD3DB412A7837E496969F8CE3 Chess Game, The (Europe) MSX +A2A7C93C9C8B55A5CCE4C9005F3C194E3B762E9C Choplifter (Japan) MSX +30673D173F96FE1830E579F18DAF8AC9FC3366CB Choplifter (Japan) (Alt 1) MSX +B3CA70C8C8120F8261BB865BAF5F57B6506CA02E Choplifter (Japan) (Alt 2) MSX +99F9E9753EDBAEE820E36A1A58F1CD7AE2B26265 Choro Q (Japan) MSX +EE3CA231328534BBA92F9A908C4FAED865BCEA68 Choro Q (Japan) (Alt 1) MSX +20CE189D670C0FE5F2A945D73107DF7D83070FF7 Chugaku Hisshu Eibunpo 1 (Japan) MSX +AE6D0EFD55DEF94274F4CEC459DF8927D132675A Circus Charlie (Japan) MSX +07AF8B1EC0786C44778F68EF3BB0B3D4793F42E3 City Connection (Japan) (Alt 1) MSX +0071B2EB214FF002DBBB7532653585B35B56F243 City Connection (Japan) MSX +308C73FC04C3B390B72EA8D4980C94C74BA38A5C Coaster Race (Japan) (Alt 1) MSX +17F24B9339291DEA40D2ED36517F223B9E4F49E1 Coaster Race (Japan) MSX +47EA8D512D9FEC15DF8770F3B5017AEA9BBBA9FD Coaster Race (Japan) (Alt 2) MSX +AC391FE51F69E0A55FE3AB66C8EC3F2792DD5D08 Color Ball (Japan) MSX +83FDAA429AD8B155AB2328A72FCB8DE642FF5615 Color Ball (Japan) (Alt 1) MSX +95D8A590BAD595F9441AEA4BF68667DE05B1B34B Color Ball (Japan) (Alt 2) MSX +9B4DA7636809D5690D6BD5D782FFA3CF9F4C63EC Columns (Japan) MSX +1CF39E12313FF3064353C136262F176A56AB20A6 Come On! Picot (Japan) MSX +546AAF36EE78717FE06125185F0D420FDFF0D34C Comecocos (Spain) MSX +A054DDEAF471212764CC596BCBD30E94B10E6C28 Comet Tail (Japan) MSX +FC327D3946366CA75DE0D0619EB0917A27E1BD61 Comic Bakery (Japan) MSX +D2604A1F76CADD36EDE570E23AD49B0885187E25 Comic Bakery (Japan) (Alt 1) MSX +8CF06F93D4E8BCF7BE04AE8532F72E6EEC8BA2F1 Comic Bakery (Japan) (Alt 2) MSX +630AEC6F93DF8D1EF83C52A0BB6EC571B9C6EED4 Computer Billiards (Japan) MSX +1FC9D3B54A617E57FD6ED10F2CE3C01456710E37 Computer Nyuumon - Computer Lessons (Japan) MSX +BD8F335FC45E9920F0691A525A0FC853B2E4B595 Computer Othello (Japan) MSX +81C50AF8EF09E0B7A8A69FD4715592B5E803CDB5 Computer Othello (Japan) (Alt 1) MSX +99D3EF107F2AC4D452B05EB96B922924EF4C5434 Computer Pachinko (Japan) MSX +09CC29B413DC7B8747420615BF798169AE68AD14 Con-Dori (Japan) MSX +868D84F8A6AE0434BF86ADFBB86996CEDDEFBA84 Con-Dori (Japan) (Alt 1) MSX +8592B14EE701EAAF433113A26B199084C124992F Con-Dori (Japan) (Alt 2) MSX +9865F0BC4D54137809F0D8B48D5461DDF0C5BF4C Confused (Europe) MSX +5AD0BA434407A7EEECB597B3D20BCFC6FE05C319 Cosmo (Japan) MSX +BB7468DD32A160851B39121D24713B0B4E065C19 Cosmo (Japan) (Alt 1) MSX +0AC6C061C3897A3989DCD75B4878C850C71E4BB8 Cosmo-Explorer (Japan) MSX +B6F8E1431BDA1296C2959B10B021B80E0FF2A8A2 Cosmo-Explorer (Japan) (Alt 1) MSX +613CC52FBD5822ADE47DAA3EC21479641A009C2C Courageous Perseus (Japan) MSX +6CF3F098D592D7DCB767A0E24B5CAF327B5F22DB Courageous Perseus (Japan) (Alt 1) MSX +9E0312E72F30A20F556B64FE37DBBFE0D4471823 Craze (Japan) MSX +FF5B12275950EDAE9ECE3F49ED59402D47F23B1B Crazy Bullet (Japan) (Alt 1) MSX +5D5DFE6CEC605DE421C3AED3A743D6840FEC1457 Crazy Bullet (Japan) MSX +76C191BF7DCC0888D65E543C47F615AE45B75B92 Crazy Cars (Europe) MSX +8ACA0EE5845B0B39AF624E8A998BB04F02D0FDA4 Crazy Train (Japan) MSX +31B452FF42624C6AC1E0141D65869DF1EABE5BB3 Crazy Train (Japan) (Alt 1) MSX +BB902E82A2BDDA61101A9B3646462ADECDD18C8D Cross Blaim (Japan) MSX +C6F090882886DCF783E5B65BFF75C5E034FBB2EB Crusader (Japan) (Alt 2) MSX +3D2D0A2EB3D12FA67ECBBB90B7AC1BDC76AD8412 Crusader (Japan) (Alt 1) MSX +D0E8BC3F5FD93DCD07CBB945B00018A491842242 Crusader (Japan) MSX +18E87E15B09EC2FDDC52FAD10EDC57918FADEC34 D-Day (Japan) MSX +BA325451FB5A80C2872742C5BD61E7BB75C5763B D-Day (Japan) (Alt 1) MSX +C62E058C2A54F3C9ADBA2E6A3006B8E749C43BD7 D-Day (Japan) (Alt 2) MSX +0BA8AE697F3045B3B3175B27D00AC0E522288FF1 D-Day (Japan) (Alt 3) MSX +27A487E56721E947C1F46644F2F8A50156DDA82D Daidasso (Japan) MSX +2418C0302ABBCE8B0F8556B63169C60A849F60EE Daiva Story 4 - Asura's Bloodfeud (Japan) MSX +D8C074267E0B2EC225D5ACBA688EA7304233DA13 Dam Busters, The (Japan) MSX +0738FEFA62BE2ACBD0F324F28538BBA9551406AC Dam Busters, The (Japan) (Alt 1) MSX +6A4E8325D2174747D56CBE4C6803CBF40EB40A62 Danger X4 (Japan) MSX +7C618058809302BC3553D6189BCF310F2E5B0E08 Danger X4 (Japan) (Alt 1) MSX +50EAFA5D735AF5B34D14F9F6B8C2D9CD2F0441DB Danger X4 (Japan) (Alt 2) MSX +4B19979E01BAB2289ABB6034CB3C2D02C2E890D1 David II (Japan) MSX +6856A13B67750D36C4C466D30472DC5465879BBF Dawn Patrol (Japan) MSX +A1656F612360A126E09EF2BAAA8002D92054125D Decathlon (Japan) MSX +5D43CB6CA89F31D5F543E4DCD3FA9987B9769602 Decathlon (Japan) (Alt 1) MSX +E6419519C2D3247EA395E4FEAA494A2E23E469CE Deep Dungeon (Japan) MSX +D82135A5E28B750C44995AF116DB890A15F6428A Deep Dungeon II (Japan) MSX +6BAD9AF91907C2A97FA2F4B9DD2A699CE0D70FBA Demon Crystal, The (Japan) MSX +D5B164797BC969B55C1A6F4006A4535C3FB03CF0 Demonia I (Europe) MSX +4B4A58A310A1138B95192D7FE0881BBDC45601D4 Designer's Pencil, The (Europe) (Program) MSX +91BA5C063D0ED383165B26E4609D7ABDA02A5242 Devil's Heaven (Japan) MSX +6E2E5CFF4EE4DD935FBE6684F2C54B39ECA06092 Dig Dug (Japan) MSX +E3391DAAB17710B3F34C70F60AC6C8BFEA15B6CC Dig Dug (Japan) (Alt 1) MSX +7DC7F7E3966943280F34836656A7D1BD3ACE67CD Digital Devil Monogatari Megami Tensei (Japan) MSX +03B42B77B1A7412F1D7BD0998CF8F2F003F77D0A Digital Devil Monogatari Megami Tensei (Japan) (Alt 1) MSX +65F89C813A1D57A8F8A04E81682202F759EE6980 Dip Dip (Spain) MSX +6B12BB291E1A98A43CCFF8CEB94D23585848FEBC Doki Doki Penguin Land (Japan) MSX +23531B4E8A2B3E975483318846CF89E65F32F7D1 Doki Doki Penguin Land (Japan) (Alt 1) MSX +F8FEEAC4384BC4F109C70F962E15CE925BF70C13 Doordoor (Japan) MSX +19C610339C0480C3D2D0D1C21E3CCBF2179BB191 Dorodon (Japan) MSX +6724B2ABCE8145609333C8B2964DE0F1A90D9CD5 Double Dragon (Korea) (Unl) MSX +6E6B8CDC55713EABC724F3EC9624E9884254AB33 Dr. Copy (Japan) MSX +533DC6D28CA60C090740879DCB3CFA386544EE45 Dragon Attack (Japan) (Alt 1) MSX +761AB0AA7F528BF0F51EA9DE75C847EA949478D7 Dragon Attack (Japan) MSX +7B94A728A5945A53D518C18994E1E09A09EC3C1B Dragon Quest (Japan) MSX +3DF7C19F739D74D6EFDFD8151343E5A55D4AC842 Dragon Quest II (Japan) MSX +D7B46AECE68C924E09F07E3DF45711F337D35D6A Dragon Quest II (Japan) (Alt 1) MSX +397716D26A075C6D731F0B04F3FA24AA39521798 Dragon Slayer (Japan) MSX +6C1814C70D69A50EC60E39EF281F0B8CD7BF8598 Dragon Slayer II - Xanadu (Japan) MSX +F100A76117E95AB0335E89A901E47D844BBC0AB6 Dragon Slayer IV - Drasle Family (Japan) MSX +2F0DB48FBCF3444F52B9C7C76BA9C4BD38BC2A15 Dragon Slayer Jr. - Romancia (Japan) MSX +E34161034364EF03DF907D62976C2AC8F551404F Drainer (Japan) MSX +9B815EFAA927C11827ACFDB0F9B9197B5AC97572 Druaga no Tou (Japan) MSX +D1FBDBDF2E830139584D7DC796806AA3327720DD Dungeon Hunter (Japan) MSX +353E2BD901E5502375DC92A04E1686C1192FCF42 Dungeon Master (Japan) MSX +F63D274A8A7AD8E285DD8800264AB9C14AA9F870 Dunk Shot (Japan) MSX +E7D9D1E4DCF48779DAB41EB6C15478F934BD8BC1 Dunk Shot (Japan) (Alt 1) MSX +C20DEF84EFE71EFDF91DF3100919D151B2E7BDC1 DX7 Voicing Program (Japan) (Program) MSX +D7109CF20A22558F923C833FF0B4E2311340ACB1 Dynamite Bowl (Japan) MSX +D916F0E4BD3C829A0472C6EC18D08907A5C991F3 Eagle Fighter (Japan) MSX +83FED4090D0942C8E0054437745C1C0EBEFC6222 Eagle Fighter (Japan) (Alt 1) MSX +28BF2354CDD70E30B682F40B734029ECE44D70BD Eddy 2 (Japan) (Program) MSX +20F1883C45FC3C39DDF48A7DE69B6EF588FAC8FB Eddy 2 (Japan) (Program) (Alt 1) MSX +E49F66E8BA45D0647C93A57BBC1FB7ABA4665A6E Eggerland Mystery (Japan) MSX +473BC0EA85ED1B218974796D819416E711AC193F Eiwa Jiten - English Japanese (Japan) (Program) MSX +6CBDDD118AFE63E79CB8A40F8AA879DF1C7590E1 Elevator Action (Japan) MSX +7DE755F98B6A68886E61473D524D0AA6AB6577D7 Erika (Japan) MSX +7F6906FF7017A558952197198AC7A1C1E222ED9D Exa Innova (Japan) MSX +A14B357A1B16163F5FFA96B0B617D352713AC047 Exa Innova (Japan) (Alt 1) MSX +B5B28F53B16D43742D9D7DAF5EE7DCF74B80E6C8 Exchanger (Japan) (Alt 1) MSX +DED8D969542B7BE02524037FA244E6648C3F4E03 Exchanger (Japan) MSX +8ECC34EBFF9D37C0FE9560CFDC53A052CFF3D1AB Exerion (Japan) (Alt 2) MSX +975FDF521C08030896EB50AF4F39A23500EAF7AC Exerion (Japan) MSX +09B0EA7C5595F4E9C9A15219F30E3423BBC25F66 Exerion (Japan) (Alt 1) MSX +2B36FE2B0D98D65AB31F13FCB858DB6858A51D46 Exerion II - Zorni (Japan) MSX +AA1621A6B61F7CFB2DF8DD2CF8647A943E13DFA7 Exerion II - Zorni (Japan) (Alt 1) MSX +3137E676C37195D46FE6ACC4395D0DC4D711D919 Exoide-Z (Japan) MSX +06BFDD6D0F0D84B1D534C81B27150193969168B3 Exoide-Z (Japan) (Alt 1) MSX +91BEE8AF612F69C5413A1D23102CC5EA896C2CAA Exoide-Z (Japan) (Alt 2) MSX +22C7ABE6C8F4B7897ECB583D4913D35B5F62C5E1 Exoide-Z Area 5 (Japan) MSX +42FBB18722DF3E34E5B0F935A2DC0CE0D85099E9 F-1 Spirit - The Way to Formula-1 (Japan) (Alt 1) MSX +FF72A1788D47F9876D9FABD720F6A289FB409090 F-1 Spirit - The Way to Formula-1 (Japan) MSX +5C7A13B64B48065231F05C35B4C8B209534F3A8B F16 Fighting Falcon (Japan) MSX +A469935DD39A856C06676817F51B403A3678AC1A Fa Tetris (Korea) (Unl) MSX +EDD61208E11149E226CD2EDDF5C9ECA8EE1BA33E Fairy (Japan) MSX +E11AFC03DB4E1D03976D02796B29DA9C65D4FF3D Fairy Land Story, The (Japan) MSX +2BB837A9051277BA574D8351A9F91F9E57033074 Fairy Land Story, The (Japan) (Alt 1) MSX +216243B4BCB9070F9E86C3F04EDAAA493E4B459C Family Automation Language Community (Japan) (Program) MSX +8557DCDB4CF1E15180D17ACC8E6D515BF7BF7E7C Fandom Library #1 (Japan) MSX +7752B6624FB80D9499AAAD28DD5776EC74565576 Fandom Library #2 (Japan) MSX +C2F4DF1BD91F7DEE1536774B9D7089086B9BF835 Fandom Library #3 (Japan) MSX +048737F995EECB1DD8DD341D750EFD005267796F Fantasy Zone (Japan) MSX +E6B71484D5AB578FD3695917FCE3C1E805A5B536 Farm Kit (Europe) (Program) MSX +AE52922A197A2F47C7FC4ADF9DBFDE13C136ED14 Fathom (Japan) MSX +43DBCC9536FE61C8172ECEEEC1481778F7A2B9BD FB-01 Voicing Program (Japan) (Program) MSX +D833C66DD541239908555762E04BCBB22BCA748A Final Justice (Japan) (Alt 2) MSX +9BCA89C71C033BB9A85EE30CF75960EC839C0462 Final Justice (Japan) MSX +1E70296A07A5FF62D01E5115B8C8B87F891585C9 Final Justice (Japan) (Alt 1) MSX +D086280DEA7FB10FABAAE26ED9D404BBE69C70C4 Final Mahjong (Japan) MSX +A553C3F204C105C23B227A1E5AEB290671CCDBEB Final Zone Wolf (Japan) MSX +0889CA383BCF24198DB1FB2DD23DEA1BF8C18BE8 Fire Rescue (Japan) MSX +EC0320EDA10BF6BBEE8081F6672A7BF9D858C1BB Fire Rescue (Japan) (Alt 1) MSX +40C626D8C53E2E2D4E7E25D55AA2C11C2645780F Flappy (Japan) MSX +6F391D0408223138B7927ED719D7AC1B6C38CA0D Flappy (Japan) (Alt 1) MSX +46F3954D7F92F5D00F45B82FDDE543C28A4B53C9 Flappy - Limited 85 (Japan) MSX +DE95B99DFFEAB5C2B453778DBDC8723DC15CBFD7 Flash Point (Korea) (Unl) MSX +A3FC0A55A91ED0041221F8DA788D824D9D795913 Flash Point (Korea) (Alt 1) (Unl) MSX +60F685670DE6D2D8ED5F1B1DDD40FAC851FF1982 Flash Splash (Japan) MSX +5999CC1407AFE5BA8A760F16178C4CAC9C3FA192 Flicky (Japan) MSX +7BF28813FB11E9DB3BF78CC73EE5FB2D76B547DE Flics, Les (France) MSX +3EEE7C72362522C27866D4367A8CF1E22932DB32 Flight Deck (Japan) MSX +488F01314DA5644FBF2CA938C6F9720EF2B0D0F9 Flight Deck (Japan) (Alt 1) MSX +453EAC7568D5D04C8CF7DA86F2E8DC79777343DA Flight Simulator (Japan) MSX +3377D2017CC8433FA20B432C9D2328C53BBC10E6 Flipper Slipper (Japan) MSX +49BFA9871BB0AD3B47A7C63B14A10E0E8AE48A52 Flipper Slipper (Japan) (Alt 1) MSX +39C12004ADB3442F2C43AADE8A0BE420D59EEFB1 FM Music Composer (Japan) (Program) MSX +E60E2ABF907B66F5B275C7B7B710439ADAE58D37 FM Music Composer II (Japan) (Program) MSX +7C2743DF543C0D8A4BA7E42BF7DB580B996D102E FM Music Macro (Japan) (Program) MSX +9D789166E3CAF28E4742FE933D962E99618C633D FM Pana Amusement Cartridge (Japan) (Program) MSX +E4C8F3B87D755C21572040C51CEC1431AE59A0BE FM Voicing Program (Japan) (Program) MSX +C0D33B513704ADC56718B1F56C1062718683C77C Formation Z (Japan) MSX +CE01AFE30DA38DC58994C8264070195E1CD921B8 Formation Z (Japan) (Alt 1) MSX +A194B845857C8B33EF4FD5E53D7F38150B4FA4CF Frogger (Japan) MSX +D8E9FD3E9420BCBB1DD530FDA1E9C718AA08D8E4 Frogger (Japan) (Alt 1) MSX +64AE3ACDCE06D1B41E23EE2730797FD7E472BDDF Front Line (Japan) (Alt 2) MSX +883537F12814EE63C48A0AB744383F8D8E6A5CA2 Front Line (Japan) (Alt 1) MSX +EC54E05A6F784F9C616C94AB8D57E5D2647ABC66 Front Line (Japan) MSX +A41E43FA3C64D776831451C35FE8BDEE58625041 Fruit Search (Japan) (Alt 1) MSX +A27EB9CD77837C1E443E275D0E10888E0FD248F4 Fruit Search (Japan) MSX +E7657D8070399D8E4D65308B356E110D83D23151 Funky Mouse (Japan) MSX +138A2D56237AEA915BAAEF85E69425A658506CFB Futbol (Spain) MSX +53337B61D7B86E6D18501967FCFC0908A00CC55C Fuun Takeshijyou (Japan) MSX +FAA5AEF23FEBC61A875E28EEBE3AADF83E1F5BA7 Galaga (Japan) MSX +2A34F0221193712C43F336F08D2A6E58A1A8974A Galaga (Japan) (Alt 1) MSX +25308EBB33FD87A7F6A8E61868D3DCDE3BD622C5 Galaga (Japan) (Alt 2) MSX +95F36CF00CEE3DB55940EB60CD39412226A99E94 Galaga (Japan) (Alt 3) MSX +692FD8A85978ADAFBB530510FFF71848F39D4FBD Galaxian (Japan) (Alt 2) MSX +AA2BA89E0B1C91A4405F516EF003AD14A401096C Galaxian (Japan) (Alt 1) MSX +E2ABB08ABACCE57703FC008881279890328F6277 Galaxian (Japan) MSX +E8AB46785E75E19DAC497C4A82AC2F5B37AC0580 Gall Force - Defense of Chaos (Japan) MSX +3425EEA336140DA03D7D7F09A94FD928D70E2212 Gall Force - Defense of Chaos (Japan) (Alt 1) MSX +ABE52920E895C148851649ECB9C029FDC41A275F Gall Force - Defense of Chaos (Japan) (Alt 2) MSX +89073C052B0FE29B6DE077C8BDF5373474081EDF Gambler Jiko Chuushinha (Japan) MSX +39FFAACD0C2875018E7673A887A921FE9D31D6DC Game Land (Japan) MSX +4FE90868376704336FBF45619A47CE18736FF1B2 Game Master (Europe) MSX +70BA2331844BD5C14906E9F2284EBA119B3E41BF Game Master (Europe) (Alt 1) MSX +9648D43F3C25D67B9E4972F777D7B02470080D1C Game Master (Japan) MSX +ABCE0B855D67AC10BC667E0F23CEAB4A12FFEEE6 Game Master (Japan) (Alt 1) MSX +FE74B4DF9698A61DFFD3AC88F47619675514BA1C Game Master II (Japan) (Alt 1) MSX +5C00F9E3A48411E08FAC89B1DFDD2A6E95853919 Game Master II (Japan) MSX +B2CCA92B7A51A43C310E58E011F3EDE1E7125A96 Game World - 126 Games (Korea) (Unl) MSX +1CE1EBBB0F62224AA776C4523E2EF708154E7B52 Gang Master (Japan) MSX +0CB11C766BD357D203879BD6BEE041A4690CC3DF Gate of Labyrinth (Japan) MSX +12B3C31F0FD10FF5823DCC8BF6DFEB785A8AF2F7 Genghis Khan (Japan) MSX +BA30AD98A8488BEC6D0C661F7B859BEB2FE219D1 Ghostbusters (Europe) MSX +310AB424EDF15D5399E31FDBC1230DDCDE307D1A Glider (Japan) (Alt 1) MSX +3A46902D265D98B27BFF3A34160DE1C7EF4F116C Glider (Japan) MSX +2DACF7A08857CBDC706D24B4A46665113D16FF99 Gojira vs 3 Daikaijuu (Japan) MSX +83FBA43371D8D3C50A97C96923E52B40DF2A7816 Gojira vs 3 Daikaijuu (Japan) (Alt 1) MSX +8BD874AA854CC26D7FC48E7D2DE60DBBEE681721 Gojira-kun (Japan) (Alt 1) MSX +D6B6CB3D85B991F8ADF2E07A0E8E74B586741D12 Gojira-kun (Japan) MSX +30E3681BE376A76CF9E0F89E54555A7631759E15 Gokiburi Daisakusen - Bug Bomb (Japan) MSX +69BDA8B4A96187597B95CD5C43E58DA0716D0FC8 Golf Game (Japan) MSX +7A4126934F9E68C34BF00DD3D9A9E753C05EE73F Golvellius (Japan) MSX +AACAF2E694A1C05F2EF20A8CE6892242C0F88919 Gomok Narabe - Omo Go (Japan) MSX +6F0F61285BE1158ECF2E5393619187F26A7395BE Gomok Narabe - Omo Go (Japan) (Alt 1) MSX +B1248F7B9D4E16A894555C51C533D3FD9A90802E Goonies, The (Japan) MSX +B7B4D5C83D8C336DBFE32833BBA974CEA7F0CB8D Goonies, The (Japan) (Alt 2) MSX +250D0D6E646EAE4817802C49E367AD8C1C35A462 Goonies, The (Japan) (Alt 1) MSX +EADF124B91B996B890B1AE84B75B21EE6568D1F3 GP World (Japan) MSX +3EA788262557F578B25E4E36E61C1CF9FB1155D1 Green Beret (Europe) MSX +ACD46021A228B2B612C82D04C124B78E7D4C25E3 Green Beret (Europe) (Alt 1) MSX +32615267E8497DB3F5E6F5348EE309E73C80A1A7 Grog's Revenge (Japan) MSX +04325BFE5BC20A8F6D086933D138FB92CA200111 Grog's Revenge (Japan) (Alt 1) MSX +5E28FA0CD90BCFB7995ACB025A22F6F556CCAC08 Guardic (Japan) (Alt 1) MSX +67BAAAA870AD4A08F55EC1C67DBEABC97B6F18A0 Guardic (Japan) MSX +CA5F14925A7D33D83DC581BBE2FF5258389BFBA7 Gulkave (Japan) MSX +E90B579AC64798343ABB635FCBF929E83714312A Gulkave (Japan) (Alt 1) MSX +445963FDDFBD0487ADDAF4B0AD620520E426A1D2 Gun Fright (Japan) MSX +F2EC3714138175212B6B6E28B5DA4361CC4B5471 Gunjin Shougi Mars (Japan) MSX +99A8631CDC37F0DD9D8793EA8EADD3F34E0BBA51 Gyrodine (Japan) MSX +EBB70722F75279911CCE79E6BD78B8F514561B0F H.E.R.O. (Japan) MSX +FCC6B6B9F05DE409492A1FB988FA671E46D54196 Hades no Monsho (Japan) MSX +1804CFBC4F175136B7B934B575D49CBC0E726FFE Hades no Monsho (Japan) (Alt 1) MSX +301EF3C728041EB1DFD89227A901C32EB000D348 Hafanuda Koi Koi - Gostop Godori (Japan) MSX +44B23A175D04CA21236A5FEF18600B01B12AAF4D Haja No Fuin (Japan) MSX +5370B7746112621169D503BBEC2E7FC526279F53 Hanafuta (Japan) MSX +26FC48DDACA0FEDC90FC151D4ECD5CA6D1CCC77B Hang-On (Japan) MSX +A67E699EDB471C35A217A5C3E6831C6CDB0EABE5 Hang-On (Japan) (Alt 1) MSX +7F086CC2CA0C35BF599F48C2D5E901E89411239F Hang-On (Japan) (Alt 2) MSX +8F35C41A5235DEC22C3B99CD6DD63CFDA0A7A821 Harapeko Pakkun (Japan) MSX +A3DE07612DA7986387A4F5C41BBBC7E3B244E077 Harryfox MSX Special (Japan) MSX +3626B5DD3188EC2A16E102D05C79F8F242FBD892 Harryfox Yki No Maoh (Japan) MSX +15345C8745028C96FC79036B2E3E180AD2F62DAB Haunted Boynight (Japan) MSX +69BC7CB436EA2EA3A6B49C3B050BAE24271A2F9C Heavy Boxing (Japan) MSX +0FA2BB1EFFEFDE0861FE53A38FF5B56A6A320C80 Heavy Boxing (Japan) (Alt 1) MSX +20191B437958E990D14660F476C340E140236C70 Heist, The (Japan) MSX +6844DDF610E1A98B55E77FCC364B38A037751A2B Helitank (Japan) MSX +F72681F09B52D530EC905E8DF21C4A15E30201AB High Way Star (Japan) MSX +C0FA7D53B3E66BD1E1680BB135DB8F74ABBAC52E High Way Star (Korea) MSX +3C2295FB9FC9F1B6A607A74F4538E24D170522E5 Hisya (Japan) MSX +BBCA0B00374BA5366BA53B380285D38857450A7D Hitsuji Yai - Preety Sheep (Japan) MSX +C344ED78465203E12143BD9889281BA981A195E4 Hole in One (Japan) (Alt 2) MSX +2F8416D9CCE6587ABA4B71B1D3E3B626609CE7ED Hole in One (Japan) MSX +4F73D4B731B8309145B2A9BF9C37620E4F4A391C Hole in One (Japan) (Alt 1) MSX +F3952B790AE2A8A1434B52BF816C56C9E680F73E Hole in One (Japan) (Alt 3) MSX +BB75492C6EBBBF1827B3695F70E481D65487DA44 Hole in One Professional (Japan) (Alt 1) MSX +A55617157C5D89DB5900654B641E757A37FECD1A Hole in One Professional (Japan) MSX +F29CAC37C5001DDC752FF4A0B9CC51A965906DA8 Home Calc (Japan) (Program) MSX +CC06D65A9ABA634E3AD75675B960140932506FFE Home Writer (Japan) (Program) MSX +F27721CF9EC316EA3B18233F699FEBF739B25678 Honkball (Japan) MSX +DD9A41E4C8802CD4BBB87E30281711F4E7AE017F Hopper (Europe) MSX +E904EFABC5A75840C50EA7EDB07052683468A64A Hudson 3D Golf (Japan) MSX +27847B02D2ACBEBAB61F2F05BD2FFF0C2291A09D Hudson 3D Golf (Japan) (Alt 1) MSX +E06ED9B0B3E1FBB9F27BE65C37B4D9B548889B4F Hustle! Chumy (Japan) MSX +86E688CEA0F0C8BCD31B6BCD19FD72AC108646BB Hustle! Chumy (Japan) (Alt 1) MSX +9DCB43B654A08DE2C52147F4A2E628B5FE3761C8 Hydlide (Japan) MSX +74E9EA381E2FED07D989D1056002DE5737125AAF Hydlide 3 - The Space Memories (Japan) MSX +A3537934A4D9DFBF27ACA5AAF42E0F18E4975366 Hydlide II - Shine of Darkness (Japan) (Alt 1) MSX +DA4B44C734029F60388B7CEA4AB97C3D5C6A09E9 Hydlide II - Shine of Darkness (Japan) MSX +56C4813AC549AF8711B2E2E42D7DB1B960C4C040 Hyper Olympic 1 (Japan) MSX +CC9A82898DA39E5CFEB0400006D093D3B869F28C Hyper Olympic 2 (Japan) MSX +14393568469C74BD6F8BE7770149DB19F0553AB6 Hyper Rally (Japan) (Alt 3) MSX +D1A7CBAFF354B59003F0E297723B912CB6AD0B36 Hyper Rally (Japan) (Alt 2) MSX +3B13E164130CAB9B36C1A95E06F8D9FD707FC97F Hyper Rally (Japan) (Alt 1) MSX +7DFE091E02F6C1B21BD65E44EB5052D564D0EF92 Hyper Rally (Japan) MSX +9CAB6A793E39076E3F598AA54BFFD5585DDC7E3E Hyper Sports 1 (Japan) (Alt 1) MSX +2C85B993671DE612E9338D094565A4EB32A97EA0 Hyper Sports 1 (Japan) MSX +9002AA0B2D49A9FC323180487FF591781867A99C Hyper Sports 2 (Japan) MSX +AF4E0490C178A18A47B34831FB5E3CF8B61D34D9 Hyper Sports 3 (Japan) MSX +6842FB21ABB2531C17FE0687D77E012348D3DC2C Hyper Sports 3 (Japan) (Alt 2) MSX +EC76D4D9B61BDBDE9A4B5BE082DBDAE96321A591 Hyper Sports 3 (Japan) (Alt 1) MSX +167B226B54CC5B681A69D2C1509116FFABA868E4 Ice World (Japan) MSX +F629B8F7133C3442D0371A4D84275FB2E0974854 Iga Ninpouten - Small Ninja (Japan) MSX +F52113B45062ADC75CF7A0ED0538B3A07696CC24 Iga Ninpouten 2 - Small Ninja 2 (Japan) MSX +AA68633FF1AFD385535B2ABD7C8756B6CF79256A Indian no Bouken (Japan) MSX +95AE5B3E24AD0BEA21902CB7DFD3FD9581166A76 Iriegas (Japan) MSX +8AA6D0AADF00DE9112696DA5B7DC6E3B62F2D9BE Iriegas - Theseus (Japan) MSX +ED1F7342B9B26EC02CA2D584570D75F925167EA1 Iriegas - Theseus (Japan) (Alt 1) MSX +14451B2931A014E949A4B3D2973D424D910E0D9D Issunhoushi No Donnamondai (Japan) (Alt 1) MSX +02A2FAFC7B9249DB76803ECE347BA73BE25F71B5 Issunhoushi No Donnamondai (Japan) MSX +2391AE8C961B4A38B3BEAEE9ED3362FB2C71851F J.P. Winkle (Japan) MSX +6FEFBE448674B6EA846D0C6B9C8A0D57A11AA410 Jagur (Japan) MSX +1AEAE1180471E9A6E8E866993031B881A341F921 Jagur (Japan) (Alt 1) MSX +ECC68B4A042794424DF771A3336361FDB50D0875 Janka (Japan) MSX +4180544158A57C99162269E33E4F2C77C9FCE84E Japanese MSX-Write (Japan) (Program) MSX +CB352E97E9416F4C3032118758FC77D6D0F3AD73 Jet Set Willy (Japan) (Alt 1) MSX +45B5B0E9DD8D11D034E09803F92EC9720CDA1E3C Jet Set Willy (Japan) MSX +F99919C8F42ADDB7F65AB4FB21B603EE7E716C90 Jigsaw Set (Japan) MSX +EBDE4D61184438175DB424FDF25CEC238D91A15F Jissen - 4-nin Mahjong (Japan) MSX +765413BB6B03BC3BB888EE8FE00B99EF69C1317A Jisyo Data (Japan) (Program) MSX +5CEEDD2AE401FEBB79C1F6A64DDEF4B2E1790674 Joytelop (Japan) (Program) MSX +39EF139D8D66FB18B04DFF8B9A5386011F497479 Jump (Japan) MSX +A53D1EA775A6C90A84F1F36349540B16CF8307E4 Jump Coaster (Japan) MSX +0B3A217D3278A43D7460136F955171C762A1F8E5 Jump Land (Japan) MSX +B5CDEF44B22C7E234895B053E487233C117D1A4F Jumping Rabbit (Japan) MSX +A70C6B0E90E7B8BA3E5BC06C9AE7D6AF344E491F Juno First (Japan) (Alt 1) MSX +846BD4D89BD034AC5346CBC559752635AD2BDA6B Juno First (Japan) MSX +4991DC097E248436506ED5C8BC3F367A65267EE7 Jyan Friend (Japan) MSX +17E1111B1D6AA80E8BC525BE345C25E3B00ED504 Jyankyo (Japan) MSX +666E82D8A8E5D2672A9B7159ADCDC861A31C8FA1 Kage no Densetsu - Legend of Kage, The (Japan) (Alt 1) MSX +FFC8C57B26F2F495BD77EFAC5B815EFE9C25336C Kage no Densetsu - Legend of Kage, The (Japan) MSX +632EF250C76B222158BA90DFC68B9E004DBAFE3A Kakikukekon (Japan) (Program) MSX +223337DB25C942ECE732214ABA5DD624B574E9C4 Karamaru (Japan) MSX +1C462C3629D43297A006BA9055B39A2DCCBA9F6C Karuizawa (Japan) MSX +09779F0E9EC0C36EE3700690E2B6E282A4B40A0B Keiba, The (Japan) (Program) MSX +3D5160331BEB1C5CC54BA6ECEF6B3CE2FF4660B6 Keystone Kapers (Japan) (Alt 1) MSX +FB4724B8159BEAE132F89F394F71CE3934A61AE2 Keystone Kapers (Japan) MSX +65334123C7D00CA623BF5F7A55756CC75958DEBB Kick It (Japan) MSX +F033AB8A33E2D7A8AC1313B862BC138138B4346E Kick It (Japan) (Alt 1) MSX +F772396BECDBD15BA0648BF1AEF8CCB155E1ADAD Kinasai (Japan) (Unl) MSX +BEC70FBF9B1384B6A8ADC45226689F02D996B6A7 King & Balloon (Japan) (Alt 1) MSX +ED15174DEC31A29F9D41A06DE3008DB04AF11A25 King & Balloon (Japan) MSX +46062D3393C49884F84C2DC437FF27854E9D2E49 King Knight (Japan) (Alt 2) MSX +A2CA7E6E216F8B450EB8DB10A4120F0353275B6B King Knight (Japan) (Alt 1) MSX +122F659250A0AE10CE0BE0DDE626DD3E384AFFA7 King Knight (Japan) MSX +43DC3911B9A336BB7B17BDBE6E48464E01F2C425 King's Valley (Japan, Europe) (Alt 2) MSX +07448FFB20F260DF159A19DF2CAE1EE5545A0AEF King's Valley (Japan, Europe) MSX +8C9A9A9AFE13A58E4CFB72489AF2D6B080DFFAF6 King's Valley (Japan, Europe) (Alt 4) MSX +A4383F789482A9E868A9F136AA722129673C2A81 King's Valley (Japan, Europe) (Alt 3) MSX +0CF26BF02C5B94DF118129A681A7F14ADD708177 King's Valley (Japan, Europe) (Alt 1) MSX +CFD872D005B7BD4CDD6E06C4C0162191F0B0415D King's Valley II (Japan, Europe) MSX +DD76EE1071E427CBFEDEEEDCB3A4B8BCAD56BA71 Kinnikuman - Muscle Man (Japan) (Alt 1) MSX +BF7E27B3456F1A96D94A8DBF06688C8F833BD818 Kinnikuman - Muscle Man (Japan) MSX +E98E4351119D78B6402C4499ED16FAEB3364F6C3 Knight Lore (Japan) MSX +C8FF858D239C62A859F15C2F1BF44E1D657CEC13 Knightmare - Majou Densetsu (Japan) MSX +DA8249452DA86C0BA44F0AE279CCFF82A1DDD756 Knightmare - Majou Densetsu (Japan) (Alt 1) MSX +1D6A355A9CE84C78E3BAFC27A4F1151E240F68F0 Knightmare - Majou Densetsu (Japan) (Alt 2) MSX +4D51D3C5036311392B173A576BC7D91DC9FED6CB Knightmare II - The Maze of Galious (Japan) MSX +25F5ADECA8A2DDB754D25EB18CFF0D84E5B003BC Knightmare III - Shalom (Japan) MSX +63D4E39C59F24F880809CAA534D7A46AE83F4C9F Knither Special (Japan) MSX +076D6F5B9F8427F6959F7A255ABB4ACAC0DD9D0C Konami's Baseball (Japan) MSX +9BDFE44A7A0D5151346FF14ECE3216B5108CC775 Konami's Baseball (Japan) (Alt 1) MSX +FC6660A202DBD228C9E0D7C404340D1DCC1E2844 Konami's Billiards (Europe) MSX +5E349166FCE12D45F3CE3F69ECD6B2A70EF4D68B Konami's Boxing (Japan) (Alt 1) MSX +7ADB6812F3702B93AA2B2A872722BBD40915670D Konami's Boxing (Japan) MSX +9E190CF3CA52D85FD34EB5DF2C0DD8490448B9A2 Konami's Boxing (Japan) (Alt 2) MSX +10698EA6B0423F2E858A4C28C10F39646CA5495F Konami's Football (Europe) (Alt 2) MSX +EAA6B787784BAE1C7F648B57DAA1C88CF2B1B095 Konami's Football (Europe) (Alt 1) MSX +8E9FB34B356B02A839DCE5139C12030593BE13A2 Konami's Football (Europe) MSX +6A3A68836A468CC761A268175C64D53C4C1C48BD Konami's Golf (Japan) MSX +BCF72A4673C7982361DB4EFAF8EBC776B6539938 Konami's Golf (Japan) (Alt 1) MSX +5C7971AA8688FFC429A3E315DD3D45C38F72DDEB Konami's Golf (Japan) (Alt 2) MSX +F415E4096FF3F6A9F17BFBF02F146E44F0D5FB66 Konami's Mahjong (Japan) MSX +AE5B8E69732A23AEE102BCD996AD06225F1B3EBA Konami's Ping-Pong (Japan) MSX +6C68F7BE1EB46CCA6DCDBB9192CBFF9D59604357 Konami's Ping-Pong (Japan) (Alt 3) MSX +5E1A50AFFE1FA973F69E423A8827751B93FC53EE Konami's Ping-Pong (Japan) (Alt 2) MSX +9F4AC1287B8CAA286A847C86AC8601A711BE2D82 Konami's Ping-Pong (Japan) (Alt 1) MSX +A0ED2C50E55241D23BB5D12CB6528A2A0C3BC156 Konami's Soccer (Japan) (Alt 2) MSX +FD7518A6AEDB51630364082C27BDFE4411ADFD4C Konami's Soccer (Japan) MSX +89CCB1A7FFAAA75CEE9BDC9B4A9EC9B063AF7199 Konami's Soccer (Japan) (Alt 1) MSX +79C1BF77C08B733AE04E069DEAF25FD24B28BEB7 Konami's Soccer (Japan) (Alt 3) MSX +2FEFF37D593683CE1C7DFAC33ED3207895E01A03 Konami's Synthesizer (Japan) (Program) MSX +D5F5D2850B0BFDA45BA4DFFF70D3FD9986399A94 Konami's Tennis (Japan) (Alt 1) MSX +5F6972E9E374753FAF092409F1EE10BBA5231B66 Konami's Tennis (Japan) MSX +0039CFF292FE740D8C87CC2131A473CBB4F8C4F4 Koneko no Daibouken - Catboy (Japan) MSX +530ECFF542A537C320B17BD5D64C86D5D65619F3 Kung Fu Acho (Japan) MSX +FC22CEC076C0A0A1EE7E410772AF3D7D31DE3149 Kung Fu Acho (Japan) (Alt 1) MSX +05DA84093D973D3BFBD3143FFD155A16A9EC5F82 Kung Fu Master (Japan) (Alt 2) MSX +602C4D0D12FD59725C0C4E40F51D6BDEB679EA36 Kung Fu Master (Japan) (Alt 1) MSX +C1DFC86C441E1128194F3AB490C94E29275B5DF9 Kung Fu Master (Japan) MSX +304EA29469461F1CFA801F62AF0BF5045A6882FC Kung Fu Taigun (Japan) (Alt 1) MSX +E817AB7B50674C414B1C1B72530024EB03396A41 Kung Fu Taigun (Japan) MSX +15CA962994FD25A56BEE2F543A83F133F9D2265F Ladder Building (Japan) MSX +C4F952258020DE9E23A718A78C18D22E2CCCFE3C Laptick 2 (Japan) MSX +F69541B86C2B396CDCE765C2DEC498E11232B3C9 Le Mans 2 (Europe) MSX +2CEA9CDD501D77F2B6BD78AE2AE9A63ABA64CFED Legendly Knight (Korea) (Alt 1) MSX +6A98D5787DD0E76F04283CE0AEC55D45BA81565D Legendly Knight (Korea) MSX +3103F0170BAE627BDEB77108E0E782284E4581C9 Leonard (Spain) MSX +0442DD29EA0F7B78C9CD5849EC7EF5BB21EC0BF5 Light Corridor, The (Europe) MSX +5DD2AC08FD05A1E091C7C6ECB6C10B49992BDD46 Links, The (Japan) (NGA II) (Program) (Alt 1) MSX +88F3A72513B04459212289797942C4D76F495A05 Links, The (Japan) (NGA II) (Program) MSX +BC76A04970C547B7C080E747D393D13C87E82E7D Links, The (Japan) (Program) MSX +0421A25AFF3AE300B2A4536DD0AA5FA924E7DD72 Lode Runner (Japan) (Alt 1) MSX +818A6CEDBFDF3A5AF0C844F32A18E3930178C798 Lode Runner (Japan) MSX +4B04574B3B71958664AC730987C4C8EBEDEBA890 Lode Runner II (Japan) MSX +4025045E93F51AFD58545104CC2C897226FEBAF7 Lord Over (Japan) MSX +3C2DB6321EE84E3690757C08ADE9DC096BD209B3 Lot Lot (Japan) MSX +95F75FAE9B3E961149E352CEF3D7E478E9887D5A Lunar Ball (Japan) MSX +6BDE4E6761286A2909858ECEF04155E17072996E M36 - A Life Planet (Japan) MSX +0949BD31CDBDFACB3224506C72A2210C50432157 Mac Attack (Europe) MSX +97DD31B2F0DD056ABD808062E306B0C2536975BC Machinegun Joe vs The Mafia (Japan) MSX +09AF3B68BE4EEA5F5594D5D2D124D92B127DD390 Macross (Japan) MSX +81DDAF3A42C1E1A3D3722E0CD046316A202ACD33 Macross (Japan) (Alt 1) MSX +A3D1212EB4C58958F063AA8577DDFA07903B28B3 Magical Kid Wiz (Japan) (Alt 1) MSX +087AFEBB16BFD96F465FB0D004326D55452BDD81 Magical Kid Wiz (Japan) MSX +3E2EF016F255168E2DF1906E678CA22F880917B8 Magical Kid Wiz (Japan) (Alt 2) MSX +BF5678F3C065A4507F71ED6206A63AC922AD93DD Magical Tree (Japan) (Alt 1) MSX +B82DC590AADC930B43DB303BB3E3458E7695E3B5 Magical Tree (Japan) MSX +3243A5CC562451DE527917E9CA85657286B2852F Magnum Prohibition 1931 (Japan) MSX +9C5C1C40EC30C34B1B436CF8CC494C0B509E81FC Magnum Prohibition 1931 (Japan) (Alt 1) MSX +2729BB0E68A64AF525DF4C5D9687BAE07245980A Manes (Japan) MSX +47129FE3791A7171F8FA792F953D7B5D58BA5C24 Manes (Japan) (Alt 1) MSX +820174B4DD3F3DF87E5E32FB6F7ED457542D96C1 Manes (Japan) (Alt 2) MSX +20CE82112BA0C50063667D61E43979AC464A3BB4 Mappy (Japan) (Alt 2) MSX +E7D06C0A5C7F256C061E5B8173FDCC145D2FC4D6 Mappy (Japan) MSX +A8313B0DCE35FAA80B399A220F19B04333FDEC1D Mappy (Japan) (Alt 1) MSX +F7DD6841D280CBFFA9F0F2DA7AF3549F23270DDB Marchen Veil I (Japan) MSX +A66E19E58AC5B4DA7DB071CA7EAD40C28A332198 Marine Battle (Japan) MSX +A3772599CDB84DF71EF2BB38B1E2CB2F66593969 Mars II (Japan) MSX +E4D61EE74867066B04B0F6ABA35D98D72665E6E0 Mashou no Tachi Goblin (Japan) MSX +8F92EA214A7A11394C512080D3B65A7AFA9A92ED Mashou no Tachi Goblin (Japan) (Alt 1) MSX +ADC65666DB35CD2CE694A8E2F32B95BD98D72291 Master Chess (Europe) MSX +2AF58D6B3A8C77270FA5BB82F129FC97F999B7EC Megalopolis SOS (Japan) (Alt 2) MSX +3167FFC2F2411138E4545CBDF4466C3237A04874 Megalopolis SOS (Japan) (Alt 1) MSX +8C6E1E21CC45B2CA72CEEA93DF48EDA9CEF1DBAD Megalopolis SOS (Japan) MSX +E92BAA5FDFB2715E68700024D964098EF35704D9 Meikyuu Shinwa (Japan) (Alt 1) MSX +98B7A6AC44B82CCFC45EB51595E2905ADABAC1C7 Meikyuu Shinwa (Japan) MSX +E7C800FA576B3A9554836AA9C5EAA3AE893805D4 MIDI Macro (Japan) (Program) MSX +97ADCB652BC4BAF02D29A9ABE5E6547065DEC298 Midnight Brothers (Japan) MSX +F1D68B477F3F54C0B6080985954208B0D95C5973 Midnight Brothers (Japan) (Alt 1) MSX +5460AA3BE896AD949BEA75444BC6E7E072A859B8 Midnight Building (Japan) MSX +3A8C815F9F97C067828E22F50386A9383F8E1A3D Midway (Japan) MSX +7C50D00A0D7B8C3474ED492465A92622CA160151 Mil Caras (Spain) MSX +5A709255F73EB8B601BF9D81210260488F8AC511 Mini Golf (Japan) (Alt 1) MSX +D2BF27695023A3E7DAAEAB1CB76572F2C412DE1E Mini Golf (Japan) MSX +7ABF89652396A648A84AE06E6DABC09735A75798 Mirai - Future (Japan) MSX +176EC8E65A9FDBF59EDC245B9E8388CC94195DB9 Mitsumega Toohru - Three-Eyed One Comes Here, The (Japan) MSX +428B5BDD5CBB3E4FF637CFA5DB8C41D8D0070813 Moai no Hibou (Japan) (Alt 1) MSX +F924D89A28966A1D08C10D5DDBC9E0E182BE4669 Moai no Hibou (Japan) MSX +336D714E3BC2DFE3626E55D01EE4EF74A48CF652 Mobile Planet Suthirus - Approach from the Westgate (Japan) MSX +C0717A9831D66E29EB907BE598BA6606E17EA044 Mobile-Suit Gundam - Last Shooting (Japan) (Alt 1) MSX +917270DD44C63DC883289B4E0902FE6C812F5EA3 Mobile-Suit Gundam - Last Shooting (Japan) MSX +17AC538DD63BC93EC0B88B6DD92079E807C22908 Mokarimakka (Japan) MSX +7D0BB1DAC966CEEE2E4C53F77E6E057D65F15D4D Mole (Japan) MSX +F364A44D0B4CEAAA8706830237C0B824DCF9CE0C Mole Mole 2 (Japan) MSX +6FEFE304CC8CD099456BBBBBCB23FF776CB113C9 Monkey Academy (Japan) (Alt 2) MSX +E61F407E51EA4411145E236272842BDB3E0743E6 Monkey Academy (Japan) (Alt 1) MSX +8B2626F8DBBB3E97A5087B340A3F3D56C8EE84D1 Monkey Academy (Japan) MSX +E0D84B3B2AC7675C3ED104797840D43BC2347A5B Monkey Academy (Japan) (Alt 3) MSX +B6D39BBAEDB89F8C908CC2F44A0AB17E4B80CA4F Monster's Fair (Japan) MSX +B2D9DCEE787ACE26F8F4D2D18E24A3D645A6F853 Moon Landing (Japan) MSX +D1CF5410ED71F77670F65EB08EE944436BC0EB10 Moon Patrol (Japan) MSX +F93E23D958D2075BF476CB05A3C4F48D0C41AABB Moonsweeper (Japan) MSX +33EC3136DFB6FD44014C8BBFFC8AC79C3CAFE75C Mopiranger (Japan) MSX +4A185A3DB81C2CE20D176D13FA5F619C6B7A170C Mopiranger (Japan) (Alt 1) MSX +1B3059C7873765A476FB7791A4D6FC846AB05ADE Mopiranger (Japan) (Alt 2) MSX +DDC458BB3C70E0708841E516D9B89220C0E098A1 Mopiranger (Japan) (Alt 3) MSX +14E7EF125CC902001995BBD8ACCA0EAE2F213DC1 Mopiranger (Japan) (Alt 4) MSX +4DD934902907DB50BA76053F59AE7737D55824F4 Morita Kazuo no Othello (Japan) MSX +1FB861152A9F3F9C2B2DACE26D5F1D93AB9B4AD8 Mouser (Japan) MSX +B5D130A50F6939028702C1645426A29EC8EAD6E5 Mr. Chin (Japan) MSX +DC69C7A9EA93CBB0093300955935EF156AF5C194 Mr. Do (Japan) MSX +01544042B810C0B401FCE5D180ADB6FEA9B5ED20 Mr. Do vs Unicorns (Japan) MSX +E9B3652482A5B09AE662203F8758A30AA23AF62F Mr. Do's Wild Ride (Japan) MSX +CA05A183F4E7E56102706D1B9B852AD4350264BA MSX 21 (Japan) MSX +0D246B0E3EDC63803FCCE861EA07EADF29DC488C MSX Audio (Japan) (HX-MU900) (Program) MSX +930EAE7057AF1652ABAE794072B296A59DECD61B MSX Audio (Japan) (FS-CA1) (Program) MSX +76D488497D9BA54B302A4326F45909F643BDCD7A MSX Baseball (Japan) (Alt 1) MSX +85A3842EABAC50C4E1332666C161541BE3508249 MSX Baseball (Japan) MSX +AC150939558EC4E56446BE9502177F28A29881EB MSX Baseball II National (Japan) MSX +181BF58DA7184E128CD419DA3109B93344A543CF MSX Basic-kun (Japan) (Program) MSX +C279C3F41D5368761F9088157B80214D835A548C MSX Basic-kun Plus (Japan) (Program) MSX +8C7AE1A1720B1DAE9AF9904E638B868F56D905C2 MSX Bunsetsu Henkan Jisyo (Japan) (Program) MSX +C1C350C719236AF5EEF8798C4532351BEFCFD348 MSX Derby (Japan) MSX +35ABD4A14033710730DA72EDF278AAD42D641621 MSX Rugby (Japan) MSX +C76CA96ED23621A6267D9906CC4A1EE428677F98 MSX Soccer (Japan) (Alt 1) MSX +D2AA1605A6B56C118E18B385AB879536D74CC355 MSX Soccer (Japan) MSX +D4EDB2AF4170FD4069960AD61D3F664462BEF568 MSX-Aid (Japan) (Program) MSX +47663F883F98AB9DDAA0BF0C2831C567919F56F1 MSX-Logo (Netherlands) (Program) MSX +2B10234DEBD2A6A9A02E0750BA6563768BC4A2F3 Mugen Senshi Valis - The Fantasm Soldier (Japan) MSX +20A2E3D7966916F46EB26CC1AA226EC2D11646F9 Music Editor (Japan) (Program) MSX +85E3386D30DD9A64F4CC1BCA03CFF35B440F70B5 Music Harmonizer 3 (Japan) (Program) MSX +8C06D9E1E188431C13721AF965FAA7391140AF2E Music Studio G7 (Japan) (Program) MSX +FC4C05CA47C94DF877BED2E02307BD6307F738A6 Musiwriter (Japan) (Program) MSX +FB968A2407EEE00C683AF3AC19E88015341564AD Nausicaa (Japan) MSX +F0E4168EA18188FCA2581526C2503223B9A28581 Nemesis (Japan, Europe) (Alt 1) MSX +E31AC6520E912C27CE96431A1DFB112BF71CB7B9 Nemesis (Japan, Europe) MSX +4C2F015685A17DB7A8C3893E868E0A84A8DBF1E5 Nemesis 2 (Japan, Europe) (Beta) MSX +D63E20369F98487767810A0C57603BEF6A2A07E5 Nemesis 2 (Japan, Europe) MSX +6844758FF5C2C410115D4D7CF12498C42E931732 Nemesis 2 (Japan) (Demo) MSX +AB30CDEAACBDF14E6366D43D881338178FC665CB Nemesis 2 (Japan, Europe) (Alt 1) MSX +0413BB3AEACB0C28429B8C85B42796DBE48BEF6D Nemesis 3 - The Eve of Destruction (Japan, Europe) (Alt 1) MSX +7393F677E0FAE5FC83071C6B74756117B7D75E2D Nemesis 3 - The Eve of Destruction (Japan, Europe) MSX +5692E41B3A4C5E767CF290FD6C24942D0FD7B2E3 Nemesis 3 - The Eve of Destruction (Japan, Europe) (Alt 2) MSX +B7FD07B7825C6BEEB19B1F38631D2869F60939FB Nessen Koushiyen (Japan) MSX +EC1BB5C36952B12E6C0805E9A8D5BF31C20A68C4 New Horizon - English Course 1 (Japan) (Program) MSX +50E27C5B83C8AFE00B077406081D063263E98B62 Night Shade (Japan) MSX +7013FCF8C76BC610CEC9F55FBB99374182641251 Nihon-Shi Nenpyou (Japan) (Program) MSX +371DE6F12D834DA07C8E67B13E75FC22618BA5E9 Ninja Jajamaru-kun (Japan) MSX +9DFC71887FFC6D94B8780B5D6F207E24C1F58B54 Ninja Princess (Japan) MSX +62BFFF23E2BEAE00DB14B6C3E933043218B33DED Ninja Princess (Japan) (Alt 1) MSX +EC2F1E747756BA1FDAE606658AEEAFA07E6E7FD4 Ninjakun (Japan) MSX +C9D10B1DF3BCADB3D917CF2A6877AE6E71CA3A57 Ninjakun Majou (Japan) MSX +049892D1633BCB3F1D5067BA710ADEB89B38FCAC Ninjya Kage (Japan) (Alt 1) MSX +0125BCE373C95EE78DF074D19AD032158EDC74A2 Ninjya Kage (Japan) MSX +E6DE8BBD60123444DE2A90928853985CEB0B4CBF Nobunaga no Yabou - Zenkoku Ban (Japan) MSX +AEECB99ED7BFE2FF39A5F42637B6B33ECC79C443 Nyan Nyan Pro Wrestling (Japan) MSX +98E33DCA445850CDF24F09050756C3B75202AC13 Nyorols (Japan) MSX +5DCECC7C790E398A1C652DB568C1E66C6F25E5E4 O'Mac Farmer (Japan) MSX +5B53794D3D73DF29CBCEC411C0F65E9E9898977F Oil's Well (Japan) MSX +244EAE705DF950F60B7D4B523D57B9CFDED96B8E Oil's Well (Japan) (Alt 1) MSX +031A611BA1F75B7D5FE3ED088A61C24598B4B314 Okami no Su (Japan) MSX +6238F9C5F4C0012B3425BE203C23092F6B624FE8 Othello (Japan) MSX +41BA54C945104915CCC8D465930445C905D839E4 Oyoide Tango (Japan) MSX +61695EB1DC6242D8A70C7EF2172CF86A26E3C2DD Pac-Man (Japan) MSX +A72724A79C2C50EC66046C0828934B5CAD11B7C9 Pac-Man (Japan) (Alt 1) MSX +56FEBD50BE4ACCB3EB8C73FF4FF641EA767108B3 Pac-Man (Japan) (Alt 2) MSX +A2E144546A191DA8829B9CA9FA019884FE95156C Pachi Com (Japan) MSX +5558BA634018B22DCC687A01F9422FE60EA57ADC Pai Panic (Japan) MSX +DF13ED647ED4F5A6B04F1710FC1140EA65DC966F Pairs (Japan) (Alt 1) MSX +27BC809518FBB6C0D52C949E7CBE81980A801D32 Pairs (Japan) MSX +479608B5A86D7C77BD6C4DD00605B8EFB2E5B43E Panther (Japan) MSX +75D3B72D9CEEAA55C76223D935629A30AE4124D6 Parodius (Japan) (Alt 1) MSX +2220363AE56EF707AB2471FCDB36F4816AD1D32C Parodius (Japan) MSX +A6B2FDAE9551EF3633926F6177C771D794D1E91B Pasokon Sakkyokuka (Japan) (Program) MSX +AEB705AC42F8D9D62ECDB25899535D1F14F1C49C Pass Ball (Japan) MSX +8117EC66C0645A54422841A632CFD6602F35C4F9 Pastfinder (Japan) MSX +0486938B52FBCF30A4FA206E07960A5B866FCA61 Pay Load (Japan) (Alt 1) MSX +5F965BBBA026134818759D25119D4114599132A8 Pay Load (Japan) MSX +190BCAB0325DED99F42F32976BF965F0164AD2A4 Peetan (Japan) MSX +37E6FE7D07B3F8B2C585C77B231207AC8BAA1EA3 Pegasus (Japan) MSX +D53E0C8BCD98820AFE820F756AF35CC97911BFE4 Penguin Adventure (Japan, Europe) MSX +5AAB681334F9E97FE8D7E0EB008B2AFD5E0FC3AC Penguin-kun Wars (Japan) MSX +683478868F6C6423CC3E9C6AABE1868B30B1E47D Pico Pico (Japan) MSX +336A7C451A03C9A55726D171603B54628AD832C8 Picture Puzzle (Japan) MSX +663D12F6FED3CE5017B783DB3032EB69D8554FED Picture Puzzle (Japan) (Alt 1) MSX +3450F93FC2B08A052A709930C97EDEAD0099E447 Pillbox (Japan) (Alt 1) MSX +76A79DD0554B8F7E84468FCD3BF73459CE4AEB2B Pillbox (Japan) MSX +C95F8EDB24EDCA9F5D38C26D0E8A34C6B61EFB0C Pinball Blaster (Europe) MSX +211E1F7E86495178FB2B05E163B04ED4B7455034 Pine Applin (Japan) (Alt 1) MSX +878554D3B579E72B2D3C22E6330208EE0D1EE8A6 Pine Applin (Japan) MSX +91BD6C21530654FAB12CD8A797044D494834C223 Pingball Maker (Japan) MSX +1FBD7AF23177AB1DE799764D8A26BC2BBF85B042 Pinky Chase (Japan) MSX +BE8BB7F5E812CD31A65AEC3782A2D526BEF9B3D6 Pipi (Japan) MSX +10E63EBA7D2B10D946822F21E7FD106F5DFAB632 Pippols (Japan) MSX +CF8E40315F34E30E1BE4776BBEBC08C0A8403523 Pippols (Japan) (Alt 3) MSX +D621E2A2F0F924A17673F5D47F2182095074ACF4 Pippols (Japan) (Alt 2) MSX +0A9C576EABAF2651DDCA35BF17F96E509D6C6BA0 Pippols (Japan) (Alt 1) MSX +78079266711E60420480E4D95A39F0D7D974AD32 Pitfall II - Lost Caverns (Japan) MSX +AE8C7355C829248305384243F78A870453367E77 Pitfall II - Lost Caverns (Japan) (Alt 1) MSX +5FB4B6C3735E4D9415565A856BB69F9FB4857161 Pitfall! (Japan) (Alt 1) MSX +2FA9C0F016EFC2D1752A272C632393F5063EA06C Pitfall! (Japan) (Alt 2) MSX +B88E9C548873DCFD190E0E38F7B279344EEA41EC Pitfall! (Japan) MSX +E6FBFB4B10DC393953211DDA4B114080A08302A1 Play Ball (Japan) MSX +6F247C8AF6FC1881242281F19912068B03CA4126 Poiny X Senryosakusen - Operation Thanksgiving (Japan) MSX +CDAF507DBA4A48B5C98850A96F61F6D2E8464E00 Police Story, The (Japan) MSX +835B3E2BAE1D680D7050CE188C617FBCFB326EB3 Police Story, The (Japan) (Alt 1) MSX +692A55393E8EEF0800A612C01456E9CECD9C1418 Pooyan (Japan) MSX +C713ECD0E2EF89B2443E516D5FFA53D3A3422E22 Poppaq the Fish (Japan) MSX +AC109DAC24DF4DAE813CA5D9F0938CC48A162BB1 Price of Magik, The (Europe) MSX +24C5CBF1EE4CAA6D83A5AA7A5F3818692542FDA8 Professional Baseball (Japan) MSX +DA5FD6CE2F92A40B1CCAF6E3C425D720FEBC3543 Professional Mahjong (Japan) MSX +D03FDCA57B55BDB7E6B5481615B8AD0C8A71F77D Protector, The (Japan) MSX +FAE437072234C65BCA174DB9AEFD2107A53C358A Psychedelia (Europe) (Program) MSX +16C692A2C9BABFDADD8408D2F0F8FAE3A8D96FD5 Psychic War - Cosmic Soldier 2 (Japan) MSX +A36C00F32CAD6B603BC5525A741CB09064670F34 Puzzle Panic (Japan) MSX +1AD2178C27874704B395AB250200D9ACB7D3DE9C Pyramid Warp (Japan) MSX +531A7F736D86095D791D6D0F267BE66EEF07949C Q-bert (Japan) MSX +2E16A588246743C9B901AFDBF1BA094A0B1C8B5D Q-bert (Japan) (Alt 1) MSX +1F72E0CD58AFE22075A129AC854BBDCE0704B0C8 Queen's Golf (Japan) MSX +BE9D337DD412056F5FE78FD19467A63E80E3864C Queen's Golf (Japan) (Alt 2) MSX +97C39DAD3E065F9083FEFAE157F278844B208058 Queen's Golf (Japan) (Alt 1) MSX +9C886FFF02779267041EFE45DADEFC5FD7F4B9A2 R-Type (Japan) (Alt 2) MSX +0B379610CB7085005A56B24A0890B79DD5A7E817 R-Type (Japan) (Alt 1) MSX +37BD4680A36C3A1A078E2BC47B631D858D9296B8 R-Type (Japan) MSX +636EB837C5D80FB6B0692A72954CA91291BA831B Raid on Bungeling Bay (Japan) MSX +C5AF6C4255BAB55D68E82FA016CB35E3213BA244 Rally-X (Japan) (Alt 2) MSX +3DCECD610E832E7769547D3B6CE2B767F65F3563 Rally-X (Japan) (Alt 1) MSX +FC7212C6813574224114C3BB5BFA99206C0816A5 Rally-X (Japan) MSX +770805BD0BE8B09A3BE10030060D6AD8DC07D1C3 Rambo (Japan) MSX +4334ACC2BD5C921BC4DCB6DE9A1FCC79D843EE15 Rambo (Japan) (Alt 1) MSX +AC381DFB4D0B52DEDB18A8DF7A4651ED2978D12F Rambo (Japan) (Alt 2) MSX +FE1D02284B0B051308E3C796E8E9EEE2F86521B8 Rambo (Japan) (Alt 3) MSX +54A49A3C8B42B8B246E62ED45346CF52836DDCAC Real Tennis (Japan) MSX +91E17ABA249925C7E0E5C280469BEF09D5534DA8 Red Zone (Japan) (Alt 1) MSX +61E26157F0701CCE2DDB860A12F187912398B1B4 Red Zone (Japan) MSX +74AE85D44CB8EF1BAE428C90200CB74BE6D56D3A Relics (Japan) MSX +C72AF5118835E49AC6D181CC832336AB22EC5DCB Renju & Ojama Dogs (Japan) MSX +F02CA47BE665E83D812979D8074A985E5637B979 Rise Out from Dungeons (Japan) (Alt 1) MSX +5FBC5D6A01E66A1C456B82AC1190CCDE61BC7832 Rise Out from Dungeons (Japan) MSX +33BE9017FAF173EAE04D0C91CA8D42D1C20596C0 River Raid (Japan) (Alt 1) MSX +A1E14912D45944B9A6BAEF1D4D3A04C1AE8DF923 River Raid (Japan) MSX +BF4A0BAB1E8EAA70A8B12CD9A81D7A90A74C9E26 Road Fighter (Japan) MSX +7ABDF08E9C0A511B8182C502ED8C5F42778437E9 Road Fighter (Japan) (Alt 1) MSX +46C98A3143F5A80B2090311A770F9B73000881C0 Robo Wres 2001 (Japan) MSX +A2F9E1250C67D2E98BE70900D4370545321CDBFE Robofrog (Japan) (Alt 1) MSX +ACCE81BF851FA5869CD75181DF4FCF7D4489A9DB Robofrog (Japan) MSX +1EDABC3226648B54AE98D524B31F37CA47C8C88B Rock'n Bolt (Japan) MSX +1500A07693A7C06189F4CD6764D5EE62F0EDD85D Roger Rubbish (Europe) (Alt 1) MSX +8607B92458584D5AA770369D94D50361B1D64BD3 Roger Rubbish (Europe) MSX +FF9877666D983759D41398C5E3E29801AD95A589 Roller Ball (Japan) (Alt 1) MSX +44BAA180F6C9E0F140AC1F0AFAE75C412CB06B9E Roller Ball (Japan) MSX +34544106FBD29B2A72E1E8C2E0F260B79A0B0883 Rotors (Japan) MSX +0D459788B6C464B50CBC2436E67A2CEF248E0C4A Salamander (Japan) MSX +3F741BA2AB08C5E9FB658882B36B8E3D01682F58 Sangokushi (Japan) (Alt 1) MSX +14FF6FE464362C6B7DBB47B2ECDA3A8C5F05EF79 Sangokushi (Japan) MSX +E767C0239B79821463FA42F2C1989D3FD1B4B868 Sasa (Japan) MSX +395C5F40692C45B891ABE07C89D1E87829665FC7 Sasa (Japan) (Alt 1) MSX +1A6DE1CFF831429394DC2B9528993A1DFCAE14C6 Saurus Land (Japan) MSX +BC3BE8F829211DD8A8EB854F86FF014C47ED9254 Scarlet 7 - The Mightiest Women (Japan) MSX +09FBBD923E0DEB82F5E20FA8CE2D842ADBF4A646 Scion (Japan) MSX +C73D4C27AA2B0FB946E398323BD67D9E53C4F9EF Scope On - Fight in Space (Japan) MSX +05182561E05FA8E7C8A8184EDA885DC4FD12CC5B Scramble Eggs (Japan) MSX +C1D272645A249757B8BE5BD913BA2D3447892387 Sea Hunter (Europe) MSX +2B255C3E5615B2F5E2365419A35E4115A060E93C Senjo no Ookami (Japan) MSX +4936916BF914D99C5B9E3F4C7385F44B6B97D4C5 Senjyo (Japan) (Alt 1) MSX +E373E3E9BE4F6D30D5DB84B699082C00B2021BA3 Senjyo (Japan) MSX +DB0ED31C779FFFD2084946E3BA69512B372D845F Sewer Sam (Japan) MSX +83DF4081529FE5B8BB0A3601614D36C8384C9202 Shougi (Japan) MSX +0E06519E68C78A8F018152511F4F13374C5856AA Shougi 2 (Japan) MSX +299E52DFBBB94ACE4FD1EF59ECE45364CE0BB450 Shougi Game (Japan) MSX +F9AD0CDB227C588B1A5C75220ED53D0314550D7F Shougi Meijin (Japan) MSX +1C4DE8D4A1CBF5AA2BCF7816A1E55EE4584F59FB Shougi Sinan 1 (Japan) MSX +D844C4C5AE9C7AC671C4BE71AC1190A1E5DB4D36 Shout Match (Japan) MSX +4937A8E35072012A980F85ECFC60604D9D900244 Simple ASM 1.0 (Japan) (Program) MSX +D120CA303C3E1DD56ADEE68F10E9E1AB51F50AB3 Sinbad (Japan) MSX +D264152D4974B78959465ACFE0D5678E72930073 Skooter (Japan) (Alt 1) MSX +64F1CE4691056047F404460031ACB0B82A76968D Skooter (Japan) MSX +136D838CC1297940D96CD8E27AEA9F9E3C7088A6 Sky Galdo (Japan) MSX +1F8334DC7459CFCF2AD132E94976015C02E51390 Sky Jaguar (Japan) MSX +E3A52D448E69D6D14F67D35F24D9924158B1CCE1 Slapshot (Spain) MSX +7300D44A753DACF582D3079ED09EAFC9DD629530 Snake It (Europe) MSX +5A12439F74CA5D1C2664F01FF6A8302D3CE907A8 Sofia (Japan) MSX +2338946A671D31D12360ACE4EEB33F7BC7DB56F1 Soukoban (Japan) (Alt 2) MSX +CF55B0D12E550F71CEF709358BC7E799ECED0083 Soukoban (Japan) (Alt 1) MSX +04BD78730B100DD879E2FBD3FE646D2BC9BBC46B Soukoban (Japan) MSX +DE10AA2A2ABFDCAFE0064E1E76B676F54C7AAFC6 Space Camp (Japan) MSX +D1AD3BEB29AECAA7C3BC1FD8A4BE3B10D38CC47A Space Camp (Japan) (Alt 1) MSX +4971BDD3DB63D394FBC2186182C901CA4B32535B Space Invaders (Japan) MSX +FBBD9A77004F9BDBCFC292F85C32106FAA18CFA6 Space Maze Attack (Japan) (Alt 2) MSX +A00F9E66F1FA3DE15B028E0FBFED636E194BB967 Space Maze Attack (Japan) (Alt 1) MSX +93BF6725A3C1B7071064A01884E1B6E8C6F8B579 Space Maze Attack (Japan) MSX +7C0F720C7601CA6DC86C81AB6A76E0587A052F75 Space Trouble (Japan) MSX +FFF31B8C7549493D8EC220F85E3E8536F150D82A Space Walk (Europe) MSX +4B996BDDF88605C432F73564922106A63D31F62C Sparkie (Japan) (Alt 1) MSX +B9C98B80216983F97E28293B576CA9BE3602C1A1 Sparkie (Japan) MSX +4D80FAE5133D55503968EE246C1346CDDB020FFC Spelunker (Japan) (Alt 1) MSX +49E14B0248C649E7B5754357597695ABEF70C17D Spelunker (Japan) MSX +97F1790146116198133C083DE113ED1E5CA6FF21 Spider, The (Japan) MSX +33C62E6F7478BE369580A2D985FF57667F13CF84 Spread Sheet (Europe) (Program) MSX +1D129BDE09C9DB2433B334D36762704DE94983BA Spy vs Spy II - The Island Caper (Europe) MSX +18B90AAA2284EB46233E9203AF1E8CF1922C417C Square Dancer (Japan) MSX +7BF7BD134DDF9ED5B489F7F2EB0AA26BB2428FC9 Squish'em (Japan) MSX +364AE6695509F5CF16985CC2946A45AF5CA4CF56 Squish'em (Japan) (Alt 1) MSX +A1E1BFFE4B4EA6D67C973FA483C4D6273F68DE3C Star Blazer (Japan) (Alt 2) MSX +EDA9580A1AC75707F621C251A7424DF3846E4EC0 Star Blazer (Japan) MSX +B07A6AE619FCC6291838959DC1A899DE832F8D97 Star Blazer (Japan) (Alt 1) MSX +225894DA7E3AFABF33ABF05E519E1F6BCAC77A21 Star Command (Japan) MSX +5FE86465119343804A722CE4768EB33DE806A39F Star Force (Japan) (Alt 1) MSX +C1746EFEB4B44DCC80DFC4F429009FEAC91D9C48 Star Force (Japan) MSX +6A56B46B8BF014B25863433D6D96E64641A93EEF Star Soldier (Japan) MSX +B58CAF47C953B6F00935A201BFCCF7EE968DFF32 Star Soldier (Japan) (Alt 1) MSX +B2BCC1C0D64B6EE9F0E9BBBCF0EF7B64D80D3B90 Star Trap (Japan) MSX +E3CE88E95115765E31193777E57FCB9B40E10D3A Starship Simulator (Japan) (Alt 1) MSX +0E5062BB18B4A6FB93A89318772928874DD4D6EA Starship Simulator (Japan) MSX +FC5D252A26C93DC4CC30984B954A6A5124DEE653 Step Up (Japan) (Alt 1) MSX +27CE427EB1C86BA22707A6EE9086DB9D39962DC6 Step Up (Japan) MSX +1FA7398005FB0BD7075141035E8D888197162030 Stepper (Japan) MSX +3950F22265139A84CF57F3C0936E7927173F3D7A Stone of Wisdom, The (Japan) MSX +3063BC3AC5AF6D990D8D002ACBC9C3A18BAB71F6 Strange Loop (Japan) MSX +CCF6E244D27EC61195280D0915A3B43D291E3FAD Suparobo (Japan) MSX +05D7016F39E94BF9FC33D0E8482FF3038D6E01BD Super Billiards (Japan) MSX +DACC9ED6A80FB15C3E82C4081C07211E033BA820 Super Bioman 4 (Korea) (Unl) MSX +5D65A308BB9EC8C4B4CE334B18D699B1F53227EF Super Boy 3 (Korea) (Unl) MSX +8B65D999BA187C98BA97A038EA46655FD9D62DEB Super Boy I (Korea) (Unl) MSX +85153A8F25882CADDE8295D040DDB7586C93CEFE Super Boy II (Korea) (Unl) MSX +03F112B38FB1D05A9B0B50D3C6A54AA2CE9DD2B0 Super Bubble Bobble (Korea) (Unl) MSX +A84608F1C2FE1AEA1A8A586F2E335CB64BB951FC Super Cobra (Japan) MSX +7AD00597CEB5A02379055230D907C4421982329A Super Cobra (Japan) (Alt 1) MSX +16553C30FCDD0E1D00A48FE1CB2DEF537C4A7C3F Super Columns (Japan) MSX +54F288590F0C882F6E3A9B7C3F7D15B407190975 Super Cross Force (Europe) MSX +82C68A93D01F103AF4FE9F9205184FFD1A36A90F Super Drinker (Japan) MSX +27C2CDEE4BE0CA166C2EBD2DAC61115A56BB9856 Super Golf (Japan) MSX +2DFBCA8F5CC3A9E9D151382EBE0DA410F5393EAF Super Laydock - Mission Striker (Japan) MSX +55F30C8B7118870802D00DB860BC1945F18A42C0 Super Monitor (Japan) (v1.1) (Program) MSX +35F13B5A32C64B21517F0C4009F264067338912E Super Monitor (Japan) (v1.2) (Program) MSX +991EF9890DC3E0C0D29D6D249675EAE182ACA30C Super Pachinko (Japan) MSX +0D2F86DBB70F4B4A4E4DC1BC95DF232F48856037 Super Pierrot (Japan) MSX +0348F1758DAA118EBAF2BC593FF9A0A622FC89E8 Super Snake (Japan) (Alt 1) MSX +58B3B3A678364D0649C1AF0C27DA144CFEE85146 Super Snake (Japan) MSX +8DCD9618F92FB014D16E8F4EC9A813E65424AD7D Super Snake (Japan) (Alt 2) MSX +996A1C0D92400287C15545116B952F84C7DC03B1 Super Soccer (Japan) MSX +830EFA0B25E1CF34D5F55D08CB80709D0A2C82EC Super Synth (Japan) (Program) MSX +A2F8F8F9F46262342EEE0A1DF7C6871008A3A189 Super Synth (Japan) (Program) (Alt 1) MSX +4A1282901221207DA79432FB0BCB4F1E722C8278 Super Tennis (Japan) MSX +1A5295A337E5B969C939644CB5AD55B84A6AD31D Super Tripper (Spain) MSX +221C76D6AC483FB1F11C87D37B9617F1E1D7BC6D Sweet Acorn (Japan) MSX +C8015D4453EFB9F78005F6C8481CBCE9D99F6CC5 Sweet Acorn (Japan) (Alt 1) MSX +2D8E39F210DA6D633F773CDA03E9970712EA84CF Swing (Japan) MSX +719F457D8FCBF6C21A88E88F34FCD54F5E96AD68 Swing (Japan) (Alt 1) MSX +16351E6A7D7FC38C23B54EE15AC6F0275621BA96 Syougun (Japan) MSX +5BBCBD47F05A2742CFB0CAD88856EB2DF6E469FE Tank Battalion (Japan) MSX +7FEF9411858B1FF3FF019646E9E7AA0C61C7E87D Tatica (Japan) MSX +8F74C91E6598D8DE188AE1B506C44229C768B11F Tawara-kun (Japan) (Alt 2) MSX +8DD49E12677443AEDE319F41BF3F82A08D0E5B5D Tawara-kun (Japan) (Alt 1) MSX +14F2D64D05E2E53E876E3D6AF0A5711E557E3C96 Tawara-kun (Japan) MSX +A8EFF8C532DA894C86198B04B0A5D7707FEB28C5 Tear of Nile (Japan) MSX +4E17EFBE87ADC232C055D0DC26EB4476C661AAFE Telebunnie (Japan) MSX +50439F12DDFF3ED449DA3CC1442385AABA609E7D Telebunnie (Japan) (Alt 1) MSX +249DA12E2711C643C5E18CF96184D33DBF7E2305 Tensai Rabbian Daifunsen (Japan) MSX +010D5F325FC38C5B590841D15CE4F07D59F2A4CB Tensidachino Gogo (Japan) MSX +A0D85C5FC74547F46025369DA687569FB5AA3991 Tension (Spain) MSX +4FF12FC3ADF389A1F76A7A9BAB6B2FD20044F5B4 Tetra Horror (Japan) (Alt 1) MSX +53814FDFEACCE237BB68FB9056D005EB614B708A Tetra Horror (Japan) MSX +E9398ACEB9F8A648E4BCEBE02E5D7B14A3744C7D Tetris (Korea) (Unl) MSX +3C29EEF381D77F8C1F425A3E29919013C72F875C Tetsuman (Japan) MSX +F6711E1E2BAC04D45B8988F1D03529AD777ABF4E Tetsuman (Japan) (Alt 1) MSX +6420473EC647E4D750BC2247020B6722435B5211 Thexder (Japan) (Alt 1) MSX +049E7DCCD3977049B5F68AAD7754105B014BA771 Thexder (Japan) (Alt 2) MSX +A2109DA08B1921C4B3B47C6847598D424581B508 Thexder (Japan) MSX +DE5DA311941056A90CAB28FD91522C054871513F Thunder Ball (Japan) (Alt 1) MSX +4F73BA24163946F6247523FC3F2AA5DE00C3D7A6 Thunder Ball (Japan) MSX +136F2DEDD45F4419837EB1E4E623CB1DC317EF39 Thunderbolt (Japan) MSX +B3D57F968FDFEBE77F78C05F4A075D139F219AE0 Thunderbolt (Japan) (Alt 1) MSX +D1FCD47F6B68FCEE9914B32FD48B2634CF60C994 Thunderbolt (Japan) (Alt 2) MSX +B3C2DC4D1C940DDB4B9E742B8F5A47AB1E2D385F Time Pilot (Japan) (Alt 1) MSX +C1C5EC4042760880216F781EBD5E7174A3B0F9CA Time Pilot (Japan) MSX +D147F2CAC0600527CE49BFFFC865C54EB783E5E5 Toobin (Europe) MSX +37C85041128EE21300327726B7300A20EF6B84DD Top Roller! (Japan) MSX +EA8D86AC74DCDCA1C72DAAE517722431767C5AD2 Topple Zip (Japan) MSX +9B55970341AAAB59A73AE921C6CCF29009C1A8F0 Track & Field 1 (Europe) MSX +BE16501255617BADE264DBF63DC59008E1D84AC8 Track & Field 2 (Europe) MSX +503CBAD7516C6FDE89761388AB32845F35284CC6 Traffic (Japan) (Alt 1) MSX +7DBEAF25E3A1A66F9C6B331332DC36E73B511D4A Traffic (Japan) MSX +DFD7EF6FD86EFD5C8019B59D8FA5C5A47CF90CD0 Trial Ski (Japan) MSX +E93DA3D1910D513DBB78AD599ADBB05EB92B5930 Trick Boy (Japan) MSX +4A35065D97D81A94A7649D19B3F9ABD34F834EAB Tritorn (Japan) MSX +8547AE0FA25B9F3E26B90D4F3E1A4325B9248549 Trumpaid (Japan) MSX +BFE8046F8CCC6D6016D7752C04F0654420EF81E7 Tumego 120 (Japan) MSX +08BE92145A99DD6E0539FF79DCA62B2F4CC59B0B Turboat (Japan) MSX +6B496A50626C3E67DFE49C15A3847448DBEB05A8 Turmoil (Japan) (Alt 1) MSX +D33FE18EDE20DA4DD3D6991A9C2995E149C8FC3F Twin Bee (Japan) MSX +751D722A4F36A03E88AC62118AE8D880E40C1C84 Twin Bee (Japan) (Alt 1) MSX +ADB3977309D373AD1DC995AE7D2F8280F1673D66 Twin Bee (Japan) (Alt 2) MSX +8B828D33DCDFD324DF1827EF79F5CA9635968C6E Twin Bee (Japan) (Alt 3) MSX +4FA5382DF5A8FF7D631BE22BB8445E7BC8018A11 Twin Hammer (Europe) MSX +F3C0C1F0EC3E10CD4A5EAAE26D593198B1A5AB9A TZR - Grand Prix Rider (Japan) MSX +E73A449E34652C18AF0A72AB5C3637AFA57D5842 Ultraman (Japan) MSX +4340A2580C949D498D2C8E71699FFF860214E9EA Vaxol - Heavy Armed Storm Vehicle (Japan) MSX +DF797593395346E94AA1CF13A9524E30D631888D Venus Fire (Japan) MSX +82868A81D805FB391FCE588623FC888296CBF62A Video Hustler (Japan) MSX +EED68D254A17D76C36E094DD8A50A362A964E1B7 Video Hustler (Japan) (Alt 1) MSX +6DFC622E350D29859F05FDDB3FA1F974CD4C8BF2 Volguard (Japan) MSX +52F95F6F4261BE00AE1B9CAF88A05C021C229E28 Warp & Warp (Japan) MSX +DE6DB54CEF2CC4CBCC09C57C8ED0A1FF01347B6E Warroid (Japan) MSX +6CE0632ACC2351AE968D7D3CE9C9A0AF05C713CF Warroid (Japan) (Alt 1) MSX +28AAF59DADB425C1EF6FCA860439F4E42E1737B8 Water Driver (Japan) MSX +818D91505AD39BBA2EAF7F4857C7D41E95FCB233 Wing Man 2 (Japan) MSX +D74C381EA17ACB94527EF3ABAA280793A824D322 Wonder Boy (Japan) MSX +1672AF5BC1740480E8302F7690589EA5B5391BCB Wonder Boy (Japan) (Alt 1) MSX +76209C36BEC7CA971C6DB2E3BBCE267147E4A361 Wrangler (Spain) MSX +58E335C943D2647C3FF1E689069D9FA5E1C7FF6E Wreck, The (Europe) MSX +15CC2F7412373253E908689A778738D52656AD74 Xyxolog (Japan) MSX +1E2ABAC01EB37E43A7A61DA25DC147BBDC30AD32 Xyxolog (Japan) (Alt 1) MSX +1A6C5BA03E0CC76F7E001784E1A205375F5602B8 Yab Yum (Netherlands) MSX +8161D9B325C708AF463C5622BD89CA94754CFDEF Yamaha Play Card System (Japan) (Program) MSX +939ED6053363112C34766335B93D0DDF25059468 Yellow Submarine (Japan) MSX +8B3994AB39768F15617FB2CD9199000226B935BD Yie Ar Kung-Fu (Japan) (Alt 1) MSX +A3090A15C95334DA3E0F94030EADEE02B5032C0C Yie Ar Kung-Fu (Japan) MSX +57827F8D49369E4DBF20A968E535374D35FF1648 Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan) MSX +609D0BAC4933D1BCC877746A3E14D82C204F40E7 Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan) (Alt 1) MSX +5017ABECA8FBED43FF2FD1A936843ACDC7192DCC Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan) (Alt 2) MSX +C60A28A4048710AD3C63EF5BCF4CE03DB54C00BB Yokai Tanken Chimachima (Japan) MSX +97E173DAC64DBDE7D6A60DE7606CBA0C860813DB Young Sherlock - The Legacy of Doyle (Japan) MSX +DE765E699AF4D76D8FA80FB10D1E41581BEC11BF Zaider - Battle of Peguss (Japan) MSX +F784350AF0C5C7407D83DA2BB499C59A08496AAC Zaider - Battle of Peguss (Japan) (Alt 1) MSX +B030B3C22BAADD0D419657DCFA4B974AE1CD7508 Zanac (Japan) (v2) MSX +FFA8FC5756F7E1D1EF168618F5606ACA10F8B2C7 Zanac (Japan) (v2) (Alt 1) MSX +372623401599C57968DAAC0312DD9A0ABBC6BD2F Zanac (Japan) (Alt 1) MSX +46E9ED7B7F6DFDA8EEE266476C9EBC4DD9D8FCC2 Zanac (Japan) MSX +D88F33EE40839F87CDCE6CC4820E1DD192A01776 Zaxxon (Japan) MSX +3DA301B1082C158E505523FA22C19F1B3F4D851C Zaxxon (Japan) (Alt 1) MSX +59679B1ED40416F4C8D65085E5473C621BEA6AC4 Zen (Europe) (Program) MSX +2F4404D141ACC40E48AF0B12C70CD44B066ECE10 Zenji (Japan) MSX +C9440172802818CC5B9AE559FBD3F346A263605C Zenji (Japan) (Alt 1) MSX +9D5F6098B71712E9D9E386739B82FC484380F114 Zexas Limited (Japan) (Alt 1) MSX +71442AC703C2966142B04071FEDF180E81DAAB9A Zexas Limited (Japan) (Alt 2) MSX +A87971B9DF0DE44644C2188F5F475AEF7AE85304 Zexas Limited (Japan) MSX +07DB3E3FFB16C138F9DA12CACDE48BF7522A188C Zoom 909 (Japan) MSX +FCE65889DC551C83638F2E2ADE1FD61DD44D6F58 Bit Logic MSX +C4DFDA5C87C132830B6D776DDE4DE82FE6EC2865 BURNUS v2.0 MSX + + diff --git a/Assets/gamedb/gamedb_msx1.txt b/Assets/gamedb/gamedb_msx1.txt deleted file mode 100644 index 5c4e2b5141..0000000000 --- a/Assets/gamedb/gamedb_msx1.txt +++ /dev/null @@ -1,937 +0,0 @@ -;MSX1 SHA-1 -FC71561A64F73DA0E0043D256F67FD18D7FC3A7F [BIOS] Kanji Rom - JIS 1st Class (Japan)" MSX1 -33536DAC686B375BA13FAF76A3BAF2D6978904E0 10-Yard Fight (Japan)" MSX1 -FD15698518172BCDE3318F08EE032531CBBB9F5D 10-Yard Fight (Japan) (Alt 1)" MSX1 -0733CD627467A866846E15CAF1770A5594EAF4CC 1942 (Japan)" MSX1 -DA397E783D677D1A78FFF222D9D6CB48B915DADA 1942 (Japan) (Alt 1)" MSX1 -F8164D3872B5D54EAEAFC6DE3BB98A472F0C828D 3-D Golf Simulation (Japan)" MSX1 -9A63D48C4FC05E76C9DE25E5C5F2A0C99B5D1BE4 3-D Golf Simulation (Japan) (High Speed)" MSX1 -6FE8C1725C35D85A5E489C0C8D21134DEF09ECFB 3-D Golf Simulation (Japan) (Alt 1)" MSX1 -8F71DDDD429173DF7CE52C5245AF1A76B482A901 3D Tennis (Japan)" MSX1 -6B8A684DDBADD798A8E599449B823BCECA9CDB58 A.E. (Japan)" MSX1 -937464EB371C68ADD2236BCEF91D24A8CE7C4ED1 A1 Spirit - The Way to Formula-1 (Japan)" MSX1 -CB48969F27EAEBF24C61F651399EC2433D85BCBC Actman (Japan)" MSX1 -3CA4A1AB35B3CBE3DDB238CE88CA9DF258AE37D6 Actman (Japan) (Alt 1)" MSX1 -AE0C0B0C9468E137EBA5B52F96241ACD55D9746A Adven' Chuta! (Japan)" MSX1 -EC5111E3B06D64EF51196FF87448E1C62BE4CDD8 Albatros (Japan) (Alt 1)" MSX1 -13D38CC80112BAA9BCBF03569988C163015D434C Albatros (Japan)" MSX1 -807676038CBBA043B8099EBA9C5840A4811A7E59 Alcazar - The Forgotten Fortress (Japan)" MSX1 -F3815211C6183B4F9C26B9E7D0A12C3B3870BDDA Alcazar - The Forgotten Fortress (Japan) (Alt 1)" MSX1 -639CB280544B060A618AF23DAF234A44BAAF88DE Alibaba and 40 Thieves (Japan)" MSX1 -ACC14E9886A3281B658DC458C1AE93FA9F24DB04 Alibaba and 40 Thieves (Japan) (Alt 1)" MSX1 -41B3B1830084EF00B61339C46C96BD0EF62CD6D3 Alibaba and 40 Thieves (Japan) (Alt 2)" MSX1 -3DE0CEA6A4575E631FEE0DB985E0F0F584761980 Alien 8 (Japan) (Alt 1)" MSX1 -5FB90BE078E432DB92DD39E621D12F612DBEA4A8 Alien 8 (Japan)" MSX1 -2639792DF6F7C7CFAFFC2616B0E1849F18897ACE Aliens - Alien 2 (Japan) (Alt 1)" MSX1 -5380E913D8DAC23470446844CAB21F6921101AF8 Aliens - Alien 2 (Japan)" MSX1 -0D9C472CF7687B86F3FE2E5AF6545A26A0EFD5FC Aliens - Alien 2 (Japan) (Alt 2)" MSX1 -627E4D311DFE8A43A629E63F444A6F41EEBAD835 Alpha Roid (Japan) (Alt 1)" MSX1 -97E7D0EE40C7D6CE1A8EDF7B06E5014E6745CFDA Alpha Roid (Japan)" MSX1 -1D81E6CC165B3330B9B3C8B4F4DA0417B1AB901E Alpha Squadron (Japan)" MSX1 -FD6CC08D4842A85A3C741CF9C30883DDFC378895 American Truck (Japan) (Alt 2)" MSX1 -88FA967C420F7090A11E5DE1D3674F4527F53D52 American Truck (Japan) (Alt 1)" MSX1 -076ABC988D51FAEF30143750DD41318A8A48C5C4 American Truck (Japan)" MSX1 -27C40EC7013C1AD1F9A7E1AC1E0C8BE99F1E703F Anaza - Kaleidoscope Special (Japan)" MSX1 -A1ABFC53A36D387B9F0687E3F5897C1EBDF21517 Angelo (Japan)" MSX1 -3A4A65DC6D540297A7AAE0A9914897AACF740807 Angelo (Japan) (Alt 1)" MSX1 -495876C504BDC4DE24860EA15B25DDA8F3B06C49 Animal Land (Japan)" MSX1 -E894A38F3E2AD435CC5D17A66600E6016B5E47FB Antarctic Adventure (Japan)" MSX1 -44DEAEF747C572A4550681FCCCC1BBBDC46A1FFC Antarctic Adventure (Europe) (Alt 1)" MSX1 -2185BE579CB51729F66BF02BDF3A7B6A3CBD7B40 Antarctic Adventure (Europe)" MSX1 -F236345F43828597739F4A326318B6A3876FF73F Anty (Japan)" MSX1 -1A00EEF3DF449D71ABF4BE5A4C8D01BA9DCD6B79 Anty (Japan) (Alt 1)" MSX1 -633CB458EEAB0FEA59A70A9A620B7783A44EB0A6 Aqua Polis SOS (Japan)" MSX1 -93462AC9A322C2E5E0D996FDDBE9EBA2F3436931 Aquattack (Japan)" MSX1 -EC53D72E41E114574F4C116CAB19E1633F3DA207 Aramo (Japan)" MSX1 -45CE64A455A2B07F3C8A6D541CDA3B0E058CC732 Arkanoid (Japan) (Alt 1)" MSX1 -E1527AE16D33A09D9CF3D4EA52E63337D2273910 Arkanoid (Japan) (Alt 2)" MSX1 -5002BA598469B34AF25BFF5011CCC70ED3723B0D Arkanoid (Japan) (Alt 3)" MSX1 -2183F07FA3BA87360100B2FA21FDA0F55C0F8814 Arkanoid (Japan)" MSX1 -FBE43D67A5BC0AEDB2E194A4E5F9497B7488362B Athletic Ball (Japan)" MSX1 -90BDD12D632D2E909AC5D69235AD0366F430B734 Athletic Land (Japan)" MSX1 -DE9EB0E9EF183F49E9D9B631F8818F9CAC5DF409 Athletic Land (Japan) (Beta)" MSX1 -866CB3AB10F17E4FB356FBD7277BBF17C4E27EBE Athletic Land (Japan) (Alt 1)" MSX1 -C5F1897C416F62CD58CD6257282E3428155CD698 Attack Four Volley Ball (Japan)" MSX1 -4C8A97669017296C2360FF9D53694A292197991E B.C.'s Quest (Japan)" MSX1 -0D504C359661AC731DE07A7319AFD0E31F01A5D7 B.C.'s Quest (Japan) (Alt 1)" MSX1 -C345357E71D1B8F2C9663BF28ABB5A3A2957D49F Back Gammon (Japan) (Alt 1)" MSX1 -2B8878609BCC0D1555AE250D621BA6E9DF4AFC52 Back Gammon (Japan)" MSX1 -469B07EEF08348C9ACC14E63BA0CD35AEF236983 Back to the Future (Japan)" MSX1 -1A6A751334C663FBFDF93F617A7D779F76F488CE Back to the Future (Japan) (Alt 1)" MSX1 -363B5A8C94CDB63A7EE72B9D25F7B5053CAB319A Backgammon (Europe)" MSX1 -CD452442338366411F6B24739FE59E20F3AC24DC Balance (Japan)" MSX1 -B103D4248729AEDA9EBF5766C1791B1950246968 Balance (Japan) (Alt 4)" MSX1 -28323E06A402747A1E131DC30CE031A339F6C947 Balance (Japan) (Alt 3)" MSX1 -134A6FAF1592978608B55269AEA101D5FAD68760 Balance (Japan) (Alt 2)" MSX1 -6D73EE99AC367A2558FD9366AF75AD39ED0D4E69 Balance (Japan) (Alt 1)" MSX1 -7A40237867F62611D0E976666451648EDB80753C Banana (Japan)" MSX1 -B0956B97C9087AABAB333C271C7AFD9754AE84CD Bank Panic (Japan)" MSX1 -B337EA56278523F984D1B000CD00F339D82017A0 Bank Panic (Japan) (Alt 1)" MSX1 -9F0CBB1191235ECCA4985DE976A0993744B57930 Basic Lessons 1 (Japan)" MSX1 -01CF858888F5A0D3AEE08F42A66C515AB0D06400 Basic Lessons 2 (Japan)" MSX1 -709FB35338F21897E275237CC4C5615D0A5C2753 Batman (Japan)" MSX1 -EE7DBD36A2B0BBAE11C68AC4DE75077F283BED05 Batten Tanuki no Daibouken (Japan) (Alt 2)" MSX1 -F86A7945B34C97CC58D5EE27964968870BFCEF93 Batten Tanuki no Daibouken (Japan) (Alt 1)" MSX1 -9B58C70B976CA1D841185DE862E7D663EC9DB56B Batten Tanuki no Daibouken (Japan) (v1.03)" MSX1 -8B63F36BE31D7D021C19103EBE8C68B69AAE699C Battle Cross (Japan)" MSX1 -0F214EA9E8D673EE0C66CB6615032E57920D588B Battleship Clapton II (Japan) (Alt 1)" MSX1 -59BC608B1CB5BDE2230BCA0EB045CD6C58650774 Battleship Clapton II (Japan)" MSX1 -1BDB1898796E2B48B62A356035192B163113962C Beach-Head (Europe)" MSX1 -1231984AE24BF35F9F38596B864420D8CCD3F30B Beam Rider (Japan)" MSX1 -F51F936887498D21F6EE9FE8A7701633BE67E79D Beam Rider (Japan) (Alt 1)" MSX1 -01EBDD5981C4841ABDDF6F76EB1F73E237E7688F Becky (Japan) (Alt 2)" MSX1 -702D8F1762D4EFE994F520E21E8867ADAE13B817 Becky (Japan) (Alt 1)" MSX1 -D69D4A6F2834B20DF3A2AFBD7A927220E96E31E1 Becky (Japan)" MSX1 -3197D73A5400A72420F91DEF6D3AA8BDCB392754 Bee & Flower (Japan)" MSX1 -250D4C7C6565B0C4935F6301E8DE2C182E659FD0 Bee & Flower (Japan) (Alt 1)" MSX1 -A2DE457567E87C794FBA8E35C992EAC352DA78BE Bee & Flower (Japan) (Alt 2)" MSX1 -4806E6BC1FD24D5A62C6DF57EA8FD1B51D6E4B80 Bifamu (Japan) (Alt 1)" MSX1 -EBFF5D2B4253F62D3A00F1A6D6B4D81053C7B8A6 Bifamu (Japan)" MSX1 -EF476E25FB6B7221CA778A379117885450DD36F0 Binary Land (Japan)" MSX1 -2588B9ADE775B93F03FD4B17FD3F78BA70B556D6 Black Onyx II, The - Search for the Fire Crystal (Japan)" MSX1 -5400C0C929B31A70E76AAC676B91D40445F1B427 Black Onyx, The (Japan)" MSX1 -65AF16D35B8D8454EC07718E9F8948335CA73BAD Blagger MSX (Europe) (Converted From Tape)" MSX1 -8E3E05E8928B5B77FA61F3B833E164BF5222A5FB Block Hole (Korea) (Unl)" MSX1 -BD4B8C48F1D8107F11AE680A787D7B3825669B7C Blockade Runner (Japan)" MSX1 -E2EF32F2FC312F96B8424569E9E85A6EA3B21CE4 Boggy '84 (Japan) (Alt 1)" MSX1 -5C96169207E197237AA728D8CE4E24C0635D5904 Boggy '84 (Japan)" MSX1 -04283AE02107917DA6F54A0F38D3A28254F7AB69 Boggy '84 (Japan) (Alt 2)" MSX1 -D7E2A4F78B3E240309C6367AC9DD9C9AEB95E3EE Boing Boing (Spain)" MSX1 -E5171C368883DE03FC8D75E61BF23D954EC1BBA4 Bokosuka Wars (Japan)" MSX1 -5503D23FAF94F076410D252F69F6BF5ECE4DA292 Bokosuka Wars (Japan) (Alt 1)" MSX1 -482CD650220E6931F85EE8532C61DAC561365E30 Bomber King (Japan)" MSX1 -5324E053709FF8DA6C18AE4AFBA6A2E0C3A722BA Bomber Man (Japan)" MSX1 -E700493E1C4C14F711E9C1C262FE3E8D76931CA3 Bomber Man Special (Japan)" MSX1 -0B3241202F0E2BE470E5F2E6139C01983A895BC8 Boogie Woogi Jungle (Japan)" MSX1 -05B7A1DB1FF15F712E619FD1C79FD7710E93CB3B Boogie Woogi Jungle (Japan) (Alt 1)" MSX1 -86F8E3250CDCBADCCF131255A1EF59ED291BE8E9 Boogie Woogi Jungle (Japan) (Alt 2)" MSX1 -EF535AB6013D9B6E38227272F2EBE6A0F0B33CB5 Boomerang (Japan)" MSX1 -DA7CFD16DD1A76AE6B551CEABFD7053CA8E3412F Boomerang (Japan) (Alt 1)" MSX1 -16C3CED0FB2E360BC7C43D372A0A30EB6BD3963D Borfesu (Japan)" MSX1 -451CBB072011B26A7E0BC9931E67995A71F5FD6F Bosconian (Japan)" MSX1 -33AD6D1BF1FB816B232EA706D149327E363C7B21 Bosconian (Japan) (Alt 1)" MSX1 -0BF7B432DC132F9A7BC74106261BCA07D5F99690 Bosconian (Japan) (Alt 2)" MSX1 -B15E73A5FF1AE17AC67F2CEBB5862D5E5BD80BC0 Bouken Roman - Dota (Japan)" MSX1 -1FFEF57E6C06068B330027294AAE173103C8F141 Bouken Roman - Dota (Japan) (Alt 1)" MSX1 -14FAE375B81C86F71E872ADCA792C23AAFAC66A0 Boulder Dash (Japan)" MSX1 -F1F571C1D9360839450C26D73C6AEF89E1E052EB Bouncing Block (Spain)" MSX1 -B76FFB94A08457DF0A51897CD87CD8A91610224C Bouncing Block (Spain) (Alt 1)" MSX1 -208CE6CBFF7402BFE52B1062E6B10AE09C0A3179 Brain, The (Japan)" MSX1 -BCFDB43B275C62A76856AAB94FB1B53BD92B2DB2 Break In (Japan)" MSX1 -3D065377F11B23410282B6B76F26BD93B9D05184 Break Out (Japan)" MSX1 -C64F2FAD6417C64595BC204D843527E17A58776F Brother Adventure (Korea) (Unl)" MSX1 -6F9B4D791F4A43D7182650F21A7BFE88D1C5C2B4 Brother Adventure (Korea) (Alt 1) (Unl)" MSX1 -621EA075A534584361C9E9D640E39007A79DFD78 Bruce Lee (Japan)" MSX1 -D1ECE8B5FFEB9B99230E640AF32CB488FEE51E35 Bubble Bobble (Korea) (Unl)" MSX1 -58551545E73C838A2E995E6951AB644ED2590786 Bubble Bobble (Korea) (Alt 1) (Unl)" MSX1 -CE1376941359471CAE41887FE11F10D3B696A926 Burgertime (Japan)" MSX1 -613C741535C92DFB01AFEC4135EF8EBDDB49F999 Buru To Marty Kikiippatsu - Inspecteur Z (Japan)" MSX1 -B755D7DB109CD0A9392ACCD1C83E6D995A8A04D6 Butam Pants (Japan)" MSX1 -2F7FF0438F1A8D80292C9E1CB8D77A92C600B505 Butam Pants (Japan) (Alt 1)" MSX1 -E6A1D90A7A8B4E4B8A8E1AFB3D971866931B986D Butam Pants (Japan) (Alt 2)" MSX1 -CD69CE70747BC0DEEBBA9FD307A07F5DFB926CC3 C-So! (Japan)" MSX1 -2A0F9899A4D8DBA76DB501D6E3435546CC7CD9AA Cabbage Patch Kids (Japan) (Alt 1)" MSX1 -C06DE0EDA82E1DAA3EA3CBC5EBA5D884FD0CE8E8 Cabbage Patch Kids (Japan)" MSX1 -69710F4B9CC3440E58C54BD4C562B3E90FF323E0 Candoo Ninja (Japan)" MSX1 -77F3F6758BD4CF5D2B44C51DE958AA967C41A9D7 Candoo Ninja (Japan) (Alt 1)" MSX1 -D32279E01FB5762778D696ACC2053B9503D5A715 Cannon Ball (Japan) (Alt 1)" MSX1 -B36C925005F1E530CAB2B5F6E2A5DDFD182C0140 Cannon Ball (Japan)" MSX1 -31D80470C8D23EC8B14256AA32F3D54DBC532D76 Cannon Fighter (Japan)" MSX1 -F025C9C2DB97DCE608FCC1050426BEFF0DEA43EB Captain Chef (Japan)" MSX1 -E93C396649BF6328103E8DA0247952EBEF2A04E9 Car Fighter (Japan)" MSX1 -11E2F95D1B58E1244EFDA761603A2AE6D0090D18 Car Jamboree (Japan)" MSX1 -8A158CDEC0923B81CE13AF2DFFA5D1B7E096A469 Car Jamboree (Japan) (Alt 1)" MSX1 -97AF4F422A283AC8BA387EB0B1B29395C2C966EB Car-Race (Japan)" MSX1 -AB7354C9CED9782D572C4DD69249B76A1244E5CE Car-Race (Japan) (Alt 2)" MSX1 -E7396AD700F7EDF98CC2B0EC2E6127A68D3CD9BA Car-Race (Japan) (Alt 1)" MSX1 -5B17CB69697CF55DFF1F0B8777E19D5ABC1771FC Casio Daishogai Keiba (Japan)" MSX1 -CAD653766B597A4AA130A9A1956ECE77BA4D52BC Casio Pachinko-U.F.O. (Japan)" MSX1 -17D6DB13D7D76FBD110F53B168AB0001C7E65817 Casio Ski Command (Japan)" MSX1 -FE53D85ADB758103097FD56132E71C7F4CB32313 Casio Ski Command (Japan) (Alt 1)" MSX1 -0A2209E0A71684493998F6618AF032BA580D4FF9 Casio Worldopen (Japan)" MSX1 -811DCA8FC14A2B00F503FBEF74FDEAE4F2873D4C Castle Excellent (Japan)" MSX1 -D55E9E237504BC6444C6B62894BF88292150042A Castle Excellent (Japan) (Alt 1)" MSX1 -615C08820B926E28B143CD7812852E011D3EEFFB Castle, The (Japan)" MSX1 -B6F10B6BEDC26D9415335997493139CE7A2C7916 Chack'n Pop (Japan) (Alt 1)" MSX1 -0B9A870D1E6CC712A3EFCE2349FB1C1CF6902D22 Chack'n Pop (Japan)" MSX1 -3ABAE41CB742B76FF45DD178BD7DB346137FE0FA Challenge Derby (Japan)" MSX1 -39CB046A9B6B6EF4E769CDC6FDF36B274CD44039 Champion Boxing (Japan)" MSX1 -EBB46DD4CF36407AD82D9F50D9BEF3E938DC144E Champion Ice Hockey (Japan)" MSX1 -F9E9A6E517EE0B9B3147ABB6144B31ED2CA8DBDA Champion Kendou (Japan)" MSX1 -A502E37F580BD287ED8338FCB1D809B8DC90BBE0 Champion Kendou (Japan) (Alt 1)" MSX1 -AF1A6F4DD12D726A7A4377753CE3DB82BF24EBA4 Champion Pro Wrestling (Japan)" MSX1 -D1E3AFECDE1656099DADFF99C6ED2AA8FA6DD834 Champion Pro Wrestling (Japan) (Alt 1)" MSX1 -0C364C3499DF76F2E15D2AEB744A0DE3730FF47B Champion Pro Wrestling (Japan) (Alt 2)" MSX1 -821C611B851DDD4CF8CFB4E77CECBC882F12EB72 Champion Soccer (Japan)" MSX1 -650381B96F36E74A4EAF5AE3F924F6F8DEAC7100 Championship Lode Runner (Japan)" MSX1 -A4BE5763CDF2DCD647B87E3AECBAB28ECC69776E Checkers in Tantan Tanuki (Japan)" MSX1 -DD5C2D2D5F0947159B7615F647FB8121F3B037A2 Cheese (Japan) (Program)" MSX1 -2C0C71C549738D668518DB317DD70AECEFD4AA72 Chess (Japan)" MSX1 -20AEB411AB5ADB9BD3DB412A7837E496969F8CE3 Chess Game, The (Europe)" MSX1 -A2A7C93C9C8B55A5CCE4C9005F3C194E3B762E9C Choplifter (Japan)" MSX1 -30673D173F96FE1830E579F18DAF8AC9FC3366CB Choplifter (Japan) (Alt 1)" MSX1 -B3CA70C8C8120F8261BB865BAF5F57B6506CA02E Choplifter (Japan) (Alt 2)" MSX1 -99F9E9753EDBAEE820E36A1A58F1CD7AE2B26265 Choro Q (Japan)" MSX1 -EE3CA231328534BBA92F9A908C4FAED865BCEA68 Choro Q (Japan) (Alt 1)" MSX1 -20CE189D670C0FE5F2A945D73107DF7D83070FF7 Chugaku Hisshu Eibunpo 1 (Japan)" MSX1 -AE6D0EFD55DEF94274F4CEC459DF8927D132675A Circus Charlie (Japan)" MSX1 -07AF8B1EC0786C44778F68EF3BB0B3D4793F42E3 City Connection (Japan) (Alt 1)" MSX1 -0071B2EB214FF002DBBB7532653585B35B56F243 City Connection (Japan)" MSX1 -308C73FC04C3B390B72EA8D4980C94C74BA38A5C Coaster Race (Japan) (Alt 1)" MSX1 -17F24B9339291DEA40D2ED36517F223B9E4F49E1 Coaster Race (Japan)" MSX1 -47EA8D512D9FEC15DF8770F3B5017AEA9BBBA9FD Coaster Race (Japan) (Alt 2)" MSX1 -AC391FE51F69E0A55FE3AB66C8EC3F2792DD5D08 Color Ball (Japan)" MSX1 -83FDAA429AD8B155AB2328A72FCB8DE642FF5615 Color Ball (Japan) (Alt 1)" MSX1 -95D8A590BAD595F9441AEA4BF68667DE05B1B34B Color Ball (Japan) (Alt 2)" MSX1 -9B4DA7636809D5690D6BD5D782FFA3CF9F4C63EC Columns (Japan)" MSX1 -1CF39E12313FF3064353C136262F176A56AB20A6 Come On! Picot (Japan)" MSX1 -546AAF36EE78717FE06125185F0D420FDFF0D34C Comecocos (Spain)" MSX1 -A054DDEAF471212764CC596BCBD30E94B10E6C28 Comet Tail (Japan)" MSX1 -FC327D3946366CA75DE0D0619EB0917A27E1BD61 Comic Bakery (Japan)" MSX1 -D2604A1F76CADD36EDE570E23AD49B0885187E25 Comic Bakery (Japan) (Alt 1)" MSX1 -8CF06F93D4E8BCF7BE04AE8532F72E6EEC8BA2F1 Comic Bakery (Japan) (Alt 2)" MSX1 -630AEC6F93DF8D1EF83C52A0BB6EC571B9C6EED4 Computer Billiards (Japan)" MSX1 -1FC9D3B54A617E57FD6ED10F2CE3C01456710E37 Computer Nyuumon - Computer Lessons (Japan)" MSX1 -BD8F335FC45E9920F0691A525A0FC853B2E4B595 Computer Othello (Japan)" MSX1 -81C50AF8EF09E0B7A8A69FD4715592B5E803CDB5 Computer Othello (Japan) (Alt 1)" MSX1 -99D3EF107F2AC4D452B05EB96B922924EF4C5434 Computer Pachinko (Japan)" MSX1 -09CC29B413DC7B8747420615BF798169AE68AD14 Con-Dori (Japan)" MSX1 -868D84F8A6AE0434BF86ADFBB86996CEDDEFBA84 Con-Dori (Japan) (Alt 1)" MSX1 -8592B14EE701EAAF433113A26B199084C124992F Con-Dori (Japan) (Alt 2)" MSX1 -9865F0BC4D54137809F0D8B48D5461DDF0C5BF4C Confused (Europe)" MSX1 -5AD0BA434407A7EEECB597B3D20BCFC6FE05C319 Cosmo (Japan)" MSX1 -BB7468DD32A160851B39121D24713B0B4E065C19 Cosmo (Japan) (Alt 1)" MSX1 -0AC6C061C3897A3989DCD75B4878C850C71E4BB8 Cosmo-Explorer (Japan)" MSX1 -B6F8E1431BDA1296C2959B10B021B80E0FF2A8A2 Cosmo-Explorer (Japan) (Alt 1)" MSX1 -613CC52FBD5822ADE47DAA3EC21479641A009C2C Courageous Perseus (Japan)" MSX1 -6CF3F098D592D7DCB767A0E24B5CAF327B5F22DB Courageous Perseus (Japan) (Alt 1)" MSX1 -9E0312E72F30A20F556B64FE37DBBFE0D4471823 Craze (Japan)" MSX1 -FF5B12275950EDAE9ECE3F49ED59402D47F23B1B Crazy Bullet (Japan) (Alt 1)" MSX1 -5D5DFE6CEC605DE421C3AED3A743D6840FEC1457 Crazy Bullet (Japan)" MSX1 -76C191BF7DCC0888D65E543C47F615AE45B75B92 Crazy Cars (Europe)" MSX1 -8ACA0EE5845B0B39AF624E8A998BB04F02D0FDA4 Crazy Train (Japan)" MSX1 -31B452FF42624C6AC1E0141D65869DF1EABE5BB3 Crazy Train (Japan) (Alt 1)" MSX1 -BB902E82A2BDDA61101A9B3646462ADECDD18C8D Cross Blaim (Japan)" MSX1 -C6F090882886DCF783E5B65BFF75C5E034FBB2EB Crusader (Japan) (Alt 2)" MSX1 -3D2D0A2EB3D12FA67ECBBB90B7AC1BDC76AD8412 Crusader (Japan) (Alt 1)" MSX1 -D0E8BC3F5FD93DCD07CBB945B00018A491842242 Crusader (Japan)" MSX1 -18E87E15B09EC2FDDC52FAD10EDC57918FADEC34 D-Day (Japan)" MSX1 -BA325451FB5A80C2872742C5BD61E7BB75C5763B D-Day (Japan) (Alt 1)" MSX1 -C62E058C2A54F3C9ADBA2E6A3006B8E749C43BD7 D-Day (Japan) (Alt 2)" MSX1 -0BA8AE697F3045B3B3175B27D00AC0E522288FF1 D-Day (Japan) (Alt 3)" MSX1 -27A487E56721E947C1F46644F2F8A50156DDA82D Daidasso (Japan)" MSX1 -2418C0302ABBCE8B0F8556B63169C60A849F60EE Daiva Story 4 - Asura's Bloodfeud (Japan)" MSX1 -D8C074267E0B2EC225D5ACBA688EA7304233DA13 Dam Busters, The (Japan)" MSX1 -0738FEFA62BE2ACBD0F324F28538BBA9551406AC Dam Busters, The (Japan) (Alt 1)" MSX1 -6A4E8325D2174747D56CBE4C6803CBF40EB40A62 Danger X4 (Japan)" MSX1 -7C618058809302BC3553D6189BCF310F2E5B0E08 Danger X4 (Japan) (Alt 1)" MSX1 -50EAFA5D735AF5B34D14F9F6B8C2D9CD2F0441DB Danger X4 (Japan) (Alt 2)" MSX1 -4B19979E01BAB2289ABB6034CB3C2D02C2E890D1 David II (Japan)" MSX1 -6856A13B67750D36C4C466D30472DC5465879BBF Dawn Patrol (Japan)" MSX1 -A1656F612360A126E09EF2BAAA8002D92054125D Decathlon (Japan)" MSX1 -5D43CB6CA89F31D5F543E4DCD3FA9987B9769602 Decathlon (Japan) (Alt 1)" MSX1 -E6419519C2D3247EA395E4FEAA494A2E23E469CE Deep Dungeon (Japan)" MSX1 -D82135A5E28B750C44995AF116DB890A15F6428A Deep Dungeon II (Japan)" MSX1 -6BAD9AF91907C2A97FA2F4B9DD2A699CE0D70FBA Demon Crystal, The (Japan)" MSX1 -D5B164797BC969B55C1A6F4006A4535C3FB03CF0 Demonia I (Europe)" MSX1 -4B4A58A310A1138B95192D7FE0881BBDC45601D4 Designer's Pencil, The (Europe) (Program)" MSX1 -91BA5C063D0ED383165B26E4609D7ABDA02A5242 Devil's Heaven (Japan)" MSX1 -6E2E5CFF4EE4DD935FBE6684F2C54B39ECA06092 Dig Dug (Japan)" MSX1 -E3391DAAB17710B3F34C70F60AC6C8BFEA15B6CC Dig Dug (Japan) (Alt 1)" MSX1 -7DC7F7E3966943280F34836656A7D1BD3ACE67CD Digital Devil Monogatari Megami Tensei (Japan)" MSX1 -03B42B77B1A7412F1D7BD0998CF8F2F003F77D0A Digital Devil Monogatari Megami Tensei (Japan) (Alt 1)" MSX1 -65F89C813A1D57A8F8A04E81682202F759EE6980 Dip Dip (Spain)" MSX1 -6B12BB291E1A98A43CCFF8CEB94D23585848FEBC Doki Doki Penguin Land (Japan)" MSX1 -23531B4E8A2B3E975483318846CF89E65F32F7D1 Doki Doki Penguin Land (Japan) (Alt 1)" MSX1 -F8FEEAC4384BC4F109C70F962E15CE925BF70C13 Doordoor (Japan)" MSX1 -19C610339C0480C3D2D0D1C21E3CCBF2179BB191 Dorodon (Japan)" MSX1 -6724B2ABCE8145609333C8B2964DE0F1A90D9CD5 Double Dragon (Korea) (Unl)" MSX1 -6E6B8CDC55713EABC724F3EC9624E9884254AB33 Dr. Copy (Japan)" MSX1 -533DC6D28CA60C090740879DCB3CFA386544EE45 Dragon Attack (Japan) (Alt 1)" MSX1 -761AB0AA7F528BF0F51EA9DE75C847EA949478D7 Dragon Attack (Japan)" MSX1 -7B94A728A5945A53D518C18994E1E09A09EC3C1B Dragon Quest (Japan)" MSX1 -3DF7C19F739D74D6EFDFD8151343E5A55D4AC842 Dragon Quest II (Japan)" MSX1 -D7B46AECE68C924E09F07E3DF45711F337D35D6A Dragon Quest II (Japan) (Alt 1)" MSX1 -397716D26A075C6D731F0B04F3FA24AA39521798 Dragon Slayer (Japan)" MSX1 -6C1814C70D69A50EC60E39EF281F0B8CD7BF8598 Dragon Slayer II - Xanadu (Japan)" MSX1 -F100A76117E95AB0335E89A901E47D844BBC0AB6 Dragon Slayer IV - Drasle Family (Japan)" MSX1 -2F0DB48FBCF3444F52B9C7C76BA9C4BD38BC2A15 Dragon Slayer Jr. - Romancia (Japan)" MSX1 -E34161034364EF03DF907D62976C2AC8F551404F Drainer (Japan)" MSX1 -9B815EFAA927C11827ACFDB0F9B9197B5AC97572 Druaga no Tou (Japan)" MSX1 -D1FBDBDF2E830139584D7DC796806AA3327720DD Dungeon Hunter (Japan)" MSX1 -353E2BD901E5502375DC92A04E1686C1192FCF42 Dungeon Master (Japan)" MSX1 -F63D274A8A7AD8E285DD8800264AB9C14AA9F870 Dunk Shot (Japan)" MSX1 -E7D9D1E4DCF48779DAB41EB6C15478F934BD8BC1 Dunk Shot (Japan) (Alt 1)" MSX1 -C20DEF84EFE71EFDF91DF3100919D151B2E7BDC1 DX7 Voicing Program (Japan) (Program)" MSX1 -D7109CF20A22558F923C833FF0B4E2311340ACB1 Dynamite Bowl (Japan)" MSX1 -D916F0E4BD3C829A0472C6EC18D08907A5C991F3 Eagle Fighter (Japan)" MSX1 -83FED4090D0942C8E0054437745C1C0EBEFC6222 Eagle Fighter (Japan) (Alt 1)" MSX1 -28BF2354CDD70E30B682F40B734029ECE44D70BD Eddy 2 (Japan) (Program)" MSX1 -20F1883C45FC3C39DDF48A7DE69B6EF588FAC8FB Eddy 2 (Japan) (Program) (Alt 1)" MSX1 -E49F66E8BA45D0647C93A57BBC1FB7ABA4665A6E Eggerland Mystery (Japan)" MSX1 -473BC0EA85ED1B218974796D819416E711AC193F Eiwa Jiten - English Japanese (Japan) (Program)" MSX1 -6CBDDD118AFE63E79CB8A40F8AA879DF1C7590E1 Elevator Action (Japan)" MSX1 -7DE755F98B6A68886E61473D524D0AA6AB6577D7 Erika (Japan)" MSX1 -7F6906FF7017A558952197198AC7A1C1E222ED9D Exa Innova (Japan)" MSX1 -A14B357A1B16163F5FFA96B0B617D352713AC047 Exa Innova (Japan) (Alt 1)" MSX1 -B5B28F53B16D43742D9D7DAF5EE7DCF74B80E6C8 Exchanger (Japan) (Alt 1)" MSX1 -DED8D969542B7BE02524037FA244E6648C3F4E03 Exchanger (Japan)" MSX1 -8ECC34EBFF9D37C0FE9560CFDC53A052CFF3D1AB Exerion (Japan) (Alt 2)" MSX1 -975FDF521C08030896EB50AF4F39A23500EAF7AC Exerion (Japan)" MSX1 -09B0EA7C5595F4E9C9A15219F30E3423BBC25F66 Exerion (Japan) (Alt 1)" MSX1 -2B36FE2B0D98D65AB31F13FCB858DB6858A51D46 Exerion II - Zorni (Japan)" MSX1 -AA1621A6B61F7CFB2DF8DD2CF8647A943E13DFA7 Exerion II - Zorni (Japan) (Alt 1)" MSX1 -3137E676C37195D46FE6ACC4395D0DC4D711D919 Exoide-Z (Japan)" MSX1 -06BFDD6D0F0D84B1D534C81B27150193969168B3 Exoide-Z (Japan) (Alt 1)" MSX1 -91BEE8AF612F69C5413A1D23102CC5EA896C2CAA Exoide-Z (Japan) (Alt 2)" MSX1 -22C7ABE6C8F4B7897ECB583D4913D35B5F62C5E1 Exoide-Z Area 5 (Japan)" MSX1 -42FBB18722DF3E34E5B0F935A2DC0CE0D85099E9 F-1 Spirit - The Way to Formula-1 (Japan) (Alt 1)" MSX1 -FF72A1788D47F9876D9FABD720F6A289FB409090 F-1 Spirit - The Way to Formula-1 (Japan)" MSX1 -5C7A13B64B48065231F05C35B4C8B209534F3A8B F16 Fighting Falcon (Japan)" MSX1 -A469935DD39A856C06676817F51B403A3678AC1A Fa Tetris (Korea) (Unl)" MSX1 -EDD61208E11149E226CD2EDDF5C9ECA8EE1BA33E Fairy (Japan)" MSX1 -E11AFC03DB4E1D03976D02796B29DA9C65D4FF3D Fairy Land Story, The (Japan)" MSX1 -2BB837A9051277BA574D8351A9F91F9E57033074 Fairy Land Story, The (Japan) (Alt 1)" MSX1 -216243B4BCB9070F9E86C3F04EDAAA493E4B459C Family Automation Language Community (Japan) (Program)" MSX1 -8557DCDB4CF1E15180D17ACC8E6D515BF7BF7E7C Fandom Library #1 (Japan)" MSX1 -7752B6624FB80D9499AAAD28DD5776EC74565576 Fandom Library #2 (Japan)" MSX1 -C2F4DF1BD91F7DEE1536774B9D7089086B9BF835 Fandom Library #3 (Japan)" MSX1 -048737F995EECB1DD8DD341D750EFD005267796F Fantasy Zone (Japan)" MSX1 -E6B71484D5AB578FD3695917FCE3C1E805A5B536 Farm Kit (Europe) (Program)" MSX1 -AE52922A197A2F47C7FC4ADF9DBFDE13C136ED14 Fathom (Japan)" MSX1 -43DBCC9536FE61C8172ECEEEC1481778F7A2B9BD FB-01 Voicing Program (Japan) (Program)" MSX1 -D833C66DD541239908555762E04BCBB22BCA748A Final Justice (Japan) (Alt 2)" MSX1 -9BCA89C71C033BB9A85EE30CF75960EC839C0462 Final Justice (Japan)" MSX1 -1E70296A07A5FF62D01E5115B8C8B87F891585C9 Final Justice (Japan) (Alt 1)" MSX1 -D086280DEA7FB10FABAAE26ED9D404BBE69C70C4 Final Mahjong (Japan)" MSX1 -A553C3F204C105C23B227A1E5AEB290671CCDBEB Final Zone Wolf (Japan)" MSX1 -0889CA383BCF24198DB1FB2DD23DEA1BF8C18BE8 Fire Rescue (Japan)" MSX1 -EC0320EDA10BF6BBEE8081F6672A7BF9D858C1BB Fire Rescue (Japan) (Alt 1)" MSX1 -40C626D8C53E2E2D4E7E25D55AA2C11C2645780F Flappy (Japan)" MSX1 -6F391D0408223138B7927ED719D7AC1B6C38CA0D Flappy (Japan) (Alt 1)" MSX1 -46F3954D7F92F5D00F45B82FDDE543C28A4B53C9 Flappy - Limited 85 (Japan)" MSX1 -DE95B99DFFEAB5C2B453778DBDC8723DC15CBFD7 Flash Point (Korea) (Unl)" MSX1 -A3FC0A55A91ED0041221F8DA788D824D9D795913 Flash Point (Korea) (Alt 1) (Unl)" MSX1 -60F685670DE6D2D8ED5F1B1DDD40FAC851FF1982 Flash Splash (Japan)" MSX1 -5999CC1407AFE5BA8A760F16178C4CAC9C3FA192 Flicky (Japan)" MSX1 -7BF28813FB11E9DB3BF78CC73EE5FB2D76B547DE Flics, Les (France)" MSX1 -3EEE7C72362522C27866D4367A8CF1E22932DB32 Flight Deck (Japan)" MSX1 -488F01314DA5644FBF2CA938C6F9720EF2B0D0F9 Flight Deck (Japan) (Alt 1)" MSX1 -453EAC7568D5D04C8CF7DA86F2E8DC79777343DA Flight Simulator (Japan)" MSX1 -3377D2017CC8433FA20B432C9D2328C53BBC10E6 Flipper Slipper (Japan)" MSX1 -49BFA9871BB0AD3B47A7C63B14A10E0E8AE48A52 Flipper Slipper (Japan) (Alt 1)" MSX1 -39C12004ADB3442F2C43AADE8A0BE420D59EEFB1 FM Music Composer (Japan) (Program)" MSX1 -E60E2ABF907B66F5B275C7B7B710439ADAE58D37 FM Music Composer II (Japan) (Program)" MSX1 -7C2743DF543C0D8A4BA7E42BF7DB580B996D102E FM Music Macro (Japan) (Program)" MSX1 -9D789166E3CAF28E4742FE933D962E99618C633D FM Pana Amusement Cartridge (Japan) (Program)" MSX1 -E4C8F3B87D755C21572040C51CEC1431AE59A0BE FM Voicing Program (Japan) (Program)" MSX1 -C0D33B513704ADC56718B1F56C1062718683C77C Formation Z (Japan)" MSX1 -CE01AFE30DA38DC58994C8264070195E1CD921B8 Formation Z (Japan) (Alt 1)" MSX1 -A194B845857C8B33EF4FD5E53D7F38150B4FA4CF Frogger (Japan)" MSX1 -D8E9FD3E9420BCBB1DD530FDA1E9C718AA08D8E4 Frogger (Japan) (Alt 1)" MSX1 -64AE3ACDCE06D1B41E23EE2730797FD7E472BDDF Front Line (Japan) (Alt 2)" MSX1 -883537F12814EE63C48A0AB744383F8D8E6A5CA2 Front Line (Japan) (Alt 1)" MSX1 -EC54E05A6F784F9C616C94AB8D57E5D2647ABC66 Front Line (Japan)" MSX1 -A41E43FA3C64D776831451C35FE8BDEE58625041 Fruit Search (Japan) (Alt 1)" MSX1 -A27EB9CD77837C1E443E275D0E10888E0FD248F4 Fruit Search (Japan)" MSX1 -E7657D8070399D8E4D65308B356E110D83D23151 Funky Mouse (Japan)" MSX1 -138A2D56237AEA915BAAEF85E69425A658506CFB Futbol (Spain)" MSX1 -53337B61D7B86E6D18501967FCFC0908A00CC55C Fuun Takeshijyou (Japan)" MSX1 -FAA5AEF23FEBC61A875E28EEBE3AADF83E1F5BA7 Galaga (Japan)" MSX1 -2A34F0221193712C43F336F08D2A6E58A1A8974A Galaga (Japan) (Alt 1)" MSX1 -25308EBB33FD87A7F6A8E61868D3DCDE3BD622C5 Galaga (Japan) (Alt 2)" MSX1 -95F36CF00CEE3DB55940EB60CD39412226A99E94 Galaga (Japan) (Alt 3)" MSX1 -692FD8A85978ADAFBB530510FFF71848F39D4FBD Galaxian (Japan) (Alt 2)" MSX1 -AA2BA89E0B1C91A4405F516EF003AD14A401096C Galaxian (Japan) (Alt 1)" MSX1 -E2ABB08ABACCE57703FC008881279890328F6277 Galaxian (Japan)" MSX1 -E8AB46785E75E19DAC497C4A82AC2F5B37AC0580 Gall Force - Defense of Chaos (Japan)" MSX1 -3425EEA336140DA03D7D7F09A94FD928D70E2212 Gall Force - Defense of Chaos (Japan) (Alt 1)" MSX1 -ABE52920E895C148851649ECB9C029FDC41A275F Gall Force - Defense of Chaos (Japan) (Alt 2)" MSX1 -89073C052B0FE29B6DE077C8BDF5373474081EDF Gambler Jiko Chuushinha (Japan)" MSX1 -39FFAACD0C2875018E7673A887A921FE9D31D6DC Game Land (Japan)" MSX1 -4FE90868376704336FBF45619A47CE18736FF1B2 Game Master (Europe)" MSX1 -70BA2331844BD5C14906E9F2284EBA119B3E41BF Game Master (Europe) (Alt 1)" MSX1 -9648D43F3C25D67B9E4972F777D7B02470080D1C Game Master (Japan)" MSX1 -ABCE0B855D67AC10BC667E0F23CEAB4A12FFEEE6 Game Master (Japan) (Alt 1)" MSX1 -FE74B4DF9698A61DFFD3AC88F47619675514BA1C Game Master II (Japan) (Alt 1)" MSX1 -5C00F9E3A48411E08FAC89B1DFDD2A6E95853919 Game Master II (Japan)" MSX1 -B2CCA92B7A51A43C310E58E011F3EDE1E7125A96 Game World - 126 Games (Korea) (Unl)" MSX1 -1CE1EBBB0F62224AA776C4523E2EF708154E7B52 Gang Master (Japan)" MSX1 -0CB11C766BD357D203879BD6BEE041A4690CC3DF Gate of Labyrinth (Japan)" MSX1 -12B3C31F0FD10FF5823DCC8BF6DFEB785A8AF2F7 Genghis Khan (Japan)" MSX1 -BA30AD98A8488BEC6D0C661F7B859BEB2FE219D1 Ghostbusters (Europe)" MSX1 -310AB424EDF15D5399E31FDBC1230DDCDE307D1A Glider (Japan) (Alt 1)" MSX1 -3A46902D265D98B27BFF3A34160DE1C7EF4F116C Glider (Japan)" MSX1 -2DACF7A08857CBDC706D24B4A46665113D16FF99 Gojira vs 3 Daikaijuu (Japan)" MSX1 -83FBA43371D8D3C50A97C96923E52B40DF2A7816 Gojira vs 3 Daikaijuu (Japan) (Alt 1)" MSX1 -8BD874AA854CC26D7FC48E7D2DE60DBBEE681721 Gojira-kun (Japan) (Alt 1)" MSX1 -D6B6CB3D85B991F8ADF2E07A0E8E74B586741D12 Gojira-kun (Japan)" MSX1 -30E3681BE376A76CF9E0F89E54555A7631759E15 Gokiburi Daisakusen - Bug Bomb (Japan)" MSX1 -69BDA8B4A96187597B95CD5C43E58DA0716D0FC8 Golf Game (Japan)" MSX1 -7A4126934F9E68C34BF00DD3D9A9E753C05EE73F Golvellius (Japan)" MSX1 -AACAF2E694A1C05F2EF20A8CE6892242C0F88919 Gomok Narabe - Omo Go (Japan)" MSX1 -6F0F61285BE1158ECF2E5393619187F26A7395BE Gomok Narabe - Omo Go (Japan) (Alt 1)" MSX1 -B1248F7B9D4E16A894555C51C533D3FD9A90802E Goonies, The (Japan)" MSX1 -B7B4D5C83D8C336DBFE32833BBA974CEA7F0CB8D Goonies, The (Japan) (Alt 2)" MSX1 -250D0D6E646EAE4817802C49E367AD8C1C35A462 Goonies, The (Japan) (Alt 1)" MSX1 -EADF124B91B996B890B1AE84B75B21EE6568D1F3 GP World (Japan)" MSX1 -3EA788262557F578B25E4E36E61C1CF9FB1155D1 Green Beret (Europe)" MSX1 -ACD46021A228B2B612C82D04C124B78E7D4C25E3 Green Beret (Europe) (Alt 1)" MSX1 -32615267E8497DB3F5E6F5348EE309E73C80A1A7 Grog's Revenge (Japan)" MSX1 -04325BFE5BC20A8F6D086933D138FB92CA200111 Grog's Revenge (Japan) (Alt 1)" MSX1 -5E28FA0CD90BCFB7995ACB025A22F6F556CCAC08 Guardic (Japan) (Alt 1)" MSX1 -67BAAAA870AD4A08F55EC1C67DBEABC97B6F18A0 Guardic (Japan)" MSX1 -CA5F14925A7D33D83DC581BBE2FF5258389BFBA7 Gulkave (Japan)" MSX1 -E90B579AC64798343ABB635FCBF929E83714312A Gulkave (Japan) (Alt 1)" MSX1 -445963FDDFBD0487ADDAF4B0AD620520E426A1D2 Gun Fright (Japan)" MSX1 -F2EC3714138175212B6B6E28B5DA4361CC4B5471 Gunjin Shougi Mars (Japan)" MSX1 -99A8631CDC37F0DD9D8793EA8EADD3F34E0BBA51 Gyrodine (Japan)" MSX1 -EBB70722F75279911CCE79E6BD78B8F514561B0F H.E.R.O. (Japan)" MSX1 -FCC6B6B9F05DE409492A1FB988FA671E46D54196 Hades no Monsho (Japan)" MSX1 -1804CFBC4F175136B7B934B575D49CBC0E726FFE Hades no Monsho (Japan) (Alt 1)" MSX1 -301EF3C728041EB1DFD89227A901C32EB000D348 Hafanuda Koi Koi - Gostop Godori (Japan)" MSX1 -44B23A175D04CA21236A5FEF18600B01B12AAF4D Haja No Fuin (Japan)" MSX1 -5370B7746112621169D503BBEC2E7FC526279F53 Hanafuta (Japan)" MSX1 -26FC48DDACA0FEDC90FC151D4ECD5CA6D1CCC77B Hang-On (Japan)" MSX1 -A67E699EDB471C35A217A5C3E6831C6CDB0EABE5 Hang-On (Japan) (Alt 1)" MSX1 -7F086CC2CA0C35BF599F48C2D5E901E89411239F Hang-On (Japan) (Alt 2)" MSX1 -8F35C41A5235DEC22C3B99CD6DD63CFDA0A7A821 Harapeko Pakkun (Japan)" MSX1 -A3DE07612DA7986387A4F5C41BBBC7E3B244E077 Harryfox MSX Special (Japan)" MSX1 -3626B5DD3188EC2A16E102D05C79F8F242FBD892 Harryfox Yki No Maoh (Japan)" MSX1 -15345C8745028C96FC79036B2E3E180AD2F62DAB Haunted Boynight (Japan)" MSX1 -69BC7CB436EA2EA3A6B49C3B050BAE24271A2F9C Heavy Boxing (Japan)" MSX1 -0FA2BB1EFFEFDE0861FE53A38FF5B56A6A320C80 Heavy Boxing (Japan) (Alt 1)" MSX1 -20191B437958E990D14660F476C340E140236C70 Heist, The (Japan)" MSX1 -6844DDF610E1A98B55E77FCC364B38A037751A2B Helitank (Japan)" MSX1 -F72681F09B52D530EC905E8DF21C4A15E30201AB High Way Star (Japan)" MSX1 -C0FA7D53B3E66BD1E1680BB135DB8F74ABBAC52E High Way Star (Korea)" MSX1 -3C2295FB9FC9F1B6A607A74F4538E24D170522E5 Hisya (Japan)" MSX1 -BBCA0B00374BA5366BA53B380285D38857450A7D Hitsuji Yai - Preety Sheep (Japan)" MSX1 -C344ED78465203E12143BD9889281BA981A195E4 Hole in One (Japan) (Alt 2)" MSX1 -2F8416D9CCE6587ABA4B71B1D3E3B626609CE7ED Hole in One (Japan)" MSX1 -4F73D4B731B8309145B2A9BF9C37620E4F4A391C Hole in One (Japan) (Alt 1)" MSX1 -F3952B790AE2A8A1434B52BF816C56C9E680F73E Hole in One (Japan) (Alt 3)" MSX1 -BB75492C6EBBBF1827B3695F70E481D65487DA44 Hole in One Professional (Japan) (Alt 1)" MSX1 -A55617157C5D89DB5900654B641E757A37FECD1A Hole in One Professional (Japan)" MSX1 -F29CAC37C5001DDC752FF4A0B9CC51A965906DA8 Home Calc (Japan) (Program)" MSX1 -CC06D65A9ABA634E3AD75675B960140932506FFE Home Writer (Japan) (Program)" MSX1 -F27721CF9EC316EA3B18233F699FEBF739B25678 Honkball (Japan)" MSX1 -DD9A41E4C8802CD4BBB87E30281711F4E7AE017F Hopper (Europe)" MSX1 -E904EFABC5A75840C50EA7EDB07052683468A64A Hudson 3D Golf (Japan)" MSX1 -27847B02D2ACBEBAB61F2F05BD2FFF0C2291A09D Hudson 3D Golf (Japan) (Alt 1)" MSX1 -E06ED9B0B3E1FBB9F27BE65C37B4D9B548889B4F Hustle! Chumy (Japan)" MSX1 -86E688CEA0F0C8BCD31B6BCD19FD72AC108646BB Hustle! Chumy (Japan) (Alt 1)" MSX1 -9DCB43B654A08DE2C52147F4A2E628B5FE3761C8 Hydlide (Japan)" MSX1 -74E9EA381E2FED07D989D1056002DE5737125AAF Hydlide 3 - The Space Memories (Japan)" MSX1 -A3537934A4D9DFBF27ACA5AAF42E0F18E4975366 Hydlide II - Shine of Darkness (Japan) (Alt 1)" MSX1 -DA4B44C734029F60388B7CEA4AB97C3D5C6A09E9 Hydlide II - Shine of Darkness (Japan)" MSX1 -56C4813AC549AF8711B2E2E42D7DB1B960C4C040 Hyper Olympic 1 (Japan)" MSX1 -CC9A82898DA39E5CFEB0400006D093D3B869F28C Hyper Olympic 2 (Japan)" MSX1 -14393568469C74BD6F8BE7770149DB19F0553AB6 Hyper Rally (Japan) (Alt 3)" MSX1 -D1A7CBAFF354B59003F0E297723B912CB6AD0B36 Hyper Rally (Japan) (Alt 2)" MSX1 -3B13E164130CAB9B36C1A95E06F8D9FD707FC97F Hyper Rally (Japan) (Alt 1)" MSX1 -7DFE091E02F6C1B21BD65E44EB5052D564D0EF92 Hyper Rally (Japan)" MSX1 -9CAB6A793E39076E3F598AA54BFFD5585DDC7E3E Hyper Sports 1 (Japan) (Alt 1)" MSX1 -2C85B993671DE612E9338D094565A4EB32A97EA0 Hyper Sports 1 (Japan)" MSX1 -9002AA0B2D49A9FC323180487FF591781867A99C Hyper Sports 2 (Japan)" MSX1 -AF4E0490C178A18A47B34831FB5E3CF8B61D34D9 Hyper Sports 3 (Japan)" MSX1 -6842FB21ABB2531C17FE0687D77E012348D3DC2C Hyper Sports 3 (Japan) (Alt 2)" MSX1 -EC76D4D9B61BDBDE9A4B5BE082DBDAE96321A591 Hyper Sports 3 (Japan) (Alt 1)" MSX1 -167B226B54CC5B681A69D2C1509116FFABA868E4 Ice World (Japan)" MSX1 -F629B8F7133C3442D0371A4D84275FB2E0974854 Iga Ninpouten - Small Ninja (Japan)" MSX1 -F52113B45062ADC75CF7A0ED0538B3A07696CC24 Iga Ninpouten 2 - Small Ninja 2 (Japan)" MSX1 -AA68633FF1AFD385535B2ABD7C8756B6CF79256A Indian no Bouken (Japan)" MSX1 -95AE5B3E24AD0BEA21902CB7DFD3FD9581166A76 Iriegas (Japan)" MSX1 -8AA6D0AADF00DE9112696DA5B7DC6E3B62F2D9BE Iriegas - Theseus (Japan)" MSX1 -ED1F7342B9B26EC02CA2D584570D75F925167EA1 Iriegas - Theseus (Japan) (Alt 1)" MSX1 -14451B2931A014E949A4B3D2973D424D910E0D9D Issunhoushi No Donnamondai (Japan) (Alt 1)" MSX1 -02A2FAFC7B9249DB76803ECE347BA73BE25F71B5 Issunhoushi No Donnamondai (Japan)" MSX1 -2391AE8C961B4A38B3BEAEE9ED3362FB2C71851F J.P. Winkle (Japan)" MSX1 -6FEFBE448674B6EA846D0C6B9C8A0D57A11AA410 Jagur (Japan)" MSX1 -1AEAE1180471E9A6E8E866993031B881A341F921 Jagur (Japan) (Alt 1)" MSX1 -ECC68B4A042794424DF771A3336361FDB50D0875 Janka (Japan)" MSX1 -4180544158A57C99162269E33E4F2C77C9FCE84E Japanese MSX-Write (Japan) (Program)" MSX1 -CB352E97E9416F4C3032118758FC77D6D0F3AD73 Jet Set Willy (Japan) (Alt 1)" MSX1 -45B5B0E9DD8D11D034E09803F92EC9720CDA1E3C Jet Set Willy (Japan)" MSX1 -F99919C8F42ADDB7F65AB4FB21B603EE7E716C90 Jigsaw Set (Japan)" MSX1 -EBDE4D61184438175DB424FDF25CEC238D91A15F Jissen - 4-nin Mahjong (Japan)" MSX1 -765413BB6B03BC3BB888EE8FE00B99EF69C1317A Jisyo Data (Japan) (Program)" MSX1 -5CEEDD2AE401FEBB79C1F6A64DDEF4B2E1790674 Joytelop (Japan) (Program)" MSX1 -39EF139D8D66FB18B04DFF8B9A5386011F497479 Jump (Japan)" MSX1 -A53D1EA775A6C90A84F1F36349540B16CF8307E4 Jump Coaster (Japan)" MSX1 -0B3A217D3278A43D7460136F955171C762A1F8E5 Jump Land (Japan)" MSX1 -B5CDEF44B22C7E234895B053E487233C117D1A4F Jumping Rabbit (Japan)" MSX1 -A70C6B0E90E7B8BA3E5BC06C9AE7D6AF344E491F Juno First (Japan) (Alt 1)" MSX1 -846BD4D89BD034AC5346CBC559752635AD2BDA6B Juno First (Japan)" MSX1 -4991DC097E248436506ED5C8BC3F367A65267EE7 Jyan Friend (Japan)" MSX1 -17E1111B1D6AA80E8BC525BE345C25E3B00ED504 Jyankyo (Japan)" MSX1 -666E82D8A8E5D2672A9B7159ADCDC861A31C8FA1 Kage no Densetsu - Legend of Kage, The (Japan) (Alt 1)" MSX1 -FFC8C57B26F2F495BD77EFAC5B815EFE9C25336C Kage no Densetsu - Legend of Kage, The (Japan)" MSX1 -632EF250C76B222158BA90DFC68B9E004DBAFE3A Kakikukekon (Japan) (Program)" MSX1 -223337DB25C942ECE732214ABA5DD624B574E9C4 Karamaru (Japan)" MSX1 -1C462C3629D43297A006BA9055B39A2DCCBA9F6C Karuizawa (Japan)" MSX1 -09779F0E9EC0C36EE3700690E2B6E282A4B40A0B Keiba, The (Japan) (Program)" MSX1 -3D5160331BEB1C5CC54BA6ECEF6B3CE2FF4660B6 Keystone Kapers (Japan) (Alt 1)" MSX1 -FB4724B8159BEAE132F89F394F71CE3934A61AE2 Keystone Kapers (Japan)" MSX1 -65334123C7D00CA623BF5F7A55756CC75958DEBB Kick It (Japan)" MSX1 -F033AB8A33E2D7A8AC1313B862BC138138B4346E Kick It (Japan) (Alt 1)" MSX1 -F772396BECDBD15BA0648BF1AEF8CCB155E1ADAD Kinasai (Japan) (Unl)" MSX1 -BEC70FBF9B1384B6A8ADC45226689F02D996B6A7 King & Balloon (Japan) (Alt 1)" MSX1 -ED15174DEC31A29F9D41A06DE3008DB04AF11A25 King & Balloon (Japan)" MSX1 -46062D3393C49884F84C2DC437FF27854E9D2E49 King Knight (Japan) (Alt 2)" MSX1 -A2CA7E6E216F8B450EB8DB10A4120F0353275B6B King Knight (Japan) (Alt 1)" MSX1 -122F659250A0AE10CE0BE0DDE626DD3E384AFFA7 King Knight (Japan)" MSX1 -43DC3911B9A336BB7B17BDBE6E48464E01F2C425 King's Valley (Japan, Europe) (Alt 2)" MSX1 -07448FFB20F260DF159A19DF2CAE1EE5545A0AEF King's Valley (Japan, Europe)" MSX1 -8C9A9A9AFE13A58E4CFB72489AF2D6B080DFFAF6 King's Valley (Japan, Europe) (Alt 4)" MSX1 -A4383F789482A9E868A9F136AA722129673C2A81 King's Valley (Japan, Europe) (Alt 3)" MSX1 -0CF26BF02C5B94DF118129A681A7F14ADD708177 King's Valley (Japan, Europe) (Alt 1)" MSX1 -CFD872D005B7BD4CDD6E06C4C0162191F0B0415D King's Valley II (Japan, Europe)" MSX1 -DD76EE1071E427CBFEDEEEDCB3A4B8BCAD56BA71 Kinnikuman - Muscle Man (Japan) (Alt 1)" MSX1 -BF7E27B3456F1A96D94A8DBF06688C8F833BD818 Kinnikuman - Muscle Man (Japan)" MSX1 -E98E4351119D78B6402C4499ED16FAEB3364F6C3 Knight Lore (Japan)" MSX1 -C8FF858D239C62A859F15C2F1BF44E1D657CEC13 Knightmare - Majou Densetsu (Japan)" MSX1 -DA8249452DA86C0BA44F0AE279CCFF82A1DDD756 Knightmare - Majou Densetsu (Japan) (Alt 1)" MSX1 -1D6A355A9CE84C78E3BAFC27A4F1151E240F68F0 Knightmare - Majou Densetsu (Japan) (Alt 2)" MSX1 -4D51D3C5036311392B173A576BC7D91DC9FED6CB Knightmare II - The Maze of Galious (Japan)" MSX1 -25F5ADECA8A2DDB754D25EB18CFF0D84E5B003BC Knightmare III - Shalom (Japan)" MSX1 -63D4E39C59F24F880809CAA534D7A46AE83F4C9F Knither Special (Japan)" MSX1 -076D6F5B9F8427F6959F7A255ABB4ACAC0DD9D0C Konami's Baseball (Japan)" MSX1 -9BDFE44A7A0D5151346FF14ECE3216B5108CC775 Konami's Baseball (Japan) (Alt 1)" MSX1 -FC6660A202DBD228C9E0D7C404340D1DCC1E2844 Konami's Billiards (Europe)" MSX1 -5E349166FCE12D45F3CE3F69ECD6B2A70EF4D68B Konami's Boxing (Japan) (Alt 1)" MSX1 -7ADB6812F3702B93AA2B2A872722BBD40915670D Konami's Boxing (Japan)" MSX1 -9E190CF3CA52D85FD34EB5DF2C0DD8490448B9A2 Konami's Boxing (Japan) (Alt 2)" MSX1 -10698EA6B0423F2E858A4C28C10F39646CA5495F Konami's Football (Europe) (Alt 2)" MSX1 -EAA6B787784BAE1C7F648B57DAA1C88CF2B1B095 Konami's Football (Europe) (Alt 1)" MSX1 -8E9FB34B356B02A839DCE5139C12030593BE13A2 Konami's Football (Europe)" MSX1 -6A3A68836A468CC761A268175C64D53C4C1C48BD Konami's Golf (Japan)" MSX1 -BCF72A4673C7982361DB4EFAF8EBC776B6539938 Konami's Golf (Japan) (Alt 1)" MSX1 -5C7971AA8688FFC429A3E315DD3D45C38F72DDEB Konami's Golf (Japan) (Alt 2)" MSX1 -F415E4096FF3F6A9F17BFBF02F146E44F0D5FB66 Konami's Mahjong (Japan)" MSX1 -AE5B8E69732A23AEE102BCD996AD06225F1B3EBA Konami's Ping-Pong (Japan)" MSX1 -6C68F7BE1EB46CCA6DCDBB9192CBFF9D59604357 Konami's Ping-Pong (Japan) (Alt 3)" MSX1 -5E1A50AFFE1FA973F69E423A8827751B93FC53EE Konami's Ping-Pong (Japan) (Alt 2)" MSX1 -9F4AC1287B8CAA286A847C86AC8601A711BE2D82 Konami's Ping-Pong (Japan) (Alt 1)" MSX1 -A0ED2C50E55241D23BB5D12CB6528A2A0C3BC156 Konami's Soccer (Japan) (Alt 2)" MSX1 -FD7518A6AEDB51630364082C27BDFE4411ADFD4C Konami's Soccer (Japan)" MSX1 -89CCB1A7FFAAA75CEE9BDC9B4A9EC9B063AF7199 Konami's Soccer (Japan) (Alt 1)" MSX1 -79C1BF77C08B733AE04E069DEAF25FD24B28BEB7 Konami's Soccer (Japan) (Alt 3)" MSX1 -2FEFF37D593683CE1C7DFAC33ED3207895E01A03 Konami's Synthesizer (Japan) (Program)" MSX1 -D5F5D2850B0BFDA45BA4DFFF70D3FD9986399A94 Konami's Tennis (Japan) (Alt 1)" MSX1 -5F6972E9E374753FAF092409F1EE10BBA5231B66 Konami's Tennis (Japan)" MSX1 -0039CFF292FE740D8C87CC2131A473CBB4F8C4F4 Koneko no Daibouken - Catboy (Japan)" MSX1 -530ECFF542A537C320B17BD5D64C86D5D65619F3 Kung Fu Acho (Japan)" MSX1 -FC22CEC076C0A0A1EE7E410772AF3D7D31DE3149 Kung Fu Acho (Japan) (Alt 1)" MSX1 -05DA84093D973D3BFBD3143FFD155A16A9EC5F82 Kung Fu Master (Japan) (Alt 2)" MSX1 -602C4D0D12FD59725C0C4E40F51D6BDEB679EA36 Kung Fu Master (Japan) (Alt 1)" MSX1 -C1DFC86C441E1128194F3AB490C94E29275B5DF9 Kung Fu Master (Japan)" MSX1 -304EA29469461F1CFA801F62AF0BF5045A6882FC Kung Fu Taigun (Japan) (Alt 1)" MSX1 -E817AB7B50674C414B1C1B72530024EB03396A41 Kung Fu Taigun (Japan)" MSX1 -15CA962994FD25A56BEE2F543A83F133F9D2265F Ladder Building (Japan)" MSX1 -C4F952258020DE9E23A718A78C18D22E2CCCFE3C Laptick 2 (Japan)" MSX1 -F69541B86C2B396CDCE765C2DEC498E11232B3C9 Le Mans 2 (Europe)" MSX1 -2CEA9CDD501D77F2B6BD78AE2AE9A63ABA64CFED Legendly Knight (Korea) (Alt 1)" MSX1 -6A98D5787DD0E76F04283CE0AEC55D45BA81565D Legendly Knight (Korea)" MSX1 -3103F0170BAE627BDEB77108E0E782284E4581C9 Leonard (Spain)" MSX1 -0442DD29EA0F7B78C9CD5849EC7EF5BB21EC0BF5 Light Corridor, The (Europe)" MSX1 -5DD2AC08FD05A1E091C7C6ECB6C10B49992BDD46 Links, The (Japan) (NGA II) (Program) (Alt 1)" MSX1 -88F3A72513B04459212289797942C4D76F495A05 Links, The (Japan) (NGA II) (Program)" MSX1 -BC76A04970C547B7C080E747D393D13C87E82E7D Links, The (Japan) (Program)" MSX1 -0421A25AFF3AE300B2A4536DD0AA5FA924E7DD72 Lode Runner (Japan) (Alt 1)" MSX1 -818A6CEDBFDF3A5AF0C844F32A18E3930178C798 Lode Runner (Japan)" MSX1 -4B04574B3B71958664AC730987C4C8EBEDEBA890 Lode Runner II (Japan)" MSX1 -4025045E93F51AFD58545104CC2C897226FEBAF7 Lord Over (Japan)" MSX1 -3C2DB6321EE84E3690757C08ADE9DC096BD209B3 Lot Lot (Japan)" MSX1 -95F75FAE9B3E961149E352CEF3D7E478E9887D5A Lunar Ball (Japan)" MSX1 -6BDE4E6761286A2909858ECEF04155E17072996E M36 - A Life Planet (Japan)" MSX1 -0949BD31CDBDFACB3224506C72A2210C50432157 Mac Attack (Europe)" MSX1 -97DD31B2F0DD056ABD808062E306B0C2536975BC Machinegun Joe vs The Mafia (Japan)" MSX1 -09AF3B68BE4EEA5F5594D5D2D124D92B127DD390 Macross (Japan)" MSX1 -81DDAF3A42C1E1A3D3722E0CD046316A202ACD33 Macross (Japan) (Alt 1)" MSX1 -A3D1212EB4C58958F063AA8577DDFA07903B28B3 Magical Kid Wiz (Japan) (Alt 1)" MSX1 -087AFEBB16BFD96F465FB0D004326D55452BDD81 Magical Kid Wiz (Japan)" MSX1 -3E2EF016F255168E2DF1906E678CA22F880917B8 Magical Kid Wiz (Japan) (Alt 2)" MSX1 -BF5678F3C065A4507F71ED6206A63AC922AD93DD Magical Tree (Japan) (Alt 1)" MSX1 -B82DC590AADC930B43DB303BB3E3458E7695E3B5 Magical Tree (Japan)" MSX1 -3243A5CC562451DE527917E9CA85657286B2852F Magnum Prohibition 1931 (Japan)" MSX1 -9C5C1C40EC30C34B1B436CF8CC494C0B509E81FC Magnum Prohibition 1931 (Japan) (Alt 1)" MSX1 -2729BB0E68A64AF525DF4C5D9687BAE07245980A Manes (Japan)" MSX1 -47129FE3791A7171F8FA792F953D7B5D58BA5C24 Manes (Japan) (Alt 1)" MSX1 -820174B4DD3F3DF87E5E32FB6F7ED457542D96C1 Manes (Japan) (Alt 2)" MSX1 -20CE82112BA0C50063667D61E43979AC464A3BB4 Mappy (Japan) (Alt 2)" MSX1 -E7D06C0A5C7F256C061E5B8173FDCC145D2FC4D6 Mappy (Japan)" MSX1 -A8313B0DCE35FAA80B399A220F19B04333FDEC1D Mappy (Japan) (Alt 1)" MSX1 -F7DD6841D280CBFFA9F0F2DA7AF3549F23270DDB Marchen Veil I (Japan)" MSX1 -A66E19E58AC5B4DA7DB071CA7EAD40C28A332198 Marine Battle (Japan)" MSX1 -A3772599CDB84DF71EF2BB38B1E2CB2F66593969 Mars II (Japan)" MSX1 -E4D61EE74867066B04B0F6ABA35D98D72665E6E0 Mashou no Tachi Goblin (Japan)" MSX1 -8F92EA214A7A11394C512080D3B65A7AFA9A92ED Mashou no Tachi Goblin (Japan) (Alt 1)" MSX1 -ADC65666DB35CD2CE694A8E2F32B95BD98D72291 Master Chess (Europe)" MSX1 -2AF58D6B3A8C77270FA5BB82F129FC97F999B7EC Megalopolis SOS (Japan) (Alt 2)" MSX1 -3167FFC2F2411138E4545CBDF4466C3237A04874 Megalopolis SOS (Japan) (Alt 1)" MSX1 -8C6E1E21CC45B2CA72CEEA93DF48EDA9CEF1DBAD Megalopolis SOS (Japan)" MSX1 -E92BAA5FDFB2715E68700024D964098EF35704D9 Meikyuu Shinwa (Japan) (Alt 1)" MSX1 -98B7A6AC44B82CCFC45EB51595E2905ADABAC1C7 Meikyuu Shinwa (Japan)" MSX1 -E7C800FA576B3A9554836AA9C5EAA3AE893805D4 MIDI Macro (Japan) (Program)" MSX1 -97ADCB652BC4BAF02D29A9ABE5E6547065DEC298 Midnight Brothers (Japan)" MSX1 -F1D68B477F3F54C0B6080985954208B0D95C5973 Midnight Brothers (Japan) (Alt 1)" MSX1 -5460AA3BE896AD949BEA75444BC6E7E072A859B8 Midnight Building (Japan)" MSX1 -3A8C815F9F97C067828E22F50386A9383F8E1A3D Midway (Japan)" MSX1 -7C50D00A0D7B8C3474ED492465A92622CA160151 Mil Caras (Spain)" MSX1 -5A709255F73EB8B601BF9D81210260488F8AC511 Mini Golf (Japan) (Alt 1)" MSX1 -D2BF27695023A3E7DAAEAB1CB76572F2C412DE1E Mini Golf (Japan)" MSX1 -7ABF89652396A648A84AE06E6DABC09735A75798 Mirai - Future (Japan)" MSX1 -176EC8E65A9FDBF59EDC245B9E8388CC94195DB9 Mitsumega Toohru - Three-Eyed One Comes Here, The (Japan)" MSX1 -428B5BDD5CBB3E4FF637CFA5DB8C41D8D0070813 Moai no Hibou (Japan) (Alt 1)" MSX1 -F924D89A28966A1D08C10D5DDBC9E0E182BE4669 Moai no Hibou (Japan)" MSX1 -336D714E3BC2DFE3626E55D01EE4EF74A48CF652 Mobile Planet Suthirus - Approach from the Westgate (Japan)" MSX1 -C0717A9831D66E29EB907BE598BA6606E17EA044 Mobile-Suit Gundam - Last Shooting (Japan) (Alt 1)" MSX1 -917270DD44C63DC883289B4E0902FE6C812F5EA3 Mobile-Suit Gundam - Last Shooting (Japan)" MSX1 -17AC538DD63BC93EC0B88B6DD92079E807C22908 Mokarimakka (Japan)" MSX1 -7D0BB1DAC966CEEE2E4C53F77E6E057D65F15D4D Mole (Japan)" MSX1 -F364A44D0B4CEAAA8706830237C0B824DCF9CE0C Mole Mole 2 (Japan)" MSX1 -6FEFE304CC8CD099456BBBBBCB23FF776CB113C9 Monkey Academy (Japan) (Alt 2)" MSX1 -E61F407E51EA4411145E236272842BDB3E0743E6 Monkey Academy (Japan) (Alt 1)" MSX1 -8B2626F8DBBB3E97A5087B340A3F3D56C8EE84D1 Monkey Academy (Japan)" MSX1 -E0D84B3B2AC7675C3ED104797840D43BC2347A5B Monkey Academy (Japan) (Alt 3)" MSX1 -B6D39BBAEDB89F8C908CC2F44A0AB17E4B80CA4F Monster's Fair (Japan)" MSX1 -B2D9DCEE787ACE26F8F4D2D18E24A3D645A6F853 Moon Landing (Japan)" MSX1 -D1CF5410ED71F77670F65EB08EE944436BC0EB10 Moon Patrol (Japan)" MSX1 -F93E23D958D2075BF476CB05A3C4F48D0C41AABB Moonsweeper (Japan)" MSX1 -33EC3136DFB6FD44014C8BBFFC8AC79C3CAFE75C Mopiranger (Japan)" MSX1 -4A185A3DB81C2CE20D176D13FA5F619C6B7A170C Mopiranger (Japan) (Alt 1)" MSX1 -1B3059C7873765A476FB7791A4D6FC846AB05ADE Mopiranger (Japan) (Alt 2)" MSX1 -DDC458BB3C70E0708841E516D9B89220C0E098A1 Mopiranger (Japan) (Alt 3)" MSX1 -14E7EF125CC902001995BBD8ACCA0EAE2F213DC1 Mopiranger (Japan) (Alt 4)" MSX1 -4DD934902907DB50BA76053F59AE7737D55824F4 Morita Kazuo no Othello (Japan)" MSX1 -1FB861152A9F3F9C2B2DACE26D5F1D93AB9B4AD8 Mouser (Japan)" MSX1 -B5D130A50F6939028702C1645426A29EC8EAD6E5 Mr. Chin (Japan)" MSX1 -DC69C7A9EA93CBB0093300955935EF156AF5C194 Mr. Do (Japan)" MSX1 -01544042B810C0B401FCE5D180ADB6FEA9B5ED20 Mr. Do vs Unicorns (Japan)" MSX1 -E9B3652482A5B09AE662203F8758A30AA23AF62F Mr. Do's Wild Ride (Japan)" MSX1 -CA05A183F4E7E56102706D1B9B852AD4350264BA MSX 21 (Japan)" MSX1 -0D246B0E3EDC63803FCCE861EA07EADF29DC488C MSX Audio (Japan) (HX-MU900) (Program)" MSX1 -930EAE7057AF1652ABAE794072B296A59DECD61B MSX Audio (Japan) (FS-CA1) (Program)" MSX1 -76D488497D9BA54B302A4326F45909F643BDCD7A MSX Baseball (Japan) (Alt 1)" MSX1 -85A3842EABAC50C4E1332666C161541BE3508249 MSX Baseball (Japan)" MSX1 -AC150939558EC4E56446BE9502177F28A29881EB MSX Baseball II National (Japan)" MSX1 -181BF58DA7184E128CD419DA3109B93344A543CF MSX Basic-kun (Japan) (Program)" MSX1 -C279C3F41D5368761F9088157B80214D835A548C MSX Basic-kun Plus (Japan) (Program)" MSX1 -8C7AE1A1720B1DAE9AF9904E638B868F56D905C2 MSX Bunsetsu Henkan Jisyo (Japan) (Program)" MSX1 -C1C350C719236AF5EEF8798C4532351BEFCFD348 MSX Derby (Japan)" MSX1 -35ABD4A14033710730DA72EDF278AAD42D641621 MSX Rugby (Japan)" MSX1 -C76CA96ED23621A6267D9906CC4A1EE428677F98 MSX Soccer (Japan) (Alt 1)" MSX1 -D2AA1605A6B56C118E18B385AB879536D74CC355 MSX Soccer (Japan)" MSX1 -D4EDB2AF4170FD4069960AD61D3F664462BEF568 MSX-Aid (Japan) (Program)" MSX1 -47663F883F98AB9DDAA0BF0C2831C567919F56F1 MSX-Logo (Netherlands) (Program)" MSX1 -2B10234DEBD2A6A9A02E0750BA6563768BC4A2F3 Mugen Senshi Valis - The Fantasm Soldier (Japan)" MSX1 -20A2E3D7966916F46EB26CC1AA226EC2D11646F9 Music Editor (Japan) (Program)" MSX1 -85E3386D30DD9A64F4CC1BCA03CFF35B440F70B5 Music Harmonizer 3 (Japan) (Program)" MSX1 -8C06D9E1E188431C13721AF965FAA7391140AF2E Music Studio G7 (Japan) (Program)" MSX1 -FC4C05CA47C94DF877BED2E02307BD6307F738A6 Musiwriter (Japan) (Program)" MSX1 -FB968A2407EEE00C683AF3AC19E88015341564AD Nausicaa (Japan)" MSX1 -F0E4168EA18188FCA2581526C2503223B9A28581 Nemesis (Japan, Europe) (Alt 1)" MSX1 -E31AC6520E912C27CE96431A1DFB112BF71CB7B9 Nemesis (Japan, Europe)" MSX1 -4C2F015685A17DB7A8C3893E868E0A84A8DBF1E5 Nemesis 2 (Japan, Europe) (Beta)" MSX1 -D63E20369F98487767810A0C57603BEF6A2A07E5 Nemesis 2 (Japan, Europe)" MSX1 -6844758FF5C2C410115D4D7CF12498C42E931732 Nemesis 2 (Japan) (Demo)" MSX1 -AB30CDEAACBDF14E6366D43D881338178FC665CB Nemesis 2 (Japan, Europe) (Alt 1)" MSX1 -0413BB3AEACB0C28429B8C85B42796DBE48BEF6D Nemesis 3 - The Eve of Destruction (Japan, Europe) (Alt 1)" MSX1 -7393F677E0FAE5FC83071C6B74756117B7D75E2D Nemesis 3 - The Eve of Destruction (Japan, Europe)" MSX1 -5692E41B3A4C5E767CF290FD6C24942D0FD7B2E3 Nemesis 3 - The Eve of Destruction (Japan, Europe) (Alt 2)" MSX1 -B7FD07B7825C6BEEB19B1F38631D2869F60939FB Nessen Koushiyen (Japan)" MSX1 -EC1BB5C36952B12E6C0805E9A8D5BF31C20A68C4 New Horizon - English Course 1 (Japan) (Program)" MSX1 -50E27C5B83C8AFE00B077406081D063263E98B62 Night Shade (Japan)" MSX1 -7013FCF8C76BC610CEC9F55FBB99374182641251 Nihon-Shi Nenpyou (Japan) (Program)" MSX1 -371DE6F12D834DA07C8E67B13E75FC22618BA5E9 Ninja Jajamaru-kun (Japan)" MSX1 -9DFC71887FFC6D94B8780B5D6F207E24C1F58B54 Ninja Princess (Japan)" MSX1 -62BFFF23E2BEAE00DB14B6C3E933043218B33DED Ninja Princess (Japan) (Alt 1)" MSX1 -EC2F1E747756BA1FDAE606658AEEAFA07E6E7FD4 Ninjakun (Japan)" MSX1 -C9D10B1DF3BCADB3D917CF2A6877AE6E71CA3A57 Ninjakun Majou (Japan)" MSX1 -049892D1633BCB3F1D5067BA710ADEB89B38FCAC Ninjya Kage (Japan) (Alt 1)" MSX1 -0125BCE373C95EE78DF074D19AD032158EDC74A2 Ninjya Kage (Japan)" MSX1 -E6DE8BBD60123444DE2A90928853985CEB0B4CBF Nobunaga no Yabou - Zenkoku Ban (Japan)" MSX1 -AEECB99ED7BFE2FF39A5F42637B6B33ECC79C443 Nyan Nyan Pro Wrestling (Japan)" MSX1 -98E33DCA445850CDF24F09050756C3B75202AC13 Nyorols (Japan)" MSX1 -5DCECC7C790E398A1C652DB568C1E66C6F25E5E4 O'Mac Farmer (Japan)" MSX1 -5B53794D3D73DF29CBCEC411C0F65E9E9898977F Oil's Well (Japan)" MSX1 -244EAE705DF950F60B7D4B523D57B9CFDED96B8E Oil's Well (Japan) (Alt 1)" MSX1 -031A611BA1F75B7D5FE3ED088A61C24598B4B314 Okami no Su (Japan)" MSX1 -6238F9C5F4C0012B3425BE203C23092F6B624FE8 Othello (Japan)" MSX1 -41BA54C945104915CCC8D465930445C905D839E4 Oyoide Tango (Japan)" MSX1 -61695EB1DC6242D8A70C7EF2172CF86A26E3C2DD Pac-Man (Japan)" MSX1 -A72724A79C2C50EC66046C0828934B5CAD11B7C9 Pac-Man (Japan) (Alt 1)" MSX1 -56FEBD50BE4ACCB3EB8C73FF4FF641EA767108B3 Pac-Man (Japan) (Alt 2)" MSX1 -A2E144546A191DA8829B9CA9FA019884FE95156C Pachi Com (Japan)" MSX1 -5558BA634018B22DCC687A01F9422FE60EA57ADC Pai Panic (Japan)" MSX1 -DF13ED647ED4F5A6B04F1710FC1140EA65DC966F Pairs (Japan) (Alt 1)" MSX1 -27BC809518FBB6C0D52C949E7CBE81980A801D32 Pairs (Japan)" MSX1 -479608B5A86D7C77BD6C4DD00605B8EFB2E5B43E Panther (Japan)" MSX1 -75D3B72D9CEEAA55C76223D935629A30AE4124D6 Parodius (Japan) (Alt 1)" MSX1 -2220363AE56EF707AB2471FCDB36F4816AD1D32C Parodius (Japan)" MSX1 -A6B2FDAE9551EF3633926F6177C771D794D1E91B Pasokon Sakkyokuka (Japan) (Program)" MSX1 -AEB705AC42F8D9D62ECDB25899535D1F14F1C49C Pass Ball (Japan)" MSX1 -8117EC66C0645A54422841A632CFD6602F35C4F9 Pastfinder (Japan)" MSX1 -0486938B52FBCF30A4FA206E07960A5B866FCA61 Pay Load (Japan) (Alt 1)" MSX1 -5F965BBBA026134818759D25119D4114599132A8 Pay Load (Japan)" MSX1 -190BCAB0325DED99F42F32976BF965F0164AD2A4 Peetan (Japan)" MSX1 -37E6FE7D07B3F8B2C585C77B231207AC8BAA1EA3 Pegasus (Japan)" MSX1 -D53E0C8BCD98820AFE820F756AF35CC97911BFE4 Penguin Adventure (Japan, Europe)" MSX1 -5AAB681334F9E97FE8D7E0EB008B2AFD5E0FC3AC Penguin-kun Wars (Japan)" MSX1 -683478868F6C6423CC3E9C6AABE1868B30B1E47D Pico Pico (Japan)" MSX1 -336A7C451A03C9A55726D171603B54628AD832C8 Picture Puzzle (Japan)" MSX1 -663D12F6FED3CE5017B783DB3032EB69D8554FED Picture Puzzle (Japan) (Alt 1)" MSX1 -3450F93FC2B08A052A709930C97EDEAD0099E447 Pillbox (Japan) (Alt 1)" MSX1 -76A79DD0554B8F7E84468FCD3BF73459CE4AEB2B Pillbox (Japan)" MSX1 -C95F8EDB24EDCA9F5D38C26D0E8A34C6B61EFB0C Pinball Blaster (Europe)" MSX1 -211E1F7E86495178FB2B05E163B04ED4B7455034 Pine Applin (Japan) (Alt 1)" MSX1 -878554D3B579E72B2D3C22E6330208EE0D1EE8A6 Pine Applin (Japan)" MSX1 -91BD6C21530654FAB12CD8A797044D494834C223 Pingball Maker (Japan)" MSX1 -1FBD7AF23177AB1DE799764D8A26BC2BBF85B042 Pinky Chase (Japan)" MSX1 -BE8BB7F5E812CD31A65AEC3782A2D526BEF9B3D6 Pipi (Japan)" MSX1 -10E63EBA7D2B10D946822F21E7FD106F5DFAB632 Pippols (Japan)" MSX1 -CF8E40315F34E30E1BE4776BBEBC08C0A8403523 Pippols (Japan) (Alt 3)" MSX1 -D621E2A2F0F924A17673F5D47F2182095074ACF4 Pippols (Japan) (Alt 2)" MSX1 -0A9C576EABAF2651DDCA35BF17F96E509D6C6BA0 Pippols (Japan) (Alt 1)" MSX1 -78079266711E60420480E4D95A39F0D7D974AD32 Pitfall II - Lost Caverns (Japan)" MSX1 -AE8C7355C829248305384243F78A870453367E77 Pitfall II - Lost Caverns (Japan) (Alt 1)" MSX1 -5FB4B6C3735E4D9415565A856BB69F9FB4857161 Pitfall! (Japan) (Alt 1)" MSX1 -2FA9C0F016EFC2D1752A272C632393F5063EA06C Pitfall! (Japan) (Alt 2)" MSX1 -B88E9C548873DCFD190E0E38F7B279344EEA41EC Pitfall! (Japan)" MSX1 -E6FBFB4B10DC393953211DDA4B114080A08302A1 Play Ball (Japan)" MSX1 -6F247C8AF6FC1881242281F19912068B03CA4126 Poiny X Senryosakusen - Operation Thanksgiving (Japan)" MSX1 -CDAF507DBA4A48B5C98850A96F61F6D2E8464E00 Police Story, The (Japan)" MSX1 -835B3E2BAE1D680D7050CE188C617FBCFB326EB3 Police Story, The (Japan) (Alt 1)" MSX1 -692A55393E8EEF0800A612C01456E9CECD9C1418 Pooyan (Japan)" MSX1 -C713ECD0E2EF89B2443E516D5FFA53D3A3422E22 Poppaq the Fish (Japan)" MSX1 -AC109DAC24DF4DAE813CA5D9F0938CC48A162BB1 Price of Magik, The (Europe)" MSX1 -24C5CBF1EE4CAA6D83A5AA7A5F3818692542FDA8 Professional Baseball (Japan)" MSX1 -DA5FD6CE2F92A40B1CCAF6E3C425D720FEBC3543 Professional Mahjong (Japan)" MSX1 -D03FDCA57B55BDB7E6B5481615B8AD0C8A71F77D Protector, The (Japan)" MSX1 -FAE437072234C65BCA174DB9AEFD2107A53C358A Psychedelia (Europe) (Program)" MSX1 -16C692A2C9BABFDADD8408D2F0F8FAE3A8D96FD5 Psychic War - Cosmic Soldier 2 (Japan)" MSX1 -A36C00F32CAD6B603BC5525A741CB09064670F34 Puzzle Panic (Japan)" MSX1 -1AD2178C27874704B395AB250200D9ACB7D3DE9C Pyramid Warp (Japan)" MSX1 -531A7F736D86095D791D6D0F267BE66EEF07949C Q-bert (Japan)" MSX1 -2E16A588246743C9B901AFDBF1BA094A0B1C8B5D Q-bert (Japan) (Alt 1)" MSX1 -1F72E0CD58AFE22075A129AC854BBDCE0704B0C8 Queen's Golf (Japan)" MSX1 -BE9D337DD412056F5FE78FD19467A63E80E3864C Queen's Golf (Japan) (Alt 2)" MSX1 -97C39DAD3E065F9083FEFAE157F278844B208058 Queen's Golf (Japan) (Alt 1)" MSX1 -9C886FFF02779267041EFE45DADEFC5FD7F4B9A2 R-Type (Japan) (Alt 2)" MSX1 -0B379610CB7085005A56B24A0890B79DD5A7E817 R-Type (Japan) (Alt 1)" MSX1 -37BD4680A36C3A1A078E2BC47B631D858D9296B8 R-Type (Japan)" MSX1 -636EB837C5D80FB6B0692A72954CA91291BA831B Raid on Bungeling Bay (Japan)" MSX1 -C5AF6C4255BAB55D68E82FA016CB35E3213BA244 Rally-X (Japan) (Alt 2)" MSX1 -3DCECD610E832E7769547D3B6CE2B767F65F3563 Rally-X (Japan) (Alt 1)" MSX1 -FC7212C6813574224114C3BB5BFA99206C0816A5 Rally-X (Japan)" MSX1 -770805BD0BE8B09A3BE10030060D6AD8DC07D1C3 Rambo (Japan)" MSX1 -4334ACC2BD5C921BC4DCB6DE9A1FCC79D843EE15 Rambo (Japan) (Alt 1)" MSX1 -AC381DFB4D0B52DEDB18A8DF7A4651ED2978D12F Rambo (Japan) (Alt 2)" MSX1 -FE1D02284B0B051308E3C796E8E9EEE2F86521B8 Rambo (Japan) (Alt 3)" MSX1 -54A49A3C8B42B8B246E62ED45346CF52836DDCAC Real Tennis (Japan)" MSX1 -91E17ABA249925C7E0E5C280469BEF09D5534DA8 Red Zone (Japan) (Alt 1)" MSX1 -61E26157F0701CCE2DDB860A12F187912398B1B4 Red Zone (Japan)" MSX1 -74AE85D44CB8EF1BAE428C90200CB74BE6D56D3A Relics (Japan)" MSX1 -C72AF5118835E49AC6D181CC832336AB22EC5DCB Renju & Ojama Dogs (Japan)" MSX1 -F02CA47BE665E83D812979D8074A985E5637B979 Rise Out from Dungeons (Japan) (Alt 1)" MSX1 -5FBC5D6A01E66A1C456B82AC1190CCDE61BC7832 Rise Out from Dungeons (Japan)" MSX1 -33BE9017FAF173EAE04D0C91CA8D42D1C20596C0 River Raid (Japan) (Alt 1)" MSX1 -A1E14912D45944B9A6BAEF1D4D3A04C1AE8DF923 River Raid (Japan)" MSX1 -BF4A0BAB1E8EAA70A8B12CD9A81D7A90A74C9E26 Road Fighter (Japan)" MSX1 -7ABDF08E9C0A511B8182C502ED8C5F42778437E9 Road Fighter (Japan) (Alt 1)" MSX1 -46C98A3143F5A80B2090311A770F9B73000881C0 Robo Wres 2001 (Japan)" MSX1 -A2F9E1250C67D2E98BE70900D4370545321CDBFE Robofrog (Japan) (Alt 1)" MSX1 -ACCE81BF851FA5869CD75181DF4FCF7D4489A9DB Robofrog (Japan)" MSX1 -1EDABC3226648B54AE98D524B31F37CA47C8C88B Rock'n Bolt (Japan)" MSX1 -1500A07693A7C06189F4CD6764D5EE62F0EDD85D Roger Rubbish (Europe) (Alt 1)" MSX1 -8607B92458584D5AA770369D94D50361B1D64BD3 Roger Rubbish (Europe)" MSX1 -FF9877666D983759D41398C5E3E29801AD95A589 Roller Ball (Japan) (Alt 1)" MSX1 -44BAA180F6C9E0F140AC1F0AFAE75C412CB06B9E Roller Ball (Japan)" MSX1 -34544106FBD29B2A72E1E8C2E0F260B79A0B0883 Rotors (Japan)" MSX1 -0D459788B6C464B50CBC2436E67A2CEF248E0C4A Salamander (Japan)" MSX1 -3F741BA2AB08C5E9FB658882B36B8E3D01682F58 Sangokushi (Japan) (Alt 1)" MSX1 -14FF6FE464362C6B7DBB47B2ECDA3A8C5F05EF79 Sangokushi (Japan)" MSX1 -E767C0239B79821463FA42F2C1989D3FD1B4B868 Sasa (Japan)" MSX1 -395C5F40692C45B891ABE07C89D1E87829665FC7 Sasa (Japan) (Alt 1)" MSX1 -1A6DE1CFF831429394DC2B9528993A1DFCAE14C6 Saurus Land (Japan)" MSX1 -BC3BE8F829211DD8A8EB854F86FF014C47ED9254 Scarlet 7 - The Mightiest Women (Japan)" MSX1 -09FBBD923E0DEB82F5E20FA8CE2D842ADBF4A646 Scion (Japan)" MSX1 -C73D4C27AA2B0FB946E398323BD67D9E53C4F9EF Scope On - Fight in Space (Japan)" MSX1 -05182561E05FA8E7C8A8184EDA885DC4FD12CC5B Scramble Eggs (Japan)" MSX1 -C1D272645A249757B8BE5BD913BA2D3447892387 Sea Hunter (Europe)" MSX1 -2B255C3E5615B2F5E2365419A35E4115A060E93C Senjo no Ookami (Japan)" MSX1 -4936916BF914D99C5B9E3F4C7385F44B6B97D4C5 Senjyo (Japan) (Alt 1)" MSX1 -E373E3E9BE4F6D30D5DB84B699082C00B2021BA3 Senjyo (Japan)" MSX1 -DB0ED31C779FFFD2084946E3BA69512B372D845F Sewer Sam (Japan)" MSX1 -83DF4081529FE5B8BB0A3601614D36C8384C9202 Shougi (Japan)" MSX1 -0E06519E68C78A8F018152511F4F13374C5856AA Shougi 2 (Japan)" MSX1 -299E52DFBBB94ACE4FD1EF59ECE45364CE0BB450 Shougi Game (Japan)" MSX1 -F9AD0CDB227C588B1A5C75220ED53D0314550D7F Shougi Meijin (Japan)" MSX1 -1C4DE8D4A1CBF5AA2BCF7816A1E55EE4584F59FB Shougi Sinan 1 (Japan)" MSX1 -D844C4C5AE9C7AC671C4BE71AC1190A1E5DB4D36 Shout Match (Japan)" MSX1 -4937A8E35072012A980F85ECFC60604D9D900244 Simple ASM 1.0 (Japan) (Program)" MSX1 -D120CA303C3E1DD56ADEE68F10E9E1AB51F50AB3 Sinbad (Japan)" MSX1 -D264152D4974B78959465ACFE0D5678E72930073 Skooter (Japan) (Alt 1)" MSX1 -64F1CE4691056047F404460031ACB0B82A76968D Skooter (Japan)" MSX1 -136D838CC1297940D96CD8E27AEA9F9E3C7088A6 Sky Galdo (Japan)" MSX1 -1F8334DC7459CFCF2AD132E94976015C02E51390 Sky Jaguar (Japan)" MSX1 -E3A52D448E69D6D14F67D35F24D9924158B1CCE1 Slapshot (Spain)" MSX1 -7300D44A753DACF582D3079ED09EAFC9DD629530 Snake It (Europe)" MSX1 -5A12439F74CA5D1C2664F01FF6A8302D3CE907A8 Sofia (Japan)" MSX1 -2338946A671D31D12360ACE4EEB33F7BC7DB56F1 Soukoban (Japan) (Alt 2)" MSX1 -CF55B0D12E550F71CEF709358BC7E799ECED0083 Soukoban (Japan) (Alt 1)" MSX1 -04BD78730B100DD879E2FBD3FE646D2BC9BBC46B Soukoban (Japan)" MSX1 -DE10AA2A2ABFDCAFE0064E1E76B676F54C7AAFC6 Space Camp (Japan)" MSX1 -D1AD3BEB29AECAA7C3BC1FD8A4BE3B10D38CC47A Space Camp (Japan) (Alt 1)" MSX1 -4971BDD3DB63D394FBC2186182C901CA4B32535B Space Invaders (Japan)" MSX1 -FBBD9A77004F9BDBCFC292F85C32106FAA18CFA6 Space Maze Attack (Japan) (Alt 2)" MSX1 -A00F9E66F1FA3DE15B028E0FBFED636E194BB967 Space Maze Attack (Japan) (Alt 1)" MSX1 -93BF6725A3C1B7071064A01884E1B6E8C6F8B579 Space Maze Attack (Japan)" MSX1 -7C0F720C7601CA6DC86C81AB6A76E0587A052F75 Space Trouble (Japan)" MSX1 -FFF31B8C7549493D8EC220F85E3E8536F150D82A Space Walk (Europe)" MSX1 -4B996BDDF88605C432F73564922106A63D31F62C Sparkie (Japan) (Alt 1)" MSX1 -B9C98B80216983F97E28293B576CA9BE3602C1A1 Sparkie (Japan)" MSX1 -4D80FAE5133D55503968EE246C1346CDDB020FFC Spelunker (Japan) (Alt 1)" MSX1 -49E14B0248C649E7B5754357597695ABEF70C17D Spelunker (Japan)" MSX1 -97F1790146116198133C083DE113ED1E5CA6FF21 Spider, The (Japan)" MSX1 -33C62E6F7478BE369580A2D985FF57667F13CF84 Spread Sheet (Europe) (Program)" MSX1 -1D129BDE09C9DB2433B334D36762704DE94983BA Spy vs Spy II - The Island Caper (Europe)" MSX1 -18B90AAA2284EB46233E9203AF1E8CF1922C417C Square Dancer (Japan)" MSX1 -7BF7BD134DDF9ED5B489F7F2EB0AA26BB2428FC9 Squish'em (Japan)" MSX1 -364AE6695509F5CF16985CC2946A45AF5CA4CF56 Squish'em (Japan) (Alt 1)" MSX1 -A1E1BFFE4B4EA6D67C973FA483C4D6273F68DE3C Star Blazer (Japan) (Alt 2)" MSX1 -EDA9580A1AC75707F621C251A7424DF3846E4EC0 Star Blazer (Japan)" MSX1 -B07A6AE619FCC6291838959DC1A899DE832F8D97 Star Blazer (Japan) (Alt 1)" MSX1 -225894DA7E3AFABF33ABF05E519E1F6BCAC77A21 Star Command (Japan)" MSX1 -5FE86465119343804A722CE4768EB33DE806A39F Star Force (Japan) (Alt 1)" MSX1 -C1746EFEB4B44DCC80DFC4F429009FEAC91D9C48 Star Force (Japan)" MSX1 -6A56B46B8BF014B25863433D6D96E64641A93EEF Star Soldier (Japan)" MSX1 -B58CAF47C953B6F00935A201BFCCF7EE968DFF32 Star Soldier (Japan) (Alt 1)" MSX1 -B2BCC1C0D64B6EE9F0E9BBBCF0EF7B64D80D3B90 Star Trap (Japan)" MSX1 -E3CE88E95115765E31193777E57FCB9B40E10D3A Starship Simulator (Japan) (Alt 1)" MSX1 -0E5062BB18B4A6FB93A89318772928874DD4D6EA Starship Simulator (Japan)" MSX1 -FC5D252A26C93DC4CC30984B954A6A5124DEE653 Step Up (Japan) (Alt 1)" MSX1 -27CE427EB1C86BA22707A6EE9086DB9D39962DC6 Step Up (Japan)" MSX1 -1FA7398005FB0BD7075141035E8D888197162030 Stepper (Japan)" MSX1 -3950F22265139A84CF57F3C0936E7927173F3D7A Stone of Wisdom, The (Japan)" MSX1 -3063BC3AC5AF6D990D8D002ACBC9C3A18BAB71F6 Strange Loop (Japan)" MSX1 -CCF6E244D27EC61195280D0915A3B43D291E3FAD Suparobo (Japan)" MSX1 -05D7016F39E94BF9FC33D0E8482FF3038D6E01BD Super Billiards (Japan)" MSX1 -DACC9ED6A80FB15C3E82C4081C07211E033BA820 Super Bioman 4 (Korea) (Unl)" MSX1 -5D65A308BB9EC8C4B4CE334B18D699B1F53227EF Super Boy 3 (Korea) (Unl)" MSX1 -8B65D999BA187C98BA97A038EA46655FD9D62DEB Super Boy I (Korea) (Unl)" MSX1 -85153A8F25882CADDE8295D040DDB7586C93CEFE Super Boy II (Korea) (Unl)" MSX1 -03F112B38FB1D05A9B0B50D3C6A54AA2CE9DD2B0 Super Bubble Bobble (Korea) (Unl)" MSX1 -A84608F1C2FE1AEA1A8A586F2E335CB64BB951FC Super Cobra (Japan)" MSX1 -7AD00597CEB5A02379055230D907C4421982329A Super Cobra (Japan) (Alt 1)" MSX1 -16553C30FCDD0E1D00A48FE1CB2DEF537C4A7C3F Super Columns (Japan)" MSX1 -54F288590F0C882F6E3A9B7C3F7D15B407190975 Super Cross Force (Europe)" MSX1 -82C68A93D01F103AF4FE9F9205184FFD1A36A90F Super Drinker (Japan)" MSX1 -27C2CDEE4BE0CA166C2EBD2DAC61115A56BB9856 Super Golf (Japan)" MSX1 -2DFBCA8F5CC3A9E9D151382EBE0DA410F5393EAF Super Laydock - Mission Striker (Japan)" MSX1 -55F30C8B7118870802D00DB860BC1945F18A42C0 Super Monitor (Japan) (v1.1) (Program)" MSX1 -35F13B5A32C64B21517F0C4009F264067338912E Super Monitor (Japan) (v1.2) (Program)" MSX1 -991EF9890DC3E0C0D29D6D249675EAE182ACA30C Super Pachinko (Japan)" MSX1 -0D2F86DBB70F4B4A4E4DC1BC95DF232F48856037 Super Pierrot (Japan)" MSX1 -0348F1758DAA118EBAF2BC593FF9A0A622FC89E8 Super Snake (Japan) (Alt 1)" MSX1 -58B3B3A678364D0649C1AF0C27DA144CFEE85146 Super Snake (Japan)" MSX1 -8DCD9618F92FB014D16E8F4EC9A813E65424AD7D Super Snake (Japan) (Alt 2)" MSX1 -996A1C0D92400287C15545116B952F84C7DC03B1 Super Soccer (Japan)" MSX1 -830EFA0B25E1CF34D5F55D08CB80709D0A2C82EC Super Synth (Japan) (Program)" MSX1 -A2F8F8F9F46262342EEE0A1DF7C6871008A3A189 Super Synth (Japan) (Program) (Alt 1)" MSX1 -4A1282901221207DA79432FB0BCB4F1E722C8278 Super Tennis (Japan)" MSX1 -1A5295A337E5B969C939644CB5AD55B84A6AD31D Super Tripper (Spain)" MSX1 -221C76D6AC483FB1F11C87D37B9617F1E1D7BC6D Sweet Acorn (Japan)" MSX1 -C8015D4453EFB9F78005F6C8481CBCE9D99F6CC5 Sweet Acorn (Japan) (Alt 1)" MSX1 -2D8E39F210DA6D633F773CDA03E9970712EA84CF Swing (Japan)" MSX1 -719F457D8FCBF6C21A88E88F34FCD54F5E96AD68 Swing (Japan) (Alt 1)" MSX1 -16351E6A7D7FC38C23B54EE15AC6F0275621BA96 Syougun (Japan)" MSX1 -5BBCBD47F05A2742CFB0CAD88856EB2DF6E469FE Tank Battalion (Japan)" MSX1 -7FEF9411858B1FF3FF019646E9E7AA0C61C7E87D Tatica (Japan)" MSX1 -8F74C91E6598D8DE188AE1B506C44229C768B11F Tawara-kun (Japan) (Alt 2)" MSX1 -8DD49E12677443AEDE319F41BF3F82A08D0E5B5D Tawara-kun (Japan) (Alt 1)" MSX1 -14F2D64D05E2E53E876E3D6AF0A5711E557E3C96 Tawara-kun (Japan)" MSX1 -A8EFF8C532DA894C86198B04B0A5D7707FEB28C5 Tear of Nile (Japan)" MSX1 -4E17EFBE87ADC232C055D0DC26EB4476C661AAFE Telebunnie (Japan)" MSX1 -50439F12DDFF3ED449DA3CC1442385AABA609E7D Telebunnie (Japan) (Alt 1)" MSX1 -249DA12E2711C643C5E18CF96184D33DBF7E2305 Tensai Rabbian Daifunsen (Japan)" MSX1 -010D5F325FC38C5B590841D15CE4F07D59F2A4CB Tensidachino Gogo (Japan)" MSX1 -A0D85C5FC74547F46025369DA687569FB5AA3991 Tension (Spain)" MSX1 -4FF12FC3ADF389A1F76A7A9BAB6B2FD20044F5B4 Tetra Horror (Japan) (Alt 1)" MSX1 -53814FDFEACCE237BB68FB9056D005EB614B708A Tetra Horror (Japan)" MSX1 -E9398ACEB9F8A648E4BCEBE02E5D7B14A3744C7D Tetris (Korea) (Unl)" MSX1 -3C29EEF381D77F8C1F425A3E29919013C72F875C Tetsuman (Japan)" MSX1 -F6711E1E2BAC04D45B8988F1D03529AD777ABF4E Tetsuman (Japan) (Alt 1)" MSX1 -6420473EC647E4D750BC2247020B6722435B5211 Thexder (Japan) (Alt 1)" MSX1 -049E7DCCD3977049B5F68AAD7754105B014BA771 Thexder (Japan) (Alt 2)" MSX1 -A2109DA08B1921C4B3B47C6847598D424581B508 Thexder (Japan)" MSX1 -DE5DA311941056A90CAB28FD91522C054871513F Thunder Ball (Japan) (Alt 1)" MSX1 -4F73BA24163946F6247523FC3F2AA5DE00C3D7A6 Thunder Ball (Japan)" MSX1 -136F2DEDD45F4419837EB1E4E623CB1DC317EF39 Thunderbolt (Japan)" MSX1 -B3D57F968FDFEBE77F78C05F4A075D139F219AE0 Thunderbolt (Japan) (Alt 1)" MSX1 -D1FCD47F6B68FCEE9914B32FD48B2634CF60C994 Thunderbolt (Japan) (Alt 2)" MSX1 -B3C2DC4D1C940DDB4B9E742B8F5A47AB1E2D385F Time Pilot (Japan) (Alt 1)" MSX1 -C1C5EC4042760880216F781EBD5E7174A3B0F9CA Time Pilot (Japan)" MSX1 -D147F2CAC0600527CE49BFFFC865C54EB783E5E5 Toobin (Europe)" MSX1 -37C85041128EE21300327726B7300A20EF6B84DD Top Roller! (Japan)" MSX1 -EA8D86AC74DCDCA1C72DAAE517722431767C5AD2 Topple Zip (Japan)" MSX1 -9B55970341AAAB59A73AE921C6CCF29009C1A8F0 Track & Field 1 (Europe)" MSX1 -BE16501255617BADE264DBF63DC59008E1D84AC8 Track & Field 2 (Europe)" MSX1 -503CBAD7516C6FDE89761388AB32845F35284CC6 Traffic (Japan) (Alt 1)" MSX1 -7DBEAF25E3A1A66F9C6B331332DC36E73B511D4A Traffic (Japan)" MSX1 -DFD7EF6FD86EFD5C8019B59D8FA5C5A47CF90CD0 Trial Ski (Japan)" MSX1 -E93DA3D1910D513DBB78AD599ADBB05EB92B5930 Trick Boy (Japan)" MSX1 -4A35065D97D81A94A7649D19B3F9ABD34F834EAB Tritorn (Japan)" MSX1 -8547AE0FA25B9F3E26B90D4F3E1A4325B9248549 Trumpaid (Japan)" MSX1 -BFE8046F8CCC6D6016D7752C04F0654420EF81E7 Tumego 120 (Japan)" MSX1 -08BE92145A99DD6E0539FF79DCA62B2F4CC59B0B Turboat (Japan)" MSX1 -6B496A50626C3E67DFE49C15A3847448DBEB05A8 Turmoil (Japan) (Alt 1)" MSX1 -D33FE18EDE20DA4DD3D6991A9C2995E149C8FC3F Twin Bee (Japan)" MSX1 -751D722A4F36A03E88AC62118AE8D880E40C1C84 Twin Bee (Japan) (Alt 1)" MSX1 -ADB3977309D373AD1DC995AE7D2F8280F1673D66 Twin Bee (Japan) (Alt 2)" MSX1 -8B828D33DCDFD324DF1827EF79F5CA9635968C6E Twin Bee (Japan) (Alt 3)" MSX1 -4FA5382DF5A8FF7D631BE22BB8445E7BC8018A11 Twin Hammer (Europe)" MSX1 -F3C0C1F0EC3E10CD4A5EAAE26D593198B1A5AB9A TZR - Grand Prix Rider (Japan)" MSX1 -E73A449E34652C18AF0A72AB5C3637AFA57D5842 Ultraman (Japan)" MSX1 -4340A2580C949D498D2C8E71699FFF860214E9EA Vaxol - Heavy Armed Storm Vehicle (Japan)" MSX1 -DF797593395346E94AA1CF13A9524E30D631888D Venus Fire (Japan)" MSX1 -82868A81D805FB391FCE588623FC888296CBF62A Video Hustler (Japan)" MSX1 -EED68D254A17D76C36E094DD8A50A362A964E1B7 Video Hustler (Japan) (Alt 1)" MSX1 -6DFC622E350D29859F05FDDB3FA1F974CD4C8BF2 Volguard (Japan)" MSX1 -52F95F6F4261BE00AE1B9CAF88A05C021C229E28 Warp & Warp (Japan)" MSX1 -DE6DB54CEF2CC4CBCC09C57C8ED0A1FF01347B6E Warroid (Japan)" MSX1 -6CE0632ACC2351AE968D7D3CE9C9A0AF05C713CF Warroid (Japan) (Alt 1)" MSX1 -28AAF59DADB425C1EF6FCA860439F4E42E1737B8 Water Driver (Japan)" MSX1 -818D91505AD39BBA2EAF7F4857C7D41E95FCB233 Wing Man 2 (Japan)" MSX1 -D74C381EA17ACB94527EF3ABAA280793A824D322 Wonder Boy (Japan)" MSX1 -1672AF5BC1740480E8302F7690589EA5B5391BCB Wonder Boy (Japan) (Alt 1)" MSX1 -76209C36BEC7CA971C6DB2E3BBCE267147E4A361 Wrangler (Spain)" MSX1 -58E335C943D2647C3FF1E689069D9FA5E1C7FF6E Wreck, The (Europe)" MSX1 -15CC2F7412373253E908689A778738D52656AD74 Xyxolog (Japan)" MSX1 -1E2ABAC01EB37E43A7A61DA25DC147BBDC30AD32 Xyxolog (Japan) (Alt 1)" MSX1 -1A6C5BA03E0CC76F7E001784E1A205375F5602B8 Yab Yum (Netherlands)" MSX1 -8161D9B325C708AF463C5622BD89CA94754CFDEF Yamaha Play Card System (Japan) (Program)" MSX1 -939ED6053363112C34766335B93D0DDF25059468 Yellow Submarine (Japan)" MSX1 -8B3994AB39768F15617FB2CD9199000226B935BD Yie Ar Kung-Fu (Japan) (Alt 1)" MSX1 -A3090A15C95334DA3E0F94030EADEE02B5032C0C Yie Ar Kung-Fu (Japan)" MSX1 -57827F8D49369E4DBF20A968E535374D35FF1648 Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan)" MSX1 -609D0BAC4933D1BCC877746A3E14D82C204F40E7 Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan) (Alt 1)" MSX1 -5017ABECA8FBED43FF2FD1A936843ACDC7192DCC Yie Ar Kung-Fu II - The Emperor Yie-Gah (Japan) (Alt 2)" MSX1 -C60A28A4048710AD3C63EF5BCF4CE03DB54C00BB Yokai Tanken Chimachima (Japan)" MSX1 -97E173DAC64DBDE7D6A60DE7606CBA0C860813DB Young Sherlock - The Legacy of Doyle (Japan)" MSX1 -DE765E699AF4D76D8FA80FB10D1E41581BEC11BF Zaider - Battle of Peguss (Japan)" MSX1 -F784350AF0C5C7407D83DA2BB499C59A08496AAC Zaider - Battle of Peguss (Japan) (Alt 1)" MSX1 -B030B3C22BAADD0D419657DCFA4B974AE1CD7508 Zanac (Japan) (v2)" MSX1 -FFA8FC5756F7E1D1EF168618F5606ACA10F8B2C7 Zanac (Japan) (v2) (Alt 1)" MSX1 -372623401599C57968DAAC0312DD9A0ABBC6BD2F Zanac (Japan) (Alt 1)" MSX1 -46E9ED7B7F6DFDA8EEE266476C9EBC4DD9D8FCC2 Zanac (Japan)" MSX1 -D88F33EE40839F87CDCE6CC4820E1DD192A01776 Zaxxon (Japan)" MSX1 -3DA301B1082C158E505523FA22C19F1B3F4D851C Zaxxon (Japan) (Alt 1)" MSX1 -59679B1ED40416F4C8D65085E5473C621BEA6AC4 Zen (Europe) (Program)" MSX1 -2F4404D141ACC40E48AF0B12C70CD44B066ECE10 Zenji (Japan)" MSX1 -C9440172802818CC5B9AE559FBD3F346A263605C Zenji (Japan) (Alt 1)" MSX1 -9D5F6098B71712E9D9E386739B82FC484380F114 Zexas Limited (Japan) (Alt 1)" MSX1 -71442AC703C2966142B04071FEDF180E81DAAB9A Zexas Limited (Japan) (Alt 2)" MSX1 -A87971B9DF0DE44644C2188F5F475AEF7AE85304 Zexas Limited (Japan)" MSX1 -07DB3E3FFB16C138F9DA12CACDE48BF7522A188C Zoom 909 (Japan)" MSX1 diff --git a/Assets/gamedb/gamedb_msx2.txt b/Assets/gamedb/gamedb_msx2-L.txt similarity index 100% rename from Assets/gamedb/gamedb_msx2.txt rename to Assets/gamedb/gamedb_msx2-L.txt diff --git a/Assets/gamedb/gamedb_msx_msx1_cas.txt b/Assets/gamedb/gamedb_msx_msx1_cas.txt new file mode 100644 index 0000000000..ae9ca00c2b --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx1_cas.txt @@ -0,0 +1,1845 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Applications - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:55 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +736C0EE641D9C1E17C04F6D1CCFE4D43 Aackobase II (1985)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +3295CBB7E8F069F8E5BC8E30BDF90307 Aackobase II (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +A01E1D2B6C0652062D4D998C17F0655D Aackodraw & Paint (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +C9E1D5015B9FEA822561F703F6EAB14C Base de Datos (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +457EC28EA57D76C072927DF1A0FBE563 Base de Datos (19xx)(Toshiba)(ES)[CLOAD + RUN] MSX ES +EF0FEF919507CCE0FE0D51F6D8193895 Calculator New (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +B16D3E51F3EEBF77EFB37843FFE8C822 Compor - procesador de textos (19xx)(Philips Spain)(ES)(en)[BLOAD'CAS-',R][Martos] MSX en ES +D7EC7B254C31E63190FD29AE58F6C110 Contabilidad (1985)(Sony Spain)(ES)[CLOAD + RUN] MSX ES +7CA72A62CD395143A3CB864B1262CDA0 Contabilidad 1 (1988)(Mind Games Espana)(ES)[a][CLOAD + RUN] MSX ES +EDAE3F4466DA1866EC02109CA12EDFB3 Contabilidad 1 (1988)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +E4621B821A8F82AD8A7637834CA78D31 Contabilidad 2 (1988)(Mind Games)(ES)[a][CLOAD][Martos] MSX ES +08841822D91E5939779FD6588B65CF05 Contabilidad 2 (1988)(Mind Games)(ES)[CLOAD][Martos] MSX ES +279D8D9170E4D0EC92DFD54814C3F49E Contabilidad Domestica (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +CFB0688F9AE333F58123B38024BE8408 Databa (19xx)(Philips)[RUN'CAS-'] MSX +E435D3558345D98614F8BDB0093F0CEC Dim-Calc (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +3DA269A1BFFFF7F85006B00266C37E2D Disenador de Graficos (1985)(Advance)(ES)[BLOAD'CAS-',R] MSX ES +27D9786295C5716CF361971284F6F63E Fin Pack (1986)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +E177A0F9C9E85BE559E345A923B54E95 Fin Pack (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +BF60EDEE4F09F3082098E123E7FE2097 Games Designer (1985)(Quicksilva)(GB)[BLOAD'CAS-',R] MSX GB +E4835F024F9C8B0A624BD49698BB1F84 Graficas de Gestion (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +54E1D4D94B341ECDC662BB7A63A2352D Head Alignment Kit (1985)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +EE7499762CB6343790DE5B7591A6337E Head Alignment Kit (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +98289A76D9C8F7E0BD0285895F981A4D HiSoft Devpac GENS (1984)(HiSoft)[RUN'CAS-'] MSX +FCB5C2B7336853D11409C22BA8CAD3C7 HiSoft Devpac MONS (1984)(HiSoft)[RUN'CAS-'] MSX +61844EA726886F67C1476C2424AEA64B Hisoft Devpac. Ensamblador,desensamblador GENS (1984)(Sony Spain)[a][RUN'CAS-'] MSX +6A5BA50E6AB3859C68230A1C4255BC5A HiSoft Pascal (1984)(HiSoft)[RUN'CAS-'] MSX +42FE6EE80A461334F305FB4292556127 Kuma Forth (1984)(Kuma Computers)(GB)[a][CLEAR200,&H87FF + BLOAD'CAS-',R] MSX GB +5E77BBAEF5D4B729BF81B2AFC12735F8 Kuma Forth (1984)(Kuma Computers)(GB)[CLEAR200,&H87FF + BLOAD'CAS-',R] MSX GB +585DAE3ABAFBB91C310F0CEEABC5F72A Kuma Logo (1984)(Kuma Computers)(GB)[a][CLOAD + RUN] MSX GB +1448C7BDE38944466D4A1163A148F385 Kuma Logo (1984)(Kuma Computers)(GB)[CLOAD + RUN] MSX GB +3736F54397D66B8B303DAAC04EB1A180 Loto (19xx)(Manhattan Transfer)(ES)[a][BLOAD'CAS-',R] MSX ES +D3E0C9583C06FE712A1D0B663847F9B4 Loto (19xx)(Manhattan Transfer)(ES)[BLOAD'CAS-',R] MSX ES +D05E14E917C9F9D2A350B5C8240FB704 Master Voice (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +49073B22DB629A1346F89059BD9100C4 MSX Screendump (1986)(Philips)(NL)[a][BLOAD'CAS-',R] MSX NL +E7541EE9B377FDFAEF42C6597A2B7200 MSX Screendump (1986)(Philips)(nl)[BLOAD'CAS-',R] MSX nl +C4E61A3CF10E55ECF1AAFC3EF4D7EAFA PERT (1986)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +C807F2F3D7F4027B4B37F5753AB98E47 Phfile (19xx)(Philips)(ES)[BLOAD'CAS-',R] MSX ES +6D7C9E89C042674C713BEB22226C8FA5 RSC Ensamblador (19xx)(Manhattan Transfer)(ES)[BLOAD'CAS-',R] MSX ES +2E133BBCC07FBDC51AA40E746FFC31BA RSC Ensamblador (19xx)(Manhattan Transfer)(ES)[BLOAD'CAS-',R][Martos] MSX ES +26F0313183D502C5590EBF0FB18CF539 Super Sprites (1986)(Idealogic)(ES)[RUN'CAS-'] MSX ES +A7E093E11C62E7C8A68FE3A1F9E8CFEE Tasword (1985)(Sony)(ES)[RUN'CAS-'] MSX ES +55978EA79056F595F3A23C4FB35054F4 Test de Adaptacion (1984)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +3FDEF871EB17A025F4491283BDBA92E7 Test de Capacidad de Concentracion (1984)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +E67483650E5077580B12B4E15B5DD7DF Test de Caracter (1984)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +D61ACB853AF0C80652B84C9404D3F559 Tutor (1985)(Sony)(ES)(Side A)[CLOAD + RUN] MSX ES +E3F4E01000731A6B2E984DA9CF7931CB Tutor (1985)(Sony)(ES)(Side B)[CLOAD + RUN] MSX ES +25DDB97BBA340C617080B718423AE01B Word Pro v2.60 (1985)(Kuma Computers)(GB)[BLOAD'CAS-',R] MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Compilations - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:55 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +F708D6D74B33346D012990103E5462B0 B 6 Computer Hits - Les Flics (1985)(Beau-Jolly)(GB)[b][BLOAD'CAS-',R] MSX GB +11388070EED82634B5DEA3B89BA4EA2C B PSS-Combipack - Les Flics (1986)(Salasan)(NL)[b][BLOAD'CAS-',R] MSX NL +B8C9FBBAE6E8559A7845EFDB667E8646 B Silicon Dreams II - Return to Eden (1984)(Level 9 Computing)(GB)[b][BLOAD'CAS-',R] MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +8FD6E005E73B1D5919FD037BCB674C36 30 MSX Hits - Beach-Head (1988)(Aackosoft)(NL)(Tape 2 of 6 Side A)[RUN'CAS-'] MSX NL +CED7FBB155EA61837FADD9B73BCC4747 30 MSX Hits - Boardello (1988)(Aackosoft)(NL)(Tape 6 of 6 Side A)[RUN'CAS-'] MSX NL +9558E92D843743C9FCD854CBC791DE81 30 MSX Hits - Boulder Dash (1988)(Aackosoft)(NL)(Tape 4 of 6 Side A)[RUN'CAS-'] MSX NL +AE9F30E366BBB0AA55FA85669EDB6AC9 30 MSX Hits - Boulder Dash II - Rockford's Riot (1988)(Aackosoft)(NL)(Tape 5 of 6 Side B)[RUN'CAS-'] MSX NL +C83E9F586C81EFFFE498F97265489659 30 MSX Hits - Break In (1988)(Aackosoft)(NL)(Tape 3 of 6 Side A)[RUN'CAS-'] MSX NL +FA68767E15DCD9F57B2E62EE5EFE14BE 30 MSX Hits - Chopper (1988)(Aackosoft)(NL)(Tape 3 of 6 Side A)[RUN'CAS-'] MSX NL +4F7BAE1C7DD8009FC8C9E99F2C5D4D4D 30 MSX Hits - Confused (1988)(Aackosoft)(NL)(Tape 6 of 6 Side A)[RUN'CAS-'] MSX NL +749EE38AC6E0A66996FF21BB2CD42A56 30 MSX Hits - Happy Fret (1988)(Aackosoft)(NL)(Tape 5 of 6 Side B)[RUN'CAS-'] MSX NL +1B52A84BFD3BB41825E07249D5F82120 30 MSX Hits - Hard Boiled (1988)(Aackosoft)(NL)(Tape 2 of 6 Side B)[RUN'CAS-'] MSX NL +A6661BEBAD4C15F5014E597B9E81B02C 30 MSX Hits - Jet Bomber (1988)(Aackosoft)(NL)(Tape 5 of 6 Side A)[RUN'CAS-'] MSX NL +A4F6EDA0C11FF76CE48F30CD3DF0958C 30 MSX Hits - Life in the Fast Lane (1988)(Aackosoft)(NL)(Tape 4 of 6 Side A)[RUN'CAS-'] MSX NL +C896413E6A1BCD51DC5CD55BC659623E 30 MSX Hits - Mastervoice (1988)(Aackosoft)(NL)(Tape 3 of 6 Side A)[RUN'CAS-'] MSX NL +7AFD846D688DBDF20B8657D4A357FAD1 30 MSX Hits - Mazes Unlimited (1988)(Aackosoft)(NL)(Tape 2 of 6 Side B)[a][RUN'CAS-'] MSX NL +7EB3A24E8C6BFEE0050E647C47B6D398 30 MSX Hits - Mazes Unlimited (1988)(Aackosoft)(NL)(Tape 2 of 6 Side B)[RUN'CAS-'] MSX NL +1EDB6F51FF921F74652924D1586D8F6C 30 MSX Hits - Miner Machine (1988)(Aackosoft)(NL)(Tape 4 of 6 Side B)[RUN'CAS-'] MSX NL +9769EDA00692BD1D5C0750ABD977A6C2 30 MSX Hits - MuSiX (1988)(Aackosoft)(NL)(Tape 2 of 6 Side A)[RUN'CAS-'] MSX NL +A396B2A8955B8CA59FA07527D2620A05 30 MSX Hits - Oh Shit! (1988)(Aackosoft)(NL)(Tape 1 of 6 Side B)[RUN'CAS-'] MSX NL +01B192AFADCEF4FAD9E14E5CB8539F9D 30 MSX Hits - Oil's Well (1988)(Aackosoft)(NL)(Tape 6 of 6 Side B)[RUN'CAS-'] MSX NL +F16AE945F5C3052DE65809DC2498B931 30 MSX Hits - Pico Pico (1988)(Aackosoft)(NL)(Tape 3 of 6 Side B)[RUN'CAS-'] MSX NL +76D873E60C17CE4F13B7BB953FCA7671 30 MSX Hits - Polar Star (1988)(Aackosoft)(NL)(Tape 5 of 6 Side B)[a][RUN'CAS-'] MSX NL +BBCA21B37798713071EF4DA1BE75DC04 30 MSX Hits - Polar Star (1988)(Aackosoft)(NL)(Tape 5 of 6 Side B)[RUN'CAS-'] MSX NL +5BD729E27A75F05A5530E278FB866239 30 MSX Hits - Police Academy (1988)(Aackosoft)(NL)(Tape 4 of 6 Side B)[RUN'CAS-'] MSX NL +6CB1B3DCEE3EF4A477B049866D4BC99D 30 MSX Hits - Robot Wars (1988)(Aackosoft)(NL)(Tape 4 of 6 Side B)[a][RUN'CAS-'] MSX NL +0DB33526D715957ECD3C2C6F0A268A85 30 MSX Hits - Robot Wars (1988)(Aackosoft)(NL)(Tape 4 of 6 Side B)[RUN'CAS-'] MSX NL +B0B7CBB6F2C4E036C20B04AD84595C1D 30 MSX Hits - Skooter (1988)(Aackosoft)(NL)(Tape 2 of 6 Side B)[RUN'CAS-'] MSX NL +99506468141222EA6844626A4872E795 30 MSX Hits - Sky Vision (1988)(Aackosoft)(NL)(Tape 6 of 6 Side A)[a][RUN'CAS-'] MSX NL +C44AC641F029B04C80271D539C381390 30 MSX Hits - Sky Vision (1988)(Aackosoft)(NL)(Tape 6 of 6 Side A)[RUN'CAS-'] MSX NL +9C29510A9ACD01FE41D750815F24DD86 30 MSX Hits - Sorcery (1988)(Aackosoft)(NL)(Tape 3 of 6 Side B)[RUN'CAS-'] MSX NL +DE24F703B28BC834DC78085C61871B30 30 MSX Hits - Speedboat Racer (1988)(Aackosoft)(NL)(Tape 1 of 6 Side A)[a][RUN'CAS-'] MSX NL +6B122F91F534440D7AB1359D9384AD51 30 MSX Hits - Speedboat Racer (1988)(Aackosoft)(NL)(Tape 1 of 6 Side A)[RUN'CAS-'] MSX NL +3FE0D8C495ADCC6A0CE5FC7907DBABE8 30 MSX Hits - Spy Story (1988)(Aackosoft)(NL)(Tape 1 of 6 Side B)[RUN'CAS-'] MSX NL +2FB785E7B425EDFE0F41A4FE1DA32793 30 MSX Hits - Spy vs Spy II - The Island Caper (1988)(Aackosoft)(NL)(Tape 5 of 6 Side A)[RUN'CAS-'] MSX NL +47024706DA74D1C8F2105037A84B90A8 30 MSX Hits - Star Fighter (1988)(Aackosoft)(NL)(Tape 1 of 6 Side A)[RUN'CAS-'] MSX NL +43D5C91B56E96B818A4DB031C56913AF 30 MSX Hits - The Heist (1988)(Aackosoft)(NL)(Tape 1 of 6 Side B)[RUN'CAS-'] MSX NL +1A5DAF28B9E66BF8C404ADA81A1A8DEC 30 MSX Hits - The Train Game (1988)(Aackosoft)(NL)(Tape 3 of 6 Side B)[RUN'CAS-'] MSX NL +972653E5CF24180B3ACECC5234DE0A00 6 Computer Hits - Brian Jacks Superstar Challenge (1985)(Beau-Jolly)(GB)[RUN'CAS-'] MSX GB +07307F29E43CE5197FC8BE305D9A80F4 6 Computer Hits - Chuckie Egg (1985)(Beau-Jolly)(GB)[BLOAD'CAS-',R] MSX GB +23FAFBF99FB37ADC420E6818A39D3D09 6 Computer Hits - Disc Warrior (1985)(Beau-Jolly)(GB)[RUN'CAS-'] MSX GB +428EE34B3104AD60C30FE206D7D104DC 6 Computer Hits - Hustler (1985)(Beau-Jolly)(GB)[BLOAD'CAS-',R] MSX GB +ACB46D84E8279783145D30C0C08FA5DE 6 Computer Hits - Menu of Tape (1985)(Beau-Jolly)(GB)[RUN'CAS-'] MSX GB +65CE3F0B5479290F2B1073EDBBA9A986 6 Computer Hits - Special Operations (1985)(Beau-Jolly)(GB)[RUN'CAS-'] MSX GB +2E1149B2F49A22C4CE4CAD6C17691DD4 6 in Een - Akunde (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +7D4A7F755A17CAB7AC3E185FA35689D2 6 in Een - Demo (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +F07B5D9F6FBE502BC4FE2A3717CFE0FE 6 in Een - Mad Max (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +05C24D257D4241CA351922D581699012 6 in Een - Mouse Jump (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +946C632BFCF0AD27F8209E328D9FAD86 6 in Een - Palet (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +419264A2212A95D3BA9A6779A4B04F1F 6 in Een - Zeilen (1986)(Philips)(NL)[CLOAD + RUN] MSX NL +C9E2C83EB66A7D45C5C0AFA97529E95D 6 in Een (1986)(Philips)(NL)[position tape + CLOAD + RUN] MSX NL +C544E9837B2178E366083A244D3F94ED Demo, De - Adres Boek (1985)(Philips)(nl)[RUN'CAS-'] MSX nl +C823A2DA7ADBA90163AB7236A6BD7A15 Demo, De - Hexapion (1985)(Philips)(nl)[RUN'CAS-'] MSX nl +D06809EAC6615CCFCF0319BB385AF479 Demo, De - Lanceer (1985)(Philips)(nl)[RUN'CAS-'] MSX nl +EFE2F1D50390009145CBCBF6DABF2FE5 Demo, De - Nederland (1985)(Philips)(nl)[RUN'CAS-'] MSX nl +B5A0020A627ED418536798D45F180F16 Demo, De (1985)(Philips)(nl)[position tape + RUN'CAS-'] MSX nl +D4A316FC01409BFA3BFFDABDEE6C983E Exciting Pack - Alien Bounce (1985)(Soft Pro International)(JP)[CLOAD + RUN] MSX JP +5AB19584A8CFF349EB6164FBCDF97105 Exciting Pack - Cuby (1985)(Soft Pro International)(JP)[a][CLOAD + RUN] MSX JP +C9571736547E6780882ED67F9BFEEE49 Exciting Pack - Cuby (1985)(Soft Pro International)(JP)[CLOAD + RUN] MSX JP +800FB279F3D56BA71E8B879A8219FF7F Exciting Pack - Hyper Blust (1985)(Soft Pro International)(JP)[CLOAD + RUN] MSX JP +EE60ED98724DC50E40BB77F985216BD6 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 01 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +8CD9CEB86A0352C97F38C0FABECD64A9 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 01 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +5D88FB3EAED05F207AF1D312E18F77D4 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 02 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +DB1ADE818E3234CB0CE8A0D15CBCB9EC Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 02 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +229F3A1600DF0B7EE50152956E035B4A Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 03 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +C30431E6648FEDA6A6A23BD716D88FF0 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 03 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +9865A33F250A6F0A706C255EC799EB0D Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 04 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +80432DA5AD1D1C1B88D6B4A4FF3C5241 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 04 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +5F54C89A3563380089B7A1E2D8A2C6B3 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 05 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +8D3732B6D8EFBE1BB0F2FA1AC81F9F20 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 05 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +9841C174A2E349798F7926236A402FA1 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 06 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +AB08D2CCACE183AAA7D7EBFF076865A8 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 06 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +7EC8999E2D824BCDEB0BC2430A8C68F8 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 07 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +5E398D5BF7192F62AFE9D5450631B7D7 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 07 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +C891FAE2E0443E0A9E0FB9AD09FAB106 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 08 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +A91A7D77A22CB82B2BFE1A31028C3156 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 08 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +6ACF7BF5D9AFAADB5CC7D3529CCBA174 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 09 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +59D5423D7FFC8F885EF0820AB3778BBF Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 09 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +41A8EA9E52CBE78A8E9FCCAC3C4F7815 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 10 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +95FAADDA9019822F74EF69A45409B4A0 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 10 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +258CC9D4DBB82166AD0ACF1125EC0625 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 11 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +04E075A707763077B3E8CFEF8FA6EC38 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 11 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +8E055CAC03410CE203D2638DF7893188 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 12 of 12 Side A)[BLOAD'CAS-',R][Martos] MSX ES +1FDA4A76C397769A59BADA33A4388CF0 Informatica y BASIC MSX (19xx)(ATV)(ES)(Tape 12 of 12 Side B)[BLOAD'CAS-',R][Martos] MSX ES +5ED85F6C83E77440465A18F04676EA60 Jewels of Darkness I - Colossal Adventure v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +5151CAA240C4E902E73E128456F2303F Jewels of Darkness I - Colossal Adventure v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +0668B6AC4BA733B78B4B44EB2FE6F11C Jewels of Darkness II - Adventure Quest v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +3DD15CE09291E3C7C323F5CE6C13B488 Jewels of Darkness II - Adventure Quest v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +E2A19581649F319D82C8D5094C8FF790 Jewels of Darkness III - Dungeon Adventure v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +389169F2C453142D0F8CC42E9EE80AF0 Jewels of Darkness III - Dungeon Adventure v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +1B7156B3F376750C9F7B12A2AE5C1CCE King Size - 50 Games in One Pack - 3DO&X (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +E1C554BB79ACD1E75C7E9B28E5B0204D King Size - 50 Games in One Pack - Airshoot (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +932197053779916AB0C801F5960A6481 King Size - 50 Games in One Pack - Birds (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +9748F195AA5B4CEC3A39C771782535EA King Size - 50 Games in One Pack - Bombs (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +EE75CF7A4FC2A6AA443C04FF0067D770 King Size - 50 Games in One Pack - Boom (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +34BDD78FD4777327DB065B7758D8C2EF King Size - 50 Games in One Pack - Bouncer Bert (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +98B6A19C318E1915493FD2DB10509FD9 King Size - 50 Games in One Pack - Bowling (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +53365A7CE60F59DCE798193219C3B3F5 King Size - 50 Games in One Pack - Brands (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +8846B18B9FB962C56DBD4A5659F4B8C5 King Size - 50 Games in One Pack - Carrac (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +66386742147E7949F3F4C9FF2C572097 King Size - 50 Games in One Pack - Castle Rescue (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +E54DF2E2BCE42FEE79D126F184702E8E King Size - 50 Games in One Pack - Chalic (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +F2FF39A30EFEC466C0351F4D4D10F563 King Size - 50 Games in One Pack - Coca-Cola Demo (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +59C6B7E1C883813759C5450C65378CC7 King Size - 50 Games in One Pack - Crossing (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +9E46911A593F32B52C3DA79183166604 King Size - 50 Games in One Pack - Cruise (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +D8223D00EEFF7AE9F7DF1A609A2E6273 King Size - 50 Games in One Pack - Egbert (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +F27B807598C634F6B4D6DB7A46D93726 King Size - 50 Games in One Pack - Escape (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +20E80C705C61B2492DD1068996218A63 King Size - 50 Games in One Pack - Figure (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +640E9612AD2A00EEBE9E69D6F27EDF6A King Size - 50 Games in One Pack - Fisherman (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +A3810BBB089A2569D7F56185762BB72B King Size - 50 Games in One Pack - Frogger (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +0DF4BB6545C24D7685360D7FBF085313 King Size - 50 Games in One Pack - Froggs (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +EE5B11CABC8BA389C4D50DD1C87E6803 King Size - 50 Games in One Pack - Golf (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +0B72FEF649F8D65FE4AA6664119AF4AB King Size - 50 Games in One Pack - Grand Prix (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +F5D41DF4351B74968CAD0D04F02F3C12 King Size - 50 Games in One Pack - Hi-Low (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +98225C26C982E8EF4E160FA89D09C372 King Size - 50 Games in One Pack - Insect (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +8BBC3F11024B0BB64418F9B4C99BACB4 King Size - 50 Games in One Pack - Invaders (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +6E3AF4A5BF9603528AC1941312219B33 King Size - 50 Games in One Pack - Jackpot (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +97CD9A196A7BED8508B5B846456B1F5A King Size - 50 Games in One Pack - Lamppo (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +753F047A888AF9CF3DE107D5832C7BA9 King Size - 50 Games in One Pack - Laser Battle (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +DCA4E852E9C557230600CB7138FB060D King Size - 50 Games in One Pack - Lockin Man (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +1DB2C0D24E682A90F887871F4FB5FBE6 King Size - 50 Games in One Pack - Mastermind (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +B6F5BD206F05CFA29FEEB4CFAEDFC623 King Size - 50 Games in One Pack - Moonlander (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +3A653757938337D666ADEA04B4588159 King Size - 50 Games in One Pack - Paratr (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +652CD5AF62E2654D1AC1DA26F9DE065F King Size - 50 Games in One Pack - Pekman (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +D4C7587F929FD7813E362754B3187E81 King Size - 50 Games in One Pack - Penguin (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +20FEC0CF752E0B7EB1EF8A26CED988CD King Size - 50 Games in One Pack - Poker (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +B1CB9B578F3253451BEC4458B2452A39 King Size - 50 Games in One Pack - Robtek Intro (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +79AC06060AA635380D4525FCBF42E3F1 King Size - 50 Games in One Pack - Secret Ship (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +261D20C0392866639B2F814BFCEC8655 King Size - 50 Games in One Pack - Spacem (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +1151928EDF17641E2FC0B322A9772D8F King Size - 50 Games in One Pack - Space-Ship (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +B8408FFD28B60BFD1CD2FA006B8E7CD6 King Size - 50 Games in One Pack - Squash (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +C087C461AA773E17A9BC0E009ABD84FC King Size - 50 Games in One Pack - Swoop (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +F540D31006A93857E7F4F9E1DEF7B5C2 King Size - 50 Games in One Pack - Tennis (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +408DD8C86F1803CEC761CA0EE6B88A22 King Size - 50 Games in One Pack - The Horseraces (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +BE412FC298A0C8D591019CF1F1685419 King Size - 50 Games in One Pack - Thirthy-One (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +9E85DE2242A39A9BB9381FD1856DE5FB King Size - 50 Games in One Pack - Treasure Hunt (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +BF25C29E3A5D5B1B98036E73FE927297 King Size - 50 Games in One Pack - Twenty-One (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +9FF6B56925A657D59294CC99EAB12EB8 King Size - 50 Games in One Pack - UFO (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +F6D4C0282B9D1C4B5013AB6D60A70D0C King Size - 50 Games in One Pack - We Are the World Demo (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +678A394351FFC8489B01F2E905873C23 King Size - 50 Games in One Pack - Yahtzee (1986)(Robtek Software)(GB)[CLOAD + RUN] MSX GB +EF390CC8F8A0F0B53377AF04FA35250B King Size - 50 Games in One Pack (1986)(Robtek Software)(GB)(Side A)[position tape + CLOAD + RUN] MSX GB +9CBE0296B027A20873694891A5370042 King Size - 50 Games in One Pack (1986)(Robtek Software)(GB)(Side B)[position tape + CLOAD + RUN] MSX GB +95DAC379A2E14AEC0355CE7AFA95AB6B Knight Orc - Part 1 - Loosed Orc (1987)(Rainbird Software)[a][RUN'CAS-'] MSX +B0E44740ED0EAC880D290D8D27C3CB7C Knight Orc - Part 1 - Loosed Orc (1987)(Rainbird Software)[a2][RUN'CAS-'] MSX +5BEEA80DB717A9A6C4C7B09794201E24 Knight Orc - Part 1 - Loosed Orc (1987)(Rainbird Software)[RUN'CAS-'] MSX +E823C05D87D136487D262FF774334866 Knight Orc - Part 2 - A Kind of Magic (1987)(Rainbird Software)[passworded][RUN'CAS-'] MSX +B9599409053E485F2D858C6521D2C1CA Knight Orc - Part 2 - A Kind of Magic (1987)(Rainbird Software)[RUN'CAS-'] MSX +F30B4A0C18528AA73AEA80B1A24915AF Knight Orc - Part 3 - Hordes of the Mountain King (1987)(Rainbird Software)[passworded][RUN'CAS-'] MSX +D596D9408B48D9B1B5C72BFAF1B14133 Knight Orc - Part 3 - Hordes of the Mountain King (1987)(Rainbird Software)[RUN'CAS-'] MSX +3E8DDFA89CBC03D337DD455CA78D4944 Listings 1 (1985)(Salasan)(NL)[position tape + CLOAD + RUN] MSX NL +1D9163C41615108D8C81062B5A5FC49D Listings 2 (1985)(Salasan)(NL)[position tape + CLOAD + RUN] MSX NL +50C61074820ADDC55B40E00330B3DB17 MSX BASIC Land (1986)(Sony)(JP)(Side A)[a][CLOAD + RUN] MSX JP +14F6CC9BC951BFEF5CD3B4F8EC603621 MSX BASIC Land (1986)(Sony)(JP)(Side A)[CLOAD + RUN] MSX JP +E075D0444F2496DECF5DC7C037C65CB9 MSX BASIC Land (1986)(Sony)(JP)(Side B)[CLOAD + RUN] MSX JP +FE1090D6B0BF00350858AF5D8900066D MSX BASIC Land (1986)(Sony)(JP)(Side C)[CLOAD + RUN] MSX JP +77C7BE3FE2707F3D5B31736C398218C9 MSX BASIC Land (1986)(Sony)(JP)(Side D)[CLOAD + RUN] MSX JP +426CE8FA418E8C00730F504CE19944A6 MSX BASIC Land (1986)(Sony)(JP)(Side E)[CLOAD + RUN] MSX JP +317C775E5617F395B8A710C9D01B1104 MSX BASIC Land (1986)(Sony)(JP)(Side F)[CLOAD + RUN] MSX JP +036378C4D9318763820E9A4B33BF8A44 MSX BASIC Land (1986)(Sony)(JP)(Side G)[CLOAD + RUN] MSX JP +430CA74047553BC219B3B1C7698E8B3A MSX BASIC Land (1986)(Sony)(JP)(Side H)[CLOAD + RUN] MSX JP +8F644CBB526B66FE111D11E0781FFC92 MSX BASIC Land (1986)(Sony)(JP)(Side I)[CLOAD + RUN] MSX JP +B7E9BBFE3903A88DFD5525DB4497F128 MSX BASIC Land (1986)(Sony)(JP)(Side J)[CLOAD + RUN] MSX JP +7F162DE26A5D81360CF5008C8E8FA76D MSX BASIC Land (1986)(Sony)(JP)(Side K)[CLOAD + RUN] MSX JP +9405D26D31D09DC4E1979F2580189E3E MSX BASIC Land (1986)(Sony)(JP)(Side L)[CLOAD + RUN] MSX JP +35D9FA5EDC1EBA6D818AB3217FA1EA08 MSX BASIC Land (1986)(Sony)(JP)(Side M)[CLOAD + RUN] MSX JP +B9F70C563390AC022D0467A3BF05D55F MSX BASIC Land (1986)(Sony)(JP)(Side N)[CLOAD + RUN] MSX JP +144F90FEC63CBFAA9DD1203E1A919ACD PSS-Combipack - Lazer Bykes (1986)(Salasan)(NL)[BLOAD'CAS-',R] MSX NL +C24FD03DC5C72B5640541140836A6551 PSS-Combipack - Maxima (1986)(Salasan)(NL)[BLOAD'CAS-',R] MSX NL +5EC2C403C7DE597E0546CB5D1B8D4604 PSS-Combipack - Time Bandits (1986)(Salasan)(NL)[BLOAD'CAS-',R] MSX NL +3A48AE604FE4050365A647834EE0B02A PSS-Combipack - Vacuumania (1986)(Salasan)(NL)[BLOAD'CAS-',R] MSX NL +A144E20D705D7E45BAD291D62D57982C Silicon Dreams I - Snowball v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +D9888BB60083C3C0578CD66EEA5BD859 Silicon Dreams I - Snowball v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +B80386F8A3703F55BBDA1CF9E4EE2BAC Silicon Dreams II - Return to Eden (1984)(Level 9 Computing)(GB)[BLOAD'CAS-',R] MSX GB +C65E91E7FAD7D78EC19235AB8CEE1DB8 Silicon Dreams II - Return to Eden (1984)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +08E5B2A14A3FD40C9414600F2DE6AFAF Silicon Dreams II - Return to Eden v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +F7A21BB96AA965FB9C140BB97B5F1D88 Silicon Dreams II - Return to Eden v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +CDEA2C036DE6F9F33E44F332F6E652DD Silicon Dreams III - The Worm in Paradise v2 (1986)(Level 9 Computing)(GB)[a][RUN'CAS-'] MSX GB +31729AD22D1FEAA257C30BC8F25B6D65 Silicon Dreams III - The Worm in Paradise v2 (1986)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +EAF0C50869A38B6397F2A761577810B9 Super Cassette - Aftik (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +BF21B69DFE69C6B9D1DBAF302CB6DB00 Super Cassette - Bal (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +041C93F22CC16311B8F2314F4BD15387 Super Cassette - Beelen (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +33B21E4F0C6E8B88D51BF87B55C02023 Super Cassette - Beurs (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +BFEED1A7C5F3A7C388C232A67A428C73 Super Cassette - Bioritme (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +DA1515233080530EEE402BE8A89CFAD3 Super Cassette - Boter Kaas & Eieren (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +468B4C044D03DAD706E875A30A1A74E4 Super Cassette - Circles 1 (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +E8090D77C08A94A0D1F96F104A3B8A0C Super Cassette - Circles 2 (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +2F86D2E2CA2AAAE7B82042A867ABC5B2 Super Cassette - Cirkel (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +CE76DEBF0D6F597DFA05B1C7D9A781B7 Super Cassette - Defend (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +EB5732D352065701C290135CFD498AEB Super Cassette - Error (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +D70AC738B31D60E3DE307226F828A9C6 Super Cassette - Figuur (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +046C804CF11362A5C5C8E5CEEE0B5587 Super Cassette - Fire (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +24461ED0C9EDB3311D36A488AF713EA7 Super Cassette - Fonts (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +8E881277A23B343763A52BBD782A44CA Super Cassette - Gauss (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +37BD2FCE12932249CD2FAC19EFB8A05A Super Cassette - Grafieken (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +1D730FACE15F1F8BCC7747D90EDFE346 Super Cassette - Infob (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +B052C7DF22A2E61CA3D5FE37137C6704 Super Cassette - Karakterset (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +C7A51D26092BAAD337215B624AEA58EE Super Cassette - Karakterset 2 (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +8A434CB5692441AA3FE18A890FB85B4B Super Cassette - Kink (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +A165435B657B96C70E4289F5D5D15C42 Super Cassette - Kleuren Zoeker (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +6D855B9618467B58814EF328B7C3F24E Super Cassette - Letter (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +B52353FD796BD1C9F3F7A42C62F779DE Super Cassette - Licht Krant (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +15535D0BE4B145E50603F6890854A6A8 Super Cassette - Lint (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +C6816E6E2715C6C6566C64DEF0DF7EF9 Super Cassette - Listte (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +1D55A4F7E6DDC8DC3D8DAFF3BF873382 Super Cassette - Litest (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +9980682E87DC3CF7BE37687EE9787355 Super Cassette - Lopen (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +3CFFE5728B4534400901FE71BC261F67 Super Cassette - Machinetaal (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +1B458629202DEA7D59A86B702A61D67A Super Cassette - Master Mind (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +E8022E909924E6038FF19316E0A5A180 Super Cassette - Memory (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +6E85980A2FA0778AC3A60B7572692950 Super Cassette - Morse (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +B89A749FB84025CD514C077F165259D1 Super Cassette - MSX-Info (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +94B6B70C97F0D4EF65571BB3ED231A0E Super Cassette - Paarderennen (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +D4512BFCA0197911873D08A334028941 Super Cassette - Piloot (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +AC8515D213DB5D30D07724BA1309D02A Super Cassette - Poker (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +7F24FC36F0625B423BA30415BB4E7481 Super Cassette - Reakti (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +05AED94CE1EF655387FD8696A5579F92 Super Cassette - Rijweg (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +0A7DD9713CE83B53B950DCD05BE788C8 Super Cassette - Ruimteschip (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +4EABF3515513E0C9CF75A44CA3C84E5E Super Cassette - Salari (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +CF4FFB6DB9C7CAFA825340215293FAC7 Super Cassette - Schuif (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +3E6B79E18177DF5F6AF6FA9E57CC8743 Super Cassette - Scroll (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +C25076DB41903E2060F8FA8C432E5739 Super Cassette - Slang (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +C9C90EDFAA393F312CC901BA9FD97AAA Super Cassette - Spiege (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +DBDC87CE2B0D656411092AEBF593D934 Super Cassette - Sprite (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +D0748A1EFA3210D397E99AAF3E000CF0 Super Cassette - Stel (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +652BE606D4D4699A191CA51F840D3A8F Super Cassette - Teken (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +46DCB2F5B144E18C3357B26440AEBCE1 Super Cassette - Tekene (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +B5CAC3C289C55A5F7625A452B6DAAD6B Super Cassette - Tel (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +72ABDA627A15386A5D85425430CDA684 Super Cassette - Tennis (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +392136B4FE892974D91BC9DA9784E4A8 Super Cassette - Vakken (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +6CDDA8A65DE54F2D87D9F280C2EB242D Super Cassette - Vdemo (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +E9944A33BCAE4A0369F2D11F4CF72D3D Super Cassette - Video (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +35D8444654BCAED106EB26639922D8AC Super Cassette - Vlak (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +32D63FD166516A3CEC00A47AF03274E4 Super Cassette - Wisk (1985)(Salasan)(NL)[CLOAD + RUN] MSX NL +3BB07FA1E831816A677E700771A2E6F5 Turbo Pack A - Contabilidad Domestica (1986)(Philips)(ES)[CLOAD + RUN] MSX ES +7D2ADE63873F35F6362EBFA674733863 Turbo Pack A - Ecuaciones Lineales (1986)(Philips)(ES)[BLOAD'CAS-',R] MSX ES +6AA7C90AEBEBF0512119AD841D824670 Turbo Pack A - Katmosis Faraon (1986)(Philips)(ES)[CLOAD + RUN] MSX ES +A66FE91D4B1280A2715D4DB54B22A784 Turbo Pack A - Shup. Trebol (1986)(Philips)(ES)[RUN'CAS-'] MSX ES +6D983DEB3A144FD098C598224E95B03F Turbo Pack A - Super 1x2 (1986)(Philips)(ES)[BLOAD'CAS-',R] MSX ES +92E4BAB93982845EE87F14CCBB2094DE Turbo Pack A - VG Estrella (1986)(Philips)(ES)[RUN'CAS-'] MSX ES +AA775D4336C41C994200C8CBF55A963F Turbo Pack C - Alcyon (1987)(Philips)[BLOAD'CAS-',R] MSX +E86FB13B84A3ED8D7F2B80D9B98DBA4A Turbo Pack C - Artillero (1987)(Philips)(ES)[CLOAD + RUN] MSX ES +84949525ACE10C237E36E36831C962BB Turbo Pack C - Biologia - Principios Inmediatos (1987)(Philips)[BLOAD'CAS-',R] MSX +78B8201BB0B57FEABE880EC11172A876 Turbo Pack C - Capitales de Espana (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +C5884F86C93C56B692B23DFB23B14EB4 Turbo Pack C - Demand (1987)(Philips)[RUN'CAS-'] MSX +3ECA80B995A588A6199E0DFAABB0D960 Turbo Pack C - Drum (1987)(Philips)[RUN'CAS-'] MSX +84C87529E0153C8ACC569F061AAEF3CD Turbo Pack C - Editor de Sprites (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +BE263C9542A3BA12BFEA35D778780B17 Turbo Pack C - Galaxians (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +27D21893AF6AC41161E682FB0ADA6AD7 Turbo Pack C - Geometria - Figuras Planas y Volumenes (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +4C8A8DD2D91CE6E37A0847D656EFDB9F Turbo Pack C - Glider (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +2F01FADACBD02C398C909F85B353F839 Turbo Pack C - Heli (1987)(Philips)(NL)[RUN'CAS-'] MSX NL +45A2B0EF9AA163AC9E7EE2138EE4D4A0 Turbo Pack C - Juego de la Moncloa (1987)(Philips)(ES)[CLOAD + RUN] MSX ES +53D13D53C59E18E975D4BA70FBECB237 Turbo Pack C - Kitchen (1987)(Philips)[RUN'CAS-'] MSX +DB3C2B907AAACF43C0380DA3BD28825C Turbo Pack C - Los Petalos Locos (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +14CE3CCA454CEE4D64B184B1A6AE781E Turbo Pack C - Micky-Lucky (1987)(Philips)[CLOAD + RUN] MSX +4D2DA46833CDDB152CBB4C067C12ED07 Turbo Pack C - Mouse Jump (1987)(Philips)[RUN'CAS-'] MSX +17280D9C397017B472E9A62AAF5B7917 Turbo Pack C - Othello (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +DEFC0AA75A31B1F273CB96CB76730904 Turbo Pack C - Pucky (1987)(Philips)(NL)[RUN'CAS-'] MSX NL +98902DDA14164E1753854F236761D032 Turbo Pack C - Pyramid (1987)(Philips)[a][RUN'CAS-'] MSX +4D5D493DE2A35A9672C3ED825AE52A3B Turbo Pack C - Pyramid (1987)(Philips)[RUN'CAS-'] MSX +F04371168EEC2DCD27662706DDB53627 Turbo Pack C - Racer (1987)(Philips)[BLOAD'CAS-',R] MSX +DF7A3F6D11DAD486BA45EFEFDB4D08DF Turbo Pack C - Rios de Espana (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +9CE7DBBFD81DE08A3E66424FC24C3BB5 Turbo Pack C - Rocket (1987)(Philips)(NL)[RUN'CAS-'] MSX NL +54B17FCFCF4AE9B43519A1863CB3F5E8 Turbo Pack C - Snack Bar (1987)(Philips)[RUN'CAS-'] MSX +89C29ABEE9B081EBBE7F6B165EC91CF6 Turbo Pack C - Space (1987)(Philips)[a][RUN'CAS-'] MSX +00B4EB182DA888663D59A64804DA25A7 Turbo Pack C - Space (1987)(Philips)[RUN'CAS-'] MSX +47AEF8B61D9E971C348310A8477BBAF6 Turbo Pack C - The Crossing (1987)(Philips)[a][RUN'CAS-'] MSX +BF1389DB053BA8399576E2440293F877 Turbo Pack C - The Crossing (1987)(Philips)[RUN'CAS-'] MSX +58E8CB3D052D7025F765F395F70C9F88 Turbo Pack C - Tratamiento de Textos (1987)(Philips)[RUN'CAS-'] MSX +1B01B76046C405E6F548F8428226A21B Turbo Pack C - Treppy (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +25DDB97BBA340C617080B718423AE01B Word Pro v2.60 (1985)(Kuma Computers)(GB)[BLOAD'CAS-',R] MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Demos - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:55 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +30B15B29785352DDC78ABBBA5FE03CC9 Psychedelia (1984)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +1B01B76046C405E6F548F8428226A21B Turbo Pack C - Treppy (1987)(Philips)(ES)[RUN'CAS-'] MSX ES +81036EFBD35C323146A1B07DDD9EE192 Typing Tutor (1985)(Sanyo)(JP)[CLOAD + RUN] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Educational - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:55 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +D04B169AF35843A7EE240198E02CAE3C H Aprendiendo ingles 2. Bernard goes to Mars (1985)(Sony Spain)(ES)(en)(Side B)[m playable Martos][HBS-IE206][RUN'CAS-'][Martos] MSX en ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +3ADB77F967345EFC24D67BFB5F0CDA3F Abeja Sabia 2, La (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +63A8897AADC73810176F7DCAF3911C51 Abeja Sabia 3, La (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +12DBA98E62C761CE2FBD5AAA81A0AA57 Alfamat (1985)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +65ED32F60A02A88610EE5545ADDBBBF1 Aprendiendo ingles 2. Bernard goes to Mars (1985)(Sony Spain)(ES)(en)(Side A)[HBS-IE206][RUN'CAS-'][Martos] MSX en ES +871728259B883D63CDCA99F3C9E76458 Aprendiendo ingles 2. Bernard goes to Mars (1985)(Sony Spain)(ES)(en)(Side B)[HBS-IE206][RUN'CAS-'][Martos] MSX en ES +4D70A23A8228915146AA11519E247265 Aritmo (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +367A74CF12B1762687CFAFFA0E34E4C5 Cometa Halley (1985)(Sony)(ES)[CLOAD + RUN] MSX ES +FA701E194779C055A55E124A56359D80 Computadora Adivina (1985)(Sony)(ES)[CLOAD + RUN] MSX ES +9CEA1EBDF247A45F6A31B4481E643CCA Cosmos (1985)(Sony)(ES)[BLOAD'CAS-',R] MSX ES +25B8376FDE03A34A550F6FC05AFE3076 Curso de BASIC (1985)(Sony)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +C72EB68A55DE8D06E541E99740934120 Curso de BASIC (1985)(Sony)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +48C27215F64DE9E46C7FF849B164C6ED Curso de MSX Basic Toshiba Home computer HX-10 (19xx)(EMSA)(ES)[CLOAD][Martos] MSX ES +F504112DEF59A38EE6E3A8329D198E56 Dieet (1986)(Philips)(nl)(Side A)[a][BLOAD'CAS-',R] MSX nl +8CA5AC14F0C53653C92E6BC6E9F50501 Dieet (1986)(Philips)(nl)(Side A)[BLOAD'CAS-',R] MSX nl +8E38087F74ECD56EADCC752D08F64846 Dieet (1986)(Philips)(nl)(Side B)[a][BLOAD'CAS-',R] MSX nl +40FBBBDE9BC19C4E64DC13318EDBC820 Dieet (1986)(Philips)(nl)(Side B)[BLOAD'CAS-',R] MSX nl +ED5BB674C1719865A335D6A9AC9C1940 En Ruta (1985)(Microgesa)(ES)[BLOAD'CAS-',R] MSX ES +B7707A4BCF2BD4C24E8A7635970FFD76 Fisica I - Magnitudes (1986)(Sony)(ES)[CLOAD + RUN] MSX ES +25A65C60E2AEF27C27D7330AD8F8D5F3 Fisica II - Movimientos (1986)(Sony)(ES)[CLOAD + RUN] MSX ES +4413CEEC4F240141D2BD807F936D73B6 French is Fun (1984)(CDS Microsystems)(GB)[CLOAD + RUN] MSX GB +90BF3D0F6E2EB32421C916D07A6F059E Geo - Figuras planas y volumenes (1997)(Mind Games Espana)(ES)[BLOAD'CAS-',R] MSX ES +15B73CA9D790B1C496D3B54B9534F2FE Geografia de Espana (1985)(Advance)(ES)[CLOAD + RUN] MSX ES +69DEFB2991146A89A40B2915C841C825 Gramatica I - Vocabulario (19xx)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +E6CB9E7E74B5786784EBFACBC8371E92 Gramatica II - Verbos (19xx)(Mind Games Espana)(ES)[a][CLOAD + RUN] MSX ES +9F991255044D48541FC6D3FBE3121A81 Gramatica II - Verbos (19xx)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +C034450BFDA77088400054B9C1C615B1 Gramatica III - Frases (19xx)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +37A2960A997125FE66AF9D84F38E76D3 IdeaType - Instructor Mecanografico (1985)(Idealogic)(ES)(Side A)[RUN'CAS-'] MSX ES +2DED295056C1A49BD1F1036CF03EB708 IdeaType - Instructor Mecanografico (1985)(Idealogic)(ES)(Side B)[RUN'CAS-'] MSX ES +03367E33E834FD402299DC8B405BE5EF Introduzione al Basic MSX Toshiba (19xx)(Leoni Informatica Milano)(IT)(it)[BLOAD'CAS-',R][Martos] MSX it IT +76424F3AB4E10078AB1621AF30442EBB Map Game (1985)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +9714808AE1BBBFFD396E760B75706516 Maths Invaders (1985)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +358F6B33F5D929FBD9A9B3822EB79EC8 Maths Invaders (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +4AE6D2BFFD8668EDE846DC5E4EB088EA Merlin (1987)(Mind Games Espana)(ES)[BLOAD'CAS-',R] MSX ES +337893E8C078839AEBBE3A2E99FCAD9A Mision en Espana (1986)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +298C4E466F894AE62B0CCD8CA520ADDD Mision Rescate (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +88D65CA5D04A7C1E6196095CCC62397C Motorista Sideral, El (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +7E4A6E76BAD3866D57528AD00EF69721 Musica en Juego II - Figuras (1986)(Sony)(ES)[CLOAD + RUN] MSX ES +F2A559AD64F9CA033B00A305C20FECAB Number Painter. Juego de los numeros, El (19xx)(Sony Spain)(ES)(en)[BLOAD'CAS-',R][HBS-IE209][Martos] MSX en ES +F0F4827644E182BA702295A11B841BD2 Paises de America (1984)(Sony)(ES)[RUN'CAS-'] MSX ES +C4AA9762959E38282AF27629F99D9B9F Paises de Asia (1984)(Sony)(ES)[RUN'CAS-'] MSX ES +E72A85192722F0B2A10E61A73FD19F73 Patagoras Software educativo - Reflexion de la luz - Espejos planos (1985)(Ediciones SM)(ES)[RUN'CAS-'][Martos] MSX ES +BC8CE43E5BE73478CB77C102F02F868E Payaso explorador 1, El (1986)(Sony Spain)(ES)[HBS-AN014][RUN'CAS-'][Martos] MSX ES +4A0DCFB513E533BDD09A1B5535D5D85E Payaso Explorador 2, El (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +7335DC8B632B5EC69764472CA0E7F9B8 Pescador Espacial, El (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +C107435E9CC438171A7F5FE861D26775 Principe y el Dragon, El (1985)(Advance)(ES)[BLOAD'CAS-',R] MSX ES +FCC5575F4B209A6F67FD1D492DD23442 Super Sapiens (1989)(PJ Soft)(ES)[RUN'CAS-'][Martos] MSX ES +7298E9936BD5FEDB9672AC287CB2886D Trivial Pursuit (1986)(Domark)(ES-GB)(Side A)[RUN'CAS-'] MSX ES-GB +4B6E5CDA14668B6F571882B3A354B614 Trivial Pursuit (1986)(Domark)(ES-GB)(Side B)[RUN'CAS-'] MSX ES-GB +81036EFBD35C323146A1B07DDD9EE192 Typing Tutor (1985)(Sanyo)(JP)[CLOAD + RUN] MSX JP +139E4917C0AD892C82E98FA7A67F49B0 Viaje por Europa (1986)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +274733D4FD4FBF642E40556094FA6139 Yo Calculo (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Games - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:55 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +D965E16E7DD96A7181F44F46E5DE5C21 B Chack 'n Pop (1984)(Taito)[b][BLOAD'CAS-',R] MSX +1B78EF2F4357D3E03455FA671F00D4D2 B Chase H.Q. (1988)(Ocean Software)(GB)(Side A)[b][RUN'CAS-'] MSX GB +0934A2300464A4920C9177A1A10AA8A8 B Choro Q (1984)(Taito)[b][RUN'CAS-'] MSX +1ED41D7DF62181AB46672F9445DA10B3 B Comando Tracer (1989)(Dinamic Software)(ES)[b][RUN'CAS-'] MSX ES +FD7F5C380D33A257447BE90D9E7E3045 B Flics, Les (1985)(PSS)(GB)[b][BLOAD'CAS-',R] MSX GB +1BE439603DFB54B604504D999BA1B396 B Ke Rulen los Petas (1989)(Iber Soft)(ES)[b][BLOAD'CAS-',R] MSX ES +E521E87F8CAE1E033F20D746BEEE9EB9 B Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB)[b][BLOAD'CAS-',R] MSX GB +327247682E6DA37045110C01ADA09B08 B North & South (1991)(Infogrames)(FR)(M3)(Side B)[b][RUN'CAS-'] MSX M3 FR +919051C7C460A4E18693E8608F67ECE0 B Saint Dragon (1990)(Dro Soft)(ES)(Side B)[b][RUN'CAS-'] MSX ES +8E6C8CB56CE26B82BCD3DB19DBC76970 B Skate Dragon (1986)(Idealogic)(ES)[b][BLOAD'CAS-',R] MSX ES +F757A853B3555F6976E93BB6729E9FA5 B Space Shuttle - A Journey into Space (1986)(Activision)(US)[b][BLOAD'CAS-',R] MSX US +EBE05E64FB4B0149058D2F9033982794 B Star Runner (1986)(Manhattan Transfer)(ES)[b][RUN'CAS-'] MSX ES +FECDB512EDD11417B62C68A0E29BC24A B Xyxolog. Xyzolog (1985)(Electric Software)(GB)[b][BLOAD'CAS-',R] MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +E16D99F7F58765A4DE0A2EA465023C1C H Afterburner (1988)(Activision)(US)(Side A)[m playable Martos][BLOAD'CAS-',R][Martos] MSX US +68A958512366266CAC89B79DA3C26F9A H Chessmaster 2000, The (1990)(Dro Soft)(ES)[m playable Martos][RUN'CAS-'][Martos] MSX ES +6614434082916EE9F55EBB0DFBDD45C0 H Elite (1987)(Firebird Software)(GB)(GB)[m playable Martos][BLOAD'CAS-',R][Martos] MSX GB +22BEBEFD773D264A083133E19B149E93 H Footballer of the Year (1987)(Gremlin Graphics Software)(GB)[m playableMartos][BLOAD'CAS-',R][Martos] MSX GB +A30986D309D0AD57AAB401204FA7DCCD H Gyro Adventure (1984)(Nippon Columbia - Colpax - Universal)(JP)[m playable Martos][BLOAD'CAS-',R][Martos] MSX JP +3CBF467FFCD22F957591A1A4238876E6 H Jai Alai (1991)(Opera Soft)(ES)[m code-protection Martos][BLOAD'CAS-',R][Martos] MSX ES +A384F230FF956C484492BFF3C8BFF912 H Jet Set Willy (1984)(Software Projects)(GB)(en)[m code-protection Martos][RUN'CAS-'][Martos] MSX en GB +5BBC469D0C53AC82B0F4727A93BB61D4 H Poli Diaz (1990)(Opera Soft)(ES)[m code-protection Martos][BLOAD'CAS-',R][Martos] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +1DDFFACB42F2A2F7C4EFDAB80A7E586A 007 - A View to a Kill (1986)(Domark)(GB)[a][RUN'CAS-'] MSX GB +5E65BB56200873403B6948B9D8CD5C0D 007 - A View to a Kill (1986)(Domark)(GB)[RUN'CAS-'] MSX GB +611B09F2E2B74161C04FB3884795C611 007 - Licence to Kill (1989)(Domark)(GB)[RUN'CAS-'] MSX GB +E41CE3187F8F2812314DFE165A31FFFA 007 - The Living Daylights (1987)(Domark)(GB)[RUN'CAS-'] MSX GB +AF66F0D370C305E97A0B51A6E44C835D 007 - The Living Daylights (1987)(Domark)(GB)[RUN'CAS-'][Martos] MSX GB +42A30CC8C5A36B9C95B66BA32B2B5FB8 10th Frame (1986)(US Gold)(GB)[RUN'CAS-'] MSX GB +8C235BC8C3B279F5F2E00CE348312EC2 180 (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +B84BE469BEDAC58818728369002EACDA 3D Golf Simulation - High Speed Edition (1984)(T&E Soft)(JP)[CLOAD + RUN] MSX JP +4DA8C0816191BD7D57AAC28ACAD34104 3D Pool. Maltese Joe's Pool Challenge (1989)(Firebird Software)(GB)[BLOAD'CAS-',R][Martos] MSX GB +7F48AD67E56BA16A698FDC7480126084 4x4 Off-Road Racing (1988)(US Gold)(GB)(Side A)[a][BLOAD'CAS-',R] MSX GB +88DC8450681275DE73E23ACFB054E40D 4x4 Off-Road Racing (1988)(US Gold)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +241EDFF03A46058BCC1E28ADEB94C414 4x4 Off-Road Racing (1988)(US Gold)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +795F69FFB2D78D1BB3D7787FCEDADD80 7 Card Stud (1986)(Martech Games)(GB)[a][RUN'CAS-'] MSX GB +9A36DDA186C848C180B864F04F9ABFBB 7 Card Stud (1986)(Martech Games)(GB)[RUN'CAS-'] MSX GB +C8441384BA97FCA25DB5376966BDF6FB 737 Flight Simulator (1984)(Mirrorsoft)(GB)[a][BLOAD'CAS-',R] MSX GB +6291D7C3B58944F5F000F820081F0D9D 737 Flight Simulator (1984)(Mirrorsoft)(GB)[BLOAD'CAS-',R] MSX GB +A1EFC8EA4A0D6A35394815A5E03BF677 747 400b Flight Simulator (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +40A45EAA8B92EF2C73C6EDAE271839B2 Aaargh! (1989)(Dro Soft)(ES)[a][RUN'CAS-'] MSX ES +B5E72A56A78EAE4C05C9BE329F06C14A Aaargh! (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +CA4739BC81BAE32E20C58EF1E921CC73 Abadia del Crimen, La (1988)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +9EEFCB9ED53CAB10D35B0C04C8EE3826 Abracadabra (1988)(Proein Soft Line)(ES)(Side A)[RUN'CAS-'] MSX ES +3544A2625892972748B9226DD07B94F1 Abracadabra (1988)(Proein Soft Line)(ES)(Side B)[RUN'CAS-'] MSX ES +A7A70D6165E51813B174E49DBC9CC81B Abu Simbel Profanation (1986)(Dinamic Software)(ES)[a][BLOAD'CAS-',R] MSX ES +0F3DB96E55B1F341A8AE07A2EB82A53D Abu Simbel Profanation (1986)(Dinamic Software)(ES)[a2][BLOAD'CAS-',R] MSX ES +7996BF88E5C35010AF186A419B8720CC Abu Simbel Profanation (1986)(Dinamic Software)(ES)[BLOAD'CAS-',R] MSX ES +2E11F6C04809A3D964FF56563A2AA7E4 Abu Simbel Profanation (1986)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +C701BAD1ACC58C985DC14A4D2162B635 Ace of Aces (1986)(US Gold)(GB)[RUN'CAS-'] MSX GB +B30C05EF1256E20EF6A05CB84713FB25 Addictaball (1988)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +AD2631DB448F599A4D115BE5C5F418A5 Adel (1986)(Mind Games Espana)(ES)[RUN'CAS-'] MSX ES +B9B74F482198D216E7D147A255DF028E African Trail Simulator (1990)(Positive)(ES)[RUN'CAS-'] MSX ES +BF5BDB05574A47F9AC4E5A984ECAC545 African Trail Simulator (1990)(Positive)(ES)[RUN'CAS-'][Martos] MSX ES +3275B36CE2074410A5961AE1E9A07E82 After the War (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +91C5C53495CE5673A05426700D5CAA96 After the War (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +9E456AF595D3CFEC7484ED5B0A577C88 Afterburner (1988)(Activision)(US)(Side A)[BLOAD'CAS-',R] MSX US +98D5A366D4F2890086333CD9CA2FC8EF Afterburner (1988)(Activision)(US)(Side B)[BLOAD'CAS-',R] MSX US +CFD2F664692A2AFE204E47E974D12D44 Afteroids (1988)(Zigurat Software)(ES)[a][RUN'CAS-'] MSX ES +4D5A200AE6EEEDB0BD5AD6D17BF2C390 Afteroids (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +B23261B52A9F5DB69FACEC2CABDBFCF3 Ale Hop! (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +636267990873E08C83706C190F506F8B Alien 8 (1985)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +2940AB03150AC317B8CC4C2F816290CD Alien Syndrome (1988)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +F1B5329B460CC640A05E7FE7F9CF7FBF Alien Syndrome (1988)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +D43B8D425B219186EB42BE0A15A4F551 Aliens (1987)(Mr. Micro)[BLOAD'CAS-',R] MSX +C6C65CB36E76AE2DB3AE6CA158AF3DA7 Alpha Blaster (1984)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +494438A0BBBBB2CD27C2580A3A1F7451 Alpha Blaster (1984)(Aackosoft)(NL)[a2][RUN'CAS-'][1st edition] MSX NL +05E5BF0404947A27E2DEC347FD034C9B Alpha Blaster (1984)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +F99AE62A4EBC6761D1AABF7F5C45E4E0 Alpha Blaster (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +821852F47E6ADE2AFA0C24C41330D963 Alpha Blaster (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +D3D611B7EA98357520E1338977ED036F Altered Beast (1988)(Activision)(US)(Side A)[RUN'CAS-'] MSX US +D933B99A18BFD8A913FEE2CAA50074CB Altered Beast (1988)(Activision)(US)(Side B)[RUN'CAS-'] MSX US +072A1ABBD02FBC20F513182653634EE8 Amaurote (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +90CE1E0E4BD6F04717051581AF2112E0 Amo del Mundo (1990)(Positive)(ES)[RUN'CAS-'][Martos] MSX ES +51340C13F1F017544E20B821470ECA2A Amoto's Puf (1988)(SPE)(ES)[RUN'CAS-'] MSX ES +E796D93A9D632F8752B041808A1BB0DA Ananas (1989)(Eurosoft)(NL)[aka Pine Applin][RUN'CAS-'] MSX NL +DB056A93976F7BFAC141AD8D26E39A8A Angel Nieto Pole 500cc (1990)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +4B9C3DBA95557A905855836AC46665EC Angleball (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +58C6515150FFA48D5F54C7A2CBF7681C Arctic Fox (1989)(Dro Soft)(ES)[RUN'CAS-'][Martos] MSX ES +5A47DB44670987BA76BA349A9B7D1F59 Arkanoid (1986)(Taito)[RUN'CAS-'] MSX +CF25BF635EC083279AD64D832C7D14BE Arkos I (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +7570CED8A78AEB00624668585C1E3288 Arkos II (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +651A129E2675ED4510AEC48283AFE4A2 Arkos III (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +99E6754894F946823D8432F9C466A2ED Army Moves (1987)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +9B54504BAE904BAA16E28703955DDC4D Army Moves (1987)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +B6AE82B683BA263BB6FFDC6106E26FFB Army Moves (1987)(Dinamic Software)(GB)(Side A)[RUN'CAS-'] MSX GB +3BECD6B86918EBDB775CCC1D3E1697F4 Army Moves (1987)(Dinamic Software)(GB)(Side B)[RUN'CAS-'] MSX GB +4929049048710B04D47E79D7A3F12EC0 Arquimedes XXI (1986)(Dinamic Software)(ES)[BLOAD'CAS-',R] MSX ES +2BB0A4502425B475346560D4AFDE2BBA Arquimedes XXI (1986)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +5268543824B05BCF26BAB42F15D607F4 Aspar GP Master (1988)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +2AED3BA7732087A2DA9AB08C04775090 Aspar GP Master (1988)(Dinamic Software)(ES)[a2][RUN'CAS-'] MSX ES +C79F301390128D1321B4A02D5C7688D1 Aspar GP Master (1988)(Dinamic Software)(ES)[a3][RUN'CAS-'][Martos] MSX ES +558DD7BCE4D452259DCEE3347F7157AF Aspar GP Master (1988)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +07F44556143BAD38C18188395528CAC3 Aspar GP Master (1989)(Dinamic Software)(ES)(en)[English edition][RUN'CAS-'] MSX en ES +9EB0A1D04DD1E922A58CE658EFAB49FD Astro Blaster (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +5F252494843807E18CCECED1CB5AE9A7 Astro Blaster (1988)(Eurosoft)(NL)[a2][RUN'CAS-'] MSX NL +3A45A034D30410B4A063835ADD2FA464 Astro Blaster (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +513D8A5F60D3E4370C5F1988D66916E0 Astro Marine Corps (1989)(Dinamic Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +5DBBF6E33B8C0DF2919F69F5AD677644 Astro Marine Corps (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +00D91A4CA022CB8A68B4DB8F38F0DBF8 Astro Marine Corps (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +8A6B0D8FC63A4DE727AC221DB64AE772 Astro Plumber (1986)(Blue Ribbon Software)(GB)[RUN'CAS-'][Martos] MSX GB +012B53996CC59C4712B0C77B4CA3F51E A-Team, The (1988)(Zafiro Software Division)(ES)(Side A)[RUN'CAS-'][Martos] MSX ES +F9C6209DCBEE5A62002F91374C314052 A-Team, The (1988)(Zafiro Software Division)(ES)(Side B)[RUN'CAS-'][Martos] MSX ES +CDD505DCBC8CC0CDEA35C6B8E5F169FF Attacked (19xx)(Tynesoft)(GB)[RUN'CAS-'] MSX GB +9D9E94BCFFC13F6084184C06A18232A6 Auf Wiedersehen Monty (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +B7F89EE626845D75B5A1DEB399B2E994 Avenger (1986)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +E78E867B686B5EA9138C99928822ECD5 Avenger (1986)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +A78BFF2A2783D38C9852E98AFE1BD9BC Aventura Espacial, La (1990)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +283BFF0FDEDE8378D5CDAFB43F60E047 Aventura Espacial, La (1990)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +AD526FC195AD4A4117F8D59664FB29CF Aventura Original, La (1989)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +76B32E0F8BBF786829927C39340A4697 Aventura Original, La (1989)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +4454449063E47CD410E5145BDBE11D02 Averno (1989)(Proein Soft Line)(ES)[RUN'CAS-'] MSX ES +059972D2DEAB51B7A3798E3E582A4273 B.C.'s Quest for Tires II - Grog's Revenge (1985)(US Gold)(GB)[a][RUN'CAS-'] MSX GB +E3839A955A71D2D9E9B3F2E776DB9869 B.C.'s Quest for Tires II - Grog's Revenge (1985)(US Gold)(GB)[RUN'CAS-'] MSX GB +4209E8DA6D20DDD2F7151ED3805F568D B.C.'s Quest for Tires II - Grog's Revenge (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +837AE00B66C8E04F7F3B1CD270197E48 Backgammon (1984)(Electric Software)(GB)[BLOAD'CAS-',R][Martos] MSX GB +D374EF690D3098011446F96FB47BA2C5 Barbarian (1988)(Mastertronic)(ES-GB)[RUN'CAS-'] MSX ES-GB +237C30CFB6B69E7E7B0655AECC40D698 Barbarian II - The Dungeon of Drax (1988)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +C55445E4A5E8EA51302E46FD8291EBF2 Barn Stormer (1985)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +9B625CC7B26497FAF39FC716BD982B23 Batman - The Movie (1989)(Ocean Software)(GB)(Side A)[RUN'CAS-'] MSX GB +725324D5516BFB652CDF0EB49F2756ED Batman - The Movie (1989)(Ocean Software)(GB)(Side B)[RUN'CAS-'] MSX GB +D8944D8A9840AD5ED8274284D64FBB26 Batman (1986)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +CD37243F784A8E4CC926D5104DDC739D Batman (1986)(Ocean Software)(GB)[a][RUN'CAS-'] MSX GB +E5217111C407CFBADB26FAB0122F545F Batman (1986)(Ocean Software)(GB)[RUN'CAS-'] MSX GB +2C8736E01FEE8F9237A1D2AAC66A883E Battaglia delle Ardenne, La (19xx)(Philips Italy)(IT)[RUN'CAS-'][Martos] MSX IT +7E5B1A1A48F7621E525DC948E0C45AD4 Battle Chopper (1985)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +47FD74F689C6741C53602A5BAB8B313B Battle Ship Clapton II (1984)(Toshiba)(JP)(en)[BLOAD'CAS-',R][Martos] MSX en JP +419E47D0B6D1BC8D9A5ECEF0C9EE893D Beach-Head (1985)(US Gold)(GB)[RUN'CAS-'] MSX GB +F3901A764C9D0B1ABE750251A7EC0974 Beamrider (1984)(Activision)(US)[BLOAD'CAS-',R] MSX US +B79F687F43FEDFE22C8D2A558C8E20E7 Bestial Warrior (1989)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +B4D6FA67780339497EEB7532DA912448 Bestial Warrior (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +B335DF5019D412B680B67F4A243FC0AD Bit Byter (19xx)(Spectravideo)(GB)[CLOAD + RUN] MSX GB +474040A53B1AE4DB5552C89357AD89FA Black Bass, The (1986)(Hot-B)(JP)[RUN'CAS-'] MSX JP +9F4D9834930808C29F18AB6A55025210 Blackbeard (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +8B29433F0D348373FE2CBDC0B8459690 Blackjack (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +D9DA9D5F803EE7A0E25B2A82CB8588FB Blagger (1984)(Alligata Software)(GB)[RUN'CAS-'][Martos] MSX GB +3ABC6C820A59CC5CCFF314976F8566D9 Blasteroids (1987)(Image Works)[BLOAD'CAS-',R] MSX +C441B596CF6431AF677DCEBFF812B496 Bloody (1987)(P.J. Software)(ES)[RUN'CAS-'] MSX ES +25790AF4A3D8CBC1068098B54A00A2D8 Blow Up (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +644719D416E8B8D1ECFEBAABB84C0223 Blow Up (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +E56D3C19D0B6ADC4C7252F62082B62A2 BMX Simulator (1987)(Codemasters)(GB)[RUN'CAS-'] MSX GB +5ED18D0099038344450FA0F53A070ADC Boardello (1985)(Bubble Bus Software)(GB)[a][RUN'CAS-'] MSX GB +1567CBC9049D28E318757A7CC90981DF Boardello (1985)(Bubble Bus Software)(GB)[RUN'CAS-'] MSX GB +E51A008B15B505B45A16FEFA02C0D9CC Booga-Boo the Flea (1986)(Quicksilva)(GB)[a][BLOAD'CAS-',R] MSX GB +395E7D0B529F1ECC65EF0125B02294ED Booga-Boo the Flea (1986)(Quicksilva)(GB)[BLOAD'CAS-',R] MSX GB +7B3509F88FF5843F01E430F81D00E70F Boom (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +87160083B997A701424F11D648F9592E Boom (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +0F8F79B32914BD8BF34C9ACA29DD1B49 Booty (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +20A3E5FD3E823A4E70BB1E4203843F0C Bop! (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +F544059206DE138213F8FE92E05763AB Bouken Roman - Dota (1986)(Eaglesoft)(NL)[RUN'CAS-'][Martos] MSX NL +5E0C5210479F4EBA10B70422AE5C3C6A Boulder Dash (1985)(Databyte)[a][RUN'CAS-'] MSX +4FCCC4DCD42DC4FD6309191846C1FC96 Boulder Dash (1985)(Databyte)[RUN'CAS-'] MSX +18AC089603F204FE36EA5FBD8BD39A18 Boulder Dash II - Rockford's Riot (1986)(Databyte)[a][RUN'CAS-'] MSX +EE6ADD4FACA245E96E61E3E092072F65 Boulder Dash II - Rockford's Riot (1986)(Databyte)[RUN'CAS-'] MSX +E138416EF23DBEFA742A99E3D6D144D7 Bounce (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +C5ED7FB662CA1B59FA7864950DF648B3 Bounder (1987)(Gremlin Graphics Software)(GB)[a][BLOAD'CAS-',R] MSX GB +FD5889C2F175517C4E6090482D1A9737 Bounder (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +6421F16D057955D370349EC18FDC1A4E Break In (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +73E3BE66690A8BB60FA0628F83BE2339 Break In (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +00D1D5F502C92B0FD6F3E2659AB36242 Break Out! (1985)(Toshiba-EMI)(JP)[a][needs 64k in slot 2][RUN'CAS-'] MSX JP +74D8CD8A63A9499D0E3759E7020641BA Break Out! (1985)(Toshiba-EMI)(JP)[a2][needs 64k in slot 2][RUN'CAS-'] MSX JP +60DDA1E3DE562BADC08DF4A6477BA80A Break Out! (1985)(Toshiba-EMI)(JP)[needs 64k in slot 2][RUN'CAS-'] MSX JP +875F0BA503529038563D5931BAFC9D1E Breaker Breaker (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +D602418F9CDB5FF806BE7151A79E413B Breaker Breaker (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +B30A3D5C5AFECE6A32E9D15B2184861F Brian Jacks Superstar Challenge (1985)(Martech Games)(GB)(Side A)[a][RUN'CAS-'] MSX GB +2CF6C2E45CEDC51ED110681999C9D8E6 Brian Jacks Superstar Challenge (1985)(Martech Games)(GB)(Side A)[RUN'CAS-'] MSX GB +65AA44651ECAAAB51BBE8B4049360DD0 Brian Jacks Superstar Challenge (1985)(Martech Games)(GB)(Side B)[RUN'CAS-'] MSX GB +EAEAF8BD9536B8B5CE03A488A044B07D Bronx (1989)(Animagic)(ES)[RUN'CAS-'] MSX ES +9A857C47193186A4CA1D9F1C0F2010DC Bruce Lee (1985)(Comptiq)(JP)[RUN'CAS-'] MSX JP +64F277D267D0BF29AC8E8525322161EE Bubbler (1987)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +C6601D6D7C3966E6E7B206B8882522B6 Buck Rogers - Planet of Zoom (1983)(Sega)(JP)[BLOAD'CAS-',R] MSX JP +FBC2CFA864C6B8C708CE4A9B5CC2ED71 Budokan (1991)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +FD5C7E84ADEF1C3EE0FC403BFA7B8D78 Budokan (1991)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +9F4D7ABE7DFD6267CBF7F53DFABCDB00 Budokan (1991)(Dro Soft)(ES)(Side C)[RUN'CAS-'] MSX ES +513DD07D1DDAEFEB00F4F3A8B390181F Budokan (1991)(Dro Soft)(ES)(Side D)[RUN'CAS-'] MSX ES +78CD3140A3AAF9866629DAC01786830E Buggy Ranger (1990)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +D80EFD7CBEA10711B16058898EC78EE9 Bumpy (1989)(Loriciels)(FR)[a][RUN'CAS-'] MSX FR +BBDF07CEBF2800FF5E5331CC0AC0868B Bumpy (1989)(Loriciels)(FR)[RUN'CAS-'] MSX FR +2734EABE47A5155C94142CEBFA71AC2B Buran (1990)(OMK Software)(ES)[RUN'CAS-'][Martos] MSX ES +C187BDB68BCB6CB55D5AC692360FF6C8 Buster Block (1985)(Kuma Computers)(GB)[RUN'CAS-'] MSX GB +38A53352A78EAF391E983976507554AC Buzz Off! (1984)(Electric Software)(GB)[a][RUN'CAS-'] MSX GB +C2CCC08E432DAA4E653617EEC9BA553A Buzz Off! (1984)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +6A2DEC55B2285FAADA95D9F794EA6188 Buzz Off! (1984)(Electric Software)(GB)[RUN'CAS-'] MSX GB +17A8A59E0D15EA0393981C706382FF3C Bytebusters (1984)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +C3ED4BADF7729914CB0AB76CD47ED776 California Games (1987)(US Gold)(GB)(Side A)[RUN'CAS-'] MSX GB +B720D1D38426617F5CE265F03E5BFD00 California Games (1987)(US Gold)(GB)(Side B)[RUN'CAS-'] MSX GB +0B8C70D290FDCBC75AEA03D095940BFE Camelot Warriors (1986)(Dinamic Software)(ES)[a][BLOAD'CAS-',R] MSX ES +4F5527B156D9C6397C96FC2CF92276A7 Camelot Warriors (1986)(Dinamic Software)(ES)[BLOAD'CAS-',R] MSX ES +6DB403B2B795E1980ACF486004E8FDC8 Camelot Warriors (1986)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +F0D40B6C753C082828CB56CD0078BA67 Can of Worms (1986)(Livewire Software)(GB)[RUN'CAS-'] MSX GB +4E314D2875EFBEF5058FAFB0BAD4F776 Capitan Sevilla (1988)(Dinamic Software)(ES)(en)(Side A)[English edition][RUN'CAS-'] MSX en ES +67B26982BF5DA8ECC0F051336013D256 Capitan Sevilla (1988)(Dinamic Software)(ES)(en)(Side B)[English Edition][RUN'CAS-'] MSX en ES +62223584A601B0F324B6E7557F97A389 Capitan Sevilla (1988)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +55018F7764466EE602DBE2D56DC238F2 Capitan Sevilla (1988)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +D59BC756E21FAF54F00E6F76C7458ED4 Capitan Trueno (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +7D22081DE457E2A27F938F846DD2FCEC Capitan Trueno (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +6688B303B10DAC70FA56AF6DA3684821 Carlos Sainz (1990)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +A3BB2F8A79E7396891619DC8FE9A836D Casanova (1989)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +3BD21227D7CEBA401452EA7552AE6D4E Castle Combat (1985)(Spectravideo)(GB)[BLOAD'CAS-',R] MSX GB +57E92EED1B337462801DBFECA307A844 Cavern of Death (1987)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +A73E35B945A8AF84A4A0519B2E550C66 Chack 'n Pop (1984)(Taito)[b2][BLOAD'CAS-',R] MSX +474F87B75CA202CDA60D7B41208C59F4 Chack 'n Pop (1984)(Taito)[BLOAD'CAS-',R] MSX +A0880376A7E7196EA423EC13121B125D Champ (1984)(PSS)(GB)[BLOAD'CAS-',R] MSX GB +3B609A12B54BB3C0A1F5F8A4F799C392 Champions Grand National (1984)(Pony Canyon)(JP)[CLOAD + RUN] MSX JP +46C633B95AEC432905A1271E2C006567 Chase H.Q. (1988)(Ocean Software)(GB)(Side A)[RUN'CAS-'] MSX GB +4412C57CADDA5D83F654CCFCA042207E Chase H.Q. (1988)(Ocean Software)(GB)(Side B)[RUN'CAS-'] MSX GB +C33D85649C6119B30AA8409F4CE54D1D Checkmate! First Moves in Chess (1985)(Toshiba-EMI)(JP)[a][needs 64k in slot 2][RUN'CAS-'] MSX JP +4FBC7F3A5B778AFCEE079DDEB4EA950B Checkmate! First Moves in Chess (1985)(Toshiba-EMI)(JP)[a2][needs 64k in slot 2][RUN'CAS-'] MSX JP +5AD8028D4CE0B0E2E89AD5C4A256DF9D Checkmate! First Moves in Chess (1985)(Toshiba-EMI)(JP)[needs 64k in slot 2][RUN'CAS-'] MSX JP +C1682B221E97E543BC4F3E51FED1DF66 Chess Player (1988)(Eurosoft)(NL)(en)[Jaque Mate][RUN'CAS-'][Martos] MSX en NL +E72CE9D1CC60B1C41FCC1CC6F4B182AD Chicago 30's (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +3E9B28B19445A30C25DAEAD8CC222270 Chicken Chase (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +AC9012A33096D3D59A11EA8B7B8F7C33 Chiller (1985)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +1DEAA5FC01F745876D506BDB2BFDA178 Chiller (1985)(Mastertronic)(GB)[a2][RUN'CAS-'] MSX GB +2AD769A761D75C59E7E27ECB6F7A18CB Chiller (1985)(Mastertronic)(GB)[a3][RUN'CAS-'] MSX GB +6A435BB6074061E3037F4EE77D3A5B9F Chiller (1985)(Mastertronic)(GB)[a4][RUN'CAS-'] MSX GB +02ED5E3EE0E7A93EA316AC9A2E6CB583 Chiller (1985)(Mastertronic)(GB)[a5][RUN'CAS-'] MSX GB +BFBC865C2A3FCA8E54D3A84DA7060531 Chiller (1985)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +EC9F78708273A4458A7C499427E9714E Chopper (1986)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +A6A0EB8380CDC9BE6BD694E11B92B02F Chopper (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +6D2EDF1106A5F8706414262C1848909E Chopper One (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +F8C626E23183C909544E58BCDFFDDF24 Choro Q (1984)(Taito)[b2][RUN'CAS-'] MSX +EDE99BA4AFB9A3FA60F86F46209F4CA7 Choro Q (1984)(Taito)[RUN'CAS-'] MSX +68E246FAEFFA4F1B6A60BF990E8E604F Choy-Lee-Fut Kung-Fu Warrior (1990)(Positive)(ES)[a][RUN'CAS-'][Martos] MSX ES +D98F9F1D7A543064CDD2037C778C726B Choy-Lee-Fut Kung-Fu Warrior (1990)(Positive)(ES)[RUN'CAS-'] MSX ES +7D7AA03721545A96FD7872EB1A03E233 Chuck Yeager's Advanced Flight Trainer (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +5F2CCCCC7A94782819F986CF3AF1B5BD Chuckie Egg (1984)(A & F Software)[a][BLOAD'CAS-',R] MSX +54425A47F48EEBDDD3816799DFCB7D9B Chuckie Egg (1984)(A & F Software)[a2][BLOAD'CAS-',R] MSX +EC40501AAA612D7CDF9CAC5A70C52976 Chuckie Egg (1984)(A & F Software)[a3][BLOAD'CAS-',R] MSX +2E6CD21E65ED30E3E89D06E640C94A2D Chuckie Egg (1984)(A & F Software)[BLOAD'CAS-',R] MSX +8E41C654C9D72456A21502B80BB03F34 Chuckie Egg (1985)(Aackosoft)(NL)[BLOAD'CAS-',R] MSX NL +60C7D1CBF2E430771E063C4A58DE58C2 Cid, El (1987)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +EDDFF1BBE3702941076CB9AE62A7BA1E City Connection (1986)(Jaleco)(JP)[RUN'CAS-'] MSX JP +57AE2B6B2B927D8BF46C69F7EA9EB14E City Connection (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +EF153F6F7DC3D5CAFCF2D9B2E47D4321 Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)(Side A)[a][RUN'CAS-'] MSX ES +D2B760A5D899B6C3697FAD620A18C3CF Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +C441D81E3640429D0939A25D8D3F2CDA Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)(Side B)[a][RUN'CAS-'] MSX ES +D444D7DA20C837DB56CED0572690CCAB Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +9DD31E0867B1E1B59392574AE593257A Ci-U-Than Trilogy II - Los Templos Sagrados (1991)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +2ACDF9625654AC2029682BBDA51D4A05 Ci-U-Than Trilogy II - Los Templos Sagrados (1991)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +1751D5E5C4D574B3BAEC6C5EC5095041 Ci-U-Than Trilogy III - Chichen Itza (1992)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +301EC4D1391186BBE93B874EE0C67F90 Ci-U-Than Trilogy III - Chichen Itza (1992)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +FD5073CD5AD1357C1318F107F3CCBD76 Cobra's Arc (1986)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +9B07AA899133FBAEEE5EEA2D900E5AB5 Coco in the Castle (1984)(Kuma Computers)(GB)[CLOAD][Martos] MSX GB +ADBE0F65C7D9E291187D54AE4780E846 Coliseum (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +29641CFC88FD389F7B55A5414AFBC442 Colony (1987)(Bulldog)(GB)[RUN'CAS-'] MSX GB +8E0FD0341F6DC8ED1D4E5659FE7B54C0 Colossus 4 Chess (1986)(CDS Microsystems)(GB)[BLOAD'CAS-',R] MSX GB +2124DDA17C2140D05B2CD4AD4B65B53E Colt 36 (1987)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +C68129EEDBA4EEDAE9ACFBF7E0E64F58 Comando Quatro (1989)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +73FCACFFAA59D7500CB5A48B730EFBCC Comando Tracer (1989)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +FA7ABD8F4D2BC56B5AE67999B4AA2637 Comando Tracer (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +9F4EF038F9770306304107C5479A90C2 Comecocos (19xx)(Idealogic)(ES)[RUN'CAS-'] MSX ES +08CD855DDBB22A1B3AEA79279A58A27F Compra y Vende (1985)(Idealogic)(ES)[RUN'CAS-'] MSX ES +D593B9C608EAB328CFBC20BC671D73FA Confused (1986)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +755F5502E3059015FCFF0A612499C5E1 Confused (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +6F2B44F1B1B875DA966A80462573C6D5 Congo (1986)(Livewire Software)(GB)[RUN'CAS-'] MSX GB +43E1E931DF97B5ADC0B04E09ADD0F076 Congo Bongo (1983)(Sega)(JP)[BLOAD'CAS-',R] MSX JP +4B292EF689C1CD8944CFB91453F74984 Continental Circus (1989)(Virgin Mastertronic)(GB)(Side A)[RUN'CAS-'] MSX GB +BCB6C5350CFCD10284BCC1FD56B52383 Continental Circus (1989)(Virgin Mastertronic)(GB)(Side B)[RUN'CAS-'] MSX GB +43904AAFEBABBCB3506C0CEBE215DA76 Contract Bridge (1984)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +3D4824A5888A3130F6628FB119983FEB Corsarios (1989)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +B1DB2CBE003CF6B8F64561B160E33366 Corsarios (1989)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +1695C963D243F65993C8FDEE3951CB1D Cosa Nostra (1986)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +962008CD9BC4360261C56C4A85B0FAFD Cosmic Sheriff (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +3DA3F5153C4CAF2D71E0BAC878778A3D Cosmic Shock Absorber (1986)(Martech Games)(GB)[RUN'CAS-'] MSX GB +42B2EEB1C46778016C9761CCB0B83C83 Crazy Golf (1984)(Mr. Micro)[BLOAD'CAS-',R] MSX +73C524DD5AAC09E17249FD1A729A21A0 Crusader (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +CF0833856992EFD572C3E26962694034 Crusader (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +4A877BDD16015188589D9D4930A94ABA Cubit (1986)(Mr. Micro)[a][BLOAD'CAS-',R] MSX +148E41DFEA6FB15E5F4E5A42D6136322 Cubit (1986)(Mr. Micro)[BLOAD'CAS-',R] MSX +78164BCD717457985C88E74B2642EF03 Curro Jimenez (1989)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +4B0E0A7C74FDC7BA2F772D1D29037C5F Cyberbig (1989)(Animagic)(ES)[RUN'CAS-'] MSX ES +4AD259EB7987EDDF5580FC59792F9F7D Cyberun (1985)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +CEB9037A39E22891F5A73A69355BD1A2 Daidasso. Great Escape (1985)(Carry Lab)(JP)[BLOAD'CAS-',R] MSX JP +5A8E879CE3C2F12EE5C2C5D481B3F3A4 Dam Busters, The (1985)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +F9CB122E00579F6B1EDA4D8F3A6BEA0D Damas (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +224F54F7AF4298C3C53ADB2CFA84E6AF Danger Mouse in The Black Forest Chateau (1986)(Alternative Software)(GB)(Side A)[CLOAD][Martos] MSX GB +1E63014C715C6F83F8EE73CD5B025D3B Danger Mouse in The Black Forest Chateau (1986)(Alternative Software)(GB)(Side B)[CLOAD][Martos] MSX GB +2D3F1CF744AD47080851AB2F432D7BE5 Darkwood Manor (19xx)(Kuma Computers)(GB)[a][CLOAD + RUN] MSX GB +E95C107C5E2A82119959CB3124544490 Darkwood Manor (19xx)(Kuma Computers)(GB)[CLOAD + RUN] MSX GB +6C6C3FEE33390F8AE11715A4E28E42CE Darts (1987)(Blue Ribbon Software)(GB)[RUN'CAS-'][Martos] MSX GB +DAE10EABC7BD4B63816700605608C00D Dawn Patrol (1987)(Eaglesoft)(NL)[RUN'CAS-'][Martos] MSX NL +1195970C8DC95D4F70C7AC554D336C52 Death Valley Gold Rush (1985)(Kuma Computers)(GB)[CLOAD + RUN] MSX GB +EAAF35E7BF3A3846CBB6C05680C419E7 Death Wish 3 (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +F090BD790CDFC25DEBBFB5C8EDB4A359 Decathlon (1984)(Activision)(US)[BLOAD'CAS-',R] MSX US +41ED57B82B70E559BC1F0A696938A07F Defcom 1 (1989)(Iber Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +98D0867DF8B871CF19D23789619DD45D Defcom 1 (1989)(Iber Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +B11241914162C458BF658804C861E590 Demonia (1986)(Microids)(GB)(fr)[RUN'CAS-'] MSX fr GB +A2F5F6530327543D169AFBBCB750D7A2 Desolator (1986)(Gremlin Graphics Software)(GB)[a][BLOAD'CAS-',R] MSX GB +CFA11EC04395882B24135D90658FAF1F Desolator (1986)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +CBD090F0AB46495C4F69CF9E373CBE83 Desperado (1987)(Topo Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +78C3D57286C639A024D9FE7311EF614A Desperado (1987)(Topo Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +32CA34711B8378594CD8BE6A36032A43 Desperado 2 (1991)(Topo Soft)(ES)[a][RUN'CAS-'] MSX ES +8EC69B78B81E5159E41B5E97C6CD9393 Desperado 2 (1991)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +F75941EE1EF46F94623266575C9AF414 Destroyer (1986)(Mind Games Espana)(ES)[RUN'CAS-'] MSX ES +C391DC356420590D0E7FE1AA9349263A Deus Ex Machina (1985)(Mind Games Espana)(ES)(Side A)[RUN'CAS-'] MSX ES +96CFDE6D1E7AFFED333D1F2E21CF6EA1 Deus Ex Machina (1985)(Mind Games Espana)(ES)(Side B)[RUN'CAS-'] MSX ES +900E5DD5954BACE7BDA7A6C1B21CCD74 Dezeni Land (1984)(Hudson Soft)(JP)(Side A)[position tape + BLOAD'CAS-',R] MSX JP +990E0BFE8D227F08F086329A997A2A12 Dezeni Land (1984)(Hudson Soft)(JP)(Side B)[position tape + BLOAD'CAS-',R] MSX JP +E2E40A6B998D86F99D36D50CD8B70765 Dezeni Land (1984)(Hudson Soft)(JP)(Side C)[position tape + BLOAD'CAS-',R] MSX JP +85BC3ABDB41DCAFBC635238360C2CE54 Dig Dug (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +224F2D0A07096F99B9297E137D477DEC Dimension Omega (1989)(Positive)(ES)(Side A)[RUN'CAS-'][Martos] MSX ES +138C95866BDA89BE3703A657B643849A Dimension Omega (1989)(Positive)(ES)(Side B)[RUN'CAS-'][Martos] MSX ES +3418E6904D7253BC710AF187A682BCE4 Disc Warrior (1984)(Alligata Software)(GB)[a][RUN'CAS-'] MSX GB +3900723172F6D3C257E01F0F54CAD6EF Disc Warrior (1984)(Alligata Software)(GB)[CLOAD + RUN] MSX GB +47665A5BC258E17F845CBDAA58CE41C8 Disc Warrior (1984)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +AE5322E0225FCB679F67FD94D2D61240 Discovery (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +A8F445FECF15499EAA5F250671738FCC Discovery (1988)(Eurosoft)(NL)[a2][RUN'CAS-'] MSX NL +10FFB35C0C183F70ABA39EBEA2F32C06 Discovery (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +91AA17304A63361602579A621C30689F Dizzy Balloon (1985)(Pony Canyon)(JP)[RUN'CAS-'] MSX JP +33D8594ABF53788B0BA636B0FDD2169C Dizzy Dice (1988)(Players Software)(GB)[RUN'CAS-'] MSX GB +755C4C7B35A84329856F0BE2848AE19E Dog Fighter (1986)(Kuma Computers)(GB)[BLOAD'CAS-',R] MSX GB +0440F436AD8C0C591E1C44F85880EDE7 Dog Fighter (1986)(Sony)(JP)[HBJ-G020T][BLOAD'CAS-',R] MSX JP +E29C52C5373F6C22DED8E26DF1A46582 Domino (1985)(DIMensionNEW)(ES)[a][RUN'CAS-'] MSX ES +E308AF7B542E6B0D15BCD23E47E8EEA4 Domino (1985)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +A477E22DAD36D826A9540DBC9005B3B9 Don Quijote (1987)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +D737EEBDED3FFBCF7283972F9F3490D0 Don Quijote (1987)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +42E9FF3ECF603CAD094F8021B6C63442 Donkey Kong (1986)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +876F9F75267ED1D24AAC53D5E886F797 Donkey Kong (1986)(Ocean Software)(GB)[a][RUN'CAS-'] MSX GB +5A03C1A2D22A64F14C88839CA0889D51 Donkey Kong (1986)(Ocean Software)(GB)[RUN'CAS-'] MSX GB +6B355F0E38486B6DA0593A7317F37177 Double Dragon (1988)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +7E489FAD2491CE305E36DD9C6DC7947F Double Dragon (1988)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +DDC6CE693533D3D1D4264C46E0E305F2 Double Dragon II - The Revenge (1990)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +2575C31FC82226C44554083FE14D80C1 Dr. Jackle and Mr. Wide (1987)(Bulldog)(GB)[a][RUN'CAS-'] MSX GB +10035E696776355A76F154077A13FD9C Dr. Jackle and Mr. Wide (1987)(Bulldog)(GB)[RUN'CAS-'] MSX GB +B1D348AF004F71A970781EBC2E84F5CB Dragon Ninja (1988)(Imagine Software)(GB)(Side A)[RUN'CAS-'] MSX GB +D186AF78F52F170D394F327DB112A582 Dragon Ninja (1988)(Imagine Software)(GB)(Side B)[RUN'CAS-'] MSX GB +46427BED1696D478B93A29260CE58067 Dragon Ninja (1988)(Imagine Software)(GB)[RUN'CAS-'] MSX GB +D9888E9217A192A24979DA11973DD87A Dragon Slayer (1985)(Square)(JP)[BLOAD'CAS-',R] MSX JP +06233124E3C537FE287FCA31B69BD932 Drazen Petrovic Basket (1989)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +DACF0355384CCFF83D3C38AE587AAFEF Driller Tanks (19xx)(Sony Spain)(ES)(en)[BLOAD'CAS-',R][HBS-I003][Martos] MSX en ES +0CB821DBFE4D751A17AFF548062A4F01 Drome (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +6F901096B17F36B5A99BDCE6F54A29E3 Drome (1987)(Eaglesoft)(NL)[a2][RUN'CAS-'] MSX NL +F7146982537A689099CB83AAD2FADB98 Drome (1987)(Eaglesoft)(NL)[a3][RUN'CAS-'] MSX NL +D1FEE2E820A742F6D64F42D422BB878D Drome (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +923E7A064048FB7702227DBA4D33EF91 Duck out (1989)(Dro Soft)(ES)[RUN'CAS-'][Martos] MSX ES +73D6CE7D39883292FA769A3FD50F3153 Dustin (1987)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +DA9810B6EDAB6BFED062616A578BBF12 Dynamite Dan (1986)(Mirrorsoft)(GB)[BLOAD'CAS-',R] MSX GB +FFC9A4DA7FB38C3445E04613660E9135 Eddie Kidd Jump Challenge (1985)(Martech Games)(GB)[a][RUN'CAS-'] MSX GB +580439F2E03C065D45A8270625E38EE4 Eddie Kidd Jump Challenge (1985)(Martech Games)(GB)[RUN'CAS-'] MSX GB +EAE9254F2ABB1D0230CD9424C1CD3FCF Elidon (1986)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +134037CDBEB7C20BD286FAA4FFFB8872 Elidon (1986)(Aackosoft)(NL)[a2][RUN'CAS-'] MSX NL +0836E3D936BB5F0D31AD1EF1F3395B12 Elidon (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +357038A57B31C7E51950A54258068AB4 Emilio Butragueno Futbol (1988)(Topo Soft - Ocean Software)(ES-GB)[RUN'CAS-'] MSX ES-GB +3242F96CC88DA3EC1BC341022AE45CCC Emilio Butragueno Futbol II (1989)(Erbe Software - Ocean Software)(ES-GB)(Side A)[RUN'CAS-'] MSX ES-GB +EFD09DAF5BAD87E13CA38CA04EEE8C02 Emilio Butragueno Futbol II (1989)(Erbe Software - Ocean Software)(ES-GB)(Side B)[RUN'CAS-'] MSX ES-GB +11C30DFF718F63E7427F785A83905072 Emilio Sanchez Vicario Grand Slam (1989)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +52AFDD284A941A5CC8D64540A352BCBA Enchanted (1989)(Positive)(ES)[RUN'CAS-'] MSX ES +BC31021F67EC6E4D957197953E7DED04 European Games (1987)(Tynesoft)(GB)(Side A)[a][RUN'CAS-'] MSX GB +3C19A93789965A70335914F09463160F European Games (1987)(Tynesoft)(GB)(Side A)[RUN'CAS-'] MSX GB +02A3A944A403EFD02F0E54EE2D258522 European Games (1987)(Tynesoft)(GB)(Side B)[RUN'CAS-'] MSX GB +62D5989751A96A1195ED4301C42EA4B2 European Games (1987)(Tynesoft)(GB)[RUN'CAS-'] MSX GB +BF9256E72B015E126460DCED7FCB918B Exerion (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +7A7C054BD55C5CFB614D0C52F87126FD Exerion II - Zorni (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +CE5B46D594FB1EA868EF4C04251BF984 Exploding Atoms (1985)(Sanyo)(JP)[a][CLOAD + RUN] MSX JP +D000A618E076D2C485FDE25614754DA5 Exploding Atoms (1985)(Sanyo)(JP)[a2][CLOAD + RUN] MSX JP +CB8AA24C62D59F30F80FAE0B68B6D526 Exploding Atoms (1985)(Sanyo)(JP)[CLOAD + RUN] MSX JP +BDE2318F64B240AA8761557BCDED659C Exterminator (1987)(Eaglesoft)(NL)(en)[RUN'CAS-'][Martos] MSX en NL +C0D2B3FBA0549FC7D23650A937D8B67C Fall Out (1984)(Policy)(JP)[CLOAD + RUN] MSX JP +F17FA9F99F3AE6551222DC94AD6B8BFC Fanky Punky (1987)(P.J. Software)(ES)[a][RUN'CAS-'] MSX ES +87293A9D7EB8EF353C5099B8AEA6A6C0 Fanky Punky (1987)(P.J. Software)(ES)[RUN'CAS-'] MSX ES +52FA870A5671D983895894E767D28D66 Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES)(en)[English edition][RUN'CAS-'] MSX en ES +231708F72EBB21E814F18903B0A8C86E Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +8BD0D626D9F7C515D836A4A1430EFF21 Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +5181C68E2CC282BDE8FB02A63C085F0B Fernando Martin Basket Master (1987)(Dinamic Software)(ES)[BLOAD'CAS-',R] MSX ES +F7F2AB130A16F82A34E3977860BAD8D1 Feud (1987)(Bulldog)(GB)[RUN'CAS-'] MSX GB +6F53235BD071CE5C571D511BD8F6DA9A Fharanx (1985)(Enix)(JP)(en-jp)[CLOAD][JPconfig][Martos] MSX en-jp JP +8A9A0E43F0C5789A08759CE3ED7DC9B9 Final Countdown (1988)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +A328E554A64206CF86DA6D9B5C8B2068 Finders Keepers (1986)(Mastertronic)(GB)[needs 64k in slot 2][RUN'CAS-'] MSX GB +A52C60FB67475C4AADAC74355A753254 Finders Keepers (1986)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +B93E8BB3530BD6617CC661AA8BD2B359 Fire Rescue (1984)(Kuma Computers)(GB)[a][BLOAD'CAS-',R][Martos] MSX GB +757F9F5FF6200CD518C45E7659C34023 Fire Rescue (1984)(Kuma Computers)(GB)[BLOAD'CAS-',R][Martos] MSX GB +F15AC6D5E3B26C821FE59055700FE263 Firehawk (1987)(Players Software)(GB)[a][RUN'CAS-'] MSX GB +554422D25A3E376FF6E02E658B6A3351 Firehawk (1987)(Players Software)(GB)[RUN'CAS-'] MSX GB +B0BD7B624039E3959999BA2B527C4C4D First Steps with the Mr. Men (1985)(Mirrorsoft)(GB)[RUN'CAS-'][Martos] MSX GB +6DF7384A352E4A425BAC00C247C6C454 Flash Gordon (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +BE52753F2F1701455EB0F0280A9A0D1C Flics, Les (1985)(PSS)(GB)[b2][BLOAD'CAS-',R] MSX GB +D4AB6689092E06A2EB57F2FBE215E092 Flight Deck II (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +0E503D0BCA714BFC2427E99D096A1A9B Flight Path 737 (1985)(Anirog Software)[BLOAD'CAS-',R] MSX +269DF05C8EEB8606D241E5C2C90CB64A Flintstones, The (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +8C2635AEE4F531372C35FD26F84E9173 Foot Volley (1986)(Players Software)(GB)[RUN'CAS-'] MSX GB +6BCAEEAB8D6A9DC2B7FC3B086406102F Football Manager - World Cup Edition (1990)(Addictive Games)(ES)[RUN'CAS-'] MSX ES +32E64EC2C3D8EAE5822F1B00404EEA29 Forbidden Fruit (1985)(Mind Games Espana)(ES)[CLOAD + RUN] MSX ES +CA45822A5AC6392257DEB2B8F6A99699 Formation Z (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +5818D885482C1F9B964CC15BF4AE4935 Formula 1 Simulator (1985)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +1F2815168844EE47345DA0608378F796 Formula 1 Simulator (1985)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +FC862ABB043C1080A7B2DD6A585A263F Four excitement mah-jong (1984)(Tecno Soft)(JP)[CLOAD][JPconfig][Martos] MSX JP +31997CCBA2421ABFE55FC10E06C59123 Freddy Hardest (1987)(Dinamic Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +015CEAF1A52C19E401FF35C910FBB971 Freddy Hardest (1987)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +DE40E65B7B77275FA191DC4C4B2F0669 Freddy Hardest (1987)(Dinamic Software)(ES)(Side B)[a][RUN'CAS-'] MSX ES +A44CFE1FF08E4BACDA434A7D5CB19A92 Freddy Hardest (1987)(Dinamic Software)(ES)(Side B)[a2][RUN'CAS-'] MSX ES +AD818760051D46BBCDCFFDE3FF49BED4 Freddy Hardest (1987)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +2596192886DFB424BB4CA7F490CE329A Freddy Hardest in South Manhattan (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +A6CAD34F5C2FA226541C2EB251E88EC9 Frog (1985)(Advance)(ES)[BLOAD'CAS-',R] MSX ES +9E9E91400B88A3F9564AA3998B8AF8B9 Fruit Machine (1985)(DK'Tronics)(GB)[CLOAD + RUN] MSX GB +50CFFE9A3930FC1E56EB775D3144683E Fruit Panic (1984)(Pony Canyon)(JP)[RUN'CAS-'] MSX JP +EEE5B5F5558FFD96894A99BCFEF59A94 Fruit Panic (19xx)(Philips Spain)(ES)[CLOAD][Martos] MSX ES +74E42BA6995EA220014DF364BE80305A Future Knight (1986)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +A54490428B46851F5B9B18E7530B5AA4 Future Knight (1986)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +F498F3D7465E6DF32D748EA5339C5A30 Galaga (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +C50616DB39B8BEAABF4AB4C69AF094A3 Galaxian (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +BF2E8015C24963B458E8232FF63477A3 Game Over (1988)(Dinamic Software)(ES)(en)(Side A)[English edition][RUN'CAS-'] MSX en ES +AB0D4B127F4A6B58365F324BE8B08BA5 Game Over (1988)(Dinamic Software)(ES)(en)(Side B)[English edition][RUN'CAS-'] MSX en ES +CED2ABA0DE3D72A48D78F84C345B1EA7 Game Over (1988)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +1B390E9262492C0FD4FA03025D7969BE Game Over (1988)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +90492CDE8DA99784FF2ADFDD7E751849 Game Over II (1988)(Dinamic Software)(ES)(Side A)[re-release of Phantis][RUN'CAS-'] MSX ES +51315CA7117A4A20281D1A96EC66CEC0 Game Over II (1988)(Dinamic Software)(ES)(Side B)[re-release of Phantis][RUN'CAS-'] MSX ES +DE81B6B8141E90DA8AC93EC4083385EE Games, The - Winter Edition (1988)(US Gold)(GB)(Side A)[RUN'CAS-'] MSX GB +960BDE5ACC731E6009769EBC5C0D8133 Games, The - Winter Edition (1988)(US Gold)(GB)(Side B)[RUN'CAS-'] MSX GB +7C1D4D04366C0EAD686DDE36D74E1D76 Gang Man (1988)(Armati Software)[RUN'CAS-'] MSX +B51DE180989D47D6AD8BC7D843DD9132 Gangman (1984)(Hudson Soft)(JP)[a][RUN'CAS-'] MSX JP +1DC596B095093D2E8A34F55BB5B617E5 Gangman (1984)(Hudson Soft)(JP)[RUN'CAS-'] MSX JP +A68D1ADD26987A0FCDB49E686D4FDA3B Gauntlet (1986)(US Gold)(GB)(Side A)[a][RUN'CAS-'] MSX GB +FD8D200976EC153B65C30CA612F8BA4B Gauntlet (1986)(US Gold)(GB)(Side A)[RUN'CAS-'] MSX GB +9C576C431B2C63613E5B2BB12A6D3FCF Gauntlet (1986)(US Gold)(GB)(Side B)[RUN'CAS-'] MSX GB +4B3F0FB7D65B518F05B8293C3AB7E23D Gemini Wing (1989)(Virgin Mastertronic)(GB)(Side A)[RUN'CAS-'] MSX GB +C2F9A9F635B3EBBA5FBD609BC1D4FD64 Gemini Wing (1989)(Virgin Mastertronic)(GB)(Side B)[RUN'CAS-'] MSX GB +C4E4B8FE029DA9B954A9E54DC6028557 Genghis Khan (1991)(Positive)[RUN'CAS-'] MSX +878D4B40BEF92802FF2954B6C4AED8A0 Gerente, El (1984)(DIMensionNEW)(ES)[a][RUN'CAS-'] MSX ES +20EA232424B86B630D2D21BCCF3A90FC Gerente, El (1984)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +50E12CDF4D51F8DCBEDCC24D89BD5F09 Geste d'Artillac, La (1985)(Infogrames)(FR)(Tape 01 of 02)[cassette LIMINAIRE][BLOAD'CAS-',R][Martos] MSX FR +8AE64808034407030656F65FB80F59AC Geste d'Artillac, La (1985)(Infogrames)(FR)(Tape 02 of 02 Side A)[cassette CHANTS - chants C1-C6][Martos] MSX FR +059D2A85FB81AFE7D073FCC7C9F4C4F6 Geste d'Artillac, La (1985)(Infogrames)(FR)(Tape 02 of 02 Side B)[cassette CHANTS - chants C7-C12][Martos] MSX FR +EF7A37B203AAD862C1B5A24AD62A199B Ghost (1989)(Mind Games Espana)(ES)[RUN'CAS-'] MSX ES +04D087B9C9F5B00B457EA4D4C8142055 Ghostbusters (1985)(Activision)(US)[BLOAD'CAS-',R] MSX US +A30ADAF93B3E197BCF193E3D9434EA28 Ghostbusters II (1989)(Activision)(US)[RUN'CAS-'] MSX US +F399EBDB7FF4EAED4DCBEB4A0C8A6DAA Gilbert - Escape from Drill (1989)(Alternative Software)[RUN'CAS-',R][64KB in Slot2][Martos] MSX +E8D7FA14E6F0C9D16A40ACB8DD4785DD Glass (1985)(Quicksilva)(ES-GB)[RUN'CAS-'] MSX ES-GB +196626720D593702161F1C2C3F3108BF Golden Basket (1990)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +D28336B067DD71732D0A05A0C9DBB2E3 Golden Basket (1990)(Opera Soft)(ES)[passworded][BLOAD'CAS-',R] MSX ES +FCECD07BA7D416D5802AD3060002DD2B Gonzzalezz (1989)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +6042794590D1DA5C4F4CC806BB5FA4D2 Gonzzalezz (1989)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +576F4EE12DEFDA0B6F0CD2BB494E3A66 Goody (1987)(Opera Soft)(ES)[a][BLOAD'CAS-',R] MSX ES +47FDD8ED20E5ABECF768FB70EDD32883 Goody (1987)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +1922206FB960F643D411A6910C9A8490 Gremlins 2 - La Nueva Generacion (1990)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +F988BBB3DC177B30C2ED2CA1C64AAB70 Grid Trap (1985)(Livewire Software)(GB)[a][RUN'CAS-'] MSX GB +EFA75D7A80AF814236EAC23C4D862D5D Grid Trap (1985)(Livewire Software)(GB)[RUN'CAS-'] MSX GB +29E8E4DB3DE71FEB44C13581344ECC2F Guillermo Tell (1989)(Opera Soft)(ES)[gunstick][BLOAD'CAS-',R] MSX ES +1B5244758B176084B671FDBF6AC33A8D Gunfright (1985)(Ultimate Play The Game)(GB)[a][BLOAD'CAS-',R] MSX GB +3F3C843CEB21C8D0981E5F30AF2A0B37 Gunfright (1985)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +1A7A298063D1B01785324BF91EC0C1EE Gunsmoke (1987)(Go!)(Side A)[aka Desperado][RUN'CAS-'] MSX +81AC7CD48AA500168571A64EC840CB19 Gunsmoke (1987)(Go!)(Side B)[aka Desperado][RUN'CAS-'] MSX +21F2182502CEA301186850A5391D42EE Gusano (1985)(Advance)(ES)[CLOAD + RUN] MSX ES +03AC9BC079A8F561A55BE486CE0B6B46 Gusano (1985)(Advance)(ES)[RUN'CAS-'] MSX ES +35CD62E153B1E3AE0AEA2CBAF4618524 Guttblaster (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +7A2EFB0D334110F5369C4712157F8735 Guttblaster (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +87A68A8967E77536F0C5C71BEA1EDDA6 H.E.R.O. (1984)(Activision)(US)[BLOAD'CAS-',R] MSX US +418D7A7B2229604322AD002454205327 Habilit (1988)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +D737A1E9CEE5469AFCEC969398A0067B Hammer Boy (1991)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +234C5DC854D2104F154483A95FC74CBD Hammer Boy (1991)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +8B3413C0B24D23D4A8494C82CCE56753 Happy Fret (1985)(Micro Cabin)(JP)[a][RUN'CAS-'] MSX JP +C8BBE6CD5610901D68E355DBF222BFF3 Happy Fret (1985)(Micro Cabin)(JP)[RUN'CAS-'] MSX JP +B79BE1FB8379FE87C27F26C89D3470B0 Hard Boiled (1987)(Methodic Solutions)(NL)[a][RUN'CAS-'] MSX NL +D169DB5B7208207DBDED512318DB633E Hard Boiled (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +33B22F90153F81F93DDE5599EACE3AAE Harry Fox Yki no Maoh (1985)(Micro Cabin)(JP)[BLOAD'CAS-',R] MSX JP +7C45A988C297812CDE069C90B37A07F8 Harvey Smith's Showjumper (1985)(Software Projects)[passworded][RUN'CAS-'] MSX +BA710EECB914725AE58EAE812D6C9FF6 Harvey Smith's Showjumper (1985)(Software Projects)[RUN'CAS-'] MSX +0A9FBFD73878AD9F4DC4EB1ACFBFA023 Haunted House (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +8E46BBE2A2C6351DB95048529925F1F7 Haunted House (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +7BC3AE2DA122F7907436F1A833CCA856 Head over Heels (1987)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +C1A5DC6EF224400A455449DD9E42415E Head over Heels (1987)(Ocean Software)(GB)[a][RUN'CAS-'] MSX GB +C8A7AB10389F03E40DEBEE21A3DCC24A Head over Heels (1987)(Ocean Software)(GB)[RUN'CAS-'] MSX GB +C8351821034F292F31DF9D45FC6080DF Heat Seeker - Missil (1986)(Mind Games Espana)(ES)[RUN'CAS-'][Martos] MSX ES +BD7DC984B5E2DCE278A194F560064974 Heist, The (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +88E08AF1588DD6E8E1D578735155B8F4 Hercules - Slayer of the Damned (1988)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +97B9BBABC40E5F886B098909332173D8 Here & There with the Mr. Men (1985)(Mirrorsoft)(GB)[RUN'CAS-'][Martos] MSX GB +3793B7F66FB756876E39392F697C02D0 Highway Encounter (1985)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +AF2F5EA65694D49D5E0C70A216EFDFC9 Hopper (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +F439BD9841B6634DD7DA72B3B735DDCA Horse Race. Carreras de caballos (1983)(Spectravideo)(GB)(es)[CLOAD][Martos] MSX es GB +20154E36C302F0C8DACA3F684EAF83FF Hostages (1990)(Erbe)(ES)(en)(m Martos)[RUN'CAS-'] MSX en ES +F24C7603FD76C940F7E6347F25D3F49A Hot Shoe (1984)(Longman Software)(GB)[BLOAD'CAS-',R][Martos] MSX GB +78FA335678729877FA53448CE24D0034 Howard the Duck (1987)(Activision)(US)[BLOAD'CAS-',R] MSX US +18D7D9CE3FA1EF0385522D08D2F3EDCD Humphrey (1984)(Mr. Micro)[a][BLOAD'CAS-',R] MSX +FAB564C647B17DBF6A7790DF62A61EC9 Humphrey (1984)(Mr. Micro)[BLOAD'CAS-',R] MSX +3F6709760A384FF55C9C9BB43DDB03C7 Humphrey (1988)(Zigurat Software)(ES)[a][RUN'CAS-'] MSX ES +19F1CDE2BB4B48E1EBC61232447F5F03 Humphrey (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +84429802CCB6BEB2F2FF25672506798F Hunchback (1984)(Ocean Software)(GB)[a][BLOAD'CAS-',R] MSX GB +953B2075E480DAA8F15DCFB5060351A8 Hunchback (1984)(Ocean Software)(GB)[BLOAD'CAS-',R] MSX GB +6DDEE6BB8925EB08CE16BCB7210AEF57 Hundra (1988)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +48CD85CA497239A9E699E4EAA1D633AB Hundra (1988)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +A6B441259738DDC91248E4696794AA88 Hunt for Red October, The (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +D3A2E194A87318CCE624D7D0A7BD4E2C Hustler (1984)(Bubble Bus Software)(GB)[BLOAD'CAS-',R] MSX GB +423F7F0442A67B5F9BB4DB85C9BC7A03 Hydlide (1985)(T&E Soft)(JP)[a][BLOAD'CAS-',R] MSX JP +D4B52076FEC5E8504C4AD5A543116836 Hydlide (1985)(T&E Soft)(JP)[BLOAD'CAS-',R] MSX JP +164305163FE496F49C974AEC369EF645 Hypsys (1989)(Techno Arts)(Side A)[a][RUN'CAS-'] MSX +08AC5E4484C94CFC3044A3BC039CFE52 Hypsys (1989)(Techno Arts)(Side A)[RUN'CAS-'] MSX +74C36FF8BE5743AFFE24D8CEDFEBDF34 Hypsys (1989)(Techno Arts)(Side B)[RUN'CAS-'] MSX +DCE421C4E35260F70542F31F17BDAF78 Ice (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +6905B8B9C54B281256C8F5A92BBAE0A1 Ice King, The (1986)(CDS Micro Systems)(GB)[RUN'CAS-'][Martos] MSX GB +8FCEE40A929DACB106EE64296A00D0AD Ice-Breaker (1990)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +1A75898F3177A8D47225D76332639DBF Igloo (1985)(Garbi Soft)(ES)[RUN'CAS-'] MSX ES +E893043DC801B2560E2FAF0C9B577D56 Illusions (1985)(Nice Ideas)(FR)[CLOAD + RUN] MSX FR +DA6B6C5691712FC580B3A422922A09FF Inca (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +4A1358382F1308D3450E2662AEC99F08 Inca (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +BE3817C48FDFD60F0115C916BB153DA6 Indiana Jones and the Last Crusade (1989)(Erbe Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +C3DD8DFDD93334B073C36814D8CE2A06 Indiana Jones and the Last Crusade (1989)(Erbe Software)(ES)(Side A)[RUN'CAS-'] MSX ES +6324B7499623D64BC62204669AB9B3E8 Indiana Jones and the Last Crusade (1989)(Erbe Software)(ES)(Side B)[RUN'CAS-'] MSX ES +15BD382A7FECA303C879336FF31447D4 Indiana Jones and the Temple of Doom (1987)(US Gold)(GB)[RUN'CAS-'] MSX GB +4FCFAF9A713BB67838558AEDFEB68721 International Karate (1986)(Endurance Games)(GB)[a][RUN'CAS-'] MSX GB +B2BC8BC392D4139D4158D902BCC2F772 International Karate (1986)(Endurance Games)(GB)[a2][RUN'CAS-'] MSX GB +64BE67A5F48A1E7D3D46B2D2C78F927A International Karate (1986)(Endurance Games)(GB)[RUN'CAS-'] MSX GB +1FD01D2E32AE8EEB77203D45C26879CA Intrepido (1988)(Mind Games Espana)(ES)[RUN'CAS-'][Martos] MSX ES +44562C1FC0B2FE3C1232ABF6F61A1CF2 Invaders (1986)(Livewire Software)(GB)[RUN'CAS-'] MSX GB +9AAF8A1DB41C5498E4E60EE6111E87D8 Invasion (1987)(Bulldog)(GB)[a][RUN'CAS-'][64KB in Slot2][Martos] MSX GB +1B811A069D596104F05CB1B89F2A8692 Invasion (1987)(Bulldog)(GB)[RUN'CAS-',R][64KB in Slot2][Martos] MSX GB +300F4E0A87B929A9CF1617BFB659200D Invierte y Gana (1986)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +E273943D2330774C8C4FD26C2B26B328 Iron of the War (19xx)(Mind Games Espana)(ES)[RUN'CAS-'] MSX ES +2E0C0953CF387F98DCF2C5EA2D4AFC1F Italia '90 - World Cup Soccer (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +1CBB809A17731EBD55077A051B11D567 Jabato (1989)(Aventuras AD)(ES)(Side A)[RUN'CAS-'] MSX ES +43AC03C44A5D1CDC3F60B301C201CC35 Jabato (1989)(Aventuras AD)(ES)(Side B)[RUN'CAS-'] MSX ES +B390634E2D9097D68AA1DD1C238CF44B Jack the Nipper (1986)(Gremlin Graphics Software)(GB)[a][BLOAD'CAS-',R] MSX GB +6BC7D2AADCC1550BDCC35669D2386FCC Jack the Nipper (1986)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +DB54F059DAA1C95EA122F3B296EB15F7 Jack the Nipper II - In Coconut Capers (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +9D989F6A9D7888316A8AD7EFB36C551B Jackson City (1990)(G.LL. Software)(ES)[RUN'CAS-'][CTRL][Martos] MSX ES +77C131B4478FDABF7678BA8405B3184B Jai Alai (1991)(Opera Soft)(ES)[BLOAD'CAS-',R][Martos] MSX ES +8C7B605BB09133F987B7FE565434B7F8 Jaws (1989)(Screen 7)[RUN'CAS-'] MSX +4CF5CF18E6A3C1DBF66A391E50F7ADB4 Jet Bomber (1985)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +E6A6F5E977BB7AEBF66C71B55C3E97D1 Jet Bomber (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +D1DF194497E8D12D7454B0901C606250 Jet Fighter (1985)(Aackosoft)(NL)(en)[RUN'CAS-'][Martos] MSX en NL +4F0A4379984268744B796AB41533AF85 Jet Fighter (1988)(Eurosoft)(NL)(en)[a][RUN'CAS-'][Martos] MSX en NL +A95123C9159DBE5CAB8D340659A1E069 Jet Fighter (1988)(Eurosoft)(NL)(en)[RUN'CAS-'][Martos] MSX en NL +E41470A16E59DB833EDA61E9A3C0F11C Jet Fighter (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +18D4B38980A0CD25B55FEF3C6A1653E2 Jet Set Willy (1984)(Software Projects)(GB)(en)[RUN'CAS-'][Martos] MSX en GB +DC2C9047891EA251BCB8ADCC94B4A4AA Jet Set Willy II - The Final Frontier (1985)(Software Projects)[passworded][RUN'CAS-'] MSX +17D740C5968949C138CBBF237777BB6A Jet Set Willy II - The Final Frontier (1985)(Software Projects)[RUN'CAS-'] MSX +405DB090127069C70A056421E653DBC4 Joe Blade (1989)(Players Software)(GB)[BLOAD'CAS-',R] MSX GB +E9848C17807287E9A91C5F45CA7212DA Johny Comomolo in 3-2-1 Fire (1986)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +C4115A0DE0CF5CB85524232FBAB9D6E2 Johny Comomolo in 3-2-1 Fire (1986)(Dro Soft)(ES)[RUN'CAS-'][Martos] MSX ES +FFD2E1417294552AE98223507DC55742 Journey to the Centre of the Earth (1985)(Bug-Byte Software)(GB)(Side A)[CLOAD + RUN] MSX GB +0518742D18729B04BF4C89A6A93FB1D4 Journey to the Centre of the Earth (1985)(Bug-Byte Software)(GB)(Side B)[CLOAD + RUN] MSX GB +87E737F183F5717F903F3B80478C28CA Jumping Jack (1986)(Livewire Software)(GB)[RUN'CAS-'][Martos] MSX GB +B8D072C8827483646970E6F6E47366D0 Jungle Warrior (1990)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +1066294F3E448A3E57B318BFF5888936 Karateka (1986)(Dro Soft)(ES)(Side A)[RUN'CAS-'][Martos] MSX ES +17DD81F4F259C8FA1F7FBC48F1E77B55 Karateka (1986)(Dro Soft)(ES)(Side B)[Martos] MSX ES +0021A80B8CB7779067C5B0DD1D2025DF Ke Rulen los Petas (1989)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +C64601E75AA2592828089B94BFBB9A38 Khazzad-Dum (1989)(System 4)(ES)[RUN'CAS-'] MSX ES +0737C76A4FC3638DF1FB6A31B666C0AA King & Balloon (1988)(Bug-Byte Software)(GB)[BLOAD'CAS-',R][Martos] MSX GB +2D0D22835E05D7531FAA49C68B5D8421 King Leonard (1986)(Mind Games Espana)(ES)[BLOAD'CAS-',R] MSX ES +88B3253FC5AB4E08C4DA846CDE978947 Klax (1990)(Domark)(GB)[BLOAD'CAS-',R] MSX GB +3FCB693A47E54A3F0BB6ECFAADC140DD Knight Ghost (1987)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +AC90F8DD3A9C5BD74FB5A3370B3E1B36 Knight Lore (1985)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +339D1D355965CBBAE70DA944419C3589 Knight Tyme (1986)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +A52F5303414EC1E2F39E83828F908674 Knockout (1985)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +D106599A1FA614497A1C69A3E49DCFCE Kong (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +D544FC0B22F9003E631952800AABD33C Kong's Revenge (1991)(Zigurat Software)(ES)(Side A)[RUN'CAS-'] MSX ES +AA3ED8468E05A2B17194E5D8D07A30CA Kong's Revenge (1991)(Zigurat Software)(ES)(Side B)[RUN'CAS-'] MSX ES +5509B87A049E6C12EAEF1A9C0BAAF37D Krakout (1987)(Gremlin Graphics Software)(GB)[a][BLOAD'CAS-',R] MSX GB +7826C9BDF2B1C8FFB2F5F502563206C8 Krakout (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +F839AEC32171817A9562A4B53C227A50 Krom - El Guerrero Invencible (1989)(OMK Software)(ES)[RUN'CAS-'] MSX ES +F86DE985006EDDC221EE8D3A31845B2C Krypton (1986)(Manhattan Transfer)(ES)[CLOAD + RUN] MSX ES +6D92546E2892D03F8BD06D8ACA14E8D3 Kubus (1985)(Kuma Computers)(GB)[RUN'CAS-'] MSX GB +FF8D15E4B1E69A41CC6CA57E66F7AD5A Laberinto (1985)(Advance)(ES)[CLOAD + RUN] MSX ES +75D354736C84C04736AB0CFEFE940398 Lady Safary (1988)(OMK Software)(ES)[RUN'CAS-'] MSX ES +1768E7E16FCB650536FFD6D7D3C04869 Last Mission, The (1987)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +B508F4B6FFB2FC730467BA86C47D8CEC Lazer Bykes (1985)(PSS)(GB)[a][BLOAD'CAS-',R] MSX GB +6E540A95BD9B110DDA39B8CCDC71DFEC Lazer Bykes (1985)(PSS)(GB)[a2][BLOAD'CAS-',R] MSX GB +DBC8BC5DD9EDB3FEB1F356A9011F5BA8 Lazer Bykes (1985)(PSS)(GB)[BLOAD'CAS-',R] MSX GB +CDB2C4330EAEF4E0A0755C3E93180C7D Lazy Jones (1985)(Terminal Software)(GB)[a][RUN'CAS-'] MSX GB +6944A685EDCB174F6FB3BE01B911BCB5 Lazy Jones (1985)(Terminal Software)(GB)[a2][RUN'CAS-'] MSX GB +18D396333026BB8F1C1CFF13396241B1 Lazy Jones (1985)(Terminal Software)(GB)[RUN'CAS-'] MSX GB +1A271D8E59D1A86DD6D262B7A21B38CA Le Mans (1984)(Electric Software)(GB)[a][BLOAD'CAS-',R] MSX GB +9C27E5A9D0AF03E966F748D48483136D Le Mans (1984)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +EC55D309A6EDCB1F352528E7062AF2F9 Legend (1988)(Iber Soft)(ES)[RUN'CAS-'][Martos] MSX ES +E8866B6FBB40605E1740BB813DD65FF2 Legends - Leyendas (19xx)(Mind Games Espana)(ES)[CLOAD + RETURN] MSX ES +E2FFDC5614FF53549255CAC211A61C85 Legends of Star Arthur - Planet Mephius (1985)(T&E Soft)(JP)(Side A)[CLOAD + RUN] MSX JP +C485516D1AD69DD6A7F588FE21FBEC00 Legends of Star Arthur - Planet Mephius (1985)(T&E Soft)(JP)(Side B)[CLOAD + RUN] MSX JP +30F8D64899BB3DCC29733DF0E386FD1E Legends of Star Arthur - Planet Mephius (1985)(T&E Soft)(JP)(Side C)[CLOAD + RUN] MSX JP +7270F0666956E0F47B87E6BB95AB17F9 L'Heritage - Panique a Las Vegas (1987)(Idealogic)(ES)(Side A)[La herencia][BLOAD'CAS-',R][Martos] MSX ES +4FCAD08B4769577632228BFE850A7AEE L'Heritage - Panique a Las Vegas (1987)(Idealogic)(ES)(Side B)[La herencia][Martos] MSX ES +D3334A7A3C8D33EFBAD8CB841C60C356 L'Heritage - Panique a Las Vegas (19xx)(-)(en)(Side A)[Inheritance][BLOAD'CAS-',R][Martos] MSX en +68A52397DF27C1FEBA27F23257D1D0EC L'Heritage - Panique a Las Vegas (19xx)(-)(en)(Side B)[Inheritance][Martos] MSX en +99A91758873F5A55C61CFB61CFFCA240 Licantropo (1986)(Onaki)(ES)[RUN'CAS-'][Ultima Play The Game's Knight Lore][Martos] MSX ES +18E322E89478D0391E5515BB44B1DC2E Life in the Fast Lane (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +69D06E568CFC3F1DECB7857B066037C7 Light Corridor, The (1990)(Infogrames)(FR)[RUN'CAS-'] MSX FR +77A3B281F7876C8874357AA7D4797FA5 Livingstone Supongo (1986)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +44E61A438D31F9C557542F84A81987F2 Livingstone Supongo (1986)(Opera Soft)(ES)[RUN'CAS-'] MSX ES +6D463B5A95598A1D5C701C1DAEC2F25C Livingstone Supongo II (1989)(Opera Soft)(Side A)[BLOAD'CAS-',R] MSX +01991444E68BEFEA8C9E0DC2468AA330 Livingstone Supongo II (1989)(Opera Soft)(Side B)[BLOAD'CAS-',R] MSX +A8BCC93B75A0555EC52944570635ADA8 Lizard (1985)(Micro Cabin)(JP)[CLOAD + RUN] MSX JP +7A7027CF0CA83CD627FA62E0FC504C5E Lorna (1990)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +91B603F30E0FBF31482EB54347B48F55 Mac Attack (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +19CDA2D39503932E34657C18A5639C58 Macadam Bumper (1985)(Players Software)(GB)[a][BLOAD'CAS-',R] MSX GB +A45DEE5AB282F155FCD0D047138BF1FF Macadam Bumper (1985)(Players Software)(GB)[a2][BLOAD'CAS-',R] MSX GB +D44A328C7292A308F453BE6D9746940B Macadam Bumper (1985)(Players Software)(GB)[BLOAD'CAS-',R] MSX GB +D4ED5BF5CAB6D89EB887DD9492863CA7 Macross Countdown (19xx)(Eaglesoft)[RUN'CAS-',R][Martos] MSX +007F7A94C331A9339CD28E6C27373B0E Mad Mix 2 - En el Castillo de los Fantasmas (1990)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +5B1E696CBD570494591B8FBFE7EC4DD9 Mad Mix Game (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +8878976DFF38FD4BB4AB20A72FA20692 Made in Spain - 5 Estrellas (1985)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +7BC3207F0244FC10A2374A0577CD80E1 Magic Johnson's Basketball (1990)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +749E98A535A8100615DB1A61C1AAC6D5 Magic Pinball (1987)(OMK Software)(ES)[RUN'CAS-'] MSX ES +02B0C6D7F410A95CE08ACA93DF6AFE65 Mambo (1989)(Positive)(ES)[a][RUN'CAS-'][Martos] MSX ES +F2F6E359E43D7EE382156AFF3BF79547 Mambo (1989)(Positive)(ES)[RUN'CAS-'][Martos] MSX ES +139FDCE0F45C244C06DE4E654DF6D2D2 Mandragore (1986)(Infogrames)(FR)(fr)(Tape 1 of 2)[a][BLOAD'CAS-',R][cassette JEU][Martos] MSX fr FR +2108F51033C81457709894CA182F73E3 Mandragore (1986)(Infogrames)(FR)(fr)(Tape 1 of 2)[BLOAD'CAS-',R][cassette JEU][Martos] MSX fr FR +1E0BD1A346544D0C10AD2BE9316060B2 Mandragore (1986)(Infogrames)(FR)(fr)(Tape 2 of 2 Side A)[BLOAD'CAS-',R][cassette DONJONS D0-D4][Martos] MSX fr FR +1928EFA7C66BED9C8890ED47D6C21387 Mandragore (1986)(Infogrames)(FR)(fr)(Tape 2 of 2 Side B)[BLOAD'CAS-',R][cassette DONJONS D5-D9][Martos] MSX fr FR +4565B5E705E8E827005D5C3ADF0F08C6 Manes (1984)(ASCII)(JP)[BLOAD'CAS-',R] MSX JP +E94CC295076BDFF2409416B7DA0A9369 Manic Miner (1984)(Software Projects)[a][RUN'CAS-'] MSX +F78ED2A216518696232307206CAE11DF Manic Miner (1984)(Software Projects)[RUN'CAS-'] MSX +EF604608C1D46054F4E07354209ED866 Mappy (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +FC928CD3F63D2117960ABB250D7A0E0A Martianoids (1987)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +D85EFBFCEFCB3D911C3581E003024401 Mask II (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +AFACF1F03E1E88D3E524F72B0664A1C5 Mask III - Venom Strikes Back (1988)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +6B6CC56B8E057C420EAD664DE10049D0 Master Chess (1987)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +B821C8C359ACC1B9065FDC510D4A5651 Master Chess (1987)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +CD61C5C96A3D88A550AFC04F555B9C73 Master of the Lamps (1985)(Activision)(US)[RUN'CAS-'] MSX US +C4D0808E0B679861D43CFF61480CFBAF Matamarcianos. Batalla Espacial (1986)(Manhattan Transfer)(ES)[BLOAD'CAS-',R] MSX ES +A46E56AD01D6BBE5A4266507F6041951 Match Day II (1987)(Ocean Software)(GB)[RUN'CAS-'] MSX GB +753E7B9F4E0D9C1DCC01463AB2809D6E Maxima (1984)(PSS)(GB)[a][BLOAD'CAS-',R] MSX GB +9A58521852CFD586683F9DD322316B67 Maxima (1984)(PSS)(GB)[BLOAD'CAS-',R] MSX GB +D4B67846B9387231E0698F74AFAAB42A Mayhem (1985)(Mr. Micro)[BLOAD'CAS-',R] MSX +8E79F65DB4AF3A0DE8E5F2B6B39C0175 Maze Master (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +FDC22FD571861A51B13382953248E0A7 Maze Max (1985)(Loriciels)(FR)[BLOAD'CAS-',R] MSX FR +88612D2FBC3AE3942226DCADDA0DF75A Mazes Unlimited (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +78072C920BA4CAF7058C92BB7809752F Maziacs (1985)(DK'Tronics)(GB)[RUN'CAS-'] MSX GB +3D6A1AF8B7F1F65DA5FC878537014275 M-Droid (19xx)(Blue Ribbon Software)[a][RUN'CAS-'] MSX +5A58B3C8C960016991C2C15539DBAA93 M-Droid (19xx)(Blue Ribbon Software)[RUN'CAS-'] MSX +E2E5E411B641CA5DEA3A4BDD3D8980B9 Mean Streets (19xx)(Kuma Computers)(GB)[RUN'CAS-'] MSX GB +6E4C60BEF47B10AC665EC70E4F5CC173 Mecom (1988)(Iber Soft)(ES)[RUN'CAS-'][aka Mekong] MSX ES +AB4307CDF9DDF8E9165512D875832667 Mega Chess (1988)(Iber Soft)(ES)[aka Super Chess][RUN'CAS-'] MSX ES +9316DEF5E5275B4F5B9750C1D29EE40F Meganova (1988)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +E885BE5A763AE1850FC1DF343A307BCD Meganova (1988)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +133EA15674A9D3C821F789C14A8EEC3C Meganova (1988)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +60391CA4A90C6156806B8061AAADCE51 Megaphoenix (1991)(Dinamic Software)[RUN'CAS-'] MSX +C31D9A854906A232209894078F852CC6 Memory - C.04 (1985)(Computer Users Club)(nl)[position tape + CLOAD + RUN] MSX nl +3C75E79FA676AD9C15E18B95C20A989F Metropolis (1989)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +0EC0798DECE5B6A09CFBC1C3B2F002CA Michel Futbol Master (1989)(Dinamic Software)(ES)(en)(Side A)[English edition][RUN'CAS-'] MSX en ES +732C99993594FF9DD85E8D8D54F81D43 Michel Futbol Master (1989)(Dinamic Software)(ES)(en)(Side B)[English edition][RUN'CAS-'] MSX en ES +17DE3384E3AF8356451FFE92A31090C3 Michel Futbol Master (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +9E69BE6AE0FDF26CCAA4F5591097CDCA Michel Futbol Master (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +94883D574B4ED15C440821BA6857108A Mike Gunner (1988)(Dinamic Software)(ES)[RUN'CAS-'][gunstick][Martos] MSX ES +DC1FEEC1E5951131FB2D159B82E774B7 Milk Race (1987)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +6898BD72BB376EC3316D584BD35CB76C Milk Race (1987)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +C4E0D80C97ACD2E4BCDB7CA2DD5AA817 Miner Machine (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +A42C0CA3006A1A320883D930F5AD2B09 Miner Machine (1987)(Eaglesoft)(NL)[a2][RUN'CAS-'] MSX NL +73808E849267A4BFA8C9F5A0F18BE00B Miner Machine (1987)(Eaglesoft)(NL)[RUN'CAS-'][Martos] MSX NL +D0A7980E70B15E86AF9C827ECD6E7E32 Mini-Golf (1984)(Advance)(ES)[BLOAD'CAS-',R] MSX ES +9E54C17E4EC7A29AA3BD50C15DAEB711 Misterio del Nilo, El (1987)(Zigurat Software)(ES)[a][RUN'CAS-'] MSX ES +D06CFE058E5BC4DC06E22157D90CD42D Misterio del Nilo, El (1987)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +FD99E4521DF40D733743EE11BEF2425F Molecule Man (1986)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +EF319A32681028B95E163FF3C2049243 Molecule Man (1986)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +6ABBA59C8B6C088D87B8C7321A1A3906 Monopoly (1986)(Leisure Genius)[RUN'CAS-'] MSX +AFE524013A631689D41C8BD19F0265E3 Moon Rider (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +B2CBAADE68F849188A872ED4006273A7 Moonwalker (1989)(US Gold)(GB)[a][RUN'CAS-'] MSX GB +DE04187AA31F6A73392F33B1C0A38618 Moonwalker (1989)(US Gold)(GB)[RUN'CAS-'] MSX GB +5BF7B81C14D075A4BB53298155C2C22B Mortadelo y Filemon (1988)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +94277F598F1BC8A25A65C3A6922FA0B9 Mortadelo y Filemon II - Safari Callejero (1990)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +3660870D527F1A73E231958948E06F93 Mortadelo y Filemon II - Safari Callejero (1990)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +40633D8239D390E75B0A84699D90CE79 Most Amazing Memory Game, The (1986)(Idealogic)(ES)[RUN'CAS-'] MSX ES +63A5E77F5F765BF47E94FC77C0D46D47 Mot (1989)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +D945F29B73CD414F34E45FA2428C0AB3 Mot (1989)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +CF1AC4BF38DA527F1ABC54A2B49420A2 Mot (1989)(Opera Soft)(ES)(Side C)[BLOAD'CAS-',R] MSX ES +7EF624CA4C7DCC1935448FBD4EA1A5E5 Mot (1989)(Opera Soft)(ES)(Side D)[BLOAD'CAS-',R] MSX ES +B45D83304368052C3A64A4A39167CEC4 Mountain Bike Racer (1990)(Positive)(ES)[a][RUN'CAS-'][Martos] MSX ES +C9F797C0A99DF43FA3D1E9F6EDA0DA78 Mountain Bike Racer (1990)(Positive)(ES)[RUN'CAS-'][Martos] MSX ES +76CA29BF25F7CDF7B6B4F8691DD0A985 Mountain Bike Racer (1990)(Positive)[RUN'CAS-'] MSX +9A353BCF28E2C989AF5F3160D1EAB4D6 Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB)[a][BLOAD'CAS-',R] MSX GB +13DD1146BB71C1F7F778607779ED06E0 Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB)[b2][BLOAD'CAS-',R] MSX GB +9234797205C88B842E9A58B628B6B472 Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB)[BLOAD'CAS-',R] MSX GB +223AFE47379A672A91529AC22D57C6E5 Mundial de Futbol (1990)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +461027E8F6F6FCA2C9695D4C8F84D1C0 Mundial de Futbol (1990)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +758D7D27B2706E2192FF39E9C9086736 Mundo Perdido, El (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +AC12875BDF8565E36FE58BDE3EDAB490 Mutan Zone (1989)(Opera Soft)(ES)(Side A)[a][BLOAD'CAS-',R] MSX ES +CC5C9612139DE6572D768C3D1C1A8E41 Mutan Zone (1989)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +4FF01676F732C65BF88CCAD8A0DD4BD6 Mutan Zone (1989)(Opera Soft)(ES)(Side B)[a][BLOAD'CAS-',R] MSX ES +9BC433E3B77FA682F56AE6309046E49B Mutan Zone (1989)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +41BEF3FA13E2A2D2C5A67B43CCE392BE Mutant Monty (1985)(Artic Computing)(GB)[BLOAD'CAS-',R] MSX GB +1102DD6354A2C697AAD2859694FCB47B Mystery House (1983)(Micro Cabin)(JP)[CLOAD + RUN] MSX JP +381C6F13EF451D8209228430B4261E8C Mystery House II (1984)(Micro Cabin)(JP)[CLOAD + RUN] MSX JP +E64D4C703C4D12527F7EFC5494A99C80 Mystical (1991)(Infogrames)(FR)(Side A)[RUN'CAS-'] MSX FR +63D268CF94BB4DF11072C0DDA9F725EF Mystical (1991)(Infogrames)(FR)(Side B)[RUN'CAS-'] MSX FR +3106BB921A455AF6001C02C394AA508D Mythos (1990)(Opera Soft)[a][BLOAD'CAS-',R] MSX +A52AE3EA0EE51122B557633C1FEA8533 Mythos (1990)(Opera Soft)[BLOAD'CAS-',R] MSX +E9297B01C671771CF77B4A93EFB650D3 Narco Police (1990)(Dinamic Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +CD9CEA17E5BB69CE35C8B4C67D6FC269 Narco Police (1990)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +938DB5475575C189D557C7BB22F5104B Narco Police (1990)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +548D9FD150B2694EA022BB48F2672DC1 Navy Moves (1988)(Dinamic Software)(ES)(en)(Side A)[English edition][RUN'CAS-'] MSX en ES +C0842FD583DC5D06624DF6BCCDFA70F4 Navy Moves (1988)(Dinamic Software)(ES)(en)(Side B)[English edition][RUN'CAS-'] MSX en ES +0091D116FD7ABF2B950A3A19E42D708A Navy Moves (1988)(Dinamic Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +238FE2850C0BC032C91B1C1C82CB6926 Navy Moves (1988)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +1C83036E0655D38673D6EB8A3EC7F682 Navy Moves (1988)(Dinamic Software)(ES)(Side B)[a][RUN'CAS-'] MSX ES +17648D4AD2553B055E1ECFA811BFDC8E Navy Moves (1988)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +250B662AC9A05A5FCA3177C31978085A Night Flight (1982)(Nippon Columbia - Colpax - Universal)[BLOAD'CAS-',R] MSX +DFF1AE33C6068C7A674CE52423B1BFBF Nightshade (1985)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +EF5892ECC976ABC2B72100AF686D16B5 Ninja 2. Ninja Jaja Maru Kun (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +70EF7FE69A4BF3FBFA08418C840F2806 Nonamed (1986)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +B2A6BD4EDE52E2270A0CF2F4C9A4C226 Nonamed (1986)(Dinamic Software)(ES)[a2][RUN'CAS-'][1st ed.][Martos] MSX ES +677B5F8625899967B20DAAE64296B900 Nonamed (1986)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +3874D25EB48010135025EB4BF327B6F9 North & South (1991)(Infogrames)(FR)(M3)(Side A)[RUN'CAS-'] MSX M3 FR +6CD27652981C2FD956AC085BE23BDB1D North & South (1991)(Infogrames)(FR)(M3)(Side B)[RUN'CAS-'] MSX M3 FR +1EB332B32A9DDD1D6C94ABE2CDDBE83C North & South (1991)(Infogrames)(FR)(M3)(Side C)[RUN'CAS-'] MSX M3 FR +228D0DDE0CC735CF0554D4BC4C42EC29 North & South (1991)(Infogrames)(FR)(M3)(Side D)[RUN'CAS-'] MSX M3 FR +56F2715DF354CFEB359A0DF28AE45BA0 North Sea Bullion Adventure (1985)(Kuma Computers)(GB)[CLOAD + RUN] MSX GB +2EFF6C644840608D88B1EAF4703E33B0 North Sea Helicopter (1987)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +1C99C3E6F3AA125AFDCB64E0A648E7F6 Nuclear Bowls (1986)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +95889C55B784917A90F86C06CD43C5A0 Oberon 69 (1990)(G.LL. Software)(ES)[RUN'CAS-'][CTRL][Martos] MSX ES +3CA18A48BE8F9C2BC9AAD1EA9668EFF5 Obliterator (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +BC7B8A6F077581B0FEC005116EBC7037 Ocean Conqueror (1987)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +E054E4F2BFF0AD21200A27A0DAA1493D Octagon Squad (1986)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +9E20754AB866FF9B8336B8B3827BA95D Octagon Squad (1986)(Mastertronic)(GB)[a2][RUN'CAS-'] MSX GB +AE4D42BA04B15FE7D6B98BB952F422C4 Octagon Squad (1986)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +9CA85A1F79CFE6C3E6CBD27464B94F9E Oh Mummy!! (1984)(Longman Software)[BLOAD'CAS-',R] MSX +797B1139BA23D68DF32E99BD022B1E12 Oh Shit! (1986)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +8F06C56AC6D5F8B04854C95544C252B2 Oh Shit! (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +B40A19BE693830EC7435938A239F2B56 Oil's Well (1985)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +A5ADDD90505FEBE1C97C34CB005B29D4 Ole! (1986)(Bug-Byte Software)(GB)[BLOAD'CAS-',R][Martos] MSX GB +6EB7AFB769177B5CA1AE329F4848F1DE Operation Wolf (1988)(Ocean Software)(GB)(Side A)[a][BLOAD'CAS-',R] MSX GB +C355CC6DC2780F7F97A3E712BEE3A3C2 Operation Wolf (1988)(Ocean Software)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +0EC0B4C01BB8B1ACC689DA5387B1FB2B Operation Wolf (1988)(Ocean Software)(GB)(Side B)[a][BLOAD'CAS-',R] MSX GB +4A73B1AA046D633D8F4A75D8B14B03EC Operation Wolf (1988)(Ocean Software)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +45D0E516A1043F7C2AD7F424D754F307 Operation Wolf (1988)(Ocean Software)(GB)[BLOAD'CAS-',R] MSX GB +F7BB42D70ED8671797D6B41937643BCA Ormuz (1988)(Iber Soft)(ES)[a][RUN'CAS-'] MSX ES +189D6B45534FB68D6580418EFAE94A4E Ormuz (1988)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +51F4FB4C9E4DEFB5F3DD688C5A99E4F6 Ougon no Haka. Golden Tomb. Mystery of Egypt (1984)(Magical Zoo)(JP)[CLOAD + RUN] MSX JP +D714F8392BC65F2D963C3A08C4F81749 Out Run (1988)(US Gold)(GB)[a][BLOAD'CAS-',R] MSX GB +4C24D09BCA85AA87F90EE9553B8B1A39 Out Run (1988)(US Gold)(GB)[a][RUN'CAS-'] MSX GB +891286EE471F52CE2B9177F034548FE3 Out Run (1988)(US Gold)(GB)[BLOAD'CAS-',R] MSX GB +85155769EFB12F8D3D9C02F775ECDF38 Out Run (1988)(US Gold)(GB)[RUN'CAS-'] MSX GB +AAD77D7DF9BEAC8F922D48C640A80615 Outroyd (1985)(Magical Zoo)(JP)[BLOAD'CAS-',R] MSX JP +6700AF86E6CF34714C89A11A315A904A Outroyd (1985)(Magical Zoo)(JP)[CLOAD + RUN] MSX JP +B34110965DEEF1ECF1CB5FF525919ED0 Pac-Land (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +3886B7CAE21DDED5701022C31E4F1F25 Pac-Man (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +720ADD3813366BA3C974B64C8D7787F9 Pac-Mania (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +D795D8845980FBC88EF188E6036FCF39 Panel Panic (1986)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +3134181C3CA2390BECE1513330E6FFEC Panel Panic (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +8B7D2284AEA4A0DAB8EA2F311EDC1D89 Panique (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +55D27DD1E637AB991923E918A5F168AA Panzer Attack (1985)(MC Lothlorien)(GB)[a][CLOAD][Martos] MSX GB +9DBFA0062DB46A32A8E95D59BE9856A9 Panzer Attack (1985)(MC Lothlorien)(GB)[CLOAD][Martos] MSX GB +00559CD7A4C85C77D5C378B768469895 Paris-Dakar (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +727643C244BA22C86154B5E17FF05220 Passing Shot (1989)(Image Works)[BLOAD'CAS-',R] MSX +0D8F1AE118685B40DDAB35E1C2920720 Pastfinder (1984)(Activision)(US)[BLOAD'CAS-',R] MSX US +F5C81B3DBC4F25EC5216F1A434FB6FC9 Pentagram (1986)(Ultimate Play The Game)(GB)[BLOAD'CAS-',R] MSX GB +AA0F700D9EC2FB68C89D512E90019AA8 Perico Delgado Maillot Amarillo (1989)(Topo Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +8C6F8C7844426F96C5F72095C49F8E18 Perico Delgado Maillot Amarillo (1989)(Topo Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +EF8A6ABE10E0AAAEE134F45AEA8271A9 Peter Beardsley's International Football (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +660446E46EA5FE86B65307732E0F49DC Phantis (1987)(Dinamic Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +50DAD36E2021A646F970F3ED8837DDC5 Phantis (1987)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +55E95E81FE23068D5B9601AC9C6CBB3E Phantis (1987)(Dinamic Software)(ES)(Side B)[a][RUN'CAS-'] MSX ES +B1403EC4FF742F2EFE9F1F5B71564FC9 Phantis (1987)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +D22E66A50A17CB83B478E36DC947B257 Phantomas 2 (1987)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +D955D96BAF70AF521D20ECC01312FEF9 Pharaoh's Revenge (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +68B0A1982269AD54F0F89321FAD2B9DF Pharaoh's Revenge (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +F01261A6E1CD66407DF8E21F230EEA90 Pico Pico (1983)(Micro Cabin)(JP)[a][RUN'CAS-'] MSX JP +0F6C181162982A79C3216383001D6F51 Pico Pico (1983)(Micro Cabin)(JP)[RUN'CAS-'] MSX JP +5146F8AB30B745393ED288CAFAEE8613 Pinball Blaster (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +487E823147C558CD22C650771C2B2D91 Pinball Blaster (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +6B1DEBB5718B86AF6D92EE3AE12014BD Pink Panther (1988)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +B51F78180F48A2FE207532E8C5536299 Pitfall II - Lost Caverns (1985)(Activision)(US)[BLOAD'CAS-',R] MSX US +470E765E106D269990FB4203F78EC2DD Playhouse Strippoker (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +D990961F40CC884734B2CE497FCF23F2 Poder Oscuro, El (1988)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +B1085C91D36EA21ECC3BB589BECE008B Polar Star (1984)(Micro Cabin)(JP)[BLOAD'CAS-',R] MSX JP +BF443F04F282DEBAAB50ED192924D2D7 Polar Star (1984)(Micro Cabin)(JP)[CLOAD + RUN] MSX JP +122B50108F4035CDA83FB2339BF416F8 Poli Diaz (1990)(Opera Soft)(ES)[BLOAD'CAS-',R][Martos] MSX ES +91ABD39F73D908F2132EEB4FC4D29B5F Police Academy (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +9589EA5345AE0D457B37F504EC98CE82 Police Academy II (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +9C5E56A512B7CE17370BCAA41AB30122 Poogaboo (1991)(Opera Soft)(ES)[a][passworded][BLOAD'CAS-',R] MSX ES +75DA5BA30814531629850AB1C2CC2948 Poogaboo (1991)(Opera Soft)(ES)[BLOAD'CAS-',R] MSX ES +F37D7D99B180730E15C024103D164F2E Poogaboo (1991)(Opera Soft)(ES)[passworded][BLOAD'CAS-',R] MSX ES +FDC06A11CE69D2072FB9337D5A8E63B1 Post Mortem (1988)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +2A04DA4EA384C03FD4A821769E65DAC8 Power and Magic (1990)(Zigurat Software)(ES)[a][RUN'CAS-'] MSX ES +4552D347C28138154DCD763DF32B0EDF Power and Magic (1990)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +8912DBBEEE922A7E153F987564D82590 Power Drift (1989)(Activision)(US)(Side A)[RUN'CAS-'] MSX US +E3C14A3779BBAEFD48B5C79463DBE30E Power Drift (1989)(Activision)(US)(Side B)[RUN'CAS-'] MSX US +DF99E603BB5346A0834592527E885D16 Professional Baseball Super Simulation (1984)(JDS)(JP)[CLOAD + RUN] MSX JP +CF809035D8B4F57ED03398443DC78768 Professional Snooker Simulator (1987)(Codemasters)(GB)(M3)[BLOAD'CAS-',R] MSX M3 GB +F0CB515CCD1D4B50596CFC0AB504B8A3 Professional Tennis Simulator (1990)(Dinamic Software)[aka Simulador Profesional de Tenis][RUN'CAS-'] MSX +D124BD5CC914668A1BAFFD1EAF9F5B29 Project A (1984)(Pony Canyon)(JP)[CLOAD + RUN] MSX JP +2CE7BB1D3FCF98AD95AF8BB844835319 Protector, The (1987)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +D878E52EE84855F83EBC376A74788A33 Protector, The (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +595CDB0129B85FFDCAC56A059F74D74B Psycho Pig U.X.B. (1988)(US Gold)(GB)[RUN'CAS-'] MSX GB +92F8FD73049A7D5FCE596AFCC2A2B75D Punchy (1984)(Mr. Micro)(GB)[a][BLOAD'CAS-',R][Martos] MSX GB +BFD64F7B15FA6B983886FF3954E56E3D Punchy (1984)(Mr. Micro)[BLOAD'CAS-',R] MSX +723F547C551B33000C107A3F941C6EDA Pyramid Warp (1983)(T&E Soft)(JP)[BLOAD'CAS-',R] MSX JP +479AF45161E08290BD327A8330547D2D Quebert (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +D356DBEA5FB07F1AD69469B8391F9EE3 Quebert (1988)(Eurosoft)(NL)[a2][RUN'CAS-'] MSX NL +6A236FD561B8573C52A264EAA51464FA Quebert (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +A6BE49CF79909BFCFD862D16F5404CD5 Queen's Golf (1984)(ASCII)(JP)[BLOAD'CAS-',R] MSX JP +EEBC3B611A815FD7D06E6BAD7022BF60 R.A.M. (1990)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +D792D0C5E99BBDB2F4E6A2B51A8945CB Race City (1988)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +BBA7AF7C1A1770DF746265A643C30E0B Rally-X (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +4944CF8ACD455556F6B5099FB90FAC53 Rambo III (1988)(Ocean Software)(GB)(Side A)[a][BLOAD'CAS-',R] MSX GB +BCC3B5236573E968C5F67413B3E077CE Rambo III (1988)(Ocean Software)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +0DC96830DDE1115C91552DFA28E5CE1D Rambo III (1988)(Ocean Software)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +0038EA9E905728EB25136BD28EDA67E2 Rambo III (1988)(Ocean Software)(GB)[BLOAD'CAS-',R] MSX GB +4559C3D38152FA08D480BF11FB741591 Rampart, The (1988)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +5CF31974BA5C76B58CA14F20D3FEC4F7 RasterScan (1987)(Mastertronic)(GB)[a][RUN'CAS-',R][Martos] MSX GB +3671AF72B07C8FB0CCDC23AFCE0FAFD1 RasterScan (1987)(Mastertronic)(GB)[RUN'CAS-',R][Martos] MSX GB +FAC9CDAE4DA53F55469BAEB91C4D62C3 Rath-Tha (1989)(Positive)(ES)[RUN'CAS-'] MSX ES +1E1896142238B2FCC892B7A694F8AA2F Red Dawn (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +831D91DE653559BB2BB1E5662CE18A93 Red Dawn (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +BBCF224468ED74C5935AD123706A01C2 Reflex (1987)(Players Software)(GB)(Side A)[a][RUN'CAS-'] MSX GB +65E31DED1033059F9E1AC5B02A5CAF7E Reflex (1987)(Players Software)(GB)(Side A)[a2][RUN'CAS-'] MSX GB +0479E9638F9064F68A46E81A267D01C5 Reflex (1987)(Players Software)(GB)(Side A)[RUN'CAS-'] MSX GB +3CF71700E846C8CBB1CB793513645F58 Reflex (1987)(Players Software)(GB)(Side B)[a][RUN'CAS-'] MSX GB +69038B3DEC6D83E2604B95950889A18C Reflex (1987)(Players Software)(GB)(Side B)[a2][RUN'CAS-'] MSX GB +9FB146F50E4E6CFB3BF815EA22567207 Reflex (1987)(Players Software)(GB)(Side B)[RUN'CAS-'] MSX GB +F7DEE0F386F4C618BCACEF37786A58A7 Relics (1986)(Bothtec)(JP)(Side A)[BLOAD'CAS-',R] MSX JP +52B2716693F5653E6A44E0C6C21E5C11 Relics (1986)(Bothtec)(JP)(Side B)[BLOAD'CAS-',R] MSX JP +D50E9F0F6D2DE3C757BFB60843E147B8 Renegade III - The Final Chapter (1989)(Imagine Software)(GB)[RUN'CAS-'] MSX GB +F789831C214D7981A8F7DBCD8CB14C86 Rescate Atlantida (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +B68E0B3E7EEFF3599BDA10D3362F9783 Rescate Atlantida (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +6DF89DA9BA93195DBE145592ED574239 Rescate Atlantida (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +4FB9F8F78D5D9EDAA3C2F03C2C16A821 Rescate en el Golfo (1990)(Opera Soft)(ES)(Side A)[a][BLOAD'CAS-',R] MSX ES +4917F9836212CE35FAC9BDB82205AA39 Rescate en el Golfo (1990)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +8659567F46201BC6B2E107223FA6D29D Rescate en el Golfo (1990)(Opera Soft)(ES)(Side A)[passworded][BLOAD'CAS-',R] MSX ES +1396775DF0F55D3652E558EDC24FC78B Rescate en el Golfo (1990)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +12DB07D456B5B2A58DEF562F6A4B2757 Rescate en el Golfo (1990)(Opera Soft)(ES)(Side B)[passworded][BLOAD'CAS-',R] MSX ES +CEEB55506441D1A033B64E81ADDB2492 Risky Holding (1986)(DIMensionNEW)(ES)[RUN'CAS-'] MSX ES +9A763DF6B936B2D7D9493998385B1BB6 River Raid (1984)(Activision)(US)[BLOAD'CAS-',R] MSX US +FED2C2F29D60D267F3BE2F77AE33FEE6 Robocop (1988)(Ocean Software)(GB)(Side A)[a][BLOAD'CAS-',R][Martos] MSX GB +65350D7474158F3806B3AB94DB32656B Robocop (1988)(Ocean Software)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +057EF1044EE88BDBE1E7DB5F34E13E6E Robocop (1988)(Ocean Software)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +574DD73B4BD90F3536BC9DDE3764A6EF Robot Wars (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +11A249F8B91A5DC237FB25A4B5C0B9A9 Roboy (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +A6BE6BD07178A0EF06390871E99682D5 Rock 'n Roller (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +DD15E09FA0CED1C7923E5A960869B97D Rocket Roger (1987)(Alligata Software)(GB)[a][RUN'CAS-'] MSX GB +C8151BD8F05E0365CF547AC9137EC04D Rocket Roger (1987)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +C0EC189246356210BE1305273285890F Rocky (1985)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +339B770B09117DD6370F47CDF1420FB8 Rocky (1985)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +EFEDE7C51FD83EEB4864DE6CAF56BD94 Roma - La Conquista del Imperio (1986)(Idealogic)(ES)[RUN'CAS-'] MSX ES +0CA791D074687944AA254BA323D13D99 Runner (1986)(Loriciels)(FR)[RUN'CAS-'] MSX FR +AB50BF4DFA36256C84B139A0DA547E0D Running Man, The (1989)(Grandslam Entertainments)(GB)(es)(Side A)[RUN'CAS-'] MSX es GB +FE12F5409B0B46F1F25797BE690F2561 Running Man, The (1989)(Grandslam Entertainments)(GB)(es)(Side B)[RUN'CAS-'] MSX es GB +C2545D854CE47186DC5C8D213307A157 Sabotaje (1988)(P.J. Software)(ES)[a][RUN'CAS-'] MSX ES +CCD8019E19E11E73B10715DB5E2EFB4C Sabotaje (1988)(P.J. Software)(ES)[RUN'CAS-'] MSX ES +EA237ADBCE00C6B62D34DCA681A187E4 Sabrina (1989)(Iber Soft)(ES)[RUN'CAS-'] MSX ES +76246FB16E7F8EEE7050E49D2420877E Saint Dragon (1990)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +4540D35D3DAD19EC971FEC9796AB4D22 Saint Dragon (1990)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +B5C0B5F3CEDBBF602D9E89E770B9AFFB Salvage (1986)(Livewire Software)(GB)[RUN'CAS-'][Martos] MSX GB +7B060F144EA5D70F555D17E461D313E8 Samantha Fox Strip Poker (1986)(Martech Games)(GB)[a][RUN'CAS-'] MSX GB +F40DCD56C9794EA6E2484F3CD8117940 Samantha Fox Strip Poker (1986)(Martech Games)(GB)[RUN'CAS-'] MSX GB +BB1B1F5E1EDEB43CF8EBEFCD4039A7E6 Satan (1989)(Dinamic Software)(ES)(en)(Side A)[English edition][RUN'CAS-'] MSX en ES +9DC1316AFEC925F40A264E02DFE47482 Satan (1989)(Dinamic Software)(ES)(en)(Side B)[English edition][RUN'CAS-'] MSX en ES +CF77ED6744053CFDBBBB880969B3FC32 Satan (1989)(Dinamic Software)(ES)(Side A)[RUN'CAS-'] MSX ES +AB6C5A269B570CE67A8344C083AE6C81 Satan (1989)(Dinamic Software)(ES)(Side B)[a][RUN'CAS-'] MSX ES +644FE7737A42153E4A9E3AD65F768ABE Satan (1989)(Dinamic Software)(ES)(Side B)[RUN'CAS-'] MSX ES +1CD2938056110C83219EBF9D8AF3A3B3 Scentipede (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +8FF177AF649CD56B75A48E4600CDDD0A Science Fiction (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +DC3717E401A4A406C3E1C34408D6731A Score 3020 (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +0FC6028118E8802681987A619AF49AF6 Scramble Spirits (1990)(Grandslam Entertainments)(GB)(Side A)[a][BLOAD'CAS-',R] MSX GB +9235237103493108F905F3EF126877A7 Scramble Spirits (1990)(Grandslam Entertainments)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +56B1A919CE6B4F940B1D19EC6B406BD2 Scramble Spirits (1990)(Grandslam Entertainments)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +141DD723D84F45476AF017C360FB35D1 Sea King (1986)(Players Software)(GB)[RUN'CAS-'] MSX GB +FC4D790DFDF76EE7516B257FCE131F1C Secreto de la piramide, El (19xx)(Manhattan Transfer)(ES)[RUN'CAS-'][Martos] MSX ES +5886B4B9905F27D114BCADE45E142A4C Senda Salvaje (1990)(Zigurat Software)(ES)(Side A)[RUN'CAS-'] MSX ES +7AF87543828322915A14BDFABCB7C08D Senda Salvaje (1990)(Zigurat Software)(ES)(Side B)[RUN'CAS-'] MSX ES +8033E4D80B31882342AA9B6A61C4A957 Shark Hunter (1984)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +2E7F0612C911D99656C34142247FFECB Shinobi (1989)(Virgin Games)(GB)(Side A)[RUN'CAS-'] MSX GB +52829BE2AF092370802B7ABDEF233C00 Shinobi (1989)(Virgin Games)(GB)(Side B)[RUN'CAS-'] MSX GB +5447021E8794287FDBA1B2C1544B7D66 Ship (1989)(Eurosoft)(NL)(ES)[BLOAD'CAS-',R] MSX ES +86513BAE435AFFDB650332E6F3768C12 Shnax (1985)(Kuma Computers)(GB)[RUN'CAS-',R][Martos] MSX GB +2A3EEA63FA5C7EE735C33F5F676EE375 Shup - Trebol (1986)(Mind Games Espana)(ES)[BLOAD'CAS-',R] MSX ES +81420579EE53DCB5D02343687399101E Silent Shadow (1988)(Topo Soft)[RUN'CAS-'] MSX +4F2B38A27088C67C33CB3513F4B6F88C Silfi (1988)(Iber Soft)(ES)[copy from Elidon][RUN'CAS-'] MSX ES +285641455B3363473ADADB38CB8BFAEB Simulador Profesional de Tenis (1990)(Dinamic Software)(ES)(en)[English edition][RUN'CAS-'] MSX en ES +CB5ADD6F4D767862FB101438E5252B92 Sir Fred (1986)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +E03E324DD6E6D62EB41FCDB219047666 Sirwood (1990)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +D9F1C9AAB0234F903BCD0D9B082B0792 Sirwood (1990)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R][Martos] MSX ES +C3D3740C02873EC259FB42F67706F5FD Sirwood (1990)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +238DA03D9B7184E068311CBB68BF57E3 Sirwood (1990)(Opera Soft)(ES)(Side C)[BLOAD'CAS-',R] MSX ES +262785501441C4EA5C52591BB67A1E0C Sirwood (1990)(Opera Soft)(ES)(Side D)[BLOAD'CAS-',R] MSX ES +16DF35579D62F1D2F786E66F7FBF95AD Sito Pons 500cc Grand Prix (1990)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +FEF4D4B6E52EE1A9081E32D4F94BF91E Skate Dragon (1986)(Idealogic)(ES)[BLOAD'CAS-',R] MSX ES +1F29F98CE5F9089994A3EEEFA8572338 Skate Dragon (1986)(Idealogic)(ES)[BLOAD'CAS-',R][Martos] MSX ES +1F18A9AB2BD00F26BF286E06E07F6944 Skooter (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +07EFBB87BE8AB43C61472F9134B622DD Skramble (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +95AE4FA8D45173985B7DEAC20D11C0E0 Skull Exilon (1988)(Iber Soft)(ES)[aka Safari X][RUN'CAS-'] MSX ES +07AC269862052947BC769C7C4F1CD25D Sky Diver (1984)(Hudson Soft - Japanese Softbank)(JP)(en)[BLOAD'CAS-',R][Martos] MSX en JP +31A93C01FDB7633CB0F00F8D931F4474 Sky Vision (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +3A616F9468F5D371F8E75E6BC28DEDD9 Sky War (1988)(OMK Software)(ES)[RUN'CAS-'] MSX ES +072D07119271E96A0D6F2DF080D003B7 Skyhawk (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +F69AF439DC026E85A1338CD3C75850B2 Slapshot (1985)(Anirog Software)[BLOAD'CAS-',R] MSX +ACDC24D6EAAACDDF7B87B4B741E8D166 Smack Wacker (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +4CD625746F6B8C66D2046099F149808D Smaily (1990)(Zigurat Software)(ES)[RUN'CAS-'][Martos] MSX ES +61D73F31F4DE9D139239AEB169141A9E Smash (1984)(Spectravideo)(GB)[CLOAD + RUN] MSX GB +9B7355717119027EEEC87D953236C310 Snake It (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +009F52AC67DA49F0B1711F98557D72A4 Snowman, The (1984)(Quicksilva)(GB)[BLOAD'CAS-',R] MSX GB +53A6DE2CBE0995411354914C26C35027 Sol Negro (1989)(Opera Soft)(ES)(Side A)[a][BLOAD'CAS-',R] MSX ES +6A559096B7C67DA9CA85916C1A0B55B1 Sol Negro (1989)(Opera Soft)(ES)(Side A)[BLOAD'CAS-',R] MSX ES +204E2019A0A1EFB48D1505CAA498B96D Sol Negro (1989)(Opera Soft)(ES)(Side B)[a][BLOAD'CAS-',R] MSX ES +5778DAAE673266496DF968189449C4A2 Sol Negro (1989)(Opera Soft)(ES)(Side B)[a2][BLOAD'CAS-',R] MSX ES +FA538F603AAF9F05056A01A056794654 Sol Negro (1989)(Opera Soft)(ES)(Side B)[BLOAD'CAS-',R] MSX ES +ED6E8419E31D22DA003FFB529F2FD0A2 Soldier of Light (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +78A92ADB5C3AAA53AE1494A277A392A7 Solo (1989)(Opera Soft)(ES)[gunstick][BLOAD'CAS-',R] MSX ES +D9CCE35E1CFAECFC0EE4B39878EE8B93 Sootland (1988)(Zafiro Software Division)(ES)(Side A)[RUN'CAS-'] MSX ES +AD2CDD95375A4E473E02861407B5DE2E Sootland (1988)(Zafiro Software Division)(ES)(Side B)[RUN'CAS-'] MSX ES +2FC36C8BA7832D04E6A8A675CAF05BF9 Sorcery (1985)(Virgin Games)(GB)[a][RUN'CAS-'] MSX GB +013301C12ACECD1E6AF202FA53FE2E32 Sorcery (1985)(Virgin Games)(GB)[RUN'CAS-'] MSX GB +916CA40C819CD0D082C542D533DAA42E Soul of a Robot (1987)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +A29796146F9689571E708B2159993550 Soviet (1990)(Opera Soft)(Side A)[BLOAD'CAS-',R] MSX +5E0735DD4836C9BCEFD462645FA51565 Soviet (1990)(Opera Soft)(Side B)[BLOAD'CAS-',R] MSX +3A28E1DFAE19D8529C6D12D6AB9F3A27 Space Busters (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +73CF08E17E9B013EFCE2BE7872EC9AC7 Space Busters (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +0F8A4C61E6FB5F0A3B01ED89A26448BB Space Rescue (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +61C27BCA78FB87E2A9E5E0A2E07D9EEC Space Rescue (1988)(Eurosoft)(NL)[a2][RUN'CAS-'] MSX NL +01EE35AAAD061E0998EFA7E76F1C5D49 Space Rescue (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +3A8B6BD4EAA3D2338A6976C6C28503A5 Space Smugglers (1989)(MHT Ingenieros)(ES)[gunstick][RUN'CAS-'] MSX ES +A0020ED4888D73198698F2A3B1C2A755 Space Walk (1985)(Mastertronic)(GB)[BLOAD'CAS-',R] MSX GB +DE60A285565ED86C248663255425FD5A Spartan X (1985)(Pony Canyon)(JP)[CLOAD + RUN] MSX JP +5B18C16FFA83A507F422DA46A1B3E812 Special Operations (1985)(MC Lothlorien)[a][RUN'CAS-'] MSX +5BB5B37AEEF6850FF587859FFF269C02 Special Operations (1985)(MC Lothlorien)[RUN'CAS-'] MSX +F93E6D9E22CE525ACC77ABD392CF6CB8 Speed King (1986)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +5DA9A6E62FCE56FB8D51CE32B49ACFE3 Speed King (1986)(Mastertronic)(GB)[a2][RUN'CAS-'] MSX GB +5BC7FD1DE9AAB105670986087B45F1AC Speed King (1986)(Mastertronic)(GB)[RUN'CAS-'][Martos] MSX GB +747D1814D68A71E6ED5AB8A24E1C5925 Speedboat Racer (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +6FC4EF1D8EDA872707B50C3AA90EABB6 Spirits (1987)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +34E182D261C766854E8AC7D0D0EE0688 Spitfire '40 (1986)(Mirrorsoft)(GB)[RUN'CAS-'] MSX GB +46DC1FC295FD4E072AE5EA05051832B3 Splash (1986)(Mind Games Espana)(ES)[RUN'CAS-'] MSX ES +185819F2F3D5A26EA666F2E047756662 Spy Story (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +D18C486E03D3BA3951490B1F25F2FECE Spy Story (1986)(Aackosoft)(NL)[RUN'CAS-'][Martos] MSX NL +FD2BD9E34069AF132F258271820769D7 Spy vs Spy II - The Island Caper (1987)(Databyte)[a][RUN'CAS-'] MSX +09CC3222BB4A4A85CF04E40F4B27B0AB Spy vs Spy II - The Island Caper (1987)(Databyte)[RUN'CAS-'] MSX +68CE7584E0BEEBDA024E0D6A7AF400BA Star Bowls (1991)(Zigurat Software)(ES)[RUN'CAS-'] MSX ES +5E3688F8FA0381F33462970B37339F7A Star Fighter (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +9DC99163BF441A9E20AA374EC456FA4C Star Runner (1986)(Manhattan Transfer)(ES)[a][RUN'CAS-'] MSX ES +C3F2D5E07A9F2095AB0647086F583025 Star Runner (1986)(Manhattan Transfer)(ES)[RUN'CAS-'] MSX ES +7D25AB7F7D3BE823CCB621B497488CA9 Star Wars (1986)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +8A3864CC6213C01FBDE4650F47272EFE Star Wars (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +C4A16B942A254897AA5556D5A9924A7F Starbuggy (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +7801EB7617047236B75586CD7B4DFB5E Starbyte (1987)(Mister Chip)(ES)[RUN'CAS-'] MSX ES +CF783F1111680B52E2F0E3B6864C4825 Stardust (1987)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +D906AABBC6A5898D5D904E8D9B3B38DA Starquake (1986)(Bubble Bus Software)(GB)[a][RUN'CAS-'] MSX GB +DE58253D5CD80BF8F21543FD01D2E1CE Starquake (1986)(Bubble Bus Software)(GB)[RUN'CAS-'] MSX GB +98362C5A80A4A33EE2ADE7B4AD5063C3 Steve Davis Snooker (1985)(CDS Microsystems)(GB)[RUN'CAS-'] MSX GB +A857534AD036A725673C06CDB9EDCA7B Stop Ball (1987)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +EDD90187A5A6BB839EFBBA87A8FB3010 Storm - Una's Lair (1986)(Mastertronic)(GB)[a][RUN'CAS-'] MSX GB +1432061A1425BB9FFEC3F17A76C6F949 Storm - Una's Lair (1986)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +5CFEC1029D482DBCFB5EFF62B8A159E1 Stormbringer (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +48C880281893CA3B443ECCA6EE5CFF9F Streaker (1987)(Bulldog)(GB)[RUN'CAS-'] MSX GB +53BD817A6B7D97D316AAD9DF3F53177C Strip Poker II+ (1988)(Anco Software)(GB)(Side A)[CLOAD + RUN] MSX GB +535149E5BB733DF42E6016D105AEDA6A Strip Poker II+ (1988)(Anco Software)(GB)(Side B)[CLOAD + RUN] MSX GB +9FBA3637C7F6B93129294BB0EA97384F Strip Poker II+ (1988)(Anco Software)(GB)[CLOAD + RUN] MSX GB +F859416DC23FF2EEDEEB8CDED79DE031 Super Chess (1984)(Kuma Computers)(GB)[a][BLOAD'CAS-',R] MSX GB +7B04E5832EAC7D212E2A1EEB57CD6008 Super Chess (1984)(Kuma Computers)(GB)[BLOAD'CAS-',R] MSX GB +5E6AFE1A15E7CAC0026E813B3AED8C5D Super Cross Force (1983)(Spectravideo)(GB)[BLOAD'CAS-',R][Martos] MSX GB +970B74E1CF6A2E87DD1A4D2F2A334DE1 Superbowl (1985)(Budgie Budget Software)[RUN'CAS-'] MSX +57B2CE77B2C73FEC93C827FF65F2D542 Survivor (1987)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +02EF50FDD9795CBF1CB601F88552623E Survivors (1986)(Atlantis Software)(GB)[RUN'CAS-'] MSX GB +EA3DA08AE41AE5A66C3380920BBE1B64 SWIV (1991)(Dro Soft)(ES)(Side A)[a][needs 128k][RUN'CAS-'] MSX ES +FDD3F5D1A5A1875745D539BD0E215AF7 SWIV (1991)(Dro Soft)(ES)(Side A)[needs 128k][RUN'CAS-'] MSX ES +78961CE36E6E64D7D6F85B02D002071C SWIV (1991)(Dro Soft)(ES)(Side B)[needs 128k][RUN'CAS-'] MSX ES +9FE6FF077B040CE8DD2CD3EDAF320FB8 Tai-Pan (1987)(Ocean Software)(GB)(Side A)[RUN'CAS-'] MSX GB +D30CB997851A563375DFD23D23C41749 Tai-Pan (1987)(Ocean Software)(GB)(Side B)[RUN'CAS-'] MSX GB +91CE7E44083ED98E9585C6C042FD6F2A Tank Battalion (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +96EC951B755481AA5DF219265C8CEE8F Target Plus (1988)(Dinamic Software)(ES)[gunstick][RUN'CAS-'] MSX ES +89A2005307DED59499AFD432C83B59D7 Tawara (1984)(ASCII)(JP)[BLOAD'CAS-',R] MSX JP +781AD54ECBBFC19C721D6AABC1643169 Teenage Mutant Hero Turtles (1990)(MCM Software)[passworded][RUN'CAS-'] MSX +BC2A5FF0DAD9609945469D002E4B72C2 Teenage Mutant Hero Turtles (1990)(MCM Software)[RUN'CAS-'] MSX +3CF2540C8BDC38F9390CC2E8C0FAF5AC Temptations (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +7DCB673CC211D114ABBBE4A700A736D0 Tension (1988)(System 4)(ES)[RUN'CAS-'] MSX ES +B9F2F7E12C58B1E553F2858FDAAF4D46 Terminus - Prison Planet (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'][Martos] MSX GB +0710B4B69516DF98AD943AED2F28BA6D Terramex (1988)(Grandslam Entertainments)(GB)[BLOAD'CAS-',R] MSX GB +4A4208AF64622A864095AC627CB0E6A9 Terrorpods (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +1CC05D8E5F823DA45F1BBF73D1D3FB67 Test Drive II - The Duel (1989)(Dro Soft)(ES)[a][RUN'CAS-'] MSX ES +8AB763F8BFCF995F2C44752D1CE4744C Test Drive II - The Duel (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +053D1913B202EEF2C5103C4CE13E701D Tetris (1987)(Mirrorsoft)(GB)[RUN'CAS-'] MSX GB +518EAEB3D7960816B562E9611926C560 Thexder (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +1A23BAE41822B90F76DE8C436041125D Thing Bounces Back (1987)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +1803C0375438B96AA76F62D9F55AF7C5 Thor (1988)(Proein Soft Line)(ES)[RUN'CAS-'] MSX ES +A3641C5D4279C0C8B2DD5185AD4CC4FA Thunder Blade (1988)(US Gold)(GB)(Side A)[RUN'CAS-'] MSX GB +B306F955EEA8AB6BF0F509397C904561 Thunder Blade (1988)(US Gold)(GB)(Side B)[RUN'CAS-'] MSX GB +B3C1719393ABCE439A49695F37D13AB9 Thunderbirds (1989)(Grandslam Entertainments)(GB)(Tape 1 of 2 Side A)[BLOAD'CAS-',R][Martos] MSX GB +1100FA2335D27477872A0878CAEE5415 Thunderbirds (1989)(Grandslam Entertainments)(GB)(Tape 1 of 2 Side B)[BLOAD'CAS-',R][Martos] MSX GB +F0130598CEFF1F9D89FAFE6B1D748B2F Thunderbirds (1989)(Grandslam Entertainments)(GB)(Tape 2 of 2 Side A)[BLOAD'CAS-',R][Martos] MSX GB +2E32B749F25E68FB4AA6C92B671C0397 Thunderbirds (1989)(Grandslam Entertainments)(GB)(Tape 2 of 2 Side B)[BLOAD'CAS-',R][Martos] MSX GB +739684EF3696DA8D929E80C12C67954A Time and Magik II - Red Moon (1985)(Level 9 Computing)(GB)[RUN'CAS-'] MSX GB +930A63500F5BE124C3886EBFB70D2E26 Time Bandits (1984)(PSS)(GB)[a][BLOAD'CAS-',R] MSX GB +C84AA6EAD00CA98066EC7AF1F692862E Time Bandits (1984)(PSS)(GB)[BLOAD'CAS-',R] MSX GB +99C284F0659D8103E528E02371A0070C Time Bomb (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +A757EFA4554FAD52EDE7912B2AC323B5 Time Curb (1986)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +4C03C34113D4FBE954342905B525F8B4 Time Curb (1986)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +0C6F0CBA2D97F0B6317749CF8B2650AC Time Out (1988)(Zafiro Software Division)(ES)[RUN'CAS-'] MSX ES +D9E4F9EE6EAD3BE78A8ACDB272C592E8 Time Rider (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +B1021FCA4FA06784B50CAD0FBA5853CD Time Rider (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +DEF8B0628BB16F6EC8C5DD3E3ED194EA Time Scanner (1989)(Activision)(US)[BLOAD'CAS-',R] MSX US +D3A4CA5E9DC33C02FBC4C0D3F9248241 Time Trax (1986)(Bug-Byte Software)(GB)[a][RUN'CAS-'] MSX GB +DAE6AAEF8F9E5FDCF993ABE53D40A65E Time Trax (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +C671DC3F14088927DF0F736D67860C05 Titanic (1988)(Topo Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +21D8ED9F584F768BF058407653139090 Titanic (1988)(Topo Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +B014B892EB5832C51CA1D8130BBF33B0 Toi Acid Game (1989)(Iber Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +1195656BE448C67EB1BF7D099B88B5E8 Toi Acid Game (1989)(Iber Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +FBB1FE50DE81E7A37017640FE8B7C446 Toi Acid Game (1989)(Iber Soft)(ES)(Side C)[RUN'CAS-'] MSX ES +09FD43F9818D707A64B6883C424CCB84 Toi Acid Game (1989)(Iber Soft)(ES)(Side D)[RUN'CAS-'] MSX ES +2CE3B5AF66C229105C5D29C09BA871D2 Tokyo Gang (1990)(G.LL. Software)(ES)[RUN'CAS-'] MSX ES +E1FEA73028FFF50020FDC698ED1BCF2D Tokyo Nampa Street (1986)(Enix)(JP)(Tape 1 of 2 Side A)[CLOAD][JPconfig][Martos] MSX JP +17D801EC64E72A641126CB9DF3516AB8 Tokyo Nampa Street (1986)(Enix)(JP)(Tape 1 of 2 Side B)[CLOAD][JPconfig][Martos] MSX JP +3579B3021473FAAE1F918861EBBE23FC Tokyo Nampa Street (1986)(Enix)(JP)(Tape 2 of 2 Side A)[CLOAD][JPconfig][Martos] MSX JP +56A8077F27DABCC279766654DE70F75F Tokyo Nampa Street (1986)(Enix)(JP)(Tape 2 of 2 Side B)[CLOAD][JPconfig][Martos] MSX JP +88D673667F25BFDE6B10FE2D5EE2BB69 Tom & Jerry (1989)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +D9604DB2C91616E323BDC24C6FF4D2BB Toobin' (1989)(Domark)(GB)[a][BLOAD'CAS-',R] MSX GB +5FEA18059D4CA6C0EB70F3AAEE3919D6 Toobin' (1989)(Domark)(GB)[BLOAD'CAS-',R] MSX GB +4507FCFDC1A86DC041063A35D72C8214 Top Roller (19xx)(Eaglesoft)(NL)(en)[RUN'CAS-'][Martos] MSX en NL +46CCE81A51FB7808B731C653ABC619EB Tour 91 (1991)(Topo Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +A8041700C37FDA2FC925F7F73B59DFAE Tour 91 (1991)(Topo Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +DAB44AC7123BD1E1F1F3354293D62B3B Trailblazer (1986)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +29E6AD62628F957E1749E9D53E95115A Trailblazer (1986)(Gremlin Graphics Software)(GB)[RUN'CAS-'] MSX GB +AC4144D706D861445F0217A388057181 Trantor - The Last Stormtrooper (1987)(Go!)[a][RUN'CAS-'] MSX +33A163E935AC5FCA63BA53A9BBBAB3BA Trantor - The Last Stormtrooper (1987)(Go!)[a2][RUN'CAS-'] MSX +36B2B2F491BE908273416FD104F2ED76 Trantor - The Last Stormtrooper (1987)(Go!)[RUN'CAS-'] MSX +D164726A5D276DB7BC9E0538D69EBC1C Tras el Unicornio (1987)(Azimut Soft)(ES)[BLOAD'CAS-',R][Martos] MSX ES +8F47074A6C0A94ED2E0C1D09BB775E2D Tres Luces de Glaurung, Las (1986)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +384228F86D9F3E086B1E0464A156E0F4 Trick Boy. Pinball (1984)(T&E Soft)(JP)[BLOAD'CAS-',R] MSX JP +BE9128B4E048E997BF41935756113571 Triple Comando (1988)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +08BB405B45449449AE85FDFB468626E3 Triple Comando (1988)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +DDFE3D690FF9C9C048A40AA1593E214A Tritorn (1986)(Xain)(JP)[CLOAD + RUN] MSX JP +2E00A90D2C462AE700D9C5E4B29262A0 TT Racer (1987)(Methodic Solutions)(NL)[a][RUN'CAS-'] MSX NL +BE7858A1B5B3B1CDFC0307A360EB61AA TT Racer (1987)(Methodic Solutions)(NL)[RUN'CAS-'] MSX NL +3804255F06DD21A5CFC4BDBA1E53F9B8 Tuareg (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +573A871320D97A5328E46C688E86D3D0 Tunel del tiempo, El (1986)(Mind Games Espana)(ES)[LOAD'CAS-',R][Martos] MSX ES +020271E15A4CB72030A9780559ACB37E Turbo Girl (1988)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +6020E91B450FBE52DD7C7EBF9C00322C Turbo Girl (1988)(Dinamic Software)(ES)[a2][RUN'CAS-'] MSX ES +901F8F34EDA3D733E48F6947F70018AD Turbo Girl (1988)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +FEA1D15AD637B6935FBFFDC66443F6C9 Turmoil (1986)(Bug-Byte Software)(GB)[a][RUN'CAS-'] MSX GB +35C953D7625F7C181843CECA53B9DBCC Turmoil (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +274A074C2924D32237CF35A4FCFDF34F U-Boot (1985)(Manhattan Transfer)(ES)[a][CLOAD + RUN] MSX ES +07BCA68174706FF2F1596695569AE7F6 U-Boot (1985)(Manhattan Transfer)(ES)[CLOAD + RUN] MSX ES +82E7CEE21F99F2824081AC3FA6F18542 Uchi Mata (1987)(Martech Games)(GB)[CLOAD + RUN] MSX GB +172B280434A362664F61B0D2DEE491B2 Uchi Mata (1987)(Martech Games)(GB)[RUN'CAS-'] MSX GB +A0A6AC0BA439D2F11999021E628BA66C Ulises (1989)(Opera Soft)[BLOAD'CAS-',R] MSX +95CCF9CB84694E4F724CB7D97D787733 Ultra Chess (1985)(Aackosoft)(NL)[a][RUN'CAS-'] MSX NL +1A25E3ED2B34BF40A85E84777EB2B1DC Ultra Chess (1985)(Aackosoft)(NL)[RUN'CAS-'] MSX NL +B94A923D91C2A2583898221218907E35 Underground (1988)(System 4)(ES)[RUN'CAS-'] MSX ES +1469B2D2BF1B2CCC8EF2F8884AAE99D6 Untouchables, The (1989)(Erbe Software)(ES)(Side A)[a][RUN'CAS-'] MSX ES +6F0B5E5A203FF8FBF5364005BF5E6C8F Untouchables, The (1989)(Erbe Software)(ES)(Side A)[RUN'CAS-'] MSX ES +50FB84CE7A6BC9D223E6004AA0A01E73 Untouchables, The (1989)(Erbe Software)(ES)(Side B)[RUN'CAS-'] MSX ES +CAA85242EBF3FE9C045D75EB4C482FB9 Vacuumania (1984)(PSS)(GB)[a][BLOAD'CAS-',R] MSX GB +3952EBD19BED7E80F52BBB801A1380C7 Vacuumania (1984)(PSS)(GB)[BLOAD'CAS-',R] MSX GB +797C00055DFC0319F1090FA1B29B266D Valkyr (1985)(Gremlin Graphics Software)(GB)[BLOAD'CAS-',R] MSX GB +686159D487A7E6E7CB9C5F23011F6A9D Vampire (1987)(Manhattan Transfer)(ES)[RUN'CAS-'] MSX ES +1684AA8BFE79E136FFF0D75069F90D2C Vampire's Empire (1988)(Dro Soft)(ES)[a][RUN'CAS-'] MSX ES +73066DA43EEBF83C14F36E5F10EFE0A6 Vampire's Empire (1988)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +219C71C5840F54D44AF08D78D928DE99 Venganza de Johny Comomolo, La (1986)(Dro Soft)(ES)[a][RUN'CAS-'][Martos] MSX ES +B6F7347B730727A58EF455513BF18C0D Venganza de Johny Comomolo, La (1986)(Dro Soft)(ES)[a2][RUN'CAS-'][Martos] MSX ES +AF19FA8169721A1B947F563A8D2A2ED9 Venganza de Johny Comomolo, La (1986)(Dro Soft)(ES)[RUN'CAS-'][Martos] MSX ES +D377AA78D9DC0CB20D33DD8857BAF0E2 Vera Cruz Affair, The (1986)(Infogrames)(FR)(fr)[BLOAD'CAS-',R][Martos] MSX fr FR +7FF52598262B4B41929A92E9A4A572F8 Vestron (1986)(Players Software)(GB)[a][BLOAD'CAS-',R] MSX GB +3B61D74AF9E025534EE751010A8777B6 Vestron (1986)(Players Software)(GB)[BLOAD'CAS-',R] MSX GB +0BCF2FA1161BEAEEC726FFE0BB87813B Viaje al Centro de la Tierra (1989)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +5195223E7D488BA302D16734495FAE2C Vicious Viper (1985)(Sanyo)(JP)(en)[a][CLOAD] MSX en JP +6484548B715341C0E4D05080D3ACFA21 Vicious Viper (1985)(Sanyo)(JP)(en)[a2][CLOAD][no Sanyo title screen] MSX en JP +EDF9E9B2F2EEF9C15912262F65801C76 Vicious Viper (1985)(Sanyo)(JP)(en)[CLOAD] MSX en JP +C5693ACD685A59644CE88C9F28166083 Video Poker (1986)(Mastertronic)(GB)[RUN'CAS-'] MSX GB +07466E345B99BBE2D339F16DBB24F18A Visitor - Bazar Catalunya (1988)(Mind Games Espana)(ES)[RUN'CAS-'][Martos] MSX ES +C62BEBEE14EF0EFC5DB5162F80758558 Voidrunner (1987)(Mastertronic Added Dimension)(GB)[RUN'CAS-'] MSX GB +865EEACABFF835B6828C820F2D3EA2E9 Volguard (1985)(dB-Soft)(JP)[RUN'CAS-'] MSX JP +531C7A658CA830753C874706051B7BF9 Vortex Raider (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +C28AEB9A4351A2368ADB50A8AD44EF1C Vortex Raider (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +3DBF978C59A1886DA4FF4F33CC194482 Wall, The (1987)(Erbe Software)(ES)[RUN'CAS-'] MSX ES +CD476C8454F3BA0DB6AB7C3D9833D484 Wallball (19xx)(Tynesoft)(GB)[a][BLOAD'CAS-',R] MSX GB +0CBFBD19961A3FCDF66B874CD4330759 Wallball (19xx)(Tynesoft)(GB)[BLOAD'CAS-',R] MSX GB +277A97A4C1074AB0D071BE79A0183E9C Wamp Cola (1988)(Iber Soft)(ES)[aka Dracula][RUN'CAS-'] MSX ES +33D6E68CCA16E4ABF50C4A40EF17E36E War Chess (1986)(Idealogic)(ES)[RUN'CAS-'] MSX ES +533E31FBC552617E3CB673FA2E2BCB62 War in Middle Earth (1989)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +23E93D1EFBFA08FD01837E9B5B5A3D61 Warp & Warp (1984)(Bug-Byte Software)(GB)[BLOAD'CAS-',R] MSX GB +0807E1FACD6A64C57568A81D2CEFF8F9 Way of the Tiger, The (1986)(Gremlin Graphics Software)(GB)(Tape 1 of 2 Side A)[BLOAD'CAS-',R][Martos] MSX GB +EDDF20D5106A8152E33C53F809BC8A75 Way of the Tiger, The (1986)(Gremlin Graphics Software)(GB)(Tape 1 of 2 Side B)[Martos] MSX GB +91E0AAF16FBE9178819D23D75AF340BD Way of the Tiger, The (1986)(Gremlin Graphics Software)(GB)(Tape 2 of 2 Side A)[Martos] MSX GB +E02469CAC8B132D0115E3EFC63B39514 Way of the Tiger, The (1986)(Gremlin Graphics Software)(GB)(Tape 2 of 2 Side B)[Martos] MSX GB +568A1D03BA9CFBED83D0EADA0FCB77B2 WEC Le Mans (1988)(Imagine Software)(GB)[a][RUN'CAS-'] MSX GB +97FE4115293F06E3BC9E7339D0958433 WEC Le Mans (1988)(Imagine Software)(GB)[RUN'CAS-'] MSX GB +9B0146C47FED38FC0F5053583A9BBF2D Wells & Fargo (1988)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +941F7B1F9A5637E028DF5B026E9F42D0 West Bank (1989)(Dinamic Software)(ES)[a][RUN'CAS-'] MSX ES +BF81F9836F2DE0DEBEDC408FAAB1A40D West Bank (1989)(Dinamic Software)(ES)[RUN'CAS-'] MSX ES +E523D8CC3624406D0FF09928E0F35A5A Who Dares Wins II (1986)(Alligata Software)(GB)[RUN'CAS-'] MSX GB +0670D39B5E8FB3DBABA07AB5AEAEAB77 Whopper Chase (1987)(Erbe Software)(ES)[RUN'CAS-'][Martos] MSX ES +F1DF9C51F7527089D9F088FD4E49DD59 Wing Man (1985)(Enix)(JP)(Tape 1 of 2 Side A)[CLOAD + RUN] MSX JP +65B455A5A407B0B9F66F1158A7123163 Wing Man (1985)(Enix)(JP)(Tape 1 of 2 Side B)[CLOAD + RUN] MSX JP +54A1493041E59398B551B0BFC5BB7D50 Wing Man (1985)(Enix)(JP)(Tape 2 of 2 Side A)[CLOAD + RUN] MSX JP +F8DF05B3AB8BD8918A39613B16F0E3C8 Wing Man (1985)(Enix)(JP)(Tape 2 of 2 Side B)[CLOAD + RUN] MSX JP +39CBD0F525484D5E6DE41FE17A8FA7DC Winter Events (1987)(Anco Software)(GB)(Side B)[Martos] MSX GB +1E39812195B45731CE7110019EDADAF9 Winter Events (1987)(Anco Software)(GB)[a][CLOAD + RUN] MSX GB +54AD75060D8D7B96D1FE8198E1A833DF Winter Events (1987)(Anco Software)(GB)[CLOAD] MSX GB +DAFAE4103CC091D3A6D68ED7B6FE495B Winter Games (1986)(US Gold)(GB)(Side A)[a][BLOAD'CAS-',R] MSX GB +CD7CD620BA9C5CA852A208D07CDBA94F Winter Games (1986)(US Gold)(GB)(Side A)[BLOAD'CAS-',R] MSX GB +D6687E4BCC184D8BDC1090767ACE6871 Winter Games (1986)(US Gold)(GB)(Side B)[BLOAD'CAS-',R] MSX GB +21697212BA9FD6C0C81637D1BAF01734 Winter Olympics (1986)(Tynesoft)(GB)(Side A)[RUN'CAS-'] MSX GB +859A203E1B53DAF6579B002A5FA1A443 Winter Olympics (1986)(Tynesoft)(GB)(Side B)[RUN'CAS-'] MSX GB +EC6930D436D45B05C7AA00626D8A26B8 Winterhawk (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +EE118B8A767C13A3541DC255916A8713 Winterhawk (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +490F24D9A4319881BB15118646430DB0 Wizard's Lair (1986)(Bubble Bus Software)(GB)(M3)[a][CLOAD + RUN] MSX M3 GB +6204F1FF97322826608BF198CB39B541 Wizard's Lair (1986)(Bubble Bus Software)(GB)(M3)[CLOAD + RUN] MSX M3 GB +203A06A722E8406E05728D624CA45628 World Cup Soccer (1986)(Eaglesoft)(NL)[a][RUN'CAS-'] MSX NL +BFB0262B62114ECEEE8E206C23B03BDF World Cup Soccer (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +CDACE181E4066350460BF2AA533B974C World Games (1987)(US Gold)(GB)(Side A)[RUN'CAS-'] MSX GB +B6059F36850C5DC51B166DEFC8506527 World Games (1987)(US Gold)(GB)(Side B)[RUN'CAS-'] MSX GB +2B155C0D59E8DB45E55D2ABA8DFFB206 Xenon (1988)(Dro Soft)(ES)[RUN'CAS-'] MSX ES +FF2DE6460BFC8C72D26EFA7191205EE3 Xybots (1989)(Domark)(GB)[a][BLOAD'CAS-',R] MSX GB +EEDE69CF2AC6929D103BEC68387C0D55 Xybots (1989)(Domark)(GB)[BLOAD'CAS-',R] MSX GB +F7445322B7EBF29F8EAC703EAEC39F01 Xyxolog. Xyzolog (1985)(Electric Software)(GB)[a][BLOAD'CAS-',R] MSX GB +DA567B9B149E7CCB54ABEB48BF345120 Xyxolog. Xyzolog (1985)(Electric Software)(GB)[b2][BLOAD'CAS-',R] MSX GB +C01D25B6AFA6B7083759A1927CE77E7B Xyxolog. Xyzolog (1985)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +274733D4FD4FBF642E40556094FA6139 Yo Calculo (1986)(Anaya Multimedia)(ES)[RUN'CAS-'] MSX ES +E5F99736FEA8FA89C353D680B693CBE9 Zakil Wood (1985)(Mr. Micro)[BLOAD'CAS-',R] MSX +0E05D60ED4C395B6304B88387A484A03 Zanac (1987)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +B98397C5A59DB8E4DAF4A97D812BB9E9 Zarth (1985)(Enix)(JP)(Side A)[CLOAD + RUN] MSX JP +1F3CB3A9923373AF698A520F435BA7DF Zarth (1985)(Enix)(JP)(Side B)[CLOAD + RUN] MSX JP +55375254D434D72F65C3720E5920F418 Zaxxon (1985)(Electric Software)(GB)[BLOAD'CAS-',R] MSX GB +87E796AA41176D7B3B49A3D4186EF48D Zexas (1984)(dB-Soft)(JP)[CLOAD + RUN] MSX JP +B1A662D241BEB2E4FF750BB31D8E3D17 Zipi y Zape (1989)(Dro Soft)(ES)(Side A)[RUN'CAS-'] MSX ES +99C233838597185A58512D8C07897973 Zipi y Zape (1989)(Dro Soft)(ES)(Side B)[RUN'CAS-'] MSX ES +84C9C49AA79550E7C84A562B996E6108 Zoids - The Battle Begins (1985)(Martech Games)(GB)[RUN'CAS-'] MSX GB +6F2BC494BA7C5CB8F622F71263CBEDAC Zona 0 (1991)(Topo Soft)(ES)[RUN'CAS-'] MSX ES +B5B16635C6A6EA21418E0A234C12FF42 Zond (1988)(Iber Soft)(ES)[aka Zexas][RUN'CAS-'] MSX ES +A78D23D0AE5BFC4E2FF2750477425DF5 Zoot (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Magazines - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:56:56 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +4C471B755071F0E29A487FF1152022A0 007 Agente Especial (1985)(Monser)(ES)[RUN'CAS-'] MSX ES +0B3EE367229F50852902572DB3FE5F9B Almanaque (1986)(Load 'n' Run)(ES)[RUN'CAS-'] MSX ES +AC8FC69BD549524659DE3F63ED31BC7F Astronauta (1986)(Load 'n' Run)(ES)[aka Space Walk][RUN'CAS-'] MSX ES +CD2F24F928B80A1D2BAEECD5338D294E Batalla Espacial (19xx)(Grupo de Trabajo Software)(ES)[aka Valkyr][RUN'CAS-'] MSX ES +CD9DC092483E8D9A4079843E4D366B87 Blocker (19xx)(Grupo de Trabajo Software)(ES)[CLOAD + RUN] MSX ES +BDDEBBB51D7D0742A7243CDEC0B4E4B9 Bumpy (19xx)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +FE4873A7B510F467B3B04ADCE918874F Caldero Magico, El (1986)(Grupo de Trabajo Software)(ES)[CLOAD + RUN] MSX ES +C7E7462806CA47735A0E23E826B66663 Casa Maldita, La (1986)(Load 'n' Run)(ES)[RUN'CAS-'] MSX ES +4AD8B74F168640E630AAA265C581B427 Caza (1986)(Load 'n' Run)(ES)[RUN'CAS-'] MSX ES +FDE6ED706122F32D9ED4810B001EBB83 Cubik. Cubo de Rubik (1985)(Monser)(ES)[RUN'CAS-'] MSX ES +B6ECE4EA62BD934E9F613369BC81BE1F Data MSX - Issue 02 - 01 Sumario (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +F80BD6A71D3C6E118FD53ADA62D9EE99 Data MSX - Issue 02 - 02 El repartidor de palabras (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +97EF2774DA4F24112A70C34C3FE6DD88 Data MSX - Issue 02 - 03 Halcones (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +C175D1ABFB1595B2B63E4140A0DC1A1B Data MSX - Issue 02 - 04 Space Trek (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +0F35C17C66E68093F779DEAC0B974664 Data MSX - Issue 02 - 05 Reflejos (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +55F49E36EB5603E7BAD251F35F27C0D8 Data MSX - Issue 02 - 06 Fichero personal (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +43DDA362D3C7FE8C19802A132F7E0916 Data MSX - Issue 13 - 01 Sumario (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +FF3ED0F6A8718AF8A9B44DEA61B1FB14 Data MSX - Issue 13 - 02 Gamineo (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +D0CBB71988CA450539581080AC9D68AF Data MSX - Issue 13 - 03 Creation (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +B1FE87E6B9F92D02E9B2D79BAFE46C50 Data MSX - Issue 13 - 04 Destruit (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +B7E7559374A9D4E2CB6FB7EA6ECDFFD0 Data MSX - Issue 13 - 05 Jack (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +659135ABA16D7F7C2F2675E32289B5CA Data MSX - Issue 13 - 06 Utilidades 8 (19xx)(Geasa)(ES)[a][CLOAD][Martos] MSX ES +F054EF4E5979643B9A8D79718BEF3EC6 Data MSX - Issue 13 - 06 Utilidades 8 (19xx)(Geasa)(ES)[CLOAD][Martos] MSX ES +F39FD6550906C4D412E6B74D18E8A567 Dracula (1986)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +CF3FF8C789A818024175DD6D18546710 Fire Fox (19xx)(Onaki)(ES)[Konami's Sky Jaguar][Martos] MSX ES +BA61F63B105E6810DE0D25BA19B6525A Gestion Familiar (1986)(Load 'n' Run)(ES)[RUN'CAS-'] MSX ES +3FCCB2B978D2A9D98A94AAA043EC61E0 Juegue con su MSX - Issue 01 - Carr 2000 (19xx)(Grupo de Trabajo Software)(ES)[a][RUN'CAS-'] MSX ES +3E616DB033ABAB8327B18F779290ED15 Juegue con su MSX - Issue 01 - Carr 2000 (19xx)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +0F96CC91074987E80A95023FCCC94EE3 K'set - Issue 01 (1985)(Ediciones y Textos)(ES)(Side A)[RUN'CAS-'] MSX ES +7CC4710C347963799390C049FCFD6195 K'set - Issue 01 (1985)(Ediciones y Textos)(ES)(Side B)[RUN'CAS-'] MSX ES +8072C503E1EEF135E21BAA67DAF3F403 K'set - Issue 02 (1985)(Ediciones y Textos)(ES)(Side A)[RUN'CAS-'] MSX ES +C5D7F8468B3DC667F90F36FD47BBD762 K'set - Issue 02 (1985)(Ediciones y Textos)(ES)(Side B)[RUN'CAS-'] MSX ES +890B431A99C08DAC95D2C3EAF0C21FB1 Last Dungeon, The (19xx)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +045CCF3B5730588310B045A65695CC1E Load'N'Run Issue 01 - Decathlon olimpico (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +0609B3A81150C51CF410E55AE3871D2E Load'N'Run Issue 01 - Throm (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +8536CF3F1045F1300662B4318108FDDD Load'N'Run Issue 02 - 3-D (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +247CB009E1162BB89EF62066D1747329 Load'N'Run Issue 02 - Codigo Morse (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +BB55612D4100449516C5E5772B7547BA Load'N'Run Issue 02 - Formula Uno (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +EDE606162B2DEECAC36233BD4AB5BA6E Load'N'Run Issue 02 - Load'N'Run (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +DDB86F13E27FD9F13294052F2A8EF823 Load'N'Run Issue 02 - Phantasma (1985)(Inforpress - Duplison)(ES)[RUN'CAS-'][Mastertronic's Chiller][Martos] MSX ES +D7CA19AEE61E13302A1318D0C28529AF Load'N'Run Issue 03 - Bombas (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +324B498FD5657176C4F2DBC631DA6976 Load'N'Run Issue 03 - La dimension del cuadrado (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +AD64827F2948779BF93355E5E5AC073B Load'N'Run Issue 03 - La rana (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +058C9CD25D4A6BC99B414CAD9700AB70 Load'N'Run Issue 03 - Load'N'Run (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +CC26938A9035A9356EC824FD01384C68 Load'N'Run Issue 03 - Receptor de Morse (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +95B5DEDD593116D987324883EFEC1F88 Load'N'Run Issue 05 - Adivinanzas (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +402823AF5BC36049B6307B124E1723A2 Load'N'Run Issue 05 - Codificacion-decodificacion (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +04C72C39AB6ADC1AF2EDC696A4EBFD18 Load'N'Run Issue 05 - Come-cocos (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +487D6C329475D161618A7DD4721454BB Load'N'Run Issue 05 - Dia de la semana (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +8CE9DF843A00488DBF847BA99B0E6BC8 Load'N'Run Issue 05 - El muro (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +6839BF96CD9C1674D635844B648656EA Load'N'Run Issue 05 - Goloso (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +2FC4F4BE6C491AFFEB76D736F6974EA0 Load'N'Run Issue 05 - Grafico de barras (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +BC8C45D484134F6F2FE415E0C9B57178 Load'N'Run Issue 05 - Las Vegas (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +7D24FBFBC2A9E93904348BB308A9031A Load'N'Run Issue 05 - Load'N'Run (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +A5C28E54F7D144F624DD1170E50E62C7 Load'N'Run Issue 05 - Mates (1985)(Inforpress - Duplison)(ES)[RUN'CAS-'][Martos] MSX ES +24BD417B141921982C522A0EDF18F9B2 Load'N'Run Issue 05 - Rebotes (1985)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +72B74B36D546F6E2DA2C36A1715A05D1 Load'N'Run Year 02 Issue 02 - Calendario perpetuo (1986)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +8111F782594B3019C79111F41F2D786D Load'N'Run Year 02 Issue 02 - Defensa del estrecho (1986)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +0E02FF7B360490CF08E37572B45805C9 Load'N'Run Year 02 Issue 02 - El compositor (1986)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +62D0DC4F708C47F35D70C662DD23E904 Load'N'Run Year 02 Issue 02 - Mercado de divisas (1986)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +4DE33AFA84A45F5E8BF6DAE024F11F20 Load'N'Run Year 02 Issue 02 - Nasiul (1986)(Inforpress - Duplison)(ES)[RUN'CAS-'][Martos] MSX ES +1336209B449E3647C197EEB918F885C5 Load'N'Run Year 02 Issue 02 - Rally 2000 (1986)(Inforpress - Duplison)(ES)[RUN'CAS-',R][Martos] MSX ES +28E33580B01960FF6B8551FB68D79DF5 Mejor Software - Issue 01 - Guss en la Atlantida (19xx)(Creativos Editoriales)(ES)[a][CLOAD + RUN] MSX ES +630A072254921D8A5D99BE1B4548995F Mejor Software - Issue 01 - Guss en la Atlantida (19xx)(Creativos Editoriales)(ES)[CLOAD + RUN] MSX ES +49183AEA77A59354466848DAABE9E0E6 MSX Computer Magazine - Issue 06 (1986)(Elettronica 2000)(IT)[position tape + CLOAD + RUN] MSX IT +1B8F63F5A52EF7918532535F408111A0 MSX Computer Magazine - Issue 12 (1986)(Aktu)(NL)[position tape + CLOAD + RUN] MSX NL +76896580837B270D211CE27070262BB3 MSX Computer Magazine - Issue 13 (1986)(Aktu)(NL)[position tape + CLOAD + RUN] MSX NL +36018C4014149A46F600381FC4C4DADF MSX Computer Magazine - Issue 16 (1987)(Aktu)(NL)[a][BLOAD'CAS-',R] MSX NL +6B3B5C14AA3F5CD55A7F8C8DC3BB11AF MSX Computer Magazine - Issue 16 (1987)(Aktu)(NL)[BLOAD'CAS-',R] MSX NL +54249F159549F4F3B3BE5B785A1D095D MSX Computer Magazine - Issue 19 (1987)(Elettronica 2000)(IT)[position tape + RUN'CAS-'] MSX IT +F9963ABD78462AEB1B7936338A59A9FA MSX Games Vol 01 - Pinguino, El (1986)(Grupo de Trabajo Software)(ES)[BLOAD'CAS-',R] MSX ES +FEEF2DAC47D00D0328157CD4FF723E26 MSX Games Vol 02 - Bob 007 - Infiltrado (1986)(Grupo de Trabajo Software)(ES)[a][RUN'CAS-'] MSX ES +C3B605198AC292BB1BCD3268FA765A8A MSX Games Vol 02 - Bob 007 - Infiltrado (1986)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +65F9C73151E8BECF9738FF061F80A6C0 MSX Games Vol 04 - Xider (19xx)(Grupo de Trabajo Software)(ES)(Side A)[RUN'CAS-'] MSX ES +E84561AC871F717BF0981B4F1EC07A0B MSX Games Vol 04 - Xider (19xx)(Grupo de Trabajo Software)(ES)(Side B)[RUN'CAS-'] MSX ES +E556EBD7DA7AB12D1B3320B9596978BF MSX Magazine - Issue 01 (1987)(-)(IT)[position tape + CLOAD + RUN] MSX IT +4BB815617A691F9A0E6DD0C968FF817D MSX Magazine - Issue 01A - Invasore (1987)(-)(IT)[CLOAD + RUN] MSX IT +0D0A48C61AD54A0CE2C102869874FB28 MSX Magazine - Issue 01B - Evasione (1987)(-)(IT)[CLOAD + RUN] MSX IT +68541755C33BDAB3ADB48C905A517FED MSX Magazine - Issue 01C - Labirinto (1987)(-)(IT)[CLOAD + RUN] MSX IT +AE7BF97A1FDFF6B0BE3A575065A51F89 MSX Magazine - Issue 01D - Avventura nella Citta (1987)(-)(IT)[CLOAD + RUN] MSX IT +FE4FB02AEE54FB36531517EFCA48E920 MSX Magazine - Issue 01E - Archivio Software (1987)(-)(IT)[CLOAD + RUN] MSX IT +391A33CCABDBC46F07F4BC38328EB7DF MSX Soft Magazine - Issue 01 - Musica (1985)(Monser)(ES)[CLOAD + RUN] MSX ES +3BC7A02E2F1CB840E76FBE728FF412A8 MSX Soft Magazine - Issue 04 - Tragamanzanas. Apple Jam (1985)(Monser)(ES)[RUN'CAS-'] MSX ES +79343B381CE245C9B3748DFB87E1AF69 MSX Soft Magazine - Issue 05 - Ahorcado (1985)(Monser)(ES)[CLOAD + RUN] MSX ES +97FABEB262D2A8179911FA9AFF86EF2A MSX Soft Magazine - Issue 05 - Kiriki (1985)(Monser)(ES)[CLOAD + RUN] MSX ES +0935ABD2F53B85667A94598233AFC171 MSX Soft Magazine - Issue 05 - Luna 3. Alunizaje (1985)(Monser)(ES)[CLOAD + RUN] MSX ES +D7501C0A81DBC021FA4B3576761A1E3C MSX Soft Magazine - Issue 08 - Rana Sideral (1985)(Monser)(ES)[RUN'CAS-'] MSX ES +D31FCC948D4A85B58D30908E26D71195 MSX Soft Magazine - Issue 10 - F-16 (198x)(Monser)(ES)[RUN'CAS-'][Martos] MSX ES +78FDA508014571F0D639CB83547FEFB0 MSX Software - Issue 05 (1986)(Grupo de Trabajo Software)(ES)(Side A)[position tape + CLOAD + RUN] MSX ES +191B6756631A97C7EFE9AF341782508E MSX Software - Issue 05 (1986)(Grupo de Trabajo Software)(ES)(Side B)[position tape + CLOAD + RUN] MSX ES +19BAE00489F4D453D28808AAB46D290C MSX Software - Issue 10 (1986)(Grupo de Trabajo Software)(ES)(Side A)[position tape + CLOAD + RUN] MSX ES +35007159E578091E7D5FAD733496A7E9 MSX Software - Issue 10 (1986)(Grupo de Trabajo Software)(ES)(Side B)[position tape + CLOAD + RUN] MSX ES +2663D1CE828442F66FFE069E9C4139F9 MSX Software - Issue 12 - Phantom Ataca (1986)(Grupo de Trabajo Software)(ES)[a][RUN'CAS-'] MSX ES +BBADCF573ACC6B5849C6987027B91652 MSX Software - Issue 12 - Phantom Ataca (1986)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +23EDB066EA7070BA12CC8BE9085F02BB MSX Software - Issue 19 - Super Baby (1986)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +6CD01757C0A474CB2523FF019BDA3227 MSX Software - Issue 20 - Death House (1986)(Grupo de Trabajo Software)(ES)[CLOAD + RUN] MSX ES +63362B4A0DE41EC18D37AC36595B3865 Mundiales de futbol (19xx)(Onaki)(ES)[Konami Soccer pirate][RUN'CAS-'] MSX ES +5C9B66802F3A61B9EED84D36CDAC9980 New Games MSX - Issue 18 (1988)(Edigamma)(IT)[RUN'CAS-'] MSX IT +884B2890586727C895792D525857DAE1 New Games MSX - Issue 23 (1988)(Edigamma)(IT)(Side A)[RUN'CAS-'] MSX IT +C04848BDD88AB00A41F978B641DAA442 New Games MSX - Issue 23 (1988)(Edigamma)(IT)(Side B)[RUN'CAS-'] MSX IT +D0C20FE2755DFCF533C1B99CF41D360A New Program MSX - Issue 17 (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +451788D24D309FDB89B204D7DC6287AF New Program MSX - Issue 17A - Intro (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +EE95C62DA1F939E1E282136D17E8A4E7 New Program MSX - Issue 17B - Dexoiz (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +C110A9AC32C0DBAF0061DC800C33B8AE New Program MSX - Issue 17C - Uovo Sodo (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +5D02EFA151D2085382DE71530A99577A New Program MSX - Issue 17D - Psychoblast (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +585597458A665FE02E19A9E027AAAE9F New Program MSX - Issue 17E - Alienoid (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +6BAECC7E6055023F6B957563F5A83114 New Program MSX - Issue 17F - Atrix (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +89F383EED18AD436658CD2F4166DD396 New Program MSX - Issue 17G - Il Buono e il Cattivo (1989)(S.I.P.E.)(IT)[RUN'CAS-'] MSX IT +AD7635F922197F7DC15671ED92F22E78 New Program MSX - Issue 17H - Cavaler-Z II (1989)(S.I.P.E.)(IT)[aka Stormbringer][RUN'CAS-'] MSX IT +55E78E51BF510F2AA86C5E00C37B8ED0 New Video Games - Issue 05 (1986)(-)(IT)[position tape + RUN'CAS-'] MSX IT +A2657B99DBBF5C9457858E7E1DBA2168 New Video Games - Issue 05A - Intro (1986)(-)(IT)[RUN'CAS-'] MSX IT +83AFE5D31232E331FC70427FC1E3F686 New Video Games - Issue 05B - Boxe (1986)(-)(IT)[aka Knockout][RUN'CAS-'] MSX IT +E1C29774C7C32EA823E1CF907A52F0A9 New Video Games - Issue 05C - Lavanderia (1986)(-)(IT)[aka Mr. Wong's Loopy Laundry][RUN'CAS-'] MSX IT +F4A1C0E8CA7F309385FFA8AA9BEA29F2 New Video Games - Issue 05D - Pupazzo di Neve (1986)(-)(IT)[aka Snowman, The][RUN'CAS-'] MSX IT +3265764C8949A52A4F0FD6675EEAA6C2 New Video Games - Issue 05E - Caverne (1986)(-)(IT)[aka Boulder Dash][RUN'CAS-'] MSX IT +004A7947CD46B667C73F4A569C87CF04 New Video Games - Issue 05F - Al Fuoco (1986)(-)(IT)[RUN'CAS-'] MSX IT +D2A53CAA73B29874C1465890D888160F New Video Games - Issue 05G - Cubo (1986)(-)(IT)[RUN'CAS-'] MSX IT +79566E6B8ED54BC2EF43755BA0202133 New Video Games - Issue 05H - Otello (1986)(-)(IT)[RUN'CAS-'] MSX IT +DA44C6668C059A693FCA42C07A66ECDD Pepe Saltarin (1986)(Grupo de Trabajo Software)(ES)[a][RUN'CAS-'] MSX ES +F8C9AF7F1B0C316924267229BE724EA8 Pepe Saltarin (1986)(Grupo de Trabajo Software)(ES)[RUN'CAS-'] MSX ES +73F6229154248C2143D483FAB304E5C0 Previsiones (1986)(Load 'n' Run)(ES)[RUN'CAS-'] MSX ES +0705F623CA66BFC75E1EB7BAC9B66DBD Programando mi MSX - Issue 01 - Astronauta (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +8A30771FB143B391EC4EF137A4760AF4 Programando mi MSX - Issue 01 - Diagrama (1986)(Editorial Cometa)(ES)[CLOAD + RUN] MSX ES +94DE9A5B1CA158107AD38199BACA8FE7 Programando mi MSX - Issue 01 - Rescate (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +E432AA4768AF6E8E4D9B748BF05C837B Programando mi MSX - Issue 01 - Screen 1 (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +8C03C5BC678A0143BE9362D7835A2688 Programando mi MSX - Issue 01 - Sprites (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +8B8F93AB4C795E6B426CD1856DE01AF2 Programando mi MSX - Issue 02 - Bancos (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +AB9D40C3837F445F1121DB4ACC3B9439 Programando mi MSX - Issue 02 - Generador de Sprites (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +364568488263093328881B4A529ED73A Programando mi MSX - Issue 02 - Minas (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +F28B2492D7D86686B8E4E14C821DF261 Programando mi MSX - Issue 02 - Tiro (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +B88D74135F5C6AEB0DD81977FC9EFCE5 Programando mi MSX - Issue 02 - Truco 1 (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +FDAD6CAC9390C8D4D01EFB005E449311 Programando mi MSX - Issue 02 - Truco 2 (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +496BE34E8E0786ACD3609F2814EFC81A Programando mi MSX - Issue 04 - Agenda 1 (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +BFE72EFC4CE27B7689A9F1178EE434FC Programando mi MSX - Issue 04 - Areas y Volumenes (1986)(Editorial Cometa)(ES)[CLOAD + RUN] MSX ES +D7B64AEE6965800465BA08239A54F5A8 Programando mi MSX - Issue 04 - Correr (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +90A1F0E7BAE6ECB4AFCA7A90114DED94 Programando mi MSX - Issue 04 - Esgrima (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +384AC09801643FB82DAB23E73F30DA84 Programando mi MSX - Issue 05 - Agenda 2 (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +4528A8FFAF3E5901D6E1BE8D2E6956F0 Programando mi MSX - Issue 05 - Dallas (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +A0538574A3798CEC248D43C878DE6CF9 Programando mi MSX - Issue 05 - Duelo (1986)(Editorial Cometa)(ES)[RUN'CAS-'] MSX ES +77B6E8B8429A4C856AAFD9D9A7488D78 Settimana Games - Issue 01 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +3C3AF21C2100ECCC9758C2F8466ECCC7 Settimana Games - Issue 01A - Doppio Video (1989)(Edigamma)(IT)[aka Spy vs Spy II - The Island Caper][RUN'CAS-'] MSX IT +7F4A67656378591A6490274B7EB83144 Settimana Games - Issue 01B - Carlino lo Scoiattolo (1989)(Edigamma)(IT)[RUN'CAS-'] MSX IT +98A5CA177B99DE76AFE03B10A88ACCF4 Settimana Games - Issue 04 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +BF7EEA3EB513B7285E03AF7D5A3215EF Settimana Games - Issue 04A - Racchetta (1989)(Edigamma)(IT)[aka Arkanoid][RUN'CAS-'] MSX IT +C7CF23FFF674A428020A140619889ECD Settimana Games - Issue 04B - Sferoidex (1989)(Edigamma)(IT)[aka Trailblazer][RUN'CAS-'] MSX IT +26B61513DB5B04ADD1DB01C740EACAB6 Settimana Games - Issue 06 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +8C107A6A1BF650FC0461C4F87492C36B Settimana Games - Issue 06B - Attila (1989)(Edigamma)(IT)[aka Knightmare. Majyo Densetsu][RUN'CAS-'] MSX IT +E9B5723624345C3CA805E2EB45EDB7B0 Settimana Games - Issue 06C - Il Labirinto di Morgana (1989)(Edigamma)(IT)[RUN'CAS-'] MSX IT +02938D3B03272D1740EE2D648099C333 Settimana Games - Issue 10 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +C34779B865A06F72728CC412D38165F4 Settimana Games - Issue 10A - Siluri (1989)(Edigamma)(IT)[RUN'CAS-'] MSX IT +AFAF89602E4AF200618ED64D1F2F4572 Settimana Games - Issue 10B - Spazio Insidioso (1989)(Edigamma)(IT)[aka Destroyer][RUN'CAS-'] MSX IT +2B8EE76132A3F5004450F2326CDF024A Settimana Games - Issue 11 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +BA53BF560E18CC15196E52F755B18776 Settimana Games - Issue 11A - Ombre Scure (1989)(Edigamma)(IT)[aka Nightshade][RUN'CAS-'] MSX IT +F7CDCCBB2DE20AA7F8134E80D229AB53 Settimana Games - Issue 11B - La Biscia (1989)(Edigamma)(IT)[RUN'CAS-'] MSX IT +BAE6D4F162C90A670E50F8EC5A464974 Settimana Games - Issue 12 (1989)(Edigamma)(IT)[position tape + RUN'CAS-'] MSX IT +990AA9CABE1D3B4EE379F21F2FCD04EF Settimana Games - Issue 12A - Halley (1989)(Edigamma)(IT)[aka Starquake][RUN'CAS-'] MSX IT +04F664F6E6F1ADCEEC50F9A227DBEB71 Settimana Games - Issue 12B - Puf Puf (1989)(Edigamma)(IT)[RUN'CAS-'] MSX IT +9EBB5B7414588346FF043856F53DEAC6 Soft-MSX - Issue 01 - 01 Presentacion (19xx)(Editorial Cometa)(ES)(Side A)[CLOAD][Martos] MSX ES +BC32FD82AD8300BC3CACE468B68BCCA1 Soft-MSX - Issue 01 - 02 Sabiondo I (19xx)(Editorial Cometa)(ES)(Side A)[CLOAD][Martos] MSX ES +4978CE2608355B075BCDB183EDD50CB5 Soft-MSX - Issue 01 - 03 Programe su quiniela (19xx)(Editorial Cometa)(ES)(Side A)[CLOAD][Martos] MSX ES +3BE57D1D50DB97EF25678B5E83ECB7A5 Soft-MSX - Issue 01 - 04 Buscando la salida (19xx)(Editorial Cometa)(ES)(Side A)[CLOAD][Martos] MSX ES +061A03AD6259651B887B2BBDDB13BCFF Soft-MSX - Issue 01 - 05 Mida su inteligencia (19xx)(Editorial Cometa)(ES)(Side B)[CLOAD][Martos] MSX ES +5ADB7CECFA7559C6FF990A6DC9AA0163 Soft-MSX - Issue 01 - 06 Car Racing (19xx)(Editorial Cometa)(ES)(Side B)[CLOAD][Martos] MSX ES +E0FA589CDC9F306C45F01BABD8EE7667 Software Cometa - Issue 0 - Busca palabras - (19xx)(Editorial Cometa)(ES)[RUN'CAS-'][Martos] MSX ES +3DE3C5314361E7E1DAFFBCC3465CA6EE Software Cometa - Issue 0 - Meteors - (19xx)(Editorial Cometa)(ES)[RUN'CAS-'][Martos] MSX ES +A487DED1AB2ED83C6DA98C4F02477E8A Software Cometa - Issue 0 - Roller - (19xx)(Editorial Cometa)(ES)[RUN'CAS-'][Martos] MSX ES +D6FFAAD2BF3B5CC02CE286D7E91A01B1 Software Cometa - Issue 0 - Space Fighter Z - (19xx)(Editorial Cometa)(ES)[RUN'CAS-'][Martos] MSX ES +2224BAE52FDD6CA0DD606BC99077EF6E Super MSX - Issue 01 (1985)(J. Soft)(IT)[position tape + RUN'CAS-'] MSX IT +895A1C504FD20EAFAA31524B4875F27A Super MSX - Issue 01A - Treno (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +3BFDCBF16554F97792CE0403F450DF6A Super MSX - Issue 01B - Quattro in Fila (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +9C13B7724EFD9089B17FE9004A2CB0C4 Super MSX - Issue 01C - Caccia e Mangia (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +2E84AE21DB22957186EA26CA28F86760 Super MSX - Issue 01D - Gioco degli Animali (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +1C5A3369B680F65334573552E45B2045 Super MSX - Issue 01E - Sprite Designer (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +C5AD41BE82D87070E1E38F4EA557F486 Super MSX - Issue 01F - Archivio Libri (1985)(J. Soft)(IT)[RUN'CAS-'] MSX IT +4EA47FEF842BA8F0EEB78EADB666DA63 Super MSX - Issue 02 (1985)(J. Soft)(IT)[position tape + CLOAD + RUN] MSX IT +1391C12E6ACA0CF6824270EE445B8221 Super MSX - Issue 02A - Aereo (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +7F14C5CFE001E599864A7B74B12C0778 Super MSX - Issue 02B - Bombe (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +A676BD8EDE2D7932B173A458B9FF9885 Super MSX - Issue 02C - Black Jack (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +05C9DDFA2FC5495E4E47F1100D5E7DAE Super MSX - Issue 02D - Gioco degli Animali 2 (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +37523BFBC59EBA9CC700A9C9D1389720 Super MSX - Issue 02E - Tiro al Piattello (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +A3C47014B9D7C887B6E1F39440ECF50E Super MSX - Issue 02F - Quizmaster (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +CFF8BC0153BA04D1591E173737876B5E Super MSX - Issue 02G - Sprite (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +E3F6D56E6B59CFDE5C74DA909F9CACFC Super MSX - Issue 04 (1985)(J. Soft)(IT)[position tape + CLOAD + RUN] MSX IT +C2CFFEC0D493F7B4EB8A7BFB6D6A5BD9 Super MSX - Issue 04A - Gioco degli Animali 3 (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +FC1FCE5BEB09B2D96B232E96FB38790B Super MSX - Issue 04B - Draw Editor (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +65A51355051C6D9B8455457E7E202E94 Super MSX - Issue 04C - Worksheet (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +C86EF02A7CAEA8FAE5042740A345F4C1 Super MSX - Issue 04D - Caccia alle Streghe (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +2F0B8E5191AEC59A3E61AB69A2CB5EF2 Super MSX - Issue 04E - La Corsa del Coniglio (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +D50D03107BA1376B4FC451F582A04C6B Super MSX - Issue 04F - Freccette (1985)(J. Soft)(IT)[CLOAD + RUN] MSX IT +EE87BD9707C5A6C966DEA54812730BF2 Super MSX - Issue 21A - Intro (19xx)(J. Soft)(IT)[RUN'CAS-'] MSX IT +6A71A2DD91547AC17B08344B885FE96F Super MSX - Issue 21B - Berretti Verdi (19xx)(J. Soft)(IT)[aka Operation Wolf][RUN'CAS-'] MSX IT +9016B7FF66ECEB77BF7E3F1709F6EC5B Super MSX - Issue 21C - Pirata (19xx)(J. Soft)(IT)[a][aka Corsarios][RUN'CAS-'] MSX IT +E0962F220267AEA90D5514292A6EE877 Super MSX - Issue 21C - Pirata (19xx)(J. Soft)(IT)[aka Corsarios][RUN'CAS-'] MSX IT +E7DEBBE85BF5764BB552D94B8A8F4FB5 Super MSX - Issue 21D - Castle Lady (19xx)(J. Soft)(IT)[aka Hunchback][RUN'CAS-'] MSX IT +F19F26DF6A3CA49797832BB05F2B76FE Super MSX - Issue 21E - Scacchi (19xx)(J. Soft)(IT)[aka Super Chess][RUN'CAS-'] MSX IT +039C51CD388740A40479A4FC831D2239 Super MSX - Issue 21F - Maiden Rescue (19xx)(J. Soft)(IT)[aka Iligks Episode I - Theseus][RUN'CAS-'] MSX IT +ED88445F944D7614F940EDD78596CEAE Super MSX - Issue 21G - Mister Micky (19xx)(J. Soft)(IT)[aka Fruity Frank][RUN'CAS-'] MSX IT +B373617CBB33A49E94F1A4B19B8080E5 Superkarateka (19xx)(Onaki)(ES)[RUN'CAS-'][Konami's Yie Ar Kung-Fu II - The Emperor Yie-Gah][Martos] MSX ES +05B0171D90D7FE619D5B1FE7263DD3C3 Video MSX - Issue 01A - Sumario (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +13804A898F84DEDE40BA6D32E2957B8E Video MSX - Issue 01B - Coche Fantastico (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +A2F7F9EBBD84926336814BE452847BDF Video MSX - Issue 01C - Chas en el Castillo (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +B5798DAAEE948E6BE3A2972A5DD6162E Video MSX - Issue 01D - Agenda (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +EAD2DAF9E5E5C89508DBB3E32D5524D3 Video MSX - Issue 01E - Libro de Cheques (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +A6C3FD2BA30A782E3C20E7044A9DB185 Video MSX - Issue 01F - Poker Americano (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +10CA9A533B5573CC3BC4637D10CE8E06 Video MSX - Issue 01G - Aula Matematica (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +906930A1BB7F4D87B3B0CC7F7F1FF057 Video MSX - Issue 01H - El Loto (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +D928A1866F74A41264F96AD031410004 Video MSX - Issue 01I - Lotto Uno (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +EA4F0C20821C6CBC389CD5D6E0F24B06 Video MSX - Issue 01J - Cultez (19xx)(Software Editores)(ES)[CLOAD + RUN] MSX ES +A78D23D0AE5BFC4E2FF2750477425DF5 Zoot (1986)(Bug-Byte Software)(GB)[RUN'CAS-'] MSX GB diff --git a/Assets/gamedb/gamedb_msx_msx1_dsk.txt b/Assets/gamedb/gamedb_msx_msx1_dsk.txt new file mode 100644 index 0000000000..28db1cf100 --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx1_dsk.txt @@ -0,0 +1,2420 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Applications - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +195CB47374FE4704EFBE380BF3E54358 H MSX PageMaker Deluxe (19xx)(Nemesis Informatica)(BR)(Disk 1 of 4)[h MSX Files] MSX BR +21D74D61DB98DD48C2AE4D2E40A3C75A H MT-Base (1987)(Micro Technology)(NL)[cr Speedy-Hacking No] MSX NL +1783EE46D311BA779C2C01195041C4FB H Professional Publisher v1.0 (1990)(Discovery Informatica)(BR)[cr Realtime Software][passworded] MSX BR +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +603804E8C5ACABB9E7FD3E94940D3156 Aacko Draw & Paint (1985)(Aackosoft)(NL) MSX NL +F4D12CB5310DBDB9A485DD5FA7AF0AC1 Agenda Perpetua (1986)(Philips)(ES) MSX ES +1224183DB875D9E3DC2F92F66D97CA18 Aquarela (1989)(Paulisoft Informatica)(BR)(Disk 1 of 2) MSX BR +685E1C035611898B9C8207058EC86FCB Aquarela (1989)(Paulisoft Informatica)(BR)(Disk 2 of 2) MSX BR +7788385585A8D914AB4E77A421ED63C7 Ark v0.2 - UnArc v1.6 (1987)(Brian E. Moore - Robert A. Freed) MSX +4302AA9F414C8D95AB948176D1C9AC06 Bank Street Writer (1983)(Toshiba-EMI)(JP) MSX JP +7ED1649194F01A7386D1CFBE5F002F6E BGM Music Player (1995)(Nacho & Miguel Cabrera) MSX +A46EE5E85BDF0AAD10EC271D3752BB2B Biorritmos (1987)(-)(ES) MSX ES +B3EC969B4B82E2F0259C26EE2E0A78FB BKP Disco (19xx)(Enigma Software)(BR) MSX BR +5089F72D5660BEF3BD4B40C1FE6D4483 Cartoon (19xx)(-)(BR) MSX BR +CD87AB9C611798B832231E8BF2D4970F Cheese (1984)(Nipon Electronics)(JP)[mouse] MSX JP +C263B5AF0CDF2D785046CEA715DA1522 Compor - procesador de textos (1985)(Philips)(NL)(en) MSX en NL +31AF9CDA8D562B4472197FBA7A0BA8EB Conversor Bin-Com v1.3 (19xx)(Nemesis Informatica)(BR) MSX BR +A035F24748CA546324D9DC7A42B6B99F Conversor Bin-Com v1.3 (19xx)(Nemesis Informatica)(BR)[a] MSX BR +F1F631F188B18A1F52DEDDE91892F12A Converter v2.0 (19xx)(Aackosoft)(NL) MSX NL +1A383AE473516291F09BD1AD2561A386 Copion de Cartuchos 16k (19xx)(Pyramid Soft)(ES) MSX ES +B1FC928384FC8989A7F386DAF336651A Copion de Cartuchos 16k (19xx)(Pyramid Soft)(ES)[a] MSX ES +0193EB6A18FAEF5DE270736BFD382C80 Copion de Cartuchos 32k (19xx)(Pyramid Soft)(ES) MSX ES +1C99521F72A421566387DDEC88065873 Copion de Cartuchos 32k (19xx)(Pyramid Soft)(ES)[a] MSX ES +BD894886B62CEDF11564959B861572B3 Copy Guay (1986)(Eloy Roman)(ES) MSX ES +52F4DDFE84A6FE4B843B0433670373C4 Copy MSX 2 (19xx)(-)(ES) MSX ES +5D028A8965FB2E4DAEDED7BAF4EC0E39 Copy-Turbo-Gremline (1990)(El Halcon Pirata)(ES) MSX ES +D0D98B98FE65ABCAF5CD816E94531A17 CTRL (19xx)(-)(ES) MSX ES +464435F2356134EDD9A3006FADD2D3D3 Delta BASIC (1988)(Filosoft)(NL) MSX NL +69A6CDA580339DF256776AC611AF0BAA Desenhista (19xx)(-)(BR) MSX BR +6C7049E8AE9424A3E997827CEEE11C79 Designer's Pencil, The (1984)(Activision)(US) MSX US +CF68A8D37E5CF1016DDF0D63F0701810 Disk Mechanic v2.0 (1990)(Discovery Informatica)(BR) MSX BR +BB96B015237EE37A4A29D379A19A63E1 Drawer (1989)(Renato de Mello)(BR) MSX BR +AE478713A1046D2DA3FF999FDFF6DA07 Duad (1984)(ASCII)(JP) MSX JP +6EF17255622BC29183647CF82E1202F8 Eddy II (1984)(HAL Laboratory)(JP) MSX JP +50EEABDC11C9716D4DE7548789D1DDB2 Editor de Adventures v3.4 (1986)(ProKit)(BR) MSX BR +8BC1949DA9802C2C2949A6BD685F5463 EMU - Editor de Musicas (19xx)(XSW Software)(BR) MSX BR +3413C647CDCFD6B2B52813CD49EA259D ExecROM v1.0 (1998)(A&L Software) MSX +169F7FCF7B6F268063DD250362C135E0 ExecROM v1.0 (1998)(A&L Software)[a] MSX +E328DBDD1DCC7B2FD82516D65C169DEC ExecROM v1.1 (1998)(A&L Software) MSX +84904C15D517DDB0C38CD1B9123BDF18 ExecROM v1.1 (1998)(A&L Software)[a] MSX +0FEB71FAFDEACEE2E6753DF393EF984B Explorador de Cintas (1990)(El Halcon Pirata)(ES) MSX ES +345E991DA1068C131C37992BBADF77ED Games Designer (1985)(Quicksilva)(GB) MSX GB +5DF339FB48F5DB9C3596BB07ADF725E8 Generador de Sprites (1985)(Advance)(ES) MSX ES +A5F3E445E42309F628B4662D09F3610A Geos (1987)(Nemesis Informatica)(BR) MSX BR +B120EDDD929D937A4411EB606482E9DA Graphic Artist (1985)(Yamaha)(JP)[mouse] MSX JP +75A8F48689EC8BFEA1E60785F1393BDE Graphic View v0.1 (1989)(Paulisoft Informatica)(BR) MSX BR +8FF94EE535325F24064B2E3BE1465BDC Graphos III (1987)(ATI Editora)(BR) MSX BR +ED930319F69EA4B5B27FC61411513736 Graphos III (1987)(ATI Editora)(BR)[a] MSX BR +E02EAE8E93751A33423A004B3ED80EDB Graphos III Pro (1989)(ProKit)(BR) MSX BR +C99E8C6AE6D709B1CA2C772C26203F85 Graphos III Pro (1989)(ProKit)(BR)[a] MSX BR +6DB4404C8E2835D9B6EECC56757FBE3B Home Writer (1985)(Sony)(JP) MSX JP +F54EEBAC701212B8EBCA7C36CB2AF789 Kame Graphics (1991)(Paxanga Soft)(ES) MSX ES +3864D96B1A5E3C314F33BEDDD92A8A6B Konami's Game Master - European Version (1986)(Konami)(JP) MSX JP +B8B280274FB4A464926345D2B291158E Konami's Game Master II (1988)(Konami)(JP) MSX JP +AEFD03081BFC098411CEA07179A6A6FE Konami's Synthesizer (1986)(Konami)(JP) MSX JP +16DB377DAC2237190C9225E913A0A45C Kuma Logo (1984)(Kuma Computers)(GB) MSX GB +336787BFA511DC25E5C8BB6B88F7B67E Lector de Cabeceras (19xx)(-)(ES) MSX ES +DF1A72C41013BE0EC74E4CD0EFFF4784 Like (1992)(Crunchworks)(BR) MSX BR +185F9106B243144EAF7F0C03A1A373B2 Like Educativos (1992)(Crunchworks)(BR) MSX BR +39C53C48BDDDDA8A25910A60CD61B60E Like Jogos (1992)(Crunchworks)(BR) MSX BR +55BA5A63C0602E90DCAEDE7C9B17827A Load ROM v1.0 (19xx)(-) MSX +A6C8ACCDFED3E8710C6F3C64165963F2 Loteria Primitiva (1985)(Loto Lar)(ES) MSX ES +0A9FBE6B482617C14D0231A2A4FAD38B Loto (1986)(Serma)(ES) MSX ES +F5434FAD01AF44BEBDF8388BF9B5125C Magic Paint (19xx)(-) MSX +A706B4F0833B650BEBA8C52D99AD3DB6 Master Voice (1985)(Aackosoft)(NL) MSX NL +C2F3697C07AB6A4F80E316E752DCF744 M-BASIC v5.2 (1980)(Microsoft)(US) MSX US +1E7249D9381659967D5632A7D9B29527 Menudisk (1993)(A&L Software)(BR) MSX BR +1EAE460F55E4D0F5470AC021FB65F47B Miller Graph (1987)(Walther Miller)(ES) MSX ES +10B6014B8F03CB1CE6355C7BCBA26DDA Mission v1.1 - ColecoVision Emulator (1996)(Marcel de Kogel) MSX +953110E6A1171F358334B648BEF71B9F MSX Artist. Graphics Editor (1986)(Electric Software)(GB) MSX GB +B60AB0EBC4635EDF0D7CAE9FFC8D36EA MSX CD-ROM (19xx)(-) MSX +D9094529309DB3C37C944E5B1E58528D MSX Debug v1.1 (1989)(-)(BR) MSX BR +61D125365BE03005DB5E4E962FC9404E MSX MuSIC Editor (19xx)(M.A. Cabrera) MSX +9F1763D83FEF32830E7EF4B62B17859E MSX PageMaker Deluxe - Alfabetos (19xx)(Nemesis Informatica)(BR) MSX BR +E68894C12F8E58840ADDE72394CAC9BA MSX PageMaker Deluxe - Print-Shop (19xx)(Nemesis Informatica)(BR) MSX BR +293893C5862A0BC1A2FC935C9E412F23 MSX PageMaker Deluxe (19xx)(Nemesis Informatica)(BR)(Disk 1 of 4) MSX BR +359ED663962C0CF1AC1DFA0245A3B5A6 MSX PageMaker Deluxe (19xx)(Nemesis Informatica)(BR)(Disk 2 of 4) MSX BR +073C92FF191654641F3424DC52E095BA MSX PageMaker Deluxe (19xx)(Nemesis Informatica)(BR)(Disk 3 of 4) MSX BR +5D3BC2A9A5E056D4601A19801EEFDF37 MSX PageMaker Deluxe (19xx)(Nemesis Informatica)(BR)(Disk 4 of 4) MSX BR +D79D692F5970CD4BC3700FDA38EAAFCF MSX Tape Image Converter v1.0 (1998)(Marcel de Kogel) MSX +B0F879489AE7012C9CE6794DDEC7E861 MSX Top CAD v1.2 (19xx)(Nemesis Informatica)(BR) MSX BR +E630B8F337754655727F59794DFD6D24 MSX-DOS (1983)(Microsoft)(US) MSX US +7109327475DA2AFDC19192BF7D347ABF MSX-DOS Ayuda (1989)(Philips)(ES) MSX ES +88C94D6FBEA8E6C66376E75394ADE45B MSX-DOS Ayuda (1989)(Philips)(ES)[a] MSX ES +3FB7B8CB15F01DAC8D0CA0DEE9B482E7 MSX-DOS Hulp (1989)(Philips)(NL) MSX NL +081616C589B6AB278C055F4164B2D7CB MSX-DOS Hulp (1989)(Philips)(NL)[a] MSX NL +4245B38CE6E98302A4586A5B9F83C2C2 MSX-DOS Tools v2.1 (1984)(Nemesis Informatica)(BR) MSX BR +BDDAA6EA981307E84F7FD8787D0E0344 MSX-DOS Tools v4.3 (1991)(Nemesis Informatica)(BR) MSX BR +F963B45377EADEB937E9A569745C26A3 MSX-DOS v1.03 (1984)(Microsoft)(US) MSX US +47E6ACDF3CD9A60D0C3AB56DEA904C89 MSX-DOS v1.8 (1986)(Microsoft)(US) MSX US +84004898A53F95C31484CD68C2D0BB78 MSX-Word v3.0 (1988)(Cibertron Software)(BR) MSX BR +77BC20F2EAF5B626A61EA32D98C605EF MT-Debug (1985)(Micro Technology)(NL) MSX NL +FE058182B07C70F7BFFB9599F8B627FC MUE - Music Editor (1984)(HAL Laboratory)(JP) MSX JP +F8EFC3AAFB1D60AB87506C9F2F558C4D Music Creator (1987)(Philips) MSX +611EA5C83F0F90B33F7A6591C26276F3 Music Maestro (1985)(Paul Midcalf - Simon Jones) MSX +87E377F5F360F014C8233D23388B0407 Music Studio G7 (1985)(Sony)(JP) MSX JP +55A225E3ECE25BFEFE6424A060A7D660 Music Studio G7 (1985)(Sony)(JP)[a] MSX JP +CEBEDB02C0F5415ADF9400C4F1C4796A Odyssey-K (19xx)(Kamiya Studio) MSX +AA7209F0A61B0E99DD96385630588FF5 Palet (1987)(Fs Soft)(NL) MSX NL +4DFBB8306CF66E40AA0F37C9044ED5F4 Pasador de Cinta a Disco (1986)(JCC)(ES) MSX ES +6003E433EB03F430F728A6156A15870C PMarc (1991)(Yoshihiko Mino) MSX +DBE9846EA3CAB10FC730B9E1D244ACD4 Presto (1986)(Aackosoft)(NL) MSX NL +C1F8B79FC2D624ADA23CEFB24CDC92CB Print-X-Press (19xx)(Anglosoft)(GB) MSX GB +0E1A86B153EB2D551EA44A0DF88C344C Professional Cards (1990)(Discovery Informatica)(BR) MSX BR +3AABE5836329096B27811192B7BE07F3 Professional Data Retrieve (1990)(Discovery Informatica)(BR) MSX BR +921B8237583F59562F4B1D3DDE89B645 Professional Paint v1.0 (19xx)(Hitek)(BR) MSX BR +02613566AD1A706568515AE311DC93EB Professional Publisher v1.0 (1990)(Discovery Informatica)(BR)[passworded] MSX BR +8C07A5B380FB8D603D188ABC713B5B3F PSG Music Writer (1984)(Rittor Music) MSX +E25AEA48F0C98F99105D2CEC09BF4A43 Quinielas (1985)(Manhattan Transfer)(ES) MSX ES +6493F5A609F114BB8976DCE03D274DDA ROM Xtractor v1.0 (1998)(JAM Soft) MSX +89FCE1DCE72131F539ABFECDBE4CE659 ROM2COM v1.1 (2000)(JAM Soft) MSX +1E5BD1D6E2F877FD33FB211B7EFEC44E ROM2COM v1.1 (2000)(JAM Soft)[a] MSX +6766EB0D67A566F1473B06CD5213E3DD SCROM - SCC+ ROM Loader v1.2 (1997)(Sean Young) MSX +1843485825EBD8BB1B376DE13170F34D SCROM - SCC+ ROM Loader v1.2 (1997)(Sean Young)[a] MSX +B5494917C65B451FED5F46B5591E74AD Spec & MSX (19xx)(-)(ES) MSX ES +A1AA359B70ED4F09ED70E6780E2A4376 Spread Sheet (1984)(Computermates) MSX +35FFA2F1FAE879DC1E711D14246ECD26 Super Copiones (1990)(El Halcon Pirata)(ES) MSX ES +C3C7DE1EC879F7CC1D510890F38C6CD5 Super Synthesizer (1984)(Victor)(JP) MSX JP +7F5E56597F01BBC78D25E48099D3BF4E Tape-to-Disk Transfer-Utility (1985)(MOBZystems)(NL) MSX NL +BF385796A4708035226F23BB078D159F Tape-to-Disk Transfer-Utility (1985)(MOBZystems)(NL)[a] MSX NL +01206177E3EFB3B9B9FDFCDD9043555A TONUS Tape-Copier (19xx)(A.M.C. van Kinderen)(ES) MSX ES +77C6D0D8E9AD493F20378A0955953F72 TONUS Tape-Copier (19xx)(A.M.C. van Kinderen)(NL) MSX NL +951739FAE555CB1310CA8759183C29D0 Turbine 2 - MSX Turbo Copier (1988)(R.M.L.)(ES) MSX ES +5E59A3ECC3582537CDFA7FBCA51E19D0 Turbo 5000 (1987)(Robtek Software)(GB)(NL) MSX NL +1F1104B617C128D3726CCB0579644FC9 UnCrunch (19xx)(-) MSX +690BDA2C20E3E8EE5960FBF2C096F2CB UNPack v1.0 (1994)(PGN) MSX +20700FF986F9671E499485974636AF35 Vecope (1986)(Goldfinger Software) MSX +7FB6C14B9FCAF8810CD1EE1B80DBFD58 Word Plus (1993)(Comtect Microinformatica)(BR) MSX BR +3AEE333D8C0BBA57231D55207FAE1040 Zen Assembler (1986)(Kuma Computers)(GB) MSX GB +C70475CADF0D5D67EB5A083BE3BFA466 Zippit (1993)(PGN) MSX +B35E48671EFEE12AE0A9ECF02808E1E5 ZX-81 Emulator (1992)(Project Thunderbolt)(BR) MSX BR +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Compilations - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +992FF28B24A8C1FCABF733E08ED41693 B Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[b][SCC] MSX +FF5C3D2C820B4467F9496462FB79FAD2 B Konami Game Collection - Volume 2 (1988)(Konami)(JP)[b][SCC] MSX JP +6716BA20A935BE3722A61DFF5F5600E4 B Konami Game Collection - Volume 3 (1988)(Konami)(JP)[b][SCC] MSX JP +0492C2278D8FDAE98551668D2AF67D26 B Konami Game Collection - Volume 4 (1988)(Konami)(JP)[b][SCC] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +5A7D742C562035A91EBCA0BCF2B79D80 H Pack Games 1 (19xx)(EngeSoft)[cr Wal's] MSX +F97B1CF477328E7024022A5E7DDB2D12 H Pack Games 2 (19xx)(EngeSoft)[cr Wal's] MSX +969097422282DB53C572E759AD1B45FE H Silicon Dreams I - Snowball (1983)(Level 9 Computing)(GB)[cr Magicracks] MSX GB +99FF393D9E824442FC62AA5A239DF0B0 H Silicon Dreams II - Return to Eden (1984)(Level 9 Computing)(GB)[cr Magicracks] MSX GB +4B10EBC9FAB409E2C034C6F5F96DC91D H Turbo Pack C - Capitales de Espana (1987)(Philips)(ES)[cr F. Vallejo] MSX ES +A571B4D8240822598C4DBA6709F1B6FA H Turbo Pack C - Geometria - Figuras Planas y Volumenes (1987)(Philips)(ES)[h CEZ] MSX ES +377832A59A4DA070830F8961486E85AB H Turbo Pack C - Rios de Espana (1987)(Philips)(ES)[cr F. Vallejo] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +7B8D9FF0A06D98AABF0BE475F67F6760 50 dicas para o MSX (19xx)(Universoft)(BR) MSX BR +1A4345AFB9E642D3BA98F8BA547995A2 Aplicativos Pack (19xx)(MSX Dragon's Club)(BR) MSX BR +8C399CE96857EF23849E27E06C31825C Basic Konami Games Loader v1.1 (1998)(Possi) MSX +6366B1916488D492D69F609D553C7049 Basic Konami Games Loader v1.1 + Two Games (1998)(Possi) MSX +00E0FC0FC22D06D82AA841CE64AD21AF Jewels of Darkness I - Colossal Adventure v2 (1986)(Level 9 Computing)(GB) MSX GB +6260CFBCB6ADF7A838A798E6F18B87B0 Jewels of Darkness III - Dungeon Adventure (1984)(Level 9 Computing)(GB) MSX GB +3C2E96242395EBC1301AA870C7547222 Konami - The Complete Game Collection (19xx)(-) MSX +873FD2580D56C2679F88BBB0C02C4E3B Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[a][SCC][MSX2ready] MSX +2788CACAEEC915006EC1A1BD98DCD1BE Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[a][SCC+][MSX2ready] MSX +0F425CE6E4F72FD46D8C9D0543F562DC Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[SCC] MSX +39E87B961A1FEE5E154713544E9D07F2 Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[SCC][MSX2ready] MSX +19D5E3F96DC54F6E2CD4AFE5D66E9CFD Konami Game Collection - Volume 1 (1988)(Konami)(Disk 1 of 2)[SCC+][MSX2ready] MSX +4272C64F8188C83CEB068110D653D9A7 Konami Game Collection - Volume 1 (1988)(Konami)(Disk 2 of 2)[SCC] MSX +8583B24D2A6DDDB84D7B62751F8D6AA1 Konami Game Collection - Volume 1 (1988)(Konami)(Disk 2 of 2)[SCC][MSX2ready] MSX +43163D355972EBE305CD415075C0467E Konami Game Collection - Volume 1 (1988)(Konami)(Disk 2 of 2)[SCC+][MSX2ready] MSX +0E7B0B720A7E70971A22ADBCD7A57B40 Konami Game Collection - Volume 2 (1988)(Konami)(JP)[a][SCC][MSX2ready] MSX JP +3653AD35D71F32D765108AD8EA9BCE46 Konami Game Collection - Volume 2 (1988)(Konami)(JP)[a][SCC+][MSX2ready] MSX JP +E74EABE4E6C9D55C3B235CD717E4506D Konami Game Collection - Volume 2 (1988)(Konami)(JP)[SCC] MSX JP +B30857FF1822F39A4D5B1A7FD8E340B9 Konami Game Collection - Volume 2 (1988)(Konami)(JP)[SCC][MSX2ready] MSX JP +6BB5E147734EE7D87F47217DC32D57EF Konami Game Collection - Volume 2 (1988)(Konami)(JP)[SCC+][MSX2ready] MSX JP +0125F97E5FBEF0118F6C5F10F32745A5 Konami Game Collection - Volume 3 (1988)(Konami)(JP)[a][SCC][MSX2ready] MSX JP +CF551085E88EFA1997DE0CC1FDC6A23D Konami Game Collection - Volume 3 (1988)(Konami)(JP)[a][SCC+][MSX2ready] MSX JP +D5EA9E27C3440CD9AB98BACFDD2295DE Konami Game Collection - Volume 3 (1988)(Konami)(JP)[SCC] MSX JP +4E69B78D53BBB85B3F9B539CEB7CD35B Konami Game Collection - Volume 3 (1988)(Konami)(JP)[SCC][MSX2ready] MSX JP +337AA6B572B408AA2DE4FD86877FEB2F Konami Game Collection - Volume 3 (1988)(Konami)(JP)[SCC+][MSX2ready] MSX JP +10BF9735DB47D6B382452F009854127A Konami Game Collection - Volume 4 (1988)(Konami)(JP)[a][SCC] MSX JP +DAC851386F72D79F7919C17CFB89514E Konami Game Collection - Volume 4 (1988)(Konami)(JP)[a][SCC][MSX2ready] MSX JP +404AA0124009A65238F75DBD9E63628A Konami Game Collection - Volume 4 (1988)(Konami)(JP)[a][SCC+][MSX2ready] MSX JP +2832692A51C1896F0B9A76A13F77E837 Konami Game Collection - Volume 4 (1988)(Konami)(JP)[SCC] MSX JP +D04C6A4E480724802AD21F0ADDB38085 Konami Game Collection - Volume 4 (1988)(Konami)(JP)[SCC][MSX2ready] MSX JP +00BC1B4487332E7A22F664C024E86888 Konami Game Collection - Volume 4 (1988)(Konami)(JP)[SCC+][MSX2ready] MSX JP +B4AED2902882CAAB709DE68B3EA158B7 Major 1. Maliop Nuctorejog + Major 2. Nuctoretog Ha Bagom (1988)(Crazysoft)(ru) MSX ru +F083B42A3B17EB6038C4B012AA3821C7 MSX Game Pack (19xx)(-)(ES) MSX ES +FCE5EBFBF397FAA5557A0AADF963CF09 MSX Mania Collection - Disk 001 (19xx)(-) MSX +4EC96BE5F7664ADF11AFFC44CA3CBCFB MSX Mania Collection - Disk 002 (19xx)(-) MSX +FBAB4964DA33F7F4BEDDBF55040E5F96 MSX Mania Collection - Disk 003 (19xx)(-) MSX +FEE9CE70C268487609CE89225AC3BAFD MSX Mania Collection - Disk 004 (19xx)(-) MSX +29B6BD13CF4EDAA871D6850EB7F27CA3 MSX Mania Collection - Disk 005 (19xx)(-) MSX +E3C3F21B3C3442404069BD2385340AE1 MSX Mania Collection - Disk 006 (19xx)(-) MSX +DD18A3F05CCAB6FBAB6A06E0AEDA69C1 MSX Mania Collection - Disk 007 (19xx)(-) MSX +707C9E8ADCD3B37A295ACACA4A9AAA1C MSX Mania Collection - Disk 008 (19xx)(-) MSX +37FAF0A89F6A8FE125B1D658434A75FB MSX Mania Collection - Disk 009 (19xx)(-) MSX +AD770DB33E97D7F3175D28CCE12E63A7 MSX Mania Collection - Disk 010 (19xx)(-) MSX +D198ACA82319BB2A6EB51ED903F1D1D7 MSX Mania Collection - Disk 011 (19xx)(-) MSX +7084C0CDA0E12AE95EEA637F3FEB46FB MSX Mania Collection - Disk 012 (19xx)(-) MSX +09A3EE6FC75689D4B10B688B739E52B7 MSX Mania Collection - Disk 013 (19xx)(-) MSX +1266D6517A92E72BE43EA410F7663C23 MSX Mania Collection - Disk 014 (19xx)(-) MSX +27F85BF6F0C1A220CE00DE7C880CD6E1 MSX Mania Collection - Disk 015 (19xx)(-) MSX +1E6D42878D77C63A422E8FE9481A8E09 MSX Mania Collection - Disk 016 (19xx)(-) MSX +9ED769A7E0EAFB4FBBBB68D41DF474EB MSX Mania Collection - Disk 017 (19xx)(-) MSX +F49EF7AE00E4F7A473C802C05D39FA1D MSX Mania Collection - Disk 018 (19xx)(-) MSX +D315DE0EAD17B1E330CF14B4BB9A7FA6 MSX Mania Collection - Disk 019 (19xx)(-) MSX +A59FF543AF1B27F7B5E512060C846C15 MSX Mania Collection - Disk 020 (19xx)(-) MSX +728CBB07C9DB329596DFEA0261D3CC3B MSX Mania Collection - Disk 021 (19xx)(-) MSX +3BC6E57425EE6587175DE6E3E3347D9F MSX Mania Collection - Disk 022 (19xx)(-) MSX +7E03F419D534E0E581BB20384589A68D MSX Mania Collection - Disk 023 (19xx)(-) MSX +9333B68BA806976BD675437A2DFE9262 MSX Mania Collection - Disk 024 (19xx)(-) MSX +8F118989A4284D85CB258704B9DC8725 MSX Mania Collection - Disk 025 (19xx)(-) MSX +52DF1DA1A3DA90D5F9659EA5F8EAE03B MSX Mania Collection - Disk 026 (19xx)(-) MSX +E3C0AA67D408B461B5375BE9DDD1FDDB MSX Mania Collection - Disk 027 (19xx)(-) MSX +44C5FEE7F27EFF3D963FCE0251C95967 MSX Mania Collection - Disk 028 (19xx)(-) MSX +52B09CAE0B8CC9F84248F2D23AACF290 MSX Mania Collection - Disk 029 (19xx)(-) MSX +3AE55FF8B9FEE5CE21763209360A186B MSX Mania Collection - Disk 030 (19xx)(-) MSX +DF2624F5CF23CCE2F4BEF94B2704BD54 MSX Mania Collection - Disk 031 (19xx)(-) MSX +5E29DF39301035A4E7A10EFA34EA3551 MSX Mania Collection - Disk 032 (19xx)(-) MSX +114A2EFBA2FBAE9EF55843B054ED3A8B MSX Mania Collection - Disk 033 (19xx)(-) MSX +F6D923AEBE090A82EEFF0A18345FEEBE MSX Mania Collection - Disk 034 (19xx)(-) MSX +DD2796B1DE97AB742A75D8B51906BD21 MSX Mania Collection - Disk 035 (19xx)(-) MSX +A6AAAA0BA749C6FBB2583D7FD39EE8C0 MSX Mania Collection - Disk 036 (19xx)(-) MSX +B03E3D5E34F9EE1479D52FA23EED0150 MSX Mania Collection - Disk 037 (19xx)(-) MSX +CFBCE4FF486C9630005D20A4B5D8C117 MSX Mania Collection - Disk 038 (19xx)(-) MSX +CBFD0A9387B9247245DBBEE777F0F5DA MSX Mania Collection - Disk 039 (19xx)(-) MSX +40C21D7498F174135ABDC7D239F6EDBD MSX Mania Collection - Disk 040 (19xx)(-) MSX +C10DB0AC71021396B9DD3BD5B0A1CCF2 MSX Mania Collection - Disk 041 (19xx)(-) MSX +A3ECD0C2C84AAB259E9AD4CF024FF5AD MSX Mania Collection - Disk 042 (19xx)(-) MSX +3A9E7A448B5A27653748165F8F0F5477 MSX Mania Collection - Disk 043 (19xx)(-) MSX +DB73D65EF4C3ABBD86C014D77B0D71F0 MSX Mania Collection - Disk 044 (19xx)(-) MSX +85E076A08D1923082C66D3E836297F32 MSX Mania Collection - Disk 045 (19xx)(-) MSX +D1C8DCDF622E9B30E4A2080CB7B1425A MSX Mania Collection - Disk 046 (19xx)(-) MSX +E910284C9F4C33C50A308BB64E571052 MSX Mania Collection - Disk 047 (19xx)(-) MSX +51E8F808FEE2DB9A4D7262AF1839F6F5 MSX Mania Collection - Disk 048 (19xx)(-) MSX +070C416943325A2D9D911716F61B2C36 MSX Mania Collection - Disk 049 (19xx)(-) MSX +E3E944C8923866D47A7A27C68EFA3B6E MSX Mania Collection - Disk 050 (19xx)(-) MSX +2E1CE9E445CD937CEDF838A113862940 MSX Mania Collection - Disk 051 (19xx)(-) MSX +1C3280EED0E18AAE54D2521F0BF1766C MSX Mania Collection - Disk 052 (19xx)(-) MSX +3F3D6A26FCEE0C9440D20724DBDA9650 MSX Mania Collection - Disk 053 (19xx)(-) MSX +19C818D4167FC0F41745C785DE5EAD2E MSX Mania Collection - Disk 054 (19xx)(-) MSX +80E697255EABB05DBAD4D2ACE3468C1D MSX Mania Collection - Disk 055 (19xx)(-) MSX +EB8E82A66BEB6B71229131400C833934 MSX Mania Collection - Disk 056 (19xx)(-) MSX +3EE9708B174A92A8D8643499E0D79679 MSX Mania Collection - Disk 057 (19xx)(-) MSX +A646D85D90059AFA2D251C139944F228 MSX Mania Collection - Disk 058 (19xx)(-) MSX +A4F7F31FCF9CFC25EA6BDF7FF6386F65 MSX Mania Collection - Disk 059 (19xx)(-) MSX +B3EB53D4395291CFEB00B1ED1B6F511C MSX Mania Collection - Disk 060 (19xx)(-) MSX +D76906E3A0C926D1D661725846A5D140 MSX Mania Collection - Disk 061 (19xx)(-) MSX +538FB21A6932095C271ABB66D91D6D8C MSX Mania Collection - Disk 062 (19xx)(-) MSX +93679BFE2AE0F24E142CEF3E5D175E3C MSX Mania Collection - Disk 063 (19xx)(-) MSX +97F9D31894DE702D4E13FEB8766D027E MSX Mania Collection - Disk 064 (19xx)(-) MSX +698F03CC4B462F47E8A81F098CDFB68F MSX Mania Collection - Disk 065 (19xx)(-) MSX +45D2BD3A052F4CB9086A118631ABB830 MSX Mania Collection - Disk 066 (19xx)(-) MSX +7EDA0C6D4F9942FC77C951A8F6E6A088 MSX Mania Collection - Disk 067 (19xx)(-) MSX +1884AF45156F99B12F56CF99E88B6F0D MSX Mania Collection - Disk 068 (19xx)(-) MSX +B7D8DD022F53CAC6C01863B615E60C35 MSX Mania Collection - Disk 069 (19xx)(-) MSX +28819510C04F12597C1C151A2F3211F4 MSX Mania Collection - Disk 070 (19xx)(-) MSX +8786D9E707BD70BABE52B9D7E3248425 MSX Mania Collection - Disk 071 (19xx)(-) MSX +9C66F2E5336922A5788F17BAD5A9F285 MSX Mania Collection - Disk 072 (19xx)(-) MSX +D858AA05BBCA8D701D4B4C1DE96B1550 MSX Mania Collection - Disk 073 (19xx)(-) MSX +76C77E5F6AC6F918353BB563FEDFF97B MSX Mania Collection - Disk 074 (19xx)(-) MSX +46B0FC4E8E38797BFB9BE69C76680532 MSX Mania Collection - Disk 075 (19xx)(-) MSX +B7D39FD4FD1AAC551AE594277C791AE9 MSX Mania Collection - Disk 076 (19xx)(-) MSX +38357F66E2F7E02264FA30ABABB3D0E6 MSX Mania Collection - Disk 077 (19xx)(-) MSX +E76B086EF6D5806F0DDF1917DC2A6D06 MSX Mania Collection - Disk 078 (19xx)(-) MSX +95EECBFA9931F0C99E28ECE4B68A88CC MSX Mania Collection - Disk 079 (19xx)(-) MSX +487C4602FBA66FF8FED67E637B46E8DA MSX Mania Collection - Disk 080 (19xx)(-) MSX +3D35336904CE4E1BA16E442FD6D49A37 MSX Mania Collection - Disk 081 (19xx)(-) MSX +647E33568BE237CD5BD564284B960D06 MSX Mania Collection - Disk 082 (19xx)(-) MSX +778510B8AC64DFDFC0CA3F2FC68CC3E3 MSX Mania Collection - Disk 083 (19xx)(-) MSX +FBF324EDFE7322A89A6312A14F96D84B MSX Mania Collection - Disk 084 (19xx)(-) MSX +9EAE79F146C44ED6E5ADF1A9327F0A66 MSX Mania Collection - Disk 085 (19xx)(-) MSX +B0ABC56E96DD5619DE2744D9046D1D53 MSX Mania Collection - Disk 086 (19xx)(-) MSX +BC6BF789DC9CE366D8115CEDEEFE063F MSX Mania Collection - Disk 087 (19xx)(-) MSX +4F6B1032CC0EA9C3EF9D559524D0C773 MSX Mania Collection - Disk 088 (19xx)(-) MSX +6D140DCFB0218E77EC84A87699D83E7B MSX Mania Collection - Disk 089 (19xx)(-) MSX +8AA65B888FBA82E68FA5E4EE00698D30 MSX Mania Collection - Disk 090 (19xx)(-) MSX +F2775F936B5BAFC86DB558697E0F55CB MSX Mania Collection - Disk 091 (19xx)(-) MSX +9EF8F7107AC6C62D34A429F24D9BD5DF MSX Mania Collection - Disk 092 (19xx)(-) MSX +BD259A1308D393EBF0D87760CC84687B MSX Mania Collection - Disk 093 (19xx)(-) MSX +CD90E30FC4DD6525BEA3C75F704BF947 MSX Mania Collection - Disk 094 (19xx)(-) MSX +F92216FBD8C9694FE09CED6AEC19F1F6 MSX Mania Collection - Disk 095 (19xx)(-) MSX +EB5385DC03CD51463B2236DCCB23693F MSX Mania Collection - Disk 096 (19xx)(-) MSX +0EB1516304529BAC7185E2073B08F072 MSX Mania Collection - Disk 097 (19xx)(-) MSX +1DD34266734D6B46D2D9A0B6476CE8A7 MSX Mania Collection - Disk 098 (19xx)(-) MSX +FE76A2BA4124A0D865471F0F5301AD02 MSX Mania Collection - Disk 099 (19xx)(-) MSX +FCA42D0975E7D0B7A93D714DE8FE7A6E MSX Mania Collection - Disk 100 (19xx)(-) MSX +7CB7279AEE3DF7FC98AA05E5EBA6F57F MSX Mania Collection - Disk 101 (19xx)(-) MSX +2EEB07465808B894377FAA3B69F6F460 MSX Mania Collection - Disk 102 (19xx)(-) MSX +8FB40C7B78EC82E07B40A3889991B92E MSX Mania Collection - Disk 103 (19xx)(-) MSX +766B415557C4E13073933B09DC4EB94B MSX Mania Collection - Disk 104 (19xx)(-) MSX +C00201FCBEEC1E7B7F4476C1B4F82A6E MSX Mania Collection - Disk 105 (19xx)(-) MSX +ACAB5BA1E454E235E1793F64CE835C51 MSX Mania Collection - Disk 106 (19xx)(-) MSX +16589F52BEF9F1A71140531F5F3AF756 MSX Mania Collection - Disk 107 (19xx)(-) MSX +B75FE9A896FAD767A87C23EC3F98C312 MSX Mania Collection - Disk 108 (19xx)(-) MSX +9A05C821116FEB5A7CA3054F62AEFCD7 MSX Mania Collection - Disk 109 (19xx)(-) MSX +17F4BB6F47A29DE0A6E035A1DE21A444 MSX Mania Collection - Disk 110 (19xx)(-) MSX +E9DDF1ED58F85D9204BD627E22710C71 MSX Mania Collection - Disk 111 (19xx)(-) MSX +16F6C4B621C58B91B46D8465B1BE4BAC MSX Mania Collection - Disk 112 (19xx)(-) MSX +CA6EEE87002614E22A7450D02049DB80 MSX Mania Collection - Disk 113 (19xx)(-) MSX +CFB19B7B18863C241B02A6EA7DF25ECA MSX Mania Collection - Disk 114 (19xx)(-) MSX +B4619BC80993DAC9F20DB9A7B2DB42ED MSX Mania Collection - Disk 115 (19xx)(-) MSX +45F656948820C950FAC28CCCEEA07F21 MSX Mania Collection - Disk 116 (19xx)(-) MSX +9D9A987B5669FAD03DDD70ED13F98293 MSX Mania Collection - Disk 117 (19xx)(-) MSX +1B0B7D52FA51C05D761882F932652C68 MSX Mania Collection - Disk 118 (19xx)(-) MSX +9B0AE5E1BA743D84C4430C2F67EF2D33 MSX Mania Collection - Disk 119 (19xx)(-) MSX +C32A2D859FAC78FD5B72DF30058B4558 MSX Mania Collection - Disk 120 (19xx)(-) MSX +AEFE72C1868AA6F1F881A30B1465C290 MSX Mania Collection - Disk 121 (19xx)(-) MSX +4A07D96D47560B18A9BE72CE24607F61 MSX Mania Collection - Disk 122 (19xx)(-) MSX +DF7F1E461E5EDE66AB6FDF3D24B6807B MSX Mania Collection - Disk 123 (19xx)(-) MSX +B1ADF36B2879843A3EDEEB67853A4BC6 MSX Mania Collection - Disk 124 (19xx)(-) MSX +F83509115BFD27CC662A677B86A4641E MSX Mania Collection - Disk 125 (19xx)(-) MSX +619F43010E22378FD105B2347D49548C MSX Mania Collection - Disk 126 (19xx)(-) MSX +61AD94F967D2756ADB988813DDE31C3A MSX Mania Collection - Disk 127 (19xx)(-) MSX +FA7901B78AD400D39DC567A4C6802861 MSX Mania Collection - Disk 128 (19xx)(-) MSX +A0448541E3087C53FB74BBB90B43AB8B MSX Mania Collection - Disk 129 (19xx)(-) MSX +A832D1B1F9C2768ED05476F757B051BF MSX Mania Collection - Disk 130 (19xx)(-) MSX +9ACA3A31BA666316BBC7C3A96CC95793 MSX Mania Collection - Special Disk 001 (19xx)(-) MSX +E0F4B500C3C0F6E9C294BB515AFAC216 MSX Mania Collection - Special Disk 002 (19xx)(-) MSX +D2ECED8AC1A7008D6C469719603ADDE5 Public Domain Games (19xx)(-) MSX +69492AC3CC9EF956A57B1CA6B0014149 Super Game Collection (1985)(Sony)(JP) MSX JP +59B5A6EEF1A7BAB946D260BC36236580 Time and Magik I - Lords of Time (1983)(Level 9 Computing)(GB) MSX GB +9FFC6BB9E13AF02C9A68BCA699DF5CA1 Time and Magik II - Red Moon (1985)(Level 9 Computing)(GB) MSX GB +F857696CED21B8C8128EB52332C0EC49 Time and Magik III - The Price of Magik (1986)(Level 9 Computing)(GB) MSX GB +33664FCB3354CC2BD4848A85435C593F Turbo Pack C - Alcyon (1987)(Philips) MSX +784E8D584E4201D6C52B8AC27C0031FB Turbo Pack C - Demand (1987)(Philips) MSX +169B582EC6904561B839EE57776D0A1C Turbo Pack C - Drum (1987)(Philips) MSX +79DC82ADB2AB544919BB3D4E1A567A16 Turbo Pack C - Galaxians (1987)(Philips)(ES) MSX ES +1FE6BAB7CCD1A5A0EBB5E809498DAF44 Turbo Pack C - Geometria - Figuras Planas y Volumenes (1987)(Philips)(ES) MSX ES +A7F1F0CD8019E69206C7F8E7EE3E04D1 Turbo Pack C - Heli (1987)(Philips)(NL) MSX NL +D90B79E48B4607427DCC9D11E2276083 Turbo Pack C - Kitchen (1987)(Philips) MSX +D640095F73BF55E81D09B903223C7D16 Turbo Pack C - Los Petalos Locos (1987)(Philips)(ES) MSX ES +71298F1D5EA9A6389609FD92E346517F Turbo Pack C - Micky-Lucky (1987)(Philips) MSX +A30534709F0EE3F2404F677C5FFCA93B Turbo Pack C - Pucky (1987)(Philips)(NL) MSX NL +8AFE8911FB63673EFB58D448DD12F2C2 Turbo Pack C - Pyramid (1987)(Philips) MSX +FEBC522D649D4665DD2332742181CA9D Turbo Pack C - Racer (1987)(Philips) MSX +3CB4F547E074585885F0805F4E94AB9C Turbo Pack C - The Crossing (1987)(Philips) MSX +C95F399BFE41A6654B3147505F6ACE27 Turbo Pack C - Treppy (1987)(Philips) MSX +699C38F8597C8E0AFF9384745C3F519D Wallball + Attacked (19xx)(Tynesoft)(GB) MSX GB +B35E48671EFEE12AE0A9ECF02808E1E5 ZX-81 Emulator (1992)(Project Thunderbolt)(BR) MSX BR +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Demos - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +53F185E34376664DC02CBCB0A4D1CD14 Aatnos Demo (1997)(Lieves!Tuore) MSX +0FAE688605195110656C97DD1370F58A Aekrus Demo (1997)(Lieves!Tuore) MSX +693892C76A5CB6F60F572BC5EE7D5AAD Bernard in the City (19xx)(-)(ES) MSX ES +CA1FFE1ACB7C1A42C973F011E495A6A2 Master de Sonido - A1 Spirit - The Way to Formula 1 (19xx)(Martos)(ES)[SCC] MSX ES +85B06814E7B7B6DC01AB7E6DEC081D60 Master de Sonido - Konami (19xx)(Martos)(ES)[SCC] MSX ES +99006D2BD8355AB35F464EA89E8759D6 Master de Sonido - Konami (19xx)(Martos)(JP)[SCC] MSX JP +0DC48D3280BC7C28D0BD16EB4E1DB733 Master de Sonido - Konami (19xx)(Martos)[SCC] MSX +A2FF4EB8A488C97876D419D6A43F38D1 Merry X'Mas. Christmas (1987)(-) MSX +C1B17D20DFF880AEBBA8797F7539D318 MSX Loading Screens (19xx)(-) MSX +C577DB512D3C0C8264FB5172413A1794 Oldskool MSXmas Demo (2004)(Infinite) MSX +D3346AEEC2AF260182487F9135081373 Psychedelia (1984)(Aackosoft)(NL) MSX NL +71F20A285F201735D2C5C905B64DEC5B Psychedelia (1984)(Aackosoft)(NL)[a] MSX NL +E436D45D59BAB3B60AFF930E5779EE1E Sex-Shop (1988)(Nemesis Informatica)(BR) MSX BR +699C38F8597C8E0AFF9384745C3F519D Wallball + Attacked (19xx)(Tynesoft)(GB) MSX GB +11AE1185A91115A8C5CD0BF0AAABF944 X-Mas Demo (2004)(Zona Neutra) MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Educational - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +B8D66B8EBD83C3DCBA9032C7AFC61EF0 H Ciencias de la Naturaleza 8 EGB (1985)(Anaya Multimedia)(ES)[h CEZ] MSX ES +C961555A1DA4CF480E5374782629C40C H Cuerpo Humano, El - Sistema Circulatorio (1985)(Microgesa)(ES)[cr Chevan] MSX ES +67C5E14534280850F7A929B3F5F05B00 H Juega... Pero Seguro (1989)(OMK Software)(ES)[h CEZ] MSX ES +EE2256D8CDF037636AD2D4B00AD54BA3 H Merlin (1987)(Mind Games Espana)(ES)[h CEZ] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +6708F6B190683526BA76CD68B147F3DB Aardrijkskunde (1987)(Aackosoft)(NL) MSX NL +5FEA445CCA6CCCD74BF6B1297E80F78D Abeja Sabia, La (1986)(Anaya Multimedia)(ES) MSX ES +2273EB769F709E713D1A84E19A0C490B Alfamat (1985)(Anaya Multimedia)(ES) MSX ES +359A2692C4AF1E9C949270D79E8B3982 Aprendiendo ingles 2. Bernard goes to Mars (1985)(Sony Spain)(ES)(en) MSX en ES +4E1F84D680FDC8D98DC751C3F791A273 Balance (1984)(HAL Laboratory)(JP) MSX JP +B234BA460B83DFDD20255D22414A0DCF Biologia - Principios Inmediatos (1985)(Microgesa)(ES) MSX ES +AA00F466F8AC420CF8802BD6632A2123 Buscando las Palabras (1987)(Editorial Cometa)(ES) MSX ES +0C9FBA1C386CAF10C28210730AE24718 Celula, La (1987)(Microgesa)(ES) MSX ES +3B722C53A41C461A5F22229326D6EC0C Chemie (1987)(Gemaakt)(NL) MSX NL +331D90AF112567A01FEEDF6EC9C5FD11 Ciencias de la Naturaleza 5 EGB (1985)(Anaya Multimedia)(ES) MSX ES +7D750D88DBB1AD25620E4E060DF36C71 Ciencias de la Naturaleza 7 EGB (1985)(Anaya Multimedia)(ES) MSX ES +EEC88E0C06CD95FC3AE3FB4A5F8C5EBC Ciencias de la Naturaleza 8 EGB (1985)(Anaya Multimedia)(ES) MSX ES +F17369C00CD0057708351AEE28A97E34 Coconuts (1985)(Anaya Multimedia)(ES) MSX ES +31BDE23B03BF4A5A73960769ADD0E7CA Codigo de Circulacion (19xx)(DB Software)(ES) MSX ES +53CAE09B2688B8937AB9EA1C15096C83 Comarques de Catalunya (19xx)(Centre d'Estudis Catalunya 2000)(ES)(ca) MSX ES +124AC94AB62AED9C969008C00F83198D Cosmos (1987)(Club MSX)(ES) MSX ES +72C60635194CE23C593D7CAAF254959A Criptoaritmetica (1988)(Renato de Mello)(BR) MSX BR +BBF3928AF8E59A64E33AE05F5C52C473 Cuerpo Humano, El - Sistema Digestivo (1985)(Microgesa)(ES) MSX ES +87C4E0C4D37790045BE471C35926DF60 Cuerpo Humano, El - Sistema Reproductor (1985)(Microgesa)(ES) MSX ES +C3A1EF36997E8B61926ABBC50674AB58 Curso de BASIC (1985)(Sony)(ES) MSX ES +4B53EB2816AAED6F568B125051EF4A47 Curso de Ingles (1984)(Plus Data)(ES) MSX ES +2383F0F42BFFC76956A639CFE6C88D68 En Ruta (1985)(Microgesa)(ES) MSX ES +51E1593A7E74143AABEA9234E3B88A6F Farm Kit (1985)(-) MSX +78F690A5AB817C15862D7CBB895E8808 Fe y Vida 8 EGB (1985)(Anaya Multimedia)(ES) MSX ES +6F40CF9B1D4DBC0B53D830011B49CF15 Fun Words (1984)(Cheshire Cat Leisure) MSX +B118676F6729F9D33655F9F09F90DB37 Fun Words (1984)(Cheshire Cat Leisure)[a] MSX +629D2CDC1D0637F806C5DE1B26EBE8F6 IdeaType - Instructor Mecanografico (1985)(Idealogic)(ES) MSX ES +89450476AA6697B0B9F9CAD8455BE8B0 Je Compte (19xx)(-)(FR) MSX FR +B83C99CA9EB0EB3B43E80181B79B33EE Juega... Pero Seguro (1989)(OMK Software)(ES) MSX ES +870E9B032F787E1B1300D15EE5CB5BFB Ladron de Pasteles, El (1985)(Advance)(ES) MSX ES +A61B8BEF68F278387EBB822B731CA6BD Lire Vite. Leer Mas Rapido (1985)(Anaya Multimedia)(M6) MSX M6 +60769EA1BC8DFD6C0695646D210F39EA Mago Volador, El (1986)(Anaya Multimedia)(ES) MSX ES +B7054FAACA59A8984583812618F6CB72 Map Game (1985)(Erbe Software)(ES) MSX ES +2E71AC4D4334BA2B2D00E2BD77CE5C5D Map Game (1985)(Erbe Software)(ES)[a] MSX ES +7CA4C28540F588F9AD7DCCE382551EB2 Maths Invaders (1985)(Aackosoft)(NL) MSX NL +416F4256204B748D1CEDC3ACD8BAA7EC Merlin (1987)(Mind Games Espana)(ES) MSX ES +EA60403B5F2C5A79BBE8C6C951BE775C Mision Rescate (1986)(Anaya Multimedia)(ES) MSX ES +D0D11C7BADF937F0C2BF6D4670D459F2 Mision Rescate (1986)(Anaya Multimedia)(ES)[a] MSX ES +8B134D440E3216A5A4FCCC37B95ABFC7 Monkey Academy (1984)(Konami)(JP) MSX JP +C2EA99199A522FF00DC1771AFEC2A3C1 Motorista Sideral, El (1986)(Anaya Multimedia)(ES) MSX ES +1E2F0CC7E16B0DDAC3E29699E9F667CA Motorista Sideral, El (1986)(Anaya Multimedia)(ES)[a] MSX ES +6465004F8952C35EAD33196A203E6624 Multipuzzle (1985)(Anaya Multimedia)(ES) MSX ES +AD17B63C330E4F94C412DA21CC0AA961 Musica en Juego I - Solfeo (1986)(Sony)(ES) MSX ES +7510009D81C0F1B247B39EA7DCE213C6 Number Painter (19xx)(ASK)(GB) MSX GB +1EA03344CA8FDDF95670E30B29EAD20D Paises del Mundo I - Africa (1984)(Sony Spain)(ES) MSX ES +1C6D7D99A461B14222B64FD33DA3E764 Paises del Mundo I - Europa (1984)(Sony Spain)(ES) MSX ES +B21B6E46C4C0F4666A05FDB7C986A199 Paises del Mundo II - America (1984)(Sony Spain)(ES) MSX ES +9DC52F7F947329750332AF8EFA2A2F96 Paises del Mundo II - Asia (1984)(Sony Spain)(ES) MSX ES +F8D438F39A83E39A8B9AB26EA3FF98E4 Patagoras Software educativo - Los Gases I Ley de Boyle-Mariotte (1985)(Ediciones SM)(ES) MSX ES +E5F9A41B52BA4FC857757CB00855E1B2 Puddles - Exercices avec Formes (1984)(Morwood Software)(GB)(fr) MSX fr GB +96F8A4EC2C0EEC0DF0AE7C8CC0DC9E05 Sabiondo, El (19xx)(P. Cerrillo)(ES) MSX ES +13EAD2B07FEEE934D1663B8ACED6184C Star Seeker (1985)(Mirrorsoft)(GB) MSX GB +2CC8861DA53EBB1B97A5F8502A8CC3F3 Topografie Nederland (1986)(Philips)(NL) MSX NL +BF82D6292BBDF42C079D2F1FDD1F1147 Topografie Nederland (1986)(Philips)(NL)[a] MSX NL +E4D2DC04113AD37F851D3E33952FD9D9 Trivial Pursuit (1986)(Domark)(ES-GB) MSX ES-GB +994D7F458C686D12619DA9FD41C2DDAF Trivial Pursuit (1986)(Domark)(ES-GB)[a] MSX ES-GB +11AE1185A91115A8C5CD0BF0AAABF944 X-Mas Demo (2004)(Zona Neutra) MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Games - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +EF2EC5935D239FC668CD43606FC6AAED B Alien Syndrome (1988)(Dro Soft)(ES)[b] MSX ES +D65406FFD18F5CCB3F3846C5048E9083 B Animal Land Murder Case (1987)(Enix)(JP)[cr SMA][b][needs 256k] MSX JP +16282036BB504E75B0BA7FFEE5AAE66D B Back to the Future (1985)(Pony Canyon)(JP)[b] MSX JP +9EB3F472A27F017D110E3B623187FA08 B Comecocos (19xx)(Idealogic)(ES)[b] MSX ES +4C6EDBADA6B9E901CE53D2F7EE1F3E35 B Cribbage (19xx)(-)[b] MSX +A16B1C35E2A7A55DD506EADCE66E452B B Eggerland Mystery (1985)(HAL Laboratory)(JP)[u][b] MSX JP +225DC8D7D9FCD84D759C640A5B35122C B Elite (1987)(Firebird Software)(GB)[b] MSX GB +0DD68C506A02ABFF87B541442245769C B F747 (19xx)(-)[b] MSX +25582E906B2A5F14CC1C034C4320EB9C B Ghostbusters (1985)(Activision)(US)[b] MSX US +159A1784DB1958421225F0C0D8191E3C B Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[b][needs 256k][SCC] MSX JP +C983504DFCED1E5C7703B216560CFD2A B Hero-X (1985)(H. Itsui)[b] MSX +26D8F1B81C6F5CFC7185EB02A0FA3820 B Icicle Works (19xx)(-)[b] MSX +C4109DF24B7773559E993E85BDE3EF1A B Jet Set Willy (1985)(Software Projects)(GB)[u][b] MSX GB +7C1D810022881574DBEF737239118CBA B Livingstone Supongo (1986)(Opera Soft)(ES)[b] MSX ES +ACFF45154DE02E0283AFDE6526BE5DB7 B Penguin (1988)(Eurosoft)(NL)[b] MSX NL +D958BF9CBEC42E0663C498EBBFC591A3 B Power and Magic (1990)(Zigurat Software)(ES)[b] MSX ES +4817633CC1562495FDEABE29D4E0925F B Silent Shadow (1988)(Topo Soft)(ES)[b] MSX ES +A4653C08122EBD361925AC0BE87C24E2 B Space Rescue (1988)(Eurosoft)(NL)[b] MSX NL +DE263AB04BFF5ED32643BDAE17EFEAF0 B Super Laydock - Mission Striker (1987)(T&E Soft)(JP)[b] MSX JP +D0DFF8C4D6464DEE4BAC7744FA510F15 B Time Bandits (1984)(PSS)(GB)[u] MSX GB +395957FB82231D30E5148EB34801F788 B Vaxol (1987)(Heart Soft)(JP)[b] MSX JP +DE0F30F98A3F976D01F80809DBD7CBAD B Zipi y Zape (1989)(Dro Soft)(ES)[b] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +BDAD62A100511E39A72639D3573242FD H 007 - The Living Daylights (1987)(Domark)(GB)[t +2] MSX GB +E021529819914179D442055AE73F6204 H Abracadabra (1988)(Proein Soft Line)(ES)[h MSX Games bOX] MSX ES +5EA2AE74B84536D675E2ADB5CE7E52D6 H Adel (1986)(Mind Games Espana)(ES)[h CEZ] MSX ES +E891CDDB80A6B682AC055C9DA7FCE505 H After the War (1989)(Dinamic Software)(ES)[cr King Soft] MSX ES +9CAAF915A5294A033DF0A8EFB4486EDF H Alcatraz - A Fuga Impossivel (1986)(Editora Aleph)(BR)[h MSX Files] MSX BR +0A5A41B1A219B39220524176A9E2C020 H Amoto's Puf (1988)(SPE)(ES)[cr Fun Soft] MSX ES +5D90ED9D0F5789B5A8FEC32C5BF7E568 H Animal Land Murder Case (1987)(Enix)(JP)[cr SMA][needs 256k] MSX JP +79AD464C9483D1A56578A79DF7B6B707 H Antarctic Adventure - European Version (1984)(Konami)(JP)[cr El Halcon Pirata] MSX JP +0FB49B71A643087939176F02B85C4E71 H Aquapolis SOS (1983)(General)(JP)[cr Sammi] MSX JP +B021288F793FC6EC42FDAB168F451DBA H Arkos I + II + III (1988)(Zigurat Software)(ES)[t] MSX ES +AD77337B00C8B043FD4C7D1213E8302E H Arkos II (1988)(Zigurat Software)(ES)[t] MSX ES +560C4388B322D5DE5FBA48EB2C76FB9C H Army Moves (1987)(Dinamic Software)(ES)[h MSX Games bOX][t] MSX ES +DB006E954E9B6D9528FF31353D82E3DB H Army Moves (1987)(Dinamic Software)(ES)[t] MSX ES +2D3C6B5CABFC37B8E604C6CBDFCFBDDF H Aspar GP Master (1988)(Dinamic Software)(ES)[h MSX Games bOX] MSX ES +3AF7BEF735567D6A779A2BD9BE58AB30 H Astro Blaster (1988)(Eurosoft)(NL)[cr Crazy Boss] MSX NL +44727E2E3F3D1E236D15FC3509960045 H Astro Marine Corps (1989)(Dinamic Software)(ES)[h CEZ] MSX ES +B8B3435382EF500C47EDF0FDF33CDAB7 H Aventura Espacial, La (1990)(Aventuras AD)(ES)[h CEZ] MSX ES +9D3BC7B5E39FD3C600674055489007CE H Barbarian (1988)(Mastertronic)(GB)[t] MSX GB +06EB0AFE4035C166849ABAFB00617A93 H Barbarian II - The Dungeon of Drax (1988)(Erbe Software)(ES)[cr Damian Roman] MSX ES +31F41CE6AD8BD4DDC9B8EFC42B7E4B39 H Barn Stormer (1985)(Electric Software)(GB)[cr Magicracks] MSX GB +70B20534D72C68003BF894D27FF43549 H Batman - The Movie (1989)(Ocean Software)(GB)[cr Damian Roman] MSX GB +A9740399081124BD9447C2D1B21D8FA0 H Batman - The Movie (1989)(Ocean Software)(GB)[cr Damian Roman][a] MSX GB +AF0117FBE61C7E4604E566089E0DBB8C H Battle Ship Clapton II (1984)(T&E Soft)(JP)[cr Predator] MSX JP +C5D48BE7A9107760333372B5BE855D41 H Bestial Warrior (1989)(Dinamic Software)(ES)[t] MSX ES +6A02F0CDAFB1FE07CFE218627286D119 H Blow Up (1988)(Eurosoft)(NL)[cr Crazy Boss] MSX NL +66351A9823AECEDEAFA398CC2CE16E98 H Boing Boing (1985)(Idealogic)(ES)[h MSX Games bOX] MSX ES +19CF976EC1DC5B43D6E30B01FEDE62D6 H Bousou Tokkyuu SOS. Stop the Express (1985)(Hudson Soft)(JP)[cr Eg] MSX JP +D63ED4941584FD310B9B23C3ECF409BC H Brick Breaker (1987)(Dro Soft)(ES)[h CEZ] MSX ES +D33AA308DB8D9FC429BD6A03D1C7691F H Bronx (1989)(Animagic)(ES)[cr Damian Roman] MSX ES +6D0A0E2F34F5CFB0E65F49FB97CD974A H Bronx (1989)(Animagic)(ES)[cr Damian Roman][a] MSX ES +F75AC5C2E2CDCB68EB6C6A699D1189B5 H Bumpy (1989)(Loriciels)(FR)[cr Drack Soft] MSX FR +1C6C377D3852C61A7F6C74248AD7D80C H Camelot Warriors (1986)(Dinamic Software)(ES)[h MSX Games bOX] MSX ES +894C2D3C9DE416904E0A6F4601F5D9A5 H Capitan Trueno (1989)(Dinamic Software)(ES)[t] MSX ES +BD44E33AD1AF973533F8469B05F1F842 H Casanova (1989)(Iber Soft)(ES)[cr Knight Software] MSX ES +CDC8FB0E3C39857868CD8922D374F9B1 H Casio World Open (1985)(Casio)(JP)[cr Boram Soft] MSX JP +E59C4CA83A9869D7CFE22E2F86FDBACD H Castle Excellent (1989)(ASCII)(JP)[t Damian Roman] MSX JP +048DD4090ED79D253DA95A47CD35A43C H Cavern of Death (1987)(Dro Soft)(ES)[h CEZ] MSX ES +CAC338A548C2791B9903B40FB06E055A H Champion Ice Hockey (1986)(Pony Canyon)(JP)[cr Nemesis] MSX JP +375012FB0C91D2F9C8043237B7D0D6C3 H Chase H.Q. (1988)(Ocean Software)(GB)[cr Forca Informatica] MSX GB +7F7D34E1231D0007C346AC3C9901BDE9 H Colt 36 (1987)(Topo Soft)(ES)[t] MSX ES +D6E0C6310EA7599218028D1AB24BA86E H Comando Quatro (1989)(Zigurat Software)(ES)[t] MSX ES +5E7158555E3F284EB62FFCC61BE70507 H Continental Circus (1989)(Virgin Mastertronic)(GB)[cr Damian Roman] MSX GB +36AD6134C7470AD9F6929B15BA430E38 H Cosmic Sheriff (1989)(Dinamic Software)(ES)[cr Barcelona MSX Club] MSX ES +C87AF1B6F2C6C75DB4D7D863C55B9605 H Cosmic Sheriff (1989)(Dinamic Software)(ES)[cr Barcelona MSX Club][h CEZ] MSX ES +A3BEADEE05F0D8F433DD954A62C0F0AE H Daishogai Keiba. Exciting Jockey (1984)(Casio)(JP)[cr Chevan] MSX JP +91C7FCEE7EFF3DE7DB8C5ABE329D5682 H Danger Mouse in The Black Forest Chateau (1986)(Alternative Software)[cr Nemesis Informatica] MSX +2A1D873EC703C0B22BA6470FB7B62D6D H Descubrimiento de America, El (1986)(OMK Software)(ES)[h CEZ] MSX ES +7A9396E0D1C9EE9976B18DD1BA91803A H Dimension Omega (1989)(Positive)(ES)[cr Barcelona MSX Club] MSX ES +EC1001B493DCC7D6B326BC6BE4DA35FA H Dimension Omega (1989)(Positive)(ES)[cr Barcelona MSX Club][a] MSX ES +53A94FE802CE615A333B18422B4CDCF1 H Dimension Omega (1989)(Positive)(ES)[h CEZ] MSX ES +B14F48F4CA289B3ADDEBB90C8EABEE21 H Dip Dip (1985)(Indescomp)(ES)[h CEZ] MSX ES +4FC244B8660023B4AF27827DB7492AEE H Double Dragon (1988)(Dro Soft)(ES)[cr Paulisoft Informatica] MSX ES +458B9B1F8EA0D9C6E11A1905D8EDD446 H Double Dragon (1988)(Dro Soft)(ES)[cr Paulisoft Informatica][a] MSX ES +C5EE0C52C2E2C7F8DCC013BE84AABFB1 H Double Dragon II - The Revenge (1990)(Dro Soft)(ES)[cr Forca Informatica][a] MSX ES +A6EF10BCA56B2BC6335985ECB9EC1983 H Double Dragon II - The Revenge (1990)(Dro Soft)(ES)[cr Forca Informatica][a2] MSX ES +ADCBC3158523D8A03B743AF72FEFA8BF H Double Dragon II - The Revenge (1990)(Dro Soft)(ES)[cr Forca Informatica][t] MSX ES +5A399E1B495BCB2588CB4C510258E5C8 H Dungeon Mystery II (1987)(Scorpionsoft)(NL)[cr Canal Cracker] MSX NL +DC7F964C0ABE7F101855DE145BCBF6F5 H Dungeon Mystery II (1987)(Scorpionsoft)(NL)[cr Canal Cracker][a] MSX NL +A58B6CBF89A3202B9036A2423C82B674 H Dynamite Dan (1986)(Mirrorsoft)(GB)[cr Traposoft] MSX GB +3AC51F61CA813E6AF5F6C94E39146282 H Eagle (1987)(Dro Soft)(ES)[h CEZ] MSX ES +C57C4CCA4475368DD028042F1DF05692 H Eagle Control (1988)(Eurosoft)(NL)[cr Crazy Boss] MSX NL +0A5FFA6233E9DACD28ACD8AA5509435F H Emilio Butragueno Futbol (1988)(Topo Soft - Ocean Software)(ES-GB)[cr Fun Soft] MSX ES-GB +63B67BEF232725127843E31755A76472 H Emilio Sanchez Vicario Grand Slam (1989)(Zigurat Software)(ES)[cr Damian Roman] MSX ES +0269A1E1144F9A4C724A7D383FAAA5C1 H Enchanted (1989)(Positive)(ES)[h CEZ] MSX ES +E04F2A59D04224C97D84A6377CAAC76E H Espada Sagrada, La (1990)(Topo Soft)(ES)[cr Damian Roman] MSX ES +3CD6B32475A37D6ECA94F0799ED2997A H Espada Sagrada, La (1990)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +D315D32FE4EC898FE420324B3FD8A865 H Espada Sagrada, La (1990)(Topo Soft)(ES)[cr Damian Roman][a2] MSX ES +F68DDF507482B48E7AE9BB6CFC74AF2B H Fantasy Zone (1986)(Pony Canyon)(JP)[cr SMA][a][needs 128k] MSX JP +42947868C16268123C20645A480EB8EA H Fantasy Zone (1986)(Pony Canyon)(JP)[cr SMA][needs 128k] MSX JP +4FDD37C9CA4F453A86C47FE61DBC196A H Final War (1988)(Alfredo Delgado)(ES)[h CEZ] MSX ES +BAF52A77D7FEA56DBA908446848D16FB H Fire Star (1988)(OMK Software)(ES)[h CEZ] MSX ES +5DCF4D1B976F34FE364BB8A503622246 H Fire Warrior (1991)(Electromagic)(ES)[h CEZ] MSX ES +8F276F36F8B8E459EFD9ACA824CD0E02 H Flipper Slipper (1984)(ASCII)(JP)[cr Tape Crackings] MSX JP +C40057F8802C403801D7C77313EF8156 H Flop Chop (1985)(Sony)(ES)[h CEZ] MSX ES +DA711E1C75A4B344D70A7B41072B2C62 H Freddy Hardest in South Manhattan (1989)(Dinamic Software)(ES)[t] MSX ES +43ADB754F0767AC80FD23CDF8D83A386 H Frog (1988)(Eurosoft)(NL)[cr Crazy Boss] MSX NL +349046B87D1907606C793BFE9BE33F2F H Futbol (1985)(Indescomp)(ES)[h CEZ] MSX ES +4E17D1A1D7EC631F1E0D900D0BE42F13 H Galaga (1984)(Namcot)(JP)[h] MSX JP +F448FA10CD87A468E328AAD537D571FB H Gemini Wing (1989)(Virgin Mastertronic)(GB)[cr Damian Roman] MSX GB +623D8813D378A22FC22B4B744586BDA1 H Gemini Wing (1989)(Virgin Mastertronic)(GB)[cr Damian Roman][a] MSX GB +1D1338EB66729BA74A4EBBCD5A58CBCA H Globiblood (1986)(Proeco)(ES)[h CEZ] MSX ES +6E2E72E1753335C3DB2D957D5C24C704 H Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[h C.S.I.][t][needs 512k][SCC] MSX JP +EC4E46A496CFCA5CF069C722EBEA21DC H Golden Basket (1990)(Opera Soft)(ES)[cr Damian Roman] MSX ES +8756DBDABA2EAAA901AFBBA30FF0CCBC H Golden Basket (1990)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +1C4381734BD5AFAA41C9C989250DDADA H Golvellius (1987)(Compile)(JP)[cr Sergi Martinez][a][needs 256k] MSX JP +921AFCE15ED2788067F7C82BF2D548E3 H Golvellius (1987)(Compile)(JP)[cr Sergi Martinez][needs 256k] MSX JP +93B34E38359B266A40DB93FB616C5CC4 H Golvellius (1987)(Compile)(JP)[t][needs 256k] MSX JP +E00C5680B6A313557273825D0BA22AAB H Goody (1987)(Opera Soft)(ES)[h MSX Games bOX] MSX ES +8083AE9D739AD052C86A4AFC8D72B3DF H Gradius 2. Nemesis 2 (1987)(Konami)(JP)[cr Sergi Martinez][t +3][needs 256k][SCC] MSX JP +B6761FE8C388F8B8754A1D5A1D9F1BBC H Gremlins 2 - La Nueva Generacion (1990)(Topo Soft)(ES)[cr Damian Roman] MSX ES +15E4138D7103691250D4BA515634AAB3 H Gremlins 2 - La Nueva Generacion (1990)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +D1BD4CA6F00F12B1A45B2BDFB718096C H Hades (1985)(Sony)(ES)[h CEZ] MSX ES +5D9CCBB921DECA6750F3FEF84DF84435 H Hades (1985)(Sony)(ES)[t] MSX ES +3D2E4B533C9AB81B8C9C750669DE1D50 H Hammer Boy (1991)(Dinamic Software)(ES)[cr Damian Roman] MSX ES +4CFDF29822540A10D9C685878D04270A H Hercules - Slayer of the Damned (1988)(Gremlin Graphics Software)(GB)[m menu in Spanish] MSX GB +FD8A58F8A05FE399ED87D33F3C3C9305 H Hostages (1990)(Erbe Software)(ES)(en)[cr Damian Roman] MSX en ES +F07FBCEA4AFECEA81E9C36170E895546 H Hundra (1988)(Dinamic Software)(ES)[cr LASP][t +3] MSX ES +0D2F995934184B587184F5399CDF0CF8 H Hype (1987)(Methodic Solutions)(NL)[h MSX Files] MSX NL +0E549D9D6EC84F93484F5394EAF472A3 H Hyperball (1985)(Mind Games Espana)(ES)[cr Damian Roman] MSX ES +ED67E7B108EAC72520E1066B1D517CAE H Hypsys (1989)(Techno Arts)(ES)[cr Damian Roman] MSX ES +F6E200DE83C4EA30BBC4195B4353B173 H Ice-Breaker (1990)(Topo Soft)(ES)[t] MSX ES +DFCBB8A07343030F5DAA3CBF52DFE254 H Igloo (1985)(Garbi Soft)(ES)[h CEZ] MSX ES +8229A81D6176A7D87A22A829C4DB29EE H Indiana Jones and the Last Crusade (1989)(Erbe Software)(ES)[cr Damian Roman] MSX ES +4A28DD0E0D6B4F99945AFEE437738FE1 H Indoor Race (1987)(Mind Games Espana)(ES)[h CEZ] MSX ES +5EA4A71D480C4F50AA18AA40E1B8DA8F H Italia '90 - World Cup Soccer (1989)(Dro Soft)(ES)[h MSX Files] MSX ES +EB098136D07FC4E65BC7BFF442323D87 H Jaws (1989)(Screen 7)[t] MSX +20ED3B891F93B159FDB4CCC272F2960E H Jet Set Willy II - The Final Frontier (1985)(Software Projects)(GB)[t] MSX GB +035160F35550A8347BE7D8E9D7E03148 H Johny Comomolo in 3-2-1 Fire (1986)(Dro Soft)(ES)[h CEZ] MSX ES +46FDEF1817655A92FC5B85A0B60E2E95 H Jumping Jack (1986)(LiveWire Software)(GB)[cr Special Services] MSX GB +F817A5EA2F62A63EF073D35D0888842F H King Leonard (1986)(Mind Games Espana)(ES)[t] MSX ES +0369EFAF180E199FF9E10B6C5C27B329 H King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[cr Sigma][SCC] MSX JP +81DC806ADC3A4198CEC2F41933D56BF9 H Knight Ghost (1987)(Dro Soft)(ES)[m tape2dsk] MSX ES +EB09ECD1B68E5F238088C1A62F25957B H Knightmare III - Shalom (1987)(Konami)(JP)[cr Sigma] MSX JP +250721331306E473418EB4DC2F8BDF7A H Knightmare III - Shalom (1987)(Konami)(JP)[cr Sigma][a] MSX JP +29193A3CF4894E5FC481E72A28E08106 H Lady Safary (1988)(OMK Software)(ES)[h CEZ] MSX ES +84800C634BD9C86FC38248EA3CBBBC14 H Legend (1988)(Iber Soft)(ES)[h CEZ] MSX ES +EBED13CCBB872B483F6B2ECDD6D6F216 H L'Heritage - Panique a Las Vegas (1987)(Infogrames)(FR)(es)[cr New Soft][aka Inheritance, The] MSX es FR +EE1D57CB5AFC47F94B12225B82A31D02 H Liberator (1989)(Proein Soft Line)(ES)[cr Damian Roman] MSX ES +3DAB0B05F3984E7268ED90AAA559A59F H Liberator (1989)(Proein Soft Line)(ES)[cr Damian Roman][a] MSX ES +39020EE626D9243F98F2A3F2C7615378 H Light Corridor, The (1990)(Infogrames)(FR)[cr Damian Roman][t] MSX FR +C76474ACE5308983F28FBE09685D0ED8 H Livingstone Supongo II (1989)(Opera Soft)(ES)[cr Damian Roman] MSX ES +5FE8A0304D7069AF72A65334641D050D H Livingstone Supongo II (1989)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +99F838A9ADD8EE817617F9280BB67B8C H Lorna (1990)(Topo Soft)(ES)[cr Damian Roman] MSX ES +879AD8EB202852492BF4DEFACC35F9B3 H Lorna (1990)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +05768F8299CD718DCD3DA9C0C9B0DFB8 H Mad Mix 2 - En el Castillo de los Fantasmas (1990)(Topo Soft)(ES)[cr Damian Roman] MSX ES +35E147C4A6704F385F9F409276A40897 H Mad Mix 2 - En el Castillo de los Fantasmas (1990)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +7BBC195E7F53B7DA201BBD438FF42E52 H Maldicao da Vila Sinistra, A (1988)(P.I.S.C.)(BR)[cr FreeSoft Club] MSX BR +D1F5BFA3FB8899B8A7B32FECBFB288DA H Manchester United (1990)(Krisalis Software)(GB)[cr Damian Roman] MSX GB +2D8ED50DE57FFA0996443F72AA7FFDBA H Mayhem (1985)(Mr. Micro)(GB)[cr Magicracks] MSX GB +4E2BA59522327374DE834CFE521F9467 H Maze Max (1985)(Loriciels)(FR)[m cas2dsk] MSX FR +F83B8897E1507DA07339E34197F4F9E3 H Michel Futbol Master (1989)(Dinamic Software)(ES)[h MSX Games bOX] MSX ES +5FF05F35218B9D8D19D37EAC8DC0633C H Moai no Hihou. Secret Treasure of Moai (1986)(Casio)(JP)[cr Static Soft] MSX JP +FF9CFBF986949069CF97966D017AEE00 H Moonwalker (1989)(US Gold)(GB)[t] MSX GB +8CA17FA76E189C722075441FE43877B0 H Mot (1989)(Opera Soft)(ES)[cr J. Hernandez] MSX ES +55A6485C2D4EF22C08AE21ABAE55D4B0 H Mot (1989)(Opera Soft)(ES)[cr J. Hernandez][a] MSX ES +3DC063EB3BABAE726755035F7791CB34 H Mutan Zone (1989)(Opera Soft)(ES)(Disk 1 of 2)[cr Dominio][t] MSX ES +5C9ADB446EC4B56500DBD77E60DEE24C H Mutan Zone (1989)(Opera Soft)(ES)(Disk 2 of 2)[cr Dominio] MSX ES +FA27319948C1B3FBF9A62075B32D3954 H Mutant Monty (1985)(Artic Computing)(GB)[t +1] MSX GB +DDE2BD8B27AB7275762899F9787C8A4F H Mythos (1990)(Opera Soft)(ES)[cr Damian Roman] MSX ES +DCBCA5B2B4625B023C61A8EFC2143907 H Navy Moves (1988)(Dinamic Software)(ES)[h MSX Games bOX][code 53817] MSX ES +3AFFEAD5B23BAB59AAEF6176520DD9FF H New Bubble Bobble. Boggle Boggle (1988)(Zemina)(KR)[cr Mr The Bulldog] MSX KR +079EDF0484B526877764215A3CC542C7 H Ninja Jaja Maru Kun (1986)(Nippon Dexter)(JP)[cr Prosoft] MSX JP +BFA9B098DD523F62557F8B871B3A9B69 H Norseman (1984)(Electric Software)(GB)[cr Galicia MSX Club] MSX GB +1EBCD178F6BB9357BD8CC03B7F93D601 H Nuclear Bowls (1986)(Zigurat Software)(ES)[h CEZ] MSX ES +CA18C0D893BED11326CC7E7542991682 H Obliterator (1989)(Dro Soft)(ES)[t] MSX ES +189CD64A5A35FCB881701ACA5BE28BFF H Operation Wolf (1988)(Ocean Software)(GB)[cr Diego Soft] MSX GB +CC1D4134389DF12AF53B6D62308279FB H Pachicom (1985)(Toshiba-EMI)(JP)[cr Boram Soft] MSX JP +C8734321F521A937B9C11DEAAEB6919A H Parodius - Tako Saves Earth (1988)(Konami)(JP)[t Martos][SCC] MSX JP +9801AA604A949BDD74429A6BBA875183 H Pegasus (1988)(Victor)(JP)[cr Prosoft] MSX JP +86E836C316A0752C372C8B9468C778BE H Penguin Kun Wars (1985)(ASCII)(JP)[cr Prosoft] MSX JP +5FD0144FDA055C3F413666BE4FA8F3E8 H Penguin Kun Wars (1985)(ASCII)(JP)[cr Prosoft][a] MSX JP +E9A74605D328707032DCBF64D1791937 H Perico Delgado Maillot Amarillo (1989)(Topo Soft)(ES)[cr Fun Soft] MSX ES +0F20CF4F92EF044631EBAB0682B27BA6 H Perico Delgado Maillot Amarillo (1989)(Topo Soft)(ES)[cr Fun Soft][a] MSX ES +3064639BD96C121FD1324F92C85FF010 H Phantis (1987)(Dinamic Software)(ES)[cr EngeSoft] MSX ES +644336008A876EB7A98AE9FF547F2396 H Phantis (1987)(Dinamic Software)(ES)[t] MSX ES +F20E3EAB38BDA0BAA2A50FB8D9266295 H Piso Zero (1991)(Zigurat Software)(ES)[h CEZ] MSX ES +DDA71EFD91E1E189B44C6C14A0B1E121 H Poli Diaz (1990)(Opera Soft)(ES)[cr Damian Roman] MSX ES +F61A87652FC119755671EBACAD883FD8 H Poli Diaz (1990)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +783E52AF65A963E8722DB8F552E4B79C H Poogaboo (1991)(Opera Soft)(ES)[cr Damian Roman] MSX ES +D040F00B466FCB2887D297530ED5B174 H Poogaboo (1991)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +607B9666D594145166321F9414245E70 H Poppaq the Fish (1986)(ASCII)(JP)[cr Boram Soft] MSX JP +BFE127B708CBE7239A00CA0548396661 H Post Mortem (1988)(Iber Soft)(ES)[cr Fun Soft] MSX ES +49CFB9E18622ABEEE27722CB56D5E595 H Post Mortem (1988)(Iber Soft)(ES)[h CEZ] MSX ES +CF2360A23745637412690B7DFD23221F H Power and Magic (1990)(Zigurat Software)(ES)[h CEZ] MSX ES +0C5467DEB001382AA5446F1E3F113EE6 H Race City (1988)(Iber Soft)(ES)[h CEZ] MSX ES +4C65E19EE3F95328ACDF658171F0902F H Rampart, The (1988)(Iber Soft)(ES)[h CEZ] MSX ES +8A74C894E72E10E6DC717F7D0F3C8C62 H Relics (1986)(Bothtec)(JP)[cr Fun Soft] MSX JP +FEAD91E28471B8A0CEE0E12CEB447A2B H Relics (1986)(Bothtec)(JP)[cr Fun Soft][a] MSX JP +E23654091F14A501BFDD3DBF6F31ECD6 H Renegade III - The Final Chapter (1989)(Imagine Software)(GB)[cr Pau D'Aci][t] MSX GB +32E63FBDDB9157585DCC0B763429E839 H Roma - La Conquista del Imperio (1986)(Idealogic)(ES)[h CEZ] MSX ES +47F18AD867CCE151186CA97E25DF58C2 H Running Man, The (1989)(Grandslam Entertainments)(GB)(es)[cr Damian Roman] MSX es GB +9262B56EE1D2F49E38535CF0AFCAD80F H Sabotaje (1988)(P.J. Software)(ES)[h CEZ] MSX ES +59C6265B2A88CB2AF557A5FE87743094 H Sailor's Delight (1987)(Eaglesoft)(NL)[cr Barcelona MSX Club] MSX NL +3BE3D553380C7C518A96B518FF31ACB1 H Saint Dragon (1990)(Dro Soft)(ES)[cr Damian Roman] MSX ES +3A767F232180B9E72C5DE76FB1ECEBC0 H Sajedrez (1985)(J. Serena)(ES)[h CEZ] MSX ES +79FA6D7E8CE043C10F44EFA9BE5FFAD4 H Samantha Fox Strip Poker (1986)(Martech Games)(GB)[t] MSX GB +99A96FD72F17EF941654BAB992C05394 H Satan (1989)(Dinamic Software)(ES)[cr Drack Soft] MSX ES +F9F0560023D10CF1E7CC0B2D041C22C3 H Satan (1989)(Dinamic Software)(ES)[cr Drack Soft][a] MSX ES +C476364412F403257BC326842C36D0C1 H Senda Salvaje (1990)(Zigurat Software)(ES)[t] MSX ES +2B4415F6E6D1EF717BF07E2A9A3349CF H Silfi (1988)(Iber Soft)(ES)[h CEZ][copy from Elidon] MSX ES +EB06E3E99FC775B3EB24D3E472B1E690 H Sirwood (1990)(Opera Soft)(ES)[cr Damian Roman] MSX ES +97D7ED427D1E245E591DD0DA87BF1AB5 H Sirwood (1990)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +2CF53803EE73C691E05066DFEDFCC0ED H Sito Pons 500cc Grand Prix (1990)(Zigurat Software)(ES)[cr Damian Roman] MSX ES +24ABB75E2527903C6B969D68EF450CD3 H Sito Pons 500cc Grand Prix (1990)(Zigurat Software)(ES)[cr Damian Roman][a] MSX ES +EFE439480E33742928A501DD3ACEEAB9 H Skate Dragon (1986)(Idealogic)(ES)[h CEZ] MSX ES +D9710AD30AD5A2F0A6E243F5AAA30494 H Soviet (1990)(Opera Soft)(ES)[cr Damian Roman] MSX ES +93E99E6A4B73FC9AEDDD7B703058353A H Soviet (1990)(Opera Soft)(ES)[cr Damian Roman][a] MSX ES +DEEEA8C088213621B045BC6607D4C49B H Space Shuttle - A Journey into Space (1986)(Activision)(US)[cr Bug] MSX US +D13910056B41FC75381D0C4C6154E3B1 H Space Smugglers (1989)(MHT Ingenieros)(ES)[cr Damian Roman][gunstick] MSX ES +C8F1A4DC4C3A1FBED6B7EB1932A0DFF1 H Starbyte (1987)(Mister Chip)(ES)[h CEZ] MSX ES +AC132D6DB3492B4289CD6C3084E51966 H Stardust (1987)(Topo Soft)(ES)[f WYZ][h CEZ] MSX ES +9794D93F5DB63AFF69830B2B377CB195 H Superbowl (1985)(Budgie Budget Software)(GB)[cr Magicracks] MSX GB +E41C3EADA94536F541382C1F2F8506FB H Supertripper (1985)(Indescomp)(ES)[h CEZ] MSX ES +2A9029B20B8B892AE4106C5FE43127B4 H Teenage Mutant Hero Turtles (1990)(Image Works)(GB)[cr Damian Roman] MSX GB +E7984F1583D92A30A27A4385768CFD91 H Teenage Mutant Hero Turtles (1990)(Image Works)(GB)[h MSX Files] MSX GB +004CBC7CA0881687F463A216255F325C H Terrorpods (1989)(Dro Soft)(ES)[cr Damian Roman] MSX ES +03040AFFD8141CB96595FA1B3A2899C4 H Thor (1988)(Proein Soft Line)(ES)[h CEZ] MSX ES +E1F916888BE1C795A36D57E75F827886 H Thunder Blade (1988)(US Gold)(GB)[t] MSX GB +A9CF1F3D5D93EDC8DA0E1F71C2422C32 H Thunder Blade (1988)(US Gold)(GB)[t][a] MSX GB +374E23D231F782D5099620A2D7AE7737 H Thunderbirds (1989)(Grandslam Entertainments)(GB)[m menu] MSX GB +BC30893E657DC236B00AE39952F3BC54 H Thunderbirds (1989)(Grandslam Entertainments)(GB)[m passwd menu][RUN'THUNDER.BAS'] MSX GB +152ABEDA74842D797F8D1706B86B020D H Thundercats (1987)(Elite Systems)(GB)[h MSX Files] MSX GB +F3E9E4E1217ECA3B6B254EE5CFAD8190 H Time Out (1988)(Zafiro Software Division)(ES)[cr Damian Roman][t] MSX ES +D2AAE748CE3E2759302D2D1D4E1C47A9 H Time Out (1988)(Zafiro Software Division)(ES)[cr Damian Roman][t][a] MSX ES +9BC2015308C27DF89C08E788F10163ED H Time Rider (1988)(Eurosoft)(NL)[cr Crazy Boss] MSX NL +3EAAA1A5D79108CCB939DC8591ECC40B H Toi Acid Game (1989)(Iber Soft)(ES)[cr Damian Roman][t Cinema Soft] MSX ES +D4CC95966E365C65AF84DDBDAB17AD02 H Toi Acid Game (1989)(Iber Soft)(ES)[cr Damian Roman][t Cinema Soft][a] MSX ES +9EEEE0B5685BF41457F0AD2BCDABB0F6 H Tour 91 (1991)(Topo Soft)(ES)[cr Damian Roman] MSX ES +557771D08ED5FC98B25306F916636163 H Tour 91 (1991)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +67A75560B6621776CFF2F921223F687F H Trigger (1989)(Opera Soft)(ES)[cr Damian Roman][gunstick] MSX ES +6409FDDA316009DD417DBC2037272844 H Untouchables, The (1989)(Ocean Software)(GB)[cr Damian Roman] MSX GB +E8ACE3421BB77B0BD63869CE325FA7F0 H Untouchables, The (1989)(Ocean Software)(GB)[h MSX Files] MSX GB +B80AF33991C2011381ED8779A55B01B3 H Vampire's Empire (1988)(Dro Soft)(ES)[cr Damian Roman] MSX ES +FC66BE6ECCD6B7ACD92A69B03D211FB1 H Visitor - Bazar Catalunya (1988)(Mind Games Espana)(ES)[h CEZ] MSX ES +79581AE6E90152AB8E45BCD0C51B30F7 H War Chess (1986)(Idealogic)(ES)[h CEZ] MSX ES +FE921C16C509CC2BE78F48871FE2F324 H West Bank (1989)(Dinamic Software)(ES)[cr Damian Roman] MSX ES +56C81761536EADA0A6DE7DEDADE75B8C H Wizard's Lair (1986)(Bubble Bus)(GB)(M3)[h Jon Navarro][t] MSX M3 GB +A21B467911F01C236B30AD3A55641658 H Zakil Wood (1985)(Mr. Micro)(GB)[cr Captain Cracker] MSX GB +D446F71EFBF9C40A7954C6BBBCD482A5 H Zakil Wood (1985)(Mr. Micro)(GB)[cr Captain Cracker][a] MSX GB +A02A4B354305D51933D872EE1388DC06 H Zanac 3 (1989)(Pony Canyon)(JP)[cr Magicracks] MSX JP +42756773462DE1D74FCB457CE53E51EF H Zipi y Zape (1989)(Dro Soft)(ES)[cr Drack Soft] MSX ES +B16EFC77CCD0F2197B95E0EEB1BF2235 H Zipi y Zape (1989)(Dro Soft)(ES)[cr Drack Soft][a] MSX ES +1E74B6D2C8C8158FA4E2668EB6570EFF H Zona 0 (1991)(Topo Soft)(ES)[cr Damian Roman] MSX ES +673C56DC2E114D6ABC01FB4581DD4B4B H Zona 0 (1991)(Topo Soft)(ES)[cr Damian Roman][a] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +AE1D2D00A63FADD43B397362E2C2F983 T Attack 4 Women Volleyball (1986)(Pax Softonica)(JP)[tr pt DisProsoft] MSX JP +A86171D45C83CF539B3E4B168B8AE365 T B.C.'s Quest for Tires II - Grog's Revenge (1985)(US Gold)(GB)[tr it] MSX GB +5B4FF22647BBE4FDA1C5E70B9F00E18E T Bomber Man 3D (1984)(Hudson Soft)(JP)[tr it] MSX JP +859C253AB412A7B86CE8683142741C4A T Jump Jet (1985)(Anirog Software)(GB)[tr pt Plansoft] MSX GB +9069B2FFDBA4F98C62775F0685B98F3D T Laser Squad (1988)(Blade Software)[tr it Hydra Soft] MSX +2257A7E7E45A23F2D2486B03ADE8A180 T Mole Mole (1985)(Victor)(JP)[tr pt] MSX JP +EBE72EC650A48062C7088F7F04184552 T Mole Mole 2 (1987)(Victor)(JP)[tr pt Metalsoft] MSX JP +B3224FF5F309257527342651CCB3BDA7 T Mole Mole 2 (1987)(Victor)(JP)[tr pt Metalsoft][a] MSX JP +5C55BDB5C9C5114DE0672142BBAF3D5D T Mr. Gomoku (1984)(Apollo Technica)(JP)[tr pt DisProsoft] MSX JP +F06078754A75B1AF5E89D895801BCE34 T Thexder (1986)(Game Arts)(JP)[tr it] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +70CDE0F5DAFBD5258E0C60122E4B9757 007 - A View to a Kill (1986)(Domark)(GB) MSX GB +0CB62B8AA76E3201258254E90FB10760 007 - Licence to Kill (1989)(Domark)(GB) MSX GB +59148637870CED82635D3E6EC7552541 10 Yard Fight (1986)(IREM)(JP) MSX JP +463779A7113738AA658372337CF8C978 10th Frame (1986)(US Gold)(GB) MSX GB +ECF2EB0803236418B8163EA3FDFC82A0 10th Frame (1986)(US Gold)(GB)[a] MSX GB +1769E48DA3017020A19EB9021523775D 180 (1987)(Mastertronic Added Dimension) MSX +A51501CE4F52C4EA61DD71C8BC1DF476 1942 (1986)(ASCII)(JP) MSX JP +D6500807B20A77CD7654125F8334D417 3D Golf Simulation - High Speed Edition (1984)(T&E Soft)(JP) MSX JP +6BD0259923D110F747EFD9FBA16E970C 3D Knockout! (1985)(Alligata Software)(GB) MSX GB +A467BCD27A089030A984F513F7A6843D 3D Pool. Maltese Joe's Pool Challenge (1989)(Firebird Software)(GB) MSX GB +F117E713FCAE91CB6D17DF4DAF2C0ECF 3D Water Driver (1984)(Apollo Technica)(JP) MSX JP +1B6A1D46D0FD5EF1F3C04BDCB73DB5F7 4x4 Off-Road Racing (1988)(US Gold)(GB) MSX GB +C0F5EDD77724ECAAA86B014759A0C7FE 4x4 Off-Road Racing (1988)(US Gold)(GB)[a] MSX GB +016F877AC14B924A5127B480F2D38F8E 666 - Uma Aventura Macabra v2.02 (2003)(Christian Hofsetz)(en-pt) MSX en-pt +5F020EF72C3EA8C8E68C6E02A5BA0C07 7 Card Stud (1986)(Martech Games)(GB) MSX GB +C5A98D84DF25E837E9BEDE370FB55448 737 Flight Simulator (19xx)(Scorpio Software)(ES) MSX ES +7327D58D99B9620BACE692BCA346907A 747 400b Flight Simulator (1988)(Eurosoft)(NL) MSX NL +3659374A3E2B884BA38B1E26B7600163 8192 (1990)(Nagi-P Soft) MSX +D1AAA22D0D5D32B71FD4560953E9724B 98 Attackers (1990)(Satico)(JP) MSX JP +705BF632081E8DB9CC4D1612698EDC68 A.E. (1983)(Toshiba-EMI)(JP) MSX JP +66AAA464FEA28240FED0C6F67240F377 Abadia del Crimen, La (1988)(Opera Soft)(ES) MSX ES +2465727AA16A35CE14C24C2887C5769F Abadia del Crimen, La (1988)(Opera Soft)(ES)[a] MSX ES +154022DA1012BA94A379D4EB8A2327EC Abadia del Crimen, La (1988)(Opera Soft)(ES)[a2] MSX ES +A585ECE0046261293B7715A81245E269 Abadia del Crimen, La (1988)(Opera Soft)(ES)[a3] MSX ES +5165F70B64020FFC0E64F7C048BFFC20 Abracadabra (1988)(Proein Soft Line)(ES) MSX ES +739D1CC25FA370B6F91FCE1122D0BB2B Abu Simbel Profanation (1986)(Dinamic Software)(ES) MSX ES +3E5807A9DCE55FDC0A4CA20A9E8264E9 Abu Simbel Profanation (1986)(Dinamic Software)(ES)[a] MSX ES +ACD2B8F88CE8A487AD78D0706AEE9012 Ace of Aces (1986)(US Gold)(GB) MSX GB +55593728F6428653BC5E5F635A2ECD5B Acrobatas (1987)(Nemesis Informatica)(BR) MSX BR +BE9DE09503A7C5AE10CCEDC7D3290647 Actman (1984)(ASCII)(JP) MSX JP +AAEC93174D388EB04C9BF72762CAE0E3 Addictaball (1988)(Alligata Software)(GB) MSX GB +CFE0404E8005A8AFC7871BB00EA00117 Adel (1986)(Mind Games Espana)(ES) MSX ES +E995A25E6DFC20E5CF544EBC522BBE12 Adonis (1988)(MSX Magazine)(JP) MSX JP +E5AE55764CA5FBB29979410EDB8E38FF Adven'chuta! (1983)(MIA)(JP) MSX JP +2687F76D9BE27E17A1028ACE31A0310E African Trail Simulator (1990)(Positive)(ES) MSX ES +F1CDD30DDDCF4A46A447B118D9126597 African Trail Simulator (1990)(Positive)(ES)[a] MSX ES +5513367796B6B3D3F19C5AEB9BDA35C4 After the War (1989)(Dinamic Software)(ES) MSX ES +7F540E41F96F84D083A2B8D29C5A6238 After the War (1989)(Dinamic Software)(ES)[a] MSX ES +CFEACF1BF6B24D393C47B3BC6553D0D9 After the War (1989)(Dinamic Software)(ES)[a2] MSX ES +BC00B007010AF1E2DD93B386E00FFD1E Afterburner (1988)(Activision)(US) MSX US +669D346FB38BDB2172CC37EAE03CAD85 Afterburner (1988)(Activision)(US)[a] MSX US +2B987570EFB4E8DF3C169B0477262490 Afteroids (1988)(Zigurat Software)(ES) MSX ES +6A6EB7039634747B2A683FEA38EA983A Afteroids (1988)(Zigurat Software)(ES)[a] MSX ES +63727416F2DEF2942BEB39861EA1314F Aguia de Fogo (1986)(Ayrton)(BR) MSX BR +2501BB225A5E4F1AACF77226B494F3BC Air Fox (19xx)(Game Buster) MSX +FC99D914BB278236EEE931C16E8C3B3F Air Traffic Control (1986)(-)(FR) MSX FR +28ED7803902D528570FFCE00D7893F15 Akernaak (1987)(Max Tecnologic)(BR) MSX BR +94ABD0377C9A6684CBBA9D9DC40A75F3 Alcatraz - A Fuga Impossivel (1986)(Editora Aleph)(BR) MSX BR +C91645C0DCCF73C64B9C6C791A84743F Alcatraz - A Fuga Impossivel (1986)(Editora Aleph)(BR)[a] MSX BR +DB8F266877305FC349710565DD39741E Alcatraz 3 - A Fuga Continua (1990)(Hyper Soft)(BR) MSX BR +305B66E65211CAD6A31F1603D4BA4BE2 Alcazar - The Forgotten Fortress (1985)(Activision)(US) MSX US +CFC1A8E41927F311AC94CD4A742DD8EF Ale Hop! (1988)(Topo Soft)(ES) MSX ES +A62B9D4F2788A9A4D847031D7A09F153 Ale Hop! (1988)(Topo Soft)(ES)[a] MSX ES +FF79FACA85C4386A76A509689A8ACD17 Alibaba and 40 Thieves (1984)(ICM) MSX +DBA649CB02D67D9E919DB0FCD255D2E9 Alien 8 (1985)(Ultimate Play The Game)(GB) MSX GB +5C018233549C3E4389A7161F3FD961D9 Alien Syndrome (1988)(Dro Soft)(ES) MSX ES +ECAD2920AB3257403C1A8176150707C9 Aliens (1987)(Mr. Micro)(GB) MSX GB +4E8436884102F6149F60148FF537BF8A Aliens. Alien 2 (1987)(Square)(JP)[a][needs 256k] MSX JP +34E2FCEEC01760F497561BCA71CA24AC Aliens. Alien 2 (1987)(Square)(JP)[a2][needs 256k] MSX JP +9A3683E4BB67EC28E2B7773FC1811DB6 Aliens. Alien 2 (1987)(Square)(JP)[needs 256k] MSX JP +B001401BA96A11B094BFFBFB089561DD Alpha Blaster (1984)(Aackosoft)(NL) MSX NL +67C1DDA6CF7E394ABEC865E055B1AFA0 Alpha Roid (1986)(Pony Canyon)(JP) MSX JP +9C78C22FF49B8BB7C5CBEE38306ED8DD Alpha Squadron (1985)(Sony)(JP) MSX JP +DFCD4F8DBF32335C7A0B348CFF80FFE3 Alpine Ski (1987)(Methodic Solutions)(NL) MSX NL +C2474E2C1E361B987EFEA4514DB5BD98 Amaurote (1987)(Mastertronic Added Dimension) MSX +B4B88C71F33854DA5EC260C421DF5A9B Amazonia (1989)(ProKit)(BR) MSX BR +BD600803070FE49BE91D02CC7202F4D5 Amazonia (1989)(ProKit)(BR)[a] MSX BR +B0DBA278C4280963844CA70B0B103ADF American Truck (1986)(Telenet Japan)(JP) MSX JP +F25CB24A20F18B28C75A589A5DCFBD64 Amida (1983)(Pony Canyon)(JP) MSX JP +0633A69C2C98C0E3A6C4DE9BC6286699 Amo del Mundo (1990)(Positive)(ES) MSX ES +34BC6F060348175876892D2E7DFC8CC9 Amo del Mundo (1990)(Positive)(ES)[a] MSX ES +EEF4FC9F573C0994C54B906E5D183CF8 Amoto's Puf (1988)(SPE)(ES) MSX ES +42D32E65F9899EB39D3F1A810EEE247A Anaza. Kaleidoscope Special (1987)(Hot-B)(JP) MSX JP +EC2957DA92849E384CDB7AC1F7178C29 Angel Nieto Pole 500cc (1990)(Opera Soft)(ES) MSX ES +087CE7335E26C15E4E7AB7ACE2600FFE Angel Nieto Pole 500cc (1990)(Opera Soft)(ES)[a] MSX ES +8C7DEC453EC506BAFA4F5B95B4A9A1A2 Angelo (1984)(ASCII)(JP) MSX JP +F28F85F0820880E5D1E40CB7ED6CAB03 Angleball (1987)(Mastertronic Added Dimension) MSX +194893E514A66BECBFA9B298A83552CC Angra I (1989)(ProKit)(BR) MSX BR +083CBCDB599A1F4863572F8253AE8D8A Antares (1987)(Dro Soft)(ES) MSX ES +D5281F1A8D4CC74B99F7EB331EDE3D3A Antares (1987)(Dro Soft)(ES)[a] MSX ES +2E0243C241C9DCB96F29561C2D23C4C2 Anty (1984)(Bothtec)(JP) MSX JP +02E664A94913256E5403A2376ADBF17D Apeman Strikes Again, The (1986)(Eaglesoft)(NL) MSX NL +F16140E473656D54F049376AC0BB3B49 Aramo (1986)(Xain)(JP) MSX JP +0E686F990F8BD6E59328C27C717F826D Arctic Fox (1989)(Dro Soft)(ES) MSX ES +E0C1A1027809E7A1D6F39FD283A892D2 Arkanoid (1986)(TAITO)(JP) MSX JP +13E5FC0ACDC700E16C203704158C88DC Arkanoid Revenge (19xx)(-)(BR) MSX BR +3FA4AF81CAF900E14FCDE7500A1CB47B Arkos I (1988)(Zigurat Software)(ES) MSX ES +AE1D3DB86E24C0BC06B581D3B4F5326C Armada Contrataca, La (1987)(Editorial Cometa)(ES) MSX ES +3FE766B2C08925E2E2087299E2267480 Arquimedes XXI (1986)(Dinamic Software)(ES) MSX ES +C154B5F340C51590C98F66DA8B053A9E Arquimedes XXI (1986)(Dinamic Software)(ES)[a] MSX ES +B173033AA8028A4603046B646E4B3C16 Arubatoros. Albatross (1986)(Telenet Japan)(JP) MSX JP +A3F23B0F93932B6553C28580CEB9C3E5 Aspar GP Master (1988)(Dinamic Software)(ES) MSX ES +6A65F8DF7B188C4CC5D1C52A3B63A46E Astro Blaster (1988)(Eurosoft)(NL) MSX NL +B03B3B5CF08BE9AE6C3323E45A34B007 Astro Marine Corps (1989)(Dinamic Software)(ES) MSX ES +DAE763986D3424B0C7E3793DB1DEAAC3 Astro Plumber (1986)(Blue Ribbon Software)(GB) MSX GB +01C175F8FFB9F7E27AE18D7A8E146630 Astro Rocks (1984)(Kuma Computers)(GB) MSX GB +C5669CC7945800742965E63017F6E9EA Astrowulards, The (1987)(J.F. Molano)(ES) MSX ES +5080571D230FE8AA703D9D967A640A90 Astrowulards, The (1987)(J.F. Molano)(ES)[a] MSX ES +5ADE568A95316E9A1EA0F825466AC319 A-Team, The (1988)(Zafiro Software Division)(ES) MSX ES +10F160425019371AA03030A3D9EB64C9 A-Team, The (1988)(Zafiro Software Division)(ES)[a] MSX ES +7F61E488B955E2165DFDDEC951E95785 Athletic Ball. Ghost Flipper (1984)(ASCII)(JP) MSX JP +8C394707AA39F76A92C8B979AB7E38D3 Athletic Land (1984)(Konami)(JP) MSX JP +6699590B1781CF4F4A1DCAE80EC57006 Atom en Madriguera Peligrosa (1985)(-)(ES) MSX ES +CFB5C574E688E65589CCF1BAA0CC9B9D Attack Mosquito II (1986)(S.Ogawa) MSX +F5A41182789B415C0739C4D3907B8E6D Attack of Mosquiton (1986)(-) MSX +5621762FE9C5C95D791E3D626304D237 Attack of the Killer Tomatoes (1986)(Global Software)(GB) MSX GB +3429E4B0DFBE1C126275869C3643C1E2 Attack of the Killer Tomatoes (1986)(Global Software)(GB)[a] MSX GB +6FA897B290CDF0EF1030823396FD9402 Attacked (19xx)(Tynesoft)(GB) MSX GB +D0B6E75AB161E6091F3201FDB651DDBB Attilio Tubicini (1988)(MSX Hit Parade)(IT) MSX IT +BB53C25F241814855D18E7A5E3155208 Attilio Tubicini (1988)(MSX Hit Parade)(IT)[a] MSX IT +E50BC8569BFB9C7883AC13623D39A12C Auf Wiedersehen Monty (1987)(Gremlin Graphics Software)(GB) MSX GB +E1B8873243F75467EFB0E316A7CF0021 Auf Wiedersehen Monty (1987)(Gremlin Graphics Software)(GB)[a] MSX GB +6367E45690F666975D909A0B20518D31 Av. Paulista (1989)(Jose Oliveira)(BR) MSX BR +DEDDD49C172154487AD0CBC12232CE51 Av. Paulista (1989)(Jose Oliveira)(BR)[a] MSX BR +B28FE0D04553E1F1CC4C93EA35F0A625 Avenger (1986)(Gremlin Graphics Software)(GB) MSX GB +48AA73F7E4BAD70DBD859BBD171BB7DA Aventura em San Quentin (1987)(Ricardo Costa)(BR) MSX BR +6360EB16B34B6972813D8680240305E9 Aventura Espacial, La (1990)(Aventuras AD)(ES) MSX ES +9276A87DE99809598CFD3D3CB17F471A Aventura Espacial, La (1990)(Aventuras AD)(ES)[a] MSX ES +2A78B48863C7E5101E024B5FE927D2AF Aventura Original, La (1989)(Aventuras AD)(ES) MSX ES +87AB490776D904D3A4C071BB7E388C1D Aventura Original, La (1989)(Aventuras AD)(ES)[a] MSX ES +4A52403C27A8B945C485B7751ED4726D Averno (1989)(Proein Soft Line)(ES) MSX ES +605873B3132677F37D584FECFDAAB7F7 Averno (1989)(Proein Soft Line)(ES)[a] MSX ES +4E4D18155CAD288634AF714147DDCB4A B.C.'s Quest for Tires (1985)(Toshiba-EMI)(JP) MSX JP +34481EAB6A3504453347E1C5201172CC B.C.'s Quest for Tires II - Grog's Revenge (1985)(US Gold)(GB) MSX GB +68E3B9E30D49587400815B6CA5CCDF06 B.C.'s Quest for Tires II - Grog's Revenge (1986)(Topia)(KR) MSX KR +3A59F8DE96586970C8503AEEAC80241D Back to the Future (1985)(Pony Canyon)(JP) MSX JP +C550C96E55CB9DF1123A174FF8B15571 Backgammon (1984)(Electric Software)(GB) MSX GB +8B25B6AE45A77EFD9321DEF1EFA03424 Backgammon (1985)(Sony)(JP) MSX JP +9D2E1DD43DF172FB18A3BDAD9CB7E0A6 Ball 5 (19xx)(Nyan)(JP) MSX JP +5C125D9C8D7C975F180AAC729C959F9E Ball Out Special (1989)(MSX Magazine)(JP) MSX JP +4D6F606C4EDC86EE465E88FCE20A338C Ballblazer (1988)(Pony Canyon)(JP) MSX JP +E4939DEBF63D5BD5D2DE88683C3FEFE1 Ballblazer (1988)(Pony Canyon)(JP)[a] MSX JP +C827B35A70D089B3952A384B4A27C83B Balloon Punch (1989)(Satico)(JP) MSX JP +504E3C4C8E18B0E6ABBC6AA771EBA50B Ballyhoo (1986)(Infocom)(US) MSX US +7F20BA542DEC7F35FB6B8F78F202D242 Banana (1984)(ASCII)(JP) MSX JP +005FA4FC3324E79A1EFC6100A5E1C0A9 Banana Worm (1986)(Irgendwen) MSX +0EE3B513D01D02C175F01DA481F2FCC8 Bank Panic (1985)(Pony Canyon)(JP) MSX JP +9A0A7E42D3064718F98D0A5828F48999 Banzai (19xx)(-) MSX +D9502341F402040D7319179D4708991F Banzai 2 (19xx)(-) MSX +82645EC514A489A3A38FF68631864492 Barbarian (1988)(Mastertronic)(GB)(BR) MSX BR +9D614BC9CC10ED726734F5E6DF309364 Barnabasket (1989)(Barnajocs)(ES) MSX ES +CF97E550BF4A4CE5BBD9D6A6B05E7098 Batman (1986)(Ocean Software)(GB) MSX GB +E1248BD0368C3561AD60DE276CAAFBDE Batten Tanuki no Daibouken. Raccoon Dog (1986)(Tecno Soft) MSX +BCE2CCB3DF3048F4FB80E63CB4827895 Battle Chopper (1985)(Methodic Solutions)(NL) MSX NL +E12CA74D34AB1DD7292359898057A808 Battle Cross (1984)(Sony)(JP) MSX JP +DDA0C8A35F7132667C6CDA19CC8C596A Battle for Midway, The (1985)(PSS)(GB) MSX GB +65FAD236217EFCB30EA1FA8ACAC95FD5 Battle for Midway, The (1985)(PSS)(GB)[a] MSX GB +8BC2EDAC843514B7C4ABCC15809E8975 Battle Ship Clapton II (1984)(T&E Soft)(JP) MSX JP +453618C09D6644104C071BA414F2BAFD Beach Story of Tako (19xx)(-) MSX +E1DF2B52796CCEF91F350A88C9258496 Beach-Head (1985)(US Gold)(GB) MSX GB +DA0ADC9F543926BFB7A21EFC4740CECD Beamrider (1984)(Activision)(US) MSX US +4373049604044C09F21D08F3AAC8CE91 Bear George (19xx)(-) MSX +CAD1EC8C3358E8ADD74CBCAA72F5BADD Bee & Flower (1983)(Think Soft) MSX +F6343C65371D4DECA6613F84FE529C39 Bestial Warrior (1989)(Dinamic Software)(ES) MSX ES +6F56F9313C13D911E065A88A59293686 Bestial Warrior (1989)(Dinamic Software)(ES)[a] MSX ES +F149CB8C0465C5A7D77DBC060A1DFB97 Bilot (19xx)(MSX Soft)(BR) MSX BR +F8EF0699B5648D95DC4175AD2E9DAFE7 Binary Land (1984)(Kuma Computers)(GB) MSX GB +69DEFFB245CDD6D06FBACEEAB4607837 Bingo (1985)(Spectravideo)(ES-GB) MSX ES-GB +32CCDD6DBBB829203A3C269899F26C3B Bingo, El (1985)(Sony)(ES) MSX ES +43C5CABEADDF7E7197B59C09EC8AD8B4 Black Jack (1984)(Sony)(ES) MSX ES +ADFC185F298D74DBCB044727852392D6 Black Jack (1984)(Sony)(ES)[a] MSX ES +19F586D820322E3B0B186F6981FA1595 Black Onyx, The (1985)(ASCII)(JP)(jp) MSX JP +FBD46AD3ABDEEE65A5343B9B90958321 Black Onyx, The (1985)(ASCII)(JP)[a] MSX JP +C58E5784BBA922A2EA121C9CA98357F2 Blackbeard (1988)(Topo Soft)(ES) MSX ES +5BC93348345819EE4357C1786A3850DE Blackbeard (1988)(Topo Soft)(ES)[a] MSX ES +F27463935DE6EE8FA311BE212D99A5ED Blagger (1984)(Alligata Software)(GB) MSX GB +25CD4FC5534869F23E5FFCCE366AADF4 Blasteroids (1987)(Image Works)(GB) MSX GB +3A07D2CD7C84836573CCE10997EF115C Block Hole (1990)(Zemina)(KR) MSX KR +506D030EBC3E845FB8F8423420C26883 Block Hole (1990)(Zemina)(KR)[a] MSX KR +CA06F1A1820950C68B636E89F91D4F14 Blockade Runner (1984)(Toshiba-EMI)(JP) MSX JP +3F0A4472672FE6698EED93EB51ADAEEC Bloody (1987)(P.J. Software)(ES) MSX ES +04D82FEC4FEE9A27DC62003A1F29388B Bloody (1987)(P.J. Software)(ES)[a] MSX ES +D7DC3DAE30614085D76B4D31B5F5A021 Blow Up (1988)(Eurosoft)(NL) MSX NL +7469CED57AED8174C8D94AF9DE5C7536 Blow Up (1988)(Eurosoft)(NL)[a] MSX NL +5305880F49EAD51A0E867F7D7D3C7745 Blue & Pink (19xx)(-)(NL) MSX NL +5B00CC000009C8F3AD55C5B951FC7B3B BMX Rekencross (1985)(Philips)(NL) MSX NL +22203DB144BE22F5D8DDAE26D5600846 BMX Simulator (1987)(Codemasters)(GB) MSX GB +92A49BBBBD88E4FC1105773CEA0B42D3 BMX Simulator (1987)(Codemasters)(GB)[a] MSX GB +E9C81DD51E6A50E6A95B0632349DDA09 Boardelo (1995)(Bubble Bus)(GB) MSX GB +83D46075878ED452C50585F117CF9932 Boggy '84 (1984)(Nippon Columbia - Colpax - Universal) MSX +90335876BDEF0B165DD2A7463587ABFB Boing Boing (1985)(Idealogic)(ES) MSX ES +917DB16222913662AA00A5CCD3735E46 Bokosuka (1984)(ASCII)(JP) MSX JP +34ED905047A087F1F37198E3E700A61A Bologna & Milano (19xx)(-)(BR) MSX BR +31A0BD0F0EE7505689DA2469161DB6C8 Bomb Jack (2004)(MSX Files) MSX +3CFD8DD2567E1F9F10CB5635EDAF10A2 Bomber Man (1986)(Korea Soft Bank) MSX +B9A2F5456CB75D02D6CCB24F0868287A Bomber Man 3D (1984)(Hudson Soft)(JP) MSX JP +CFB0061546F038AC53EFAE45DAC25D58 Bomber Man Special (1986)(Hudson Soft)(JP) MSX JP +D20AC8100B9EEB67A86BBB6366219460 Bomber Man. Eric and the Floaters (1985)(Kuma Computers)(GB) MSX GB +B8BDBEC314800446555E3A0F99A0A295 Bomulus & the Lost Crown (1986)(Teknopiste)(FI) MSX FI +DC5D2CCF64E81BF30D0929681110F144 Booga-Boo. The Flea (1986)(Quicksilva)(GB) MSX GB +66D0F021791C2175DB623078AFA57695 Booga-Boo. The Flea (1986)(Quicksilva)(GB)[a] MSX GB +52EE4C6CEF5FC2EFC1A9F445F2E4E1E5 Boogie Woogi Jungle (1985)(Ample Software)(JP) MSX JP +DC355E69C445B54429EC58444583EB0C Boom! (1986)(Aackosoft)(NL) MSX NL +75896C8EE5A7AA140E1749567B8F5CDC Boomerang (1984)(ASCII)(JP) MSX JP +AB5A817BCFB31B4D07BB557EE6275474 Booty (1988)(Eurosoft)(NL) MSX NL +3A5EA66F8E2143AE5943889172A7E8E4 Bop! (1986)(Bug-Byte Software)(GB) MSX GB +438347E107773016AD8127AD88591198 Bosconian (1984)(Namcot)(JP) MSX JP +A3D4391D029460E43C3C77A9E5B42FE4 Bouken Roman - Dota (1986)(System Soft)(JP) MSX JP +D2E3A6C23FE6B5737AB92F1841EB9139 Boulder Dash (1985)(Databyte)(GB) MSX GB +29A1EF88D61179F1FFE95E643B57EF92 Boulder Dash II - Rockford's Riot (1986)(Databyte)(GB) MSX GB +0A157DA01F0BB4E4554AEAB9D670EDF5 Bounce (1987)(Methodic Solutions)(NL) MSX NL +19C643D4CFAF41BF514E3AF9C24A689B Bouncing Block (1988)(Idealogic)(ES)[a][aka Igloo] MSX ES +AFCA6BFD7139D424BEA368A288ECB3C2 Bouncing Block (1988)(Idealogic)(ES)[aka Igloo] MSX ES +BCA4F3B6AE01E85EC3C8C195C82756C6 Bounder (1987)(Gremlin Graphics Software)(GB) MSX GB +E392C939CFE2999ED1A112BD15ED9F98 Bousou Tokkyuu SOS. Stop the Express (1985)(Hudson Soft)(JP) MSX JP +4996A97D6454E1859DDC4F883E5357BF Boxing (1985)(Konami)(JP) MSX JP +77056B2F47F22C5EAAA3A7FC710A6D5B Break Free (19xx)(-) MSX +6EDF20AB36ECED2A91F7A7CB7E81987B Break In (1987)(Eaglesoft)(NL) MSX NL +44D7E51A4EBB42C642A2DA041F86E64D Break Out (1985)(Volker Becker)(NL) MSX NL +7F4CFD92CA952FC04D0F614C021E8E13 Break Out (1986)(Manfredi)(FR) MSX FR +290E001110586F259F8E4C0EDB1C153D Break Out (1987)(Revista) MSX +5CFDA95C1E369F26EA87E0EE66281D3A Break Out! (1985)(Toshiba-EMI)(JP)[needs 64k in slot 2] MSX JP +CF129F3952C8BDCA0722CD2418D04BD0 Breaker Breaker (1988)(Eurosoft)(NL) MSX NL +77BA730B9AB462EE6FAD6D21C4E4DD5F Break-Man (1985)(MSX Computer Magazine)(NL) MSX NL +0481E738A5263BD3274767B26D46C78D Brian Jacks Superstar Challenge (1985)(Martech Games)(GB) MSX GB +0064B20137E228FA96804ADA55968C4C Brick Breaker (1987)(Dro Soft)(ES) MSX ES +9CD4B566F1646766BA3B9857E97E187E Bridge (1985)(Nice Ideas)(FR) MSX FR +CF2162A3FD4B8F1A352FCBA6CE096971 Brisca (19xx)(Stars)(ES) MSX ES +6FADD0102C420FCCCF52C8016FEB8CC6 Brisca (19xx)(Stars)(ES)[a] MSX ES +86D00CE8BC6D4B61D96A2BEF5480A18C Brother Adventure. Mario Bros (1987)(Zemina)(KR) MSX KR +F12CBB1BE78E2E92A5B3594C4A98B231 Bruce Lee (1985)(Comptiq)(JP) MSX JP +FAB1D62729F701E784845ED96D89E2DA Bubbler (1987)(Ultimate Play The Game)(GB) MSX GB +C7FA81F542ADEB5FCB7D6DC63582C438 Buccaneer Strip Girl (19xx)(Iran Soft)(BR) MSX BR +A03271104C6149BD386E01B2C9A832B0 Buck Rogers - Planet of Zoom (1983)(Sega)(JP) MSX JP +1A005800E250356B9FE06869682C3982 Bugbuster (19xx)(-) MSX +CA65E5F4FB270590FC700DD3071C84C4 Buggy Ranger (1990)(Dinamic Software)(ES) MSX ES +2963B2936D9F11F4483CEA08F4C6DF33 Buggy Ranger (1990)(Dinamic Software)(ES)[a] MSX ES +7439BE381426F33FAC8388126A74C199 Buran (1990)(OMK Software)(ES) MSX ES +1EEE0F72DA7ADABD0FDD6F130711088D Burgerkill (1988)(Eurosoft)(NL)[a][aka Mac Attack] MSX NL +EC8D5707288763312B7516BB80EC0B41 Burgerkill (1988)(Eurosoft)(NL)[aka Mac Attack] MSX NL +CED128C924D3263383A75A4A84C5D601 Buru to Marty Kikiippatsu. Inspecteur Z (1986)(HAL Laboratory)(JP) MSX JP +FA0AB2C900656D74156422BA59341574 Buster Block (1985)(Kuma Computers)(GB) MSX GB +42FF037D8F2FD0274AA655EE917AB714 Busy Rainy Day. Super Doors (1983)(Hudson Soft)(JP)[Super Doors][Side B of tape] MSX JP +628B44620A5CC61327A3F13AE9BD7501 Butamaru Pants. Pig Mock (1983)(HAL Laboratory)(JP) MSX JP +8525624132951C9EEDBF502D15F9D0D6 Buzz Off! (1984)(Electric Software)(GB) MSX GB +F94F18108BBCB387312D715B616C6A87 Bytebusters (1984)(Aackosoft)(NL) MSX NL +71E9461FB2E886817237E5888A9C5C64 C So! (1985)(Pony Canyon)(JP) MSX JP +CD95786A599E0FAF6F3CADA9609150E7 Cabbage Patch Kids (1984)(Konami)(JP) MSX JP +BD2A116F0B420FFECC69C471233A7BE6 California Games (1987)(US Gold)(GB) MSX GB +CE250BB851252A5257F76CD7B0E69097 California Games (1987)(US Gold)(GB)[a] MSX GB +F0D1087E5E7F01A99F45BEA86D887079 Camelot Warriors (1986)(Dinamic Software)(ES) MSX ES +AA7E783ECF81E4930DEE407C1B5AF1BC Campo Minado (1991)(Renato de Mello)(BR) MSX BR +7CA43363C09CBC882E8063ECD1BC4133 Can of Worms (1986)(LiveWire Software)(GB) MSX GB +CF3E0303B0E1044085EDAC2427634792 Candoo Ninja (1983)(ASCII)(JP) MSX JP +91AB33F13CCA126977C1555F7AB329C9 Cannon Ball (1983)(Hudson Soft)(JP) MSX JP +87AFE9787973218E1765FC15B8C1D607 Cannon Fighter (1984)(Policy)(JP) MSX JP +D64EF87758A77C9D27C8C2AF759A021A Capitan Sevilla (1988)(Dinamic Software)(ES) MSX ES +BCC3210376968A8776A65E7C7C389681 Capitan Sevilla (1988)(Dinamic Software)(ES)[a] MSX ES +EB39DF8171C9CD5AB4FC9BA92A3D4C51 Capitan Trueno (1989)(Dinamic Software)(ES) MSX ES +2A2DC0B1B87C30B13562B86FDC6CEA0B Capitan Trueno (1989)(Dinamic Software)(ES)[a] MSX ES +3F8E378BDE2F656553A666FC15227A6E Caple (19xx)(-) MSX +869F7F70C6DF59B64D97D63D407165DB Captain Chef (1984)(Nippon Columbia - Colpax - Universal) MSX +CABBD1C47C9AFC25A4DCD3BC3F8B1C23 Captain Cosmo (1984)(ASCII)(JP) MSX JP +177604D05FEA14743DDF9233C1CCA39E Capture os Mongas (19xx)(Editora McGraw-Hill)(BR) MSX BR +71146D3804E4A7F9664FBC8F76AFF19D Capture os Mongas (19xx)(Editora McGraw-Hill)(BR)[a] MSX BR +ED84750C6FAF133773DFD93205996545 Car Fighter (1985)(Casio)(JP) MSX JP +FC2DD03E52A614CE23E71CBB0FCF650F Car Jamboree (1984)(Sony)(JP) MSX JP +0C9D94AC0A7FE10B34F2AB5A8D64E5BD Car Race (1983)(Ample Software)(JP) MSX JP +1C0A64F2FADD507550A6E64EDCA0525C Carlos Sainz (1990)(Zigurat Software)(ES) MSX ES +EA0362126545D8EF553E9BF28142087E Carlos Sainz (1990)(Zigurat Software)(ES)[a] MSX ES +1017EA771CFEA0E42669069047732A75 Carlos Sainz (1990)(Zigurat Software)(ES)[a2] MSX ES +9AF39B1FA97D2CC93260DDA104208F53 Carry (19xx)(-) MSX +619C170D12D393CF165A1CB0F9A31682 Casanova (1989)(Iber Soft)(ES) MSX ES +415A6E1EB1C14CF9D6B88FB8F9D37481 Castelo Negro (1987)(P.I.S.C.)(BR) MSX BR +8C6F7BCD0CD34EF2D7BE13D5C1986313 Castelo Negro (1987)(P.I.S.C.)(BR)[a] MSX BR +6F514694D8C9E943D165B1264F210847 Castelo Negro (1987)(P.I.S.C.)(BR)[a2] MSX BR +610C39B07A9247ADA6B4A1E50E18CF28 Castillo de Godless, El (1985)(Idealogic)(ES) MSX ES +1EEFFAB9AEFEE173EC55ED34BDD08EE1 Castle Combat (1985)(Spectravideo)(GB) MSX GB +7E69D303B54DD67A36BD9A082920B926 Castle, The (1986)(ASCII)(JP) MSX JP +0DF2FE5E1CDAA79897DFA9A18F6FDBD0 Cat & Wolf (19xx)(Drack Soft) MSX +3A840C11C7591D76A64E233099F737D0 Catch That Girl (19xx)(WB-Soft) MSX +A0FC038D0A2A9078A878D073B7336636 Catch the Mouse Puzzle (19xx)(-) MSX +024D0C5B07FA654A2AB429F198AAB816 Cavern of Death (1987)(Dro Soft)(ES) MSX ES +21F3EF3CB5CAA2F6B1912DC18CDF3535 Cerebral (19xx)(-)(ES) MSX ES +F78B114C3ADF915D96746774A3328BB2 Cetus (1986)(Tynesoft)(GB) MSX GB +908FB5A094EC46A09BBE27A3FFF8212D Chack 'n Pop (1984)(TAITO)(JP) MSX JP +69A9C17C37A8A069856760BB77DAEFAC Champ (1984)(PSS)(GB) MSX GB +26594AEE04D6F6E191BA7C5CC1CBAE5F Champion Boxing (1985)(Pony Canyon)(JP) MSX JP +094A514BE25AF70EEF7363EB55C82D85 Champion Kendo (1986)(Pony Canyon)(JP) MSX JP +E44EA263C299807F3433B704D50C09A1 Champion Pro Wrestling (1985)(Pony Canyon)(JP) MSX JP +BDD960B48B4606159CA90E6EBE0415EE Champion Soccer (1985)(Pony Canyon)(JP) MSX JP +1DE22A741FF0774DBF72957A4FC1674E Champions Grand National (1984)(Pony Canyon)(JP) MSX JP +E267036AFA2F34423F474DA34DF17D95 Championship Lode Runner (1985)(Sony)(JP) MSX JP +129CD092B2DEF7248A85F0998361C187 Chase H.Q. (1988)(Ocean Software)(GB) MSX GB +B7FFD94BC4BE5472A666F0E49C33DC43 Checkers in Tan Tan (1985)(Pony Canyon)(JP) MSX JP +4B390E2A73E5C320BF1CE1D8EA5BCECD Checkmate! First Moves in Chess (1985)(Toshiba-EMI)(JP)[needs 64k in slot 2] MSX JP +6F3A1E70B612E12B4309ED6AF004F194 Chess Game, The (1985)(Eaglesoft)(NL) MSX NL +E61124C4383B4C8CB2395BFB51454E23 Chess Game, The (1985)(Eaglesoft)(NL)[a] MSX NL +96197C86437C24AEC9585EC9AD679086 Chess Master (1985)(Philips) MSX +E912D34DACB3938886C709B411368F14 Chess Player (1988)(Eurosoft)(NL) MSX NL +9100865D4A8101AC4ACC4FA004C39784 Chessmaster 2000, The (1990)(Dro Soft)(ES) MSX ES +01D01E267A2844B2B25947A596DE7F38 Chicago 30's (1988)(Topo Soft)(ES) MSX ES +5FEFCCCD846AF41AA74CC1208C5741D5 Chicago 30's (1988)(Topo Soft)(ES)[a] MSX ES +3D8D3B7DC495EB85A164BF4F8B5CBC6D Chicago 30's (1988)(Topo Soft)(ES)[a2] MSX ES +79A30BDF383E795927B915B5C06879D0 Chick Fighter. Hiyoko Fighter (1983)(Honeybee Soft)(JP) MSX JP +074339DA8799F911090856BF49A359DA Chicken Chase (1986)(Bug-Byte Software)(GB) MSX GB +00A059ACC65D4BA275CA1141FF349187 Chiller (1985)(Mastertronic)(GB) MSX GB +450B607A3E221DBD5665AF03331D12FC Choplifter (1985)(Broderbound) MSX +EA8005110AF80FA8D58A3E34BFE5EF19 Chopper (1986)(Eaglesoft)(NL) MSX NL +ABB5A97574389B0443DB92B1B10364A5 Choro Q (1984)(TAITO)(JP) MSX JP +B92927E12B043E5A5D785C7471C0BC3F Choy-Lee-Fut Kung-Fu Warrior (1990)(Positive)(ES) MSX ES +7D1E4310B4C1BAB73B21EC23932EA776 Chubby Gristle (1988)(Grandslam Entertainments)(GB) MSX GB +F6F5B2700D068D8882DDC416AFE2156D Chuck Yeager's Advanced Flight Trainer (1989)(Dro Soft)(ES) MSX ES +1DEDC329BC003141A9109608B12C0F1A Chuckie Egg (1984)(A & F Software)(GB) MSX GB +3FB99E1D72D7C21FEFC71698E0F689CE Cid, El (1987)(Dro Soft)(ES) MSX ES +62860A8A019277C570073B59073CC081 Cid, El (1987)(Dro Soft)(ES)[a] MSX ES +3E39921F57E4E6549A5DF340D3CF4FF4 Circus Charlie (1984)(Konami)(JP) MSX JP +B0427C59C60EF643F9D026A0F3994642 City (1990)(Cal Soft) MSX +CA937039760A2511B3959A5BF83601A3 City Connection (1986)(Jaleco)(JP) MSX JP +C4089528A70497498ECBD95299301D71 Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES) MSX ES +B154B391172299947F11AE2130755CEE Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)[a] MSX ES +61E9CC5997C53E65912F21745B26FA8A Ci-U-Than Trilogy I - La Diosa de Cozumel (1990)(Aventuras AD)(ES)[a2] MSX ES +465C1678B7B9CA6A59DF9D5E575EFD61 Classic Adventure (1986)(Melbourne House)(GB) MSX GB +ACA9A295AD204716A7A1D804CCC0898B Cluedo (1986)(Leisure Genius)(GB) MSX GB +5CCA21042AF6B6285DD9D90FC5F5D701 Coaster Race (1986)(Sony)(JP) MSX JP +E33D02E2412EE399D7E38A1F24019220 Cobra's Arc (1986)(Dinamic Software)(ES) MSX ES +548106AECBE8CE256E5C8C6C17C97E5F Cobra's Arc (1986)(Dinamic Software)(ES)[a] MSX ES +084C2328FE08A0C77FC7A7CCFFA29F41 Coco Castle (1984)(Kuma Computers)(GB) MSX GB +93A0A1EB42C1D371DD3479A70D6CDC68 Coelho Maluco (19xx)(Input MSX)(BR)[aka Jumping Rabbit] MSX BR +50DD7AF2F7B02D3B54301135A4239CED Coliseum (1988)(Topo Soft)(ES) MSX ES +ABEA72E998A863E09FD1AC85083A5504 Coliseum (1988)(Topo Soft)(ES)[a] MSX ES +11E4883E72ACD743BAB960E24E32A7F5 Colmena (2006)(Jose Javier Franco Benitez)(ES) MSX ES +A3CCD4811314B73F45145DCEB3DF129D Colony (1987)(Bulldog) MSX +E8BB416230F70F02970B9C0A798930F5 Colony (1987)(Bulldog)[a] MSX +CB353D88BD9F7FD0A49FAAAC9697368E Color Ball (1984)(Hudson Soft)(JP) MSX JP +7F50C4CD8AAFD86B318569D8A1CC6D55 Color Tochika. Pillbox (1983)(Magic Software)(JP) MSX JP +3E1624155E956E5E672A760A844FD941 Colossus 4 Chess (1986)(CDS Micro Systems)(GB) MSX GB +638C23CD7D946098707E27CB2FCCECB6 Colt 36 (1987)(Topo Soft)(ES) MSX ES +7BAF8ED582AB32275BC1A01E93E53182 Columbia (19xx)(-)(ES) MSX ES +9DC437346F3032D94C970D9DB2E6D30F Comando Quatro (1989)(Zigurat Software)(ES) MSX ES +0E565CF3C1685D2FC3C3F2E280AEAA0C Comando Tracer (1989)(Dinamic Software)(ES) MSX ES +69AAC03CD6AE4007385316D10D3B2E59 Comando Tracer (1989)(Dinamic Software)(ES)[a] MSX ES +F6008AB774AE2CE0623209416E5ACA4D Comando Tracer (1989)(Dinamic Software)(ES)[MSX2ready] MSX ES +7CD88E8C0E205E1C8F1927975AFA90BA Comblot (1985)(Sprites)(FR) MSX FR +4E7FE1E2BB009B8B748E9B5DF76E9D9B Come On! Picot (1986)(Pony Canyon)(JP) MSX JP +64597B32A9A63E1203C5628B130ACAE4 Comecocos (19xx)(Idealogic)(ES) MSX ES +8D033CDC75ABA3A072A383F065D6DC9A Comet Tail (1984)(Qnix) MSX +B18AD16443813F92CE5A4AFDE0DA0A1F Comic Bakery (1984)(Konami)(JP) MSX JP +9294FFD1FED203A72B1FDDDE74E02752 Computer Billiards (1985)(Sony)(JP) MSX JP +4AB5EFF0B45B14DBD834671641A56D2D Computer Chess (1985)(Sony)(JP) MSX JP +E4FE364C6CD6E58ED6F56123E3B36BE9 Computer Othello (1984)(Sony)(JP) MSX JP +E48793A11DB2F760C88554ACB83E0D5F Computer Pachinko (1984)(Sony)(JP) MSX JP +D7C2D1104BA42F7E4EB513F11EFAD2E8 Computer Scrabble (1986)(Leisure Genius)(GB) MSX GB +3A66B6CBBD15EB5F38FF959D27CCF42D Conde de Monte Cristo, O (1988)(Nemesis Informatica)(BR) MSX BR +9CDE2A01E3E43044AA32A37A032B21C1 Conde de Monte Cristo, O (1988)(Nemesis Informatica)(BR)[a] MSX BR +F271FDB7E4ADD189DF75D89C329AF368 Conde de Monte Cristo, O (1988)(Nemesis Informatica)(BR)[a2] MSX BR +AACD91F3AF6845B74C7CF9B4B6DC5693 Con-Dori (1983)(Cross Talk)(JP) MSX JP +62559214F1DF2BEEE65D63871E985535 Confused (1986)(Eaglesoft)(NL) MSX NL +BFF2B4D73BFE3A560328128BF48CE071 Congo Bongo (1983)(Sega)(JP) MSX JP +5AD6D4467BB23EF734461EB68CAA0D27 Contract Bridge (1985)(Alligata Software)(GB) MSX GB +E80233B10287720D78F7AFCBF1F4367D Coppa Proibita (19xx)(Soft Bee)(BR) MSX BR +42BE99A54059922BAC5EE19F12604779 Corsarios (1989)(Opera Soft)(ES) MSX ES +822760F741A7977C01102EC29C8371B4 Corsarios (1989)(Opera Soft)(ES)[a] MSX ES +0CDD95399EDC42494A2FD6B3DF9A99BD Cosa Nostra (1986)(Opera Soft)(ES) MSX ES +91BE979A99F6413AC1A35E29A5379236 Cosa Nostra (1986)(Opera Soft)(ES)[needs 128k] MSX ES +A4F932A34FC9D16CD60D160074AD4E4E Cosme Estible (1988)(Iber Soft)(ES) MSX ES +7A5FBF91FF9DEDDC9B72A0E94AE26038 Cosme Estible (1988)(Iber Soft)(ES)[a] MSX ES +FA2826D77BF05F6E646A7A14C4BF44F2 Cosmic Sheriff (1989)(Dinamic Software)(ES)[gunstick] MSX ES +61785510CB55A3669BB9502665B0F22F Cosmic Shock Absorber (1986)(Martech Games)(GB) MSX GB +BF4E8636842E025089C1BD8134B90341 Cosmo Explorer (1985)(Sony)(JP) MSX JP +D9F0D5E3F0E9AE033FE7D985E50952C4 Cosmo Traveler (1987)(Apollo Technica)(JP) MSX JP +BD0805CC42772ADDE8F59B049E40E758 Courageous Perseus (1985)(Cosmos Computer)(JP) MSX JP +074FFDB77E4106B27F6C697C119038D4 Craze (1988)(Heart Soft)(JP) MSX JP +6D67D75427B8F44470843B9BE81EA7A0 Craze (1988)(Heart Soft)(JP)[a] MSX JP +691E94FA380F2613C8D1CE1B18B412F4 Crazy Bullet (1983)(ASCII)(JP) MSX JP +AD8B6E63D77E33908C2E4272F3A3CE21 Crazy Cars (1988)(Titus)(GB) MSX GB +C72B06C4F277C9F0D8941A65571E09AA Crazy Train (1983)(Sony)(JP) MSX JP +C016AFEE622EE1E310724B8D8B8B1597 Crazy Train (1983)(Sony)(JP)[a] MSX JP +734A78836B794220E33EED7F755256AD Cresta Run (19xx)(-) MSX +1DFFFE143E6D0C3298E512D3F4C7B65E Cribbage (1986)(Kuma Computers)(GB) MSX GB +78AAB0B86B5BB4BF34E564048F44CB9F Cronos (1989)(Barnajocs)(ES) MSX ES +115D4328A8B1D8AB65D4F81D0ACD0061 Cross Blaim (1986)(dB-Soft)(JP) MSX JP +655F0E0FC359E4B4EF9347E361B3758C Cross Blaim (1986)(dB-Soft)(JP)[a] MSX JP +6F3D67A0CDB4AAFE36F6F31CDE8C4224 Crusader (1985)(Pony Canyon)(JP) MSX JP +B99EEF5C0D29FB0003ADD4D25E84D635 Crux (1986)(Bits Art) MSX +2024685486FED098F8DE438F4CF2462C Crux (1986)(Bits Arts) MSX +8DA41113F7F55B632815CF988574F91D Crystal Out (1991)(MSX Magazine)(JP) MSX JP +44C10757C393DDE05666349E918DCE27 Cubit (1986)(Mr. Micro)(GB) MSX GB +BB4D8207FDE7A7AC257BA917B089E165 Cubit (1986)(Mr. Micro)(GB)[a] MSX GB +C5AEF60AA73FA84D77F561F433566465 Cubos Malucos (1987)(Valle Paiva)(BR) MSX BR +0E5ED6D7773D6BCE66590891F6F922DE Curro Jimenez (1989)(Zigurat Software)(ES) MSX ES +67969522F9535146B7AB4CE18FA76CBF Curro Jimenez (1989)(Zigurat Software)(ES)[a] MSX ES +B5B22998B62865CB28295F6E797C6949 Cyberbig (1989)(Animagic) MSX +686A12DC14329F4095156A06CBAC37BB Cyberbig (1989)(Animagic)(ES)[a] MSX ES +1FAF8DD5BA47F05ED8B6BAFA22226E0C Cyberun (1985)(Ultimate Play The Game)(GB) MSX GB +9006A8DEFF3D1B94CF228840F97552AE Cyclon (19xx)(-) MSX +87FA602400264862C66B17F53E562B5A Cyrus II (1986)(Alligata Software)(GB) MSX GB +15E33DA0760D715FE109021B121B2325 Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP) MSX JP +157EA52AB87C3AF80AF0D9D0B1C44FAE Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP)[a] MSX JP +E72FD1F13FDE44DDEF90F46B06A2A37D Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP)[a2] MSX JP +7E300B8CE83D6F4E02E4E1FD16EFAE04 Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP)[a3] MSX JP +F49B81F0102B0BBF5D0B97808EEFAADF Dam Busters, The (1985)(US Gold)(GB) MSX GB +AEDDF8E38C4CB8AAB35A965710A0E882 Damas (1985)(DIMensionNEW)(ES) MSX ES +AD52A72BB9AC001C32B96247B3254BB1 Danger X4 (1984)(ASCII)(JP) MSX JP +0B3E282C2BE98EC6AC795888F4AA7112 Dark (1988)(Zigurat Software)(ES) MSX ES +10ECAC84B32BD47876D569173E32C9A2 Darts (1984)(Orpheus)(GB) MSX GB +103C19A3CBBF5ABFAF473AC98D711FCD Darts (1987)(Blue Ribbon Software)(GB) MSX GB +35D0EE1856BAB87233EF510C3D7C5DA6 David II (1984)(ASCII)(JP) MSX JP +E9DB68AFE12A91E96BB1B2454704C242 Dawn Patrol (1986)(Eaglesoft)(NL) MSX NL +944B977A5B14E2E072CD1B82BF638307 D-Day (1984)(Jaleco)(JP) MSX JP +5F67A7D24566CA2619EB8DCF5FB7620B Death Wish 3 (1987)(Gremlin Graphics Software)(GB) MSX GB +B6C2A8766291AA7FB6497A5B5DEB5E14 Decathlon (1984)(Activision)(US) MSX US +911359426B003E21905EF858F50F5F7B Defcom 1 (1989)(Iber Soft)(ES) MSX ES +3A78D209F5FFA31643567265EB8A0ECC Defcom 1 (1989)(Iber Soft)(ES)[a] MSX ES +774ECA08EF4A15104A1D68547AC93D8A Defender Foxx (1984)(Neptune Soft) MSX +2948A0DAED8EDD16F3973FAED095B2E9 Demon Crystal, The (1986)(Radio Wave Newspaper Publisher)(JP) MSX JP +4D35E7F5D08C44C70D9C294E65DC0962 Demon Crystal, The (1986)(Radio Wave Newspaper Publisher)(JP)[a] MSX JP +781BB4EC97C927DB455D4CF3B263B1BC Demonia (1986)(Microids)(GB)(fr) MSX fr GB +249391B5FDFB2F8230687ACC12716105 Demonia (1986)(Microids)(GB)(fr)[a] MSX fr GB +B7DDAADF91691A289A5B7EC7E8D4FD5B Descubrimiento de America, El (1986)(OMK Software)(ES) MSX ES +025CE6B7E2E19BC53A3EE6BCB489CDD3 Desolator (1986)(Gremlin Graphics Software)(GB) MSX GB +2D9C771978D455E3D26A7FAF7E1FCC12 Desperado (1987)(Topo Soft)(ES) MSX ES +9A2C0E5758229766E889B3560420FBCC Desperado (1987)(Topo Soft)(ES)[a] MSX ES +827EB0252BBB711AF9244CBB3FAC27FE Desperado (1987)(Topo Soft)(ES)[a2] MSX ES +6B6A5E51D11C8CC840FAC1001A752FBF Destroyer (1986)(Mind Games Espana)(ES) MSX ES +EF0D4E201E2D0F25E00029B31859EBE1 Destroyer (1986)(Mind Games Espana)(ES)[.a] MSX ES +A9BAD820E3DFBAEDC113FEC1EDDF2808 Detective Orson Welles (1986)(Sony)(ES) MSX ES +D5CA8DDF5112E417F1D27F96BDEF35D3 Deus Ex Machina (1985)(Mind Games Espana)(ES) MSX ES +6D9E4DCD3715697F8F69D478E5D36165 Devil Hunter (1990)(MSX Magazine)(JP) MSX JP +4D5051C67B81537B474C119F0CB1E5C8 Devil's Castle, The (1985)(Manhattan Transfer)(ES) MSX ES +6B10E45F712AD503B8C52C5D7FC65171 Devorado (19xx)(-) MSX +63E56B39EA95DEFA0B3895A47A18D0AF Diamond Luis I (1986)(Ikesoft)(JP) MSX JP +C245833233D94053A5A3582AD91C50E4 Diamond Mine II (1986)(Blue Ribbon Software)(GB) MSX GB +2E8A2E0B2589596F54F5477B7D8541A7 Diamond Mine II (1986)(Blue Ribbon Software)(GB)[a] MSX GB +DDFF6A460A5CAE5A1DC8FF2F043B8322 Dig Dug (1984)(Namcot)(JP) MSX JP +85E6556CEBBEF9E941B60DD5B100D463 Dip Dip (1985)(Indescomp)(ES) MSX ES +C13E96B3EACCA5A230D7429906D2E70C Disc Warrior (1984)(Alligata Software)(GB) MSX GB +5BE95C3713BD5972912B96AA508AA936 Discovery (1988)(Eurosoft)(NL) MSX NL +E4C276D3314E8BC6075AE562F8BF82B8 Dizzy Ball (1983)(Pony Canyon)(JP) MSX JP +8FF2F4709FA78AA513DBD865CEA24C89 Dizzy Dice (1988)(Players Software)(GB) MSX GB +62213342A5B377FCA02CB6692DB954A9 Docteur Galaxie (1986)(Micros MSX)(FR) MSX FR +0ECD63E42A020A03FEAC99369403E646 Dog Fighter (1986)(Kuma Computers)(GB) MSX GB +8D79920C68CDD31AAC4705B63A53EABE Dog Fighter (1986)(Kuma Computers)(GB)[a] MSX GB +EB9DCAF8C29E1DD968882D4952EC7659 Doki Doki Penguin Land (1985)(Pony Canyon)(JP) MSX JP +556D9EBC23F5CF4CE47F6CDD3D195FFD Domino (1985)(DIMensionNEW)(ES) MSX ES +8955B6D531AD6FB11F9E004092E3EF6A Domino (1985)(DIMensionNEW)(ES)[a] MSX ES +4B5B0810899EC8CC824CC606A93004A0 Don Quijote (1987)(Dinamic Software)(ES) MSX ES +46E4D16B94D464027466437B9EC389F0 Don Quijote (1987)(Dinamic Software)(ES)[a] MSX ES +D1D05BA19F1DE3513977A146EE8532A7 Donkey Kong (1986)(Erbe Software)(ES) MSX ES +CCD330A2A84934766DB4C1CB74B62B38 Donpan (1983)(Nippon Columbia - Colpax - Universal) MSX +AAABA6DE802B10E7C5C6C48FCF68D3F5 Door Door Mk2 (1985)(Enix) MSX +1D6AAAC8198B2DDDB87D011A3CA6C9C2 Dorodon (1984)(Sony)(JP) MSX JP +0C3B952862FE67CC72B30901E5E53B27 Double Dragon (1988)(Dro Soft)(ES) MSX ES +1863F3972C4A579ABC042D18E0D4F243 Double Rotation (19xx)(Max)(IT) MSX IT +69D00EC91FEF6349281BD13F7681BBBC Dr. Archie (1989)(Eurosoft)(NL) MSX NL +4EA66F30B915D5460B60150FA2D33B8C Dr. Jackle and Mr. Wide (1987)(Bulldog) MSX +188EDC1AB16C6AED637C1D7C8DBF72A6 Dragon Attack (1983)(HAL Laboratory)(JP) MSX JP +AEAEFEFD932F904C39B5DF1DCBF7C035 Dragon Ninja (1988)(Imagine Software)(GB) MSX GB +B5F632ED95691822441B6B37E05CC509 Dragon Quest (1986)(Enix)(JP) MSX JP +71AD98B617CB84DA348747334178DFD5 Dragon Quest II (1988)(Enix)(JP) MSX JP +162046862400575B695A90281AFC7CD0 Dragon Quest II (1988)(Enix)(JP)[a] MSX JP +9BF0936F7DADB9FD5FD2AB29924F388B Dragon Slayer (1985)(Square)(JP) MSX JP +D190298A0F433C2F01BDD9F6B073C916 Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP) MSX JP +571CB1692E4636AA3CDD6B7027990EBE Draughts (1985)(Orpheus)(GB) MSX GB +6F9D58DB8300D4F7D559A36A6C09B3D0 Drazen Petrovic Basket (1989)(Topo Soft)(ES) MSX ES +DDEA2433279A3BF4B75BB7EA40B245BB Drazen Petrovic Basket (1989)(Topo Soft)(ES)[a] MSX ES +A1455BD43AAFCE3F206B276E630927B1 Dream Runaway (1985)(-) MSX +287CB2DF3F2D7F526DC160DD1BAC42E3 Driller Tanks (1984)(Hudson Soft)(JP) MSX JP +8FC101831CBFD43CC6A44967E7EAED67 Driller Tanks (1984)(Hudson Soft)(JP)[a] MSX JP +322FA9ECD55CC6EB3EBB88A9F738923F Droids - The White Witch (1987)(Walther Miller)(ES) MSX ES +7B99C6DA80279D91BDA119BF60611EFC Drome (1987)(Eaglesoft)(NL) MSX NL +5DEDE16ADE32E9C2F32579414B86FD09 Dropgame (1989)(-)(NL) MSX NL +1D6A3D15CE3FA3D35B76A5476CE4481C Ducky (1986)(Turbo Soft) MSX +9BF81FCB852B5A2057EE1D1FCA764B86 Dungeon Master (1986)(ASCII)(JP) MSX JP +D7D2900BCAB26E74952CF717ACB0DF8B Dunk Shot (1986)(HAL Laboratory)(JP) MSX JP +870EA3AC9F302CF616782A9305F6DB4C Dustin (1987)(Dinamic Software)(ES) MSX ES +8FB4C407B209AA86868D06BCFFC742D2 Dustin (1987)(Dinamic Software)(ES)[a] MSX ES +C585955C9380774BB9B181A4F5F36FEC Dynamite Dan (1986)(Mirrorsoft)(GB) MSX GB +ED67FA4C38F94D452B1415CC0A83C1DD E.I. - Exa Innova (1984)(Sony)(JP) MSX JP +5DC2EDDF2D8C413716C831B62146B6AC Eagle (1987)(Dro Soft)(ES) MSX ES +2BC3E268214FCF572CAA052EB38BC1AD Eagle Control (1988)(Eurosoft)(NL) MSX NL +3D9BC3B1DE4DCDCBB07E50A56A163322 Eagle Fighter (1985)(Casio)(JP) MSX JP +B3C0B939A4A4CF705F6EE8EDD8A4836F Earth (1988)(Crazysoft)(ru) MSX ru +839C3AE103A63C855220EF0CADEC2C43 Earth (1988)(Crazysoft)(ru)[a] MSX ru +134B7E006D31A7C9FC95DD587B6168F9 Eat Blue! (1995)(Paxanga Soft) MSX +568F8BE0CEEC83D76E92647982554DC7 Eat It (1986)(Aackosoft)(NL) MSX NL +0AFBF3B7D506915E11557F2BF43183F2 Eddie Kidd Jump Challenge (1985)(Martech Games)(GB) MSX GB +7650A03725726C9DF4D145344ACE23A4 Eddie Kidd Jump Challenge (1985)(Martech Games)(GB)[a] MSX GB +E40F78595D83D4D804D03314F305251E Eggerland Mystery (1985)(HAL Laboratory)(JP) MSX JP +E5E41630E27B5D1396B9F85D2F61CAFD Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP) MSX JP +802474B5CAB87DE6D7575910043A0A56 Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP)[needs 512k] MSX JP +3FCDF01BC252FFB9D1E737C60998B913 Eggy (1985)(Bothtec)(JP) MSX JP +A971BD518BA1FB7A74E8B2CB72626335 Eletron (2006)(Jose Javier Franco Benitez) MSX +1C7301EC5DC7D0F6B0BF3DC8909AE145 Elevator Action (1985)(Nidecom)(JP) MSX JP +F4CE54C1368086FB108D1F3BF836F331 Elidon (1985)(Orpheus)(GB) MSX GB +C5DA8D35BBF5A8E26139E4E411E74543 Elite (1987)(Firebird Software)(GB) MSX GB +C0569C2FBBA78CAB678BDB5C87A93A55 Elite (1987)(Firebird Software)(GB)[a] MSX GB +BC75C09874339CEDFDB20E0C4D90BD52 Emerald Isle (1985)(Level 9 Computing)(GB) MSX GB +8887B969347603EC9424F3DB9C2ED520 Emilio Butragueno Futbol (1988)(Topo Soft - Ocean Software)(ES-GB) MSX ES-GB +907900B86254A0B63B00EAE46DDC74CB Emilio Butragueno Futbol II - Campeonato (1989)(Erbe Software - Ocean Software)(ES-GB) MSX ES-GB +29C64DB02AE30B19F3B39D22F4EC1D19 Emilio Sanchez Vicario Grand Slam (1989)(Zigurat Software)(ES) MSX ES +EF57302DBBB451D2B136A15283A8DEE5 Enchanted (1989)(Positive)(ES) MSX ES +DD5A516179FEDDB68E7E04934D00DB43 Enemy (1986)(German Soft) MSX +B41D555E8892C81E93E3A4169FD528B4 Enigma (1987)(Odin Software) MSX +56AB8F66A4C315A2908A36623B16C68B Escalador (1985)(EMSA)(ES) MSX ES +40F3590F870D7CA2534D18E6C41216D0 Estrada de Ferro (1986)(Editora Aleph)(BR) MSX BR +BC78CDA456563E87B2AF5B403626BA77 Esvay (1984)(CD Systems)(NL) MSX NL +9FD99D28C6A99DF8C5D9E4F660980448 European Games (1987)(Tynesoft)(GB) MSX GB +09E1A6B4E3AC7959742B374597CDAB2B European Higway Racing (1995)(Second Foundation) MSX +99AAD48B03F0A3BFDCFDE16308DD3956 Ewoks and the Dandelion Warriors (1987)(Walther Miller)(ES) MSX ES +0939EF4A5CB5A7E32A4C6929D4FBB27F Excalibur (19xx)(-)(BR) MSX BR +49474FD2EC1B6DCDE590D1B48CFCE35A Exchanger (1983)(ASCII)(JP) MSX JP +D4A602ACAB77FCAAF337C2E682A12503 Exerion (1984)(Jaleco)(JP) MSX JP +188CD07222135535EFCA183626753C58 Exerion II - Zorni (1984)(Jaleco)(JP) MSX JP +35E22ED3799F9620873DE8BBB347A68A Exodus (1986)(Volker Becker)(NL) MSX NL +6F9FC6141E13C2A953352835F0E34D79 Exoide-Z (1986)(Casio)(JP) MSX JP +F4A0628428412C0D83ACC40888B346B6 Exploding Atoms (1985)(Sanyo)(JP) MSX JP +112E18973C4BF8207041AAF637BB2912 Exterminator (1987)(Eaglesoft)(NL) MSX NL +58C04801AAA3CD8E99173D2E5212BEC7 Eye (1987)(Endurance Games)(GB) MSX GB +F75D09AFC5642E9C69EC6A6BC9B840E0 Eye (1987)(Endurance Games)(GB)[a] MSX GB +CEDE2B5CC02E115BE2E9EAC13D469691 F-1 Spirit - The Way to Formula 1 (1987)(Konami)(JP) MSX JP +0F2DA1C5BEA9419B7E389E02B66CF56D F-15 Strike Eagle (1987)(Microprose Japan) MSX +9A54EA5999731473ECF94A1749385F20 F16 Fighting Falcon (1985)(ASCII)(JP) MSX JP +020A504052E2CF0A76A6ED00F0428688 Faeton (2006)(Jose Javier Franco Benitez)(ES) MSX ES +BD53CC4DA37CD5036ABD1530E508A2C6 Fairy (1985)(ASCII)(JP) MSX JP +0FFA22ED6CF842F9212634EB790F02F3 Fairyland Story, The (1987)(Hot-B)(JP) MSX JP +D405892016F1F1FC1580870C9EC6B301 Fairyland Story, The (1987)(Hot-B)(JP)[a] MSX JP +A984E1CDB6E0246F641705045E236E26 Fanky Punky (1987)(P.J. Software)(ES) MSX ES +B46C7BC88D763856A1185E0FF49E34A0 Farge (1988)(Melody Soft) MSX +C7E6BBEC0F6DBD528EC66B819A9C63BC Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES) MSX ES +38DE4542EAB02C8D8CF6C85CCBB4940B Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES)[a] MSX ES +4DD2682C523059E9B48C410E0730457E Fernando Martin Basket Master - Executive (1987)(Dinamic Software)(ES)[Martos] MSX ES +96BAC27ADBFD6F183A2EC9160E8206A8 Fernando Martin Basket Master (1987)(Dinamic Software)(ES) MSX ES +73C0262F0F333A0445828777FE9A998C Fernando Martin Basket Master (1987)(Dinamic Software)(ES)[a] MSX ES +0D7F1398B3D6ECE33964A4143B9B7BC5 Feud (1987)(Bulldog) MSX +A03AD20D4556D26F031F9B309048A58C Field Master (19xx)(Jose Luis Abellan) MSX +F43099C76FA32EED8CD0EF42D999FD6C Fighting Rider (1985)(Nippon Columbia - Colpax - Universal) MSX +AB584DF995763F90D1E4EBFBA114C01F Final Justice (1985)(Pony Canyon)(JP) MSX JP +693E0941B4176F9162BD02C9861A7352 Final War (1988)(Alfredo Delgado)(ES) MSX ES +C7499F1FA9B8EFC94716B2853005606D Final War (1988)(Alfredo Delgado)(ES)[a] MSX ES +44040B704CCDCD869BA3EB42B2EBFA75 Final Zone Wolf (1986)(Telenet Japan)(JP) MSX JP +6E02CD97655B2B521C1BAA115613FC00 Final Zone Wolf (1986)(Telenet Japan)(JP)[a] MSX JP +E93F4E2FF2FDCDFE98E0EE62FD7266BB Finders Keepers (1986)(Mastertronic)(GB) MSX GB +538F631EB6886E62100C151087B63EDA Fire Rescue (1984)(Hudson Soft)(JP) MSX JP +AF5ECDFE7B4F48253BD268E4EA023FC3 Fire Star (1988)(OMK Software)(ES) MSX ES +D17C424C97030D7EB2DBE833471EE738 Fire Warrior (1991)(Electromagic)(ES) MSX ES +2ECBD3E9B3B3088C646E0BA1E161AA57 First Steps with the Mr. Men (1985)(Mirrorsoft)(GB) MSX GB +E73527C5496B2AF5D59D324A98E6A599 Flappy (1984)(dB-Soft)(JP) MSX JP +2C9AF0FD2A55CDC0F23B3B1C06502612 Flappy Limited 85 (1985)(dB-Soft)(JP) MSX JP +C1CF9FE0861C0D9F2D6558BFC95F3644 Flappy Limited 85 (1985)(dB-Soft)(JP)[a] MSX JP +C2F797A6AF5F8A20F6D490CAE8061D62 Flash Gordon (1987)(Mastertronic Added Dimension) MSX +BD743DA1D09D978A4CCA515B92BED95E Flash Splash (1984)(Toshiba-EMI)(JP) MSX JP +F134C4A28FD7AE55D98524DFD93A5DB9 Flashpoint (1990)(Zemina)(KR) MSX KR +FF96EF9CFB82A4AA6BAA119BD4A3C719 Flicky (1985)(Micronet)(JP) MSX JP +3FCCDC0D98E2B3CF080DAC39274DCC3C Flics, Les (1985)(PSS)(ES-GB) MSX ES-GB +46500823FE8B3A099799C49438CE67D5 Flight Deck (1984)(Aackosoft)(NL) MSX NL +9EC6012726F21B55107EB2544AEC5399 Flight Deck II (1986)(Aackosoft)(NL) MSX NL +D7298BD628F60EAE06B6CB756FAF69CA Flight Path 737 (1985)(Anirog Software)(GB) MSX GB +2BA5AB166A035EA8F36BC71FB84C5506 Flight Simulator (1986)(subLOGIC)(JP) MSX JP +2061255412FFE4F68462D3F4ADFAA0CE Flintstones, The (1988)(Grandslam Entertainments)(GB) MSX GB +76726571FCDFF7432CD6B6FD2E081E8E Flipper Slipper (1984)(ASCII)(JP) MSX JP +9D0DBE962ECE651F24B7E30F10D21E56 Flop Chop (1985)(Sony)(ES) MSX ES +0FC548E2189A655D0C4D80BC4CD62F91 Flyboat (1986)(-)(FR) MSX FR +4BB31C620776EDEDC830C58F70B204FD Follow the Clues (1986)(MSX Computer)(ES) MSX ES +2EE737264ABB08053B161A8C5CAD8978 Follow the Clues (1986)(MSX Computer)(ES)[a] MSX ES +CC93686044A1D04169A84A7690D632CC Foot Volley (1986)(Players Software)(GB) MSX GB +F285EB5087F6A859ED465F496B33C22B Football Manager - World Cup Edition (1990)(Addictive Games)(ES-GB) MSX ES-GB +F34F82F309A9C6052F8424971BA2502A Football Manager (1987)(Addictive Games)(ES-GB) MSX ES-GB +6715882B8E45D244551624DF2D3B4B69 Footballer of the Year (1987)(Gremlin Graphics Software)(GB) MSX GB +C051E2D89C41CB0FFCE1B14D24464B8A Forbidden Fruit (1985)(Mind Games Espana)(ES) MSX ES +0C2F9DF2497153A99B65DF48702DD40F Formation Z (1985)(Nippon Dexter)(JP) MSX JP +C616D330844FD63FC26DDFC4D873D4BD Formula 1 Simulator (1985)(Mastertronic)(GB) MSX GB +624578E80C28B6AE6511883BFB3639C3 Fracta (1987)(Panacom)(BR) MSX BR +7DDE6D703BBF119924F9856A5BF8620C Freccette (19xx)(3P Software)(IT) MSX IT +38595FDE08D0DDC1F46336D235CB3751 Freccette (19xx)(3P Software)(IT)[a] MSX IT +7BBEB8B89B579C6C252BC64AC3B09EE4 Fred and the Bubloids (1986)(Msoft)(NL) MSX NL +78E00D96E633AA18515F6013C895B4BE Freddy Hardest (1987)(Dinamic Software)(ES) MSX ES +5100DABB472526DB9044C546B79D7217 Freddy Hardest (1987)(Dinamic Software)(ES)[a] MSX ES +F253DB2E07107AD6B83F39E635DEF1C7 Freddy Hardest in South Manhattan (1989)(Dinamic Software)(ES) MSX ES +2B5ECAFBB7378255D89A64C85C297455 Freddy Hardest in South Manhattan (1989)(Dinamic Software)(ES)[MSX2ready] MSX ES +01BA85FF4A455BBB6493D0CF9099DF70 Frog (1988)(Eurosoft)(NL) MSX NL +FB44F41887F623A9E6C538AFA9B12036 Frogger (1983)(Konami)(JP) MSX JP +150E48EA8E64792AEBD41644FB8E0228 Frontline (1984)(TAITO)(JP) MSX JP +86FB197AD1583F056958B4671FA588DC Fronton (1987)(Scorpio Software)(ES) MSX ES +7D9AA4C5C490012A21912240C3C904E6 Fruit Machine (1985)(DK'Tronics)(GB) MSX GB +40DC91F889E605EFC2DF1C49EEC37D8F Fruit Panic (1984)(Pony Canyon)(JP) MSX JP +2BF9DB23ED6B25AC8980B584FE1763B7 Fruit Search (1983)(HAL Laboratory)(JP) MSX JP +CB1577C6AD4CCF8A855F6337408C4BC1 Fruity Frank (1985)(Kuma Computers)(GB) MSX GB +E714DB9E23143C74702E775A61531547 Funky Mouse (1984)(ASCII)(JP) MSX JP +16B8895E158534909829D458E61DFB3A Futbol (1985)(Indescomp)(ES) MSX ES +547F2F439AFC3AF16A06B40DF13FDF19 Future Knight (1986)(Gremlin Graphics Software)(GB) MSX GB +3B9003B98AF0C92B98EFCDFB7AEA6975 Future Knight (1986)(Gremlin Graphics Software)(GB)[a] MSX GB +4CF646803CA4AFF1BF659AE418EB8F2E Fuzzball (1986)(Eaglesoft)(NL) MSX NL +43AEF5734C8B0512D9A60555E04E54D1 Fuzzball (1986)(Eaglesoft)(NL)[a] MSX NL +A1F254A4B9A40AC569D153DFF42DC490 Fuzzball (1986)(Eaglesoft)(NL)[a2] MSX NL +31EE6CC40412D8155646662B83AC636A FX-15 (1987)(Mind Games Espana)(ES) MSX ES +850FBA9ADED88EA6102AF3DDEA3CE35A G.P. World (1985)(Pony Canyon)(JP) MSX JP +9D744F504F04CDC8E36B163168605D1F Galactic Mercenaries (1985)(Infogrames)(FR) MSX FR +9EE8847A9581D9413B2E074E253EF021 Galactic Mercenaries (1985)(Infogrames)(FR)[a] MSX FR +FB0720AB8C17F7C18D0AEFA8E0E3B3DF Galactic Mercenaries (1985)(Infogrames)(FR)[a2] MSX FR +AD60C38BF950882965EFF36F15DA7E86 Galaga (1984)(Namcot)(JP) MSX JP +0523FC92B579572F4CBBDCD545B6AED1 Galaxia (1985)(Kuma Computers)(GB) MSX GB +7FF76886801A228EAE5E037D02EBDE54 Galaxian (1984)(Namcot)(JP) MSX JP +CDC662D86B4BD6B0E2D09C6DE16CD4C3 Galf (1988)(MSX Club Magazine)(NL) MSX NL +3877841959B23AE725D7D0E762456FDC Gall Force - Defense of Chaos (1986)(Sony)(JP) MSX JP +0D3CCD7C870211B0A79A507F8BD38563 Gall Force - Defense of Chaos (1986)(Sony)(JP)[a] MSX JP +B6493ADF415BE662A6977EDDC9CA3DF0 Gall Force - Defense of Chaos (1986)(Sony)(JP)[a2] MSX JP +5A4D2468B2223153496F50B81D634274 Galleon (19xx)(-) MSX +BFE8C14F475CDA94BCD3F2605BA3DB15 Galleon (19xx)(-)[a] MSX +69CB2EBB3A49613B8CE004D62D12920F Game Over (1988)(Dinamic Software)(ES) MSX ES +E07C1D2859A62CA9703218220D89260A Game Over (1988)(Dinamic Software)(ES)[a] MSX ES +3044B62CED8E69210F8B3121EFC65530 Games, The - Winter Edition (1988)(US Gold)(GB) MSX GB +3C426F038CA66BB3CE224CEEE2E14CDD Games, The - Winter Edition (1988)(US Gold)(GB)[a] MSX GB +6EA50BC9E8D02F87CC066F417C59136E Ganbare Goemon. Samurai (1987)(Konami)(JP) MSX JP +D560FCF8689CF4F232EAFAA9A1407A04 Gangman (1984)(Hudson Soft)(JP) MSX JP +EB7933468FDCA3953F423E5ECEC59365 Gary Lineker's Super Star Soccer (1987)(Gremlin Graphics Software)(GB) MSX GB +F58BBE267CCA763254869BED57A35991 Gary Lineker's Super Star Soccer (1987)(Gremlin Graphics Software)(GB)[a] MSX GB +48F9706418AC6DBF4C31D34BD8A823F1 Gauntlet (1986)(US Gold)(GB) MSX GB +5CEA5CC1256A4F8FD785DB9B83CD5030 Gekiso Battle (1991)(Komeya) MSX +AD6AB6E4908B5895E358E30506916351 Gekiso Battle (1991)(Komeya)[a] MSX +F6948FC2040E16A9A4EF34BB09DBD59D Gema Negra, La (1986)(Manhattan Transfer)(ES) MSX ES +DE4EC59A49C34B4F8DFD5B2C81912E11 Genghis Khan (1991)(Positive)(ES) MSX ES +18FBCBC591D0D38056B759CA694373A0 Genghis Khan (1991)(Positive)(ES)[a] MSX ES +1FFCCEF418D82F1D8AC5FC5395F5B097 Genghis Khan (1991)(Positive)(ES)[a2] MSX ES +74F0A9EB3501934A0596D9EB348763EF Genova (1990)(-)(BR) MSX BR +B5DF2901E81DFEA35E3620FE46B7A0AA Gerente, El (1984)(DIMensionNEW)(ES) MSX ES +1523BFFBFE05754E001DABCD7529E13B Ghost Maze (1984)(-) MSX +51DB17042E19E016A6D1119E91DA0195 Ghost Time (1989)(Eurosoft)(NL) MSX NL +D9FC64EA538B14FA37893135C1E9D3D4 Ghostbusters (1985)(Activision)(US) MSX US +5F616ECF85CBC0288563532D691FFD87 Ghostbusters II (1989)(Activision)(US) MSX US +4E925FBD743AF21E1E88B4C559F1C8D7 Ghostly Manor (1985)(Monosoft) MSX +EFFCAC583644B0B230FCFF0D7F47B347 Glass (1985)(Quicksilva)(GB) MSX GB +B7275B15B31DB7894EEADA47C92A8429 Glider (1985)(ASCII)(JP) MSX JP +52C7A8FDD2EF87F7082033963FE5415F Globiblood (1986)(Proeco)(ES) MSX ES +F3FF1334F05693FD8D4CF3BC01311C6E Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[needs 256k][SCC] MSX JP +51DEB5E031362EB49D7057512D78C61B Gold Mines - La Mina de Oro (1989)(Intelligence Games)(ES) MSX ES +8D8441A9F6EF17A51A9B3BC16524FCED Golden Basket (1990)(Opera Soft)(ES) MSX ES +61690B8A215ADA88388744B6966C77F9 Golem (1995)(Second Foundation) MSX +0F2B33A8E22ECBD7AF9DC8EA88F2595C Golf Simulator (1986)(Codemasters)(GB) MSX GB +50FAF2093DBE62AB14CF3A20FD81E8B2 Gomoku Narabe - Omo Go (1984)(Toshiba-EMI)(JP) MSX JP +B5F7F3F04F3B7D02A00313E0C57F296B Gonzzalezz (1989)(Opera Soft)(ES) MSX ES +F43EA3F1E135A8312703D6C4074967F9 Gonzzalezz (1989)(Opera Soft)(ES)[a] MSX ES +FAE166568FA218146F55424C2EB28829 Goody (1987)(Opera Soft)(ES) MSX ES +959FE5AF1FBF06E30E9E5AA7424020D8 Goody (1987)(Opera Soft)(ES)[a] MSX ES +30A35B3A2B3A02DD1301C7496748C969 Goonies, The (1986)(Konami)(JP) MSX JP +2D322EB22606F7B7A93997D2DFB3DD6B Gozira 3D. Godzilla vs 3 Major Monsters (1984)(Bandai)(JP) MSX JP +B7F5D55A567E2474F0C572551D82BF43 Gozira Kun. Godzilla (1985)(Toho)(JP) MSX JP +3E5D271D21E8C5F78A04EC1290C5F7A3 Gradius 2. Nemesis 2 (1987)(Konami)(JP)[needs 256k][SCC] MSX JP +44382A16EB4E162B5F4E6EEE6D18EF9C Gradius. Nemesis (1986)(Konami)(JP) MSX JP +E48F99290B501B1CC861614ADAA99146 Green Beret (1986)(Konami)(JP) MSX JP +20E21B121BC4A3E451D170841A5724D2 Grid Trap (1985)(LiveWire Software)(GB) MSX GB +60317093A7CB1E9D9B0FD2267500E038 Grotten van Oberon, De (1986)(Philips)(NL) MSX NL +F51F148E111EAA18167CF8083BD6661B Gruta de Maquine (1989)(Nemesis Informatica)(BR) MSX BR +19D397C61175D0C6C56A3066378B6CE2 Guardian Stripdobeleen II (1987)(-)(ES) MSX ES +704269E4D5CBFA60159CF19A1CC23C4E Guardic (1986)(Compile) MSX +A62378C50BA898A2CB51141419132C09 Gulkave (1986)(Pony Canyon)(JP) MSX JP +0C7E26D57C0B74ACC04C64022C0AF104 Gum Shoe Logic (1985)(Megacycal Software) MSX +562B96D3B745E34A4D442E5D026EE4A8 Gunfright (1985)(Ultimate Play The Game)(GB) MSX GB +FF4BE087134CE24824F898E36A1049B4 Gunman. Submarine Shooter (1983)(Hudson Soft)(JP) MSX JP +FBC2D791F224B31C40194EBE8E27DCDF Gunstreet (1993)(Electromagic)(ES) MSX ES +B527D9023946F4721E33BBAC273DB27D Guttblaster (1988)(Eurosoft)(NL) MSX NL +9B8672976D5134596271BA3B59DEF9F7 Gyro Adventure (1984)(Nippon Columbia - Colpax - Universal) MSX +04903FF4AE91BE6F4449C90581D4D6C8 Gyrodine (1986)(TAITO)(JP) MSX JP +47EE2D225BAC2E4B08F22404359BD613 H.E.R.O. (1984)(Activision)(US) MSX US +71CD97A6A2CFD85388DDB7B078E404AF Habilit (1988)(Iber Soft)(ES) MSX ES +DAC0EABC5E579D30B207D041C19A5FF5 Habilit (1988)(Iber Soft)(ES)[a] MSX ES +98C6561CADD87641AF4B64B4FE1199AD Hadesu no Monshou. The Seal of Hades (1986)(Casio)(JP) MSX JP +939C9829597A6D001BFC07C661381827 Haller (1987)(Comtrom Software)(ES) MSX ES +4D38DADB5C339190C4E129C5DACF6981 Hanafuda Koi Koi - Gostop Godori (1984)(ASCII)(JP) MSX JP +C897CCEA7DD528B3D20F8BA6525FA271 Hanafuda Koi Koi - Gostop Godori (1984)(ASCII)(JP)[a] MSX JP +557893ABC0F57EFC212C832DD63BF9BE Hang-On (1986)(Pony Canyon)(JP) MSX JP +7FD0BA0127F8C6CBB55FE2D520FE4830 Happy Fret (1985)(Micro Cabin)(JP) MSX JP +9200F126D54B102D101C658DDB6A2028 Hard Boiled (1987)(Methodic Solutions)(NL) MSX NL +0C9B08ADF83BF28E022A645EF4D72BD5 Harvey Smith's Showjumper (1985)(Software Projects)(GB)[passworded] MSX GB +B710102739D28E66C0E07172CC5A9801 Haunted House (1988)(Eurosoft)(NL) MSX NL +7BAAC0E5A19AE33E43E9E78E65AE942B Hayabusa. Moonsweeper (1985)(Toshiba-EMI)(JP) MSX JP +B6157E9C0C9FBEAAD6E17430DCC49DDC Head over Heels (1987)(Ocean Software)(GB) MSX GB +5E500F495081D6DE0B7AC2F4E75CA7CB Head over Heels (1987)(Ocean Software)(GB)[a] MSX GB +B566D6C92CD25BB2D1B184DFE343E5F9 Heat Seeker - Missil (1986)(Mind Games Espana)(ES) MSX ES +98C9480CAA5176087ED99EB7396DC1C8 Heavy Boxing (1983)(HAL Laboratory)(JP) MSX JP +ECDF01DD6C8390E08D41622B98875D0F Heist, The (1985)(Aackosoft)(NL) MSX NL +ACB01D6867EBBA917B05F00428C83B98 Heli Tank (1984)(ASCII)(JP) MSX JP +66A33C8D2AD4DE616D5315ABE273CA47 Heli War (1987)(P.I.S.C.)(BR) MSX BR +6E69BDAD9388E252098B8CFC9E096F35 Hercule (1984)(Infogrames)(FR) MSX FR +74CD2C5477CF5B1D615CF68652AA32B6 Here & There with the Mr. Men (1985)(Mirrorsoft)(GB) MSX GB +2790CE66E7D3A000A9C50489213C4301 Hero-X (1985)(H. Itsui) MSX +44D5B957D34D21A9A5D13BBB8A7AF7F9 Het Damspel MSX Dammes (1988)(MSX Gids)(NL) MSX NL +B9EBC61FB5C37309EBDBA8030D617FCA Het Verlaten Kerkhof (1986)(Pevocrack)(NL) MSX NL +984CAFD729949FBE0303BA1013D0FFF5 High Way Star (1984)(ASCII)(JP) MSX JP +8F3820C83544E5017FCAFF31250361E8 Highway Encounter (1985)(Dinamic Software)(ES) MSX ES +1436F74AE4CDA038440905E27C78EE8F Hitchika (1984)(Infocom)(US) MSX US +48938649AEBF15885D4D279D12ECAC82 Hitsuji Yai. Pretty Sheep (1984)(Hudson Soft)(JP) MSX JP +15327E53606EF66A58B97E28EFEE21A2 Hobbit, The (1985)(Melbourne House)(GB) MSX GB +68FD3DCDA1C5C65EF43F5FD17A294B10 Hole in One (1984)(HAL Laboratory)(JP) MSX JP +7816C8CA68AB03554384CFB32A36B7EB Hole in One Professional (1986)(HAL Laboratory)(JP) MSX JP +3C5863A860E27AD76BD9259E6E0A2737 Hollywood Hijinx (1986)(Infocom)(US) MSX US +F9F5061A52D942E80E40651BA408A62E Hopper (1986)(Eaglesoft)(NL) MSX NL +BAF23CD5A2EE850290E104DBA7AFFDFE Horror em Amityville (19xx)(Matias MSX Software)(BR) MSX BR +BB3BBE0C71EE88C4D30DA3F9C64D5A28 Horror em Amityville (19xx)(Matias MSX Software)(BR)[a] MSX BR +5587B68883ED1D2BA17753B823DA8D37 Hot Dog (19xx)(-)(ES) MSX ES +02AAF96F4C1DD4892AFEB588B99790AD Hot Shoe (1984)(Longman Software)(GB) MSX GB +23E034C30711E36CBED3F76187919902 Howard the Duck (1987)(Activision)(US) MSX US +1190A6B9804813DF4CDA5D5DA07FF91F Hugh (1986)(-)(ES) MSX ES +BC4FBDEB6D73344D29C55768275B7733 Humphrey (1984)(Mr. Micro)(GB) MSX GB +58AF21B78BB6796824A7EEE2B61C3AE6 Humphrey (1988)(Zigurat Software)(ES) MSX ES +0723ACD887CA3414AD2411BAA923339F Humphrey (1988)(Zigurat Software)(ES)[a] MSX ES +641897F8AAF0B6BF3FA55EAF114594DF Hunchback (1984)(Ocean Software)(GB) MSX GB +8425328A4B0420CADB39027840F92037 Hundra (1988)(Dinamic Software)(ES) MSX ES +EA295DF0F9BD41FE0DDDDA1C055E4427 Hungry Harry (19xx)(P&M Mundy) MSX +52394FF1A29EC7988299AEF28F48B132 Hunt for Red October, The (1988)(Grandslam Entertainments)(GB) MSX GB +DF38B9D1C27071644EA6FC8126632058 Hunt for Red October, The (1988)(Grandslam Entertainments)(GB)[a] MSX GB +93B0834F77C22A6C3E715FFE4D6F695B Hunter Killer (1985)(Kuma Computers)(GB) MSX GB +6E6686D40F46A755033D44880E6F9426 Hurricane (1985)(Microland)(NL) MSX NL +69580AD62356A8C7F09765CDF4E3165C Hustle (1994)(Maz Soft) MSX +066F2B0BC96EE0A6661982D11BCB2CC2 Hustle Chumy (1983)(General)(JP) MSX JP +201668100B46E68F5840C8AD7BC4FA2C Hustler (1984)(Bubble Bus)(GB) MSX GB +E2385FDAC1A8A9F4C7C1E100175BA246 Hyde (1984)(-) MSX +849302A96929F0E80E8F50A105F48838 Hydlide (1985)(T&E Soft)(JP) MSX JP +92CECCB20AC166A3FDDDE2655B1DCF3E Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP) MSX JP +03B12BCDA54788C3DFE2E99EF2510DD4 Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP)[a] MSX JP +41E9F59E3050206A1021D5949F10374A Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP)[MSX2ready] MSX JP +DB716A7675A1D814309FAF21F496B3E2 Hydlide III - The Space Memories (1987)(T&E Soft)(JP) MSX JP +2B83A246EE33E86EC4EE88539BCE864E Hyper Olympic 1 (1984)(Konami)(JP) MSX JP +51CD78F6867B97026792D87D13ADD71A Hyper Olympic 2 (1984)(Konami)(JP) MSX JP +2B80AE7D2B1DCA501D7D79C3EBD1D815 Hyper Rally (1985)(Konami)(JP) MSX JP +7EDC02D653D62C537EAE1706E532A6A9 Hyper Sports 1 (1984)(Konami)(JP) MSX JP +C894A31D2BD6C9AA2E48CDCF1C4E1263 Hyper Sports 2 (1984)(Konami)(JP) MSX JP +57DE731FFF63553C8A6B4E72CF054F1A Hyper Sports 2 (1984)(Konami)(JP)[a] MSX JP +4E654359694765D1995C7C12437BCFBD Hyper Sports 3 (1985)(Konami)(JP) MSX JP +5B3236FD172CC647A6EB6BF46B16EA4E Hyper Viper (1985)(Kuma Computers)(GB) MSX GB +539923719C65E7B18BF1D2BA3B7E44E7 Ice (1986)(Eaglesoft)(NL) MSX NL +A470BB6A2D4074295E12AF0293FE393B Ice King, The (1986)(CDS Micro Systems)(GB) MSX GB +EC57160D4C96930A0A94CEA22145B452 Ice World (1985)(Casio)(JP) MSX JP +FB87203FD3AAC23CDC424707C20875B5 Ice-Breaker (1990)(Topo Soft)(ES) MSX ES +6755EBC88C823AD7EEED264AA6D32BCC Icicle Works (1984)(Asshole) MSX +BB47D2BEA0D59C881ED6A0EDAB17F569 Iconia (1987)(Panacom)(BR) MSX BR +2811F046F1EE3FACC20B3749F84435AC Iconia (1987)(Panacom)(BR)[a] MSX BR +2D8A4E4BCD0581083F269A7CEB41A78D Iga Ninpouten 2. Small Ninja 2 - The Mooncastle (1986)(Casio)(JP) MSX JP +850DA6A01C54BCAA7B50D44AFCFEF593 Iga Ninpouten. Small Ninja (1985)(Casio)(JP) MSX JP +056EE867D490D03E29A4DE8BC296133B Igloo (1985)(Garbi Soft)(ES) MSX ES +1549EFE15BA2D584C9E2B16D34AA8AB9 Ilha do Tesouro, A (1991)(Fernando Tollendal)(BR) MSX BR +57CFCED30F34B3859E04AA785587B2E0 Iligks Episode I - Theseus (1984)(ASCII)(JP) MSX JP +B710214AB12EBB96C92A113CE0057240 Iligks Episode IV - The Maze of Illegus (1984)(ASCII)(JP) MSX JP +B367626C7724F464D5E737CC65013C7C Illusions (1985)(Nice Ideas)(FR) MSX FR +0F979F6F2C82FFB3DD59AFF4ACEB0299 Inca (1987)(Eaglesoft)(NL) MSX NL +DAAAE284D82A69FC227984FBAA56A5FF Indian no Bouken. Indian's Adventure (1984)(Hudson Soft)(JP) MSX JP +B45B5755F5B3BFA379BDA77F7303244D Indiana Jones and the Temple of Doom (1987)(US Gold)(GB) MSX GB +4320303D6675CF8654225CBE01878D2F Indoor Race (1987)(Mind Games Espana)(ES) MSX ES +EF061ADE6AD5013D91B675F6E32A57D4 Indy 500 (1986)(Methodic Solutions)(NL) MSX NL +4559B8673526E5D79D411EE157F935D8 Indy 555 (1986)(Editora Aleph)(BR) MSX BR +90B58D9DD1D0D76ADAA3B45C5AF3F36E Infernal Miner (1985)(Sprites) MSX +DE0686B413FB0642283183B5DBD02E9C Inhumanos, Los (1990)(Delta Software)(ES) MSX ES +4657D21F6ACD474154F876093B3D4944 International Karate (1986)(Endurance Games)(GB) MSX GB +3158981D78612B7D5F8706D0DE343B63 International Karate (1986)(Endurance Games)(GB)[a] MSX GB +63398B621617A1B29CDA0C21FC816FE5 Intrepido (1988)(Mind Games Espana)(ES) MSX ES +AC4EB87BD328474C5194E4C8C1EE92F8 Invaders Revenge (19xx)(MMG Software) MSX +0F1DDC3532166BCCC3FA7DA030AD0313 Invasion (1987)(Bulldog)(GB) MSX GB +8B85B83455CE0D4492CCBC4129CC8150 Invierte y Gana (1986)(DIMensionNEW)(ES) MSX ES +4310CDA17D989765E836722AD371AC33 Iron Eagle (1986)(GVH)(NL) MSX NL +71C1962A7D371C2AC1066B78090537CD Iron Gauntz, The (1997)(Oops) MSX +A85092A5F27E68ED37146D41E733ACC8 Ito Ipi (2006)(Jose Javier Franco Benitez) MSX +C3D52F40AE3EC5252570EF06248BD555 J.P. Winkle (1986)(MSX Magazine)(JP) MSX JP +38C40ABA4155273424FC2CC07E53265E Jabato (1989)(Aventuras AD)(ES) MSX ES +C6DAEC4F8C5D9EABDAF1EE0C12594378 Jabato (1989)(Aventuras AD)(ES)[a] MSX ES +046F16D153EDC6C3A744C8AD4900C25F Jabato (1989)(Aventuras AD)(ES)[a2] MSX ES +9C06BDFFCC237981F8452AB25081A5FA Jack the Nipper (1986)(Gremlin Graphics Software)(GB) MSX GB +78707C42E3C7D3BE5ADF34CC12F29DA1 Jack the Nipper II - In Coconut Capers (1987)(Gremlin Graphics Software)(GB) MSX GB +5808B818C80097CFF67CE86DF644A277 Jagur (1987)(Hudson Soft)(JP) MSX JP +1C1B9442E00B09D15C6C74CB2AD334D9 Jagur (1987)(Hudson Soft)(JP)[a] MSX JP +DD1C76CFEB445D6FE1CAEFCD751D46D3 Jake in the Caves (1986)(SvL Software)(NL) MSX NL +79681CEAB4B30799AB531AF25C6A52D9 Jet Bomber (1985)(Aackosoft)(NL) MSX NL +BB4E20E182AD9E482ACC2DC80312B532 Jet Fighter (1988)(Eurosoft)(NL) MSX NL +50F8B3E89C4A75EC5B7C3FA12EDFE13C Jet Set Willy (1985)(Software Projects)(GB) MSX GB +70AAE5435E1B6C8AADE130E2702E9DB5 Jet Set Willy (1985)(Software Projects)(GB)[a] MSX GB +179EF46A6E58D58ACCEF3BFE9B043726 Jetalfs Strikes Back (19xx)(-) MSX +59698F42420448C261AEFFB201F9BAF9 Jissen - 4-nin Mahjong. Four Battle Mahjong (1984)(Sony)(JP) MSX JP +9A8FE9E9A2F5CAC3E4E8B019D24CF642 Joe Blade (1989)(Players Software)(GB) MSX GB +EF2F896D90E0A93ED4DEA4AAD4E9E9EC Johny Comomolo in 3-2-1 Fire (1986)(Dro Soft)(ES) MSX ES +20BA5728F92C218A2FA07E7B047B3589 Joquei (19xx)(-)(BR) MSX BR +AE873457E737344E534CD0AD1B76A1D7 Journey to the Centre of the Earth (1985)(Bug-Byte Software)(GB) MSX GB +8922954383FD2A63F95BD9AD98EBC568 Jumbo (1987)(Wolfgang Well) MSX +D5AA79EAAFCCC692B5509C866408E221 Jump (1985)(ASCII)(JP) MSX JP +50989B51396F05326D2697542DAF22D9 Jump Coaster (1984)(Nippon Columbia - Colpax - Universal) MSX +4A781059EE37FF6D4BE1FC0C4A4AB41D Jump Land (1985)(Nippon Columbia - Colpax - Universal) MSX +FC63D56DE5475124BC95D8C9D215A6E2 Jumper 2 (1985)(Magic Circle) MSX +C3105D3281F76DDE9DB2B41B7F5AADD5 Jumping Rabbit (1984)(MIA)(JP) MSX JP +6DFA97B516FFD611454545E84F3719FC Jungle Jim (19xx)(-) MSX +F4EF4B9494BB968AB7EA31E67BEEF984 Jungle Warrior (1990)(Zigurat Software)(ES) MSX ES +4F08E4B13ACE14635C86D2B2373B3383 Jungle Warrior (1990)(Zigurat Software)(ES)[a] MSX ES +615C61F7CB1D226CE8D5550E2A7A14A6 Juno First (1983)(Sony)(JP) MSX JP +D674AFE0152D1D1328022143C5CC2E05 Kaeru Shooter (1984)(Hudson Soft)(JP) MSX JP +5E0BB7AB914794ACBF6B9498C2A2475D Kage no Densetsu. Legend of Kage (1986)(TAITO)(JP) MSX JP +F8492027440878BD052E2C07892BB194 Karuizawa Kidnapping Guidance, The (1986)(Enix)(JP)[a][needs 256k] MSX JP +A2D352C861112B1DBE1571F1D784BEE2 Karuizawa Kidnapping Guidance, The (1986)(Enix)(JP)[needs 256k] MSX JP +41BD401B45DE88CEC7B3E11C5DF8C052 Kate II (19xx)(DEPJ Soft)(NL) MSX NL +87420F26A8186A1D9D28C8F14733D2BE Katmosis Faraon (1985)(ABC Soft)(ES) MSX ES +BC3CDB961DC32D81BBD80055D955B035 Ke Rulen los Petas (1989)(Iber Soft)(ES) MSX ES +26025E3D61930EE344AB704AEA347602 Kenja no Ishi. The Stone of Wisdom (1986)(Casio)(JP) MSX JP +92E6AA7BBF4E194AE1BF2B83AC4D25FF Kenja no Ishi. The Stone of Wisdom (1986)(Casio)(JP)[a] MSX JP +4B81605A0B17704BA7863A498EB1A0E2 Keystone Kapers (1984)(Activision)(US) MSX US +16ED57625558205A6A887E92C9596772 Kick It (1986)(Aackosoft)(NL) MSX NL +0A137B31C23D70836D848C431371DC7E Killer Station. Biotech (1983)(Hudson Soft)(JP) MSX JP +538B6264CF4A2DD0F4D041C3B35B72C1 Kimpo (1984)(-) MSX +96697539D05DFFF33025FA967BA766E7 Kinasai (1984)(-) MSX +EE5957297DD0672E186B131F5C3C2D08 King & Balloon (1984)(Namcot)(JP) MSX JP +63BBF4B9459D5E71D409D28D36BA6D0B King Leonard (1986)(Mind Games Espana)(ES) MSX ES +765DBF42CBFEB11BD0D91ACE3E8DE1BB King's Knight (1986)(Square)(JP)[a][needs 256k] MSX JP +89D9022A2574ED4C560F880065399504 King's Knight (1986)(Square)(JP)[needs 256k] MSX JP +48369D5DCD34C8C83249AA0CA684C6CA King's Valley (1985)(Konami)(JP) MSX JP +B17C2CD1D231BFB126C1D9C1C8A4AE82 King's Valley Plus (1985)(Konami)(JP) MSX JP +23EC69F102068FEA3F030C43C1A361C7 Kinnikuman. Muscle Man (1985)(Bandai)(JP) MSX JP +C80F1350A101414F038E3D945BCDC404 Klaverjassen (19xx)(C.A. Reedijk) MSX +ED3CCEFBCF1B7B74EB1183702DAD4CC4 Klaverjassen (19xx)(Kees)(NL) MSX NL +F5D991F2616BEB48CB957C285A29EB6F Klax (1990)(Domark)(GB) MSX GB +A6C0C3653DC2547FAFA608C1252D49D3 Kleiduif (19xx)(-)(NL) MSX NL +D04A371632B5677D07B3396829C620A3 Knight Lore (1985)(Ultimate Play The Game)(GB) MSX GB +AC3EFF9DE04EE65DA50C8B3676901D3E Knight Tyme (1986)(Mastertronic Added Dimension) MSX +4095FFE202F6F2A2626EACF6CA744ED2 Knightmare II - The Maze of Galious (1987)(Konami)(JP) MSX JP +6F95FDBBC38C80A825F7B2C31ACA1AE8 Knightmare III - Shalom (1987)(Konami)(JP) MSX JP +2448587E6715A8505EF9CD45CF6E8D7D Knightmare. Majyo Densetsu (1986)(Konami)(JP) MSX JP +B2259CAE4BFF998C3BD0456B8459EB4B Konami's Baseball (1984)(Konami)(JP) MSX JP +035B6A0392A4724A3083963848011D4D Konami's Billiards (1984)(Konami)(JP) MSX JP +FC526AFCD9D1103C43AE52C2F24A7904 Konami's Golf (1985)(Konami)(JP) MSX JP +B19DB9BBA91B9B8FBB765A89F59587C6 Konami's Ping Pong (1985)(Konami)(JP) MSX JP +B904F7E53E28F39585D2D41C02899F61 Konami's Pooyan (1985)(Hudson Soft)(JP) MSX JP +F069993954BE8864B87F871D92D8F5B9 Konami's Soccer (1985)(Konami)(JP) MSX JP +7541B4D5B56386152F0BD2A77803F5B0 Konami's Tennis (1984)(Konami)(JP) MSX JP +AF9D81E35CF1D497B48340E0045A6C8A Koneko no Daibouken. Kitty's Great Adventure. Catboy (1986)(Casio)(JP) MSX JP +6B79CF89BC30B3F19D1CBBF721D0D4DB Krakout (1987)(Gremlin Graphics Software)(GB) MSX GB +8C20D7724E29A417E934BE51A5ABBE5E Krypton (1986)(Manhattan Transfer)(ES) MSX ES +1E5D7845EA9E77A389C29D09FE3AD60B Kubus (1985)(Kuma Computers)(GB) MSX GB +0D7CFAB2BE555BA88196FC6732B8A8F1 Kung Fu Master (1984)(ASCII)(JP) MSX JP +E35EC8CF72F962597BD2435F98DAE6AD Labboss (1987)(Cleversoft)(FR) MSX FR +A8FB5937B7C3013496E5CA23C951AE87 Laberinto (1985)(Advance)(ES) MSX ES +7E6B7E27B57F4BD9616E731BBB31DA5C Lady Safary (1988)(OMK Software)(ES) MSX ES +7AA80B018D060FCF861307CBF203EBB1 Lady Safary (1988)(OMK Software)(ES)[a] MSX ES +DE6325241AE18DFD1D9A89D7CB29BCE5 Laptick 2 (1985)(dB-Soft)(JP) MSX JP +B1DCE9FAE7FD0729ED278A0E68F4C0EB Laser Warriors (19xx)(-) MSX +D11642D3CC169DD2CD17F4B4CA8A52C7 Last Mission, The (1987)(Opera Soft)(ES) MSX ES +3B413C8B3E584B4E7BB1843B64943B74 Last Mission, The (1987)(Opera Soft)(ES)[a] MSX ES +B82CE825648FAEA4F1339A7002C0E0CD Last War (1989)(Nagi-P Soft)(JP) MSX JP +A3990C3B619470250AA35849A00551F1 Last War II (1991)(Nagi-P Soft)(JP) MSX JP +8A8F90B92C0E2769BB7F3EC7E2559DDF Lazer Bykes (1985)(PSS)(GB) MSX GB +FF999B0AC64FA5EF6430A13AF59759DB Lazer Bykes (1985)(PSS)(GB)[a] MSX GB +42220BA9F07C2664F69570BBE4C76521 Lazy Jones (1985)(Terminal Software)(GB) MSX GB +7E7E5AA19DDD1BCD6BAC2AAC547CBA7F Le Mans (1984)(Electric Software)(GB) MSX GB +6C99EABE56752794DDD01CE40B74BAEB Le Mans 2 (1985)(Electric Software)(GB) MSX GB +789543F995F4B4E215AAD41E37DD2612 Legend (1988)(Iber Soft)(ES) MSX ES +9CF8297CC151591FACECBB12973E2B77 Legend of Ladra. Radola Fantasia (1988)(MSX Magazine)(JP) MSX JP +EE9A04F2031455E96EC2E8E13BFE643D Legend of Ladra. Radola Fantasia (1988)(MSX Magazine)(JP)[a] MSX JP +B612B1D8E24F8AD5C48F0B5C00B7B019 Legend of Ladra. Radola Fantasia (1988)(MSX Magazine)(JP)[a2] MSX JP +521244CF82E07B273DE1F3A6359D05BA Legendly Knight (1988)(Topia)(KR) MSX KR +304B2E5B7178795040011A7EC2A1214C Legendly Knight (1988)(Topia)(KR)[a] MSX KR +721F516FF90CB7F7AB8F9A30780646B9 Legends - Leyendas (19xx)(Mind Games Espana)(ES) MSX ES +AD8EB0FE837B830C0B135358726C307A Legion (1988)(-) MSX +EF0910F811F9934B4E38A8E2E46B69A3 Lenda da Gavea, A (1987)(Stop Informatica)(BR) MSX BR +9EB74D318C208D2D792C571B1862608B Leucocyt (1985)(CD Systems)(NL) MSX NL +6500EF61C5CB83F75A81C3227A57DC3F L'Heritage - Panique a Las Vegas (1987)(Infogrames)(FR)(es)[a][aka Inheritance, The] MSX es FR +F303874F2DCBA7196A178FC623D0F679 L'Heritage - Panique a Las Vegas (1987)(Infogrames)(FR)(es)[aka Inheritance, The] MSX es FR +7CAB26A3ACD57AF75B46E1B58BBE8ACB L'Heritage - Panique a Las Vegas (1987)(Infogrames)(FR)[needs MSX-DOS] MSX FR +85820FE2B11289B2030A5229D912EB29 Life in the Fast Lane (1987)(Methodic Solutions)(NL) MSX NL +D259DDB21420F627A911A7DE6C2311AC Life in the Fast Lane (1987)(Methodic Solutions)(NL)[a] MSX NL +A10C39C55B3BD9F7A3001A4514BAFB4B Lives Ball (1986)(Micro-MSX)(FR) MSX FR +193C406B44471E1DE66D018FD2287290 Livingstone Supongo (1986)(Opera Soft)(ES) MSX ES +5EE073F9B963D028B1255C2D79EF794F Livingstone Supongo (1986)(Opera Soft)(ES)[a] MSX ES +CC83C8E01275919748A643216139E000 Lode Runner (1984)(Sony)(JP) MSX JP +EAA167404C19B3AFEDBC2861D11D2B91 Lode Runner II (1985)(Sony)(JP) MSX JP +17E728924AAC9088E9C4E63C660FD669 Lonesome Tank (1984)(MIA)(JP) MSX JP +EB9C8791EB39A236B12725CF462E6B45 Loppan (2000)(Johannesson) MSX +AC00EC2C5C37BAE362966DE56572762A Lunar Ball (1985)(Pony Canyon)(JP) MSX JP +54D31B104DB3F46FC76E187EC71DB21B Mac Attack (1986)(Eaglesoft)(NL) MSX NL +A3C755642A8C4ADCBDC22531C870F765 Macadam Bumper (1985)(Sony)(JP) MSX JP +9895DD174EE24308DCCB25B918ED9584 Mach 3 (1989)(Proein Soft Line)(ES) MSX ES +51050723A719490C712519B64396E8C3 Machinegun Joe vs the Mafia (1983)(Hudson Soft)(JP) MSX JP +BEBCF5BAD13C9A7DAE36A2DEA3D813C1 Macross Countdown (1985)(Bothtec)(JP) MSX JP +3783620BF4D3B17E5EBC8F69BB5356F6 Mad Max (1987)(BKS) MSX +72D164E9F77ACE8E1593C4B9FDAC9BA2 Mad Mix Game (1988)(Topo Soft)(ES) MSX ES +89211046B289999A63EA5BD79A4AC1FC Mad Mix Game (1988)(Topo Soft)(ES)[a] MSX ES +707A2C4F0AA9E06A9279BEBB5CC07C21 Mad-Fox (1986)(Manhattan Transfer)(ES) MSX ES +9FD2B30D855F5AE7E712951D567A01DD Magic Johnson's Basketball (1990)(Dro Soft)(ES) MSX ES +99F60B2EEAA967C0CCF8AC8C07450380 Magic Pinball (1987)(OMK Software)(ES) MSX ES +1840905F67334D06797F5F992AD8A106 Magical Kid Wiz (1986)(Sony)(JP) MSX JP +8D68C59C861486EABDC3EB397D44EF5C Magical Tree (1984)(Konami)(JP) MSX JP +D93C5C1C3868D1E853CF9D68F5A518E9 Magunam. Kiki Ippatsu. Magnum Prohibition 1931 (1988)(Toshiba-EMI)(JP) MSX JP +7935F5A941CC534AECEA8BFADB3965A2 Magunam. Kiki Ippatsu. Magnum Prohibition 1931 (1988)(Toshiba-EMI)(JP)[a] MSX JP +B04E8C1227B2E6342428D6AC44A84CF8 Mahjong (1984)(Konami)(JP) MSX JP +61FB1D316C010A12E1E6764B9336804D Major 1. Maliop Nuctorejog (1988)(Crazysoft)(ru) MSX ru +43D4EA9EA5BD3548767DF114B6C409FE Major 2. Nuctoretog Ha Bagom (1988)(Crazysoft)(ru) MSX ru +04215280C8068E69631A3D85BAFEEF42 Maldicao da Vila Sinistra, A (1988)(P.I.S.C.)(BR) MSX BR +EF90C291ABA36033EE6F07C57940D4FC Mambo (1989)(Positive)(ES) MSX ES +89B48B60D34C6F9A2B16313B245BD560 Mambo (1989)(Positive)(ES)[a] MSX ES +8607442C5DFBBEE197D3B9772F3FC6A7 Mandragore (1986)(Infogrames)(FR)(fr) MSX fr FR +37B8BD0AA795869D8A3F03D9CDFBF5C2 Manes (1984)(ASCII)(JP) MSX JP +3A928F2955E3A8562DDC6A4DF891F48F Manic Miner (1984)(Software Projects)(GB) MSX GB +746934FA00352B57AED1C17C65531040 Manus (1986)(Anglosoft)(GB) MSX GB +65863F1FFAE5E4B7461A15AD9BD77832 Mappy (1984)(Namcot)(JP) MSX JP +61CA4989DC3432260BD8AFCB1DAEE6F0 Marble Choco Let (1994)(-) MSX +754ACAE97741AE78248356ADD03D725A Marble Choco Let (1994)(-)[a] MSX +63F2F143FBCECAD7E558A6235EB5AA6A Marie Celeste (1985)(Editora Lutecia)(BR) MSX BR +1D834C3CE137057D45E4E78D1DFDD031 Marine Battle (1983)(ASCII)(JP) MSX JP +C80026325C16DFB90A80442E5F633BFD Mars (1989)(Nagi-P Soft) MSX +69205FC32925F887165D6051F50F34F9 Mars II (1990)(Nagi-P Soft) MSX +1FB7A063335E3D6002BA3F85FD296A50 Mars II (1990)(Nagi-P Soft)[a] MSX +F944DCFE12D84F26F6584F5990DF3442 Martianoids (1987)(Ultimate Play The Game)(GB) MSX GB +7C8511062D6C83BE11C04AF5E9B6E865 Mask II (1987)(Gremlin Graphics Software)(GB) MSX GB +24F0DF1A2A71177F87E5EB4E34CCA063 Mask II (1987)(Gremlin Graphics Software)(GB)[a] MSX GB +5487889FF143319AE123021C5CCD5EAE Master Chess (1987)(Mastertronic)(GB) MSX GB +1EF6DBC4DC1240A8FFFB07943E6798A4 Master of the Lamps (1985)(Activision)(US) MSX US +3121A56D53BFC1CD1A538F7047E39575 Masters of the Universe - The Movie (1987)(Gremlin Graphics Software)(GB) MSX GB +8E45E11B36E07C438A9C68CC016663C6 Matagal (19xx)(Ricardo Kuntzke)(BR) MSX BR +7E393ECAFF826C0AFE88D875E54C01E2 Matamarcianos. Batalla Espacial (1986)(Manhattan Transfer)(ES) MSX ES +9B1F08F18C7CADA042BF0E36A9F3C86D Match Day II (1987)(Ocean Software)(GB) MSX GB +B40122D6BFEE0ECC0B7854D3AB23519A Match Day II (1987)(Ocean Software)(GB)[a] MSX GB +67EA18F356E64B37A1C9185DAF87CE7E Mateo (19xx)(-)(ES) MSX ES +78908F826A0942C9E59F39D702A6B8F6 Maxima (1984)(PSS)(GB) MSX GB +0BD2145844AAAB2463024306F6C47D8A Maze Chase (2006)(Area 51) MSX +0075B64C2DF4A2D902CF6C28E595220E Maze Master (1988)(Eurosoft)(NL) MSX NL +1383FD863707552B2CE700DBF718AC2F Maze of the Black Spider, The (1989)(Eurosoft)(NL) MSX NL +91E3D9D57226F8D3DAB34C866F7D7CD3 Mazes Unlimited (1986)(Eaglesoft)(NL) MSX NL +88F5E2565B2BC63F8DCB2D2659EFEA2D Maziacs (1985)(DK'Tronics)(GB) MSX GB +0B5DEFB88E547F42BAF07A76618DB3E1 Meaning of Life (1986)(Eaglesoft)(NL) MSX NL +5D755D2F14C6EE03A300E5BD3A9181D2 Mecom (1988)(Iber Soft)(ES)[aka Mekong] MSX ES +FB13899DB3658D3D13DBF765CCDF24C8 Mega Chess (1988)(Iber Soft)(ES)[aka Super Chess] MSX ES +1404980C00980A90F30CD211868D43BF Mega Desolators (19xx)(Colin Dooley) MSX +7BC4E6F6718E2B4E1E40BC1FFE1B02DC Megalopolis SOS (1986)(Compile) MSX +221FBCF7D179B6E4B7DBF7AD6C7C6ECB Meganova (1988)(Dinamic Software)(ES) MSX ES +E6BEF634C97D3F3B1CB718D7EE5C941E Meganova (1988)(Dinamic Software)(ES)[a] MSX ES +497151DAACD400D96740EB8C6A7D9D2F Megaphoenix (1991)(Dinamic Software)(ES) MSX ES +40242F0FDA7459C78CE1150BA8800DB3 Megaphoenix (1991)(Dinamic Software)(ES)[a] MSX ES +72944516639BEB6593266F45DE0F2F9D Menphis (1989)(Nemesis Informatica)(BR) MSX BR +D949C24F098045B6DC0DC428D6E28430 Menphis (1989)(Nemesis Informatica)(BR)[a] MSX BR +D28ED09C26977B24EBD617D56D7C1FC7 Meteoros. Meteors. Meteor Storm (19xx)(-) MSX +0B0A9A596CC3DC0824DC1A9DB83891C1 Metropolis (1989)(Topo Soft)(ES) MSX ES +C3397AC4D5B56C6AB56071B4BBDF869A Metropolis (1989)(Topo Soft)(ES)[a] MSX ES +13CD73A6540592DD75F7C5E9AD5DA204 Meurtres sur l'Atlantique. Murder on the Atlantic (19xx)(Infogrames)(FR) MSX FR +ED04C8449A3C118EDC08ED170C8660F1 Meurtres sur l'Atlantique. Murder on the Atlantic (19xx)(Infogrames)(FR)(de) MSX de FR +4B5F6012DB3399E4CB9853280ADD710B Michel Futbol Master (1989)(Dinamic Software)(ES) MSX ES +483E6C2BDB9673993E93227736D033C7 Michel Futbol Master (1989)(Dinamic Software)(ES)[a] MSX ES +083F704A5CE5F9F5E1C67B98BFF2C1C4 Micro Man Id-Man (1986)(Micros ID)(FR) MSX FR +AE6D0CF77F3A6AF9352268A76B017183 Midnight Brothers (1986)(Sony)(JP) MSX JP +0988A85F015A7DBCD9CB0DF41DC72CF8 Midnight Building (1984)(ASCII)(JP) MSX JP +13BF0BAC66C4EBFFB15CC1602FC4DDD3 Mike Gunner (1988)(Dinamic Software)(ES)[a][gunstick] MSX ES +1DCEFE75C0D8BD14F4B191106D2188CB Mike Gunner (1988)(Dinamic Software)(ES)[gunstick] MSX ES +DB9F5F1406927F63194F2CB661B2C579 Mil Caras (1985)(Idealogic)(ES) MSX ES +F0A74B08E9A695904D90921A3B0EA876 Milk Race (1987)(Mastertronic)(GB) MSX GB +B06043DBC99E836A15D4E60F67D8DEDF Mina, A (19xx)(-)(BR) MSX BR +15A10D5DB14404D7AAE62A960166CEDE Minder (1985)(DK'Tronics)(GB) MSX GB +174D4E73057E51F30386096437917D1E Mini Golf (1985)(Namcot)(JP) MSX JP +00BB234498204292BDCB10BF2AE62463 Miraculus (1985)(Volker Becker) MSX +A4AF625A8D2E4C569D4E45C0C2D36B6F Mirai. Future (1987)(Xain)(JP) MSX JP +81BC5D216CC389EC21957BAC989BCC1D Mirai. Future (1987)(Xain)(JP)[a] MSX JP +FE718142F1E56F4DC37520262E1ADECB Mision de Combate (1984)(Advance)(ES) MSX ES +6996F8DB2549961691643B5477661D75 Missile Command (1988)(Eurosoft)(NL) MSX NL +DB2FECE15AFDF232D7FE87B27189E255 Mister Jaws (1987)(Eaglesoft)(NL) MSX NL +52BB36D3C3C36625FB092594EB880E11 Misterio del Nilo, El (1987)(Zigurat Software)(ES) MSX ES +3F2E629AB1183E3B84866CAE47C337B2 Misterio del Nilo, El (1987)(Zigurat Software)(ES)[a] MSX ES +5DF0FF50BA2782252C1330B078FB0D0B Mitsume ga Tooru. The Three-Eyed One Comes Here (1989)(Natsume)(JP)[a][needs 128k] MSX JP +41F2A8BA919F2C74B4070359A222A2FF Mitsume ga Tooru. The Three-Eyed One Comes Here (1989)(Natsume)(JP)[needs 128k] MSX JP +1A89FD3530015AD6B37C83B08DC87679 MJ-05 (1984)(Hudson Soft)(JP) MSX JP +04938B155B8BC463013E8800ACF4DD4C Mj-O5 (1983)(Hudson Soft)(JP) MSX JP +4AF9941FCE26E64FA02FFAC9F0116EAD Moai no Hihou. Secret Treasure of Moai (1986)(Casio)(JP) MSX JP +E15B82DF7C88208CDEEAFAC7FA1B6E82 Mobile Planet Stylus - Approach from the Westgate (1986)(HAL Laboratory)(JP) MSX JP +60DAF5F771175FAC79F9B23EFBA8BD60 Mobile Suit Gundam (1984)(Bandai)(JP) MSX JP +7EF9261C19D841801012175A1F4756C5 Mo-Karimakka. Bochibochidenna Sport (1986)(Leben Pro)(JP) MSX JP +0B91E8299C91B097F48BCD43D930558D Molecule Man (1986)(Mastertronic)(GB) MSX GB +99EE6CC6A11EF7DCE9735DA1D0509D26 Monks (19xx)(-)(ES) MSX ES +B770247FF0A97E440511921B42C7D4E5 Monogatari Megami Tensei. Digital Devil Story (1987)(Telenet Japan)(JP) MSX JP +AC4AC3A953831FEA970851276522B66F Monogatari Megami Tensei. Digital Devil Story (1987)(Telenet Japan)(JP)[a] MSX JP +FDF7C6BF2822E42A65D18727E11B5438 Monopoly (1986)(Leisure Genius)(GB) MSX GB +F3BF24AE19C149A6EB7BCE3D62F1DE1D Monster's Fair (1984)(Toho)(JP) MSX JP +BA98DFD5133CA3E2368AD21386113858 Monster's Fair (1984)(Toho)(JP)[a] MSX JP +8BB797FFDF91016BE73624CC8190F395 Moon Patrol (1984)(IREM)(JP) MSX JP +E31DECC9BB095EA72A20E52811B37525 Moon Race (1985)(Volker Becker) MSX +7EF066D8577C924184EFCB916D594655 Moon Rider (1986)(Eaglesoft)(NL) MSX NL +C68CF128436E37185EF6C09A153EDE5E Moonbase (1994)(Second Foundation) MSX +C75A18427DC8E336FCED4996B672D11A Mopi Ranger (1985)(Konami)(JP) MSX JP +91168926F22FCB5C6E12EAD939D04B58 Mortadelo y Filemon (1988)(Dro Soft)(ES) MSX ES +A5F1408AF01A26E9B32916B2E408C9C9 Mortadelo y Filemon II - Safari Callejero (1990)(Dro Soft)(ES) MSX ES +CAE213F24BA7EF4D03F475B7D25DCF8A Mortadelo y Filemon II - Safari Callejero (1990)(Dro Soft)(ES)[a] MSX ES +1954ECE185E4AB60671569A56E704D74 Most Amazing Memory Game, The (1986)(Idealogic)(ES) MSX ES +68852EF8CE6EE9C402060DE1579E47F6 Mot (1989)(Opera Soft)(ES) MSX ES +337D177FB06B303B4EE0D64602352066 Motorbike Madness (1988)(Mastertronic)(GB) MSX GB +898DB9C33664825D9522BA9E7DFB69B2 Mountain Bike Racer (1990)(Positive)(ES) MSX ES +3691856709E38B2593D9E560DF9454A6 Mountain Bike Racer (1990)(Positive)(ES)[a] MSX ES +7D4A1CC501E6F682C1C872F39BE067B0 Mouse Jump (1985)(SvL Software)(NL) MSX NL +2B1077B0D112379B28248289547BF8B5 Mouser (1983)(Sony)(JP) MSX JP +EBAA69ECD863B7759F11AE3E6E30C6E0 Mr. Chin (1984)(HAL Laboratory)(JP) MSX JP +42C9E392223C4FE8F60298A5BD23BC31 Mr. Do! vs Unicorns (1984)(Sony)(JP) MSX JP +D72F89E7431BE5657CAF14651A7099EF Mr. Do's Wildride (1985)(Nippon Columbia - Colpax - Universal) MSX +661B163593D4DB7347560CA5F42B36A9 Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB) MSX GB +E415DB6E82D2CE0BC2F058F5FB29DCE7 Mr. Wong's Loopy Laundry (1984)(Artic Computing)(GB)[a] MSX GB +E2E498248CEE375E87EB62B4350B9534 MSX Baseball (1984)(Panasoft)(JP) MSX JP +528F2E0817688E136063DB8E589F195E MSX Chess Turbo Chess (1986)(Artic Computing)(GB) MSX GB +BEB3A72A6F7A3A9A7934220ED3E77041 MSX Daikoshin. Rompe MSX (1989)(MSX Magazine)(JP) MSX JP +ED4976B1F0343D45A8E1E736CDF2A440 MSX Pac-4. Cocos (1985)(Amsterdam)(NL) MSX NL +2BF443A5610A389D33004C5E63DDA135 MSX Panic (1986)(Eoe)(FR) MSX FR +ADB7DAABB6CCFA9F421A558724188D20 MSX-21 (1983)(ASCII)(JP) MSX JP +706EB82E01DD79E9DF202A89030FF73B Munchy (1989)(Tyfoon-Software)(NL) MSX NL +72FA226901A9BDA010C5757A5404F1B7 Munchy (1989)(Tyfoon-Software)(NL)[a] MSX NL +B89BE9061BE7579D3621A2D05EB413A9 Mundial de Futbol (1990)(Opera Soft)(ES) MSX ES +D04CB1BC61BDD32C8DCD97ECEE2FA416 Mundo Perdido da 3a Dimensao, O (1988)(Guilherme da Silva)(BR) MSX BR +3C2FA64A55E28423A08CF314128B48EB Mundo Perdido, El (1988)(Topo Soft)(ES) MSX ES +6B87E175C6761AF68B306E1D5C847D73 Mundo Perdido, El (1988)(Topo Soft)(ES)[a] MSX ES +C16E30335803896B56D9E6A9A0F47AEE Munsters, The (1989)(Alternative Software) MSX +6DD43CD55A787A4C432390B468291DCB Munsters, The (1989)(Alternative Software)[a] MSX +D00E657C0A23D8C4075D50F4F81A3E0E Mutan Zone (1989)(Opera Soft)(ES) MSX ES +D9EDF23C550A3138F6969C33538C90BB Mutan Zone (1989)(Opera Soft)(ES)[a] MSX ES +53219C0E143C68F6DAEA8214DD7FCBFA Nachtwacht, De (1986)(Radarsoft)(NL) MSX NL +2EAFC4A8378EE6AE6574A0A531A3FAB6 Nachtwacht, De (1986)(Radarsoft)(NL)[a] MSX NL +22BED9AB93D5B1FC0260A35446F4C660 NAM (19xx)(-)(IT) MSX IT +9D2590CA224A169AF20F45730CFB2CE9 Navy Moves (1988)(Dinamic Software)(ES)[code 53817] MSX ES +1193B1F894EEE5466E4299BFC6AFD4EB Nebula Wars (19xx)(JCE)(ES) MSX ES +8D68589C232270E2594531F820ABAA70 Nessen Koushiyen. Exciting Baseball (1984)(Casio)(JP) MSX JP +91F6C0CD5E369A2482DD706E7A760AC8 Nibbles MSX (1992)(Stefano Fronteddu) MSX +31372BB68E0ECAF213B0C4EF43C99607 Night Flight (1982)(Nippon Columbia - Colpax - Universal) MSX +D88C8E52948321B817EA4ACF0238C2C2 Nightshade (1985)(Ultimate Play The Game)(GB) MSX GB +00B500FB6B61F0B67EE291D1D652A5E8 Ninja Jaja Maru Kun (1986)(Nippon Dexter)(JP) MSX JP +96430FB086970277DF44CD19C0DD2366 Ninja Kun. Majyo no Bouken (1985)(Nippon Dexter)(JP) MSX JP +DF8BBEB25EE630572BC9CC31B69F7F91 Ninja Princess (1986)(Pony Canyon)(JP) MSX JP +F929F2D9D51C2D9B800B2208AF6F9378 Ninjya Kage (1984)(Hudson Soft)(JP) MSX JP +2B55E089E6A2343412697D3065A6A54F No Fuss (1991)(Anma)(NL) MSX NL +6D092A6C1F886CBEDEC93A12C1201106 No Fuss (1991)(Anma)(NL)[a] MSX NL +D9615CD414DF3BE733B3547E6DB76D96 Nonamed (1986)(Dinamic Software)(ES) MSX ES +7B2CDAFBF91B9580FF3F30F1A676B1BE Nonamed (1986)(Dinamic Software)(ES)[a] MSX ES +2691952D989EB1672EC685DB93856038 Northsea (1987)(Aackosoft)(NL) MSX NL +0A58F4F2FE920E724158AF9BBB96DE2F Noughts & Crosses (1984)(Spectravideo)(GB) MSX GB +A2EF44A8E2ED14A3C4EFC8A66A09EFB8 Noughts & Crosses (1984)(Spectravideo)(GB)[a] MSX GB +1EDB8073A6C45E83E66F4FE21F493F9C Nuclear Bowls (1986)(Zigurat Software)(ES) MSX ES +813604E9B017D5A7ED1FFC44ADB01176 Nuclear Bowls (1986)(Zigurat Software)(ES)[a] MSX ES +8AA4399EEDE7FFD1070DDC4FB2F100C7 Nuts & Milk (1983)(Hudson Soft)(JP) MSX JP +76629D472DA44F21FC1EE6F29F30D64C Ocean Conqueror (1987)(Mastertronic)(GB) MSX GB +61767D248DABB4AC203DA752A7FE8B70 Octagon Squad (1986)(Mastertronic)(GB) MSX GB +2B215E11EDFCE9FCB5F39D868E62D7D7 Octagon Squad (1986)(Mastertronic)(GB)[a] MSX GB +B7C310136278800CBDBB20497CEEB7D6 Ogro, O - A Mansao dos Ogros Monstros (19xx)(-)(BR) MSX BR +069427C03B10B70B11C3E088DB5300C8 Ogro, O - A Mansao dos Ogros Monstros (19xx)(-)(BR)[a] MSX BR +4836F16F63F73B9D1C6ABAACBE6F52BC Oh Mummy!! (1984)(Longman Software)(GB) MSX GB +71781F3B774DE56E994672D75B81F5C1 Oh No! (1986)(Eaglesoft)(NL)[aka Oh Shit!] MSX NL +FD36FB57C0C378085940D85FBB1C0A69 Oh Shit! (1986)(Aackosoft)(NL) MSX NL +DCB30372DF7792F17A3C71B33664440C Oil's Well (1985)(Eaglesoft)(NL) MSX NL +409F8BA41E5B7F6E58577C30D97ADEC3 Ole! (1986)(Bug-Byte Software)(GB)(fr) MSX fr GB +03582442D7456086D0BBA0995428BB4F O'Mac Farmer (1984)(ASCII)(JP) MSX JP +8644BAAF9D8A70A77368349F006DB839 Operation Havoc (1990)(Traposoft) MSX +8E603CB77EE957A18F521B9B878F06DB Operation Wolf (1988)(Ocean Software)(GB) MSX GB +E35D64734319965C4E4A7E7F176861B3 Ormuz (1988)(Iber Soft)(ES) MSX ES +E33A304204CBB86B2734A2B7243C4C06 Ormuz (1988)(Iber Soft)(ES)[a] MSX ES +DB4D961089FE06C33FD5C5BC7E18336E Othello Competicao (19xx)(-)(BR) MSX BR +824598E45C11AA48318E149294971817 Ougon no Haka. Golden Tomb. Mystery of Egypt (1984)(Magical Zoo)(JP) MSX JP +375329592D7DDA0591CCE00ABA3D936E Out Run (1988)(US Gold)(GB) MSX GB +8C6FB89EEC3481B3A5CFB446637EF74A Outland (1985)(Magical Zoo)(JP) MSX JP +CCF04E12A7C59E8F91C9287C3B3E96FA Outroyd (1985)(Magical Zoo)(JP) MSX JP +38CE52C1CD06208C27AC197B7BFA9169 Pac-Land (1988)(Grandslam Entertainments)(GB) MSX GB +20A43B017995D814F82F4CE760F1AECA Pacman 84 (1984)(Namcot)(JP) MSX JP +7154C4DD25FFFEDFABB375855A17E7C2 Pac-Mania (1988)(Grandslam Entertainments)(GB) MSX GB +9CE62EFA9148E05A4A882DABD1B57211 Pac-Maniac (1986)(-) MSX +169ECA9320D8214A2C51CA139E88CC2B Pai Panic (1983)(ASCII)(JP) MSX JP +6D0CEB81828C097BCB96F960FD5F542A Pairs (1983)(ASCII)(JP) MSX JP +D80BB954AC59587A4EAA39823CF67AF1 PanelPan (19xx)(Eaglesoft)(NL) MSX NL +EA94313CB8D0CE343637F288366A440A Panic Junction (1984)(Morwood Software)(GB) MSX GB +2228D67714F4FD72C62C4B86F87CBDB8 Panico en el Bel-Air (1985)(JVC - MM2)(ES) MSX ES +0F9D7C30B4860F1B19C121221EA0532A Panique (1986)(Eaglesoft)(NL) MSX NL +4BCCB3A42872902372C0C6D16BBF01A8 Panzer Attack (1985)(MC Lothlorien)(GB) MSX GB +CDE3C35AB882F65851CC77CEF60C09B8 Paris-Dakar (1988)(Zigurat Software)(ES) MSX ES +91F21811D74CEE90800D41965C65AD09 Paris-Dakar (1988)(Zigurat Software)(ES)[a] MSX ES +4BE2A6A6BD7B663B9E414F6583970A59 Passing Shot (1989)(Image Works)(GB) MSX GB +188987A203837D6890AA1526BE5380D3 Pasteman Pat - Billboard (1988)(Firebird Software)(GB) MSX GB +325AB700C84062861A62EA87168AF204 Pastfinder (1984)(Activision)(US) MSX US +E7CBAB75E2EBECFB807AAD19504CB3DA Patience (19xx)(-) MSX +DEA4013F54D27BCD93E2D898442FD0DA Payload (1985)(Sony)(JP) MSX JP +D4D780451957CF097E9F4571799E86FF Peetan (1984)(Nippon Columbia - Colpax - Universal) MSX +725E7A205E9F37054A6E400507523482 Pelota Vasca (1986)(Manhattan Transfer)(ES) MSX ES +A03CF3D7D53C99180CE391E4C77AF5F7 Pelota Vasca (1986)(Manhattan Transfer)(ES)[a] MSX ES +62D0C03E10E12908CBD856414AE462BF Penguin (1988)(Eurosoft)(NL) MSX NL +A5EFBF9626F279DC05C44F950DAFD710 Penguin (1988)(Eurosoft)(NL)[a] MSX NL +53DFE4FA1ABD1D77E13950D053882795 Penguin Crown, The (1989)(Eurosoft)(NL) MSX NL +8071F89D381A1F7A10F5B3616A8A5ACC Penguin Kun Wars (1985)(ASCII)(JP) MSX JP +D30E4EBD39C92560A309897A12EBED0B Pentagram (1986)(Ultimate Play The Game)(GB) MSX GB +BC02ADD7C10BF3F2009F2D9012605AC5 Peter Beardsley's International Football (1988)(Grandslam Entertainments)(GB) MSX GB +173B2A179CBC7257FA4773864B6B03B6 Phantis (1987)(Dinamic Software)(ES) MSX ES +326FBAD0F8D1E19C5D70B1B83E61285D Phantomas 2 (1987)(Dinamic Software)(ES) MSX ES +08E6932CFF3A699D4B1AAD4180E1C27A Phantomas 2 (1987)(Dinamic Software)(ES)[a] MSX ES +277437905EE8232763345CA8D403FD32 Pharaoh's Revenge (1988)(Eurosoft)(NL) MSX NL +43E75E8689177137137F5EA36D490BBA Pico Pico (1983)(Micro Cabin)(JP) MSX JP +C014B8487883DA305E11F2510CD7176D Picture Puzzle (1983)(HAL Laboratory)(JP) MSX JP +3B4533E0AA5B7E326C240867CCDD696E Pinball Blaster (1988)(Eurosoft)(NL) MSX NL +B7B7C6116885A78B31AB09A6ACE8F41B Pinball Maker. Ball Blitz (1985)(Nippon Columbia - Colpax - Universal) MSX +B77D857ECEB2B16218F120DDCCB7032C Pine Applin (1984)(Canon Sale)(JP) MSX JP +88021838FEF8DC88F05140DA78FECD2F Pinguino (19xx)(-)(DE-ES) MSX DE-ES +92E14BF2C950583E4F2AE0EB5CC89674 Pink Panther (1988)(Dro Soft)(ES) MSX ES +FF997016FFFC468CC5C03D04B790631B Pinky Chase (1984)(Nippon Columbia - Colpax - Universal) MSX +EB032FEBB6109F335DCAE602912FA3F1 Pipeline (1985)(Volker Becker)(NL) MSX NL +36065D91B2D93967DBF49B5578D69CA1 Pipi (1985)(Nippon Dexter)(JP) MSX JP +F2CABD7D64DD6ADE64B40B8076BB29E5 Pippols (1985)(Konami)(JP) MSX JP +486D0553B3E97A17E50F92FF9B164CB6 Piso Zero (1991)(Zigurat Software)(ES) MSX ES +24618A1F43F304CF88AC7AE238FF8CBE Pitfall (1984)(Activision)(US) MSX US +86D518E518FA4755A176322F39E8159B Pitfall II - Lost Caverns (1985)(Activision)(US) MSX US +B706773425EB4F685F3EBEAB47E9AFB9 Pitman 2 (1986)(Hebdogiciel)(FR) MSX FR +53C0A62B9F5E4A6CBA9E609FA8E1D447 Planet Earth (19xx)(MSX Land) MSX +4C82200A762C753F093062FEFD49BF71 Plasmaron. Cytoplasm (1989)(New Program MSX)(IT)[aka Globiblood] MSX IT +71A77E342677BB801F881B38FA9805C9 Platoon (1987)(Oba Soft)(BR) MSX BR +B8A39DBFC07E9A760727FF8EF34B323A Platoon (1987)(Revolution)(BR) MSX BR +089EF65423D75CFE8D0E2DB26BFBBC70 Play Ball (1986)(Sony)(JP) MSX JP +D0063E5E99E701D5AA902F62EDE1510C Playhouse Strippoker (1988)(Eurosoft)(NL) MSX NL +3842A8971B7F64D6AF87825E6C98DE88 Playhouse Strippoker (1988)(Eurosoft)(NL)[a] MSX NL +32FBE7DA9AF3C767544E7A4AB84C42C8 Poder Oscuro, El (1988)(Zigurat Software)(ES) MSX ES +CFA62C3D443EB257F82E487438C7A923 Poder Oscuro, El (1988)(Zigurat Software)(ES)[a] MSX ES +FE1A8BA0F138608244EE778B537F7E62 Pointless Drive (2006)(Bobamu) MSX +5DCEEE3DD6A82C490165D6D6C5CE92F6 Poker2 (19xx)(-) MSX +A5DD9DC110F9F2C2DAF1530A9F06FBB4 Polar Star (1984)(Micro Cabin)(JP) MSX JP +BF0A0BAB23F3568D74D204A8E0C025D6 Polaris (1986)(-)(BR) MSX BR +251C83AC1C810B57AB516670CF6E76D4 Police Academy (1986)(Eaglesoft)(NL) MSX NL +8B078D4CC62824A2EAFBA819768E326D Police Academy II (1987)(Methodic Solutions)(NL) MSX NL +E6F2CCD344FA91A6D663B073849B4C77 Police Story, The (1985)(Pony Canyon)(JP) MSX JP +142FA7F56C0D283B427B36C8CCF2DC51 Pongo (1986)(Volker Becker)(NL) MSX NL +0E20A502DF4FDAB0BB2CCCC7B85CC0FC Popcummi (19xx)(-) MSX +F71D20DC60387DFD120565A2BAC08143 Popular Cyclops (19xx)(Silva Soft)(BR) MSX BR +6C89437C9EA0DEF426B3C94EB92FB1DA Power Drift (1989)(Activision)(US) MSX US +815E6A6A66536EF349738D32DE34B30D Profesion Detective (1986)(Idealogic)(ES) MSX ES +453C238B30CC7A0A9B502CE0F5E1C79B Profesion Detective (1986)(Idealogic)(ES)[a] MSX ES +EE478D37B1C3536493338348C65FC99F Proffesional Tennis Simulator (1990)(Dinamic Software)(ES) MSX ES +E43C07C68F9AF4D551D3AE415E632BF7 Profissao Perigo (1987)(Nemesis Informatica)(BR) MSX BR +2C9579364D032F3C8181B114ABDDF8F9 Project A (1984)(Pony Canyon)(JP) MSX JP +F47CF22F85A4BF52508EF42FD862A6CC Project A (1984)(Pony Canyon)(JP)[a] MSX JP +ADB253935583177CB06D1199C3BA440E Protector, The (1985)(Pony Canyon)(JP) MSX JP +FC5FAEFCC6C9C7B92CEA4487A0660415 Psycho Pig U.X.B. (1988)(US Gold)(GB) MSX GB +99FB507D5EC6ABB6C261BDAA3E7648E3 Punch & Judy (1986)(Alternative Software) MSX +A75C69E9980C43AD9518FC1AA21E9BA5 Punchy (1984)(Mr. Micro)(GB) MSX GB +35428CC0526FA091E95E3F7C1DB6A1BA Pyramid Quest (2004)(Crappysoft) MSX +034747B0862AC98087823AA18C006BD2 Pyramid Warp (1983)(T&E Soft)(JP) MSX JP +4AA842724EAB18C32D65904B36678F1C Pyro-Man (1986)(Nice Ideas)(FR) MSX FR +EBCBFE0CEA02EBAFA11B9D77632A09BF Q-Bert (1986)(Konami)(JP) MSX JP +771268EC7A46EB54DBF1F60B8002C465 Quasar (1986)(Tynesoft)(GB) MSX GB +EB0AFBC591396CC0D800855BD27F9B4B Quebert (1988)(Eurosoft)(NL) MSX NL +91A99FA58C1EC7C892594BD192C9D971 Queen's Golf (1984)(ASCII)(JP) MSX JP +D73954B03ED4C2B7BE99E0D7CE2526F4 Queen's Golf Joy Pack (1985)(ASCII)(JP) MSX JP +1E8ACC378A73592BA3A5584DDBDE741F Quickie (19xx)(-) MSX +C59EF99244232B4F69E8934F0B5F9656 R.A.M. (1990)(Topo Soft)(ES) MSX ES +9C1E541790D3A1EDA08D9378F1EAB476 R.A.M. (1990)(Topo Soft)(ES)[a] MSX ES +3DE759B8076FA00121180A416266524D Race City (1988)(Iber Soft)(ES) MSX ES +D44C5060E067381190369D39A318A61A Race in the Wilds (19xx)(Grivesoft)(FR) MSX FR +52A412798FB4003CA6E4E0C040D2F85D Radar (1985)(Advance)(ES) MSX ES +B988875E6036095F7F07043AEBE46EB9 Raid on Bungeling Bay (1985)(Sony)(JP) MSX JP +B8D366772ABAA198BA7AE73CCEAF1A90 Railway (1983)(Hudson Soft)(JP) MSX JP +1FD3A7E9A0AED87D39AB5ABE699FB8C8 Rally-X (1984)(Namcot)(JP) MSX JP +B72E536B1BA33014EB80BAF5CDD4B849 Rally-X (1984)(Namcot)(JP)[a] MSX JP +2AF5902E34A6F49BFA09F22058577685 Rambo - First Blood Part II (1986)(Davide & Guide Favaro) MSX +1902163A4DDB1A0E95E1DA0A25D04E5B Rambo - First Blood Part II (1986)(Davide & Guide Favaro)[a] MSX +CC0282E60D296CEAC0064EE75F4F6E58 Rambo (1985)(Pack In Video)(JP) MSX JP +E93337B1D30B8BE8FDE2B6EB3592C0B2 Rambo III (1988)(Ocean Software)(GB) MSX GB +05EEF890D88133301ED50D4AFF852BD4 Rambo III (1988)(Ocean Software)(GB)[a] MSX GB +A09E93FDCB6CA35AE2F100B9FB8657FA Rampart, The (1988)(Iber Soft)(ES) MSX ES +8FB9D23E04BA2CD69EBB6F2B3414F621 Rasterscan (1987)(Mastertronic)(GB) MSX GB +069CC8666EAFA1A65EFDFDB900B5A85E Rath-Tha (1989)(Positive)(ES) MSX ES +419AFDC55F2C7FB096922C4CC92A1C8D Rath-Tha (1989)(Positive)(ES)[a] MSX ES +DC921ED06DC078F8305612EA43454FD8 Red Zone (1985)(ASCII)(JP) MSX JP +B9302EEB30BFF2E0E6619DC7EA9B2C7D Reflex (1987)(Players Software)(GB) MSX GB +CA0F7CED5B5BDC70A153FD6B74F69F72 Regate - La Coupe de L'America (1986)(Philips)(FR) MSX FR +9540A8B91FAC572182AEEC13FDAFA821 Regate - La Coupe de L'America (1986)(Philips)(FR)[a] MSX FR +A6206308000A8924D6A00A37FEE562DC Rescate Atlantida (1989)(Dinamic Software)(ES) MSX ES +A05C2D7AAE8CEE9E1A204390898DEDDB Rescate Atlantida (1989)(Dinamic Software)(ES)[a] MSX ES +7FC9EE60F8B09F7463E28450D08AB5E3 Retour du Jedi, Le (19xx)(Parisy)(FR) MSX FR +603D73FBDCE79284CFB1FA772D1A326B Reversi Challenger (1986)(-)(FR) MSX FR +D1B079AC9CE9425E4EF632BC814418E4 Rex Hard (1987)(Mister Chip)(ES) MSX ES +35D617646F27FE98A5E2DD2C923F241A Rex Hard (1987)(Mister Chip)(ES)[a] MSX ES +97F4C7663D17EEA2F37C5F09EA420494 Rise Out from Dungeons (1983)(ASCII)(JP) MSX JP +07CE3310EC75307C52F02CDAEDC37F2C Rise Out from Dungeons (1983)(ASCII)(JP)[a] MSX JP +6D182DE5A673A6ABF6ACF329C135559B Risky Holding (1986)(DIMensionNEW)(ES) MSX ES +21580CCECE7E05CC899FF5046CF3498B River Raid (1984)(Activision)(US) MSX US +BBB3F58AC45A6278BD79C4FD875E166A Road Fighter (1985)(Konami)(JP) MSX JP +A20B10013E129F37198443007CD51B4A Road Wars (1988)(Melbourne House)(GB) MSX GB +DE300E7929DE8B2DFAA787690EEEA999 Robocop (1988)(Ocean Software)(GB)[needs 128k] MSX GB +AEC084CC4D4F34E2A55598493ACD6969 Robofrog (1985)(ASCII)(JP) MSX JP +465B8827BC6D8A0DC22821C101290484 Robot Wars (1986)(Eaglesoft)(NL) MSX NL +F4ABBA39234004A8187E2327ECEC8886 Robowres 2001 (1988)(Zemina)(KR) MSX KR +B7DE0F089BA86D19C07988B38DC548AC Robowres 2001 (1988)(Zemina)(KR)[a] MSX KR +D9D16D336F8085061B410531B51706A3 Roboy (1987)(Methodic Solutions)(NL) MSX NL +7AC75285BB0201BCBD0F2D66E949D357 Rock 'n Bolt (1985)(Activision)(US) MSX US +58328C4B0B2B22501ED6595B3466C83C Rock 'n Roller (1988)(Topo Soft)(ES) MSX ES +E66ECC1339F94E525E4C2D65E54A7C94 Rock 'n Roller (1988)(Topo Soft)(ES)[a] MSX ES +62F556D71D011811CF50387EAA9D7B81 Rocket Roger (1987)(Alligata Software)(GB) MSX GB +49343DA16626F507649125F74BF4FBA7 Rocket Roger (1987)(Alligata Software)(GB)[a] MSX GB +5D0008857C9BD23E22C7CC050F06E272 Rocks & Snakes (2000)(Johannesson) MSX +C0BEF30D8E70B5F96452BAF460225BDF Rocky (1985)(Dinamic Software)(ES) MSX ES +85D2D29B2129C5F92FC81A30E6E8541B Rocky (1985)(Dinamic Software)(ES)[a] MSX ES +AE63861EB47926DDB91C78B86F1D0945 Roger Rubbish (1985)(Spectravideo)(GB) MSX GB +EA7B0089D0EA8306B8B6CBA9FDC394D2 Roller (19xx)(-)(ES) MSX ES +01CDFA187B8D0A3CF9B2374A7DBD5DF0 Roller Ball (1984)(HAL Laboratory)(JP) MSX JP +D57562A8FCF635598D2B47F63A7558C5 Roma - La Conquista del Imperio (1986)(Idealogic)(ES) MSX ES +04AE607DB2CFC3B69A78C58EEAC2AED0 Rotors (1984)(ASCII)(JP) MSX JP +F0BE28B39CFF695BEDC681E90B5F371C Rough Road (19xx)(-) MSX +3D2987C907D6FBAEEA65D3192EA2F62F R-Type (1988)(IREM)(JP) MSX JP +968EF76FCD0B75D0D6E47467A878636F R-Type (1988)(IREM)(JP)[MSX2ready] MSX JP +9F47289BCD3F87A308DAB78B1171C86B Runner (1986)(Loriciels)(FR) MSX FR +A15764C1534AE4C615CBE8EDF8F158B7 Runner (1986)(Loriciels)(FR)[a] MSX FR +D2797FBF3DCE4E8BE0780707E4B56E93 Sabotaje (1988)(P.J. Software)(ES) MSX ES +47455ED979BCE4AD724D92472F4F6132 Sabrina (1989)(Iber Soft)(ES) MSX ES +8C54398AB68B5F127F18249E3F673435 Sabrina (1989)(Iber Soft)(ES)[a] MSX ES +1C5C30CFF8054429ECCAA1E821682127 Safari X (1985)(Policy)(JP) MSX JP +56088E6E6AABA8883D88356163E30F23 Safari X (1985)(Policy)(JP)[a] MSX JP +9DFD49E934999065963531A496BB3BDF Sajedrez (1985)(J. Serena)(ES) MSX ES +F3ADC6E2D4A2B606AF3A2423BBB57163 Sajedrez (1985)(J. Serena)(ES)[a] MSX ES +2593E975510DA4516209C48995F5EC1E Salamander - Operation X (1987)(Konami)(JP) MSX JP +C458BF9B11F1A352BDDB9E2C0E0259CD Salvage (1986)(LiveWire Software)(GB) MSX GB +E77EC10E7EFC21E550B36825F0B1E3B7 Sand Game (19xx)(-) MSX +0F7D27F0BFA35884324240F4015EDA6A Sasa (1983)(ASCII)(JP) MSX JP +4DFF272840D719FD8DED4FF043E17378 Saurusland (1982)(Nippon Columbia - Colpax - Universal) MSX +34F627AABB921EE8C24B25CC04FF6501 Scarlet 7 (1986)(Toshiba-EMI)(JP) MSX JP +41E1D5D53E7891C6530E4D7C1089F092 Scentipede (1986)(Aackosoft)(NL) MSX NL +8B9A3DAA52451AC6DBDA80C0E779B8C6 Schach fuer MSX-Computer v1.0 MSX (1985)(CE-TEC International)(DE) MSX DE +9DD42A60FB974A97FF99ACE32FA7F9DD Schuif Puzzle (19xx)(-)(NL) MSX NL +A566D48A720FDEE3289AD6B379845C5A Schuiff (19xx)(Joma Productions)(NL) MSX NL +1358377FB8667E84490B6887E18F6B1B Science Fiction (1986)(Eaglesoft)(NL) MSX NL +62200B6C296F962BE3E48F1AA09D2776 Scion (1985)(Sony)(JP) MSX JP +60C7F8237A8BEC5F0554E334BB4359A2 Scope On - Fight in Space (1983)(ASCII)(JP) MSX JP +F826A2328C2EE46A6AEA97844BAC99DA Score 3020 (1988)(Topo Soft)(ES) MSX ES +0DDCFF6FB9CD6BF1D259A0D83E0A83B8 Score 3020 (1988)(Topo Soft)(ES)[a] MSX ES +6E544369CC940A1AEE90A7773077C197 Scramble Eggs (1983)(Ample Software)(JP) MSX JP +B1D5BBCCF1F43FB933FAA25767364DA3 Sea Battle (1984)(CD Systems)(NL)(es) MSX es NL +6D76A24D944034560D5906DBAB067FB5 Sea Hunter (1985)(Spectravideo)(GB) MSX GB +A1037FD9FCB70471BE71AF176495382B Sea King (1986)(Players Software)(GB) MSX GB +EFF385F1C602881E9368E039DE0946EC Search and Rescue (1988)(Eurosoft)(NL) MSX NL +F48F5805DC3E73110B8C7C0E3DB283C5 Secret Diary of Adrian Mole, The (1985)(Mosaic Publishing) MSX +563ACC18DB662BEA79ED60995617D517 Seiken Acho. Kung-Fu Master Taekwondo (1985)(Irem - ASCII)(JP) MSX JP +1CA908EB388CD597A2D0E96D4E7AB3F1 Senjyo (1984)(Sony)(JP) MSX JP +12E817E4B1AEA063B1E288EE5D612BBF Serra Pelada (1987)(ProKit)(BR) MSX BR +0DDA7287C260CC31245EBFB5AAD0C2AE Serra Pelada (1987)(ProKit)(BR)[a] MSX BR +54784DA580DF541B50F5FAFC71D11091 Sewer Sam (1984)(Toshiba-EMI)(JP) MSX JP +ED50CDCE15C6780C42B62254487F77BC Sewer Sam (1984)(Toshiba-EMI)(JP)[a] MSX JP +A60FE4A9E5760971096F06BD560B79AA Shark Hunter (1984)(Electric Software)(GB) MSX GB +490D3A01B365A9DC067BC7507F61D00E Shindobaddo Nanatsu no Bouken. The Seven Adventures of Sindbad (1986)(Casio)(JP) MSX JP +5EF184E23C79CD31AABB9D9555B5E64F Ship Wars (19xx)(-)(BR) MSX BR +72CF0B6AEA2C2967C67A1056C28AFF95 Shnax (1985)(Kuma Computers)(GB) MSX GB +345D711DDBAC9BCF2B0F6F37293B62E7 Shop Boy (1988)(Mind Games Espana)(ES) MSX ES +ACD85492091FDDBDA6383D1E49303C28 Shougi Meijin (1985)(Toshiba-EMI)(JP) MSX JP +F0E7BEAD3FBC81C06D8F9D2B72891666 Shout Match (1987)(Victor)(JP) MSX JP +DCB5E207A52ED0BEDF4994642C350A84 Shup - Trebol (1986)(Mind Games Espana)(ES) MSX ES +CC5A3463175D9280252764AFAD9C6F2C Silent Shadow (1988)(Topo Soft)(ES) MSX ES +E203CBA73444605F16D49E595254214F Silent Shadow (1988)(Topo Soft)(ES)[a] MSX ES +7013061F63AB5DFFF3AB6FF47B7458A2 Silfi (1988)(Iber Soft)(ES)[copy from Elidon] MSX ES +FA294E9672A55B04342F10C6424F0AC3 Simulador Profesional de Tenis (1990)(Dinamic Software)(ES) MSX ES +9F0484C7ACDC28BE2F1FCE4FB11797DD Sir Fred (1986)(Zigurat Software)(ES) MSX ES +80429CA316CE21A00308F59A82A87ED9 Sir Fred (1986)(Zigurat Software)(ES)[a] MSX ES +C8923231ED4A66A8D4AF34961B06F65B Skate Dragon (1986)(Idealogic)(ES) MSX ES +0B41991094F8D3C5E800FF0D2A32FA76 Ski Command (1984)(Casio)(JP) MSX JP +9E0913F83F6D0048BF5E04E567B2E0FF Skooter (1987)(Eaglesoft)(NL) MSX NL +67B37C03969171E83706FE1159409639 Skramble (1985)(Aackosoft)(NL) MSX NL +5C67D86AD1DA508BB5737BB7DD7ABCED Skull Exilon (1988)(Iber Soft)(ES)[aka Safari X] MSX ES +A87B20834975331BB350261A1B931310 Sky Jaguar (1984)(Konami)(JP) MSX JP +D789E16A1AF38C0C4794CAFBEBBC37B4 Sky Vision (1987)(Eaglesoft)(NL) MSX NL +A0B6D4A16700F6C4FA7D1F39C11EAC28 Skyfox (19xx)(-)(NL) MSX NL +603FD32251D933D533C968B45FD6E52C Skygaldo (1986)(Magical Zoo)(JP) MSX JP +E49B25E22AE06A68B00354EC1F84AE88 Skyhawk (1986)(Bug-Byte Software)(GB) MSX GB +1D0B412D716B67BB492A2887137D35A8 Slalom (1998)(Stefano Fronteddu)(IT) MSX IT +2417147300DF6D9EB4D33095808004A5 Slapshot (1985)(Anirog Software)(GB) MSX GB +557F50792C04D80A3F202E2DCC3EE955 Slapshot (1985)(Anirog Software)(GB)[a] MSX GB +9555D5CA40FC85D2ED34D743D2571BD3 Slot Machinex (19xx)(-) MSX +0CA75A0818B6188E93B3033CA448E50A Smack Wacker (1986)(Eaglesoft)(NL) MSX NL +049290BC6444DDED660460FFA83BB315 Smaily (1990)(Zigurat Software)(ES) MSX ES +A3BA8839871C0E80BC9EDC70F88561D4 Smaily (1990)(Zigurat Software)(ES)[a] MSX ES +8B74221CD27929DA5407369D51952346 Smaily (1990)(Zigurat Software)(ES)[a2] MSX ES +A2C335B5328C31A10932A65EEC091AC7 Small Jones (1986)(Visiogame) MSX +F4DA4FE23479E91537B1B0B0BCD718FB Smash Out (19xx)(Mitsubishi Electronics)(JP) MSX JP +CC675ACD8E5B3883290FDCCA9DAC54F5 Snake It (1986)(Eaglesoft)(NL) MSX NL +6B7F148D56FAC987DE95B305695D448C Snakeman (1986)(S.V.L. Software) MSX +1E892870BA3B2CBF7B81341579B3A140 Snaky (19xx)(-) MSX +C03224007BF307A8F627E8D867974362 Snowman, The (1984)(Quicksilva)(GB) MSX GB +D9897A0B954B6BB7918EAEE85B7B82A6 Sobra Um (1989)(Renato de Mello)(BR) MSX BR +8B24032A53338BA594C5BCA4F381654C Sofia (1988)(Radio Wave Newspaper Publisher)(JP) MSX JP +F44A3B532B2F8C436DBAFF5CD47CEBDD Sofia (1988)(Radio Wave Newspaper Publisher)(JP)[a] MSX JP +A5AE3B671CD9B8A0C4566BAE67977FEF Sol Negro (1989)(Opera Soft)(ES) MSX ES +6365B98A35F234E7CCF54772FB7CB9A8 Sol Negro (1989)(Opera Soft)(ES)[a] MSX ES +F005E984D870876D2B853DFFDE7DB9DA Sol Negro (1989)(Opera Soft)(ES)[a2] MSX ES +BA6A3C3EAD933A041C726AF0882C8A62 Soldier of Light (1989)(Dro Soft)(ES) MSX ES +A62EDB078AF7CD0E4475E9BE7F574856 Sorcery (1985)(Virgin Games)(GB) MSX GB +6283592C8813B78CE65AB635988F7F27 Soukoban (1984)(ASCII)(JP) MSX JP +1DA9186159FD496C3008AD285A66A23C Soul of a Robot (1987)(Mastertronic)(GB) MSX GB +F114965F17BA6BF0F6F18280B0409E9C Souzan (1985)(SPC Soft) MSX +6BCEA6AC53D632A1863ECC4CB2BFFFF7 Spac (2000)(-) MSX +DF473F6D17BCDEDE80129A18F3639CC0 Space Busters (1985)(Aackosoft)(NL) MSX NL +CBC163A13B8BF5B28267681CD33B3B02 Space Busters (1986)(Eaglesoft)(NL) MSX NL +8963ABED8CF86B623F1ACAB9E591E4B8 Space Camp (1986)(Pack In Video)(JP) MSX JP +5A2A1200A881ECB624D7DAB90A19D365 Space Invaders (1985)(TAITO)(JP) MSX JP +FEBBEBB86B23EC400AA427E46C54CEE6 Space Maze Attack (1983)(HAL Laboratory)(JP) MSX JP +4B79D85C1BEF7EEF796CF9F2DEDDE02F Space Rescue (1988)(Eurosoft)(NL) MSX NL +C9CC2BA19FAF88267B54D6B1ECB642B7 Space Shot (1989)(Realtime Software)(ES)[aka Alpha Blaster] MSX ES +32D419BB8566748BFD73FFACE532D550 Space Trouble (1984)(HAL Laboratory)(JP) MSX JP +F389ADC752E8CF7C33184C17682D8C71 Space Walk (1985)(Mastertronic)(GB) MSX GB +13A6E05E4B650857FF636302B5722A13 Space Walk (1987)(Mastertronic Added Dimension) MSX +5F71DA53A5B7D06B04BA04E0B01B9F40 Sparkie (1983)(Sony)(JP) MSX JP +1E71B178413C75340A359AC8C02FBC29 Spartan X (1985)(Pony Canyon)(JP) MSX JP +DEE36662D62328194E63435AAABA8FC0 Special Operations (1985)(MC Lothlorien)(GB) MSX GB +6B8BC127D999CCE0168543E42ACD0C0C Speed Black (2006)(Jose Javier Franco Benitez) MSX +58F473EE9BB82EB2CC891B5F430F913C Speed King (1986)(Mastertronic)(GB) MSX GB +A81C592ADF215C649B086D7E6E097F2B Speed Turbo (19xx)(Manhattan Transfer)(ES) MSX ES +6965601423C7741BCA50654D20BC1779 Speedboat Racer (1987)(Methodic Solutions)(NL) MSX NL +56343F174BA5439224209A677DA08230 Spelunker (1986)(IREM)(JP) MSX JP +5CAE76F6496788E30296994D94ECC4F6 Spider, The (1983)(Hudson Soft)(JP) MSX JP +4804EBA5F6830C8180C45FB5DA10C0E8 Spiderzoid (19xx)(-) MSX +91A4F5D6FD2CA5A77F5173F5803F686B Spirit Power (1990)(Makottoto) MSX +8F9FE3B7CE44BD1BA8851C45FA4993AC Spirits (1987)(Topo Soft)(ES) MSX ES +5DC37F53A1BFD1C859E1594E8E09AF16 Spirits (1987)(Topo Soft)(ES)[a] MSX ES +8EA24E94C766297E2463E1442AC46CF1 Spitfire '40 (1986)(Mirrorsoft)(GB) MSX GB +CBBDE82784A5105CB3D2C2BD99F9FBC8 Splash (1986)(Mind Games Espana)(ES) MSX ES +661A64D214FCD3BC09EE1138FF7B7F97 Spooks & Ladders (1985)(Kuma Computers)(GB) MSX GB +842866DADAA468E90D26AE3CDF247726 Sprinter, De (1986)(Eaglesoft)(NL) MSX NL +A69EB8F5E3B746B1F06D1DD37093C4BA Sprinter, De (1986)(Eaglesoft)(NL)[a] MSX NL +C58EE006406DADA9563D1C069687723D Sprinter, De (1986)(Eaglesoft)(NL)[a2] MSX NL +44951532504D1830B722E84A80F48C2A Sprites Man (1986)(Sprites)(FR) MSX FR +A28183A506271CA2886EF28CCBF3C4DC Spy Story (1986)(Aackosoft)(NL) MSX NL +A2D3E735B755B2461389BAB5289434BD Spy vs Spy II - The Island Caper (1987)(Databyte) MSX +C6242FEA61B31773E32363EF71B90D45 Square Battle (19xx)(-) MSX +8D90D943C732812574285AF04BA90DAB Square Dancer (1984)(Toshiba-EMI)(JP) MSX JP +764555E9B47F339DA3F31AFE11EC417E Squish'em (1984)(ASCII)(JP) MSX JP +79878B2BD1F70A6E10F5086F9941CE9A Star Avenger (1984)(Kuma Computers)(GB) MSX GB +9E6D2D344521586888C027E0A24C5E19 Star Blazer (1985)(Sony)(JP) MSX JP +A217B813B5BFB74B0E5BAC491EACF621 Star Fighter (1986)(Eaglesoft)(NL) MSX NL +9987F22EE59F9574E349F87369B26E9A Star Force (1985)(Hudson Soft)(JP) MSX JP +72869B2F53FA73CD00C6F31542E64F44 Star Laser (1989)(Melody Soft) MSX +64933E854D5417C6303226DF279DE902 Star Laser (1989)(Melody Soft)[a] MSX +0C21DCB45ED600B11668FB2FAE978B9A Star Road (19xx)(-) MSX +03788BC7BB71F1264FAA732C9E11B940 Star Runner (1986)(Manhattan Transfer)(ES) MSX ES +ABB7A8D7EC76FA4E6A18FA3D540C02D7 Star Soldier (1986)(Hudson Soft)(JP) MSX JP +8D399EAEBB441AA1DA4C4DDE0EFBB080 Star Trek - Strategic Operations Simulator (1986)(Sega)(JP) MSX JP +C3A8A0E5865DEBDFAA7987CEAD134F6D Star Wars (1986)(Eaglesoft)(NL) MSX NL +6856C7443E90743316F995AB510F5992 Starbuggy (1988)(Eurosoft)(NL) MSX NL +28585A04CD8885B76D14F9D0FE1D641C Starbyte (1987)(Mister Chip)(ES) MSX ES +C2BF782CC7B45A45B6C0482A3DB2448C Stardust (1987)(Topo Soft)(ES) MSX ES +DCDAF998B6BE328FC7656AB0E70A1216 Starquake (1986)(Bubble Bus)(GB) MSX GB +D52BEAC8CCE88BB04ECDD0410F5C9AB1 Starship Simulator (1984)(ASCII)(JP) MSX JP +2CA2442EA77ABFA3E93C407A90740022 Step Up (1983)(HAL Laboratory)(JP) MSX JP +21DB788E9A18FF0BD207414E7D7717AD Steve Davis Snooker (1985)(CDS Micro Systems)(GB) MSX GB +72C2ABB31D27DC145ED2790CB3969482 Stop Ball (1987)(Dro Soft)(ES) MSX ES +7BE53622B01581E7E3BDD29C989882DD Storm - Una's Lair (1986)(Mastertronic)(GB) MSX GB +0A10C23EEC3DDCEDB4DD3FA376FCB843 Stormbringer (1987)(Mastertronic Added Dimension) MSX +2581B0F232B0884C1CC9148F3855554B Strangeloop (1987)(Nippon Dexter)(JP) MSX JP +5AB3FA474E4E1C50A1BC15B9BBEE1418 Streaker (1987)(Bulldog) MSX +EA7EC1A60BDF0F9666A4B80E6AAFBD86 Strike Force Harrier (1988)(Mirrorsoft)(GB) MSX GB +3A0275F0F04A0D925BE413B4BF7F4DA8 Strip Girl (19xx)(Iran Soft)(BR) MSX BR +A53D2391558FF53993A882C901701BA1 Strip Poker II+ (1988)(Anco Software) MSX +16925E152E3D203BF5035E201F3872DE Suerte, Bruce! (1986)(Scorpio Software)(ES) MSX ES +A09B39A4BE8ABFACE4ABD449D5AEAD00 Suparobo (1984)(ASCII)(JP) MSX JP +A9E7248897A64DECDC625713E3734E0C Super Baby (19xx)(Hudson Soft)(JP) MSX JP +A53C08E468F6E4C112E0F01E075BA139 Super Billiards (1983)(HAL Laboratory)(JP) MSX JP +5230ED4CE02EA386ACFED828A541944A Super Billiards (1983)(HAL Laboratory)(JP)[a] MSX JP +F97D772C08A824457BA0C87011A021F6 Super Boy II (1989)(Zemina)(KR) MSX KR +1B34F586D00B254035B4DAC13570A4D0 Super Boy III (1991)(Zemina)(KR) MSX KR +68DF425A4354D74E5DD878900AA39838 Super Boy III (1991)(Zemina)(KR)[a] MSX KR +9BE9900C5CAF27161EB195365E14BAAE Super Chess (1984)(Kuma Computers)(GB) MSX GB +C10013D25380B222A2341A0C97ADD745 Super Cobra (1983)(Konami)(JP) MSX JP +B824068DEB3079EEBC006A7221175317 Super Cross Force (1983)(Spectravideo)(GB) MSX GB +1B302A6113DA71C5A10E57FEF5346016 Super Drinker (1983)(Ample Software)(JP) MSX JP +9BB818D73396B97B2C51505916F6EA50 Super Gallo (19xx)(Program MSX)(IT)[aka Chicken Chase] MSX IT +04D6B82D782B38B4E626095B10581818 Super Golf (1985)(Sony)(JP) MSX JP +EA20692BBCE8F1D5AFDB6FAFB82A2529 Super Laydock - Mission Striker (1987)(T&E Soft)(JP) MSX JP +4257AE6512030F6080ED5B877263AD91 Super Master Mind (1986)(Intelligence Games)(ES) MSX ES +B96AB3AA929DB1D25FE654EC8046FC7B Super Snake (1983)(HAL Laboratory)(JP) MSX JP +C64510A38215CD7543F9CDAC51D9385C Super Soccer (1985)(Sony)(JP) MSX JP +02A553FD0B6C76AB755A2E306E35BC3D Super Tennis (1985)(Sony)(JP) MSX JP +B0C991EF7C2A3C763AE530407B80A69F Supermind (1984)(Morwood Software)(GB) MSX GB +38A515B33ECF2B7D2CC74AF193E256F2 Supertripper (1985)(Indescomp)(ES) MSX ES +558D87C7A8D854324C535F52DA199C0E Survivor (1987)(Topo Soft)(ES) MSX ES +B9073B88B829CF46744C99578CD94002 Survivor (1987)(Topo Soft)(ES)[MSX2ready] MSX ES +B30D6A37FA80F521863B6D6C78CAA073 Survivors (1986)(Atlantis Software)(GB) MSX GB +333F15D916A24DA540FDDF1F7A453122 Sushi (19xx)(-) MSX +64E74E23806097D8DDB8883C3FA984B8 Sweet Acorn (1985)(TAITO)(JP) MSX JP +BF40521A99E8295C029A61BD50D86445 Swimming Game (19xx)(-) MSX +85756FD1EBE58EEACA46B9F538652901 Swing-Man (1984)(Spectravideo)(ES-GB) MSX ES-GB +374B96066D2ED2C29DC247CD442C0192 Ta Yu (2006)(Jose Javier Franco Benitez) MSX +DFC4EE0D9268022455053023DFBDF7CF Taca Magica, A (1990)(P.I.S.C.)(BR) MSX BR +C10B41C428FDB7F06B53BD42FD602DE9 Tai-Pan (1987)(Ocean Software)(GB) MSX GB +363ED5DE9BD5D701D122C770D473E6C8 Takahasi Meijin no Boukenjima. Wonder Boy (1986)(Hudson Soft)(JP) MSX JP +A5B32C3B714B341E93F66BC56B4890AD Takeru Densetsu. Legend of Takeru (1987)(Brother Industries)(JP) MSX JP +F854376F0F9045939978C1C323AEDDB0 Tank Attack (19xx)(MSX Computing)(NL) MSX NL +852B24EAA820DA5FFE83AC39C58A0CDA Tank Battalion (1984)(Namcot)(JP) MSX JP +BCA14E9BCB13EBA299ACEBD0D4041792 Target Plus (1988)(Dinamic Software)(ES)[a][gunstick] MSX ES +EAFC17FA78F80C2958F92CEA7A1D6391 Target Plus (1988)(Dinamic Software)(ES)[gunstick] MSX ES +9FB4486E0078E54181238AD7B3958471 Tarot (1986)(Nice Ideas)(FR) MSX FR +9A476E1B90C01FB9518AFC668CDCB95C Tawara (1984)(ASCII)(JP) MSX JP +9646F7D7BBAEB6D007A6EDB42E1BFE10 Telebunnie (1983)(ASCII)(JP) MSX JP +9E77A47E9023685DEBCE27F2703EB77C Temptations (1988)(Topo Soft)(ES) MSX ES +916BAEB2D160DEF3DB9CECE2668D61B3 Tensai Rabbian Daifunsen (1986)(Toshiba-EMI)(JP) MSX JP +8FB260AD4116313161A6410176091B78 Tension (1988)(System 4)(ES) MSX ES +01F2DAF628E2C35595D6A23D9C161BBA Tension (1988)(System 4)(ES)[a] MSX ES +CAF2EF5B2B1FF174776FE880B27BF05F Terminus - The Prison Planet (1986)(Mastertronic Added Dimension) MSX +B7577DC5D604D499BE4FFB4766CAAC78 Terramex (1988)(Grandslam Entertainments)(GB) MSX GB +D6254A01B4300CCF0BBD512145F84DFD Test Drive II - The Duel (1989)(Dro Soft)(ES) MSX ES +C9B81502B9CB815D42246B122ED70F17 Tetra Horror (1984)(ASCII)(JP) MSX JP +0B7FAD28E17DEBB13A8487E1A671F999 Tetris (1987)(Mirrorsoft)(GB) MSX GB +4F490EB3ED97423032A240C5F4D93C13 Tetris (19xx)(Zemina)(KR) MSX KR +1C877F1DC56438E37F4C6729835B7F55 Tetris (19xx)(Zemina)(KR)[a] MSX KR +0DEED6719D05E8D6C0AE0BAEAD03A028 Thexder (1986)(Game Arts)(JP) MSX JP +96E6FD153FBC602EF2072BFF60FE7AB4 Thing Bounces Back (1987)(Gremlin Graphics Software)(GB) MSX GB +34B7ED530F511E831871C6D028029FFD Thor (1988)(Proein Soft Line)(ES) MSX ES +B662FBD8FA3ED0BBB52F568B2480643D Thor (1988)(Proein Soft Line)(ES)[a] MSX ES +DB130430409FECF7191C2F0C242F0AF2 Thunder Ball (1985)(ASCII)(JP) MSX JP +8056EC86891E42602CE61DD7D416B2FA Time Bandits (1984)(PSS)(GB) MSX GB +608226E7280FBCE88571DEC3547E5399 Time Bomb (1987)(Methodic Solutions)(NL) MSX NL +135E6597DA7F7454164E176A9B0B40F2 Time Curb (1986)(Aackosoft)(NL) MSX NL +28DE98DDA379F5D67F7692E50B40C4F9 Time Fighter (1987)(-) MSX +B6B0FF29C590D6C2D183DEADD391E9AF Time Pilot (1983)(Konami)(JP) MSX JP +C39EC90FCA08666E4FB9D2BB6FF33995 Time Rider (1988)(Eurosoft)(NL) MSX NL +5E2919CFC2DF326D5E063FDB30726543 Time Trax (1986)(Bug-Byte Software)(GB) MSX GB +8E9DC6D893D43817F0543743D58F363C Tiny Trial Ski (1984)(ASCII)(JP) MSX JP +8C7A7479B8D6C09E65A7A95941EF7B45 Titanic (1988)(Topo Soft)(ES) MSX ES +6995E99F447F44B7EC1E76A6DF3AD1E4 Titanic (1988)(Topo Soft)(ES)[a] MSX ES +2FE65A37C5E731D7A1C2E6C2DFAEFC62 Toke Kong (1986)(Standard MSX)(FR) MSX FR +004BD6D91468006405311353719918DE Tom & Jerry (1989)(Erbe Software)(ES) MSX ES +2206FFB0AA4898399B3F38A5B878034A Tomboyish Becky's Large Adventure (1983)(MIA)(JP) MSX JP +ED4C93B42302A045BFE087771FB28068 Toobin' (1989)(Domark)(GB) MSX GB +FC4311798CFB4D6089FEA71D5CD6C90B Top Roller (1984)(Jaleco)(JP) MSX JP +419065A52BC0479957D25C25CF7CA421 Topple Zip (1986)(Bothtec)(JP)[a] MSX JP +5D8208A8ACF9F21B09FD43524E69A3EC Tournament Snooker (1986)(Magnificent 7 Software)(M3) MSX M3 +4F0796F1AE247A84F7B32AE4E78D0CFF Tower of Angel, The (19xx)(M-Ozo) MSX +5186A3CCBF7B7FC9AEAF0883EB0D1D89 Tower of Druaga, The (1984)(Namcot)(JP) MSX JP +4411F251E5FAC658FF8736993D70CF15 Track & Field 1. Hyper Olympic 1 (1984)(Konami)(JP) MSX JP +03F741EDC48A8DFED01DBA869DD54A7E Track & Field 2. Hyper Olympic 2 (1984)(Konami)(JP) MSX JP +B0E9B8442F9588E79FFE329BF79AFE44 Traffic (1986)(Sony)(JP) MSX JP +18A066948F392F08028D34F7539BDBDD Trailblazer (1986)(Gremlin Graphics Software)(GB) MSX GB +09E7438764FC692DCE535AA021F6C74E Trans-Europe Rallye (1984)(ABC Soft)(ES) MSX ES +3124F7C3003263EF47839767151DE2D1 Transit (1988)(Cualsoft) MSX +E8D17634541F4F9A3A1326999ACA4EA2 Trantor - The Last Stormtrooper (1987)(Go!) MSX +ED7DEA358CD46D02638F4B1D4C38C45A Trashman (1985)(PSS)(GB) MSX GB +D0EEA744AE435663C25D16444E2ABF76 Trashman (1985)(PSS)(GB)[a] MSX GB +9C801CCF92E2F739A64E358D12262E1A Tres Luces de Glaurung, Las (1986)(Erbe Software)(ES) MSX ES +AB7A46F12144AD9533E302E62EEF7054 Tres Luces de Glaurung, Las (1986)(Erbe Software)(ES)[MSX2ready] MSX ES +21BDBA38DF8A604137D1BA7C01121A10 Trial Ski (1984)(ASCII)(JP) MSX JP +C28A30A45C4E3F6CFCF7CF5AC90781E4 Tribur (1990)(Renato de Mello)(BR) MSX BR +00A9D8935C82C953B2D9B2FC9C6EC900 Trick Boy. Pinball (1984)(T&E Soft)(JP) MSX JP +2F15289F226DB2409F9D348B89E3E433 Trick Boy. Pinball (1984)(T&E Soft)(JP)[a] MSX JP +0B32E434500CCF0C95B007662E5A3901 Triple Comando (1988)(Dro Soft)(ES) MSX ES +51E85F111245C4BB04A43FBABF821865 Triple Comando (1988)(Dro Soft)(ES)[a] MSX ES +1570BF70D91D55F50E739FFBABCD5133 Tritorn (1986)(Xain)(JP) MSX JP +52A71AAC44BEAB0D0440A5B15B6DE86D Tritorn (1986)(Xain)(JP)[a] MSX JP +40C75AB8C77A03BA2170470C736EE982 Triversi (1986)(Orpheus)(GB) MSX GB +994D7F458C686D12619DA9FD41C2DDAF Trivial Pursuit (1986)(Domark)(ES-GB)[a] MSX ES-GB +F33956741BCA6B84B4E20D2BDD51FB6D Trump Aid (1986)(Toshiba-EMI)(JP) MSX JP +3EB49806F67BB211BD1EC29EF5209080 TT Racer (1987)(Methodic Solutions)(NL) MSX NL +9C17D4517718386883D9C92D074FCD3A Tuareg (1988)(Topo Soft)(ES) MSX ES +5A7DFE3265BD3F90BEBFCE02F033FCCE Tuareg (1988)(Topo Soft)(ES)[a] MSX ES +47EECD7625DD769BA2EB0500B5A3BEB9 Tuma 7 (1990)(Delta Software)(ES) MSX ES +A9574922F990A2E26CC66CB2446FF6D8 Turbo Girl (1988)(Dinamic Software)(ES) MSX ES +198F4E83C8ECC7F3F0DC87A485E6F1A9 Turbo Girl (1988)(Dinamic Software)(ES)[a] MSX ES +2E9A79EE49BA4BB027891C3597705CC7 Turbo Racing (1986)(Lenguaje Maquina)(ES) MSX ES +2C037A2E6D753FAEF480498D60863CB8 Turbo Racing (1986)(Lenguaje Maquina)(ES)[a] MSX ES +F2ECE2CB5FD90FBB5DBD1B7151D509D9 Turboat (1984)(ASCII)(JP) MSX JP +3B996CBB75CC4C16FD1CC7AD405E97FF Turmoil (1986)(Bug-Byte Software)(GB) MSX GB +57439318B9DC191AFA794D4AA7992F41 Tuxy (1989)(-) MSX +C6E78CA0711991AD96CD5FA2DA215B4A Twin Bee (1986)(Konami)(JP) MSX JP +5EE9B2A2EEC45D400425C9C15EBBE3E6 Twin Fleaz (2000)(Johannesson) MSX +83758129F0BD527F7DD3323C6BA3C2EF Twin Hammer (1989)(Best) MSX +FA0BF75F011722B8A2C5E1ADAE240FF4 Twin Hammer (1989)(Best)[a] MSX +978819E8325459F21C57998770CEE3A6 Twin Hammer (1989)(Best)[a2] MSX +E5EFECB4671B2902A344F2AAE94BE8FD TZR Grand Prix Rider (1986)(ASCII)(JP) MSX JP +8EBFFA25ED29F90A353205AF19572916 U-Boot (1985)(Manhattan Transfer)(ES) MSX ES +E31E642484BB51B88C387A3BAD394BB1 Uchi Mata (1987)(Martech Games)(GB) MSX GB +5FE91EF4A178A5BC60F59DAF7F62F7E0 UFO (19xx)(Az)(ES) MSX ES +DAB18280D41D0F4964EA16703B3D2D82 Ulises (1989)(Opera Soft)(ES) MSX ES +4E8D91A6F640AC9A5CF0640F32C853B6 Ulises (1989)(Opera Soft)(ES)[a] MSX ES +7CD7CD62542906FDC68D78D5CD1E75B8 Ultra Chess (1985)(Aackosoft)(NL) MSX NL +8E99338FF69BB79B55C49C6E58818464 Ultra-Man (1984)(Bandai)(JP) MSX JP +77C15BCFA7E3ACF2B58C9A2F74C53EF6 Underground (1988)(System 4)(ES) MSX ES +9511F3D20A7E8EA77D8F8CF95A145EBF Underground (1988)(System 4)(ES)[a] MSX ES +697E02B46550C8AA3A63246556AE7B7B Uranio (19xx)(-)(BR) MSX BR +2C7E422F30BEB78B9294671F31889930 Vacuumania (1984)(PSS)(GB) MSX GB +694AEAC3F9F92891C77E3AE91C4534C1 Vacuumania (1984)(PSS)(GB)[a] MSX GB +48573DBDC286AA4F25DAC0CEBD45A9AD Valiant (19xx)(Kyrmaeg)(FR) MSX FR +F8BB219E1B010AE58D328A273AD578CD Valis - The Fantasm Soldier (1986)(Telenet Japan)(JP) MSX JP +BBAA003D63B04480E517D6F66C96D1F0 Valis - The Fantasm Soldier (1986)(Telenet Japan)(JP)[a] MSX JP +36D67F686C744D7C60989C40C66F0F24 Valkyr (1985)(Gremlin Graphics Software)(GB) MSX GB +715550647B547E0177675B02E79971A8 Vampire (1986)(Codemasters)(GB)[a][aka Phantomas 2] MSX GB +E0780EDF0BF6DDF4D2ADC890D9225D55 Vampire (1986)(Codemasters)(GB)[aka Phantomas 2] MSX GB +5ED72897BC486F0B186213610F1013A1 Vaxol (1987)(Heart Soft)(JP)[b2] MSX JP +9A05FDF43687FFF9C9D0A9356D7F3364 Vector (1987)(Dragon)(NL) MSX NL +FF630E4701D8959BDFF7BFB9D9B1B6BC Venganza de Johny Comomolo, La (1986)(Dro Soft)(ES) MSX ES +508ACB073B50E15B62997DB8899A0BE7 Veno Monsters (1987)(Gremlin Graphics Software)(GB) MSX GB +759AF35E2DAD7451BDAB4B5CD8B2B480 Venus Fire (1987)(Victor)(JP) MSX JP +E80904061BB5E42413D08F9283787147 Vera Cruz Affair, The (1986)(Infogrames)(FR)(en) MSX en FR +79ACEFE6B6893AB3B061743AA5327A66 Vestron (1986)(Players Software)(GB) MSX GB +1FDFB9307B57AD382EE88ADE93E98C19 Vestron (1986)(Players Software)(GB)[a] MSX GB +8D77BD2541A2AE5168D2BEDA7524A371 Viaje al Centro de la Tierra (1989)(Topo Soft)(ES) MSX ES +8E47D8E95E0F9E3A41E929623CFB3F12 Viaje al Centro de la Tierra (1989)(Topo Soft)(ES)[a] MSX ES +BEB3945BD581251A65364711A785B57F Viaje Espacial (1985)(Anaya Multimedia)(ES) MSX ES +F61A468F9B68CAA2981700C7EE510EC3 Vicious Viper (1985)(Sanyo)(JP) MSX JP +D1F52B48E72E1EB79B1737BA687C1737 Video Hustler. Konami's Billiards (1984)(Konami)(JP) MSX JP +544C709DD520C54BAAF131E5D930AF7A Video Poker - Las Vegas (1986)(Mastertronic)(GB) MSX GB +727C45910F57D3015D2BC01DA525EFAC Video Tennis (19xx)(-) MSX +7788E13A143139E74A78CE149E8CCE69 Vietnam (19xx)(Adventure Software) MSX +D5911389025D0E2C3EC3492E3860A1FC Visitor - Bazar Catalunya (1988)(Mind Games Espana)(ES) MSX ES +1EFC2B2EC069FB8F6A9C1883719BD6FF Voidrunner (1987)(Mastertronic Added Dimension) MSX +214CC6C488F2411A00AC76920575F87A Voitures dans Autoroute, Les (1985)(Infogrames)(FR) MSX FR +FC0BCB84A3BA1506711BBE2B047B8B92 Volguard (1985)(dB-Soft)(JP) MSX JP +5917A6EBE542AC61DEBBB23C9BDC236A Vortex Raider (1988)(Eurosoft)(NL) MSX NL +3AE62721740477A89C35C7B6E50960EF Vtennis (19xx)(-) MSX +0864567DFCE8051EE480C8D9B1593C16 Vuilnisman (1985)(-)(NL) MSX NL +5CEC3C2FC574B341D434DB5563DEE74E Wall, The (1987)(Erbe Software)(ES) MSX ES +73EBAEC648352ED23EA12BAEB65F6034 Wally Weevil vs the Pyramid of Doom! (19xx)(-) MSX +14D8C28E0DED250A0E48E8FD3E8EBCBE War Chess (1986)(Idealogic)(ES) MSX ES +59E0C7882FB2D16091EFAD18E119DBAB War Head (1985)(Pony Canyon)(JP) MSX JP +B664A8339A48B6EBF2DDCD9E300B6FD7 War in Middle Earth (1989)(Dro Soft)(ES) MSX ES +0FEFF6BA2222682D14FF2DDBE15D8F78 Warp & Warp (1984)(Namcot)(JP) MSX JP +D40FF4C33D0DB57EF0993DA90DD67902 Warroid (1985)(ASCII)(JP) MSX JP +A02D1E3F878C5CC8BA0D016F3B491D2A Water Falls. Ame (19xx)(-)(JP) MSX JP +37A67127A1667EB4133E622CD92E737F Way of the Tiger, The (1986)(Gremlin Graphics Software)(GB) MSX GB +93EFDC51816581650BFDB65677F8388F WEC Le Mans (1988)(Imagine Software)(GB) MSX GB +718D03B3515B03FFDBBFF8BE19975C6A Wedding Bells (1984)(Nippon Columbia - Colpax - Universal) MSX +84C49C5DAEC2C2D7561AEB0B0219F3DF Wells & Fargo (1988)(Topo Soft)(ES) MSX ES +BB1B2B08D1751DEDD5BB24BD15A42309 Wells & Fargo (1988)(Topo Soft)(ES)[a] MSX ES +4E718CB64709830892393D36BBBE14A1 West (1985)(-) MSX +8AADF3CDC018465109A2FEE09B2E05F5 Who Dares Wins II (1986)(Alligata Software)(GB) MSX GB +575E5E0F7591DF703FEEFA4516B570F6 Whopper Chase (1987)(Erbe Software)(ES) MSX ES +EDD362AE04A9C0F445CB15F14B5E3E1D Whopper Chase (1987)(Erbe Software)(ES)[a] MSX ES +34CB5AAED89852FDB0BFF5540D3610AB Winter Events (1987)(Anco Software)(GB) MSX GB +8D0CC99E7090572DDA4AD1238757A0EE Winter Games (1986)(US Gold)(GB) MSX GB +0A76812B95E90EDE49FDBD265C6E8028 Winter Olympics (1986)(Tynesoft)(GB) MSX GB +700F993A4833B2F532DB6C7588B86666 Winterhawk (1988)(Eurosoft)(NL) MSX NL +02F1447A86A80B3F7CA37FA31C26EA95 Winterhawk (1988)(Eurosoft)(NL)[a] MSX NL +F59DDA1CD106AFE6493D86169DCDE2A2 Wood (1991)(Electromagic)(ES) MSX ES +C2E5E954AC4F071D082C054FA48BB21C World Games (1987)(US Gold)(GB) MSX GB +879B4028786BCED2B3AF2783CEDAD5D5 World Games (1987)(US Gold)(GB)[a] MSX GB +CE1B2B7573A32F95AB39D5E17592A2A1 Wrangler (1985)(Indescomp)(ES) MSX ES +81271437FCB5A870FAC4D3C45F7AC62F Wrangler (1985)(Indescomp)(ES)[a] MSX ES +165F599E85EF91DBA0860947222F4832 Wreck, The (1984)(Electric Software)(GB) MSX GB +9EE57BA5B27C397600E857D5D023F2BF Xadrama (1990)(Renato de Mello)(BR) MSX BR +18E21EAF1E21991C68CBF5849F576A42 Xarchon (1986)(Micro MSX)(FR) MSX FR +FED9ACF41F759D51E8C8A4F937107251 Xenon (1988)(Dro Soft)(ES) MSX ES +EB45A4D5C48FB0C3BA1529E085416A90 Xeros (1999)(-) MSX +72A678C8A166E221C938F23BD8D6EF13 Xetra (1987)(Silva Soft) MSX +D8798F41106FE4E7E2881DCF49529DE6 Xybots (1989)(Domark)(GB) MSX GB +091926F3A198F02D66E156CCBE5F62D6 Xyxolog. Xyzolog (1985)(Nidecom)(JP) MSX JP +961A18FF04C48189D3834A0C5363DC67 Yabyum (1985)(Gerritsen, Tom)(NL) MSX NL +16C74191AF54BF5BA9C6AC1393A7B2AD Yabyum (1985)(Gerritsen, Tom)(NL)[a] MSX NL +2CE234DAA1495B6B044E40D474DCE6DB Y'ahtzee (1985)(DIMensionNEW)(ES) MSX ES +840B173893B5C16F235A75D41ED93D57 Yakyuu Kyo. Baseball Craze (1984)(Hudson Soft)(JP) MSX JP +813E2A1FCC56DE06A572A857C32FBB45 Yakyuu Kyo. Baseball Craze (1984)(Hudson Soft)(JP)[a] MSX JP +FEFBA17FD798D3052EE66C7CFB1368D9 Yellow Submarin (1988)(CAT) MSX +11B3FE6BF62D3CF41563DD10FEC1290C Yie Ar Kung-Fu (1985)(Konami)(JP) MSX JP +9C7AEC33D91D5BAA5474A920DB19323C Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP) MSX JP +C6A1B8ED9231CF04D5AB54ADBA6CCD1C Yobai (1983)(Ura Soft) MSX +B045D0D9AEB1B14755E5F90BD1F41CD8 Youkai Tanken Chima Chima (1985)(Bothtec)(JP) MSX JP +9627BC43943AA3DE8C7A68D738777852 Youkai Yashiki. Boynight. Haunted House (1986)(Casio)(JP) MSX JP +C41375AE5CF29AD0668B85DC7C0489AF Young Sherlock - The Legacy of Doyle (1985)(Pack In Video)(JP) MSX JP +148B084F1EC1348E50078B489F209B8C Yume Tairiku Adventure. Penguin Adventure - MIDI Mapper (19xx)(-) MSX +7492B078FE64175B77DC7BF9A10A6B61 Yume Tairiku Adventure. Penguin Adventure (1986)(Konami)(JP)[needs 256k] MSX JP +C2B0B507B785E1AFDAAA5201BCF4BB7A Zaider - Battle of Peguss (1986)(Cosmos Computer)(JP) MSX JP +CB74B44FA321C9E6A7439C7643E26B24 Zanac - 2nd Version (1987)(Pony Canyon)(JP) MSX JP +D8CF5097AAE5AA6CB6A793D0C91EDCCF Zanac - 2nd Version (1987)(Pony Canyon)(JP)[a] MSX JP +19E39CFDA44434C40246EEDDA6E5F47A Zanac (1986)(Pony Canyon)(JP) MSX JP +530D8CC6AEA6EF97573512FD1E1CECB1 Zaxxon (1985)(Electric Software)(GB) MSX GB +B99DBAFE917B93FC0FC260A700A82B30 Zaxxon (1985)(Pony Canyon)(JP) MSX JP +7D06AAD69AA05A68D2DE7ECF223F9985 Zeilen (1986)(Philips)(NL) MSX NL +0F87AA356EF0C531F17B398D76B6225D Zero Gravity (2004)(Crappysoft) MSX +7EE26F46124DCD501863FEA451BF7D6B Zeta 2000. Neo-Z (1985)(Pixel)(JP) MSX JP +43BBEDB7CDC40D407860DF72CC40DE47 Zexas (1984)(dB-Soft)(JP) MSX JP +18799270FB916246F9FDC9576E75D730 Zexas Limited (1985)(dB-Soft)(JP) MSX JP +24D236EFAB653EFD8CBADF913823B48B Zipper (1985)(Kuma Computers)(GB) MSX GB +2F94390C09A3588EB0A9F7E9C5124A45 Zizi (1985)(-)(FR) MSX FR +E42E2E28D618FD2F4DAA7E0AA484187B Zobitronics, The (1984)(Hannu Toyryla) MSX +130AD82D92F5A1A999EA4BCE05CA6436 Zobitronics, The (1984)(Hannu Toyryla)[a] MSX +7646E0BA4ACD9C9E52706CC554EC2BAF Zond (1988)(Iber Soft)(ES)[aka Zexas] MSX ES +2B5E8EBDD533DA8045C7830734905C9D Zoom 909 (1985)(Sega)(JP) MSX JP +751C51410C0C4EE3D9CFA5B6786385B6 Zoot (1986)(Bug-Byte Software)(GB) MSX GB +419EBEF780E06C28C0754700F6461FFF Zorax (1990)(Discovery Informatica)(BR) MSX BR +6E1D1BEC41A1DB0455D9CC5990825845 Zork I - The Great Underground Empire (1982)(Infocom)(US) MSX US +43F937C2DC750564C0879A3123E9B2E5 Zork II - The Wizard of Frobozz (1982)(Infocom)(US) MSX US +2596B46589D32469F6CA1811761D5367 Zork III - The Dungeon Master (1983)(Infocom)(US) MSX US +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Magazines - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:54:57 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +155628152FAF560547ED0C528E1D169B H Forajidos (1986)(Edisoft)(ES)[h CEZ] MSX ES +9ED2B92BBA5DA1EA326B5902C6C344DF H Hiper Tronic (1987)(Grupo de Trabajo Software)(ES)[h CEZ] MSX ES +2A2E6DA080C21845C2E244FD581AA84C H Jony y el Trono del Jaguar (1986)(Grupo de Trabajo Software)(ES)[cr G.M. & E.C.] MSX ES +C9538A2943DA747D2C63EDC6A1F69B0F H Load'N'Run Year 02 Issue xx - Aguas Bravas (1986)(Inforpress - Duplison)(ES)[h CEZ] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +6FAF959D1747159C1D1A961681807FDF 007 - Agente Especial (1985)(Monser)(ES) MSX ES +77FD2BE40A394C9A5509A9FE4216FF21 Bumpy (19xx)(Grupo de Trabajo Software)(ES) MSX ES +0C08F7783A44A76D2DE22120967A0091 Crucigrama Matematico (19xx)(Data MSX)(ES) MSX ES +ACF3FB46C0FBF046396D4A6421CACE40 Cubik. Cubo de Rubik (1985)(Monser)(ES) MSX ES +D8F608F9A930FAD2A46BFB50B4048C0E Data MSX Volume 03 (19xx)(Geasa)(ES) MSX ES +D2A771F1A471DFEE6D3DB478724EEA86 Dracula (1986)(Grupo de Trabajo Software)(ES) MSX ES +2982621D513DB58C483055610A4BF226 Fire Fox (19xx)(Onaki)(ES)[Konami's Sky Jaguar] MSX ES +827BA45928398847FB795FBEE1E5FD04 Forajidos (1986)(Edisoft)(ES) MSX ES +54D68901F929AA4B05362DA2CE8B98E3 Hiper Tronic (1987)(Grupo de Trabajo Software)(ES) MSX ES +8E7EE454535D07853B35569345EFFAAA Hiper Tronic (1987)(Grupo de Trabajo Software)(ES)[a] MSX ES +71BC6096EBC70095B7ABD7D3CDFA1EB9 Jony y el Trono del Jaguar (1986)(Grupo de Trabajo Software)(ES) MSX ES +F8C56FA41F81F293C079B47D4F6AD62B Load'N'Run Issue 02 - Phantasma (1985)(Inforpress - Duplison)(ES)[Mastertronic's Chiller] MSX ES +1A9E412AB5BC9F5A8A93E8963FA0FAE4 Load'N'Run Issue xx - En la Edad Media (1985)(Inforpress - Duplison)(ES) MSX ES +A43E25DC87FE211AAA72A3712F3C960C Load'N'Run Issue xx - Sir Camelot y el Rey Arturo (1985)(Inforpress - Duplison)(ES) MSX ES +607497947931F6581A8CD530926480C2 Load'N'Run Year 02 Issue 02 - Defensa del estrecho (1986)(Inforpress - Duplison)(ES) MSX ES +BF09C099A8B380F066859FB9CF3311FF Load'N'Run Year 02 Issue xx - Aguas Bravas (1986)(Inforpress - Duplison)(ES) MSX ES +A6DDACC4F79939234B53DDCE41A880AE Load'N'Run Year 02 Issue xx - Astronauta (1986)(Inforpress - Duplison)(ES)[a][aka Space Walk] MSX ES +C5FB71A03C7BBBEF961D05EB65660D37 Load'N'Run Year 02 Issue xx - Astronauta (1986)(Inforpress - Duplison)(ES)[aka Space Walk] MSX ES +99995BB00539E456F6E47C83D8C55E24 Load'N'Run Year 02 Issue xx - La casa maldita (1986)(Inforpress - Duplison)(ES) MSX ES +0F03FA2309CCAA0BEF90CA66E79B1341 M-47 (1986)(Edisoft)(ES) MSX ES +514E84890E0E5D3E937ABAE5572AE0B3 Mecano Oasis (1987)(Grupo de Trabajo Software)(ES) MSX ES +2B10AF7A158D2EB7A922BE8A5CE72FC0 Miki Va a Esquiar (1986)(Grupo de Trabajo Software)(ES) MSX ES +AB2129617917218DB5329D48347F049E MSX Games - Issue 02 - Bob 007 - Infiltrado (1986)(Grupo de Trabajo Software)(ES) MSX ES +F42DD842D0E2D7B1B6BBE606F22924FE MSX Software - Issue 09 (1986)(Grupo de Trabajo Software)(ES) MSX ES +16B4932B3F3D425CC1712891DEBB0B70 New Games MSX - Issue 01 (1987)(Edigamma)(IT) MSX IT +32C8F825E913510AD960EFFC2035AE4B New Games MSX - Issue 09 (1987)(Edigamma)(IT) MSX IT +8277200B4CE3AF6080325698B19EA810 New Games MSX - Issue 10 (1987)(Edigamma)(IT) MSX IT +97B64CD0828CA3121A2FD6D23BF12BF6 New Games MSX - Issue 13 (1988)(Edigamma)(IT) MSX IT +FE2800F5DDDDE355D2F0F4600D4331C4 New Games MSX - Issue 16 (1988)(Edigamma)(IT) MSX IT +8DFC8E04D89129CA2851C95D71CA6871 New Games MSX - Issue 17 (1988)(Edigamma)(IT) MSX IT +933FFD6EF0B14D3D06F105B246AECBA1 New Games MSX - Issue 20 (1988)(Edigamma)(IT) MSX IT +E1EB16750524DC5843680EF9EE12A1CF New Games MSX - Issue 22 (1988)(Edigamma)(IT) MSX IT +79A25CAAE7B2286B6E75B7707969241B Numero Fantasma, El (1987)(Editorial Cometa)(ES) MSX ES +0CB52408D69D3A5FB596E872092B89E8 Patibulo (19xx)(Data MSX)(ES) MSX ES +0F6B46841CF972644D88FFFBCBFA7F9A Patrullera XH-63 (1987)(Grupo de Trabajo Software)(ES) MSX ES +060A2E54EB322CF9EF9AAEA1653D2355 Patrullera XH-63 (1987)(Grupo de Trabajo Software)(ES)[a] MSX ES +A2B99BF45AE4EB038AC773B3BE02245E Pepe Saltarin (1986)(Grupo de Trabajo Software)(ES) MSX ES +6DA8006B72416CA152228DB2B6CD1AC9 Pizarra (19xx)(Data MSX)(ES) MSX ES +FE0B3E8D1E3A448B15F6C4760E75D95E Settimana Games - Issue 09 (1989)(Edigamma)(IT) MSX IT +2FFB4DC251FAC8664842D63C1014F229 Talisman (1987)(Grupo de Trabajo Software)(ES) MSX ES +0F0086A133ED900D5E995D49CC3317B1 Tragamanzanas, El (1985)(Monser)(ES)[DK'Tronics' Apple Jam] MSX ES +971CAECCF1D4842289DDA1E105DD553F Yesod (1987)(Grupo de Trabajo Software)(ES) MSX ES +2596B46589D32469F6CA1811761D5367 Zork III - The Dungeon Master (1983)(Infocom)(US) MSX US diff --git a/Assets/gamedb/gamedb_msx_msx1_rom.txt b/Assets/gamedb/gamedb_msx_msx1_rom.txt new file mode 100644 index 0000000000..3662fcd346 --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx1_rom.txt @@ -0,0 +1,1484 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Applications - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:53:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +A24C566A9BD438A4377D8645039431E6 H MT-Base (1987)(Micro Technology)(NL)[cr Speedy-Hacking No] MSX NL +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +0CA0BC3192891C844813963545CB27A8 Cheese (1984)(Nipon Electronics)(JP)[mouse] MSX JP +EFBA1BDE3BE6A3B1D6C235E4152DD261 Designer's Pencil, The (1984)(Pony Canyon)(JP) MSX JP +515D5E66D1C215642D0E40A5E4BB9091 Dr. Copy-MSX v2.0 (1987)(Emiiru)(JP) MSX JP +144E534CD1FD39C7E3FDCA776DC5A394 Eddy II (1984)(HAL Laboratory)(JP) MSX JP +5BA2C72617EEA98101ACD59DC0696A99 Eddy II (1984)(HAL Laboratory)(JP)[a] MSX JP +67EE3B624B84977A6FBC8BB1E1D8BEB9 FALC - Family Automation Language for Community (1984)(Sony)(JP) MSX JP +31EC0861771017D024DD2E9AE72C2687 Home Calc (1984)(Matsushita Electric Industrial)(JP) MSX JP +68FB0EDD8AC141D1D49535E5C5A98A04 Joytelop (1985)(JVC)(JP) MSX JP +3C041801933E4CD9E63DE4170474979E Kakikukekon (1985)(Casio)(JP) MSX JP +9A1FEA866BF212266B540F31027BCD04 Konami's Game Master - European Version (1986)(Konami)(JP)[a][RC-735] MSX JP +B4C20087E3FCF18FA270591F266A0937 Konami's Game Master - European Version (1986)(Konami)(JP)[RC-735] MSX JP +FC825E62A51500B01F202DC08514A038 Konami's Game Master - Japanese Version (1985)(Konami)(JP)[a][RC-735] MSX JP +9D5784C6B9B0F1DD3530B36EDCDCC47F Konami's Game Master - Japanese Version (1985)(Konami)(JP)[RC-735] MSX JP +660D6F9B5F951EF3AE3066F4C0766FF8 Konami's Game Master II (1988)(Konami)(JP)[a][RC-755] MSX JP +AE7DD50D7EBBF9655AAF4245A3B17382 Konami's Game Master II (1988)(Konami)(JP)[a2][RC-755] MSX JP +1FECD63CF4967DD6D2D4F6901D8D210B Konami's Game Master II (1988)(Konami)(JP)[RC-755] MSX JP +9722AFDE54A1E9C47FE1FD954CBFB246 Konami's Synthesizer (1986)(Konami)(JP)[a][RC-741] MSX JP +458365AA94BEDCEF0718207C7ECBCF85 Konami's Synthesizer (1986)(Konami)(JP)[RC-741] MSX JP +1C5DD99177224F2F7E3F2B38D1E5E13C MSX Eiwajiten. MSX English-Japanese Dictionary (1988)(Hi-Score Software)(JP) MSX JP +1720B10455456C9650EF01DF39003322 MSX Home Writer (1985)(Sony)(JP) MSX JP +B71EA4135E7693D0F58E4D383C67B691 MSX-Aid (1986)(ASCII)(JP) MSX JP +59DB5AC478946C092789CF2332FA87BE MSX-Logo (1985)(Logo Computer Systems)(NL)[8103-23 - Dutch] MSX NL +228105879B1514B0B1B6EA60821808D4 MUE - Music Editor (1984)(HAL Laboratory)(JP) MSX JP +AB600EF7556DA280CA270C277D55D864 Music Harmonizer 3 (1984)(Rittor Music)(JP) MSX JP +5A56FD9162FB3F6B10D7B795C08381B5 Music Studio G7 (1985)(Sony)(JP) MSX JP +C2C97D709C4A372FECF7924665E1536E NGA (1985)(The Links)(JP) MSX JP +CC5456C42E5C3E6B7F6C8E29F8C3DDFC NGA II (1985)(The Links)(JP) MSX JP +F07C7CB16E4C8C4FCD9C55A5D6C67F08 NGA II (1985)(The Links)(JP)[a] MSX JP +2D63114526A7DAB0B8C4B277FE601589 Pasokon Sakkyokuka. Computer Music Composer (1984)(Rittor Music)(JP)[press LSHIFT at boot] MSX JP +7C8EDD81B65F2A09C388BE06A5321FC9 PSG Music Writer (1984)(Rittor Music) MSX +D2BCC5E5C7D391484572BFD840293F09 Simple ASM v1.0 (1984)(Coral Sea)(JP)[type CALL START or CALL EDT] MSX JP +62FE3CAE317C532F9C11A8A148447D18 Spread Sheet (1984)(Computermates) MSX +CAA68E3E518D463CC6BD11C33C8B6D21 Super Monitor v1.1 (1985)(Emiiru) MSX +E9C4D73991E625624319A3EB9B6081F1 Super Monitor v1.2 (1985)(Emiiru) MSX +06C7C94665F34EF0942A3194A4C8BA00 Super Synthesizer (1984)(Victor)(JP) MSX JP +3D24F0C7C609CF6848826A00927FCD7A Super Synthesizer (1984)(Victor)(JP)[a] MSX JP +81404A245C25A421C8EC4DC629EC4952 Synthe Saurus v1.1 (1988)(Bit2)(JP) MSX JP +F31233A420335439E54C15F3DEC21358 Zen Assembler (1986)(Kuma Computers)(GB) MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Compilations - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:53:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +E0B1ED12B586B53B87DC66E756099721 Activision Gamecase (2002)(JAM) MSX +3193E6AF7DBBF130A7F2BDBFA9337437 Casio Gamecase (2002)(JAM) MSX +5147D60367BFA42327B1BF5CC8B0330D Compile Gamecase (2002)(JAM) MSX +603D2B429B05E69AAF6AE15EB40DD1E0 Game World - 126 Games (1990)(-) MSX +3E3671CA10BF0C579AD40C8E3F3D840D Hal Gamecase (2002)(JAM) MSX +68D3187E88680C2F82A14B69C4050972 MSX-FAN Fandom Library 1 (1988)(Technopolis Soft)(JP) MSX JP +7EC4CF6AFC2F8D9E5341D1EADF86A4E8 MSX-FAN Fandom Library 2 (1988)(Technopolis Soft)(JP) MSX JP +3190CE45A2A2CF02EB34BA3233DB018A MSX-FAN Fandom Library 3 (1988)(Technopolis Soft)(JP) MSX JP +0A955B0104E15E6A48B1C31849BCEB02 Tape Gamecase (2002)(JAM) MSX +566D16CBEFD6F27DBC6C59CA290B3390 Time and Magik III - The Price of Magik (1986)(Level 9 Computing)(GB) MSX GB +F31233A420335439E54C15F3DEC21358 Zen Assembler (1986)(Kuma Computers)(GB) MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Demos - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:53:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +FE043097CECE49648477AD2CFEA69FD7 Psychedelia (1984)(Aackosoft)(NL) MSX NL +566D16CBEFD6F27DBC6C59CA290B3390 Time and Magik III - The Price of Magik (1986)(Level 9 Computing)(GB) MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Firmware (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:53:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +80DCD1AD1A4CF65D64B7BA10504E8190 H MSX-DOS v2.2 (1984)(Microsoft)(US)(Disk 1 of 8)[f][0] MSX US +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +76E6109A432272BBCEE2990F086104A0 Datagame Videotext Modem (19xx)(-)[DATAGAME.ROM] MSX +AC82AB716E1698E80F9BC0AD1C4A56CF Digital Design Eletronica Brazilian-Expert (19xx)(Digital Design Eletronica)(BR)[DISK.ROM] MSX BR +B5312075030D4BBCF72973E835CFCE9B Digital Design Eletronica DDX v1.0 - Port Based (19xx)(Digital Design Eletronica)(BR)[DDX10.ROM] MSX BR +6072BC6C0016DBC7CBA76948458BF69B Digital Design Eletronica DDX v3.0 - Mixed Port + Memory Based (19xx)(Digital Design Eletronica)(BR)[DDX30.ROM] MSX BR +3B24D3BBC40CCB816264207145FF1F33 Digital Design Eletronica DDX v3.0c - Mixed Port + Memory Based (19xx)(Digital Design Eletronica)(BR)[DDX30C.ROM] MSX BR +ABDBC70A4393C3272A7718AE99F8CC54 Digital Design Eletronica DDX v3.0d - Mixed Port + Memory Based (19xx)(Digital Design Eletronica)(BR)[DDX30D.ROM] MSX BR +09A67D9C4B6E00E312C8395D9108DF12 Digital Design Eletronica DDX v3.0f - Mixed Port + Memory Based (19xx)(Digital Design Eletronica)(BR)[DDX30F.ROM] MSX BR +38AFB3C92A4870687638354108F9CDA6 Digital Design Eletronica LiftRom Informatica 1989 (1989)(Digital Design Eletronica)(BR)[LIFTROM.ROM] MSX BR +E38A9BFB8B397AA6C721F47EEFE130B9 Disk BASIC v1.0 for FS-FD1 (1987)(Matsushita Electric Industrial)(JP) MSX JP +8428D1C1FB1D7A039FB68A222DD237FD Disk BASIC v1.0 for FS-FD1A (1987)(Matsushita Electric Industrial)(JP) MSX JP +125330DC743633DD4393D8F9A06FD2EA Disk BASIC v1.0 for FS-FD351 (1985)(National) MSX +1162FC9BC00E206C86918885B5EA10D3 Disk BASIC v1.1 for Epcom Sharp HB-3600 - Memory Based (1987)(Sharp)[SHARP.ROM] MSX +420B729ABA0E206F7EC7F52957BF2E1E DX7 Voicing Program YRM-13 (1984)(Yamaha)(JP) MSX JP +60D987D27E6003C90678A5CB43ED148F FB-01 Voicing Program YRM-56 (1985)(Yamaha)(JP) MSX JP +AE2E0440DEFD75A8A986CC28EBEF8354 FM Music Composer II YRM-55 (1985)(Yamaha)(JP) MSX JP +C652303F533C9BB0F8FBD272931E1D05 FM Music Composer YRM-15 (1984)(Yamaha)(JP) MSX JP +BEA9539AE16DDC69711F25C878C99D1A FM Music Macro YRM-11 (1984)(Yamaha)(JP) MSX JP +AF8537262DF8DF267072F359399A7635 FM Pana Amusement Cartridge 16k v1.3 (1988)(Matsushita Electric Industrial)(JP)[FMPAC.ROM] MSX JP +6F69CC8B5ED761B03AFD78000DFB0E19 FM Pana Amusement Cartridge 64k v1.3 (1988)(Matsushita Electric Industrial)(JP)[FMPAC.ROM] MSX JP +BF430274DEB3F62D90986C6B40869978 FM Voicing Program YRM-12 (1985)(Yamaha)(JP)[no disk support] MSX JP +A0452DBF5ACE7D2E49D0A8029EFED09A Goldstar FC-200 MSX Disk BASIC (19xx)(Goldstar) MSX +F35EDF0808FDD1A81F86EA647E5B38EE Kanji ROM - JIS 1st Class for MSX-Write (1986)(ASCII)(JP) MSX JP +C1E961A3E0F016E5409950EBCC5BFB4F MegaRAM Disk DDX v1.1 (1989)(Digital Design Eletronica)(BR) MSX BR +6B29D76005D573CF7BF7CF04500CFF9B Microsol Tecnologia CDX2 1986 - Port Based (19xx)(-)[CDX-2.ROM] MSX +5683B507AEB089380AF82A68E1B5463A MIDI Macro YRM-33 (1986)(Yamaha)(JP) MSX JP +16E5A4CA948C636A868FD0E267DA61C6 Mitsubishi MLFX1 BASIC BIOS (1983)(Mitsubishi Electronics)(JP) MSX JP +EE2DCD6371357BB4B3CF46FCB5AC3154 MSX Acao Expert (19xx)(-)(BR) MSX BR +337C2ABC33DC539C6AA2DBE0F5E7F523 MSX Audio FS-CA1 (1988)(Matsushita Electric Industrial)(JP) MSX JP +9CC985086B6448F4CFFDCE0D95071FA4 MSX BASIC Cassette (19xx)(Elf)(JP)[CASSETTE A] MSX JP +DC097654263FFB9FBE0D4C23AF5698D6 MSX BASIC Cassette (19xx)(Elf)(JP)[CASSETTE B] MSX JP +DC6DFD991FFDC948A4216706C5717EB0 MSX BASIC Kun (1986)(ASCII)(JP)[a][XBASIC.ROM] MSX JP +2A905423946F9876EBBFADE9445BC82B MSX BASIC Kun (1986)(ASCII)(JP)[XBASIC.ROM] MSX JP +4D42677B708457FEEC2978B75C45CC79 MSX BASIC Kun Plus v2.0 (1988)(ASCII)(JP)[a][XBASIC2.ROM] MSX JP +0B6120F289336538BC564548109F97C6 MSX BASIC Kun Plus v2.0 (1988)(ASCII)(JP)[XBASIC2.ROM] MSX JP +6D38551EC463D9E3FFB1DC1A6FDE8583 MSX BASIC Kun Plus v2.1 (1992)(ASCII)(JP)[XBASIC2.ROM] MSX JP +761ADB92119B8D4B9545D91BF92FCD10 MSX BIOS ROM Image (19xx)(-) MSX +BD8811D6D14F48E1119FE6DE815B351A MSX BIOS ROM Image (19xx)(-)[a] MSX +B12571C013CD5022CB3CE511EFAD04EF MSX BIOS ROM Image Japanese (19xx)(-) MSX +8EDA14CCACF16D9FA035629724BA2895 MSX BIOS ROM Image Korean (19xx)(-) MSX +2ECAD47B942717CEF49A877A3AAE8DD0 MSX BIOS ROM Image Russian (19xx)(-) MSX +9DED765D56F6947E0DC9922763EE7B8D MSX BIOS ROM Image UK (19xx)(-) MSX +394EFBC50FB7DF1151130D8C162F85C3 MSX Hangul Input Software v2.0 - Daewoo IQ-1000 DPC-100 (1984)(Qnix) MSX +A3358F488AFDEEA9FC0486BA0C81A888 MSX ROM Image HotBit v1.1 (19xx)(Sharp)[HOTBIT11.ROM] MSX +AA95AEA2563CD5EC0A0919B44CC17D47 MSX System v1.0 + MSX BASIC (1983)(Microsoft)(US)[a][MSX.ROM] MSX US +95C94878C0ECF0B4C0D8BC8DEAA9D7F3 MSX System v1.0 + MSX BASIC (1983)(Microsoft)(US)[MSX.ROM] MSX US +9218F6DD89F7BA01E3090D44721B4260 MSX System v1.0 + MSX BASIC Japanese (1983)(Microsoft)(US)[JAPMSX1.ROM] MSX US +C84F362C44192659273D45AE97462362 MSX System v1.0 + MSX BASIC Korean (1983)(Microsoft)(US)[KORMSX1.ROM] MSX US +47713E6274886B9A81B33F9B7FB79D78 MSX System v1.0 + MSX BASIC UK (1983)(Microsoft)(US)[MSXUK.ROM] MSX US +546AFC078124698CAE4C4B8DFB7CCBC3 MSX v2.0 Korean Han (1984)(Qnix)[MSXHAN.ROM] MSX +A2786C3FDDF03D04EA27BABA464F57AE MSX-DOS v1.0 (1986)(Technoahead)[TECHNOAH.ROM] MSX +20DBD1A0E09D5F563C0C7A7B213C251A MSX-DOS v2.2 (1984)(Microsoft)(US)(Disk 2 of 8)[1] MSX US +7B12CB667BB8000361729A92E5E5A3BE MSX-DOS v2.2 (1984)(Microsoft)(US)(Disk 3 of 8)[2] MSX US +2E99B7BC26C46EFA06DAC37EF055EB38 MSX-DOS v2.2 (1984)(Microsoft)(US)(Disk 5 of 8)[4] MSX US +B8B8F46B4189E5906CDC5D83F605C257 MSX-DOS v2.2 (1984)(Microsoft)(US)[a][DISK.ROM] MSX US +C99E74CE27B07A32AA5D450C3CB91B4E MSX-DOS v2.2 (1984)(Microsoft)(US)[a2][DISK.ROM] MSX US +973368692A03FCA68C0E658856348460 MSX-DOS v2.2 (1984)(Microsoft)(US)[DISK.ROM] MSX US +151F3659D993F68B1694FD1BFDE022D5 MSX-Write (1986)(ASCII)(JP) MSX JP +841CF24BD4606CCE44D414641F21805D Music Module MSX-Audio (19xx)(-)[MODULE.ROM] MSX +38CEAC0E507CE410FD6095FEE0AC7AC7 National FS-SR022 MSX Bunsetsu Henkan Jisho (1985)(National) MSX +AA63EC638470E181F00954358F44D011 National FS-SR022 MSX Jisho Data (1985)(National) MSX +F873F1260B14F1468FA118778AE1C3D2 National Matsushita CF-3300 MSX BIOS + BASIC v1.0 (1984)(Matsushita Electric Industrial)(JP)[MSX1.ROM] MSX JP +318B6AA76DA71C54CCAD7734356E1902 National Matsushita CF-3300 MSX Disk BASIC v1.0 (1984)(Matsushita Electric Industrial)(JP)[DISK.ROM] MSX JP +F005E55C680BA6E7B19F6D4DC8F73CE5 National Matsushita FS-4000 MSX BIOS + BASIC v1.0 (1985)(Matsushita Electric Industrial)(JP)[MSX1.ROM] MSX JP +EA67465FF992C11E4B146479E5A16E32 National Matsushita FS-4000 MSX Standard Kanji Driver (1985)(Matsushita Electric Industrial)(JP)[MSXKANJI.ROM] MSX JP +090539674630C1338A90A1DF943A93E2 National Matsushita FS-4000 MSX Standard Kanji Font (1985)(Matsushita Electric Industrial)(JP)[KANJI.ROM] MSX JP +8B81959FFC63982E32E484FE94B7CEC4 National Matsushita FS-4000 MSX Word Processor (1985)(Matsushita Electric Industrial)(JP)[MSXWORD.ROM] MSX JP +B4415A26072ED955D83CC88D0DC16405 Philips NMS-1205 Music Module ROM MSX1 (19xx)(Philips) MSX +B9759FA5CC4DB4775203892DD701CC8A Philips NMS-1431 Printer #1 (19xx)(Philips)[1431.BI1] MSX +453ED6324420515ABFEE5B37D8DFFED4 Philips NMS-1431 Printer #2 (19xx)(Philips)[1431.BI2] MSX +364A1A579FE5CB8DBA54519BCFCDAC0D Philips VG-8020 MSX BIOS + BASIC v1.0 (1985)(Philips) MSX +41CB37B71775919827E42DB57BF2176B Philips VY-0010 DiskDrive (19xx)(Philips) MSX +0F65402BEA72F3326502706F49DA122F Play Card System UPA-01 (1985)(Yamaha)(JP) MSX JP +FE043097CECE49648477AD2CFEA69FD7 Psychedelia (1984)(Aackosoft)(NL) MSX NL +279EFD1EAE0D358EECD4EDC7D9ADEDF3 RS232 BIOS and BASIC extensions (19xx)(-)[RS232.ROM] MSX +1F374A08E886D873E4FB1FA5DBDFB452 RS232 BIOS and BASIC extensions Gradiente - 80 Column (19xx)(-)[CT80NET.ROM] MSX +A0AD98D02A5E1D36B0B75EB0625D2D0C RS232 BIOS and BASIC extensions Gradiente - 80 Column, Astex Word Processor (19xx)(-)[CT80E.ROM] MSX +715037DBD87A677D9FDA007F9D67D2C6 RS232 BIOS and BASIC Extensions Terminal Cibertron (19xx)(-)[CIBERTRO.ROM] MSX +A61F3D974C783DBDD73BE27ADECB4093 RS232 Modem Cartridge (19xx)(-)[RS232.ROM] MSX +D83AF2172000385FFDB031991FC37F8E Sanyo Lightpen (19xx)(-)[MLP001.ROM] MSX +616D17CB4E205205F3B56979AE3D4372 Sistema MSX v1.0 Br + MSX BASIC Gradiente (19xx)(-)[MSX.ROM] MSX +D13C1FC9AD4897C322F51AAB3AD3B30D Sistema MSX v1.1 Br + MSX BASIC Expert Gradiente (19xx)(-)[EXPERT11.ROM] MSX +1D89C2D66E18538B1065D1C37CB83E4D Sony HB-201P BASIC BIOS (1984)(Sony)(JP) MSX JP +F748115B4873A68B4A0425935BEE320A Sony HB-201P Firmware (1984)(Sony)(JP) MSX JP +0829C99D6192E88065657F9275634961 Sony HB-75D Internal software (1984)(Sony)(DE)[INTERNAL.ROM] MSX DE +4655329D3F37BF1A655D05F2ABD1AA62 Sony HB-75D MSX BIOS + BASIC v1.0 (1984)(Sony)(DE)[MSX1.ROM] MSX DE +9FEE5C622FF65C276D79C3F2F9905E4F Sony HB75P Firmware (19xx)(Sony)(JP) MSX JP +76CDC12C2849BE763AACD1D397B989BE Sony HBD-50 BASIC BIOS (19xx)(Sony)(JP) MSX JP +2D1B61DAC1685896AAE0538D0F74FFB3 Sony HBD-F1 BASIC BIOS (19xx)(Sony)(JP) MSX JP +F7AECA5B9ECE4481B9C280E3AB60B76C Sony HBK-30 BASIC BIOS (19xx)(Sony)(JP) MSX JP +BB53012AC162BD9A9644D163C0B924E0 Spectravideo SVI-738 MSX BIOS + BASIC v1.0 (1983)(Spectravideo)(GB)[MSX1.ROM] MSX GB +A063A2ACBCF12B5F1D2919B119A6FE19 Spectravideo SVI-738 MSX Disk BASIC v1.0 (1983)(Spectravideo)(GB)[DISKO.ROM] MSX GB +44388A24D925BC06A1D47DB7F638922A TMG 2 Gradiente Modem (19xx)(-)[TM2GRAD.ROM] MSX +38EB2E535B8FE6886597081F79F27243 Toshiba HX-MU900 MSX-Audio (1985)(Toshiba)(JP)[MMOD1.ROM] MSX JP +41FA839B7EB931959EE587B9A55D922B Yamaha SFG-05 System (1984)(Yamaha)(JP)[SFG05.ROM] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX - Games - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:53:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +A0268D94089779EED740346B2F87481A B Aliens. Alien 2 (1987)(Square)(JP)[b] MSX JP +2266637325073D6390F2DD95393C05B1 B Arubatoros. Albatross (1986)(Telenet Japan)(JP)[b] MSX JP +413DE66CCB31F9BE011F09A75BE4701A B Bifamu. Galaxy Drift Motorcycle Femme (1984)(Bandai)(JP)[b] MSX JP +4CA9F5E8EC595C26A3B6AC15FDEA3CE0 B Bomber Man Special (1986)(Hudson Soft)(JP)[b] MSX JP +34BB830FB736927BE6B7DA599F77FADE B Championship Lode Runner (1985)(Sony)(JP)[cr Prosoft][b] MSX JP +3F3B3A1D1AE210F72927C9819B0257BB B Courageous Perseus (1985)(Cosmos Computer)(JP)[b] MSX JP +37B5E404CD71956C41EF5677659D7BEB B Cross Blaim (1986)(dB-Soft)(JP)[b] MSX JP +BEC687CEBA5E87B32FDDD5969D0494A1 B Crusader (1985)(Pony Canyon)(JP)[b] MSX JP +567B5653E2BADA5FA7D9DE584A562B2D B C-So! (1985)(Pony Canyon)(JP)[b] MSX JP +34DF847D6B625A984CBB8018915E288A B Dig Dug (1984)(Namcot)(JP)[b] MSX JP +4CBBC78579941D52A3B6633A7E0BEA5D B Doki Doki Penguin Land (1985)(Pony Canyon)(JP)[b] MSX JP +9FA589983D29D4E58EA9C0BCF47D48F7 B Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP)[b] MSX JP +3639586E79F158042DB9A0BD5C59D2A7 B Eggerland Mystery (1985)(HAL Laboratory)(JP)[b] MSX JP +BF2CC0E26D55F0143609000C8EBCF242 B Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP)[b] MSX JP +F0837B4A6F47A2396575BBAE4712834B B Exerion II - Zorni (1984)(Jaleco)(JP)[b] MSX JP +39A37746403E60D9DFD1B128DD9AEA3A B Exerion II - Zorni (1984)(Jaleco)(JP)[u][b] MSX JP +7FB2892CA62D259637FAF5137ED128C2 B Flicky (1985)(Micronet)(JP)[b] MSX JP +45B12292B48658044A18FA60BD5948B2 B Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[o][b][RC-764] MSX JP +0D75AF4EB1EDEB053EE859099EA70F98 B Gradius. Nemesis (1986)(Konami)(JP)[b][SCC][RC-742] MSX JP +6B6D173CC0B3CCDC067606FEF1BFBFF5 B H.E.R.O. (1984)(Pony Canyon)(JP)[u][b] MSX JP +C50C80735A3AE696B288A709909E16AE B Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP)[b] MSX JP +ADABAABC11A56576481A8526147BB17E B Hype (1987)(Methodic Solutions)(NL)[b] MSX NL +B5103D7437630B1EE00389B6A9007988 B Indian no Bouken. Indian's Adventure (1984)(Hudson Soft)(JP)[b] MSX JP +AB7803129E7BD8DEBBFE25321416B0B3 B Kage no Densetsu. Legend of Kage (1986)(Taito)(JP)[b] MSX JP +470A0254AE3219B0E5BA2C94D8A9578B B King's Knight (1986)(Square)(JP)[b] MSX JP +841DB58B66014E71E5D27A8FABB83F50 B Knightmare. Majyo Densetsu (1986)(Konami)(JP)[b][RC-739] MSX JP +D68C26E7513BAD6892A7CA80A6C277BB B Koneko no Daibouken. Kitty's Great Adventure. Catboy (1986)(Casio)(JP)[b] MSX JP +6993619CACA1FF3B38005577EE1B5908 B Lunar Ball (1985)(Pony Canyon)(JP)[b] MSX JP +98E24CFD2AA5C08282E61E080520D6DD B Magunam. Kiki Ippatsu. Magnum Prohibition 1931 (1988)(Toshiba-EMI)(JP)[b] MSX JP +AB32DB52E6DEDE4F2604E05616DF0ABF B Midnight Building (1984)(ASCII)(JP)[b] MSX JP +42AF37C8DDA5A05253945A5BBF87F4C1 B Mr. Do! vs Unicorns (1984)(Sony)(JP)[b] MSX JP +955563E9D9B469922498E0B41EC8F06D B Ninja Jaja Maru Kun (1986)(Nippon Dexter)(JP)[b] MSX JP +1F0AEEA6F778927E5B8A223BCCA3C8E2 B Ninja Kun. Majyo no Bouken (1985)(Nippon Dexter)(JP)[b] MSX JP +E5EDF1BD200E46401415016921DC4C81 B O'connor (1990)(Santa Claus Software)[b] MSX +7F8AA32084229987D77CE33E5CF3F934 B Oil's Well (1985)(Comptiq)(JP)[b] MSX JP +246A692350564893FE99BDCEDCDEF9D4 B Oil's Well (1985)(Comptiq)(JP)[u][b] MSX JP +E0226648681DADA247FC01289DBF76E0 B O'Mac Farmer (1984)(ASCII)(JP)[b] MSX JP +D4273060BF55182D0E8DE447C6DAE626 B Pipi (1985)(Nippon Dexter)(JP)[b] MSX JP +0AC901E32B79DB844D17A93C6F5828AE B Play Ball (1986)(Sony)(JP)[b] MSX JP +BCCB01412FF9EB87FD38C789656960AD B Robowres 2001 (1988)(Zemina)(KR)[b] MSX KR +4DB3786C77C5578344B6D2276FC14EF8 B Roller Ball (1984)(HAL Laboratory)(JP)[b] MSX JP +148A58DEE8795D636497590677AAE5D8 B Scarlet 7 (1986)(Toshiba-EMI)(JP)[b] MSX JP +4031D894AE614BC2CD015F52D8DA2C76 B Scion (1985)(Sony)(JP)[o][b] MSX JP +93952054FEEE477C1717DDEFA5CBBB1A B Scramble Eggs (1983)(Ample Software)(JP)[o][b] MSX JP +7BB030BB0AF990CD1BC72D08178A92BA B Seiken Acho. Kung-Fu Master Taekwondo (1985)(Irem - ASCII)(JP)[b] MSX JP +AD4F43BC1187BF4D9AAA67A99692D7D7 B Shindobaddo Nanatsu no Bouken. The Seven Adventures of Sindbad (1986)(Casio)(JP)[b] MSX JP +428730CFA4C0B67BA259B33EB3E291C6 B Skooter (1987)(Al Alamiah)(KW)[b] MSX +710240C34359351E4BF8178ECB71E81B B Space Busters (1985)(Aackosoft)(NL)[b] MSX NL +EA57D7EEC84D2A64022ED33AE61488D5 B Star Blazer (1985)(Sony)(JP)[b] MSX JP +BA0424736BEFD6783D63A213AE92997C B Super Laydock - Mission Striker (1988)(Zemina)(KR)[u] MSX KR +62A59424B30CD15432DF381295A765CD B Tritorn (1986)(Xain)(JP)[b] MSX JP +490AF2970DAE2212DE72189B44D60E36 B Youkai Yashiki. Boynight. Haunted House (1986)(Casio)(JP)[b] MSX JP +7B9AA50610422A73D17A72E653DFDBA5 B Zaider - Battle of Peguss (1986)(Cosmos Computer)(JP)[b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +D4C02275B006A0972E4CCADDAEB8793F H Anaza. Kaleidoscope Special (1987)(Hot-B)(JP)[cr Edgard] MSX JP +B42EC6397DC274E73242514CC21835DB H Anaza. Kaleidoscope Special (1987)(Hot-B)(JP)[cr Sammi] MSX JP +A196B6838C7EA19BCFE373DF937A0E6A H Antarctic Adventure - Japanese Version (1984)(Konami)(JP)[cr Prosoft][RC-701] MSX JP +FDCF34564547F3FF8D3719E7DAC66ECE H Aquapolis SOS (1983)(General)(JP)[cr Sammi] MSX JP +FBF9175CC1E2E319D8D6585EE70D46AF H Bank Panic (1985)(Pony Canyon)(JP)[cr Prosoft] MSX JP +1F133ED5DAECDC5B5185F073537A1010 H Bomber Man Special (1986)(Hudson Soft)(JP)[cr SoftMen] MSX JP +73DA6EA589014E665C8C8CF8C3C49927 H Casio World Open (1985)(Casio)(JP)[cr Boram Soft] MSX JP +598A3E08C6C69177289C1DB408DF11E5 H Castle, The (1986)(ASCII)(JP)[cr Static Soft] MSX JP +CDCE8291CC7A26E5D219A814BE1675C6 H Championship Lode Runner (1985)(Sony)(JP)[cr Prosoft][b2] MSX JP +3DDC82FAF717816F0954116C8ABE7B88 H Choro Q (1984)(Taito)(JP)[cr Prosoft] MSX JP +340404F3C9D2C9E34AD350E58E1A16E5 H Crazy Cars (1988)(Titus)(GB)[cr VIP Soft] MSX GB +A11272F90B0B840828DCD308291510DD H Donkey Kong (1986)(Ocean Software)(GB)[cr Dr. Jekyl and mr hyde] MSX GB +80E7944E074C70C8EAFA98D27584F3E1 H Door Door Mk2 (1985)(Enix)(JP)[cr Unicorn] MSX JP +EB5A3B333DFDCCFD726E98C8D4F032D1 H Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP)[h THEVMA] MSX JP +B44659764A9A6F36EFEED21F6832EB92 H Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[t][RC-764] MSX JP +95E14D5795B7DEAA7863B52D6A43D32C H Gozira 3D. Godzilla vs 3 Major Monsters (1984)(Bandai)(JP)[h Dino Sourcers] MSX JP +14CE3ADC4FB4455F12AD9E2F3A1477E3 H Gradius 2. Nemesis 2 (1987)(Konami)(JP)[t][RC-751] MSX JP +9115688F91CA1C6F4B5C60DD5888EFC4 H Gradius. Nemesis (1986)(Konami)(JP)[t][SCC][RC-742] MSX JP +F0306F73615766353B85855D94C2BBAF H Gulkave (1986)(Pony Canyon)(JP)[cr Crack Fm] MSX JP +63CD7E99AA658F60779F2DDA75452C60 H Gunfright (1986)(Nippon Dexter)(JP)[cr Sammi] MSX JP +451FEA340648EBDF5DAED23D30CCC83E H H.E.R.O. (1984)(Pony Canyon)(JP)[cr Purplesoft][o] MSX JP +C56CCF913F2EB94C3BDB92180D1A4294 H Hole in One Professional (1986)(HAL Laboratory)(JP)[cr Hillsoft] MSX JP +6B744850AECE858BD3C2586C37A061D6 H Issunhoushi no Donnamondai. Little Samurai (1987)(Casio)(JP)[cr Angel] MSX JP +1633CE1811CC37E0477E6C266CCF7736 H Issunhoushi no Donnamondai. Little Samurai (1987)(Casio)(JP)[cr Sammi] MSX JP +ED06A532D79CC65E075E7738C75E8D07 H Konami's Tennis (1984)(Konami)(JP)[cr Prosoft][RC-720] MSX JP +3CBFE5EC7366410409148111AFF7C459 H Kung-Fu Thai Kun. Isao Lord (1985)(Toshiba-EMI)(JP)[cr Claus] MSX JP +1E26432BA2D657581632A5EFBC69197D H Laptick 2 (1986)(dB-Soft)(JP)[cr Flash] MSX JP +3C546E43E52BB36FF880F38DA995B15D H Magical Tree (1984)(Konami)(JP)[cr Magicalsoft][RC-713] MSX JP +75FCEC5678765A17FD9647ACEFEF4E6C H Mayhem (1985)(Mr. Micro)(GB)[cr Magicracks] MSX GB +C4F6B935A0968A5A451AFE20D0156F31 H Moai no Hihou. Secret Treasure of Moai (1986)(Casio)(JP)[cr Static Soft] MSX JP +20ED6AD5C7079FE87D4C31D2AE3E918E H Mo-Karimakka. Bochibochidenna Sport (1986)(Leben Pro)(JP)[cr Canal Cracker] MSX JP +545C9F198980AC0D34CFE22BD7C71DE1 H Moon Patrol (1984)(IREM)(JP)[cr Prosoft] MSX JP +DCBC41C2CB4AA1CE3D482249A5CF7410 H Moon Patrol (1984)(IREM)(JP)[cr Prosoft][o] MSX JP +B1B962D477D02F304174D2A829EA8E03 H Mr. Do's Wildride (1985)(Nippon Columbia - Colpax - Universal)[cr Angel] MSX +513944CA300731048DB3A03D08995A80 H Ninja Jaja Maru Kun (1986)(Nippon Dexter)(JP)[cr Prosoft] MSX JP +B98BEA4D22768D9E0BEAA5C71A56EB7C H Pachicom (1985)(Toshiba-EMI)(JP)[cr Boram Soft] MSX JP +63631A3F9902C50B68C35CFE2144F746 H Parodius - Tako Saves Earth (1988)(Konami)(JP)[t][RC-759] MSX JP +420947D57174B849BBBDC7BA1E45A186 H Pegasus (1988)(Victor)(JP)[cr Prosoft] MSX JP +336C9681C25C7F8486669428C9D42612 H Penguin Kun Wars (1985)(ASCII)(JP)[cr Prosoft] MSX JP +516993AE3D3259559E66CD0551339854 H Poppaq the Fish (1986)(ASCII)(JP)[cr Boram Soft] MSX JP +EFF388556E79AB5857961D2965028868 H Protector, The (1985)(Pony Canyon)(JP)[t] MSX JP +E39B0C2C8BB8012D8D1515CF163EFAA8 H Rambo (1985)(Pack In Video)(JP)[h R. Bittencourt][t +2] MSX JP +96796221EC5E2ED0D85A646C16D9A9D8 H Salamander - Operation X (1987)(Konami)(JP)[t][RC-758] MSX JP +8189D1786771BD39E1FDC3717C4A404A H Scarlet 7 (1986)(Toshiba-EMI)(JP)[cr Crack FM] MSX JP +A5CDCFA1D2D4DFEC700E83B8C5AE25CE H Ski Command (1984)(Casio)(JP)[t] MSX JP +22D79D80A250B58BF4170B10664C8F6D H Skygaldo (1986)(Magical Zoo)(JP)[cr Sammi] MSX JP +E33594F6CA8FAAB7376B6B3804A9CDBA H Slapshot. Hockey sobre hielo (1985)(Indescomp)(ES)(en)[cr Philippe Vanheule] MSX en ES +CCEDE5D90A46333F06A40C4584076221 H Star Soldier (1986)(Hudson Soft)(JP)[cr Turbo Soft] MSX JP +200FF60C8E80C08002B80F946E6E95ED H Takahasi Meijin no Boukenjima. Wonder Boy (1986)(Hudson Soft)(JP)[cr Magosoft] MSX JP +7F4AC30E5AAA2604420F9FF870C802A4 H Takahasi Meijin no Boukenjima. Wonder Boy (1986)(Hudson Soft)(JP)[cr Star Frontiers] MSX JP +28BB9D414407432FA73A5D8D97BF8480 H Takeru Densetsu. Legend of Takeru (1987)(Brother Industries)(JP)[cr Sammy] MSX JP +4D257E8A91D6B0A30035D9A848BFF492 H Tensai Rabbian Daifunsen (1986)(Toshiba-EMI)(JP)[cr Crack Fm] MSX JP +B334D84575A522B71B19E0DFBE537253 H Thexder (1986)(Game Arts)(JP)[cr Magicracks] MSX JP +960AA840AD7F1A21BA3BD6296F85C787 H Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[t][RC-737] MSX JP +7A619FFD7F56ABF561037ECE78163D67 H Yume Tairiku Adventure. Penguin Adventure (1986)(Konami)(JP)[cr Screen][RC-743] MSX JP +6E39505E2DAD90D2951701FCCE0C10D6 H Zanac - 2nd Version (1987)(Pony Canyon)(JP)[cr Krull Software] MSX JP +852B6D3E943100F808EAD15A6561B64B H Zanac (1986)(Pony Canyon)(JP)[t] MSX JP +9CCD30C83437EC8ADF2E1BDB7E6DB254 H Zoom 909 (1985)(Sega)(JP)[cr Prosoft] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +2D13AEA89E5010FAD16F0BE977A802DC O Alibaba and 40 Thieves (1984)(ICM)[o] MSX +7295474536EBDF4D0223F5A742E4192E O Antarctic Adventure - Japanese Version (1984)(Konami)(JP)[o][RC-701] MSX JP +5499EEE2D9A73AD779C34084E321DBDF O Athletic Land (1984)(Konami)(beta)[o][RC-700] MSX +087C7ABF272591009FA9F756225F355F O Battle Cross (1984)(Sony)(JP)[o] MSX JP +C78403672546ED9F505DD74773EBFA7E O Beamrider (1984)(Pony Canyon)(JP)[o] MSX JP +14E6AC2CD3CA4EEB82AE6FA3DE804975 O Bomber Man (1986)(Korea Soft Bank)[o] MSX +76A9C47172C1E5EAE76A011064EA223B O Crazy Train (1983)(Sony)(JP)[o] MSX JP +21D453DA70A70EF2214E40AAF58471B2 O David II (1984)(ASCII)(JP)[o] MSX JP +E0A4B134D32E540E62F1BD13BAB03599 O E.I. - Exa Innova (1984)(Sony)(JP)[o] MSX JP +5598707443247B64C9C7FE72AA974751 O Galaxian (1984)(Namcot)(JP)[o] MSX JP +44D66D612B285B60149E6E6140AF1F6B O Golvellius (1987)(Compile)(JP)[o] MSX JP +A9E6FF2038CEBFF490E44AD89C53A8EE O Gomoku Narabe - Omo Go (1984)(Toshiba-EMI)(JP)[o] MSX JP +2BA6F43DA5D2F31C3AAB9F8B0A29317B O H.E.R.O. (1984)(Pony Canyon)(JP)[o] MSX JP +9C40115A913764AB227EF54A12DF7346 O Hanafuda Koi Koi - Gostop Godori (1984)(ASCII)(JP)[o] MSX JP +967A1AFE992AAF8D2E085FB7A1FE23A5 O Iligks Episode I - Theseus (1984)(ASCII)(JP)[o] MSX JP +C25B1A7CE7EA2F85AA598C0B05E76584 O Jump Coaster (1984)(Nippon Columbia - Colpax - Universal)[o] MSX +74AFD6D2537D90F793219030BF879310 O Juno First (1983)(Sony)(JP)[o] MSX JP +988AD24ADB540C8F8AA61F11F3FB287B O Mr. Chin (1984)(HAL Laboratory)(JP)[o] MSX JP +97D7328B35C053AA57F2E3F8FE0B48E1 O Mr. Do! (1984)(Nippon Columbia - Colpax - Universal)[o] MSX +01AC8519E2A04E24AD1E798851F1048F O Mr. Do! vs Unicorns (1984)(Sony)(JP)[o] MSX JP +060BC3176B100915F971DDBF3526FAEE O Mr. Do's Wildride (1985)(Nippon Columbia - Colpax - Universal)[o] MSX +EDD1B22F496AF2431DFB9EEEC4EACF8B O Pyramid Warp (1983)(T&E Soft)(JP)[o] MSX JP +ABD1D5B68770DAA98F79292B865F1910 O Scramble Eggs (1983)(Ample Software)(JP)[o] MSX JP +97471B4722B69AD84F811570BA78E9A2 O Sofia (1988)(Radio Wave Newspaper Publisher)(JP)[o] MSX JP +2C564A5FE435A52BE9FE03166738ED57 O Space Maze Attack (1983)(HAL Laboratory)(JP)[o] MSX JP +1CBB59AC656DF79CEBFA56D140C808B0 O Space Trouble (1984)(HAL Laboratory)(JP)[o] MSX JP +BB36A880C1F915652A611041169EF71C O Sparkie (1983)(Sony)(JP)[o] MSX JP +66DBEF52013DDFA76D57A365B77DF8E1 O Step Up (1983)(HAL Laboratory)(JP)[o] MSX JP +C0CDD054CC932A5AB6E81440A9D89857 O Super Cobra (1983)(Konami)(JP)[o][RC-705] MSX JP +C26003945426597730999996F41BB3F7 O Tank Battalion (1984)(Namcot)(JP)[o] MSX JP +D2999EF0C3DDC6A2C79F4E8CA7EB66DA O Video Hustler. Konami's Billiards (1984)(Konami)(JP)[o][RC-706] MSX JP +402901A468697318A5C91D4CF6FE155C O Warp & Warp (1984)(Namcot)(JP)[o] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +20B5AF8E868316800676A68C56E1FAB6 T B.C.'s Quest for Tires II - Grog's Revenge (1985)(Comptiq)(JP)[tr it] MSX JP +DF2B29421381D75BA11059D143304866 T Elevator Action (1985)(Nidecom)(JP)[tr pt MSX Informatica] MSX JP +8725B1BF807308E295819594677BAA3A T Knightmare III - Shalom (1987)(Konami)(JP)[tr pt R. Bittencourt][RC-754] MSX JP +6C49E103277A8010171E189324097401 T Mole Mole (1985)(Victor)(JP)[tr pt] MSX JP +C1123BE8192B045C5536CD744E9EBCB3 T Ninja Kun. Majyo no Bouken (1985)(Nippon Dexter)(JP)[tr pt Paulisoft Informatica] MSX JP +0ECDE32C67544EB08CCCA5CC9EDB724E T Penguin Kun Wars (1985)(ASCII)(JP)[tr pt] MSX JP +08FE82C1B52710940C0C8BEC356DEEA4 T Pico Pico (1983)(Micro Cabin)(JP)[tr pt Daniel] MSX JP +666560C2102C705DB703803623251373 T Seiken Acho. Kung-Fu Master Taekwondo (1985)(Irem - ASCII)(JP)[tr pt EngeSoft] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +941392BCDC6102AC638916A78B94D858 10 Yard Fight (1986)(IREM)(JP) MSX JP +023C05CFB90D7C334A424ACBD9CBC768 10 Yard Fight (1986)(IREM)(JP)[a] MSX JP +61ECF8CF74E340691E584AFEE719A66E 1942 (1986)(ASCII)(JP) MSX JP +284F6DF2BC8B829BC99775B52A00C509 1942 (1986)(ASCII)(JP)[a] MSX JP +1C4C07351FAAE07D11C100153C193744 1942 (1987)(Zemina)(KR) MSX KR +3B8EBF97B2F6E080448771191F046A79 1942 (1987)(Zemina)(KR)[a] MSX KR +AE898E560F7C672540B0AC95B6E03C24 3D Golf Simulation - High Speed Edition (1984)(T&E Soft)(JP) MSX JP +66C604647010990FFDB372683F4DDFD1 3D Golf Simulation - Normal Edition (1983)(T&E Soft)(JP) MSX JP +6CF80E1861DE859E3E8E84941CA33EF1 3D Golf Simulation - Normal Edition (1983)(T&E Soft)(JP)[a] MSX JP +8EA4964B35509BA0D021D35AA76F324C 3D Tennis (1983)(ASCII)(JP) MSX JP +252D7546181F824BFE669CF1AD5522B2 3D Water Driver (1984)(Apollo Technica)(JP) MSX JP +EE9FE57E172B4E734847B95CDB57E9D5 A Life M36 Planet - MotherBrain has Been Aliving (1987)(Pixel)(JP) MSX JP +66A5C9C5989FA72F8D89876F2876B5A1 A.E. (1983)(Toshiba-EMI)(JP) MSX JP +EB50EED382CB236C64693C3CF8637065 A.E. (1983)(Toshiba-EMI)(JP)[a] MSX JP +DFA4DC1F4FBF0EDD19D5C58C4384EB21 A1 Spirit - The Way to Formula 1 (1987)(Konami)(JP) MSX JP +399552677F6ECEB94F6C86878F4ACB12 Actman (1984)(ASCII)(JP) MSX JP +4EA5502BCFB84A2681DF823904B151BC Actman (1984)(ASCII)(JP)[a] MSX JP +49AB15C69631F664C2596F10D78FA8AD Adven'chuta! (1983)(MIA)(JP) MSX JP +F4A4EDAE9BF0650D0A002A31B9063B8C Alcazar - The Forgotten Fortress (1985)(Pony Canyon)(JP) MSX JP +4448FF0E82651AAF079621584AEAC9DF Alcazar - The Forgotten Fortress (1985)(Pony Canyon)(JP)[a] MSX JP +3124D9A9C78EFA4E8F0415D19799424D Alibaba and 40 Thieves (1984)(ICM) MSX +15F437B07AE49417512E69C0A3C53BD9 Alibaba and 40 Thieves (1984)(ICM)[a] MSX +FADF6A531358780542A2463E57AC3F0D Alibaba and 40 Thieves (1984)(ICM)[a2] MSX +D3BF725EAC47A825985E3EC5929E0D22 Alibaba and 40 Thieves (1984)(ICM)[a3] MSX +A3281F4D33EBC764E457627B6EBD533D Alien 8 (1985)(Ultimate Play The Game)(GB) MSX GB +2D71CA6A0EE125631020EBD7B2AA791C Alien 8 (1986)(Nippon Dexter)(JP) MSX JP +F3E7F81C0228FDCBB6D55623A8AF6969 Aliens. Alien 2 (1987)(Square)(JP) MSX JP +3DBB75D222DC216C72A8A046E400F2E6 Aliens. Alien 2 (1987)(Square)(JP)[a] MSX JP +FEC81B03474E475329E887E9F37877A5 Aliens. Alien 2 (1987)(Square)(JP)[a2] MSX JP +CAA610054EF09F874DBBDB56DFC067D1 Alpha Roid (1986)(Pony Canyon)(JP) MSX JP +E660010A7C5FDD99305CB3B8F5F7AFA9 Alpha Roid (1986)(Pony Canyon)(JP)[a] MSX JP +E0A2D5AC2EAB2CFE6A37C999F9A827EC Alpha Squadron (1985)(Sony)(JP) MSX JP +1022B950227BEEB54CFB5F0BF24102F1 American Truck (1986)(Telenet Japan)(ES) MSX ES +0A1D92B42302637D885A5EEA06A2792A American Truck (1986)(Telenet Japan)(JP) MSX JP +1C16E3DB3E0618DB8E3B48F346B38866 American Truck (1986)(Telenet Japan)(JP)[a] MSX JP +56BABC13770B5F0E851B1137999047B5 American Truck (1986)(Telenet Japan)(JP)[a2] MSX JP +6095E9F6232AF47B719DFA5FF8B2E82B Anaza. Kaleidoscope Special (1987)(Hot-B)(JP) MSX JP +D6ED8A5592A40F11D15A58DFD54A947F Angelo (1984)(ASCII)(JP) MSX JP +C2E31AAED6D7AE6ADEB7656AC5A20FFD Angelo (1984)(ASCII)(JP)[a] MSX JP +9811A759C1DFA62E721A3DA8F3F78153 Animal Land Murder Case (1987)(Enix)(JP) MSX JP +8A8CBE37E5BD6633FD0E6798D7936A75 Animal Land Murder Case (1987)(Enix)(JP)[a] MSX JP +4B1B0AB36E6DDB1FA317CF43E0A4611A Antarctic Adventure - European Version (1984)(Konami)(JP)[a][RC-701] MSX JP +122526147C3ADA793E0AD233DF408C2C Antarctic Adventure - European Version (1984)(Konami)(JP)[RC-701] MSX JP +B8A921F0F77FC83ACFE6C6F0B9814FA3 Antarctic Adventure - European Version (1984)(Konami)(JP)[SCC][RC-701] MSX JP +2FEF0C223344D31FAB2183C28AD2C062 Antarctic Adventure - European Version (1984)(Konami)(JP)[SCC+][RC-701] MSX JP +97EE96F00FAC07A5D70A3801D8A9805A Antarctic Adventure - Japanese Version (1984)(Konami)(JP)[RC-701] MSX JP +CF623B0847E0DC101CB183D7ADE3CB27 Anty (1984)(Bothtec)(JP) MSX JP +49C243728F19F0E82276D27378726214 Anty (1984)(Bothtec)(JP)[a] MSX JP +0A57575FA460E4E49FE6F460B2953079 Aquapolis SOS (1983)(General)(JP) MSX JP +796881611B3499463CCDBD59DC9F731A Aquattack (1984)(Toshiba-EMI)(JP) MSX JP +AA341DF27BE5CDF8BB5D42EB081B4F63 Aramo (1986)(Xain)(JP) MSX JP +B13FE412F5F3A6B72059FEEF3350C452 Arkanoid (1986)(TAITO)(JP) MSX JP +2F6DC432C81402B838958EEBE82DE801 Arkanoid (1986)(Taito)(JP)[a] MSX JP +9A911C98431BA82AEC9907142AEE3EFF Arkanoid (1986)(Taito)(JP)[a3] MSX JP +635D75FE6D31024DE5CA36AE886C37A1 Arkanoid (1986)(Taito)[a2] MSX +CC80943502FEC02A4F750DFA7D45E3DF Arubatoros. Albatross (1986)(Telenet Japan)(JP) MSX JP +E6FE7DDF8F1B3AB0AD1D7071E3BCFFA5 Arubatoros. Albatross (1986)(Telenet Japan)(JP)[a] MSX JP +4784DF4C2AD12DE2F3C6D8C96FD932BF Astro Marine Corps (1989)(Dinamic Software)(ES) MSX ES +0855944D76448A593AC0C05F645AB257 Athletic Ball. Ghost Flipper (1984)(ASCII)(JP) MSX JP +B8D661BD9CBF59E3A75DBA499F00060C Athletic Land (1984)(Konami)(beta)[RC-700] MSX +71D8E4E09DECC1C6E691D18CC0402CCA Athletic Land (1984)(Konami)(JP)[a][RC-700] MSX JP +2AD5CEA9A2F22CB66B95317BB864E176 Athletic Land (1984)(Konami)(JP)[RC-700] MSX JP +1B267EC91BC535E4F34CDCE66165E8D8 Attack 4 Women Volleyball (1986)(Pax Softonica)(JP) MSX JP +BD46CA36C8380C023BF9D36F4AB2AA0D B.C.'s Quest for Tires (1985)(Toshiba-EMI)(JP) MSX JP +DE0CDD0C1912CAB84AE56480CF7DA38F B.C.'s Quest for Tires (1985)(Toshiba-EMI)(JP)[a] MSX JP +A90F7B4914E36B8EA1359A01D6AAE56E B.C.'s Quest for Tires II - Grog's Revenge (1985)(Comptiq)(JP) MSX JP +F8C9DFCAC1321BEC1C8CE7B7C65B51C6 B.C.'s Quest for Tires II - Grog's Revenge (1985)(Comptiq)(JP)[a] MSX JP +0E1D88688BCA7C7C85CA50F7972E6A1D B.C.'s Quest for Tires II - Grog's Revenge (1986)(Topia)(KR) MSX KR +84A7A3F9E12AE520DC84A4955FA54F37 Back to the Future (1985)(Pony Canyon)(JP) MSX JP +ED4F0D4D8F406525D873A312B872E1A7 Back to the Future (1985)(Pony Canyon)(JP)[a] MSX JP +E2179F0FC46676C63FC312183D3BB712 Backgammon (1984)(Electric Software)(GB) MSX GB +E89D06514855E8A5E2EF9F09624EF260 Backgammon (1985)(Sony)(JP) MSX JP +1D32D26352D70562F351A8FE5B9B9352 Backgammon (1985)(Sony)(JP)[a] MSX JP +E276218C030D9C339D590562CF349B1A Banana (1984)(ASCII)(JP) MSX JP +F68E4AE63D03B5AD0A736231588524F0 Bank Panic (1985)(Pony Canyon)(JP) MSX JP +0242D2EBF0F2E7B8D4D840C13F426C73 Bank Panic (1985)(Pony Canyon)(JP)[a2] MSX JP +58FB5A8F48406F2AFB142A6EA64D929D Batman (1986)(Pack In Video)(JP) MSX JP +D4699360E67662372DF04CD242889C27 Batman (1986)(Pack In Video)(JP)[a] MSX JP +C74E9A3355B49EB2A8F3065881691E99 Batten Tanuki no Daibouken. Raccoon Dog (1986)(Tecno Soft) MSX +E10711878C2E67E33F29E5E82438DF86 Batten Tanuki no Daibouken. Raccoon Dog (1986)(Tecno Soft)[a] MSX +421193175C8B23A32521936EC1B71053 Batten Tanuki no Daibouken. Raccoon Dog (1986)(Tecno Soft)[a2] MSX +916AD37B0EF7DC3A01F5EC52936A52B8 Battle Cross (1984)(Sony)(JP) MSX JP +8891A92DE2734BE03F50E624B555ECFF Battle Ship Clapton II (1984)(T&E Soft)(JP) MSX JP +FA1434664F2E7F27865C80B6EE4BD37B Battle Ship Clapton II (1984)(T&E Soft)(JP)[a] MSX JP +E87647634337F07604076E6C2AD18A82 Beach-Head (1985)(US Gold)(GB) MSX GB +A58DA9AA7FE01503955A567795FDE33E Beamrider (1984)(Pony Canyon)(JP) MSX JP +C0746F391EAC069CC8CA45D44D5E4EF0 Bee & Flower (1983)(Think Soft) MSX +7BA0957C28A33FE31C77549A02914206 Bee & Flower (1983)(Think Soft)[a] MSX +A6C86938D04EE2CAE83ADD54EA44EB9E Bee & Flower (1983)(Think Soft)[a2] MSX +522CA5603D88F9779492BCE2561EE048 Bifamu. Galaxy Drift Motorcycle Femme (1984)(Bandai)(JP) MSX JP +817FC937AD606961DA6637D38430BB3E Binary Land (1984)(Kuma Computers)(GB) MSX GB +530EFDC907D45137A97A9DF917E6D7BD Black Onyx II, The - Search for the Fire Crystal (1986)(ASCII)(JP) MSX JP +8EACC9D87174D02723EC1FFC9680FA67 Black Onyx, The (1985)(ASCII)(JP)(jp) MSX JP +580282BC8E0ED63B2F5A1B72BCC45FC8 Black Onyx, The (1986)(Prosoft)(KR)(jp) MSX KR +5A839DD19D6D0992CA92D79AF65B1961 Blagger (1984)(Alligata Software)(GB) MSX GB +5196CB0411D4E9458F1B5C226E723573 Blagger (1984)(Micro Cabin)(JP)[a] MSX JP +ED154F68AC837D4C393054A7030A5D3D Blagger (1984)(Micro Cabin)(JP)[a2] MSX JP +D790FE070EF6DB6C155EACFD9DCA41E9 Block Hole (1990)(Zemina)(KR) MSX KR +FA3F66390A2ED8D3E4DB6D75DE81B91D Blockade Runner (1984)(Toshiba-EMI)(JP) MSX JP +20A0D82302B2971BE9579F0CE3CE182E Blusy Shop (2005)(MSXnake) MSX +D49A1E7DA3B402F1C26381AEC7F0E257 Boggy '84 (1984)(Nippon Columbia - Colpax - Universal) MSX +ED3620892FB8A70154732FFAC6F0B1EF Boggy '84 (1984)(Nippon Columbia - Colpax - Universal)[a] MSX +0EB9E7BC52517751402094937C903CF8 Boggy '84 (1984)(Nippon Columbia - Colpax - Universal)[a2] MSX +911D6AE84A956DD5051A28A56F925D2A Boing Boing (1985)(Idealogic)(ES) MSX ES +F1AE6A6AB7619BA331F8F83F02914EBE Bokosuka Wars (1984)(ASCII)(JP) MSX JP +641544B0AD077CD28965496C53A2F38A Bokosuka Wars (1984)(ASCII)(JP)[a] MSX JP +9AC872334C01A9B564347113432544D6 Bomb Man (2005)(AGsoftware) MSX +AB3FB38F829D4BF3D47F2DA56A9C1436 Bomber King (1988)(Hudson Soft)(JP) MSX JP +7A277F7AC3FCC30B995CBD672C8FC094 Bomber Man (1983)(Hudson Soft)(JP) MSX JP +0DA84AE4E042C64A0B40D47DD3633E3E Bomber Man (1986)(Korea Soft Bank) MSX +9D2A723C099EC83CA1A354EEF20776B7 Bomber Man (1986)(Korea Soft Bank)[a] MSX +310A80F84FFA24C3B873DF0E6A7168AB Bomber Man Special (1986)(Hudson Soft)(JP) MSX JP +7128F95264554CD8D096F11D7B5D757C Bomber Man. Eric and the Floaters (1985)(Kuma Computers)(GB) MSX GB +628461A03BF67D80A08EA3E097242ACD Boogie Woogi Jungle (1985)(Ample Software)(JP) MSX JP +00C5E4B1ACB6CCCC97ADD5B23F0388B7 Boogie Woogi Jungle (1985)(Ample Software)(JP)[a] MSX JP +BD595C10C45097CC8CEAF0A0A8615106 Boogie Woogi Jungle (1985)(Ample Software)(JP)[a2] MSX JP +51F979CED0EB81ACFC0B03D21DF07503 Boomerang (1984)(ASCII)(JP) MSX JP +3ABE8B3C1EA30E9CA95354B02100721B Boomerang (1984)(ASCII)(JP)[a] MSX JP +9E98015A26D7615DB9DEA90F6D97B4B9 Borfesu. Bolu Fez and Five Evil Spirits (1987)(XTalSoft)(JP) MSX JP +437E2B5013786EBF95F2BC36ED680F27 Bosconian (1984)(Namcot)(JP) MSX JP +BDABFF2B7B3A303A810100FE0B6FB971 Bosconian (1984)(Namcot)(JP)[a] MSX JP +CF6FF5A10589CB4BFB7A181DF45379C9 Bosconian (1984)(Namcot)(JP)[a2] MSX JP +50B6E827957C844345C1F066844295CD Bouken Roman - Dota (1986)(System Soft)(JP) MSX JP +48EF84C090C1F9D1FDF590F9C34C1CFE Bouken Roman - Dota (1986)(System Soft)(JP)[a] MSX JP +CC1AE8F12792C7994656471EA38CE3DE Boulder Dash (1985)(Databyte)(GB) MSX GB +0192133ACE5EFFDF566ADF5F929A4367 Bouncing Block (1988)(Idealogic)(ES)[a][aka Igloo] MSX ES +C0EEF47ADA3A2D204B43B55E9C45C788 Bouncing Block (1988)(Idealogic)(ES)[aka Igloo] MSX ES +B5E6D3F1FB1B3C01415DD71D05104D78 Bousou Tokkyuu SOS. Stop the Express (1985)(Hudson Soft)(JP) MSX JP +4CE9972056A9457903629744B7C0C07B Bousou Tokkyuu SOS. Stop the Express (1985)(Hudson Soft)(JP)[a] MSX JP +D427CD092ABD45D178D56E41E7822679 Brain, The (1983)(ASCII)(JP) MSX JP +EAB747201237EF95C210148A3888A0B1 Break In (1987)(Jaleco)(JP) MSX JP +D0E57136B7DD3569EEEEEB04188EF4ED Break Out (1983)(ASCII)(JP) MSX JP +6AF13CC410872E50046E1BEB99BC10D8 Brother Adventure. Mario Bros (1987)(Zemina)(KR) MSX KR +814B00D855265A42B977371DD04A0F43 Brother Adventure. Mario Bros (1987)(Zemina)(KR)[a] MSX KR +844141F51C9D8BC24D13882257A53300 Bruce Lee (1985)(Comptiq)(JP) MSX JP +B74D9122EB2B0DEB67B17D3523449A88 Burger Time (1986)(Radio Wave Newspaper Publisher)(JP) MSX JP +B9F360926546B28083C00D5FFD5AF292 Buru to Marty Kikiippatsu. Inspecteur Z (1986)(HAL Laboratory)(JP) MSX JP +E0936235730855D17D91B402C047201C Buru to Marty Kikiippatsu. Inspecteur Z (1986)(HAL Laboratory)(JP)[a] MSX JP +55C8DF7F2DDC5E3011310D264980C474 Butamaru Pants. Pig Mock (1983)(HAL Laboratory)(JP) MSX JP +F9F42F856D1818D84AC32DA2C8FAE929 Butamaru Pants. Pig Mock (1983)(HAL Laboratory)(JP)[a] MSX JP +5591580E9B0FCCD4EFC351EF6FFB4DB3 Butamaru Pants. Pig Mock (1983)(HAL Laboratory)(JP)[a2] MSX JP +A46DBB59535BF812574BD8CEF354B491 Cabbage Patch Kids (1984)(Konami)(JP)[a][RC-716] MSX JP +3E73055C7BF05FDEB170647BE0505DB5 Cabbage Patch Kids (1984)(Konami)(JP)[a2][RC-716] MSX JP +12608E48350B5F910123685113860573 Cabbage Patch Kids (1984)(Konami)(JP)[RC-716] MSX JP +75DDCB444DC1139678D0848AE902CD3A Candoo Ninja (1983)(ASCII)(JP) MSX JP +236C97FE58AABB9F19FF699D3E73809B Candoo Ninja (1983)(ASCII)(JP)[a] MSX JP +ED8013ED61F6735D5040BFA0E1E5139B Cannon Ball (1983)(Hudson Soft)(JP) MSX JP +FAB05F70B7E480D9DEE494F65B95AB52 Cannon Ball (1983)(Hudson Soft)(JP)[a] MSX JP +5A9385CA98221ADFD9E6675FEA190EA6 Cannon Ball (1983)(Hudson Soft)(JP)[a2] MSX JP +B40C21385ADAE9176B67CC2B5223894E Cannon Fighter (1984)(Policy)(JP) MSX JP +16D02D09DF5E0D87D7AD188F740D00A7 Captain Chef (1984)(Nippon Columbia - Colpax - Universal) MSX +FD6E245DECC4A7A7D09A888794AB577A Captain Cosmo (1984)(ASCII)(JP) MSX JP +8E28BC85961EC9B6B6765CCBD4FE1997 Captain Cosmo (1984)(ASCII)(JP)[a] MSX JP +AFB607270F33DB1915766B58108C6AF7 Car Fighter (1985)(Casio)(JP) MSX JP +359D2702010C34E4495580BB7E89EE61 Car Jamboree (1984)(Sony)(JP) MSX JP +81658DFD6791B94CA64B253ECD019A2C Car Jamboree (1984)(Sony)(JP)[a] MSX JP +1E0D9875EA6F9DE3DFEDF7ABB3DED5C7 Car Race (1983)(Ample Software)(JP) MSX JP +0EFEF976545353C5EF315FC4DA5502AC Car Race (1983)(Ample Software)(JP)[a] MSX JP +1506F247B2D90E66246D01D508289CA5 Car Race (1983)(Ample Software)(JP)[a2] MSX JP +DB93FA660F66160A63C5944940E4DC03 Casio World Open (1985)(Casio)(JP) MSX JP +A80048433A4863F8D92EF9082CBA7837 Castle Excellent (1986)(ASCII)(JP) MSX JP +0D17CFF46C7D26C08FC65671F8761B40 Castle Excellent (1986)(ASCII)(JP)[a] MSX JP +5AE339850B9EE628A9326C95DCAB040C Castle, The (1986)(ASCII)(JP) MSX JP +015A4F70F73C9D59452B716E2CC0C2D0 Caverns of Titan (2005)(Jose Luis Tur) MSX +AA1A772EC0DA33F7DE6DE68440B6C07B Chack 'n Pop (1984)(TAITO)(JP) MSX JP +615EC47A3030CEC2D880C0DC0EB9E31B Chack 'n Pop (1984)(Taito)[a] MSX +4B8CEF832A46CBBD348FF6D2F432AD89 Challenge Derby (1985)(Pony Canyon)(JP) MSX JP +33C3A00F268F2A99807F08029F18F259 Champion Boulder Dash (1985)(Comptiq)(JP) MSX JP +7164B72A06B210804174630131B718A8 Champion Boxing (1985)(Pony Canyon)(JP) MSX JP +9626A8B01A0D22173F9980B52E9771D4 Champion Ice Hockey (1986)(Pony Canyon)(JP) MSX JP +B100917A059667FAB359D507CA56233E Champion Kendo (1986)(Pony Canyon)(JP) MSX JP +7CF02A10F4645AC6936D5EBFDE194F74 Champion Kendo (1986)(Pony Canyon)(JP)[a] MSX JP +804F81C79DA29544B5EE5FA1AE8A01A7 Champion Pro Wrestling (1985)(Pony Canyon)(JP) MSX JP +3500C4EF753939C05C526E5472DA4223 Champion Pro Wrestling (1985)(Pony Canyon)(JP)[a] MSX JP +05F1FC6912C84DCBF8FC876CCACE426B Champion Pro Wrestling (1985)(Pony Canyon)(JP)[a2] MSX JP +B63B643C4A212F0106F93320E3F8B371 Champion Soccer (1985)(Pony Canyon)(JP) MSX JP +4180CC41BF2EFB3033C2E7EF867CC87E Championship Lode Runner (1985)(Sony)(JP) MSX JP +616D67D1209D9D0E1EA31776022AC572 Cheating Wives (2005)(Crappysoft) MSX +6D6736A701CBA17BCE17DADBA748630A Checkers in Tantan Tanuki (1985)(Pony Canyon)(JP) MSX JP +D7A68BD161BA21E5A0D71E45B12C9812 Chess Game, The (1985)(Al Alamiah)(KW) MSX +6CF190970C510E46F7B1255D2B7FC543 Chess Master (1985)(Philips) MSX +F6CF8B99459EB5293CDCC8FEFC84A71C Chocobo Racing (2004)(HL-Soft) MSX +ED07F46ADA21F018C40D38A746F519BB Choplifter (1985)(Broderbund) MSX +78664709059EDA63EF429DF7CBC3B6A2 Choplifter (1985)(Broderbund)[a] MSX +27121600B9C989885FAE3DCECE2CF07A Choplifter (1985)(Broderbund)[a2] MSX +FB48D5E9CDEA7D080DBCF1702F533642 Choro Q (1984)(TAITO)(JP) MSX JP +976EC4B376F74716E07757370F446013 Choro Q (1984)(Taito)(JP)[a] MSX JP +5995CC6F08FDC9E883ECCE34D1398029 Circus Charlie (1984)(Konami)(JP)[RC-712] MSX JP +8A3339BC88A1D1BF3AEB0B39202B7951 City Connection (1986)(Jaleco)(JP) MSX JP +31B9BAEAC5C300C08899996FC860F930 City Connection (1986)(Jaleco)(JP)[a] MSX JP +2F1B0F586F0DCCC41216406467AEAD3C Classic Minesweeper (2004)(Karoshi)[RKS02] MSX +581CEDC4F31ED1BF447FBB8480DE8560 Classic Pong v0.15 (2004)(Karoshi)[RKS01] MSX +A2D04F11274663356B045F0897B8877E Coaster Race (1986)(Sony)(JP) MSX JP +02C3EDAF887A54669BA3C25480C7EEC0 Coaster Race (1986)(Sony)(JP)[a] MSX JP +F85DEE784FA3210CC470D9273A2D8992 Coaster Race (1986)(Sony)(JP)[a2] MSX JP +51D3E2426907224AB2244315CB05132C Color Ball (1983)(Hudson Soft)(JP) MSX JP +FEFD9CA0AE920A6905C4618713424D98 Color Ball (1983)(Hudson Soft)(JP)[a] MSX JP +3AF0BE2FF76E5587CB776073DB41FA89 Color Ball (1983)(Hudson Soft)(JP)[a2] MSX JP +C922B5EF698059CD4130B0CA6CDE7FEB Color Tochika. Pillbox (1983)(Magic Software)(JP) MSX JP +B302AEA4458DD159D93340AA5EBD10CB Color Tochika. Pillbox (1983)(Magic Software)(JP)[a] MSX JP +9F3A1432A34A25241F9F7705A34FD81A Come On! Picot (1986)(Pony Canyon)(JP) MSX JP +FE66C074FBEA5AC7073B82C4B4500EB3 Comecocos (19xx)(Idealogic)(ES) MSX ES +22416BA63118EF8F1CC14D2BCAF3C56E Comet Tail (1983)(ASCII)(JP) MSX JP +C63F0EA3A8BBB9E41906FCBCE6ED40EB Comic Bakery (1984)(Konami)(JP)[a][RC-714] MSX JP +DF0AF27C7FDA4D2992A12FF1BD287F01 Comic Bakery (1984)(Konami)(JP)[a2][RC-714] MSX JP +6F6EAE0A2AF8353ECC93D69F02085500 Comic Bakery (1984)(Konami)(JP)[RC-714] MSX JP +B6004B5FA3659409795CC4857CC14860 Computer Billiards (1985)(Sony)(JP) MSX JP +FF5123383260E3C9357771FC31CF199F Computer Billiards (1985)(Sony)(JP)[a] MSX JP +9049F90A9C9903AECBB7DD7849686C64 Computer Billiards (1985)(Sony)(JP)[a2] MSX JP +99522573A9F136A4B392241FD0E39266 Computer Billiards (1985)(Sony)(JP)[a3] MSX JP +496D62F19424927657C141B5E3FFA816 Computer Chess (1985)(Sony)(JP) MSX JP +D0EAB12BB1268F381CB4AABAB27C0809 Computer Othello (1984)(Sony)(JP) MSX JP +2140B617656F08DA8393066D44E2CCE1 Computer Othello (1984)(Sony)(JP)[a] MSX JP +FEC149B9AA0B478F1EBE47F3247CAF79 Computer Pachinko (1984)(Sony)(JP) MSX JP +4A92B7AC094B541E932E7A5818614CC9 Computer Wars (2004)(Crappysoft)(ES) MSX ES +383E32BDF8BC95F2AFA55738D700B700 Con-Dori (1983)(Cross Talk)(JP) MSX JP +6B60F17BB655FE258DEC6B966179B07A Con-Dori (1983)(Cross Talk)(JP)[a] MSX JP +115327E682914F4F82E7CA6B2AE8DFFD Con-Dori (1983)(Cross Talk)(JP)[a2] MSX JP +E70CE050B71D6377B2A9A71BCF5C4261 Confused (1986)(Al Alamiah)(KW) MSX +C71F684FD9E3D430BFD3DA7B8077AC6B Cosmic Battle (2005)(Vendetta)(beta) MSX +CA26BBF9D960A99DA1220535209F834A Cosmic Soldier 2 - Psychic War (1987)(Kogado)(JP) MSX JP +7E84C7A98E6380396B97D1A487EB448E Cosmo Explorer (1985)(Sony)(JP) MSX JP +BBF3CC9C6CEB4F84943DCB5C4D6ED4E2 Cosmo Explorer (1985)(Sony)(JP)[a] MSX JP +7B2AFCBFB1747C0FA11D3DB9D09753F2 Courageous Perseus (1985)(Cosmos Computer)(JP) MSX JP +87A95C9055F7C3E030B9D48C8DA8AABF Courageous Perseus (1985)(Cosmos Computer)(JP)[a] MSX JP +E1C1DC9AC4DCEFE4E8F191B1A3DC6B10 Craze (1988)(Heart Soft)(JP) MSX JP +4BFA1379A388C19E90810B064AD351A2 Craze (1988)(Heart Soft)(JP)[a] MSX JP +A6CD4292D7F68036E303BDF9AC1E4265 Crazy Buggy (2005)(Crappysoft) MSX +D43A895CB4222450F01F6E39936CE774 Crazy Bullet (1983)(ASCII)(JP) MSX JP +69CAE7694B271D2C071C8413FD2D42F1 Crazy Bullet (1983)(ASCII)(JP)[a] MSX JP +46ACB233F59CC0117301AD18617B0DEE Crazy Cars (1988)(Titus)(GB) MSX GB +A8D894BA863CED24BC314CA6E7E9E016 Crazy Train (1983)(Sony)(JP) MSX JP +A69C6253D5F94565CA2E355EB7532EE8 Crazy Train (1983)(Sony)(JP)[a] MSX JP +C853D2DFC162E0C0DE883F4502FF0F1F Crazy Train (1983)(Sony)(JP)[a2] MSX JP +35CA518BEE64C9781CAD8B4A3974D10D Crazy Train (1983)(Sony)(JP)[a3] MSX JP +F7BCBF41CFAA37DCCF159B52DFF7BE92 Cross Blaim (1986)(dB-Soft)(JP) MSX JP +3F6CA4AB412A7C5E8CA9DED41C7ECF91 Crusader (1985)(Pony Canyon)(JP) MSX JP +0623769F09E0DEE2A6D81EF52998047B Crusader (1985)(Pony Canyon)(JP)[a] MSX JP +73D601525EFB66DDBD3F0EF46E133A07 Crusader (1985)(Pony Canyon)(JP)[a2] MSX JP +340BA6AE6CC3C4EF8C924BD6966B6670 C-So! (1985)(Pony Canyon)(JP) MSX JP +029DBDAEACE66734FC8D07B2E1F379A5 C-So! (1985)(Pony Canyon)(JP)[a] MSX JP +4876EAF017883717249015770CA881F4 Cure, The (2005)(XL2S Entertainment) MSX +A268A017B074DC92050ACD7571A2401F Daidasso. Great Escape (1985)(Carry Lab)(JP) MSX JP +0B59208A8E7D66EE00FBDAE83D18DCCD Daishogai Keiba. Exciting Jockey (1984)(Casio)(JP) MSX JP +3F6D25FDBAE76B29B417B63C97F80FBA Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP) MSX JP +908C850C61C688F1CAFCEA2F8C0ABEA7 Daiva Story 4 - Asura's Bloodfeud (1987)(T&E Soft)(JP)[a] MSX JP +1DA5BF81CDBF56427F7CC02119DEF044 Dam Busters, The (1985)(Comptiq)(JP) MSX JP +1C5CE09D76D9D51123E9756ED3D7917B Dam Busters, The (1985)(Comptiq)(JP)[a] MSX JP +3A9BF05EDB369300D4576A703A62BB71 Danger X4 (1984)(ASCII)(JP) MSX JP +77739E3D0A583F1FB220B37B0FCCF5D9 Danger X4 (1984)(ASCII)(JP)[a] MSX JP +4AFC591ED124858B6C20526C928CD37C Danger X4 (1984)(ASCII)(JP)[a2] MSX JP +A2B5BB5DE0869E0948165FF010754DFD David II (1984)(ASCII)(JP) MSX JP +63C4C6C984FDE23357F62D19A244D306 Dawn Patrol (1986)(Pony Canyon)(JP) MSX JP +41C933E969597E05E8BB7798250E9E2B D-Day (1984)(Jaleco)(JP) MSX JP +240FFCF657577F24BE1996EEBE1711B1 D-Day (1984)(Jaleco)(JP)[a] MSX JP +F791FDD30DFD64019281AE53E4343BD4 D-Day (1984)(Jaleco)(JP)[a2] MSX JP +7023238B1F392D1A6EB84ABE6D059D85 D-Day (1984)(Jaleco)(JP)[a3] MSX JP +094A5CCE2C38EB66B103B0317C92B65A Decathlon (1984)(Pony Canyon)(JP) MSX JP +42149C1162BB8C6F00AE679D9F52D430 Decathlon (1984)(Pony Canyon)(JP)[a] MSX JP +4010DB3F6E840FB420DA733A151D0E58 Deep Dungeon (1988)(Scaptrust)(JP) MSX JP +44BA30921C8D352683009B62F442DB00 Deep Dungeon II (1988)(Scaptrust)(JP) MSX JP +CFE9BB7E89718D3596BCB9F3451A9FF8 Demon Crystal Saga II - Knither Special (1987)(Radio Wave Newspaper Publisher)(JP) MSX JP +71C5FE1B4DEC31174289CCF54B9FFE86 Demon Crystal, The (1986)(Radio Wave Newspaper Publisher)(JP) MSX JP +E8808BA3E3B47426A674B1C4601CD97A Demonia (1986)(Microids)(GB)(fr) MSX fr GB +D79662571A44DDC6A4F9E2803B6AB554 Devil's Heaven (1984)(General)(JP) MSX JP +77B171D7C068A1B3AD42438D3D4A7354 Dig Dug (1984)(Namcot)(JP) MSX JP +C0CBFD77FF3CABB9CF44ED53BF0ED14B Dig Dug (1984)(Namcot)(JP)[a] MSX JP +A8BD6F979FAA15284955142AE2DF0BD2 Dip Dip (1985)(Indescomp)(ES) MSX ES +15F5F13185A90B1497867E14318150FE Doki Doki Penguin Land (1985)(Pony Canyon)(JP) MSX JP +02D42DEC8E6F73B08D3CA9B2DC24EFB6 Doki Doki Penguin Land (1985)(Pony Canyon)(JP)[a] MSX JP +50435CE4BB1373F57C903D85BC3C7986 Door Door Mk2 (1985)(Enix) MSX +F6E96AC27933C8066FC69BBDDD81D6E2 Dorodon (1984)(Sony)(JP) MSX JP +F9403BC268CD7CADD1B8EBCBD97568C8 Dragon Attack (1983)(HAL Laboratory)(JP) MSX JP +4905A90DBB014D941E133A0DADD48D00 Dragon Attack (1983)(HAL Laboratory)(JP)[a] MSX JP +67FC0F5AD04DA75A16E8A2CD5F1451AC Dragon Quest (1986)(Enix)(JP) MSX JP +A05839977FACCD697C4F5C93CCD3C005 Dragon Quest (1986)(Enix)(JP)[a] MSX JP +24E032267E25C5DE56D988F07B973F7F Dragon Quest II (1988)(Enix)(JP) MSX JP +A6FDC63C228C505425A8D05DDF0EFBD5 Dragon Quest II (1988)(Enix)(JP)[a] MSX JP +8BFB3CC95C950083342C20B0B0193893 Dragon Quest II (1988)(Enix)(JP)[a2] MSX JP +B1218CC7F604CB1ABED7C7BE4F057EBB Dragon Slayer (1985)(Square)(JP) MSX JP +368BCF39CE5FB246F24FD58C8655F017 Dragon Slayer 2 - Xanadu (1987)(Falcom)(JP) MSX JP +03E7119173912F9444CB96ED58BA4957 Dragon Slayer 2 - Xanadu (1987)(Zemina)(KR) MSX KR +A79B39EB8308B292CDD5EE2EB2FCCC0D Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP) MSX JP +4E0428536041219C7C4A58856E10E9D5 Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP) MSX JP +2793DC76B379F3BF8F0059415D7848E5 Drainer (1987)(Victor)(JP) MSX JP +79127654AE5B14F3F09C73F3702FC43C Driller Tanks (1984)(Hudson Soft)(JP) MSX JP +54CA0E7965DCB7D74CAC44714818E6C1 Driller Tanks (1984)(Hudson Soft)(JP)[a] MSX JP +9A1D605CDC945454D7A78FE41979D83A Drink It! (2006)(Crappysoft) MSX +02B361E630E09859F09310AD00C62BF3 Duck Hunt (2004)(Karoshi)[RK703][gunstick] MSX +8DD86DF557313164D5F50F134843069F Dungeon Hunter (1989)(ASCII)(JP) MSX JP +E9EE344FA47388CC33F74F36BBFD56C6 Dungeon Master (1986)(ASCII)(JP) MSX JP +167F1D9FF7D743BFC774B6162129C055 Dunk Shot (1986)(HAL Laboratory)(JP) MSX JP +D440664792946C7D9C4E6489C04B3D4F Dunk Shot (1986)(HAL Laboratory)(JP)[a] MSX JP +3003C07E1D01EA63F8A7BF6ECF2CDB4D Dustin (1987)(Dinamic Software)(ES) MSX ES +92C65A326270B3BAA0478959F91B7ED6 Dynamite Bowl (1988)(Toshiba-EMI)(JP) MSX JP +AF986C1F68FBAC987C72AB759E1D55F3 E.I. - Exa Innova (1984)(Sony)(JP) MSX JP +A691A81C0EBEAA439D649D1488EB3A12 E.I. - Exa Innova (1984)(Sony)(JP)[a] MSX JP +DE791775915FA550AAFCAA05A8110831 Eagle Fighter (1985)(Casio)(JP) MSX JP +E7D23F58B964D3B4DDF85D130F5AF0C6 Eagle Fighter (1985)(Casio)(JP)[a] MSX JP +F94D3A0D3A3D120370E338F95B48C363 Eat Blue! 2004 (2004)(Paxanga Soft) MSX +3E6C060EE4426A94BEA154F661E1FE2E Eat Blue! 2004 v2 (2004)(Paxanga Soft) MSX +1214BDFB319DA16A7E9A7EB646238005 Eggerland Mystery (1985)(HAL Laboratory)(JP) MSX JP +886B6A075CC986B6CE8C9C315B0384AF Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP) MSX JP +ACDF6CAF45F51F7ADE125C34BEE747DB Eggerland Mystery 2. Meikyushinwa. Labyrinth Myth (1986)(HAL Laboratory)(JP)[a] MSX JP +4ECECCA3E5358198C39747D08D3E5F66 Elevator Action (1985)(Nidecom)(JP) MSX JP +C3EE55F1AC8E844B7F599401CAD2D047 Erika (1987)(Jast)(JP) MSX JP +702E8CB880A60132C3ACE8FD21BA9560 Exchanger (1983)(ASCII)(JP) MSX JP +20F73611970EFDB8408D24D6C1D03FDA Exchanger (1983)(ASCII)(JP)[a] MSX JP +165E08772153F210DD5080E06B27BFA6 Exerion (1984)(Jaleco)(JP) MSX JP +CDF09DCCB0D3B83FF0A5917207AED728 Exerion (1984)(Jaleco)(JP)[a] MSX JP +2A8F52021A49D05616A45992F111CD6A Exerion (1984)(Jaleco)(JP)[a2] MSX JP +B78A12462D37679779FDE4F610A817F8 Exerion (1984)(Uranio)(IT) MSX IT +C87926EC309B7B5F99F081D8D7C031A9 Exerion II - Zorni (1984)(Jaleco)(JP) MSX JP +E8519FC1F9A4AF0115A8ABB450B32BD6 Exerion II - Zorni (1984)(Jaleco)(JP)[a] MSX JP +985081B984B6C6D4A83949509B9260B7 Exoide-Z (1986)(Casio)(JP) MSX JP +67EECAE6CBB4A1FBB5F6F549DD614C1D Exoide-Z (1986)(Casio)(JP)[a] MSX JP +1BB9D2437C2304088D36EBBC655FE2C1 Exoide-Z (1986)(Casio)(JP)[a2] MSX JP +1C7C29B7F4527BBA7160641616FCB6A3 Exoide-Z Area 5 (1986)(Casio)(JP) MSX JP +603D4C819A51D0C20FF9FA9F902D3FFD F-1 Spirit - The Way to Formula 1 (1987)(Konami)(JP)[a][RC-752] MSX JP +910CC3718C00C9AF6A808E277F0E7586 F-1 Spirit - The Way to Formula 1 (1987)(Konami)(JP)[RC-752] MSX JP +298CCA1F79A4494C41CFB9EB1E586A50 F-1 Spirit - The Way to Formula 1 (1987)(Konami)(JP)[SCC][RC-752] MSX JP +FCF0F1CA4AB651512E27BAA397AE774F F-1 Spirit - The Way to Formula 1 (1987)(Zemina)(KR)[RC-752] MSX KR +C7C38266C0778D3E3669CD3A8DE313FE F16 Fighting Falcon (1985)(ASCII)(JP) MSX JP +9926D3629D71A880FAF8BD14F6488288 Fa Tetris (1989)(Fa Soft)(KR) MSX KR +DF328B3806F98F0045253C50C21A9B33 Factory Infection (2004)(Karoshi)[RK705] MSX +137210CD4B18CF23B6801FFCCFEF384B Fairy (1985)(ASCII)(JP) MSX JP +C4751C8B79083A88803A41CEF9AAE459 Fairyland Story, The (1987)(Hot-B)(JP) MSX JP +87087F0E02A68996C2C9F3BABFC439AD Fairyland Story, The (1987)(Hot-B)(JP)[a] MSX JP +CC9C7DFCF2331DE6B5EFFC67BA873503 Fairyland Story, The (1987)(Hot-B)(JP)[a2] MSX JP +27B5D76F266E5A480B68ECB866ADF0D3 Fantasy Zone (1986)(Pony Canyon)(JP) MSX JP +D093730F86608542D6BB8DC0119185D4 Fantasy Zone (1987)(Zemina)(KR) MSX KR +FA08CB479EB8583BDA197F33D2BFE389 Final Justice (1985)(Pony Canyon)(JP) MSX JP +3941897F18ADCDBF9FD41BCE79B65DAA Final Justice (1985)(Pony Canyon)(JP)[a] MSX JP +A2199BC0FAA46AABD3B588D624E7C443 Final Justice (1985)(Pony Canyon)(JP)[a2] MSX JP +1AE71FCAFE599DFB0A552E2E2C866BC4 Final Mahjong (1983)(MIA)(JP) MSX JP +7320BFE382401088813EF3936CFB8E23 Final Zone Wolf (1986)(Telenet Japan)(JP) MSX JP +5CB83FEBDE2E0A2973D055DD02912B05 Final Zone Wolf (1986)(Zemina)(KR) MSX KR +DE4DADEEA372B1883FECD5365B40A87C Fire Rescue (1984)(Hudson Soft)(JP) MSX JP +042291EA5B22AB193F1EF7E60AB98FA7 Fire Rescue (1984)(Hudson Soft)(JP)[a] MSX JP +131E6B5F20160C9903B580A3B41BE2EE Flappy Limited (1985)(dB-Soft)(JP) MSX JP +B4398263F3FD64715537028ACC491C00 Flappy Limited (1985)(dB-Soft)(JP)[a] MSX JP +E29F65233B000520F5481517E0027E41 Flappy Limited 85 (1985)(dB-Soft)(JP) MSX JP +6A1DEE46A182E896696C2E8F4C5CA9C1 Flash Splash (1984)(Toshiba-EMI)(JP) MSX JP +C6BD4C8B1957FCC90CA11157309903AF Flashpoint (1990)(Zemina)(KR) MSX KR +BDBEE6D2575E0E30027D6CCCE6ADD7D7 Flashpoint (1990)(Zemina)(KR)[a] MSX KR +A892A61A27E35D5D72B89FBFD77D0C11 Flicky (1985)(Micronet)(JP) MSX JP +C3EB3D6FCDD41898D6B5515F122B413E Flics, Les (1985)(PSS)(GB) MSX GB +403B903B49C30769DFE8E5D9205B68C4 Flight Deck II (1986)(Pony Canyon)(JP) MSX JP +00DC00046FE00258D2F901DEAF00AECB Flight Deck II (1986)(Pony Canyon)(JP)[a] MSX JP +2028E2CED4A1157552BAE0D4043774D3 Flight Simulator (1986)(subLOGIC)(JP) MSX JP +DFB14DF7CCC7B8B3837A1AEE1BC5E669 Flight Simulator (1986)(subLOGIC)(JP)[a] MSX JP +2E8670CA8D9BEBA115334E00283C4EA5 Flipper Slipper (1984)(ASCII)(JP) MSX JP +CC2E6B180DF7B928E7CBEB6B514B18B6 Flipper Slipper (1984)(ASCII)(JP)[a] MSX JP +569E2610A8094789A83C708495BCB995 Formation Z (1985)(Nippon Dexter)(JP) MSX JP +9ADD9B8B02369B48A507494DF5C7303E Formation Z (1985)(Nippon Dexter)(JP)[a] MSX JP +ACB2CEA4C65FFC93B27DCDFD525A6731 Frogger (1983)(Konami)(JP)[a][RC-704] MSX JP +4DAF350513798227186C3454BB396114 Frogger (1983)(Konami)(JP)[RC-704] MSX JP +845EA332500757B86912F513B8F6F49A Frontline (1984)(TAITO)(JP) MSX JP +0C81629EEBF187779EEBDA248A956C40 Frontline (1984)(Taito)(JP)[a] MSX JP +5EA44C3480D577DE238EDDCD7B2C6B91 Frontline (1984)(Taito)(JP)[a2] MSX JP +1232FC0A6E9D276A2F5B0A5DB0CBEBC1 Fruit Panic (1984)(Pony Canyon)(JP) MSX JP +85A84DFE95CA2966E77EBD7F24CEBB78 Fruit Search (1983)(HAL Laboratory)(JP) MSX JP +4EDECDD9F495A690333BFBF06BCDE944 Fruit Search (1983)(HAL Laboratory)(JP)[a] MSX JP +0982842B41AC13B03B574B41B46B7DE0 Funky Mouse (1984)(ASCII)(JP) MSX JP +95D97E535A679C6A2E62743B5600EF66 Futbol (1985)(Indescomp)(ES) MSX ES +CDACEDB676F2AB537BEEA78A4C1F742A G.P. World (1985)(Pony Canyon)(JP) MSX JP +83A311F703C75347A5A3DF0E9FF2B7E7 Galaga (1984)(Namcot)(JP) MSX JP +09BE689678E35041419AE28CF2913F04 Galaga (1984)(Namcot)(JP)[a] MSX JP +AD242A3199771CD5EE35EA5CDD5276B5 Galaga (1984)(Namcot)(JP)[a2] MSX JP +117C0F6C294C73AF928443A504850994 Galaga (1984)(Namcot)(JP)[a3] MSX JP +08165F2FEC4CD6ACAF7FBE0BF49303EA Galaxian (1984)(Namcot)(JP) MSX JP +C94D5F115F27250148677E4495C973C3 Galaxian (1984)(Namcot)(JP)[a] MSX JP +7B12ABA02CCEAE5E3A05CE9F0CA9ACF3 Galaxian (1984)(Namcot)(JP)[a2] MSX JP +78DC3B798F7C6D47976E42604971BC42 Galaxian (1984)(Namcot)(JP)[o2] MSX JP +E83B59597E53FFB1C424469488A9210C Gall Force - Defense of Chaos (1986)(Sony)(JP) MSX JP +7A8147F1A5B886A63A09A3A31DAA9E49 Gall Force - Defense of Chaos (1986)(Sony)(JP)[a] MSX JP +C5FA1C8C6676FAA382DB530EEAB349B6 Gall Force - Defense of Chaos (1986)(Sony)(JP)[a2] MSX JP +1E248329A15A995969958A138FB25038 Gambler Jikichushinpa (1988)(Game Arts)(JP) MSX JP +6156187523E00A072F0F9500E5111624 Game Land (1984)(Casio)(JP) MSX JP +79AF27B8292CE59123F7D8AC64CCA55C Gang Master (1983)(ASCII)(JP) MSX JP +702CDC13D4050B011BF4339E64708F5F Genghis Khan (1986)(Koei)(JP) MSX JP +006F1A686F2904762D57E71FDA555613 Ghostbusters (1985)(Pony Canyon)(JP) MSX JP +AC2E61850414F7B528C8753A3D804394 Glider (1985)(ASCII)(JP) MSX JP +A9E41CB3920EC0CE6348325C638A19AD Glider (1985)(ASCII)(JP)[a] MSX JP +EC1A568F12FA3303804216F35E1CD841 Gniffel v2 (2004)(Dioniso) MSX +DC31287CED6E601EA7FDF2AF9759C58F Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[a][RC-764] MSX JP +FF9FEDE25893DC32F6A7DB275173B2B9 Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[a2][RC-764] MSX JP +55C020211EDCFC4C5A5D66BDD48F7D16 Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[RC-764] MSX JP +AAA5EB619E90C1A3D1C2F5714BCCC0EA Gofer no Yabou Episode II. Nemesis 3 - The Eve of Destruction (1988)(Konami)(JP)[SCC][RC-764] MSX JP +B56500EBB55C2E5FB20DE542EF739D5B Gokiburi Daisakusen. Bug Bomb (1983)(Magic Software)(JP) MSX JP +277B93F5F1A7EF399479FFDF98844922 Golf Game (1983)(ASCII)(JP) MSX JP +AE65C3CEB17FD6187AAD36DCFB3B9858 Golf Kyou. Hudson 3D Golf. Golf Crazy (1984)(Hudson Soft)(JP) MSX JP +3A0CA365D2E9446DEFC3DAD2B5483BBD Golf Kyou. Hudson 3D Golf. Golf Crazy (1984)(Hudson Soft)(JP)[a] MSX JP +4A8C2CDDAF5561D8747E056442B2BEEE Golgo 13 - Okami no Su (1986)(Pony Canyon)(JP) MSX JP +A37CF005C8E8479FD9533065A1F33967 Golvellius (1987)(Compile) MSX +AB0FE259831647DA8F6E8DCF24FB0B45 Golvellius (1987)(Compile)(JP)[a] MSX JP +BBA195151FC2247A00D92E9BF5E51A79 Gomoku Narabe - Omo Go (1984)(Toshiba-EMI)(JP) MSX JP +3FCB5FF74698E75F7782183E94C54DEE Gomoku Narabe - Omo Go (1984)(Toshiba-EMI)(JP)[a] MSX JP +E25E87AECC04F4E5047B9AF12135CDE1 Goonies, The (1986)(Konami)(JP)[a][RC-734] MSX JP +24A6D9CFA9E38E120678A538663E8AD2 Goonies, The (1986)(Konami)(JP)[a2][RC-734] MSX JP +518B1DDCF77E38E9F1370F94B41875C4 Goonies, The (1986)(Konami)(JP)[RC-734] MSX JP +8A7C8149F1F3B7A5FC93CD66A7FB2AD5 Gozira 3D. Godzilla vs 3 Major Monsters (1984)(Bandai)(JP) MSX JP +4724699F410FA266A6BCB223EE8C99FC Gozira Kun. Godzilla (1985)(Toho)(JP) MSX JP +B197C822F012647A5C30EEA2BA009FC5 Gozira Kun. Godzilla (1985)(Toho)(JP)[a] MSX JP +FF98B021526417A0422DF2A1D7E9ECDF Gradius 2. Nemesis 2 (1987)(Konami)(beta)[a][RC-751] MSX +76D211421642FE6CFCD56AF525B0D877 Gradius 2. Nemesis 2 (1987)(Konami)(beta)[RC-751] MSX +ABBCFC00F71051434E0E82E29B6EA1EF Gradius 2. Nemesis 2 (1987)(Konami)(JP)[a][RC-751] MSX JP +648E923715E4B54CBECE186F098E0956 Gradius 2. Nemesis 2 (1987)(Konami)(JP)[penguin version][RC-751] MSX JP +EE3E6A50E3DE131D217E5DAB55519011 Gradius 2. Nemesis 2 (1987)(Konami)(JP)[RC-751] MSX JP +C1EAEAF5F0B432D2C6A53735B6F53B6D Gradius 2. Nemesis 2 (1987)(Konami)(JP)[SCC][RC-751] MSX JP +797016FDBF2B23138C543FEE5C8CC34B Gradius. Nemesis (1986)(Konami)(JP)[a][RC-742] MSX JP +1D19E90B3DF492F0F1956747279FBBAC Gradius. Nemesis (1986)(Konami)(JP)[a][SCC][RC-742] MSX JP +25C0349164616A7540FAA04DCC90237A Gradius. Nemesis (1986)(Konami)(JP)[SCC][RC-742] MSX JP +CD78EBEB472FD24AC0F569D262BB2BD4 Gradius. Nemesis (1986)(Konami)(JP)[SCC+][RC-742] MSX JP +697F6A318B187510655A28F3A0FE698D Green Beret (1986)(Konami)(JP) MSX JP +F0653353E486843B0C827746E0CFA078 Green Beret (1986)(Konami)(JP)[a] MSX JP +19C599289767DB875F21B6165A1DF0CF Green Beret (1987)(Zemina)(KR) MSX KR +8B89872B9BF500DCD0716BE780B94A63 Griel's Quest for the Sangraal (2005)(Karoshi)[a][RK709] MSX +A02EE1D95223091749CE400C768B2159 Griel's Quest for the Sangraal (2005)(Karoshi)[RK709] MSX +213477F5CEC0A668DD78E8C03452FDD6 Griel's Quest for the Sangraal EX (2005)(Karoshi)[a][RK709EX] MSX +767BE00C25DD3617B8EEC069DD49D784 Griel's Quest for the Sangraal EX (2005)(Karoshi)[RK709EX] MSX +CE1F65F3E0CBAC542FD00D98A443339F Guardic (1986)(Compile) MSX +9E21B956D02CDF275BAA501837ACA094 Guardic (1986)(Compile)(JP)[a] MSX JP +3D4C39117898C3406A2297CA2C7D3253 Gulkave (1986)(Pony Canyon)(JP) MSX JP +4DB871206AAC5E6BBC11B2719355DF22 Gulkave (1986)(Pony Canyon)(JP)[a] MSX JP +862E4A94AB67BE5DFC3B9667647E3BD3 Gulkave (1986)(Pony Canyon)(JP)[a2] MSX JP +C980274ACB56219033C8BB6431DF8C42 Gunfright (1986)(Nippon Dexter)(JP) MSX JP +DA87792D8321E1C364B3D67E083F3EFF Gunfright (1986)(Ultimate Play The Game)(GB) MSX GB +E2D53D146BF8BECD62DBD5F910632DFB Gunjin Shougi Mars (1986)(Toshiba-EMI)(JP) MSX JP +E86777336EF6B1E02182C5B45FCA7AAF Guru Logic (2003)(Karoshi)[RK701] MSX +7FE07A76E5ABA51F25EC2B2BE85C6246 Gyro Adventure (1984)(Nippon Columbia - Colpax - Universal)(JP)[Martos] MSX JP +99E8E6260B5B42069B64E281209A1143 Gyrodine (1986)(TAITO)(JP) MSX JP +E71C92C88C654685D298752A0199AAAB Hadesu no Monshou. The Seal of Hades (1986)(Casio)(JP) MSX JP +DE05BCAEFE28DEA107F7467D8FA3A2F0 Hadesu no Monshou. The Seal of Hades (1986)(Casio)(JP)[a] MSX JP +6D4DEFE4EBF20968C5EA2FC843736B75 Haja no Fuin (1987)(Kogado)(JP) MSX JP +9ED14F5BFE1BD83D2A82C93DEBBAE959 Hanafuda (1984)(Toshiba-EMI)(JP) MSX JP +6CBFEBD9AC448ED19A5C8DA61E634E15 Hanafuda Koi Koi - Gostop Godori (1984)(ASCII)(JP) MSX JP +014D351DB47D5BEABDE8851BDCC94A0E Hang-On (1986)(Pony Canyon)(JP) MSX JP +262AFF738452EB2B62E1881BF23DBD4B Hang-On (1986)(Pony Canyon)(JP)[a] MSX JP +8ED0C9F88FDC84B877451C1B528ABAE3 Hang-On (1986)(Pony Canyon)(JP)[a2] MSX JP +6706AEFE8C4C247590EAADFC9677EE36 Happy Fret (1985)(Micro Cabin)(JP) MSX JP +7C364B9C215D6DDC49262F5EF0E2742E Harapeko Pakkun (1984)(ASCII)(JP) MSX JP +164CFDB577F0C976BFB30956761CBA1C Harry Fox MSX Special (1986)(Micro Cabin)(JP) MSX JP +4A9FCB047E8D56241F1104DB1260AD13 Harry Fox Yki no Maoh (1985)(Micro Cabin)(JP) MSX JP +ECD6A109C73D2C90DD1828F551009C3E Hayabusa. Moonsweeper (1985)(Toshiba-EMI)(JP) MSX JP +87FAA2B74F98F753687686F761CDD860 Head over Heels (1987)(Ocean Software)(GB) MSX GB +9C131FB9742940FB19F65992CB190BBF Heavy Boxing (1983)(HAL Laboratory)(JP) MSX JP +483A80DAA6374E0ABE2467EF01593093 Heavy Boxing (1983)(HAL Laboratory)(JP)[a] MSX JP +00C9363913697332A6797BA2E2A2DD9F Heist, The (1985)(Comptiq)(JP) MSX JP +F5D051EC82B155864A7BB12456FE01EC Heist, The (1985)(Comptiq)(JP)[a] MSX JP +905D9C68751745E0412875020EDB1F37 Heli Tank (1984)(ASCII)(JP) MSX JP +552E7CCF6514B49BDF5A3E70FE0BC688 High Way Star (1984)(ASCII)(JP) MSX JP +00677667FCA3DD010477F4CCE31D611B High Way Star (1984)(Qnix) MSX +8272EEF7C3E3B5E6BACD5656651A1E22 Hisha (1985)(Micro Cabin)(JP) MSX JP +4A74A4B7F27E50C03F635556C58E6F81 Hitsuji Yai. Pretty Sheep (1984)(Hudson Soft)(JP) MSX JP +D359766A67B048685FF297D415720F2A Hitsuji Yai. Pretty Sheep (1984)(Hudson Soft)(JP)[a] MSX JP +9EC76EF0FF9B1F3B948A8BB0ECA88A19 Hole in One (1984)(HAL Laboratory)(JP) MSX JP +C786B6FE4D57EC4D74EB1BAA2C71873E Hole in One (1984)(HAL Laboratory)(JP)[a] MSX JP +27C969ED0E07CD33288974B977AB09CC Hole in One (1984)(HAL Laboratory)(JP)[a2] MSX JP +361BC72571B9EB44E74EA97C963F116F Hole in One (1984)(HAL Laboratory)(JP)[a3] MSX JP +3D73EE9D147FFBA2F62AEF4259121A97 Hole in One Professional (1986)(HAL Laboratory)(JP) MSX JP +B106F5A35ED5D8803B2858A053788AA4 Hole in One Professional (1986)(HAL Laboratory)(JP)[a] MSX JP +388919B63C03572AC6786CC97704A22B Hopper (1986)(Al Alamiah)(KW) MSX +F5D8EDDCBCE4F47E0F7C3EFD540CC131 Hustle Chumy (1983)(General)(JP) MSX JP +5B746084672688B835BB0B29BF807D6F Hustle Chumy (1983)(General)(JP)[a] MSX JP +0C7C6F7E2316F6DCCCE75FA497A2690F Hydlide (1985)(T&E Soft)(JP) MSX JP +35E314E2976D37FAFE2D5BE15C9C3611 Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP) MSX JP +784A031211E9D55F9B1B323E3C2254AF Hydlide II - Shine of Darkness (1986)(T&E Soft)(JP)[a] MSX JP +45DFA17E171BE705AC724B5C9DD41704 Hydlide III - The Space Memories (1987)(T&E Soft)(JP) MSX JP +511018104F7F51CE81A45651930F4C3F Hydlide III - The Space Memories (1987)(Zemina)(KR) MSX KR +5352404E1434C53266169A2BE3DB0866 Hyper Olympic 1 (1984)(Konami)(JP)[RC-710] MSX JP +77F023FCB66181850AA2F62BD24325D8 Hyper Olympic 2 (1984)(Konami)(JP)[RC-711] MSX JP +D302BA993F34A093E64829A8C60A7993 Hyper Rally (1985)(Konami)(JP)[a][RC-718] MSX JP +D7BB9E5695E7D80BFDBD8136C392EA8C Hyper Rally (1985)(Konami)(JP)[a][SCC+][RC-718] MSX JP +352EF9AEC5E2D38C4A2604F9C97E880F Hyper Rally (1985)(Konami)(JP)[a2][RC-718] MSX JP +924B32297D0F3D94E0282BB0968CFF1C Hyper Rally (1985)(Konami)(JP)[a3][RC-718] MSX JP +888D019ADE6429B9BD955DB456187C8A Hyper Rally (1985)(Konami)(JP)[RC-718] MSX JP +A056558ED6878F6C95A411990754F56C Hyper Rally (1985)(Konami)(JP)[SCC+][RC-718] MSX JP +B870891550234B6ADA5D876F88C57B6F Hyper Sports 1 (1984)(Konami)(JP)[a][RC-715] MSX JP +DE40A94E4FBBD653379B78B62C417608 Hyper Sports 1 (1984)(Konami)(JP)[RC-715] MSX JP +EE74322B9491B521160D9F9D46E10E31 Hyper Sports 2 (1984)(Konami)(JP)[a][SCC+][RC-717] MSX JP +665E6C909788650BB0187A8D7DDDED80 Hyper Sports 2 (1984)(Konami)(JP)[RC-717] MSX JP +48B5ECDA8DA4C798AF4EB302E8A7AB7A Hyper Sports 2 (1984)(Konami)(JP)[SCC][RC-717] MSX JP +A9A407E72DE9041CBCBE2E3D388BC51C Hyper Sports 2 (1984)(Konami)(JP)[SCC+][RC-717] MSX JP +95B5B6DF69509694D92238CF5AF366F9 Hyper Sports 3 (1985)(Konami)(JP)[a][RC-733] MSX JP +01A2C85070D987A1B83F591E83B5BCFE Hyper Sports 3 (1985)(Konami)(JP)[a2][RC-733] MSX JP +88E29E9C1D5AD3CA4F2B8C65ACB04C43 Hyper Sports 3 (1985)(Konami)(JP)[RC-733] MSX JP +849FE2E7103C6185970A2B161AE4BFDB Ice World (1985)(Casio)(JP) MSX JP +0EF0F6936855BB39B42B1AFAC0C52C71 Iga Ninpouten 2. Small Ninja 2 - The Mooncastle (1986)(Casio)(JP) MSX JP +27F1765968E11BAFACDE1205EDB7885A Iga Ninpouten. Small Ninja (1985)(Casio)(JP) MSX JP +3939BEBD01324A75F3912289B3AC2404 Iligks Episode I - Theseus (1984)(ASCII)(JP) MSX JP +B808FE1910C3346D95B098692889F222 Iligks Episode I - Theseus (1984)(ASCII)(JP)[a] MSX JP +624BF5A7292944496E825014590FB5CB Iligks Episode IV - The Maze of Illegus (1984)(ASCII)(JP) MSX JP +B4571F90A52854C579A33FC5998F88DA Iligks Episode IV - The Maze of Illegus (1984)(ASCII)(JP)[a] MSX JP +1C54DE46A5BB1FCEADD60D5D63035055 Indian no Bouken. Indian's Adventure (1984)(Hudson Soft)(JP) MSX JP +8AEDC43B85BBC6A20A4742EB8EAE22A3 Issunhoushi no Donnamondai. Little Samurai (1987)(Casio)(JP) MSX JP +40C7CD9563B90EBCF6D42B1D396A7974 Issunhoushi no Donnamondai. Little Samurai (1987)(Casio)(JP)[a] MSX JP +5F4A638B669F1E273017FB23E2581A6F J.P. Winkle (1986)(MSX Magazine)(JP) MSX JP +D0C96D2790DC3FB78278C31A8D79F292 J.P. Winkle (1986)(MSX Magazine)(JP)[a] MSX JP +EA9BA10BA1197BA0EDA87A76098301DC Jagur (1987)(Hudson Soft)(JP) MSX JP +9048E758150EE26D91AF2D51D1502071 Jagur (1987)(Hudson Soft)(JP)[a] MSX JP +B9486302BB42747A3F847DF144D63FD3 Jagur (1987)(Hudson Soft)(JP)[a2] MSX JP +D296D37D4FCD007D6D4F214F4CAFF3EC Jagur (1987)(Hudson Soft)(JP)[a3] MSX JP +95449C74AA6F968C609EC46E5D95F716 Janka (1985)(ASCII)(JP) MSX JP +45FC6994D275524482F28696824B0D96 Janyu Mahjong (1987)(Tecno Soft)(JP) MSX JP +DE9A0789AE69FF3C54B94F0BA374722D Jet Bomber (1985)(Al Alamiah)(KW) MSX +1DB0A91BEAA256B00CBF9540511E04B4 Jet Set Willy (1985)(Hudson Soft)(JP)(en) MSX en JP +F26E7FB9B97A3FEE63483985921F4495 Jet Set Willy (1985)(Software Projects)(GB) MSX GB +94233A7CEDFF37B82069E687B197A248 Jigsaw Set (1983)(MIA)(JP) MSX JP +3132CDEF39CDD9889B9603D1E8E57224 Jissen - 4-nin Mahjong. Four Battle Mahjong (1984)(Sony)(JP) MSX JP +E64F0823048093864B905796FC074AD2 Jump (1985)(ASCII)(JP) MSX JP +467B9EF1F35187BAB918BE84EAF98BAE Jump Coaster (1984)(Nippon Columbia - Colpax - Universal) MSX +993FAA9E0DB9D9995B6B32CF7CE3CE08 Jump Coaster (1984)(Nippon Columbia - Colpax - Universal)[o2] MSX +28131817D965FCB9037BA3CDA31F320D Jump Land (1985)(Nippon Columbia - Colpax - Universal) MSX +05769D26EFC7C988220859D2BF9B4A9C Jumping Rabbit (1984)(MIA)(JP) MSX JP +11B98B059D713FE4152D030EC46965B8 Juno First (1983)(Sony)(JP) MSX JP +823B00451A33B68152AF9943CC6AB025 Juno First (1983)(Sony)(JP)[a] MSX JP +98D3720DC7AB5F2C4BC4C2A0DCAAA4D4 Juno First (1983)(Sony)(JP)[o2] MSX JP +8DA447C1B6A85B0A6D68185DC8A8EAD1 Juno First (1983)(Sony)(JP)[o3] MSX JP +1EBB3629249282AD170DA852E2251932 Jyankyo (1984)(Hudson Soft)(JP) MSX JP +8E59C543F38BF4CA3986E7117D68F87D Kage no Densetsu. Legend of Kage (1986)(TAITO)(JP) MSX JP +4C4721BE8DCF66678B2258A9A722B6D4 Kage no Densetsu. Legend of Kage (1986)(Taito)(JP)[a] MSX JP +95D08A2B399D8E5974FF4A15BE09182F Karamaru (1984)(HAL Laboratory)(JP) MSX JP +762AF9D1FC7CE79EAC231C7C858DA568 Karuizawa Kidnapping Guidance, The (1986)(Enix)(JP) MSX JP +C7694EC0996EBCD6A850BE7064E48753 Keiba. The Horse Race (1986)(Champion Soft)(JP) MSX JP +C5B05F12E6C3BFE8F8391E949508EFF7 Kenja no Ishi. The Stone of Wisdom (1986)(Casio)(JP) MSX JP +D5B40B5104B999CFC88B9C904410D1C2 Keystone Kapers (1984)(Pony Canyon)(JP) MSX JP +3603D0BD610E6E42BBDE4617A2CC9DE3 Keystone Kapers (1984)(Pony Canyon)(JP)[a] MSX JP +D31C47FE1203347C802CA568ADEE87A6 Kick It (1986)(Aackosoft)(NL) MSX NL +B8E00A95125C7F0A1BC082CC52CBD006 Kick It (1986)(Aackosoft)(NL)[a] MSX NL +E110C6F1E6A4B357F18006A4D2506B66 Kinasai (1984)(-) MSX +03C8743FA19D446F6C53D1091FFAD78F King & Balloon (1984)(Namcot)(JP) MSX JP +8C307660C8FB29CFD8FF8342C95218CB King & Balloon (1984)(Namcot)(JP)[a] MSX JP +E0D35583330F9AFCCDFE02B513AC4C01 King Leonard (1986)(Mind Games Espana)(ES) MSX ES +AA07815527E9B367BDEADA484A11AB5A King's Knight (1986)(Square)(JP) MSX JP +73984702F5C4A7211E6DC2B8E527384E King's Knight (1986)(Square)(JP)[a] MSX JP +EDFF7B7511F1055AFA483FF3BED04D84 King's Knight (1986)(Square)(JP)[a2] MSX JP +300E9E31A54E21F091B7E81B50DB4184 King's Knight (1986)(Square)(JP)[a3] MSX JP +DC990D182C3EC2B053E9BBE5B3FBF488 King's Valley (1985)(Konami)(JP)[a][RC-727] MSX JP +0724CBA4A28619F3758A35235AA55326 King's Valley (1985)(Konami)(JP)[a2][RC-727] MSX JP +DCD8D9508BE4FD38FDB4C8F50B16DBE3 King's Valley (1985)(Konami)(JP)[a3][RC-727] MSX JP +B1E77E416CDBE46E31A50D6412A0A7BD King's Valley (1985)(Konami)(JP)[a4][RC-727] MSX JP +F485D4C28102F3C5E7FB1EBA8520382C King's Valley (1985)(Konami)(JP)[RC-727] MSX JP +2F8A812F46E09E39DD3D0DA8524EE96C King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[RC-760] MSX JP +7C002653A7D54C8404EACE7B0694B70D King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[SCC][RC-760] MSX JP +46051F8A0AAEFAA012B8783ADA3DA4FD Kinnikuman. Muscle Man (1985)(Bandai)(JP) MSX JP +1CD39F900EDF496A967E4FC8E48D1451 Kinnikuman. Muscle Man (1985)(Bandai)(JP)[a] MSX JP +489075D5E2F3B9B60C41FBF8AD27AC7E Knight Lore (1985)(Nippon Dexter)(JP) MSX JP +FE12D44A5C06199394AD022AF7BB88E8 Knightmare II - The Maze of Galious (1987)(Konami)(JP)[a][RC-749] MSX JP +0924CF4480C9A4F3FBD922449900C913 Knightmare II - The Maze of Galious (1987)(Konami)(JP)[RC-749] MSX JP +3653C9AD32CA363DBA0FA81F707EA428 Knightmare II - The Maze of Galious (1987)(Zemina)(KR)[RC-749] MSX KR +845F200E4A101ED52685CAFEA9B9ED3F Knightmare III - Shalom (1987)(Konami)(JP)[a][RC-754] MSX JP +2A2A47925227A82F3C614F85C0A21CC7 Knightmare III - Shalom (1987)(Konami)(JP)[a2][RC-754] MSX JP +9A9E8E4FC95A15AAF5E0A40C498CF0DA Knightmare III - Shalom (1987)(Konami)(JP)[a3][RC-754] MSX JP +355F48B2A181880E60314F69752F9084 Knightmare III - Shalom (1987)(Konami)(JP)[RC-754] MSX JP +2F4E87CC751D116EA996AD4A2118F4AC Knightmare. Majyo Densetsu (1986)(Konami)(JP)[a][RC-739] MSX JP +EBFCABA358D7CECA95C7385276321F78 Knightmare. Majyo Densetsu (1986)(Konami)(JP)[a2][RC-739] MSX JP +3B46F970FD4BD442737E41CAAB527390 Knightmare. Majyo Densetsu (1986)(Konami)(JP)[RC-739] MSX JP +9C5B35E494EAA8AB66296DC796C7EF82 Knightmare. Majyo Densetsu (1986)(Konami)(JP)[SCC][RC-739] MSX JP +991A2606DDC64AC5C95BE523E071CDAC Knightmare. Majyo Densetsu (1986)(Konami)(JP)[SCC+][RC-739] MSX JP +B5E2111E8DD37F2BBFEB6D39F98291BB Kobashi (2004)(Desire in Envy)(NL) MSX NL +3AF3C665A9BC926DB76E4E2933322803 Koji Tanigawa's Shougi Shinan (1986)(Pony Canyon)(JP) MSX JP +039A7EA2DE0AA7261CAD28AC8539E887 Konami's Baseball (1984)(Konami)(JP)[a][RC-724] MSX JP +94E62B3F7BD8C4BF72192B85F6E557B8 Konami's Baseball (1984)(Konami)(JP)[RC-724] MSX JP +FC6D84B56C654DA2BD5A07C51059795E Konami's Billiards (1984)(Konami)(JP)[a][RC-706] MSX JP +F68D85AF1F91562D61994FA6605CB999 Konami's Billiards (1984)(Konami)(JP)[RC-706] MSX JP +3C276AE556DDD0FEEA9DF0D5D31A5E1D Konami's Boxing (1985)(Konami)(JP)[a][RC-736] MSX JP +649B8D9D5462605127E0F161C41C7FFA Konami's Boxing (1985)(Konami)(JP)[a][SCC+][RC-736] MSX JP +C499D7891CB5663E5DDC4D175775FC8A Konami's Boxing (1985)(Konami)(JP)[a2][RC-736] MSX JP +5B96ED50AD20CEAE2AAC53584A0DBE15 Konami's Boxing (1985)(Konami)(JP)[RC-736] MSX JP +1A1B0F6E1D4501FF64ED21184268BB73 Konami's Boxing (1985)(Konami)(JP)[SCC][RC-736] MSX JP +97B499AF2815FBAE8C4CE52B6DA20E29 Konami's Boxing (1985)(Konami)(JP)[SCC+][RC-736] MSX JP +937C06EFBA04804C506C7403269416EB Konami's Football (1985)(Konami)(JP)[a][RC-732] MSX JP +83E03A16040F7CE9B92A5249C7A11091 Konami's Football (1985)(Konami)(JP)[a2][RC-732] MSX JP +CE6B54A1EA81F0099F1B88C6A9187225 Konami's Football (1985)(Konami)(JP)[RC-732] MSX JP +DC5029E65C38582E1503127704E33477 Konami's Golf (1985)(Konami)(JP)[a][RC-723] MSX JP +7D22B53C88FE5B6B352E9AF89E1C16D3 Konami's Golf (1985)(Konami)(JP)[a2][RC-723] MSX JP +82FE3A8B30D2325E5A6468CA99E05566 Konami's Golf (1985)(Konami)(JP)[RC-723] MSX JP +A2F99279D0F9A7BE065886020AF54763 Konami's Mahjong Dojo (1984)(Konami)(JP)[RC-707] MSX JP +692EF0B5BE5FD1E7AE0F33B16C2C356F Konami's Ping Pong (1985)(Konami)(JP)[a][RC-731] MSX JP +5A8F82FF60E53A6D7AEE01B0B8354E5D Konami's Ping Pong (1985)(Konami)(JP)[a2][RC-731] MSX JP +9352ECA87EE56A2E1E5DB813FD686B91 Konami's Ping Pong (1985)(Konami)(JP)[a3][RC-731] MSX JP +8D1BA9794CF586433717812E178E7E2A Konami's Ping Pong (1985)(Konami)(JP)[RC-731] MSX JP +F38F3AA7DA1635CB8A6397304BD3A0EB Konami's Pooyan (1985)(Hudson Soft)(JP) MSX JP +A113021087CC957F6BD64600A315E44D Konami's Soccer (1985)(Konami)(JP)[a][RC-732] MSX JP +367AD85A80FE041D9741EDE84970F844 Konami's Soccer (1985)(Konami)(JP)[a2][RC-732] MSX JP +5075EE182797E8BA048ACE606D55E9DD Konami's Soccer (1985)(Konami)(JP)[a3][RC-732] MSX JP +81FBCFF39644D5FF3B4FF1399BA66939 Konami's Soccer (1985)(Konami)(JP)[RC-732] MSX JP +40A928853F589A082DB157D999667A93 Konami's Tennis (1984)(Konami)(JP)[a][RC-720] MSX JP +D7C2393662307613DF1B8D497B11D147 Konami's Tennis (1984)(Konami)(JP)[RC-720] MSX JP +23732E5BCB4B6669B5CB6E3677A856BC Koneko no Daibouken. Kitty's Great Adventure. Catboy (1986)(Casio)(JP) MSX JP +D2DD69A414CAF7487A1BFC695D7ABEDF Kralizec 8k Tetris (2004)(Kralizec)(ES) MSX ES +73181553059DA31B484977193E68CCC6 Kralizec Battle Tetris (2004)(Kralizec)(ES) MSX ES +CEADBE653E1DB2A75588E5C8FECBB336 Kralizec Tetris (2005)(Kralizec)(ES) MSX ES +49E62C2A6FF42ADF32E307BA44B2DA1A Kung Fu Master (1984)(ASCII)(JP) MSX JP +11E30C71EA0652AED07BE591C28F471B Kung Fu Master (1984)(ASCII)(JP)[a] MSX JP +5C45DCC46E8ADB05DAFE338132D4439C Kung Fu Master (1984)(ASCII)(JP)[a2] MSX JP +8DEBFE14CB9A88A0BFDA8D2023DDDBB8 Kung-Fu Thai Kun. Isao Lord (1985)(Toshiba-EMI)(JP) MSX JP +62152C1298CD8BE1EF7095B24966C393 Kung-Fu Thai Kun. Isao Lord (1985)(Toshiba-EMI)(JP)[a] MSX JP +89074BC1801ABC318012C4F20EEA0BF7 Ladder Building (1984)(ASCII)(JP) MSX JP +CB12BD103E67278893B530DFA42ABA7E Laptick 2 (1986)(dB-Soft)(JP) MSX JP +A30185600355031B7D06097F6F376607 Le Mans 2 (1985)(Electric Software)(GB) MSX GB +BFC1027AE05FBF19F95298941CE6887E Legendly Knight (1988)(Topia)(KR) MSX KR +2F63647AEF7AE6C33BBA0E0347D7C362 Legendly Knight (1988)(Topia)(KR)[a] MSX KR +69A8CE244A5AD5DF11B462B48EA22A1F Light Corridor, The (1990)(Infogrames)(FR) MSX FR +6BD8F952D144FF1B8D0EFF88BD5CF43B Lode Run (2005)(AGsoftware) MSX +86E45796F8EF150484283D97AF31AB44 Lode Runner (1984)(Sony)(JP) MSX JP +F668298AD121728414DE1AAEAC8D6B21 Lode Runner (1984)(Sony)(JP)[a] MSX JP +93D8D13DDFC7AB1D8D92466A83C40E0E Lode Runner II (1985)(Sony)(JP) MSX JP +33F5D0E33F702C97222BD101C70C7588 Lord Over (1983)(ASCII)(JP) MSX JP +6DD83D93DFEE5D65F563AA2DFE00574E Lot Lot (1985)(Technopolis Soft)(JP) MSX JP +CFBF0A20549F3B91E3D6E6251DCA5781 Lunar Ball (1985)(Pony Canyon)(JP) MSX JP +F32095BA0B10BF52B8D919DD952C8901 Mac Attack (1986)(Al Alamiah)(KW) MSX +5C06700589FC651ABEAE9247618620A2 Machinegun Joe vs the Mafia (1984)(Hudson Soft)(JP) MSX JP +BD6B7923AE611036BDAAFBBEBAFF9042 Macross Countdown (1985)(Bothtec)(JP) MSX JP +4CA58D79550605F2425002A9C2FFCF4A Macross Countdown (1985)(Bothtec)(JP)[a] MSX JP +EFBDDF9E48BFEEDB98B173802A9DC533 Magical Kid Wiz (1986)(Sony)(JP) MSX JP +7FD3E5F0DC5E4789CA33EA49B0F5206F Magical Kid Wiz (1986)(Sony)(JP)[a] MSX JP +34E4F27C45D352BCCE57C9BE0E77FC98 Magical Kid Wiz (1986)(Sony)(JP)[a2] MSX JP +A32E834B413FFD5471690C75D48D4C9A Magical Stones (2005)(Dioniso) MSX +1F47A9922D132FFF199FCE8AF7196807 Magical Stones 8k (2005)(Dioniso) MSX +91181B037E4A772149A00990E9F8B51C Magical Tree (1984)(Konami)(JP)[a][RC-713] MSX JP +B6B37561CF14F7149150B1944E4DECE8 Magical Tree (1984)(Konami)(JP)[RC-713] MSX JP +6DDBCFA5F75E3FBED798C699B570BDA6 Magunam. Kiki Ippatsu. Magnum Prohibition 1931 (1988)(Toshiba-EMI)(JP) MSX JP +EDC528F506BB5118D747E96DC5CB7A36 Magunam. Kiki Ippatsu. Magnum Prohibition 1931 (1988)(Toshiba-EMI)(JP)[a] MSX JP +4BB6F0EBBE4810CEA08C04A313434AB5 Mahjong Friend (1984)(Taito)(JP) MSX JP +C999C1EDF359A07797D3DE404FD7D400 Manes (1984)(ASCII)(JP) MSX JP +0220C76ABBD036DF95A0FD6702623099 Manes (1984)(ASCII)(JP)[a] MSX JP +98F3372B44E5C18BDB3D9EDD6D28B64B Manes (1984)(ASCII)(JP)[a2] MSX JP +8293591E4BEFDA1DCC689D90EAED8983 Manicomio (2005)(Crappysoft)(ES) MSX ES +594460D47162AB5261073B961B02B377 Mansion, The (2005)(Yermani Soft) MSX +18F02BDBA73800D028BFAD2F9FA776D1 Mansion, The (2005)(Yermani Soft)(ES) MSX ES +AC32E186DA2C5CEDC5ABBDCABE7575FF Mappy (1984)(Namcot)(JP) MSX JP +134F8A060BB879A343AFCAE975E45ADF Mappy (1984)(Namcot)(JP)[a] MSX JP +1C8F344249B311B13AD4BADE12CA49D3 Mappy (1984)(Namcot)(JP)[a2] MSX JP +88D9ACD090F139CB2FD539C71A95E95F Marchen Veil (1986)(System Sacom)(JP) MSX JP +80CA2C6BE9F35D3F8A90E163A935548D Marine Battle (1983)(ASCII)(JP) MSX JP +C6FF0756FE538A9E36501DA62E544315 Mars II (1990)(Nagi-P Soft) MSX +A9DCDC50DF823232D8F0E579FCD02531 Mars Lander (2006)(Crappysoft) MSX +354BFB3D60F96FFE67BBDCF9A6A25110 Mashou no Yakata Gabalin. Goblin (1987)(Pony Canyon)(JP) MSX JP +65F4DE7E2DAD263973DAD54B70A79F74 Mashou no Yakata Gabalin. Goblin (1987)(Pony Canyon)(JP)[a] MSX JP +EE13593FF9CA5785807D39D73D5798B0 Maze Attack (1983)(HAL Laboratory)(JP) MSX JP +634211CBD37AEC34F36D721A89EBFE2D Megalopolis SOS (1983)(General)(JP) MSX JP +D340D1C2C3BDEA0BD45BD7BA2A32A41B Megalopolis SOS (1983)(General)(JP)[a] MSX JP +7B0F7C290C54E987F4E63B072B76F257 Megalopolis SOS (1983)(General)(JP)[a2] MSX JP +E6CCED1F7B8BE930ECA6AD07D13AA540 Meikyuu no Tobira. Gate of Labyrinth (1987)(Radio Wave Newspaper Publisher)(JP) MSX JP +C55DE6B14318ADD3DD52E9859D2652B4 Midnight Brothers (1986)(Sony)(JP) MSX JP +1C4B42F7BEF2505107C1364856668E00 Midnight Brothers (1986)(Sony)(JP)[a] MSX JP +00E338D94573C8294B27F89AA8715DDC Midnight Building (1984)(ASCII)(JP) MSX JP +95144C997793A55ABF77C61BC611B9CE Midway (1983)(Magic Software)(JP)[yellow bckgrnd welcome screen] MSX JP +21A5CFBB590099E7A8230322AC613E2B Mil Caras (1985)(Idealogic)(ES) MSX ES +E13B4EA7CDC0284FB1AB0C3929F59D7A Mini Golf (1985)(Namcot)(JP) MSX JP +D8202641E594AD22109778BB0520CEAA Mini Golf (1985)(Namcot)(JP)[a] MSX JP +6469A75EF7C2574B8A46778681267F10 Mirai. Future (1987)(Xain)(JP) MSX JP +223BD344FE8833C2EB385C256EB7029A Mitsume ga Tooru. The Three-Eyed One Comes Here (1989)(Natsume)(JP) MSX JP +07C577AF358459020C0CCA448F6E4BF7 Mitsume ga Tooru. The Three-Eyed One Comes Here (1989)(Natsume)(JP)[a] MSX JP +2D2F5B2EA8BEA2F6DAA765EFFFCF6A4B Mitsume ga Tooru. The Three-Eyed One Comes Here (1989)(Natsume)(JP)[a2] MSX JP +11BE236E0B417B2109C64E72205D1D09 Moai no Hihou. Secret Treasure of Moai (1986)(Casio)(JP) MSX JP +85AD26F918B93A20F16FADC8D5720400 Moai no Hihou. Secret Treasure of Moai (1986)(Casio)(JP)[a] MSX JP +6549BA87C4E7DF1F45FE772FC216C606 Mobile Planet Stylus - Approach from the Westgate (1986)(HAL Laboratory)(JP) MSX JP +1C494B6738DBE37EFAA9250BB0FB5BCE Mobile Suit Gundam (1984)(Bandai)(JP) MSX JP +A24D55A747F70F62A36D60853FAD6788 Mobile Suit Gundam (1984)(Bandai)(JP)[a] MSX JP +63CC9F241760EA7C37385745DC96EE7F Mo-Karimakka. Bochibochidenna Sport (1986)(Leben Pro)(JP) MSX JP +11A66BB4D76B97F3E7195886ABF88B3C Mole (1983)(ASCII)(JP) MSX JP +1E65207D8EF8F93149123CB11C0DA193 Mole Mole 2 (1987)(Victor)(JP) MSX JP +FFC6F6F03C57C5211C154E2B57CFBDE3 Monogatari Megami Tensei. Digital Devil Story (1987)(Telenet Japan)(JP) MSX JP +5FAAA5AB88E24224584577C4C43EFC40 Monogatari Megami Tensei. Digital Devil Story (1987)(Telenet Japan)(JP)[a] MSX JP +EB62BCEEA0B6D367CDDA7C8BA22DAEB0 Monster's Fair (1984)(Toho)(JP) MSX JP +4D938E6E42A98B00DBCC51896545F537 Moon Landing (1983)(ASCII)(JP) MSX JP +5A9E04834727D034A27DFC7D67780333 Moon Patrol (1984)(IREM)(JP) MSX JP +08D62230A75E7D2EC25F3E19702DB9C0 Mopi Ranger (1985)(Konami)(JP)[a][RC-728] MSX JP +5C1330F308A90E214201127899F2ED38 Mopi Ranger (1985)(Konami)(JP)[a2][RC-728] MSX JP +6B78BA42542729E2494D591444D095F0 Mopi Ranger (1985)(Konami)(JP)[a3][RC-728] MSX JP +393713DF47B733544C62356F79993576 Mopi Ranger (1985)(Konami)(JP)[a4][RC-728] MSX JP +E49C00545380B331315156B346E34F63 Mopi Ranger (1985)(Konami)(JP)[RC-728] MSX JP +7509F98C9D864FA6B54569530E1ED40D Morita Kazurou no Othello (1986)(Toshiba-EMI)(JP) MSX JP +7074EB1975D750E13B24FAD5CDDD3C3A Mouser (1983)(Sony)(JP) MSX JP +CB63AF0D101B208BED717D53ABF20577 Mr. Chef & the Sausages (2004)(Paxanga Soft) MSX +CA5ECA35D80E88AD0741B301774F1D7B Mr. Chef & the Sausages (2004)(Paxanga Soft)[a] MSX +1FAC7BC23B97EE0C67FF5EDFB33BF355 Mr. Chin (1984)(HAL Laboratory)(JP) MSX JP +4D763A2C579B44976AF451798AF0E9EC Mr. Chin (1984)(HAL Laboratory)(JP)[o2] MSX JP +4067429251D1E5CE073F9EE27AF5879B Mr. Do! (1984)(Nippon Columbia - Colpax - Universal) MSX +24962C3C58880B7EE9CF08BB5FE0C45F Mr. Do! vs Unicorns (1984)(Sony)(JP) MSX JP +F2C5EAE5E6D01F4A3509DC71E6CAC660 Mr. Do's Wildride (1985)(Nippon Columbia - Colpax - Universal) MSX +EF0D5EE35C0DA882700FB70F3A741852 MSX Baseball (1984)(Panasoft)(JP) MSX JP +3E4CEE14D1BB740B7820B57137DFC010 MSX Baseball (1984)(Panasoft)(JP)[a] MSX JP +12E4AED81AB79613A55FA675F1650040 MSX Baseball (1984)(Panasoft)(JP)[a2] MSX JP +4F6042F6EB61229A4FBCD6E3C0F74DAB MSX Baseball II (1986)(Panasoft)(JP) MSX JP +666A2C98B77D86FE27DB2BB703AF4887 MSX Derby (1983)(ASCII)(JP) MSX JP +DBE509FD2177719E978521EA761A897C MSX Rugby (1985)(Panasoft)(JP) MSX JP +1E8D3C5D0D024378BF87C0B6F6CCFD3E MSX Shougi Game (1985)(Sony)(JP) MSX JP +890FC9338125EC372EAA05A9DEE0EAD2 MSX Soccer (1985)(Panasoft)(JP) MSX JP +BFDC3ABDE91B4A27FAEF30B4FB9C7C46 MSX Soccer (1985)(Panasoft)(JP)[a] MSX JP +BECBA7DC8E80AE8DD2A98171D2574E60 MSX-21 (1983)(ASCII)(JP) MSX JP +45C45ECEFA4B26979D9992DC063D1345 Namake's Bridgedrome (2005)(Buresto Faiya) MSX +044E427840993306FF6797B6B463E6AB Nausicaa (1984)(Technopolis Soft)(JP)[press LSHIFT at boot] MSX JP +770FC71692FA332730519CEDBD615366 Nessen Koushiyen. Exciting Baseball (1984)(Casio)(JP) MSX JP +1CEF56E98590AA54AF089795CFA128CE New Bubble Bobble. Boggle Boggle (1988)(Zemina)(KR) MSX KR +6EAFF5F70E053B2CC8D750DD3D4168BD New Bubble Bobble. Boggle Boggle (1988)(Zemina)(KR)[a] MSX KR +946E95371EC006580DF1A06E3959C64D Nightshade (1985)(Nippon Dexter)(JP) MSX JP +AF351E317199C110F4596727292C6644 Nightshade (1985)(Ultimate Play The Game)(GB) MSX GB +17B009C75B552171BFCB162C3A8F45A1 Ningyo Densetsu. Fathom (1985)(Toshiba-EMI)(JP) MSX JP +51F452871408B5A5B6C7CCFD371A57FA Ninja Jaja Maru Kun (1986)(Nippon Dexter)(JP) MSX JP +DD57940F08DBC691F817DD5FFA512CE1 Ninja Kun (1983)(Micro Cabin)(JP) MSX JP +93781B29A22FC0110B7A02411CB663B5 Ninja Kun. Majyo no Bouken (1985)(Nippon Dexter)(JP) MSX JP +BBA32A10829BB4F6E7144FBAA3BD4FEB Ninja Princess (1986)(Pony Canyon)(JP) MSX JP +B7C462BF90F0F97123D7D5590DF4E206 Ninja Princess (1986)(Pony Canyon)(JP)[a] MSX JP +3FCBAC54FAF796D7809ECF90A3624189 Ninjya Kage (1984)(Hudson Soft)(JP) MSX JP +6DCBBF656DA69C6E3DA2770DE67C37CD Ninjya Kage (1984)(Hudson Soft)(JP)[a] MSX JP +B4F2413986BA1E3F3186E1C18824C380 Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP) MSX JP +0E738FD0C5E850662F30762432216364 Norseman (1984)(Electric Software)(GB) MSX GB +6A705ECE3771E49C30B4424F567AADAD Nyan Nyan Pro Wrestling (1986)(Victor)(JP) MSX JP +E83E8D43C8CA5E6FEC21996D47A619ED Nyorols (1983)(MIA)(JP) MSX JP +036A085753A91634DC6A82FBE17251D3 Oil's Well (1985)(Comptiq)(JP) MSX JP +9CB4A6AE96B0C98AE826B520AC268AF6 Oil's Well (1985)(Comptiq)(JP)[a] MSX JP +92303B04DD5DB753B478F1A0782B6557 O'Mac Farmer (1984)(ASCII)(JP) MSX JP +3591483233B665DC5CE55E123F51AF4B Othello (1985)(Pony Canyon)(JP) MSX JP +798E2E45BA5E084453E686C31328709D Pachicom (1985)(Toshiba-EMI)(JP) MSX JP +4AEB3ABAE877421186B94AF41BB79561 Pachinko - U.F.O. (1984)(Casio)(JP) MSX JP +01078DD71F4E70E95BC3ACDF605C19DA Pac-Man (1984)(Namcot)(JP) MSX JP +6DFE9E94BC59518918B7EB6EE29927A0 Pac-Man (1984)(Namcot)(JP)[a] MSX JP +E32BC0A181DC1073AFB74E615C085775 Pac-Man (1984)(Namcot)(JP)[a2] MSX JP +DA801620C9472CB14C31EA9F3C1DC196 Pai Panic (1983)(ASCII)(JP) MSX JP +08E4D8D212DD1EB5CC54B26FDF983A4A Pair Logic (2005)(AGsoftware) MSX +4980AE2A0540738EC094324FAE521F71 Pairs (1983)(ASCII)(JP) MSX JP +36EBA31F25BB907D3E3C90D39BAED63A Pairs (1983)(ASCII)(JP)[a] MSX JP +63D4E4360BF187C3BF8CE789D4CFB116 Pairs (1983)(ASCII)(JP)[a2] MSX JP +629F18292B2F7A7D3862678A7C221A95 Panther (1986)(IREM)(JP) MSX JP +BC250F705C0285E3040E633E698D81B3 Parachuteless Joe (2005)(Paxanga Soft) MSX +E753BB6637DD811F1E9B41747A1D3C58 Parodius - Tako Saves Earth (1988)(Konami)(JP)[a][RC-759] MSX JP +55ADF3B4576B370DD2680D80C333EBDE Parodius - Tako Saves Earth (1988)(Konami)(JP)[a][SCC][RC-759] MSX JP +790972D4E53FCBC2EE46317A583FB52E Parodius - Tako Saves Earth (1988)(Konami)(JP)[RC-759] MSX JP +9548807E96BF5FA2688EA24BF9ED62AF Parodius - Tako Saves Earth (1988)(Konami)(JP)[SCC][RC-759] MSX JP +455DF4D49FF8300C702CE961919AC61C Pass Ball (1983)(ASCII)(JP) MSX JP +7224FA4AADD5A2614AFF3BBC339B1CE1 Pastfinder (1984)(Pony Canyon)(JP) MSX JP +8CCCA56B46815714DC5C79A616DE60A0 Payload (1985)(Sony)(JP) MSX JP +331F8AAF504E51C650979D6C55875D8A Payload (1985)(Sony)(JP)[a] MSX JP +EC2E7BA716246B7CBA3AF0C24A32E73C Peetan (1984)(Nippon Columbia - Colpax - Universal) MSX +1D7CF641645355B56725D98F61DF87E5 Pegasus (1988)(Victor)(JP) MSX JP +F6B948EF25C59441E4EFD0B7F8115EF7 Penguin Kun Wars (1985)(ASCII)(JP) MSX JP +2C7D000CFE37354D7D754658B9470D63 Penguin Race (2003)(Dioniso) MSX +17B55FB340F89ABF313A099C15C58FCA Pico Pico (1983)(Micro Cabin)(JP) MSX JP +AC0BC988775B9C65C92CFB200F9B1BEB Picture Puzzle (1983)(HAL Laboratory)(JP) MSX JP +9383BA8643FD1000B5CC099CF9D46822 Picture Puzzle (1983)(HAL Laboratory)(JP)[a] MSX JP +6EE570B6FA73FE9A147846078CDDC11C Picture Puzzle v2 (2004)(Karoshi)[RK706] MSX +57CDD034B93FAB07CCC961466BF16019 Pinball Blaster (1988)(Eurosoft)(NL) MSX NL +C157E3E1518DEE347F6150428D2E7AB5 Pinball Maker. Ball Blitz (1985)(Nippon Columbia - Colpax - Universal) MSX +DF9C0F9B9841D6EB30891846CD94CC81 Pine Applin (1984)(Canon Sale)(JP) MSX JP +A2BC1C96C6CC21FB1845F52950D88A5F Pine Applin (1984)(Canon Sale)(JP)[a] MSX JP +BAED450A5E77EEE1DC63F140951BA977 Pinky Chase (1984)(Nippon Columbia - Colpax - Universal) MSX +A444D0018A1ECC80913E93A6500B10BB Pipi (1985)(Nippon Dexter)(JP) MSX JP +AF60DEE247D1534DCFF06704BFD04A4B Pippols (1985)(Konami)(JP)[a][RC-729] MSX JP +45FF8D1CCFB242451BEA1B2EDC517602 Pippols (1985)(Konami)(JP)[a][SCC+][RC-729] MSX JP +C97DEA7ED6C7C37379FCDCDA1B50E8D4 Pippols (1985)(Konami)(JP)[a2][RC-729] MSX JP +F4AFC761CDA302C78F20F81C1922AA36 Pippols (1985)(Konami)(JP)[a3][RC-729] MSX JP +6EBF486BB421177A7CF18123EBAEAB18 Pippols (1985)(Konami)(JP)[RC-729] MSX JP +B2051D6EE5D1E908F741973054F8F357 Pippols (1985)(Konami)(JP)[SCC+][RC-729] MSX JP +29CC190CF89338B819A2F6ABD0F12A17 Pitfall (1984)(Pony Canyon)(JP) MSX JP +D388E0DA9A698CC9CB7C77BE3EBAD301 Pitfall (1984)(Pony Canyon)(JP)[a] MSX JP +1368D138CDEB0A143DA75834C8679A2F Pitfall (1984)(Pony Canyon)(JP)[a2] MSX JP +B13AE27995D3B0D688BC78AF1A5DFDE7 Pitfall II - Lost Caverns (1985)(Pony Canyon)(JP) MSX JP +79759C816DDDC119C453BBC8C1E4A379 Pitfall II - Lost Caverns (1985)(Pony Canyon)(JP)[a] MSX JP +BA0097E85D210DF4777149C9904A9D9D Play Ball (1986)(Sony)(JP) MSX JP +928E172112796922674275E1E2028AD7 Poiny X Senryo Sakusen - Operation Thanksgiving (1986)(Victor)(JP)[press LSHIFT at boot] MSX JP +05AED39F1D75BDD75F25B7DD7763F946 Police Story, The (1985)(Pony Canyon)(JP) MSX JP +9C6C811BCBB8AA94B39DE0BCDE159A3E Police Story, The (1985)(Pony Canyon)(JP)[a] MSX JP +82F35E875D31DF810AF990AE62BD80CE Poppaq the Fish (1986)(ASCII)(JP) MSX JP +33FCAD51A0A896D6C85848371B9D82BE Professional Baseball (1986)(Technopolis Soft)(JP) MSX JP +CFE18B0A192EFE6E6F5DE55F82B2A8E1 Professional Mahjong v2.2 (1986)(Chatnoir)(JP) MSX JP +5BDE548D26288B4C7C7CD05159F5A493 Protector, The (1985)(Pony Canyon)(JP) MSX JP +14285B64E2AE1DD5B47C468A2D66F22D Punchy (1984)(Mr. Micro)(GB) MSX GB +9E72E4378DEBDDAE3FFE9BDC3282D674 Puzzle Panic (1986)(System Soft)(JP) MSX JP +6B9F3F0C3A6D1D6ABD3D4A4589CCDD1F Pyramid Warp (1983)(T&E Soft)(JP) MSX JP +44C7432F4A29145D8CAAED3F1F01B0F3 Q-Bert (1986)(Konami)(JP)[a][RC-746] MSX JP +977F313ED84FBF4B2308151547E040B7 Q-Bert (1986)(Konami)(JP)[RC-746] MSX JP +6533EA0CB544A8F2F57BD6FB890C8084 Queen's Golf (1984)(ASCII)(JP) MSX JP +9CAAAC572A2D931BFB17C1654A452EE1 Queen's Golf (1984)(ASCII)(JP)[a] MSX JP +CD349578FBE18F0BEA6F92620B21121E Queen's Golf (1984)(ASCII)(JP)[a2] MSX JP +9AE80F681FC4AD5A3D9D2B2B577D1A4C Raid on Bungeling Bay (1985)(Sony)(JP) MSX JP +3E5900C0F1B940095F82C16B3E7CFB00 Rally-X (1984)(Namcot)(JP) MSX JP +7D1EDA308BF52235B80087799DC1A50F Rally-X (1984)(Namcot)(JP)[a] MSX JP +5A60B80CC16A9FC4E8AE5E9E1235BD32 Rally-X (1984)(Namcot)(JP)[a2] MSX JP +679F1D3AFF24008B17A62189612DFE26 Rally-X (1984)(Namcot)(JP)[a3] MSX JP +3B32EA457EDD4B727DB2F9B1EAC21E0B Rambo (1985)(Pack In Video)(JP) MSX JP +DEDC8B11B770A8DB20F2AA57D8D764D1 Rambo (1985)(Pack In Video)(JP)[a] MSX JP +1C397A6D6B24B474F3BF759CE2A77926 Rambo (1985)(Pack In Video)(JP)[a2] MSX JP +436BE4C449FC3E195F790579417A28B9 Rambo (1985)(Pack In Video)(JP)[a3] MSX JP +38C0ACA7B477941BD12358CF6B949490 Real Tennis (1983)(HAL Laboratory)(JP) MSX JP +A52BFD0531581F53C9F7FC4149685C31 Red Zone (1985)(ASCII)(JP) MSX JP +84207C363863368CE11F46CD3EAB70F6 Red Zone (1985)(ASCII)(JP)[a] MSX JP +1CFA94CDAB75E1A2E98BFE48659F9A47 Relics (1986)(Bothtec)(JP) MSX JP +C191D4AB4DBBACD362D2850B86BEA1D4 Renju & Ojama Dogs (1985)(Pony Canyon)(JP) MSX JP +53025AA48A41A6A1B7FAB88B93074D6F Rise Out from Dungeons (1983)(ASCII)(JP) MSX JP +FDAD9B86434EA448ACB117E5929420D0 Rise Out from Dungeons (1983)(ASCII)(JP)[a] MSX JP +A84C88DE3EA62E5EC3C313D4C0F4E929 Rise Out from Dungeons (1983)(ASCII)(JP)[a2] MSX JP +822283A036B1FA618668F4045C20C25C River Raid (1984)(Pony Canyon)(JP) MSX JP +E71FAC4870E00B7600DB3E8E31988A32 River Raid (1984)(Pony Canyon)(JP)[a] MSX JP +8AE5B5C13F45321F555AB1103092AD76 Road Fighter (1985)(Konami)(JP)[a][RC-730] MSX JP +A6E944961EE5FF96BDCF29F4D1A3539D Road Fighter (1985)(Konami)(JP)[a][SCC+][RC-730] MSX JP +DBBF94864BFDDA2482AF75736AA1E893 Road Fighter (1985)(Konami)(JP)[RC-730] MSX JP +F8976CECE4DF5871E98D2553AE22DE57 Road Fighter (1985)(Konami)(JP)[SCC+][RC-730] MSX JP +5D0E0AFC416EF46F2FD1D0B60816320A Robofrog (1985)(ASCII)(JP) MSX JP +2BE9C29ACD4D2929B34B700EF2DC10D3 Robofrog (1985)(ASCII)(JP)[a] MSX JP +6CC72822CF9D537DAD2932B877119537 Robowres 2001 (1987)(Micronet)(JP) MSX JP +C38F3CF4FF4CFEDF568E225288EA270A Rock 'n Bolt (1985)(Pony Canyon)(JP) MSX JP +8E0610B9C7B9BC98EB79EF54154D19B6 Roger Rubbish (1985)(Spectravideo)(GB) MSX GB +CBB4957FBCD7F129BC39EB790EA4CE72 Roger Rubbish (1985)(Spectravideo)(GB)[a] MSX GB +A928D443A2C01A01F3FE9F9903973291 Roller Ball (1984)(HAL Laboratory)(JP) MSX JP +7B7B42FCA96A434F4B6C8B5BE03936A5 Roller Ball (1984)(HAL Laboratory)(JP)[a2] MSX JP +CF7CDE41848C71A012CD31A33BA10A5E Roller Ball (1984)(HAL Laboratory)(JP)[a3] MSX JP +D2560E3B7D4E137BDBBA8426030D2F44 Rotors (1984)(ASCII)(JP) MSX JP +99BC435A1E7885F02B28B7FE94AB2499 R-Type (1988)(IREM)(JP) MSX JP +3CE7E6360A798F33940405E6501DCFF2 R-Type v2 (1988)(IREM)(JP) MSX JP +324E6E87465ECF49AF0C613A87467E10 R-Type v2 (1988)(IREM)(JP)[a] MSX JP +0F03B2306E11C5182351DB3B7AA30533 Saimazoom (2005)(Karoshi)[RK708] MSX +B0D4FB9A9A88FB65C12D2B567B567171 Saimazoom (2005)(Karoshi)[RK708EN] MSX +EC869B375D7517A7BA6161B10F5DEE06 Salamander - Operation X (1987)(Konami)(JP)[RC-758] MSX JP +59767E46E226F5C69469694817839189 Salamander - Operation X (1987)(Konami)(JP)[SCC][RC-758] MSX JP +0DA25C28FCE818D6FA7231CB6A914783 Salamander - Operation X (1988)(Zemina)(KR)[RC-758] MSX KR +305BF5B78B03D28B92DEF20AD89A4E4B Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP) MSX JP +C39692644983104279C32F0E2538C773 Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)[a] MSX JP +740A3E9D6A90AE40E37D9DADF94CF10E Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)[a2] MSX JP +1FFD12DA68283DC821266AFAFF6FEB93 Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)[a3] MSX JP +AEE5C2FCC3EC1EB99C31EFB865AAE439 Sasa (1983)(ASCII)(JP) MSX JP +77C7883244434C541C2B4FF159471D7D Sasa (1983)(ASCII)(JP)[a] MSX JP +1239740BC0836F090F9271F32F95B210 Saurusland (1982)(Nippon Columbia - Colpax - Universal) MSX +8F36B2807F33063D4F68F8D2822105EF Scarlet 7 (1986)(Toshiba-EMI)(JP) MSX JP +855E2BF57C9211BA347FACC0B3124B0D Scion (1985)(Sony)(JP) MSX JP +E6FBEF6E5C344B9533ECBCE493F33668 Scope On - Fight in Space (1983)(ASCII)(JP) MSX JP +0F48F90E059527AEB99C8B7E73850C09 Scramble Eggs (1983)(Ample Software)(JP) MSX JP +87B69C90F0126C9345DF0D050F5F2278 Sea Hunter (1985)(Spectravideo)(GB) MSX GB +A6931C419AEA8870B32BE2B62ACDB13B Seiken Acho. Kung-Fu Master Taekwondo (1985)(Irem - ASCII)(JP) MSX JP +A2BDA3945FD30A31AF5019AA9AC3C87A Seiken Acho. Kung-Fu Master Taekwondo (1985)(Irem - ASCII)(JP)[a] MSX JP +6E844B848141F77CC485E79151F1183B Seleniak (2004)(Guzuta Raster Leisure) MSX +C64BA63BFF4C856E5C05FF288E720169 Seleniak vM1 (2004)(Guzuta Raster Leisure) MSX +C129FBAA8CAABB21CC28E3FE35304576 Senjyo (1984)(Sony)(JP) MSX JP +F36BD789F048A9A41E8C0A0850F1C2C2 Senjyo (1984)(Sony)(JP)[a] MSX JP +0FEB4713CAC3A4ED491363259F9D163B Senjyo no Ookami. Wolf's Battlefield. Commando (1987)(ASCII)(JP) MSX JP +5351CCA0DE390954762EDC6E71A00BC7 Sewer Sam (1984)(Toshiba-EMI)(JP) MSX JP +914F1A6FB163DCD6D057CD9289A1961F Shindobaddo Nanatsu no Bouken. The Seven Adventures of Sindbad (1986)(Casio)(JP) MSX JP +CE5D57AC6753A16926F3DAE48AAF896E Shougi (1985)(Micro Cabin)(JP) MSX JP +113761F27C6C8594646AC71FC80B2CB8 Shougi (1986)(Pony Canyon)(JP) MSX JP +6A33115CFAEB4AB837CEA08B80847F6C Shougi Meijin (1985)(Toshiba-EMI)(JP) MSX JP +90B4FD28773830D2F6CD5B70D9B7D909 Shout Match (1987)(Victor)(JP) MSX JP +DE4FB0BD91C103B1CDCA1EF05579619A Sink King (2004)(Guzuta Raster Leisure) MSX +FF7221AA4A2A0A81B3801D5A538FAE51 Ski Command (1984)(Casio)(JP) MSX JP +B5B6D2FDF248D384867CDD958750503E Ski Command (1984)(Casio)(JP)[a] MSX JP +10848381F15A3D2CDCED059E038FA9D9 Ski Command (1984)(Casio)(JP)[a2] MSX JP +4226499B09D7175BA1B833AC03154ABE Skooter (1987)(Al Alamiah)(KW) MSX +E13740C751DDE4BB4F36B7BDC34C2422 Skooter (1987)(Pony Canyon)(JP) MSX JP +F8C4ADD212B508F673974C808639E09E Sky Jaguar (1984)(Konami)(JP)[RC-721] MSX JP +5B1BE147071CFE8C68AE6CCA47DE3C75 Sky Jaguar (1984)(Konami)(JP)[SCC+][RC-721] MSX JP +BC2A68A2E2A923BE4B50F6E95DEAC9B8 Skygaldo (1986)(Magical Zoo)(JP) MSX JP +26EA2A731F8C0E1A947A3196FCBAD4E7 Slapshot. Hockey sobre hielo (1985)(Indescomp)(ES)(en) MSX en ES +E73B22C4E1A3B00C28C0B6A80638F24A Snail Maze (2004)(Karoshi)[RK702] MSX +7BACB69889A402D4A759949026FB5675 Snake It (1986)(Al Alamiah)(KW) MSX +AC6F14A21D8D6685D0C09AEC48C3060B Snoopy Town (2005)(AGsoftware) MSX +EFF2CF82FC4320983E0DC7E6F5BE3E9B Snow Climber (2003)(Desire in Envy) MSX +FB79C061294A3350734C6D3BBEA69602 Sofia (1988)(Radio Wave Newspaper Publisher)(JP) MSX JP +BD6DD76FC48224C69E88B8636D070DED Soukoban (1984)(ASCII)(JP) MSX JP +2D6865CC11E87F6707888F6634215929 Soukoban (1984)(ASCII)(JP)[a] MSX JP +4B73979EAE8B309294CAEC36F2510965 Soukoban (1984)(ASCII)(JP)[a2] MSX JP +5AA5F8AFD3A8B63D7F5C46619E8209FF Soukoban (1984)(Qnix) MSX +0DF9CF6AA0D183B819FC151DB41AA7A6 Soukoban Pocket Edition (2004)(Karoshi)[RK704] MSX +9775B57330FEBC25C83CA72563B0B14A Space Camp (1986)(Pack In Video)(JP) MSX JP +B6AE80810E49E4E919490F821E58ACB6 Space Camp (1986)(Pack In Video)(JP)[a] MSX JP +75DA285250ED2BC511DE05AB93E2B70D Space Crussader (2005)(Yermani Soft) MSX +34B4A646852646054F59CC478F297D27 Space Crussader (2005)(Yermani Soft)(ES) MSX ES +CC67DC39F1C37AC5D2BDCAA9F9016756 Space Invaders (1985)(TAITO)(JP) MSX JP +60FD0543D90593F43B257E4BB8E5CFBA Space Maze Attack (1983)(HAL Laboratory)(JP)[a] MSX JP +CD2D390BAEB71771621652A1FC8B3529 Space Maze Attack (1983)(HAL Laboratory)(JP)[a2] MSX JP +6A5D57300184097C19BED1540556DDCC Space Trouble (1984)(HAL Laboratory)(JP) MSX JP +39BEBB78B65FCF01E8C731061C342957 Space Walk (1985)(Mastertronic)(GB) MSX GB +C63514D5502F055C2D0C795BA5C5F078 Sparkie (1983)(Sony)(JP) MSX JP +A0B0B038A04A7A24B3F5C3C98354E091 Sparkie (1983)(Sony)(JP)[a] MSX JP +61D068F5068A26B46FD3CAB37D33E8C9 Sparkie (1983)(Sony)(JP)[o2] MSX JP +29293A0887A32A2AAAB79369EFAEBE0B Spelunker (1986)(Broderbund) MSX +EE54F8C51511C64962E2E02F0A1B331C Spelunker (1986)(Broderbund)[a] MSX +144C27A3F2AEC5FFBC0EFB792A2B92ED Spider, The (1983)(Hudson Soft)(JP) MSX JP +6712C15BAAC6B6576003EA9432957359 Spy vs Spy II - The Island Caper (1987)(Databyte) MSX +E0802F030DCA1800C02339778A920499 Square Dancer (1984)(Toshiba-EMI)(JP) MSX JP +5B7557CF0CC8518104A77BC2EBA6B480 Squish'em (1984)(ASCII)(JP) MSX JP +607675ACF5B615248E30762D8459CA68 Squish'em (1984)(ASCII)(JP)[a] MSX JP +44419CE8C78D783B83CD2ED05A72032C Star Blazer (1985)(Sony)(JP) MSX JP +C83D32109B0EF51E5D9B89B9B71D5DC5 Star Blazer (1985)(Sony)(JP)[a] MSX JP +00CC2C958E5F37D16CE8F65129F2452E Star Blazer (1985)(Sony)(JP)[a2] MSX JP +B014D74E1C846C619719271CE6E6D483 Star Command (1983)(ASCII)(JP) MSX JP +73F5513C1C7605AD995A2363F69217EC Star Force (1985)(Hudson Soft)(JP) MSX JP +202E2DF136F4BA32D175DD8E93210BBB Star Force (1985)(Hudson Soft)(JP)[a] MSX JP +DDD203B5D3683692090DE56ABE367234 Star Soldier (1986)(Hudson Soft)(JP) MSX JP +5009B3EB94B67CEECB026685C1D9AE89 Star Soldier (1986)(Hudson Soft)(JP)[a] MSX JP +F2689755AB196A05EB733C787A29EAE0 Starship Simulator (1984)(ASCII)(JP) MSX JP +02C744B0D7C6C3E21D0DAA487919DEF4 Starship Simulator (1984)(ASCII)(JP)[a] MSX JP +90A46682A91CB55E7BDAD88921CBBF34 Step Up (1983)(HAL Laboratory)(JP) MSX JP +50149F6EBE9CC884B9E9FE39C13CA6C4 Step Up (1983)(HAL Laboratory)(JP)[a] MSX JP +6F573F1647AC30BF6A484D754D15AEF2 Stepper (1985)(ASCII)(JP) MSX JP +B7D39C884ECACA2B273212ED6F240168 Strangeloop (1987)(Nippon Dexter)(JP) MSX JP +8E8D25FB32D690D928CF011826C2A75B Stratos v3 (2004)(CEZ Games Studio)(ES) MSX ES +6AF0D8E392D9F8F6A4ACD2B51578648A Suparobo (1984)(ASCII)(JP) MSX JP +A97BE3921464521AC2068AD3796B07B2 Super Billiards (1983)(HAL Laboratory)(JP) MSX JP +9D8050E84296462FDCF4C131558B57F0 Super Boy II (1989)(Zemina)(KR) MSX KR +7C757AD7D44E8D1AA330AF1A5B864B06 Super Boy III (1991)(Zemina)(KR) MSX KR +4C88B05D489CF8D1E3B15C4F9B6C67FD Super Bubble Bobble (1988)(Zemina)(KR) MSX KR +B2624083A0CB576E7E2113D42BD8BD8A Super Cobra (1983)(Konami)(JP)[a][RC-705] MSX JP +ABB3476BCC65186EE764829658CA98F1 Super Cobra (1983)(Konami)(JP)[o2][RC-705] MSX JP +54FD5B5ED51A0E9DDD01ED8D5D7910C2 Super Cobra (1983)(Konami)(JP)[o3][RC-705] MSX JP +94620318823A2AEB024A8DB03E96D823 Super Cobra (1983)(Konami)(JP)[RC-705] MSX JP +D27ABBF55E924FE5B8C3DAB2BAE86A3C Super Cobra (1983)(Konami)(JP)[SCC][RC-705] MSX JP +59A6691F09A2C80B639200B382FA2733 Super Cobra (1983)(Konami)(JP)[SCC+][RC-705] MSX JP +20B7C2CA54CAF8AE73ED868FF9C10EFE Super Columns (1990)(Hi-Com) MSX +4BA7F2027F60964360ED7FAA1F3F9075 Super Cross Force (1983)(Spectravideo)(GB) MSX GB +303DE81590F62C06C1AB211AD5326FEB Super Drinker (1983)(Ample Software)(JP) MSX JP +4428BDF16978821240A237E28E9D4DEC Super Golf (1985)(Sony)(JP) MSX JP +F5065590FD8FBF6C286CB60623336403 Super Laydock - Mission Striker (1987)(T&E Soft)(JP) MSX JP +81CFDE2BCEEFD0988374DDE7AB141A9B Super Laydock - Mission Striker (1988)(Zemina)(KR) MSX KR +0FFB57FA3B81CAFD4B5ED3A4B9606B64 Super Pachinko (1985)(Nippon Columbia - Colpax - Universal) MSX +CE0BA8915EAE1567EB946151D37F08D9 Super Pierrot (1988)(Nidecom)(JP) MSX JP +0598333B7883FEF8051F8CE749D03903 Super Snake (1983)(HAL Laboratory)(JP) MSX JP +EB1B5D762B7088D56DDB7C07C6034DA4 Super Snake (1983)(HAL Laboratory)(JP)[a] MSX JP +535BDBECCCC21117AD4C4BA6D05172CD Super Snake (1983)(HAL Laboratory)(JP)[a2] MSX JP +CBEB5BC8A176421C10ED7F4BCAFF1F1A Super Soccer (1985)(Sony)(JP) MSX JP +5686175C42AC6CD0B82E0A40CBE7A9DC Super Tennis (1985)(Sony)(JP) MSX JP +88A7979BC05AC2A4061814838DDE8414 Supertripper (1985)(Indescomp)(ES) MSX ES +E02E64F42071C0177779E78211E89DFB Sutaa Torappu. Star Trap (1987)(Jast)(JP) MSX JP +55823C5D69588499A1D366FC1127F6A5 Sweet Acorn (1985)(TAITO)(JP) MSX JP +3C775A2EC743B0B1D1FE2C0ABE7B78AC Sweet Acorn (1985)(Taito)(JP)[a] MSX JP +45E8238E7405ADE86C027F158BCF9446 Swing (1985)(Pony Canyon)(JP) MSX JP +5CE76C7D6C437A35884F5D41849AE563 Swing (1985)(Pony Canyon)(JP)[a] MSX JP +C8ABA1D3BCD38F7B7061662571BBB03F Syougun. Shigun (1987)(Nippon Dexter)(JP) MSX JP +F995DC16607CD2FF9254890FCA522288 Takahasi Meijin no Boukenjima. Wonder Boy (1986)(Hudson Soft)(JP) MSX JP +6EF4D4A19FFB1CBA9511716B7751BF45 Takahasi Meijin no Boukenjima. Wonder Boy (1986)(Hudson Soft)(JP)[a] MSX JP +6C7E44DC11EA013D16817DD831D9F6C1 Takeru Densetsu. Legend of Takeru (1987)(Brother Industries)(JP) MSX JP +2CC55AC499325B6F245CA1D0ACA14F3D Tank Battalion (1984)(Namcot)(JP) MSX JP +FA2B3CDD056890CE47123397D8A00F88 Tank Battalion (1984)(Namcot)(JP)[o2] MSX JP +24D2C81046E7D885202143EDAB4884A6 Tatica (1984)(ASCII)(JP) MSX JP +8045ADB606BC448E4176EED1D751F182 Tawara (1984)(ASCII)(JP) MSX JP +37A3C3CB2ABF04BDED5A9FDBF3422CDD Tawara (1984)(ASCII)(JP)[a] MSX JP +585670C8DC5E70438173BEA1DC9FA4F8 Tawara (1984)(ASCII)(JP)[a2] MSX JP +F30A7DF481A0EECF71FB4A0D1168F35D Tear of Nile (1986)(Victor)(JP) MSX JP +0FCD8BFE6E479D1F6BFEB145AF976F1B Teki Paki (2003)(CEZ Games Studio)(beta) MSX +B5EB8D81DA72686D704944626BCA4080 Telebunnie (1983)(ASCII)(JP) MSX JP +B8339DFC3D0D8AD80C46D1F9B4E7EE02 Telebunnie (1983)(ASCII)(JP)[a] MSX JP +CF04DDBC4642154F4BF0D0ED66BD0627 Tensai Rabbian Daifunsen (1986)(Toshiba-EMI)(JP) MSX JP +CCF9A69648906BF242096824785817A9 Tenshidachi no Gogo. Afternoon Angels (1987)(Jast)(JP) MSX JP +A52B563494C1B8DE21CFAF3F4F28064B Tension (1988)(System 4)(ES) MSX ES +4E050C0E849FDD6EAB5EDD5262FF1772 Tetra Horror (1984)(ASCII)(JP) MSX JP +085F85D42C1B53F95DA79061617F7874 Tetra Horror (1984)(ASCII)(JP)[a] MSX JP +D9CDE65C28C138223221B4824EED6A92 Tetris (19xx)(Zemina)(KR) MSX KR +5E5611EA29B3346DC396C50DBF39B1A3 Tetsuman (1985)(HAL Laboratory)(JP) MSX JP +DED4A820CBB0E21E6692D8C29A1AADBA Tetsuman (1985)(HAL Laboratory)(JP)[a] MSX JP +CD369AA54B6BD6572FE84993074EDC42 Thexder (1986)(Game Arts)(JP) MSX JP +FA240B615FC870AB0F693CBC2EA135C1 Thexder (1986)(Game Arts)(JP)[a] MSX JP +996A004024B421A03AC00898E869F7F6 Thexder (1986)(Game Arts)(JP)[a2] MSX JP +6A4C5C53C3F1895ECA630DE281A041ED Thunder Ball (1985)(ASCII)(JP) MSX JP +91395E79E8DDF88B62AEE35C53C314C3 Thunder Ball (1985)(ASCII)(JP)[a] MSX JP +39E14F12C73AC5F709E8F466E64DEE20 Thunder Bolt (1986)(Pixel)(JP) MSX JP +ED8477C41FCCBCB6D86226409FAC08B7 Thunder Bolt (1986)(Pixel)(JP)[a] MSX JP +39C9F7FD4B126B9342687A55D41EA258 Thunder Bolt (1986)(Pixel)(JP)[a2] MSX JP +8484030B071A2F15B1CA9D9F73471EE7 Time Pilot (1983)(Konami)(JP)[a][RC-703] MSX JP +E40A0E17187516DAE62CB022E592E950 Time Pilot (1983)(Konami)(JP)[RC-703] MSX JP +FACCD03C7928D583A366A3918C912B49 Tomboyish Becky's Large Adventure (1983)(MIA)(JP) MSX JP +CF4838387A0D66B33195C6B76761B910 Tomboyish Becky's Large Adventure (1983)(MIA)(JP)[a] MSX JP +C47B53B72C6C3588EA5B881C0FCDBA2B Tomboyish Becky's Large Adventure (1983)(MIA)(JP)[a2] MSX JP +59A7335DBFC81CB92EBCE1D463D5089D Toobin' (1989)(Domark)(GB) MSX GB +1B840745AB51D80945BF9F95B49330CE Top Roller (1984)(Jaleco)(JP) MSX JP +1C15A83D25AD1E3B93682128260AC0C8 Topple Zip (1986)(Bothtec)(JP) MSX JP +8DA49CFB7782C6F6391B61CF66105D69 Tower of Druaga, The (1986)(Namcot)(JP) MSX JP +11D9D5946251C696C49622E1818D507B Track & Field 1. Hyper Olympic 1 (1984)(Konami)(JP)[RC-710] MSX JP +C3C6EAFC4CCAB58148A5B9373AF4A7C2 Track & Field 2. Hyper Olympic 2 (1984)(Konami)(JP)[RC-711] MSX JP +3DF646AFE612C5825E8143F83E5D1D5A Traffic (1986)(Sony)(JP) MSX JP +BEFCB461D2E1314802629479AE417D79 Traffic (1986)(Sony)(JP)[a] MSX JP +165D0E64762E6412E04ECE9093839731 Tragaperras (2005)(MSXnake)(ES) MSX ES +4A21EB60960D1AA20A83B593910EE322 Trial Ski (1984)(ASCII)(JP) MSX JP +9084EC03A483C2398D084438E1AB9D49 Trick Boy. Pinball (1984)(T&E Soft)(JP) MSX JP +A358A0DDC52590FECEA1A1CBD9EC0221 Tritorn (1986)(Xain)(JP) MSX JP +6FAEFFED313261654F20CEC30B221C54 Trump Aid (1986)(Toshiba-EMI)(JP) MSX JP +20E3A7434F2C0512EBEB086870AF4E2E Tumego 120 (1987)(Champion Soft)(JP) MSX JP +668751F47FEF040A740EC741328303F0 Turboat (1984)(ASCII)(JP) MSX JP +FAF6E9BC623449DA97EA1FD68361342A Turmoil (1984)(ASCII)(JP) MSX JP +037D87D19A5C3C14190F91F3D372088E Turmoil (1984)(Qnix) MSX +358DA2721789FC389DE5843E803ECC36 T-Virus - Brain Dead! v2 (2004)(Dioniso) MSX +C8E06FB33EABA8E98495B2DBF8508D3C Twin Bee (1986)(Konami)(JP)[a][RC-740] MSX JP +7F72E5C16252AF19397D5A0B70FB3EDB Twin Bee (1986)(Konami)(JP)[a][SCC+][RC-740] MSX JP +F28ACEF3373808AB8AF529CA6404FB5C Twin Bee (1986)(Konami)(JP)[a2][RC-740] MSX JP +5D88A7BF93F788E4DABF820E32912447 Twin Bee (1986)(Konami)(JP)[a3][RC-740] MSX JP +8F0765E5FC6E05807495837E272CADDF Twin Bee (1986)(Konami)(JP)[RC-740] MSX JP +E24D5F1E2174BB50109ABB2415BF1B65 Twin Bee (1986)(Konami)(JP)[SCC+][RC-740] MSX JP +AD4326826E4DBA3B41402229E743C48E Twin Hammer (1989)(Best) MSX +3315E22D7FA88BBEEFFA93B89631E5DE TZR Grand Prix Rider (1986)(ASCII)(JP) MSX JP +A42F93D075D81CFCD0B5956377BC0A39 Ultra-Man (1984)(Bandai)(JP) MSX JP +0F87F52BD0492A37109FA00544805FB9 Universe - Unknown (2005)(Infinite) MSX +4FE279AA34D14EBD92FCC561CA8F5BAC Universe - Unknown v2 (2005)(Infinite) MSX +5F695680C415F5CCD2F0A0FE740A63A5 Valis - The Fantasm Soldier (1986)(Telenet Japan)(JP) MSX JP +1CF78754C93CDD2A34666B41C1257B2B Valis - The Fantasm Soldier (1987)(Zemina)(KR) MSX KR +B8F49B4081017CBFBF40B9FAD57A4E2A Vaxol (1987)(Heart Soft)(JP) MSX JP +EB02FC17381DF7F03A6EFCED2D545A68 Venus Fire (1987)(Victor)(JP) MSX JP +08A7BF1AD4FDC213A203F191615BBC9C Video Hustler. Konami's Billiards (1984)(Konami)(JP)[a][RC-706] MSX JP +C6AEAAD4043B59D253953A26E4A7EB1B Video Hustler. Konami's Billiards (1984)(Konami)(JP)[a][SCC+][RC-706] MSX JP +062E1D90EA259B01B9D3A591475767ED Video Hustler. Konami's Billiards (1984)(Konami)(JP)[o2][RC-706] MSX JP +26F6E5DD454768BB2DDB661511657FD8 Video Hustler. Konami's Billiards (1984)(Konami)(JP)[o3][RC-706] MSX JP +CCFB673858F03940ACA707AD5C4AF7F2 Video Hustler. Konami's Billiards (1984)(Konami)(JP)[RC-706] MSX JP +C45C6C737E9A3A3D3EC5235313B7A3D2 Video Hustler. Konami's Billiards (1984)(Konami)(JP)[SCC][RC-706] MSX JP +E314F2ABDC74E3EE2CB81739BCE834C7 Video Hustler. Konami's Billiards (1984)(Konami)(JP)[SCC+][RC-706] MSX JP +4E388F8C95FB3CF30A35BBD1F0B3C717 Viking (2005)(Jose Luis Tur) MSX +C033D1ECE8A927FC88AB2AA02C5E8EF8 Viking (2005)(Jose Luis Tur)(ES) MSX ES +1DB1908A3B8710F0C8DEBC5CB7DAC6D5 Volguard (1985)(dB-Soft)(JP) MSX JP +A594C61FD7DE01723674EB6FCB19875D Warp & Warp (1984)(Namcot)(JP) MSX JP +B2F25B3999413001F9AF20CCD8B4A91B Warrior (1984)(ASCII)(JP) MSX JP +487F6F4EC935C471F440749BD5609C73 Warroid (1985)(ASCII)(JP) MSX JP +39DEA9BA5095F056D3B901BC7AFACACF Warroid (1985)(ASCII)(JP)[a] MSX JP +A9F281253B8DB5880BE6ED4922D412D6 Wedding Bells (1984)(Nippon Columbia - Colpax - Universal) MSX +87734E05CD0F0CDFC780717EDA8F845B Wedding Bells (1984)(Nippon Columbia - Colpax - Universal)[a] MSX +61F7E08CD80DE5BE1452667D80D4531A Wing Man 2 (1987)(Enix)(JP) MSX JP +BA0C8B751EB022A2DEC316CD62FE4725 Wrangler (1985)(Sony)(ES) MSX ES +496283BA7B09CD7DFEC1A13DA4B7249A Wreck, The (1984)(Electric Software)(GB) MSX GB +0D89C25C18DDC03053AE1C8BABEC1DC9 Xyxolog. Xyzolog (1985)(Nidecom)(JP) MSX JP +493258BDFEAC3B0D9F48420868019335 Xyxolog. Xyzolog (1985)(Nidecom)(JP)[a] MSX JP +FD1CCA7E17F5BBEF20F962BAF17EB41D Yabyum (1985)(Gerritsen, Tom)(NL) MSX NL +6D2BF2F354AB79AD1AE04F80AC8900CF Yakyuu Kyo. Baseball Craze (1984)(Hudson Soft)(JP) MSX JP +41FA839B7EB931959EE587B9A55D922B Yamaha SFG-05 System (1984)(Yamaha)(JP)[SFG05.ROM] MSX JP +3D8C3484191EBC324F2BB24A4B088086 Yellow Submarine (1987)(Brother Industries)(JP) MSX JP +C061F8207FB3A862EEF4ECD6E1ACDE2A Yie Ar Kung-Fu (1985)(Konami)(JP)[a][RC-725] MSX JP +983A3D5031CDA4C9701EEE524566EBA5 Yie Ar Kung-Fu (1985)(Konami)(JP)[RC-725] MSX JP +71821CC1732864CB7B9500B17BFFBF5B Yie Ar Kung-Fu (1985)(Konami)(JP)[SCC][RC-725] MSX JP +7FF8B8D712A008CD79BF120EE8FE2153 Yie Ar Kung-Fu (1985)(Konami)(JP)[SCC+][RC-725] MSX JP +6372224D6879DA76CD14C7EAFAAEF346 Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[a][RC-737] MSX JP +75B15FEB6FC3976C606B988E8F904D0A Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[a2][RC-737] MSX JP +B591BB62CEC12FCC13F54885CF3C7DF6 Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[RC-737] MSX JP +1F8E670B01F329B989A2EA08379EA35D Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[SCC][RC-737] MSX JP +24AFC53C7627D55E588FCD2D5492ADDB Yie Ar Kung-Fu II - The Emperor Yie-Gah (1985)(Konami)(JP)[SCC+][RC-737] MSX JP +7120EAC2FF88C302D80D2CFC5DFCC03C Youkai Tanken Chima Chima (1985)(Bothtec)(JP) MSX JP +BCEC9FDAC121E3EE668946CDBEDF63CF Youkai Yashiki. Boynight. Haunted House (1986)(Casio)(JP) MSX JP +F5DA7659FF2A76D94341F4BAB84BEAE3 Young Sherlock - The Legacy of Doyle (1985)(Pack In Video)(JP) MSX JP +4C0D373E999CE241B8D5F41FFE379205 Young Sherlock - The Legacy of Doyle (1985)(Pack In Video)(JP)[a] MSX JP +9C3B9492F2B565CBDDF562195F540993 Yume Tairiku Adventure. Penguin Adventure (1986)(Konami)(JP)[a][RC-743] MSX JP +B078834ABE5659A3EB32560F88B19F36 Yume Tairiku Adventure. Penguin Adventure (1986)(Konami)(JP)[a2][RC-743] MSX JP +3A705B83FF05999D924007126993A390 Yume Tairiku Adventure. Penguin Adventure (1986)(Konami)(JP)[RC-743] MSX JP +DD85486474983645D0576C76C7267415 Yume Tairiku Adventure. Penguin Adventure (1987)(Zemina)(KR)[RC-743] MSX KR +21E0D73E03755E0F773E6056DCCDB702 Zaider - Battle of Peguss (1986)(Cosmos Computer)(JP) MSX JP +B115607552685656F43F324868D200A8 Zaider - Battle of Peguss (1986)(Cosmos Computer)(JP)[a] MSX JP +8500BD6A80B4355C11AF6084710A75C9 Zanac - 2nd Version (1987)(Pony Canyon)(JP) MSX JP +B98531BBD765AC46EB21A81568C89417 Zanac - 2nd Version (1987)(Pony Canyon)(JP)[a] MSX JP +B38C69DCB7D7162983C8CB2ED175DD56 Zanac (1986)(Pony Canyon)(JP) MSX JP +7AE5847140746484EC6CF739EEDE5B15 Zanac (1986)(Pony Canyon)(JP)[a] MSX JP +452C3B57D75C6CE64111F82F642BE0E5 Zaxxon (1985)(Pony Canyon)(JP) MSX JP +8AD24CB1636B8CCE01E1CB6F9FCD6FD6 Zaxxon (1985)(Pony Canyon)(JP)[a] MSX JP +46E90AB77E297CF759C912888ECE9A63 Zenji (1984)(Pony Canyon)(JP) MSX JP +39F2E4DB9272E79E8B6A0FC8BB2E3708 Zenji (1984)(Pony Canyon)(JP)[a] MSX JP +A72CA83A29C96ECBDAC405D2877F696C Zexas Limited (1985)(dB-Soft)(JP) MSX JP +23F4722A2359120C3CA93CFFE3D1DA18 Zexas Limited (1985)(dB-Soft)(JP)[a] MSX JP +D3F660402A99BD8BE674073FF33B8B61 Zexas Limited (1985)(dB-Soft)(JP)[a2] MSX JP +D8E09F622AF52E07A83F19CA58AEE194 Zoom 909 (1985)(Sega)(JP) MSX JP diff --git a/Assets/gamedb/gamedb_msx_msx2_cas.txt b/Assets/gamedb/gamedb_msx_msx2_cas.txt new file mode 100644 index 0000000000..bb048680ac --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx2_cas.txt @@ -0,0 +1,169 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Applications - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:47 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +76184CB39317FBD31EA0B3D0989217C3 Leonardo (1987)(Omega System)(JP)[CLOAD + RUN] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Compilations - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:47 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +DE2CB726C084FE985ECC39FD67890B96 Games Collection, The - 747 400b Flight Simulator (1988)(Eurosoft)(NL)(Tape 2 Side B)[a][RUN'CAS-'] MSX NL +DB5F0174F92169783D504C9086E77A7F Games Collection, The - 747 400b Flight Simulator (1988)(Eurosoft)(NL)(Tape 2 Side B)[RUN'CAS-'] MSX NL +DF837999C4F1332954BADA0EB5521F97 Games Collection, The - Astro Blaster (1988)(Eurosoft)(NL)(Tape 1 Side A)[RUN'CAS-'] MSX NL +4B4A90D8BD471592CC481C67014F43D6 Games Collection, The - Blow Up (1988)(Eurosoft)(NL)(Tape 1 Side A)[RUN'CAS-'] MSX NL +87CC54D27254C3240A89CDFE4D88B685 Games Collection, The - Boom (1988)(Eurosoft)(NL)(Tape 1 Side A)[RUN'CAS-'] MSX NL +51280DB1CA8817F5F7A0E80C49A34389 Games Collection, The - Booty (1988)(Eurosoft)(NL)(Tape 4 Side B)[RUN'CAS-'] MSX NL +B5AAE51F647A24D345F86E04BEBA702E Games Collection, The - Breaker Breaker (1988)(Eurosoft)(NL)(Tape 2 Side A)[RUN'CAS-'] MSX NL +EB0AF3520CDE7102C5A6FAE1E5A28E12 Games Collection, The - Burgerkill (1988)(Eurosoft)(NL)(Tape 5 Side A)[aka Mac Attack][RUN'CAS-'] MSX NL +A0FF3472ABDDE06056E5992BB77D001B Games Collection, The - CD Version - 01 - Sequential Loader (1988)(Eurosoft)[RUN'CAS-'][Martos] MSX +D5DF03F56D0E2B2E4214099DF9199CAA Games Collection, The - CD Version - 02 - Eagle Control (1988)(Eurosoft)(NL)[Martos] MSX NL +366D0C7D783E19B7C8B4FCD11FC15ECB Games Collection, The - CD Version - 03 - Search and Rescue (1988)(Eurosoft)(NL)[Martos] MSX NL +19AE2148979B103A7556AB7E3461D68D Games Collection, The - CD Version - 04 - 747 400b Flight Simulator (1988)(Eurosoft)(NL)[Martos] MSX NL +B9DBA77E8AA635DE680F74E9D8AFBAF2 Games Collection, The - CD Version - 05 - Vortex Raider (1988)(Eurosoft)(NL)[Martos] MSX NL +9EE711DBA8AD9D80D6DC9A37D1AE93AA Games Collection, The - CD Version - 06 - Red Dawn (1988)(Eurosoft)(NL)[Martos] MSX NL +DC056822F4CB7B93A7680999FD20EF54 Games Collection, The - CD Version - 07 - Blow Up (1988)(Eurosoft)(NL)[Martos] MSX NL +A3E04B0B56FC39BD2101D866822FF783 Games Collection, The - CD Version - 08 - Booty (1988)(Eurosoft)[Martos] MSX +2C5857BBC92802BDE292470463C4321B Games Collection, The - CD Version - 09 - Chess Player MSX1 version (1988)(Eurosoft)(NL)[Martos] MSX NL +62D968C7BE1C264B517B0753026E55A6 Games Collection, The - CD Version - 10 - Chopper One (1988)(Eurosoft)(NL)[Martos] MSX NL +CB0FAA88525FB53255BB08F63B1F46E2 Games Collection, The - CD Version - 11 - Gutt Blaster (1988)(Eurosoft)(NL)[Martos] MSX NL +AB2C26D123E20061A689C30479CA3D75 Games Collection, The - CD Version - 12 - Burgerkill (1988)(Eurosoft)(NL)[Martos] MSX NL +2B59B346ABBA2B3E30B7CD043083D586 Games Collection, The - CD Version - 13 - Playhouse Strippoker (1988)(Eurosoft)[Martos] MSX +43BFF8CA33DCFB42F1EA7AFA32B4369E Games Collection, The - CD Version - 14 - Discovery (1988)(Eurosoft)[Martos] MSX +4CABB26757D85551B4FA65C583E54F2F Games Collection, The - CD Version - 15 - Kong (1988)(Eurosoft)[Martos] MSX +F1E1AA433722627E2EE3F1CAC50BDFE5 Games Collection, The - CD Version - 16 - Haunted House (1988)(Eurosoft)(NL)[Martos] MSX NL +B042F9D5BABBABF48913DFA1557FA006 Games Collection, The - CD Version - 17 - Breaker Breaker (1988)(Eurosoft)(NL)[Martos] MSX NL +BCEED94702A962620A2F51723CE7759A Games Collection, The - CD Version - 18 - Boom (1988)(Eurosoft)[Martos] MSX +568D9C6C52205D4B684697BEE7648B31 Games Collection, The - CD Version - 19 - Missile Command (1988)(Eurosoft)[Martos] MSX +F91C425B2DEF3D8F226529DBF7A7ACE2 Games Collection, The - CD Version - 20 - Frog (1988)(Eurosoft)(NL)[Martos] MSX NL +7CFA5A2AEFA6671A3F9852A6FBD3EC70 Games Collection, The - CD Version - 21 - Jet Fighter (1988)(Eurosoft)(NL)[Martos] MSX NL +1484D0340F38984743BF7C18046329B2 Games Collection, The - CD Version - 22 - Time Rider (1988)(Eurosoft)(NL)[Martos] MSX NL +ED81FBD72DFF4F5E825E83C12BA66A44 Games Collection, The - CD Version - 23 - Starbite (1988)(Eurosoft)[Martos] MSX +06F7AA5121E37FD87E8783CD90005415 Games Collection, The - CD Version - 24 - Quebert (1988)(Eurosoft)(NL)[Martos] MSX NL +D6EDBE813FFB162444158C7CB6EC365A Games Collection, The - CD Version - 25 - Penguin (1988)(Eurosoft)(NL)[Martos] MSX NL +0431627824B9EF2B045EE473C1595565 Games Collection, The - CD Version - 26 - Pinball Blaster (1988)(Eurosoft)(NL)[Martos] MSX NL +50AFE7A69449F59CAF75DD55FBC7034D Games Collection, The - CD Version - 27 - Space Rescue (1988)(Eurosoft)(NL)[Martos] MSX NL +3542174CBABE159B3717A81A27B1C8CF Games Collection, The - CD Version - 28 - Starbuggy (1988)(Eurosoft)(NL)[Martos] MSX NL +A54FFE44FD7D19E91F89BA607A11611D Games Collection, The - CD Version - 29 - Astro Blaster (1988)(Eurosoft)(NL)[Martos] MSX NL +8390F3AF176466DA7EC0C0433ABC5BA0 Games Collection, The - CD Version - 30 - Winterhawk (1988)(Eurosoft)(NL)[Martos] MSX NL +89081F1ECAA7849490BDE785632C8840 Games Collection, The - CD Version - 31 - Pharao's Revenge (1988)(Eurosoft)(NL)[Martos] MSX NL +09EAAE43054EBAB7177EA3A9B5BEE6BC Games Collection, The - CD Version - 32 - Scentipede (1988)(Eurosoft)[Martos] MSX +617DBB4B020C57FA81DD549E56642445 Games Collection, The - CD Version - 33 - Chess Player MSX2 version (1988)(Eurosoft)(NL)[Martos] MSX NL +53FDFE0D184981D510250CC02858F205 Games Collection, The - CD Version - 34 - Bankbuster (1988)(Eurosoft)(NL)[Martos] MSX NL +B9DBC1F422591EEA1D74009256C92983 Games Collection, The - CD Version - Sequential Loader (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +5EB26001D25F0AE751D44B29FFEDB41F Games Collection, The - Chess Player (1988)(Eurosoft)(NL)(Tape 3 Side A)[a][RUN'CAS-'] MSX NL +751786B0C69D61918DD440C4BAAA0A10 Games Collection, The - Chess Player (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +AC7447DD8761619B50362C1D2E84B4C0 Games Collection, The - Chopper One (1988)(Eurosoft)(NL)(Tape 2 Side A)[RUN'CAS-'] MSX NL +0CBA2F209E39A2A02A0A977380E964BD Games Collection, The - Discovery (1988)(Eurosoft)(NL)(Tape 1 Side B)[RUN'CAS-'] MSX NL +820005A70375EF10A0B30B43B3252CD5 Games Collection, The - Eagle Control (1988)(Eurosoft)(NL)(Tape 6 Side A)[a][RUN'CAS-'] MSX NL +65230164A7E44DF1C636AA892232E704 Games Collection, The - Eagle Control (1988)(Eurosoft)(NL)(Tape 6 Side A)[RUN'CAS-'] MSX NL +AA3F4B62BB4ACDFA8819299F7095D71D Games Collection, The - Frog (1988)(Eurosoft)(NL)(Tape 3 Side A)[a][RUN'CAS-'] MSX NL +14235D540AF93F69663CA0FCDFBF0530 Games Collection, The - Frog (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +679670788022649C7903341B95F4971F Games Collection, The - Guttblaster (1988)(Eurosoft)(NL)(Tape 2 Side B)[RUN'CAS-'] MSX NL +5F13F0C621207AE80B790DE11806B25F Games Collection, The - Haunted House (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +93AD9F3CB7C3E3F6758339BE68DFE654 Games Collection, The - Jet Fighter (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +2AB35EFCBC118D43E7C25891CC1F0588 Games Collection, The - Kong (1988)(Eurosoft)(NL)(Tape 1 Side A)[RUN'CAS-'] MSX NL +C2A878824DC0D52275F98E1D1D20E32A Games Collection, The - Missile Command (1988)(Eurosoft)(NL)(Tape 2 Side B)[RUN'CAS-'] MSX NL +84BE4A2C87B2D9D4E1CB537219E9DDC4 Games Collection, The - Penguin (1988)(Eurosoft)(NL)(Tape 6 Side B)[a][RUN'CAS-'] MSX NL +8356A628343BC3AAAAFBA06762571982 Games Collection, The - Penguin (1988)(Eurosoft)(NL)(Tape 6 Side B)[RUN'CAS-'] MSX NL +8A1B15919D6ECE2D6ED4197D1262ECA8 Games Collection, The - Pharaoh's Revenge (1988)(Eurosoft)(NL)(Tape 6 Side B)[RUN'CAS-'] MSX NL +3B21D2D9252941B6C7DB01E2DEDEECFC Games Collection, The - Pinball Blaster (1988)(Eurosoft)(NL)(Tape 5 Side A)[RUN'CAS-'] MSX NL +A90FBB398D0F0D3457613426A0AA7F10 Games Collection, The - Playhouse Strippoker (1988)(Eurosoft)(NL)(Tape 1 Side B)[RUN'CAS-'] MSX NL +79D3B4B2A3243FD1DB09A0C5C4F4E59E Games Collection, The - Quebert (1988)(Eurosoft)(NL)(Tape 2 Side A)[RUN'CAS-'] MSX NL +BF40424B37A24708B9C7E30F460DA0B1 Games Collection, The - Red Dawn (1988)(Eurosoft)(NL)(Tape 4 Side A)[RUN'CAS-'] MSX NL +CDD73CEB030471FA329C4739913DDE57 Games Collection, The - SAR (1988)(Eurosoft)(NL)(Tape 6 Side B)[a][RUN'CAS-'] MSX NL +B91D646963BE44055333175591A6C86F Games Collection, The - SAR (1988)(Eurosoft)(NL)(Tape 6 Side B)[RUN'CAS-'] MSX NL +5CD12C507F631D61B5F35BFB3BE2A7B1 Games Collection, The - Scentipede (1988)(Eurosoft)(NL)(Tape 4 Side A)[a][RUN'CAS-'] MSX NL +AE74D86AA248C19D4CA168B68B597348 Games Collection, The - Scentipede (1988)(Eurosoft)(NL)(Tape 4 Side A)[RUN'CAS-'] MSX NL +72A6B18A3E4F0A62AD15F94405A1E0E1 Games Collection, The - Space Rescue (1988)(Eurosoft)(NL)(Tape 5 Side A)[RUN'CAS-'] MSX NL +F3ED1C23B1A5610EF0ED0409A5FDC996 Games Collection, The - Starbite (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +1E9D7A7E2A97DDDA624A69AD08A44E38 Games Collection, The - Starbuggy (1988)(Eurosoft)(NL)(Tape 5 Side B)[RUN'CAS-'] MSX NL +8D29C18C8100AB53A95E4EBD66EBC6AD Games Collection, The - Tape 4 Side B - Bank Buster (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +769B3F0B1208A21D330EA2F90419329F Games Collection, The - Tape 4 Side B - Bank Buster (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +E33A9E5CD7CB69EC643171511864989C Games Collection, The - Tape 5 Side B - Chess Player 2 (1988)(Eurosoft)(NL)[a][RUN'CAS-'] MSX NL +D86AEA1DA285B143AEA00EF7E540CC54 Games Collection, The - Tape 5 Side B - Chess Player 2 (1988)(Eurosoft)(NL)[RUN'CAS-'] MSX NL +BDD6D393E330C9BCA638618532F3C7EF Games Collection, The - Time Rider (1988)(Eurosoft)(NL)(Tape 3 Side A)[a][RUN'CAS-'] MSX NL +91657EDC9921EFBBA32B274B124402D2 Games Collection, The - Time Rider (1988)(Eurosoft)(NL)(Tape 3 Side A)[RUN'CAS-'] MSX NL +7C9B74B99F2788570248EE68FE737383 Games Collection, The - Vortex Raider (1988)(Eurosoft)(NL)(Tape 4 Side A)[RUN'CAS-'] MSX NL +E03114BC042BC5D183B83D29384C50CE Games Collection, The - Winterhawk (1988)(Eurosoft)(NL)(Tape 6 Side A)[RUN'CAS-'] MSX NL +76184CB39317FBD31EA0B3D0989217C3 Leonardo (1987)(Omega System)(JP)[CLOAD + RUN] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Games - [CAS] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:47 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +E180C7B2910B2C35A03910DCBEE852F3 Chess Game 2, The (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL +E03114BC042BC5D183B83D29384C50CE Games Collection, The - Winterhawk (1988)(Eurosoft)(NL)(Tape 6 Side A)[RUN'CAS-'] MSX NL +A2CC4D5BDBD30AFB3BD9A5561B4F6820 Red Lights of Amsterdam (1986)(Eaglesoft)(NL)(Side A)[RUN'CAS-'] MSX NL +839D2ED8DE9BFA8FE4F96ED05BF11476 Red Lights of Amsterdam (1986)(Eaglesoft)(NL)(Side B)[RUN'CAS-'] MSX NL +C12B24782084B8F604B21D39EA58659A Red Lights of Amsterdam (1986)(Eaglesoft)(NL)[RUN'CAS-'] MSX NL diff --git a/Assets/gamedb/gamedb_msx_msx2_dsk.txt b/Assets/gamedb/gamedb_msx_msx2_dsk.txt new file mode 100644 index 0000000000..277c68e72b --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx2_dsk.txt @@ -0,0 +1,2962 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Applications - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +0DA253ABF1CCB1A2FCA1378B8537486E B Da Vinci (1989)(Popcom Soft)(JP)[b] MSX JP +27FA865405C055283F4897C3B929F331 B Graph Saurus v1.0 (1989)(Bit2)(JP)[b] MSX JP +62B2F286C6ED183FD7FD248D80EDAAA6 B Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 1 of 2)[b] MSX JP +B5ABA93EB0A9D989A1C375C71FDA3BC3 B Synth Saurus v2.0 (1989)(Bit2)(JP)[b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +B14E867B7792AE82AA9039CFCA8E16B5 O Z80 Turbo Pascal v3.3f (1999)(MSX Computer Club Enschede)(NL)[o] MSX NL +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +3A69A18A14BD9C81717383AB5B90D8EF T Yoshida Konzern. Game Editor 2 - Demo Game 3 (1990)(MSX Magazine)(JP)[tr es Bruno] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +26895CD7CABBEE26BF03C69C3D5ADA93 28 MSX-DOS Utilities (1990)(HCC MSX Group)(NL) MSX NL +CCD2C8D9C5F0C7E7490AB58EB2B0B718 28 MSX-DOS Utilities (1990)(HCC MSX Group)(NL)[a] MSX NL +A6FCA02F65C91007B72D86286269C73A Adventure Tcool v1.00 (1988)(MSX Magazine)(JP) MSX JP +56A358A14B7B8CD5D41C305D3BAFFBC4 CD-Player for MegaSCSI & Sunrise ATA-IDE v1.1 (2000)(Sergio Guerrero)[needs MSX-DOS] MSX +C19B66AF057F80446D3D81771F36B60C Cheese 2 (1985)(Nipon Electronics)(JP)[mouse] MSX JP +C4FDEF6714D06D7BDA22305A01C1CE37 Da Vinci (1989)(Popcom Soft)(JP) MSX JP +5B7589C2B4CA648E9DC074B77E09F253 Dante (1990)(MSX Magazine)(JP) MSX JP +8FD37314BF2B82C2C9FD937CDA72A44C Dante (1990)(MSX Magazine)(JP)[a] MSX JP +EE6963AA42F4EC2EF7FB44A1A9575E1B Dante 2 (1992)(MSX Magazine)(JP)(Disk 1 of 4)(Program Disk) MSX Program Disk JP +013E8C6BAF32FEC835ACF07D38D67BD5 Dante 2 (1992)(MSX Magazine)(JP)(Disk 2 of 4)(Data Disk 00) MSX JP +2BF75F71FA9927B0A35CE12D111182E6 Dante 2 (1992)(MSX Magazine)(JP)(Disk 2 of 4)(Data Disk 00)[a] MSX JP +2457BE1D4D6420C27F8F90E5250C7504 Dante 2 (1992)(MSX Magazine)(JP)(Disk 3 of 4)(Data Disk 01) MSX JP +5F16EABC816C9DA0A15E6F2FD1862430 Dante 2 (1992)(MSX Magazine)(JP)(Disk 4 of 4)(Save Disk) MSX Save Disk JP +57641467FA3F94C2984952E918387963 Disk Cache for MSX Games (19xx)(-) MSX +5C39FA64911665368B3641C83966D4EA Disk Cache for MSX Games (19xx)(-)[a] MSX +1221503ED799ABC2C33093ED512A4790 Dot Designer's Club (1989)(T&E Soft)(JP) MSX JP +4089C25F5104C76AA9D8367F3C8D7672 Dot Designer's Club (1989)(T&E Soft)(JP)[a] MSX JP +B3F916BED5CB4498314EEAB55D1E453A Dot Designer's Club (1989)(T&E Soft)(JP)[a2] MSX JP +83F393C5F7D21173F403189B779036D0 Double Task v1.0 (19xx)(Sergi Martinez) MSX +E2056C79580E8196F27B2DA7000FE13B DP24 v1.1 (1994)(R.B. Soft)(ES) MSX ES +06DF4D258DA801117A5B2D00A9A87543 Driver Loader v1.00 (1994)(Erix Maas) MSX +D1D15E52B2AD2D34EE39D3D7C77D6878 Driver Loader v1.00 (1994)(Erix Maas)[a] MSX +F2288AA49A27A353AD8D3F5CFC1279BF Dynamic Publisher (1988)(R.B. Soft)(ES) MSX ES +4056EECF683A264A6877EA3A44369BF6 Dynamic Publisher (1988)(R.B. Soft)(ES)[a] MSX ES +B9FA9376DBF266FF191859217015D250 E.A.S.E. - Philips Desktop v1.1 (1988)(Philips)(IT)[a][mouse] MSX IT +53F9F45312FE0DF4A11B291E8F72BA3B E.A.S.E. - Philips Desktop v1.1 (1988)(Philips)(IT)[mouse] MSX IT +4907254D9AC720698DCF93B309C99596 E.A.S.E. - Philips Desktop v1.1 (1988)(Philips)(M4)[a][mouse] MSX M4 +A16C69D4E2563D970A2AF6EA6FF8923E E.A.S.E. - Philips Desktop v1.1 (1988)(Philips)(M4)[mouse] MSX M4 +8BB347D9BDA880D91C3667A8DFE7D5FB E.A.S.E. - Philips Desktop v1.4 (1988)(Philips)(M5)[mouse] MSX M5 +7B668590C790619E9397AE165B8D2754 Fastcopy v3.0 (1991)(XelaSoft)(NL) MSX NL +A578E42DED14B43B4EDCA6394F076919 Fastcopy v3.0 (1991)(XelaSoft)(NL)[a] MSX NL +683B86CEB94B1C722D550CE2D6B5CEEC Final Graphics v2.0 (1989)(H.S.H. Computer)[mouse] MSX +EC05F1D1A58768D00CCC075CD231563B Graph Saurus v1.0 (1989)(Bit2)(JP) MSX JP +C3D7A0A9FF064236E496F9F92439765D Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 1 of 2) MSX JP +752AD8933073930E879478D7AE8F8019 Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 1 of 2)[a] MSX JP +17BB6F2582D66374EAF582C3F391A669 Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 1 of 2)[a2] MSX JP +A3DF90BC77A410E508224BF2B9AAD78B Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 1 of 2)[a3] MSX JP +3404A10F216AAB1D019FECD6F2EFD674 Graph Saurus v2.0 (1991)(Bit2)(JP)(Disk 2 of 2) MSX JP +7A6B5F0FB9F2A9425B466188C82C4FE3 Halnote v0.4 (1986)(HAL Laboratory)(JP) MSX JP +F2D484141CAF6804D95087A633C5AC39 Halnote v0.4 (1986)(HAL Laboratory)(JP)[a] MSX JP +BF941118D5FB21877E90DB0BFF449D17 Luk (19xx)(-) MSX +124F946991EAEB53BD8D6B66CDA802B5 Luk (19xx)(-)[a] MSX +0D031320EE8AD42DC02641E2BFF5134C Mega Disk Copier & Sector Editor (19xx)(-) MSX +45F24DD1771CAB2E76D7189A861D0F43 Memman v2.0 (1991)(MSX Software Team)[needs MSX-DOS] MSX +925EB86936ED2A110939F7AF5DF7DCD5 Memman v2.42 (1992)(MSX Software Team) MSX +E30ADF9F18A591BFB34A8903054DA7B0 Micro Music v3.1 (19xx)(MSX Computer Club Enschede)(NL)[press SHIFT-SELECT for menu] MSX NL +3E324B199F04F38D45D5EDFD76181F19 Midas OS (19xx)(-) MSX +E380E1E8B68F37D7748AF83C7465CBBB MSX BASIC Kun Plus v2.1 Programs (1992)(ASCII)(JP) MSX JP +120196CDA3B91F8BDAD3DBAC5E670134 MSX MuSIC Editor (19xx)(Mitsubishi Electronics)(JP) MSX JP +3323D9FF2CD105E580EBA0D24F53BAB9 MSX MuSIC Editor (19xx)(Mitsubishi Electronics)(JP)[a] MSX JP +EEB56AB0D068DF32D766CF59260EF03D MSX Paint IV (1992)(Juan Salas)(NO)[a][mouse] MSX NO +4138FCAAB10B3752F25DA6E2564E701E MSX Paint IV (1992)(Juan Salas)(NO)[a2][mouse] MSX NO +0F01A8455DC4544861ADF13D736A7A08 MSX Paint IV (1992)(Juan Salas)(NO)[mouse] MSX NO +7496ACA0F68FD7ECE6831371667D2A31 MSX-DOS v2.20 (1988)(Microsoft)(US)[needs MegaRAM 128k] MSX US +967362DBC2FAC87AAA9059C942CE42BB Norton Utilities v3.20 (1989)(Peter Norton) MSX +F66BC43F1164ED038E0C04C3C91D8293 Norton Utilities v3.20 (1989)(Peter Norton)[a] MSX +466663279F4E92AA098C42CBF5CB5698 Panasonic FS-SR021 MSX2 Word Processor (1988)(Matsushita Electric Industrial)(JP) MSX JP +3E064D4873C10EBB5A096F582721B95E Partition Changer for Sunrise ATA-IDE v5.0 (2000)(JDS)(JP)[needs MSX-DOS] MSX JP +E124D339B79C1194EFBC096E4AE4CF77 PCX Viewer v1.0 (1997)(Ricardo Bittencourt)[needs MSX-DOS] MSX +0D4D6C5A4DB92F8F05DC8374407D7DDF Pencil (19xx)(-)[mouse] MSX +03C1ABBFE3511F50F3ED0B6D4DC92D26 RAM-Disk (19xx)(-) MSX +5E080541E6A3A88B4E466FC48E610D0D RAM-Disk (19xx)(-)[a] MSX +7508CED02B171B76C04F688DFAFC8032 Salas Freehand v1.3 (19xx)(MSX Link International)[a][mouse] MSX +2E83E3E27F2CFCB8B430FEC1D0C6C8F0 Salas Freehand v1.3 (19xx)(MSX Link International)[mouse] MSX +A38FC88419361B302CB3D0926C9469DB SCC-Blaffer v1.0 (1999)(TeddyWarez)[SCC] MSX +CC62A16690AFC4611CDD389646534307 SCC-Blaffer-NT v1.62 (2001)(TeddyWarez)[SCC] MSX +56ABF0D40DBCBD451D7C35A30F82EA5E SII Anime - Graphic Editor (1993)(MSX-FAN)[mouse] MSX +21F2513BBB73BD456B8FE7F5FFCCFC0E Sony Graphics Editor v1.0 (1986)(Sony)(JP)[mouse] MSX JP +5E7ECED3E549A503A598B94832D1D7C5 Sony HBI-V1 Video Digitizer (1989)(Sony)(JP) MSX JP +212997591850E681EC8BA42B58DB95DD Sound Machine v1 (19xx)(Brainchild)(NL) MSX NL +9CCD9512ECED4BEB849608C84ACB0CA6 Synth Saurus v2.0 (1989)(Bit2)(JP) MSX JP +56A0077DE9A48B617ACC3F983D86C5F1 Tempo Typen (1986)(Radarsoft)(NL) MSX NL +D4ED6E7F29C01EB7576891FA2CB2BF9A Tempo Typen (1986)(Radarsoft)(NL)[a] MSX NL +DF869932F00679E8DF7CF4C50B724D30 Tempo Typen (1986)(Radarsoft)(NL)[a2] MSX NL +72621080E35AF65990508A9DF884AE3F UniPaint (1986)(Matsushita Electric Industrial)(JP)[a][mouse] MSX JP +4DDE6E566E40E1BA6C49D12E98879249 UniPaint (1986)(Matsushita Electric Industrial)(JP)[a2][mouse] MSX JP +29E2F936C413663B7F39B4BDF753632F UniPaint (1986)(Matsushita Electric Industrial)(JP)[mouse] MSX JP +E3A6165A25A28FDC0BB706DF52F8DBFD Universal Megarom Copy (1988)(SMA) MSX +4399F7B781DB62940EFC6784F0EC2033 Universal Megarom Copy (1988)(SMA)[a] MSX +411DC47B0793822B9C66D2C57609994B UZIX Applications (1999)(Adriano Cunha)[needs UZIX] MSX +4C99C8ACA7E77A3C383154B33402D446 UZIX v1.0.0 (2001)(Adriano Cunha) MSX +FC3F54E3D97D7226BF9046827951CB87 UZIX v1.0.0 (2001)(Adriano Cunha)[needs MegaRAM ACVS] MSX +2E0A6B1446AB1C8EBE512957DD042A81 UZIX v1.0.0 (2001)(Adriano Cunha)[needs MegaRAM DDX] MSX +1BE4BD5517B102C0CCA9AB461DA6B953 UZIX v1.0.5 (19xx)(Adriano Cunha)(beta) MSX +F87066D8B5F5359FE99B278EF2705843 UZIX v2.0.0 (2001)(Adriano Cunha) MSX +A5AA363D3131B8F795C94C837F20314F Video Graphics (1986)(Matsushita Electric Industrial)(JP) MSX JP +15D6C0EA5EB909BE2C28A1A2D4DA9499 Yoshida Konzern. Game Editor 2 - Demo Game 1 (1990)(MSX Magazine)(JP) MSX JP +CA1DCB600C457409532BC88E013EBD52 Yoshida Konzern. Game Editor 2 - Demo Game 2 (1990)(MSX Magazine)(JP) MSX JP +89FBBE63FF538205904033447ECDB3BD Yoshida Konzern. Game Editor 2 (1990)(MSX Magazine)(JP) MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Compilations - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +E54892C64C51D10FD963AFDB66D9C8ED B Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 1 of 7)[b] MSX NL +9CA81866F607117F67B04D59804127AF B Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 3 of 7)[b] MSX NL +299BF5C6C324F2B08503C274891D04A9 B Konami Game Collection Special (1989)(Konami)(JP)[b][SCC][MSX1ready] MSX JP +DA46222593F547BA266FE6A21ECF7A65 B Xevious - Fardraut Saga + Contra. Gryzor (1989)(Namcot - Konami)(JP)[cr SMA][b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +80BEDB3736E3F313F80E25978FFEF8A5 H Affaire, L' + Les Passagers du Vent (1986)(Loriciels)(FR)(nl)[cr Star Frontiers] MSX nl FR +6A35FF6413083E635509D2FE2BB40BAD H Xevious - Fardraut Saga + Contra. Gryzor (1989)(Namcot - Konami)(JP)[cr SMA][b2] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +B14E867B7792AE82AA9039CFCA8E16B5 O Z80 Turbo Pascal v3.3f (1999)(MSX Computer Club Enschede)(NL)[o] MSX NL +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +FE27FF7DA27F691F9CBBF2586FBD83F3 Django Collection - Disk 1 (1989)(Django)(FR) MSX FR +5D023EFBEF7694A7AA7F7C0084C462F7 Django Collection - Disk 1 (1989)(Django)(FR)[a] MSX FR +63D7B7248C5DE7CD8C1F8817B733604D Django Collection - Disk 2 (1989)(Django)(FR) MSX FR +BC8E65370FE3F30B2FE36D62DA468930 Django Collection - Disk 2 (1989)(Django)(FR)[a] MSX FR +87828D795D03C23CB6047E50D025E680 Django Collection - Disk 2 (1989)(Django)(FR)[a2] MSX FR +77DCBDCB7F7345E02852DA7E3C332D64 Django Collection - Disk 4 (1989)(Django)(FR) MSX FR +20F716C47991FAB560B3614FFBFE7C54 Django Collection - Disk 4 (1989)(Django)(FR)[a] MSX FR +F2D9FB30872399AD3EC48B694237170D Django Collection - Disk 4 (1989)(Django)(FR)[a2] MSX FR +598BD67947CF9E30A6DF590DBF2D1882 Erotic Pac #1 (1989)(Sink System)(FR)(Disk 1 of 2) MSX FR +35DF10FA0222E0AFC587E21B51A17638 Erotic Pac #1 (1989)(Sink System)(FR)(Disk 2 of 2) MSX FR +96DDBD1CEBAAE0F788BD15B9AF18E831 Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 1 of 7) MSX NL +9CF5E820C14DF0391E9CCFEDB51BAD6B Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 2 of 7) MSX NL +CDE3E92FE092CAA4C3F6579D664EE12E Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 3 of 7) MSX NL +475842220B0229508E8C102C9E7C1243 Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 4 of 7) MSX NL +94683950DCE303492996DB8BAA848D54 Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 5 of 7) MSX NL +8F9F682C66CECA36788B2FD847B8D838 Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 6 of 7) MSX NL +FDFE38B410E35A611FB4294F0CB57D95 Games Collection 2, The (1988)(Eurosoft)(NL)(Disk 7 of 7) MSX NL +009D500ED6B3C872C066E2BD76D99377 Games Collection, The (1988)(Eurosoft)(NL)(Disk 1 of 4) MSX NL +BA91949273317E26D69160D7137BCBDD Games Collection, The (1988)(Eurosoft)(NL)(Disk 2 of 4) MSX NL +48D8FECF0D631734616DA97B2B5D08CE Games Collection, The (1988)(Eurosoft)(NL)(Disk 3 of 4) MSX NL +B6BAAB20611D2417DD316EA9AEFAFC53 Games Collection, The (1988)(Eurosoft)(NL)(Disk 4 of 4) MSX NL +5BBA5B1D0B6930F03A85DF3914BA1FDA Konami Game Collection Special (1989)(Konami)(JP)[a][SCC] MSX JP +B106CF75E579B498E0BA66E43E377C91 Konami Game Collection Special (1989)(Konami)(JP)[a][SCC+] MSX JP +E79E008463109A62FABF06D3E2D570FE Konami Game Collection Special (1989)(Konami)(JP)[a2][SCC] MSX JP +5921B86FC6C94308BBDF409B0D3C7C4B Konami Game Collection Special (1989)(Konami)(JP)[SCC] MSX JP +A304F87B78301C66F8CD006BF8C09860 Konami Game Collection Special (1989)(Konami)(JP)[SCC][MSX1ready] MSX JP +257B244FF24A66E4B75C88359B12AA9C Konami Game Collection Special (1989)(Konami)(JP)[SCC+] MSX JP +7EC07FC56B7F4B017A1462CC43CD140A MSX-FAN Fandom Library 8 (1990)(Technopolis Soft)(JP) MSX JP +5E8DBFF290B1882715CCFAE270E543C0 Nagi-P Soft Games (1991)(Nagi-P Soft) MSX +FD819A340B21625DF9EA79421D7595C7 Pana Amusement Collection 1 (1988)(Panasoft)(JP) MSX JP +A07C660413AE3430245ECFE7F2811A05 Pana Amusement Collection 1 (1988)(Panasoft)(JP)[a] MSX JP +A01E098936BD1AAD9F43A920C78B574F Pana Amusement Collection 1 (1988)(Panasoft)(JP)[a2] MSX JP +887F48E1EC98F5A7F909BA09125C5607 Pana Amusement Collection 2 (1988)(Panasoft)(JP) MSX JP +26AEFCF95AAC06B81192C4903B58DB40 Pana Amusement Collection 2 (1988)(Panasoft)(JP)[a] MSX JP +7D5345451846F06D51EF7A83CAC68033 Pana Amusement Collection 2 (1988)(Panasoft)(JP)[a2] MSX JP +99D5712A2D462890001DEF8C99C836E6 Yoshida Koumuten Data Library Vol. 1 (1990)(MSX Magazine)(JP) MSX JP +0F4952E6BF8F4224463965B561354E91 Zowazo World. Zaworzo Robot Construction + The Flintstones (1989)(MSX Magazine - Grandslam Entertainments)(GB) MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Demos (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +982218CE55F796A8054FC2F0E3EE7555 Alice Soft Demo (1989)(Alice Soft)(JP)(Disk 1 of 2) MSX JP +7EB80EA3B216D8EBDF4318FCA395BF35 Alice Soft Demo (1989)(Alice Soft)(JP)(Disk 1 of 2)[a] MSX JP +DB213E7ACF58C581A5241859D29A9D52 Alice Soft Demo (1989)(Alice Soft)(JP)(Disk 2 of 2) MSX JP +5C248A76287F85DA8BA8E02B3AFCF625 Alice Soft Demo (1989)(Alice Soft)(JP)(Disk 2 of 2)[a] MSX JP +228F2C32210B9056522280C47398FCC0 Anma's Amusement Disk (1992)(Anma)(NL) MSX NL +5E8B4826AA45AF8469FDDA49F67566F1 Arc (demo) (1990)(Parallax)(NL) MSX NL +1BB572D2621CA6BBD15AE019F577B436 Arc (demo) (1990)(Parallax)(NL)[a] MSX NL +03C2EA0D2C2837634AE79AB4F8380B84 Ark-A-Noah (demo) (2000)(MATRA)(ES) MSX ES +AAED6DB414487E534A442CE53016DF96 Axe - The Real SCC Demo (1989)(BCF)(NL)[SCC] MSX NL +23DF390AF3F3B95147F29D99F5971EE7 Bass Demo, The (1988)(XelaSoft)(NL) MSX NL +FA5DDE5FA2CA64A670C3A289E9665C79 Bass Demo, The (1988)(XelaSoft)(NL)[a] MSX NL +48D83DF69BFECB74C89A106DC344CD13 Bomb Jack (demo) (2004)(Kralizec)(ES) MSX ES +7D92DEEFC1DA35163830CF74E167F4B9 Boss, The v1.2 (19xx)(Martos)[SCC] MSX +D69D04DB11771128EEEBB6B2D14986E0 Bubble Rain (demo) (2001)(Imanok) MSX +92999F04CDB3235D0DECC8EFE391AD2C Calculus Demo (1997)(Compjoetania)(NL) MSX NL +D98C97592E281AB600BCF8214848B1F1 Captures Double Vision (1987)(-) MSX +7B65AE470D9F31E04EE5768E0018D4B8 Cat 'n' Mouse (demo) (2002)(Imanok) MSX +B6EE1F9BE159388733105E893ECDAD0A Cavaleiros do Zodiaco, Os (1996)(-)(BR) MSX BR +3036C7BB9205354980F75914FE2A66A9 Cavaleiros do Zodiaco, Os (1996)(-)(BR)[a] MSX BR +0D3596971865D61AFAF6579105DF706F Cochon (1987)(-)(FR) MSX FR +79EB43EDE931ADEA1CCA12D748E69D74 Cochon (1987)(-)(FR)[a] MSX FR +6E23606C200577937D3363D52CED860B Compile's Music (1988)(-) MSX +9B6F7CDBFD5405BA6AC0394EF7CC8B47 Coral 2 Demo (2004)(Infinite) MSX +338EC8DFE53522D5AB5C0E846DEB2757 Dahku (demo) (2005)(Kralizec)(ES) MSX ES +C50B162BD990C64995C24EDA6825BAB4 Demo Digitalizaciones (1987)(Majara Soft)(ES) MSX ES +7ED73CD429F43E439BAF29C22ED4543C Demo Digitalizaciones (1987)(Majara Soft)(ES)[a] MSX ES +6D18D75AC96F9EEAFA085CFDD3EC1676 Diskcoo 3 (1989)(Fabrice)(FR) MSX FR +24893B4B5678DC95990438B7A8708805 Diskcoo 3 (1989)(Fabrice)(FR)[a] MSX FR +923D8F9F5BAECEBBEB2391010D22FE83 DIX (demo) (1992)(MSX Engine) MSX +472C9067FC1D5B4FB7BAD231F18B67D3 DIX (demo) (1992)(MSX Engine)[a] MSX +C7D0D179E5291713AC7B251142EBB6AF Dracula Demo (19xx)(X.M.V.)(ES) MSX ES +2E1F2ED8CD2C837E28B14C8CFFBC9D5E Eggbert (demo) (1993)(Fony)(NL) MSX NL +9EED8188C9322372E46835C3AC9FA7A4 Encuentro Usuarios MSX (1992)(Nexus-Barcelona)(ES) MSX ES +7453B17962513C60C72A1CC822D60922 Fac Demo, The (1988)(Gizmo) MSX +A416960405EE4A0EAE035003414A6EB2 Fony's Demo Disk 1 (1991)(Fony)(NL)[SCC] MSX NL +CF8D5A599FAADC6DD2CD194DCE6C8E86 Fony's Demo Disk 2 (1992)(Fony)(NL)(Disk 1 of 2) MSX NL +AA00F8E12CE28D5683603DCD3D694702 Fony's Demo Disk 2 (1992)(Fony)(NL)(Disk 2 of 2) MSX NL +0FC845233E0AF8864238D36028BE6FB9 Fony's Demo Disk 2 (1992)(Fony)(NL)(pre-release) MSX NL +47F4804099D0052BA020DB989F390B63 Fruta Prohibida (1988)(-)(FR) MSX FR +DB13058519BA98BEE7C0C0BCDE98D388 Fruta Prohibida (1988)(-)(FR)[a] MSX FR +363B1838BEA33BC8A8570DF7C9A7C3C3 Fun-Demo (1991)(First Class Software)(NL) MSX NL +4D16E114458652CE7053532DFAA88919 Fun-Demo (1991)(First Class Software)(NL)[a] MSX NL +38C676CC516C14600C681F27282FB51C Future Time Demo (1991)(Sander Soft) MSX +7CADEBC05C2DEE4A84D71A4F0F61D2F0 Future Time Demo Part I (1990)(Sander Soft) MSX +C9D1ADAAE9E2A937C4F0F0EE289189F4 Girl Map (1990)(MAP)(ES) MSX ES +4EBD17A0F018F8449099F17F5EC9CED0 Graficos (1994)(Betacom Soft)(ES) MSX ES +25C2C833EB158F1284100F7B591582F3 Graficos (1994)(Betacom Soft)(ES)[a] MSX ES +C2925C48619242DE4C6A751D9FF78A82 Happy Demo (19xx)(Merla Soft) MSX +8164D7000B5C6EDFA09570772248C281 Happy Demo (19xx)(Merla Soft)[a] MSX +B4018D25C168B45A766157F9EA45DF09 Haunted Demo, The (19xx)(Merla Soft) MSX +03DDD350B236A52E9AE195F32478CAD1 Haunted Demo, The (19xx)(Merla Soft)[a] MSX +95A41645E7090E77840746F94267F56D Havoc, The (1990)(Traposoft) MSX +FF3213400B929BF0F135D26025B2CAEB Havoc, The (1990)(Traposoft)[a] MSX +3E7FD64653BD61E8D988BA98726BAB9A Hot Love 2 (19xx)(-) MSX +8BDD0A0A55892C9768BD6E94F50505AF Jolt Demo (19xx)(-) MSX +908AAA1E4A88B9E02566D63B7AF6510B Jolt Demo (19xx)(-)[a] MSX +7F4C399F1146E59D660E5AA8EA0793B8 Keinsei II - The Revenge of MSX (1989)(Nikos Software)(IT) MSX IT +E1C4B7DDC63B2FCF7A81575A78B172B0 Leauty (19xx)(-) MSX +1A71939BDDD72C06907974BC12ED1C61 Lemon (19xx)(Club Mesxes) MSX +3F986E34AC7B47C8D41B75BCD36FF705 Magical Labyrinth Remix (demo) (1995)(Gigamix)(JP)(beta) MSX JP +6CE860C216FB72A51A691077A303B36C Migicon Scroll Text (1991)(Slayerman) MSX +2B326E358F2D1B8402C13C93A693A86D Moni Moni Theater (19xx)(-)(JP) MSX JP +5C6D0A1918FADA72976EC1D860D09227 Music Demo (19xx)(JLSA Soft)(NL) MSX NL +88278B085F088F759A96F1D4D5BA5994 Nightmare on Elmstreet 4 (19xx)(Unicorn)(NL) MSX NL +DBE84290638F1518001B354D441985E8 Playboy - Alles Wat Mannen Boeit (1987)(Powersoft)(NL) MSX NL +29265A432FA1F6A177BDA9FC1D101E98 Playboy - Alles Wat Mannen Boeit (1987)(Powersoft)(NL)[a] MSX NL +48BF51AF5FEB18961B4F5DC2DE58D94F Pumpkin Adventure III (demo) (1995)(Umax)(NL) MSX NL +45BD46C816E3126101E25B49E9557D8A Pumpkin Adventure III (demo) (1995)(Umax)(NL)[a] MSX NL +87015115E50AFA11294DC3821BC21D12 Ray Gun - Image Loader v1.0 (1992)(Danilo Danisi)(Disk 1 of 3)(Start Disk) MSX Start Disk +A7AFBB10DABDFC3E9143A7767BC58E25 Ray Gun - Image Loader v1.0 (1992)(Danilo Danisi)(Disk 2 of 3)(Images Disk) MSX Images Disk +50A7FB65E8A04F84C9CC3A98C8278521 Ray Gun - Image Loader v1.0 Demo (1992)(Danilo Danisi) MSX +A12A1F70C21B7413B827CE3D7B0F7450 SCC MUSIXX Music Loader v1.02b (1991)(Gamesoft)(pre-release)[a][SCC] MSX +4D87F09F0963B64760BD1F77DD017F4C SCC MUSIXX Music Loader v1.02b (1991)(Gamesoft)(pre-release)[SCC] MSX +8120A541DB8664DA4504026B88EC9DE5 Sex Bomb Bunny (demo) (2000)(MATRA)(ES) MSX ES +6ECDB23D83BEFA05BF79F53A9A4DD448 Sex Bomb Bunny (demo) (2000)(MATRA)(ES)[needs MSX-DOS] MSX ES +8549A7972CB2495DE00A08FC3EAB34B3 Sexy Academy (19xx)(L.M.) MSX +475D0B4DA782954A669543870FDF0A53 Shuffle Puck (demo) (1993)(M.A.D.)[mouse] MSX +847D29CF03DBA1800137DFA9B7FDB69E Sphere 2 Demo (19xx)(-)(ES) MSX ES +1F29D31FB5A69433003DF897144534B2 Sphere 2 Demo (19xx)(-)(ES)[a] MSX ES +81A2073DD836E86ACC13767C9999F962 Sphere Demo (2005)(Infinite)(Disk 1 of 2) MSX +C7FEFC0E733F9602D8F3EB642D5F8145 Sphere Demo (2005)(Infinite)(Disk 2 of 2) MSX +BE53F31D1AAE8756595CDBA81AF5344D Star Wars (1988)(FT-Soft) MSX +845E25102A73173BB6CD2CF5ACD2254F Superstars of Wrestling (1992)(Enigma-Soft) MSX +75EFBA8A6BB8206465A3EE8134EBFC68 Teddy's in Action Demo v1.2 (1998)(TeddyWarez)[SCC] MSX +9D3C2C2645AB20BAAC6F1D716C486ECF Teddy's in Action Demo v2.0 (2001)(TeddyWarez)[SCC] MSX +6CF2432B50F96437B21EA05B0E8A220E Tenor, The (demo) (1989)(-) MSX +7DBF4E484CEAFF28C352A30C05033270 Tenor, The (demo) (1989)(-)[a] MSX +2DE665EEBD482A4C470C3A1697FE16AF Tenor, The (demo) (1989)(-)[a2] MSX +F7907C15A5BAB99ABB9E63BADA9BE925 Total Parodius (demo) (19xx)(Gemilis Art) MSX +9D5FD3C05CAD4C29D015A93B4DDFA5EA Tunez Demo - Garfield Edition (1999)(TeddyWarez) MSX +C96D0CCB1455B5EE75976951601224C4 Tunez Demo 2 - Asterix Edition (2000)(TeddyWarez)[SCC] MSX +CC1AA40EA7748B3DA84FC5718CE6979A Ultra Sonic Waves Demo (1999)(TeddyWarez) MSX +E20AB557297EAFB2230089E05385FF82 Uncle in Brazil, An (1995)(Abbys)(BE-NL) MSX BE-NL +A36CB513257DDDF7429D9E2C4EF87419 Unicorn Corporation Demo (1990)(Unicorn)(NL)(Disk 1 of 2) MSX NL +7CE09691CA2D97FE6C134C0C07356E22 Unicorn Corporation Demo (1990)(Unicorn)(NL)(Disk 2 of 2) MSX NL +9851EC8AD6C22F19E578C68308971D84 Uxsis (19xx)(-) MSX +F829E84B45DC7424C22C73445BC0DE0E Uxsis (19xx)(-)[a] MSX +DEA1F906674ABDD4F91A48AF972180E3 Wast Year Iron Maiden (1989)(Unicorn)(NL) MSX NL +14FE2BBFA191677CCA45BFDD670379FA Wings Demo (2005)(Infinite)(Disk 1 of 2) MSX +077CB8A428D1C2407E662A0948059891 Wings Demo (2005)(Infinite)(Disk 2 of 2) MSX +E6181F9020B246C0C9B70E7657537B42 Yupipati (demo) (2004)(Paxanga Soft) MSX +0F4952E6BF8F4224463965B561354E91 Zowazo World. Zaworzo Robot Construction + The Flintstones (1989)(MSX Magazine - Grandslam Entertainments)(GB) MSX GB +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Educational (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +E8F9D0F103433E3E1F58F6490A934A23 B Topografie Wereld (1986)(Philips)(NL)[b] MSX NL +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +CDD8E0D4A059391F9093277B7A3C3477 H Aerobic (1986)(Philips)(ES)[cr Joan Angel] MSX ES +CF11C138A1FB37C55970457AD3C2A1DD H Aerobic (1986)(Philips)(ES)[cr Joan Angel][a] MSX ES +854987E157144BCBC166D40E3B41FE4C H Aerobic (1986)(Philips)(ES)[cr Joan Angel][a2] MSX ES +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +F502FE2F4BF8DEB2D4E863E63B890863 Anatomie de l'Homme (1987)(Forum Micros)(ES) MSX ES +5ED1E4C844AA5F966DDB2182310BB948 Anatomie de l'Homme (1987)(Forum Micros)(ES)[a] MSX ES +488F1AFBAF290130FD279DE7CC9A9C0A Circulation du Sang, La (1987)(Forum Micros)(ES) MSX ES +168F36AB050C1086DF09857BD736DB35 Circulation du Sang, La (1987)(Forum Micros)(ES)[a] MSX ES +54E5F5942DE7CA306F6460359846E7F1 English Holidays (1986)(Philips) MSX +3A2DA5F1C57F1367AB8676B7A170478D English Holidays (1986)(Philips)[a] MSX +C2D0DBFA73779A98E7A34216C2A6CAC5 Patagoras Software educativo - Los Gases (1986)(Philips)(ES) MSX ES +DAD73EDBAF941350FC97A8F4DF9109D7 Patagoras Software educativo - Los Gases (1986)(Philips)(ES)[a] MSX ES +BDCC576069A0D1EFF349B043B0C5CA39 Patagoras Software educativo - Los Gases (1986)(Philips)(ES)[a2] MSX ES +B5DC7B086C59A9BCC5449CDE02CC4EC6 Rallye du Savoir, Le (1987)(Forum Micros)(FR) MSX FR +A7D7321B3A33E373FE3A0A53389747B4 Rallye du Savoir, Le (1987)(Forum Micros)(FR)[a] MSX FR +72129446269B9B51B52440D4E4068F9B Rallye du Savoir, Le (1987)(Forum Micros)(FR)[a2] MSX FR +8A2957FA9B0E9E54E59576EEA7BFD480 Rekenwonder (1986)(Philips)(NL) MSX NL +DF86012D8AB35196A4F8FD8080600D2B Respiration, La (1987)(Forum Micros)(ES) MSX ES +929040CF8D2B61AAEA0FC488D63A19F8 Respiration, La (1987)(Forum Micros)(ES)[a] MSX ES +332B363FE8ADEBD624AC25213B79FE24 Squelette, Le (1987)(Forum Micros)(ES) MSX ES +F2ED78A4CE0A057D71B3ED8046707BBE Squelette, Le (1987)(Forum Micros)(ES)[a] MSX ES +B3203AA866FFA72543F17E7DC6953B80 Topografie Europa (1986)(Philips)(NL) MSX NL +5320111461B2A36A344D57197EE3F07B Topografie Europa (1986)(Philips)(NL)[a] MSX NL +A0E035678F049989F027C6765CB5DDCF Topografie Wereld (1986)(Philips)(NL) MSX NL +E6181F9020B246C0C9B70E7657537B42 Yupipati (demo) (2004)(Paxanga Soft) MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Games - [DSK] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:22 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +3D056A1812740BFCFDBC62F8B0A88062 B Adventurer (19xx)(-)[b] MSX +5C7C60F96A3B2BC39D31F2DBD36D7477 B Aguni no Ishi. The Stone of Aguni (1989)(Humming Bird Soft)(JP)[b] MSX JP +E1FAD2C453AA38A3FB435A7CB55B9433 B American Success (1989)(Winky Soft)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +23A779C4D8A0F25723713E855DD98565 B Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +680DE90DAEDC7099FE2A15E6DEB9F045 B Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 2 of 2)(Data Disk)[b] MSX Data Disk JP +27357D9563FCD6F167DD339BC45226E7 B Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 1 of 5)(Game Disk)[b] MSX Game Disk +D6C9388ED214780DA7A7C09F1E3D17F5 B Angelus (1988)(Enix)(JP)(Disk 1 of 3)[b] MSX JP +D065022467EC5B6EBB45006AB6E6EE44 B Ankoku Shinwa - Yamato Takeru Densetsu. Dark Myth Climax Takeru Legend (1988)(Tokyo Shoseki)(JP)[b] MSX JP +7C043651561ECFC3A9965D114FAB8816 B Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 1 of 4)[b] MSX JP +0C027CD576405FD2DDE24AA91EB2DBF8 B Arguis no Tsubasa (1988)(Kogado)(JP)[b] MSX JP +10D3FD27B9CADA2ACD463D8EA412E8E0 B Bastard (1987)(Xain)(JP)[b] MSX JP +1656F28222CFAD7AC206BBC9C9DB8F7F B Be-Bop Bout (1994)(Mar'z Project)[u][b] MSX +B54C2E33AE1F6ED323D519F1B7B988B4 B Birdy World (1992)(Birdy Soft)(JP)(Disk 1 of 3)[b] MSX JP +0F562D376275178F33B3EFDD9286D137 B Birdy World (1992)(Birdy Soft)(JP)(Disk 3 of 3)[b] MSX JP +B5CD5C890E967DAF78DF6852D9CE1CA0 B Bishoujyo Daizukan. Girls Library (1992)(Fairytale - Cocktail Soft)(JP)(Disk 1 of 3)[b] MSX JP +FB871F4D7DEFBD1E7C8AA907A106A402 B Burai II (1992)(Brother Industries)(JP)(Disk 1 of 9)[b] MSX JP +D5F39E97EA6A26EDB428F6E0B1FC4412 B CAL 1 (1991)(Birdy Soft)(JP)(Disk 1 of 3)[b] MSX JP +A9AF03E9614C63D68CB347B842E23D35 B CAL 2 (1992)(Birdy Soft)(JP)(Disk 1 of 5)[b] MSX JP +ADCD9914EAF6A2BEBD9325022AEC8867 B Can Can Bunny (1990)(Cocktail Soft)(JP)(Disk 1 of 3)[b] MSX JP +226BFB624ECE099B85025418886C9C85 B Can Can Bunny Spirit (1991)(Cocktail Soft)(JP)(Disk 1 of 4)[b] MSX JP +9AFD4A00D0F83AE58AF54A408F12F724 B Can Can Bunny v2 (1990)(Cocktail Soft)(JP)(Disk 1 of 3)[b] MSX JP +3F7998C6F112517C546C2FF449236F1A B Cita con Rama (1986)(Idealogic)(ES)(Disk 1 of 2)[b] MSX ES +C433112CA86D593C4FABB74ADB458CB6 B Columns (1990)(Telenet Japan)(JP)[b] MSX JP +9A2D283E22A7D3F67375131549BF4A7D B Cosmic Soldier (1985)(Kogado - ASCII)(JP)[b] MSX JP +C52530159395B9D21194A02B65014E25 B Crimson (1987)(Scaptrust)(JP)[b] MSX JP +E6449B6FC9C7F1A478C95DF4170EAD67 B Crimson III (1990)(XtalSoft)(JP)(Disk 1 of 3)[b] MSX JP +3BD62014ABD5D7B42FECE95227F655E0 B Daikoukai Jidai. Uncharted Waters (1990)(Koei)(JP)(Disk 2 of 2)[b] MSX JP +FBA407BE9C1A8031F3D967C994C14F40 B Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 1 of 2)(System Disk)[b] MSX System Disk +B5934B6D1ED28A6B504D320D5658291D B Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 2 of 2)(Data Disk)[b] MSX Data Disk +C3A569073225454E535EA95C9B782F40 B Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(JP)(Disk 1 of 2)(System Disk)[b] MSX System Disk JP +A28F85D158ACC38BBD643938CA0B2D34 B Daisenryaku II - Campaign Version. Risk II v2 (1992)(Micro Cabin)(JP)(Disk 1 of 2)(System Disk)[b] MSX System Disk JP +F24BDA807A1700B3E4CFBE6D919559F9 B Dancing Mai (1991)(Fairytale)(JP)(Disk 1 of 4)[b] MSX JP +40ACBBC324D482B4CFBB3237D4629157 B Dead of the Brain - Day of the Living Dead (1992)(Fairytale)(JP)(Disk 1 of 3)[b] MSX JP +5214F0A6A967ABDB8EC52BDE837996C3 B Dios (1989)(Xain)(JP)(Disk 2 of 5)[b] MSX JP +128A6BA64292D24A276E0D12D05CF6EE B Disk NG 1 (1989)(Namcot)(JP)[b] MSX JP +D9B3FFB157D134DADC86A7D45B895D3E B Dome, The (1989)(System Sacom)(JP)(Disk 2 of 2)[b] MSX JP +7953604733BFD8ADFD600EAB1DE4FC26 B Dragon City X (1991)(Fairytale)(JP)(Disk 1 of 4)[b] MSX JP +03F4A5223C6161794AD29805D3B0BBF3 B Dragon Quiz (1991)(Compile)(JP)(Disk 2 of 2)[u] MSX JP +B52A8B8EB15F06D8345C8A8BC15ADB5B B Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 1 of 2)[b] MSX +F08DBBDD6A3D810104E0F08FA6F094D9 B Eindeloos (1986)(Radarsoft)(NL)[b] MSX NL +882F6185AEB307C2164D67D27C288772 B Emerald Dragon (1990)(Glodia)(JP)(Disk 1 of 5)(Visual Disk A)[b] MSX JP +A65B3507D3F2C48487A63E60B2845292 B Emerald Dragon (1990)(Glodia)(JP)(Disk 2 of 5)(Visual Disk B)[b] MSX JP +D8E45D1321EAFC656FEBC23C8243831C B Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP)(Disk 1 of 2)[b] MSX JP +207BFD8B8590ECCBBB2FE6E4CC18E532 B Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 1 of 2)[b] MSX JP +2DE9F5AFF154ACE82AD9031134ABFCA1 B Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 2 of 2)[b] MSX JP +73B3C29D5F14A64DF03D0523259A125B B Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 2 of 2)[cr The Boss][b] MSX JP +5B2BF621AB38E1102C344051A30BDE5B B Feedback (1988)(Tecno Soft)(JP)[b] MSX JP +745D0DB8CD19DF3C7A7F5AC84B0A317D B Feedback v2 (1988)(Tecno Soft)(JP)[b] MSX JP +BAE1D63766DD1D65FF340391CA32E9F0 B Final Fantasy (1989)(Micro Cabin)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +C310D054E442CF0F5DD6A940651FF575 B Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2)[b] MSX JP +C143C0787777984F50020921BA07C61C B Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk 0)[b] MSX JP +12D8606143C699066E135B1C993260F6 B Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 2 of 4)(Opening Disk 1)[b] MSX JP +C10CFE7650F9CFD05A84801C5EFDDE19 B Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 0)[b] MSX JP +9D7759D6770AF13E7B558B914B6F0C49 B Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 1)[b] MSX JP +070242871B88898A5E6203A852B1BF37 B Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 1 of 4)[b] MSX JP +32D2867FFE801586F18625B1112F4FAA B Genchouhishi (1992)(Koei)(JP)(Disk 2 of 2)[b] MSX JP +3378352B5E73DFA43A6B05F93599E166 B Genghis Khan (1988)(Koei)(JP)(Disk 1 of 2)[b] MSX JP +4C5AD594BA69705E5612B425A01054BB B Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 1 of 2)[b] MSX JP +42FF3D74FEEF2CF37431C415F1B6D32B B Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 2 of 2)[b] MSX JP +3B400C11A83F1B55F642CFACC8B26604 B Golf Course Collection, The (1988)(Pack In Video)(JP)[b] MSX JP +09232DCA2857BF26C6E052E78BC7F4DC B Golf, The (1988)(Pack In Video)(JP)[b] MSX JP +24818560CC1E8EACBE73AC8DDED9A7CB B Goody (1988)(Opera Soft)(ES)[b] MSX ES +5E58B461147EDC05FF4252800B78A6FC B Greatest Driver (1988)(T&E Soft)(JP)(Disk 1 of 2)[b] MSX JP +CFF0B078EA9F7AA6CD87111268E6C334 B Greatest Driver (1988)(T&E Soft)(JP)(Disk 2 of 2)[b] MSX JP +886EFF8B9064DEA9603A6A254B18B435 B Greatest Driver v2 (1988)(T&E Soft)(JP)(Disk 1 of 2)[b] MSX JP +C702EEA217A4924F3A6D256AA5B52380 B Greatest Driver v2 (1988)(T&E Soft)(JP)(Disk 2 of 2)[b] MSX JP +9CEE8E5A6E38470374F31386DD49E761 B Gunship (1989)(Microprose Japan)[b] MSX +C90684BDE8548CE65A6869CCF2D9B371 B Haja no Fuin (1987)(Kogado)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +FF462960C42C30DBCA693658FD6AD540 B Hydefos (1989)(Hertz)(JP)(Disk 1 of 2)[b] MSX JP +A7E0B27E75A7CAA16233A9B4CB491965 B Ifr-Fly (1988)(Philips)[b] MSX +9A0E142F13A56EBB8F5E22FB2316623C B Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP)(Disk 1 of 3)[b] MSX JP +B6469975191CC0A949CE4D5D1C3C0B93 B Ishin no Arashi. Storm of the Meiji Restoration (1989)(Koei)(JP)[b] MSX JP +05135109257DF2277506E2B6413C1EF5 B J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 1 of 3)[b][mouse] MSX JP +BBBF183087D9B5CB8B42539B86AB7FAD B J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 2 of 3)[b][mouse] MSX JP +E40914EFF1E3AEC5791DC02A93F4D503 B Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 1 of 2)[b] MSX JP +D646762E44B9D8BD95F89376373E12DF B Jesus (1987)(Enix)(JP)(Disk 1 of 3)[b] MSX JP +49507215E0FB687B1EAE71F8BEE6F01D B Jesus (1987)(Enix)(JP)(Disk 1 of 3)[o][b] MSX JP +BDC5AE4ABD95D41535F4E92404C6D21F B Jesus (1987)(Enix)(JP)(Disk 3 of 3)[o][b] MSX JP +C7B7321DFC14FEADB2497245C6195112 B Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 1 of 2)(Opening Disk)[b] MSX Opening Disk JP +B75B2150D2F84C571129232CCF4A3775 B Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 2 of 2)(Game Disk)[b] MSX Game Disk JP +31D2EF67CB8CD2F528029DE00143D0B9 B Joker (1988)(Birdy Soft)(JP)(Disk 1 of 3)[b] MSX JP +1A7F91BB4F8DA3834A4EE95EED79F867 B Joker II (1989)(Birdy Soft)(JP)(Disk 1 of 4)[b] MSX JP +64858088066789D2CC2FDCFAF97A6962 B Joker II (1989)(Birdy Soft)(JP)(Disk 2 of 4)[b] MSX JP +043AE774CCFA9F21F0D29EA89E73A832 B Joker II (1989)(Birdy Soft)(JP)(Disk 3 of 4)[b] MSX JP +B93068075411FBEE9D1F31B4E96A5654 B Joker II (1989)(Birdy Soft)(JP)(Disk 4 of 4)[b] MSX JP +84F891E3E64628CCC99F7294D1372E47 B Kami no Machi (1990)(Panther Software)(JP)(Disk 1 of 5)[b] MSX JP +BEB0A383582BD2FC49C6ED657F3C48C8 B Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 1 of 3)[b] MSX JP +2D7FDD90A6C4F73A555014104C87B417 B Koroshi no Dress 2. Dress of Murder 2 (1990)(Fairytale)(JP)[b] MSX JP +8D2FFEC3481F67738321893AB88109DC B Last Armageddon (1988)(Brain Grey)(JP)(Disk 2 of 5)[b] MSX JP +858025562C0F7A2930BC5D68B11E0BD3 B La'Valeur (1989)(Kogado)(JP)(Disk 1 of 2)[b] MSX JP +569B71CAFE49C68FE89BDE0B7E115C81 B Leather Skirts (1987)(Methodic Solutions)(NL)[b] MSX NL +AF9ECE76F112E6F4D535D90F40B9DAC4 B Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 1 of 4)[b] MSX JP +B64155A3997D7D8B309652791BE52A4C B Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 1 of 4)[cr SMA][b] MSX JP +FF9D0609C6EA3DBAAE4D611ECF8B68AF B M.U.L.E. (1988)(BPS)(JP)[b] MSX JP +6BD657F675F8987D819606B83ED406F4 B Maison Ikkoku - Kanketsuhen (1988)(Micro Cabin)(JP)[b] MSX JP +2F90153F8CBF0C082FDA946814200BA3 B Maison Ikkoku (1987)(Micro Cabin)(JP)[b] MSX JP +0E2A3E4D4CE03B81853422B5308E32F4 B Metal Gear (1987)(Konami)(ES)[t][b] MSX ES +0D89D4296460E9A65F5CFA451E452976 B Navitune (1989)(Kogado)(JP)(Disk 1 of 2)[b] MSX JP +6E242AB70A1B13A840C85714C9676DB7 B Nobunaga no Yabou 2 - Sengoku Gunyuu Den (1989)(Koei)(JP)[b] MSX JP +1B4EBAFD7230CD18ADF465103DAB05CA B Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 2 of 2)[b] MSX JP +4E8329CC36947D8201C9265A65CACE92 B Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 1 of 3)[b] MSX ES +C07099E8E3114517953D51525EE59242 B Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 2 of 3)[b] MSX ES +B8D05C510C24872EE52D49A5E5C70070 B Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 1 of 4)[b] MSX JP +0C4EDF334969773EDA13286B0C5817A4 B Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 2 of 4)[b] MSX JP +43551C1C8FB3CC5FCCDF9E33E2CEB522 B Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 3 of 4)[b] MSX JP +1A775DC9F42B2EE92FB76E75A702B9A0 B Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 4 of 4)[b] MSX JP +0743528770A5F0906A5771B8AB14E84E B Nyancle Racing (1988)(Bit2)(JP)[b] MSX JP +6E2ADAA05FE5BCE444F402BAD7727900 B Princess Maker (1992)(Micro Cabin)(JP)(Disk 1 of 7)[b] MSX JP +8E82522D3720242A67159EBEF014170D B Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 1 of 7)[b] MSX JP +5AA68084E31D49D2AF98F1D22878C45C B Psycho World (1988)(Hertz)(JP)[b] MSX JP +4E110BB432520B58E7F9207054D02852 B Pyramid Sorcerian (1992)(Brother Industries)(JP)(Disk 1 of 3)[b] MSX JP +11E32E4AB0C158604CE266953BA70D5A B Pyramid Sorcerian (1992)(Brother Industries)(JP)(Disk 2 of 3)[b] MSX JP +440764D4CA7E00508C100A85880EC6C2 B Pyramid Sorcerian (1992)(Brother Industries)(JP)(Disk 3 of 3)[b] MSX JP +AD716A74EDF5D6F3CF1DCA67365B2F9D B Quibus (19xx)(-)[b] MSX +AE56D2093AA5F6F15BF7417F118B4824 B Rance (1989)(Alice Soft)(JP)(Disk 1 of 4)[b] MSX JP +182C8054C6F40DEB38BE8EDA41F04184 B Ray Gun (1991)(Elf)(JP)(Disk 4 of 6)[b] MSX JP +F6C0FE2D535D765C303941DE95784FF9 B Ray Gun (1991)(Elf)(JP)(Disk 6 of 6)[b] MSX JP +A0B71D34F27CD2F6A85051A3ED86844B B Record of Lodoss War Pack (1990)(Humming Bird Soft)(JP)[b] MSX JP +61A7F8A23607B84E6E0A030413A86ED5 B Red Lights of Amsterdam (1986)(Eaglesoft)(NL)[b] MSX NL +3F7F90FA204AE399978002058B0C8695 B Reviver (1987)(Arsys)(JP)(Disk 1 of 2)[b] MSX JP +84A06E6B26CDF1B1D5F1461181CD0DE6 B Rick Dangerous (1992)(Paragon Productions)(NL)[b] MSX NL +0B21EC7C60909163102A031AE3EBF203 B Robo Crush (1990)(System Soft)(JP)(Disk 1 of 2)[b] MSX JP +3D0C5D82985B23EEB97210E649A8232F B Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 1 of 3)[b] MSX JP +B1311EB3CA04742E5C9FF69F0D99AA0D B Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 2 of 3)[b] MSX JP +596E452BED24EB357BD6C044F3F0CE1D B Ryukyu (1989)(ASCII)(JP)[b] MSX JP +3BD33DB39B91D6A518FCF98A7DA3C323 B Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 1 of 3)[b] MSX JP +1A30459D5CE72D8FD18310461F639323 B Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 2 of 3)[b] MSX JP +12F6DA77CAE92A6FF9284C497B8B033B B Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +C39B0AD8294EE08A9F61351A1762BF5F B Sangokushi. Romance of Three Kingdoms v2 (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +A88AF07575C36953E4DE6B6EF5471E0C B Sangokushi. Romance of Three Kingdoms v3 (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk)[b] MSX Game Disk JP +AC051D0BA8E8FE84AA04463313D7716B B Saurus Lunch Vol. 0 (1989)(Bit2)(JP)(Disk 1 of 2)[b][mouse] MSX JP +740FAA6A8F6F1416633E40A113494317 B Saurus Lunch Vol. 0 (1989)(Bit2)(JP)(Disk 2 of 2)[b][mouse] MSX JP +FD5878F0988D41E43E2AB288231AE541 B Schwarzschild (1989)(Kogado)(JP)(Disk 1 of 2)[b] MSX JP +CDE07CAF8A41F59809BDA70F87E3F888 B Schwarzschild II (1990)(Kogado)(JP)(Disk 1 of 2)[b] MSX JP +984E01642641E4F6586E3066744EA495 B Seilane (1988)(Micro Cabin)(JP)(Disk 1 of 2)[b] MSX JP +E1B5C781B2C378E55E9C25D2D9022EB7 B Sengoku Sorcerian (1992)(Brother Industries)(JP)(Disk 1 of 3)[b] MSX JP +FC91005C142E1470882F680BF892F78C B Sengoku Sorcerian (1992)(Brother Industries)(JP)(Disk 2 of 3)[b] MSX JP +9836E2BC8FDEDA43BE7B2E924ADE66EE B Sengoku Sorcerian (1992)(Brother Industries)(JP)(Disk 3 of 3)[b] MSX JP +5FF6441EB5B39F7409B13CBA67D7B253 B Shanghai II (1989)(System Soft)(JP)[b] MSX JP +70D58FD74B803E249812BD70FCFD0A19 B Shin Ku Gyoku Den. New Legendly Nine Gems (1988)(Tecno Soft)(JP)(Disk 1 of 2)[b] MSX JP +DE694E630EFB9EC7A46250145BC99609 B Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 1 of 2)[b] MSX JP +114EF7B625BE16CAC1B30052D180D65A B Solitaire Royale (1988)(Game Arts)(JP)[b] MSX JP +45EE1F46F323C2CB40DD2DA874B080B8 B Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2)[b] MSX JP +58F3C3217416D0783BD4EBCA9017496A B Suikoden - Tenmei no Chikai. Bandit Kings of Ancient China (1989)(Koei)(JP)[b] MSX JP +EEB53265DC7466314D12E75D96E9A4E3 B Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[b][SCC+] MSX JP +091770A04A74E62D57AFA11FD794615D B Tetris (1988)(BPS)(JP)[b] MSX JP +03515640FC9AE896ABF630F64BC1DDC7 B Tetris v2 (1988)(BPS)(JP)[b] MSX JP +5990FE88B3ADC93EA254DC9A815EC871 B Tir-nan-og (1990)(System Soft)(JP)(Disk 1 of 3)[b] MSX JP +E8F9D0F103433E3E1F58F6490A934A23 B Topografie Wereld (1986)(Philips)(NL)[b] MSX NL +B685BAB720636669BAD707856EAC3215 B Topple Zip (1987)(Bothtec)(JP)[b] MSX JP +B51017D210A86139DD214D4AED27047B B Ultima IV - Quest of the Avatar (1987)(Pony Canyon)(JP)(Disk 1 of 2)[b] MSX JP +0A56A1EBCF6FF5B93CD59CCFEF0099AC B Undeadline (1989)(T&E Soft)(JP)(Disk 1 of 2)[b] MSX JP +0C9AF82B9957961D6813F1BD1C272F22 B Undeadline (1989)(T&E Soft)(JP)(Disk 2 of 2)[b] MSX JP +0D926363465174F3546C46C81D1B823C B Undeadline (1989)(T&E Soft)(JP)[b] MSX JP +3E0727707356EBAFD2C03B6EC6464B03 B Uranai Sensation. Fortune Teller (1988)(Konami)(JP)[b] MSX JP +C1F4509C1B32CEBD8CCCC6A0A4724B12 B Urotsuki Doji (1990)(Fairytale)(JP)(Disk 1 of 4)[b] MSX JP +65D85EE64DB7DE8E78D70D26A4C26E8B B Urusei Yatsura - Koi no Survival Birthday (1987)(Micro Cabin)(JP)[b] MSX JP +6910C171756914ED27A4CC358D140E1A B Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 1 of 4)[b] MSX JP +2B35C1F213DE79121D1A0ED2AC344A90 B What's Michael (1989)(Micro Cabin)(JP)(Disk 1 of 2)[b] MSX JP +026A00761340A6511CEBA9111603B864 B Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1)[b] MSX JP +7C6632C3FC79E31755D87CDADF21181B B Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 1)[b] MSX JP +1A48894A873B0C804B86007873D865F2 B XZR (1988)(Telenet Japan)(JP)(Disk 1 of 2)[b] MSX JP +11DB732692F6B5BA583D7260CA5597DC B XZR II (1988)(Telenet Japan)(JP)(Disk 1 of 2)[b] MSX JP +B87AEDDDB443864CF5D35992557A17BB B Yaksa (1987)(Wolfteam)(JP)[b] MSX JP +DC06EE7F34AA0504ACB1D2527C6A805B B Zowazo World. Zaworzo Robot Construction (1989)(MSX Magazine)(JP)[b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +0A39F7F361B4FEEF058B58E3508D353C H Amazonas (1987)(Idealogic)(ES)(Disk 1 of 3)[cr Joan Angel] MSX ES +45CF846A67923D7FE76588758478F60B H Andorogynus (1988)(Telenet Japan)(JP)[t Martos] MSX JP +C6E4F20A0832A0683851E09035629D60 H Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP)[cr FreeSoft Club] MSX JP +2DA1D1D7AC54DBDCAA7606F98910435E H Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP)[t] MSX JP +FF3E1B52EF8EC97D87EBBB36B334DA05 H Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP)[t][a] MSX JP +44DC504FD3A405CBF73F1B2D079B0A51 H Breaker (1987)(Philips)[t] MSX +BF5923471E3F9C809915942B46D23115 H Chuka Taisen (1988)(Hot-B)(JP)[cr Copisoft] MSX JP +FD9C31A882B59D3515BF163DBE5AADE5 H Cita con Rama (1986)(Idealogic)(ES)(Disk 1 of 2)[cr Jose] MSX ES +5D1E0A0232CE04F90017DD534779DFB7 H Dragon Buster (1987)(Namcot)(JP)[t] MSX JP +96CC529A2D116227C2C3033FD8AFD7BE H Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[t] MSX Game Disk JP +512E8EFCA9E7A26244F13489C75B1C9A H Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[cr SMA] MSX Game Disk JP +F1E507DF2028B43C41C3898DB2CE52E3 H Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[cr SMA][a] MSX Game Disk JP +F3F1C96DCE5CCAA459627AD686F02BF4 H Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 2 of 5)(Scenario 1 Disk)[cr SMA] MSX Scenario 1 Disk JP +6BF555D935FF7030874452530AF84EBF H Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 3 of 5)(Scenario 2 Disk)[cr SMA] MSX Scenario 2 Disk JP +12DE5E828358171019811E8836322D14 H Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk)[cr SMA] MSX Scenario 3 Disk JP +8A796F46FADE7CE443DE8031747FD83F H Dragon World (1986)(Idealogic)(ES)(Disk 1 of 3)[cr Jose] MSX ES +2529234EACE1B3C0815EBF2B6431FB48 H Druid (1987)(Nippon Dexter)(JP)[cr Stop Game] MSX JP +EFD5BDF246D16806BFFAA1806BFA7114 H Druid (1987)(Nippon Dexter)(JP)[cr Stop Game][a] MSX JP +A3752EF0E89DCC83A38D5869BABD442E H Elslid. Erenubu. Eagle War (1988)(NCS)(JP)[cr SMA] MSX JP +8BB7BF9263F2094405CFAFE115DDE924 H Elslid. Erenubu. Eagle War (1988)(NCS)(JP)[cr SMA][a] MSX JP +FCF6FDFDD65E0BF66525CDB40AA2696C H Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP)(Disk 1 of 2)[cr Metam] MSX JP +1733B5E5F9AE6DB34563F58756962873 H F1 Douchuuki (1990)(Namcot)(JP)[cr Tortuga] MSX JP +A2632E1C92A3B02C17875A6C772BE375 H F1 Douchuuki (1990)(Namcot)(JP)[cr Tortuga][a] MSX JP +FE6E6960D64DA63A4E1A8AAEB569B5E4 H Fahrenheit 451 (1986)(Idealogic)(ES)(Disk 1 of 3)[cr Joan Angel] MSX ES +3EDEC7C404F23B37DAFF0E2C3471554D H Famicle Parodic (1988)(Bit2)(JP)[cr Martos][t SMA] MSX JP +1A2EDF389DAAFA97B3C8504E0D972919 H Famicle Parodic (1988)(Bit2)(JP)[cr Martos][t SMA][a] MSX JP +E08B69FBC9781B801B2354F54BA40FB0 H Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 1 of 2)[cr The Boss] MSX JP +FA4E315E8F573056B935EBD9456FCFD3 H Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 2 of 2)[cr The Boss] MSX JP +DFA3149A955718C0F8A7483A05BC5B12 H Family Boxing (1988)(Sony)(JP)[cr MCI] MSX JP +99E881AD2000F849EC9C537F8245A707 H Final Countdown (1988)(Methodic Solutions)(NL)[cr Eloy Roman] MSX NL +A1087730B9F69646371306BE6A9CB955 H Fire Ball (1988)(Humming Bird Soft)(JP)[cr SMA] MSX JP +6C469EAA899E05AB9D0E6B49ADF38BE8 H Fire Ball (1988)(Humming Bird Soft)(JP)[cr SMA][a] MSX JP +D46E91DF1144E8C3972CEA4909594F22 H Fire Ball (1988)(Humming Bird Soft)(JP)[h Tridentum] MSX JP +3866914C953A560B6D91C444823BDFDB H Gekitotsu Pennant Race (1988)(Konami)(JP)[cr R. Martin][SCC] MSX JP +78ADD1F2514AECA087C9A6456A1E0D0F H Gekitotsu Pennant Race (1988)(Konami)(JP)[h DMC][a][SCC] MSX JP +BC8A0909D952EED89F473F72CCA626AE H Gekitotsu Pennant Race (1988)(Konami)(JP)[h DMC][SCC] MSX JP +6C6160D101C6E1A2F52860846737832E H Goldrush (1993)(Vivia)(NL)[cr DIE] MSX NL +E9352CF0B4E696C920302568E489EF5A H Goldrush (1993)(Vivia)(NL)[cr DIE][a] MSX NL +31EEBD2E9529DB0E5A72AB2A65E1D6D5 H Goldrush (1993)(Vivia)(NL)[cr DIE][a2] MSX NL +1420DD855BBD89048CA8B56FD95BEFA1 H Gorby's Pipeline (1991)(Compile)(JP)[cr SMA] MSX JP +953D844AAA06D9627863B9FD4BC2A609 H Heroes of the Lance (1991)(Pony Canyon)(JP)[cr Martos] MSX JP +F3FE4B25DC8B7E5DAB64EB164F0E4301 H Heroes of the Lance (1991)(Pony Canyon)(JP)[cr Martos][a] MSX JP +F92E6192EBF56C9258D70F6E27BD575C H Isla del Tesoro, La (1986)(Idealogic)(ES)(Disk 1 of 2)[cr Greg] MSX ES +0169F82DA892DE405D0C56C84589E69F H Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 2 of 2)(Game Disk)[t] MSX Game Disk JP +649A6E4E4EFE96D63CE72B2E21FD87D7 H Kami no Machi (1990)(Panther Software)(JP)(Disk 1 of 5)[cr SMA] MSX JP +E6DF9D764639E05324C5BC91B9EB6327 H Kami no Machi (1990)(Panther Software)(JP)(Disk 1 of 5)[cr SMA][a] MSX JP +9AEDA9C5E5B103FA72F2AB523BB0654E H King Kong 2 (1986)(Konami)(JP)[t] MSX JP +B2C5AE9296DBA6F35B530A13C5D415D5 H King Kong 2 (1986)(Konami)(JP)[t][a] MSX JP +78087A7820D04EC6FCDBF45333024CC3 H King Kong 2 (1986)(Konami)(JP)[t][tr fr] MSX JP +FA3069B75600A98B55739D369821E642 H King Kong 2 (1986)(Konami)(JP)[t][tr fr][a] MSX JP +601BA92899FDD7EAAFB968191A28F6EF H Mago de Oz, El (1986)(Idealogic)(ES)(Disk 1 of 2)[cr Joan Angel] MSX ES +C7B9217BEEEEA5F951115607B6A0222B H Metal Gear (1987)(Konami)(JP)[cr SMA] MSX JP +0788F34442E5761038E62F89CCE8978E H Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[cr Martos] MSX JP +F572889B865746AA0EB803B18B26B7B4 H MSX Spring (1989)(MSX Magazine)(JP)[cr Megazone] MSX JP +221F9BA82F9A2B59FF55C32AF1398F26 H Ninja Kun - Ashura no Sho (1987)(HAL Laboratory)(JP)[t] MSX JP +82A2ECD959B8D1583AAA354640BC37DD H Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 1 of 3)[cr Joan Angel] MSX ES +00BCFEFE8C93B5407FF40BC546357D16 H Penguin Kun Wars 2 (1988)(ASCII)(JP)[cr SMA] MSX JP +23C7DE18766E4EE89000836D863AB8EB H Perry Mason (1986)(Idealogic)(ES)(Disk 1 of 2)[cr G.VDB] MSX ES +82EF6605B05C3B6FB5100045AF6BD410 H Perry Mason (1986)(Idealogic)(ES)(Disk 1 of 2)[cr G.VDB][a] MSX ES +4B41EDA29AAF769EDF17F08460B559E7 H Quarth (1990)(Konami)(JP)[cr SMA] MSX JP +C66E93A522E9B23E299091852226C521 H Quarth (1990)(Konami)(JP)[cr SMA][a] MSX JP +F673FA7FCA7AE3FF700307EADB8CDDBD H Red Lights of Amsterdam (1986)(Eaglesoft)(NL)[t][tr es Barcelona MSX Club] MSX NL +B43D9FD85F26172B27E21AB6E74D064F H Red Lights of Amsterdam (1986)(Eaglesoft)(NL)[t][tr es Barcelona MSX Club][a] MSX NL +D66409070C86CEAF81AA2BCED9C871D3 H Replicart (1987)(Sony)(JP)[cr Fun Soft] MSX JP +5D051D6E8D1AD6E650E96991748A5EE8 H Replicart (1987)(Sony)(JP)[cr Fun Soft][a] MSX JP +4FACE0F52534B593A2B9682E53602A33 H Replicart (1987)(Sony)(JP)[cr Fun Soft][a2] MSX JP +E009C6653848324B4D3A54BA2FD4076C H Return of Ishtar, The (1988)(Namcot)(JP)[cr SMA] MSX JP +1E9712BB0822DD4BB5E10514993FDD15 H Return of Ishtar, The (1988)(Namcot)(JP)[cr SMA][a] MSX JP +5AEC6FF27BDE516C4A12E395988436C3 H Return of Ishtar, The (1988)(Namcot)(JP)[cr SMA][a2] MSX JP +94CBE27719F5AD2F9C197B46E203E52C H Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP)[cr SMA] MSX JP +6ECF2A134DF5F47B580B148B72055014 H Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP)[cr SMA][a] MSX JP +9524F281DD59ACC386FB289FCE86F928 H Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP)[cr SMA][a2] MSX JP +1C24ECA55B4AF492D809E0B574E027FF H Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP)[cr SMA][a3] MSX JP +744F469659CD0CEB31DEDD6F73991328 H SD Gundam - Gachapon Senshi 2. Capsule Senki 2 (1990)(Banpresto)(JP)[cr The Boss] MSX JP +977E6199698E0698C179B3005BCAE7F9 H Snatcher (1988)(Konami)(Disk 1 of 3)[h Oasis][SCC+] MSX +42A29B5BD3EE7DB64D335F2DB81E69F7 H Space Manbow (1989)(Konami)(JP)[cr Stop Game] MSX JP +AE9F33008B8D26F95E9060D04B68033D H Squeek (1991)(Anma)(NL)[cr FreeSoft Club] MSX NL +C06ED7DFEEFA792A38D033F52DBFDD08 H Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2)[t Cyber] MSX JP +9A47AE1452A7801C37758D26C8778849 H Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2)[t Last Armageddon] MSX JP +A6606D37449D06138A054BD65A79BCD7 H Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[t Last Armageddon] MSX JP +4216DE039199BE5D25CF8BF624B1DA46 H Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[t] MSX JP +B0F410AA03E1A19533F92C9513D1F927 H Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[t][a] MSX JP +F0692DE8FFB8D21171340598CA09133E H Strategic Mars (1988)(dB-Soft)(JP)[cr SMA] MSX JP +889E5360FD19928E12A27D66B32FEE08 H Super Deform Snatcher (1990)(Konami)(Disk 1 of 3)[cr StarCracks][SCC] MSX +C42A1CEBAE1FF2E1B7B4BA101091245D H Super Deform Snatcher (1990)(Konami)(Disk 1 of 3)[h Thevma][SCC] MSX +187539CF28399166FAB7400B69E31C5C H Super Deform Snatcher (1990)(Konami)(Disk 2 of 3)[cr StarCracks][SCC] MSX +79D41807A2F880A40C2E2C575B504AC3 H Super Deform Snatcher (1990)(Konami)(Disk 2 of 3)[h Thevma][SCC] MSX +CC4C98032ACC5FDF57C8B04842C0E976 H Super Deform Snatcher (1990)(Konami)(Disk 3 of 3)[cr StarCracks][SCC] MSX +87BFC97389151CDFDFD61CE384D69B26 H Super Deform Snatcher (1990)(Konami)(Disk 3 of 3)[h Thevma][SCC] MSX +DE4A7F77E0A70AE1807BD7A1B28AA77E H Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[cr StarCracks][a][SCC] MSX JP +FF12040C27242B9E3F335153E4EAB4CA H Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[cr StarCracks][a2][SCC] MSX JP +06EBCC97EC4DEC22D050292687E1C93C H Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[cr StarCracks][SCC] MSX JP +8023C3641CCBB9C9E9FE9101F4872D12 H Super Deform Snatcher (1990)(Konami)(JP)(Disk 2 of 3)[cr StarCracks][SCC] MSX JP +9040B656B20132905FC9327ACE948745 H Super Deform Snatcher (1990)(Konami)(JP)(Disk 3 of 3)[cr StarCracks][a][SCC] MSX JP +ABA64BE8FD8443A979D25852459EACE5 H Super Deform Snatcher (1990)(Konami)(JP)(Disk 3 of 3)[cr StarCracks][SCC] MSX JP +548348056954F077E2A5AE81E6BB13D2 H Topple Zip (1987)(Bothtec)(JP)[cr Cobra Cracks] MSX JP +EECF09A345579BC7816790A2555B9FAD H Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP)[cr Dalak Soft] MSX JP +A143864272980BA8940F752ACB2DB90E H Undeadline (1989)(T&E Soft)(JP)[t] MSX JP +6E404662CF69F09260C700D95C4FC831 H Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 1 of 4)[t] MSX JP +275CBEF398B38E4903A737DB18911809 H Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 1 of 6)(Opening Disk)[cr SMA] MSX Opening Disk JP +D87D8DBC1254B285DDC9FB065DC35AA4 H Youma Kourin (1989)(Nippon Dexter)(JP)[cr SMA] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +5D73F8F36E7382529809702621756125 O Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 3 of 3)(User Disk)[o] MSX User Disk JP +445264EAE1DA3DD5048542EF775E1CBE O Sil Game (19xx)(-)(Disk 1 of 2)[o] MSX +F5E8BD9D8405DC308A66DF41583B5928 O Sil Game (19xx)(-)(Disk 2 of 2)[o] MSX +9D7947C13F5DBEBAE82BCD86447D8E2D O Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 4 of 4)(User Disk)[o] MSX User Disk JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +DA703FC4D362C8A09C3DE4B1509F427C T Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(Disk 1 of 2)(Game Disk)[tr es Manuel Pazos] MSX Game Disk +9461BE7372C65D083D4881F50C5CEEDC T Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(Disk 2 of 2)(Data Disk)[tr es Manuel Pazos] MSX Data Disk +9185DF6BD5ACA3DAD195752B0E0E2009 T Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 1 of 5)(Game Disk)[tr es Victor Martinez] MSX Game Disk +3EC3370F52CA5F6732F790B0DDCFC3C7 T Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 2 of 5)(Data Disk 1)[tr es Victor Martinez] MSX +1BC704685E1D68511AF2AB394A9CDF32 T Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 3 of 5)(Data Disk 2)[tr es Victor Martinez] MSX +59D3CEB1DD92228D1E917342BC313C69 T Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 4 of 5)(Data Disk 3)[tr es Victor Martinez] MSX +8A963A52FBBBF43A0E7981200ACA1EB8 T Cosmic Soldier (1985)(Kogado - ASCII)(JP)[tr pt] MSX JP +7B5278F712C0028650B177A75E74C75D T Cosmic Soldier (1985)(Kogado - ASCII)(JP)[tr pt][a] MSX JP +A40A0323360063F04E53979EA9D77CF5 T Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 1 of 4)(Opening Disk 0)[tr it MSX Club] MSX +165EEB02964048E92618F699C04F22DC T Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 3 of 4)(Game Disk 0)[tr it MSX Club] MSX +634F56473394EC911CA753A50D773C43 T Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 4 of 4)(Game Disk 1)[tr it MSX Club] MSX +E75A1FF99480AB00983C334528B1A80B T Laser Squad (1988)(Blade Software)[tr it Hydra Soft] MSX +AEE3C6F7F33B469CC671C66782F046C2 T Laser Squad (1988)(Blade Software)[tr it Hydra Soft][a] MSX +6C54ED54E8491AE33EBA7D50D2BC1ED8 T Super Deform Snatcher (1990)(Konami)(Disk 1 of 3)[tr es J. & M. Pazos][SCC+] MSX +3990654A073DD38A4DDA936E347AE241 T Super Deform Snatcher (1990)(Konami)(Disk 2 of 3)[tr es J. & M. Pazos][SCC+] MSX +2E6E569559746A26AC7C12E2B950FF53 T Super Deform Snatcher (1990)(Konami)(Disk 3 of 3)[tr es J. & M. Pazos][SCC+] MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +BDAC1E4837A177420468BFFE61D08E6E 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 1 of 3)(Game Disk) MSX Game Disk FR +05DE96C16DBAE67EB589D79DEF6408AF 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 1 of 3)(Game Disk)[a] MSX Game Disk FR +0819A5FC298E59BBC1553F7B58A1084E 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 1 of 3)(Game Disk)[a2] MSX Game Disk FR +6B24F91FB2579A186590F0297DCBE9C4 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 2 of 3)(Images 1 Disk) MSX Images 1 Disk FR +8DD81D031E62B3521434C099D8530B68 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 2 of 3)(Images 1 Disk)[a] MSX Images 1 Disk FR +6F4E4F24820CA8C03E769F67C8A07BE6 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 2 of 3)(Images 1 Disk)[a2] MSX Images 1 Disk FR +8BEA32CFA2902D93C9D9B96577219A72 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 3 of 3)(Images 2 Disk) MSX Images 2 Disk FR +60310C4F4AE3CE87BAC187968698EEA3 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 3 of 3)(Images 2 Disk)[a] MSX Images 2 Disk FR +49DE58212D43CB00DE7F297D34D2CA6F 1789 - La Revolution (19xx)(Legend Software)(FR)(Disk 3 of 3)(Images 2 Disk)[a2] MSX Images 2 Disk FR +8D3C53CEFE359E7FAB299ED1EF9CB443 1942 (1986)(ASCII)(JP) MSX JP +2BA291C3AE8763B1C62DB73A810C55CB 1942 (1986)(ASCII)(JP)[a] MSX JP +107DA22A41DC82DE8BC6F053B57AB684 3 Square (1993)(Emphasis) MSX +F835662E4FFC59BE00DA88F9C4B85A07 31 (1995)(Meuse Soft) MSX +FD38635BAEDECF860454F4EFBB1F04AF 3D Fire (1987)(Octopus Bros) MSX +FB8DD6A6178AD3A41F1C9AD32C8A6B7E 3D Fire (1987)(Octopus Bros)[a] MSX +002DDE0795C8BD4ABA490B6021FF8A59 4th Unit 2, The (1988)(Data West)(JP) MSX JP +4DFCE37C11912A1C86CCE5560659BA4F 4th Unit Act. 3, The - Dual Targets (1989)(Data West)(JP)(Disk 1 of 2) MSX JP +C9077AD48DB90E4BDA0EBF2B4620F6E8 4th Unit Act. 3, The - Dual Targets (1989)(Data West)(JP)(Disk 2 of 2) MSX JP +3C92C5F27BD93DD2484813E5DBB0EFEB 4th Unit Act. 4, The - Zero (1990)(Data West)(JP)(Disk 1 of 2) MSX JP +F1C3EE64B950F8E9BAA851092D593FF6 4th Unit Act. 4, The - Zero (1990)(Data West)(JP)(Disk 2 of 2) MSX JP +A1F83D2FFDFCAA3F874642DC765683A4 4th Unit, The (1988)(Data West)(JP) MSX JP +BB970158EA9FD5C29D3CAD5C554D20D6 Abadia del Crimen, La (2001)(Manuel Pazos)(ES) MSX ES +B8261DF04DF8771DC2EE3385472036D2 Abadia del Crimen, La (2001)(Manuel Pazos)(ES)[a] MSX ES +85A729E07CCC18BFD0B6BAEDAA287FCE Abunai (19xx)(Agorm) MSX +366C9A4A76C6DA868F86898F73A08F58 AcroJet (1988)(System Soft)(JP) MSX JP +E20BF9EF83DABB6438C6B76EDB7218FC Affaire, L' (1986)(Infogrames)(FR)(es) MSX es FR +3D2DCDAFEE97BAFA2CC603EED13C735C Affaire, L' (1986)(Infogrames)(FR)(es)[a] MSX es FR +6E59ED6A987CC54CB38F5BEA8E78A4CB Affaire, L' (1986)(Infogrames)(FR)(es)[needs MSX-DOS] MSX es FR +F2AA76FEC4BB53C36B65ECFC60D27BCE Agat (1988)(MMG Software) MSX +37A1636A33CF8DC8B46ABAB00A4C1550 Aguni no Ishi. The Stone of Aguni (1989)(Humming Bird Soft)(JP) MSX JP +BE7A91DC9C92B0464518181AC582126D Ahparmyadock. Am-Pah-Mata (1991)(T&E Soft)(JP) MSX JP +2B7F565121E5566806E4FABD91623420 Ahparmyadock. Am-Pah-Mata (1991)(T&E Soft)(JP)[a] MSX JP +56F64D17F352899F4FE369C0B1136948 Ahparmyadock. Am-Pah-Mata (1991)(T&E Soft)(JP)[MSX2plusready] MSX JP +2231A0FF5EE28704E8D5163A81A72C21 Akanbe Dragon (1988)(Winky Soft)(JP) MSX JP +F84AB862968419257CA17F97B7EFC5D2 Akanbe Dragon (1988)(Winky Soft)(JP)[a] MSX JP +A7C0E69B28BF7AEB530AB1F90F80DAD7 Akanbe Dragon (1988)(Winky Soft)(JP)[a2] MSX JP +32BCA9667C7CEAF41572CE4482FF7632 Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP) MSX JP +4F63C863D05EF47B877CC7562C49DFC6 Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a] MSX JP +70CD1A04D45CAB59840B5F8F297DD449 Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a2] MSX JP +4ED3EB5E97A1DB760C3C11E3F8D1317B Al Capone (1987)(MSX-Studio)(NL) MSX NL +28427CFE955F65C6EC8EF2BDD35FF6A7 Aleste (1988)(Compile)(JP) MSX JP +8D8A5C215F88B5EAF90AB60460061894 Aleste (1988)(Compile)(JP)[a] MSX JP +671B7CD365D9B12A3610F2809515EF4E Aleste (1988)(Compile)(JP)[a2] MSX JP +883E46527DA292C148769425B30AD685 Aleste 2 (1989)(Compile)(JP)(Disk 1 of 3) MSX JP +2DA88CF7A5C4FE284E16143814430816 Aleste 2 (1989)(Compile)(JP)(Disk 1 of 3)[a] MSX JP +E670172DCA2EF354687CBFD14590C3FE Aleste 2 (1989)(Compile)(JP)(Disk 1 of 3)[a2] MSX JP +52B1591D7CD5921B8256E213A6859600 Aleste 2 (1989)(Compile)(JP)(Disk 2 of 3) MSX JP +4EFA74CB1A315FB912E7E43C237034E5 Aleste 2 (1989)(Compile)(JP)(Disk 2 of 3)[a] MSX JP +F30E7022CBB5A290EB7AB7F41E5EF966 Aleste 2 (1989)(Compile)(JP)(Disk 2 of 3)[a2] MSX JP +F5BE2140761D3F3B36CF62598ED6004B Aleste 2 (1989)(Compile)(JP)(Disk 3 of 3) MSX JP +8EC999FBBD11C793070D8C687D6635B1 Aleste 2 (1989)(Compile)(JP)(Disk 3 of 3)[a] MSX JP +38DFA2D5B3054E5203FC24E29EC03EF9 Aleste 2 (1989)(Compile)(JP)(Disk 3 of 3)[a2] MSX JP +CA312782335D99849CA3529FFD5832FE Aleste Gaiden (1989)(Compile)(JP) MSX JP +106D2B254753810A570B860D38B46AA8 Aleste Gaiden (1989)(Compile)(JP)[a] MSX JP +9EF844D7F3958B4ECB72B044B11E7EAF Algo Wars (1989)(MSX Magazine)(JP) MSX JP +483AB27BD47F2D0C449A8D0E56CFCF9E Alien Slime (1990)(Ax-Alex - Raketto) MSX +C20000398DF104D6BC58EB6155D14F0C Alien Slime (1990)(Ax-Alex - Raketto)[a] MSX +5D256279FDD97BDB98E899B109A3BACE Alien Slime (1990)(Ax-Alex - Raketto)[a2] MSX +640E58E492DCA023D28675FCEE2DB182 Amazing Cash (1990)(MSX Club Magazine) MSX +48ABAB83C22417BEF669E89089F3955F Amazing Cash (1990)(MSX Club Magazine)[a] MSX +79B75815FBF4147545B54F81019A8BE8 Amazonas (1987)(Idealogic)(ES)(Disk 1 of 3) MSX ES +1C33EFDF95920EFB73E9C4B9101F42EE Amazonas (1987)(Idealogic)(ES)(Disk 1 of 3)[a] MSX ES +5960DD9ECFAF0C649CFE70D9BCC1D74B Amazonas (1987)(Idealogic)(ES)(Disk 2 of 3) MSX ES +F277038FE2D7433E2850C0050FE0D594 Amazonas (1987)(Idealogic)(ES)(Disk 2 of 3)[a] MSX ES +B44B37FDF305B705ACD1497429B47215 Amazonas (1987)(Idealogic)(ES)(Disk 3 of 3) MSX ES +377DA85F703BA5F9768A2B20CD0130B0 Amazonas (1987)(Idealogic)(ES)(Disk 3 of 3)[a] MSX ES +A62701D173F95C65BFF106B45444DBA0 American Soccer (1987)(Nidecom)(JP) MSX JP +C1DDB72082B84860AFB0C1B5760D63CE American Soccer (1987)(Nidecom)(JP)[a] MSX JP +8B6F574F7EA3FEE88FB666144970D991 American Success (1989)(Winky Soft)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +14159E64C71B53826EB01145963A778D American Success (1989)(Winky Soft)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +5C672C7FE04FC3AABAAEFEE3AAC17146 American Success (1989)(Winky Soft)(JP)(Disk 2 of 2)(Data Disk) MSX Data Disk JP +C4060A8EC561305DECEF0814581DEBA2 Ancient Ys Vanished - Omen (1987)(Falcom)(JP) MSX JP +47CF4EEEF5CD5841681417ED14EC195B Ancient Ys Vanished - Omen (1987)(Falcom)(JP)[a] MSX JP +8EAA27833411DD7C66669AB67AA54A01 Ancient Ys Vanished - Omen (1987)(Falcom)(JP)[a2] MSX JP +C52E2EA87B469952AD4817A0196BD010 Ancient Ys Vanished - Omen (1987)(Falcom)(JP)[a3] MSX JP +DF55EA94284CEE6A6ED9D2B11695C7CE Ancient Ys Vanished - Omen (1987)(Falcom)(JP)[a4] MSX JP +BC8F210689C69A1663DF4F6BAEB97B31 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(Disk 1 of 2)(Game Disk) MSX Game Disk +0C86D45BB6432B789E1A06668EFB0C9D Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(Disk 2 of 2)(Data Disk) MSX Data Disk +909F8059A60DE55A8560C0459C26C6F3 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +CE718E6D9D802FD9DAC3566E6D14E27C Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +3C6DCE5438EF82689A1C23465596E318 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 1 of 2)(Game Disk)[a2] MSX Game Disk JP +5939D5815490430D7884D276B41E7BFB Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 2 of 2)(Data Disk) MSX Data Disk JP +28B348C771D677F4446CC6A5DFF8080B Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 2 of 2)(Data Disk)[a] MSX Data Disk JP +6E6C8B09AF1209AAB773661B50344188 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 2 of 2)(Data Disk)[a2] MSX Data Disk JP +B396F4C69025DF5CC6D91733AEA4EBA0 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(JP)(Disk 2 of 2)(Data Disk)[a3] MSX Data Disk JP +5590E4AC85BCE19077DCE51DD7496390 Ancient Ys Vanished II - The Final Chapter (1988)(Falcom)(User Disk) MSX User Disk +BB13DDE11D1A493C6B51D2EFECC23093 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 1 of 5)(Game Disk) MSX Game Disk +36D5FB68A40F15F316FE8C0C416CE096 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 1 of 5)(Game Disk)[a] MSX Game Disk +2A1F4074C7E08F3935FA3E09120D69EF Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 1 of 5)(Game Disk)[a2] MSX Game Disk +230A2BE93D991A5A8B899004F22CFF4A Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 2 of 5)(Data Disk 1) MSX +1293B9AF3DFCF6EE889320E93D986481 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 2 of 5)(Data Disk 1)[a] MSX +46D07C7DE6744C7AA84377B223304B0A Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 2 of 5)(Data Disk 1)[a2] MSX +0705E4BC427EE6EFC95A0D86A2BE8113 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 3 of 5)(Data Disk 2) MSX +EE5E228A4223532CBB9F4253A0B5C9C6 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 3 of 5)(Data Disk 2)[a] MSX +1A646D57D47F8A31A275550C7BAF5487 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 3 of 5)(Data Disk 2)[a2] MSX +AC5F46811524D02772248F57D677C523 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 3 of 5)(Data Disk 2)[a3] MSX +2F34A6B207C333856D82165EF8876F21 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 4 of 5)(Data Disk 3) MSX +15BB3FA47900478E32CECC749533B510 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 4 of 5)(Data Disk 3)[a] MSX +DFDFA896414A1CDBD387D579717D94CE Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 4 of 5)(Data Disk 3)[a2] MSX +FFC6E9F31FD867E1CEC2185AADA9B7E7 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 5 of 5)(User Disk) MSX User Disk +99526124A8DD9B131916576D78DACBE0 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(Disk 5 of 5)(User Disk)[a] MSX User Disk +41C0212A367DE88C1EDF5ED3EAD35901 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 1 of 5)(Game Disk) MSX Game Disk JP +CBCD7F491F4149FA872B816437C84C12 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[a] MSX Game Disk JP +0991667F806B6CE78CAD042068BFFFAF Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 2 of 5)(Data Disk 1) MSX JP +901EAB2692385B0180BCD22BF06814F5 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 2 of 5)(Data Disk 1)[a] MSX JP +C489AB66B8F1C32E878CA9B8CE4B2F9B Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 3 of 5)(Data Disk 2) MSX JP +E212F8B896C572AE2A7BA324A11E3E2F Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 3 of 5)(Data Disk 2)[a] MSX JP +2707ADCD40870F12B3BF5A2E8D4CAA83 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 4 of 5)(Data Disk 3) MSX JP +F7C0E7404BAAEB49EE65F61F9430CA43 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 4 of 5)(Data Disk 3)[a] MSX JP +5F0ABCE102D742CD1C6C9780DCC71089 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +87E0BAA2B1564A9D9C848B84D20F83B5 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 5 of 5)(User Disk)[a] MSX User Disk JP +A09F602CF3A5F0F7DFAC0499451CE0B5 Ancient Ys Vanished III - Wanderers from Ys (1989)(Falcom)(JP)(Disk 5 of 5)(User Disk)[a2] MSX User Disk JP +70A608596B03241DD2E0FE529F8AC907 Andorogynus (1988)(Telenet Japan)(JP) MSX JP +4C50D5D18413E73157480613D8E36127 Andorogynus (1988)(Telenet Japan)(JP)[a] MSX JP +EFB57A354B76AB22711CCC2810B3FB43 Andorogynus (1988)(Telenet Japan)(JP)[a2] MSX JP +C1AD847ACF23BA20B0A330D6C3BE9269 Angelus (1988)(Enix)(JP)(Disk 1 of 3) MSX JP +4DAE26C59B113986F737026CCBE4520C Angelus (1988)(Enix)(JP)(Disk 1 of 3)[a] MSX JP +83732D785B8AA72BF4E8EAD0A51FAFAD Angelus (1988)(Enix)(JP)(Disk 2 of 3) MSX JP +D3AA750ED3696EDEF3709CAB924E5D6E Angelus (1988)(Enix)(JP)(Disk 3 of 3) MSX JP +8B92DFE4E917BBBE9426FDDDDAB5DBE2 Angelus (1988)(Enix)(JP)(Disk 3 of 3)[a] MSX JP +1318FF4C6C26E8B0169B2F11F8C2B012 Anger (19xx)(Marx) MSX +BCCAB94A772D081B734EBDC60CBF3FEB Anger (19xx)(Marx)[a] MSX +9F63C0F3FB311C84FFD9518B31FE742F Ankoku Shinwa - Yamato Takeru Densetsu. Dark Myth Climax Takeru Legend (1988)(Tokyo Shoseki)(JP) MSX JP +14BA444F60444F5F0DC58DB322A0775D Ankoku Shinwa - Yamato Takeru Densetsu. Dark Myth Climax Takeru Legend (1988)(Tokyo Shoseki)(JP)[a] MSX JP +B8C580CE3BB4AC8E50DB49BB07BFD882 Anoid (19xx)(-) MSX +8740213BFEBD9A8E9A05C95810FACC2F Arctic (1987)(Pony Canyon)(JP) MSX JP +523443E2FE93F3C42D2B73350106BB0C Arcus (1988)(Wolfteam)(JP)(Disk 1 of 3) MSX JP +EE239C4C358C17007DC68C9452088C33 Arcus (1988)(Wolfteam)(JP)(Disk 1 of 3)[a] MSX JP +91072152FD2E2B7FDEB00DB18614AA67 Arcus (1988)(Wolfteam)(JP)(Disk 1 of 3)[a2] MSX JP +898F3089D7C7444E484260DC9D48048F Arcus (1988)(Wolfteam)(JP)(Disk 2 of 3) MSX JP +C15E98822ACACB28F1BDE7A610288B70 Arcus (1988)(Wolfteam)(JP)(Disk 2 of 3)[a] MSX JP +609238097F20680106B026FD0A8097E5 Arcus (1988)(Wolfteam)(JP)(Disk 2 of 3)[a2] MSX JP +315590A01D40250DC5D2B11A900CFC9B Arcus (1988)(Wolfteam)(JP)(Disk 2 of 3)[a3] MSX JP +A4F1AC58C16C375B1016DFC2948DBA99 Arcus (1988)(Wolfteam)(JP)(Disk 3 of 3) MSX JP +5DF956918380F6C95E60AF1235C2F1DA Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 1 of 4) MSX JP +4D812E7273BFDB9E00EF21E3CCE4EDAA Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 1 of 4)[a] MSX JP +FDB2FE0B08CD7E5522DF711B05ECD841 Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 2 of 4) MSX JP +94F7043ADE2F20423172EEAD9F3C27EA Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 2 of 4)[a] MSX JP +804B89E9028470ABFE8EB8A1F209B296 Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 2 of 4)[a2] MSX JP +06EB9E679115742E215E1762C8D0A0DC Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 3 of 4) MSX JP +4B8AABBB10E446A677631E3B71EFE415 Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 4 of 4) MSX JP +B9BD7919381DAC6A87A62F350756EE5F Arcus II - Silent Symphony (1989)(Wolfteam)(JP)(Disk 4 of 4)[a] MSX JP +B4878EF7D78A6AD20B8F18A3BBB7B8FF Arcusyu. Arcus Arch (1989)(Wolfteam)(JP) MSX JP +DEEF50D0ACB208526EAA8693DC679283 Arcusyu. Arcus Arch (1989)(Wolfteam)(JP)[a] MSX JP +AEDE5D14D41CC8C316CDA21DE9C91668 Arguis no Tsubasa (1988)(Kogado)(JP) MSX JP +3295FF801FB59C13BBAE18FCBFA87DF7 Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP) MSX JP +61FB775341AAEC3F5C9DD7323266D1D5 Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[a] MSX JP +9743EC43C95C7811D5C0506CF9BBF666 Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[a2] MSX JP +83911C963217D6953625BC64CAABD2E2 Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[a3] MSX JP +C286424D6B425308DB78DB5190F16496 Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP) MSX JP +5C7306963BC55F587603C19E5E70947D Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP)[a] MSX JP +4D53657365224142023B0183355EEE73 Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP)[a2] MSX JP +B0C1B0279E19D3A01555E4855E2B1FE9 Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP) MSX JP +B695CBA3227C107AC5DC23F0CC154F60 Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP)[a] MSX JP +F4372B86046A87B2ACBAB25BA1DC1A68 Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP)[a2] MSX JP +03346B55F27E5179265E0B3A63186610 Arubatoros 2. Albatross 2 - Masters' History (1989)(Telenet Japan)(JP)(Disk 1 of 3) MSX JP +BAD6149ADE669B368D7C1E1233A73B6E Arubatoros 2. Albatross 2 - Masters' History (1989)(Telenet Japan)(JP)(Disk 2 of 3) MSX JP +994CEFBC14F2476974E03F194563E15E Arubatoros 2. Albatross 2 - Masters' History (1989)(Telenet Japan)(JP)(Disk 2 of 3)[a] MSX JP +0F684CCD5615AD8213279FAD45F1FCD8 Arubatoros 2. Albatross 2 - Masters' History (1989)(Telenet Japan)(JP)(Disk 3 of 3) MSX JP +A0E831B485DA10BB6048811FBA654337 Arugisu no Yoku. Wings of Arugisu (1988)(Kogado)(JP) MSX JP +083868222C3E81A0DBC23EF71FC9FAAC Asada Tetsuya no Akyoo Mahjong. Nap Tetsuya's A-Class Mahjong (1988)(Pony Canyon)(JP) MSX JP +3B35AB0F0AAD896553D7508EF27A49F5 AshGuine 2 (1987)(Panasoft)(JP) MSX JP +19C2077F6FC68C1195DB2A75D6C2B84D AshGuine 2 (1987)(Panasoft)(JP)[a] MSX JP +B23E48DF2386B6AC636CF30653797FC1 AshGuine 2 (1987)(Panasoft)(JP)[a2] MSX JP +59812CA65C8CF4086B6639A0FDD91A7B AshGuine 3 (1987)(Panasoft)(JP) MSX JP +AE30A1E6D250260AB580776D1B92AFD2 AshGuine 3 (1987)(Panasoft)(JP)[a] MSX JP +3AA06736AC1B69F0F1802B1BA7394C67 Avenger of Death, The (19xx)(System Breaker) MSX +14EBB7B067C33EA9FF7C811F588F9C83 Avenger of Death, The (19xx)(System Breaker)[a] MSX +BC93DDE2BDBA690C3D8A4C1F1480570D Ayayo's Love (19xx)(Disk Station) MSX +C91235F099A8D0FE504E3A98AB15D171 Ayayo's Love (19xx)(Disk Station)[a] MSX +053A60411656FA36E8D16C569AE50F6E Babel - The New Megablocks (1994)(Cabinet) MSX +FDF05C4B86BFF635846F5FC33BB028AF Bad Max (19xx)(Transoft)(FR)(Disk 1 of 3) MSX FR +B18C28B2C27370E77D20037ECA7E040A Bad Max (19xx)(Transoft)(FR)(Disk 1 of 3)[a] MSX FR +80688C8C59D6DD2DEF81D3FE5A710F13 Bad Max (19xx)(Transoft)(FR)(Disk 2 of 3) MSX FR +8EA70DB09F302A30C37207E6DAAF3410 Bad Max (19xx)(Transoft)(FR)(Disk 2 of 3)[a] MSX FR +0E4C5C7FBDEBE0120CDBA8BAEDC7A500 Bad Max (19xx)(Transoft)(FR)(Disk 3 of 3) MSX FR +FD59B4B45CD14DAE358A74DC50F84E19 Bad Max (19xx)(Transoft)(FR)(Disk 3 of 3)[a] MSX FR +DE856ECA50B4A8BC1FE64CBD9B07D8D4 Balance of Power (1988)(ASCII)(JP) MSX JP +E3669DA523CBC5E4114F64A54C5B98D7 Balance of Power (1988)(ASCII)(JP)[a] MSX JP +9DC896260A2D62E8A2C4BE6464923917 Ball Out (1988)(MSX Magazine)(JP) MSX JP +573603EFA1CF5D08AF90296C5E22010A Ball Out 2 (1988)(MSX Magazine)(JP) MSX JP +DFB07F498476D51340621B83C259DAD2 Bank Buster (1988)(Eurosoft)(NL) MSX NL +6E5A4BA2A69F22924FB0B49D13A45C60 Bank Buster (1988)(Eurosoft)(NL)[a] MSX NL +2A7CF0B15B6EF363D38AB90DDED40DFE Bank Buster (1988)(Eurosoft)(NL)[a2] MSX NL +971A621520C587E91DBEED1289C9A75D Bank Buster (1988)(Eurosoft)(NL)[needs MSX-DOS] MSX NL +E2E0796C8890689AB3CA830C7725F1C1 Barbarian (1988)(Ford Perfect) MSX +6AFE1BB8E25E04D03408113D32DFDE66 Barunba (1990)(Namcot)(JP) MSX JP +F7F9F0A10A64B25EC44FB0AC79E493FB Barunba (1990)(Namcot)(JP)[a] MSX JP +D90A1012FC7B058A5BF467B951012B4C Barunba (1990)(Namcot)(JP)[a2] MSX JP +DFC226786495DF69A132F3EAAD927D90 Barunba (1990)(Namcot)(JP)[a3] MSX JP +A1067D5C07E8E98728458122AE746A23 Basaro Attacker (19xx)(-) MSX +78F26535176962FE2E8D629A4099A56B Bastard (1987)(Xain)(JP) MSX JP +967DAB2D67B4811A3D278AFD500945A0 Bastard (1987)(Xain)(JP)[a] MSX JP +5A01BBEB3673BBDC020AB8E8E4EBD5DA Be-Bop Bout (1994)(Mar'z Project) MSX +D7B7671649C95F8C56875A9792242CDE Be-Bop Bout (1994)(Mar'z Project)[a] MSX +77E3DD3D1732147D383DD2200717BBDA Be-Bop Bout (1994)(Mar'z Project)[needs MSX-DOS] MSX +1E4C43B208F7E039777B2022B326751C Be-Bop Bout (demo) (1994)(Mar'z Project) MSX +E00D2FD5D1B2D13A3E40C304FF448821 Bedroom Olympics (1987)(Mega Soft) MSX +3D4D2BAE43986F6257CC85CBE7ECFFE3 Bedroom Olympics (1987)(Mega Soft)[a] MSX +B6426CD378065CD334F917C24C92530A Bedroom Olympics (1987)(Mega Soft)[a2] MSX +3F29AE908A588B682A1EEE3C27960CED Best Nine Pro Baseball (1987)(ASCII)(JP) MSX JP +0FC3A42175AB9E4F21F5A49484F2610A Beyond - The Gate of Charon (1986)(Short Program Island) MSX +93467FD3BE39F771FB91EEAC7FA1FCF3 Beyond - The Gate of Charon (1986)(Short Program Island)[a] MSX +E645067167B62CFBAA73BF37C5ADC7D0 Beyond - The Gate of Charon (1986)(Short Program Island)[a2] MSX +E3D6D05C98E983001F1997E2441EE540 Beyond 2 - The Moon of Charon (1986)(Short Program Island) MSX +D9ADE920AA2D97D6CBCE3EF7A86442DB Bilupani (1990)(N&M Soft) MSX +F4C290840C24FBBC94F2E6C6CD2B822C Birdy World (1992)(Birdy Soft)(JP)(Disk 1 of 3) MSX JP +8F0DF95743583BBEC4A6D592B04D01AC Birdy World (1992)(Birdy Soft)(JP)(Disk 2 of 3) MSX JP +B81C9C6419407259306738C029891C8A Birdy World (1992)(Birdy Soft)(JP)(Disk 3 of 3) MSX JP +8B1A7A01089559691260E1137FC1706F Bishoujyo Daizukan. Girls Library (1992)(Fairytale - Cocktail Soft)(JP)(Disk 1 of 3) MSX JP +219732D1A14E9E197ECE3382188E83A8 Bishoujyo Daizukan. Girls Library (1992)(Fairytale - Cocktail Soft)(JP)(Disk 2 of 3) MSX JP +CBE279C47F4A1C6B87D8B33DB6A832AC Bishoujyo Daizukan. Girls Library (1992)(Fairytale - Cocktail Soft)(JP)(Disk 3 of 3) MSX JP +708EE35A5CECE7BDA550A9284596BD84 Black Cyclon (1993)(Parallax)(NL)(Disk 1 of 2) MSX NL +E58DB4D60508839E2D9D40883DD713E1 Black Cyclon (1993)(Parallax)(NL)(Disk 1 of 2)[a] MSX NL +0A36A351C3FC10D31953CB1E42F4FCE7 Black Cyclon (1993)(Parallax)(NL)(Disk 1 of 2)[a2] MSX NL +B30077C4FDF7E1A13216B406462C3BB8 Black Cyclon (1993)(Parallax)(NL)(Disk 2 of 2) MSX NL +230C51BE98DF73B7F7DD6C85CC06ACD4 Black Cyclon (1993)(Parallax)(NL)(Disk 2 of 2)[a] MSX NL +D715481A7CC86A7105436E4D1011A982 Blade Lords (1997)(Parallax)(NL) MSX NL +FC8FC39629BA0658EC2DAA413F67F2B0 Blade Lords (1997)(Parallax)(NL)[a] MSX NL +5468767AEABE4D4F74E2EE0D1693E518 Block Terminator (1988)(Dot Plan)(JP) MSX JP +CD58DA454D586BA01BC51FE79C49EB1A Blue Warrior (2000)(Moai Tech) MSX +E19AE69A771618B1539C0023957CC301 Boggle (1992)(Triple Soft)(NL) MSX NL +85D64449BEAA37FE5F8C4EFEB14B4D19 Boggle (1992)(Triple Soft)(NL)[a] MSX NL +5A115D18CF70AFE6B822DF725472F1C4 Bomb Jack (2004)(Kralizec)(ES) MSX ES +757F3B693112161777523EC67C093DF6 Bon Ball (1991)(Kam's Soft) MSX +B92756477912E18323BDEA306BFA86EE Bon Ball (1991)(Kam's Soft)[a] MSX +8127B3760C29A14D269F4AFB3267C76B Bon Ball (1991)(Kam's Soft)[a2] MSX +3C726CE133E8A55B8F11A19377A5EB91 Bon Ball (1991)(Kam's Soft)[a3] MSX +670CFB1E325DA6DED918B4AA2EC1EACF Bozos Big Adventura (1992)(Sunrise)(NL) MSX NL +C54824CC9C606D8EBCF8693186E2587C Breaker (1987)(Philips) MSX +2CC82C38F7ED0EBE693778F23512277B Breaker (1987)(Philips)[a] MSX +C08E46A6400E044E04168218695727FD Breaker (1989)(Jast)(JP)(Disk 1 of 2) MSX JP +D75C30D48F267DAC95210E1391EBE912 Breaker (1989)(Jast)(JP)(Disk 2 of 2) MSX JP +75B9C2E04EE23BCBE9A3C635F95F02A9 Brisk (1994)(Triple Soft)(NL) MSX NL +F53BB1EB96AFDE8DC98AFC20BFE1817B Brisk (1994)(Triple Soft)(NL)[a] MSX NL +87FD91EB99994BB9A647AB80816DF083 Bubble Bobble (1987)(TAITO)(JP) MSX JP +FBDC92558C6328843F14D306B85EDD34 Bubble Bobble (1987)(Taito)(JP)[a] MSX JP +4AA7E1B39F523B33742ADF6E8F9F79F7 Bubbles (1989)(MGF)(NL) MSX NL +E78F78C94FB323573960882F98E25AF6 Bubbles (1989)(MGF)(NL)[a] MSX NL +69B658CC44A774E1210ACAA25BB000DE Bubbles (1989)(MGF)(NL)[a2] MSX NL +2F5C3C3A8846B79E7C69BC2ADFD220D9 Bubbles (1989)(MGF)(NL)[a3] MSX NL +D41A2E184B9471CA648BAE68E4F5674D Burai (1989)(Riverhill Soft)(JP)(Disk 1 of 6) MSX JP +F22C7E53819D697D24E77EB2DC956D55 Burai (1989)(Riverhill Soft)(JP)(Disk 2 of 6) MSX JP +377BFC087BE2F238EBB2B4D4C5D68EA3 Burai (1989)(Riverhill Soft)(JP)(Disk 2 of 6)[a] MSX JP +5D775E3AF7BACE5AB116C7F1A997B499 Burai (1989)(Riverhill Soft)(JP)(Disk 3 of 6) MSX JP +BF6EAF7C9EC58C9B193A0FFD437EC0C6 Burai (1989)(Riverhill Soft)(JP)(Disk 3 of 6)[a] MSX JP +188C5B2B49882D5F23D082E918E0757A Burai (1989)(Riverhill Soft)(JP)(Disk 4 of 6) MSX JP +9782F64967152F6E4BA03B97EEFA5649 Burai (1989)(Riverhill Soft)(JP)(Disk 5 of 6) MSX JP +DC835AAE063EEEA5665AC91DC4CF9C2E Burai (1989)(Riverhill Soft)(JP)(Disk 6 of 6) MSX JP +A012F471566575265F2D64D56D86967A Burai (1989)(Riverhill Soft)(JP)(Disk 6 of 6)[a] MSX JP +9CFD54581F3C4744F4E9CE15F9849DF0 Burai II (1992)(Brother Industries)(JP)(Disk 1 of 9) MSX JP +6923FC9414B9CAA31F476900D3321F67 Burai II (1992)(Brother Industries)(JP)(Disk 1 of 9)[a] MSX JP +B511536221DBC723DA92A1F3AE265B38 Burai II (1992)(Brother Industries)(JP)(Disk 2 of 9) MSX JP +EA52B77DC1552EF445B77BE98CF7F04A Burai II (1992)(Brother Industries)(JP)(Disk 2 of 9)[a] MSX JP +59768F4B1BD80876712A860AB381211E Burai II (1992)(Brother Industries)(JP)(Disk 3 of 9) MSX JP +3839A7C8B2D33A5E3E4CD3603DC5651A Burai II (1992)(Brother Industries)(JP)(Disk 4 of 9) MSX JP +350B1F352ACE06989EFCCFDB726032BE Burai II (1992)(Brother Industries)(JP)(Disk 5 of 9) MSX JP +8B33C8AB6856A23251250FE720AF3F9E Burai II (1992)(Brother Industries)(JP)(Disk 6 of 9) MSX JP +F3F98A811DEA3ED07C93F8E95B2EFB44 Burai II (1992)(Brother Industries)(JP)(Disk 7 of 9) MSX JP +3035EFF49C34DD5328F3AB54093CBD72 Burai II (1992)(Brother Industries)(JP)(Disk 7 of 9)[a] MSX JP +DE0DF9DE2B3415F3846AEB39C5068E5B Burai II (1992)(Brother Industries)(JP)(Disk 8 of 9) MSX JP +567997CCCE50AA1FA6D7681ACAC63747 Burai II (1992)(Brother Industries)(JP)(Disk 9 of 9)(User Disk) MSX User Disk JP +EDD94920DAFF416DAFBE341C088CEB05 Burai II (1992)(Brother Industries)(JP)(Disk 9 of 9)(User Disk)[a] MSX User Disk JP +CF514608774F8C0C0FC0260A94EE7BC0 Butaporc (1990)(T&E Soft)(JP) MSX JP +3B7A592793AFC0603A402FD44E58AD26 Butaporc (1990)(T&E Soft)(JP)[a] MSX JP +F6A97FCEF6456355EE577C67704C667A Butaporc (1990)(T&E Soft)(JP)[a2] MSX JP +4C18842FE65503D3BDD341A5FF82F92A CAL 1 (1991)(Birdy Soft)(JP)(Disk 1 of 3) MSX JP +E239296FA7E9B4F3D807017A4CCE25BA CAL 1 (1991)(Birdy Soft)(JP)(Disk 2 of 3) MSX JP +F62F69FF0E6FEB5E2888C1A942AE9492 CAL 1 (1991)(Birdy Soft)(JP)(Disk 3 of 3) MSX JP +C38D75882C69279EFAFE6286B64CF884 CAL 2 (1992)(Birdy Soft)(JP)(Disk 1 of 5) MSX JP +372C3609DA99F1A29F99131920245563 CAL 2 (1992)(Birdy Soft)(JP)(Disk 2 of 5) MSX JP +43F6B00284B1A644F197F12987B17073 CAL 2 (1992)(Birdy Soft)(JP)(Disk 3 of 5) MSX JP +E8D0A4F8ED7EE099FB15BA06819BED63 CAL 2 (1992)(Birdy Soft)(JP)(Disk 4 of 5) MSX JP +B0966DFD60FF5B3A17F31F511B71D0D7 CAL 2 (1992)(Birdy Soft)(JP)(Disk 5 of 5) MSX JP +9C311EB85FCA3224F4CA8E350107D90E Can Can Bunny (1990)(Cocktail Soft)(JP)(Disk 1 of 3) MSX JP +44A82E59A7D7F0645721E267CDB1990C Can Can Bunny (1990)(Cocktail Soft)(JP)(Disk 2 of 3) MSX JP +0B4C6228C581B2B6D4B616D2459774AD Can Can Bunny (1990)(Cocktail Soft)(JP)(Disk 3 of 3) MSX JP +F0AF2CD91C67FD3E37CCF54EF59D26E8 Can Can Bunny Spirit (1991)(Cocktail Soft)(JP)(Disk 1 of 4) MSX JP +B9D08E5CAA3F695FC1763EE715190FA2 Can Can Bunny Spirit (1991)(Cocktail Soft)(JP)(Disk 2 of 4) MSX JP +9880C6C361F801DFF9BCC63F522E5BEC Can Can Bunny Spirit (1991)(Cocktail Soft)(JP)(Disk 3 of 4) MSX JP +7D6FE1FDD86F8E7EB1C877158649CEC6 Can Can Bunny Spirit (1991)(Cocktail Soft)(JP)(Disk 4 of 4) MSX JP +9FACDDD8AAD59EF02023898E247C5B0B Can Can Bunny v2 (1990)(Cocktail Soft)(JP)(Disk 1 of 3) MSX JP +765F170882F5C2A4F2A9704C99BE1D5A Canvas of a Tear (1992)(Brother Industries)(JP)(Disk 1 of 3) MSX JP +181326812A16BEA7DECD3DEB964F71E5 Canvas of a Tear (1992)(Brother Industries)(JP)(Disk 2 of 3) MSX JP +D3D5A213809B263237EDCD9457A5BE00 Canvas of a Tear (1992)(Brother Industries)(JP)(Disk 3 of 3) MSX JP +9C0F96580B5D694F756A3755F8F77D72 Card - Pairs (19xx)(-)(JP) MSX JP +BFBA0A37BBEA1BF1CD5DC071EF80E5EE Casablanca (1988)(Thinking Rabbit)(JP)(Disk 1 of 2) MSX JP +F862106EECDDA1263AD5AF47AAA7965F Casablanca (1988)(Thinking Rabbit)(JP)(Disk 2 of 2) MSX JP +F2A2C0891C51E5A9A47B202B6A928656 Castle Adventure (1991)(Drack Soft) MSX +2219F4C02BE634C0480EC62A24001186 Castle Adventure (1991)(Drack Soft)[a] MSX +FB89918AAD3D15ECC4458BAE669B5BDA Castle Adventure (1991)(Drack Soft)[a2] MSX +92E42871155C4235E2C52F08BA8F44CD Castle of Blackburn (19xx)(Top Soft) MSX +C6F5F9C979311ABE321172C1BA52A45E Castle of Blackburn (19xx)(Top Soft)[a] MSX +5992BDD52760B9BF8E98B523E62CBC7B Celcion (1991)(SPC Soft) MSX +49CFCD403A4A12E07064D0DC966234CE Celcion (1991)(SPC Soft)[a] MSX +8632512AD11C80FB91A6A78EFEE1C500 Celcion (1991)(SPC Soft)[a2] MSX +E71BF5C33DE8907653CF69C07E6F207A Championship Kinoko Firing Game (2001)(Tomorrows Soft)(JP) MSX JP +4B0344DA6815448CE20122EFEEC1E500 Chaos Angels (1989)(ASCII)(JP)(Disk 1 of 2) MSX JP +F6F18422BB468E9B7D7F6F0ABF430A79 Chaos Angels (1989)(ASCII)(JP)(Disk 1 of 2)[a] MSX JP +67B3FA1359D9FA10AFC54484DAF178BA Chaos Angels (1989)(ASCII)(JP)(Disk 1 of 2)[a2] MSX JP +D8751BCC476DEDC60179BBC36F0B7F56 Chaos Angels (1989)(ASCII)(JP)(Disk 2 of 2) MSX JP +CFBB8F589342F05808934158AB928ED9 Chaos Angels (1989)(ASCII)(JP)(Disk 2 of 2)[a] MSX JP +B388AFA10035EC9DF6214B9B77314170 Chaos Angels (1989)(ASCII)(JP)(Disk 2 of 2)[a2] MSX JP +9FA7BD58BA262D6FDE05C73CFBE72892 Chess Game 2, The (1986)(Eaglesoft)(NL) MSX NL +E43FF551CCAE3702F58AE7E3B233AC3A Chess Game 2, The (1986)(Eaglesoft)(NL)[a] MSX NL +C6180917681790FF5498B92CED556BAA Chess Game 2, The (1986)(Eaglesoft)(NL)[a2] MSX NL +BFCB892E3B15395CD2AEAA6D2DDEC93C Chess Game 2, The (1986)(Eaglesoft)(NL)[a3] MSX NL +7D8368C93BD21A5ECF31CF9570AF403C Choan Super (19xx)(Sequence) MSX +7B13D90319BC95436CB11BC4B6F4EDA8 Chopper II (1986)(Eaglesoft)(NL) MSX NL +8CD27A750DCA1584FB8943A19D679FB0 Chopper II (1986)(Eaglesoft)(NL)[a] MSX NL +CEEE64622934D87E78F3F6822A084FD1 Chuka Taisen (1988)(Hot-B)(JP) MSX JP +DD45B89F27F93CC1FFFDCDEB3B068C1C Chuka Taisen (1988)(Hot-B)(JP)[a] MSX JP +A9E489F3D6E678A5C535706BC8C399E8 Chuka Taisen (1988)(Hot-B)(JP)[a2] MSX JP +DDBD2F269F13E5373147FC5D9ABFFA8D Cita con Rama (1986)(Idealogic)(ES)(Disk 1 of 2)[b2] MSX ES +0CB9E64467CD5AA1C7720C078EEC1DF1 Cita con Rama (1986)(Idealogic)(ES)(Disk 2 of 2) MSX ES +FA1B8108DCE627938D6B0B0147581906 Cita con Rama (1986)(Idealogic)(ES)(Disk 2 of 2)[a] MSX ES +1A93CCE4D38F89304F8C504AAE4F487A Cita con Rama (1986)(Idealogic)(ES)(Disk 2 of 2)[a2] MSX ES +FDE0DC11A284A48ED81DBBA6E472EF44 City Fight (1986)(Pony Canyon)(JP) MSX JP +317C27B4DF35389B1F063638DEADC02D City Fight (1986)(Pony Canyon)(JP)[a] MSX JP +67B22286171C8D994E97590A4B4400A3 Cockpit, The (1988)(Nidecom)(JP) MSX JP +C13EB382D899CA0AB952693214DEACD8 Cockpit, The (1988)(Nidecom)(JP)[a] MSX JP +E1F07149E9ADE85F2634954CC80D8D46 Cockpit, The (1988)(Nidecom)(JP)[a2] MSX JP +34DB3E85B42FB11C7186FE269BFEB49B Cocos (1995)(Victor Raposo) MSX +31D07EABA977AB545D55A0AB97915ADD Cocos (1995)(Victor Raposo)[a] MSX +CCE98264EA6EB20DED4BE164612DD2B4 Colpo Grosso (1988)(Mad Soft)(IT) MSX IT +3A99C45B16C2059F99C4FC34B078C127 Colpo Grosso (1988)(Mad Soft)(IT)[a] MSX IT +065A850F6B5C4DBAF7B6F8E4F8896F65 Columns (1990)(Telenet Japan)(JP) MSX JP +676FA7AF29F8E37D25C84F29B52F8A6D Columns (1990)(Telenet Japan)(JP)[a] MSX JP +8DE3A03ECD8808A2769CD55B7078505D Columns (1990)(Telenet Japan)(JP)[a2] MSX JP +A069C3AB03FF015F7262568799457B44 Columns (1990)(Telenet Japan)(JP)[a3] MSX JP +8852BF52826F3C69F9A070874EBF5DA0 Colums (1995)(-) MSX +025FCD4ACD05650C0EC3545E0D68C7C8 Colums (1995)(-)[a] MSX +E15888A7889E23A2EF7281303EE765B2 Conqueror (1992)(Taracot) MSX +F5A092738FF2292E2FA347E4C43743AB Conqueror (1992)(Taracot)[a] MSX +9EF121F155314BCA48BC19202EBBB758 Construction Craze (1994)(Paragon Productions)(NL) MSX NL +EF5C9ABBC51FD0AA3878219380CD3C86 Construction Craze (1994)(Paragon Productions)(NL)[a] MSX NL +541D7A7D07BCB304A3EE2A8B089C1FA3 Contra. Gryzor (1989)(Konami)(JP) MSX JP +DA6A2ECEB781C5D408960CA54ABC85D8 Contra. Gryzor (1989)(Konami)(JP)[a] MSX JP +9471E47EA7655B07B948E2D59F79219E Contra. Gryzor (1989)(Konami)(JP)[a2] MSX JP +E4F4F74A8DA5E95B482A8762EC732BC1 Cosmic Soldier 2 - Psychic War (1987)(Kogado)(JP) MSX JP +95402DDE83064BF334EB0A318AEEBE0D Cosmo Gang 'DE' Puzzle (19xx)(CTRL+Break) MSX +BE0379B9758FA1BC0799005FAACD233E Cosmos Club (1989)(Jast)(JP)(Disk 1 of 2) MSX JP +6D1B3F19AD923DBC68DFAC73DFF92456 Cosmos Club (1989)(Jast)(JP)(Disk 2 of 2) MSX JP +8E402C20EC8BA0A0B315CD605572CC7B Cowboyana Jones (1991)(MSX Computer Magazine)(NL) MSX NL +CD4B43AD7F7D6FDEE62C722EE8F637C6 Cowboyana Jones (1991)(MSX Computer Magazine)(NL)[a] MSX NL +51DB5D98D65F98555D44CF28B69F97CA Cowboyana Jones (1991)(MSX Computer Magazine)(NL)[a2] MSX NL +6562265F95D8F78A1C7C5DD856B4EC99 Cowboyana Jones (1991)(MSX Computer Magazine)(NL)[a3] MSX NL +927D350F57128636FF0CCA72330550DC Crafton & Xunk (1987)(ERE Informatique)(FR) MSX FR +91351720C642902794638D97AAAB1713 Crafton & Xunk (1987)(ERE Informatique)(FR)[a] MSX FR +94387AD60236F58E9476FA6304996964 Crescent Moon (1990)(Alice Soft)(JP)(Disk 1 of 2) MSX JP +C7353EE9525CF9FCFD79478F0A6C9668 Crescent Moon (1990)(Alice Soft)(JP)(Disk 2 of 2) MSX JP +444ED12C5516EE23D0FD078C331119A7 Crimson (1987)(Scaptrust)(JP) MSX JP +7D94DE629FB082BD2E2D36A3AE8127B3 Crimson (1987)(Scaptrust)(JP)[a] MSX JP +F686F1DDC289A3DE4190010D162094C6 Crimson II (1989)(XtalSoft)(JP)(Disk 1 of 2) MSX JP +22B7B5158988E2E488657B697C96871A Crimson II (1989)(XtalSoft)(JP)(Disk 1 of 2)[a] MSX JP +17FAC2730A5968283FDDF01739F04506 Crimson II (1989)(XtalSoft)(JP)(Disk 2 of 2) MSX JP +74266DCD275424196C127721EBA987B0 Crimson II (1989)(XtalSoft)(JP)(Disk 2 of 2)[a] MSX JP +4EFAF962D141B31BFE347DDD2471E930 Crimson II (1989)(XtalSoft)(JP)(Disk 2 of 2)[a2] MSX JP +6F96D026214A014B30B23D1D1A7D2B37 Crimson II v2 (1989)(XtalSoft)(JP)(Disk 1 of 2) MSX JP +7CCC4FA18CD26A752399465507A91EBE Crimson III (1990)(XtalSoft)(JP)(Disk 1 of 3) MSX JP +0D36644D81D3F20D5CF54BE13B733B46 Crimson III (1990)(XtalSoft)(JP)(Disk 1 of 3)[a] MSX JP +C72064C081E6EC56C2A0857E23C5C140 Crimson III (1990)(XtalSoft)(JP)(Disk 2 of 3) MSX JP +CA69D032E81F56B42FC1380F4E87F140 Crimson III (1990)(XtalSoft)(JP)(Disk 3 of 3) MSX JP +5F40F45A20C85BFEDBF92D02FF0763FF Cubo Rubik (1987)(-)(NL) MSX NL +DEE4A062FF28384A08EB6489A6511944 Cubo Rubik (1987)(-)(NL)[a] MSX NL +080F45351EF6FE753388FCFF83C9544C Cutdown (1987)(Gen Soft) MSX +399F67C427A6BFEA49832199D898E18C Cutdown (1987)(Gen Soft)[a] MSX +50342E6EB4C2FDDB423E3B0A37DC5F82 Cytron (1994)(Noud Gilessen)(NL) MSX NL +820A2D59E83EDD703FE80B3050DAEA96 Cytron (1994)(Noud Gilessen)(NL)[a] MSX NL +B3D292FA90A7C3492A99CCE89F400324 D'. Dixdaef (1988)(Tecno Soft) MSX +14EF970CF61747F2329593A9213263AF D'. Dixdaef (1988)(Tecno Soft)[a] MSX +90186A30A32FEEA2BDD100677F510527 D'. Dixdaef (1988)(Tecno Soft)[a2] MSX +4406023DC73DA68D2C55458C4487A91C Daikoukai Jidai. Uncharted Waters (1990)(Koei)(JP)(Disk 1 of 2) MSX JP +64ECE02AB1AF4F3D257045A8B478AAD8 Daikoukai Jidai. Uncharted Waters (1990)(Koei)(JP)(Disk 2 of 2) MSX JP +98655927388B34D67989C91BFC03324F Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 1 of 2)(System Disk) MSX System Disk +1BFB648CFD2CDA0407F0C42D0FF28FD6 Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 1 of 2)(System Disk)[a] MSX System Disk +1A17F3BB2837D4AE355382874405BCD8 Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 2 of 2)(Data Disk) MSX Data Disk +FF393FBF49AAB919FEA0CE7EC0E2A4F1 Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(Disk 2 of 2)(Data Disk)[a] MSX Data Disk +D1971540B835446ACE0700A76461D3B0 Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(JP)(Disk 1 of 2)(System Disk) MSX System Disk JP +C480872A0BEBE5B50B66D56374A57FE5 Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(JP)(Disk 1 of 2)(System Disk)[b2] MSX System Disk JP +F959D99275461A5C35909852932A365E Daisenryaku II - Campaign Version. Risk II (1992)(Micro Cabin)(JP)(Disk 2 of 2)(Data Disk) MSX Data Disk JP +551DFA7CEF379CDC6476B9A640B71D3F Daisenryaku II - Campaign Version. Risk II v2 (1992)(Micro Cabin)(JP)(Disk 1 of 2)(System Disk) MSX System Disk JP +101DE88C7947097E887ED7E70232F9B8 Daisenryaku II - Campaign Version. Risk II v2 (1992)(Micro Cabin)(JP)(Disk 2 of 2)(Data Disk) MSX Data Disk JP +39B70BA82D51236BF493DB71990043A1 Daisenryaku. Risk (1987)(Micro Cabin)(JP) MSX JP +7B7789BA6A4EF7F201A2F75730782CF7 Daisenryaku. Risk (1987)(Micro Cabin)(JP)[a] MSX JP +7531BBC5EA774E2A2B8970EBE93C7587 Daisenryaku. Risk (1987)(Micro Cabin)(JP)[a2] MSX JP +C3DB5C464D3E83AC3D38CAB578DF5E14 Daisenryaku. Risk (1987)(Micro Cabin)(JP)[a3] MSX JP +B5B7F66F39348D73B9BEDCBE28DD75A3 Daiva Story 5 - The Cup of Soma (1987)(T&E Soft)(JP) MSX JP +455762FB8B2FF83A8B10ECF2CCC6F587 Daiva Story 5 - The Cup of Soma (1987)(T&E Soft)(JP)[a] MSX JP +8A608AFD67C9AF14482FAD83B02296AF Daiva Story 5 - The Cup of Soma (1987)(T&E Soft)(JP)[a2] MSX JP +6DB6A478EAF84AC3BEA0E3D4D8543D3E Dancing Mai (1991)(Fairytale)(JP)(Disk 1 of 4) MSX JP +90575421DCD2BDD9562F180A6FF0E1E8 Dancing Mai (1991)(Fairytale)(JP)(Disk 2 of 4) MSX JP +F8BB1F00596691F9018A0AFE1A2AC1FE Dancing Mai (1991)(Fairytale)(JP)(Disk 3 of 4) MSX JP +D251558C8F662DD4009A6A903DBCCE4B Dancing Mai (1991)(Fairytale)(JP)(Disk 4 of 4) MSX JP +080C980628EF7367FB5646EEC4F6933D Dark Sider (19xx)(City Factory) MSX +647501487806C6B87893BD0BC6271C2A Dark Sider (19xx)(City Factory)[a] MSX +265FEE6E2615612173D0637E3C757156 Darwin 4078 (1988)(Hudson Soft)(JP) MSX JP +E43D042DB92F0E42F7B01E4A5F244AF3 Darwin 4078 (1988)(Hudson Soft)(JP)[a] MSX JP +4326F42819A235D6E327977CBEB0EF0A Darwin 4078 (1988)(Hudson Soft)(JP)[a2] MSX JP +5A73361D558027343E06D07D0A2FBB12 DASS (1992)(MSX Engine) MSX +993E3FF4B7B5D3B788B05A2E63E95F1A De Ja (1990)(Elf)(JP)(Disk 1 of 6) MSX JP +4F1C7879062DFB783341933E671FC08A De Ja (1990)(Elf)(JP)(Disk 2 of 6) MSX JP +45D37F8F3F2FE163A7E5691BC0730F1C De Ja (1990)(Elf)(JP)(Disk 3 of 6) MSX JP +5610546DE51428F8FCAD4BF0B49B227F De Ja (1990)(Elf)(JP)(Disk 4 of 6) MSX JP +8F7F15A9AD2877147680954F4977FAC0 De Ja (1990)(Elf)(JP)(Disk 5 of 6) MSX JP +2DE8DB620471134146B18D03BA312F1A De Ja (1990)(Elf)(JP)(Disk 6 of 6) MSX JP +4F5B73C1A06826C0FADE506A91C7C128 Dead of the Brain - Day of the Living Dead (1992)(Fairytale)(JP)(Disk 1 of 3) MSX JP +6D45F1312633BD6BE5672ABBEAB5D2F5 Dead of the Brain - Day of the Living Dead (1992)(Fairytale)(JP)(Disk 1 of 3)[a] MSX JP +123705481B66D40ACD7039724E2943CE Dead of the Brain - Day of the Living Dead (1992)(Fairytale)(JP)(Disk 2 of 3) MSX JP +6F389E6CF51D7A950B270CAB65FAD150 Dead of the Brain - Day of the Living Dead (1992)(Fairytale)(JP)(Disk 3 of 3) MSX JP +57AA23A0E9983B5E004C39A08D256D51 Deep Forest (1987)(Xain)(JP) MSX JP +A565BA7E105888F947CA2E4EF1F99938 Deep Forest (1987)(Xain)(JP)[a] MSX JP +08076E6BB38E36EA237496E98EFB59B1 Deep Forest (1987)(Xain)(JP)[a2] MSX JP +D8AB1810248A2BAD3376BA0811935A3A Deep Forest (1987)(Xain)(JP)[a3] MSX JP +D07A1CE763925B1E2301CBB6CD57F280 Deep Forest (1987)(Xain)(JP)[a4] MSX JP +BCC53FAE8C249F23460A7B82C72470E8 Defcon (1989)(Eurosoft)(NL) MSX NL +F87C378FC7767DEC1DEC49C9EAE236DA Defcon (1989)(Eurosoft)(NL)[a] MSX NL +BD528618C11FD6414D8071893EDC0662 Delta Force (1990)(MSX Club Magazine)(NL) MSX NL +CC2C807E151784850A95F93D2BD9EFB1 Dennou Gakuen 1 - Cybernetic Hi-School (1990)(Gainax)(JP)(Disk 1 of 2) MSX JP +2420CEC9327838EDECDFE0B7C2A4E8E2 Dennou Gakuen 1 - Cybernetic Hi-School (1990)(Gainax)(JP)(Disk 1 of 2)[a] MSX JP +634FFC50905D7F785E1BBE6917702F4C Dennou Gakuen 1 - Cybernetic Hi-School (1990)(Gainax)(JP)(Disk 1 of 2)[a2] MSX JP +9EBD6061F0F595D68D9B2EABC7158E6B Dennou Gakuen 1 - Cybernetic Hi-School (1990)(Gainax)(JP)(Disk 2 of 2) MSX JP +9E22BF2117A72C6DED94AD6DBA310322 Dennou Gakuen 2 - Highway Buster (1990)(Gainax)(JP)(Disk 1 of 3) MSX JP +970678DC3B1235CBEFACB9AFDD61A8FF Dennou Gakuen 2 - Highway Buster (1990)(Gainax)(JP)(Disk 1 of 3)[a] MSX JP +35AB334BDC1749B8B789FC4DB3AF5D02 Dennou Gakuen 2 - Highway Buster (1990)(Gainax)(JP)(Disk 1 of 3)[a2] MSX JP +4ACA44D036233F3D09E586360AC32591 Dennou Gakuen 2 - Highway Buster (1990)(Gainax)(JP)(Disk 2 of 3) MSX JP +7FB9F82672DF82BB511F2BA6445CF5F8 Dennou Gakuen 2 - Highway Buster (1990)(Gainax)(JP)(Disk 3 of 3) MSX JP +6A559BCA2DA7472933E0436D99139636 Dennou Gakuen 3 - Gunbuster (1990)(Gainax)(JP)(Disk 1 of 3) MSX JP +3AAE71E8A089806E572EBCB648159130 Dennou Gakuen 3 - Gunbuster (1990)(Gainax)(JP)(Disk 1 of 3)[a] MSX JP +EA65AD1DBDF81D7CFD9F339DE2E41665 Dennou Gakuen 3 - Gunbuster (1990)(Gainax)(JP)(Disk 2 of 3) MSX JP +B00D226AF0A28421FBEE16376C42CD20 Dennou Gakuen 3 - Gunbuster (1990)(Gainax)(JP)(Disk 3 of 3) MSX JP +D8FDE5AB3FC146DE16712720BC74449E Dennou Gakuen 3 - Gunbuster (1990)(Gainax)(JP)(Disk 3 of 3)[a] MSX JP +3B26527429274CB142A893B6F0C19679 Detective Story (1993)(Timmy Soft)(NL) MSX NL +2D56189EC472BC4E00D6B5258341CA69 Diablo (1989)(Broderbund Japan)(JP) MSX JP +B40720244B660E3CCBA19953FCD09E5C Diablo (1989)(Broderbund Japan)(JP)[a] MSX JP +302D49246EDCFC104887C51589A1E509 Diablo (1989)(Broderbund Japan)(JP)[a2] MSX JP +1CCB18260B9759E273F13E957D3CD32A Diablo (1989)(Broderbund Japan)(JP)[a3] MSX JP +FE45EA329A78ED51AA1592E6DBD2D4B3 Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 1 of 7) MSX JP +37CE83171E7B45DDAA3F5CC353937DF2 Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 2 of 7) MSX JP +0F8DA6C56B6321F73BA814BCFBB00F8F Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 2 of 7)[a] MSX JP +E5FC71F896FB84672A3292925E665876 Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 3 of 7) MSX JP +8D36BAD445234EF38698EB903ACC5A2A Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 4 of 7) MSX JP +A07383E7719C0DD8C24C25B56D32F8FF Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 5 of 7) MSX JP +617E98B4BF79B6FD4975E0D14D233965 Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 6 of 7) MSX JP +E69A43DC8403D6CD9BB844E41DAF97AA Digan no Maseki. Digan's Stone (1989)(Artec)(JP)(Disk 7 of 7)(User Disk) MSX User Disk JP +8E1E4619D0C4156D8FD5E6E4619CC462 Digger (1987)(Data Beutner Kg)(DE) MSX DE +1623363C76C7B5BF55E881BA02958490 Digger (1987)(Data Beutner Kg)(DE)[a] MSX DE +7CE16D138C1A5EE4F400474B28A430FE Digger (1987)(Data Beutner Kg)(DE)[a2] MSX DE +EAB9A20B24B90466A448018EECA59052 Dimies (1991)(H-Corp) MSX +FA413D45E53C365951BC3C9F991B69C8 Dios (1989)(Xain)(JP)(Disk 1 of 5) MSX JP +3716A3E779719461C09CD930D347B636 Dios (1989)(Xain)(JP)(Disk 2 of 5) MSX JP +7D510CDF9DC3CF48EF07A73EADE08F2F Dios (1989)(Xain)(JP)(Disk 2 of 5)[a] MSX JP +011A5AA7D17E6918A41AF67B64DF2245 Dios (1989)(Xain)(JP)(Disk 2 of 5)[a2] MSX JP +003E3C5DB3C78001BF98B8BB83ABCB1F Dios (1989)(Xain)(JP)(Disk 3 of 5) MSX JP +6A7C55D37DDE3224C8FC0DBB452DB881 Dios (1989)(Xain)(JP)(Disk 4 of 5) MSX JP +992B2D6AB8ED56BD86EC5AA7D0CA608B Dios (1989)(Xain)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +71356F71D84AF87FDB0FD658CB90D805 Dires - Giger Loop (1987)(Bothtec)(JP) MSX JP +E015BB56BA04FA605EFE1A35272FB224 Dires - Giger Loop (1987)(Bothtec)(JP)[a] MSX JP +4AD2CC6C5A17494DA1C19828CF3086B2 Disk Mystery #4 - The Man I Love (1988)(Thinking Rabbit)(JP)(Disk 1 of 2) MSX JP +907F9C8F8EC3F9A153F21E7C2F76903F Disk Mystery #4 - The Man I Love (1988)(Thinking Rabbit)(JP)(Disk 2 of 2) MSX JP +FE9026D3316B55262BA1D57ECEFFA3E5 Disk NG 1 (1989)(Namcot)(JP) MSX JP +AC972AB9CD3A104A40605ACCA385A0C7 Disk NG 2 (1990)(Namcot)(JP) MSX JP +683156932180B9689EA6E93DE8EEBF02 DIX (1992)(MSX Engine) MSX +E6DCF1AF82B3BB2CEC940A2DF94A6C0E DIX (1992)(MSX Engine)[a] MSX +31BDF841D05C49D2404FB2BD14F13691 Dizzy (1992)(MSX Engine) MSX +24E4F6E28EAE0134D8F8D3449CA34B87 Dodgems (1986)(-) MSX +834321B6D61D23B06D4086094236C570 Doki Doki Card League (1990)(Great)(JP)(Disk 1 of 2) MSX JP +3FD57A0ABCC9886889D4E55516A26C3D Doki Doki Card League (1990)(Great)(JP)(Disk 1 of 2)[a] MSX JP +480CEB266F6C44FF9AD6989DB65D9165 Doki Doki Card League (1990)(Great)(JP)(Disk 2 of 2) MSX JP +30CF0EAC843053A00B24B864DB1B20B8 Dome, The (1989)(System Sacom)(JP)(Disk 1 of 2) MSX JP +1C8EF7C8BB5C31D229D655A8E93E4E0E Dome, The (1989)(System Sacom)(JP)(Disk 2 of 2) MSX JP +8737532B056F9BA3743A38749FC597C9 Don't Warro! Be Japo! (2003)(Paxanga Soft) MSX +C3B48E4B16BCADE299C7AEB6857E429F Double Vision - Beauty Girl Photo Studio (1987)(Hard)(JP) MSX JP +D1619258A6D208446C3C6FA907F20D24 Dr. Stop! (1990)(Alice Soft)(JP)(Disk 1 of 4) MSX JP +56FCF9157C7FF9741B3B16520C945FA2 Dr. Stop! (1990)(Alice Soft)(JP)(Disk 1 of 4)[a] MSX JP +65420B20B83ADFC3CC48E8DD53F8560D Dr. Stop! (1990)(Alice Soft)(JP)(Disk 2 of 4) MSX JP +A59BCAD2D8A8F95E53452D44543741AB Dr. Stop! (1990)(Alice Soft)(JP)(Disk 2 of 4)[a] MSX JP +2092857175230BEDE8291E04D4EC5F1A Dr. Stop! (1990)(Alice Soft)(JP)(Disk 3 of 4) MSX JP +D60A5BE5D814C057CBA89170E74F4A82 Dr. Stop! (1990)(Alice Soft)(JP)(Disk 3 of 4)[a] MSX JP +0DFFD612A2E352FD17E48469795DEF67 Dr. Stop! (1990)(Alice Soft)(JP)(Disk 4 of 4) MSX JP +E61560980A6F2BDFE2536861F08C9B73 Dr. Stop! (1990)(Alice Soft)(JP)(Disk 4 of 4)[a] MSX JP +4C23DF63779F02838EFEF2CDC437163C Dragon Buster (1987)(Namcot)(JP) MSX JP +9350798B387FC7B7F55EF35B9143C612 Dragon Buster (1987)(Namcot)(JP)[a] MSX JP +F3F3BD4F063EA6B131E9970090BE9942 Dragon City X (1991)(Fairytale)(JP)(Disk 1 of 4) MSX JP +D09452EFC8F3753FBBE7B490CFC5A580 Dragon City X (1991)(Fairytale)(JP)(Disk 1 of 4)[a] MSX JP +A7BF1766A773F9A68B96A3132823FA83 Dragon City X (1991)(Fairytale)(JP)(Disk 2 of 4) MSX JP +9F9350C911AC81F39CAD7CA257E3E560 Dragon City X (1991)(Fairytale)(JP)(Disk 3 of 4) MSX JP +DDF86531162EFCAF3ABEF62801F511FA Dragon City X (1991)(Fairytale)(JP)(Disk 4 of 4) MSX JP +ABDFB3741875A0AE4D28CF3F004A1EAB Dragon Eyes (1991)(Technopolis Soft)(JP)(Disk 1 of 4) MSX JP +D35D827CB7CF4123A7CA3E9DF06DCA41 Dragon Eyes (1991)(Technopolis Soft)(JP)(Disk 2 of 4) MSX JP +BB638FF787E1C48E2C4E605D88884743 Dragon Eyes (1991)(Technopolis Soft)(JP)(Disk 3 of 4) MSX JP +633F1D0E33F63415A25AD3DF15E70874 Dragon Eyes (1991)(Technopolis Soft)(JP)(Disk 4 of 4) MSX JP +CCB5987AAE9BCBB1156F32DE683C3EBC Dragon Knight (1990)(Elf)(JP)(Disk 1 of 4) MSX JP +2D263AF33FBDCCA756D33BFBA59B97D0 Dragon Knight (1990)(Elf)(JP)(Disk 1 of 4)[a] MSX JP +5613AB328A78B832B0B1C23315F8A715 Dragon Knight (1990)(Elf)(JP)(Disk 2 of 4) MSX JP +3F796368DD48BE726D908BB146C79ADF Dragon Knight (1990)(Elf)(JP)(Disk 2 of 4)[a] MSX JP +2BECCC5D9FFDCED0E1B946223BC48579 Dragon Knight (1990)(Elf)(JP)(Disk 3 of 4) MSX JP +FF460E184423BEE22558920C8027D21C Dragon Knight (1990)(Elf)(JP)(Disk 4 of 4) MSX JP +51B777C3ADE24FA26A7819B4F59750C5 Dragon Knight II (1991)(Elf)(JP)(Disk 1 of 9) MSX JP +30C8B95F246D35F7C9DA8248B5C176D3 Dragon Knight II (1991)(Elf)(JP)(Disk 1 of 9)[a] MSX JP +A685ABD72542D26D982CF70FC55E3ED9 Dragon Knight II (1991)(Elf)(JP)(Disk 2 of 9) MSX JP +B9E96DA7FD1B4FBC1B969FBFC9A3E0ED Dragon Knight II (1991)(Elf)(JP)(Disk 2 of 9)[a] MSX JP +CB738816D027540CD6E6EAA3CECA351F Dragon Knight II (1991)(Elf)(JP)(Disk 3 of 9) MSX JP +FEAF9A37E699F902FAF468C880576E6E Dragon Knight II (1991)(Elf)(JP)(Disk 4 of 9) MSX JP +ACE72476D713EBCFA55FCFF8F37C453B Dragon Knight II (1991)(Elf)(JP)(Disk 4 of 9)[a] MSX JP +3EB89A4DA2D87DD0C66A0BF74764F02B Dragon Knight II (1991)(Elf)(JP)(Disk 4 of 9)[a2] MSX JP +1968AA2749A78B211062C3C46831A0E4 Dragon Knight II (1991)(Elf)(JP)(Disk 5 of 9) MSX JP +AC712E5C9114DBDF2F22CF2AA96EA041 Dragon Knight II (1991)(Elf)(JP)(Disk 5 of 9)[a] MSX JP +1B4ADBEC3F3A07654A9DE7495F3C9E90 Dragon Knight II (1991)(Elf)(JP)(Disk 6 of 9) MSX JP +8169E3DB629BF0647DB2B659BF7346D9 Dragon Knight II (1991)(Elf)(JP)(Disk 6 of 9)[a] MSX JP +7BB3D7F079FE1935009BC0DA5C80A36D Dragon Knight II (1991)(Elf)(JP)(Disk 6 of 9)[a2] MSX JP +7C78200E9A1948301D023A3696EEDDDA Dragon Knight II (1991)(Elf)(JP)(Disk 7 of 9) MSX JP +FEFC3683F8F8F9961ED783352E221927 Dragon Knight II (1991)(Elf)(JP)(Disk 7 of 9)[a] MSX JP +9538D7BDDDA27C6F79F9CAFB06249A8E Dragon Knight II (1991)(Elf)(JP)(Disk 8 of 9) MSX JP +CECC96FDF77748977D5130B6ABF272B4 Dragon Knight II (1991)(Elf)(JP)(Disk 8 of 9)[a] MSX JP +702C1401FF9C4891BFA1F7C27024D897 Dragon Knight II (1991)(Elf)(JP)(Disk 9 of 9) MSX JP +99C6C2B2944F43802E1F7DC9524921A5 Dragon Knight II (1991)(Elf)(JP)(Disk 9 of 9)[a] MSX JP +7409459BCA96E8FB0D26BFBFAC86FA4B Dragon Quiz (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +2CEE1B2AA386E9C8183EA7A152F71E20 Dragon Quiz (1991)(Compile)(JP)(Disk 1 of 2)[a] MSX JP +2C215A93EF197776CE56CC3B57F7FDB9 Dragon Quiz (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +3886EE3DCBC8F773DFF8F66ED615D716 Dragon Quiz (1991)(Compile)(JP)(Disk 2 of 2)[a] MSX JP +45870F6E9C142FE741CDD6DE84A21F8E Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 1 of 2) MSX +D89AD5EA5689191BFB0741345E904609 Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 1 of 2)[a] MSX +6684316C1247AD5E16312708817B1969 Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 1 of 2)[a2] MSX +43661E2C9569372C8007CBD5ED7CACD5 Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 2 of 2) MSX +50D810BBD1A6BF7F5353A4DA5E00E0D8 Dragon Slayer 2 - Xanadu (1987)(Falcom)(Disk 2 of 2)[a] MSX +AAE1155787865821F051E4251FAA624C Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP) MSX JP +0C5360098CD197824DD4AA457749B722 Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP)[a] MSX JP +9772634FC3C8D918F79345ADE4351B8C Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP) MSX JP +851E3CA34ECBF73CA7191F06B7366CE5 Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP)[a] MSX JP +D5A70FCDDA8963FAB885BDDBDA7AB122 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 1 of 5)(Game Disk) MSX Game Disk JP +EBF8089A4FE059A8A889419ED1318109 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[a] MSX Game Disk JP +7803F87CD99E4BD507B8EA986EC8C7BE Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 2 of 5)(Scenario 1 Disk) MSX Scenario 1 Disk JP +8C7BC4F3403E8B31E542AB095EC7DC77 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 2 of 5)(Scenario 1 Disk)[a] MSX Scenario 1 Disk JP +4815B29ABDF64AE52135D36B8B1A8650 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 3 of 5)(Scenario 2 Disk) MSX Scenario 2 Disk JP +391FAFCD00ABCD5861223ECD7005665A Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk) MSX Scenario 3 Disk JP +0E6BFA211E718B8D67C612B246719CF4 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk)[a] MSX Scenario 3 Disk JP +052F709BC74CE29C361DA5B909305A97 Dragon Slayer 5 - Sorcerian (1987)(Falcom)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +E9CE6D341813C57A0DD049A03F3A501F Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(Disk 1 of 5)(Game Disk) MSX Game Disk +12C5F1D0E56CC682EB7A23260BB06AB0 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(Disk 2 of 5)(Scenario 1 Disk) MSX Scenario 1 Disk +202EF61831204D807EBC36FCED323A0A Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(Disk 3 of 5)(Scenario 2 Disk) MSX Scenario 2 Disk +66A91F85FA747F32C5EA4B784D55F9DE Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(Disk 4 of 5)(Scenario 3 Disk) MSX Scenario 3 Disk +D574E7AA81DEF018B5CAACB714AE8DC5 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(Disk 5 of 5)(User Disk) MSX User Disk +5A94F1D1AB10DB08CCCC37FA35DD2C14 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 1 of 5)(Game Disk) MSX Game Disk JP +13CC9971362ED0B256576E9854A08677 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 1 of 5)(Game Disk)[a] MSX Game Disk JP +2B8786D9F6AF7E79C1C181608A831DD2 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 2 of 5)(Scenario 1 Disk) MSX Scenario 1 Disk JP +1B1F3C343B68A6B7CA4DDC03FDD6E5BC Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 2 of 5)(Scenario 1 Disk)[a] MSX Scenario 1 Disk JP +637B4D5C25116525D6A8F763058A70EB Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 3 of 5)(Scenario 2 Disk) MSX Scenario 2 Disk JP +1351EFBCD4F3672DD1D5BBBB740F32A9 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 3 of 5)(Scenario 2 Disk)[a] MSX Scenario 2 Disk JP +3AC64F40CAF5AB77A208936593FC272C Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk) MSX Scenario 3 Disk JP +887BE4ABA489721B1C525B0F0D5CF169 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk)[a] MSX Scenario 3 Disk JP +79973535E2D66D28B8A6FFB476151C69 Dragon Slayer 6 - The Legend of Heroes (1990)(Falcom)(JP)(Disk 4 of 5)(Scenario 3 Disk)[a2] MSX Scenario 3 Disk JP +D9324DC78A74243E037E497F2FB5271F Dragon World (1986)(Idealogic)(ES)(Disk 1 of 3) MSX ES +21E8B07CC98C646C8653CB5C4C6DABF1 Dragon World (1986)(Idealogic)(ES)(Disk 1 of 3)[a] MSX ES +DD0F0FC8D9824A4B1D7A7B4108F59117 Dragon World (1986)(Idealogic)(ES)(Disk 2 of 3) MSX ES +600A20138CAA3D851DE65448F19C8E76 Dragon World (1986)(Idealogic)(ES)(Disk 2 of 3)[a] MSX ES +01130F7830D8ABC4A186761FDF2B3730 Dragon World (1986)(Idealogic)(ES)(Disk 2 of 3)[a2] MSX ES +A14DC7D6AEF87723C4A8333C4B84387E Dragon World (1986)(Idealogic)(ES)(Disk 3 of 3) MSX ES +239140FF98D8C2AF300EA62E678C9A0D Dragon World (1986)(Idealogic)(ES)(Disk 3 of 3)[a] MSX ES +DFB8EB3EF40036BB71BCF8BB86572EF5 Dragon World (1986)(Idealogic)(ES)(Disk 3 of 3)[a2] MSX ES +7F4668096D1FE859F6F6701655DACB96 Dragon's Eye Super Shanghai (1991)(Hot-B)(JP) MSX JP +868094D81B0E2CD5B7FF6FE5375AFC01 Dream Program System (1989)(Alice Soft)(JP)(Disk 1 of 2) MSX JP +AA90FFE7ADB44E617656CBD1ECFBBB1A Dream Program System (1989)(Alice Soft)(JP)(Disk 1 of 2)[a] MSX JP +C9BD354E7C5336D923F63BC277124452 Dream Program System (1989)(Alice Soft)(JP)(Disk 1 of 2)[a2] MSX JP +A464DB93485A675AEFF0B2E22D4A558F Dream Program System (1989)(Alice Soft)(JP)(Disk 2 of 2) MSX JP +2C63E9577828EC0C39E3D2F68E328273 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 1 of 4) MSX JP +E4FB1C0B5733A87AB5C2553448DE5B11 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 1 of 4)[a] MSX JP +0DD9DBCFAFB6C3FAF5060B513DA7A545 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 2 of 4) MSX JP +3B02EECF8BE2AE5A60A609678FBEFD36 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 2 of 4)[a] MSX JP +D13FDF40C4B35FBAB98734DFC2B87DE1 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 3 of 4) MSX JP +3EA847A30835A7F5D2500470752EC91A Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 3 of 4)[a] MSX JP +7293CE239542297A95DB48DD2584CEA0 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 4 of 4) MSX JP +5EABF8F23272767D0F617A19E55EB1D9 Dream Program System SG - Set 1 (1990)(Alice Soft)(JP)(Disk 4 of 4)[a] MSX JP +DF037C7DE50D742CE295146B893FA4FA Dream Program System SG - Set 2 (1990)(Alice Soft)(JP)(Disk 1 of 4) MSX JP +F74146C8DBFFDD70739FBC0A062461E8 Dream Program System SG - Set 2 (1990)(Alice Soft)(JP)(Disk 2 of 4) MSX JP +8BD950B4911BF73CB0BEBEEA066C50AD Dream Program System SG - Set 2 (1990)(Alice Soft)(JP)(Disk 3 of 4) MSX JP +CA2A4BE5BE8085C905AF2D4329F28C1E Dream Program System SG - Set 2 (1990)(Alice Soft)(JP)(Disk 4 of 4) MSX JP +A4C86783508B937E66B4EDA194BE26C4 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 1 of 4) MSX JP +165CB87A12175FF4EBEA8E7F30E3CBE4 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 1 of 4)[a] MSX JP +062227FDE3744EB78BC7F23A840BB3AF Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 2 of 4) MSX JP +A9BC4A85E8806093DB3CF2FB85204105 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 2 of 4)[a] MSX JP +A57EBB3D2F57E08D8D215DC1C754E35E Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 2 of 4)[a2] MSX JP +A25BC37913A5FF4ED9D64D23B0AC7C42 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 3 of 4) MSX JP +82BB82B7B97607734E5A2FCCA097DC9C Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 3 of 4)[a] MSX JP +D2969DD2AD98A41BF1A3805220A16F99 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 3 of 4)[a2] MSX JP +B915EE51A5F4C69DFFF88DF0B8367435 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 4 of 4) MSX JP +2E1BD2D7C51CB2ADF33E730D66BBDD49 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 4 of 4)[a] MSX JP +8C8F10F5243ABE1EB486C78C087DD419 Dream Program System SG - Set 3 (1990)(Alice Soft)(JP)(Disk 4 of 4)[a2] MSX JP +1B5DA6984AAC92FD92A3E1F5137AFF7A Druid (1987)(Nippon Dexter)(JP) MSX JP +B183C7FF9978DEABCD420786F8C7A4F0 Dungeon Striker (19xx)(Mj-2 Software) MSX +53D0ADF2CC781C353C7F2DA8FC7493C6 Dynamite Bowl (1987)(Toshiba-EMI)(JP) MSX JP +012528BF8ADD8FABD60B6F0C08DB3CB6 Dynamite Bowl (1987)(Toshiba-EMI)(JP)[a] MSX JP +B6D9C34A72EBA3CD6D0897DA32974E92 Dynamite Bowl (1987)(Toshiba-EMI)(JP)[a2] MSX JP +1612413BBC19A30D862469F4D560A768 Eggbert (1994)(Fony)(NL) MSX NL +E1712C7A061551512018218DEDCD62AB Eggbert (1994)(Fony)(NL)[a] MSX NL +1AF9B4A75A0E2AE12EEB64A4FB8B7DC9 Eindeloos (1986)(Radarsoft)(NL) MSX NL +2724FD6649682D4E0D1A6207B1A55398 Elslid. Erenubu. Eagle War (1988)(NCS)(JP)[a][needs MegaRAM 128k] MSX JP +78DA570E7AB34D8D8B1F9F7C73744339 Elslid. Erenubu. Eagle War (1988)(NCS)(JP)[needs MegaRAM 128k] MSX JP +F1E72A268519A4D3910DCA005B4B2DEB Emerald Dragon (1990)(Glodia)(JP)(Disk 1 of 5)(Visual Disk A) MSX JP +FEDBE049F72D92F518198F8B2E421699 Emerald Dragon (1990)(Glodia)(JP)(Disk 1 of 5)(Visual Disk A)[a] MSX JP +61911040895041C5ABDCBEC3FC0E550B Emerald Dragon (1990)(Glodia)(JP)(Disk 2 of 5)(Visual Disk B) MSX JP +384A70A9062D06273AE8E4DF52A04D26 Emerald Dragon (1990)(Glodia)(JP)(Disk 2 of 5)(Visual Disk B)[a] MSX JP +233BB9E13785CDCDA88748A69F172CB4 Emerald Dragon (1990)(Glodia)(JP)(Disk 3 of 5)(Opening Disk) MSX Opening Disk JP +C558DF411229D90F6EB7E1B163C0E6C9 Emerald Dragon (1990)(Glodia)(JP)(Disk 3 of 5)(Opening Disk)[a] MSX Opening Disk JP +9CC00E9A3EE319B16F49C0C44847E6AF Emerald Dragon (1990)(Glodia)(JP)(Disk 4 of 5)(Game Disk) MSX Game Disk JP +9E87F92A2C29D6C89E0C59DCFB518079 Emerald Dragon (1990)(Glodia)(JP)(Disk 4 of 5)(Game Disk)[a] MSX Game Disk JP +A17B5C82F78B929466A543FB38C5CB4E Emerald Dragon (1990)(Glodia)(JP)(Disk 4 of 5)(Game Disk)[a2] MSX Game Disk JP +7E9D1B19AA154CF03BD8D02F354328E1 Emerald Dragon (1990)(Glodia)(JP)(Disk 5 of 5)(Ending Disk) MSX Ending Disk JP +E17ECB7F1DF367A32EEABF21FC139BB9 Emerald Dragon (1990)(Glodia)(JP)(Disk 5 of 5)(Ending Disk)[a] MSX Ending Disk JP +4DDAEFC7A9A73AF936CFC8B75B29FD36 Empereur, L' (1990)(Koei)(JP)(Disk 1 of 2) MSX JP +CC50B98582345A51F80FFB0436938B2F Empereur, L' (1990)(Koei)(JP)(Disk 1 of 2)[a] MSX JP +288C3FDC428DB39D348660881FE6DB8C Empereur, L' (1990)(Koei)(JP)(Disk 2 of 2) MSX JP +25D4317AE0A6B381A428E6EF1CE82B46 Empereur, L' (1990)(Koei)(JP)(Disk 2 of 2)[a] MSX JP +296357EBA29728DD2EC6C940EA1CCE17 Endlos (1986)(Radarsoft)(NL) MSX NL +6DF74308654F37A7199A6A67BE39CBA5 Endlos (1986)(Radarsoft)(NL)[a] MSX NL +0E1CABA46F07FB753A2AD01F6B9A71B4 Energy Crash (19xx)(-) MSX +78CE59645AE772687CDEEDA4465958CB Energy Crash (19xx)(-)[a] MSX +151E855C4FD67C07961833B1EC0190BF Estland Campaing (1991)(Medo)(JP)(Disk 1 of 2)(Demo Disk) MSX Demo Disk JP +E959894777CEF12528C07810C38779E6 Estland Campaing (1991)(Medo)(JP)(Disk 2 of 2)(Game Disk) MSX Game Disk JP +A2696E832430C39AB2232A787FA749ED Estland Campaing (1991)(Medo)(JP)(Disk 2 of 2)(Game Disk)[a] MSX Game Disk JP +1A850CFFB0F62DE9FA14BA379854C609 Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP)(Disk 1 of 2) MSX JP +936140C0F105F66999A4A4F5DAFFB52D Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP)(Disk 2 of 2) MSX JP +AD8A5B784C938E6C51C76CDE8A0BA604 Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP)(Disk 2 of 2)[a] MSX JP +8E3DB01ACBA5EDC50C1159D8BE3DB801 Even (1994)(Frieve)(JP) MSX JP +A39DEAC23BC6B4053A98AA4687748EEB Even (1994)(Frieve)(JP)[a] MSX JP +9C093F25928E39DA2D04F4F96D6968C1 Evil Spirit (1992)(BOF Software) MSX +2BC8B0B32F15FB794489309FB4AA50D5 Exterlien (1990)(D.O.)(JP)(Disk 1 of 3) MSX JP +BE2976E9825AFC4A604545369452A19E Exterlien (1990)(D.O.)(JP)(Disk 1 of 3)[a] MSX JP +9EEF37C0E04527BBE6037D5B32C66656 Exterlien (1990)(D.O.)(JP)(Disk 1 of 3)[a2] MSX JP +86155BC07086D93B509EC5C9AE114503 Exterlien (1990)(D.O.)(JP)(Disk 1 of 3)[a3] MSX JP +7C346B91DE3C034DCA9482C37AEAC4EB Exterlien (1990)(D.O.)(JP)(Disk 2 of 3) MSX JP +10E43535063947C54304F90363AEFFC3 Exterlien (1990)(D.O.)(JP)(Disk 2 of 3)[a] MSX JP +7CFBCF5641D2575B9FB6F7DA9B24BF90 Exterlien (1990)(D.O.)(JP)(Disk 2 of 3)[a2] MSX JP +A48667B6EFCED64F4273DC1DC0513D03 Exterlien (1990)(D.O.)(JP)(Disk 3 of 3) MSX JP +DAD3B9762606B22E9098EB4C63D0853E Exterlien (1990)(D.O.)(JP)(Disk 3 of 3)[a] MSX JP +FE04909BED4A0F9100FABE2037D78E19 Exterlien (1990)(D.O.)(JP)(Disk 3 of 3)[a2] MSX JP +D5099290720411F9536A9E9A6C53133F Exterlien (1990)(D.O.)(JP)(Disk 3 of 3)[a3] MSX JP +336C10F9D650A99F390264F7A032A6AA F1 Douchuuki (1990)(Namcot)(JP) MSX JP +494DADFF40A11CD80D7446B2B7EF4FE8 Fahrenheit 451 (1986)(Idealogic)(ES)(Disk 2 of 3) MSX ES +72D1CACE8904673E6092D1FA73F8BA1A Fahrenheit 451 (1986)(Idealogic)(ES)(Disk 3 of 3) MSX ES +247EF79D3148D83028E4C0468D8CCA51 Famicle Parodic (1988)(Bit2)(JP) MSX JP +4E9B54AFBDE173EBAB774EFF84D1EA93 Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 1 of 2) MSX JP +EBFD91B1B1303C6EB6757A9903F3B9D5 Famicle Parodic 2 (1990)(Bit2)(JP)(Disk 2 of 2) MSX JP +9CA091A2D0DE2F72E9F48C4C18281895 Family Billiards (1987)(Pack In Video)(JP) MSX JP +1E2A4BF87A40A3EF5548823E75139DA1 Family Billiards (1987)(Pack In Video)(JP)[a] MSX JP +1F6D2AF5DA31F4D39BCA8D943612069F Family Billiards (1987)(Pack In Video)(JP)[a2] MSX JP +FE03BD4F576681E0D8C11F1C9D943E1E Family Boxing (1988)(Sony)(JP) MSX JP +E25798C3994BC5CB20D1210E5871A2CE Family Boxing (1988)(Sony)(JP)[a] MSX JP +5628DD41A2BE8AFFD2E674CAFAA0E828 Family Boxing (1988)(Sony)(JP)[a2] MSX JP +60D6C867B731B9056C81E806623BF34D Family Stadium Pro Baseball - Homerun Contest (1989)(Namcot)(JP) MSX JP +2172840812A9388E849F1064FB53EC20 Family Stadium Pro Baseball - Homerun Contest (1989)(Namcot)(JP)[a] MSX JP +6D1690079F940E584209E02CD8FA2C08 Fantasy Zone II - The Tears of Opa-Opa (1987)(Pony Canyon)(JP) MSX JP +ACAD1F722E0E6C1E6CA26DEF7E6FC97E Fantasy Zone II - The Tears of Opa-Opa (1987)(Pony Canyon)(JP)[a] MSX JP +E15EE44D30B83F9CE189F9AD1BA7968A Feedback (1988)(Tecno Soft)(JP) MSX JP +13556AAD74D804EDA6B54DAF152E90A8 Feedback (1988)(Tecno Soft)(JP)[a] MSX JP +EF82A5B7434403E1C9BFFF12ADDEB169 Feedback (1988)(Tecno Soft)(JP)[a2] MSX JP +36B3C1EEA54E35C8D9898F4A5547D9A4 Feedback v2 (1988)(Tecno Soft)(JP) MSX JP +FE92EF5648F32B8440B9FD4E05AA41CB Fighting Wolf AT, The (1990)(Technopolis Soft)(JP) MSX JP +6ED2AAB01AFF1989040A7F983A80F56A Fighting Wolf AT, The (1990)(Technopolis Soft)(JP)[a] MSX JP +1627AD05EECC545DFE500BC16CC98CA7 Fighting Wolf AT, The (1990)(Technopolis Soft)(JP)[a2] MSX JP +D5A4D545C148E8678E0D7A4BA26883FA Final Countdown (1988)(Methodic Solutions)(NL) MSX NL +B13467D34ECD2EEC3BC54069988A4F4D Final Countdown (1988)(Methodic Solutions)(NL)[a] MSX NL +636370BA2BBD18F94168D93D82988848 Final Fantasy (1989)(Micro Cabin)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +56BA0ABB9CEC7325B596F090BE16A168 Final Fantasy (1989)(Micro Cabin)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +4A1FEAEB18624A90C51192E9C9D3B0FA Final Fantasy (1989)(Micro Cabin)(JP)(Disk 1 of 2)(Game Disk)[a2] MSX Game Disk JP +D280E5D6E58AB80430DAFD57B515EC81 Final Fantasy (1989)(Micro Cabin)(JP)(Disk 1 of 2)(Game Disk)[a3] MSX Game Disk JP +034AEB4C0BB65271ED0EBDF1200CE6F0 Final Fantasy (1989)(Micro Cabin)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +3BE2440C880682A7AB6DB5E87711ED4F Final Fantasy (1989)(Micro Cabin)(JP)(Disk 2 of 2)(User Disk)[a] MSX User Disk JP +809701D73E5105AC63289C1D3AA52E47 Final Potential (1990)(MSX Magazine)(JP) MSX JP +C39994BF0E65A12C1401C33F48EAFAA3 Finally Wizard (1989)(Data System)(Disk 1 of 3) MSX +8898DFE641FFA7637FADF5ECCF1675BD Finally Wizard (1989)(Data System)(Disk 2 of 3) MSX +2E7399EA244FFF62AD1FF54ED2D76128 Finally Wizard (1989)(Data System)(Disk 3 of 3) MSX +5365C0FB7934A34529686F2330814741 Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2) MSX JP +404139139EABE07726B5247FC792B9CD Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2)[a] MSX JP +F1CCFDAAD693E741B2DD882E18DAD2BD Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2)[a2] MSX JP +7FF2E2EF490A6472A2D251FCF0D719DE Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2)[a3] MSX JP +4643651334147CE80BC8F3CCABD9697A Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 1 of 2)[a4] MSX JP +B9490C9C1625A88ADCDA3934D39934F3 Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 2 of 2) MSX JP +D3522AF6F928117BDB4F7F956D19B571 Fire Hawk - Thexder II (1989)(Game Arts)(JP)(Disk 2 of 2)[a] MSX JP +17BD8C22E29A7625F1C51D10C1829A2D Fleet Commander II (1990)(ASCII)(JP) MSX JP +A7617919154EE2C2DB68C42B1D18203A Fleet Commander II (1990)(ASCII)(JP)[a] MSX JP +0397500093021823880728434D6E4132 Fleet Commander II (1990)(ASCII)(JP)[a2] MSX JP +1497FB9968770AAE6E05E5BABB0446F7 Fleet Commander II (1990)(ASCII)(JP)[a3] MSX JP +0F068E20CA1745FF275E5534A4D0766D FM 1-2-3 (1994)(Gigamix)(JP) MSX JP +1DA4A59C5C2F8982C24E5D23A1AD25BE FM 4 (1995)(Gigamix)(JP) MSX JP +4DFA3F3C5C10B70A2BDF4FAD13CE84A7 For The Day II (1990)(Mirinae Soft)(KR)(Disk 1 of 3) MSX KR +E289CDFEB5D0089742E6D80B9EAD4571 For the Day II (1990)(Mirinae Soft)(KR)(Disk 1 of 3)[a] MSX KR +207C567D6A6CB5D6C33C29A403C7FD1C For The Day II (1990)(Mirinae Soft)(KR)(Disk 2 of 3) MSX KR +C3C9284DEABA538DAB69165260779162 For the Day II (1990)(Mirinae Soft)(KR)(Disk 2 of 3)[a] MSX KR +A884591F20137D375DB91F187FDA648F For The Day II (1990)(Mirinae Soft)(KR)(Disk 3 of 3) MSX KR +6FE0A9DD185C02E546DF6F8517BDACFD For the Day II (1990)(Mirinae Soft)(KR)(Disk 3 of 3)[a] MSX KR +C0C3DC9280E782050B75DDA8FE1488F3 Frantic (1992)(Anma)(NL) MSX NL +12AE132C1E52C95164D943FB9BD456F9 Frantic (1992)(Anma)(NL)[a] MSX NL +79CA58CAF0E8B64BEC046DCB68811344 Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 1 of 4)(Opening Disk 0) MSX +90526F294C8C34A4C6788697DEED412E Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 2 of 4)(Opening Disk 1) MSX +0E5F46EE29E5E501EA9BDA4037F64F81 Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 3 of 4)(Game Disk 0) MSX +23CCF09D88B9567142C128AD627817D9 Fray - In Magical Adventure (1990)(Micro Cabin)(Disk 4 of 4)(Game Disk 1) MSX +1780B4EEC1F51C0F0CB8025610D9A8A5 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk 0) MSX JP +D0530784F563334C346031022843171E Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk 0)[a] MSX JP +A21DEAE7EC6C02060BD60B2D8A277E49 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk 0)[a2] MSX JP +7FF58351CF62ABE4A496DB11B63CBF83 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 2 of 4)(Opening Disk 1) MSX JP +3C2590B9C86FBF4618BD5524473126B5 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 2 of 4)(Opening Disk 1)[a] MSX JP +F401772DA79BD62972BD06DD2F4DFCE2 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 2 of 4)(Opening Disk 1)[a2] MSX JP +755F648D3C61984ECFC0C77AA80360F5 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 0) MSX JP +EA2AB0234595463E900421C7CC464365 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 0)[a] MSX JP +474EAA0B29713B2A4F1BABC452D13C7B Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 0)[a2] MSX JP +61FA1690560837D3F77D67EE0600DF4F Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 1) MSX JP +BEA4CC1B28C85F545A6877DB8BECC01A Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 1)[a] MSX JP +DB4AB329B5BDA6D70344FA514EC22008 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 1)[a2] MSX JP +BD09071E765E46ACB3E0ABCD45335DD2 Fray - In Magical Adventure (1990)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 1)[a3] MSX JP +291972079D0714BEFB5145BD88087117 Fray - In Magical Adventure (demo) (1990)(Micro Cabin)(JP) MSX JP +91F3690566F209D3C1C84366E2D139D3 F-Zeru Ex (1991)(Madou Yochien) MSX +96D87147B7D5612B9C7C63A6E4C5B4B4 F-Zeru Ex (1991)(Madou Yochien)[a] MSX +D6D6B62C51ADE83B68B42A6F6A2B9007 Gagdius (1989)(Limia Soft)(Disk 1 of 2) MSX +68E6A675E18EB071D3167810FC4B121F Gagdius (1989)(Limia Soft)(Disk 2 of 2) MSX +18C9900BCC0AF21DCC3660C53246C0B6 Gaia's Crest (1988)(NCS)(JP) MSX JP +445E6F41C1DEC43A005378F56DB8710D Gakuen Monogatari. High School Story (1988)(Great)(JP) MSX JP +021663D7778CB750DF7A270A37774F2D Gall Force - Eternal Story (1987)(Sony)(JP) MSX JP +689504C02809BC89B49418DFBFBF4F41 Gall Force - Eternal Story (1987)(Sony)(JP)[a] MSX JP +81341813B9BD0D174986877FEBACA2FB Galmoon (19xx)(Maron Team)(JP) MSX JP +4702F8D40F81B2107D8B6BA6D013A7C0 Gals Quest Extra Part - The Princess' Pursuit (2001)(Tomorrows Soft)(JP) MSX JP +82CD8B57DE5D832FFEC086CEBB725E6B Ganbare Goemon. Samurai (1987)(Konami)(JP) MSX JP +776049E4E06B3429E7F227787F1C4178 Ganbare Goemon. Samurai (1987)(Konami)(JP)[a] MSX JP +5C1C760A47C33A36750D0505494EBD18 Ganbare Goemon. Samurai (1987)(Konami)(JP)[a2] MSX JP +EEAD5D3EAC6C24258451B9350016028B Gandhara (1988)(Enix)(JP)(Disk 1 of 2) MSX JP +07C1241925BB41640CA76165E6251B4A Gandhara (1988)(Enix)(JP)(Disk 1 of 2)[a] MSX JP +069D55831F796AB21A195926A765058D Gandhara (1988)(Enix)(JP)(Disk 1 of 2)[a2] MSX JP +92D6281F5625E405A70D20CE0842F330 Gandhara (1988)(Enix)(JP)(Disk 2 of 2) MSX JP +83D1E48C7640AC24423147CBE1A120FE Gandhara (1988)(Enix)(JP)(Disk 2 of 2)[a] MSX JP +081096C2CAAC94ED8210DF1092BE8F4C Gandhara (1988)(Enix)(JP)(Disk 2 of 2)[a2] MSX JP +53E7C153C065C2C6533242F6A609CCD2 Garyuoh. Dragon King (1987)(Xain)(JP) MSX JP +42A4744C6D4BB772272435D4EC41EA38 Garyuoh. Dragon King (1987)(Xain)(JP)[a] MSX JP +43E6E1535D00187E7979FB50BD124147 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 1 of 4) MSX JP +B79EFCE6B0CC79660AE347F3F2517647 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 1 of 4)[a] MSX JP +9B7610E570F273AEAD1DA89B91111E97 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 2 of 4) MSX JP +763C1F2B85650BF70FBD8DE80D7A7776 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 2 of 4)[a] MSX JP +CBA72F7BB10A1907A59B978AA147ABE5 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 2 of 4)[a2] MSX JP +6382F662D0F910D3244EC0EFA0303F23 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 3 of 4) MSX JP +8207DE837DF36139C245F2D5249B69FE Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 3 of 4)[a] MSX JP +E02404F4EBAAB9CDF273307EF34F1AF8 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 4 of 4) MSX JP +2C1A4F325A01DADEE6862950E44A665B Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 4 of 4)[a] MSX JP +8813E932C50D2B52ADE542BB539F3A66 Gaudi - The Wind of Barcelona (1992)(Wolfteam)(JP)(Disk 4 of 4)[a2] MSX JP +B489DD20ED5CB61E70CCEC44462489AD Gekitotsu 7 Narabe (1990)(Satico)(JP) MSX JP +90B023DD14F027627FB17FF63F6CEDF3 Gekitotsu 7 Narabe (1990)(Satico)(JP)[a] MSX JP +09C7C89A605CB5EB77F3D6B8EBA90E04 Gekitotsu 7 Narabe (1990)(Satico)(JP)[a2] MSX JP +2BE24D833DEC2A4850EE72DCEBB7C5FD Gekitotsu 7 Narabe (1990)(Satico)(JP)[a3] MSX JP +209D4DEB6A6AD9F3C615699750BA1BB5 Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[a][SCC] MSX JP +3D15DA270836230B5B27EE5109C231F1 Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[a2][SCC] MSX JP +A9CE91D0894F24CE60153857BBA9042C Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[SCC] MSX JP +778B033F6770E78551CA2270A761E7DB Genchouhishi (1992)(Koei)(JP)(Disk 1 of 2) MSX JP +862CC328AA95053D498CE416CD5D5061 Genchouhishi (1992)(Koei)(JP)(Disk 2 of 2) MSX JP +6DC79AC062207C975DC979DB59A32E60 Genchouhishi (1992)(Koei)(JP)(Disk 2 of 2)[a] MSX JP +65FFB8970B85CDB9683F70A7FD89CB2D Genchouhishi (1992)(Koei)(JP)(Disk 2 of 2)[b2] MSX JP +DA7861AADF8C21A2B5F6E5653D9183A7 Genghis Khan (1988)(Koei)(JP)(Disk 1 of 2) MSX JP +D942F18F3C8FC4A218A0D8BB87FDFF59 Genghis Khan (1988)(Koei)(JP)(Disk 1 of 2)[a] MSX JP +6F51503E019DCFD376CE553C13C99F26 Genghis Khan (1988)(Koei)(JP)(Disk 2 of 2) MSX JP +7F0B190D4F19E27D5B3D855D6D1CEA3F Genius (1999)(Marcelo's HP) MSX +ABD2E7CCDC97F2E2104F940D13AC1B92 Giddy Runner (1990)(A.R.E. System) MSX +34D406EC974529B491253025E541AB91 Giddy Runner (1990)(A.R.E. System)[a] MSX +CE8630821C4E66F837F819BD1BA4B523 Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 1 of 2) MSX JP +E348931EBFFF9F978FABA9FFC26C0480 Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 1 of 2)[a] MSX JP +3A61753BFF9BBA98C5E3328A5E939B82 Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 1 of 2)[b2] MSX JP +343CE842F584A602CF0ED04B21B2596A Ginga Eiyuudensetsu (1989)(Bothtec)(JP)(Disk 2 of 2) MSX JP +34CE47C5EB1D3E93ED57B9E33CF1EC88 Ginga Eiyuudensetsu II DX Kit (1991)(Bothtec)(JP)(Disk 1 of 2) MSX JP +829287E844F0D8B628D50020D6211424 Ginga Eiyuudensetsu II DX Kit (1991)(Bothtec)(JP)(Disk 2 of 2) MSX JP +5093A57CA450176FC2057AC9E7FCFC6C Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 1 of 5) MSX JP +8314488E5B11A5D4A7630AF5127E3DA3 Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 1 of 5)[a] MSX JP +2165A046A11B75BE1702C2FC917457DF Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 2 of 5) MSX JP +7822417AC5BAE14CBE564F96438E682F Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 2 of 5)[a] MSX JP +AC4AFD8BECF80993C4B9B0DDE1DAE75A Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 3 of 5) MSX JP +A3C76D21926406064F86B8CD85354975 Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 3 of 5)[a] MSX JP +2730DE5C3291FA173336D3D2DD56F5E4 Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 4 of 5) MSX JP +B1E513842A2C98039ADE3973B6D44641 Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 4 of 5)[a] MSX JP +152E49A60CE76ED2106AC92D67E58074 Ginga Eiyuudensetsu II. Space War Simulation (1990)(Bothtec)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +A94E2BD702BB553791B578AF57B1313A Girl's Control (1989)(Hard)(JP) MSX JP +AD30BF3F8809FE518BDE6707454AD725 Girl's Control (1989)(Hard)(JP)[a] MSX JP +27F47E409BAF12004A41F7150B84C2AB Girly Block (1988)(Telenet Japan)(JP) MSX JP +0EB2C9AB22A8FB056803313D5BEC19D9 Girly Block (1988)(Telenet Japan)(JP)[a] MSX JP +3A56C713734EEF296B7A24AABAC05807 Girly Block (1988)(Telenet Japan)(JP)[a2] MSX JP +620142FCE78FBF1F0C392F832B6D6670 Girly Block (1988)(Telenet Japan)(JP)[a3] MSX JP +FC427BCBA2281D6BA1762A3C30CCC621 Go! Volcano (1989)(Nagi-P Soft) MSX +DE0608301964D456E6CB93DA19024002 Gokudo Jintori (1989)(Micronet)(JP) MSX JP +55F7781A2FBFCA8DC947B260B709F051 Golf Course Collection, The (1988)(Pack In Video)(JP) MSX JP +EE2EE0DD64F06257E0431C8E1BEA5E9B Golf Course Collection, The (1988)(Pack In Video)(JP)[a] MSX JP +81C69FC8511798B05AEBE38790756BA3 Golf, The (1988)(Pack In Video)(JP) MSX JP +2C19E2F5CC3DF9D03FF44473FB67737D Golf, The (1988)(Pack In Video)(JP)[a] MSX JP +D5AFEAA742D6588BABD60372939F39AC Golf, The (1988)(Pack In Video)(JP)[a2] MSX JP +5DBA87D2635A4F0D0DEA9B8FCE7041BA Golvellius II (1988)(Compile)(JP)(Disk 1 of 3)(Opening Disk) MSX Opening Disk JP +FA8C09C2922D58FB8741EDD6EAD69810 Golvellius II (1988)(Compile)(JP)(Disk 2 of 3)(Game Disk) MSX Game Disk JP +3D7E912A3A61765BF5C2C30D7973FE33 Golvellius II (1988)(Compile)(JP)(Disk 3 of 3)(User Disk) MSX User Disk JP +7F5BDFFD1207A3D6705448B021108EE4 Goody (1988)(Opera Soft)(ES) MSX ES +4073CEDB51A9A934942B9782F6B3BAA6 Goody (1988)(Opera Soft)(ES)[a] MSX ES +AE95FF6D17433DD0BDBCB9E7798786C6 Gorby's Pipeline (1991)(Compile) MSX +97998AC63B0DA80C95F610F528827E43 Gram Cats (1989)(Dot Plan)(JP)(Disk 1 of 2) MSX JP +9CD7606DD8D948B661C4E8B45E340439 Gram Cats (1989)(Dot Plan)(JP)(Disk 2 of 2) MSX JP +B35A67AC84E55ACF2C2598606E37A1CB Great Gianna Sisters, The (1993)(Sunrise)(NL) MSX NL +3DE29B950D2B9A8045A2AC1B7440A9C0 Great Gianna Sisters, The (1993)(Sunrise)(NL)[a] MSX NL +8C0D7E983C168C0F729F87A84E05E0E6 Greatest Driver (1988)(T&E Soft)(JP)(Disk 1 of 2) MSX JP +2B59AEEFD0D382FC5E430BF8E542079B Greatest Driver (1988)(T&E Soft)(JP)(Disk 1 of 2)[a] MSX JP +3BF3BE30D54315BE11AA13ACCEE0706E Greatest Driver (1988)(T&E Soft)(JP)(Disk 1 of 2)[a2] MSX JP +D8BBEC182F84060B227BA202024B35F8 Greatest Driver (1988)(T&E Soft)(JP)(Disk 2 of 2) MSX JP +DB615D6C21AD42354BBA9677335409A0 Greatest Driver (1988)(T&E Soft)(JP)(Disk 2 of 2)[a] MSX JP +4869CA5DFA2052B73BEB4A8044B47884 Greatest Driver (1988)(T&E Soft)(JP)(Disk 2 of 2)[b2] MSX JP +73E1B1ABDA6829348A2DBD6BB928B1A0 Greatest Driver 2D Special (1988)(T&E Soft)(JP) MSX JP +356E336B82509ACCBEDFDC8527E6A4DC Greatest Driver 2D Special (1988)(T&E Soft)(JP)[a] MSX JP +328AD2AFDAFF4C086DF40763B6FDB1A7 Greatest Driver 2D Special (1988)(T&E Soft)(JP)[a2] MSX JP +67CBBC108B0E4C7CADD57C31522F1C51 Greatest Driver v2 (1988)(T&E Soft)(JP)(Disk 1 of 2)[b2] MSX JP +D746D339F25FABBF8B7F6177571564C6 Greatest Driver v2 (1988)(T&E Soft)(JP)(Disk 2 of 2)[b2] MSX JP +97566B22E2DD5D7E2D8B665A1CF96D06 Green Crystal (1991)(Compile)(JP) MSX JP +E78C86131342703CF858A03AB2EE0DC0 Green Crystal (1991)(Compile)(JP)[a] MSX JP +8699BF7C5DC5482FBE2D678F6B125C82 Grotten van Oberon, De (1986)(Philips)(NL) MSX NL +7F6EF0364283D88DAD100AB1C985CAFE Guido's Lost in Plantinus (1995)(MFZ Disk Magazine)(NL) MSX NL +1518750DFD7E28D65C5DB5B7030711E1 Gulliver. Garibar (1988)(C.B.C.)(JP) MSX JP +2A09D37C455C965C1A167CB04AD067D2 Gunjin Shougi. Military Chess (1988)(Pack In Video)(JP) MSX JP +0B3A1EACC228FB710F4457CEFAFC9CE1 Gunship (1989)(Microprose Japan) MSX +8B7DC03DF0BAB9DE2A41379B74323840 Gunship (1989)(Microprose Japan)[a] MSX +5FCBAE1B10AA77F38B3CA527C18117BD Gunship (1989)(Microprose Japan)[a2] MSX +0E24D786F8D19B91E8212CDBF00BFB3D Guru Logic (2002)(TeddyWarez)[SCC] MSX +1EC655880B5354C6A6B2CAB67083BA4C Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP) MSX JP +0768A3DFD6593C4B7DD5F4CB2253EE5F Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[a] MSX JP +D3B10C2B6BCE0A314A5B52682A6F85B3 Haja no Fuin (1987)(Kogado)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +F9507840C8421916ACB5C12826859EA5 Haja no Fuin (1987)(Kogado)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +A7DDFAEA6F017C7120690E038E565B09 Haja no Fuin (1987)(Kogado)(JP)(Disk 1 of 2)(Game Disk)[a2] MSX Game Disk JP +5A7695EF9A481692274EB03C56FE3A97 Haja no Fuin (1987)(Kogado)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +7AB109A85D91D0455B67C634F0066217 Haradius (1991)(Impact Soft) MSX +BD11818079F3D840B7109F9BAA2FAACE Haradius (1991)(Impact Soft)[a] MSX +0DB207E0C467C04315E230C01F1803EC Haradius (1991)(Impact Soft)[a2] MSX +5BE027FE4029B966D58D557B1FDB2E2D Harajuku After Dark (1989)(Kogado)(JP) MSX JP +EC7CC1956903AF4C779C3AF3B3914419 Harajuku After Dark (1989)(Kogado)(JP)[a] MSX JP +7CF57D44910DE2A6B7564D9FE2E67BBF Hardball (1987)(Sony)(JP) MSX JP +A5A1ABD92455E1A509AC654A09EA12B9 Hardball (1987)(Sony)(JP)[a] MSX JP +E7006B7B23F2FDE0CE63289BDE21378B Heroes of the Lance (1991)(Pony Canyon)(JP) MSX JP +F53C0827ADF586534C69117AB82187F3 Herzog (1988)(Tecno Soft) MSX +6DFD9BA7F3C2D868D0C215F5BE683731 Herzog (1988)(Tecno Soft)[a] MSX +FD5A2131DC27C75393152B218895A019 Hexion 2 (19xx)(Dob) MSX +F4BC8F642EC9170C9658104766188252 Hideger. Heidegger (1989)(Xain)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +657D73FF11B3E8DD3768BA17A07778F8 Hideger. Heidegger (1989)(Xain)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +02DA89EAE21362D0B487FCAF1D3AFE23 Hinotori. Firebird (1987)(Konami)(JP) MSX JP +7E595E17DA3D64874707D48E3238C817 Hinotori. Firebird (1987)(Konami)(JP)[a] MSX JP +8DF9ADCF7471AA58707BA24850BD8745 Hinotori. Firebird (1987)(Konami)(JP)[a2] MSX JP +F640F07B58F63CA7B58AF65E8E6333F7 Hiranya no Mazo. The Mystery of Hiranya (1986)(Pony Canyon)(JP) MSX JP +DDB642EBD1252281375AB346D44B4F1C Hitomi Kobayashi - Puzzle in London (1988)(Informercial)(JP) MSX JP +35A24AA89A84656DAD327B6009E9DF3B Hitomi Kobayashi - Puzzle in London (1988)(Informercial)(JP)[a] MSX JP +A783414E0FB3C3BB3C37815E6ED06C2E Hitomi Kobayashi - Puzzle in London (1988)(Informercial)(JP)[a2] MSX JP +453F6174BE00024C4D2CA392D38C6168 Hole in One Special (1987)(HAL Laboratory)(JP) MSX JP +F2C7664674F010AB6887F0C3A58E1D59 Hole in One Special (1987)(HAL Laboratory)(JP)[a] MSX JP +FC818CFF6BE10482139D8EFDC85DCF30 How Many Robot (1988)(Artdink)(JP) MSX JP +3EF996792C1434ABE18484B06367C3FE How Many Robot (1988)(Artdink)(JP)[a] MSX JP +53BF7D6B945464B4335356B8A726F37E Hydefos (1989)(Hertz)(JP)(Disk 1 of 2) MSX JP +08893BBEC27DC75F0610D01D078E53A3 Hydefos (1989)(Hertz)(JP)(Disk 1 of 2)[a] MSX JP +6838F2049C1F49C1C89BA488CB20C02C Hydefos (1989)(Hertz)(JP)(Disk 1 of 2)[a2] MSX JP +437022B2F5EC580F40A5B05DA9FB1887 Hydefos (1989)(Hertz)(JP)(Disk 2 of 2) MSX JP +A68DCFCFF4D8E2C88A275915BA80D0DE Hydefos (1989)(Hertz)(JP)(Disk 2 of 2)[a] MSX JP +50E5B70FF7ABBAB0FCDF3CB340FFAD17 Hydefos (1989)(Hertz)(JP)(Disk 2 of 2)[a2] MSX JP +9CA72C72AA99378C6F64FD1A1D04AF99 Hydefos v2 (1989)(Hertz)(JP)(Disk 1 of 2) MSX JP +BC12C80231B1F0DD850759C969FDFB7F Hydefos v2 (1989)(Hertz)(JP)(Disk 2 of 2) MSX JP +C4A22F18FC33DE1D7577D47054ADAE3C Hydlide (1985)(T&E Soft)(JP) MSX JP +91EC88890A0DC3AE00CE3AA9311B029A Hydlide (1985)(T&E Soft)(JP)[a] MSX JP +40E16BECF24DD323478D2800C4E07E95 Hydlide (1985)(T&E Soft)(JP)[a2] MSX JP +E1A7A93F37739FA456D7D55A4C002F0A Hydlide (1985)(T&E Soft)(JP)[a3] MSX JP +62D5D16EC3CED1A81C49825E40F2F0B8 Hydlide III - The Space Memories (1987)(T&E Soft)(JP) MSX JP +DDE5E814F58D8E69CC5ADD0C07379EC5 Hydlide III - The Space Memories (1987)(T&E Soft)(JP)[a] MSX JP +3500C6EB97609327E83FF9F05C358328 Hydlide III - The Space Memories (1987)(T&E Soft)(JP)[a2] MSX JP +5AD7058E84EA301B35E1CBD6CC165282 Ifr-Fly (1988)(Philips) MSX +3FDDA6A5078BB6D59E7FF3ADF6240F5E Ifr-Fly (1988)(Philips)[b2] MSX +84525F386A58608622537E5D7AA67E85 Ikari Warriors (1987)(SNK)(JP) MSX JP +55DA9CF69CA2DAE6E0EDFE88183A0B99 Ikari Warriors (1987)(SNK)(JP)[a] MSX JP +892CF0833C84AB9C219A9BF85E9EF303 Ikari Warriors (1987)(SNK)(JP)[a2] MSX JP +879D073474AC581709FF5D6BB0EE01EB Indianquest (1992)(Office Pasta) MSX +D1A628E5EA0E34A2005112A8DF595248 Infini, L' (1986)(Radarsoft)(NL) MSX NL +15903D16AE59276585DD3C67961ABE7B Infini, L' (1986)(Radarsoft)(NL)[a] MSX NL +51EF8268685DDCD81AFD3D8F02C7151B Infinity (1991)(MSX Club Magazine) MSX +499BC0CE4A1C804413541F77473F1123 Infinity (1991)(MSX Club Magazine)[a] MSX +CA9579B77AE374D9E7FCD4C4D561D8B3 Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP)(Disk 1 of 3) MSX JP +28BC16E780A78AFAF591029213186861 Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP)(Disk 1 of 3)[a] MSX JP +CFB7BE80A75631E567443A683114A351 Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP)(Disk 2 of 3) MSX JP +ED04B0C869437B7E7FE2203B5CA7C410 Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP)(Disk 3 of 3) MSX JP +5F0AF2965DA706C4F4F14EA84A62D73B Intruder (1989)(Alice Soft)(JP)(Disk 1 of 2) MSX JP +444AAEC2F1C08AC00E078D2F41D11BAB Intruder (1989)(Alice Soft)(JP)(Disk 2 of 2) MSX JP +8D5CAFC5D2727B46E37D77D7F80CE8D9 Ishido - The Way of Stones (1991)(ASCII)(JP)(Disk 1 of 2) MSX JP +6F0042F18326844DA8AEDCD98A602C81 Ishido - The Way of Stones (1991)(ASCII)(JP)(Disk 2 of 2) MSX JP +DB2CD89A7B9B5B37972CBEFDF25F03B0 Ishin no Arashi. Storm of the Meiji Restoration (1989)(Koei)(JP) MSX JP +3C92AE04BA270D938DCFC60844FB52ED Isla del Tesoro, La (1986)(Idealogic)(ES)(Disk 2 of 2) MSX ES +616D670268F13744CEB37357B4D759B9 Isseki ni Kakeru Seishyuun (1988)(Log)(JP)(Disk 1 of 2) MSX JP +13971201684B6CEEBF45649B9AD26D8B Isseki ni Kakeru Seishyuun (1988)(Log)(JP)(Disk 2 of 2) MSX JP +0C309542DF75DCE4EBC9B69AA75F4461 J.B. Harold - Manhattan Requiem - Kiss of Murder (1988)(Riverhill Soft)(JP) MSX JP +E0CC8BCBB0983DFE30CA783E707CC1DF J.B. Harold 2 - Manhattan Requiem - Angels Flying in the Dark (1988)(Riverhill Soft)(JP) MSX JP +08C35EBE6838E91F43509F1FF6586ABA J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 1 of 3)[b2][mouse] MSX JP +F7FFEAF8CF0194AAD99FB25324C488AB J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 1 of 3)[mouse] MSX JP +CE212DF3713D800489BF49DB0516F837 J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 2 of 3)[a][mouse] MSX JP +37F5FD6D456049A35524EE3862134B18 J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 2 of 3)[mouse] MSX JP +C0B4FEC51B84CBE8D38941D4533B12AD J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 3 of 3)[a][mouse] MSX JP +64C40B2D4F289ED5AC7995549A2C3C72 J.B. Harold 3 - D.C. Connection (1989)(Riverhill Soft)(JP)(Disk 3 of 3)[mouse] MSX JP +96F261432836784C23A4D9A0C50CAAFE Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 1 of 2) MSX JP +547B9CCE81DEE23E6847EE33A452F844 Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 1 of 2)[a] MSX JP +2871CBF355CC65E392A6FA5FD014DC6A Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 1 of 2)[a2] MSX JP +F53CED2A6FDF8976E0F6D688DDE304AB Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 1 of 2)[b2] MSX JP +D09F8CC30F17EA3C7939DEF8D3A8A51A Jack Nicklaus Golf (1990)(Victor)(JP)(Disk 2 of 2) MSX JP +AF7359B292D2D7CB48304A57B340BB0B Jajanbo (19xx)(-) MSX +EE29C06379FF0C181552950B9325E783 Jesus (1987)(Enix)(JP)(Disk 1 of 3) MSX JP +227BA933C4B7C11DBD12BAEC2BBFE1C5 Jesus (1987)(Enix)(JP)(Disk 1 of 3)[a][save on disk] MSX JP +71168C66A71F00D90A114BD477694D10 Jesus (1987)(Enix)(JP)(Disk 1 of 3)[save on disk] MSX JP +619AA4450BEE3D4FCFE1BF594FAA0A83 Jesus (1987)(Enix)(JP)(Disk 2 of 3) MSX JP +C5A0721EAF30268C6D3B162A0D2AEA89 Jesus (1987)(Enix)(JP)(Disk 2 of 3)[a] MSX JP +A9C8FC5B3AEDB00500555D74C59487C0 Jesus (1987)(Enix)(JP)(Disk 2 of 3)[a2] MSX JP +19789E2ABC0B36D7EED1CB824DA4A097 Jesus (1987)(Enix)(JP)(Disk 3 of 3) MSX JP +14B7158AC720DF733F8D4C9521E1DBC1 Jesus (1987)(Enix)(JP)(Disk 3 of 3)[a] MSX JP +023B99260986632C73549774FA279B61 Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 1 of 2)(Opening Disk) MSX Opening Disk JP +BD107A30BA60F026EF2D173C6ABA2E6F Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 1 of 2)(Opening Disk)[a] MSX Opening Disk JP +777EAD91074FFA9A1C592384CDEEB631 Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 2 of 2)(Game Disk) MSX Game Disk JP +A74CD3423DFBC10D37BFEFFB671DA8B7 Jikuu no Hanayome. Time Lady. Heroic Fantasy (1989)(Kogado)(JP)(Disk 2 of 2)(Game Disk)[a] MSX Game Disk JP +72C9A0345F75E5A2D713D5D35CFEAE66 Jipshi (1988)(Champion Soft)(JP) MSX JP +21527107105A0468A7A612637EAD7972 Join 4 (1995)(Victor Raposo) MSX +7F3E79B67C381A865D4BD22D0D495DF6 Join 4 (1995)(Victor Raposo)[a] MSX +B449B743702D7DAE331460D921540DD5 Joker (1988)(Birdy Soft)(JP)(Disk 1 of 3) MSX JP +70A04ADFA3BEA92E54857C6B4C48CFB6 Joker (1988)(Birdy Soft)(JP)(Disk 1 of 3)[a] MSX JP +1F134CB21E1FB74E270D858F37C51620 Joker (1988)(Birdy Soft)(JP)(Disk 2 of 3) MSX JP +6DFE3B6E386CB5F3EFD8839CE5479A92 Joker (1988)(Birdy Soft)(JP)(Disk 3 of 3) MSX JP +2430BE3CF2219B167D5FE7AE9C8EA8F8 Joker II (1989)(Birdy Soft)(JP)(Disk 1 of 4) MSX JP +CFA48EB22BD6E27CEA4D1DD73321C426 Joker II (1989)(Birdy Soft)(JP)(Disk 1 of 4)[a] MSX JP +C034D40B0205D294895FCBBBA8C3F3B5 Joker II (1989)(Birdy Soft)(JP)(Disk 2 of 4) MSX JP +7F1597BD5503548136F576BF099A3CF4 Joker II (1989)(Birdy Soft)(JP)(Disk 2 of 4)[a] MSX JP +C156D86A7CB10ADEE9AD6A2AF1239212 Joker II (1989)(Birdy Soft)(JP)(Disk 3 of 4) MSX JP +D734548087521C535729F2F5D045EF28 Joker II (1989)(Birdy Soft)(JP)(Disk 3 of 4)[a] MSX JP +8825EBFF8FC9AC5AD21C500A456B665E Joker II (1989)(Birdy Soft)(JP)(Disk 4 of 4) MSX JP +BD4F2753C635D42EB90019079172EDC2 Joker II (1989)(Birdy Soft)(JP)(Disk 4 of 4)[a] MSX JP +CD335E935386DD5540581A876BE6FC98 Jotunn (1988)(Xain)(JP) MSX JP +C5E20586CA42060CE1549213398B894C Jotunn (1988)(Xain)(JP)[a] MSX JP +513CF3E49670AD09BE19A7A6029B21FD Jumper (1991)(Nagi-P Soft)(JP) MSX JP +CF616FABFAFA489F095BB61A39E20576 Kagerou Meikyuu (1990)(Heart Soft)(JP)(Disk 1 of 2) MSX JP +09308F50B641A86F84D9217C2E272406 Kagerou Meikyuu (1990)(Heart Soft)(JP)(Disk 2 of 2) MSX JP +12C26B240FCAE72AB08C910853DC0CE5 Kami no Machi (1990)(Panther Software)(JP)(Disk 1 of 5) MSX JP +67C9BECFD0E6DD7C8180C08255F9134C Kami no Machi (1990)(Panther Software)(JP)(Disk 2 of 5) MSX JP +F53A5348949951FAFAA07AE8DD62A1DE Kami no Machi (1990)(Panther Software)(JP)(Disk 2 of 5)[a] MSX JP +74B27289CB76D1C8AE58B0C76F5BCCD2 Kami no Machi (1990)(Panther Software)(JP)(Disk 3 of 5) MSX JP +A963DE49AC7782E101C312D3F316E954 Kami no Machi (1990)(Panther Software)(JP)(Disk 4 of 5) MSX JP +E77BFD3FD00B999962ABCECD63EC0907 Kami no Machi (1990)(Panther Software)(JP)(Disk 5 of 5) MSX JP +C77F78310465869289FB41E86B217CE8 Kami no Machi (1990)(Panther Software)(JP)(Disk 5 of 5)[a] MSX JP +025945C7744D2CE7AF72B1F91D79CEF5 Key, The (19xx)(-) MSX +C9D040398B3EEDC52D8E7776457B4C62 Key, The (19xx)(-)[a] MSX +56213A77C6D316F245A8CB2DC6A0A353 Key, The (19xx)(Drack Soft) MSX +C5BF3C2321FE30334C4239B6958EEA3F Kimagure. Orange Road (1988)(Micro Cabin)(JP) MSX JP +77C0F3CB6162455BEF36BE90AED070E7 Kimagure. Orange Road (1988)(Micro Cabin)(JP)[a] MSX JP +DB5298318C0C865969B4A14597B76360 Kind Gal's II (1988)(Hard)(JP)(Disk 1 of 2) MSX JP +1E7F221CD4E7E433B8C6253DC38BFECA Kind Gal's II (1988)(Hard)(JP)(Disk 1 of 2)[a] MSX JP +DB129182BC1F535672F0DE95FAE0F113 Kind Gal's II (1988)(Hard)(JP)(Disk 1 of 2)[a2] MSX JP +E2AA7475635E7D2B1BD1D1EB51D26A98 Kind Gal's II (1988)(Hard)(JP)(Disk 2 of 2) MSX JP +53DBE7928ECBE982C80B845FA275760B Kind Gal's II (1988)(Hard)(JP)(Disk 2 of 2)[a] MSX JP +279AC621BA5B06A2F9853C71F6F796F1 Kind Gal's II (1988)(Hard)(JP)(Disk 2 of 2)[a2] MSX JP +5E40F2E40A900E696F977C63C7E3B4EF Kinetic Connection (1986)(Sony)(JP) MSX JP +B443BD967A3E6F3474F7780A678DFF4E King's Valley II - The Seal of El Giza (1988)(Konami)(JP) MSX JP +E626C6923BC78FC8700E0E39070F9483 King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[a] MSX JP +90FD92F7815E35694585F4735FE861B9 Kioku. The Lost Memories - The Strongest Fandam's RPG (19xx)(-)(JP) MSX JP +941A32466CE59A357190B8E8E2DCB5C8 Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 1 of 3) MSX JP +DA62F9ED4D103E0262B1C6B200967BA4 Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 1 of 3)[a] MSX JP +580F12384BDE527453271001535D654A Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 2 of 3) MSX JP +84BBA0D2F9526C56105B243B1EDA8EE7 Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 2 of 3)[a] MSX JP +B7EF97A2CC2433F1E3EABB4C17A63925 Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 3 of 3) MSX JP +38A8BBF66665332D3085283566849698 Kohakuiro no Yuigon. Amber's Will (1988)(Riverhill Soft)(JP)(Disk 3 of 3)[a] MSX JP +A57857F41D4D4733C77B37A7E8189722 Koji Tanigawa's Shougi Shinan II (1988)(Pony Canyon)(JP) MSX JP +6B94706EDE3B90ACEFB853277C6A0531 Koji Tanigawa's Shougi Shinan II (1988)(Pony Canyon)(JP)[a] MSX JP +F2DFF9720A539CD097850DD1BE728F5D Koroshi no Dress 2. Dress of Murder 2 (1990)(Fairytale)(JP) MSX JP +92387724D2FCE596B10E682CF36FBCD6 Kruiswoord Generator (1986)(Radarsoft)(NL) MSX NL +FFD0CDF3903AE7A5EA35412CBD706D23 Ku Gyoku Den. Legendly Nine Gems (1987)(Tecno Soft)(JP) MSX JP +B65E0258E4867CCAAC68A04BF89B2C11 Ku Gyoku Den. Legendly Nine Gems (1987)(Tecno Soft)(JP)[a] MSX JP +9B9A898C19811A16BB97CE83011FA3CB Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 1 of 5)[a][mouse] MSX JP +59CF1950640B5816F5CDDCC61541EC1C Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 1 of 5)[mouse] MSX JP +C47938E57058310CDE8895AA50388F6A Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 2 of 5)[a][mouse] MSX JP +B0513D6C7D4388BF1F62732F095B0836 Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 2 of 5)[mouse] MSX JP +CEA1358E3AD79A319B92C22FC675113D Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 3 of 5)[a][mouse] MSX JP +BB52A827E660D64FC4EC293A29E8D86E Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 3 of 5)[a2][mouse] MSX JP +284305A3EABF4478D8A58EB3125E0957 Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 3 of 5)[mouse] MSX JP +3ECB9E0759F7F31D1117DAF0B06558EF Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 4 of 5)[a][mouse] MSX JP +3092DC60D05D84D43B00C1D80BEC642E Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 4 of 5)[a2][mouse] MSX JP +F4C4DED8272C34AFB50285A001BF8B10 Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 4 of 5)[mouse] MSX JP +4D8347E4FE6B50645D5A9D62EC0A21AA Kubikiri Yakata - Sachan Ghyan (1989)(Bit2)(JP)(Disk 5 of 5)[mouse] MSX JP +2C549F3BF1CDBBF6138D2B4DD05D376E Kudokikata Oshiemasu (1988)(Hard)(JP) MSX JP +C2304E80923D1592D393EFFFD6E4BCD4 Kudokikata Oshiemasu (1988)(Hard)(JP)[a] MSX JP +FB1C797A41315A303087CE035B355503 Kujaku Oh (1988)(Pony Canyon)(JP) MSX JP +3258756DE33B9681B1226B58BA8FCE14 L. Elle (1992)(Elf)(JP)(Disk 1 of 7) MSX JP +14F5448BB76447FF5FC6B3517BDB4DEE L. Elle (1992)(Elf)(JP)(Disk 1 of 7)[a] MSX JP +8CBD97AA50E6B05D50C92DF0D54993CF L. Elle (1992)(Elf)(JP)(Disk 2 of 7) MSX JP +F731F70222EFA0C78A6FDF7CEFDA4247 L. Elle (1992)(Elf)(JP)(Disk 3 of 7) MSX JP +62D756D253CCDAC3162DE42AFD3DCC23 L. Elle (1992)(Elf)(JP)(Disk 3 of 7)[a] MSX JP +CADF63D357F9FC0AA84A7476F06083F5 L. Elle (1992)(Elf)(JP)(Disk 4 of 7) MSX JP +37EE7A22B3ED2FD00E946EC162A8362B L. Elle (1992)(Elf)(JP)(Disk 4 of 7)[a] MSX JP +A32D5F30916FC50315F6C46D6E8A62A7 L. Elle (1992)(Elf)(JP)(Disk 5 of 7) MSX JP +C1D8099D7F6E47E22A38630F4B2A2528 L. Elle (1992)(Elf)(JP)(Disk 6 of 7) MSX JP +06CA3A208986AB8B46FD7FDF166AF29F L. Elle (1992)(Elf)(JP)(Disk 6 of 7)[a] MSX JP +144244469254E8C761BDFBF64B609051 L. Elle (1992)(Elf)(JP)(Disk 7 of 7) MSX JP +F5A6F1DCC41DD5C82D05F880873AAAB3 L. Elle (1992)(Elf)(JP)(Disk 7 of 7)[a] MSX JP +8FB6D40C88056466C6D22B8BD91DB7DC Labyrinth, The (1987)(Pack In Video)(JP)[a][needs MegaRAM 256k] MSX JP +E43AA6006D2958798F68170FE6377142 Labyrinth, The (1987)(Pack In Video)(JP)[needs MegaRAM 256k] MSX JP +CCFCE8FD84CC13DE8439CC6189E72326 Laplace no Ma (1989)(Humming Bird Soft)(JP) MSX JP +9A24CE20FE14A041859419FDB0977091 Laplace's Evil Spirit (1989)(Humming Bird Soft)(JP) MSX JP +5E1BBB97D7A75D09D672BF0A750F173A Last Armageddon (1988)(Brain Grey)(JP)(Disk 1 of 5) MSX JP +659825C3CE5BB3DF216B95C0A5520FF0 Last Armageddon (1988)(Brain Grey)(JP)(Disk 2 of 5) MSX JP +1D70DBC6FC80DE6C78CDB61C822BDB6A Last Armageddon (1988)(Brain Grey)(JP)(Disk 2 of 5)[a] MSX JP +20291EAC5C70D5B9B0A576B08184AF8B Last Armageddon (1988)(Brain Grey)(JP)(Disk 2 of 5)[a2] MSX JP +F01250C91B604532607939B04CEA02F2 Last Armageddon (1988)(Brain Grey)(JP)(Disk 2 of 5)[a3] MSX JP +B1482A2E407CB3CBAD8A2933459BA4AF Last Armageddon (1988)(Brain Grey)(JP)(Disk 3 of 5) MSX JP +AB8E2090F302251DCBD32BF94499706F Last Armageddon (1988)(Brain Grey)(JP)(Disk 3 of 5)[a] MSX JP +DFDC5EA6CBAE266098939AABE93C0B65 Last Armageddon (1988)(Brain Grey)(JP)(Disk 3 of 5)[a2] MSX JP +87E72EB407E843A6ED053486897E67A7 Last Armageddon (1988)(Brain Grey)(JP)(Disk 4 of 5) MSX JP +E46B03D9FE2574B69565ED8885169431 Last Armageddon (1988)(Brain Grey)(JP)(Disk 4 of 5)[a] MSX JP +0B3AB871FB950DCCCC047134687C3C25 Last Armageddon (1988)(Brain Grey)(JP)(Disk 4 of 5)[a2] MSX JP +428CB203B884B086FB518B701F643ED3 Last Armageddon (1988)(Brain Grey)(JP)(Disk 5 of 5) MSX JP +1B13EABCF0C9F2C273E954D69A130410 Last Armageddon (1988)(Brain Grey)(JP)(Disk 5 of 5)[a] MSX JP +7A50DB39A99D2415FE4608250A3C3F57 Last Armageddon (1988)(Brain Grey)(JP)(Disk 5 of 5)[a2] MSX JP +BDEDA888CF054323079F0F9A147C6E46 Last Darumadedon (1989)(Sum Soft)(JP) MSX JP +7A788AEDCC08A444D50E7DA0AB6EBC1D Last Darumadedon (1989)(Sum Soft)(JP)[a] MSX JP +592BAD2C125B53C194E5DBC894AF74B0 Last Mission, The (1987)(Opera Soft)(ES) MSX ES +36F86CC140A9DC2FA321C4A8C20BB109 Last Mission, The (1987)(Opera Soft)(ES)[a] MSX ES +2C5A1AFAB1C49972BC093BC85E0E851B La'Valeur (1989)(Kogado)(JP)(Disk 1 of 2) MSX JP +8FD3903FE4BACE128F3C5C1A7EDD0CA7 La'Valeur (1989)(Kogado)(JP)(Disk 1 of 2)[a] MSX JP +824B10B09C221789E72172A5E6EA2A83 La'Valeur (1989)(Kogado)(JP)(Disk 2 of 2) MSX JP +CBDAD82F7DBE287ABCEF4B41A11190C3 La'Valeur (1989)(Kogado)(JP)(Disk 2 of 2)[a] MSX JP +A2D992655B59F80EFC362766AF70ECA9 Laydock (1986)(T&E Soft)(JP) MSX JP +9B51AF5179994AE7E58F2AE175F7EDD1 Laydock (1986)(T&E Soft)(JP)[a] MSX JP +59614B545A0526345E92EAC8B4E2B528 Laydock (1986)(T&E Soft)(JP)[a2] MSX JP +01D046F102F03D5286B107A20A12D9F9 Laydock (1986)(T&E Soft)(JP)[a3] MSX JP +3C068B1CEF06710F53FC1BCC45EF19A1 Leather Skirts (1987)(Methodic Solutions)(NL) MSX NL +831F0720279E630CD6BFBF8C3E7E0652 Lemmings (1997)(N.I.) MSX +40F3A0B2DFEBA93B46090A78E651DD3E Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 1 of 4) MSX JP +AB63194477A7E5545571B74EBC115693 Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 1 of 4)[a] MSX JP +1F5863F642E61285C9FC79ABE938CA06 Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 1 of 4)[a2] MSX JP +09F26767E7DE17027AA3E45666A70384 Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 2 of 4) MSX JP +0E74B38BEA1EA8010AE8C1EFA8DBBAFE Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 2 of 4)[a] MSX JP +A8F3ED948FCAD63F3F58F3388DA5A072 Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 3 of 4) MSX JP +9EFACC454D6AFA193F358FA5F9358C00 Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 3 of 4)[a] MSX JP +485C95FED22E0ECA3018DC8FB12BB54A Lenam - Sword of Legend (1989)(Hertz)(JP)(Disk 4 of 4) MSX JP +8B0F23FD9BCA493B69DEACE50E4EDE91 Leprechaun (1995)(Triple Soft)(NL) MSX NL +A1CB44B47A72877822CCAB8F5034725F Lilo - La Conquista de la Fama (1993)(Kai Magazine)(ES)(Disk 1 of 2) MSX ES +A39C766044BCD8AEFC4335C6D0796CD4 Lilo - La Conquista de la Fama (1993)(Kai Magazine)(ES)(Disk 2 of 2) MSX ES +7CFFB77C9BA093B8D3AD0C7FA49C79BB Lilo - La Conquista de la Fama (1993)(Kai Magazine)(ES)[2 Disks] MSX ES +311C50519D79DA4E797454471E341013 Linebuster (1991)(-)(NL) MSX NL +020019F6971833AB06C36FE1F2CF04C5 Lingo (1992)(NewVision Benelux)(NL) MSX NL +A68C655BBA75202897F92B6C7B7F8678 Lingo (1992)(NewVision Benelux)(NL)[a] MSX NL +9FA022B85FD2CEDE5A6D519EC7F752BF Lingo (1992)(NewVision Benelux)(NL)[a2] MSX NL +857C678C9D47535BEB925C6BCDE9402D Lipstick Adventure (1989)(Fairytale)(JP)(Disk 1 of 3) MSX JP +2E7FDA9DB7A363A1C206CAF43A2072DB Lipstick Adventure (1989)(Fairytale)(JP)(Disk 2 of 3) MSX JP +62718A2820344508360B225A9D92619A Lipstick Adventure (1989)(Fairytale)(JP)(Disk 3 of 3) MSX JP +3E38AF1E2B098C2DDF47CCEB558994A4 Lipstick Adventure 2 (1990)(Fairytale)(JP)(Disk 1 of 3) MSX JP +2965E3CFFDFC465F742623B004822253 Lipstick Adventure 2 (1990)(Fairytale)(JP)(Disk 2 of 3) MSX JP +82E8F2A70C3E5E7C3E8D8A1DD8DADE1B Lipstick Adventure 2 (1990)(Fairytale)(JP)(Disk 3 of 3) MSX JP +017FB7B5C0BD7889235FD7EFB68ACCD8 Litkeiba (19xx)(M2 Club)(JP) MSX JP +62310C5AE3A6F16865E7C470BCE1D40C Little Vampire (1988)(Champion Soft)(JP)(Disk 1 of 3) MSX JP +E71B83359E0E27B6D5E32CFADD9E03BE Little Vampire (1988)(Champion Soft)(JP)(Disk 2 of 3) MSX JP +9284F916600678FBB16EA5EA9A17FA32 Little Vampire (1988)(Champion Soft)(JP)(Disk 3 of 3) MSX JP +78EA628214F325B0E3029889EAB0DA1D Livingstone Supongo (1986)(Opera Soft)(ES) MSX ES +E1F3B47B1DE67AA2FDF328723C20A7C0 Logic Blob (1996)(Eternal Interactive) MSX +AC87FCE88FF698AB370631CCE4413DC4 Logic Blob (1996)(Eternal Interactive)[a] MSX +697DD007D31A3429F0C3E3CABCFFD357 Lola (1989)(BCN) MSX +C0E18F7A99E124E35797080559FFD3E9 Lola (1989)(BCN)[a] MSX +3FDBB761582E31B9E381D2DD8D325F7E Love Chaser (1987)(Champion Soft)(JP)(Disk 1 of 2) MSX JP +4E41832149C63B1503D9FD42852DB9C8 Love Chaser (1987)(Champion Soft)(JP)(Disk 1 of 2)[a] MSX JP +A12668FFEB65A3D91F9B72F194D28D59 Love Chaser (1987)(Champion Soft)(JP)(Disk 1 of 2)[a2] MSX JP +29D6E9E9E43B76CCAC4C30D0DB5A63BA Love Chaser (1987)(Champion Soft)(JP)(Disk 2 of 2) MSX JP +0ABA7E6BA737BBF0E70E6DA2028EEB1C Love Chaser (1987)(Champion Soft)(JP)(Disk 2 of 2)[a] MSX JP +04A3FB61FC36DB296949170778C59DB1 Lulba (1988)(Compile)(JP) MSX JP +4D00EC4A662B483E7F64AA1293897591 Lulba 2 (1988)(Compile)(JP) MSX JP +C7BE81D573C8DEFE5D13F2647D02491F Lulba 3 (1989)(Compile)(JP) MSX JP +BA517CA67847DAACC1AAEFBBEE87CB56 Lulba 3 (1989)(Compile)(JP)[a] MSX JP +AD91840CEC4C133B02D6A12183D7BF5C M.U.L.E. (1988)(BPS)(JP) MSX JP +F1711963050167F1355D21E0C526EA0B Mad Rider (1987)(Carry Lab)(JP) MSX JP +6AB19C88ABE30B4A72AB81F4DBBC92C9 Mad Rider (1987)(Carry Lab)(JP)[a] MSX JP +D85EF67D664B848468317C5181759319 Madonna Yamaku. Tempation of the Madonna (1988)(Dot Plan)(JP) MSX JP +CA9150B3E187C745D23DC63D7D313896 Madonna Yamaku. Tempation of the Madonna (1988)(Dot Plan)(JP)[a] MSX JP +C50CD7A6FEB2C79ABB9322B4443971ED Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 1 of 5) MSX JP +3B4F33753F69989ED5780CFB0B2A3F27 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 1 of 5)[a] MSX JP +10BEA659B2EA9DF2EC0C640073BC56C3 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 2 of 5) MSX JP +AA967F22EF9F3B1FBA05750450C7B2DA Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 2 of 5)[a] MSX JP +A02E25B0DF087FB440DE7A1AE5F632EA Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 2 of 5)[a2] MSX JP +D05AF0DED5555A111B0A765E3848B5C5 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 2 of 5)[a3] MSX JP +E1E35E8A94CF75B4F36B47471551D8B0 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 2 of 5)[a4] MSX JP +992D386A89D528F94AEFFEFBF975947B Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 3 of 5) MSX JP +C3B48DAA1A913D774A6390430B3BEA60 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 3 of 5)[a] MSX JP +E6CD40667A7D584A26E7440752BD00CD Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 4 of 5)(Utility Disk) MSX Utility Disk JP +1524E0394A88A08180E43F24301093A2 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 4 of 5)(Utility Disk)[a] MSX Utility Disk JP +4B12CCAAA3AE48125243AED99DD537F5 Madou Monogatari 1-2-3 (1990)(Compile)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +C0D1FCB50223197F3A119C55F702489B Madoushi Lulba (1990)(Compile)(JP) MSX JP +96E4871E32F9BD11ED3A47CD5A14DE44 Madoushi Lulba (1990)(Compile)(JP)[a] MSX JP +2ACA678C1D9B0128B799F8EA729254B2 Magnar (1992)(Parallax)(NL)(Disk 1 of 3) MSX NL +509897F9C43DD5C172436849EFE15DAE Magnar (1992)(Parallax)(NL)(Disk 1 of 3)[a] MSX NL +84DDB226041A83667A8F9AD75D8FC760 Magnar (1992)(Parallax)(NL)(Disk 2 of 3) MSX NL +A18D9075503886558E128300F5E4887E Magnar (1992)(Parallax)(NL)(Disk 2 of 3)[a] MSX NL +78E656880ED38AB893F8934FB7153068 Magnar (1992)(Parallax)(NL)(Disk 3 of 3) MSX NL +02584B3FF534AC44B0CEB00D5CBE4386 Magnar (1992)(Parallax)(NL)(Disk 3 of 3)[a] MSX NL +9DEB999BB6D87E8D35951966C13A779D Mago de Oz, El (1986)(Idealogic)(ES)(Disk 1 of 2) MSX ES +A8AC336AE26BF31BEF21D2CAE75BD1A2 Mago de Oz, El (1986)(Idealogic)(ES)(Disk 2 of 2) MSX ES +DBAD688AB932F25159BE10B2D77A2D73 Mago de Oz, El (1986)(Idealogic)(ES)(Disk 2 of 2)[a] MSX ES +325786EB36EB5CE1023F2894C4BCBBB4 Mahjong Kyo Special II (19xx)(Micronet)(JP)(Disk 1 of 2) MSX JP +FFF690C264DE3C9230C660D8D0C2A1FF Mahjong Kyo Special II (19xx)(Micronet)(JP)(Disk 2 of 2) MSX JP +8AE08EB423C94C4BAD8CB959E569FA39 Mahjong Shikaku (1990)(Nihon Bussan)(JP)(Disk 1 of 3) MSX JP +6D11D26B3E1711EB19AC3CAA9D599AEB Mahjong Shikaku (1990)(Nihon Bussan)(JP)(Disk 1 of 3)[a] MSX JP +D7A85697288B67A9421238064D811558 Mahjong Shikaku (1990)(Nihon Bussan)(JP)(Disk 2 of 3) MSX JP +A369339BA974E2BD1A744397B7CEFF87 Mahjong Shikaku (1990)(Nihon Bussan)(JP)(Disk 3 of 3) MSX JP +BFADDAB1B3F92E7D348E1EF69FB43B6A Maison Ikkoku - Kanketsuhen (1988)(Micro Cabin)(JP) MSX JP +2E551D9F0811D746E1A0397E5089013B Maison Ikkoku - Kanketsuhen (1988)(Micro Cabin)(JP)[a] MSX JP +D1EECBA48F155DBB64AA58FDA2184D20 Maison Ikkoku - Kanketsuhen (1988)(Micro Cabin)(JP)[a2] MSX JP +B52C963DDFD1E21B2F7844E0D0474ABF Maison Ikkoku (1987)(Micro Cabin)(JP) MSX JP +3FB7E441AA696B9BECBFA2E3ACD28F5F Maison Ikkoku (1987)(Micro Cabin)(JP)[a] MSX JP +371C0A33E2D5FFA2E701D5A70844694D Majin Kyu (1988)(Xain)(JP) MSX JP +F2FA793F755BACB9F5F3291C7D6FFDF0 Majin Kyu (1988)(Xain)(JP)[a] MSX JP +83D44321CDB7C817A9B6A8379321116A Makai Revenge (1987)(Software Studio WING)(JP)(Disk 1 of 2) MSX JP +C1B05986ED18EBF2CDCD07D1468D634B Makai Revenge (1987)(Software Studio WING)(JP)(Disk 2 of 2) MSX JP +79FBE416714810B9A44F5A1B9BCEA5B1 Makaijima - Higemaru (1987)(Capcom)(JP) MSX JP +42D2DE8B8B0355E27C44A0FA7284035F Makaijima - Higemaru (1987)(Capcom)(JP)[a] MSX JP +9430F07A4C1709CD85664100160F18A8 Makyuu Den (1989)(Software Studio WING)(JP) MSX JP +0405C157F547C784951384B7B57C56C8 Malaya no Hihou (1989)(Pony Canyon)(JP) MSX JP +A308B7C6ACB9A6E4FF16D3776FCD7A19 Malaya no Hihou (1989)(Pony Canyon)(JP)[a] MSX JP +1AB28190FAA03C1F916350AB86EC52DA Mansion de Pinosverdes, La (1991)(MA Software)(ES) MSX ES +2C2BEF50780C0EA03F1BE54AE7D38DAD Marble World (1989)(Peter Jess) MSX +3A64372D96CFC499ECFA8209139C26B8 Marble World (1989)(Peter Jess)[a] MSX +5812EE5AAD13A9906747FA22BB692FC8 Marble World (1989)(Peter Jess)[a2] MSX +F03EB045766954F4B9071321BB774247 Marble World (1989)(Peter Jess)[a3] MSX +C290311FF85B8E28735F54AF90EB6C77 Marchen (1991)(Yashushi) MSX +257E9AA246C8814EE93D6C86DDCDDD65 Marchen (1991)(Yashushi)[a] MSX +01750BA5A85A73282314BE7A5AAACCA1 Marchen Veil (1986)(System Sacom)(JP) MSX JP +33D1EF7966FAC24D5F2654B4B6505EDE Marchen Veil (1986)(System Sacom)(JP)[a] MSX JP +661DC4ADE896775E0768CEE93BDCEACD Marchen Veil (1986)(System Sacom)(JP)[a2] MSX JP +F76C6A114E333859E8A67F6127622AB5 Mask Mania Age Battle (1994)(MSX-FAN)(JP) MSX JP +88B9AC0E679D9419539D1296EC43F014 Master of Monsters (1988)(System Soft)(JP)(Disk 1 of 2) MSX JP +4C3311985F3C6D122B005AA27105DFEC Master of Monsters (1988)(System Soft)(JP)(Disk 1 of 2)[a] MSX JP +874E3D927D58EC8E68740E2671E71487 Master of Monsters (1988)(System Soft)(JP)(Disk 2 of 2) MSX JP +3A480F6462824F9EC4E1D59BF0A3A7B2 Master of Monsters (1988)(System Soft)(JP)(Disk 2 of 2)[a] MSX JP +FBE6B1453D1B1C30E543874AD1EE13C4 Master of Monsters (1988)(System Soft)(JP)(Disk 2 of 2)[a2] MSX JP +2B1B7783A6939275A5851136A9BA25AD Match Maniac (1995)(Sunrise)(NL) MSX NL +62F981D30F9F03EEDBFD1751ED75153C Matrix v1.0 (1993)(BCN) MSX +A1D3E260A4BB2B246A3D75B462E00F67 Matrix v1.0 (1993)(BCN)[a] MSX +57695CA88A18CD4E9B057C3B3E339150 Mattix (19xx)(Pack In Video)(JP) MSX JP +B99E15468CD35C4B46577A2423BBCA79 Megaz Monkey Do (1989)(Compile)(JP) MSX JP +112CA5139E882E81AC4B1D1A2874BCEC Megaz Monkey Do (1989)(Compile)(JP)[a] MSX JP +D3F575C834A7CE91486C86FBA30F197B Membership Golf (1989)(Sony)(JP)(Disk 1 of 2) MSX JP +7D877BB0D741F57ECCEFAA7EF505A29D Membership Golf (1989)(Sony)(JP)(Disk 1 of 2)[a] MSX JP +2C61F243FC10B521478FCBCF97595DA9 Membership Golf (1989)(Sony)(JP)(Disk 2 of 2) MSX JP +B93F3A8440B734FAFEC9E0F6105AAC30 Membership Golf (1989)(Sony)(JP)(Disk 2 of 2)[a] MSX JP +28CBA6A9E79AB4FE0031049A2E289A64 Metal Gear (1987)(Konami)(JP) MSX JP +C4E3DC4979CF8090F70A0C9DF7479B2B Metal Gear (1987)(Konami)(JP)[a] MSX JP +E19672160E084DCDE93634FB4CEB23E7 Metal Gear (1987)(Konami)(JP)[a2] MSX JP +DB5DD39CEC30BDA79E36CEA8068DF153 Metal Gear (1987)(Konami)(JP)[save on disk] MSX JP +4BA5F714C30F8F585F53BAF302B17119 Metal Gear 2 - Solid Snake v1.1 (1990)(Konami)(ES)[SCC] MSX ES +E87B8D771DD8BA7BCEC5D68B5640818A Metal Gear 2 - Solid Snake v1.1 (1990)(Konami)(JP)[SCC] MSX JP +F95BEFEB1AF160D8DDABFD39DC02800B Metal Gear 2 - Solid Snake v2.1 (1990)(Konami)(JP)[a][SCC] MSX JP +67C4442A90F941DF8275EFA3BF814015 Metal Gear 2 - Solid Snake v2.1 (1990)(Konami)(JP)[SCC] MSX JP +AF9C3DBAE8496C84E0C822FE19FA2793 Meteorite Kiss (2000)(Suzumikaki's Factory) MSX +617506E7FF2BA48A8402E548C5E32A4F Meteorite Kiss (2000)(Suzumizaki's Factory)[a] MSX +D0582A61E301F78FB5C24D56F476B89D Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 1 of 6) MSX JP +6181198AD16A150E26CE717CBC9007C0 Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 2 of 6) MSX JP +0873FEFE83772EAFD739A1CE779E7431 Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 3 of 6) MSX JP +0AA258D0916146EA3833C6A9E17330C8 Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 4 of 6) MSX JP +5AB1DFF1D7F09FC482839688C49245A6 Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 5 of 6) MSX JP +E7C642372A38845CC039DD88C1283060 Middogarutsu. Mid-Garts Dual Side (1989)(Wolfteam)(JP)(Disk 6 of 6) MSX JP +AE47B86C77BC6D78BDD49E32FE3579AA Middogarutsu. Mid-Garts Side A (1989)(Wolfteam)(JP)(Disk 1 of 3) MSX JP +E48D9072DF9EEB906E26C453F249D91A Middogarutsu. Mid-Garts Side A (1989)(Wolfteam)(JP)(Disk 1 of 3)[a] MSX JP +F0D0575116A2A6E48F8304EAA0613B5C Middogarutsu. Mid-Garts Side A (1989)(Wolfteam)(JP)(Disk 2 of 3) MSX JP +0873FEFE83772EAFD739A1CE779E7431 Middogarutsu. Mid-Garts Side A (1989)(Wolfteam)(JP)(Disk 3 of 3) MSX JP +9271B1DBF43275E7CC60BF56A78F5524 Middogarutsu. Mid-Garts Side B (1989)(Wolfteam)(JP)(Disk 1 of 3) MSX JP +A0B4E2732B938B288E862CEE3B42EE82 Middogarutsu. Mid-Garts Side B (1989)(Wolfteam)(JP)(Disk 1 of 3)[a] MSX JP +595AF78A0D7EB6B265EF5A366191195B Middogarutsu. Mid-Garts Side B (1989)(Wolfteam)(JP)(Disk 2 of 3) MSX JP +F5CFF95E4FCFB4B6D2473A1D2405CF5A Middogarutsu. Mid-Garts Side B (1989)(Wolfteam)(JP)(Disk 2 of 3)[a] MSX JP +E7C642372A38845CC039DD88C1283060 Middogarutsu. Mid-Garts Side B (1989)(Wolfteam)(JP)(Disk 3 of 3) MSX JP +4043323D5F1A6C0763FD0B70B9EA4BF7 Might and Magic II - Gates to Another World (1989)(Starcraft)(JP)(Disk 1 of 2) MSX JP +8D3B8F2580CE21CA0CEBBD5A6CE41BD3 Might and Magic II - Gates to Another World (1989)(Starcraft)(JP)(Disk 1 of 2)[a] MSX JP +5918E0EB9A5610A6AA9645C7C67EB285 Might and Magic II - Gates to Another World (1989)(Starcraft)(JP)(Disk 2 of 2) MSX JP +ED1B487DB3ED77650AE322A4B1A3387A Might and Magic II - Gates to Another World (1989)(Starcraft)(JP)(Disk 2 of 2)[a] MSX JP +24D734A18CF3C001A099CA484B7AD26A Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 1 of 4) MSX JP +AB34E0277C6C888542223F5897BB4E37 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 1 of 4)[a] MSX JP +DE9E9593F34A17C5D59C696BC3CF1F8A Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 1 of 4)[a2] MSX JP +BC6BF0A4E79F631F11F6754AC6EAA875 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 1 of 4)[a3] MSX JP +D8A203EB641CB6CB83A95DD6B053C652 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 2 of 4) MSX JP +1542162B8118CB8C54023B92E762DA73 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 2 of 4)[a] MSX JP +50E36FB13377D915B360F996B07C1E6D Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 2 of 4)[a2] MSX JP +6F4C0D03E68AA691A24475C936F0B7AC Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 2 of 4)[a3] MSX JP +1D3BC8CE86A4464DB35B9A9D0CE58667 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 3 of 4) MSX JP +E05A089F6B94DA3305BD9B88EB370947 Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 4 of 4) MSX JP +522F332960040A224AD7738B336F0C1B Mighty Battle Skin Panic (1993)(Gainax)(JP)(Disk 4 of 4)[a] MSX JP +134BE89DB74D738DA0FC6208B289D1E8 Milkymate (1991)(Atsic)(JP) MSX JP +EDF98E9E91466668220CFEF58CEA3573 Mine-Sveiper (1993)(Norhtwind)(NO) MSX NO +5EE7D4AE76A1344AB190087C9B994C8B Mine-Sveiper (1993)(Norhtwind)(NO)[a] MSX NO +671437366C0FDA0213E1630DA089741C Mirai 2. Future 2 (1987)(Xain)(JP) MSX JP +A211C2D8A0F5E1D2ADE8CE67B890B319 Mirai 2. Future 2 (1987)(Xain)(JP)[a] MSX JP +D9F3BCD779B24E43DB75F1D9263B52F9 Mission A (1989)(Lamant) MSX +9806B8C6046F66E76A8C22C9D6562B4E Mission A (1989)(Lamant)[a] MSX +12E817623D45C6EB7527124F2D095F9E Mobile Suit Field Gundam (1988)(Family Soft)(JP) MSX JP +AEFA8FB69C3DD501D93DA7C4D44DEE6A Mon Mon Monster (1989)(Hot-B)(JP) MSX JP +674EE167B970D82D81E1411B9394FF45 Mon Mon Monster (1989)(Hot-B)(JP)[a] MSX JP +F5B0911E0C9F271207A8C7548CFD9286 Moon Landing (1988)(-) MSX +79CB7B277B74A8ED85FFCCBBC421653A Moon Landing (1988)(-)[a] MSX +8937CB47066A91F416F5919B1DD0858F Mouse Games (1988)(Compile)(JP)[a][mouse] MSX JP +529B0A94BCB435B65A17EF2B701B8101 Mouse Games (1988)(Compile)(JP)[mouse] MSX JP +91E20361762906343B6FA045F86D2585 Moving Squares (1989)(Eurosoft)(NL) MSX NL +B1E86943162EDF72D4299DB186037DB1 Moving Squares (1989)(Eurosoft)(NL)[a] MSX NL +148E6D07664AB9CFFB19615C517DCCBC MSX Hot Numbers (2002)(Paxanga Soft)(Disk 1 of 2) MSX +BC7FCF7C1AC97F178B87BF2439F954E1 MSX Hot Numbers (2002)(Paxanga Soft)(Disk 1 of 2)[a] MSX +26054D9D8A6FA05C24B5662830A246D3 MSX Hot Numbers (2002)(Paxanga Soft)(Disk 2 of 2) MSX +6959E7785AA2A06B78D62F77F767D9B7 MSX Hot Numbers (2002)(Paxanga Soft)(Disk 2 of 2)[a] MSX +EB542B93BD968932D0995278DFFFC9E2 MSX Train (1993)(Family Soft)(JP)(Disk 1 of 3) MSX JP +60D8563CD9967F7EE677F6129CF65950 MSX Train (1993)(Family Soft)(JP)(Disk 2 of 3) MSX JP +716AE50BA1B7D4570A6F3E023120B5DB MSX Train (1993)(Family Soft)(JP)(Disk 3 of 3) MSX JP +9E659B4BDF19AD4E26CB1CDFF80103A6 MSX Wars 5 (19xx)(Syntax) MSX +8C62BF6A20C60BEDC140D20DBE88455A Navitune (1989)(Kogado)(JP)(Disk 1 of 2) MSX JP +916BB1D041601B8BBB9F1319E42BE0F4 Navitune (1989)(Kogado)(JP)(Disk 2 of 2) MSX JP +BF9E050118E5289065671F1C54D43A63 Nekketsu Judo (1989)(Pony Canyon)(JP) MSX JP +B4DCA06D58082FBC0FBBEE27DA9852F5 Nekketsu Judo (1989)(Pony Canyon)(JP)[a] MSX JP +14CE03DC503EEAB7E80444C5DC9021DC Nekketsu Judo (1989)(Pony Canyon)(JP)[a2] MSX JP +7A33CF103DEB92C017C3EB4BDED943C4 Nekketsu Judo (1989)(Pony Canyon)(JP)[a3] MSX JP +73F86E8C23F40C8D4F03EAE0CFEB72A7 New Adam & Eve (1985)(Sony)(JP) MSX JP +D9EBCFB417477656436AEF57A1DB9541 Nichiyoubi Uchuujin. Alien Sunday (1986)(Software Studio WING)(JP)(Disk 1 of 2) MSX JP +7357A63C38EBB0CB5B8C61D089C3F4DB Nichiyoubi Uchuujin. Alien Sunday (1986)(Software Studio WING)(JP)(Disk 2 of 2) MSX JP +6876F6CF494FB2443AAB15E70D9AF051 Nihongo Kotora Striptease. Conquest (1988)(Nihon Bussan)(JP) MSX JP +70FA15BCAAE4FD7349748F14410B1710 Nihongo Kotora Striptease. Conquest (1988)(Nihon Bussan)(JP)[a] MSX JP +D2DF3901860E05195A1760FD46C32639 Nike (1991)(Cocktail Soft)(JP)(Disk 1 of 5) MSX JP +699C9991FDD785CB44B48F9587B17D56 Nike (1991)(Cocktail Soft)(JP)(Disk 2 of 5) MSX JP +EC808B13B077303DE522128A59A07A17 Nike (1991)(Cocktail Soft)(JP)(Disk 3 of 5) MSX JP +48DE26D6FC54E9FFD5CB4A57504FEF2D Nike (1991)(Cocktail Soft)(JP)(Disk 4 of 5) MSX JP +46A65D9356CABB73D4DFCAAF1A65CCF7 Nike (1991)(Cocktail Soft)(JP)(Disk 5 of 5) MSX JP +6949059D43378F8976390AFA3F16798B Niko2. Niko Niko (1991)(Wolfteam)(JP) MSX JP +D219F4C25534FFEBA592D8ACE2BFC3D9 Niko2. Niko Niko (1991)(Wolfteam)(JP)[a] MSX JP +3B916429B0D37CC2161E487244E07A5A Ninja (1988)(Bothtec)(JP) MSX JP +AF423016CC6F8CD8202BC744D8D7D7B4 Ninja Kun - Ashura no Sho (1987)(HAL Laboratory)(JP) MSX JP +6D71BA22BF0D01D7B306930C6E63E217 Ninja Kun - Ashura no Sho (1987)(HAL Laboratory)(JP)[a] MSX JP +AB132D3AE9909D5589A2AB304A3FEB9E Ninja Kun - Ashura no Sho (1987)(HAL Laboratory)(JP)[a2] MSX JP +4C0B7225B0F2A90DE5A983DC2D9542CE Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP)(Disk 1 of 2) MSX JP +D73932CFD7587512A1F4EB9CA1C65C08 Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP)(Disk 1 of 2)[a] MSX JP +57B775DC9A6248CD958AA3E5535508CA Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP)(Disk 1 of 2)[a2] MSX JP +BE239ED84197949E7E145A55B9FF70CA Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP)(Disk 2 of 2) MSX JP +0C087C24D6D8E7315CF98C932E11476F Nobunaga no Yabou (1986)(Koei)(JP) MSX JP +78992701670BCF4D36FAEE1D637E946A Nobunaga no Yabou 2 - Sengoku Gunyuu Den (1989)(Koei)(JP) MSX JP +147BDDB364B0DF82E9896C073DB87E3D Nobunaga no Yabou 2 - Sengoku Gunyuu Den (1989)(Koei)(JP)[a] MSX JP +CDC6FA42DE2A7B665999944B87730797 Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 1 of 2) MSX JP +AAE85E2B1846B0BB91D43860F4C1BE0D Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 1 of 2)[a] MSX JP +F8110107AB4EB1FD03538BE788852F07 Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 2 of 2) MSX JP +D5805C0EDBAE2037FC14F5CBD0F431B1 Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 2 of 2)[a] MSX JP +1DFF84DA11396AF8EB7DAA33B309DE7A Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP)(Disk 2 of 2)[a2] MSX JP +8C8CBB323908EA851EF38419534FEE9F Nosh (1992)(Anma)(NL) MSX NL +D8CE12CA9ECAD292BDC39D02C6DFB1C8 Not Again! (1994)(Flying Bytes)(NL) MSX NL +D695E331EE5A5560B3DACB3F6396B2B9 Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 1 of 3)[b2] MSX ES +154730C7E07658979023DF728EEC2ACE Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 2 of 3) MSX ES +AD28EE34F23831C8F5ED1233FFAE8C82 Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 2 of 3)[b2] MSX ES +25F61C46ED173DC7933AFE20973ED404 Nueve Principes en Amber (1986)(Idealogic)(ES)(Disk 3 of 3) MSX ES +EA226100A8EBFBD3043235C6FEFD23E6 Nukenin Densetsu. The Caller from Darkness - Special Version (1988)(Brain Grey)(JP) MSX JP +5184CC59D19580A36D620D0A1FFABB97 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 1 of 4) MSX JP +AED55EF7467C37D7E332B56E62776C40 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 2 of 4) MSX JP +1BEF5C31B2B0A82842943FBAD68A7A67 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 2 of 4)[a] MSX JP +2442BC5BF94C5207658432352BD26266 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 3 of 4) MSX JP +B938CE8CD099086822B5ABA5E39A2B17 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 3 of 4)[a] MSX JP +191EB4BA56DA08D50344A8B33836FBA9 Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 4 of 4) MSX JP +5D449AEF3651D20349BCD6E44405354A Nukenin Densetsu. The Caller from Darkness (1988)(Brain Grey)(JP)(Disk 4 of 4)[a] MSX JP +F353FF9E1AD6167233C46C31640B68FF Numarin (1988)(Are System) MSX +FC9C4D7E7B8A75CC82E5F3B72A17BBF5 Numarin 2 (1989)(Are System) MSX +DD08DF14E16886B019642854FC46FA5C Numarin 3 (1992)(Are System) MSX +19883EEDD59FD6A9886F05E236EBE204 Nyancle Racing (1988)(Bit2)(JP) MSX JP +44116EDD39F782492BDD341ADA87441F Nyancle Racing (1988)(Bit2)(JP)[a] MSX JP +23808A96B5223E315F823AB838699773 Nyancle Racing (1988)(Bit2)(JP)[a2] MSX JP +0A1FF7DCDB1789F944C0399DFE4D14A4 Nyanpi. Cats Puzzle (1989)(Compile)(JP) MSX JP +9B06C50B546C86F9FC8D41A95C2E77DB Nyanpi. Cats Puzzle (1989)(Compile)(JP)[a] MSX JP +9437F641452209CC066B97E3FD1F0627 Ogre (1987)(System Soft)(JP) MSX JP +20F1B27D4E0892622F1F19BA2617A15E Ogre (1987)(System Soft)(JP)[a] MSX JP +EF947CA226DA2F3102D8D6797E8AD79D Onryou Senki (1988)(Software Studio WING)(JP)(Disk 1 of 4) MSX JP +17D5DB5B04608B7B56AB3111BC30FFB2 Onryou Senki (1988)(Software Studio WING)(JP)(Disk 2 of 4) MSX JP +44A43F55356A6CC4CB11F196E409D7E8 Onryou Senki (1988)(Software Studio WING)(JP)(Disk 3 of 4) MSX JP +BE82F6605ABB69FE1C5907F70FC2E330 Onryou Senki (1988)(Software Studio WING)(JP)(Disk 4 of 4) MSX JP +0299C8308E240575EAED0D33B249A8FC Ototch 2 (19xx)(-)(JP) MSX JP +D5F6E870584A9CB69C2710CAC8F91442 Oujibinbin Monogatari (1987)(East Cube)(JP) MSX JP +5CEB58404673807CEE5F36795EF60956 Oujibinbin Monogatari (1987)(East Cube)(JP)[a] MSX JP +F9DC791507E6FCEC8CCA43139A17F974 Out Run (1988)(Pony Canyon)(JP) MSX JP +4BDDE7CB2BD8F6E87BAB98C09E5B3CC4 Out Run (1988)(Pony Canyon)(JP)[a] MSX JP +70FC2A3F3507C06BDD33CB498D5FAF50 Out Run (1988)(Pony Canyon)(JP)[a2] MSX JP +6412A12B72729D5C570D5466174CE9E6 Out Run (1988)(Pony Canyon)(JP)[a3] MSX JP +88BB3F9988AA98DF5560D008B7B5DA96 Paccy (1993)(Gbsoft) MSX +A89E04C9797A625C48BE25644DDCB823 Pacman (1993)(Egega) MSX +BBAD902995ADFC66E8E4C69F5A6B7DAC Pacman (1993)(Egega)[a] MSX +CC80AA7D887F566791DA1F4E2C860595 Pac-Mania (1989)(Namcot)(JP) MSX JP +60E7B02C7CF7B25DE0E14CCADF59B79B Pac-Mania (1989)(Namcot)(JP)[a] MSX JP +0F2514BBEAB5A7F8FB1889C76DF14C88 Palace Prohibited (1990)(Scaptrust)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +4E85F8593924BD858C275E8B8BA8C681 Palace Prohibited (1990)(Scaptrust)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +8D566ABFDFC52B049532434D93FB47F9 Palamedes (1990)(Hot-B)(JP) MSX JP +4DF4526753912C18F28357BCF3973AFD Palamedes (1990)(Hot-B)(JP)[a] MSX JP +ED74DD11D9AB568B3B05B9F9AD456418 Palamedes (1990)(Hot-B)(JP)[a2] MSX JP +4F9DC0E70190145BABD093820658D790 Pallmith (1991)(Elemental Soft) MSX +D33774C8184D2F981B7EB32345291101 Passagers du Vent, Les (1986)(Infogrames)(FR) MSX FR +A204D9596B8D9B577568D63B55914837 Penguin Kun Wars 2 (1988)(ASCII)(JP) MSX JP +DF3F87807F25F8EA919BE621D2DE6FDB Penguin Kun Wars 2 (1988)(ASCII)(JP)[a] MSX JP +268BA9B111181570AB8E1885CA2730CB Penguin Kun Wars 2 (1988)(ASCII)(JP)[a2] MSX JP +13E4CB7BD1F90577F49E1CD2EDC90CB9 Penguin Kun Wars 2 (1988)(ASCII)(JP)[a3] MSX JP +3BBE3ABF8007B9205B8F8253FCB0C55B Perfect Soukoban (1989)(Micro Cabin)(Disk 1 of 2) MSX +BE9F7E6511B32C538754C68A19488E54 Perfect Soukoban (1989)(Micro Cabin)(Disk 1 of 2)[a] MSX +93B3C5A0964188A7E7635162772549E3 Perfect Soukoban (1989)(Micro Cabin)(Disk 1 of 2)[a2] MSX +8A2E5421E681701EBEF0874C65F3A65F Perfect Soukoban (1989)(Micro Cabin)(Disk 2 of 2) MSX +CDB4F3C937533D1C8C5871A2B5AE50E8 Perry Mason (1986)(Idealogic)(ES)(Disk 1 of 2) MSX ES +67B729408FFBEC7E33D1E44EF346384C Perry Mason (1986)(Idealogic)(ES)(Disk 2 of 2) MSX ES +B2C6D9296A56260CCBFAC1D9A1C93C9F Perry Mason (1986)(Idealogic)(ES)(Disk 2 of 2)[a] MSX ES +CD3EDF22A47B15D921BB5B90E4201BDD Phantasie (1988)(Bothtec)(JP) MSX JP +415D01737865A9F9047A088A9D393473 Phantasie II - Story of Ferronrah (1988)(Bothtec)(JP) MSX JP +3021A0E291D1A3B172187048E185E8FB Phantasie III - The Wrath of Nikademus (1989)(Bothtec)(JP)(Disk 1 of 2)(Scenario Disk) MSX Scenario Disk JP +10323D73FB84A9B9AAB3A3098E550BF9 Phantasie III - The Wrath of Nikademus (1989)(Bothtec)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +2BAD0D1E6F6E3D4308B6AC458C216560 Phantasie IV - The Birth of Hero (1991)(Starcraft)(JP)(Disk 1 of 2)(Scenario Disk) MSX Scenario Disk JP +209E2AB613D43663FEC3A0337D58FA4B Phantasie IV - The Birth of Hero (1991)(Starcraft)(JP)(Disk 1 of 2)(Scenario Disk)[a] MSX Scenario Disk JP +52DF60233AB4E397F015EC4B3DBC3F5F Phantasie IV - The Birth of Hero (1991)(Starcraft)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +E3F96986819B5A6228D4F109BE5AA60A Pinky Ponky I (1989)(Elf)(JP)(Disk 1 of 2) MSX JP +90B9846D0AC8FA81AD56428B680AC31B Pinky Ponky I (1989)(Elf)(JP)(Disk 2 of 2) MSX JP +ED04E2B799637B2E7216B6A321BC5EAD Pinky Ponky II (1989)(Elf)(JP)(Disk 1 of 2) MSX JP +A853CFC7DD75FBA69F4876D7969C0AE3 Pinky Ponky II (1989)(Elf)(JP)(Disk 2 of 2) MSX JP +9331D531A21F48DB74CD0EC816BDF117 Pinky Ponky III (1989)(Elf)(JP)(Disk 1 of 2) MSX JP +381C8640B242856315E4B7ACD576EE9F Pinky Ponky III (1989)(Elf)(JP)(Disk 2 of 2) MSX JP +83018BC14250417918A8C768D7D1F8F6 Play Ball III (1989)(Sony)(JP) MSX JP +65CB287233E680DB9F530B3C1A7D824E Play Ball III (1989)(Sony)(JP)[a] MSX JP +35EA543748B76712714E08A12B62FA4C Play Ball III (1989)(Sony)(JP)[a2] MSX JP +606022A985A925564B1EF58F144DAEB8 Playhouse Strippoker (1989)(Eurosoft)(NL) MSX NL +07E04A36538B084987C642963688EE95 Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 1 of 3) MSX JP +130EA4F69D49AAE40D8B387AB306D854 Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 1 of 3)[a] MSX JP +01D5606754427B3286198AC7F4CA3DF3 Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 2 of 3) MSX JP +51C20C5C44721B53424CA67D30D92B06 Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 2 of 3)[a] MSX JP +1DCDF369581EFF899D6110FA5B0DF063 Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 3 of 3) MSX JP +42677585BBBE752F82D3C625B9977A4A Pocky. Pokey (1989)(Pony Tail Soft)(JP)(Disk 3 of 3)[a] MSX JP +93BCC759DCB5F6B2D8DC57995F9BD159 Polemos (1988)(Masaki Suenaga) MSX +8D355D926CA925A5D262B7287B6DD14E Poles (1991)(Apl) MSX +F8718EF85A18BE697A49159ECE3170DA Police Dai Dageki (1987)(Family Soft)(JP) MSX JP +0A98F712AA04EE5680E0BEC8398B6361 Police Dai Dageki (1987)(Family Soft)(JP)[a] MSX JP +FFECA45638A6831A2F1D329DD5747FD2 Pooyan New (19xx)(Gerardin H.)(FR) MSX FR +768F0A740D95D6F0BAD70247312B13D7 Pooyan New (19xx)(Gerardin H.)(FR)[a] MSX FR +0DD99125ADCEDC8C502193E6CF15CEF4 Pooyan New (19xx)(Gerardin H.)(FR)[a2] MSX FR +4FDF813FA6A8AC78898D4C14F2C9A3B7 Pooyan New (19xx)(Gerardin H.)(FR)[a3] MSX FR +0D3F7EA9E7E8193F5BE9F7678453C04C Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 1 of 4) MSX JP +4B0256124E7968AEBFD14D17F3A46627 Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 1 of 4)[a] MSX JP +9CC8736618D54FB1CF259FD15D66C09A Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 2 of 4) MSX JP +FB088C035E7F0262B3EE3E76F1504903 Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 2 of 4)[a] MSX JP +0C1FE55CE993FD638E3BEB6241F663DC Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 3 of 4) MSX JP +772F34E3E5E9E310C9BBD98E3FB68DEB Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 4 of 4) MSX JP +F217A6E821AA776EFB68DB49308963F1 Powerfull Mahjong 2 (1988)(dB-Soft)(JP)(Disk 4 of 4)[a] MSX JP +B76F62E0C75D1BE780A63C4E022DBA24 Predator (1988)(Pack In Video)(JP) MSX JP +F935360EE8166526AFC76F6735E2705E Predator (1988)(Pack In Video)(JP)[a] MSX JP +01286B167F9A19FB3747920C2A18D861 Predator (1988)(Pack In Video)(JP)[a2] MSX JP +6EE4E997A5F912E70525285465BDB0B1 Predator (1988)(Pack In Video)(JP)[a3] MSX JP +F6166FABCBBEA1FB0CF02B92C59B95D5 Predator (1988)(Pack In Video)(JP)[a4] MSX JP +7BA941B04BFDFBAAC43FDD83C7A80942 Princess Maker (1992)(Micro Cabin)(Disk 1 of 7) MSX +C618F19A7285659146764257C4F79090 Princess Maker (1992)(Micro Cabin)(Disk 2 of 7) MSX +D2DA10521CE1D3DDF92EE3028E32FA94 Princess Maker (1992)(Micro Cabin)(Disk 3 of 7) MSX +79CF4631CE1E93AFD9390E0D24DDD75F Princess Maker (1992)(Micro Cabin)(Disk 4 of 7) MSX +FC68D417C66616DE5C51005A05741C49 Princess Maker (1992)(Micro Cabin)(Disk 5 of 7) MSX +457AF8D3B5A6082C9C08E705256CC044 Princess Maker (1992)(Micro Cabin)(Disk 6 of 7) MSX +E78728C594ABD9A5ABB05A9833079285 Princess Maker (1992)(Micro Cabin)(Disk 7 of 7) MSX +D53A62BC56DA664402FE21DC48E06B63 Princess Maker (1992)(Micro Cabin)(JP)(Disk 1 of 7) MSX JP +CB0632BC0C73BB15D1457E8FD8FBAC61 Princess Maker (1992)(Micro Cabin)(JP)(Disk 2 of 7) MSX JP +BB0910D0164E9611035CD7517F5D6AEF Princess Maker (1992)(Micro Cabin)(JP)(Disk 3 of 7) MSX JP +97493C94AD0C6C4AB1CA03FA094C1EC7 Princess Maker (1992)(Micro Cabin)(JP)(Disk 4 of 7) MSX JP +9EFBC26A63B3507EDCCAE4BE0996C3DF Princess Maker (1992)(Micro Cabin)(JP)(Disk 5 of 7) MSX JP +D3155A2B943C21D36BA5F2C08828FDD0 Princess Maker (1992)(Micro Cabin)(JP)(Disk 6 of 7) MSX JP +C2213EA91DD4C37792FFF4A20EAA95F9 Princess Maker (1992)(Micro Cabin)(JP)(Disk 7 of 7) MSX JP +258279FD6B05265A4CD5370C15AAF488 Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 1 of 7) MSX JP +5A39F54FCD37220F55A1D11212331E49 Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 1 of 7)[a] MSX JP +1B342ABD816FE3CB3659BFC96145AA96 Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 2 of 7) MSX JP +2413836D2D3C082216FE0A040C563D57 Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 3 of 7) MSX JP +4BFE8EC6ED5C296456E90DB90F36330F Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 4 of 7) MSX JP +91122E74970C9EC40E07604A5DE3A3DF Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 5 of 7) MSX JP +2A7598BBB3E86870975DD2DFA39895C1 Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 6 of 7) MSX JP +96934C29A2E83C8B903D28F1B6C862EA Princess Maker v2 (1992)(Micro Cabin)(JP)(Disk 7 of 7) MSX JP +DC4117FF00B73A6300CDD45F2306B98F Pro Baseball Fan (1988)(Telenet Japan)(JP) MSX JP +557704AAEA9AF18DB9301C7C0CF6F4FF Project A2 (1987)(Pony Canyon)(JP) MSX JP +9176EEB812E4987777F979A33A9AB026 Project A2 (1987)(Pony Canyon)(JP)[a] MSX JP +B0C708C45856971DE15FC2A574CF01CC Project A2 (1987)(Pony Canyon)(JP)[a2] MSX JP +63B318F1B014A4CF9E1DC09418E079F8 Project A2 (1987)(Zemina)(KR) MSX KR +31DB7C3CB2B4D65E4E5E4ADC09386797 Psycho Ball (1993)(RAT)(NL) MSX NL +709C5545B009DB92A9C9501CF622FB9C Psycho World (1988)(Hertz)(JP) MSX JP +A0C421017CB4C21DFD625306B08075F6 Psycho World (1988)(Hertz)(JP)[a] MSX JP +AB2DE9A687A5E487B53C87852D8CA9E4 Psycho World (1988)(Hertz)(JP)[a2] MSX JP +40E56062A72EB3042DF554A7C75371FF Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 1 of 3) MSX JP +E73036FADE9D3D0C20E9D3E5B00F714E Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 1 of 3)[a] MSX JP +7347AD978B03EE6D303C796BDC1D2D43 Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 1 of 3)[a2] MSX JP +B0C2982429F10DE7B94027E4498FFD7A Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 2 of 3) MSX JP +2AD80F7B02C68D1E734F32393990803E Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 2 of 3)[a] MSX JP +54207EFC5D20F39771E939F44C7213C8 Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 3 of 3) MSX JP +218856A2F76B139D502C071B92F667DC Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 3 of 3)[a] MSX JP +5F10F150215009863A16DBDE32C0C935 Psy-O-Blade (1988)(T&E Soft)(JP)(Disk 3 of 3)[a2] MSX JP +2068A46AEBC42FFD2AEDA27B1634B5DD Pumpkin Adventure (1992)(Umax)(NL) MSX NL +335CF462F69996B92A13AE7799458107 Pumpkin Adventure (1992)(Umax)(NL)[a] MSX NL +F4328907DF8548982BECEDBF0341D40F Pumpkin Adventure (1992)(Umax)(NL)[a2] MSX NL +61D773CBD3BB55FD41C23A4FE075CFE9 Push'em (2000)(TeddyWarez)[SCC] MSX +95739C625CE050C2D90CB98D1CD4CC59 Puyo Puyo (1991)(Compile) MSX +C05C72BBF48822B1BD8434E3B5FD139F Puyo Puyo (1991)(Compile)(JP)[a] MSX JP +57D631D9481EEB3599E64C224A47079B Puyo Puyo (1991)(Compile)(JP)[a2] MSX JP +FE2B903369DEE3127D26B394665D7C66 Puzzle (1987)(Robinsonsoft)(NL) MSX NL +1107B18E6D003EE114AE02B92370D659 Qix (19xx)(-) MSX +3E0614A42D840CF16737A918B70A5414 Qix (19xx)(-)[a] MSX +9C0E33699BF9C2E0DDFA4E713D933CBE Qop (1991)(Lionsoft)(NL) MSX NL +5B959E8A341AB44847B4BED1B2CBBFB9 Quadromania (1987)(Obisoft) MSX +1CF8482F4934180FA52E6041A7D92AF0 Quadromania (1987)(Obisoft)[a] MSX +3DB831A4FA6A9814D943D58034C79738 Quattro (1989)(First Class Software)(NL) MSX NL +7246CC702794DB2E53C47A4CE9A76C3E Quinch (19xx)(MCEV) MSX +7275CF9B6DB56B911A6D2EC3DF17B31C Quiz Master (19xx)(-)(JP) MSX JP +8A6A3A1C1BF81F7F16845AD71BD657A7 Quiz! Atatchatte 25% - Additional Questions (1996)(Gigamix)(JP) MSX JP +6595DCCBB29098BB12B9621D5437BBDA Quiz! Atatchatte 25% (1996)(Gigamix)(JP) MSX JP +D8F6FB888C71252CAE2F731A5BAC47AD Quiz! Atatchatte 25% (1996)(Gigamix)(JP)[a] MSX JP +6504231819DA104D01A614863F5BB6A1 Rad van Fortuin (1991)(NewVision Benelux)(NL) MSX NL +B09002CCB329E700EEAAE56002DAD7D7 Rad van Fortuin (1991)(NewVision Benelux)(NL)[a] MSX NL +D6AB406E5ED6ACD86AE033A3DB17C2E9 Rad van Fortuin (1991)(NewVision Benelux)(NL)[a2] MSX NL +04D1EC467C202B079A502F67FD9AE9DD RADX-8 (1988)(Philips) MSX +2BD911BD3934D4E51FCA09E569E01B4C RADX-8 (1988)(Philips)[a] MSX +90BC94DB2A9D8A5DD997DC4129CA902A RADX-8 (1988)(Philips)[a2] MSX +1900A79425E7586BFA96F8399A13659C RADX-8 (1988)(Philips)[a3] MSX +9D541EB1F802250244B2523F9A807DCD RaiRai (19xx)(-) MSX +D180B3085C9C82D27591936A90CFDFAB RaiRai (19xx)(-)[a] MSX +DC919EEA27B3F764DFDE021F94694AF5 RaiRai (19xx)(-)[needs MSX-DOS] MSX +A12E70160983EC03C3430026D8D50D59 Rance (1989)(Alice Soft)(JP)(Disk 1 of 4) MSX JP +46B3FD331EA4A4DC33385F32EC7674E2 Rance (1989)(Alice Soft)(JP)(Disk 1 of 4)[a] MSX JP +55321015247E36BA08D9EF38364F3722 Rance (1989)(Alice Soft)(JP)(Disk 2 of 4) MSX JP +8640A841000F832D8F9257FCBCCE6541 Rance (1989)(Alice Soft)(JP)(Disk 2 of 4)[a] MSX JP +731752005AB3445C68AD5313C096D045 Rance (1989)(Alice Soft)(JP)(Disk 3 of 4) MSX JP +BCB0EC925FE98A6B3A6D001542529268 Rance (1989)(Alice Soft)(JP)(Disk 3 of 4)[a] MSX JP +99CDD85F4495EFD3CD23574736A4A9D7 Rance (1989)(Alice Soft)(JP)(Disk 4 of 4) MSX JP +0A169676E5D8A91EE145F724852D762E Rance II (1990)(Alice Soft)(JP)(Disk 1 of 5) MSX JP +99BA74BD5DB36DC788C0E91053A297D6 Rance II (1990)(Alice Soft)(JP)(Disk 2 of 5) MSX JP +23777E6CAD17D2D11D754709B2E74DDB Rance II (1990)(Alice Soft)(JP)(Disk 3 of 5) MSX JP +682713CF85CD2F6286573C7BDC7382FC Rance II (1990)(Alice Soft)(JP)(Disk 4 of 5) MSX JP +22CBF9BE3B753F7BB2C0B790969D786C Rance II (1990)(Alice Soft)(JP)(Disk 5 of 5) MSX JP +227A4A048C676ED602D2BCD2F7A2954F Randar (1989)(Compile)(JP) MSX JP +487BC66BB1F8E11BC2C5D67CED667C03 Randar II - Revenge of Death (1989)(Compile)(JP) MSX JP +11B68B3AA52431C7E4F06CCDFFAC3A25 Randar II - Revenge of Death (1989)(Compile)(JP)[a] MSX JP +D3C5A84AA2D8D8E3EEE91FE68C99D890 Randar II - Revenge of Death (1989)(Compile)(JP)[a2] MSX JP +61F56AB38DB4B74AEF8E427004064744 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 1 of 5) MSX JP +12CFB828F629237104B73C6D13DC8BE2 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 1 of 5)[a] MSX JP +1E0EA8FE6FF12346FF1F9DAB7AE1E5AB Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 1 of 5)[a2] MSX JP +8B93F09CE5E251F838A6B38D77FC66C6 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 2 of 5) MSX JP +3903B761E66AC60D5D21229564CCA834 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 2 of 5)[a] MSX JP +69E98AD938DA94EB6431AD5265243830 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 3 of 5) MSX JP +F12163011BFA0B93F6434C806A24E1AF Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 4 of 5) MSX JP +7B89E9F44CD6569B482414FE1A61478C Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 5 of 5) MSX JP +BAD52A6F0AD5A92251B76DC31E7ABB19 Randar III - Adventure of Randar (1990)(Compile)(JP)(Disk 5 of 5)[a] MSX JP +C4EA2D17AEE56A28B0F12417826F9CEB Rastan (1988)(TAITO)(JP) MSX JP +1DF3DD7E16A0C69DAF0CF51FDBD29B96 Rastan (1988)(Taito)(JP)[a] MSX JP +1F173FCACC5B5453749B0490A5F5C809 Ray Gun (1991)(Elf)(JP)(Disk 1 of 6) MSX JP +459EB2B4351F66EB66664DB807EAEB4C Ray Gun (1991)(Elf)(JP)(Disk 1 of 6)[a] MSX JP +D6F9240BDCC1351DCB7891037A84BB1A Ray Gun (1991)(Elf)(JP)(Disk 2 of 6) MSX JP +6AE02AAAF2793402034ABE8B1974DEBE Ray Gun (1991)(Elf)(JP)(Disk 3 of 6) MSX JP +112DD37FD081384612E685AA7C0830B8 Ray Gun (1991)(Elf)(JP)(Disk 3 of 6)[a] MSX JP +D27BBD2B617CD010F7610517B1BAD958 Ray Gun (1991)(Elf)(JP)(Disk 4 of 6) MSX JP +9ED281F0FC89C4F9BBA95314E0BA5D37 Ray Gun (1991)(Elf)(JP)(Disk 5 of 6) MSX JP +81F01EAF3C36B1113ADB85098DB2B7E5 Ray Gun (1991)(Elf)(JP)(Disk 6 of 6) MSX JP +9F90599B41049A1E8B2E23A143049155 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 1 of 5)(Opening Disk) MSX Opening Disk JP +EAED667102C5B23120E3D17E8EC5CDA1 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 1 of 5)(Opening Disk)[a] MSX Opening Disk JP +081B1C2CAB2E2684C34F49DEB33E5741 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 2 of 5)(Game Disk 1) MSX JP +348BB73691568A381FA19EBC3002DC6F Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 2 of 5)(Game Disk 1)[a] MSX JP +1DF918F5F7DE51AFF6638F2519FE9F50 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 3 of 5)(Game Disk 2) MSX JP +A13C3A092845057D0573820084E831F8 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 3 of 5)(Game Disk 2)[a] MSX JP +C2AAEBBE428A70BD6D1AD876282628FD Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 4 of 5)(Game Disk 3) MSX JP +94C066E22485849122526501F28CB2F3 Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 4 of 5)(Game Disk 3)[a] MSX JP +EE7F0C6BA53213243DF8119327C22BFA Record of Lodoss War (1989)(Humming Bird Soft)(JP)(Disk 5 of 5)(User Disk) MSX User Disk JP +29E8E09EF807957904CDFA8A66E869EB Record of Lodoss War Pack (1990)(Humming Bird Soft)(JP) MSX JP +E3D2056A020AE012436A124A42A5EF57 Return of Jelda (1987)(Carry Lab)(JP) MSX JP +303FAC82C750B93DAA29052B5D4DD61D Return of Jelda (1987)(Carry Lab)(JP)[a] MSX JP +6059BB12926DD2724F07B343B850410F Reviver (1987)(Arsys)(JP)(Disk 1 of 2) MSX JP +AD875D795116053901880723A7BF68C9 Reviver (1987)(Arsys)(JP)(Disk 1 of 2)[a] MSX JP +630F9AA143621C0E591CD0EA4FF9394F Reviver (1987)(Arsys)(JP)(Disk 1 of 2)[a2] MSX JP +279AF22D582014F7A1C10ACDABEC764D Reviver (1987)(Arsys)(JP)(Disk 2 of 2) MSX JP +9F05B0F5F7C7A153062BFADAFCBA8BE7 Reviver (1987)(Arsys)(JP)(Disk 2 of 2)[a] MSX JP +66CF3FC88BAA6997A66F627E1BCFB441 Rick Dangerous - Extra Levels (1993)(Paragon Productions)(NL) MSX NL +C6DBE876A9981D27DAED408A8571849C Rick Dangerous (1992)(Paragon Productions)(NL) MSX NL +212658309D3BA409D584ED659AF86B1E Rick Dangerous (1992)(Paragon Productions)(NL)[b2] MSX NL +BCD5AECF84A471F0AF4B734C6ABBA5CB Rick Dangerous (1992)(Paragon Productions)(NL)[b3] MSX NL +22092EA022A5AACC17E3F1932571FD6D Rick Dangerous (1992)(Paragon Productions)(NL)[b4] MSX NL +C353996B5B4CCCD2C01D928E1EA7AE70 Riot (1990)(Hatimitsu Demon) MSX +C6C97C664B45453BDC054E1C22CC3AD6 Riot (1990)(Hatimitsu Demon)[a] MSX +E7A8DABC03302249D59E9292CCFCF439 Risiko U.S.A. (1989)(IFI)(ES) MSX ES +D363B18D50AFB8647336404DE6702F97 Risiko U.S.A. (1989)(IFI)(ES)[a] MSX ES +0EFA0DF6A12C556AF2DA3728CD6E083B Robo Crush (1990)(System Soft)(JP)(Disk 1 of 2) MSX JP +43BCD13DCF4B50E8802DBE2814E121D2 Robo Crush (1990)(System Soft)(JP)(Disk 1 of 2)[a] MSX JP +038B1162A086B3E79CD17E8426A64E27 Robo Crush (1990)(System Soft)(JP)(Disk 1 of 2)[a2] MSX JP +4D01F63B1B44C9E239C5B1C3D7FCE86E Robo Crush (1990)(System Soft)(JP)(Disk 2 of 2) MSX JP +F5EF684E0D3CBFE20AD1E9ED195BE1BF Robo Crush (1990)(System Soft)(JP)(Disk 2 of 2)[a] MSX JP +49DA976360D7BD1A0FD0D92A6A5CB8CA Rogue Alliance (1989)(Starcraft)(JP) MSX JP +778DD3122B0EE3F2BA02A1A1C6B08A7A Rona (1994)(Dixie)(JP)(Disk 1 of 3) MSX JP +639EBE44FAFF22A7B42B6FB1CE4EC492 Rona (1994)(Dixie)(JP)(Disk 1 of 3)[a] MSX JP +374B6C9E55E85678D33693DCDA8216C7 Rona (1994)(Dixie)(JP)(Disk 2 of 3) MSX JP +143642DAD108259EF83358CAA6842996 Rona (1994)(Dixie)(JP)(Disk 3 of 3) MSX JP +BE9058FBA7D7BCF26A660C99EB1677A4 Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 1 of 3) MSX JP +24DC9A0714027752546D95EF69D3A1D1 Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 1 of 3)[a] MSX JP +55767528B25CED94F994474FF8F9813D Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 2 of 3) MSX JP +6751B086A5E7CCEB925B90B743968AD2 Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 2 of 3)[a] MSX JP +7FDBD3748C05094D0A8108F62B61AF44 Royal Blood. Gemfire (1991)(Koei)(JP)(Disk 3 of 3)(User Disk) MSX User Disk JP +CE37424A63ADA4E5B3AAD0B445C18F2D Rune Master (1989)(Compile) MSX +EC65DB7B9D44266772FF0272D078A233 Rune Master II (1990)(Compile) MSX +57E58DF5086C2135A451C420DBB71D80 Rune Master II (1990)(Compile)(JP) MSX JP +6E0A0F2CF8502305C408AA6E37564CE2 Rune Master III (1991)(Compile)(JP)(Disk 1 of 3) MSX JP +549645B69A264497A1FB39ACC134B905 Rune Master III (1991)(Compile)(JP)(Disk 1 of 3)[a] MSX JP +0A3907B51F8CAE68DF3347BCDBBD33D2 Rune Master III (1991)(Compile)(JP)(Disk 1 of 3)[a2] MSX JP +7319839B6F231225B8F15FD5534F3A12 Rune Master III (1991)(Compile)(JP)(Disk 2 of 3) MSX JP +7B673343FA620FDAB8BD59B37BFB279E Rune Master III (1991)(Compile)(JP)(Disk 2 of 3)[a] MSX JP +004A470589FB533CC8B6F79C94D6A044 Rune Master III (1991)(Compile)(JP)(Disk 2 of 3)[a2] MSX JP +F2A25A5FD8CD3CDE5F32A71A34D469D4 Rune Master III (1991)(Compile)(JP)(Disk 3 of 3) MSX JP +1F1581DEFF16E6D828478DC5E2EEE152 Rune Master III (1991)(Compile)(JP)(Disk 3 of 3)[a] MSX JP +0AA042B8BA662FE57CDB4DA139C88A65 Rune Master III (1991)(Compile)(JP)(Disk 3 of 3)[a2] MSX JP +271ACB6B12498E2C99FB989684B97DCA Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 1 of 4)(Start Disk) MSX Start Disk JP +103354FC64FDD7E0D79BBC875B8A307E Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 2 of 4)(Game Disk A) MSX JP +6D94C5E6165B90E44AC308C1833215CC Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 2 of 4)(Game Disk A)[a] MSX JP +8E4D5BD7A5C433D4F20353B0E28859DC Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 3 of 4)(Game Disk B) MSX JP +8A49B349FEDDEE9887393B3E3C6364C8 Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 3 of 4)(Game Disk B)[a] MSX JP +A106D885D9B8789FCF6CEB015E3B0849 Rune Worth - The Young Noble of a Wire-Puller (1990)(T&E Soft)(JP)(Disk 4 of 4)(User Disk) MSX User Disk JP +2EAF070AE9CDE31CDF763FD7DE98DE93 Running Dragon (1989)(Eurosoft)(NL) MSX NL +F39BBD9351F9A7350900AC606C5C4A40 Running Dragon (1989)(Eurosoft)(NL)[a] MSX NL +BE9C81D4A1326DB2B09E80DF94F46908 Running Dragon (1989)(Eurosoft)(NL)[a2] MSX NL +CDAE6EAC367B43016F743EED9D61A833 Ryukyu (1989)(ASCII)(JP) MSX JP +771165014076274B4E874FE2440D09D7 Ryukyu (1989)(ASCII)(JP)[a] MSX JP +51D6D85EA840E21918D1EBBA68CA237B Sanae (1992)(-)(JP) MSX JP +82CF897BE1C908C1EBA62C2078982159 Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 1 of 3) MSX JP +95F6402BE9595441AFD296BB4B8EEB2F Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 2 of 3) MSX JP +F31571E9D40BAC9FE53E933D22BE2F44 Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP)(Disk 2 of 3)[a] MSX JP +4082777DCB2010CABC047FD464715635 Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +D6009C65E6AC0CB1C056D6E0D17CAF3D Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +16400FCC717199F986714AB4BC27C710 Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk)[a2] MSX Game Disk JP +3BBA091DAA6C1534C9A2751581CD627E Sangokushi. Romance of Three Kingdoms (1986)(Koei)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +58A8125DD79AE660EA9CF893D2ABEBBB Sangokushi. Romance of Three Kingdoms v2 (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +A22B1F38EC830727E14B7C07CADFAFD3 Sangokushi. Romance of Three Kingdoms v3 (1986)(Koei)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +5CBDEE3ECB14C4057C187386C9E4A62B Satujin Kurabu. Murder Club (1988)(Micro Cabin)(JP) MSX JP +C21093F50B2F0C0CC042E487280DEBAC Saurus Lunch Vol. 0 (1989)(Bit2)(JP)(Disk 1 of 2)[mouse] MSX JP +1D02D29AE045E142CC227AB6301F668B Saurus Lunch Vol. 0 (1989)(Bit2)(JP)(Disk 2 of 2)[mouse] MSX JP +3EEC94D574F08CA18247C5900C93DD88 Sa-Zi-Ri. Saziri (1988)(Telenet Japan)(JP) MSX JP +7327E2BE3B736F926831DCAECE2F2787 Sa-Zi-Ri. Saziri (1988)(Telenet Japan)(JP)[a] MSX JP +2587D1AE422BA2BB100576753A114498 School Record of War (1988)(Champion Soft)(JP)(Disk 1 of 5) MSX JP +3942D0217728527AF83AEFC2FFC05A2B School Record of War (1988)(Champion Soft)(JP)(Disk 2 of 5) MSX JP +5EE9CCA25699B2AD48090C82D3079C47 School Record of War (1988)(Champion Soft)(JP)(Disk 3 of 5) MSX JP +AC62B732CC7283B7AF00ACFE31E9B706 School Record of War (1988)(Champion Soft)(JP)(Disk 4 of 5) MSX JP +E3F2247A1A9EEC39D78B708711220E28 School Record of War (1988)(Champion Soft)(JP)(Disk 5 of 5) MSX JP +7C56D70F56765C6C344B622319637F6B Schwarzschild (1989)(Kogado)(JP)(Disk 1 of 2) MSX JP +B8C16B4CD8E755B624ED705E5960F48D Schwarzschild (1989)(Kogado)(JP)(Disk 1 of 2)[a] MSX JP +32F7D5EC83186A41EC0BD44E69719EA0 Schwarzschild (1989)(Kogado)(JP)(Disk 2 of 2) MSX JP +8C830505B1240BAC4DBD95ADD11F598B Schwarzschild (1989)(Kogado)(JP)(Disk 2 of 2)[a] MSX JP +BB3F9F0DE1EFED9AC07C7F5771D7AE4D Schwarzschild II (1990)(Kogado)(JP)(Disk 1 of 2) MSX JP +529C36D7E83CEC1B1996931E18210CCC Schwarzschild II (1990)(Kogado)(JP)(Disk 1 of 2)[a] MSX JP +79E7CA14B101C6262AB395EB65186081 Schwarzschild II (1990)(Kogado)(JP)(Disk 2 of 2) MSX JP +1252D162F0E38B5636C8F6D708B4CF01 Scrabble Triton (1991)(Osaka Soft) MSX +DEE2C66D9990C1DB310FE75781C11272 Scrabble Triton (1991)(Osaka Soft)[a] MSX +F7597D378361C64CBDE6FC150CA333B2 Scrabble Triton (1991)(Osaka Soft)[a2] MSX +DCA9B5B67FB599D1750528F4DC2BD219 Scramble Formation (1987)(TAITO)(JP) MSX JP +9D42C772C956135287A2C155511D7408 Scramble Formation (1987)(Taito)(JP)[a] MSX JP +ABCA4FDD7CD15362736C210194D12583 SD Gundam - Gachapon Senshi 2. Capsule Senki 2 (1990)(Banpresto)(JP) MSX JP +87049AAF98A01DFE5D94657C4354F397 SD Gundam - Gachapon Senshi 2. Capsule Senki 2 (1990)(Banpresto)(JP)[a] MSX JP +EE543A5B7FCC58C25B2379AD8CEFAEE8 Seigimatsu II Special Attack Devil (1987)(Sony)(JP) MSX JP +3C4D0F4A8972698945650DAB76A0AC74 Seigimatsu II Special Attack Devil (1987)(Sony)(JP)[a] MSX JP +17DC5083F635A2B92F019E0C836F6307 Seigimatsu II Special Attack Devil (1987)(Sony)(JP)[a2] MSX JP +FE3676288675EA9D9EBDD570394843E3 Seigimatsu II Special Attack Devil (1987)(Sony)(JP)[a3] MSX JP +AA303E8928A33FA11834A031B6AA1946 Seikimatsu Fly Battler (1993)(MSX-FAN)(JP) MSX JP +A938EC0A7E7AAE783D5AED0FE8F126AF Seilane (1988)(Micro Cabin)(JP)(Disk 1 of 2) MSX JP +A811E472244256F1017B049A36F67ED7 Seilane (1988)(Micro Cabin)(JP)(Disk 2 of 2) MSX JP +A6A014A519569F941455B82E95F3E16A Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 1 of 6) MSX JP +680EFA9A277FBCE1B49B4DB29E35C4EE Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 1 of 6)[MSX2plusready] MSX JP +93609C38C427159B615B5B49E08ECB51 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 2 of 6) MSX JP +56DD9632840FBEC53773FCF4C647EAA0 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 2 of 6)[MSX2plusready] MSX JP +DC5A8B4741518C525737C1045846AE35 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 3 of 6) MSX JP +35B828A5F6A2DB7542B86B3A6764FAEF Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 3 of 6)[MSX2plusready] MSX JP +8B0941063D906957EEB2EA7BDC2A5F4E Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 4 of 6) MSX JP +30DC2A99F6D40AECBC77B8647F82F12E Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 4 of 6)[MSX2plusready] MSX JP +A0EDA9FC1B2C13CA33893B6F9DEA4043 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 5 of 6) MSX JP +84563AEA8CA44969A123AB28D21978B8 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 5 of 6)[MSX2plusready] MSX JP +CB7DECEFA85DCCB72ADAD940C258BE04 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 6 of 6) MSX JP +CA9395B2730957FB77E8B0B27485FFF0 Seisen samurai Danbain. Aura Battler Dunbine (1991)(Family Soft)(JP)(Disk 6 of 6)[MSX2plusready] MSX JP +171F410471DDBCAA40E22FBDA2B16026 Seisen samurai Danbain. Aura Battler Dunbine v1.1 (1991)(Family Soft)(JP)(Disk 1 of 6) MSX JP +526B1AD16BEE4D789CD2A0483653282E Sekte, De (1986)(Philips)(NL) MSX NL +8F9188216ADBF0F8CCF3A8D0E2BA4CE0 Sekte, De (1986)(Philips)(NL)[a] MSX NL +EAFBEA0A9C0A17A0ECA82870A78A7B9F Sekte, De (1986)(Philips)(NL)[a2] MSX NL +C7A20F1840801DC1EC144C389466E948 Sette e Mezzo House (19xx)(-)(IT) MSX IT +C27B04494FC2113AC0803110D5058C81 Sette e Mezzo House (19xx)(-)(IT)[a] MSX IT +EB3C12A42C703BD4BBD8A313AB3F7E98 Sexy Pictures Puzzel (1987)(Pussy)(NL) MSX NL +4C481F0A118233E972DA182EABAD7ACD Sexy Pictures Puzzel (1987)(Pussy)(NL)[a] MSX NL +CB87F3FC30C1D33421EBB4CC3B8EDCDB SH#1 (1991)(Interpreter Software)(Disk 1 of 2) MSX +28B272EE6A2AF7663CD9B37644D2D0C0 SH#1 (1991)(Interpreter Software)(Disk 2 of 2) MSX +EC7145D06621CA8398AC93EC0CA190F3 Shadow Hero 3 (1993)(Syntax) MSX +2D8FBF1827FFAA0E554C3116CBC40FBC Shadow Hero 3 (1993)(Syntax)[a] MSX +87447D039FA0034C2AD1C13FAB314610 Shadow Hero 3 (1993)(Syntax)[a2] MSX +756713BC307DAAB029A56B45E0A76A11 Shadow Hero 3 (1993)(Syntax)[a3] MSX +C9B8061FB52219D572B7A98FA48606FD Shadow Hunter (1988)(Champion Soft)(JP)(Disk 1 of 2) MSX JP +469258B54BC21AC0FE87129937C94CCC Shadow Hunter (1988)(Champion Soft)(JP)(Disk 2 of 2) MSX JP +D4E31588E6DB882321BACEF2E7BA5F68 Shanghai (1987)(System Soft)(JP) MSX JP +72EB275FFFBD5ABD020A3F0480F772C9 Shanghai (1987)(System Soft)(JP)[a] MSX JP +755F887561DB6B248BC6C743371EE813 Shanghai II (1989)(System Soft)(JP) MSX JP +FBA2CF4C976ACDD973C9B993673012A8 Shanghai II (1989)(System Soft)(JP)[a] MSX JP +6CF0476BE2FA07B88450C0AA41F687E8 Shanghai II (1989)(System Soft)(JP)[a2] MSX JP +09E1F82C41EA81BF45077688FFEAF9D1 Shenan Dragon (1990)(Technopolis Soft)(JP)(Disk 1 of 2) MSX JP +994C4F3CAB229B867146326E819BBC88 Shenan Dragon (1990)(Technopolis Soft)(JP)(Disk 2 of 2) MSX JP +4C98D5B706E3935CF1CDB1AA3DE6C6C7 Shikinjyo (1990)(Scaptrust)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +39ED845DB109C896FECB42F8608E9980 Shikinjyo (1990)(Scaptrust)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +85DA14BBE56ED59FB021DC0449741228 Shin Ku Gyoku Den. New Legendly Nine Gems (1988)(Tecno Soft)(JP)(Disk 1 of 2) MSX JP +87845EC7DAAA9A34EB341E0F51F78D53 Shin Ku Gyoku Den. New Legendly Nine Gems (1988)(Tecno Soft)(JP)(Disk 1 of 2)[a] MSX JP +1C15FF3398FA52FB587D2B49D296FE3A Shin Ku Gyoku Den. New Legendly Nine Gems (1988)(Tecno Soft)(JP)(Disk 2 of 2) MSX JP +CD41FA20E97F22253C2445133EF0E0A2 Shin Ku Gyoku Den. New Legendly Nine Gems (1988)(Tecno Soft)(JP)(Disk 2 of 2)[a] MSX JP +50680AC1F866DB69210A303E107C85CC Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 1 of 2) MSX JP +05BEA85F9E62D0DDD24FCE098CF4BD4E Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 1 of 2)[a] MSX JP +177CA698A4727738705614B66F6BA468 Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 1 of 2)[a2] MSX JP +9D28564DABC83BD16C8EA5F2A1F3C7AA Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 2 of 2) MSX JP +67A6753B1925F18B5B360EEB60DEC817 Shiryou Sensen 2. War of the Dead 2 (1990)(Victor)(JP)(Disk 2 of 2)[a] MSX JP +9EC02414CFAA52826D867065A625ABB7 Shiryou Sensen. War of the Dead (1989)(Victor)(JP) MSX JP +9924A33CD6CDFB011F5EED45362EB513 Shiryou Sensen. War of the Dead (1989)(Victor)(JP)[a] MSX JP +ECB538095179F1BC1579D8324AD8D9AC Shita (1989)(-)(JP)(Disk 1 of 5) MSX JP +5A1FF85DC63C962AECBDCD86B5750B00 Shita (1989)(-)(JP)(Disk 2 of 5) MSX JP +C1C6F4DA274FB790EAFC1447EBB177C0 Shita (1989)(-)(JP)(Disk 3 of 5) MSX JP +537966D15D0F03AD72376F74EBCA3C0D Shita (1989)(-)(JP)(Disk 4 of 5) MSX JP +B2AF960C5186C27F527DFFB10787A956 Shita (1989)(-)(JP)(Disk 5 of 5) MSX JP +8FB2310D077345B2CCB4676687C40BC8 Shoot Them Up (19xx)(-)(FR) MSX FR +B5D38A90398A474C880F5936E4B3F9FF Shoot Them Up (19xx)(-)(FR)[a] MSX FR +3FC07712F183E5DAB90E58F25EBFF231 Shoutenki. The Ambition of Ohnuki (1994)(Taracot)(JP) MSX JP +C714ACBE867860F5946139BFF53D61E0 Shrines of Enigma (1994)(Sunrise)(NL) MSX NL +B8787F3283F3E3DF8A5C9D8F1E35A2B1 Shuffle Puck (1993)(M.A.D.)[mouse] MSX +9CAF275C03547883CAE6F456EA8D4DCB Shut the Box (19xx)(-)(FR) MSX FR +BC3EDA1069022913563677DFEE09223A Shut the Box (19xx)(-)(FR)[a] MSX FR +B42EA4AC92E26E6A47FBC1ADC50E02D7 Siege (1991)(Nagi-P Soft) MSX +FBDA461B65B6D4F7EDC18C04A38DD1ED Silviana (1989)(Pack In Video)(JP) MSX JP +CD973C29AE4D42C319584C452B06AF06 Silviana (1989)(Pack In Video)(JP)[a] MSX JP +ED5FA32532C581C39885C9E05AD1656E Silviana (1989)(Pack In Video)(JP)[a2] MSX JP +97D320FFFF82C606175D9D16F73C6C58 Slgbanza (1991)(MSX Magazine)(JP) MSX JP +FAAA5CF72B345A5C59862C1ECDB685C9 Slime World (1996)(Frieve)(JP) MSX JP +083C7E99D457C3AD3F20780B771C91DB Snakes & Ladders (1988)(FSS) MSX +991C0FCCB08986B1554081BF15887B87 Snakes & Ladders (1988)(FSS)[a] MSX +D2DB6C15053103CFE82A3B04D06F9AF9 Snatcher (1988)(Konami)(JP)(Disk 1 of 3)[a][SCC] MSX JP +FD9A98CF9DEB139057830C713563A109 Snatcher (1988)(Konami)(JP)(Disk 1 of 3)[a][SCC+] MSX JP +D883C6400E5E38D1B484FFB3A1B61985 Snatcher (1988)(Konami)(JP)(Disk 1 of 3)[a2][SCC] MSX JP +0982C4AF190CCC87B99FB77D56A91F83 Snatcher (1988)(Konami)(JP)(Disk 1 of 3)[SCC] MSX JP +6E22F60E3819F06B86136ACBB46F7E06 Snatcher (1988)(Konami)(JP)(Disk 1 of 3)[SCC+] MSX JP +A793B6F80F02F63F6FF1203F3C346298 Snatcher (1988)(Konami)(JP)(Disk 2 of 3)[a][SCC] MSX JP +A04241B8F2381B6B8AB937F060717210 Snatcher (1988)(Konami)(JP)(Disk 2 of 3)[SCC] MSX JP +7C79C94EFCDDC0B2266F6EC8A9AFAD60 Snatcher (1988)(Konami)(JP)(Disk 2 of 3)[SCC+] MSX JP +64CECD6640FC547E124BBC227D8E7426 Snatcher (1988)(Konami)(JP)(Disk 3 of 3)[SCC] MSX JP +E4F9AC69E4C165B525EAA99191C2B1A3 Snatcher (1988)(Konami)(JP)(Disk 3 of 3)[SCC+] MSX JP +E72711718D88902780B4853B3ABEAB76 Soldier of Fisla (1990)(Compile)(JP) MSX JP +E7615F48FDFC8F5FCEF9047D929FAA7F Soldier of Fisla (1990)(Compile)(JP)[a] MSX JP +623B3A729C7C418BE0744051BF3B749D Solid Snail (1994)(Vivid)(NL) MSX NL +6886D31422860B51429F0C7721204C20 Solid Snail (1994)(Vivid)(NL)[a] MSX NL +02213F25D862D762C424CFAEE217988E Solitaire (1990)(Gohsoft) MSX +BFCD55A6139FC5ACA428D760F66F0D8B Solitaire Royale (1988)(Game Arts)(JP) MSX JP +70F844B9C83D4174025835BF0A1D46B8 Solitaire Royale (1988)(Game Arts)(JP)[a] MSX JP +7F32BCA029CF4C9E0C24735447A68930 Solitaire Royale (1988)(Game Arts)(JP)[a2] MSX JP +400FC87D2BD33865A6B1E89D6EDD18FC Sorcerian Race (19xx)(-)(JP) MSX JP +19EFCDF383B92B3A88871CB9FCEC7895 Space Force (19xx)(-) MSX +FA5F544786E92FEA950351C7243A97BB Space Force (19xx)(-)[a] MSX +AE7F5319BB6CE25820C70978EB970635 Space Manbow (1989)(Konami)(JP) MSX JP +5419BD216FC747D844E7A45982221458 Speed Game (1989)(Soft House) MSX +0449DBDACA702220F5B2136734D872A4 Speed Game (1989)(Soft House)[a] MSX +FA8F924354018511CD0AFA75C1B0F65C Spieel Borse (1987)(Peter Rohr)(DE) MSX DE +6EF8618EEB299760AD7871533B143744 Spiel Borse (1987)(-)(NL) MSX NL +2F12C0B2BFFB967BDFCA46C87B19E05D Spiel Borse (1987)(-)(NL)[a] MSX NL +387420B73920612CFE1E4C6D78826647 Star Sand Story (1990)(D.O.)(JP)(Disk 1 of 6) MSX JP +AA241742AF1B55CAF27DA13628CE53D3 Star Sand Story (1990)(D.O.)(JP)(Disk 2 of 6) MSX JP +303C75937299216BCAFB7D8C95C38715 Star Sand Story (1990)(D.O.)(JP)(Disk 3 of 6) MSX JP +B7EB81C81D4B46D8261C1E282F5D57D7 Star Sand Story (1990)(D.O.)(JP)(Disk 4 of 6) MSX JP +B1E698394DAB3CD8F506EE2FEADED700 Star Sand Story (1990)(D.O.)(JP)(Disk 5 of 6) MSX JP +DBEDBC4E1E824693391E654E0FA37511 Star Sand Story (1990)(D.O.)(JP)(Disk 6 of 6) MSX JP +8C5C5DCE1E7F8C074966E8469B8735B9 Star Virgin (1988)(Pony Canyon)(JP) MSX JP +CC6DD8A09D05808CBE1CA848E12A18A6 Star Virgin (1988)(Pony Canyon)(JP)[a] MSX JP +61EC9164F715BE5EC33A2DC3FC8EB104 Star Virgin (1988)(Pony Canyon)(JP)[a2] MSX JP +6373EC736D571999059A36EA646A25F0 Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2) MSX JP +F25C9920CDE22E72F127EC42209ADC4B Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2)[a] MSX JP +8A7E7FA5436DAE69DEAC7F90745F4529 Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 1 of 2)[a2] MSX JP +7026DF13DF7D7E6CCCD32393F271227D Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2) MSX JP +FDEAB70390FB78B65B6B8D60823384FA Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[a] MSX JP +FD4097FABF650ADBBCAA68AD6C543E32 Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[a2] MSX JP +0433AF0CB2D3CCEDA4C84EB6368F1007 Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[a3] MSX JP +6FC9635340C23314AF29C96055337925 Starship Rendezvous (1988)(Scaptrust)(JP)(Disk 2 of 2)[a4] MSX JP +B9D45C0B89045F4CBFB07069AF2BDBCB Steinzeit (19xx)(Data Beutner KG) MSX +5CC353E8BA4BF00DCEB9A1AEB448287D Strategic Mars (1988)(dB-Soft)(JP) MSX JP +77928A900DA4C4BDD4E34976AFAA475E Strategic Mars (1988)(dB-Soft)(JP)[a] MSX JP +C71B71B1CEBCD00820D7E1E1E1649CCF Strategic Mars (1988)(dB-Soft)(JP)[a2] MSX JP +F6147CA8179B4D71A3C5AFA478479F84 Street Neo Fighter II - The World Warrior (1994)(Neo) MSX +02C59692C9ABC84851019957A5059CE6 Street Neo Fighter II - The World Warrior (1994)(Neo)[a] MSX +741A2D9E339F380C096336060198B95C Street Neo Fighter II - The World Warrior (1994)(Neo)[a2] MSX +9561A934AEBD5AC61D135279B59E874E Street Snatch (1994)(Future Disk) MSX +648F632E2758F523C31B370B6283F07B Street Snatch (1994)(Future Disk)[a] MSX +01254D5BD171B8162CA4970F979C08D4 Sugo Hachi (1989)(MSX Magazine)(JP) MSX JP +5A72D9ACB40E0DF478040016340E8DC2 Suikoden - Tenmei no Chikai. Bandit Kings of Ancient China (1989)(Koei)(JP) MSX JP +62837F75167CE207CE79F56E553D7AEC Suikoden - Tenmei no Chikai. Bandit Kings of Ancient China (1989)(Koei)(JP)[a] MSX JP +C67BECC30840A79463B15AC6182BC514 Sum Shio (1989)(Sum Soft)(JP) MSX JP +0C02D5095873D630C1B20E135CC8C935 Sum the Missile Human (1989)(Sum Soft)(JP) MSX JP +2575AB0D8732DBCD4DD4D930B0780750 Sum the Missile Human (1989)(Sum Soft)(JP)[a] MSX JP +A71E74B0D373D6E93551889822AF9FEE Super Cooks (1989)(Compile)(JP) MSX JP +4294CE32ACF8407F30EC00A87185F6B6 Super Cooks (1989)(Compile)(JP)[a] MSX JP +18FBB79F64909D3D6623A8E677BAC00B Super Daisenryaku. Super Risk (1988)(Micro Cabin)(JP) MSX JP +1284A2F1376FB811166A6FA94D062A55 Super Deform Snatcher - Bonus Stage Disk (19xx)(-)(NL) MSX NL +DD97592701BFD34608E7AFE1F0F858E9 Super Deform Snatcher - Cheater v1.0 (1991)(-) MSX +E001B264653AEB9D06820046C72056C9 Super Deform Snatcher - Patch Disk v2.2 (1994)(Thevma) MSX +EB58AA6C3AD17511C3446AD674D53BA0 Super Deform Snatcher (1990)(Konami)(Disk 1 of 3) MSX +4F0048CF94E818A2E8E44FA851766F05 Super Deform Snatcher (1990)(Konami)(Disk 1 of 3)[a] MSX +DBFF319720564D048D3D7E08C772D71A Super Deform Snatcher (1990)(Konami)(Disk 1 of 3)[SCC+] MSX +28C4A4C3B5E9ABEA6941AD5DAB20BD68 Super Deform Snatcher (1990)(Konami)(Disk 2 of 3) MSX +2CD4AE28421533F766C435AB48EB5AE1 Super Deform Snatcher (1990)(Konami)(Disk 3 of 3) MSX +D52016F6FD2B2262AB21EB881A7B206B Super Deform Snatcher (1990)(Konami)(Disk 3 of 3)[SCC+] MSX +11412DCF25CB7C1B8D2EE4F9A94CE0CC Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3) MSX JP +EC0BE7766B5DA5A1848D7B5A7D4FD6AE Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[a][SCC+] MSX JP +5268389961BA615384688DF611C172CE Super Deform Snatcher (1990)(Konami)(JP)(Disk 1 of 3)[SCC+] MSX JP +AB9290F7FB6063A2F0356876124BF049 Super Deform Snatcher (1990)(Konami)(JP)(Disk 2 of 3)[SCC+] MSX JP +EBCAB0E7E4A7108936A83E79AE0C3688 Super Deform Snatcher (1990)(Konami)(JP)(Disk 3 of 3) MSX JP +585CAF83583815CDAF6FA11578879674 Super Deform Snatcher (1990)(Konami)(JP)(Disk 3 of 3)[SCC+] MSX JP +2626A444FCA6F88B28C20D4F3C767E79 Super Deform Snatcher (1990)(Konami)(JP)(Save Disk) MSX Save Disk JP +EF869BD7D03956FA8A29636289EE4A17 Super Deform Snatcher (1990)(Konami)(Save Disk) MSX Save Disk +C34E0A514A08CC205C0603777D2D5222 Super Deform Snatcher (1990)(Konami)(Save Disk)[a] MSX Save Disk +727AAB190AD5A5BDE372298F76038DAD Super Rambo Special (1985)(Pack In Video)(JP) MSX JP +F219D9CE7A79505D91AB1D95A26D2022 Super Rambo Special (1985)(Pack In Video)(JP)[a] MSX JP +ABFD05930A53E24FD86F45511784661D Super Rambo Special (1985)(Pack In Video)(JP)[a2] MSX JP +6E8B0DE5C4141D7DA9D885073D95A687 Super Rambo Special (1985)(Pack In Video)(JP)[a3] MSX JP +28023607EA367C0821684EBCA096DA73 Super Runner (1988)(Pony Canyon)(JP) MSX JP +67D63D6D1DA61644E5A36B5932C1DAF5 Super Runner (1988)(Pony Canyon)(JP)[a] MSX JP +7BDA3BAED2AC91751212E22F020FA0B9 Super Runner (1988)(Pony Canyon)(JP)[a2] MSX JP +9F3B78530E391FCA31571DD2C7634F0E Super Tritorn (1986)(Xain)(JP) MSX JP +D51A979FC242CE62A29C531B074FC323 Super Tritorn (1986)(Xain)(JP)[a] MSX JP +834A46AE59F0240DF9062B0FF0D0757D Super Tritorn (1986)(Xain)(JP)[a2] MSX JP +A4E0F5307973E899B44C3E3FE877C274 T.D.F. (1988)(Data West)(JP) MSX JP +6E6D71C362331B71FF9056016CF22EA4 T.N.T. (1987)(Infogrames)(FR) MSX FR +2C7D575387CF70F93455E1783D8E4888 T.N.T. (1987)(Infogrames)(FR)[a] MSX FR +6D1E8974B02203E514530699E0A9C7A7 T.N.T. (1987)(Infogrames)(FR)[a2] MSX FR +1EBF167926D36C6E5A78A20C5E61B490 Taiyou no Shinden - Asteka II. Temple of the Sun (1988)(Tokyo Shoseki)(JP) MSX JP +69CF4FF48ADA0C7DAC8371313718728A Taiyou no Shinden - Asteka II. Temple of the Sun (1988)(Tokyo Shoseki)(JP)[a] MSX JP +403AA4009F9DC1A0361266C5B7D0A772 Taiyou no Shinden - Asteka II. Temple of the Sun (1988)(Tokyo Shoseki)(JP)[a2] MSX JP +C4B33204EDDC7EB7D5EDCE67D3BDEF8E Taiyou no Shinden - Asteka II. Temple of the Sun (1988)(Tokyo Shoseki)(JP)[a3] MSX JP +8C992AA9306951FA8F834E4CCC5D33CC Tako and Ika (1992)(Ofuko) MSX +F18A34F54E2FDB02893430D9CE6D42CE Takoika (19xx)(-) MSX +278A6A03D4AB77F6FA83C880E8BA3115 Takoika (19xx)(-)[a] MSX +C2C5B6D6309D0185F6568E059FB1F1A8 Tamanegi (1989)(Onion Software) MSX +B74FA7C832F14B725686D57D69C183CE Tamba (1987)(Yonezawa) MSX +865357249F47AA48320D60CA279825B6 Tantei-X. Return of Detectives X (1990)(Heart Soft)(JP)(Disk 1 of 3) MSX JP +400228DA4F0BE0AD447D8A449B8FCF1C Tantei-X. Return of Detectives X (1990)(Heart Soft)(JP)(Disk 2 of 3) MSX JP +11EAC68F7B0F9171E6FC22A5D175FB44 Tantei-X. Return of Detectives X (1990)(Heart Soft)(JP)(Disk 3 of 3) MSX JP +AFEFCCCD313137FD426CE19352D1923F Tao (19xx)(Studio Esutoria)(JP) MSX JP +94FD0252C323BD98E2F993ABF565B431 Tarot Fortune Telling System v1.7 (1993)(Taracot)(JP) MSX JP +E4FC34591485A45DC3696069681D7AEC Tashiro Masashi no Princess ga Ippai. What Many Princess (1989)(Sony)(JP) MSX JP +1E2FCE3F1286BAB276CDB4B0914FA10F Tashiro Masashi no Princess ga Ippai. What Many Princess (1989)(Sony)(JP)[a] MSX JP +4D9232AA1097D20A1710033E8D28D727 Tashiro Masashi no Princess ga Ippai. What Many Princess (1989)(Sony)(JP)[a2] MSX JP +996B3B020416083156C780EACCB5503A Tashiro Masashi no Princess ga Ippai. What Many Princess (1989)(Sony)(JP)[a3] MSX JP +9460AFAD66BBE5CF6ADD112D8E002E27 Tashiro Masashi no Princess ga Ippai. What Many Princess (1989)(Sony)(JP)[a4] MSX JP +D4FD6C4F4B522F0AD23B28B2DF76E40D Tau Beat (1989)(Champion Soft)(JP)(Disk 1 of 5) MSX JP +9718040BF8FA1F37C7EB6DECB116918D Tau Beat (1989)(Champion Soft)(JP)(Disk 2 of 5) MSX JP +314698AAF9B40C7E980440EC3EEA0AFD Tau Beat (1989)(Champion Soft)(JP)(Disk 3 of 5) MSX JP +266B32EE00BDFD71038833417AAE81FA Tau Beat (1989)(Champion Soft)(JP)(Disk 4 of 5) MSX JP +9BF3973132930A36652596FFF2A9C5A4 Tau Beat (1989)(Champion Soft)(JP)(Disk 5 of 5) MSX JP +2D7838EEB299F01B37CAA3B554308FED Teachers Terror (1993)(Hegega)(NL) MSX NL +58A1E8F20CDC88E0885DB6E177AA1886 Teachers Terror (1993)(Hegega)(NL)[a] MSX NL +258B86F5CB963FCFD2842027EECA5588 Tengu Story (1989)(Alice Soft)(JP)(Disk 1 of 3) MSX JP +0C61EA70D39CC86CC317DF6F850AF8FA Tengu Story (1989)(Alice Soft)(JP)(Disk 2 of 3) MSX JP +01D37D6DAB09A762F507A3F1F7C5D475 Tengu Story (1989)(Alice Soft)(JP)(Disk 3 of 3) MSX JP +39CAA27D876ECDE7D3374100EE4B1CF3 Test Driver (1988)(Charada) MSX +263E79D4C29A96B91313D328F04F16DB Test Driver (1988)(Charada)[a] MSX +4CB977ACB6C7D43CBDFC849BB0F713A8 Testament (1988)(Basho House)(Disk 1 of 2) MSX +FAA88554AE6BC2685773CDA143A819C0 Testament (1988)(Basho House)(Disk 1 of 2)[a] MSX +614A16D29F696957762D6F96F4EBBE97 Testament (1988)(Basho House)(Disk 2 of 2) MSX +AB0A09F25BFE53C31B6E88336C2D86E4 Testament (1988)(Basho House)(Disk 2 of 2)[a] MSX +07F680C82856F9EBA5F0585C620F647E Tetris (1988)(BPS)(JP) MSX JP +5C255C2ECEF1D5F8F38D4BE319318E94 Tetris Disney (1990)(MiChi) MSX +37AA8CD2BD5E5981B593455873E0CD94 Tetris Disney (1990)(MiChi)[a] MSX +8CF546A3634803D2D76E14EF17A2B19E Tetris Master - Operation Maison Ikkoku (1989)(Final Star)(JP) MSX JP +58FB8F6F10F1C5F8505CDB2132AC8A57 Tetris Master - Operation Orange Road (1989)(Final Star)(JP) MSX JP +C9435509FE86003D2AD68ED32B24B147 Tetris Master - Operation Ranma 1-2 (1989)(Final Star)(JP) MSX JP +85AD629F089C6234B79FCB8A48932D63 Tetris Master - Series 1 Ranma 1-2 (1990)(Final Star)(JP) MSX JP +DD2A4E13361CA80D7C0DD57FF23A8DDA Tetris Master (1989)(Final Star)(JP) MSX JP +4FEC100ED678A1E1197BA3E9E1ED564B Tetris v2 (1988)(BPS)(JP) MSX JP +CEC01633D5AB310419D95DA50AAA8E66 Tetrix (19xx)(-)(ES) MSX ES +2EA395EE6C706E2ACE86DAFF9B4D6F22 Tetrix (19xx)(-)(ES)[a] MSX ES +746D18DC70B1F7DFE49CFE5EB0ECA53D Thunderbal (1986)(Eaglesoft)(NL) MSX NL +4A85E88A46B863E6C1D9FD9975B1E32F Thunderbal (1986)(Eaglesoft)(NL)[a] MSX NL +E7C48A8D5F0A036D9DD8B275D7EDF223 Thunderbal (1986)(Eaglesoft)(NL)[a2] MSX NL +131F185C56F1F8E397BA3304056CC4DC Tile Golf (1990)(Nagi-P Soft) MSX +6B3244DE1D219DCD3223F5AE79DACFC9 Timer Ball (1990)(Ascat) MSX +85DFEC5C68D61475D5EF69728C733858 Tir-nan-og (1990)(System Soft)(JP)(Disk 1 of 3) MSX JP +BA2DCDEC2B039EDE2F7F8EF9ECC2A7C2 Tir-nan-og (1990)(System Soft)(JP)(Disk 1 of 3)[a] MSX JP +864FD7316FD0CE5DDA64165AC7E80D47 Tir-nan-og (1990)(System Soft)(JP)(Disk 2 of 3) MSX JP +CCDCF682C4A956AD131BDBF3A7F504FA Tir-nan-og (1990)(System Soft)(JP)(Disk 2 of 3)[a] MSX JP +BE5EB4358FB4376D7C807E7CF9EF6920 Tir-nan-og (1990)(System Soft)(JP)(Disk 2 of 3)[a2] MSX JP +3EB70AED542B9A11C58AF6404AC06C7D Tir-nan-og (1990)(System Soft)(JP)(Disk 3 of 3) MSX JP +BEE66EEAFD5067FA985EDD3DAF1222B4 Tir-nan-og (1990)(System Soft)(JP)(Disk 3 of 3)[a] MSX JP +230ACE8650F1DEA8647529ACFACE2F88 Tokkae Zigsaw (19xx)(Micro Cabin)(JP)[needs MSX-DOS] MSX JP +457EFD27A5F129BC31B39CF95239EECB Topple Zip (1987)(Bothtec)(JP) MSX JP +335961796353BFB859C32CE62172E76D Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 1 of 8) MSX JP +ED0DA44968AC29FD0F17EF99C2C4B814 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 1 of 8)[a] MSX JP +B4450D071E6D62E518E82C364B906B90 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 1 of 8)[a2] MSX JP +4C456186DD39FD04FC78A150CCE8889A Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 2 of 8) MSX JP +49B86AD4A2B97C04B3ACA0485CB4B451 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 3 of 8) MSX JP +3FD61681D2C70EB9149829DF5EF45415 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 4 of 8) MSX JP +96EF775D80BB732D38CBCFC0FC981F3E Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 5 of 8) MSX JP +F4BDCE93D093761F5C2CC6AE6BD2267E Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 5 of 8)[a] MSX JP +666BE19C89F3C58D7DC073A1F5C94BA4 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 5 of 8)[a2] MSX JP +16753193DE5EC141ACFF4A54BDDEE252 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 6 of 8) MSX JP +06FFD57797A3DAF4DDADEEE6E1032205 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 7 of 8) MSX JP +6E9A2091FE71DDC183E63893D239DF57 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 8 of 8) MSX JP +8F1E7D916EEE1D407D252F33FA2B3E95 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 8 of 8)[a] MSX JP +2C42DDA631CC08701B2843F0B3FF7FD0 Toushin Doshi. Toshin City (1990)(Alice Soft)(JP)(Disk 8 of 8)[a2] MSX JP +F460C7E778D8D71B286CDC7F543F91E5 Touwtrekken - Tug-of-War (19xx)(Smeekes)(NL) MSX NL +6F163C39F43BBC2EB35813A7360C0F45 Touwtrekken - Tug-of-War (19xx)(Smeekes)(NL)[a] MSX NL +57CB1BD3752643208196E2FCAA1589D9 Touwtrekken - Tug-of-War (19xx)(Smeekes)(NL)[a2] MSX NL +575344D5AED8156B0ADB6A3495EBC255 Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 1 of 3) MSX JP +92EEC1E762640B9F0D095E658C670806 Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 1 of 3)[a] MSX JP +014A9E51741B48E5307B163C7A94BC87 Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 2 of 3) MSX JP +FB5866100AB920196C41A3AF3D405F35 Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 2 of 3)[a] MSX JP +F4B9CF7D28BDC577EF1DC845A54EA129 Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 2 of 3)[a2] MSX JP +CE9B2D26C966750F04644F25D511184D Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 3 of 3) MSX JP +26FEF23754432D28DED8A20FDAF904DC Tower of Cabin, The (1992)(Micro Cabin)(JP)(Disk 3 of 3)[a] MSX JP +9B3665C2EE2A8C1FD3C747011DACF556 Treasure of Usas, The (1987)(Konami)(JP) MSX JP +D168CFC1394687FE8C55303CA0084539 Treasure of Usas, The (1987)(Konami)(JP)[a] MSX JP +D1A56EF7168081B522742401DBA7C746 Treasure of Usas, The (1987)(Konami)(JP)[a2] MSX JP +CD1AA710766ED852C4854998E90F324E Triathlon James Bond 007 (1987)(Philips)(NL) MSX NL +0017EFA6088426F48AC67F11975D11F5 Triathlon James Bond 007 (1987)(Philips)(NL)[a] MSX NL +95317FBFED3D68B63B1200E836EE9E92 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 1 of 4) MSX JP +B779DD55092CC554CBE2DD3B26C5F481 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 1 of 4)[a] MSX JP +E10EF849302E819468B4F995D60D0216 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 2 of 4) MSX JP +205DE96B43705142B9D3195402CD14C3 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 2 of 4)[a] MSX JP +91FFC85A15F75CF1FEFC6F3917EE5476 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 3 of 4) MSX JP +53D541A9C2F28E732AF56E1045C511F6 Tritorn II - Road of Darkness (1989)(Xain)(JP)(Disk 3 of 4)[a] MSX JP +D69B855368B80F74D8864CF36B353090 Trojka (1992)(BCF)(NL) MSX NL +9D65F868434517DA25258CBC792E7D74 Trojka (1992)(BCF)(NL)[a] MSX NL +85F247A150751D40D5F80E54581E4E11 Troxx (1993)(Anma)(NL) MSX NL +98234D518F869612F1B63EDD9F987B1B Troxx (1993)(Anma)(NL)[a] MSX NL +531C97D192615FE87247D18F4D3E1814 Tucs, The (1989)(MSX Magazine)(JP) MSX JP +B6EF13A6FFA9EA4C5EFE057AAA53329C Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP) MSX JP +78B04FCF2492C03533393A8503C4921B Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP)[a] MSX JP +15B5446F295A305B176E4BB90A8CB9C2 Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP)[a2] MSX JP +936B38C6F9B8CD84E7C3C216B84A82BF Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP)[a3] MSX JP +F7EA5A697AA8E9556AD3C47F8F138FB0 Tw Cup (19xx)(Atsic)(JP) MSX JP +897766A7A3C1D257096075B87427A3D1 UHF Painter, The (1992)(Enigma-Soft)(IT) MSX IT +24AB3660FDFF27B2091C888503DB9E31 Ultima I - The First Age of Darkness (1986)(Pony Canyon)(JP) MSX JP +B3FA199A33D434819A09EC603D30D432 Ultima I - The First Age of Darkness (1986)(Pony Canyon)(JP)[a] MSX JP +DDDC192242692B255481CDF02AD9BE07 Ultima IV - Quest of the Avatar (1987)(Pony Canyon)(JP)(Disk 1 of 2) MSX JP +486B7E8A8FE02A34EA38C0EBE87AE63A Ultima IV - Quest of the Avatar (1987)(Pony Canyon)(JP)(Disk 2 of 2) MSX JP +07A3E9DB2A4699EF12C02840EEA79561 Ultima IV - Quest of the Avatar (1987)(Pony Canyon)(JP)(Disk 2 of 2)[a] MSX JP +242209E46CCD5209276D4B1D70495A76 Undeadline (1989)(T&E Soft)(JP) MSX JP +189798CFE5CAAE3D1AE6123F8B016BEF Undeadline (1989)(T&E Soft)(JP)[a] MSX JP +75C067B58DC3380D7D4BECA8CE0EF698 Undeadline (1989)(T&E Soft)(JP)[a2] MSX JP +47794387E779CA93C0608C7BC6F8707E Urabyoshi (19xx)(Masashi Tanaka)(JP) MSX JP +06101B3E217D0329B7FB7AEC670BFF41 Uranai Sensation. Fortune Teller (1988)(Konami)(JP) MSX JP +710DA684D0A1EC9E36FE27A6F197C237 Uranai Sensation. Fortune Teller (1988)(Konami)(JP)[a] MSX JP +2E85CA8D4E938ABD91380B7695EBE8E3 Urotsuki Doji (1990)(Fairytale)(JP)(Disk 1 of 4) MSX JP +FD7B347590EC5572B422AB70003B71F2 Urotsuki Doji (1990)(Fairytale)(JP)(Disk 1 of 4)[b2] MSX JP +7EC0FCE80E2409BF265395CB352EDE7B Urotsuki Doji (1990)(Fairytale)(JP)(Disk 2 of 4) MSX JP +93CAAC3378C77D37FC703ACBDC2200AC Urotsuki Doji (1990)(Fairytale)(JP)(Disk 2 of 4)[a] MSX JP +4117D3053E6495C755256E5A26A1B9B5 Urotsuki Doji (1990)(Fairytale)(JP)(Disk 3 of 4) MSX JP +2D3F3816F9CB4F44BC2D887260A6B927 Urotsuki Doji (1990)(Fairytale)(JP)(Disk 3 of 4)[a] MSX JP +1720D14E80B36B2FCDFAA9627D3BE1A1 Urotsuki Doji (1990)(Fairytale)(JP)(Disk 4 of 4) MSX JP +3B5E4C017A8E25FC7B9A3C0576605C9E Urusei Yatsura - Koi no Survival Birthday (1987)(Micro Cabin)(JP) MSX JP +7C8A1D52BF5E1F7DEB7ABC8C9216CF4F Urusei Yatsura - Koi no Survival Birthday (1987)(Micro Cabin)(JP)[a] MSX JP +0F24A630F084641DF2083DB4A1045961 Usa Jong. Babi in the World (1989)(Compile)(JP) MSX JP +0070E6080613D557AB808361EFE1E3B1 Usa Jong. Babi in the World (1989)(Compile)(JP)[a] MSX JP +2109F4C744E0B03846713AF7FE31F126 Uwasa (19xx)(-) MSX +6CC37F82C7EC1EF83804E566FF29D278 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 1 of 4) MSX JP +E7C2029FCE36C4007CD400D65FA85D38 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 1 of 4)[a] MSX JP +995E57AC4DC4509820902C59B786C41A Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 2 of 4) MSX JP +DC55D29DB28F15FAEC3C0C5C3A81E0D6 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 2 of 4)[a] MSX JP +0F4F9836814C90ED022266EF8AC7CD4B Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 2 of 4)[a2] MSX JP +7FA8489D7D8971E1BA116BF5EA169A12 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 3 of 4) MSX JP +1F82CC151582AD5132F981408C77DF31 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 3 of 4)[a] MSX JP +46479DCDD00105986EEE1A75331AD8FD Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 4 of 4) MSX JP +DC9FE881733C77F12A9E8D320F792242 Valis - The Fantasm Soldier II (1989)(Telenet Japan)(JP)(Disk 4 of 4)[a] MSX JP +65FC535FD8B558D534C7EFD6CD3070D2 Vectron (1989)(Parallax)(NL) MSX NL +9949A39F25DF0A508B57CB9E95616D11 Vectron (1989)(Parallax)(NL)[a] MSX NL +7AF1892EF929776B401A660F314FD51B Veroveraar (19xx)(-)(NL) MSX NL +6D864CF6AE4E6827BA697F8DD54C72F3 Veroveraar (19xx)(-)(NL)[a] MSX NL +4045C3332C51C567B1391916C329C2AE Warau Salesman (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +7D7BCF7AD01359EF21E0C264923FB199 Warau Salesman (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +A4AFEAE113A1C39A4CB52EA41B38DBE6 Warning (1988)(Cosmos Computer)(JP) MSX JP +1DC862A2F27E2B5C1AF1AF47864DF153 Watasiwo Golfni Tsuretette! Play the Golf with Me (1991)(Fairytale)(JP)(Disk 1 of 5) MSX JP +8A16F01BCFD62A030E6C0C9710CB9F9F Watasiwo Golfni Tsuretette! Play the Golf with Me (1991)(Fairytale)(JP)(Disk 2 of 5) MSX JP +643E8B330E94B5665017485719E595C7 Watasiwo Golfni Tsuretette! Play the Golf with Me (1991)(Fairytale)(JP)(Disk 3 of 5) MSX JP +0DA00273C647208B844873EB08C562AB Watasiwo Golfni Tsuretette! Play the Golf with Me (1991)(Fairytale)(JP)(Disk 4 of 5) MSX JP +7923FF2ECBF7B6192E21D6DBC122BE05 Watasiwo Golfni Tsuretette! Play the Golf with Me (1991)(Fairytale)(JP)(Disk 5 of 5) MSX JP +E19614494CA338963F3DC4061EB628A9 Wellen (1997)(Frieve) MSX +6ADAE29F233B744A3AA902859C751D40 Wellen (1997)(Frieve)[a] MSX +1779344BE08F04BA43BFC267C626B3AB What's Michael (1989)(Micro Cabin)(JP)(Disk 1 of 2) MSX JP +94D4E9051B47E5B825972E50CF76C899 What's Michael (1989)(Micro Cabin)(JP)(Disk 2 of 2) MSX JP +DA463B2D7AE269DA6BB08E9B73E7B2D9 Whipple (1992)(Pastel Hope)(JP) MSX JP +36029D74EECF521F04C387846BEE3256 Wing Man Special (1988)(Enix)(JP)(Disk 1 of 2) MSX JP +3971785042789912DCB84630DDC611E0 Wing Man Special (1988)(Enix)(JP)(Disk 1 of 2)[a] MSX JP +FBBA841E57A412C8AD78BEA9DFEC4012 Wing Man Special (1988)(Enix)(JP)(Disk 2 of 2) MSX JP +144359E56561A039BEFE7F27984B7FB0 Winning Solution (1990)(Cosmos Computer)(JP)(Disk 1 of 2) MSX JP +BFDACA661629FB072D40142044919C7A Winning Solution (1990)(Cosmos Computer)(JP)(Disk 2 of 2) MSX JP +6C0336C4F3AAC783189335EEA54D63F1 Wiz Kids (1991)(-)(JP) MSX JP +ADE2EB5F9C50E8CB88416EB6AF6CE311 Wizardry - Proving Grounds of Mad Overload (1987)(ASCII)(JP)(Disk 1 of 2)(Game Disk) MSX Game Disk JP +085DFEEEBD8B669AD1BCCA55E3CEE300 Wizardry - Proving Grounds of Mad Overload (1987)(ASCII)(JP)(Disk 1 of 2)(Game Disk)[a] MSX Game Disk JP +33C2D161ACA5A5F667306D020438726A Wizardry - Proving Grounds of Mad Overload (1987)(ASCII)(JP)(Disk 1 of 2)(Game Disk)[a2] MSX Game Disk JP +16CE19BD31B0E65CFCE97C727B69AFD5 Wizardry - Proving Grounds of Mad Overload (1987)(ASCII)(JP)(Disk 2 of 2)(User Disk) MSX User Disk JP +8068C42FCA7422C4BA06B8B4BFE29ED4 Wonderful Adventures of a Little Princess (1987)(Champion Soft)(JP) MSX JP +222A5081DA5BDC9946E06EDEB4D954F4 Woody Poco (1987)(dB-Soft)(JP) MSX JP +DFB1514F32327A7BBDA56FE467F8AEBA Woody Poco (1987)(dB-Soft)(JP)[a] MSX JP +EEA78977D7273494FFCDD00847B24F1B Word Up (1988)(FSS) MSX +D8A5B0505F0EBF7DC051C0EE2363DD45 Word Up (1988)(FSS)[a] MSX +316BC20D04E344F18671E34A7E6D09AD World Golf (1986)(Enix) MSX +0EB31E16970F19EA7A645CBFEE4C0548 World Golf (1986)(Enix)(JP)[a] MSX JP +FB54741E4A00F16E1E843B4B6EDF9D57 World Golf (1986)(Enix)(JP)[a2] MSX JP +E0AAF2A0E9616AAE3F2E5EA2494A1981 World Golf (1986)(Enix)(JP)[a3] MSX JP +5E46D97B20113BCF9209669C2B3F2F4F World Golf II (1988)(Enix)(JP)(Disk 1 of 2) MSX JP +0F2333881963CEB2B4D89CB2B8E0299D World Golf II (1988)(Enix)(JP)(Disk 1 of 2)[a] MSX JP +D256D94937B0D78AD47FA915A594373E World Golf II (1988)(Enix)(JP)(Disk 1 of 2)[a2] MSX JP +7F392FA56A50B16B48BF4C39B1443702 World Golf II (1988)(Enix)(JP)(Disk 2 of 2) MSX JP +577F917DDCF2AD4844E0A3895A047DD0 World Golf II (1988)(Enix)(JP)(Disk 2 of 2)[a] MSX JP +9E5F6FFF0DF487D64309A2D7131BED89 World Golf II (1988)(Enix)(JP)(Disk 2 of 2)[a2] MSX JP +7A37D1F93AECC6CFB46D738BB3955BA6 X Mas Quarrel (19xx)(Titansoft) MSX +833B7808CCFA820F00BD48366B1CB10C X Mas Quarrel (19xx)(Titansoft)[a] MSX +BC1CD40D59F11D69CB2C55A1CC55B598 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 1 of 3)(Opening Disk) MSX Opening Disk JP +428A840E988D71893434C540BCE13DE3 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 1 of 3)(Opening Disk)[a] MSX Opening Disk JP +B5C0E183409E57565ED7D982CD81D989 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 2 of 3)(Game Disk 1) MSX JP +015D8DD074F33FC2EEC02DAE7EB94671 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 2 of 3)(Game Disk 1)[a] MSX JP +EA5EDE9E26462B6128D5FE494A8C94D9 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 2 of 3)(Game Disk 1)[a2] MSX JP +3FE8D98EE3258EE3EEB125A16B9FB615 Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 3 of 3)(Game Disk 2) MSX JP +3F253245136024B0EA18105CB17534AA Xak - The Art of Visual Stage (1989)(Micro Cabin)(JP)(Disk 3 of 3)(Game Disk 2)[a] MSX JP +BA9C12871185684D69D405B2398474B8 Xak - The Art of Visual Stage v2 (1989)(Micro Cabin)(JP)(Disk 2 of 3)(Game Disk 1) MSX JP +0CEEE792142599C69F7F7AE01E295EB2 Xak - The Art of Visual Stage v2 (1989)(Micro Cabin)(JP)(Disk 3 of 3)(Game Disk 2) MSX JP +7EBDA5F55A55B05912DF7F760D485747 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 1 of 6)(Opening Disk) MSX Opening Disk +020309E649D9BCE6583E28B25A87B77C Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 2 of 6)(Game Disk 1) MSX +FEBA20A20364D012E19BC2F68FFC8FBA Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 2 of 6)(Game Disk 1)[a] MSX +5D8649FF74DF97ADF527DDE4A4E8A916 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 3 of 6)(Game Disk 2) MSX +9A36474D7B0B2EF00F28283C2F405DC6 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 4 of 6)(Game Disk 3) MSX +AEE91E78986140E188BC31FC89C124A7 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 5 of 6)(Game Disk 4) MSX +B73C7268587826B542C3592EB8CB64AD Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 5 of 6)(Game Disk 4)[a] MSX +3262B053565572A20FE16B1296EEDE29 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(Disk 6 of 6)(User Disk) MSX User Disk +E962BE7CC4A1549C1D7C588600229683 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 1 of 6)(Opening Disk) MSX Opening Disk JP +616D050D2515F6F83DCB40C7DF208008 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 1 of 6)(Opening Disk)[a] MSX Opening Disk JP +AA984DDC872F8AE1B3EF00DED27FDFC5 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 1 of 6)(Opening Disk)[a2] MSX Opening Disk JP +225BE8307AE186EB1CBEB4577F3BF08A Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1) MSX JP +273BCF6F7E375F085CDD02964ADC6F6A Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1)[a] MSX JP +5F29B87CAA28DBD50B19E4B7057053B7 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1)[a2] MSX JP +A0CDCA52C5582573EBD909EA18341E90 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1)[a3] MSX JP +F4D9FED3832FBB07ADD32973A7608B32 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 2 of 6)(Game Disk 1)[a4] MSX JP +12257F0F42AE0BB863764632A30D2896 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 3 of 6)(Game Disk 2) MSX JP +57F18122C24F59BA3422BB1641435221 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 3 of 6)(Game Disk 2)[a] MSX JP +F6226BB1D397EA380D590D2022899476 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 3 of 6)(Game Disk 2)[a2] MSX JP +53DB43329475BF4C743D85C1695DF7A6 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 3 of 6)(Game Disk 2)[a3] MSX JP +0151DEB499DA77BC6F5DA2BB68D82B4F Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 4 of 6)(Game Disk 3) MSX JP +7C045DE8EC0E73688FD52892508F107C Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 4 of 6)(Game Disk 3)[a] MSX JP +BCEA363F55D5836F336EA875966414A1 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 4 of 6)(Game Disk 3)[a2] MSX JP +4AF4B0174B8046E5387542431FA27FF6 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 4 of 6)(Game Disk 3)[a3] MSX JP +BC69B9ED2ABB8CA16A633ED0E8A29C2D Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 5 of 6)(Game Disk 4) MSX JP +A1AE01277248218D0516DE67F6D06D71 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 5 of 6)(Game Disk 4)[a] MSX JP +5D0A337BA998C4D4332E8CE0FD1B3A67 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 5 of 6)(Game Disk 4)[a2] MSX JP +03C43E40F04323FB827B1336223EC71B Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 5 of 6)(Game Disk 4)[a3] MSX JP +6CAE496CD8CD2FB9BAD8FB048657BDD2 Xak II - The Rising of the Red Moon (1990)(Micro Cabin)(JP)(Disk 6 of 6)(User Disk) MSX User Disk JP +75336135466D17B1BEA87BB43ECD0F77 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 1 of 4)(Opening Disk) MSX Opening Disk +49796D62885113CE8AE1F6F61C6D08C0 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 1 of 4)(Opening Disk)[a] MSX Opening Disk +B14B88F3D45F58EAFF26F7DCC49BF901 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 2 of 4)(Cabin Times) MSX Cabin Times +722E2E38178D7A358F6BFB8F84BF5ECA Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 2 of 4)(Cabin Times)[a] MSX Cabin Times +A704AAF68C26C68FB97F51AB83882CEF Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 3 of 4)(Game Disk 1) MSX +9A561E72A97052387C89C94C0FBC6644 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 3 of 4)(Game Disk 1)[a] MSX +D3BE49916C452017BD6024C402796875 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 4 of 4)(Game Disk 2) MSX +E2F8F03F54D8C82E0644A0912D99D898 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(Disk 4 of 4)(Game Disk 2)[a] MSX +DE22DE61B6DA476B9C06441C19F6A0E5 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk) MSX Opening Disk JP +AF3652F6BE48CE46A0B785FCC138AC22 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 1 of 4)(Opening Disk)[a] MSX Opening Disk JP +8E0928BB4D11B0A3B252B41ACC312D01 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 2 of 4)(Cabin Times) MSX Cabin Times JP +FBDCCBDC1FD48C6172095C44A36053AA Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 1) MSX JP +D2F1C219F4F2960F444B85EEA1710963 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 3 of 4)(Game Disk 1)[a] MSX JP +ADD9ADCBE83FAC67D3B31C1502683C79 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)(Disk 4 of 4)(Game Disk 2) MSX JP +EC9A397224D3590C2552C6AE1E165504 Xak III - The Tower of Gazzel (1991)(Micro Cabin)(JP)[4 disks] MSX JP +D7767DCD563CBCF972EA3B44C081529C Xevious - Fardraut Saga (1988)(Namcot)(JP) MSX JP +C1369C2974EBA1C2D93CA5EF1098FDF8 Xevious - Fardraut Saga (1988)(Namcot)(JP)[a] MSX JP +2EE2E4384843E270B0AF76CF147EFEC6 X-Na (1991)(Fairytale)(JP)(Disk 1 of 5) MSX JP +777FD9D0FAC9E823C3616DDC732C6BF0 X-Na (1991)(Fairytale)(JP)(Disk 1 of 5)[a] MSX JP +4A237C43C471FD763A4C568917ACD9DA X-Na (1991)(Fairytale)(JP)(Disk 2 of 5) MSX JP +D921B9350ED7B290B2ED75F7F95CCEC8 X-Na (1991)(Fairytale)(JP)(Disk 2 of 5)[a] MSX JP +8ABBC8FB931FE6832483DC5224C6422D X-Na (1991)(Fairytale)(JP)(Disk 3 of 5) MSX JP +831F97CAFE4AA0C55F789511800F5A30 X-Na (1991)(Fairytale)(JP)(Disk 4 of 5) MSX JP +5B7CC6D72A461A59B6E41EC6A09934C0 X-Na (1991)(Fairytale)(JP)(Disk 5 of 5) MSX JP +FC3C90EE344F1F9BA5D1E883691DBAAD XYZ (1987)(HAL Laboratory)(JP) MSX JP +C267A5914B423ACA5C34FD3BBF771B02 XYZ (1987)(HAL Laboratory)(JP)[a] MSX JP +A3B6BC6465C108F44E77F7C12E2E4569 XYZ (1987)(HAL Laboratory)(JP)[a2] MSX JP +AFBF4F81DE67116ED77C97EA3E52C670 XZR (1988)(Telenet Japan)(JP)(Disk 1 of 2) MSX JP +70D03023F5F03BEDCC3B20D6A77FE3EC XZR (1988)(Telenet Japan)(JP)(Disk 1 of 2)[a] MSX JP +EA9D43E60CA800A4673AA54F60B42030 XZR (1988)(Telenet Japan)(JP)(Disk 1 of 2)[a2] MSX JP +8276A145B4C59B3E1C062E93EFAA86B5 XZR (1988)(Telenet Japan)(JP)(Disk 2 of 2) MSX JP +D913427FE3E08F0DE0A80A13C614CBB3 XZR (1988)(Telenet Japan)(JP)(Disk 2 of 2)[a] MSX JP +18E6700FD5884C586DDB5F6B4E1A4E07 XZR (1988)(Telenet Japan)(JP)(Disk 2 of 2)[a2] MSX JP +2D47B7ED13579E8C36B35E004BA821DB XZR II (1988)(Telenet Japan)(JP)(Disk 1 of 2) MSX JP +82D502D4DF6EEB2E27E1F6F607AC4EF6 XZR II (1988)(Telenet Japan)(JP)(Disk 1 of 2)[a] MSX JP +535047ABA21FCDA007A930F6526CD68D XZR II (1988)(Telenet Japan)(JP)(Disk 1 of 2)[a2] MSX JP +507E372CD2D2DF2F24D27AE467A089E5 XZR II (1988)(Telenet Japan)(JP)(Disk 2 of 2) MSX JP +45D844F135D6953304152C539DC6F971 XZR II (1988)(Telenet Japan)(JP)(Disk 2 of 2)[a] MSX JP +EDECE5F92824DC6398918126E83DE9C5 XZR II (1988)(Telenet Japan)(JP)(Disk 2 of 2)[a2] MSX JP +90196534BFECF73E445FF56942E94731 Yajiuma Pennant Race (1989)(Victor)(JP) MSX JP +E3E54C8D232BDD203D11BEC2BE20CC00 Yaksa (1987)(Wolfteam)(JP) MSX JP +B8594C01B6CC7F42657EA646F0BE4D54 Yaksa (1987)(Wolfteam)(JP)[a] MSX JP +3E3AC4B968A5B8B28A9EEB732B4D8C5E Yakyuudo (1989)(Nihon Create)(JP)(Disk 1 of 2) MSX JP +04C843144DF364A6891C4442D4ADBB43 Yakyuudo (1989)(Nihon Create)(JP)(Disk 2 of 2) MSX JP +E7B9AF1428A927A9888B38DA88D5C9B5 Yakyuudo II (1990)(Nihon Create)(JP)(Disk 1 of 4) MSX JP +AB5FCA4E9ECEEA125098EDD6BD455DDC Yakyuudo II (1990)(Nihon Create)(JP)(Disk 2 of 4) MSX JP +58F9A642D5A14883B78DCC34B1CBC73D Yakyuudo II (1990)(Nihon Create)(JP)(Disk 3 of 4) MSX JP +64A1DD0953645CB5394CFD7E5DF636E2 Yakyuudo II (1990)(Nihon Create)(JP)(Disk 4 of 4) MSX JP +C53B5968960645BC05C1A99CC479208C Yakyuudo II Databook '90 (1990)(Nihon Bussan)(JP) MSX JP +D89813493404CB1D50D83871AECAC4DF Youma Kourin (1989)(Nippon Dexter)(JP) MSX JP +ADB03C8355F8F4ED884E20F4574500B1 Youma Kourin (1989)(Nippon Dexter)(JP)[a] MSX JP +EFF412A4F511D40AF515D525975D3FA8 Youma Kourin (1989)(Nippon Dexter)(JP)[a2] MSX JP +BAC59B4F9A6B32B95CAEDBD2D81A90BA Yuurei Kun 2. Mr Ghost 2 (1989)(System Sacom)(JP) MSX JP +8D3E00360FED051EC14210DD17E6E240 Yuurei Kun 2. Mr Ghost 2 (1989)(System Sacom)(JP)[a] MSX JP +94D71FE53B96880AA5B7C90ECEE30CF6 Yuurei Kun. Mr Ghost (1989)(System Sacom)(JP) MSX JP +F1CED3FBB5E939A64A36FE0D0439340D Yuurei Kun. Mr Ghost (1989)(System Sacom)(JP)[a] MSX JP +22EC654C5134321846C596888C9C900A Yuurei Kun. Mr Ghost (1989)(System Sacom)(JP)[a2] MSX JP +673776A078E812E2174081EF9E003C59 Zanac Metalica v2 (1988)(Pony Canyon)(JP) MSX JP +826EA95AA775672046FCC83D07473418 Zanac Metalica v2 (1988)(Pony Canyon)(JP)[a] MSX JP +60BA6F4ABA9D97248C494270B91ED938 Zanac-Ex (1986)(Pony Canyon)(JP) MSX JP +19E92243E27AD577DC33406FE2B0ABDA Zanac-Ex (1986)(Pony Canyon)(JP)[a] MSX JP +FB4E9A98BFDAC5751096D7F4B6E75DF4 Zatsugaku Olympic (1988)(Hard)(JP) MSX JP +831DD56C98460568E49F3734E1694271 Zoids (1988)(Toshiba-EMI)(JP) MSX JP +02F4E98C52DE1F6A815C8E19DF27F8B9 Zoids (1988)(Toshiba-EMI)(JP)[a] MSX JP +66DCC1B2DFF6A6030774035BA170CFF0 Zombie Hunter (1988)(Hi-Score Software)(JP) MSX JP +53A05282238653DA957B925FD91BDEEA Zombie Hunter (1988)(Hi-Score Software)(JP)[a] MSX JP +CC67A380BBD636DF1EEFB483550327A0 Zoo (1987)(Philips)(NL) MSX NL +3F916BFCAF32040AE6CF3114E81822DB Zoo (1987)(Philips)(NL)[a] MSX NL +565C44D04E293E295A83B5BD211BA95C Zoo (1987)(Philips)(NL)[a2] MSX NL +81B86C09F167F92679977D247745DBE4 Zoto (1987)(Scorpionsoft)(NL) MSX NL +BFF6858ADAEE4B359F99B3E3500F8A63 Zoto (1987)(Scorpionsoft)(NL)[a] MSX NL +83D4EE48579F5ADDD67E828C7A4E29EB Zoto (1987)(Scorpionsoft)(NL)[a2] MSX NL +298972A41A499CBB5B7B0D0727717E1B Zowazo World. Zaworzo Robot Construction (1989)(MSX Magazine)(JP) MSX JP +1D19B39B548983CD36640AE993768FB8 Zowazo World. Zaworzo Robot Construction (1989)(MSX Magazine)(JP)[a] MSX JP +6E497F233AC1A4E88D004012F7E164B4 Zowazo World. Zaworzo Robot Construction (1989)(MSX Magazine)(JP)[a2] MSX JP +6BF94327CF83CB9DB11BC4CE0AA95FA5 Zowazo World. Zaworzo Robot Construction (1989)(MSX Magazine)(JP)[a3] MSX JP +8D0060058766FCE56F7A9E733A6C3C89 Zynos on the Adventure Islands (1991)(Grischasoft) MSX +2C458AA051AE637E863EF588AF48FED4 Zynos on the Adventure Islands (1991)(Grischasoft)[a] MSX +145F08DA1CEE77FF3D9F24AB525F1F68 Zynos on the Adventure Islands (1991)(Grischasoft)[a2] MSX +6050DE64040902E4DADE1BCCF66F6F65 ZZZ-UNK-KANA MSX +84CAA52A5930E7F48F2C9342B978EDEF ZZZ-UNK-LOGIN MSX +A71BE938D94DC0EE8B841E11AC14B4B9 ZZZ-UNK-RYUZI1 MSX +9C748ABE64A76589E46B6A2348F61DFB ZZZ-UNK-SUPER BASEBALL 2[DISK 2 OF 4] MSX +F8F5715C1C6CD428BB662CC9E60E61C8 ZZZ-UNK-ULTIMA IV[DISK 2] MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Magazines (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 10:59:23 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +F57A5ECB6C40FD953DF490DFB1A61CD6 B Draken - Issue 05 (1993)(Draken Club)(ES)(Disk 1 of 2)[o][b] MSX ES +5BD02E78F700FEB9C0D415611D10AD41 B Draken - Issue 05 (1993)(Draken Club)(ES)(Disk 2 of 2)[o][b] MSX ES +BDB3AAC147F830F648AB2A17FA1A7C5A B Quasar - Issue 05 (1991)(First Class Software)(NL)[o][b] MSX NL +CB6EC9E7A6D3D70DF38EEAB3F1AD0420 B Sunrise Magazine - Issue 17 (1995)(Techno Crew)[o][b] MSX +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +BC3293D73A384FBBC5F4CCCB7B26FC24 Best of Disc Station, The (19xx)(Compile)(JP) MSX JP +F6416E93F61B4FA7135149C0B82FECA8 Circle Pamphlet - Issue 02 (1994)(Syntax) MSX +AA9748BAF91AA10043852DD9C5037E7E Disc Station - Issue 00 (1988)(Compile)(JP) MSX JP +0FA1D0F601D3CCBD1577314E6584BAA6 Disc Station - Issue 01 (1988)(Compile)(JP) MSX JP +FF73A64306BC3BAC1005CEB308657504 Disc Station - Issue 02 (1988)(Compile)(JP)(Disk 1 of 2) MSX JP +82E36B6D0CB51EF03699CD912721051F Disc Station - Issue 02 (1988)(Compile)(JP)(Disk 2 of 2) MSX JP +03ADBF647E59FA97FE09B35708DDA30E Disc Station - Issue 03 (1989)(Compile)(JP)(Disk 1 of 2) MSX JP +65E522CDDC38FF40A457E1C5967195AC Disc Station - Issue 03 (1989)(Compile)(JP)(Disk 2 of 2) MSX JP +42D7DA2405D4A493AD74EC878C16D794 Disc Station - Issue 04 (1989)(Compile)(JP)(Disk 1 of 2) MSX JP +7BA8C187A1CBF2E277062A5E7F79959B Disc Station - Issue 04 (1989)(Compile)(JP)(Disk 2 of 2) MSX JP +1B4020097876B74AA886710A7D2C8422 Disc Station - Issue 05 (1989)(Compile)(JP)(Disk 1 of 2) MSX JP +2C556C2614B4EAC7301FCECA644BA468 Disc Station - Issue 05 (1989)(Compile)(JP)(Disk 2 of 2) MSX JP +896DF09C6DE8C6A528E01AAA13D1F695 Disc Station - Issue 06 (1989)(Compile)(JP)(Disk 1 of 3) MSX JP +660AD0F23F5FF73CC44AC4EE334E05B7 Disc Station - Issue 06 (1989)(Compile)(JP)(Disk 2 of 3) MSX JP +56F996F57F44142B4CAF644A6C1084A9 Disc Station - Issue 06 (1989)(Compile)(JP)(Disk 3 of 3) MSX JP +7AF64A2328C06C8BE0C172CD9306F449 Disc Station - Issue 07 (1989)(Compile)(JP)(Disk 1 of 2) MSX JP +F0C99B6A9D72F23CDDE80755609CF2FB Disc Station - Issue 07 (1989)(Compile)(JP)(Disk 2 of 2) MSX JP +00C7FAF2598B29AAEEF522667A9B5380 Disc Station - Issue 08 (1989)(Compile)(JP)(Disk 1 of 3) MSX JP +D1280A941ADB6855A601A2532A55BF32 Disc Station - Issue 08 (1989)(Compile)(JP)(Disk 2 of 3) MSX JP +28B6B1C8EF899829431394B71C520274 Disc Station - Issue 08 (1989)(Compile)(JP)(Disk 3 of 3) MSX JP +A3F67BC181B34BFFC3A70AF50DAA30E8 Disc Station - Issue 09 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +15DF1D280BFF4ECC3D89B07BA920445E Disc Station - Issue 09 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +BA1638999FAAB26ECC9500D0204E784F Disc Station - Issue 10 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +E28B193CE068BB63707B929423556484 Disc Station - Issue 10 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +CFB49F0C3DDF92CE14351BC78979FB48 Disc Station - Issue 11 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +10143EFFEA3040A129EBFB988C9BF5B0 Disc Station - Issue 11 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +FC141AFDA6A41F6CFAFB7D960E81A492 Disc Station - Issue 12 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +8AB8EFCA0A4D70921F746FDE453B22B4 Disc Station - Issue 12 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +C88E474C643FA373DB3FACA1484E00A8 Disc Station - Issue 13 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +842A04F7A8615EA1A4DFDF032A7758B0 Disc Station - Issue 13 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +47112B31B519FBB6B6EDE1618C21ABD1 Disc Station - Issue 14 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +946C68F8B3DB3FF494E78FC81C59AE1C Disc Station - Issue 14 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +3B4C5F9B95C2DB78EA74844758898434 Disc Station - Issue 15 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +8C74CEF55814C17326B275B56DDDA9C6 Disc Station - Issue 15 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +CB0F10DFF3A72A343657A31C52AD9CBD Disc Station - Issue 16 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +9271E4958E2F7EE4B96A8A3182EDB410 Disc Station - Issue 16 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +E93C2496B84C62B45AF4685798BC7268 Disc Station - Issue 17 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +715C0BFC21F84EE86B5986100720F9D5 Disc Station - Issue 17 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +006A3FEDBAB37660C0C62726AFB63B54 Disc Station - Issue 18 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +91FB8913D460FDDB5C5C73B42BCB2DE3 Disc Station - Issue 18 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +3FDB0F1766CC3FCCA028931684FB3C54 Disc Station - Issue 19 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +72AD63C01498694C433F0A15AAB54931 Disc Station - Issue 19 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +F21CCE3715AFBD8258AFE0839B08DB38 Disc Station - Issue 20 (1990)(Compile)(JP)(Disk 1 of 3) MSX JP +88DBCD484518A4367D157EA8E2FB7040 Disc Station - Issue 20 (1990)(Compile)(JP)(Disk 2 of 3) MSX JP +9D5E54CC598D85A6AB2F21D6773FFDE1 Disc Station - Issue 20 (1990)(Compile)(JP)(Disk 3 of 3) MSX JP +107E1C97729F8D91E9E5656A84337DE6 Disc Station - Issue 21 (1990)(Compile)(JP)(Disk 1 of 2) MSX JP +E726D02B5B56DC9A1E7CD6721FD85E10 Disc Station - Issue 21 (1990)(Compile)(JP)(Disk 2 of 2) MSX JP +3511A4A8165494CC8829723849FDC718 Disc Station - Issue 22 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +A332C3C5F4E9462B6B01B376786C1CAF Disc Station - Issue 22 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +D16DF1F290AFC4A941C0AAE7B8DA0724 Disc Station - Issue 23 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +BA99C6D1572ECEFE06AAAECED9F58E69 Disc Station - Issue 23 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +38473ED377F53F1CF645A9C50B2236B2 Disc Station - Issue 24 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +FE557315C5C67F4A0FC1443E2FB903C9 Disc Station - Issue 24 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +F7A121BD703273DA53BE25739C9D87F0 Disc Station - Issue 25 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +21AFD5F88E6557CD0CAB5A08351A8307 Disc Station - Issue 25 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +87F22B36B2EC03DE9C9716102BB11329 Disc Station - Issue 26 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +163C56A87D9DB7A28A3B5DB766CA645F Disc Station - Issue 26 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +EFA7023B84AD77407EAE34BAA732E9B3 Disc Station - Issue 27 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +8AF8217EE4DBC5113C8A79F0E5EDAA07 Disc Station - Issue 27 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +82A5D082D242D664F362DD6DC5D63907 Disc Station - Issue 28 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +C880369374A1E33E9E0BDD45C93EBD96 Disc Station - Issue 28 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +DAB8360EC6F6FE48399F8798CE3A5F24 Disc Station - Issue 29 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +46E99793E89C85768D70A8D6B6FCDA82 Disc Station - Issue 29 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +5FF561475952E195F45B74B66FD62687 Disc Station - Issue 30 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +77738B967C9E391FBA414133F19FB99E Disc Station - Issue 30 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +92DAB54B7D9E06BEDA77CA069BDE4CC4 Disc Station - Issue 31 (1991)(Compile)(JP)(Disk 1 of 2) MSX JP +39CA2FC7A449D62BE3937144EB834674 Disc Station - Issue 31 (1991)(Compile)(JP)(Disk 2 of 2) MSX JP +2AB7DD1B3862CF98926BB0CC10B0EC6E Disc Station - Issue 32 (1992)(Compile)(JP)(Disk 1 of 4) MSX JP +56C5B135DE727C55A1839D5E8892A3DB Disc Station - Issue 32 (1992)(Compile)(JP)(Disk 2 of 4) MSX JP +A20D45D85CC326065E27ED827095A3BD Disc Station - Issue 32 (1992)(Compile)(JP)(Disk 3 of 4) MSX JP +21FEE94EAC709CF4743143B19657D72C Disc Station - Issue 32 (1992)(Compile)(JP)(Disk 4 of 4) MSX JP +21E3B593175005EF37EB7030C41619A5 Disc Station Deluxe - Issue 01 - Rune Master II (1990)(Compile)(JP) MSX JP +3995F8389973FE6E9D260C9617D6C211 Disc Station Deluxe - Issue 02 - Madoushi Lulba (1990)(Compile)(JP) MSX JP +58670FE6BDC65DBB403F6D1E1F4CF386 Disc Station Deluxe - Issue 02 - Youma Kourin (1990)(Compile)(JP) MSX JP +07D7D7773E3AAD5DCE725013EA101923 Disc Station Deluxe - Issue 03 - Nyanpi. Cats Puzzle (1990)(Compile)(JP) MSX JP +42028E4CC4EBCC21610166676E2BDC0A Disc Station Deluxe - Issue 03 - Sum Games (1990)(Compile)(JP) MSX JP +1A398BE72A7EC22848D2A3CAF17BF1DE Disc Station Special - Issue 02 (1988)(Compile)(JP)(Disk 1 of 3) MSX JP +A9BB69F6B09ED3B74116B8B9DCEFD2A0 Disc Station Special - Issue 02 (1988)(Compile)(JP)(Disk 2 of 3) MSX JP +A8352BBC72ECC6D3FDCDE9905E58FCFB Disc Station Special - Issue 02 (1988)(Compile)(JP)(Disk 3 of 3) MSX JP +F62D2B137EEF6531D3E131127A2B9374 Disc Station Special - Issue 05 (1988)(Compile)(JP)(Disk 1 of 3) MSX JP +9B5E763FE1E175B109CE63473D2D1BCE Disc Station Special - Issue 05 (1988)(Compile)(JP)(Disk 2 of 3) MSX JP +77DDE1D9B7C48DB4E9EF558FC47A0530 Disc Station Special - Issue 05 (1988)(Compile)(JP)(Disk 3 of 3) MSX JP +2C3F333385F68F51B7F2668D46A0F957 Disk I-O Error - Issue 01 (1997)(Mesxes)(ES) MSX ES +2CB24C2366B8ED183CE58FC6F1E4BE03 Doshi Fun - Issue 01 (1992)(Wendy Magazine)(JP) MSX JP +3014D31EA2715865AAB4F5236F9FA778 Doshi Fun - Issue 02 (1992)(Wendy Magazine)(JP) MSX JP +484CFEF4C7CCD04034593FCFEE74B8D1 Euro Link - Issue 01 (19xx)(MSX-Men)(ES) MSX ES +9B19A8002D09771CB3D1B252E4A43DAE Euro Link - Issue 02 (19xx)(MSX-Men)(ES) MSX ES +9956890727998479E62A39749DC33C9E Euro Link - Issue 04 (19xx)(MSX-Men)(ES) MSX ES +8D2309840A88D905721BAA640438F279 Future Disk - Issue 18 (19xx)(Stuff) MSX +794B57FA17669BB64B90FED9D4B41A3C Future Disk - Issue 19 (19xx)(Stuff) MSX +67E7846E548A1AF5B57AA08D19DA631A Future Disk - Issue 21 (19xx)(Stuff) MSX +8ADAFE3099F5FB7BC6C40A817D07A73E Future Disk - Issue 22 (19xx)(Stuff) MSX +7916345566A9998E4EA475DF3E8D5668 Future Disk - Issue 26 (19xx)(Stuff) MSX +0CC1E92E0C3C854B03C5E6DEE232B680 Future Disk - Issue 27 (19xx)(Stuff) MSX +E71D7568CA9C663FEA0ED69A25182A74 Future Disk - Issue 28 (19xx)(Stuff) MSX +F63788C7680BCFFCA476F15C0DFF0C48 Future Disk - Issue 29 (19xx)(Stuff) MSX +50CD1D801587DBDC571108845AE1AD0B Future Disk - Issue 30 (19xx)(Stuff) MSX +1446FE52AE081727FF1E3038F07728E5 Future Disk - Issue 31 (19xx)(Stuff) MSX +B11A13DFA4F0FCB01704ECC9F1FD0253 Future Disk - Issue 32 (19xx)(Stuff) MSX +BD217F0B12310D5184DABA28ABE71BBF Future Disk - Issue 33 (19xx)(Stuff) MSX +694DC53EFC7E95A4F300F0BC164BB3AB Future Disk - Issue 34 (19xx)(Stuff) MSX +067C691BF3DA147B4EFBBED2FB202E58 Future Disk - Issue 35 (19xx)(Stuff)(Disk 1 of 2) MSX +996819D8234B919C1EF8E5F98D8E1F9B Future Disk - Issue 35 (19xx)(Stuff)(Disk 2 of 2) MSX +6E6A4C580CC6E8ACAC416B9B5CD34095 Gnosys Special - Issue 02 (19xx)(Gnosys Foundation)(ES) MSX ES +2356312FF191D0EA4BF5338E39ABBF40 Gnosys Special - Issue 04 (19xx)(Gnosys Foundation)(ES) MSX ES +176BD1FD25F6A694F008209DD0ACA8BB Gnosys Spirit - Issue 01 (1995)(Gnosys Foundation)(ES) MSX ES +AF60FA8D9898592E1A0473091D674EE2 Gnosys Spirit - Issue 02 (1995)(Gnosys Foundation)(ES) MSX ES +C1C7CC79E9E7885A60D61ECBA41847C1 Gnosys Spirit - Issue 03 (1995)(Gnosys Foundation)(ES) MSX ES +0BB58CD3DE694582B5772831B49F118F Gnosys Spirit - Issue 04 (1996)(Gnosys Foundation)(ES) MSX ES +EB4BB5D34412672A0BB9FF0593AF9002 Loves Disc 2 (19xx)(Office Pasta) MSX +187A3D31565BFC0E7FFE1FB04FF9B299 M.A.D. InfoDisk I (19xx)(M.A.D. Club)(NL) MSX NL +969D7E7DD0176116F0F4CDD53934C9A0 Mk Disk - Issue 05 (1993)(Mk Soft) MSX +1A4E38A76F2B5EBB1DB0D032CC3C7C7D Mondo MSX - Issue 02 (1995)(Miri Soft)(IT) MSX IT +76D5ADF0C1838007BE863222E916B8C1 MSX-Fan - Issue 01 (1991)(MSX-FAN)(JP) MSX JP +D11F936BBD4221AD0CD03692E0CE7119 MSX-Fan - Issue 02 (1991)(MSX-FAN)(JP) MSX JP +32E506EDBDEBEE8F21A0D6A5055976AA MSX-Fan - Issue 03 (1991)(MSX-FAN)(JP) MSX JP +95F3688FC3FAFF02328FBA06D5ACDD41 MSX-Fan - Issue 04 (1992)(MSX-FAN)(JP) MSX JP +D7B9A236B22DF71826065F5C23090E0B MSX-Fan - Issue 05 (1992)(MSX-FAN)(JP) MSX JP +52AD777547F228E99BF8E411D90384D7 MSX-Fan - Issue 06 (1992)(MSX-FAN)(JP) MSX JP +98C17544E035F5598261BAE662780FD4 MSX-Fan - Issue 07 (1992)(MSX-FAN)(JP) MSX JP +7AF996DB8A1AF87841CD1937A9C6D65D MSX-Fan - Issue 08 (1992)(MSX-FAN)(JP) MSX JP +2D9FA01EF785E63C24309AA35CB0043B MSX-Fan - Issue 09 (1992)(MSX-FAN)(JP) MSX JP +9B6C505FE22096AADE723A0A68D702A2 MSX-Fan - Issue 10 (1992)(MSX-FAN)(JP) MSX JP +0CCDDB0799EA2847C1550C13169B1012 MSX-Fan - Issue 15 (1992)(MSX-FAN)(JP) MSX JP +3090CB2557AF982123B34C711F9C899F MSX-Fan - Issue 16 (1993)(MSX-FAN)(JP) MSX JP +E25DCCC8E922167305B18E622BC5045F MSX-Fan - Issue 17 (1993)(MSX-FAN)(JP) MSX JP +C6F5211075D6494935C113554C62A82E MSX-Fan - Issue 18 (1993)(MSX-FAN)(JP) MSX JP +8F15B0D928C6F615F30D6FB33CD31F25 MSX-Fan - Issue 19 (1993)(MSX-FAN)(JP) MSX JP +E8BB5D0906B3C80C17F8B01AA5E537A4 MSX-Fan - Issue 21 (1993)(MSX-FAN)(JP) MSX JP +717AA70AD0384D295A9C2DE7E3AB7925 MSX-Fan - Issue 22 (1993)(MSX-FAN)(JP)(Disk 1 of 2) MSX JP +EA2E2E333C3D81CB4DC3FB1DC8AAE56D MSX-Fan - Issue 22 (1993)(MSX-FAN)(JP)(Disk 2 of 2) MSX JP +B78D35F9A1572DF401C56EC274150F6A MSX-Fan - Issue 23 (1993)(MSX-FAN)(JP)(Disk 1 of 2) MSX JP +1DAA8B5685E7B7C02269C0615ACA5B66 MSX-Fan - Issue 23 (1993)(MSX-FAN)(JP)(Disk 2 of 2) MSX JP +233F84450B6158DAD2D70141A55C1B0E MSX-Fan - Issue 24 (1994)(MSX-FAN)(JP)(Disk 1 of 2) MSX JP +4913FE490356E6955622804D7CF30F2D MSX-Fan - Issue 24 (1994)(MSX-FAN)(JP)(Disk 2 of 2) MSX JP +9B4E02172869A372567DA722E5C2FFB9 MSX-Fan - Issue 25 (1994)(MSX-FAN)(JP)(Disk 1 of 3) MSX JP +6EA5C74D4AFACA18E48F8287C1288673 MSX-Fan - Issue 25 (1994)(MSX-FAN)(JP)(Disk 2 of 3) MSX JP +D0809E2DE9CE0B8210E64079E098E95C MSX-Fan - Issue 25 (1994)(MSX-FAN)(JP)(Disk 3 of 3) MSX JP +220FA66042FD70441161A6838EB32C27 MSX-Fan - Issue 26 (1994)(MSX-FAN)(JP)(Disk 1 of 2) MSX JP +9CF207E47FB0997402D45D4DD61582EE MSX-Fan - Issue 26 (1994)(MSX-FAN)(JP)(Disk 2 of 2) MSX JP +B5BAEB7BBBF31F18CEDBBD84899020A8 MSX-Fan - Issue 32 (1995)(MSX-FAN)(JP) MSX JP +A297C115DCFA41F665AB42E72CD57ABD MSX-Fun Info-Disk (1991)(MSX-Fun)(DE) MSX DE +16FD58137505523C67B8921BCE4396D3 Peach Up - Issue 03 (1990)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +EB788FDA188B1E1FF19A36E578D3130C Peach Up - Issue 03 (1990)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +1D522666F7F671D5B62E57556D9CB7CE Peach Up - Issue 04 (1990)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +070E1751A45EF37F54CD8ABC3026B877 Peach Up - Issue 04 (1990)(Momonoki House)(JP)(Disk 1 of 2)[a] MSX JP +5FD86F1A12CB399DAD6ABA5B7F41F746 Peach Up - Issue 04 (1990)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +D3B09467FD3B16024C9BA3F6246D2265 Peach Up - Issue 04 (1990)(Momonoki House)(JP)(Disk 2 of 2)[a] MSX JP +E52CC87FCB1714339508C91ECBB81204 Peach Up - Issue 05 (1990)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +589C9C517C54D9DFA6858D2A72B3824F Peach Up - Issue 05 (1990)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +084FFA8287F1938F1930C9C6D89A61F8 Peach Up - Issue 06 (1990)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +7CF140258B756BEE6F403C1E8DB4AF44 Peach Up - Issue 06 (1990)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +93DD35304E4702DB83A95D8039E6849A Peach Up - Issue 07 (1990)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +0B6E1A18CD2D59202167757BCB49B1B2 Peach Up - Issue 07 (1990)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +784979D3395A9FE354E11D3534330F39 Peach Up - Issue 08 (1991)(Momonoki House)(JP)(Disk 1 of 2) MSX JP +05366BCF9AEED6524B9473A3AC533A7C Peach Up - Issue 08 (1991)(Momonoki House)(JP)(Disk 2 of 2) MSX JP +C3E0CB85B1BA35A82B1C8C3EADF998E0 Peach Up Special (1991)(Momonoki House)(JP)(Disk 1 of 4) MSX JP +4D13B2977C73663B30E35A1E230222EC Peach Up Special (1991)(Momonoki House)(JP)(Disk 2 of 4) MSX JP +2C2A5454956DF2626EBE5DF9B7BCDF8A Peach Up Special (1991)(Momonoki House)(JP)(Disk 2 of 4)[a] MSX JP +7B1F1EBE6D814F76AB64175EB5438A9B Peach Up Special (1991)(Momonoki House)(JP)(Disk 3 of 4) MSX JP +354724C7E2BBB7CD339844F199510E6B Peach Up Special (1991)(Momonoki House)(JP)(Disk 3 of 4)[a] MSX JP +EE7FE7110648FD14A65469AF4A96099B Peach Up Special (1991)(Momonoki House)(JP)(Disk 4 of 4) MSX JP +8DF53031B70BB5CD737FD2399FA7C549 Peach Up Special (1991)(Momonoki House)(JP)(Disk 4 of 4)[a] MSX JP +4429D829EABF0F25C454D3940D8ADC94 Peach Up Special II (1991)(Momonoki House)(JP)(Disk 1 of 4) MSX JP +92A23B59C693F93B2BCF24C4FF3B5138 Peach Up Special II (1991)(Momonoki House)(JP)(Disk 2 of 4) MSX JP +48174CD0273214AC2C31ED3C15110005 Peach Up Special II (1991)(Momonoki House)(JP)(Disk 3 of 4) MSX JP +D01E869D5E33928F06877F3BB5F72E73 Peach Up Special II (1991)(Momonoki House)(JP)(Disk 4 of 4) MSX JP +6A79AFEF5CF8CC8DBE42D7491BA966AA Pink Sox - Issue 01 (1989)(Wendy Magazine)(JP) MSX JP +7B96AE8856A8420978FBFC11774689CB Pink Sox - Issue 02 (1990)(Wendy Magazine)(JP) MSX JP +B14F0E0400256CF375705FDB289E6B13 Pink Sox - Issue 03 (1990)(Wendy Magazine)(JP) MSX JP +00A83574A1A11F841FB0FA4FD7344A80 Pink Sox - Issue 04 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +464E2A14D9BA98ABBE2B6FA025520EC4 Pink Sox - Issue 04 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +5493BA96896EE26F4132F196E0262A1B Pink Sox - Issue 05 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +BB5AEC21790D6604EDF5D1D05B346B82 Pink Sox - Issue 05 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +5689E6855445E3B41A7DECC0E861180A Pink Sox - Issue 06 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +E33482DB0AD907BBE7520BC243C6E3D9 Pink Sox - Issue 06 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +5A861A48DAE5B402A84AEEFB1879C624 Pink Sox - Issue 07 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +74ECC393A617FC45F2DE430F9DE6C1C6 Pink Sox - Issue 07 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +46C532C20998F9C731E11121550A20FD Pink Sox - Issue 08 (1992)(Wendy Magazine)(JP)(Disk 1 of 4) MSX JP +3B67B70564C42621BE1B134A3CF6D498 Pink Sox - Issue 08 (1992)(Wendy Magazine)(JP)(Disk 2 of 4) MSX JP +EE019A65EF9382DBD3F202F56761A0B6 Pink Sox - Issue 08 (1992)(Wendy Magazine)(JP)(Disk 3 of 4) MSX JP +6EDF7C3FEE9A5C078A6B3681B2991999 Pink Sox - Issue 08 (1992)(Wendy Magazine)(JP)(Disk 4 of 4) MSX JP +1CF971860C76E5EDED79F78483651FDB Pink Sox Mania - Issue 01 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +5F68DDF5C53E1B6FB76363F76988D259 Pink Sox Mania - Issue 01 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +B6543BBE143CF9BB63E91A66B36DDB04 Pink Sox Mania - Issue 02 (1991)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +1C938D463052B99366F29282674F1A76 Pink Sox Mania - Issue 02 (1991)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +B903E6EDB8EA7AF27ABDEFF2D876BAD4 Pink Sox Mania - Issue 03 (1991)(Wendy Magazine)(JP)(Disk 1 of 3) MSX JP +9683E7688CDC5BDAF09A8DE8F00FD5D7 Pink Sox Mania - Issue 03 (1991)(Wendy Magazine)(JP)(Disk 2 of 3) MSX JP +665777D1738798BBC23382B5233A80D0 Pink Sox Mania - Issue 03 (1991)(Wendy Magazine)(JP)(Disk 3 of 3) MSX JP +FE540C33DFAAE2F1E941B8407C5FAF98 Quasar - Issue 22 (1991)(First Class Software)(NL) MSX NL +F9C5C69498907E323057236686F1A004 ROM Magazine - Issue 03 (19xx)(-) MSX +565AE5C8CA782A9C66884196ECF658F9 Samurai Disk - Issue 06 (1993)(MSX-Club GHQ)(JP) MSX JP +9EC75B719B43041C614875511CD2A57A Sunrise Disk - Issue 03 (19xx)(Sunrise)(NL) MSX NL +CC6B0BF8B3348ECA6DD83C8DBEE2C984 Sunrise Disk - Issue 03 (19xx)(Sunrise)(NL)[a] MSX NL +8990B78DAE561794E4BFBCDF231FFCAE Sunrise Disk - Issue 04 (19xx)(Sunrise)(NL) MSX NL +4F2C9CEEE52DD14903E7D716C595D729 Sunrise Disk - Issue 04 (19xx)(Sunrise)(NL)[a] MSX NL +674045F8B857847907693BFC7C3239D4 Sunrise Disk - Issue 05 (19xx)(Sunrise)(NL) MSX NL +BF780F9D17022AF026F2C858599692F4 Sunrise Disk - Issue 05 (19xx)(Sunrise)(NL)[a] MSX NL +4701F7BA93996015866955B5685AA3AE Sunrise Disk - Issue 06 (19xx)(Sunrise)(NL) MSX NL +E187D03B28307A86D5C43849EBA0D765 Sunrise Disk - Issue 10 (19xx)(Sunrise)(NL) MSX NL +EE6D29A54FFA48BD9EF937D6ECD64079 Sunrise Disk - Issue 12 (19xx)(Sunrise)(NL) MSX NL +0836F8A57173E4C11F73640BFD6448ED Sunrise Disk - Issue 14 (19xx)(Sunrise)(NL) MSX NL +BECDD41AF2629D9B9FB5B8059B094294 Sunrise Disk - Issue 15 (19xx)(Sunrise)(NL) MSX NL +B16F7CE2BE1037DAB9F7E13662E73CB4 Sunrise Disk - Issue 16 (19xx)(Sunrise)(NL)(Disk 1 of 2) MSX NL +5107719A1A82D88A1AA9C74771903480 Sunrise Disk - Issue 16 (19xx)(Sunrise)(NL)(Disk 2 of 2) MSX NL +739C8F7B2A369A8AE3D0528C59F20EA3 Sunrise Disk - Issue 17 (19xx)(Sunrise)(NL)(Disk 1 of 2) MSX NL +FB9C7D429ED9550F60185C0BF8A4D924 Sunrise Disk - Issue 17 (19xx)(Sunrise)(NL)(Disk 2 of 2) MSX NL +99CC6731B03C9188A0167311BD3C8455 Sunrise Disk - Issue 18 (19xx)(Sunrise)(NL)(Disk 1 of 2) MSX NL +B5BE53A74867B882EF58BB00122F0824 Sunrise Disk - Issue 18 (19xx)(Sunrise)(NL)(Disk 2 of 2) MSX NL +82B38BC45746DA8A967236671BA42EBA Sunrise Picture Disk - Issue 01 (19xx)(Sunrise)(NL) MSX NL +C2785FCF0BA7C400673D10CECA23E144 Sunrise Picture Disk - Issue 01 (19xx)(Sunrise)(NL)[a] MSX NL +5FD0A0719AD75D3E71B6B40FE4D54AC5 Sunrise Picture Disk - Issue 02 (19xx)(Sunrise)(NL) MSX NL +692CC988EDF50537B3EFD4D84026C0ED Sunrise Picture Disk - Issue 02 (19xx)(Sunrise)(NL)[a] MSX NL +C626E736675299A013867B214D7F7F5F Sunrise Picture Disk - Issue 03 (19xx)(Sunrise)(NL) MSX NL +AEC4EBDCA7FB6AB51602AC235AEBC227 Sunrise Picture Disk - Issue 04 (19xx)(Sunrise)(NL) MSX NL +458D6932AA98C81C47820A0E52934893 Sunrise Picture Disk - Issue 05 (19xx)(Sunrise)(NL) MSX NL +64C479C6264EA55323076E65A17F4DCF Sunrise Picture Disk - Issue 05 (19xx)(Sunrise)(NL)[a] MSX NL +AE9F19DB3F7D5B13FC492C6ADC8EB50D Sunrise Picture Disk - Issue 07 (19xx)(Sunrise)(NL) MSX NL +FED8B93CB6745B3F23A3CD483FCA3A9A Sunrise Picture Disk - Issue 08 (19xx)(Sunrise)(NL) MSX NL +725F02025527F9D6B67526F66B71FE98 Sunrise Picture Disk - Issue 09 (19xx)(Sunrise)(NL) MSX NL +AF00C3CA19F0B97D34349EA5331004D5 Sunrise Picture Disk - Issue 10 (19xx)(Sunrise)(NL) MSX NL +5EE4E11D50D1C6DEC6973133A65D31A6 Sunrise Picture Disk - Issue 12 (19xx)(Sunrise)(NL) MSX NL +42C82731168EFD704AF11990853D572E Sunrise Picture Disk - Issue 13 (19xx)(Sunrise)(NL) MSX NL +91DCE2D8995F98B98C39170ABB1AC383 Sunrise Picture Disk - Issue 14 (19xx)(Sunrise)(NL) MSX NL +8AF809F20029D95ADFCE9405D06109AA Sunrise Picture Disk - Issue 15 (19xx)(Sunrise)(NL) MSX NL +301747AF82476A94E14CC931C7B0C790 Sunrise Special Disk - Issue 01 (19xx)(Sunrise)(NL) MSX NL +2D35B773C890C24543AB2961206CAB2B Sunrise Special Disk - Issue 02 (19xx)(Sunrise)(NL) MSX NL +3F0F0FF11AC102CA81ADE082A7D21041 Super Pink Sox - Issue 01 (1990)(Wendy Magazine)(JP)(Disk 1 of 2) MSX JP +834092D1D9886A774F5B469FC77EEFAB Super Pink Sox - Issue 01 (1990)(Wendy Magazine)(JP)(Disk 1 of 2)[a] MSX JP +CF0254BFB3D4F4166B669EC1B2763C3E Super Pink Sox - Issue 01 (1990)(Wendy Magazine)(JP)(Disk 2 of 2) MSX JP +F9BBDB16CA9D374860A5E4452E98E31E Super Pink Sox - Issue 02 (1990)(Wendy Magazine)(JP)(Disk 1 of 3) MSX JP +1D0A3B225A3C58EDF2F093DFAD6011EE Super Pink Sox - Issue 02 (1990)(Wendy Magazine)(JP)(Disk 2 of 3) MSX JP +33450BCA7F4C4D425C851132EF968ACB Super Pink Sox - Issue 02 (1990)(Wendy Magazine)(JP)(Disk 3 of 3) MSX JP +67BCB618818C3AB1253EB7B1554616C6 Syntax Magazine - Issue 01 (1991)(Syntax)(da) MSX da +569DBE4C7BC80FA5B83882AB4A4E9763 Syntax Magazine - Issue 02 (1991)(Syntax)(da) MSX da +8A62F74D60D9A27D4394DFDB71F7AC5C Tsushin. MSX Disk Communication - Issue 01 (1990)(MSX Magazine)(JP)(Disk 1 of 2) MSX JP +7A5CB64014B4A0993A603F26809FE704 Tsushin. MSX Disk Communication - Issue 01 (1990)(MSX Magazine)(JP)(Disk 2 of 2) MSX JP +0C178738263441EB8D8CD1754DEAC182 Tsushin. MSX Disk Communication - Issue 02 (1990)(MSX Magazine)(JP) MSX JP +75419C9DA31A39A45D5E26288989F476 Tsushin. MSX Disk Communication - Issue 03 (1990)(MSX Magazine)(JP)(Disk 1 of 2) MSX JP +D87B1E67A07F9321C82E69000F02B0FE Tsushin. MSX Disk Communication - Issue 03 (1990)(MSX Magazine)(JP)(Disk 2 of 2) MSX JP +F8F5715C1C6CD428BB662CC9E60E61C8 ZZZ-UNK-ULTIMA IV[DISK 2] MSX diff --git a/Assets/gamedb/gamedb_msx_msx2_rom.txt b/Assets/gamedb/gamedb_msx_msx2_rom.txt new file mode 100644 index 0000000000..45f08a9313 --- /dev/null +++ b/Assets/gamedb/gamedb_msx_msx2_rom.txt @@ -0,0 +1,494 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Applications - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:07 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +16F08E7CDCE9AA13259B9E904EEB0E2B Cheese 2 (1985)(Nipon Electronics)(JP)[mouse] MSX JP +A0FB9B61195D7CFA9905F72D32C0C730 Garakuta (1988)(Wachi Electronics)(JP) MSX JP +43E912285287A9CF52ABDC3BFAB2951F Halnote v0.4 (1986)(HAL Laboratory)(JP) MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Firmware (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:07 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +FE33DF038805A982522ABF4DA202AAA9 B Panasonic FS-PW1 MSX Word Processor (1987)(Matsushita Electric Industrial)(JP)[b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +9CB06CE20FEA9CE06265EC0C0EA20F3D Bit2 Midisaurus-C v1.00 (1990)(Bit2)(JP)[MIDISAUR.ROM] MSX JP +30A0B3402A0A13B516AF76D39F45A365 Daewoo X-II CPC-400 MSX Extended BASIC v2.0 + Hangul BIOS v3.0 (1987)(Daewoo)(KR)[MSX2EXT.ROM] MSX KR +7B9466546009D419EBD0DC27DB90C30E Daewoo X-II CPC-400 MSX Hangul Input Software v3.0 + MSX-Tutor (1987)(Daewoo)(KR)[MSX2HAN.ROM] MSX KR +9BAF17B190F631405B6B0EEEEB162B87 Daewoo X-II CPC-400 MSX Kanji + Hangul Font (1987)(Daewoo)(KR)[KANJI.ROM] MSX KR +25128F53E854D4BE82B6178BDC2AFC78 Daewoo X-II CPC-400S MSX Disk BASIC v1.0 (1987)(Daewoo)(KR)[DISK.ROM] MSX KR +1BF039533043C2860387720278F285DB Daewoo X-II CPC-400S MSX Hangul Input Software v3.0 + MSX-Tutor (1987)(Daewoo)(KR)[MSX2HAN.ROM] MSX KR +392218C5E7F761066CBF6000AE577060 Daewoo X-II CPC-400S MSX Kanji + Hangul Font (1987)(Daewoo)(KR)[KANJI.ROM] MSX KR +43E912285287A9CF52ABDC3BFAB2951F Halnote v0.4 (1986)(HAL Laboratory)(JP) MSX JP +5353336D9C81946FA17582DACCBB5CAE Kanji Driver 32k Unknown (19xx)(-)[KNJDRV.ROM] MSX +CB30A978BD4BDDF957C66D1D05273658 Kanji ROM - JIS 1st+2nd Class for MSX-Write II (1988)(ASCII)(JP) MSX JP +FB86EE3A1DF57AA5D747B75081085F6F MSX System v2.0 + MSX BASIC (1985)(Microsoft)(US)[a][MSX2.ROM] MSX US +98E74ADD928BF5E933D9C9CDC71C6216 MSX System v2.0 + MSX BASIC (1985)(Microsoft)(US)[MSX2.ROM] MSX US +53BEC1C22B30C0A15263E04B91A7814F MSX System v2.0 + MSX BASIC Japanese (1985)(Microsoft)(US)[MSX2.ROM] MSX US +6819A1533502261BFDD52436B8346073 MSX System v2.0 + MSX BASIC Korean (1985)(Microsoft)(US)[MSX2.ROM] MSX US +EC3A01C91F24FBDDCBCAB0AD301BC9EF MSX System v2.1 + MSX BASIC (1986)(Microsoft)(US)[a][MSX2.ROM] MSX US +44B64F986946C4E47CB8BA47DC47C772 MSX System v2.1 + MSX BASIC (1986)(Microsoft)(US)[a2][MSX2.ROM] MSX US +82F84D7E1A9ACBA428228A5F83A63581 MSX System v2.1 + MSX BASIC (1986)(Microsoft)(US)[a3][MSX2.ROM] MSX US +91764E84F977671AC7CAA50B36273FD2 MSX System v2.1 + MSX BASIC Arabic (1986)(Microsoft)(US)[MSX2.ROM] MSX US +2A950B02D5394D1ACBCB626E5A142B4A MSX System v2.1 + MSX BASIC Arabic + Alalamia (1986)(Microsoft)(US)[MSX2.ROM] MSX US +BBE55AD0C98AE5481E0FB0FBF40FF308 MSX System v2.1 + MSX BASIC Russian 16k (1986)(Microsoft)(US)[MSX2.ROM] MSX US +DB56360C85EF8410DC4BCF8E8602F61E MSX System v2.1 + MSX BASIC Russian 32k (1986)(Microsoft)(US)[MSX2.ROM] MSX US +1AC8A1DC4BF28F46327A794AC93E563F MSX2 Disk BIOS (19xx)(-)[R87-4000.MS2] MSX +F8A2AA28C5D2629E2ECAF557EE7D230E MSX2 Extension (19xx)(-)[R87-0000.MS2] MSX +1CD63FC602B83024E33CE7B3D8504F79 MSX2 First 8k (19xx)(-)[R83-C000.MS2] MSX +80C81019A61740A2E95FFEEEE8C91289 MSX2 Painter (19xx)(-)(Disk 1 of 4)[0][R83-0000.MS2] MSX +38E88DF5C6BBFCA7D0404FD9572DE2E4 MSX2 Painter (19xx)(-)(Disk 2 of 4)[1][R83-4000.MS2] MSX +16924EA00CBE7B96F91FEB0124342CFF MSX2 Painter (19xx)(-)(Disk 3 of 4)[2][R83-8000.MS2] MSX +A6946EA5FDBBE03F7AFAF7516CBFE971 MSX2 Painter (19xx)(-)(Disk 4 of 4)[3][R8F-8000.MS2] MSX +A10F14CAF176F65A0A606039748007A2 MSX2 Painter (19xx)(-)[R8F-4000.MS2] MSX +7118F76D5363831DF928A8150DFC0FEB MSX2 ROM BIOS Extension (19xx)(-)(Disk 1 of 2)[0][R00-0000.MS2] MSX +CCB6D9E58A310B150742B477EAD4DFD3 MSX2 ROM BIOS Extension (19xx)(-)(Disk 2 of 2)[1][R00-4000.MS2] MSX +8445A818FE1A843D66FBEBA6657BB21B MSX2 Sub (19xx)(-)[MSX2SUB.ROM] MSX +55AC7585E16477E8AAB908BC100C8DA4 MSX2 Sub 700 (19xx)(-)[MSX2SUB.ROM] MSX +8E4AF1124E2B82FBDC74A7BC5F20DC6E MSX2 Sub Russian (19xx)(-)[MSX2SUB.ROM] MSX +BE5D1EC8001D945CA1432285722E9D16 MSX2 System Extension Arabic (19xx)(-)[MSX2EXT.ROM] MSX +810D8B696625A0231FAF68E1F3150093 MSX2 System Extension Korean (19xx)(-)[MSX2EXT.ROM] MSX +248514ABA82A0EC7FE2A9106862B05CD MSX2 System Extension Unknown (19xx)(-)[MSX2EXT.ROM] MSX +2183C2AFF17CF4297BDB496DE78C2E8A MSX2 System Extension v2.0 (19xx)(-)[MSX2EXT.ROM] MSX +8AABDE714A42256BEF36EA9B04F6EF59 MSX2 System Extension v2.1 (19xx)(-)[MSX2EXT.ROM] MSX +597AE1A6FB6AFCEE4E907D05D23AF253 MSX2 v2.0 Korean Han (1985)(Microsoft)(US)[MSX2HAN.ROM] MSX US +D9758D2A6E9A78417EC98D9F4DB4B782 MSX2, MSX2+ Non Volatile Memory (19xx)(-)[a][CMOS.ROM] MSX +5F4EF6A79253356F6930D7F7F5C8DCF2 MSX2, MSX2+ Non Volatile Memory (19xx)(-)[a2][CMOS.ROM] MSX +DC0227A3CB677D19BD84BC473394482B MSX2, MSX2+ Non Volatile Memory (19xx)(-)[a3][CMOS.ROM] MSX +B18F453E4F8AF12997EECBA7F0FEBFD8 MSX2, MSX2+ Non Volatile Memory (19xx)(-)[a4][CMOS.ROM] MSX +4A15F260E72E523B3D4795C6278B9AA8 MSX2, MSX2+ Non Volatile Memory (19xx)(-)[a5][CMOS.ROM] MSX +D5793F1264EC8DEEAC40AE5B0975A92E MSX2, MSX2+ Non Volatile Memory (19xx)(-)[CMOS.ROM] MSX +6418D091CD6907BBCF940324339E43BB MSX-DOS Kernel v2.20 + Disk BASIC v2.01 (1989)(ASCII)(JP)[MSXDOS22.ROM] MSX JP +C79C07B3A898F7EDF84C66A18A25588F MSX-DOS v2.2 (1984)(Microsoft)(US) MSX US +C4F51D2241E22F107C9EABF2CA0A0C05 MSX-DOS v2.2 ACVS-CIEL - Memory Based (1984)(Microsoft)(US)[NOVACIEL.ROM] MSX US +D83260402F93E64FC24A705FEB4DC2FA MSX-DOS v2.2 Arabic (1984)(Microsoft)(US)[DISK.ROM] MSX US +1E4EF11E18575F052EA5DE49872D4F4B MSX-Write II (1988)(ASCII)(JP) MSX JP +3CAE22BB6C306E39869E6FDFC1E383B0 Multiboot v0.0 for Mega Flash ROM (2003)(Pazos & Ramones Games) MSX +5A90854D0C911D8C754DBE52E11D326A National FS-SR023 48 Dots Mouhitsu Shotai (1987)(National) MSX +9BADE4B9CBD9A0BC39B70C119C57D1EF National Matsushita FS A1F MSX1 BASIC ROM (19xx)(Matsushita Electric Industrial)(JP)[KANJIBASIC.DSK] MSX JP +C3B61B0E5F99BD7FADC267F02571EABE National Matsushita FS A1F MSX2 BASIC ROM (19xx)(Matsushita Electric Industrial)(JP)[KANJIBASIC.DSK] MSX JP +85B108BD05FA43BFEEF704413D7BDAD3 National Matsushita FS-4500 MSX Address Book + Name Card (1986)(Matsushita Electric Industrial)(JP)[MSXJUSHO.ROM] MSX JP +60B6A10F68BFD076D35FF58797405F76 National Matsushita FS-4500 MSX Extended BASIC v2.0 (1986)(Matsushita Electric Industrial)(JP)[MSX2EXT.ROM] MSX JP +86B6B1054C4415E9CC7867D1ED219FB4 National Matsushita FS-4500 MSX Japanese Phrase Dictionary Data v2.0 (1986)(Matsushita Electric Industrial)(JP)[MSXBUDIC.ROM] MSX JP +6E11D27C971D8CCB20F492CAFA4650EC National Matsushita FS-4500 MSX Japanese Sentence Phragraph Exchanger v2.0 (1986)(Matsushita Electric Industrial)(JP)[MSXBUNSE.ROM] MSX JP +53E434D764C3221A22082EDAC958D537 National Matsushita FS-4500 MSX Standard Kanji Driver 1 (1986)(Matsushita Electric Industrial)(JP)[MSXKANJ1.ROM] MSX JP +BD607B5E9B63B5AA8F9AA614D60E0AA8 National Matsushita FS-4500 MSX Standard Kanji Driver 2 (1986)(Matsushita Electric Industrial)(JP)[MSXKANJ2.ROM] MSX JP +31820EAF403B031E3693C2EDDF4DF76B National Matsushita FS-4500 MSX Word Processor II v1.0 (1986)(Matsushita Electric Industrial)(JP)[MSXWORD1.ROM] MSX JP +236D5A0FE6DACB401E6C90C77149066B National Matsushita FS-4500 MSX Word Processor II v2.0 (1986)(Matsushita Electric Industrial)(JP)[MSXWORD2.ROM] MSX JP +82FFCB0F405DDB2C89605E8B826338B9 National Matsushita FS-4500 MSX Word Processor II's Font (1986)(Matsushita Electric Industrial)(JP)[MSXWORD2.ROM] MSX JP +20989124671593AB04EEB01D52A1E25C Novaxis MSX2-Turbo-R SCSI BIOS version (1996)(KMcs - MSX Club Gouda)(NL)[NOVAXIS.ROM] MSX NL +403CDEA1CBD2BB24FAE506941F8F655E Painter, The v1.0 (1986)(Yamaha)(JP)[PAINTER.ROM] MSX JP +41DB0D7B37BE479296FFD59FCD6775F0 Painter, The v1.1 (1986)(Yamaha)(JP)(ar)[SKRPAINT.ROM] MSX ar JP +999551126F5A9CE5C04DBB2AA5460D04 Panasonic FS-A1MK2 A1 Cockpit 1 (1987)(Matsushita Electric Industrial)(JP)[COCKPIT1.ROM] MSX JP +93EDB927DD2A24F8CD02523F6C7351FE Panasonic FS-A1MK2 A1 Cockpit 2 (1987)(Matsushita Electric Industrial)(JP)[COCKPIT2.ROM] MSX JP +360470BDF5795BB07274B3DEB234D831 Panasonic FS-A1MK2 A1 Cockpit 3 (1987)(Matsushita Electric Industrial)(JP)[COCKPIT3.ROM] MSX JP +5E864081218C02674F33D56C27732C57 Panasonic FS-SR021 MSX2 Word Processor (1988)(Matsushita Electric Industrial)(JP) MSX JP +C2F548FDB9C888B6D7FD494D04B8E764 Panasonic MSX Audio + BASIC (19xx)(-)[MSXAUDIO.ROM] MSX +47485766A10AAA475DCA3F8DAA4D9E8E Philips NMS-8220 Designer Pencil v1.0 (1986)(Philips)[DESIGNV1.ROM] MSX +8BC76427B4D08D0FC26F17E16BF9840B Philips NMS-8220 Designer Pencil v2.0 (1986)(Philips)[DESIGNV2.ROM] MSX +8092522A88C45138CF857AEB138651ED Philips NMS-8220 MSX Extended BASIC v2.1 (1986)(Philips)[MSX2EXT.ROM] MSX +3525EA046DDEDC66991790EEAE32ACFD Philips NMS-8245 BASIC Disk (1986)(Philips)(NL)[DISK.DSK] MSX NL +01DD1D72ED9BB6AFE8A9B441C198A1CD Philips NMS-8245 MSX Disk BASIC v1.0 Original (1987)(Philips)(NL)[DISKO.ROM] MSX NL +7FB4F6AC77435C91C456E2D48CADFAB9 Philips NMS-8255 BASIC Disk (1986)(Philips)(NL)[DISK.DSK] MSX NL +B6C33B7B3508D691D7872589C778F808 Philips NMS-8280 German BASIC BIOS (19xx)(Philips) MSX +4047CE143A8BF391E21991835AA65B59 Philips NMS-8280 German BIOS (19xx)(Philips) MSX +DD9F3185BACB96BA130B4D7BFD04418D Philips NMS-8280 German Disk ROM (19xx)(Philips) MSX +3BAB6D8182BAE46EA2A8B13CCCF8CF1C Philips NMS-8280 MSX System v2.1 + MSX BASIC (1986)(Philips)[MSX2.ROM] MSX +F897DE0228DE4B9FD5EA028390184B0A Philips NMS-8280 MSX2 Sub (19xx)(Philips)[MSX2SUB.ROM] MSX +ADA1DB6B4F86FE46E179EFF9547AF9C8 Philips NMS-8280 MSX2 Sub, Panasonic WSX MSX2+ (19xx)(Microsoft)(US)[MSX2SUB.ROM] MSX US +432F2DA8A8A96A6C69919A1E05F6DE92 Philips VG-8235 MSX BIOS + BASIC v1.0 (1985)(Philips)[DISK.DSK] MSX +6317A8CC9AB1268C52F57FB3AA0B8DA2 ProfiSoft Network Card (19xx)(-)[PROFI.ROM] MSX +DFB89903D8E7E567FDD8B058C1AE36EF Sakhr Word Processor (1987)(Al Alamiah)(KW)[type CALL SWP] MSX +0B8F0EC02C1F723F5E669462CB1C800C Sony HB-F500P BASIC BIOS (19xx)(Sony)(JP) MSX JP +0AB7E6F51E2ABBABD1B9FDDDAD1E6369 Sony HB-F500P Disk (19xx)(Sony)(JP) MSX JP +484AC98AEBF62F35E370861D686E7C3B Sony HB-F9P Internal Software Part-1 (1986)(Sony)(JP)[INTERN1.ROM] MSX JP +3C6D68DD209552FB1DD30598D74E5A92 Sony HB-F9P Internal Software Part-2 (1986)(Sony)(JP)[INTERN2.ROM] MSX JP +061A87CBB20E6C695F980EDA1204F4A5 Sony HB-F9P MSX BIOS + BASIC v2.0 (1986)(Sony)(JP)[MSX2.ROM] MSX JP +58A5BABB3702DADF40C71516C27B7941 Sony HB-F9P MSX Extended BASIC v2.0 (1986)(Sony)(JP)[MSX2EXT.ROM] MSX JP +392673199BB16D1E96A081E5449A9748 Sony HBI-V1 Video Digitizer (1989)(Sony)(JP) MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: MSX MSX2 - Games - [ROM] (TOSEC-v2012-04-15) +;;; FileGen: 2020-02-07 11:00:07 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +AB5F637F768E358020B7D4ED3B4D03D0 B AcroJet (1988)(System Soft)(JP)[b] MSX JP +6048E1EA4F3D5ACBEAABE9067E706733 B American Soccer (1987)(Nidecom)(JP)[b] MSX JP +2ECCDCFD28C7DC95F21BDF856C0704D6 B Andorogynus (1988)(Telenet Japan)(JP)[b] MSX JP +FD462E58D7D9F6CBEC959F1BB40447FD B Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[b] MSX JP +5E2A02BAFED932679ACBF1DA777D77FA B Dragon Quest II (1988)(Enix)(JP)[b] MSX JP +B14DCCED836DAA6024CC1E6A9FC6D5F4 B Famicle Parodic (1988)(Bit2)(JP)[b] MSX JP +CCAB31DE87CC187E5A3CC63401F43B00 B Ikari Warriors (1987)(SNK)(JP)[b] MSX JP +F6DC168468002FD37CBC78A964E48BAA B Makaijima - Higemaru (1987)(Capcom)(JP)[b] MSX JP +8153CC9023D0E38D7DA0B359C47DF5E8 B Malaya no Hihou (1989)(Pony Canyon)(JP)[b] MSX JP +3ED0C73232B43571D99EC980C58F15BE B Mejon (19xx)(-)[b] MSX +0F31F8927CB3940B2909A6956C3EB37C B Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[b][RC-767] MSX JP +219B1DE65F8C4215134D75A66EED059B B Mon Mon Monster (1989)(Hot-B)(JP)[b] MSX JP +F0C367BE0F5CA0EA142B4A1E9443A50B B Ogre (1987)(System Soft)(JP)[b] MSX JP +54F8FF0E312C5FC349BA08603CAB0618 B Out Run (1988)(Pony Canyon)(JP)[b] MSX JP +41387351B5FDFF0A0A206F61A8E1E680 B Penguin Kun Wars 2 (1988)(ASCII)(JP)[b] MSX JP +E10B0C9BD774BE29D398DF02C36E49AD B Rastan (1988)(Taito)[b] MSX +4DF8BE4C3E7CCA2535A9EEC067E364EA B Relics (1986)(Bothtec)(JP)[o][b] MSX JP +EE977849B8182DC4ED07BED9A4C7B860 B Scramble Formation (1987)(Taito)(JP)[b] MSX JP +6777DE50268E91358A24D4974B3C4FB1 B Scramble Formation (1987)(Taito)(JP)[o][b] MSX JP +D86040ACF8167274E136955E63BB1941 B Super Rambo Special (1985)(Zemina)(KR)[b] MSX KR +E05383FCC5DC9B33591CB41634FADE04 B Victorius Nine II (1988)(Nidecom)(JP)[b] MSX JP +18DDA437C0591212190B337AAD95E559 B Xevious - Fardraut Saga (1988)(Namcot)(JP)[b] MSX JP +9169B99C9085CE39189124CF289A07D1 B Yaksa (1987)(Wolfteam)(JP)[b] MSX JP +9B5014CBD65FE145479A206F5450862A B Zoids (1988)(Toshiba-EMI)(JP)[b] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +2516867ABFD70BA0B240C9FF55C6C01F H Contra. Gryzor (1989)(Konami)(JP)[t][RC-762] MSX JP +AEF44E669988772F0B6226EAA8BE4085 H Space Manbow (1989)(Konami)(JP)[t][RC-768] MSX JP +3342EE4FF67EE336A01B99F05DFB1D5A H Treasure of Usas, The (1987)(Konami)(JP)[t][RC-753] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +C98E5BE4DE2A35FCE878F8F20F9138B3 O Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP)[o] MSX JP +9C28725C720BB2597766FC80D8B4ED65 O Maison Ikkoku (1987)(Micro Cabin)(JP)[o] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +384689388DCC00D4E01804664ACF5989 T Metal Gear (1987)(Konami)(JP)[tr es][RC-750] MSX JP +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +668570DD413D5CDF271E58D61B5B99E7 1942 (1986)(ASCII)(JP) MSX JP +98854B14932A7183CAFEB16DE27DD1D4 1942 (1987)(Zemina)(KR) MSX KR +1F73A16C2B3CD400E026B578B7567A72 AcroJet (1988)(System Soft)(JP) MSX JP +51D021AF50C3A48124331A9FBC738B97 Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a][RC-744] MSX JP +5D50C1C7BC164C3D01C41B0B8A501D72 Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a2][RC-744] MSX JP +EF4636EFB770AE5BE8B3D6AF245A594A Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a3][RC-744] MSX JP +273C3DFF8315A6A4FCED758F07D54AAA Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a4][RC-744] MSX JP +2AC9A5946A300FCC71E9956C9CB6A47C Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[a5][RC-744] MSX JP +92BA9DAB3C7A4AC6C8A130F6CCBAC91C Akumajyo Drakyula. Vampire Killer (1986)(Konami)(JP)[RC-744] MSX JP +4B1A5DC67B2EABDDA3D78169BA00E9E0 Aleste (1988)(Compile)(JP) MSX JP +D00EAA8A362DD87A8153A6E2A5B40E62 Aleste (1988)(Compile)(JP)[a] MSX JP +7087B51F3CCFDF314CE60D5D8AAF644A Aleste (1988)(Compile)(JP)[a2] MSX JP +A3648A5DD95179C00FC11FE455BB5828 American Soccer (1987)(Nidecom)(JP) MSX JP +31502091EA075C4E3B20461267026CEB American Soccer (1987)(Nidecom)(JP)[a] MSX JP +79363F8F57233E4E4AE544FDBB6E21A0 Andorogynus (1988)(Telenet Japan)(JP) MSX JP +65ED7FCE763E5E7EC60306E86FFF872F Andorogynus (1988)(Telenet Japan)(JP)[a] MSX JP +634DD13762378630BFE50AC9B87DBF5F Arctic (1989)(Pony Canyon)(JP) MSX JP +F709083DA5B2B078C3621A17374AAF1E Arctic (1989)(Pony Canyon)(JP)[a] MSX JP +CAC9788C86BBCB65A042BFC43D12402F Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP) MSX JP +2D594D9EBFB36FABA7EEA3C6B4E55DC8 Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[a] MSX JP +1E3CB2C08DE58F371979B40E498E309C Arkanoid II - Revenge of Doh (1987)(Nidecom)(JP)[a2] MSX JP +2E3BC2A2599AE662002EF3ADEA151B7C Arkanoid II - Revenge of Doh (1988)(Zemina)(KR) MSX KR +14C078A9ED5C14AC54A6EB5E94FA34D2 Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP) MSX JP +4FEFE2334038D0F2F189A8434B1C8BC2 Arsene Lupin 3rd - Cariostoro no Siro (1987)(Toho)(JP)[a] MSX JP +2BD8B20B342976A5CF7B4B30399C5083 Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP) MSX JP +B15C73F408756E444BD8EE347E7F98AE Arsene Lupin 3rd 2 - Babiron no Ougon Densetsu (1988)(Toho)(JP)[a] MSX JP +790E45F34CEC0F5064161109653537C5 Arugisu no Yoku. Wings of Arugisu (1988)(Kogado)(JP) MSX JP +4761DC4891D87F2F2FEEEB237C9CD526 Asada Tetsuya no Akyoo Mahjong. Nap Tetsuya's A-Class Mahjong (1988)(Pony Canyon)(JP) MSX JP +851ACA1E5D3F0E8D9B1CBEC2E8451831 AshGuine (1987)(Panasoft)(JP) MSX JP +D92486E62049282C43C54881DE3684A3 AshGuine (1987)(Panasoft)(JP)[a] MSX JP +6B98C47831C9AAB49192FA3ED26C9309 AshGuine 2 (1987)(Panasoft)(JP) MSX JP +3B191BA16E7C5DEF2F1E9FEBC1FB92E5 AshGuine 2 (1987)(Panasoft)(JP)[a] MSX JP +F582DF437DDE65D958EEC72260801B32 AshGuine 3 (1987)(Panasoft)(JP) MSX JP +831243E740C25D11EC55E202602C1EAE Blade Lords (1994)(Parallax)(NL) MSX NL +921A8C523A5F699D0D32F691E2A9326D Blade Lords (1994)(Parallax)(NL)[a] MSX NL +78CFCD46880A80B26839158CBA7094A1 Bubble Bobble (1987)(TAITO)(JP) MSX JP +BD8B1F6C998657B96BF7DC7825D0A600 Bubble Bobble (1987)(Taito)(JP)[a] MSX JP +027CA1D6C89909FD0D19703502DE1F76 Bubble Bobble (1987)(Zemina)(KR) MSX KR +9454F30EB16BC0ECD406939D1C1834D4 Bubble Bobble (1987)(Zemina)(KR)[a] MSX KR +10B02D5C4600B342E98559518BDBC96D Cockpit, The (1988)(Nidecom)(JP) MSX JP +855DC91E683D897662C2F676B4DC3E3A Contra. Gryzor (1989)(Konami)(JP)[RC-762] MSX JP +32FBDAD6529038179EEEF3F2DB7DBE85 Contra. Gryzor (1989)(Konami)(JP)[SCC][RC-762] MSX JP +C787A2825169FA5B13BCB1EAEC3E289A Crimson (1987)(Scaptrust)(JP) MSX JP +CC6D64C4A9880B6111F6B491275EB62A Daikoukai Jidai. Uncharted Waters (1990)(Koei)(JP) MSX JP +57F718A9F3ADD36B71F606D636CB1D6F Daisenryaku. Risk (1987)(Micro Cabin)(JP) MSX JP +CA9CB10E2415775418C85F47E1BFB5D5 Darwin 4078 (1987)(Hudson Soft)(JP) MSX JP +E84D7E53B40D406042E9B3AE837AAD62 Darwin 4078 (1987)(Hudson Soft)(JP)[a] MSX JP +1A06186F14DE3C724215997EEE18D6FD Darwin 4078 (1987)(Hudson Soft)(JP)[a2] MSX JP +56DAE5F0998359D68CDBA7CB6947FD3F Deep Forest (1987)(Xain)(JP) MSX JP +DC9C2178FEC7958FDDE3F7762FFE0B2E Deep Forest (1987)(Xain)(JP)[a] MSX JP +9C16B2BA7956A86819BDBC12CD266E29 Dires - Giger Loop (1987)(Bothtec)(JP) MSX JP +0CB6D4D086306F22D6D4A8C96A0F44E3 Double Vision - Beauty Girl Photo Studio (1987)(Hard)(JP) MSX JP +52BD14A491AA5802E842BFF023D4F728 Dragon Buster (1987)(Namcot)(JP) MSX JP +3283755BDAD01C78EFF2AD0F2751805C Dragon Buster (1987)(Zemina)(KR) MSX KR +B6A39A89FB0DF0BE5DFF7D64F5FE8900 Dragon Quest (1986)(Enix)(JP) MSX JP +63672A3FDC8A481E3AC38AB1A36B5167 Dragon Quest (1986)(Enix)(JP)[a] MSX JP +38415491E0F07C722C15F0E4103650FF Dragon Quest II (1988)(Enix)(JP) MSX JP +92139E59F1E8FE30D5550112B300CC5C Dragon Quest II (1988)(Enix)(JP)[a] MSX JP +B2E0120F0A937FAB09A37A252AB0FAEA Dragon Quest II (1988)(Enix)(JP)[a2] MSX JP +560544F37BF6F806B200D5DB3D562E26 Dragon Slayer 3 - Romancia. Dragon Slayer Jr (1987)(Falcom)(JP) MSX JP +E6936C2B6472591505ACD1EE1B6C5865 Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP) MSX JP +38209DD384CA5A791E97FFC6C68097A2 Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP)[a] MSX JP +94C971E98392459A2629240DB7679666 Dragon Slayer 4 - Drasle Family (1987)(Falcom)(JP)[a2] MSX JP +65845A220992EA4962D96919278B7A23 Druid (1987)(Nippon Dexter)(JP) MSX JP +62F67225074FEC95BAA131F687238FD0 Druid (1987)(Nippon Dexter)(JP)[a] MSX JP +35BE85738C2405771681371DC892202B Druid (1987)(Nippon Dexter)(JP)[a2] MSX JP +14311B9FE54716ED22EFE313A7503E53 Dynamite Bowl (1987)(Toshiba-EMI)(JP) MSX JP +A495DC8678497B284B8A2B675F8BB6CC Dynamite Bowl (1987)(Toshiba-EMI)(JP)[a] MSX JP +FF25F8CCDE5CF7D49A758D19F46E41D0 Eidolon, The (1986)(Pony Canyon)(JP) MSX JP +3F68D8E286B9B46B5400381BDACBAA52 Elslid. Erenubu. Eagle War (1988)(NCS)(JP) MSX JP +C6EF60D5FD83FF363C4E856D00D78356 Elslid. Erenubu. Eagle War (1988)(NCS)(JP)[a] MSX JP +CAFAA2EAB655943AD4064A1DBDB09A67 Empereur, L' (1990)(Koei)(JP) MSX JP +35D9D247A298181BB0C70A45D5E0746E Europa Sensen. Europe War. Battle Front Europe (1992)(Koei)(JP) MSX JP +C4C2BF153650B33AAAB97AC00D07685B F-15 Strike Eagle (1988)(System Soft)(JP) MSX JP +3A14E2D8039DBF2E475C6FE7F3830D04 Famicle Parodic (1988)(Bit2)(JP) MSX JP +ECCBB5B0E92BA466DA7A55434BBC0556 Famicle Parodic (1988)(Bit2)(JP)[a] MSX JP +B0777D767FBE554B943B866C3191FADE Famicle Parodic (1988)(Bit2)(JP)[a2] MSX JP +54038E0DCC4AD3F0A2FD3859EB3E5C9B Family Billiards (1987)(Pack In Video)(JP) MSX JP +C99F4C45159150AD4C8152A7181966EF Family Billiards (1989)(Zemina)(KR) MSX KR +9B92EB8A340FED695FB4D86D94E6A4D6 Family Boxing (1988)(Sony)(JP) MSX JP +FE9ED2D6A48E347D6794214722E41827 Family Boxing (1988)(Sony)(JP)[a] MSX JP +206945B66A897271269CDCF12070993B Family Stadium Pro Baseball (1989)(Namcot)(JP) MSX JP +88AB9038BE379184C70ED4AEF1766A57 Fantasy Zone II - The Tears of Opa-Opa (1987)(Pony Canyon)(JP) MSX JP +CF739DB66ADC5A2F2D06F19E3D852CCB Fantasy Zone II - The Tears of Opa-Opa (1987)(Pony Canyon)(JP)[a] MSX JP +BEAE4B0BEE7B028644804FA41DA96F40 Fire Ball (1988)(Humming Bird Soft)(JP) MSX JP +93C57C72F5991BC3F56729D0E3488593 Fire Ball (1988)(Humming Bird Soft)(JP)[a] MSX JP +C164B82E38BE62C3CFE38D587E20CC31 Fleet Commander II (1990)(ASCII)(JP) MSX JP +D58D87E7A359DF92C3AEAE0EA93672B5 Gakuen Monogatari. High School Story (1988)(Great)(JP) MSX JP +889E438FEA6EEECE702446311AFCE84F Gambler Jikichushinpa 2 (1988)(Game Arts)(JP) MSX JP +BFA3F3717D706C047C5B0363B56811A0 Ganbare Goemon. Samurai (1987)(Konami)(JP)[a][RC-748] MSX JP +15BDB1FF79FBC55CE9972A3D1EBD9B9C Ganbare Goemon. Samurai (1987)(Konami)(JP)[a2][RC-748] MSX JP +44C47AE77D38EE95D311F90204ED4AC5 Ganbare Goemon. Samurai (1987)(Konami)(JP)[RC-748] MSX JP +ED4978EC21C4D0E7C7A336C58E9B7800 Garyuoh. Dragon King (1987)(Xain)(JP) MSX JP +C9A6C43ADD06E8F57FFDB4FE40DF753C Garyuoh. Dragon King (1987)(Xain)(JP)[a] MSX JP +B82BDDBC0DEC393986C0FADAA7DAC22C Gekitotsu Pennant Race (1988)(Konami)(JP)[a][RC-757] MSX JP +D289FA8BCF442197900082A0D6F87B25 Gekitotsu Pennant Race (1988)(Konami)(JP)[a2][RC-757] MSX JP +AB8C5E6D4BE4A2979019DF24CA0AD679 Gekitotsu Pennant Race (1988)(Konami)(JP)[a3][RC-757] MSX JP +933618A3D26EE6BEB32527113996F483 Gekitotsu Pennant Race (1988)(Konami)(JP)[RC-757] MSX JP +D3FF5D3E1BDE29BA2AED232F95C891FD Gekitotsu Pennant Race (1988)(Konami)(JP)[SCC][RC-757] MSX JP +AF91306740FF42FFD25F0F75D3E4FCA8 Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[a][RC-766] MSX JP +97936E206E44474E7A2062D2682D5F54 Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[a2][RC-766] MSX JP +19C8DB6C2560623AF02EED59D5AD8D76 Gekitotsu Pennant Race 2 (1989)(Konami)(JP)[RC-766] MSX JP +76BBA6B3F1AE93CFAFB3AF904B978098 Genchouhishi (1992)(Koei)(JP) MSX JP +67BC15B268C9E35DF72121911D4412EA Genghis Khan (1988)(Koei)(JP) MSX JP +8A5F64A74E66BE96EBF1F1719E669B89 Girly Block (1988)(Telenet Japan)(JP) MSX JP +CB955EC12B62B62D8F3DF6F2073ACFC1 Gitahei (1986)(Micro Cabin)(JP) MSX JP +A086184D0D646AA3DCFFF48AFA0E37E2 Go Othello. Connect Stones (1989)(Konami)(JP)[a][SCC+] MSX JP +64155315FD0FC14EAC84A412DAB410DF Go Othello. Connect Stones (1989)(Konami)(JP)[SCC] MSX JP +9A30411D8D3017491FDFE0D19BF27076 Go Othello. Connect Stones (1989)(Konami)(JP)[SCC+] MSX JP +5FD491B7B8C674FC78A56405C27D9221 Hacker (1988)(Pony Canyon)(JP) MSX JP +C04D63B2A8ABCF7A75FBCF385850964D Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[a][no PCM][RC-765] MSX JP +A9187C70AB0F678E06C773DABF2F7E5F Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[a][RC-765] MSX JP +6FA69BC2FC1C872EFC130EEAF857F74B Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[a2][no PCM][RC-765] MSX JP +157948F839762DC9922E4011BB4DC9E6 Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[no PCM][RC-765] MSX JP +4CD9BBA883A16BCF67835BF4D6AE13EE Hai no Majutsushi - Mahjong 2 (1989)(Konami)(JP)[RC-765] MSX JP +B6F896927EFDE131A1CBB14B5CEA942D Hardball (1987)(Sony)(JP) MSX JP +53CB808A7A5A5E4CB13F8905E8BD9A34 Hardball (1987)(Sony)(JP)[a] MSX JP +EA1CA54CFE5222B49EAD093CC6EAFCA0 Heroes of the Lance (1991)(Pony Canyon)(JP) MSX JP +D18FA99AE42EBB6AC7B10556C172DE7E High School Kimengumi (1987)(Pony Canyon)(JP) MSX JP +C35D87613BC6C7F5C03BFB8FA220A3F6 Hinotori. Firebird (1987)(Konami)(JP)[a][RC-747] MSX JP +8D89CAF4804637E302FE1D57D2E2AF73 Hinotori. Firebird (1987)(Konami)(JP)[a2][RC-747] MSX JP +AB9BAB9F3DDF1B4BB1532E384890A50C Hinotori. Firebird (1987)(Konami)(JP)[a3][RC-747] MSX JP +E2AE336EBFFBC696633A57FE46E170B5 Hinotori. Firebird (1987)(Konami)(JP)[RC-747] MSX JP +67B6FAFCFE5D552AFA572DAA3A26C45D Hinotori. Firebird (1987)(Zemina)(KR)[RC-747] MSX KR +6BEAF41221E7CD325D32B3112CC898DA Hole in One Special (1987)(HAL Laboratory)(JP) MSX JP +DF9D9E1DD54409D5B35339EA60B1045E Hole in One Special (1987)(HAL Laboratory)(JP)[a] MSX JP +C8F2A1A93F852096EAEBAA18E59350CF Hydlide III - The Space Memories (1987)(T&E Soft)(JP) MSX JP +68F5D063D42AC44F479139CE9654E4C2 Hyper Somen. Rice Eating (1989)(Konami)(JP)[a][SCC+] MSX JP +8BB842380DDDC4047C839F47D3E93E39 Hyper Somen. Rice Eating (1989)(Konami)(JP)[SCC] MSX JP +D67A50CF4D6911CF06DEBF053F179BBD Hyper Somen. Rice Eating (1989)(Konami)(JP)[SCC+] MSX JP +77A23DA8AF09CCB05F19CA50E717875B Ide Yousuke no Jissen Mahjong (1988)(Pack In Video)(JP) MSX JP +65C426E4CF02A1F211641A2DFC035486 Ikari Warriors (1987)(SNK)(JP) MSX JP +D2F178FB8B16B2EBE002FEFCCB7D3191 Inindo Datou Nobunaga. Way of the Ninja (1991)(Koei)(JP) MSX JP +6C3AC4FC067D82977A11611EC29AE4C4 Ishin no Arashi. Storm of the Meiji Restoration (1989)(Koei)(JP) MSX JP +D9C9EE473B5E1E372B2B53A3C9558D5F Jyansei. Jansei. Mahjong King (1986)(Sony)(JP) MSX JP +F64C38D0010B872A435B041936100CBD Jyansei. Jansei. Mahjong King (1986)(Sony)(JP)[a] MSX JP +A7E3B3B64A54078D7D92FBEA2E1CF8A8 Kenpelen Chess (1988)(Pony Canyon)(JP) MSX JP +7C981F0DDF3A459FB854C9B827061A44 Kiki Kaikai. Mystery (1987)(Sony) MSX +CDB2B8705218E6215E509B464A842111 Kiki Kaikai. Mystery (1988)(Zemina)(KR) MSX KR +1FC6CC9CCF7B846F52E06A80F31C2FE7 Kiki Kaikai. Mystery (1988)(Zemina)(KR)[a] MSX KR +A7BC0525D6367FE9B32EB568A14133E7 King Kong 2 (1986)(Konami)(JP)[a][RC-745] MSX JP +E9708E4DA8020193510752BE73DE6C2E King Kong 2 (1986)(Konami)(JP)[a2][RC-745] MSX JP +EF22E9381D6D73C8001CCCF57CA70AC7 King Kong 2 (1986)(Konami)(JP)[a3][RC-745] MSX JP +65B5DBFDDBFB71975511412AFCEA17F8 King Kong 2 (1986)(Konami)(JP)[RC-745] MSX JP +A94A47593514299CAE379B974DC088F5 King's Valley II - The Seal of El Giza - Edit Contest Version (1988)(Konami)(JP) MSX JP +DFCAF859E699F8995D054622C5A561BA King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[RC-761] MSX JP +7681E24059D52272F5745EBCD22C1E0F King's Valley II - The Seal of El Giza (1988)(Konami)(JP)[SCC][RC-761] MSX JP +8CFE4EBB5BFD4C2AB838B81B0D2ACB37 Kisei (1987)(Sony) MSX +29020908BAFEA060960CA7E65CDFE6CA Koji Tanigawa's Shougi Shinan II (1988)(Pony Canyon)(JP) MSX JP +E95759A5332959A0F497C99508F738CC Koronis Rift (1987)(Pony Canyon)(JP) MSX JP +4140B44E0923026E50F88787E208CCB5 Kyoto Ryu no Tera Satsujin Jiken (1988)(Taito)(JP) MSX JP +6258D916A2E8A44DCC571FA3DD26BD3C Labyrinth, The (1987)(Pack In Video)(JP) MSX JP +121EB1B9DCE5C12832A5C7B97265A773 Labyrinth, The (1987)(Pack In Video)(JP)[a] MSX JP +82A73F6B3186409232F988F28226F9E6 Labyrinth, The (1987)(Pack In Video)(JP)[a2] MSX JP +71AE9C3540D5CFEF4EBAB4254F39818D Livingstone Supongo (1986)(Opera Soft)(ES) MSX ES +668F400E33557D24C9413310634C8ACE Mad Rider (1987)(Carry Lab)(JP) MSX JP +93C665DAB6503B4FF2712ADFEB3A8531 Mad Rider (1987)(Carry Lab)(JP)[a] MSX JP +ED5C5D1F0A3CCD435AC3D28668EE5EC9 Maison Ikkoku - Kanketsuhen (1988)(Micro Cabin)(JP) MSX JP +E94BA71D0782E6606BF763407799964D Maison Ikkoku (1987)(Micro Cabin)(JP) MSX JP +68EE449DE249D7B2CF0E1900A6CD319C Maison Ikkoku (1987)(Micro Cabin)(JP)[a] MSX JP +1811F67FAC1F6C98C83EF0281371C7FB Makaijima - Higemaru (1987)(Capcom)(JP) MSX JP +97736DFEB637B0A0C13972DFF7720851 Metal Gear (1987)(Konami)(JP)[a][RC-750] MSX JP +25CFD76D44305702D2E5B3E23FD2ABBC Metal Gear (1987)(Konami)(JP)[a2][RC-750] MSX JP +12E302954FA9B23C11CE7C8F5770B82A Metal Gear (1987)(Konami)(JP)[a3][RC-750] MSX JP +E8C260A29AA082E5330827364AA86BA8 Metal Gear (1987)(Konami)(JP)[a4][RC-750] MSX JP +439EA985617135D70858F0E6F88BA0F9 Metal Gear (1987)(Konami)(JP)[RC-750] MSX JP +BCAB28734D57B98120DE13E56A8BD419 Metal Gear (1987)(Konami)(JP)[save on disk][RC-750] MSX JP +43D38F6D7F6C98710292C8F6368ABBD2 Metal Gear 2 - Solid Snake (1990)(Konami)(JP)(tr es)[SCC][RC-767] MSX tr es JP +BA514B1A1D1A1D9327106B74A279592A Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[a][RC-767] MSX JP +668217F475619500C87F136949267B6D Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[a2][RC-767] MSX JP +52A23DB9A9F60F1286887B231F1C3774 Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[a2][SCC][RC-767] MSX JP +B38FA1E7AC9D63003DAD96992F7C7358 Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[a3][RC-767] MSX JP +9F50D92D35E19D5DE37D75A36A410588 Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[RC-767] MSX JP +C18AC5502C966DBD7E61C26433784B23 Metal Gear 2 - Solid Snake (1990)(Konami)(JP)[SCC][RC-767] MSX JP +0B5FD35204AA279FB106E3761F90085E Metal Gear 2 - Solid Snake (demo) (1990)(Konami)(JP)[RC-767] MSX JP +F15A35B66270858D4C1C5D1351E04D6E Mirai 2. Future 2 (1987)(Xain)(JP) MSX JP +5564C666D127FA6765B756311A19F45D Missisippi Satsujin Jiken. Murder on the Mississippi (1987)(Jaleco)(JP) MSX JP +50B6F805F48865D0A0021D604BE1C58E Moero! Netto Yakyu '88 (1988)(Jaleco)(JP) MSX JP +924F7EB26BCDF28047EC4211EEC5F8B7 Mon Mon Monster (1989)(Hot-B)(JP) MSX JP +28EAA95B72BCBF3E31202C3CC72E47C4 Nekketsu Judo (1989)(Pony Canyon)(JP) MSX JP +0E2697ED7769D3AA3650B215808C5335 Nekketsu Judo (1989)(Pony Canyon)(JP)[a] MSX JP +7AF4DFD91CD1E2E6BF0D2D7D2302F97F Nekketsu Judo (1989)(Pony Canyon)(JP)[a2] MSX JP +7A3012784C5E42194C141EDBF0F7A94D Nekketsu Judo (1989)(Pony Canyon)(JP)[a3] MSX JP +01D18E427D829E3F1AA3550FF15C107C Ninja Kun - Ashura no Sho (1987)(HAL Laboratory)(JP) MSX JP +4FE04555CAED46046B80D5624D44151F Nobunaga no Yabou - Zenkoku Han (1987)(Koei)(JP) MSX JP +C2CBCAD9411B575E9291C3739118785C Nobunaga no Yabou 2 - Sengoku Gunyuu Den (1989)(Koei)(JP) MSX JP +65E30C8EF671B789FDC1C08780207E26 Nobunaga no Yabou 3 - Bushou Fuuun Roku (1991)(Koei)(JP) MSX JP +A04139DA653FC41FDC576A5FFA273CF7 Ogre (1987)(System Soft)(JP) MSX JP +CBEFB9797973EF12D44F83FA5AE1E065 Ogre (1987)(System Soft)(JP)[mouse] MSX JP +82CD46D7908C42417FF7F40B4D277E45 Ogre (1987)(System Soft)(JP)[press LSHIFT at boot] MSX JP +EFF230804098FFE4D342F389B5209EAC Out Run (1988)(Pony Canyon)(JP) MSX JP +2BD6B2A2091A476853E80F6BE18C9C3F Out Run (1988)(Pony Canyon)(JP)[a] MSX JP +AEE5BFDE07DA953EADA70D618A933D06 Pachipro Densetsu (1989)(HAL Laboratory)(JP) MSX JP +45F9B96088F36697F779AF7DE373F8FE Pac-Mania (1989)(Namcot)(JP) MSX JP +5C6A139FC5D97C8B7D40B704EF8E06A1 Penguin Kun Wars 2 (1988)(ASCII)(JP) MSX JP +415A5337EB46846CAB8FC36390700E7D Penguin Kun Wars 2 (1988)(ASCII)(JP)[a] MSX JP +3DB77573E81184156486FE743B828E58 Penguin Kun Wars 2 (1988)(ASCII)(JP)[a2] MSX JP +3A3BEF37CB175A665E7ABBBC80B32E92 Predator (1988)(Pack In Video)(JP) MSX JP +3CD4E9D0369842440AD5888A52CDCF9A Pro Baseball Fan (1988)(Telenet Japan)(JP) MSX JP +4F9C53D6F5ED2AA2876BB78408B39084 Professional Mahjong Gokuh (1988)(Chatnoir)(JP) MSX JP +9FFA0D56003931C45B232521724B2B8B Project A2 (1987)(Pony Canyon)(JP) MSX JP +D24B39B0CCEA87BFC9546B240846376E Project A2 (1987)(Zemina)(KR) MSX KR +B34B756E16F07E26C2052823BAB93592 Quarth (1990)(Konami)(JP)[RC-769] MSX JP +F49482108DE2BA67E6C093E7853ADBD2 Quarth (1990)(Konami)(JP)[SCC][RC-769] MSX JP +384527F9303A9A7A632B33C05D738F63 Quarth (1990)(Konami)(ko)[RC-769] MSX ko +A95A4348DFBB8C0D9E3E0A9DA770031B Quarth (demo) (1990)(Konami)(JP)[RC-769] MSX JP +BC946D90BD20E0805984F67BB4B93FC2 Quinpl (1988)(Bit2)(JP) MSX JP +114264BBCD0FDFA7BD083A983606A200 Rastan (1988)(TAITO)(JP) MSX JP +EF65109831AA59C765053F4C1B5D70B1 Rastan (1988)(Taito)[a] MSX +DD3E2F7C437F00AC77EEB9E9975ED947 Relics (1986)(Bothtec)(JP) MSX JP +405B64B6A05F572420E084CDEA63C3F9 Relics (1986)(Bothtec)(JP)[a] MSX JP +F004BB334A040FCCB76724DEEEF28087 Relics (1986)(Bothtec)(JP)[a2] MSX JP +5353BD7FB3C9A4D586001C543ECC6147 Relics (1986)(Bothtec)(JP)[a3] MSX JP +7D4C77200788E78126B98A7D7BA53D3C Replicart (1987)(Sony) MSX +795918EC755DBD76A8E1138F1C9ABB73 Return of Ishtar, The (1988)(Namcot)(JP) MSX JP +B2F9773DDE6BDB36AE1EC845E98DD914 Return of Jelda (1987)(Carry Lab)(JP) MSX JP +50312D8FAAEF4FFA55F49FEAB5669B0C Return of Jelda (1987)(Carry Lab)(JP)[a] MSX JP +E5BCB26C0F7CC33C466B8A88E9509591 Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP) MSX JP +9DF54A16476239E572747CC9A83C5B32 Rick & Mick's Adventure (1987)(Humming Bird Soft)(JP)[a] MSX JP +6A1571A643E6C34837535A3240F85EF2 Royal Blood. Gemfire (1991)(Koei)(JP) MSX JP +34301E3F3F3AA4E0CBD657CAAB003237 Sangokushi 2. Romance of Three Kingdoms 2 (1990)(Koei)(JP) MSX JP +AFE6A9160C79D579F18B2980F8874A6E Sangokushi. Romance of Three Kingdoms (1987)(Koei)(JP) MSX JP +F65B39A6475911F935B3D8C00B8B52A0 Satujin Kurabu. Murder Club (1988)(Micro Cabin)(JP) MSX JP +5951DC047C5A102E9CF9E1A59D2596D2 Scramble Formation (1987)(TAITO)(JP) MSX JP +DA329EC7DA6E992536419B07B9909CBC Scramble Formation (1987)(Taito)(JP)[a] MSX JP +E6398263C9183A48326F21BBE7FDE655 Scramble Formation (1987)(Taito)(JP)[b2] MSX JP +76A2FD7F38D9FB6B5192115FC5182B7F Seigimatsu II Special Attack Devil (1987)(Sony)(JP) MSX JP +42B81E1C71EC8AF3F37D90E4C020C697 Seigimatsu II Special Attack Devil (1987)(Sony)(JP)[a] MSX JP +2ECF4DE0553BE3746B76F012E6F6CFA2 Seigimatsu II Special Attack Devil (1987)(Sony)(JP)[a2] MSX JP +6429D308164CCB0AEA2888F5CFFA66AA Shanghai (1987)(System Soft)(JP) MSX JP +89DB61D03A72AEDE925D79E02706F666 Shiryou Sensen. War of the Dead (1987)(Victor)(JP) MSX JP +AE08CB529C454EE7477AC61662E02858 Shiryou Sensen. War of the Dead (1987)(Victor)(JP)[a] MSX JP +41F4C112671B666220137F721E1460AA Shiryou Sensen. War of the Dead (1987)(Victor)(JP)[a2] MSX JP +392673199BB16D1E96A081E5449A9748 Sony HBI-V1 Video Digitizer (1989)(Sony)(JP) MSX JP +F78B9F4EA885CF072E5B41DCE9F15436 Space Manbow (1989)(Konami)(JP)[RC-768] MSX JP +50D33427A8D7E409FF1EB718E69C94FE Space Manbow (1989)(Konami)(JP)[SCC][RC-768] MSX JP +D2F51A8AC5B78D322D6BA404E962F07A Star Virgin (1988)(Pony Canyon)(JP) MSX JP +21EABA844F408C094C2D190D68DF3842 Star Virgin (1988)(Pony Canyon)(JP)[a] MSX JP +0F235700EECB79B0E5A517118D48112C Strategic Mars (1988)(dB-Soft)(JP) MSX JP +62BE2CD42B3DB21E68DF4C6A529188ED Strategic Mars (1988)(dB-Soft)(JP)[a] MSX JP +22F48218A0DB04EDD8F90BC4355E2DE9 Suikoden - Tenmei no Chikai. Bandit Kings of Ancient China (1989)(Koei)(JP) MSX JP +4350A658720A2E8F7ECC46FB99C2209E Super Daisenryaku. Super Risk (1988)(Micro Cabin)(JP) MSX JP +581FD0C7AB5D2E355C5BFFA3946BDBF6 Super Lode Runner (1987)(IREM)(JP) MSX JP +1A504223FDC2476A57198F80E8410A2A Super Rambo Special (1985)(Pack In Video)(JP) MSX JP +A5E9D141552DC8A30B0D0F273463B5FF Super Runner (1987)(Pony Canyon)(JP) MSX JP +A5FC4E9B290EE0E2E8EBB7F8B49D1ACE Super Runner (1987)(Pony Canyon)(JP)[a] MSX JP +3032194B7FBC4C7AF47B140739E7CE84 Super Tritorn (1986)(Xain)(JP) MSX JP +3EA01C97FE0201AEDE87A3F772B1871A Taiyou no Shinden - Asteka II. Temple of the Sun (1988)(Tokyo Shoseki)(JP) MSX JP +9C8BC23C7ACAD95BA2CBDA6CBF48339B Take the A Train (1989)(Pony Canyon)(JP) MSX JP +5DEE9DB145D631A97BF4C645E76F3B20 Teitoku no Ketsudan. Pacific Theater of Operations (1991)(Koei)(JP) MSX JP +88E940BB5C15D201BF1779821C10D923 Tengoku Yoitoko. Heaven (1987)(Taito)(JP) MSX JP +C59CDE4B921BC9E9D38DCB50198086DF Tengoku Yoitoko. Heaven (1988)(Zemina)(KR)(ko) MSX ko KR +853F56779AD94235C7089AB23F8D4EF2 Tengoku Yoitoko. Heaven (1988)(Zemina)(KR)(ko)[a] MSX ko KR +3AE183EDB7F89666B23F041FD592DF3C Tetris (1988)(BPS)(JP) MSX JP +02C96ACAD350F4BF392640470D3F9784 Title Memory (1989)(Konami)(JP)[a][SCC+] MSX JP +1C99A800A96157EF48C1F1F7EB30677E Title Memory (1989)(Konami)(JP)[SCC] MSX JP +5B851C7342FD42A96D126FEF14906D09 Title Memory (1989)(Konami)(JP)[SCC+] MSX JP +5D451B24113E05C7F81BF2B806E843C8 Topple Zip (1987)(Bothtec)(JP) MSX JP +D5EC6055DA9A7ACF301E3E7FD8EBEE27 Topple Zip (1987)(Bothtec)(JP)[a] MSX JP +9AAB75984B06C21ED8E6214474D3A68E Treasure of Usas, The (1987)(Konami)(JP)[a][RC-753] MSX JP +E182D403A3929FDD3F66F74C6A439F17 Treasure of Usas, The (1987)(Konami)(JP)[a2][RC-753] MSX JP +750D755FA577E033754C95C6A850B878 Treasure of Usas, The (1987)(Konami)(JP)[RC-753] MSX JP +8C6FAD6B48EBEEB663DCE40617A9576A Tsururin Kun. Rice Eating 2. Egg Stealing (1989)(Konami)(JP)[a][SCC+] MSX JP +746E48F4B138CC0A75899715299ED778 Tsururin Kun. Rice Eating 2. Egg Stealing (1989)(Konami)(JP)[SCC] MSX JP +974FA74F31484769EA18BC427A6A0812 Tsururin Kun. Rice Eating 2. Egg Stealing (1989)(Konami)(JP)[SCC+] MSX JP +AC309104C4BCC0CBF56AC1D2295F1119 Turikichi Sampei Burumarine-Hen. Blue Marlin (1988)(Victor)(JP) MSX JP +B94A21A6017844335F0AD989968F0786 Turikichi Sampei Turisennin-Hen. Fishing Freak (1989)(Victor)(JP) MSX JP +DFD60916A37E37B3A5B36523F6349109 Ultima III - Exodus (1987)(Pony Canyon)(JP) MSX JP +2B4F2B6EAC82422EDA32BADF60AEE213 Urusei Yatsura - Koi no Survival Birthday (1987)(Micro Cabin)(JP) MSX JP +4F4D65A9E3F86349ABFCAB82E52CD207 Victorius Nine II (1988)(Nidecom)(JP) MSX JP +7EF6C2579156F1828FDB6DE39EDA647E Victorius Nine II (1988)(Nidecom)(JP)[b2] MSX JP +53975CFFF7A51F79E707E29E984D215A Wizardry - Proving Grounds of Mad Overload (1987)(ASCII)(JP) MSX JP +24B443A15DA41134A366F145FC336FAB Woody Poco (1987)(dB-Soft)(JP) MSX JP +3D8C2A836A4B16A739003B07D76C0459 Woody Poco (1987)(dB-Soft)(JP)[a] MSX JP +261A860DEE771EA77C2D813B97366F9E Xevious - Fardraut Saga (1988)(Namcot)(JP) MSX JP +72430889F4E5239A5ED9742A1B84C03A Xevious - Fardraut Saga (1988)(Namcot)(JP)[a] MSX JP +C271C503C50BBBBA7EFC04F5F9AC6DEC Yaksa (1987)(Wolfteam)(JP) MSX JP +FD325B9F4997D70397F59379E679E420 Yuurei Kun. Mr Ghost (1989)(System Sacom)(JP) MSX JP +73DBE097AEC5ED7B1F79FD28D243CB18 Yuurei Kun. Mr Ghost (1989)(System Sacom)(JP)[a] MSX JP +9BF8EE3FB42F475F6C6C1789F4B93C42 Zanac-Ex (1986)(Pony Canyon)(JP) MSX JP +03D381A40BAED2BE60F09A91B52316CC Zanac-Ex (1986)(Pony Canyon)(JP)[a] MSX JP +27AE0BD156BA5E0D5387821C18D7CFF3 Zanac-Ex (1986)(Pony Canyon)(JP)[a2] MSX JP +3BA77F331A92ACF0D3E64847D4A2CA24 Zoids (1988)(Toshiba-EMI)(JP) MSX JP +1E1C7E58F67F6D4DD96C3E818A057D9F Zombie Hunter (1988)(Hi-Score Software)(JP) MSX JP +81A5853B8D046A8B3078283AC78BF2D1 Zombie Hunter (1988)(Hi-Score Software)(JP)[a] MSX JP +532C46B3F3B28EA4E1DDB215BA7AB5B0 Zukkoke Yajikita Onmitsudoutyuu (1987)(HAL Laboratory)(JP) MSX JP +BA2E644A68677CF42C116781579896D7 Zukkoke Yajikita Onmitsudoutyuu (1987)(HAL Laboratory)(JP)[a] MSX JP diff --git a/Assets/gamedb/gamedb_n64.txt b/Assets/gamedb/gamedb_n64.txt index 511260f3b2..ecc5fc9b51 100644 --- a/Assets/gamedb/gamedb_n64.txt +++ b/Assets/gamedb/gamedb_n64.txt @@ -555,8 +555,8 @@ A5359E35839B40C414EAE498CA633B28176629AA G Olympic Hockey 98 (Japan) N64 Glide_ 7592F4C16B8E040539B5DCC201FAB2965A5E8C8D G Onegai Monsters (Japan) N64 133F17162B2734286F9E94F64ACB1538B11506B2 G Operation WinBack (Europe) (En,Fr,De,Es,It) N64 B8F29E8EFCF51EE9A6A16E2A1E60442B4F304950 G Pachinko 365 Nichi (Japan) N64 -2111D39265A317414D359E35A7D971C4DFA5F9E1 G Paper Mario (Europe) (En,Fr,De,Es) N64 Glide_enable_hacks_for_game=15;Glide_fb_hires_buf_clear=false;Glide_fb_optimize_texrect=false;Glide_swapmode=2;Glide_fb_smart=true;Glide_fb_read_alpha=true;Glide64mk2_enable_hacks_for_game=20;Glide64mk2_hires_buf_clear=false;Glide64mk2_optimize_texrect=false;Glide64mk2_filtering=1;Glide64mk2_swapmode=2;Glide64mk2_fb_smart=true;Glide64mk2_fb_read_alpha=true;Jabo_Clear_Frame=1;GLideN64_CopyColorToRDRAM=2 -3837F44CDA784B466C9A2D99DF70D77C322B97A0 G Paper Mario (USA) N64 RiceFrameBufferOption=3;RiceRenderToTextureOption=3;RiceScreenUpdateSettingHack=4;Glide_enable_hacks_for_game=15;Glide_fb_hires_buf_clear=false;Glide_fb_optimize_texrect=false;Glide_swapmode=2;Glide_fb_smart=true;Glide_fb_read_alpha=true;Glide64mk2_enable_hacks_for_game=20;Glide64mk2_hires_buf_clear=false;Glide64mk2_optimize_texrect=false;Glide64mk2_filtering=1;Glide64mk2_swapmode=2;Glide64mk2_fb_smart=true;Glide64mk2_fb_read_alpha=true;Jabo_Clear_Frame=1;GLideN64_CopyColorToRDRAM=2 +2111D39265A317414D359E35A7D971C4DFA5F9E1 G Paper Mario (Europe) (En,Fr,De,Es) N64 Glide_enable_hacks_for_game=15;Glide_fb_hires_buf_clear=false;Glide_fb_optimize_texrect=false;Glide_swapmode=2;Glide_fb_smart=true;Glide_fb_read_alpha=true;Glide64mk2_enable_hacks_for_game=20;Glide64mk2_hires_buf_clear=false;Glide64mk2_optimize_texrect=false;Glide64mk2_filtering=1;Glide64mk2_swapmode=2;Glide64mk2_fb_smart=true;Glide64mk2_fb_read_alpha=true;Jabo_Clear_Frame=1;GLideN64_CopyColorToRDRAM=1 +3837F44CDA784B466C9A2D99DF70D77C322B97A0 G Paper Mario (USA) N64 RiceFrameBufferOption=3;RiceRenderToTextureOption=3;RiceScreenUpdateSettingHack=4;Glide_enable_hacks_for_game=15;Glide_fb_hires_buf_clear=false;Glide_fb_optimize_texrect=false;Glide_swapmode=2;Glide_fb_smart=true;Glide_fb_read_alpha=true;Glide64mk2_enable_hacks_for_game=20;Glide64mk2_hires_buf_clear=false;Glide64mk2_optimize_texrect=false;Glide64mk2_filtering=1;Glide64mk2_swapmode=2;Glide64mk2_fb_smart=true;Glide64mk2_fb_read_alpha=true;Jabo_Clear_Frame=1;GLideN64_CopyColorToRDRAM=1 7DB4808042B9651B47592E814AC4C125B51D4D2F G Paperboy (Europe) N64 B043C47B9758FA6BB289CA7DBA2068BDA6CAFA3A G Paperboy (USA) N64 9887A0E4BFE3C5E85E31638853574069F6C41CD3 G Parlor! Pro 64 - Pachinko Jikki Simulation Game (Japan) N64 Glide_force_microcheck=true;Glide64mk2_force_microcheck=true;Glide64mk2_filtering=1 diff --git a/Assets/gamedb/gamedb_nes.txt b/Assets/gamedb/gamedb_nes.txt index b837ef1be5..ec808e4165 100644 --- a/Assets/gamedb/gamedb_nes.txt +++ b/Assets/gamedb/gamedb_nes.txt @@ -305,7 +305,6 @@ sha1:17473C223453D2D80FCB9DCFA317947287DC5C52 Xing He Zhan Shi (China) (Unl) NE sha1:B1C74236FD17FAB4AB9AA6AB28E38864C66D6255 Pocahontus (UNL) NES board=MAPPER182;PRG=256;CHR=256;WRAM=8;PAD_H=1 sha1:5FA23F88432006DCF6874EA36E9E7DA8934427BE Super Donkey Kong (Unl) NES board=MAPPER182;PRG=128;CHR=128;WRAM=8;PAD_H=1 sha1:8A7DAB8B78DA1C5EA159BA9EEC00FF97742245F1 B Super Donkey Kong (Unl) [b1] NES board=MAPPER182;PRG=128;CHR=128;WRAM=8;PAD_H=1 -sha1:8A7DAB8B78DA1C5EA159BA9EEC00FF97742245F1 O Super Donkey Kong (Unl) [o1] NES board=MAPPER182;PRG=128;CHR=128;WRAM=8;PAD_H=1 ;wrong vram info sha1:32D71DD6C5A8D78A918FE1B9D6D6C4A570D9652D Oeka Kids Anpanman no Hiragana Daisuki (J) NES board=MAPPER096;VRAM=32 diff --git a/Assets/gamedb/gamedb_sega_gg.txt b/Assets/gamedb/gamedb_sega_gg.txt index 2a985e1e03..5ca25a02c2 100644 --- a/Assets/gamedb/gamedb_sega_gg.txt +++ b/Assets/gamedb/gamedb_sega_gg.txt @@ -321,7 +321,7 @@ E0E2FBD5834C04574795C923B0147F39 Pop Breaker (J) GG GGLink Japan 197E31DCAFEA7023CC948FEA29C50230 Prince of Persia (UE) (SMSGG) (Beta) GG GG_in_SMS USA;Europe F9AE1762ED006C001E811FE6F072ABB7 The Pro Yakyuu '91 (J) GG Sports;Baseball GGLink Japan 45D214CD027DEE5CE2ADFCD6458DEC2C Pro Yakyuu GG League '94 (J) GG Sports;Baseball SRAM=128;GGLink Japan -527449BC2AAC2C8A16853FAC63E60AF6 Pro Yakyuu GG League (J) GG Sports;Baseball SRAM=128;GGLink Japan +527449BC2AAC2C8A16853FAC63E60AF6 Pro Yakyuu GG League (J) GG Sports;Baseball SRAM=128;GGLink;EEPROM Japan 52CFDDC12AF6A3A64030F62CCF6ACA83 Psychic World (UE) (Rev 1) GG USA;Europe A764B44555AADB48C519E7C85BDF7895 Psychic World (J) (En) GG Japan 61C0B40329F89007AB44CC5EB29ADDFD Putt & Putter (UE) GG Sports;Golf GGLink USA;Europe @@ -473,7 +473,7 @@ C017BAF7FA0DE71219DFAB91CAA59F8F Woody Pop (W) GG World A23E89266DDAD3C856E7401D04A49C6C Woody Pop (W) (Rev 1) GG World 13F72ACFEA47587F9AA9F655BF98653C World Class Leader Board Golf (UE) GG Sports;Golf USA;Europe D95D381C6AFFB8345EE5457655E393D1 World Cup USA 94 (UE) (En,Fr,De,Es,It,Nl,Pt,Sv) GG Sports;Soccer USA;Europe -D8939B64458FAF174CDC1241F777CB59 World Derby (J) GG GGLink Japan +D8939B64458FAF174CDC1241F777CB59 World Derby (J) GG SRAM=8192;GGLink Japan E7EABBFC7A1F1339C4720249AEA92A32 World Series Baseball '95 (U) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA 59359FC38865CFF00C90D6EB148DDC2F World Series Baseball (U) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA 05CAC33029F0CAAC27774504C1AA8597 World Series Baseball (U) (Rev 1) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA diff --git a/Assets/gamedb/gamedb_sega_md.txt b/Assets/gamedb/gamedb_sega_md.txt index 6854ef14ed..8e8b16d007 100644 --- a/Assets/gamedb/gamedb_sega_md.txt +++ b/Assets/gamedb/gamedb_sega_md.txt @@ -2653,12 +2653,12 @@ C5E4B901CA41524C182E576BEDB13981 Madden NFL 97 (UE) [!] GEN 31FDA133C077E6315232016CEDF3AABE Madden NFL 97 (UE) [b1] GEN 40D39CE3B288D3E3AC59ACE17CF053B7 Madden NFL 97 (UE) [b2] GEN 9277DB50DF385883749A74A87901B8C8 Madden NFL 97 (UE) [b3] GEN -7A960CF918F5D014BC5E5C330EA6642E Madden NFL 98 (U) [b1] GEN -E1A03EE2334ED425E71278D38A70E4E4 Madden NFL 98 (U) [b2] GEN -E3044F5DE786CFA13F2D689E427F62E3 Madden NFL 98 (U) [c][!] GEN -5B66890D9A48EE0EDF7FFAD7920BFCC8 Madden NFL 98 (U) [h1C] GEN -D9B1C5D34D112051E838F720A26CC8CF Madden NFL 98 (U) [h2C] GEN -22BBDE2293E404C5C91CD3CBE59CF4DD Madden NFL 98 (U) [h3C] GEN +7A960CF918F5D014BC5E5C330EA6642E Madden NFL 98 (U) [b1] GEN sram=1 +E1A03EE2334ED425E71278D38A70E4E4 Madden NFL 98 (U) [b2] GEN sram=1 +E3044F5DE786CFA13F2D689E427F62E3 Madden NFL 98 (U) [c][!] GEN sram=1 +5B66890D9A48EE0EDF7FFAD7920BFCC8 Madden NFL 98 (U) [h1C] GEN sram=1 +D9B1C5D34D112051E838F720A26CC8CF Madden NFL 98 (U) [h2C] GEN sram=1 +22BBDE2293E404C5C91CD3CBE59CF4DD Madden NFL 98 (U) [h3C] GEN sram=1 571F2908C01D5B4FEAFAC5663A85A897 Madonna Songs for 50HZ (PD) GEN 41B8BA3569E3F4F98155DEA64318D223 Madou Monogatari I (J) [!] GEN D82529E8ABD9D82C4907867ACE6C581B Madou Monogatari I (J) [b1] GEN @@ -3179,7 +3179,7 @@ ADD607E0DD5B9F294BB5A246D8946AED NHL 96 Elitserien (E) GEN 0D48E7FC7BE607CAA4B18615A718E5B7 NHL 97 (UE) [b1] GEN 31F2A66438932E5318A1BD46EC2CABB1 NHL 97 (UE) [b2] GEN 24D07598509CFBF10C450DD8FD274C41 NHL 97 (UE) [b3] GEN -A2C92C09D420CF7C2D2E55E8777F3A31 NHL 98 (U) [c][!] GEN +A2C92C09D420CF7C2D2E55E8777F3A31 NHL 98 (U) [c][!] GEN sram=1 32917C8A2D984FE32B342DBDAF78F50C NHL 98 (U) [h1C] GEN C80ACA6AE52106638CAEE05FDE2FD9B7 NHL 98 (U) [h2C] GEN 03EB2646961C7B68E06A8CE5522538B9 NHL 98 (U) [h3C] GEN @@ -8244,3 +8244,11 @@ D4F6BE2B9A4F9ADCA87C23045C85FED0CAC569FE Zombies Ate My Neighbors (U) [t1] GEN E9E97CA25221D1CFA8B7378C06D9AB9FD39683D3 Zool (U) [T+Fre_Terminus] GEN E155901D8710B1347204C9EBBC18A2F20565C478 D Zoom VDP Hardware Scaling by Fonzie (PD) GEN D4B54EABDE3372D9CAEE27C9F0D4E9AC23F242E7 B Zoop (U) [b2] GEN +E35CE10A59DD8C0082212CA24368BA96D1EB2D24 Newman-Haas IndyCar Racing (W) [p1] GEN +8D50867ABA721185560FC92BED75C92263A1DA39 Anima Land (J) GEN +8D6114B71750E1153A8D0DE00CDF3A162668C25B H Dragon Ball Z - Buyuu Retsuden Input Added Edition (Hack) GEN +C098B6D802B52215D52FF1FAA26CA37BD1260CF1 T Dragon Slayer II - The Legend of Heroes (J) [T+Chi] GEN +058D2983C413A4B4AF180A5FA6534C24FC2C36E7 T Lord Monarch (J) [T+Chi] GEN +CAAA233136DFC289D2FF4A1BA1B752AEA0D736F2 H Megaman - The Wily Wars - Power Control Mod by Segaman (Hack) GEN +ACD3AFD1E945105939F906A748FF70E76B855B04 H Sonic - Omochao (S1 Hack) GEN +AF35F3E5462455EB82D4FDC684214BC9166A2B8F H Sonic by Krizal Chen (Dsght) (S2 Hack) GEN diff --git a/Assets/gamedb/gamedb_vectrex.txt b/Assets/gamedb/gamedb_vectrex.txt new file mode 100644 index 0000000000..4ba83c75a7 --- /dev/null +++ b/Assets/gamedb/gamedb_vectrex.txt @@ -0,0 +1,26 @@ +#include gamedb_vectrex_nointro.txt +#include gamedb_vectrex_tosec.txt + +;;;;---------------------------------------------- +;;;; Currently the above gamesdb files are generated automatically from NOINTRO and TOSEC files +;;;; Each file is commented automatically and split up first into the various files that were imported, then by RomStatus +;;;; +;;;; NOTE TO DEVS: +;;;; Any overrides should be placed below. +;;;; Bizhawk (I believe) takes the last entry it sees when duplicates are present, so this should work. +;;;; +;;;;---------------------------------------------- + +;;;;---------------------------------------------- +;;;; Overrides (dont edit the included files above directly!) +;;;;---------------------------------------------- + +;;; BAD + +;;; Actually GOOD +;SHA1:67F8513958C04E936B135740ED4EC6E6FA1763D5 Clean Sweep VEC +;SHA1:38E38B5C60466146D4648F8929B5CE3A08DCBE0D Scramble VEC + +;;; Actually TRANSLATED + +;;; Games NOT present in TOSEC \ No newline at end of file diff --git a/Assets/gamedb/gamedb_vectrex_nointro.txt b/Assets/gamedb/gamedb_vectrex_nointro.txt new file mode 100644 index 0000000000..47d3fd1324 --- /dev/null +++ b/Assets/gamedb/gamedb_vectrex_nointro.txt @@ -0,0 +1,68 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: NO-INTRO +;;; Source: GCE - Vectrex - 20170908-211236 +;;; FileGen: 2020-01-27 13:44:59 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +00F768E79D6EBFE9BF920FFEC4C5C4F2 3D Crazy Coaster (USA) VEC USA +1A81FEA8AC1C1D46DE7B633814130857 3D Mine Storm (USA) VEC USA +F79C596A0205C5E7C427CDBBB1E16918 3D Narrow Escape (USA) VEC USA +5E7A5DC59E32F2F63D85AE1F0201113A AnimAction - Advanced Animation (USA) VEC USA +9657037A461EEE919462EB6A01879685 Armor..Attack (World) VEC World +972972F871916A922F20779DEED8A708 Art Master (USA) VEC USA +268E75778F282D853D77ACF42C6C8734 Bedlam (USA, Europe) VEC USA, Europe +640AE7BD4538BAD11256999DB68DE5A0 Berzerk (World) VEC World +94F144C31FD4563F9473ED0563463E54 Blitz! - Action Football (USA, Europe) (0F11CE0C) VEC USA, Europe +5D74770BB175357812E61EE7CA731270 Blitz! - Action Football (USA, Europe) (881B27C5) VEC USA, Europe +A376D5648E08F348E5965C058C631C6D Clean Sweep (World) VEC World +9B61653ED9DAFD4CFB7F9D94404259AC Cosmic Chasm (World) VEC World +DB9929B0AD53C97AFDA065596806BF86 Dark Tower (USA) (Proto) VEC USA +896793A17A32932BCD64C52C77B00D55 Engine Analyzer (USA) (Proto) VEC USA +E65B3262E9447A747D93E0CCB1DBB7DF Fortress of Narzod (USA, Europe) VEC USA, Europe +501DD2845432F10E4B9531240F409B8C Heads-Up - Action Soccer (USA) VEC USA +7580926EE22F06FD2CCDE4B65184715F HyperChase - Auto Race (World) VEC World +E0DFC58763716C3B6A89E08F4869396E Mail Plane (USA) (Proto) (05838962) VEC USA +E6C821917E168B1E6E27BF2B90AD6CFB Mail Plane (USA) (Proto) (DA1AC0DB) VEC USA +80E72D7E1BB06FD5D5A24C93F1B61F14 Melody Master - Music Composition and Entertainment (USA) VEC USA +EE19E350BE0AF2A509A202B057488DC8 Mine Storm (World) VEC World +126FECBF4FB09FDB5A3C9AF92ABAED7C Mine Storm II (USA) (Rev 2) VEC USA +1C95CF8FCD2C98DB747208ADE464A44F Mr. Boston Clean Sweep (Europe) VEC Europe +E7BF7DE16B01419A819826CCE3DC25EE Pitcher's Duel (USA) (Proto) VEC USA +5C1C413E51AA282015807DC60213FD3D Polar Rescue (USA) VEC USA +F599DA79B5C324C2A11C117D256A64C0 Polar Rescue (USA) (Beta) VEC USA +F94173910549038D4D8F329413A5AA54 Pole Position (USA) (A00ED3D6) VEC USA +F85C521F445C82BF200B5B85B9B1CD60 Pole Position (USA) (C10F37D8) VEC USA +4BB04A738C216E98CC07ED28F6CD4DB8 RA+A Spectrum I+ Stress Tester (USA) (Proto) VEC USA +808E0501990BD01882C102DF00F20064 Rip Off (World) VEC World +95370908561A782EDF138DF41CCB8F18 Scramble (USA, Europe) VEC USA, Europe +CF6C01B0212E3B2191A97139CF1F427A Sledge 3D (USA) (Sample) VEC USA +11A9BD419CF094DE8CAA8A44D76B69AB Solar Quest (World) VEC World +2DECDF9F55DF7FB99761B2FE51425E40 Space Wars (World) VEC World +5A90AB748F7B220EDAF8C1D67E0BFE89 Spike (USA, Europe) VEC USA, Europe +ECC143F87A702AF7A1786B58A78ACE01 Spin ball (USA) VEC USA +1224C9BEAE22EE7354E4220C46237696 Star Castle (USA) VEC USA +47CEFE6F77DBAFB4475A64FE89DA02C0 Star Ship (Europe) VEC Europe +0B67A6339E9C1D8385E8FDFC48F447BC Star Trek - The Motion Picture (USA) VEC USA +ADD42C10019E88F47DD98791F8DE3148 StarHawk (World) VEC World +8D66945EB9826D91CE27E07B2F8854F9 Test Cartridge (USA) (Rev 4) (Proto) VEC USA +8CE9091361E0884BCD60409FC3301EDC Tour De France (USA) (Proto) VEC USA +A3E0F44454D4100B18493F1BD2485D8B WebWarp (Europe) VEC Europe +A398C18B4CE87929471B559B2BC7E79F WebWars (USA) VEC USA diff --git a/Assets/gamedb/gamedb_vectrex_tosec.txt b/Assets/gamedb/gamedb_vectrex_tosec.txt new file mode 100644 index 0000000000..fcb17c81cf --- /dev/null +++ b/Assets/gamedb/gamedb_vectrex_tosec.txt @@ -0,0 +1,505 @@ +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Applications (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +ED697EFBECFC038BB7BA760D0C96071D B Animaction (1983)(GCE)[b][lightpen] VEC +B594813775AA2870007AE0E3B418A8CF B Art Master (1983)(GCE)[b][lightpen] VEC +F14891F89E0FE6AA4BE6B1FB3694AFA2 B Etch-a-Sketch (1985)(Woolsey, Jeff)(PD)[b][lightpen] VEC +2D2DB95120D8236D6AEBB9F0785A928F B Melody Master (1983)(GCE)[b][lightpen] VEC +17EEADAFB49D2D36358CE19F0FA5707D B Test Cartridge rev. 4 (1982)(-)(PD)[b] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +B716228FD8B3EBD44E81F5AC956D8E0D D Etch-a-Sketch (1985)(Woolsey, Jeff)(PD)[lightpen] VEC +25CAB86484AE04CA9D3A5EFA661A40E0 D Exec Rom Dumper (2000)(Habot, Ronen)(PD) VEC +F7CAA81033DD298C7EBF7DFFE2D96205 D Joystick Test (2000)(Parssinen, Manu)(PD) VEC +2DDDC520F125FF487E4C2919E5CAE800 D Pythagorian Theorem (2003)(Mitchell, Rob)(PD) VEC +AA12D8183B6302B56F453CE00BF0EA37 D Pythagorian Theorem (2003)(Mitchell, Rob)(PD)[a] VEC +ACA19A23AAC100B15B90F22A3E6AE483 D Vectrex Bootstrap Loader (1985)(Woolsey, Jeff)(PD) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +5E7A5DC59E32F2F63D85AE1F0201113A Animaction (1983)(GCE)[lightpen] VEC +972972F871916A922F20779DEED8A708 Art Master (1983)(GCE)[lightpen] VEC +896793A17A32932BCD64C52C77B00D55 Engine Analyzer (1983)(GCE)[lightpen] VEC +80E72D7E1BB06FD5D5A24C93F1B61F14 Melody Master (1983)(GCE)[lightpen] VEC +4BB04A738C216E98CC07ED28F6CD4DB8 Spectrum I+ (198x)(RA+A)(proto) VEC +8D66945EB9826D91CE27E07B2F8854F9 Test rev4 (1982)(GCE)(proto) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Compilations (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +70E9DCA9114F08091E7EF5622332A67F D Battle Earth Terror Hazard & Vecsports Boxing (2000)(Parssinen, Manu)(PD) VEC +26F8C50E32B7E819C0F4594E5379D9A3 D GCE Game Pack 1 v0.1 (200x)(-)(PD) VEC +613B8BEB36116587AB2FA9A7D704E39B D GCE Game Pack 2 v0.1 (200x)(-)(PD) VEC +9F6EC44B307075528EBF94CBEC023A10 D Vaboom! + Vectrace (2000-07)(Habot, Ronen)(PD) VEC +340C6B08F06D3CCC16915E964CF40D87 D Vaboom! + Vectrace (2000-07)(Habot, Ronen)(PD)[a][vaboom!] VEC +44CDF13CA9E9364A1123519067705649 D Vaboom! + Vectrace (2000-07)(Habot, Ronen)(PD)[a][vetrace] VEC +F5809F3325A2901B68709EE137BDD80D D Vaboom! + Vectrace (2000-07)(Habot, Ronen)(PD)[vaboom!] VEC +54E258D28CA8306B0E09DB75F926804E D Vaboom! + Vectrace (2000-07)(Habot, Ronen)(PD)[vetrace] VEC +050256603B56D1385B8F8E252A0C2173 D Vecmania Part 1 (1999)(Dondzila, John)(PD) VEC +499057386F23F4ECB30E01D27B958A56 D Vecmania Part 1 (1999)(Dondzila, John)(PD)[a] VEC +E1F186888B1356EBB7E2C6A122C703DC D Vecmania Part 2 (1999)(Dondzila, John)(PD) VEC +ACA19A23AAC100B15B90F22A3E6AE483 D Vectrex Bootstrap Loader (1985)(Woolsey, Jeff)(PD) VEC +E69ADEF3088DFDC6E2EC22DBD57B9556 D Vexperience & Battle Earth Terror Hazard & Vecsports Boxing (2000)(Parssinen, Manu)(PD) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Demos - Music (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +B94CEBCBD923AA28BEF56B45D09CA925 D Bach Prelude #1 (1985)(Woolsey, Jeff)(PD) VEC +7E5C15422794D8C5F969A83608BF679C D Music Test (2001)(-)(PD) VEC +5482E1B852B451E60C763EF59E309DC1 D My Bonnie Lies Over The Ocean (1985)(Woolsey, Jeff)(PD) VEC +52301EE5DCEB04DC730D45ABC47F08AA D ROM Music (2000)(Parssinen, Manu)(PD) VEC +36F466DB070B2FE1657129D1367EA9CD D Song E (19xx)(-)(PD) VEC +7550E332E055091F88FDA71D4BBD1583 D Sound1 (19xx)(-)(PD) VEC +789A7668CDCAE25F27122AA96E2753C7 D Star Spangles Banner (1985)(Woolsey, Jeff)(PD) VEC +59C897CA8A0BB4BFA080E0D01370E9C2 D Vectrex YM-Sound - Arkanoid - Revenge of DOH (1998)(Salomon, Christopher)(PD) VEC +705BAA1DB46F27E66913A933CBC8196E D Vectrex YM-Sound - Axel F - Beverly Hills Cop (1998)(Salomon, Christopher)(PD) VEC +58859226CD3FBB291CD7981A114EBB4C D Vectrex YM-Sound - Axel F - Beverly Hills Cop (1998)(Salomon, Christopher)(PD)[a] VEC +D8A67954770CF29F9EDAEC477F04E7BF D Vectrex YM-Sound - Bebop (1998)(Salomon, Christopher)(PD) VEC +006AD8DFD685F87174E49FA0378959E6 D Vectrex YM-Sound - Bebop Best (1998)(Salomon, Christopher)(PD) VEC +CC9792918915E31523F009FC0296854D D Vectrex YM-Sound - Bubble Bobble - Diamond Room (1998)(Salomon, Christopher)(PD) VEC +3CDF2E274BF780F8F25C1202990196C8 D Vectrex YM-Sound - Bubble Bobble 0 (1998)(Salomon, Christopher)(PD) VEC +F2133AF043282B9182B684F550762C01 D Vectrex YM-Sound - Bubble Bobble 1 (1998)(Salomon, Christopher)(PD) VEC +DFD96E375C90EE8CA15C379637D7D645 D Vectrex YM-Sound - Bubble Bobble 2 (1998)(Salomon, Christopher)(PD) VEC +81FEAEB2986BCB27F361ACE954E0A1F0 D Vectrex YM-Sound - Bubble Bobble 2best (1998)(Salomon, Christopher)(PD) VEC +D95A085A6D1BA7DA9CEDBA6A7E92E01D D Vectrex YM-Sound - Bubble Bobble 3 (1998)(Salomon, Christopher)(PD) VEC +9543A0D7DFD2DB931A680BD3C96DDDE3 D Vectrex YM-Sound - Commando - High Score (1998)(Salomon, Christopher)(PD) VEC +95DA24DFEE450052A61192884AB85911 D Vectrex YM-Sound - Count05 (1998)(Salomon, Christopher)(PD) VEC +F8DAD3F66234E87D2A189DD51FD2DFB7 D Vectrex YM-Sound - Dr Who theme (1998)(Salomon, Christopher)(PD) VEC +0CB85F8C8C4C8CBFA7DBC023BA104F92 D Vectrex YM-Sound - Fast Food 1 (1998)(Salomon, Christopher)(PD) VEC +0181563134A98FDEF33D73B264EC7736 D Vectrex YM-Sound - Fast Food 2 (1998)(Salomon, Christopher)(PD) VEC +8AF3D7C32D890F86DE94BABFF0D3F9EF D Vectrex YM-Sound - Ghosts 'n' Goblins 7 (1998)(Salomon, Christopher)(PD) VEC +4DAFE568EA93985607D191A6095BB6A8 D Vectrex YM-Sound - Ghosts 'n' Goblins 8 (1998)(Salomon, Christopher)(PD) VEC +850D58BF8C984F06C8CE6189106AD186 D Vectrex YM-Sound - Ghosts 'n' Goblins 9 (1998)(Salomon, Christopher)(PD) VEC +52EA6474D3887D0DC89C441E3FD518DF D Vectrex YM-Sound - Ghosts 'n' Goblins 9best (1998)(Salomon, Christopher)(PD) VEC +DF96FA54F2845FE06A4FC9499B198A6C D Vectrex YM-Sound - Ghouls 'n' Ghosts (1998)(Salomon, Christopher)(PD) VEC +442531AF912AECCA7501D4CB39CA637D D Vectrex YM-Sound - Great Giana Sisters - Bonus (1998)(Salomon, Christopher)(PD) VEC +70EE930334566CA5DE7481AA89CAD2BD D Vectrex YM-Sound - Great Giana Sisters - Ingame (1998)(Salomon, Christopher)(PD) VEC +775709FFF3ED12BA9183FEF4D407A8C2 D Vectrex YM-Sound - Great Giana Sisters - Title (1998)(Salomon, Christopher)(PD) VEC +C62B573EFFCF3E15B0464C278FDD7995 D Vectrex YM-Sound - Hey, Music Lover (1998)(Salomon, Christopher)(PD) VEC +EFA5D68DAB31DC3D25A91B2DCFAD6E4F D Vectrex YM-Sound - Horror Zombies From The Crypt (1998)(Salomon, Christopher)(PD) VEC +05317670338681A226AD6AB54C59F8BD D Vectrex YM-Sound - Jaws theme (1998)(Salomon, Christopher)(PD) VEC +2AE1F91BA656199F2C6C95D6C1462B38 D Vectrex YM-Sound - Klax Sound (1998)(Salomon, Christopher)(PD)[Level Begin] VEC +CAEA604B0C170C5A800E5958089E8BD2 D Vectrex YM-Sound - Madonna's Get Into The Groove (1998)(Salomon, Christopher)(PD) VEC +0C0C1739B9E1025B4A894428DA4E3E75 D Vectrex YM-Sound - Misfits 1 (1998)(Salomon, Christopher)(PD) VEC +79B911D03F7823F89C55F88CE7EAB10F D Vectrex YM-Sound - Monty on the Run - HiScore Sound (1998)(Salomon, Christopher)(PD) VEC +4FC4E342A142313D901BCE87C51C752F D Vectrex YM-Sound - Monty on the Run 1 (1998)(Salomon, Christopher)(PD) VEC +3961A29D9F46B6311D4E0A5F643F3B07 D Vectrex YM-Sound - Monty on the Run 2 (1998)(Salomon, Christopher)(PD) VEC +F3447B08E6BA463F1CD2CD1BD52BD938 D Vectrex YM-Sound - NO (1998)(Salomon, Christopher)(PD) VEC +D9D3837624E93A3890CF11908260D465 D Vectrex YM-Sound - Pac-Mania 1 (1998)(Salomon, Christopher)(PD) VEC +E99897FA4D03DC62E0472EE1E2D796A3 D Vectrex YM-Sound - Pac-Mania 2 (1998)(Salomon, Christopher)(PD) VEC +1C1398259611E983ACD4E798CF33BFBF D Vectrex YM-Sound - Pac-Mania 4 (1998)(Salomon, Christopher)(PD) VEC +3F4B38FA0C7DACD49F32ABEAADC0640D D Vectrex YM-Sound - Rainbow Islands (1998)(Salomon, Christopher)(PD) VEC +60B51B386800EFD3D22F3A9C235843EF D Vectrex YM-Sound - Real Ghostbusters (1998)(Salomon, Christopher)(PD) VEC +8D1DE01D950A05FF349E8B6A68D3EA22 D Vectrex YM-Sound - Robin Hood (1998)(Salomon, Christopher)(PD) VEC +986B6699C1AE18F6C4508885B191B02C D Vectrex YM-Sound - Star Wars (1998)(Salomon, Christopher)(PD) VEC +F70E2CB9A9803D10E362C7B83FF312FE D Vectrex YM-Sound - Star Wars Theme (1998)(Salomon, Christopher)(PD) VEC +5084BEC0F39182706E083ED28A55F903 D Vectrex YM-Sound - Turrican 1 (1998)(Salomon, Christopher)(PD) VEC +77EFFB3EB58CAE13A3E3C4CA047DA2BB D Vectrex YM-Sound - Turrican 2 (1998)(Salomon, Christopher)(PD) VEC +9B34E37F7E78D56C0D2551ED5473557B D Vectrex YM-Sound - YM001 (1998)(Salomon, Christopher)(PD) VEC +E69ADEF3088DFDC6E2EC22DBD57B9556 D Vexperience & Battle Earth Terror Hazard & Vecsports Boxing (2000)(Parssinen, Manu)(PD) VEC +2B09481830F58449CA103611811F318A D We Wish You a Merry Christmas - (1985)(Woolsey, Jeff)(PD) VEC +F3747EE47578C3BF53FFFEC343709F21 D We Wish You a Merry Christmas - (1985)(Woolsey, Jeff)(PD)[a] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +19810DC98CFEF682F24856437A161E9A We Wish You a Merry Christmas - (1985)(Woolsey, Jeff)[newer] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Demos - Slideshows (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +8C57A4FD5D6A0C3F316BE279AD1782CF D 0ldsk00l (2002)(Parssinen, Manu)(PD) VEC +CC8D22458EE86FCBB7D771A05A8B43D5 D All Your Base (2001)(Parssinen, Manu)(PD) VEC +C9E254F442BA8B82B80C101888A286D9 D Animation (2002)(Parssinen, Manu)(PD) VEC +8FE6D0CB5C8093D72456465B8AACE264 D Collision Test (2000)(Parssinen, Manu)(PD) VEC +23246F5DC34A7BEF1CE03299AE5224BD D Da Vecdemo 2k2 (2002)(Parssinen, Manu)(PD) VEC +774E9F9A1D7C26C04700429613D1D14F D Lines + Digitized Sounds (1998)(-)(PD) VEC +03C7959C07709082055A735392D00F39 D Philly Classic 3 (2002)(-)(PD) VEC +FDBD4E2E5EBEAB6A5C730F2B878C7BF8 D SAW Gallery 1 (1999)(Tumber, Christopher)(PD) VEC +87B9263AB0EB5D1397E722D4EE138946 D SAW Gallery 2 (1999)(Tumber, Christopher)(PD) VEC +655C737050D3785B23F378D30ADC5606 D SAW Gallery 3 (1999)(Tumber, Christopher)(PD) VEC +4EF370FEDDCBE448226BC54AA4F81926 D Vimpula (2002)(Parssinen, Manu)(PD) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +12B2AA353463C421DF178F744B742AC4 Climax Slideshow (2008-12-24)(Revival Studios) VEC +C92380263A81A347D7CE649A318CAD64 Performance VX (2003)(Revival Studios) VEC +19810DC98CFEF682F24856437A161E9A We Wish You a Merry Christmas - (1985)(Woolsey, Jeff)[newer] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Demos - Various (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +DBE429336C78A37C6B340540A2312D4D B Dual Vectrex Test #1 (1983)(-)(PD)[b] VEC +54470F6BCAD3C74F2C80371BE952F72A B Dual Vectrex Test #2 (1983)(-)(PD)[b] VEC +6108718DBB59278270B19F604BFFB737 B ZZZ-UNK-VecVoice (2002)(Hutchinson, Richard)[b] VEC +1E7A6F429ED0F426BB73DD08E07E83CC B ZZZ-UNK-VecVox (19xx)(-)(PD)[b] VEC +9190041255043AA6F7DA1D49F2ECEC5A B ZZZ-UNK-VecVox Driver (19xx)(Herbert, Alex)(PD)[b] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +4A45D8FC03E962FC34CFD827EF568204 D 3-D Demo (1998)(Salomon, Christopher)(PD) VEC +6C6E0AFC2DEE4E20D9FDF77177C738DB D 3-D Demo (2000-03-06)(Salomon, Christopher)(PD) VEC +4C3F98FFB5C9C29C881C1408F94E5A7E D 3-D Scrolling Demo (2001)(Tumber, Christopher)(PD) VEC +3F18DE10259E172CA9EF4B580D33FCA2 D 4-D Rotating Cube (19xx)(-)(PD) VEC +65BE26D550525934620B56DCDDE5AF5A D Alpha Test (2001)(-)(PD) VEC +B48AD4590945B79FC55BF2A4D1924786 D Arsek (2000)(Marq)(PD) VEC +BC246EAF3970C799D05A5C6E7F7C331E D Battlezone (2001)(Tumber, Christopher)(PD) VEC +257A3DA9F1BA8A08CA2F3F8D26616CAD D Calibration Demo (19xx)(Tumber, Christopher)(PD) VEC +BF16E6E50A076808968EB43768A4286C D CGM Example (2000)(Marq)(PD) VEC +7091EBE96C2A8A5683670EFF6AF16C0A D Curved Lines (1998)(Salomon, Christopher)(PD) VEC +F4F39388B719ACA17ED50E09B79EDC74 D Dual Vectrex Test #1 (1983)(-)(PD) VEC +918359F5CDFD0A1E64092B31513DD70F D Dual Vectrex Test #2 (1983)(-)(PD) VEC +BC2BAD32D1A000533A4BDEE46B3444F1 D Line Demo (2001)(-)(PD) VEC +E14246A66660950471274FC34221C687 D Manu's Boxer - Animated training (200x)(Parssinen, Manu)(PD) VEC +BDD1338CBDFD8A6C1CA3A31CF1D2577E D Pokemon Demo 1 (2000)(Parssinen, Manu)(PD) VEC +8A49779DFA3EDEFD162F385968D3A1B6 D Pokemon Demo 2 (2000)(Parssinen, Manu)(PD) VEC +510C656651C906B6E85396B5BABD90C3 D Pokemon Demo 3 (2000)(Parssinen, Manu - Marq)(PD) VEC +1FA52E5F675CB1956F1C40601521FDDC D Pokemon Demo 4 - Psyduck's Eyes (2000)(Parssinen, Manu)(PD) VEC +B3B3E498B1D3848E10E9E2E9C524E585 D Space Ship (2000)(Parssinen, Manu)(PD) VEC +3031F19F0A45473BF9496205150D5DC4 D Tank Demo 1 (19xx)(-)(PD) VEC +09F2EE6ACCD4BFE5C8F6EAB60F26351A D Tank Demo 2 (2001)(-)(PD) VEC +3E2DD22273524B82B7A2404D0842D475 D Taulukko (2002)(Parssinen, Manu)(PD) VEC +6570C68C72E82ABE07F5349517BA53AB D Text Demo (2001)(-)(PD) VEC +A966600FF9C7CD54D068A6F7316E79EE D This is Just a Non-Playable Demo (1999)(Balazs, Martin)(PD) VEC +845E95121FC58CB2CD6D0AC6BFC780A3 D Tono Demo (2000)(Marq - Antti)(PD) VEC +F23F312F1100872EFC0DC385B142C286 D Vectrex Demo 1 (2000)(Parssinen, Manu)(PD) VEC +00FFA6DB98E0C6A970F0295FD7BBA1F6 D Vectrex Demo 2 (2000)(Parssinen, Manu)(PD) VEC +03487BF82ECCE9BCF9219C668B8148B2 D Vectrex Demo 3 (2000)(Parssinen, Manu)(PD) VEC +4EF370FEDDCBE448226BC54AA4F81926 D Vimpula (2002)(Parssinen, Manu)(PD) VEC +D8B096480485B4E726088B4239A4B855 D Zoom & Rotate (2000)(Parssinen, Manu)(PD) VEC +9088FCB88FB6F2AA839C3BFA6363B09A D ZZAP - Scrolling Space Game (1989)(Krumlinde, Ville)(PD) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +FD5B667D58C1A34F9D92B1EDE820923F Scorefont (2002-08-26)(Parssinen, Manu) VEC +3DC500580B45F9166ED81EE0D2C8D1FF ZZZ-UNK-MP (demo) (19xx)(-) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Firmware (TOSEC-v2012-02-27) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +9190041255043AA6F7DA1D49F2ECEC5A B ZZZ-UNK-VecVox Driver (19xx)(Herbert, Alex)(PD)[b] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +BA9260BB961D60E718378CC16A8051D7 Vectrex BIOS (1982)(GCE) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Type: TOSEC +;;; Source: GCE Vectrex - Games (TOSEC-v2014-07-30) +;;; FileGen: 2020-01-27 13:54:30 (UTC) +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Bad Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +F4B9DFC9B0DC29A037D6690B86EB2C23 B 3-D Crazy Coaster (1983)(GCE)[b] VEC +385918CFE4ED64E7E19047E9754A7C77 B 3-D Mine Storm (1983)(GCE)[b] VEC +F3A3D70C3D2C63E84BBF2D41D195566B B 3-D Narrow Escape (1983)(GCE)[b] VEC +7B1935D9FEB665988DD9504B309B1A1B B Armor Attack (1982)(GCE)[b] VEC +363CAADE88652D89BD4011B4CA18084E B Bedlam (1983)(GCE)[b] VEC +94F144C31FD4563F9473ED0563463E54 B Blitz! - Action Football (1982)(MB)[b] VEC +CF17690C433E37EED8FF1CA55F944087 B Clean Sweep (1982)(GCE)[b] VEC +2AFF8668762CD1418EF146CE101B41F7 B Dark Tower (1983)(GCE)(proto)[b] VEC +8595351841B168CF241861095FD04B8E B Dark Tower (1983)(GCE)(proto)[b][Req 32k] VEC +3C3B2F836E60FB2D64480286815425F0 B Fortress of Narzod (1982)(GCE)[b] VEC +49D7CD9F7F8616C775F6CDC0996873B9 B Heads Up - Action Soccer (1983)(GCE)[b] VEC +161A46F714CBF23AC45DD19536FF2F66 B Hyperchase (1982)(GCE)[b] VEC +E0DFC58763716C3B6A89E08F4869396E B Mail Plane (1983)(GCE)(proto)[b] VEC +18C9F6478683476C825B0C094BCC0ABB B Mike's Molecules (demo) (1985)(Blackwell, Mike)(PD)[b] VEC +EF4FA5E79026A5EDDE80BE3B030F3E86 B Mine Storm (1982)(GCE)[h RLB][b] VEC +EC3B987EF11D1CA13F7BCCE5007D11DA B Mine Storm (1982)(GCE)[h RLB][o][b] VEC +20A8B209386F8D98DE22C44F0378F0BE B Mine Storm (1982)(GCE)[h RLB][o2][b] VEC +6574EE1A86796BD4A96C5DA2E0891DFC B Patriots (1996)(Dondzila, John)(PD)[b] VEC +E6650274B81E2F946CE3E6381C370BC7 B Polar Rescue (1983)(GCE)[b] VEC +3FCA9FF12820A2C76814DB5D1B0E1F8D B Pole Position (1983)(GCE)[b] VEC +37318842F640D88EB30BB06CE8686A7A B Rip-Off (1982)(GCE)[b] VEC +CF6C01B0212E3B2191A97139CF1F427A B Rocket Sledge (1983)(GCE)(proto)[b] VEC +122E4E5A9DB240F81F18696902305476 B Scramble (1982)(GCE)[b] VEC +9B4C1C3B2F5CAA27EA8B3EF2A5D0A32C B Solar Quest (1982)(GCE)[b] VEC +DA0F7B312796210020507308B3E5C29F B Space Wars (1982)(GCE)[b] VEC +58A68E8799B35C9B0D060DB4B71D5C6C B Spike Hoppin' (1998)(Dondzila, John)(PD)[b] VEC +BA47F965CE261847D5E5DDA24B93535F B Spinball (1983)(GCE)[b] VEC +B4B464C77681CF3C5BB9679C7273AD00 B Star Castle (1983)(GCE)[b] VEC +109C46D79BC6728F541AEABA0C0E84F0 B Star Hawk (1982)(GCE)[b] VEC +4EF727AB9221E40752A94C5C9488FA71 B Star Trek - The Motion Picture (1982)(GCE)[b] VEC +ADC4B2AE0EBDCAB900257066BE1EEE41 B Vector Vaders (1996)(Dondzila, John)(PD)[b] VEC +2705AD2A5DB7D2D07969DF8D1DD3E413 B Web Wars (1983)(GCE)[b] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Hacks +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +7BC7F97D3B3A732F4552035BCF7C90B3 H Armor Attack (1982)(GCE)[h][a][spinner controller] VEC +1B00D5000F665DBB9454953050BB87F0 H Armor Attack (1982)(GCE)[h][spinner controller] VEC +7CE4DCEEBC4A1DB29F4005A7991C3378 H Bedlam (1983)(GCE)[h][spinner controller] VEC +4CF69D28B334FB972B4C97397E92693A H Berzerk (1982)(GCE)(proto)[f] VEC +32C172BB0C767C9F33DAA1C73239E4EE H Berzerk (1982)(GCE)(proto)[f][o] VEC +6AC9F45324A62A5EDEB9A7A94C45AC50 H Dark Tower (1983)(GCE)(proto)[h Fred Taft] VEC +A970AED37CFFD29AB3740F8E79518858 H Mine Storm (1982)(GCE)[h Karrsoft] VEC +E1D74EC863A50757E1A8F89BBD73E2F1 H Mine Storm (1982)(GCE)[h RLB] VEC +FA69340348D01A2C9DF7990D6D3D27CD H Mine Storm (1982)(GCE)[h RLB][o] VEC +EEC3D8F10273178D9DDA0C89867407F8 H Mine Storm (1982)(GCE)[h] VEC +1419EB1920E8FAB7AF8D9D6FC6C3D09B H Mine Storm II (1983)(-)[h][spinner controller] VEC +A183501B50935C970823145FC8C5F40B H Pole Position (1983)(GCE)[h][spinner controller] VEC +0635E54D347DAAA0D1CEF6B1B395211D H Solar Quest (1982)(-)[h][spinner controller] VEC +53A840BC55E7119BF63AA5E86E53AAF8 H Star Castle (1983)(-)[h][spinner controller] VEC +AD98F3477C2AC3AABBEB3BEFF9CCD69F H Star Trek - The Motion Picture (1982)(GCE)[h][controller hack] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Over Dumps +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +EECFB30E843AD4F345BC35E3D76B19B8 O Polar Rescue (1983)(GCE)[o][a] VEC +FB002E61CD4E79B94EBC0BFC7202C78B O Star Trek - The Motion Picture (1982)(GCE)[o] VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Translated +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +; +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Home Brew +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +69D68DCD741BEA0E3535A4F990D43B76 D Abyss (1999)(-)(PD)(preview) VEC +2EF764E31C36EED4006D8A35E96F22AD D All Good Things (1996)(Dondzila, John)(PD) VEC +EF280647997253AF783B6AB001E1F80A D Battle Earth Terror Hazard v1 (2000)(Parssinen, Manu)(PD) VEC +9566DFB2A7914A8EB1F67F93F23365EB D Battle Earth Terror Hazard v2 (2000)(Parssinen, Manu)(PD) VEC +6199A3F4853EEA9D43636F5CAA279FAB D Battle Earth Terror Hazard v3 (2000)(Parssinen, Manu)(PD) VEC +3BE0D397D128C9B78A8A2067CCE5063E D Battle Earth Terror Hazard v4 (2000)(Parssinen, Manu)(PD) VEC +1C6C2D90AAC87E5E95F9A37A6F3A2B10 D BCOR-FTS (demo) (1997)(Cowgill, Clay)(PD) VEC +FB18CAFA9EC728ED79EDF525FD971E08 D Birds of Prey (1999)(Dondzila, John)(PD) VEC +91857F5262A46E17239340C35097C9BC D Disc Duel (demo) (1997)(-)(PD) VEC +D5012DDEDD1A9FE2B9D14E82EDDAA55D D Gravitrex (2002)(Dondzila, John)(PD) VEC +53C0356B8E64D037814CD424025D2CAA D Labyrinth Rev 1 (1998)(Salomon, Christopher)(PD) VEC +26FED7DFAFE8A36263E48F6EC70F103D D Labyrinth Rev 2 (1998)(Salomon, Christopher)(PD) VEC +4E420CCA87C54CC12EBC1866DADE7715 D Labyrinth Rev 3 (1998)(Salomon, Christopher)(PD) VEC +D68CFD8FD043A8D1BCA1166E2B81FFA7 D Labyrinth Rev 4 - Vector Rouge (1998)(Salomon, Christopher)(PD) VEC +F564B7902914938375BC3D4B19F21065 D Lunar Lander (demo) (19xx)(Landspurg, Thomas)(PD) VEC +EA2F6F481BBF4E67EDADD411B6950C1D D Manu's Incomplete Games - Volume 1 - Nonagalf (2003)(Parssinen, Manu)(PD) VEC +E7BC87A58672356CB9E145CB89284420 D Manu's Incomplete Games - Volume 2 - VecSports Kingpin (2002)(Parssinen, Manu)(PD) VEC +784B14D2304F6FD39B205AB93A4B21B1 D Manu's Incomplete Games - Volume 3 - B.E.T.H. (200x)(Parssinen, Manu)(PD) VEC +5E7B84B54BD005D1C9CA8BFEEA2322D1 D Manu's Incomplete Games - Volume 4 - Yoehl - Saga of Pathrk (200x)(Parssinen, Manu)(PD) VEC +A77DC3AA71F52764FEA935E4A4FD4DB2 D Manu's Incomplete Games - Volume 5 - Ztagger (200x)(Parssinen, Manu)(PD) VEC +D857A0FB7902C32CE514C675D890059B D Mike's Molecules (demo) (1985)(Blackwell, Mike)(PD) VEC +6BC8E7B8D3D1AC553B9977F46CA612F0 D Mike's Molecules (demo) (1985)(Blackwell, Mike)(PD)[a] VEC +0CDA10E5F1252ED6D44C6148A37601B6 D Mine Storm v2.00 (1998)(Salomon, Christopher)(PD) VEC +7200AD3BDE2F3BB7C14F8ECCEAED6FA4 D Missile Lords (2001)(Tumber, Christopher)(PD) VEC +5B6CF92C62342C55B9B35E82488E8DAE D Moon Lander (demo) (1997)(Clay Cowgill)(PD) VEC +70A3572F519DA2ABDE6869AE3029F914 D Moon Lander (demo) (1997)(Clay Cowgill)(PD)[a] VEC +EC1D898C06A152DDDF7F0B4BD8837AB9 D Nebula Commander (2005)(Aker, Craig)(PD) VEC +58A5D1B022272DDFB23123FFCB6F6188 D Nonagalf (2003-03-10)(Parssinen, Manu)(PD) VEC +3B4EB68DDCC1CBF1C0F8C38520D02CA8 D Omega Chase (1998)(Tumber, Christopher)(PD) VEC +C33F47BD2837A50CCC6DC06F0390DD5E D Omega Chase (1998)(Tumber, Christopher)(PD)[final] VEC +D33112C5A916BBAEB4AE69B7B033F68D D Paratroopers (2002)(Dondzila, John)(PD) VEC +B35B0783011B55835AEEB9C9BEA56738 D Patriots (1996)(Dondzila, John)(PD) VEC +8DD134559D5CC9373D8EDE1826A8085B D Patriots (1996)(Dondzila, John)(PD)[a] VEC +BA08525993DAB47C52CE41920468A63E D Patriots III - BALListics Busters (1996)(Dondzila, John)(PD) VEC +3B5DA23C7EFE411DD860A33D873C5FE2 D Patriots III - BALListics Busters (2002)(Dondzila, John)(PD) VEC +B4B6051A7B91C9C54AA25AD12F553CAE D Patriots Remix (1996)(Dondzila, John)(PD) VEC +165C4C56A918C4AC35D75D280A2098BF D Pop (demo) (19xx)(Tumber, Christopher)(PD) VEC +D35FBB9030C7FF06B63CB1A1A4698B1E D Repulse (1999)(Dondzila, John)(PD) VEC +A8BBEC9EDC4EB36F231B4B1FA122B36D D Revector (2004)(Aker, Craig)(PD) VEC +625E537EBB7056E1C6F787C502443BD0 D Rockaroids Remix - 3rd Rock (1996)(Dondzila, John)(PD) VEC +7C002B3622EDB3B467350A535855A35E D Rockaroids Remix - 3rd Rock (1996)(Dondzila, John)(PD)[a] VEC +200EB913CA5BF60011E6690097EE758E D Spike Goes Skiing (1998)(-)(PD) VEC +EB37C39B075B1301F0810E52B64BEE05 D Spike Goes Skiing v.03 (1998)(-)(PD) VEC +386C706E2B105A05DD9F8DA7E57D5A48 D Spike Hoppin' (1998)(Dondzila, John)(PD) VEC +1C67000FC6D48B0DB415571A7B14CD04 D Spike Hoppin' (1998)(Dondzila, John)(PD)[b2] VEC +37F63A51BD4192517181748A159867F4 D Spike's Slam Pit (demo) (2001)(Gauze)(PD) VEC +3B79DDADE2486F6D87402A4715F8FB44 D Spike's Water Balloons (19xx)(Dondzila, John)(PD)[analog version] VEC +DD55837F734A7CBA1B1DA130725BE997 D Star Fire Spirits (1999)(Dondzila, John)(PD) VEC +9379D17D67ACC6393184ED8051E4CAA5 D Star Fire Spirits (1999)(Dondzila, John)(PD)[a] VEC +8235BDE24CEB057E5145DB73A022B016 D Star Wars Clone (19xx)(Dondzila, John)(PD) VEC +03AE3871703F93BF9E8722E73541A44D D Thrust v1.01 (2004)(Krumlinde, Ville)(PD) VEC +4E9D8AE167BCE23DEBD127659B4BB7C6 D Tsunami (2001)(Tumber, Christopher)(PD)[a] VEC +99E7597D88FA386058D37902A16AAEF4 D Tsunami (2001)(Tumber, Christopher)(PD)[a2] VEC +B419FC2DB9911870BBC01AB0A25E9E84 D Tsunami (2002)(Tumber, Christopher)(PD) VEC +5D5C5D4CCA7F4789D97910A26E338A6D D VecFLASH - Memory v1.0 (19xx)(Herbert, Alex)(PD) VEC +A8B8ADF002E1BFB605940A23D8940438 D Vecsports Boxing (demo) (2000)(Parssinen, Manu)(PD) VEC +FD74BE3A06FD561C35A3CB2E7D76C884 D Vecsports Boxing (demo) (2000)(Parssinen, Manu)(PD)[a] VEC +57A278EB16965C619067DC706017A33C D VecSports Kingpin Bowling (2002-08-19)(Parssinen, Manu)(PD) VEC +D5F7093955B15650CCDEB914332311A0 D VecSports Kingpin Bowling v0.2 (2002)(Parssinen, Manu)(PD) VEC +D0D46BBAADC45454CDF5D44562BF77E9 D VecSports Kingpin Bowling v0.3 (2002)(Parssinen, Manu)(PD) VEC +7F8CA02A12902F4BF1573E23BBBDAC45 D VecSports Kingpin Bowling v0.4 (2002-08-26)(Parssinen, Manu)(PD) VEC +E94AD834FA282A20EEF5C30B1F1ABF72 D Vectopia (2001)(Dondzila, John)(PD) VEC +130EE6DB535F805307C3B55CA8B95BD0 D Vector Vaders (1996)(Dondzila, John)(PD) VEC +751FBBA8581957FC150B163EA70F3DD2 D Vector Vaders (1996)(Dondzila, John)(PD)[a] VEC +24480020A6CFF254863E65B942FD1E33 D Vector Vaders Remix (1999)(Dondzila, John)(PD) VEC +C14BBD0463AAB50E98FE1548AB082A0C D Vectrace (2000)(Habot, Ronen)(PD) VEC +53345A3091F45247A5B6C1AED69ABA74 D Vectrex Maze (1998)(Salomon, Christopher)(PD) VEC +7BE0B5074C6B75C1D8778CABBF262369 D Vectrex Pong (1998)(Salomon, Christopher)(PD) VEC +FD6A73340B2683C3DED2BF1A75B36118 D Vectrexians (1999)(Tuts, Kristof)(PD) VEC +EBD8B6DFD3D8955209556B07B45243D0 D Verzerk (2002)(Herber, Axel)(PD)[Berzerk hack] VEC +659D9DEA05528A9514725B8192EE94FF D V-Frogger (1998)(Salomon, Christopher)(PD) VEC +353274EBA86D88382C579C6D9BB745F4 D V-Frogger (1998)(Salomon, Christopher)(PD)[a] VEC +66E0DC0B82CB16D25E4DE117F4491686 D V-Frogger (2001)(Salomon, Christopher - Woloch, Kurt)(PD) VEC +02862CB8663F2D07EDD6BE27441D56F6 D Vix (2002)(Tumber, Christopher)(PD) VEC +E1C86DE28D82E80B23630D74A640BB21 D Vix (2002)(Tumber, Christopher)(PD)[a] VEC +440906BD7110C492CB4B874E706CBACE D Vix (2002)(Tumber, Christopher)(PD)[a2] VEC +CED45EE7B68A2449E352E07AC46E9B5F D Vix (demo) (2001)(Tumber, Christopher)(PD) VEC +D40833D022B01D8A02ED80FDD08F8055 D Wormhole (2001)(Dondzila, John)(PD) VEC +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +;;; Believed Good +;;;;;;;;;;--------------------------------------------------;;;;;;;;;; +00F768E79D6EBFE9BF920FFEC4C5C4F2 3-D Crazy Coaster (1983)(GCE) VEC +38B23299A97F26C092916FC66048BFA9 3-D Crazy Coaster (1983)(GCE)[b2] VEC +1A81FEA8AC1C1D46DE7B633814130857 3-D Mine Storm (1983)(GCE) VEC +F79C596A0205C5E7C427CDBBB1E16918 3-D Narrow Escape (1983)(GCE) VEC +42C0106A425B757162AEB17D03999564 3-D Narrow Escape (1983)(GCE)[b2] VEC +9131A480A34F6BF169F3B14B40AB206B 3-D Narrow Escape (1983)(GCE)[b3] VEC +9657037A461EEE919462EB6A01879685 Armor Attack (1982)(GCE) VEC +268E75778F282D853D77ACF42C6C8734 Bedlam (1983)(-) VEC +FBA74D9B85AC2E1A8A0535EC19337FBF Bedlam (1983)(GCE)[b2] VEC +AB5D85D3FA5B7FA84E9B1B17475D1986 Bedlam (1983)(GCE)[b3] VEC +640AE7BD4538BAD11256999DB68DE5A0 Berzerk (1982)(GCE) VEC +5D74770BB175357812E61EE7CA731270 Blitz! - Action Football (1982)(MB) VEC +92AAB750FD48FAAE2E51BA9F857F6B59 Blitz! - Action Football (1982)(MB)[b2] VEC +1C95CF8FCD2C98DB747208ADE464A44F Clean Sweep - Mr. Boston Version (1982)(-) VEC +A376D5648E08F348E5965C058C631C6D Clean Sweep (1982)(GCE) VEC +9B61653ED9DAFD4CFB7F9D94404259AC Cosmic Chasm (1982)(GCE) VEC +DB9929B0AD53C97AFDA065596806BF86 Dark Tower (1983)(GCE)(proto) VEC +17D79911050FED4649671B6EE9B4EEC4 Dark Tower (1983)(GCE)(proto)[64k] VEC +E65B3262E9447A747D93E0CCB1DBB7DF Fortress of Narzod (1982)(GCE) VEC +501DD2845432F10E4B9531240F409B8C Heads Up - Action Soccer (1983)(GCE) VEC +7580926EE22F06FD2CCDE4B65184715F Hyperchase (1982)(GCE) VEC +F85ECC92900639250BB973AA2672C342 Magic 8 Ball (2001)(Tumber, Christopher) VEC +AB082FA8C8E632DD68589A8C7741388F Mine Storm (1982)(GCE) VEC +126FECBF4FB09FDB5A3C9AF92ABAED7C Mine Storm II (1983)(GCE) VEC +5C5D5EEB71F51A6FDD4FA6C36E4B2801 Narrow Escape 2-D (1983)(GCE) VEC +E7BF7DE16B01419A819826CCE3DC25EE Pitcher's Duel (1983)(GCE)(proto) VEC +5C1C413E51AA282015807DC60213FD3D Polar Rescue (1983)(GCE) VEC +F599DA79B5C324C2A11C117D256A64C0 Polar Rescue (1983)(GCE)[a] VEC +F85C521F445C82BF200B5B85B9B1CD60 Pole Position (1983)(GCE) VEC +F94173910549038D4D8F329413A5AA54 Pole Position (1983)(GCE)[b2] VEC +808E0501990BD01882C102DF00F20064 Rip-Off (1982)(GCE) VEC +9C1F13A33415D2F384638F9672056F5E Rounders (demo) (2001-02-24)(Habot, Ronen) VEC +95370908561A782EDF138DF41CCB8F18 Scramble (1982)(GCE) VEC +11A9BD419CF094DE8CAA8A44D76B69AB Solar Quest (1982)(GCE) VEC +05CC087B7C2B6FC544E66E162BF57B49 Space Frenzy (2006)(Dondzila, John) VEC +ADF2EA050D510DC409CCD7518F839931 Space Frenzy v1.0 (200x)(Dondzila, John)(beta) VEC +2DECDF9F55DF7FB99761B2FE51425E40 Space Wars (1982)(GCE) VEC +5A90AB748F7B220EDAF8C1D67E0BFE89 Spike (1983)(GCE) VEC +ECC143F87A702AF7A1786B58A78ACE01 Spinball (1983)(GCE) VEC +93A9B3386E0B0A906994B6DC7A71B7F4 Spinball (1983)(GCE)[b2] VEC +1224C9BEAE22EE7354E4220C46237696 Star Castle (1983)(GCE) VEC +ADD42C10019E88F47DD98791F8DE3148 Star Hawk (1982)(GCE) VEC +47CEFE6F77DBAFB4475A64FE89DA02C0 Star Ship (1982)(GCE) VEC +0B67A6339E9C1D8385E8FDFC48F447BC Star Trek - The Motion Picture (1982)(GCE) VEC +529804D1915F576461E04CE8A8598BBB Star Trek - The Motion Picture (1982)(GCE)[a] VEC +8CE9091361E0884BCD60409FC3301EDC Tour De France (1983)(GCE)(proto) VEC +5A340D9198E13F744DBDF8F8EBA1BBD5 Tsunami (demo) (2001)(Tumber, Christopher) VEC +49ECB30E304F499F3A427ADB35DCFAEA Vecsports Boxing (2002)(Parssinen, Manu) VEC +BA9260BB961D60E718378CC16A8051D7 Vectrex BIOS (1982)(GCE) VEC +A8A04D7C49FBCE59D688917F3A93F7F3 War of the Robots - Bow to the Queen (2003)(Fury Unlimited)(FW) VEC +2E1E6AA4270B1EC1C74BB7C00EEAAC1C War of the Robots (2003)(Fury Unlimited)(FW) VEC +A3E0F44454D4100B18493F1BD2485D8B Web Warp (1983)(GCE) VEC +A398C18B4CE87929471B559B2BC7E79F Web Wars (1983)(GCE) VEC diff --git a/Assets/libbizlynx.dll.so b/Assets/libbizlynx.dll.so new file mode 100644 index 0000000000..b66762ab91 Binary files /dev/null and b/Assets/libbizlynx.dll.so differ diff --git a/Assets/libbizswan.dll.so b/Assets/libbizswan.dll.so new file mode 100644 index 0000000000..af775c6f06 Binary files /dev/null and b/Assets/libbizswan.dll.so differ diff --git a/Assets/libblip_buf.so b/Assets/libblip_buf.so.1.1.1 similarity index 100% rename from Assets/libblip_buf.so rename to Assets/libblip_buf.so.1.1.1 diff --git a/Assets/libgambatte.dll.so b/Assets/libgambatte.dll.so new file mode 100644 index 0000000000..28309fe6bf Binary files /dev/null and b/Assets/libgambatte.dll.so differ diff --git a/Assets/libvbanext.dll.so b/Assets/libvbanext.dll.so new file mode 100644 index 0000000000..54610699b5 Binary files /dev/null and b/Assets/libvbanext.dll.so differ diff --git a/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolAttribute.cs b/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolAttribute.cs deleted file mode 100644 index 590eba9f91..0000000000 --- a/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolAttribute.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This class hold logic interraction for the ExternalToolAttribute - /// This attribute helps BizHawk to handle ExternalTools - /// - [AttributeUsage(AttributeTargets.Assembly)] - public sealed class BizHawkExternalToolAttribute : Attribute - { - #region Fields - - private string _Name; - private string _Description; - private string _IconResourceName; - - #endregion - - #region cTor(s) - - /// - /// Initialize a new instance of - /// - /// Tool's name - /// Small description about the tool itself - /// Icon embedded resource name - public BizHawkExternalToolAttribute(string name, string description, string iconResourceName) - { - _Name = name; - _Description = description; - _IconResourceName = iconResourceName; - } - - /// - /// Initialize a new instance of - /// - /// Tool's name - /// Small description about the tool itself - public BizHawkExternalToolAttribute(string name, string description) - : this(name, description, "") - { } - - /// - /// Initialize a new instance of - /// - /// Tool's name - public BizHawkExternalToolAttribute(string name) - :this(name, "", "") - {} - - #endregion - - #region Properties - - /// - /// Gets tool's friendly name - /// - public string Name - { - get - { - return _Name; - } - } - - /// - /// Gets tool's descriptino - /// - public string Description - { - get - { - return _Description; - } - } - - /// - /// Get the name of the embedded resource icon - /// - /// Don't forget to set compile => Embedded reource to the icon file in your project - public string IconResourceName - { - get - { - return _IconResourceName; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolUsageAttribute.cs b/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolUsageAttribute.cs deleted file mode 100644 index 5e7dc81d3c..0000000000 --- a/BizHawk.Client.ApiHawk/Attributes/BizHawkExternalToolUsageAttribute.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This class hold logic interraction for the BizHawkExternalToolUsageAttribute - /// This attribute helps ApiHawk to know how a tool can be enabled or not - /// - [AttributeUsage(AttributeTargets.Assembly)] - public sealed class BizHawkExternalToolUsageAttribute : Attribute - { - #region Fields - - private BizHawkExternalToolUsage _ToolUsage; - private CoreSystem _System; - private string _GameHash; - - #endregion - - #region cTor(s) - - /// - /// Initialize a new instance of - /// - /// i.e. what your external tool is for - /// that your external tool is used for - /// The game hash, unique game ID (see in the game database) - public BizHawkExternalToolUsageAttribute(BizHawkExternalToolUsage usage, CoreSystem system, string gameHash) - { - if (usage == BizHawkExternalToolUsage.EmulatorSpecific && system == CoreSystem.Null) - { - throw new InvalidOperationException("A system must be set"); - } - if (usage == BizHawkExternalToolUsage.GameSpecific && gameHash.Trim() == "") - { - throw new InvalidOperationException("A game hash must be set"); - } - - _ToolUsage = usage; - _System = system; - _GameHash = gameHash; - } - - /// - /// Initialize a new instance of - /// - /// i.e. what your external tool is for - /// that your external tool is used for - public BizHawkExternalToolUsageAttribute(BizHawkExternalToolUsage usage, CoreSystem system) - :this(usage, system, "") - {} - - /// - /// Initialize a new instance of - /// - public BizHawkExternalToolUsageAttribute() - :this(BizHawkExternalToolUsage.Global, CoreSystem.Null, "") - { } - - - #endregion - - #region Properties - - /// - /// Gets the specific system used by the exetrnal tool - /// - public CoreSystem System - { - get - { - return _System; - } - } - - /// - /// Gets the specific game (hash) used by the exetrnal tool - /// - public string GameHash - { - get - { - return _GameHash; - } - } - - /// - /// Gets the tool usage - /// - public BizHawkExternalToolUsage ToolUsage - { - get - { - return _ToolUsage; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj b/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj deleted file mode 100644 index c99d27ef6f..0000000000 --- a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj +++ /dev/null @@ -1,133 +0,0 @@ - - - - true - ..\output\dll\ - DEBUG;TRACE - full - AnyCPU - prompt - - MinimumRecommendedRules.ruleset - - - ..\output\dll\ - TRACE - ..\output\dll\BizHawk.Client.ApiHawk.XML - true - pdbonly - AnyCPU - prompt - - MinimumRecommendedRules.ruleset - - - - Debug - AnyCPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA} - Library - Properties - BizHawk.Client.ApiHawk - BizHawk.Client.ApiHawk - v4.6.1 - 512 - - - - - - - False - ..\..\Users\uptho\Documents\BizHawk-2.3\dll\System.Data.SQLite.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {24a0aa3c-b25f-4197-b23d-476d6462dba0} - BizHawk.Client.Common - - - {866f8d13-0678-4ff9-80a4-a3993fd4d8a3} - BizHawk.Common - - - {e1a23168-b571-411c-b360-2229e7225e0e} - BizHawk.Emulation.Common - - - {197d4314-8a9f-49ba-977d-54acefaeb6ba} - BizHawk.Emulation.Cores - - - - - - - - - \ No newline at end of file diff --git a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj.DotSettings b/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj.DotSettings deleted file mode 100644 index 73e96563f9..0000000000 --- a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - CSharp60 \ No newline at end of file diff --git a/BizHawk.Client.ApiHawk/Classes/Api/EmuApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/EmuApi.cs deleted file mode 100644 index a3cda9ed76..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/EmuApi.cs +++ /dev/null @@ -1,459 +0,0 @@ -using System; -using System.ComponentModel; -using System.Collections.Generic; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Cores.WonderSwan; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; - -namespace BizHawk.Client.ApiHawk -{ - [Description("A library for interacting with the currently loaded emulator core")] - public sealed class EmuApi : IEmu - { - private static class EmuStatic - { - public static void DisplayVsync(bool enabled) - { - Global.Config.VSync = enabled; - } - public static string GetSystemId() - { - return Global.Game.System; - } - public static void LimitFramerate(bool enabled) - { - Global.Config.ClockThrottle = enabled; - } - - public static void MinimizeFrameskip(bool enabled) - { - Global.Config.AutoMinimizeSkipping = enabled; - } - - } - [RequiredService] - private IEmulator Emulator { get; set; } - - [OptionalService] - private IDebuggable DebuggableCore { get; set; } - - [OptionalService] - private IDisassemblable DisassemblableCore { get; set; } - - [OptionalService] - private IMemoryDomains MemoryDomains { get; set; } - - [OptionalService] - private IInputPollable InputPollableCore { get; set; } - - [OptionalService] - private IRegionable RegionableCore { get; set; } - - [OptionalService] - private IBoardInfo BoardInfo { get; set; } - - public Action FrameAdvanceCallback { get; set; } - public Action YieldCallback { get; set; } - - public EmuApi() - { } - - public void DisplayVsync(bool enabled) - { - EmuStatic.DisplayVsync(enabled); - } - - public void FrameAdvance() - { - FrameAdvanceCallback(); - } - - public int FrameCount() - { - return Emulator.Frame; - } - - public object Disassemble(uint pc, string name = "") - { - try - { - if (DisassemblableCore == null) - { - throw new NotImplementedException(); - } - - MemoryDomain domain = MemoryDomains.SystemBus; - - if (!string.IsNullOrEmpty(name)) - { - domain = MemoryDomains[name]; - } - - int l; - var d = DisassemblableCore.Disassemble(domain, pc, out l); - return new { disasm = d, length = l }; - } - catch (NotImplementedException) - { - Console.WriteLine($"Error: {Emulator.Attributes().CoreName} does not yet implement disassemble()"); - return null; - } - } - - public ulong? GetRegister(string name) - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - var registers = DebuggableCore.GetCpuFlagsAndRegisters(); - ulong? value = null; - if (registers.ContainsKey(name)) value = registers[name].Value; - return value; - } - catch (NotImplementedException) - { - Console.WriteLine($"Error: {Emulator.Attributes().CoreName} does not yet implement getregister()"); - return null; - } - } - - public Dictionary GetRegisters() - { - var table = new Dictionary(); - - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - foreach (var kvp in DebuggableCore.GetCpuFlagsAndRegisters()) - { - table[kvp.Key] = kvp.Value.Value; - } - } - catch (NotImplementedException) - { - Console.WriteLine($"Error: {Emulator.Attributes().CoreName} does not yet implement getregisters()"); - } - - return table; - } - - public void SetRegister(string register, int value) - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - DebuggableCore.SetCpuRegister(register, value); - } - catch (NotImplementedException) - { - Console.WriteLine($"Error: {Emulator.Attributes().CoreName} does not yet implement setregister()"); - } - } - - public long TotalExecutedycles() - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - return DebuggableCore.TotalExecutedCycles; - } - catch (NotImplementedException) - { - Console.WriteLine($"Error: {Emulator.Attributes().CoreName} does not yet implement totalexecutedcycles()"); - - return 0; - } - } - - public string GetSystemId() - { - return EmuStatic.GetSystemId(); - } - - public bool IsLagged() - { - if (InputPollableCore != null) - { - return InputPollableCore.IsLagFrame; - } - - Console.WriteLine($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - return false; - } - - public void SetIsLagged(bool value = true) - { - if (InputPollableCore != null) - { - InputPollableCore.IsLagFrame = value; - } - else - { - Console.WriteLine($"Can not set lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - } - } - - public int LagCount() - { - if (InputPollableCore != null) - { - return InputPollableCore.LagCount; - } - - Console.WriteLine($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - return 0; - } - - public void SetLagCount(int count) - { - if (InputPollableCore != null) - { - InputPollableCore.LagCount = count; - } - else - { - Console.WriteLine($"Can not set lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - } - } - - public void LimitFramerate(bool enabled) - { - EmuStatic.LimitFramerate(enabled); - } - - public void MinimizeFrameskip(bool enabled) - { - EmuStatic.MinimizeFrameskip(enabled); - } - - public void Yield() - { - YieldCallback(); - } - - public string GetDisplayType() - { - if (RegionableCore != null) - { - return RegionableCore.Region.ToString(); - } - - return ""; - } - - public string GetBoardName() - { - if (BoardInfo != null) - { - return BoardInfo.BoardName; - } - - return ""; - } - public object GetSettings() - { - if (Emulator is GPGX) - { - var gpgx = Emulator as GPGX; - return gpgx.GetSettings(); - } - else if (Emulator is LibsnesCore) - { - var snes = Emulator as LibsnesCore; - return snes.GetSettings(); - } - else if (Emulator is NES) - { - var nes = Emulator as NES; - return nes.GetSettings(); - } - else if (Emulator is QuickNES) - { - var quicknes = Emulator as QuickNES; - return quicknes.GetSettings(); - } - else if (Emulator is PCEngine) - { - var pce = Emulator as PCEngine; - return pce.GetSettings(); - } - else if (Emulator is SMS) - { - var sms = Emulator as SMS; - return sms.GetSettings(); - } - else if (Emulator is WonderSwan) - { - var ws = Emulator as WonderSwan; - return ws.GetSettings(); - } - else - { - return null; - } - } - public bool PutSettings(object settings) - { - if (Emulator is GPGX) - { - var gpgx = Emulator as GPGX; - return gpgx.PutSettings(settings as GPGX.GPGXSettings); - } - else if (Emulator is LibsnesCore) - { - var snes = Emulator as LibsnesCore; - return snes.PutSettings(settings as LibsnesCore.SnesSettings); - } - else if (Emulator is NES) - { - var nes = Emulator as NES; - return nes.PutSettings(settings as NES.NESSettings); - } - else if (Emulator is QuickNES) - { - var quicknes = Emulator as QuickNES; - return quicknes.PutSettings(settings as QuickNES.QuickNESSettings); - } - else if (Emulator is PCEngine) - { - var pce = Emulator as PCEngine; - return pce.PutSettings(settings as PCEngine.PCESettings); - } - else if (Emulator is SMS) - { - var sms = Emulator as SMS; - return sms.PutSettings(settings as SMS.SMSSettings); - } - else if (Emulator is WonderSwan) - { - var ws = Emulator as WonderSwan; - return ws.PutSettings(settings as WonderSwan.Settings); - } - else - { - return false; - } - } - public void SetRenderPlanes(params bool[] luaParam) - { - if (Emulator is GPGX) - { - var gpgx = Emulator as GPGX; - var s = gpgx.GetSettings(); - s.DrawBGA = luaParam[0]; - s.DrawBGB = luaParam[1]; - s.DrawBGW = luaParam[2]; - s.DrawObj = luaParam[3]; - gpgx.PutSettings(s); - - } - else if (Emulator is LibsnesCore) - { - var snes = Emulator as LibsnesCore; - var s = snes.GetSettings(); - s.ShowBG1_0 = s.ShowBG1_1 = luaParam[0]; - s.ShowBG2_0 = s.ShowBG2_1 = luaParam[1]; - s.ShowBG3_0 = s.ShowBG3_1 = luaParam[2]; - s.ShowBG4_0 = s.ShowBG4_1 = luaParam[3]; - s.ShowOBJ_0 = luaParam[4]; - s.ShowOBJ_1 = luaParam[5]; - s.ShowOBJ_2 = luaParam[6]; - s.ShowOBJ_3 = luaParam[7]; - snes.PutSettings(s); - } - else if (Emulator is NES) - { - // in the future, we could do something more arbitrary here. - // but this isn't any worse than the old system - var nes = Emulator as NES; - var s = nes.GetSettings(); - s.DispSprites = luaParam[0]; - s.DispBackground = luaParam[1]; - nes.PutSettings(s); - } - else if (Emulator is QuickNES) - { - var quicknes = Emulator as QuickNES; - var s = quicknes.GetSettings(); - - // this core doesn't support disabling BG - bool showsp = GetSetting(0, luaParam); - if (showsp && s.NumSprites == 0) - { - s.NumSprites = 8; - } - else if (!showsp && s.NumSprites > 0) - { - s.NumSprites = 0; - } - - quicknes.PutSettings(s); - } - else if (Emulator is PCEngine) - { - var pce = Emulator as PCEngine; - var s = pce.GetSettings(); - s.ShowOBJ1 = GetSetting(0, luaParam); - s.ShowBG1 = GetSetting(1, luaParam); - if (luaParam.Length > 2) - { - s.ShowOBJ2 = GetSetting(2, luaParam); - s.ShowBG2 = GetSetting(3, luaParam); - } - - pce.PutSettings(s); - } - else if (Emulator is SMS) - { - var sms = Emulator as SMS; - var s = sms.GetSettings(); - s.DispOBJ = GetSetting(0, luaParam); - s.DispBG = GetSetting(1, luaParam); - sms.PutSettings(s); - } - else if (Emulator is WonderSwan) - { - var ws = Emulator as WonderSwan; - var s = ws.GetSettings(); - s.EnableSprites = GetSetting(0, luaParam); - s.EnableFG = GetSetting(1, luaParam); - s.EnableBG = GetSetting(2, luaParam); - ws.PutSettings(s); - } - } - - private static bool GetSetting(int index, bool[] settings) - { - if (index < settings.Length) - { - return settings[index]; - } - - return true; - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/GameInfoApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/GameInfoApi.cs deleted file mode 100644 index ca74d09da6..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/GameInfoApi.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class GameInfoApi : IGameInfo - { - [OptionalService] - private IBoardInfo BoardInfo { get; set; } - - public GameInfoApi() - { } - - public string GetRomName() - { - if (Global.Game != null) - { - return Global.Game.Name ?? ""; - } - - return ""; - } - - public string GetRomHash() - { - if (Global.Game != null) - { - return Global.Game.Hash ?? ""; - } - - return ""; - } - - public bool InDatabase() - { - if (Global.Game != null) - { - return !Global.Game.NotInDatabase; - } - - return false; - } - - public string GetStatus() - { - if (Global.Game != null) - { - return Global.Game.Status.ToString(); - } - - return ""; - } - - public bool IsStatusBad() - { - if (Global.Game != null) - { - return Global.Game.IsRomStatusBad(); - } - - return true; - } - - public string GetBoardType() - { - return BoardInfo?.BoardName ?? ""; - } - - public Dictionary GetOptions() - { - var options = new Dictionary(); - - if (Global.Game != null) - { - foreach (var option in Global.Game.GetOptionsDict()) - { - options[option.Key] = option.Value; - } - } - - return options; - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/JoypadApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/JoypadApi.cs deleted file mode 100644 index 0c049ed97c..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/JoypadApi.cs +++ /dev/null @@ -1,222 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class JoypadApi : IJoypad - { - public JoypadApi() - { } - - public Dictionary Get(int? controller = null) - { - var buttons = new Dictionary(); - var adaptor = Global.AutofireStickyXORAdapter; - foreach (var button in adaptor.Source.Definition.BoolButtons) - { - if (!controller.HasValue) - { - buttons[button] = adaptor.IsPressed(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller) - { - buttons[button.Substring(3)] = adaptor.IsPressed("P" + controller + " " + button.Substring(3)); - } - } - - foreach (var button in adaptor.Source.Definition.FloatControls) - { - if (controller == null) - { - buttons[button] = adaptor.GetFloat(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller) - { - buttons[button.Substring(3)] = adaptor.GetFloat("P" + controller + " " + button.Substring(3)); - } - } - - buttons["clear"] = null; - buttons["getluafunctionslist"] = null; - buttons["output"] = null; - - return buttons; - } - - // TODO: what about float controls? - public Dictionary GetImmediate() - { - var buttons = new Dictionary(); - var adaptor = Global.ActiveController; - foreach (var button in adaptor.Definition.BoolButtons) - { - buttons[button] = adaptor.IsPressed(button); - } - foreach (var button in adaptor.Definition.FloatControls) - { - buttons[button] = adaptor.GetFloat(button); - } - - return buttons; - } - - public void SetFromMnemonicStr(string inputLogEntry) - { - try - { - var lg = Global.MovieSession.MovieControllerInstance(); - lg.SetControllersAsMnemonic(inputLogEntry); - - foreach (var button in lg.Definition.BoolButtons) - { - Global.LuaAndAdaptor.SetButton(button, lg.IsPressed(button)); - } - - foreach (var floatButton in lg.Definition.FloatControls) - { - Global.LuaAndAdaptor.SetFloat(floatButton, lg.GetFloat(floatButton)); - } - } - catch (Exception) - { - Console.WriteLine("invalid mnemonic string: " + inputLogEntry); - } - } - - public void Set(Dictionary buttons, int? controller = null) - { - try - { - foreach (var button in buttons.Keys) - { - var invert = false; - bool? theValue; - var theValueStr = buttons[button].ToString(); - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - if (theValueStr.ToLower() == "false") - { - theValue = false; - } - else if (theValueStr.ToLower() == "true") - { - theValue = true; - } - else - { - invert = true; - theValue = null; - } - } - else - { - theValue = null; - } - - var toPress = button.ToString(); - if (controller.HasValue) - { - toPress = "P" + controller + " " + button; - } - - if (!invert) - { - if (theValue.HasValue) // Force - { - Global.LuaAndAdaptor.SetButton(toPress, theValue.Value); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - else // Unset - { - Global.LuaAndAdaptor.UnSet(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - else // Inverse - { - Global.LuaAndAdaptor.SetInverse(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - } - catch - { - /*Eat it*/ - } - } - public void Set(string button, bool? state = null, int? controller = null) - { - try - { - var toPress = button; - if (controller.HasValue) - { - toPress = "P" + controller + " " + button; - } - if (state.HasValue) - Global.LuaAndAdaptor.SetButton(toPress, state.Value); - else - Global.LuaAndAdaptor.UnSet(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - catch - { - /*Eat it*/ - } - } - public void SetAnalog(Dictionary controls, object controller = null) - { - try - { - foreach (var name in controls.Keys) - { - var theValueStr = controls[name].ToString(); - float? theValue = null; - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - float f; - if (float.TryParse(theValueStr, out f)) - { - theValue = f; - } - } - - if (controller == null) - { - Global.StickyXORAdapter.SetFloat(name.ToString(), theValue); - } - else - { - Global.StickyXORAdapter.SetFloat("P" + controller + " " + name, theValue); - } - } - } - catch - { - /*Eat it*/ - } - } - public void SetAnalog(string control, float? value = null, object controller = null) - { - try - { - if (controller == null) - { - Global.StickyXORAdapter.SetFloat(control, value); - } - else - { - Global.StickyXORAdapter.SetFloat("P" + controller + " " + control, value); - } - } - catch - { - /*Eat it*/ - } - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/MemApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/MemApi.cs deleted file mode 100644 index f54b282550..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/MemApi.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Common.BufferExtensions; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class MemApi : MemApiBase, IMem - { - private MemoryDomain _currentMemoryDomain; - private bool _isBigEndian = false; - public MemApi() - : base() - { - } - - protected override MemoryDomain Domain - { - get - { - if (MemoryDomainCore != null) - { - if (_currentMemoryDomain == null) - { - _currentMemoryDomain = MemoryDomainCore.HasSystemBus - ? MemoryDomainCore.SystemBus - : MemoryDomainCore.MainMemory; - } - - return _currentMemoryDomain; - } - - var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains"; - Console.WriteLine(error); - throw new NotImplementedException(error); - } - } - - #region Unique Library Methods - - public void SetBigEndian(bool enabled = true) - { - _isBigEndian = enabled; - } - - public List GetMemoryDomainList() - { - var list = new List(); - - foreach (var domain in DomainList) - { - list.Add(domain.Name); - } - - return list; - } - - public uint GetMemoryDomainSize(string name = "") - { - if (string.IsNullOrEmpty(name)) - { - return (uint)Domain.Size; - } - - return (uint)DomainList[VerifyMemoryDomain(name)].Size; - } - - public string GetCurrentMemoryDomain() - { - return Domain.Name; - } - - public uint GetCurrentMemoryDomainSize() - { - return (uint)Domain.Size; - } - - public bool UseMemoryDomain(string domain) - { - try - { - if (DomainList[domain] != null) - { - _currentMemoryDomain = DomainList[domain]; - return true; - } - - Console.WriteLine($"Unable to find domain: {domain}"); - return false; - } - catch // Just in case - { - Console.WriteLine($"Unable to find domain: {domain}"); - } - - return false; - } - - public string HashRegion(long addr, int count, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - - // checks - if (addr < 0 || addr >= d.Size) - { - string error = $"Address {addr} is outside the bounds of domain {d.Name}"; - Console.WriteLine(error); - throw new ArgumentOutOfRangeException(error); - } - if (addr + count > d.Size) - { - string error = $"Address {addr} + count {count} is outside the bounds of domain {d.Name}"; - Console.WriteLine(error); - throw new ArgumentOutOfRangeException(error); - } - - byte[] data = new byte[count]; - for (int i = 0; i < count; i++) - { - data[i] = d.PeekByte(addr + i); - } - - using (var hasher = System.Security.Cryptography.SHA256.Create()) - { - return hasher.ComputeHash(data).BytesToHexString(); - } - } - - #endregion - - #region Endian Handling - - private int ReadSigned(long addr, int size, string domain = null) - { - if (_isBigEndian) return ReadSignedBig(addr, size, domain); - else return ReadSignedLittle(addr, size, domain); - } - - private uint ReadUnsigned(long addr, int size, string domain = null) - { - if (_isBigEndian) return ReadUnsignedBig(addr, size, domain); - else return ReadUnsignedLittle(addr, size, domain); - } - - private void WriteSigned(long addr, int value, int size, string domain = null) - { - if (_isBigEndian) WriteSignedBig(addr, value, size, domain); - else WriteSignedLittle(addr, value, size, domain); - } - - private void WriteUnsigned(long addr, uint value, int size, string domain = null) - { - if (_isBigEndian) WriteUnsignedBig(addr, value, size, domain); - else WriteUnsignedLittle(addr, value, size, domain); - } - - #endregion - - #region Common Special and Legacy Methods - - public uint ReadByte(long addr, string domain = null) - { - return ReadUnsignedByte(addr, domain); - } - - public void WriteByte(long addr, uint value, string domain = null) - { - WriteUnsignedByte(addr, value, domain); - } - - public new List ReadByteRange(long addr, int length, string domain = null) - { - return base.ReadByteRange(addr, length, domain); - } - - public new void WriteByteRange(long addr, List memoryblock, string domain = null) - { - base.WriteByteRange(addr, memoryblock, domain); - } - - public float ReadFloat(long addr, string domain = null) - { - return base.ReadFloat(addr, _isBigEndian, domain); - } - - public void WriteFloat(long addr, double value, string domain = null) - { - base.WriteFloat(addr, value, _isBigEndian, domain); - } - - #endregion - - #region 1 Byte - - public int ReadS8(long addr, string domain = null) - { - return (sbyte)ReadUnsignedByte(addr, domain); - } - - public uint ReadU8(long addr, string domain = null) - { - return (byte)ReadUnsignedByte(addr, domain); - } - - public void WriteS8(long addr, int value, string domain = null) - { - WriteSigned(addr, value, 1, domain); - } - - public void WriteU8(long addr, uint value, string domain = null) - { - WriteUnsignedByte(addr, value, domain); - } - - #endregion - - #region 2 Byte - public int ReadS16(long addr, string domain = null) - { - return (short)ReadSigned(addr, 2, domain); - } - - public void WriteS16(long addr, int value, string domain = null) - { - WriteSigned(addr, value, 2, domain); - } - - public uint ReadU16(long addr, string domain = null) - { - return (ushort)ReadUnsigned(addr, 2, domain); - } - - public void WriteU16(long addr, uint value, string domain = null) - { - WriteUnsigned(addr, value, 2, domain); - } - #endregion - - #region 3 Byte - - public int ReadS24(long addr, string domain = null) - { - return ReadSigned(addr, 3, domain); - } - public void WriteS24(long addr, int value, string domain = null) - { - WriteSigned(addr, value, 3, domain); - } - - public uint ReadU24(long addr, string domain = null) - { - return ReadUnsigned(addr, 3, domain); - } - - public void WriteU24(long addr, uint value, string domain = null) - { - WriteUnsigned(addr, value, 3, domain); - } - - #endregion - - #region 4 Byte - - public int ReadS32(long addr, string domain = null) - { - return ReadSigned(addr, 4, domain); - } - - public void WriteS32(long addr, int value, string domain = null) - { - WriteSigned(addr, value, 4, domain); - } - - public uint ReadU32(long addr, string domain = null) - { - return ReadUnsigned(addr, 4, domain); - } - - public void WriteU32(long addr, uint value, string domain = null) - { - WriteUnsigned(addr, value, 4, domain); - } - - #endregion - } -} \ No newline at end of file diff --git a/BizHawk.Client.ApiHawk/Classes/Api/MemApiBase.cs b/BizHawk.Client.ApiHawk/Classes/Api/MemApiBase.cs deleted file mode 100644 index bc5c328d66..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/MemApiBase.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Collections.Generic; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// Base class for the Memory and MainMemory plugin libraries - /// - public abstract class MemApiBase : IExternalApi - { - [RequiredService] - protected IEmulator Emulator { get; set; } - - [OptionalService] - protected IMemoryDomains MemoryDomainCore { get; set; } - - protected abstract MemoryDomain Domain { get; } - - protected MemApiBase() - { } - - protected IMemoryDomains DomainList - { - get - { - if (MemoryDomainCore != null) - { - return MemoryDomainCore; - } - - var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains"; - Console.WriteLine(error); - throw new NotImplementedException(error); - } - } - - public string VerifyMemoryDomain(string domain) - { - try - { - if (DomainList[domain] == null) - { - Console.WriteLine($"Unable to find domain: {domain}, falling back to current"); - return Domain.Name; - } - - return domain; - } - catch // Just in case - { - Console.WriteLine($"Unable to find domain: {domain}, falling back to current"); - } - - return Domain.Name; - } - - protected uint ReadUnsignedByte(long addr, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (addr < d.Size) - { - return d.PeekByte(addr); - } - - Console.WriteLine("Warning: attempted read of " + addr + " outside the memory size of " + d.Size); - return 0; - } - - protected void WriteUnsignedByte(long addr, uint v, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - if (addr < d.Size) - { - d.PokeByte(addr, (byte)v); - } - else - { - Console.WriteLine("Warning: attempted write to " + addr + " outside the memory size of " + d.Size); - } - } - else - { - Console.WriteLine($"Error: the domain {d.Name} is not writable"); - } - } - - protected static int U2S(uint u, int size) - { - var s = (int)u; - s <<= 8 * (4 - size); - s >>= 8 * (4 - size); - return s; - } - - protected int ReadSignedLittle(long addr, int size, string domain = null) - { - return U2S(ReadUnsignedLittle(addr, size, domain), size); - } - - protected uint ReadUnsignedLittle(long addr, int size, string domain = null) - { - uint v = 0; - for (var i = 0; i < size; ++i) - { - v |= ReadUnsignedByte(addr + i, domain) << (8 * i); - } - - return v; - } - - protected int ReadSignedBig(long addr, int size, string domain = null) - { - return U2S(ReadUnsignedBig(addr, size, domain), size); - } - - protected uint ReadUnsignedBig(long addr, int size, string domain = null) - { - uint v = 0; - for (var i = 0; i < size; ++i) - { - v |= ReadUnsignedByte(addr + i, domain) << (8 * (size - 1 - i)); - } - - return v; - } - - protected void WriteSignedLittle(long addr, int v, int size, string domain = null) - { - WriteUnsignedLittle(addr, (uint)v, size, domain); - } - - protected void WriteUnsignedLittle(long addr, uint v, int size, string domain = null) - { - for (var i = 0; i < size; ++i) - { - WriteUnsignedByte(addr + i, (v >> (8 * i)) & 0xFF, domain); - } - } - - protected void WriteSignedBig(long addr, int v, int size, string domain = null) - { - WriteUnsignedBig(addr, (uint)v, size, domain); - } - - protected void WriteUnsignedBig(long addr, uint v, int size, string domain = null) - { - for (var i = 0; i < size; ++i) - { - WriteUnsignedByte(addr + i, (v >> (8 * (size - 1 - i))) & 0xFF, domain); - } - } - - #region public Library implementations - - protected List ReadByteRange(long addr, int length, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - var lastAddr = length + addr; - var list = new List(); - for (; addr <= lastAddr; addr++) - { - if (addr < d.Size) - list.Add(d.PeekByte(addr)); - else { - Console.WriteLine("Warning: Attempted read " + addr + " outside memory domain size of " + d.Size + " in readbyterange()"); - list.Add(0); - } - } - - return list; - } - - protected void WriteByteRange(long addr, List memoryblock, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - for (var i = 0; i < memoryblock.Count; i++) - { - if (addr < d.Size) - { - d.PokeByte(addr++, memoryblock[i]); - } - else - { - Console.WriteLine("Warning: Attempted write " + addr + " outside memory domain size of " + d.Size + " in writebyterange()"); - } - } - } - else - { - Console.WriteLine($"Error: the domain {d.Name} is not writable"); - } - } - - protected float ReadFloat(long addr, bool bigendian, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (addr < d.Size) - { - var val = d.PeekUint(addr, bigendian); - var bytes = BitConverter.GetBytes(val); - return BitConverter.ToSingle(bytes, 0); - } - - Console.WriteLine("Warning: Attempted read " + addr + " outside memory size of " + d.Size); - - return 0; - } - - protected void WriteFloat(long addr, double value, bool bigendian, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - if (addr < d.Size) - { - var dv = (float)value; - var bytes = BitConverter.GetBytes(dv); - var v = BitConverter.ToUInt32(bytes, 0); - d.PokeUint(addr, v, bigendian); - } - else - { - Console.WriteLine("Warning: Attempted write " + addr + " outside memory size of " + d.Size); - } - } - else - { - Console.WriteLine($"Error: the domain {Domain.Name} is not writable"); - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/MemEventsApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/MemEventsApi.cs deleted file mode 100644 index 5848df5fc3..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/MemEventsApi.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class MemEventsApi : IMemEvents - { - [RequiredService] - private IDebuggable DebuggableCore { get; set; } - - public MemEventsApi () : base() - { } - - public void AddReadCallback(Action cb, uint address, string domain) - { - if (DebuggableCore.MemoryCallbacksAvailable()) - { - DebuggableCore.MemoryCallbacks.Add(new MemoryCallback(domain, MemoryCallbackType.Read, "Plugin Hook", cb, address, null)); - } - } - public void AddWriteCallback(Action cb, uint address, string domain) - { - if (DebuggableCore.MemoryCallbacksAvailable()) - { - DebuggableCore.MemoryCallbacks.Add(new MemoryCallback(domain, MemoryCallbackType.Write, "Plugin Hook", cb, address, null)); - } - } - public void AddExecCallback(Action cb, uint address, string domain) - { - if (DebuggableCore.MemoryCallbacksAvailable() && DebuggableCore.MemoryCallbacks.ExecuteCallbacksAvailable) - { - DebuggableCore.MemoryCallbacks.Add(new MemoryCallback(domain, MemoryCallbackType.Execute, "Plugin Hook", cb, address, null)); - } - } - public void RemoveMemoryCallback(Action cb) - { - if (DebuggableCore.MemoryCallbacksAvailable()) - { - DebuggableCore.MemoryCallbacks.Remove(cb); - } - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/MemorySaveStateApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/MemorySaveStateApi.cs deleted file mode 100644 index b22eaa7540..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/MemorySaveStateApi.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class MemorySaveStateApi : IMemorySaveState - { - public MemorySaveStateApi() - { } - - [RequiredService] - private IStatable StatableCore { get; set; } - - private readonly Dictionary _memorySavestates = new Dictionary(); - - public string SaveCoreStateToMemory() - { - var guid = Guid.NewGuid(); - var bytes = (byte[])StatableCore.SaveStateBinary().Clone(); - - _memorySavestates.Add(guid, bytes); - - return guid.ToString(); - } - - public void LoadCoreStateFromMemory(string identifier) - { - var guid = new Guid(identifier); - - try - { - var state = _memorySavestates[guid]; - - using (var ms = new MemoryStream(state)) - using (var br = new BinaryReader(ms)) - { - StatableCore.LoadStateBinary(br); - } - } - catch - { - Console.WriteLine("Unable to find the given savestate in memory"); - } - } - - public void DeleteState(string identifier) - { - var guid = new Guid(identifier); - _memorySavestates.Remove(guid); - } - - public void ClearInMemoryStates() - { - _memorySavestates.Clear(); - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/MovieApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/MovieApi.cs deleted file mode 100644 index 0b74cfd5cc..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/MovieApi.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class MovieApi : IMovie - { - private static class MoviePluginStatic - { - public static string Filename() - { - return Global.MovieSession.Movie.Filename; - } - - public static bool GetReadOnly() - { - return Global.MovieSession.ReadOnly; - } - - public static ulong GetRerecordCount() - { - return Global.MovieSession.Movie.Rerecords; - } - - public static bool GetRerecordCounting() - { - return Global.MovieSession.Movie.IsCountingRerecords; - } - - public static bool IsLoaded() - { - return Global.MovieSession.Movie.IsActive; - } - - public static double Length() - { - return Global.MovieSession.Movie.FrameCount; - } - - public static string Mode() - { - if (Global.MovieSession.Movie.IsFinished) - { - return "FINISHED"; - } - - if (Global.MovieSession.Movie.IsPlaying) - { - return "PLAY"; - } - - if (Global.MovieSession.Movie.IsRecording) - { - return "RECORD"; - } - - return "INACTIVE"; - } - - public static void SetReadOnly(bool readOnly) - { - Global.MovieSession.ReadOnly = readOnly; - } - - public static void SetRerecordCount(double count) - { - // Lua numbers are always double, integer precision holds up - // to 53 bits, so throw an error if it's bigger than that. - const double PrecisionLimit = 9007199254740992d; - - if (count > PrecisionLimit) - { - throw new Exception("Rerecord count exceeds Lua integer precision."); - } - - Global.MovieSession.Movie.Rerecords = (ulong)count; - } - - public static void SetRerecordCounting(bool counting) - { - Global.MovieSession.Movie.IsCountingRerecords = counting; - } - - public static void Stop() - { - Global.MovieSession.Movie.Stop(); - } - - public static double GetFps() - { - if (Global.MovieSession.Movie.IsActive) - { - var movie = Global.MovieSession.Movie; - var system = movie.HeaderEntries[HeaderKeys.PLATFORM]; - var pal = movie.HeaderEntries.ContainsKey(HeaderKeys.PAL) && - movie.HeaderEntries[HeaderKeys.PAL] == "1"; - - return new PlatformFrameRates()[system, pal]; - } - - return 0.0; - } - - } - public MovieApi() - { } - - public bool StartsFromSavestate() - { - return Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.StartsFromSavestate; - } - - public bool StartsFromSaveram() - { - return Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.StartsFromSaveRam; - } - - public Dictionary GetInput(int frame) - { - if (!Global.MovieSession.Movie.IsActive) - { - Console.WriteLine("No movie loaded"); - return null; - } - - var input = new Dictionary(); - var adapter = Global.MovieSession.Movie.GetInputState(frame); - - if (adapter == null) - { - Console.WriteLine("Can't get input of the last frame of the movie. Use the previous frame"); - return null; - } - - foreach (var button in adapter.Definition.BoolButtons) - { - input[button] = adapter.IsPressed(button); - } - - foreach (var button in adapter.Definition.FloatControls) - { - input[button] = adapter.GetFloat(button); - } - - return input; - } - - public string GetInputAsMnemonic(int frame) - { - if (Global.MovieSession.Movie.IsActive && frame < Global.MovieSession.Movie.InputLogLength) - { - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.Movie.GetInputState(frame)); - return lg.GenerateLogEntry(); - } - - return ""; - } - - public void Save(string filename = "") - { - if (!Global.MovieSession.Movie.IsActive) - { - return; - } - - if (!string.IsNullOrEmpty(filename)) - { - filename += "." + Global.MovieSession.Movie.PreferredExtension; - var test = new FileInfo(filename); - if (test.Exists) - { - Console.WriteLine($"File {filename} already exists, will not overwrite"); - return; - } - - Global.MovieSession.Movie.Filename = filename; - } - - Global.MovieSession.Movie.Save(); - } - - public Dictionary GetHeader() - { - var table = new Dictionary(); - if (Global.MovieSession.Movie.IsActive) - { - foreach (var kvp in Global.MovieSession.Movie.HeaderEntries) - { - table[kvp.Key] = kvp.Value; - } - } - - return table; - } - - public List GetComments() - { - var list = new List(Global.MovieSession.Movie.Comments.Count); - if (Global.MovieSession.Movie.IsActive) - { - for (int i = 0; i < Global.MovieSession.Movie.Comments.Count; i++) - { - list[i] = Global.MovieSession.Movie.Comments[i]; - } - } - - return list; - } - - public List GetSubtitles() - { - var list = new List(Global.MovieSession.Movie.Subtitles.Count); - if (Global.MovieSession.Movie.IsActive) - { - for (int i = 0; i < Global.MovieSession.Movie.Subtitles.Count; i++) - { - list[i] = Global.MovieSession.Movie.Subtitles[i].ToString(); - } - } - - return list; - } - - public string Filename() - { - return MoviePluginStatic.Filename(); - } - - public bool GetReadOnly() - { - return MoviePluginStatic.GetReadOnly(); - } - - public ulong GetRerecordCount() - { - return MoviePluginStatic.GetRerecordCount(); - } - - public bool GetRerecordCounting() - { - return MoviePluginStatic.GetRerecordCounting(); - } - - public bool IsLoaded() - { - return MoviePluginStatic.IsLoaded(); - } - - public double Length() - { - return MoviePluginStatic.Length(); - } - - public string Mode() - { - return MoviePluginStatic.Mode(); - } - - public void SetReadOnly(bool readOnly) - { - MoviePluginStatic.SetReadOnly(readOnly); - } - - public void SetRerecordCount(double count) - { - MoviePluginStatic.SetRerecordCount(count); - } - - public void SetRerecordCounting(bool counting) - { - MoviePluginStatic.SetRerecordCounting(counting); - } - - public void Stop() - { - MoviePluginStatic.Stop(); - } - - public double GetFps() - { - return MoviePluginStatic.GetFps(); - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/PluginBase.cs b/BizHawk.Client.ApiHawk/Classes/Api/PluginBase.cs deleted file mode 100644 index 24bf62c727..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/PluginBase.cs +++ /dev/null @@ -1,50 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.ApiHawk -{ - public abstract class PluginBase : IPlugin - { - /// - /// The base class from which all - /// plugins will be derived - /// - /// Actual plugins should implement - /// one of the below callback methods - /// or register memory callbacks in - /// their Init function. - /// - protected IApiContainer _api; - - public PluginBase() { } - - public abstract string Name { get; } - public abstract string Description { get; } - - public bool Enabled => Running; - public bool Paused => !Running; - - public bool Running { get; set; } - - public void Stop() - { - Running = false; - } - - public void Toggle() - { - Running = !Running; - } - - public virtual void PreFrameCallback() { } - public virtual void PostFrameCallback() { } - public virtual void SaveStateCallback(string name) { } - public virtual void LoadStateCallback(string name) { } - public virtual void InputPollCallback() { } - public virtual void ExitCallback() { } - public virtual void Init (IApiContainer api) - { - _api = api; - Running = true; - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/SqlApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/SqlApi.cs deleted file mode 100644 index 6a18d507af..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/SqlApi.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data.SQLite; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class SqlApi : ISql - { - public SqlApi() : base() - { } - - SQLiteConnection m_dbConnection; - string connectionString; - - public string CreateDatabase(string name) - { - try - { - SQLiteConnection.CreateFile(name); - return "Database Created Successfully"; - } - catch (SQLiteException sqlEX) - { - return sqlEX.Message; - } - - } - - public string OpenDatabase(string name) - { - try - { - SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder(); - connBuilder.DataSource = name; - connBuilder.Version = 3; //SQLite version - connBuilder.JournalMode = SQLiteJournalModeEnum.Wal; //Allows for reads and writes to happen at the same time - connBuilder.DefaultIsolationLevel = System.Data.IsolationLevel.ReadCommitted; //This only helps make the database lock left. May be pointless now - connBuilder.SyncMode = SynchronizationModes.Off; //This shortens the delay for do synchronous calls. - m_dbConnection = new SQLiteConnection(connBuilder.ToString()); - connectionString = connBuilder.ToString(); - m_dbConnection.Open(); - m_dbConnection.Close(); - return "Database Opened Successfully"; - } - catch (SQLiteException sqlEX) - { - return sqlEX.Message; - } - } - - public string WriteCommand(string query = "") - { - if (query == "") - { - return "query is empty"; - } - try - { - m_dbConnection.Open(); - string sql = query; - SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); - command.ExecuteNonQuery(); - m_dbConnection.Close(); - - return "Command ran successfully"; - - } - catch (NullReferenceException nullEX) - { - return "Database not open."; - } - catch (SQLiteException sqlEX) - { - m_dbConnection.Close(); - return sqlEX.Message; - } - } - - public dynamic ReadCommand(string query = "") - { - if (query == "") - { - return "query is empty"; - } - try - { - var table = new Dictionary(); - m_dbConnection.Open(); - string sql = "PRAGMA read_uncommitted =1;" + query; - SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); - SQLiteDataReader reader = command.ExecuteReader(); - bool rows = reader.HasRows; - long rowCount = 0; - var columns = new List(); - for (int i = 0; i < reader.FieldCount; ++i) //Add all column names into list - { - columns.Add(reader.GetName(i)); - } - while (reader.Read()) - { - for (int i = 0; i < reader.FieldCount; ++i) - { - table[columns[i] + " " + rowCount.ToString()] = reader.GetValue(i); - } - rowCount += 1; - } - reader.Close(); - m_dbConnection.Close(); - if (rows == false) - { - return "No rows found"; - } - - return table; - - } - catch (NullReferenceException) - { - return "Database not opened."; - } - catch (SQLiteException sqlEX) - { - m_dbConnection.Close(); - return sqlEX.Message; - } - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Api/UserDataApi.cs b/BizHawk.Client.ApiHawk/Classes/Api/UserDataApi.cs deleted file mode 100644 index 735fe397b9..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Api/UserDataApi.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.ComponentModel; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.ApiHawk -{ - public sealed class UserDataApi : IUserData - { - public UserDataApi() : base() - { } - - public void Set(string name, object value) - { - if (value != null) - { - var t = value.GetType(); - if (!t.IsPrimitive && t != typeof(string)) - { - throw new InvalidOperationException("Invalid type for userdata"); - } - } - - Global.UserBag[name] = value; - } - - public object Get(string key) - { - if (Global.UserBag.ContainsKey(key)) - { - return Global.UserBag[key]; - } - - return null; - } - - public void Clear() - { - Global.UserBag.Clear(); - } - - public bool Remove(string key) - { - return Global.UserBag.Remove(key); - } - - public bool ContainsKey(string key) - { - return Global.UserBag.ContainsKey(key); - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/BasicApiProvider.cs b/BizHawk.Client.ApiHawk/Classes/BasicApiProvider.cs deleted file mode 100644 index 75da59a6d4..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/BasicApiProvider.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// A generic implementation of IExternalApi provider that provides - /// this functionality to any core. - /// The provider will scan an IExternal and register all IExternalApis - /// that the core object itself implements. In addition it provides - /// a Register() method to allow the core to pass in any additional Apis - /// - /// - public class BasicApiProvider : IExternalApiProvider - { - private readonly Dictionary _Apis = new Dictionary(); - - public BasicApiProvider(IApiContainer container) - { - // simplified logic here doesn't scan for possible Apis; just adds what it knows is implemented by the PluginApi - // this removes the possibility of automagically picking up a Api in a nested class, (find the type, then - // find the field), but we're going to keep such logic out of the basic provider. Anything the passed - // container doesn't implement directly needs to be added with Register() - // this also fully allows apis that are not IExternalApi - var libs = container.Libraries; - - _Apis = libs; - } - - /// - /// the client can call this to register an additional Api - /// - /// The to register - public void Register(T api) - where T : IExternalApi - { - if (api == null) - { - throw new ArgumentNullException(nameof(api)); - } - - _Apis[typeof(T)] = api; - } - - public T GetApi() - where T : IExternalApi - { - return (T)GetApi(typeof(T)); - } - - public object GetApi(Type t) - { - IExternalApi Api; - KeyValuePair[] k = _Apis.Where(kvp => t.IsAssignableFrom(kvp.Key)).ToArray(); - if (k.Length > 0) - { - return k[0].Value; - } - - return null; - } - - public bool HasApi() - where T : IExternalApi - { - return HasApi(typeof(T)); - } - - public bool HasApi(Type t) - { - return _Apis.ContainsKey(t); - } - - public IEnumerable AvailableApis - { - get - { - return _Apis.Select(d => d.Key); - } - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs b/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs deleted file mode 100644 index 935df8122f..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Globalization; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This class holds a converter for BizHawk SystemId (which is a simple - /// It allows you to convert it to a value and vice versa - /// - /// I made it this way just in case one day we need it for WPF (DependencyProperty binding). Just uncomment :IValueConverter implementation - /// I didn't implemented it because of mono compatibility - /// - public sealed class BizHawkSystemIdToEnumConverter //:IValueConverter - { - /// - /// Convert BizHawk SystemId to value - /// - /// you want to convert - /// The type of the binding target property - /// The converter parameter to use; null in our case - /// The culture to use in the converter - /// A that is equivalent to BizHawk SystemId - /// Thrown when SystemId hasn't been found - public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo) - { - switch ((string)value) - { - case "AppleII": - return CoreSystem.AppleII; - - case "A26": - return CoreSystem.Atari2600; - - case "A78": - return CoreSystem.Atari7800; - - case "Coleco": - return CoreSystem.ColecoVision; - - case "C64": - return CoreSystem.Commodore64; - - case "DGB": - return CoreSystem.DualGameBoy; - - case "GB": - return CoreSystem.GameBoy; - - case "GBA": - return CoreSystem.GameBoyAdvance; - - case "GEN": - return CoreSystem.Genesis; - - case "INTV": - return CoreSystem.Intellivision; - - case "Libretro": - return CoreSystem.Libretro; - - case "Lynx": - return CoreSystem.Lynx; - - case "SMS": - return CoreSystem.MasterSystem; - - case "NES": - return CoreSystem.NES; - - case "N64": - return CoreSystem.Nintendo64; - - case "NULL": - return CoreSystem.Null; - - case "PCE": - case "PCECD": - case "SGX": - return CoreSystem.PCEngine; - - case "PSX": - return CoreSystem.Playstation; - - case "PSP": - return CoreSystem.PSP; - - case "SAT": - return CoreSystem.Saturn; - - case "SNES": - return CoreSystem.SNES; - - case "TI83": - return CoreSystem.TI83; - - case "WSWAN": - return CoreSystem.WonderSwan; - - case "ZXSpectrum": - return CoreSystem.ZXSpectrum; - - case "AmstradCPC": - return CoreSystem.AmstradCPC; - - case "VB": - case "NGP": - case "DNGP": - case "O2": - case "SGB": - case "UZE": - case "PCFX": - return 0; // like I give a shit - - default: - throw new IndexOutOfRangeException(string.Format("{0} is missing in convert list", value)); - } - } - - - /// - /// Convert BizHawk SystemId to value - /// - /// you want to convert - /// A that is equivalent to BizHawk SystemId - /// Thrown when SystemId hasn't been found - public CoreSystem Convert(string value) - { - return (CoreSystem)Convert(value, null, null, CultureInfo.CurrentCulture); - } - - - /// - /// Convert a value to BizHawk SystemId - /// - /// you want to convert - /// The type of the binding target property - /// The converter parameter to use; null in our case - /// The culture to use in the converter - /// A that is used by BizHawk SystemId - /// Thrown when hasn't been found - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo cultureInfo) - { - switch ((CoreSystem)value) - { - case CoreSystem.AppleII: - return "AppleII"; - - case CoreSystem.Atari2600: - return "A26"; - - case CoreSystem.Atari7800: - return "A78"; - - case CoreSystem.ColecoVision: - return "Coleco"; - - case CoreSystem.Commodore64: - return "C64"; - - case CoreSystem.DualGameBoy: - return "DGB"; - - case CoreSystem.GameBoy: - return "GB"; - - case CoreSystem.GameBoyAdvance: - return "GBA"; - - case CoreSystem.Genesis: - return "GEN"; - - case CoreSystem.Intellivision: - return "INTV"; - - case CoreSystem.Libretro: - return "Libretro"; - - case CoreSystem.Lynx: - return "Lynx"; - - case CoreSystem.MasterSystem: - return "SMS"; - - case CoreSystem.NES: - return "NES"; - - case CoreSystem.Nintendo64: - return "N64"; - - case CoreSystem.Null: - return "NULL"; - - case CoreSystem.PCEngine: - return "PCE"; - - case CoreSystem.Playstation: - return "PSX"; - - case CoreSystem.PSP: - return "PSP"; - - case CoreSystem.Saturn: - return "SAT"; - - case CoreSystem.SNES: - return "SNES"; - - case CoreSystem.TI83: - return "TI83"; - - case CoreSystem.WonderSwan: - return "WSWAN"; - - case CoreSystem.ZXSpectrum: - return "ZXSpectrum"; - - case CoreSystem.AmstradCPC: - return "AmstradCPC"; - - default: - throw new IndexOutOfRangeException(string.Format("{0} is missing in convert list", value.ToString())); - } - } - - - /// - /// Convert a value to BizHawk SystemId - /// - /// you want to convert - /// A that is used by BizHawk SystemId - /// Thrown when hasn't been found - public string ConvertBack(CoreSystem value) - { - return (string)ConvertBack(value, null, null, CultureInfo.CurrentCulture); - } - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/ClientApi.cs b/BizHawk.Client.ApiHawk/Classes/ClientApi.cs deleted file mode 100644 index 19d01f9f08..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/ClientApi.cs +++ /dev/null @@ -1,787 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using System.Windows.Forms; -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Client.ApiHawk.Classes.Events; -using System.IO; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This class contains some methods that - /// interract with BizHawk client - /// - public static class ClientApi - { - #region Fields - - private static IEmulator Emulator; - private static IVideoProvider VideoProvider; - - private static readonly Assembly clientAssembly; - private static readonly object clientMainFormInstance; - private static readonly Type mainFormClass; - private static readonly Array joypadButtonsArray = Enum.GetValues(typeof(JoypadButton)); - - internal static readonly BizHawkSystemIdToEnumConverter SystemIdConverter = new BizHawkSystemIdToEnumConverter(); - internal static readonly JoypadStringToEnumConverter JoypadConverter = new JoypadStringToEnumConverter(); - - private static List allJoypads; - - /// - /// Occurs before a quickload is done (just after user has pressed the shortcut button - /// or has click on the item menu) - /// - public static event BeforeQuickLoadEventHandler BeforeQuickLoad; - /// - /// Occurs before a quicksave is done (just after user has pressed the shortcut button - /// or has click on the item menu) - /// - public static event BeforeQuickSaveEventHandler BeforeQuickSave; - /// - /// Occurs when a ROM is succesfully loaded - /// - public static event EventHandler RomLoaded; - /// - /// Occurs when a savestate is sucessfully loaded - /// - public static event StateLoadedEventHandler StateLoaded; - /// - /// Occurs when a savestate is successfully saved - /// - public static event StateSavedEventHandler StateSaved; - - #endregion - - #region cTor(s) - - /// - /// Static stuff initilization - /// - static ClientApi() - { - clientAssembly = Assembly.GetEntryAssembly(); - clientMainFormInstance = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin").GetField("MainForm").GetValue(null); - mainFormClass = clientAssembly.GetType("BizHawk.Client.EmuHawk.MainForm"); - } - - public static void UpdateEmulatorAndVP(IEmulator emu = null) - { - Emulator = emu; - VideoProvider = Emulation.Common.IEmulatorExtensions.Extensions.AsVideoProviderOrDefault(emu); - } - - #endregion - - #region Methods - - #region Helpers - - private static void InvokeMainFormMethod(string name, dynamic[] paramList = null) - { - List typeList = new List(); - MethodInfo method; - if (paramList != null) - { - foreach (var obj in paramList) - { - typeList.Add(obj.GetType()); - } - method = mainFormClass.GetMethod(name, typeList.ToArray()); - } - else method = mainFormClass.GetMethod(name); - method.Invoke(clientMainFormInstance, paramList); - } - - private static object GetMainFormField(string name) - { - return mainFormClass.GetField(name); - } - - private static void SetMainFormField(string name, object value) - { - mainFormClass.GetField(name).SetValue(clientMainFormInstance, value); - } - - #endregion - - #region Public - /// - /// THE FrameAdvance stuff - /// - public static void DoFrameAdvance() - { - InvokeMainFormMethod("FrameAdvance", null); - - InvokeMainFormMethod("StepRunLoop_Throttle", null); - - InvokeMainFormMethod("Render", null); - } - - /// - /// THE FrameAdvance stuff - /// Auto unpause emulation - /// - public static void DoFrameAdvanceAndUnpause() - { - DoFrameAdvance(); - UnpauseEmulation(); - } - - /// - /// Gets a for specified player - /// - /// Player (one based) you want current inputs - /// A populated with current inputs - /// Raised when you specify a player less than 1 or greater than maximum allows (see SystemInfo class to get this information) - public static Joypad GetInput(int player) - { - if (player < 1 || player > RunningSystem.MaxControllers) - { - throw new IndexOutOfRangeException(string.Format("{0} does not support {1} controller(s)", RunningSystem.DisplayName, player)); - } - else - { - GetAllInputs(); - return allJoypads[player - 1]; - } - } - - - /// - /// Load a savestate specified by its name - /// - /// Savetate friendly name - public static void LoadState(string name) - { - InvokeMainFormMethod("LoadState", new object[] { Path.Combine(PathManager.GetSaveStatePath(Global.Game), string.Format("{0}.{1}", name, "State")), name, false, false }); - } - - - /// - /// Raised before a quickload is done (just after pressing shortcut button) - /// - /// Object who raised the event - /// Slot used for quickload - /// A boolean that can be set if users want to handle save themselves; if so, BizHawk won't do anything - public static void OnBeforeQuickLoad(object sender, string quickSaveSlotName, out bool eventHandled) - { - eventHandled = false; - if (BeforeQuickLoad != null) - { - BeforeQuickLoadEventArgs e = new BeforeQuickLoadEventArgs(quickSaveSlotName); - BeforeQuickLoad(sender, e); - eventHandled = e.Handled; - } - } - - - /// - /// Raised before a quicksave is done (just after pressing shortcut button) - /// - /// Object who raised the event - /// Slot used for quicksave - /// A boolean that can be set if users want to handle save themselves; if so, BizHawk won't do anything - public static void OnBeforeQuickSave(object sender, string quickSaveSlotName, out bool eventHandled) - { - eventHandled = false; - if (BeforeQuickSave != null) - { - BeforeQuickSaveEventArgs e = new BeforeQuickSaveEventArgs(quickSaveSlotName); - BeforeQuickSave(sender, e); - eventHandled = e.Handled; - } - } - - - /// - /// Raise when a state is loaded - /// - /// Object who raised the event - /// User friendly name for saved state - public static void OnStateLoaded(object sender, string stateName) - { - if (StateLoaded != null) - { - StateLoaded(sender, new StateLoadedEventArgs(stateName)); - } - } - - /// - /// Raise when a state is saved - /// - /// Object who raised the event - /// User friendly name for saved state - public static void OnStateSaved(object sender, string stateName) - { - if (StateSaved != null) - { - StateSaved(sender, new StateSavedEventArgs(stateName)); - } - } - - /// - /// Raise when a rom is successfully Loaded - /// - public static void OnRomLoaded(IEmulator emu) - { - Emulator = emu; - VideoProvider = Emulation.Common.IEmulatorExtensions.Extensions.AsVideoProviderOrDefault(emu); - RomLoaded?.Invoke(null, EventArgs.Empty); - - allJoypads = new List(RunningSystem.MaxControllers); - for (int i = 1; i <= RunningSystem.MaxControllers; i++) - { - allJoypads.Add(new Joypad(RunningSystem, i)); - } - } - - - /// - /// Save a state with specified name - /// - /// Savetate friendly name - public static void SaveState(string name) - { - InvokeMainFormMethod("SaveState", new object[] { Path.Combine(PathManager.GetSaveStatePath(Global.Game), string.Format("{0}.{1}", name, "State")), name, false }); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - /// Right padding - /// Bottom padding - public static void SetGameExtraPadding(int left, int top, int right, int bottom) - { - FieldInfo f = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin").GetField("DisplayManager"); - object displayManager = f.GetValue(null); - f = f.FieldType.GetField("GameExtraPadding"); - f.SetValue(displayManager, new Padding(left, top, right, bottom)); - - InvokeMainFormMethod("FrameBufferResized"); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - public static void SetGameExtraPadding(int left) - { - SetGameExtraPadding(left, 0, 0, 0); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - public static void SetGameExtraPadding(int left, int top) - { - SetGameExtraPadding(left, top, 0, 0); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - /// Right padding - public static void SetGameExtraPadding(int left, int top, int right) - { - SetGameExtraPadding(left, top, right, 0); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - /// Right padding - /// Bottom padding - public static void SetExtraPadding(int left, int top, int right, int bottom) - { - FieldInfo f = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin").GetField("DisplayManager"); - object displayManager = f.GetValue(null); - f = f.FieldType.GetField("ClientExtraPadding"); - f.SetValue(displayManager, new Padding(left, top, right, bottom)); - - InvokeMainFormMethod("FrameBufferResized"); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - public static void SetExtraPadding(int left) - { - SetExtraPadding(left, 0, 0, 0); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - public static void SetExtraPadding(int left, int top) - { - SetExtraPadding(left, top, 0, 0); - } - - /// - /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements - /// - /// Left padding - /// Top padding - /// Right padding - public static void SetExtraPadding(int left, int top, int right) - { - SetExtraPadding(left, top, right, 0); - } - - /// - /// Set inputs in specified to specified player - /// - /// Player (one based) whom inputs must be set - /// with inputs - /// Raised when you specify a player less than 1 or greater than maximum allows (see SystemInfo class to get this information) - /// Still have some strange behaviour with multiple inputs; so this feature is still in beta - public static void SetInput(int player, Joypad joypad) - { - if (player < 1 || player > RunningSystem.MaxControllers) - { - throw new IndexOutOfRangeException(string.Format("{0} does not support {1} controller(s)", RunningSystem.DisplayName, player)); - } - else - { - if (joypad.Inputs == 0) - { - AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter; - joypadAdaptor.ClearStickies(); - } - else - { - foreach (JoypadButton button in joypadButtonsArray) - { - if (joypad.Inputs.HasFlag(button)) - { - AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter; - if (RunningSystem == SystemInfo.GB) - { - joypadAdaptor.SetSticky(string.Format("{0}", JoypadConverter.ConvertBack(button, RunningSystem)), true); - } - else - { - joypadAdaptor.SetSticky(string.Format("P{0} {1}", player, JoypadConverter.ConvertBack(button, RunningSystem)), true); - } - } - } - } - - //Using this break joypad usage (even in UI); have to figure out why - /*if ((RunningSystem.AvailableButtons & JoypadButton.AnalogStick) == JoypadButton.AnalogStick) - { - AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter; - for (int i = 1; i <= RunningSystem.MaxControllers; i++) - { - joypadAdaptor.SetFloat(string.Format("P{0} X Axis", i), allJoypads[i - 1].AnalogX); - joypadAdaptor.SetFloat(string.Format("P{0} Y Axis", i), allJoypads[i - 1].AnalogY); - } - }*/ - } - } - - - /// - /// Resume the emulation - /// - public static void UnpauseEmulation() - { - InvokeMainFormMethod("UnpauseEmulator", null); - } - #endregion Public - - /// - /// Gets all current inputs for each joypad and store - /// them in class collection - /// - private static void GetAllInputs() - { - AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter; - - IEnumerable pressedButtons = from button in joypadAdaptor.Definition.BoolButtons - where joypadAdaptor.IsPressed(button) - select button; - - foreach (Joypad j in allJoypads) - { - j.ClearInputs(); - } - - Parallel.ForEach(pressedButtons, button => - { - int player; - if (RunningSystem == SystemInfo.GB) - { - allJoypads[0].AddInput(JoypadConverter.Convert(button)); - } - else - { - if (int.TryParse(button.Substring(1, 2), out player)) - { - allJoypads[player - 1].AddInput(JoypadConverter.Convert(button.Substring(3))); - } - } - }); - - if ((RunningSystem.AvailableButtons & JoypadButton.AnalogStick) == JoypadButton.AnalogStick) - { - for (int i = 1; i <= RunningSystem.MaxControllers; i++) - { - allJoypads[i - 1].AnalogX = joypadAdaptor.GetFloat(string.Format("P{0} X Axis", i)); - allJoypads[i - 1].AnalogY = joypadAdaptor.GetFloat(string.Format("P{0} Y Axis", i)); - } - } - } - - public static void CloseEmulator() - { - InvokeMainFormMethod("CloseEmulator"); - } - - public static void CloseEmulatorWithCode(int exitCode) - { - InvokeMainFormMethod("CloseEmulator", new object[] {exitCode}); - } - - public static int BorderHeight() - { - var point = new System.Drawing.Point(0, 0); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin"); - FieldInfo f = t.GetField("DisplayManager"); - object displayManager = f.GetValue(null); - MethodInfo m = t.GetMethod("TransFormPoint"); - point = (System.Drawing.Point) m.Invoke(displayManager, new object[] { point }); - return point.Y; - } - - public static int BorderWidth() - { - var point = new System.Drawing.Point(0, 0); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin"); - FieldInfo f = t.GetField("DisplayManager"); - object displayManager = f.GetValue(null); - MethodInfo m = t.GetMethod("TransFormPoint"); - point = (System.Drawing.Point)m.Invoke(displayManager, new object[] { point }); - return point.X; - } - - public static int BufferHeight() - { - return VideoProvider.BufferHeight; - } - - public static int BufferWidth() - { - return VideoProvider.BufferWidth; - } - - public static void ClearAutohold() - { - InvokeMainFormMethod("ClearHolds"); - } - - public static void CloseRom() - { - InvokeMainFormMethod("CloseRom"); - } - - public static void DisplayMessages(bool value) - { - Global.Config.DisplayMessages = value; - } - - public static void EnableRewind(bool enabled) - { - InvokeMainFormMethod("EnableRewind", new object[] {enabled}); - } - - public static void FrameSkip(int numFrames) - { - if (numFrames > 0) - { - Global.Config.FrameSkip = numFrames; - InvokeMainFormMethod("FrameSkipMessage"); - } - else - { - Console.WriteLine("Invalid frame skip value"); - } - } - - public static int GetTargetScanlineIntensity() - { - return Global.Config.TargetScanlineFilterIntensity; - } - - public static int GetWindowSize() - { - return Global.Config.TargetZoomFactors[Emulator.SystemId]; - } - - public static void SetSoundOn(bool enable) - { - Global.Config.SoundEnabled = enable; - } - - public static bool GetSoundOn() - { - return Global.Config.SoundEnabled; - } - - public static bool IsPaused() - { - return (bool) GetMainFormField("EmulatorPaused"); - } - - public static bool IsTurbo() - { - return (bool)GetMainFormField("IsTurboing"); - } - - public static bool IsSeeking() - { - return (bool)GetMainFormField("IsSeeking"); - } - - public static void OpenRom(string path) - { - var ioa = OpenAdvancedSerializer.ParseWithLegacy(path); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin.MainForm.LoadRomArgs"); - object o = Activator.CreateInstance(t); - t.GetField("OpenAdvanced").SetValue(o, ioa); - - InvokeMainFormMethod("LoadRom", new object[] {path, o}); - } - - public static void Pause() - { - InvokeMainFormMethod("PauseEmulator"); - } - - public static void PauseAv() - { - SetMainFormField("PauseAvi", true); - } - - public static void RebootCore() - { - InvokeMainFormMethod("RebootCore"); - } - - public static void SaveRam() - { - InvokeMainFormMethod("FlushSaveRAM"); - } - - public static int ScreenHeight() - { - Type t = GetMainFormField("PresentationPanel").GetType(); - object o = GetMainFormField("PresentationPanel"); - o = t.GetField("NativeSize").GetValue(o); - t = t.GetField("NativeSize").GetType(); - - return (int) t.GetField("Height").GetValue(o); - } - - public static void Screenshot(string path = null) - { - if (path == null) - { - InvokeMainFormMethod("TakeScreenshot"); - } - else - { - InvokeMainFormMethod("TakeScreenshot", new object[] {path}); - } - } - - public static void ScreenshotToClipboard() - { - InvokeMainFormMethod("TakeScreenshotToClipboard"); - } - - public static void SetTargetScanlineIntensity(int val) - { - Global.Config.TargetScanlineFilterIntensity = val; - } - - public static void SetScreenshotOSD(bool value) - { - Global.Config.Screenshot_CaptureOSD = value; - } - - public static int ScreenWidth() - { - Type t = GetMainFormField("PresentationPanel").GetType(); - object o = GetMainFormField("PresentationPanel"); - o = t.GetField("NativeSize").GetValue(o); - t = t.GetField("NativeSize").GetType(); - - return (int) t.GetField("Width").GetValue(o); - } - - public static void SetWindowSize(int size) - { - if (size == 1 || size == 2 || size == 3 || size == 4 || size == 5 || size == 10) - { - Global.Config.TargetZoomFactors[Emulator.SystemId] = size; - InvokeMainFormMethod("FrameBufferResized"); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin"); - FieldInfo f = t.GetField("OSD"); - object osd = f.GetValue(null); - t = f.GetType(); - MethodInfo m = t.GetMethod("AddMessage"); - m.Invoke(osd, new Object[] { "Window size set to " + size + "x" }); - } - else - { - Console.WriteLine("Invalid window size"); - } - } - - public static void SpeedMode(int percent) - { - if (percent > 0 && percent < 6400) - { - InvokeMainFormMethod("ClickSpeedItem", new object[] {percent}); - } - else - { - Console.WriteLine("Invalid speed value"); - } - } - - public static void TogglePause() - { - InvokeMainFormMethod("TogglePause"); - } - - public static int TransformPointX(int x) - { - var point = new System.Drawing.Point(x, 0); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin"); - FieldInfo f = t.GetField("DisplayManager"); - object displayManager = f.GetValue(null); - MethodInfo m = t.GetMethod("TransFormPoint"); - point = (System.Drawing.Point)m.Invoke(displayManager, new object[] { point }); - return point.X; - } - - public static int TransformPointY(int y) - { - var point = new System.Drawing.Point(0, y); - Type t = clientAssembly.GetType("BizHawk.Client.EmuHawk.GlobalWin"); - FieldInfo f = t.GetField("DisplayManager"); - object displayManager = f.GetValue(null); - MethodInfo m = t.GetMethod("TransFormPoint"); - point = (System.Drawing.Point)m.Invoke(displayManager, new object[] { point }); - return point.Y; - } - - public static void Unpause() - { - InvokeMainFormMethod("UnpauseEmulator"); - } - - public static void UnpauseAv() - { - SetMainFormField("PauseAvi", false); - } - - public static int Xpos() - { - object o = GetMainFormField("DesktopLocation"); - Type t = mainFormClass.GetField("DesktopLocation").GetType(); - return (int)t.GetField("X").GetValue(o); - } - - public static int Ypos() - { - object o = GetMainFormField("DesktopLocation"); - Type t = mainFormClass.GetField("DesktopLocation").GetType(); - return (int)t.GetField("Y").GetValue(o); - } - - #endregion - - #region Properties - - /// - /// Gets current emulated system - /// - public static SystemInfo RunningSystem - { - get - { - switch (Global.Emulator.SystemId) - { - case "PCE": - if (((PCEngine)Global.Emulator).Type == NecSystemType.TurboGrafx) - { - return SystemInfo.PCE; - } - else if (((PCEngine)Global.Emulator).Type == NecSystemType.SuperGrafx) - { - return SystemInfo.SGX; - } - else - { - return SystemInfo.PCECD; - } - - case "SMS": - if (((SMS)Global.Emulator).IsSG1000) - { - return SystemInfo.SG; - } - else if (((SMS)Global.Emulator).IsGameGear) - { - return SystemInfo.GG; - } - else - { - return SystemInfo.SMS; - } - - case "GB": - if (Global.Emulator is Gameboy) - { - return SystemInfo.GB; - } - else if (Global.Emulator is GBColors) - { - return SystemInfo.GBC; - } - else - { - return SystemInfo.DualGB; - } - - default: - return SystemInfo.FindByCoreSystem(SystemIdConverter.Convert(Global.Emulator.SystemId)); - } - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickLoadEventArgs.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickLoadEventArgs.cs deleted file mode 100644 index 85fe83d1f8..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickLoadEventArgs.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// This class holds event data for BeforeQuickLoad event - /// - public sealed class BeforeQuickLoadEventArgs : EventArgs - { - #region Fields - - private bool _Handled = false; - private string _QuickSaveSlotName; - - #endregion - - #region cTor(s) - - internal BeforeQuickLoadEventArgs(string name) - { - _QuickSaveSlotName = name; - } - - #endregion - - #region Properties - - /// - /// Gets or sets value that defined if saved has been handled or not - /// - public bool Handled - { - get - { - return _Handled; - } - set - { - _Handled = value; - } - } - - /// - /// Gets quicksave name - /// - public string Name - { - get - { - return _QuickSaveSlotName; - } - } - - - /// - /// Gets slot used for quicksave - /// - public int Slot - { - get - { - return int.Parse(_QuickSaveSlotName.Substring(_QuickSaveSlotName.Length - 1)); - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickSaveEventArgs.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickSaveEventArgs.cs deleted file mode 100644 index b186f82aba..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/BeforeQuickSaveEventArgs.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// This class holds event data for BeforeQuickSave event - /// - public sealed class BeforeQuickSaveEventArgs : EventArgs - { - #region Fields - - private bool _Handled = false; - private string _QuickSaveSlotName; - - #endregion - - #region cTor(s) - - internal BeforeQuickSaveEventArgs(string name) - { - _QuickSaveSlotName = name; - } - - #endregion - - #region Properties - - /// - /// Gets or sets value that defined if saved has been handled or not - /// - public bool Handled - { - get - { - return _Handled; - } - set - { - _Handled = value; - } - } - - - /// - /// Gets quicksave name - /// - public string Name - { - get - { - return _QuickSaveSlotName; - } - } - - - /// - /// Gets slot used for quicksave - /// - public int Slot - { - get - { - return int.Parse(_QuickSaveSlotName.Substring(_QuickSaveSlotName.Length - 1)); - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateLoadedEventArgs.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateLoadedEventArgs.cs deleted file mode 100644 index 0dfc5b3729..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateLoadedEventArgs.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// This class holds event data for StateLoaded event - /// - public sealed class StateLoadedEventArgs: EventArgs - { - #region Fields - - string _Name; - - #endregion - - #region cTor(s) - - /// - /// Initialize a new instance of - /// - /// User friendly name of loaded state - internal StateLoadedEventArgs(string stateName) - { - _Name = stateName; - } - - #endregion - - #region Properties - - /// - /// Gets user friendly name of the loaded savestate - /// - public string Name - { - get - { - return _Name; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateSavedEventArgs.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateSavedEventArgs.cs deleted file mode 100644 index a2d00690eb..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventArgs/StateSavedEventArgs.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// This class holds event data for StateSaved event - /// - public sealed class StateSavedEventArgs : EventArgs - { - #region Fields - - string _Name; - - #endregion - - #region cTor(s) - - /// - /// Initialize a new instance of - /// - /// User friendly name of loaded state - internal StateSavedEventArgs(string stateName) - { - _Name = stateName; - } - - #endregion - - #region Properties - - /// - /// Gets user friendly name of the loaded savestate - /// - public string Name - { - get - { - return _Name; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickLoadEventhandler.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickLoadEventhandler.cs deleted file mode 100644 index 86c19b7bef..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickLoadEventhandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// Represent a method that will handle the event raised before a quickload is done - /// - /// Object that raised the event - /// Event arguments - public delegate void BeforeQuickLoadEventHandler(object sender, BeforeQuickLoadEventArgs e); -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickSaveEventhandler.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickSaveEventhandler.cs deleted file mode 100644 index fdb5ba6fab..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/BeforeQuickSaveEventhandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// Represent a method that will handle the event raised before a quicksave is done - /// - /// Object that raised the event - /// Event arguments - public delegate void BeforeQuickSaveEventHandler(object sender, BeforeQuickSaveEventArgs e); -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateLoadedEventHandler.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateLoadedEventHandler.cs deleted file mode 100644 index e5debf85d6..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateLoadedEventHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// Represent a method that will handle the event raised when a savestate is loaded - /// - /// Object that raised the event - /// Event arguments - public delegate void StateLoadedEventHandler(object sender, StateLoadedEventArgs e); -} diff --git a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateSavedEventHandler.cs b/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateSavedEventHandler.cs deleted file mode 100644 index ae8a026171..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Events/EventHandlers/StateSavedEventHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BizHawk.Client.ApiHawk.Classes.Events -{ - /// - /// Represent a method that will handle the event raised when a savestate is saved - /// - /// Object that raised the event - /// Event arguments - public delegate void StateSavedEventHandler(object sender, StateSavedEventArgs e); -} diff --git a/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs b/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs deleted file mode 100644 index 54a9ccfa37..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Reflection; - -using System.Windows.Forms; -using BizHawk.Client.Common; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This static class handle all ExternalTools - /// - public static class ExternalToolManager - { - #region Fields - - private static FileSystemWatcher directoryMonitor; - private static List menuItems = new List(); - - #endregion - - #region cTor(s) - - /// - /// Initilization - /// - static ExternalToolManager() - { - if(!Directory.Exists(Global.Config.PathEntries["Global", "External Tools"].Path)) - { - Directory.CreateDirectory(Global.Config.PathEntries["Global", "External Tools"].Path); - } - directoryMonitor = new FileSystemWatcher(Global.Config.PathEntries["Global", "External Tools"].Path, "*.dll"); - directoryMonitor.IncludeSubdirectories = false; - directoryMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName; - directoryMonitor.Filter = "*.dll"; - directoryMonitor.Created += new FileSystemEventHandler(DirectoryMonitor_Created); - directoryMonitor.EnableRaisingEvents = true; - - ClientApi.RomLoaded += delegate { BuildToolStrip(); }; - - BuildToolStrip(); - } - - #endregion - - #region Methods - - /// - /// Build the toolstrip menu - /// - private static void BuildToolStrip() - { - menuItems.Clear(); - if (Directory.Exists(directoryMonitor.Path)) - { - DirectoryInfo dInfo = new DirectoryInfo(directoryMonitor.Path); - - foreach (FileInfo fi in dInfo.GetFiles("*.dll")) - { - menuItems.Add(GenerateToolTipFromFileName(fi.FullName)); - } - } - } - - /// - /// Generate a from an - /// external tool dll. - /// The assembly must have in its - /// assembly attributes - /// - /// File that will be reflected - /// A new ; assembly path can be found in the Tag property - /// For the moment, you could only load a dll that have a form (which implements ) - private static ToolStripMenuItem GenerateToolTipFromFileName(string fileName) - { - Type customFormType; - Assembly externalToolFile; - ToolStripMenuItem item = null; - - try - { - BizHawk.Common.Win32Hacks.RemoveMOTW(fileName); - externalToolFile = Assembly.LoadFrom(fileName); - object[] attributes = externalToolFile.GetCustomAttributes(typeof(BizHawkExternalToolAttribute), false); - if (attributes != null && attributes.Count() == 1) - { - BizHawkExternalToolAttribute attribute = (BizHawkExternalToolAttribute)attributes[0]; - item = new ToolStripMenuItem(attribute.Name); - item.ToolTipText = attribute.Description; - if (attribute.IconResourceName != "") - { - Stream s = externalToolFile.GetManifestResourceStream(string.Format("{0}.{1}", externalToolFile.GetName().Name, attribute.IconResourceName)); - if (s != null) - { - item.Image = new Bitmap(s); - } - } - - customFormType = externalToolFile.GetTypes().FirstOrDefault(t => t != null && t.FullName == "BizHawk.Client.EmuHawk.CustomMainForm"); - if (customFormType == null) - { - item.ToolTipText = "Does not have a CustomMainForm"; - item.Enabled = false; - } - item.Tag = fileName; - - attributes = externalToolFile.GetCustomAttributes(typeof(BizHawkExternalToolUsageAttribute), false); - if (attributes != null && attributes.Count() == 1) - { - BizHawkExternalToolUsageAttribute attribute2 = (BizHawkExternalToolUsageAttribute)attributes[0]; - if(Global.Emulator.SystemId == "NULL" && attribute2.ToolUsage != BizHawkExternalToolUsage.Global) - { - item.ToolTipText = "This tool doesn't work if nothing is loaded"; - item.Enabled = false; - } - else if(attribute2.ToolUsage == BizHawkExternalToolUsage.EmulatorSpecific && Global.Emulator.SystemId != ClientApi.SystemIdConverter.ConvertBack(attribute2.System)) - { - item.ToolTipText = "This tool doesn't work for current system"; - item.Enabled = false; - } - else if (attribute2.ToolUsage == BizHawkExternalToolUsage.GameSpecific && Global.Game.Hash != attribute2.GameHash) - { - item.ToolTipText = "This tool doesn't work for current game"; - item.Enabled = false; - } - } - } - else - { - item = new ToolStripMenuItem(externalToolFile.GetName().Name); - item.ToolTipText = "BizHawkExternalTool attribute hasn't been found"; - item.Enabled = false; - } - } - catch (BadImageFormatException) - { - item = new ToolStripMenuItem(fileName); - item.ToolTipText = "This is not an assembly"; - item.Enabled = false; - } - -#if DEBUG //I added special debug stuff to get additionnal informations. Don(t think it can be usefull for released versions - catch (ReflectionTypeLoadException ex) - { - foreach (Exception e in ex.LoaderExceptions) - { - Debug.WriteLine(e.Message); - } - item.ToolTipText = "Something goes wrong while trying to load"; - item.Enabled = false; - } -#else - catch (ReflectionTypeLoadException) - { - item.ToolTipText = "Something goes wrong while trying to load"; - item.Enabled = false; - } -#endif - - return item; - } - - /// - /// This event is raised when we add a dll file into - /// the external tools path. - /// It will automatically load the assembly and add it into the list - /// - /// Object that raised the event - /// Event arguments - private static void DirectoryMonitor_Created(object sender, FileSystemEventArgs e) - { - menuItems.Add(GenerateToolTipFromFileName(e.FullPath)); - } - - #endregion - - #region Properties - - /// - /// Gets a prebuild - /// This list auto-updated by the itself - /// - public static IEnumerable ToolStripMenu - { - get - { - return menuItems; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Classes/Joypad.cs b/BizHawk.Client.ApiHawk/Classes/Joypad.cs deleted file mode 100644 index d13273e64e..0000000000 --- a/BizHawk.Client.ApiHawk/Classes/Joypad.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using BizHawk.Client.Common; - -namespace BizHawk.Client.ApiHawk -{ - /// - /// This class holds a joypad for any type of console - /// - public sealed class Joypad - { - #region Fields - - private SystemInfo _System; - private JoypadButton _PressedButtons; - private float _AnalogX; - private float _AnalogY; - private int _Player; - - #endregion - - #region cTor(s) - - /// - /// Initialize a new instance of - /// - /// What this is used for - /// Which player this controller is assigned to - internal Joypad(SystemInfo system, int player) - { - if (player < 1 || player > system.MaxControllers) - { - throw new InvalidOperationException(string.Format("{0} is invalid for {1}", player, system.DisplayName)); - } - - _System = system; - _Player = player; - } - - #endregion - - #region Methods - - /// - /// Add specified input to current ones - /// - /// Input to add - public void AddInput(JoypadButton input) - { - input &= _System.AvailableButtons; - _PressedButtons |= input; - } - - - /// - /// Clear inputs - /// - public void ClearInputs() - { - _PressedButtons = 0; - } - - - /// - /// Remove specified input to current ones - /// - /// Input to remove - public void RemoveInput(JoypadButton input) - { - _PressedButtons ^= input; - } - - #endregion - - - #region Properties - - /// - /// Gets or sets X value for Analog stick - /// - /// The value you get will aways be rounded to 0 decimal - public float AnalogX - { - get - { - return (float)Math.Round(_AnalogX, 0); - } - set - { - _AnalogX = value; - } - } - - /// - /// Gets or sets Y value for Analog stick - /// - /// The value you get will aways be rounded to 0 decimal - public float AnalogY - { - get - { - return (float)Math.Round(_AnalogY, 0); - } - set - { - _AnalogY = value; - } - } - - /// - /// Gets or sets inputs - /// If you pass inputs unavailable for current system, they'll be removed - /// - /// It overrides all existing inputs - public JoypadButton Inputs - { - get - { - return _PressedButtons; - } - set - { - value &= _System.AvailableButtons; - _PressedButtons = value; - } - } - - /// - /// Gets for current - /// - public SystemInfo System - { - get - { - return _System; - } - } - - #endregion - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/IExternalApi.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/IExternalApi.cs deleted file mode 100644 index 8dc7c9da03..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/IExternalApi.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BizHawk.Client.ApiHawk -{ - /// - /// This interface specifies that a client exposes a given interface, such as , - /// for use by external tools. - /// - public interface IExternalApi - { - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/IInput.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/IInput.cs deleted file mode 100644 index 507bb024bf..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/IInput.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.ApiHawk -{ - public interface IInput : IExternalApi - { - Dictionary Get(); - Dictionary GetMouse(); - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/IJoypad.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/IJoypad.cs deleted file mode 100644 index 1a8ce3340a..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/IJoypad.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.ApiHawk -{ - public interface IJoypad : IExternalApi - { - Dictionary Get(int? controller = null); - - // TODO: what about float controls? - Dictionary GetImmediate(); - void SetFromMnemonicStr(string inputLogEntry); - void Set(Dictionary buttons, int? controller = null); - void Set(string button, bool? state = null, int? controller = null); - void SetAnalog(Dictionary controls, object controller = null); - void SetAnalog(string control, float? value = null, object controller = null); - - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/IMemEvents.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/IMemEvents.cs deleted file mode 100644 index b8650a9139..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/IMemEvents.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BizHawk.Client.ApiHawk -{ - public interface IMemEvents : IExternalApi - { - void AddReadCallback(Action cb, uint address, string domain); - void AddWriteCallback(Action cb, uint address, string domain); - void AddExecCallback(Action cb, uint address, string domain); - void RemoveMemoryCallback(Action cb); - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/IMovie.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/IMovie.cs deleted file mode 100644 index c983ec1df1..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/IMovie.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -namespace BizHawk.Client.ApiHawk -{ - public interface IMovie : IExternalApi - { - bool StartsFromSavestate(); - bool StartsFromSaveram(); - string Filename(); - Dictionary GetInput(int frame); - string GetInputAsMnemonic(int frame); - bool GetReadOnly(); - ulong GetRerecordCount(); - bool GetRerecordCounting(); - bool IsLoaded(); - double Length(); - string Mode(); - void Save(string filename = ""); - void SetReadOnly(bool readOnly); - void SetRerecordCount(double count); - void SetRerecordCounting(bool counting); - void Stop(); - double GetFps(); - Dictionary GetHeader(); - List GetComments(); - List GetSubtitles(); - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/ISaveState.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/ISaveState.cs deleted file mode 100644 index 8f595610fe..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/ISaveState.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BizHawk.Client.ApiHawk -{ - public interface ISaveState : IExternalApi - { - void Load(string path); - void LoadSlot(int slotNum); - void Save(string path); - void SaveSlot(int slotNum); - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/Api/ISql.cs b/BizHawk.Client.ApiHawk/Interfaces/Api/ISql.cs deleted file mode 100644 index 99407ac1c2..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/Api/ISql.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BizHawk.Client.ApiHawk -{ - public interface ISql : IExternalApi - { - string CreateDatabase(string name); - string OpenDatabase(string name); - string WriteCommand(string query = ""); - dynamic ReadCommand(string query = ""); - } -} diff --git a/BizHawk.Client.ApiHawk/Interfaces/IPlugin.cs b/BizHawk.Client.ApiHawk/Interfaces/IPlugin.cs deleted file mode 100644 index 444ecec8b2..0000000000 --- a/BizHawk.Client.ApiHawk/Interfaces/IPlugin.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BizHawk.Client.ApiHawk -{ - interface IPlugin - { - void PreFrameCallback(); - void PostFrameCallback(); - void SaveStateCallback(string name); - void LoadStateCallback(string name); - void InputPollCallback(); - void Init(IApiContainer api); - } -} diff --git a/BizHawk.Client.ApiHawk/Properties/AssemblyInfo.cs b/BizHawk.Client.ApiHawk/Properties/AssemblyInfo.cs deleted file mode 100644 index 53f24b5e3c..0000000000 --- a/BizHawk.Client.ApiHawk/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BizHawk.Client.ApiHawk")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("BizHawk.Client.ApiHawk")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8e2f11f2-3955-4382-8c3a-ceba1276caea")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd b/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd deleted file mode 100644 index 8a40328080..0000000000 --- a/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AAAAAQAAAAAAAAAAAAAQAAAAAAgBAAAAAAACAAAAAAI= - Classes\ExternalToolManager.cs - - - - - - AAAAAAAAAAAgAAAAIAAAIAQAAAAAACAEAAAAAAAAAAA= - Attributes\BizHawkExternalToolAttribute.cs - - - - - - CwEAAAAAgAMAQEAAAAAJQAoAAAEAgWAACCACAAAQAiA= - Classes\ClientApi.cs - - - - - - AIAAAAAAEIAAAQAAAAAABABAAAAAAAAAAAAAAAAAAAA= - Attributes\BizHawkExternalToolUsageAttribute.cs - - - - - - AAAAAAAAAAAAAAAAAIAAAAAAAAgAAAAAAAAAAAAAAAA= - Classes\BizHawkSystemIdToCoreSystemEnumConverter.cs - - - - - - AAAAAAAAAAAAAAAAAIAAAAAAAAgAAAAAAAAAAAAAAAA= - Classes\JoypadStringToEnumConverter.cs - - - - - - AQAACAAAAIAAAACBAAgAAABAEAAAAAAAAAACGAAAAAA= - Classes\Joypad.cs - - - - - - - - - - AAAAAAAAAAAAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAA= - Classes\Events\EventArgs\StateLoadedEventArgs.cs - - - - - - AAAAAAAAAAAAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAA= - Classes\Events\EventArgs\StateSavedEventArgs.cs - - - - - - AAAAAAAAIAAAQAAAAACAAAAAAAAAAAAAAAAAAAAAAgA= - Classes\Events\EventArgs\BeforeQuickSaveEventArgs.cs - - - - - - AAAAAAAAIAAAQAAAAACAAAAAAAAAAAAAAAAAAAAAAgA= - Classes\Events\EventArgs\BeforeQuickLoadEventArgs.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Interfaces\IExternalToolForm.cs - - - - - - - - - - - - - - - - - - - - - - - - - - AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAgAAAABAAA= - Enums\BizHawkExternalToolUsage.cs - - - - - - - - - - - - - - AAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= - Classes\Events\EventHandlers\StateLoadedEventHandler.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAgA= - Classes\Events\EventHandlers\StateSavedEventHandler.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAEA= - Classes\Events\EventHandlers\BeforeQuickSaveEventhandler.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAA= - Classes\Events\EventHandlers\BeforeQuickLoadEventhandler.cs - - - - \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/ArchiveEmulationStreamProxy.cs b/BizHawk.Client.Common/7z/ArchiveEmulationStreamProxy.cs deleted file mode 100644 index c0bdaed292..0000000000 --- a/BizHawk.Client.Common/7z/ArchiveEmulationStreamProxy.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.IO; -using System; - -namespace SevenZip -{ - /// - /// The Stream extension class to emulate the archive part of a stream. - /// - internal class ArchiveEmulationStreamProxy : Stream, IDisposable - { - /// - /// Gets the file offset. - /// - public int Offset { get; private set; } - - /// - /// The source wrapped stream. - /// - public Stream Source { get; private set; } - - /// - /// Initializes a new instance of the ArchiveEmulationStream class. - /// - /// The stream to wrap. - /// The stream offset. - public ArchiveEmulationStreamProxy(Stream stream, int offset) - { - Source = stream; - Offset = offset; - Source.Position = offset; - } - - public override bool CanRead - { - get { return Source.CanRead; } - } - - public override bool CanSeek - { - get { return Source.CanSeek; } - } - - public override bool CanWrite - { - get { return Source.CanWrite; } - } - - public override void Flush() - { - Source.Flush(); - } - - public override long Length - { - get { return Source.Length - Offset; } - } - - public override long Position - { - get - { - return Source.Position - Offset; - } - set - { - Source.Position = value; - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - return Source.Read(buffer, offset, count); - } - - public override long Seek(long offset, SeekOrigin origin) - { - return Source.Seek(origin == SeekOrigin.Begin ? offset + Offset : offset, - origin) - Offset; - } - - public override void SetLength(long value) - { - Source.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - Source.Write(buffer, offset, count); - } - - public new void Dispose() - { - Source.Dispose(); - } - - public override void Close() - { - Source.Close(); - } - } -} diff --git a/BizHawk.Client.Common/7z/ArchiveExtractCallback.cs b/BizHawk.Client.Common/7z/ArchiveExtractCallback.cs deleted file mode 100644 index d9aedc0f7a..0000000000 --- a/BizHawk.Client.Common/7z/ArchiveExtractCallback.cs +++ /dev/null @@ -1,602 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -#if MONO -using SevenZip.Mono.COM; -using System.Runtime.InteropServices; -#endif - -namespace SevenZip -{ -#if UNMANAGED - /// - /// Archive extraction callback to handle the process of unpacking files - /// - internal sealed class ArchiveExtractCallback : CallbackBase, IArchiveExtractCallback, ICryptoGetTextPassword, - IDisposable - { - private List _actualIndexes; - private IInArchive _archive; - - /// - /// For Compressing event. - /// - private long _bytesCount; - - private long _bytesWritten; - private long _bytesWrittenOld; - private string _directory; - - /// - /// Rate of the done work from [0, 1]. - /// - private float _doneRate; - - private SevenZipExtractor _extractor; - private FakeOutStreamWrapper _fakeStream; - private uint? _fileIndex; - private int _filesCount; - private OutStreamWrapper _fileStream; - private bool _directoryStructure; - private int _currentIndex; -#if !WINCE - const int MEMORY_PRESSURE = 64 * 1024 * 1024; //64mb seems to be the maximum value -#endif - #region Constructors - - /// - /// Initializes a new instance of the ArchiveExtractCallback class - /// - /// IInArchive interface for the archive - /// Directory where files are to be unpacked to - /// The archive files count' - /// The owner of the callback - /// The list of actual indexes (solid archives support) - /// The value indicating whether to preserve directory structure of extracted files. - public ArchiveExtractCallback(IInArchive archive, string directory, int filesCount, bool directoryStructure, - List actualIndexes, SevenZipExtractor extractor) - { - Init(archive, directory, filesCount, directoryStructure, actualIndexes, extractor); - } - - /// - /// Initializes a new instance of the ArchiveExtractCallback class - /// - /// IInArchive interface for the archive - /// Directory where files are to be unpacked to - /// The archive files count - /// Password for the archive - /// The owner of the callback - /// The list of actual indexes (solid archives support) - /// The value indicating whether to preserve directory structure of extracted files. - public ArchiveExtractCallback(IInArchive archive, string directory, int filesCount, bool directoryStructure, - List actualIndexes, string password, SevenZipExtractor extractor) - : base(password) - { - Init(archive, directory, filesCount, directoryStructure, actualIndexes, extractor); - } - - /// - /// Initializes a new instance of the ArchiveExtractCallback class - /// - /// IInArchive interface for the archive - /// The stream where files are to be unpacked to - /// The archive files count - /// The file index for the stream - /// The owner of the callback - public ArchiveExtractCallback(IInArchive archive, Stream stream, int filesCount, uint fileIndex, - SevenZipExtractor extractor) - { - Init(archive, stream, filesCount, fileIndex, extractor); - } - - /// - /// Initializes a new instance of the ArchiveExtractCallback class - /// - /// IInArchive interface for the archive - /// The stream where files are to be unpacked to - /// The archive files count - /// The file index for the stream - /// Password for the archive - /// The owner of the callback - public ArchiveExtractCallback(IInArchive archive, Stream stream, int filesCount, uint fileIndex, string password, - SevenZipExtractor extractor) - : base(password) - { - Init(archive, stream, filesCount, fileIndex, extractor); - } - - private void Init(IInArchive archive, string directory, int filesCount, bool directoryStructure, - List actualIndexes, SevenZipExtractor extractor) - { - CommonInit(archive, filesCount, extractor); - _directory = directory; - _actualIndexes = actualIndexes; - _directoryStructure = directoryStructure; - if (!directory.EndsWith("" + Path.DirectorySeparatorChar, StringComparison.CurrentCulture)) - { - _directory += Path.DirectorySeparatorChar; - } - } - - private void Init(IInArchive archive, Stream stream, int filesCount, uint fileIndex, SevenZipExtractor extractor) - { - CommonInit(archive, filesCount, extractor); - _fileStream = new OutStreamWrapper(stream, false); - _fileStream.BytesWritten += IntEventArgsHandler; - _fileIndex = fileIndex; - } - - private void CommonInit(IInArchive archive, int filesCount, SevenZipExtractor extractor) - { - _archive = archive; - _filesCount = filesCount; - _fakeStream = new FakeOutStreamWrapper(); - _fakeStream.BytesWritten += IntEventArgsHandler; - _extractor = extractor; -#if !WINCE - GC.AddMemoryPressure(MEMORY_PRESSURE); -#endif - } - #endregion - - #region Events - - /// - /// Occurs when a new file is going to be unpacked - /// - /// Occurs when 7-zip engine requests for an output stream for a new file to unpack in - public event EventHandler FileExtractionStarted; - - /// - /// Occurs when a file has been successfully unpacked - /// - public event EventHandler FileExtractionFinished; - - /// - /// Occurs when the archive is opened and 7-zip sends the size of unpacked data - /// - public event EventHandler Open; - - /// - /// Occurs when the extraction is performed - /// - public event EventHandler Extracting; - - /// - /// Occurs during the extraction when a file already exists - /// - public event EventHandler FileExists; - - private void OnFileExists(FileOverwriteEventArgs e) - { - if (FileExists != null) - { - FileExists(this, e); - } - } - - private void OnOpen(OpenEventArgs e) - { - if (Open != null) - { - Open(this, e); - } - } - - private void OnFileExtractionStarted(FileInfoEventArgs e) - { - if (FileExtractionStarted != null) - { - FileExtractionStarted(this, e); - } - } - - private void OnFileExtractionFinished(FileInfoEventArgs e) - { - if (FileExtractionFinished != null) - { - FileExtractionFinished(this, e); - } - } - - private void OnExtracting(ProgressEventArgs e) - { - if (Extracting != null) - { - Extracting(this, e); - } - } - - private void IntEventArgsHandler(object sender, IntEventArgs e) - { - var pold = (int)((_bytesWrittenOld * 100) / _bytesCount); - _bytesWritten += e.Value; - var pnow = (int)((_bytesWritten * 100) / _bytesCount); - if (pnow > pold) - { - if (pnow > 100) - { - pold = pnow = 0; - } - _bytesWrittenOld = _bytesWritten; - OnExtracting(new ProgressEventArgs((byte)pnow, (byte)(pnow - pold))); - } - } - - #endregion - - #region IArchiveExtractCallback Members - - /// - /// Gives the size of the unpacked archive files - /// - /// Size of the unpacked archive files (in bytes) - public void SetTotal(ulong total) - { - _bytesCount = (long)total; - OnOpen(new OpenEventArgs(total)); - } - - public void SetCompleted(ref ulong completeValue) { } - - /// - /// Sets output stream for writing unpacked data - /// - /// Current file index - /// Output stream pointer - /// Extraction mode - /// 0 if OK - public int GetStream(uint index, out -#if !MONO - ISequentialOutStream -#else - HandleRef -#endif - outStream, AskMode askExtractMode) - { -#if !MONO - outStream = null; -#else - outStream = new System.Runtime.InteropServices.HandleRef(null, IntPtr.Zero); -#endif - if (Canceled) - { - return -1; - } - _currentIndex = (int)index; - if (askExtractMode == AskMode.Extract) - { - var fileName = _directory; - if (!_fileIndex.HasValue) - { - #region Extraction to a file - - if (_actualIndexes == null || _actualIndexes.Contains(index)) - { - var data = new PropVariant(); - _archive.GetProperty(index, ItemPropId.Path, ref data); - string entryName = NativeMethods.SafeCast(data, ""); - - #region Get entryName - - if (String.IsNullOrEmpty(entryName)) - { - if (_filesCount == 1) - { - var archName = Path.GetFileName(_extractor.FileName); - archName = archName.Substring(0, archName.LastIndexOf('.')); - if (!archName.EndsWith(".tar", StringComparison.OrdinalIgnoreCase)) - { - archName += ".tar"; - } - entryName = archName; - } - else - { - entryName = "[no name] " + index.ToString(CultureInfo.InvariantCulture); - } - } - - #endregion - - fileName = Path.Combine(_directory, _directoryStructure? entryName : Path.GetFileName(entryName)); - _archive.GetProperty(index, ItemPropId.IsDirectory, ref data); - try - { - fileName = ValidateFileName(fileName); - } - catch (Exception e) - { - AddException(e); - goto FileExtractionStartedLabel; - } - if (!NativeMethods.SafeCast(data, false)) - { - #region Branch - - _archive.GetProperty(index, ItemPropId.LastWriteTime, ref data); - var time = NativeMethods.SafeCast(data, DateTime.MinValue); - if (File.Exists(fileName)) - { - var fnea = new FileOverwriteEventArgs(fileName); - OnFileExists(fnea); - if (fnea.Cancel) - { - Canceled = true; - return -1; - } - if (String.IsNullOrEmpty(fnea.FileName)) - { -#if !MONO - outStream = _fakeStream; -#else - outStream = _fakeStream.Handle; -#endif - goto FileExtractionStartedLabel; - } - fileName = fnea.FileName; - } - try - { - _fileStream = new OutStreamWrapper(File.Create(fileName), fileName, time, true); - } - catch (Exception e) - { - if (e is FileNotFoundException) - { - AddException( - new IOException("The file \"" + fileName + - "\" was not extracted due to the File.Create fail.")); - } - else - { - AddException(e); - } - outStream = _fakeStream; - goto FileExtractionStartedLabel; - } - _fileStream.BytesWritten += IntEventArgsHandler; - outStream = _fileStream; - - #endregion - } - else - { - #region Branch - - if (!Directory.Exists(fileName)) - { - try - { - Directory.CreateDirectory(fileName); - } - catch (Exception e) - { - AddException(e); - } - outStream = _fakeStream; - } - - #endregion - } - } - else - { - outStream = _fakeStream; - } - - #endregion - } - else - { - #region Extraction to a stream - - if (index == _fileIndex) - { - outStream = _fileStream; - _fileIndex = null; - } - else - { - outStream = _fakeStream; - } - - #endregion - } - - FileExtractionStartedLabel: - _doneRate += 1.0f / _filesCount; - var iea = new FileInfoEventArgs( - _extractor.ArchiveFileData[(int)index], PercentDoneEventArgs.ProducePercentDone(_doneRate)); - OnFileExtractionStarted(iea); - if (iea.Cancel) - { - if (!String.IsNullOrEmpty(fileName)) - { - _fileStream.Dispose(); - if (File.Exists(fileName)) - { - try - { - File.Delete(fileName); - } - catch (Exception e) - { - AddException(e); - } - } - } - Canceled = true; - return -1; - } - } - return 0; - } - - public void PrepareOperation(AskMode askExtractMode) { } - - /// - /// Called when the archive was extracted - /// - /// - public void SetOperationResult(OperationResult operationResult) - { - if (operationResult != OperationResult.Ok && ReportErrors) - { - switch (operationResult) - { - case OperationResult.CrcError: - AddException(new ExtractionFailedException("File is corrupted. Crc check has failed.")); - break; - case OperationResult.DataError: - AddException(new ExtractionFailedException("File is corrupted. Data error has occured.")); - break; - case OperationResult.UnsupportedMethod: - AddException(new ExtractionFailedException("Unsupported method error has occured.")); - break; - } - } - else - { - if (_fileStream != null && !_fileIndex.HasValue) - { - try - { - _fileStream.BytesWritten -= IntEventArgsHandler; - _fileStream.Dispose(); - } - catch (ObjectDisposedException) { } - _fileStream = null; - GC.Collect(); - GC.WaitForPendingFinalizers(); - } - var iea = new FileInfoEventArgs( - _extractor.ArchiveFileData[_currentIndex], PercentDoneEventArgs.ProducePercentDone(_doneRate)); - OnFileExtractionFinished(iea); - if (iea.Cancel) - { - Canceled = true; - } - } - } - - #endregion - - #region ICryptoGetTextPassword Members - - /// - /// Sets password for the archive - /// - /// Password for the archive - /// Zero if everything is OK - public int CryptoGetTextPassword(out string password) - { - password = Password; - return 0; - } - - #endregion - - #region IDisposable Members - - public void Dispose() - { -#if !WINCE - GC.RemoveMemoryPressure(MEMORY_PRESSURE); -#endif - if (_fileStream != null) - { - try - { - _fileStream.Dispose(); - } - catch (ObjectDisposedException) { } - _fileStream = null; - } - if (_fakeStream != null) - { - try - { - _fakeStream.Dispose(); - } - catch (ObjectDisposedException) { } - _fakeStream = null; - } - } - - #endregion - - /// - /// Validates the file name and ensures that the directory to the file name is valid and creates intermediate directories if necessary - /// - /// File name - /// The valid file name - private static string ValidateFileName(string fileName) - { - if (String.IsNullOrEmpty(fileName)) - { - throw new SevenZipArchiveException("some archive name is null or empty."); - } - var splittedFileName = new List(fileName.Split(Path.DirectorySeparatorChar)); -#if !WINCE - foreach (char chr in Path.GetInvalidFileNameChars()) - { - for (int i = 0; i < splittedFileName.Count; i++) - { - if (chr == ':' && i == 0) - { - continue; - } - if (String.IsNullOrEmpty(splittedFileName[i])) - { - continue; - } - while (splittedFileName[i].IndexOf(chr) > -1) - { - splittedFileName[i] = splittedFileName[i].Replace(chr, '_'); - } - } - } -#endif - if (fileName.StartsWith(new string(Path.DirectorySeparatorChar, 2), - StringComparison.CurrentCultureIgnoreCase)) - { - splittedFileName.RemoveAt(0); - splittedFileName.RemoveAt(0); - splittedFileName[0] = new string(Path.DirectorySeparatorChar, 2) + splittedFileName[0]; - } - if (splittedFileName.Count > 2) - { - string tfn = splittedFileName[0]; - for (int i = 1; i < splittedFileName.Count - 1; i++) - { - tfn += Path.DirectorySeparatorChar + splittedFileName[i]; - if (!Directory.Exists(tfn)) - { - Directory.CreateDirectory(tfn); - } - } - } - return String.Join(new string(Path.DirectorySeparatorChar, 1), splittedFileName.ToArray()); - } - } -#endif -} diff --git a/BizHawk.Client.Common/7z/ArchiveOpenCallback.cs b/BizHawk.Client.Common/7z/ArchiveOpenCallback.cs deleted file mode 100644 index 080ce8c6da..0000000000 --- a/BizHawk.Client.Common/7z/ArchiveOpenCallback.cs +++ /dev/null @@ -1,217 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -#if MONO -using SevenZip.Mono; -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ - #if UNMANAGED - /// - /// Callback to handle the archive opening - /// - internal sealed class ArchiveOpenCallback : CallbackBase, IArchiveOpenCallback, IArchiveOpenVolumeCallback, - ICryptoGetTextPassword, IDisposable - { - private FileInfo _fileInfo; - private Dictionary _wrappers = - new Dictionary(); - private readonly List _volumeFileNames = new List(); - - /// - /// Gets the list of volume file names. - /// - public IList VolumeFileNames - { - get - { - return _volumeFileNames; - } - } - - /// - /// Performs the common initialization. - /// - /// Volume file name. - private void Init(string fileName) - { - if (!String.IsNullOrEmpty(fileName)) - { - _fileInfo = new FileInfo(fileName); - _volumeFileNames.Add(fileName); - if (fileName.EndsWith("001")) - { - int index = 2; - var baseName = fileName.Substring(0, fileName.Length - 3); - var volName = baseName + (index > 99 ? index.ToString() : - index > 9 ? "0" + index : "00" + index); - while (File.Exists(volName)) - { - _volumeFileNames.Add(volName); - index++; - volName = baseName + (index > 99 ? index.ToString() : - index > 9 ? "0" + index : "00" + index); - } - } - } - } - - /// - /// Initializes a new instance of the ArchiveOpenCallback class. - /// - /// The archive file name. - public ArchiveOpenCallback(string fileName) - { - Init(fileName); - } - - /// - /// Initializes a new instance of the ArchiveOpenCallback class. - /// - /// The archive file name. - /// Password for the archive. - public ArchiveOpenCallback(string fileName, string password) : base(password) - { - Init(fileName); - } - - #region IArchiveOpenCallback Members - - public void SetTotal(IntPtr files, IntPtr bytes) {} - - public void SetCompleted(IntPtr files, IntPtr bytes) {} - - #endregion - - #region IArchiveOpenVolumeCallback Members - - public int GetProperty(ItemPropId propId, ref PropVariant value) - { - switch (propId) - { - case ItemPropId.Name: - value.VarType = VarEnum.VT_BSTR; - value.Value = Marshal.StringToBSTR(_fileInfo.FullName); - break; - case ItemPropId.IsDirectory: - value.VarType = VarEnum.VT_BOOL; - value.UInt64Value = (byte) (_fileInfo.Attributes & FileAttributes.Directory); - break; - case ItemPropId.Size: - value.VarType = VarEnum.VT_UI8; - value.UInt64Value = (UInt64) _fileInfo.Length; - break; - case ItemPropId.Attributes: - value.VarType = VarEnum.VT_UI4; - value.UInt32Value = (uint) _fileInfo.Attributes; - break; - case ItemPropId.CreationTime: - value.VarType = VarEnum.VT_FILETIME; - value.Int64Value = _fileInfo.CreationTime.ToFileTime(); - break; - case ItemPropId.LastAccessTime: - value.VarType = VarEnum.VT_FILETIME; - value.Int64Value = _fileInfo.LastAccessTime.ToFileTime(); - break; - case ItemPropId.LastWriteTime: - value.VarType = VarEnum.VT_FILETIME; - value.Int64Value = _fileInfo.LastWriteTime.ToFileTime(); - break; - } - return 0; - } - - public int GetStream(string name, out IInStream inStream) - { - if (!File.Exists(name)) - { - name = Path.Combine(Path.GetDirectoryName(_fileInfo.FullName), name); - if (!File.Exists(name)) - { - inStream = null; - AddException(new FileNotFoundException("The volume \"" + name + "\" was not found. Extraction can be impossible.")); - return 1; - } - } - _volumeFileNames.Add(name); - if (_wrappers.ContainsKey(name)) - { - inStream = _wrappers[name]; - } - else - { - try - { - var wrapper = new InStreamWrapper( - new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true); - _wrappers.Add(name, wrapper); - inStream = wrapper; - } - catch (Exception) - { - AddException(new FileNotFoundException("Failed to open the volume \"" + name + "\". Extraction is impossible.")); - inStream = null; - return 1; - } - } - return 0; - } - - #endregion - - #region ICryptoGetTextPassword Members - - /// - /// Sets password for the archive - /// - /// Password for the archive - /// Zero if everything is OK - public int CryptoGetTextPassword(out string password) - { - password = Password; - return 0; - } - - #endregion - - #region IDisposable Members - - public void Dispose() - { - if (_wrappers != null) - { - foreach (InStreamWrapper wrap in _wrappers.Values) - { - wrap.Dispose(); - } - _wrappers = null; - } -#if MONO - libp7zInvokerRaw.FreeObject(Handle); -#endif - GC.SuppressFinalize(this); - } - - #endregion - } -#endif -} diff --git a/BizHawk.Client.Common/7z/ArchiveUpdateCallback.cs b/BizHawk.Client.Common/7z/ArchiveUpdateCallback.cs deleted file mode 100644 index 221503d7c2..0000000000 --- a/BizHawk.Client.Common/7z/ArchiveUpdateCallback.cs +++ /dev/null @@ -1,817 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; - -#pragma warning disable - -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if UNMANAGED -#if COMPRESS - /// - /// Archive update callback to handle the process of packing files - /// - internal sealed class ArchiveUpdateCallback : CallbackBase, IArchiveUpdateCallback, ICryptoGetTextPassword2, - IDisposable - { - #region Fields - /// - /// _files.Count if do not count directories - /// - private int _actualFilesCount; - - /// - /// For Compressing event. - /// - private long _bytesCount; - - private long _bytesWritten; - private long _bytesWrittenOld; - private SevenZipCompressor _compressor; - - /// - /// No directories. - /// - private bool _directoryStructure; - - /// - /// Rate of the done work from [0, 1] - /// - private float _doneRate; - - /// - /// The names of the archive entries - /// - private string[] _entries; - - /// - /// Array of files to pack - /// - private FileInfo[] _files; - - private InStreamWrapper _fileStream; - - private uint _indexInArchive; - private uint _indexOffset; - - /// - /// Common root of file names length. - /// - private int _rootLength; - - /// - /// Input streams to be compressed. - /// - private Stream[] _streams; - - private UpdateData _updateData; - private List _wrappersToDispose; - - /// - /// Gets or sets the default item name used in MemoryStream compression. - /// - public string DefaultItemName { private get; set; } - - /// - /// Gets or sets the value indicating whether to compress as fast as possible, without calling events. - /// - public bool FastCompression { private get; set; } -#if !WINCE - private int _memoryPressure; -#endif - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// Array of files to pack - /// Common file names root length - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - FileInfo[] files, int rootLength, - SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - Init(files, rootLength, compressor, updateData, directoryStructure); - } - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// Array of files to pack - /// Common file names root length - /// The archive password - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - FileInfo[] files, int rootLength, string password, - SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - : base(password) - { - Init(files, rootLength, compressor, updateData, directoryStructure); - } - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// The input stream - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - Stream stream, SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - Init(stream, compressor, updateData, directoryStructure); - } - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// The input stream - /// The archive password - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - Stream stream, string password, SevenZipCompressor compressor, UpdateData updateData, - bool directoryStructure) - : base(password) - { - Init(stream, compressor, updateData, directoryStructure); - } - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// Dictionary<file stream, name of the archive entry> - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - Dictionary streamDict, - SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - Init(streamDict, compressor, updateData, directoryStructure); - } - - /// - /// Initializes a new instance of the ArchiveUpdateCallback class - /// - /// Dictionary<file stream, name of the archive entry> - /// The archive password - /// The owner of the callback - /// The compression parameters. - /// Preserve directory structure. - public ArchiveUpdateCallback( - Dictionary streamDict, string password, - SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - : base(password) - { - Init(streamDict, compressor, updateData, directoryStructure); - } - - private void CommonInit(SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - _compressor = compressor; - _indexInArchive = updateData.FilesCount; - _indexOffset = updateData.Mode != InternalCompressionMode.Append ? 0 : _indexInArchive; - if (_compressor.ArchiveFormat == OutArchiveFormat.Zip) - { - _wrappersToDispose = new List(); - } - _updateData = updateData; - _directoryStructure = directoryStructure; - DefaultItemName = "default"; - } - - private void Init( - FileInfo[] files, int rootLength, SevenZipCompressor compressor, - UpdateData updateData, bool directoryStructure) - { - _files = files; - _rootLength = rootLength; - if (files != null) - { - foreach (var fi in files) - { - if (fi.Exists) - { - _bytesCount += fi.Length; - if ((fi.Attributes & FileAttributes.Directory) == 0) - { - _actualFilesCount++; - } - } - } - } - CommonInit(compressor, updateData, directoryStructure); - } - - private void Init( - Stream stream, SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - _fileStream = new InStreamWrapper(stream, false); - _fileStream.BytesRead += IntEventArgsHandler; - _actualFilesCount = 1; - try - { - _bytesCount = stream.Length; - } - catch (NotSupportedException) - { - _bytesCount = -1; - } - try - { - stream.Seek(0, SeekOrigin.Begin); - } - catch (NotSupportedException) - { - _bytesCount = -1; - } - CommonInit(compressor, updateData, directoryStructure); - } - - private void Init( - Dictionary streamDict, - SevenZipCompressor compressor, UpdateData updateData, bool directoryStructure) - { - _streams = new Stream[streamDict.Count]; - streamDict.Values.CopyTo(_streams, 0); - _entries = new string[streamDict.Count]; - streamDict.Keys.CopyTo(_entries, 0); - _actualFilesCount = streamDict.Count; - //zero 11-oct-2014 - we want sequential streams only. length is unknown. - //foreach (Stream str in _streams) - //{ - // if (str != null) - // { - // _bytesCount += str.Length; - // } - //} - CommonInit(compressor, updateData, directoryStructure); - } - - #endregion - - /// - /// Gets or sets the dictionary size. - /// - public float DictionarySize - { - set - { -#if !WINCE - _memoryPressure = (int)(value * 1024 * 1024); - GC.AddMemoryPressure(_memoryPressure); -#endif - } - } - - /// - /// Raises events for the GetStream method. - /// - /// The current item index. - /// True if not cancelled; otherwise, false. - private bool EventsForGetStream(uint index) - { - if (!FastCompression) - { - if (_fileStream != null) - { - _fileStream.BytesRead += IntEventArgsHandler; - } - _doneRate += 1.0f / _actualFilesCount; - var fiea = new FileNameEventArgs(_files != null? _files[index].Name : _entries[index], - PercentDoneEventArgs.ProducePercentDone(_doneRate)); - OnFileCompression(fiea); - if (fiea.Cancel) - { - Canceled = true; - return false; - } - } - return true; - } - - #region Events - - /// - /// Occurs when the next file is going to be packed. - /// - /// Occurs when 7-zip engine requests for an input stream for the next file to pack it - public event EventHandler FileCompressionStarted; - - /// - /// Occurs when data are being compressed. - /// - public event EventHandler Compressing; - - /// - /// Occurs when the current file was compressed. - /// - public event EventHandler FileCompressionFinished; - - private void OnFileCompression(FileNameEventArgs e) - { - if (FileCompressionStarted != null) - { - FileCompressionStarted(this, e); - } - } - - private void OnCompressing(ProgressEventArgs e) - { - if (Compressing != null) - { - Compressing(this, e); - } - } - - private void OnFileCompressionFinished(EventArgs e) - { - if (FileCompressionFinished != null) - { - FileCompressionFinished(this, e); - } - } - - #endregion - - #region IArchiveUpdateCallback Members - - public void SetTotal(ulong total) {} - - public void SetCompleted(ref ulong completeValue) {} - - public int GetUpdateItemInfo(uint index, ref int newData, ref int newProperties, ref uint indexInArchive) - { - switch (_updateData.Mode) - { - case InternalCompressionMode.Create: - newData = 1; - newProperties = 1; - indexInArchive = UInt32.MaxValue; - break; - case InternalCompressionMode.Append: - if (index < _indexInArchive) - { - newData = 0; - newProperties = 0; - indexInArchive = index; - } - else - { - newData = 1; - newProperties = 1; - indexInArchive = UInt32.MaxValue; - } - break; - case InternalCompressionMode.Modify: - newData = 0; - newProperties = Convert.ToInt32(_updateData.FileNamesToModify.ContainsKey((int)index) - && _updateData.FileNamesToModify[(int)index] != null); - if (_updateData.FileNamesToModify.ContainsKey((int)index) - && _updateData.FileNamesToModify[(int)index] == null) - { - indexInArchive = (UInt32)_updateData.ArchiveFileData.Count; - foreach (KeyValuePair pairModification in _updateData.FileNamesToModify) - if ((pairModification.Key <= index) && (pairModification.Value == null)) - { - do - { - indexInArchive--; - } - while ((indexInArchive > 0) && _updateData.FileNamesToModify.ContainsKey((Int32)indexInArchive) - && (_updateData.FileNamesToModify[(Int32)indexInArchive] == null)); - } - } - else - { - indexInArchive = index; - } - break; - } - return 0; - } - - public int GetProperty(uint index, ItemPropId propID, ref PropVariant value) - { - index -= _indexOffset; - try - { - switch (propID) - { - case ItemPropId.IsAnti: - value.VarType = VarEnum.VT_BOOL; - value.UInt64Value = 0; - break; - case ItemPropId.Path: - #region Path - - value.VarType = VarEnum.VT_BSTR; - string val = DefaultItemName; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - if (_files == null) - { - if (_entries != null) - { - val = _entries[index]; - } - } - else - { - if (_directoryStructure) - { - if (_rootLength > 0) - { - val = _files[index].FullName.Substring(_rootLength); - } - else - { - val = _files[index].FullName[0] + _files[index].FullName.Substring(2); - } - } - else - { - val = _files[index].Name; - } - } - } - else - { - val = _updateData.FileNamesToModify[(int) index]; - } - value.Value = Marshal.StringToBSTR(val); - #endregion - break; - case ItemPropId.IsDirectory: - value.VarType = VarEnum.VT_BOOL; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - if (_files == null) - { - if (_streams == null) - { - value.UInt64Value = 0; - } - else - { - value.UInt64Value = (ulong)(_streams[index] == null ? 1 : 0); - } - } - else - { - value.UInt64Value = (byte)(_files[index].Attributes & FileAttributes.Directory); - } - } - else - { - value.UInt64Value = Convert.ToUInt64(_updateData.ArchiveFileData[(int) index].IsDirectory); - } - break; - case ItemPropId.Size: - #region Size - - //zero 11-oct-2014 - this doesnt matter, we think it's only used for updating the progress indicator - value.VarType = VarEnum.VT_UI8; - //value.UInt64Value = unchecked((ulong)-1); - break; - - value.VarType = VarEnum.VT_UI8; - UInt64 size; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - if (_files == null) - { - if (_streams == null) - { - size = _bytesCount > 0 ? (ulong) _bytesCount : 0; - } - else - { - size = (ulong) (_streams[index] == null? 0 : _streams[index].Length); - } - } - else - { - size = (_files[index].Attributes & FileAttributes.Directory) == 0 - ? (ulong) _files[index].Length - : 0; - } - } - else - { - size = _updateData.ArchiveFileData[(int) index].Size; - } - value.UInt64Value = size; - - #endregion - break; - case ItemPropId.Attributes: - value.VarType = VarEnum.VT_UI4; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - if (_files == null) - { - if (_streams == null) - { - value.UInt32Value = (uint)FileAttributes.Normal; - } - else - { - value.UInt32Value = (uint)(_streams[index] == null ? FileAttributes.Directory : FileAttributes.Normal); - } - } - else - { - value.UInt32Value = (uint) _files[index].Attributes; - } - } - else - { - value.UInt32Value = _updateData.ArchiveFileData[(int) index].Attributes; - } - break; - #region Times - case ItemPropId.CreationTime: - value.VarType = VarEnum.VT_FILETIME; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - value.Int64Value = _files == null - ? DateTime.Now.ToFileTime() - : _files[index].CreationTime.ToFileTime(); - } - else - { - value.Int64Value = _updateData.ArchiveFileData[(int) index].CreationTime.ToFileTime(); - } - break; - case ItemPropId.LastAccessTime: - value.VarType = VarEnum.VT_FILETIME; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - value.Int64Value = _files == null - ? DateTime.Now.ToFileTime() - : _files[index].LastAccessTime.ToFileTime(); - } - else - { - value.Int64Value = _updateData.ArchiveFileData[(int) index].LastAccessTime.ToFileTime(); - } - break; - case ItemPropId.LastWriteTime: - value.VarType = VarEnum.VT_FILETIME; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - value.Int64Value = _files == null - ? DateTime.Now.ToFileTime() - : _files[index].LastWriteTime.ToFileTime(); - } - else - { - value.Int64Value = _updateData.ArchiveFileData[(int) index].LastWriteTime.ToFileTime(); - } - break; - #endregion - case ItemPropId.Extension: - #region Extension - - value.VarType = VarEnum.VT_BSTR; - if (_updateData.Mode != InternalCompressionMode.Modify) - { - try - { - val = _files != null - ? _files[index].Extension.Substring(1) - : _entries == null - ? "" - : Path.GetExtension(_entries[index]); - value.Value = Marshal.StringToBSTR(val); - } - catch (ArgumentException) - { - value.Value = Marshal.StringToBSTR(""); - } - } - else - { - val = Path.GetExtension(_updateData.ArchiveFileData[(int) index].FileName); - value.Value = Marshal.StringToBSTR(val); - } - - #endregion - break; - } - } - catch (Exception e) - { - AddException(e); - } - return 0; - } - - /// - /// Gets the stream for 7-zip library. - /// - /// File index - /// Input file stream - /// Zero if Ok - public int GetStream(uint index, out -#if !MONO - ISequentialInStream -#else - HandleRef -#endif - inStream) - { - index -= _indexOffset; - if (_files != null) - { - _fileStream = null; - try - { - if (File.Exists(_files[index].FullName)) - { - _fileStream = new InStreamWrapper( - new FileStream(_files[index].FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), - true); - } - } - catch (Exception e) - { - AddException(e); - inStream = null; - return -1; - } - inStream = _fileStream; - if (!EventsForGetStream(index)) - { - return -1; - } - } - else - { - if (_streams == null) - { - inStream = _fileStream; - } - else - { - _fileStream = new InStreamWrapper(_streams[index], true); - inStream = _fileStream; - if (!EventsForGetStream(index)) - { - return -1; - } - } - } - return 0; - } - - public long EnumProperties(IntPtr enumerator) - { - //Not implemented HRESULT - return 0x80004001L; - } - - public void SetOperationResult(OperationResult operationResult) - { - if (operationResult != OperationResult.Ok && ReportErrors) - { - switch (operationResult) - { - case OperationResult.CrcError: - AddException(new ExtractionFailedException("File is corrupted. Crc check has failed.")); - break; - case OperationResult.DataError: - AddException(new ExtractionFailedException("File is corrupted. Data error has occured.")); - break; - case OperationResult.UnsupportedMethod: - AddException(new ExtractionFailedException("Unsupported method error has occured.")); - break; - } - } - if (_fileStream != null) - { - - _fileStream.BytesRead -= IntEventArgsHandler; - //Specific Zip implementation - can not Dispose files for Zip. - if (_compressor.ArchiveFormat != OutArchiveFormat.Zip) - { - try - { - _fileStream.Dispose(); - } - catch (ObjectDisposedException) {} - } - else - { - _wrappersToDispose.Add(_fileStream); - } - _fileStream = null; - GC.Collect(); - // Issue #6987 - //GC.WaitForPendingFinalizers(); - } - OnFileCompressionFinished(EventArgs.Empty); - } - - #endregion - - #region ICryptoGetTextPassword2 Members - - public int CryptoGetTextPassword2(ref int passwordIsDefined, out string password) - { - passwordIsDefined = String.IsNullOrEmpty(Password) ? 0 : 1; - password = Password; - return 0; - } - - #endregion - - #region IDisposable Members - - public void Dispose() - { -#if !WINCE - GC.RemoveMemoryPressure(_memoryPressure); -#endif - if (_fileStream != null) - { - try - { - _fileStream.Dispose(); - } - catch (ObjectDisposedException) {} - } - if (_wrappersToDispose != null) - { - foreach (var wrapper in _wrappersToDispose) - { - try - { - wrapper.Dispose(); - } - catch (ObjectDisposedException) {} - } - } - GC.SuppressFinalize(this); - } - - #endregion - - private void IntEventArgsHandler(object sender, IntEventArgs e) - { - //zero 11-oct-2014 - first of all, its possible for _files to be null (if we're compressing streams) - //second of all, if we're compressing streams, we cant possibly have _bytesCount anyway. so.. goodbye - //lock (_files) - //{ - // var pold = (byte) ((_bytesWrittenOld*100)/_bytesCount); - // _bytesWritten += e.Value; - // byte pnow; - // if (_bytesCount < _bytesWritten) //Holy shit, this check for ZIP is golden - // { - // pnow = 100; - // } - // else - // { - // pnow = (byte)((_bytesWritten * 100) / _bytesCount); - // } - // if (pnow > pold) - // { - // _bytesWrittenOld = _bytesWritten; - // OnCompressing(new ProgressEventArgs(pnow, (byte) (pnow - pold))); - // } - //} - } - } -#endif -#endif -} diff --git a/BizHawk.Client.Common/7z/COM.cs b/BizHawk.Client.Common/7z/COM.cs deleted file mode 100644 index 31d2a4d863..0000000000 --- a/BizHawk.Client.Common/7z/COM.cs +++ /dev/null @@ -1,1244 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General public License for more details. - - You should have received a copy of the GNU Lesser General public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Security.Permissions; -#if !WINCE -using FILETIME=System.Runtime.InteropServices.ComTypes.FILETIME; -#elif WINCE -using FILETIME=OpenNETCF.Runtime.InteropServices.ComTypes.FILETIME; -#endif - -namespace SevenZip -{ - #if UNMANAGED - - /// - /// The structure to fix x64 and x32 variant size mismatch. - /// - [StructLayout(LayoutKind.Sequential)] - internal struct PropArray - { - uint _cElems; - IntPtr _pElems; - } - - /// - /// COM VARIANT structure with special interface routines. - /// - [StructLayout(LayoutKind.Explicit)] - internal struct PropVariant - { - [FieldOffset(0)] private ushort _vt; - - /// - /// IntPtr variant value. - /// - [FieldOffset(8)] private IntPtr _value; - - /*/// - /// Byte variant value. - /// - [FieldOffset(8)] - private byte _ByteValue;*/ - - /// - /// Signed int variant value. - /// - [FieldOffset(8)] - private Int32 _int32Value; - - /// - /// Unsigned int variant value. - /// - [FieldOffset(8)] private UInt32 _uInt32Value; - - /// - /// Long variant value. - /// - [FieldOffset(8)] private Int64 _int64Value; - - /// - /// Unsigned long variant value. - /// - [FieldOffset(8)] private UInt64 _uInt64Value; - - /// - /// FILETIME variant value. - /// - [FieldOffset(8)] private FILETIME _fileTime; - - /// - /// The PropArray instance to fix the variant size on x64 bit systems. - /// - [FieldOffset(8)] - private PropArray _propArray; - - /// - /// Gets or sets variant type. - /// - public VarEnum VarType - { - private get - { - return (VarEnum) _vt; - } - - set - { - _vt = (ushort) value; - } - } - - /// - /// Gets or sets the pointer value of the COM variant - /// - public IntPtr Value - { - private get - { - return _value; - } - - set - { - _value = value; - } - } - - /* - /// - /// Gets or sets the byte value of the COM variant - /// - public byte ByteValue - { - get - { - return _ByteValue; - } - - set - { - _ByteValue = value; - } - } -*/ - - /// - /// Gets or sets the UInt32 value of the COM variant. - /// - public UInt32 UInt32Value - { - private get - { - return _uInt32Value; - } - set - { - _uInt32Value = value; - } - } - - /// - /// Gets or sets the UInt32 value of the COM variant. - /// - public Int32 Int32Value - { - private get - { - return _int32Value; - } - set - { - _int32Value = value; - } - } - - /// - /// Gets or sets the Int64 value of the COM variant - /// - public Int64 Int64Value - { - private get - { - return _int64Value; - } - - set - { - _int64Value = value; - } - } - - /// - /// Gets or sets the UInt64 value of the COM variant - /// - public UInt64 UInt64Value - { - private get - { - return _uInt64Value; - } - set - { - _uInt64Value = value; - } - } - - /* - /// - /// Gets or sets the FILETIME value of the COM variant - /// - public System.Runtime.InteropServices.ComTypes.FILETIME FileTime - { - get - { - return _fileTime; - } - - set - { - _fileTime = value; - } - } -*/ - - /*/// - /// Gets or sets variant type (ushort). - /// - public ushort VarTypeNative - { - get - { - return _vt; - } - - set - { - _vt = value; - } - }*/ - - /*/// - /// Clears variant - /// - public void Clear() - { - switch (VarType) - { - case VarEnum.VT_EMPTY: - break; - case VarEnum.VT_NULL: - case VarEnum.VT_I2: - case VarEnum.VT_I4: - case VarEnum.VT_R4: - case VarEnum.VT_R8: - case VarEnum.VT_CY: - case VarEnum.VT_DATE: - case VarEnum.VT_ERROR: - case VarEnum.VT_BOOL: - case VarEnum.VT_I1: - case VarEnum.VT_UI1: - case VarEnum.VT_UI2: - case VarEnum.VT_UI4: - case VarEnum.VT_I8: - case VarEnum.VT_UI8: - case VarEnum.VT_INT: - case VarEnum.VT_UINT: - case VarEnum.VT_HRESULT: - case VarEnum.VT_FILETIME: - _vt = 0; - break; - default: - if (NativeMethods.PropVariantClear(ref this) != (int)OperationResult.Ok) - { - throw new ArgumentException("PropVariantClear has failed for some reason."); - } - break; - } - }*/ - - /// - /// Gets the object for this PropVariant. - /// - /// - public object Object - { - get - { -#if !WINCE - var sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); - sp.Demand(); -#endif - switch (VarType) - { - case VarEnum.VT_EMPTY: - return null; - case VarEnum.VT_FILETIME: - try - { - return DateTime.FromFileTime(Int64Value); - } - catch (ArgumentOutOfRangeException) - { - return DateTime.MinValue; - } - default: - GCHandle propHandle = GCHandle.Alloc(this, GCHandleType.Pinned); - try - { - return Marshal.GetObjectForNativeVariant(propHandle.AddrOfPinnedObject()); - } -#if WINCE - catch (NotSupportedException) - { - switch (VarType) - { - case VarEnum.VT_UI8: - return UInt64Value; - case VarEnum.VT_UI4: - return UInt32Value; - case VarEnum.VT_I8: - return Int64Value; - case VarEnum.VT_I4: - return Int32Value; - default: - return 0; - } - } -#endif - finally - { - propHandle.Free(); - } - } - } - } - - /// - /// Determines whether the specified System.Object is equal to the current PropVariant. - /// - /// The System.Object to compare with the current PropVariant. - /// true if the specified System.Object is equal to the current PropVariant; otherwise, false. - public override bool Equals(object obj) - { - return (obj is PropVariant) ? Equals((PropVariant) obj) : false; - } - - /// - /// Determines whether the specified PropVariant is equal to the current PropVariant. - /// - /// The PropVariant to compare with the current PropVariant. - /// true if the specified PropVariant is equal to the current PropVariant; otherwise, false. - private bool Equals(PropVariant afi) - { - if (afi.VarType != VarType) - { - return false; - } - if (VarType != VarEnum.VT_BSTR) - { - return afi.Int64Value == Int64Value; - } - return afi.Value == Value; - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current PropVariant. - public override int GetHashCode() - { - return Value.GetHashCode(); - } - - /// - /// Returns a System.String that represents the current PropVariant. - /// - /// A System.String that represents the current PropVariant. - public override string ToString() - { - return "[" + Value + "] " + Int64Value.ToString(CultureInfo.CurrentCulture); - } - - /// - /// Determines whether the specified PropVariant instances are considered equal. - /// - /// The first PropVariant to compare. - /// The second PropVariant to compare. - /// true if the specified PropVariant instances are considered equal; otherwise, false. - public static bool operator ==(PropVariant afi1, PropVariant afi2) - { - return afi1.Equals(afi2); - } - - /// - /// Determines whether the specified PropVariant instances are not considered equal. - /// - /// The first PropVariant to compare. - /// The second PropVariant to compare. - /// true if the specified PropVariant instances are not considered equal; otherwise, false. - public static bool operator !=(PropVariant afi1, PropVariant afi2) - { - return !afi1.Equals(afi2); - } - } - - /// - /// Stores file extraction modes. - /// - internal enum AskMode - { - /// - /// Extraction mode - /// - Extract = 0, - /// - /// Test mode - /// - Test, - /// - /// Skip mode - /// - Skip - } - - /// - /// Stores operation result values - /// - public enum OperationResult - { - /// - /// Success - /// - Ok = 0, - /// - /// Method is unsupported - /// - UnsupportedMethod, - /// - /// Data error has occured - /// - DataError, - /// - /// CrcError has occured - /// - CrcError - } - - /// - /// Codes of item properities - /// - internal enum ItemPropId : uint - { - /// - /// No property - /// - NoProperty = 0, - /// - /// Handler item index - /// - HandlerItemIndex = 2, - /// - /// Item path - /// - Path, - /// - /// Item name - /// - Name, - /// - /// Item extension - /// - Extension, - /// - /// true if the item is a folder; otherwise, false - /// - IsDirectory, - /// - /// Item size - /// - Size, - /// - /// Item packed sise; usually absent - /// - PackedSize, - /// - /// Item attributes; usually absent - /// - Attributes, - /// - /// Item creation time; usually absent - /// - CreationTime, - /// - /// Item last access time; usually absent - /// - LastAccessTime, - /// - /// Item last write time - /// - LastWriteTime, - /// - /// true if the item is solid; otherwise, false - /// - Solid, - /// - /// true if the item is commented; otherwise, false - /// - Commented, - /// - /// true if the item is encrypted; otherwise, false - /// - Encrypted, - /// - /// (?) - /// - SplitBefore, - /// - /// (?) - /// - SplitAfter, - /// - /// Dictionary size(?) - /// - DictionarySize, - /// - /// Item CRC checksum - /// - Crc, - /// - /// Item type(?) - /// - Type, - /// - /// (?) - /// - IsAnti, - /// - /// Compression method - /// - Method, - /// - /// (?); usually absent - /// - HostOS, - /// - /// Item file system; usually absent - /// - FileSystem, - /// - /// Item user(?); usually absent - /// - User, - /// - /// Item group(?); usually absent - /// - Group, - /// - /// Bloack size(?) - /// - Block, - /// - /// Item comment; usually absent - /// - Comment, - /// - /// Item position - /// - Position, - /// - /// Item prefix(?) - /// - Prefix, - /// - /// Number of subdirectories - /// - NumSubDirs, - /// - /// Numbers of subfiles - /// - NumSubFiles, - /// - /// The archive legacy unpacker version - /// - UnpackVersion, - /// - /// Volume(?) - /// - Volume, - /// - /// Is a volume - /// - IsVolume, - /// - /// Offset value(?) - /// - Offset, - /// - /// Links(?) - /// - Links, - /// - /// Number of blocks - /// - NumBlocks, - /// - /// Number of volumes(?) - /// - NumVolumes, - /// - /// Time type(?) - /// - TimeType, - /// - /// 64-bit(?) - /// - Bit64, - /// - /// BigEndian - /// - BigEndian, - /// - /// Cpu(?) - /// - Cpu, - /// - /// Physical archive size - /// - PhysicalSize, - /// - /// Headers size - /// - HeadersSize, - /// - /// Archive checksum - /// - Checksum, - /// - /// (?) - /// - TotalSize = 0x1100, - /// - /// (?) - /// - FreeSpace, - /// - /// Cluster size(?) - /// - ClusterSize, - /// - /// Volume name(?) - /// - VolumeName, - /// - /// Local item name(?); usually absent - /// - LocalName = 0x1200, - /// - /// (?) - /// - Provider, - /// - /// User defined property; usually absent - /// - UserDefined = 0x10000 - } - - /*/// - /// Codes of archive properties or modes. - /// - internal enum ArchivePropId : uint - { - Name = 0, - ClassID, - Extension, - AddExtension, - Update, - KeepName, - StartSignature, - FinishSignature, - Associate - }*/ - - /// - /// PropId string names dictionary wrapper. - /// - internal static class PropIdToName - { - /// - /// PropId string names - /// - public static readonly Dictionary PropIdNames = - #region Initialization - new Dictionary(46) - { - {ItemPropId.Path, "Path"}, - {ItemPropId.Name, "Name"}, - {ItemPropId.IsDirectory, "Folder"}, - {ItemPropId.Size, "Size"}, - {ItemPropId.PackedSize, "Packed Size"}, - {ItemPropId.Attributes, "Attributes"}, - {ItemPropId.CreationTime, "Created"}, - {ItemPropId.LastAccessTime, "Accessed"}, - {ItemPropId.LastWriteTime, "Modified"}, - {ItemPropId.Solid, "Solid"}, - {ItemPropId.Commented, "Commented"}, - {ItemPropId.Encrypted, "Encrypted"}, - {ItemPropId.SplitBefore, "Split Before"}, - {ItemPropId.SplitAfter, "Split After"}, - { - ItemPropId.DictionarySize, - "Dictionary Size" - }, - {ItemPropId.Crc, "CRC"}, - {ItemPropId.Type, "Type"}, - {ItemPropId.IsAnti, "Anti"}, - {ItemPropId.Method, "Method"}, - {ItemPropId.HostOS, "Host OS"}, - {ItemPropId.FileSystem, "File System"}, - {ItemPropId.User, "User"}, - {ItemPropId.Group, "Group"}, - {ItemPropId.Block, "Block"}, - {ItemPropId.Comment, "Comment"}, - {ItemPropId.Position, "Position"}, - {ItemPropId.Prefix, "Prefix"}, - { - ItemPropId.NumSubDirs, - "Number of subdirectories" - }, - { - ItemPropId.NumSubFiles, - "Number of subfiles" - }, - { - ItemPropId.UnpackVersion, - "Unpacker version" - }, - {ItemPropId.Volume, "Volume"}, - {ItemPropId.IsVolume, "IsVolume"}, - {ItemPropId.Offset, "Offset"}, - {ItemPropId.Links, "Links"}, - { - ItemPropId.NumBlocks, - "Number of blocks" - }, - { - ItemPropId.NumVolumes, - "Number of volumes" - }, - {ItemPropId.TimeType, "Time type"}, - {ItemPropId.Bit64, "64-bit"}, - {ItemPropId.BigEndian, "Big endian"}, - {ItemPropId.Cpu, "CPU"}, - { - ItemPropId.PhysicalSize, - "Physical Size" - }, - {ItemPropId.HeadersSize, "Headers Size"}, - {ItemPropId.Checksum, "Checksum"}, - {ItemPropId.FreeSpace, "Free Space"}, - {ItemPropId.ClusterSize, "Cluster Size"} - }; - #endregion - } - - /// - /// 7-zip IArchiveOpenCallback imported interface to handle the opening of an archive. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600100000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IArchiveOpenCallback - { - // ref ulong replaced with IntPtr because handlers often pass null value - // read actual value with Marshal.ReadInt64 - /// - /// Sets total data size - /// - /// Files pointer - /// Total size in bytes - void SetTotal( - IntPtr files, - IntPtr bytes); - - /// - /// Sets completed size - /// - /// Files pointer - /// Completed size in bytes - void SetCompleted( - IntPtr files, - IntPtr bytes); - } - - /// - /// 7-zip ICryptoGetTextPassword imported interface to get the archive password. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000500100000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ICryptoGetTextPassword - { - /// - /// Gets password for the archive - /// - /// Password for the archive - /// Zero if everything is OK - [PreserveSig] - int CryptoGetTextPassword( - [MarshalAs(UnmanagedType.BStr)] out string password); - } - - /// - /// 7-zip ICryptoGetTextPassword2 imported interface for setting the archive password. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000500110000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ICryptoGetTextPassword2 - { - /// - /// Sets password for the archive - /// - /// Specifies whether archive has a password or not (0 if not) - /// Password for the archive - /// Zero if everything is OK - [PreserveSig] - int CryptoGetTextPassword2( - ref int passwordIsDefined, - [MarshalAs(UnmanagedType.BStr)] out string password); - } - - /// - /// 7-zip IArchiveExtractCallback imported interface. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600200000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IArchiveExtractCallback - { - /// - /// Gives the size of the unpacked archive files - /// - /// Size of the unpacked archive files (in bytes) - void SetTotal(ulong total); - - /// - /// SetCompleted 7-zip function - /// - /// - void SetCompleted([In] ref ulong completeValue); - - /// - /// Gets the stream for file extraction - /// - /// File index in the archive file table - /// Pointer to the stream - /// Extraction mode - /// S_OK - OK, S_FALSE - skip this file - [PreserveSig] - int GetStream( - uint index, - [Out, MarshalAs(UnmanagedType.Interface)] out ISequentialOutStream outStream, - AskMode askExtractMode); - - /// - /// PrepareOperation 7-zip function - /// - /// Ask mode - void PrepareOperation(AskMode askExtractMode); - - /// - /// Sets the operaton result - /// - /// The operation result - void SetOperationResult(OperationResult operationResult); - } - - /// - /// 7-zip IArchiveUpdateCallback imported interface. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600800000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IArchiveUpdateCallback - { - /// - /// Gives the size of the unpacked archive files. - /// - /// Size of the unpacked archive files (in bytes) - void SetTotal(ulong total); - - /// - /// SetCompleted 7-zip internal function. - /// - /// - void SetCompleted([In] ref ulong completeValue); - - /// - /// Gets archive update mode. - /// - /// File index - /// 1 if new, 0 if not - /// 1 if new, 0 if not - /// -1 if doesn't matter - /// - [PreserveSig] - int GetUpdateItemInfo( - uint index, ref int newData, - ref int newProperties, ref uint indexInArchive); - - /// - /// Gets the archive item property data. - /// - /// Item index - /// Property identificator - /// Property value - /// Zero if Ok - [PreserveSig] - int GetProperty(uint index, ItemPropId propId, ref PropVariant value); - - /// - /// Gets the stream for reading. - /// - /// The item index. - /// The ISequentialInStream pointer for reading. - /// Zero if Ok - [PreserveSig] - int GetStream( - uint index, - [Out, MarshalAs(UnmanagedType.Interface)] out ISequentialInStream inStream); - - /// - /// Sets the result for currently performed operation. - /// - /// The result value. - void SetOperationResult(OperationResult operationResult); - - /// - /// EnumProperties 7-zip internal function. - /// - /// The enumerator pointer. - /// - long EnumProperties(IntPtr enumerator); - } - - /// - /// 7-zip IArchiveOpenVolumeCallback imported interface to handle archive volumes. - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600300000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IArchiveOpenVolumeCallback - { - /// - /// Gets the archive property data. - /// - /// The property identificator. - /// The property value. - [PreserveSig] - int GetProperty( - ItemPropId propId, ref PropVariant value); - - /// - /// Gets the stream for reading the volume. - /// - /// The volume file name. - /// The IInStream pointer for reading. - /// Zero if Ok - [PreserveSig] - int GetStream( - [MarshalAs(UnmanagedType.LPWStr)] string name, - [Out, MarshalAs(UnmanagedType.Interface)] out IInStream inStream); - } - - /// - /// 7-zip ISequentialInStream imported interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000300010000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ISequentialInStream - { - /// - /// Writes data to 7-zip packer - /// - /// Array of bytes available for writing - /// Array size - /// S_OK if success - /// If (size > 0) and there are bytes in stream, - /// this function must read at least 1 byte. - /// This function is allowed to read less than "size" bytes. - /// You must call Read function in loop, if you need exact amount of data. - /// - int Read( - [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, - uint size); - } - - /// - /// 7-zip ISequentialOutStream imported interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000300020000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ISequentialOutStream - { - /// - /// Writes data to unpacked file stream - /// - /// Array of bytes available for reading - /// Array size - /// Processed data size - /// S_OK if success - /// If size != 0, return value is S_OK and (*processedSize == 0), - /// then there are no more bytes in stream. - /// If (size > 0) and there are bytes in stream, - /// this function must read at least 1 byte. - /// This function is allowed to rwrite less than "size" bytes. - /// You must call Write function in loop, if you need exact amount of data. - /// - [PreserveSig] - int Write( - [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, - uint size, IntPtr processedSize); - } - - /// - /// 7-zip IInStream imported interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000300030000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IInStream - { - /// - /// Read routine - /// - /// Array of bytes to set - /// Array size - /// Zero if Ok - int Read( - [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, - uint size); - - /// - /// Seek routine - /// - /// Offset value - /// Seek origin value - /// New position pointer - void Seek( - long offset, SeekOrigin seekOrigin, IntPtr newPosition); - } - - /// - /// 7-zip IOutStream imported interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000300040000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IOutStream - { - /// - /// Write routine - /// - /// Array of bytes to get - /// Array size - /// Processed size - /// Zero if Ok - [PreserveSig] - int Write( - [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, - uint size, - IntPtr processedSize); - - /// - /// Seek routine - /// - /// Offset value - /// Seek origin value - /// New position pointer - void Seek( - long offset, SeekOrigin seekOrigin, IntPtr newPosition); - - /// - /// Set size routine - /// - /// New size value - /// Zero if Ok - [PreserveSig] - int SetSize(long newSize); - } - - /// - /// 7-zip essential in archive interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600600000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IInArchive - { - /// - /// Opens archive for reading. - /// - /// Archive file stream - /// Maximum start position for checking - /// Callback for opening archive - /// - [PreserveSig] - int Open( - IInStream stream, - [In] ref ulong maxCheckStartPosition, - [MarshalAs(UnmanagedType.Interface)] IArchiveOpenCallback openArchiveCallback); - - /// - /// Closes the archive. - /// - void Close(); - - /// - /// Gets the number of files in the archive file table . - /// - /// The number of files in the archive - uint GetNumberOfItems(); - - /// - /// Retrieves specific property data. - /// - /// File index in the archive file table - /// Property code - /// Property variant value - void GetProperty( - uint index, - ItemPropId propId, - ref PropVariant value); // PropVariant - - /// - /// Extracts files from the opened archive. - /// - /// indexes of files to be extracted (must be sorted) - /// 0xFFFFFFFF means all files - /// testMode != 0 means "test files operation" - /// IArchiveExtractCallback for operations handling - /// 0 if success - [PreserveSig] - int Extract( - [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] uint[] indexes, - uint numItems, - int testMode, - [MarshalAs(UnmanagedType.Interface)] IArchiveExtractCallback extractCallback); - - /// - /// Gets archive property data - /// - /// Archive property identificator - /// Archive property value - void GetArchiveProperty( - ItemPropId propId, // PROPID - ref PropVariant value); // PropVariant - - /// - /// Gets the number of properties - /// - /// The number of properties - uint GetNumberOfProperties(); - - /// - /// Gets property information - /// - /// Item index - /// Name - /// Property identificator - /// Variant type - void GetPropertyInfo( - uint index, - [MarshalAs(UnmanagedType.BStr)] out string name, - out ItemPropId propId, // PROPID - out ushort varType); //VARTYPE - - /// - /// Gets the number of archive properties - /// - /// The number of archive properties - uint GetNumberOfArchiveProperties(); - - /// - /// Gets the archive property information - /// - /// Item index - /// Name - /// Property identificator - /// Variant type - void GetArchivePropertyInfo( - uint index, - [MarshalAs(UnmanagedType.BStr)] out string name, - out ItemPropId propId, // PROPID - out ushort varType); //VARTYPE - } - - /// - /// 7-zip essential out archive interface - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600A00000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IOutArchive - { - /// - /// Updates archive items - /// - /// The ISequentialOutStream pointer for writing the archive data - /// Number of archive items - /// The IArchiveUpdateCallback pointer - /// Zero if Ok - [PreserveSig] - int UpdateItems( - [MarshalAs(UnmanagedType.Interface)] ISequentialOutStream outStream, - uint numItems, - [MarshalAs(UnmanagedType.Interface)] IArchiveUpdateCallback updateCallback); - - /// - /// Gets file time type(?) - /// - /// Type pointer - void GetFileTimeType(IntPtr type); - } - - /// - /// 7-zip ISetProperties interface for setting various archive properties - /// - [ComImport] - [Guid("23170F69-40C1-278A-0000-000600030000")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ISetProperties - { - /// - /// Sets the archive properties - /// - /// The names of the properties - /// The values of the properties - /// The properties count - /// - int SetProperties(IntPtr names, IntPtr values, int numProperties); - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/Common.cs b/BizHawk.Client.Common/7z/Common.cs deleted file mode 100644 index ebbc3ddb24..0000000000 --- a/BizHawk.Client.Common/7z/Common.cs +++ /dev/null @@ -1,842 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Globalization; -#if !WINCE -using System.Runtime.Remoting.Messaging; -#endif -#if DOTNET20 -using System.Threading; -#else -using System.Windows.Threading; -#endif -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if UNMANAGED - - /// - /// The way of the event synchronization. - /// - public enum EventSynchronizationStrategy - { - /// - /// Events are called synchronously if user can do some action; that is, cancel the execution process for example. - /// - Default, - /// - /// Always call events asynchronously. - /// - AlwaysAsynchronous, - /// - /// Always call events synchronously. - /// - AlwaysSynchronous - } - - /// - /// SevenZip Extractor/Compressor base class. Implements Password string, ReportErrors flag. - /// - public abstract class SevenZipBase : MarshalByRefObject - { - private readonly string _password; - private readonly bool _reportErrors; - private readonly int _uniqueID; - private static readonly List Identificators = new List(); -#if !WINCE - internal static readonly AsyncCallback AsyncCallbackImplementation = AsyncCallbackMethod; - - /// - /// True if the instance of the class needs to be recreated in new thread context; otherwise, false. - /// - protected internal bool NeedsToBeRecreated; - - /// - /// AsyncCallback implementation used in asynchronous invocations. - /// - /// IAsyncResult instance. - internal static void AsyncCallbackMethod(IAsyncResult ar) - { - var result = (AsyncResult)ar; - result.AsyncDelegate.GetType().GetMethod("EndInvoke").Invoke(result.AsyncDelegate, new[] { ar }); - ((SevenZipBase)ar.AsyncState).ReleaseContext(); - } - - virtual internal void SaveContext( -#if !DOTNET20 -DispatcherPriority priority = DispatcherPriority.Normal -#endif -) - { -#if !DOTNET20 - Dispatcher = Dispatcher.CurrentDispatcher; - Priority = priority; -#else - Context = SynchronizationContext.Current; -#endif - NeedsToBeRecreated = true; - } - - virtual internal void ReleaseContext() - { -#if !DOTNET20 - Dispatcher = null; -#else - Context = null; -#endif - NeedsToBeRecreated = true; - GC.SuppressFinalize(this); - } - - private delegate void EventHandlerDelegate(EventHandler handler, T e) where T : EventArgs; - - internal void OnEvent(EventHandler handler, T e, bool synchronous) where T : EventArgs - { - try - { - if (handler != null) - { - switch (EventSynchronization) - { - case EventSynchronizationStrategy.AlwaysAsynchronous: - synchronous = false; - break; - case EventSynchronizationStrategy.AlwaysSynchronous: - synchronous = true; - break; - } - if ( -#if !DOTNET20 -Dispatcher == null -#else - Context == null -#endif -) - { - // Usual synchronous call - handler(this, e); - } - else - { -#if !DOTNET20 - var eventHandlerDelegate = new EventHandlerDelegate((h, ee) => h(this, ee)); - if (synchronous) - { - // Could be just handler(this, e); - Dispatcher.Invoke(eventHandlerDelegate, Priority, handler, e); - } - else - { - Dispatcher.BeginInvoke(eventHandlerDelegate, Priority, handler, e); - } -#else - var callback = new SendOrPostCallback((obj) => - { - var array = (object[])obj; - ((EventHandler)array[0])(array[1], (T)array[2]); - }); - if (synchronous) - { - // Could be just handler(this, e); - this.Context.Send(callback, new object[] { handler, this, e }); - } - else - { - this.Context.Post(callback, new object[] { handler, this, e }); - } -#endif - } - } - } - catch (Exception ex) - { - AddException(ex); - } - } - -#if !DOTNET20 - /// - /// Gets or sets the Dispatcher object for this instance. - /// It will be used to fire events in the user context. - /// - internal Dispatcher Dispatcher { get; set; } - - /// - /// Gets or sets the Dispatcher priority of calling user events. - /// - internal DispatcherPriority Priority { get; set; } -#else - internal SynchronizationContext Context { get; set; } -#endif - /// - /// Gets or sets the event synchronization strategy. - /// - public EventSynchronizationStrategy EventSynchronization { get; set; } -#else // WINCE - internal void OnEvent(EventHandler handler, T e, bool synchronous) where T : System.EventArgs - { - try - { - handler(this, e); - } - catch (Exception ex) - { - AddException(ex); - } - } -#endif - /// - /// Gets the unique identificator of this SevenZipBase instance. - /// - public int UniqueID - { - get - { - return _uniqueID; - } - } - - /// - /// User exceptions thrown during the requested operations, for example, in events. - /// - private readonly List _exceptions = new List(); - - private static int GetUniqueID() - { - lock(Identificators) - { - - int id; - var rnd = new Random(DateTime.Now.Millisecond); - do - { - id = rnd.Next(Int32.MaxValue); - } - while (Identificators.Contains(id)); - Identificators.Add(id); - return id; - } - } - - #region Constructors - /// - /// Initializes a new instance of the SevenZipBase class. - /// - protected SevenZipBase() - { - _password = ""; - _reportErrors = true; - _uniqueID = GetUniqueID(); - } - - /// - /// Initializes a new instance of the SevenZipBase class - /// - /// The archive password. - protected SevenZipBase(string password) - { - if (String.IsNullOrEmpty(password)) - { - throw new SevenZipException("Empty password was specified."); - } - _password = password; - _reportErrors = true; - _uniqueID = GetUniqueID(); - } - #endregion - - /// - /// Removes the UniqueID from the list. - /// - ~SevenZipBase() - { - // This lock probably isn't necessary but just in case... - lock (Identificators) - { - Identificators.Remove(_uniqueID); - } - } - - /// - /// Gets or sets the archive password - /// - public string Password - { - get - { - return _password; - } - } - - /// - /// Gets or sets throw exceptions on archive errors flag - /// - internal bool ReportErrors - { - get - { - return _reportErrors; - } - } - - /// - /// Gets the user exceptions thrown during the requested operations, for example, in events. - /// - internal ReadOnlyCollection Exceptions - { - get - { - return new ReadOnlyCollection(_exceptions); - } - } - - internal void AddException(Exception e) - { - _exceptions.Add(e); - } - - internal void ClearExceptions() - { - _exceptions.Clear(); - } - - internal bool HasExceptions - { - get - { - return _exceptions.Count > 0; - } - } - - /// - /// Throws the specified exception when is able to. - /// - /// The exception to throw. - /// The handler responsible for the exception. - internal bool ThrowException(CallbackBase handler, params Exception[] e) - { - if (_reportErrors && (handler == null || !handler.Canceled)) - { - throw e[0]; - } - return false; - } - - internal void ThrowUserException() - { - if (HasExceptions) - { - throw new SevenZipException(SevenZipException.USER_EXCEPTION_MESSAGE); - } - } - - /// - /// Throws exception if HRESULT != 0. - /// - /// Result code to check. - /// Exception message. - /// The class responsible for the callback. - internal void CheckedExecute(int hresult, string message, CallbackBase handler) - { - if (hresult != (int)OperationResult.Ok || handler.HasExceptions) - { - if (!handler.HasExceptions) - { - if (hresult < -2000000000) - { - ThrowException(handler, - new SevenZipException( - "The execution has failed due to the bug in the SevenZipSharp.\n" + - "Please report about it to http://sevenzipsharp.codeplex.com/WorkItem/List.aspx, post the release number and attach the archive.")); - } - else - { - ThrowException(handler, - new SevenZipException(message + hresult.ToString(CultureInfo.InvariantCulture) + - '.')); - } - } - else - { - ThrowException(handler, handler.Exceptions[0]); - } - } - } - -#if !WINCE && !MONO - /// - /// Changes the path to the 7-zip native library. - /// - /// The path to the 7-zip native library. - public static void SetLibraryPath(string libraryPath) - { - SevenZipLibraryManager.SetLibraryPath(libraryPath); - } -#endif - /// - /// Gets the current library features. - /// - public static LibraryFeature CurrentLibraryFeatures - { - get - { - return SevenZipLibraryManager.CurrentLibraryFeatures; - } - } - - /// - /// Determines whether the specified System.Object is equal to the current SevenZipBase. - /// - /// The System.Object to compare with the current SevenZipBase. - /// true if the specified System.Object is equal to the current SevenZipBase; otherwise, false. - public override bool Equals(object obj) - { - var inst = obj as SevenZipBase; - if (inst == null) - { - return false; - } - return _uniqueID == inst._uniqueID; - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current SevenZipBase. - public override int GetHashCode() - { - return _uniqueID; - } - - /// - /// Returns a System.String that represents the current SevenZipBase. - /// - /// A System.String that represents the current SevenZipBase. - public override string ToString() - { - var type = "SevenZipBase"; - if (this is SevenZipExtractor) - { - type = "SevenZipExtractor"; - } - if (this is SevenZipCompressor) - { - type = "SevenZipCompressor"; - } - return string.Format("{0} [{1}]", type, _uniqueID); - } - } - - internal class CallbackBase : MarshalByRefObject - { - private readonly string _password; - private readonly bool _reportErrors; - /// - /// User exceptions thrown during the requested operations, for example, in events. - /// - private readonly List _exceptions = new List(); - - #region Constructors - /// - /// Initializes a new instance of the CallbackBase class. - /// - protected CallbackBase() - { - _password = ""; - _reportErrors = true; - } - - /// - /// Initializes a new instance of the CallbackBase class. - /// - /// The archive password. - protected CallbackBase(string password) - { - if (String.IsNullOrEmpty(password)) - { - throw new SevenZipException("Empty password was specified."); - } - _password = password; - _reportErrors = true; - } - #endregion - - /// - /// Gets or sets the archive password - /// - public string Password - { - get - { - return _password; - } - } - - /// - /// Gets or sets the value indicating whether the current procedure was cancelled. - /// - public bool Canceled { get; set; } - - /// - /// Gets or sets throw exceptions on archive errors flag - /// - public bool ReportErrors - { - get - { - return _reportErrors; - } - } - - /// - /// Gets the user exceptions thrown during the requested operations, for example, in events. - /// - public ReadOnlyCollection Exceptions - { - get - { - return new ReadOnlyCollection(_exceptions); - } - } - - public void AddException(Exception e) - { - _exceptions.Add(e); - } - - public void ClearExceptions() - { - _exceptions.Clear(); - } - - public bool HasExceptions - { - get - { - return _exceptions.Count > 0; - } - } - - /// - /// Throws the specified exception when is able to. - /// - /// The exception to throw. - /// The handler responsible for the exception. - public bool ThrowException(CallbackBase handler, params Exception[] e) - { - if (_reportErrors && (handler == null || !handler.Canceled)) - { - throw e[0]; - } - return false; - } - - /// - /// Throws the first exception in the list if any exists. - /// - /// True means no exceptions. - public bool ThrowException() - { - if (HasExceptions && _reportErrors) - { - throw _exceptions[0]; - } - return true; - } - - public void ThrowUserException() - { - if (HasExceptions) - { - throw new SevenZipException(SevenZipException.USER_EXCEPTION_MESSAGE); - } - } - } - - /// - /// Struct for storing information about files in the 7-zip archive. - /// - public struct ArchiveFileInfo - { - /// - /// Gets or sets index of the file in the archive file table. - /// - public int Index { get; set; } - - /// - /// Gets or sets file name - /// - public string FileName { get; set; } - - /// - /// Gets or sets the file last write time. - /// - public DateTime LastWriteTime { get; set; } - - /// - /// Gets or sets the file creation time. - /// - public DateTime CreationTime { get; set; } - - /// - /// Gets or sets the file creation time. - /// - public DateTime LastAccessTime { get; set; } - - /// - /// Gets or sets size of the file (unpacked). - /// - public ulong Size { get; set; } - - /// - /// Gets or sets CRC checksum of the file. - /// - public uint Crc { get; set; } - - /// - /// Gets or sets file attributes. - /// - public uint Attributes { get; set; } - - /// - /// Gets or sets being a directory. - /// - public bool IsDirectory { get; set; } - - /// - /// Gets or sets being encrypted. - /// - public bool Encrypted { get; set; } - - /// - /// Gets or sets comment for the file. - /// - public string Comment { get; set; } - - /// - /// Determines whether the specified System.Object is equal to the current ArchiveFileInfo. - /// - /// The System.Object to compare with the current ArchiveFileInfo. - /// true if the specified System.Object is equal to the current ArchiveFileInfo; otherwise, false. - public override bool Equals(object obj) - { - return (obj is ArchiveFileInfo) ? Equals((ArchiveFileInfo)obj) : false; - } - - /// - /// Determines whether the specified ArchiveFileInfo is equal to the current ArchiveFileInfo. - /// - /// The ArchiveFileInfo to compare with the current ArchiveFileInfo. - /// true if the specified ArchiveFileInfo is equal to the current ArchiveFileInfo; otherwise, false. - public bool Equals(ArchiveFileInfo afi) - { - return afi.Index == Index && afi.FileName == FileName; - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current ArchiveFileInfo. - public override int GetHashCode() - { - return FileName.GetHashCode() ^ Index; - } - - /// - /// Returns a System.String that represents the current ArchiveFileInfo. - /// - /// A System.String that represents the current ArchiveFileInfo. - public override string ToString() - { - return "[" + Index.ToString(CultureInfo.CurrentCulture) + "] " + FileName; - } - - /// - /// Determines whether the specified ArchiveFileInfo instances are considered equal. - /// - /// The first ArchiveFileInfo to compare. - /// The second ArchiveFileInfo to compare. - /// true if the specified ArchiveFileInfo instances are considered equal; otherwise, false. - public static bool operator ==(ArchiveFileInfo afi1, ArchiveFileInfo afi2) - { - return afi1.Equals(afi2); - } - - /// - /// Determines whether the specified ArchiveFileInfo instances are not considered equal. - /// - /// The first ArchiveFileInfo to compare. - /// The second ArchiveFileInfo to compare. - /// true if the specified ArchiveFileInfo instances are not considered equal; otherwise, false. - public static bool operator !=(ArchiveFileInfo afi1, ArchiveFileInfo afi2) - { - return !afi1.Equals(afi2); - } - } - - /// - /// Archive property struct. - /// - public struct ArchiveProperty - { - /// - /// Gets the name of the archive property. - /// - public string Name { get; internal set; } - - /// - /// Gets the value of the archive property. - /// - public object Value { get; internal set; } - - /// - /// Determines whether the specified System.Object is equal to the current ArchiveProperty. - /// - /// The System.Object to compare with the current ArchiveProperty. - /// true if the specified System.Object is equal to the current ArchiveProperty; otherwise, false. - public override bool Equals(object obj) - { - return (obj is ArchiveProperty) ? Equals((ArchiveProperty)obj) : false; - } - - /// - /// Determines whether the specified ArchiveProperty is equal to the current ArchiveProperty. - /// - /// The ArchiveProperty to compare with the current ArchiveProperty. - /// true if the specified ArchiveProperty is equal to the current ArchiveProperty; otherwise, false. - public bool Equals(ArchiveProperty afi) - { - return afi.Name == Name && afi.Value == Value; - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current ArchiveProperty. - public override int GetHashCode() - { - return Name.GetHashCode() ^ Value.GetHashCode(); - } - - /// - /// Returns a System.String that represents the current ArchiveProperty. - /// - /// A System.String that represents the current ArchiveProperty. - public override string ToString() - { - return Name + " = " + Value; - } - - /// - /// Determines whether the specified ArchiveProperty instances are considered equal. - /// - /// The first ArchiveProperty to compare. - /// The second ArchiveProperty to compare. - /// true if the specified ArchiveProperty instances are considered equal; otherwise, false. - public static bool operator ==(ArchiveProperty afi1, ArchiveProperty afi2) - { - return afi1.Equals(afi2); - } - - /// - /// Determines whether the specified ArchiveProperty instances are not considered equal. - /// - /// The first ArchiveProperty to compare. - /// The second ArchiveProperty to compare. - /// true if the specified ArchiveProperty instances are not considered equal; otherwise, false. - public static bool operator !=(ArchiveProperty afi1, ArchiveProperty afi2) - { - return !afi1.Equals(afi2); - } - } - -#if COMPRESS - - /// - /// Archive compression mode. - /// - public enum CompressionMode - { - /// - /// Create a new archive; overwrite the existing one. - /// - Create, - /// - /// Add data to the archive. - /// - Append, - } - - internal enum InternalCompressionMode - { - /// - /// Create a new archive; overwrite the existing one. - /// - Create, - /// - /// Add data to the archive. - /// - Append, - /// - /// Modify archive data. - /// - Modify - } - - /// - /// Zip encryption method enum. - /// - public enum ZipEncryptionMethod - { - /// - /// ZipCrypto encryption method. - /// - ZipCrypto, - /// - /// AES 128 bit encryption method. - /// - Aes128, - /// - /// AES 192 bit encryption method. - /// - Aes192, - /// - /// AES 256 bit encryption method. - /// - Aes256 - } - - /// - /// Archive update data for UpdateCallback. - /// - internal struct UpdateData - { - public uint FilesCount; - public InternalCompressionMode Mode; - - public Dictionary FileNamesToModify { get; set; } - - public List ArchiveFileData { get; set; } - } -#endif -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/EventArgs.cs b/BizHawk.Client.Common/7z/EventArgs.cs deleted file mode 100644 index 4bce1ce72a..0000000000 --- a/BizHawk.Client.Common/7z/EventArgs.cs +++ /dev/null @@ -1,399 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip -{ - /// - /// The definition of the interface which supports the cancellation of a process. - /// - public interface ICancellable - { - /// - /// Gets or sets whether to stop the current archive operation. - /// - bool Cancel { get; set; } - } - - /// - /// EventArgs for storing PercentDone property. - /// - public class PercentDoneEventArgs : EventArgs - { - private readonly byte _percentDone; - - /// - /// Initializes a new instance of the PercentDoneEventArgs class. - /// - /// The percent of finished work. - /// - public PercentDoneEventArgs(byte percentDone) - { - if (percentDone > 100 || percentDone < 0) - { - throw new ArgumentOutOfRangeException("percentDone", - "The percent of finished work must be between 0 and 100."); - } - _percentDone = percentDone; - } - - /// - /// Gets the percent of finished work. - /// - public byte PercentDone - { - get - { - return _percentDone; - } - } - - /// - /// Converts a [0, 1] rate to its percent equivalent. - /// - /// The rate of the done work. - /// Percent integer equivalent. - /// - internal static byte ProducePercentDone(float doneRate) - { -#if !WINCE - return (byte) Math.Round(Math.Min(100*doneRate, 100), MidpointRounding.AwayFromZero); -#else - return (byte) Math.Round(Math.Min(100*doneRate, 100)); -#endif - } - } - - /// - /// The EventArgs class for accurate progress handling. - /// - public sealed class ProgressEventArgs : PercentDoneEventArgs - { - private readonly byte _delta; - - /// - /// Initializes a new instance of the ProgressEventArgs class. - /// - /// The percent of finished work. - /// The percent of work done after the previous event. - public ProgressEventArgs(byte percentDone, byte percentDelta) - : base(percentDone) - { - _delta = percentDelta; - } - - /// - /// Gets the change in done work percentage. - /// - public byte PercentDelta - { - get - { - return _delta; - } - } - } - -#if UNMANAGED - /// - /// EventArgs used to report the file information which is going to be packed. - /// - public sealed class FileInfoEventArgs : PercentDoneEventArgs, ICancellable - { - private readonly ArchiveFileInfo _fileInfo; - - /// - /// Initializes a new instance of the FileInfoEventArgs class. - /// - /// The current ArchiveFileInfo. - /// The percent of finished work. - public FileInfoEventArgs(ArchiveFileInfo fileInfo, byte percentDone) - : base(percentDone) - { - _fileInfo = fileInfo; - } - - /// - /// Gets or sets whether to stop the current archive operation. - /// - public bool Cancel { get; set; } - - /// - /// Gets the corresponding FileInfo to the event. - /// - public ArchiveFileInfo FileInfo - { - get - { - return _fileInfo; - } - } - } - - /// - /// EventArgs used to report the size of unpacked archive data - /// - public sealed class OpenEventArgs : EventArgs - { - private readonly ulong _totalSize; - - /// - /// Initializes a new instance of the OpenEventArgs class - /// - /// Size of unpacked archive data - public OpenEventArgs(ulong totalSize) - { - _totalSize = totalSize; - } - - /// - /// Gets the size of unpacked archive data - /// - public ulong TotalSize - { - get - { - return _totalSize; - } - } - } - - /// - /// Stores an int number - /// - public sealed class IntEventArgs : EventArgs - { - private readonly int _value; - - /// - /// Initializes a new instance of the IntEventArgs class - /// - /// Useful data carried by the IntEventArgs class - public IntEventArgs(int value) - { - _value = value; - } - - /// - /// Gets the value of the IntEventArgs class - /// - public int Value - { - get - { - return _value; - } - } - } - - /// - /// EventArgs class which stores the file name. - /// - public sealed class FileNameEventArgs : PercentDoneEventArgs, ICancellable - { - private readonly string _fileName; - - /// - /// Initializes a new instance of the FileNameEventArgs class. - /// - /// The file name. - /// The percent of finished work - public FileNameEventArgs(string fileName, byte percentDone) : - base(percentDone) - { - _fileName = fileName; - } - - /// - /// Gets or sets whether to stop the current archive operation. - /// - public bool Cancel { get; set; } - - /// - /// Gets the file name. - /// - public string FileName - { - get - { - return _fileName; - } - } - } - - /// - /// EventArgs for FileExists event, stores the file name and asks whether to overwrite it in case it already exists. - /// - public sealed class FileOverwriteEventArgs : EventArgs - { - /// - /// Initializes a new instance of the FileOverwriteEventArgs class - /// - /// The file name. - public FileOverwriteEventArgs(string fileName) - { - FileName = fileName; - } - - /// - /// Gets or sets the value indicating whether to cancel the extraction. - /// - public bool Cancel { get; set; } - - /// - /// Gets or sets the file name to extract to. Null means skip. - /// - public string FileName { get; set; } - } - - /// - /// The reason for calling . - /// - public enum ExtractFileCallbackReason - { - /// - /// is called the first time for a file. - /// - Start, - - /// - /// All data has been written to the target without any exceptions. - /// - Done, - - /// - /// An exception occured during extraction of the file. - /// - Failure - } - - /// - /// The arguments passed to . - /// - /// - /// For each file, is first called with - /// set to . If the callback chooses to extract the - /// file data by setting or , the callback - /// will be called a second time with set to - /// or - /// to allow for any cleanup task like closing the stream. - /// - public class ExtractFileCallbackArgs : EventArgs - { - private readonly ArchiveFileInfo _archiveFileInfo; - private Stream _extractToStream; - - /// - /// Initializes a new instance of the class. - /// - /// The information about file in the archive. - public ExtractFileCallbackArgs(ArchiveFileInfo archiveFileInfo) - { - Reason = ExtractFileCallbackReason.Start; - _archiveFileInfo = archiveFileInfo; - } - - /// - /// Information about file in the archive. - /// - /// Information about file in the archive. - public ArchiveFileInfo ArchiveFileInfo - { - get - { - return _archiveFileInfo; - } - } - - /// - /// The reason for calling . - /// - /// - /// If neither nor is set, - /// will not be called after . - /// - /// The reason. - public ExtractFileCallbackReason Reason { get; internal set; } - - /// - /// The exception that occurred during extraction. - /// - /// The _Exception. - /// - /// If the callback is called with set to , - /// this member contains the _Exception that occurred. - /// The default behavior is to rethrow the _Exception after return of the callback. - /// However the callback can set to null to swallow the _Exception - /// and continue extraction with the next file. - /// - public Exception Exception { get; set; } - - /// - /// Gets or sets a value indicating whether to cancel the extraction. - /// - /// true to cancel the extraction; false to continue. The default is false. - public bool CancelExtraction { get; set; } - - /// - /// Gets or sets whether and where to extract the file. - /// - /// The path where to extract the file to. - /// - /// If is set, this mmember will be ignored. - /// - public string ExtractToFile { get; set; } - - /// - /// Gets or sets whether and where to extract the file. - /// - /// The the extracted data is written to. - /// - /// If both this member and are null (the defualt), the file - /// will not be extracted and the callback will be be executed a second time with the - /// set to or . - /// - public Stream ExtractToStream - { - get - { - return _extractToStream; - } - set - { - if (_extractToStream != null && !_extractToStream.CanWrite) - { - throw new ExtractionFailedException("The specified stream is not writable!"); - } - _extractToStream = value; - } - } - - /// - /// Gets or sets any data that will be preserved between the callback call - /// and the or calls. - /// - /// The data. - public object ObjectData { get; set; } - } - - /// - /// Callback delegate for . - /// - public delegate void ExtractFileCallback(ExtractFileCallbackArgs extractFileCallbackArgs); -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/Exceptions.cs b/BizHawk.Client.Common/7z/Exceptions.cs deleted file mode 100644 index 8a8410e0d8..0000000000 --- a/BizHawk.Client.Common/7z/Exceptions.cs +++ /dev/null @@ -1,464 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -#if !WINCE -using System.Runtime.Serialization; -#endif - -namespace SevenZip -{ - /// - /// Base SevenZip exception class. - /// - [Serializable] - public class SevenZipException : Exception - { - /// - /// The message for thrown user exceptions. - /// - internal const string USER_EXCEPTION_MESSAGE = "The extraction was successful but" + - "some exceptions were thrown in your events. Check UserExceptions for details."; - - /// - /// Initializes a new instance of the SevenZipException class - /// - public SevenZipException() : base("SevenZip unknown exception.") {} - - /// - /// Initializes a new instance of the SevenZipException class - /// - /// Default exception message - public SevenZipException(string defaultMessage) - : base(defaultMessage) {} - - /// - /// Initializes a new instance of the SevenZipException class - /// - /// Default exception message - /// Additional detailed message - public SevenZipException(string defaultMessage, string message) - : base(defaultMessage + " Message: " + message) {} - - /// - /// Initializes a new instance of the SevenZipException class - /// - /// Default exception message - /// Additional detailed message - /// Inner exception occured - public SevenZipException(string defaultMessage, string message, Exception inner) - : base( - defaultMessage + (defaultMessage.EndsWith(" ", StringComparison.CurrentCulture) ? "" : " Message: ") + - message, inner) {} - - /// - /// Initializes a new instance of the SevenZipException class - /// - /// Default exception message - /// Inner exception occured - public SevenZipException(string defaultMessage, Exception inner) - : base(defaultMessage, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - -#if UNMANAGED - - /// - /// Exception class for ArchiveExtractCallback. - /// - [Serializable] - public class ExtractionFailedException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "Could not extract files!"; - - /// - /// Initializes a new instance of the ExtractionFailedException class - /// - public ExtractionFailedException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the ExtractionFailedException class - /// - /// Additional detailed message - public ExtractionFailedException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the ExtractionFailedException class - /// - /// Additional detailed message - /// Inner exception occured - public ExtractionFailedException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the ExtractionFailedException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected ExtractionFailedException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - -#if COMPRESS - - /// - /// Exception class for ArchiveUpdateCallback. - /// - [Serializable] - public class CompressionFailedException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "Could not pack files!"; - - /// - /// Initializes a new instance of the CompressionFailedException class - /// - public CompressionFailedException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the CompressionFailedException class - /// - /// Additional detailed message - public CompressionFailedException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the CompressionFailedException class - /// - /// Additional detailed message - /// Inner exception occured - public CompressionFailedException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the CompressionFailedException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected CompressionFailedException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } -#endif -#endif - - /// - /// Exception class for LZMA operations. - /// - [Serializable] - public class LzmaException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "Specified stream is not a valid LZMA compressed stream!"; - - /// - /// Initializes a new instance of the LzmaException class - /// - public LzmaException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the LzmaException class - /// - /// Additional detailed message - public LzmaException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the LzmaException class - /// - /// Additional detailed message - /// Inner exception occured - public LzmaException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the LzmaException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected LzmaException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - -#if UNMANAGED - - /// - /// Exception class for 7-zip archive open or read operations. - /// - [Serializable] - public class SevenZipArchiveException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = - "Invalid archive: open/read error! Is it encrypted and a wrong password was provided?\n" + - "If your archive is an exotic one, it is possible that SevenZipSharp has no signature for "+ - "its format and thus decided it is TAR by mistake."; - - /// - /// Initializes a new instance of the SevenZipArchiveException class - /// - public SevenZipArchiveException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the SevenZipArchiveException class - /// - /// Additional detailed message - public SevenZipArchiveException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the SevenZipArchiveException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipArchiveException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipArchiveException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipArchiveException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - - /// - /// Exception class for empty common root if file name array in SevenZipCompressor. - /// - [Serializable] - public class SevenZipInvalidFileNamesException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "Invalid file names have been specified: "; - - /// - /// Initializes a new instance of the SevenZipInvalidFileNamesException class - /// - public SevenZipInvalidFileNamesException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the SevenZipInvalidFileNamesException class - /// - /// Additional detailed message - public SevenZipInvalidFileNamesException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the SevenZipInvalidFileNamesException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipInvalidFileNamesException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipInvalidFileNamesException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipInvalidFileNamesException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - -#if COMPRESS - - /// - /// Exception class for fail to create an archive in SevenZipCompressor. - /// - [Serializable] - public class SevenZipCompressionFailedException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "The compression has failed for an unknown reason with code "; - - /// - /// Initializes a new instance of the SevenZipCompressionFailedException class - /// - public SevenZipCompressionFailedException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the SevenZipCompressionFailedException class - /// - /// Additional detailed message - public SevenZipCompressionFailedException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the SevenZipCompressionFailedException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipCompressionFailedException(string message, Exception inner) - : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipCompressionFailedException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipCompressionFailedException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } -#endif - - /// - /// Exception class for fail to extract an archive in SevenZipExtractor. - /// - [Serializable] - public class SevenZipExtractionFailedException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "The extraction has failed for an unknown reason with code "; - - /// - /// Initializes a new instance of the SevenZipExtractionFailedException class - /// - public SevenZipExtractionFailedException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the SevenZipExtractionFailedException class - /// - /// Additional detailed message - public SevenZipExtractionFailedException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the SevenZipExtractionFailedException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipExtractionFailedException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipExtractionFailedException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipExtractionFailedException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } - - /// - /// Exception class for 7-zip library operations. - /// - [Serializable] - public class SevenZipLibraryException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public const string DEFAULT_MESSAGE = "Can not load 7-zip library or internal COM error!"; - - /// - /// Initializes a new instance of the SevenZipLibraryException class - /// - public SevenZipLibraryException() : base(DEFAULT_MESSAGE) {} - - /// - /// Initializes a new instance of the SevenZipLibraryException class - /// - /// Additional detailed message - public SevenZipLibraryException(string message) : base(DEFAULT_MESSAGE, message) {} - - /// - /// Initializes a new instance of the SevenZipLibraryException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipLibraryException(string message, Exception inner) : base(DEFAULT_MESSAGE, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipLibraryException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipLibraryException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } -#endif - -#if SFX - - /// - /// Exception class for 7-zip sfx settings validation. - /// - [Serializable] - public class SevenZipSfxValidationException : SevenZipException - { - /// - /// Exception dafault message which is displayed if no extra information is specified - /// - public static readonly string DefaultMessage = "Sfx settings validation failed."; - - /// - /// Initializes a new instance of the SevenZipSfxValidationException class - /// - public SevenZipSfxValidationException() : base(DefaultMessage) {} - - /// - /// Initializes a new instance of the SevenZipSfxValidationException class - /// - /// Additional detailed message - public SevenZipSfxValidationException(string message) : base(DefaultMessage, message) {} - - /// - /// Initializes a new instance of the SevenZipSfxValidationException class - /// - /// Additional detailed message - /// Inner exception occured - public SevenZipSfxValidationException(string message, Exception inner) : base(DefaultMessage, message, inner) {} -#if !WINCE - /// - /// Initializes a new instance of the SevenZipSfxValidationException class - /// - /// All data needed for serialization or deserialization - /// Serialized stream descriptor - protected SevenZipSfxValidationException( - SerializationInfo info, StreamingContext context) - : base(info, context) {} -#endif - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/FileSignatureChecker.cs b/BizHawk.Client.Common/7z/FileSignatureChecker.cs deleted file mode 100644 index 7f89935697..0000000000 --- a/BizHawk.Client.Common/7z/FileSignatureChecker.cs +++ /dev/null @@ -1,252 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip -{ -#if UNMANAGED - /// - /// The signature checker class. Original code by Siddharth Uppal, adapted by Markhor. - /// - /// Based on the code at http://blog.somecreativity.com/2008/04/08/how-to-check-if-a-file-is-compressed-in-c/# - public static class FileChecker - { - public static bool ThrowExceptions = true; - - private const int SIGNATURE_SIZE = 16; - private const int SFX_SCAN_LENGTH = 256 * 1024; - - private static bool SpecialDetect(Stream stream, int offset, InArchiveFormat expectedFormat) - { - if (stream.Length > offset + SIGNATURE_SIZE) - { - var signature = new byte[SIGNATURE_SIZE]; - int bytesRequired = SIGNATURE_SIZE; - int index = 0; - stream.Seek(offset, SeekOrigin.Begin); - while (bytesRequired > 0) - { - int bytesRead = stream.Read(signature, index, bytesRequired); - bytesRequired -= bytesRead; - index += bytesRead; - } - string actualSignature = BitConverter.ToString(signature); - foreach (string expectedSignature in Formats.InSignatureFormats.Keys) - { - if (Formats.InSignatureFormats[expectedSignature] != expectedFormat) - { - continue; - } - if (actualSignature.StartsWith(expectedSignature, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - } - return false; - } - - /// - /// Gets the InArchiveFormat for a specific extension. - /// - /// The stream to identify. - /// The archive beginning offset. - /// True if the original format of the stream is PE; otherwise, false. - /// Corresponding InArchiveFormat. - public static InArchiveFormat CheckSignature(Stream stream, out int offset, out bool isExecutable) - { - offset = 0; - isExecutable = false; - - if (!stream.CanRead) - { - if (ThrowExceptions) - throw new ArgumentException("The stream must be readable."); - else return InArchiveFormat.None; - } - if (stream.Length < SIGNATURE_SIZE) - { - if (ThrowExceptions) - throw new ArgumentException("The stream is invalid."); - else return InArchiveFormat.None; - } - - #region Get file signature - - var signature = new byte[SIGNATURE_SIZE]; - int bytesRequired = SIGNATURE_SIZE; - int index = 0; - stream.Seek(0, SeekOrigin.Begin); - while (bytesRequired > 0) - { - int bytesRead = stream.Read(signature, index, bytesRequired); - bytesRequired -= bytesRead; - index += bytesRead; - } - string actualSignature = BitConverter.ToString(signature); - - #endregion - - InArchiveFormat suspectedFormat = InArchiveFormat.XZ; // any except PE and Cab - isExecutable = false; - - foreach (string expectedSignature in Formats.InSignatureFormats.Keys) - { - if (actualSignature.StartsWith(expectedSignature, StringComparison.OrdinalIgnoreCase) || - actualSignature.Substring(6).StartsWith(expectedSignature, StringComparison.OrdinalIgnoreCase) && - Formats.InSignatureFormats[expectedSignature] == InArchiveFormat.Lzh) - { - if (Formats.InSignatureFormats[expectedSignature] == InArchiveFormat.PE) - { - suspectedFormat = InArchiveFormat.PE; - isExecutable = true; - } - else - { - return Formats.InSignatureFormats[expectedSignature]; - } - } - } - - // Many Microsoft formats - if (actualSignature.StartsWith("D0-CF-11-E0-A1-B1-1A-E1", StringComparison.OrdinalIgnoreCase)) - { - suspectedFormat = InArchiveFormat.Cab; // != InArchiveFormat.XZ - } - - #region SpecialDetect - try - { - SpecialDetect(stream, 257, InArchiveFormat.Tar); - } - catch (ArgumentException) {} - if (SpecialDetect(stream, 0x8001, InArchiveFormat.Iso)) - { - return InArchiveFormat.Iso; - } - if (SpecialDetect(stream, 0x8801, InArchiveFormat.Iso)) - { - return InArchiveFormat.Iso; - } - if (SpecialDetect(stream, 0x9001, InArchiveFormat.Iso)) - { - return InArchiveFormat.Iso; - } - if (SpecialDetect(stream, 0x9001, InArchiveFormat.Iso)) - { - return InArchiveFormat.Iso; - } - if (SpecialDetect(stream, 0x400, InArchiveFormat.Hfs)) - { - return InArchiveFormat.Hfs; - } - #region Last resort for tar - can mistake - if (stream.Length >= 1024) - { - stream.Seek(-1024, SeekOrigin.End); - byte[] buf = new byte[1024]; - stream.Read(buf, 0, 1024); - bool istar = true; - for (int i = 0; i < 1024; i++) - { - istar = istar && buf[i] == 0; - } - if (istar) - { - return InArchiveFormat.Tar; - } - } - #endregion - #endregion - - #region Check if it is an SFX archive or a file with an embedded archive. - if (suspectedFormat != InArchiveFormat.XZ) - { - #region Get first Min(stream.Length, SFX_SCAN_LENGTH) bytes - var scanLength = Math.Min(stream.Length, SFX_SCAN_LENGTH); - signature = new byte[scanLength]; - bytesRequired = (int)scanLength; - index = 0; - stream.Seek(0, SeekOrigin.Begin); - while (bytesRequired > 0) - { - int bytesRead = stream.Read(signature, index, bytesRequired); - bytesRequired -= bytesRead; - index += bytesRead; - } - actualSignature = BitConverter.ToString(signature); - #endregion - - foreach (var format in new InArchiveFormat[] - { - InArchiveFormat.Zip, - InArchiveFormat.SevenZip, - InArchiveFormat.Rar, - InArchiveFormat.Cab, - InArchiveFormat.Arj - }) - { - int pos = actualSignature.IndexOf(Formats.InSignatureFormatsReversed[format]); - if (pos > -1) - { - offset = pos / 3; - return format; - } - } - // Nothing - if (suspectedFormat == InArchiveFormat.PE) - { - return InArchiveFormat.PE; - } - } - #endregion - - if (ThrowExceptions) - throw new ArgumentException("The stream is invalid or no corresponding signature was found."); - else return InArchiveFormat.None; - } - - /// - /// Gets the InArchiveFormat for a specific file name. - /// - /// The archive file name. - /// The archive beginning offset. - /// True if the original format of the file is PE; otherwise, false. - /// Corresponding InArchiveFormat. - /// - public static InArchiveFormat CheckSignature(string fileName, out int offset, out bool isExecutable) - { - using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - try - { - InArchiveFormat format = CheckSignature(fs, out offset, out isExecutable); - if (format != InArchiveFormat.None) return format; - } - catch (ArgumentException) - { - } - - offset = 0; - isExecutable = false; - return Formats.FormatByFileName(fileName, true); - } - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/Formats.cs b/BizHawk.Client.Common/7z/Formats.cs deleted file mode 100644 index bd978baf18..0000000000 --- a/BizHawk.Client.Common/7z/Formats.cs +++ /dev/null @@ -1,540 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.IO; - -namespace SevenZip -{ -#if UNMANAGED - /// - /// Readable archive format enumeration. - /// - public enum InArchiveFormat - { - /// - /// Open 7-zip archive format. - /// - /// Wikipedia information - SevenZip, - /// - /// Proprietary Arj archive format. - /// - /// Wikipedia information - Arj, - /// - /// Open Bzip2 archive format. - /// - /// Wikipedia information - BZip2, - /// - /// Microsoft cabinet archive format. - /// - /// Wikipedia information - Cab, - /// - /// Microsoft Compiled HTML Help file format. - /// - /// Wikipedia information - Chm, - /// - /// Microsoft Compound file format. - /// - /// Wikipedia information - Compound, - /// - /// Open Cpio archive format. - /// - /// Wikipedia information - Cpio, - /// - /// Open Debian software package format. - /// - /// Wikipedia information - Deb, - /// - /// Open Gzip archive format. - /// - /// Wikipedia information - GZip, - /// - /// Open ISO disk image format. - /// - /// Wikipedia information - Iso, - /// - /// Open Lzh archive format. - /// - /// Wikipedia information - Lzh, - /// - /// Open core 7-zip Lzma raw archive format. - /// - /// Wikipedia information - Lzma, - /// - /// Nullsoft installation package format. - /// - /// Wikipedia information - Nsis, - /// - /// RarLab Rar archive format. - /// - /// Wikipedia information - Rar, - /// - /// Open Rpm software package format. - /// - /// Wikipedia information - Rpm, - /// - /// Open split file format. - /// - /// Wikipedia information - Split, - /// - /// Open Tar archive format. - /// - /// Wikipedia information - Tar, - /// - /// Microsoft Windows Imaging disk image format. - /// - /// Wikipedia information - Wim, - /// - /// Open LZW archive format; implemented in "compress" program; also known as "Z" archive format. - /// - /// Wikipedia information - Lzw, - /// - /// Open Zip archive format. - /// - /// Wikipedia information - Zip, - /// - /// Open Udf disk image format. - /// - Udf, - /// - /// Xar open source archive format. - /// - /// Wikipedia information - Xar, - /// - /// Mub - /// - Mub, - /// - /// Macintosh Disk Image on CD. - /// - /// Wikipedia information - Hfs, - /// - /// Apple Mac OS X Disk Copy Disk Image format. - /// - Dmg, - /// - /// Open Xz archive format. - /// - /// Wikipedia information - XZ, - /// - /// MSLZ archive format. - /// - Mslz, - /// - /// Flash video format. - /// - /// Wikipedia information - Flv, - /// - /// Shockwave Flash format. - /// - /// Wikipedia information - Swf, - /// - /// Windows PE executable format. - /// - /// Wikipedia information - PE, - /// - /// Linux executable Elf format. - /// - /// Wikipedia information - Elf, - /// - /// Windows Installer Database. - /// - /// Wikipedia information - Msi, - /// - /// Microsoft virtual hard disk file format. - /// - /// Wikipedia information - Vhd, - /// - /// Not an archive - /// - None - } - -#if COMPRESS - /// - /// Writable archive format enumeration. - /// - public enum OutArchiveFormat - { - /// - /// Open 7-zip archive format. - /// - /// Wikipedia information - SevenZip, - /// - /// Open Zip archive format. - /// - /// Wikipedia information - Zip, - /// - /// Open Gzip archive format. - /// - /// Wikipedia information - GZip, - /// - /// Open Bzip2 archive format. - /// - /// Wikipedia information - BZip2, - /// - /// Open Tar archive format. - /// - /// Wikipedia information - Tar, - /// - /// Open Xz archive format. - /// - /// Wikipedia information - XZ - } - - /// - /// Compression level enumeration - /// - public enum CompressionLevel - { - /// - /// No compression - /// - None, - /// - /// Very low compression level - /// - Fast, - /// - /// Low compression level - /// - Low, - /// - /// Normal compression level (default) - /// - Normal, - /// - /// High compression level - /// - High, - /// - /// The best compression level (slow) - /// - Ultra - } - - /// - /// Compression method enumeration. - /// - /// Some methods are applicable only to Zip format, some - only to 7-zip. - public enum CompressionMethod - { - /// - /// Zip or 7-zip|no compression method. - /// - Copy, - /// - /// Zip|Deflate method. - /// - Deflate, - /// - /// Zip|Deflate64 method. - /// - Deflate64, - /// - /// Zip or 7-zip|Bzip2 method. - /// - /// Wikipedia information - BZip2, - /// - /// Zip or 7-zip|LZMA method based on Lempel-Ziv algorithm, it is default for 7-zip. - /// - Lzma, - /// - /// 7-zip|LZMA version 2, LZMA with improved multithreading and usually slight archive size decrease. - /// - Lzma2, - /// - /// Zip or 7-zip|PPMd method based on Dmitry Shkarin's PPMdH source code, very efficient for compressing texts. - /// - /// Wikipedia information - Ppmd, - /// - /// No method change. - /// - Default - } -#endif - - /// - /// Archive format routines - /// - public static class Formats - { - /*/// - /// Gets the max value of the specified enum type. - /// - /// Type of the enum - /// Max value - internal static int GetMaxValue(Type type) - { - List enumList = new List((IEnumerable)Enum.GetValues(type)); - enumList.Sort(); - return enumList[enumList.Count - 1]; - }*/ - - /// - /// List of readable archive format interface guids for 7-zip COM interop. - /// - internal static readonly Dictionary InFormatGuids = - new Dictionary(20) - #region InFormatGuids initialization - - { - {InArchiveFormat.SevenZip, new Guid("23170f69-40c1-278a-1000-000110070000")}, - {InArchiveFormat.Arj, new Guid("23170f69-40c1-278a-1000-000110040000")}, - {InArchiveFormat.BZip2, new Guid("23170f69-40c1-278a-1000-000110020000")}, - {InArchiveFormat.Cab, new Guid("23170f69-40c1-278a-1000-000110080000")}, - {InArchiveFormat.Chm, new Guid("23170f69-40c1-278a-1000-000110e90000")}, - {InArchiveFormat.Compound, new Guid("23170f69-40c1-278a-1000-000110e50000")}, - {InArchiveFormat.Cpio, new Guid("23170f69-40c1-278a-1000-000110ed0000")}, - {InArchiveFormat.Deb, new Guid("23170f69-40c1-278a-1000-000110ec0000")}, - {InArchiveFormat.GZip, new Guid("23170f69-40c1-278a-1000-000110ef0000")}, - {InArchiveFormat.Iso, new Guid("23170f69-40c1-278a-1000-000110e70000")}, - {InArchiveFormat.Lzh, new Guid("23170f69-40c1-278a-1000-000110060000")}, - {InArchiveFormat.Lzma, new Guid("23170f69-40c1-278a-1000-0001100a0000")}, - {InArchiveFormat.Nsis, new Guid("23170f69-40c1-278a-1000-000110090000")}, - {InArchiveFormat.Rar, new Guid("23170f69-40c1-278a-1000-000110030000")}, - {InArchiveFormat.Rpm, new Guid("23170f69-40c1-278a-1000-000110eb0000")}, - {InArchiveFormat.Split, new Guid("23170f69-40c1-278a-1000-000110ea0000")}, - {InArchiveFormat.Tar, new Guid("23170f69-40c1-278a-1000-000110ee0000")}, - {InArchiveFormat.Wim, new Guid("23170f69-40c1-278a-1000-000110e60000")}, - {InArchiveFormat.Lzw, new Guid("23170f69-40c1-278a-1000-000110050000")}, - {InArchiveFormat.Zip, new Guid("23170f69-40c1-278a-1000-000110010000")}, - {InArchiveFormat.Udf, new Guid("23170f69-40c1-278a-1000-000110E00000")}, - {InArchiveFormat.Xar, new Guid("23170f69-40c1-278a-1000-000110E10000")}, - {InArchiveFormat.Mub, new Guid("23170f69-40c1-278a-1000-000110E20000")}, - {InArchiveFormat.Hfs, new Guid("23170f69-40c1-278a-1000-000110E30000")}, - {InArchiveFormat.Dmg, new Guid("23170f69-40c1-278a-1000-000110E40000")}, - {InArchiveFormat.XZ, new Guid("23170f69-40c1-278a-1000-0001100C0000")}, - {InArchiveFormat.Mslz, new Guid("23170f69-40c1-278a-1000-000110D50000")}, - {InArchiveFormat.PE, new Guid("23170f69-40c1-278a-1000-000110DD0000")}, - {InArchiveFormat.Elf, new Guid("23170f69-40c1-278a-1000-000110DE0000")}, - {InArchiveFormat.Swf, new Guid("23170f69-40c1-278a-1000-000110D70000")}, - {InArchiveFormat.Vhd, new Guid("23170f69-40c1-278a-1000-000110DC0000")} - }; - - #endregion - -#if COMPRESS - /// - /// List of writable archive format interface guids for 7-zip COM interop. - /// - internal static readonly Dictionary OutFormatGuids = - new Dictionary(2) - #region OutFormatGuids initialization - - { - {OutArchiveFormat.SevenZip, new Guid("23170f69-40c1-278a-1000-000110070000")}, - {OutArchiveFormat.Zip, new Guid("23170f69-40c1-278a-1000-000110010000")}, - {OutArchiveFormat.BZip2, new Guid("23170f69-40c1-278a-1000-000110020000")}, - {OutArchiveFormat.GZip, new Guid("23170f69-40c1-278a-1000-000110ef0000")}, - {OutArchiveFormat.Tar, new Guid("23170f69-40c1-278a-1000-000110ee0000")}, - {OutArchiveFormat.XZ, new Guid("23170f69-40c1-278a-1000-0001100C0000")}, - }; - - #endregion - - internal static readonly Dictionary MethodNames = - new Dictionary(6) - #region MethodNames initialization - - { - {CompressionMethod.Copy, "Copy"}, - {CompressionMethod.Deflate, "Deflate"}, - {CompressionMethod.Deflate64, "Deflate64"}, - {CompressionMethod.Lzma, "LZMA"}, - {CompressionMethod.Lzma2, "LZMA2"}, - {CompressionMethod.Ppmd, "PPMd"}, - {CompressionMethod.BZip2, "BZip2"} - }; - - #endregion - - internal static readonly Dictionary InForOutFormats = - new Dictionary(6) - #region InForOutFormats initialization - - { - {OutArchiveFormat.SevenZip, InArchiveFormat.SevenZip}, - {OutArchiveFormat.GZip, InArchiveFormat.GZip}, - {OutArchiveFormat.BZip2, InArchiveFormat.BZip2}, - {OutArchiveFormat.Tar, InArchiveFormat.Tar}, - {OutArchiveFormat.XZ, InArchiveFormat.XZ}, - {OutArchiveFormat.Zip, InArchiveFormat.Zip} - }; - - #endregion - -#endif - - /// - /// List of archive formats corresponding to specific extensions - /// - private static readonly Dictionary InExtensionFormats = - new Dictionary - #region InExtensionFormats initialization - - {{"7z", InArchiveFormat.SevenZip}, - {"gz", InArchiveFormat.GZip}, - {"tar", InArchiveFormat.Tar}, - {"rar", InArchiveFormat.Rar}, - {"zip", InArchiveFormat.Zip}, - {"lzma", InArchiveFormat.Lzma}, - {"lzh", InArchiveFormat.Lzh}, - {"arj", InArchiveFormat.Arj}, - {"bz2", InArchiveFormat.BZip2}, - {"cab", InArchiveFormat.Cab}, - {"chm", InArchiveFormat.Chm}, - {"deb", InArchiveFormat.Deb}, - {"iso", InArchiveFormat.Iso}, - {"rpm", InArchiveFormat.Rpm}, - {"wim", InArchiveFormat.Wim}, - {"udf", InArchiveFormat.Udf}, - {"mub", InArchiveFormat.Mub}, - {"xar", InArchiveFormat.Xar}, - {"hfs", InArchiveFormat.Hfs}, - {"dmg", InArchiveFormat.Dmg}, - {"Z", InArchiveFormat.Lzw}, - {"xz", InArchiveFormat.XZ}, - {"flv", InArchiveFormat.Flv}, - {"swf", InArchiveFormat.Swf}, - {"exe", InArchiveFormat.PE}, - {"dll", InArchiveFormat.PE}, - {"vhd", InArchiveFormat.Vhd} - }; - - #endregion - - /// - /// List of archive formats corresponding to specific signatures - /// - /// Based on the information at this site. - internal static readonly Dictionary InSignatureFormats = - new Dictionary - #region InSignatureFormats initialization - - {{"37-7A-BC-AF-27-1C", InArchiveFormat.SevenZip}, - {"1F-8B-08", InArchiveFormat.GZip}, - {"75-73-74-61-72", InArchiveFormat.Tar}, - //257 byte offset - {"52-61-72-21-1A-07-00", InArchiveFormat.Rar}, - {"50-4B-03-04", InArchiveFormat.Zip}, - {"5D-00-00-40-00", InArchiveFormat.Lzma}, - {"2D-6C-68", InArchiveFormat.Lzh}, - //^ 2 byte offset - {"1F-9D-90", InArchiveFormat.Lzw}, - {"60-EA", InArchiveFormat.Arj}, - {"42-5A-68", InArchiveFormat.BZip2}, - //{"4D-53-43-46", InArchiveFormat.Cab}, - //{"49-54-53-46", InArchiveFormat.Chm}, - //{"21-3C-61-72-63-68-3E-0A-64-65-62-69-61-6E-2D-62-69-6E-61-72-79", InArchiveFormat.Deb}, - //{"43-44-30-30-31", InArchiveFormat.Iso}, - //^ 0x8001, 0x8801 or 0x9001 byte offset - //{"ED-AB-EE-DB", InArchiveFormat.Rpm}, - //{"4D-53-57-49-4D-00-00-00", InArchiveFormat.Wim}, - //{"udf", InArchiveFormat.Udf}, - //{"mub", InArchiveFormat.Mub}, - //{"78-61-72-21", InArchiveFormat.Xar}, - //0x400 byte offset - //{"48-2B", InArchiveFormat.Hfs}, - {"FD-37-7A-58-5A", InArchiveFormat.XZ}, - //{"46-4C-56", InArchiveFormat.Flv}, - //{"46-57-53", InArchiveFormat.Swf}, - //{"4D-5A", InArchiveFormat.PE}, - //{"7F-45-4C-46", InArchiveFormat.Elf}, - //{"78", InArchiveFormat.Dmg}, - //{"63-6F-6E-65-63-74-69-78", InArchiveFormat.Vhd}, - {"4E-45-53", InArchiveFormat.None} - }; - - #endregion - - internal static Dictionary InSignatureFormatsReversed; - - static Formats() - { - InSignatureFormatsReversed = new Dictionary(InSignatureFormats.Count); - foreach (var pair in InSignatureFormats) - { - InSignatureFormatsReversed.Add(pair.Value, pair.Key); - } - } - - /// - /// Gets InArchiveFormat for specified archive file name - /// - /// Archive file name - /// Indicates whether to throw exceptions - /// InArchiveFormat recognized by the file name extension - /// - public static InArchiveFormat FormatByFileName(string fileName, bool reportErrors) - { - if (String.IsNullOrEmpty(fileName) && reportErrors) - { - throw new ArgumentException("File name is null or empty string!"); - } - string extension = Path.GetExtension(fileName); - if (extension.StartsWith(".")) - extension = extension.Substring(1); - if (!InExtensionFormats.ContainsKey(extension) && reportErrors) - { - if (FileChecker.ThrowExceptions) - throw new ArgumentException("Extension \"" + extension + "\" is not a supported archive file name extension."); - else return InArchiveFormat.None; - - } - return InExtensionFormats[extension]; - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/LibraryFeature.cs b/BizHawk.Client.Common/7z/LibraryFeature.cs deleted file mode 100644 index fdc1d5a3bf..0000000000 --- a/BizHawk.Client.Common/7z/LibraryFeature.cs +++ /dev/null @@ -1,112 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; - -namespace SevenZip -{ - /// - /// The set of features supported by the library. - /// - [Flags] - public enum LibraryFeature : uint - { - /// - /// Default feature. - /// - None = 0, - /// - /// The library can extract 7zip archives compressed with LZMA method. - /// - Extract7z = 0x1, - /// - /// The library can extract 7zip archives compressed with LZMA2 method. - /// - Extract7zLZMA2 = 0x2, - /// - /// The library can extract 7z archives compressed with all known methods. - /// - Extract7zAll = Extract7z|Extract7zLZMA2|0x4, - /// - /// The library can extract zip archives. - /// - ExtractZip = 0x8, - /// - /// The library can extract rar archives. - /// - ExtractRar = 0x10, - /// - /// The library can extract gzip archives. - /// - ExtractGzip = 0x20, - /// - /// The library can extract bzip2 archives. - /// - ExtractBzip2 = 0x40, - /// - /// The library can extract tar archives. - /// - ExtractTar = 0x80, - /// - /// The library can extract xz archives. - /// - ExtractXz = 0x100, - /// - /// The library can extract all types of archives supported. - /// - ExtractAll = Extract7zAll|ExtractZip|ExtractRar|ExtractGzip|ExtractBzip2|ExtractTar|ExtractXz, - /// - /// The library can compress data to 7zip archives with LZMA method. - /// - Compress7z = 0x200, - /// - /// The library can compress data to 7zip archives with LZMA2 method. - /// - Compress7zLZMA2 = 0x400, - /// - /// The library can compress data to 7zip archives with all methods known. - /// - Compress7zAll = Compress7z|Compress7zLZMA2|0x800, - /// - /// The library can compress data to tar archives. - /// - CompressTar = 0x1000, - /// - /// The library can compress data to gzip archives. - /// - CompressGzip = 0x2000, - /// - /// The library can compress data to bzip2 archives. - /// - CompressBzip2 = 0x4000, - /// - /// The library can compress data to xz archives. - /// - CompressXz = 0x8000, - /// - /// The library can compress data to zip archives. - /// - CompressZip = 0x10000, - /// - /// The library can compress data to all types of archives supported. - /// - CompressAll = Compress7zAll|CompressTar|CompressGzip|CompressBzip2|CompressXz|CompressZip, - /// - /// The library can modify archives. - /// - Modify = 0x20000 - } -} diff --git a/BizHawk.Client.Common/7z/LibraryManager.cs b/BizHawk.Client.Common/7z/LibraryManager.cs deleted file mode 100644 index ac0aedd2ee..0000000000 --- a/BizHawk.Client.Common/7z/LibraryManager.cs +++ /dev/null @@ -1,591 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using BizHawk.Common; - -using System; -using System.Collections.Generic; -#if !WINCE && !MONO -using System.Configuration; -using System.Diagnostics; -using System.Security.Permissions; -#endif -#if WINCE -using OpenNETCF.Diagnostics; -#endif -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Text; -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if UNMANAGED - /// - /// 7-zip library low-level wrapper. - /// - internal static class SevenZipLibraryManager - { - /// - /// Synchronization root for all locking. - /// - private static readonly object _syncRoot = new object(); - -#if !WINCE && !MONO - - //zero 07-jul-2014 - no sense for this industrial strength enterprise bullshit. lets just hack it to our needs. - //NOTE - I think we hacked this originally.. it was this way from the initial commit, perhaps it had already been modified for our use - - /// - /// Path to the 7-zip dll. - /// - /// 7zxa.dll supports only decoding from .7z archives. - /// Features of 7za.dll: - /// - Supporting 7z format; - /// - Built encoders: LZMA, PPMD, BCJ, BCJ2, COPY, AES-256 Encryption. - /// - Built decoders: LZMA, PPMD, BCJ, BCJ2, COPY, AES-256 Encryption, BZip2, Deflate. - /// 7z.dll (from the 7-zip distribution) supports every InArchiveFormat for encoding and decoding. - /// - //private static string _libraryFileName = ConfigurationManager.AppSettings["7zLocation"] ?? Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll"); - private static string _libraryFileName = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "dll\\7z.dll"); - -#endif -#if WINCE - private static string _libraryFileName = - Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase), "7z.dll"); -#endif - /// - /// 7-zip library handle. - /// - private static IntPtr _modulePtr; - - /// - /// 7-zip library features. - /// - private static LibraryFeature? _features; - - private static Dictionary> _inArchives; -#if COMPRESS - private static Dictionary> _outArchives; -#endif - private static int _totalUsers; - - // private static string _LibraryVersion; - private static bool? _modifyCapabale; - - private static readonly PlatformLinkedLibSingleton.PlatformLinkedLibManager libLoader = PlatformLinkedLibSingleton.LinkedLibManager; - - private static void InitUserInFormat(object user, InArchiveFormat format) - { - if (!_inArchives.ContainsKey(user)) - { - _inArchives.Add(user, new Dictionary()); - } - if (!_inArchives[user].ContainsKey(format)) - { - _inArchives[user].Add(format, null); - _totalUsers++; - } - } - -#if COMPRESS - private static void InitUserOutFormat(object user, OutArchiveFormat format) - { - if (!_outArchives.ContainsKey(user)) - { - _outArchives.Add(user, new Dictionary()); - } - if (!_outArchives[user].ContainsKey(format)) - { - _outArchives[user].Add(format, null); - _totalUsers++; - } - } -#endif - - private static void Init() - { - _inArchives = new Dictionary>(); -#if COMPRESS - _outArchives = new Dictionary>(); -#endif - } - - /// - /// Loads the 7-zip library if necessary and adds user to the reference list - /// - /// Caller of the function - /// Archive format - public static void LoadLibrary(object user, Enum format) - { - lock (_syncRoot) - { - if (_inArchives == null -#if COMPRESS - || _outArchives == null -#endif - ) - { - Init(); - } -#if !WINCE && !MONO - if (_modulePtr == IntPtr.Zero) - { - //zero 29-oct-2012 - this check isnt useful since LoadLibrary can pretty much check for the same thing. and it wrecks our dll relocation scheme - //if (!File.Exists(_libraryFileName)) - //{ - // throw new SevenZipLibraryException("DLL file does not exist."); - //} - if ((_modulePtr = libLoader.LoadPlatformSpecific(_libraryFileName)) == IntPtr.Zero) - { - //try a different directory - string alternateFilename = Path.Combine(Path.Combine(Path.GetDirectoryName(_libraryFileName),"dll"),"7z.dll"); - if ((_modulePtr = libLoader.LoadPlatformSpecific(alternateFilename)) == IntPtr.Zero) - throw new SevenZipLibraryException("failed to load library."); - } - if (libLoader.GetProcAddr(_modulePtr, "GetHandlerProperty") == IntPtr.Zero) - { - libLoader.FreePlatformSpecific(_modulePtr); - throw new SevenZipLibraryException("library is invalid."); - } - } -#endif - if (format is InArchiveFormat) - { - InitUserInFormat(user, (InArchiveFormat) format); - return; - } -#if COMPRESS - if (format is OutArchiveFormat) - { - InitUserOutFormat(user, (OutArchiveFormat) format); - return; - } -#endif - throw new ArgumentException( - "Enum " + format + " is not a valid archive format attribute!"); - } - - } - - /*/// - /// Gets the native 7zip library version string. - /// - public static string LibraryVersion - { - get - { - if (String.IsNullOrEmpty(_LibraryVersion)) - { - FileVersionInfo dllVersionInfo = FileVersionInfo.GetVersionInfo(_libraryFileName); - _LibraryVersion = String.Format( - System.Globalization.CultureInfo.CurrentCulture, - "{0}.{1}", - dllVersionInfo.FileMajorPart, dllVersionInfo.FileMinorPart); - } - return _LibraryVersion; - } - }*/ - - /// - /// Gets the value indicating whether the library supports modifying archives. - /// - public static bool ModifyCapable - { - get - { - lock (_syncRoot) - { - if (!_modifyCapabale.HasValue) - { -#if !WINCE && !MONO - FileVersionInfo dllVersionInfo = FileVersionInfo.GetVersionInfo(_libraryFileName); - _modifyCapabale = dllVersionInfo.FileMajorPart >= 9; -#else - _modifyCapabale = true; -#endif - } - return _modifyCapabale.Value; - } - } - } - //static readonly string Namespace = Assembly.GetExecutingAssembly().GetManifestResourceNames()[0].Split('.')[0]; - static readonly string Namespace = "BizHawk"; //Remove dirty hack above - - private static string GetResourceString(string str) - { - return Namespace + ".arch." + str; - } - - private static bool ExtractionBenchmark(string archiveFileName, Stream outStream, - ref LibraryFeature? features, LibraryFeature testedFeature) - { - var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream( - GetResourceString(archiveFileName)); - try - { - using (var extr = new SevenZipExtractor(stream)) - { - extr.ExtractFile(0, outStream); - } - } - catch (Exception) - { - return false; - } - features |= testedFeature; - return true; - } - - private static bool CompressionBenchmark(Stream inStream, Stream outStream, - OutArchiveFormat format, CompressionMethod method, - ref LibraryFeature? features, LibraryFeature testedFeature) - { - try - { - var compr = new SevenZipCompressor { ArchiveFormat = format, CompressionMethod = method }; - compr.CompressStream(inStream, outStream); - } - catch (Exception) - { - return false; - } - features |= testedFeature; - return true; - } - - public static LibraryFeature CurrentLibraryFeatures - { - get - { - lock (_syncRoot) - { - if (_features != null && _features.HasValue) - { - return _features.Value; - } - _features = LibraryFeature.None; - #region Benchmark - #region Extraction features - using (var outStream = new MemoryStream()) - { - ExtractionBenchmark("Test.lzma.7z", outStream, ref _features, LibraryFeature.Extract7z); - ExtractionBenchmark("Test.lzma2.7z", outStream, ref _features, LibraryFeature.Extract7zLZMA2); - int i = 0; - if (ExtractionBenchmark("Test.bzip2.7z", outStream, ref _features, _features.Value)) - { - i++; - } - if (ExtractionBenchmark("Test.ppmd.7z", outStream, ref _features, _features.Value)) - { - i++; - if (i == 2 && (_features & LibraryFeature.Extract7z) != 0 && - (_features & LibraryFeature.Extract7zLZMA2) != 0) - { - _features |= LibraryFeature.Extract7zAll; - } - } - ExtractionBenchmark("Test.rar", outStream, ref _features, LibraryFeature.ExtractRar); - ExtractionBenchmark("Test.tar", outStream, ref _features, LibraryFeature.ExtractTar); - ExtractionBenchmark("Test.txt.bz2", outStream, ref _features, LibraryFeature.ExtractBzip2); - ExtractionBenchmark("Test.txt.gz", outStream, ref _features, LibraryFeature.ExtractGzip); - ExtractionBenchmark("Test.txt.xz", outStream, ref _features, LibraryFeature.ExtractXz); - ExtractionBenchmark("Test.zip", outStream, ref _features, LibraryFeature.ExtractZip); - } - #endregion - #region Compression features - using (var inStream = new MemoryStream()) - { - inStream.Write(Encoding.UTF8.GetBytes("Test"), 0, 4); - using (var outStream = new MemoryStream()) - { - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.SevenZip, CompressionMethod.Lzma, - ref _features, LibraryFeature.Compress7z); - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.SevenZip, CompressionMethod.Lzma2, - ref _features, LibraryFeature.Compress7zLZMA2); - int i = 0; - if (CompressionBenchmark(inStream, outStream, - OutArchiveFormat.SevenZip, CompressionMethod.BZip2, - ref _features, _features.Value)) - { - i++; - } - if (CompressionBenchmark(inStream, outStream, - OutArchiveFormat.SevenZip, CompressionMethod.Ppmd, - ref _features, _features.Value)) - { - i++; - if (i == 2 && (_features & LibraryFeature.Compress7z) != 0 && - (_features & LibraryFeature.Compress7zLZMA2) != 0) - { - _features |= LibraryFeature.Compress7zAll; - } - } - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.Zip, CompressionMethod.Default, - ref _features, LibraryFeature.CompressZip); - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.BZip2, CompressionMethod.Default, - ref _features, LibraryFeature.CompressBzip2); - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.GZip, CompressionMethod.Default, - ref _features, LibraryFeature.CompressGzip); - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.Tar, CompressionMethod.Default, - ref _features, LibraryFeature.CompressTar); - CompressionBenchmark(inStream, outStream, - OutArchiveFormat.XZ, CompressionMethod.Default, - ref _features, LibraryFeature.CompressXz); - } - } - #endregion - #endregion - if (ModifyCapable && (_features.Value & LibraryFeature.Compress7z) != 0) - { - _features |= LibraryFeature.Modify; - } - return _features.Value; - } - } - } - - /// - /// Removes user from reference list and frees the 7-zip library if it becomes empty - /// - /// Caller of the function - /// Archive format - public static void FreeLibrary(object user, Enum format) - { -#if !WINCE && !MONO - var sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); - sp.Demand(); -#endif - lock (_syncRoot) - { - if (_modulePtr != IntPtr.Zero) - { - if (format is InArchiveFormat) - { - if (_inArchives != null && _inArchives.ContainsKey(user) && - _inArchives[user].ContainsKey((InArchiveFormat) format) && - _inArchives[user][(InArchiveFormat) format] != null) - { - try - { - Marshal.ReleaseComObject(_inArchives[user][(InArchiveFormat) format]); - } - catch (InvalidComObjectException) {} - _inArchives[user].Remove((InArchiveFormat) format); - _totalUsers--; - if (_inArchives[user].Count == 0) - { - _inArchives.Remove(user); - } - } - } -#if COMPRESS - if (format is OutArchiveFormat) - { - if (_outArchives != null && _outArchives.ContainsKey(user) && - _outArchives[user].ContainsKey((OutArchiveFormat) format) && - _outArchives[user][(OutArchiveFormat) format] != null) - { - try - { - Marshal.ReleaseComObject(_outArchives[user][(OutArchiveFormat) format]); - } - catch (InvalidComObjectException) {} - _outArchives[user].Remove((OutArchiveFormat) format); - _totalUsers--; - if (_outArchives[user].Count == 0) - { - _outArchives.Remove(user); - } - } - } -#endif - if ((_inArchives == null || _inArchives.Count == 0) -#if COMPRESS - && (_outArchives == null || _outArchives.Count == 0) -#endif - ) - { - _inArchives = null; -#if COMPRESS - _outArchives = null; -#endif - if (_totalUsers == 0) - { -#if !WINCE && !MONO - libLoader.FreePlatformSpecific(_modulePtr); - -#endif - _modulePtr = IntPtr.Zero; - } - } - } - } - } - - /// - /// Gets IInArchive interface to extract 7-zip archives. - /// - /// Archive format. - /// Archive format user. - public static IInArchive InArchive(InArchiveFormat format, object user) - { - lock (_syncRoot) - { - if (_inArchives[user][format] == null) - { -#if !WINCE && !MONO - var sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); - sp.Demand(); - - if (_modulePtr == IntPtr.Zero) - { - LoadLibrary(user, format); - if (_modulePtr == IntPtr.Zero) - { - throw new SevenZipLibraryException(); - } - } - var createObject = (NativeMethods.CreateObjectDelegate) - Marshal.GetDelegateForFunctionPointer( - libLoader.GetProcAddr(_modulePtr, "CreateObject"), - typeof(NativeMethods.CreateObjectDelegate)); - if (createObject == null) - { - throw new SevenZipLibraryException(); - } -#endif - object result; - Guid interfaceId = -#if !WINCE && !MONO - typeof(IInArchive).GUID; -#else - new Guid(((GuidAttribute)typeof(IInArchive).GetCustomAttributes(typeof(GuidAttribute), false)[0]).Value); -#endif - Guid classID = Formats.InFormatGuids[format]; - try - { -#if !WINCE && !MONO - createObject(ref classID, ref interfaceId, out result); -#elif !MONO - NativeMethods.CreateCOMObject(ref classID, ref interfaceId, out result); -#else - result = SevenZip.Mono.Factory.CreateInterface(user, classID, interfaceId); -#endif - } - catch (Exception) - { - throw new SevenZipLibraryException("Your 7-zip library does not support this archive type."); - } - InitUserInFormat(user, format); - _inArchives[user][format] = result as IInArchive; - } - return _inArchives[user][format]; -#if !WINCE && !MONO - } -#endif - } - -#if COMPRESS - /// - /// Gets IOutArchive interface to pack 7-zip archives. - /// - /// Archive format. - /// Archive format user. - public static IOutArchive OutArchive(OutArchiveFormat format, object user) - { - lock (_syncRoot) - { - if (_outArchives[user][format] == null) - { -#if !WINCE && !MONO - var sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); - sp.Demand(); - if (_modulePtr == IntPtr.Zero) - { - throw new SevenZipLibraryException(); - } - var createObject = (NativeMethods.CreateObjectDelegate) - Marshal.GetDelegateForFunctionPointer( - libLoader.GetProcAddr(_modulePtr, "CreateObject"), - typeof(NativeMethods.CreateObjectDelegate)); - if (createObject == null) - { - throw new SevenZipLibraryException(); - } -#endif - object result; - Guid interfaceId = -#if !WINCE && !MONO - typeof(IOutArchive).GUID; -#else - new Guid(((GuidAttribute)typeof(IOutArchive).GetCustomAttributes(typeof(GuidAttribute), false)[0]).Value); -#endif - Guid classID = Formats.OutFormatGuids[format]; - try - { -#if !WINCE && !MONO - createObject(ref classID, ref interfaceId, out result); -#elif !MONO - NativeMethods.CreateCOMObject(ref classID, ref interfaceId, out result); -#else - result = SevenZip.Mono.Factory.CreateInterface(classID, interfaceId, user); -#endif - } - catch (Exception) - { - throw new SevenZipLibraryException("Your 7-zip library does not support this archive type."); - } - InitUserOutFormat(user, format); - _outArchives[user][format] = result as IOutArchive; - } - return _outArchives[user][format]; -#if !WINCE && !MONO - } -#endif - - } -#endif -#if !WINCE && !MONO - public static void SetLibraryPath(string libraryPath) - { - if (_modulePtr != IntPtr.Zero && !Path.GetFullPath(libraryPath).Equals( - Path.GetFullPath(_libraryFileName), StringComparison.OrdinalIgnoreCase)) - { - throw new SevenZipLibraryException( - "can not change the library path while the library \"" + _libraryFileName + "\" is being used."); - } - if (!File.Exists(libraryPath)) - { - throw new SevenZipLibraryException( - "can not change the library path because the file \"" + libraryPath + "\" does not exist."); - } - _libraryFileName = libraryPath; - _features = null; - } -#endif - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/LzmaDecodeStream.cs b/BizHawk.Client.Common/7z/LzmaDecodeStream.cs deleted file mode 100644 index 16946d5a1a..0000000000 --- a/BizHawk.Client.Common/7z/LzmaDecodeStream.cs +++ /dev/null @@ -1,240 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; -using SevenZip.Sdk.Compression.Lzma; - -namespace SevenZip -{ -#if LZMA_STREAM - /// - /// The stream which decompresses data with LZMA on the fly. - /// - public class LzmaDecodeStream : Stream - { - private readonly MemoryStream _buffer = new MemoryStream(); - private readonly Decoder _decoder = new Decoder(); - private readonly Stream _input; - private byte[] _commonProperties; - private bool _error; - private bool _firstChunkRead; - - /// - /// Initializes a new instance of the LzmaDecodeStream class. - /// - /// A compressed stream. - public LzmaDecodeStream(Stream encodedStream) - { - if (!encodedStream.CanRead) - { - throw new ArgumentException("The specified stream can not read.", "encodedStream"); - } - _input = encodedStream; - } - - /// - /// Gets the chunk size. - /// - public int ChunkSize - { - get - { - return (int) _buffer.Length; - } - } - - /// - /// Gets a value indicating whether the current stream supports reading. - /// - public override bool CanRead - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether the current stream supports seeking. - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether the current stream supports writing. - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - /// Gets the length in bytes of the output stream. - /// - public override long Length - { - get - { - if (_input.CanSeek) - { - return _input.Length; - } - return _buffer.Length; - } - } - - /// - /// Gets or sets the position within the output stream. - /// - public override long Position - { - get - { - if (_input.CanSeek) - { - return _input.Position; - } - return _buffer.Position; - } - set - { - throw new NotSupportedException(); - } - } - - private void ReadChunk() - { - long size; - byte[] properties; - try - { - properties = SevenZipExtractor.GetLzmaProperties(_input, out size); - } - catch (LzmaException) - { - _error = true; - return; - } - if (!_firstChunkRead) - { - _commonProperties = properties; - } - if (_commonProperties[0] != properties[0] || - _commonProperties[1] != properties[1] || - _commonProperties[2] != properties[2] || - _commonProperties[3] != properties[3] || - _commonProperties[4] != properties[4]) - { - _error = true; - return; - } - if (_buffer.Capacity < (int) size) - { - _buffer.Capacity = (int) size; - } - _buffer.SetLength(size); - _decoder.SetDecoderProperties(properties); - _buffer.Position = 0; - _decoder.Code( - _input, _buffer, 0, size, null); - _buffer.Position = 0; - } - - /// - /// Does nothing. - /// - public override void Flush() {} - - /// - /// Reads a sequence of bytes from the current stream and decompresses data if necessary. - /// - /// An array of bytes. - /// The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - /// The maximum number of bytes to be read from the current stream. - /// The total number of bytes read into the buffer. - public override int Read(byte[] buffer, int offset, int count) - { - if (_error) - { - return 0; - } - - if (!_firstChunkRead) - { - ReadChunk(); - _firstChunkRead = true; - } - int readCount = 0; - while (count > _buffer.Length - _buffer.Position && !_error) - { - var buf = new byte[_buffer.Length - _buffer.Position]; - _buffer.Read(buf, 0, buf.Length); - buf.CopyTo(buffer, offset); - offset += buf.Length; - count -= buf.Length; - readCount += buf.Length; - ReadChunk(); - } - if (!_error) - { - _buffer.Read(buffer, offset, count); - readCount += count; - } - return readCount; - } - - /// - /// Sets the position within the current stream. - /// - /// A byte offset relative to the origin parameter. - /// A value of type System.IO.SeekOrigin indicating the reference point used to obtain the new position. - /// The new position within the current stream. - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException(); - } - - /// - /// Sets the length of the current stream. - /// - /// The desired length of the current stream in bytes. - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - - /// - /// Writes a sequence of bytes to the current stream. - /// - /// An array of bytes. - /// The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - /// The maximum number of bytes to be read from the current stream. - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException(); - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/LzmaEncodeStream.cs b/BizHawk.Client.Common/7z/LzmaEncodeStream.cs deleted file mode 100644 index bc9165e39f..0000000000 --- a/BizHawk.Client.Common/7z/LzmaEncodeStream.cs +++ /dev/null @@ -1,304 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; -using SevenZip.Sdk.Compression.Lzma; - -namespace SevenZip -{ -#if LZMA_STREAM -#if COMPRESS - /// - /// The stream which compresses data with LZMA on the fly. - /// - public class LzmaEncodeStream : Stream - { - private const int MAX_BUFFER_CAPACITY = 1 << 30; //1 Gb - private readonly MemoryStream _buffer = new MemoryStream(); - private readonly int _bufferCapacity = 1 << 18; //256 kb - private readonly bool _ownOutput; - private bool _disposed; - private Encoder _lzmaEncoder; - private Stream _output; - - /// - /// Initializes a new instance of the LzmaEncodeStream class. - /// - public LzmaEncodeStream() - { - _output = new MemoryStream(); - _ownOutput = true; - Init(); - } - - /// - /// Initializes a new instance of the LzmaEncodeStream class. - /// - /// The buffer size. The bigger size, the better compression. - public LzmaEncodeStream(int bufferCapacity) - { - _output = new MemoryStream(); - _ownOutput = true; - if (bufferCapacity > MAX_BUFFER_CAPACITY) - { - throw new ArgumentException("Too large capacity.", "bufferCapacity"); - } - _bufferCapacity = bufferCapacity; - Init(); - } - - /// - /// Initializes a new instance of the LzmaEncodeStream class. - /// - /// An output stream which supports writing. - public LzmaEncodeStream(Stream outputStream) - { - if (!outputStream.CanWrite) - { - throw new ArgumentException("The specified stream can not write.", "outputStream"); - } - _output = outputStream; - Init(); - } - - /// - /// Initializes a new instance of the LzmaEncodeStream class. - /// - /// An output stream which supports writing. - /// A buffer size. The bigger size, the better compression. - public LzmaEncodeStream(Stream outputStream, int bufferCapacity) - { - if (!outputStream.CanWrite) - { - throw new ArgumentException("The specified stream can not write.", "outputStream"); - } - _output = outputStream; - if (bufferCapacity > 1 << 30) - { - throw new ArgumentException("Too large capacity.", "bufferCapacity"); - } - _bufferCapacity = bufferCapacity; - Init(); - } - - /// - /// Gets a value indicating whether the current stream supports reading. - /// - public override bool CanRead - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether the current stream supports seeking. - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether the current stream supports writing. - /// - public override bool CanWrite - { - get - { - DisposedCheck(); - return _buffer.CanWrite; - } - } - - /// - /// Gets the length in bytes of the output stream. - /// - public override long Length - { - get - { - DisposedCheck(); - if (_output.CanSeek) - { - return _output.Length; - } - return _buffer.Position; - } - } - - /// - /// Gets or sets the position within the output stream. - /// - public override long Position - { - get - { - DisposedCheck(); - if (_output.CanSeek) - { - return _output.Position; - } - return _buffer.Position; - } - set - { - throw new NotSupportedException(); - } - } - - private void Init() - { - _buffer.Capacity = _bufferCapacity; - SevenZipCompressor.LzmaDictionarySize = _bufferCapacity; - _lzmaEncoder = new Encoder(); - SevenZipCompressor.WriteLzmaProperties(_lzmaEncoder); - } - - /// - /// Checked whether the class was disposed. - /// - /// - private void DisposedCheck() - { - if (_disposed) - { - throw new ObjectDisposedException("SevenZipExtractor"); - } - } - - private void WriteChunk() - { - _lzmaEncoder.WriteCoderProperties(_output); - long streamSize = _buffer.Position; - if (_buffer.Length != _buffer.Position) - { - _buffer.SetLength(_buffer.Position); - } - _buffer.Position = 0; - for (int i = 0; i < 8; i++) - { - _output.WriteByte((byte) (streamSize >> (8*i))); - } - _lzmaEncoder.Code(_buffer, _output, -1, -1, null); - _buffer.Position = 0; - } - - /// - /// Converts the LzmaEncodeStream to the LzmaDecodeStream to read data. - /// - /// - public LzmaDecodeStream ToDecodeStream() - { - DisposedCheck(); - Flush(); - return new LzmaDecodeStream(_output); - } - - /// - /// Clears all buffers for this stream and causes any buffered data to be compressed and written. - /// - public override void Flush() - { - DisposedCheck(); - WriteChunk(); - } - - /// - /// Releases all unmanaged resources used by LzmaEncodeStream. - /// - protected override void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - Flush(); - _buffer.Close(); - if (_ownOutput) - { - _output.Dispose(); - } - _output = null; - } - _disposed = true; - } - } - - /// - /// Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. - /// - /// An array of bytes. - /// The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - /// The maximum number of bytes to be read from the current stream. - /// The total number of bytes read into the buffer. - public override int Read(byte[] buffer, int offset, int count) - { - DisposedCheck(); - throw new NotSupportedException(); - } - - /// - /// Sets the position within the current stream. - /// - /// A byte offset relative to the origin parameter. - /// A value of type System.IO.SeekOrigin indicating the reference point used to obtain the new position. - /// The new position within the current stream. - public override long Seek(long offset, SeekOrigin origin) - { - DisposedCheck(); - throw new NotSupportedException(); - } - - /// - /// Sets the length of the current stream. - /// - /// The desired length of the current stream in bytes. - public override void SetLength(long value) - { - DisposedCheck(); - throw new NotSupportedException(); - } - - /// - /// Writes a sequence of bytes to the current stream and compresses it if necessary. - /// - /// An array of bytes. - /// The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - /// The maximum number of bytes to be read from the current stream. - public override void Write(byte[] buffer, int offset, int count) - { - DisposedCheck(); - int dataLength = Math.Min(buffer.Length - offset, count); - while (_buffer.Position + dataLength >= _bufferCapacity) - { - int length = _bufferCapacity - (int) _buffer.Position; - _buffer.Write(buffer, offset, length); - offset = length + offset; - dataLength -= length; - WriteChunk(); - } - _buffer.Write(buffer, offset, dataLength); - } - } -#endif -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/LzmaProgressCallback.cs b/BizHawk.Client.Common/7z/LzmaProgressCallback.cs deleted file mode 100644 index fee8c7abad..0000000000 --- a/BizHawk.Client.Common/7z/LzmaProgressCallback.cs +++ /dev/null @@ -1,72 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using SevenZip.Sdk; - -namespace SevenZip -{ - /// - /// Callback to implement the ICodeProgress interface - /// - internal sealed class LzmaProgressCallback : ICodeProgress - { - private readonly long _inSize; - private float _oldPercentDone; - - /// - /// Initializes a new instance of the LzmaProgressCallback class - /// - /// The input size - /// Progress event handler - public LzmaProgressCallback(long inSize, EventHandler working) - { - _inSize = inSize; - Working += working; - } - - #region ICodeProgress Members - - /// - /// Sets the progress - /// - /// The processed input size - /// The processed output size - public void SetProgress(long inSize, long outSize) - { - if (Working != null) - { - float newPercentDone = (inSize + 0.0f) / _inSize; - float delta = newPercentDone - _oldPercentDone; - if (delta * 100 < 1.0) - { - delta = 0; - } - else - { - _oldPercentDone = newPercentDone; - } - Working(this, new ProgressEventArgs( - PercentDoneEventArgs.ProducePercentDone(newPercentDone), - delta > 0 ? PercentDoneEventArgs.ProducePercentDone(delta) : (byte)0)); - } - } - - #endregion - - public event EventHandler Working; - } -} diff --git a/BizHawk.Client.Common/7z/NativeMethods.cs b/BizHawk.Client.Common/7z/NativeMethods.cs deleted file mode 100644 index 33fbcd9998..0000000000 --- a/BizHawk.Client.Common/7z/NativeMethods.cs +++ /dev/null @@ -1,67 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Runtime.InteropServices; -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if UNMANAGED - internal static class NativeMethods - { - #if !WINCE && !MONO - #region Delegates - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - public delegate int CreateObjectDelegate( - [In] ref Guid classID, - [In] ref Guid interfaceID, - [MarshalAs(UnmanagedType.Interface)] out object outObject); - - #endregion - #endif - - #if WINCE - [DllImport("7z.dll", EntryPoint="CreateObject")] - public static extern int CreateCOMObject( - [In] ref Guid classID, - [In] ref Guid interfaceID, - [MarshalAs(UnmanagedType.Interface)] out object outObject); - #endif - - public static T SafeCast(PropVariant var, T def) - { - object obj; - try - { - obj = var.Object; - } - catch (Exception) - { - return def; - } - if (obj != null && obj is T) - { - return (T) obj; - } - return def; - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/SevenZipCompressor.cs b/BizHawk.Client.Common/7z/SevenZipCompressor.cs deleted file mode 100644 index a0c4661027..0000000000 --- a/BizHawk.Client.Common/7z/SevenZipCompressor.cs +++ /dev/null @@ -1,2056 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -#if DOTNET20 -using System.Threading; -#else -using System.Linq; -#endif -using System.Runtime.InteropServices; -#if !WINCE -using System.Security.Permissions; -#endif -using SevenZip.Sdk; -using SevenZip.Sdk.Compression.Lzma; -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if COMPRESS - /// - /// Class to pack data into archives supported by 7-Zip. - /// - /// - /// var compr = new SevenZipCompressor(); - /// compr.CompressDirectory(@"C:\Dir", @"C:\Archive.7z"); - /// - public sealed partial class SevenZipCompressor -#if UNMANAGED - : SevenZipBase -#endif - { -#if UNMANAGED - #region Fields - private bool _compressingFilesOnDisk; - /// - /// Gets or sets the archiving compression level. - /// - public CompressionLevel CompressionLevel { get; set; } - private OutArchiveFormat _archiveFormat = OutArchiveFormat.SevenZip; - private CompressionMethod _compressionMethod = CompressionMethod.Default; - /// - /// Gets the custom compression parameters - for advanced users only. - /// - public Dictionary CustomParameters { get; private set; } - private int _volumeSize; - private string _archiveName; - /// - /// Gets or sets the value indicating whether to include empty directories to archives. Default is true. - /// - public bool IncludeEmptyDirectories { get; set; } - /// - /// Gets or sets the value indicating whether to preserve the directory root for CompressDirectory. - /// - public bool PreserveDirectoryRoot { get; set; } - /// - /// Gets or sets the value indicating whether to preserve the directory structure. - /// - public bool DirectoryStructure { get; set; } - private bool _directoryCompress; - /// - /// Gets or sets the compression mode. - /// - public CompressionMode CompressionMode { get; set; } - private UpdateData _updateData; - private uint _oldFilesCount; - /// - /// Gets or sets the value indicating whether to encrypt 7-Zip archive headers. - /// - public bool EncryptHeaders { get; set; } - /// - /// Gets or sets the value indicating whether to compress files only open for writing. - /// - public bool ScanOnlyWritable { get; set; } - /// - /// Gets or sets the encryption method for zip archives. - /// - public ZipEncryptionMethod ZipEncryptionMethod { get; set; } - /// - /// Gets or sets the temporary folder path. - /// - public string TempFolderPath { get; set; } - /// - /// Gets or sets the default archive item name used when an item to be compressed has no name, - /// for example, when you compress a MemoryStream instance. - /// - public string DefaultItemName { get; set; } - /// - /// Gets or sets the value indicating whether to compress as fast as possible, without calling events. - /// - public bool FastCompression { get; set; } - #endregion -#endif - private static volatile int _lzmaDictionarySize = 1 << 22; - -#if UNMANAGED - - private void CommonInit() - { - DirectoryStructure = true; - IncludeEmptyDirectories = true; - CompressionLevel = CompressionLevel.Normal; - CompressionMode = CompressionMode.Create; - ZipEncryptionMethod = ZipEncryptionMethod.ZipCrypto; - CustomParameters = new Dictionary(); - _updateData = new UpdateData(); - DefaultItemName = "default"; - } - - /// - /// Initializes a new instance of the SevenZipCompressor class. - /// - public SevenZipCompressor() - { - try - { -#if !WINCE - TempFolderPath = Path.GetTempPath(); - //TempFolderPath = Environment.GetEnvironmentVariable("TEMP", EnvironmentVariableTarget.User); -#else - TempFolderPath = "Temp"; -#endif - } - catch (System.Security.SecurityException) // Registry access is not allowed, etc. - { - /*throw new SevenZipCompressionFailedException( - "Attempted to get TEMP environment variable but registry access was not allowed (security settings on your machine). You must call SevenZipCompressor constructor overload with your own temporary path."); - */ - throw new SevenZipCompressionFailedException( - "Path.GetTempPath() threw a System.Security.SecurityException. You must call SevenZipCompressor constructor overload with your own temporary path."); - } - CommonInit(); - } - - /// - /// Initializes a new instance of the SevenZipCompressor class. - /// - /// Your own temporary path (default is set in the parameterless constructor overload.) - public SevenZipCompressor(string temporaryPath) - { - TempFolderPath = temporaryPath; - if (!Directory.Exists(TempFolderPath)) - { - try - { - Directory.CreateDirectory(TempFolderPath); - } - catch (Exception) - { - throw new SevenZipCompressionFailedException("The specified temporary path is invalid."); - } - } - CommonInit(); - } -#endif - - /// - /// Checks if the specified stream supports compression. - /// - /// The stream to check. - private static void ValidateStream(Stream stream) - { - if (!stream.CanWrite || !stream.CanSeek) - { - throw new ArgumentException("The specified stream can not seek or is not writable.", "stream"); - } - } - -#if UNMANAGED - - #region Private functions - - private IOutArchive MakeOutArchive(IInStream inArchiveStream) - { - IInArchive inArchive = SevenZipLibraryManager.InArchive( - Formats.InForOutFormats[_archiveFormat], this); - using (ArchiveOpenCallback openCallback = GetArchiveOpenCallback()) - { - ulong checkPos = 1 << 15; - if (inArchive.Open(inArchiveStream, ref checkPos, openCallback) != (int)OperationResult.Ok) - { - if ( - !ThrowException(null, new SevenZipArchiveException("Can not update the archive: Open() failed."))) - { - return null; - } - } - _oldFilesCount = inArchive.GetNumberOfItems(); - } - return (IOutArchive)inArchive; - } - - /// - /// Guaranties the correct work of the SetCompressionProperties function - /// - /// The compression method to check - /// The value indicating whether the specified method is valid for the current ArchiveFormat - private bool MethodIsValid(CompressionMethod method) - { - if (method == CompressionMethod.Default) - { - return true; - } - switch (_archiveFormat) - { - case OutArchiveFormat.Zip: - return method != CompressionMethod.Ppmd; - case OutArchiveFormat.GZip: - return method == CompressionMethod.Deflate; - case OutArchiveFormat.BZip2: - return method == CompressionMethod.BZip2; - case OutArchiveFormat.SevenZip: - return method != CompressionMethod.Deflate && method != CompressionMethod.Deflate64; - case OutArchiveFormat.Tar: - return method == CompressionMethod.Copy; - default: - return true; - } - } - - private bool SwitchIsInCustomParameters(string name) - { - return CustomParameters.ContainsKey(name); - } - - /// - /// Sets the compression properties - /// - private void SetCompressionProperties() - { - switch (_archiveFormat) - { - case OutArchiveFormat.Tar: - break; - default: - ISetProperties setter = CompressionMode == CompressionMode.Create && _updateData.FileNamesToModify == null - ? (ISetProperties)SevenZipLibraryManager.OutArchive( - _archiveFormat, this) - : (ISetProperties)SevenZipLibraryManager.InArchive( - Formats.InForOutFormats[_archiveFormat], this); - if (setter == null) - { - if (!ThrowException(null, - new CompressionFailedException( - "The specified archive format is unsupported."))) - { - return; - } - } - if (_volumeSize > 0 && ArchiveFormat != OutArchiveFormat.SevenZip) - { - throw new CompressionFailedException("Unfortunately, the creation of multivolume non-7Zip archives is not implemented. It will be one day, though."); - } - if (CustomParameters.ContainsKey("x") || CustomParameters.ContainsKey("m")) - { - if ( - !ThrowException(null, - new CompressionFailedException( - "The specified compression parameters are invalid."))) - { - return; - } - } - var names = new List(2 + CustomParameters.Count); - var values = new List(2 + CustomParameters.Count); -#if !WINCE - var sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); - sp.Demand(); -#endif - #region Initialize compression properties - - if (_compressionMethod == CompressionMethod.Default) - { - names.Add(Marshal.StringToBSTR("x")); - values.Add(new PropVariant()); - foreach (var pair in CustomParameters) - { - names.Add(Marshal.StringToBSTR(pair.Key)); - var pv = new PropVariant(); - if (pair.Key == "fb" || pair.Key == "pass" || pair.Key == "d") - { - pv.VarType = VarEnum.VT_UI4; - pv.UInt32Value = Convert.ToUInt32(pair.Value, CultureInfo.InvariantCulture); - } - else - { - pv.VarType = VarEnum.VT_BSTR; - pv.Value = Marshal.StringToBSTR(pair.Value); - } - values.Add(pv); - } - } - else - { - names.Add(Marshal.StringToBSTR("x")); - names.Add(_archiveFormat == OutArchiveFormat.Zip - ? Marshal.StringToBSTR("m") - : Marshal.StringToBSTR("0")); - values.Add(new PropVariant()); - var pv = new PropVariant - { - VarType = VarEnum.VT_BSTR, - Value = Marshal.StringToBSTR(Formats.MethodNames[_compressionMethod]) - }; - values.Add(pv); - foreach (var pair in CustomParameters) - { - names.Add(Marshal.StringToBSTR(pair.Key)); - pv = new PropVariant(); - if (pair.Key == "fb" || pair.Key == "pass" || pair.Key == "d") - { - pv.VarType = VarEnum.VT_UI4; - pv.UInt32Value = Convert.ToUInt32(pair.Value, CultureInfo.InvariantCulture); - } - else - { - pv.VarType = VarEnum.VT_BSTR; - pv.Value = Marshal.StringToBSTR(pair.Value); - } - values.Add(pv); - } - } - - #endregion - - #region Set compression level - - PropVariant clpv = values[0]; - clpv.VarType = VarEnum.VT_UI4; - switch (CompressionLevel) - { - case CompressionLevel.None: - clpv.UInt32Value = 0; - break; - case CompressionLevel.Fast: - clpv.UInt32Value = 1; - break; - case CompressionLevel.Low: - clpv.UInt32Value = 3; - break; - case CompressionLevel.Normal: - clpv.UInt32Value = 5; - break; - case CompressionLevel.High: - clpv.UInt32Value = 7; - break; - case CompressionLevel.Ultra: - clpv.UInt32Value = 9; - break; - } - values[0] = clpv; - - #endregion - - #region Encrypt headers - - if (EncryptHeaders && _archiveFormat == OutArchiveFormat.SevenZip && - !SwitchIsInCustomParameters("he")) - { - names.Add(Marshal.StringToBSTR("he")); - var tmp = new PropVariant { VarType = VarEnum.VT_BSTR, Value = Marshal.StringToBSTR("on") }; - values.Add(tmp); - } - - #endregion - - #region Zip Encryption - - if (_archiveFormat == OutArchiveFormat.Zip && ZipEncryptionMethod != ZipEncryptionMethod.ZipCrypto && - !SwitchIsInCustomParameters("em")) - { - names.Add(Marshal.StringToBSTR("em")); - var tmp = new PropVariant - { - VarType = VarEnum.VT_BSTR, - Value = Marshal.StringToBSTR( -#if !WINCE -Enum.GetName(typeof(ZipEncryptionMethod), ZipEncryptionMethod)) -#else - OpenNETCF.Enum2.GetName(typeof (ZipEncryptionMethod), ZipEncryptionMethod)) -#endif - }; - values.Add(tmp); - } - - #endregion - - var namesHandle = GCHandle.Alloc(names.ToArray(), GCHandleType.Pinned); - var valuesHandle = GCHandle.Alloc(values.ToArray(), GCHandleType.Pinned); - try - { - if (setter != null) //ReSharper - setter.SetProperties(namesHandle.AddrOfPinnedObject(), valuesHandle.AddrOfPinnedObject(), - names.Count); - } - finally - { - namesHandle.Free(); - valuesHandle.Free(); - } - break; - } - } - - /// - /// Finds the common root of file names - /// - /// Array of file names - /// Common root - private static int CommonRoot(ICollection files) - { - var splittedFileNames = new List(files.Count); -#if CS4 - splittedFileNames.AddRange(files.Select(fn => fn.Split(Path.DirectorySeparatorChar))); -#else - foreach (string fn in files) - { - splittedFileNames.Add(fn.Split(Path.DirectorySeparatorChar)); - } -#endif - int minSplitLength = splittedFileNames[0].Length - 1; - if (files.Count > 1) - { - for (int i = 1; i < files.Count; i++) - { - if (minSplitLength > splittedFileNames[i].Length) - { - minSplitLength = splittedFileNames[i].Length; - } - } - } - string res = ""; - for (int i = 0; i < minSplitLength; i++) - { - bool common = true; - for (int j = 1; j < files.Count; j++) - { - if (!(common &= splittedFileNames[j - 1][i] == splittedFileNames[j][i])) - { - break; - } - } - if (common) - { - res += splittedFileNames[0][i] + Path.DirectorySeparatorChar; - } - else - { - break; - } - } - return res.Length; - } - - /// - /// Validates the common root - /// - /// The length of the common root of the file names. - /// Array of file names - private static void CheckCommonRoot(string[] files, ref int commonRootLength) - { - string commonRoot; - try - { - commonRoot = files[0].Substring(0, commonRootLength); - } - catch (ArgumentOutOfRangeException) - { - throw new SevenZipInvalidFileNamesException("invalid common root."); - } - if (commonRoot.EndsWith(new string(Path.DirectorySeparatorChar, 1), StringComparison.CurrentCulture)) - { - commonRoot = commonRoot.Substring(0, commonRootLength - 1); - commonRootLength--; - } -#if CS4 - if (files.Any(fn => !fn.StartsWith(commonRoot, StringComparison.CurrentCulture))) - { - throw new SevenZipInvalidFileNamesException("invalid common root."); - } -#else - foreach (string fn in files) - { - if (!fn.StartsWith(commonRoot, StringComparison.CurrentCulture)) - { - throw new SevenZipInvalidFileNamesException("invalid common root."); - } - } -#endif - } - - /// - /// Ensures that directory directory is not empty - /// - /// Directory name - /// False if is not empty - private static bool RecursiveDirectoryEmptyCheck(string directory) - { - var di = new DirectoryInfo(directory); - if (di.GetFiles().Length > 0) - { - return false; - } - bool empty = true; - foreach (DirectoryInfo cdi in di.GetDirectories()) - { - empty &= RecursiveDirectoryEmptyCheck(cdi.FullName); - if (!empty) - { - return false; - } - } - return true; - } - - /// - /// Makes special FileInfo array for the archive file table. - /// - /// Array of files to pack. - /// The length of the common root of file names - /// The value indicating whether to produce the array for files in a particular directory or just for an array of files. - /// Preserve directory structure. - /// Special FileInfo array for the archive file table. - private static FileInfo[] ProduceFileInfoArray( - string[] files, int commonRootLength, - bool directoryCompress, bool directoryStructure) - { - var fis = new List(files.Length); - string commonRoot = files[0].Substring(0, commonRootLength); - if (directoryCompress) - { -#if CS4 - fis.AddRange(files.Select(fn => new FileInfo(fn))); -#else - foreach (string fn in files) - { - fis.Add(new FileInfo(fn)); - } -#endif - } - else - { - if (!directoryStructure) - { -#if CS4 - fis.AddRange(from fn in files where !Directory.Exists(fn) select new FileInfo(fn)); -#else - foreach (string fn in files) - { - if (!Directory.Exists(fn)) - { - fis.Add(new FileInfo(fn)); - } - } -#endif - } - else - { - var fns = new List(files.Length); - CheckCommonRoot(files, ref commonRootLength); - if (commonRootLength > 0) - { - commonRootLength++; - foreach (string f in files) - { - string[] splittedAfn = f.Substring(commonRootLength).Split(Path.DirectorySeparatorChar); - string cfn = commonRoot; - foreach (string t in splittedAfn) - { - cfn += Path.DirectorySeparatorChar + t; - if (!fns.Contains(cfn)) - { - fis.Add(new FileInfo(cfn)); - fns.Add(cfn); - } - } - } - } - else - { - foreach (string f in files) - { - string[] splittedAfn = f.Substring(commonRootLength).Split(Path.DirectorySeparatorChar); - string cfn = splittedAfn[0]; - for (int i = 1; i < splittedAfn.Length; i++) - { - cfn += Path.DirectorySeparatorChar + splittedAfn[i]; - if (!fns.Contains(cfn)) - { - fis.Add(new FileInfo(cfn)); - fns.Add(cfn); - } - } - } - } - } - } - return fis.ToArray(); - } - - /// - /// Recursive function for adding files in directory - /// - /// Directory directory - /// List of files - /// Search string, such as "*.txt" - private void AddFilesFromDirectory(string directory, ICollection files, string searchPattern) - { - var di = new DirectoryInfo(directory); - foreach (FileInfo fi in di.GetFiles(searchPattern)) - { - if (!ScanOnlyWritable) - { - files.Add(fi.FullName); - } - else - { - try - { - using (fi.OpenWrite()) { } - files.Add(fi.FullName); - } - catch (IOException) { } - } - } - foreach (DirectoryInfo cdi in di.GetDirectories()) - { - if (IncludeEmptyDirectories) - { - files.Add(cdi.FullName); - } - AddFilesFromDirectory(cdi.FullName, files, searchPattern); - } - } - - #endregion - - #region GetArchiveUpdateCallback overloads - - /// - /// Performs the common ArchiveUpdateCallback initialization. - /// - /// The ArchiveUpdateCallback instance to initialize. - private void CommonUpdateCallbackInit(ArchiveUpdateCallback auc) - { - auc.FileCompressionStarted += FileCompressionStartedEventProxy; - auc.Compressing += CompressingEventProxy; - auc.FileCompressionFinished += FileCompressionFinishedEventProxy; - auc.DefaultItemName = DefaultItemName; - auc.FastCompression = FastCompression; - } - - private float GetDictionarySize() - { - float dictionarySize = 0.001f; - switch (_compressionMethod) - { - case CompressionMethod.Default: - case CompressionMethod.Lzma: - case CompressionMethod.Lzma2: - switch (CompressionLevel) - { - case CompressionLevel.None: - dictionarySize = 0.001f; - break; - case CompressionLevel.Fast: - dictionarySize = 1.0f / 16 * 7.5f + 4; - break; - case CompressionLevel.Low: - dictionarySize = 7.5f * 11.5f + 4; - break; - case CompressionLevel.Normal: - dictionarySize = 16 * 11.5f + 4; - break; - case CompressionLevel.High: - dictionarySize = 32 * 11.5f + 4; - break; - case CompressionLevel.Ultra: - dictionarySize = 64 * 11.5f + 4; - break; - } - break; - case CompressionMethod.BZip2: - switch (CompressionLevel) - { - case CompressionLevel.None: - dictionarySize = 0; - break; - case CompressionLevel.Fast: - dictionarySize = 0.095f; - break; - case CompressionLevel.Low: - dictionarySize = 0.477f; - break; - case CompressionLevel.Normal: - case CompressionLevel.High: - case CompressionLevel.Ultra: - dictionarySize = 0.858f; - break; - } - break; - case CompressionMethod.Deflate: - case CompressionMethod.Deflate64: - dictionarySize = 32; - break; - case CompressionMethod.Ppmd: - dictionarySize = 16; - break; - } - return dictionarySize; - } - - /// - /// Produces a new instance of ArchiveUpdateCallback class. - /// - /// Array of FileInfo - files to pack - /// Length of the common root of file names - /// The archive password - /// - private ArchiveUpdateCallback GetArchiveUpdateCallback( - FileInfo[] files, int rootLength, string password) - { - SetCompressionProperties(); - var auc = (String.IsNullOrEmpty(password)) - ? new ArchiveUpdateCallback(files, rootLength, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() } - : new ArchiveUpdateCallback(files, rootLength, password, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() }; - CommonUpdateCallbackInit(auc); - return auc; - } - - /// - /// Produces a new instance of ArchiveUpdateCallback class. - /// - /// The archive input stream. - /// The archive password. - /// - private ArchiveUpdateCallback GetArchiveUpdateCallback(Stream inStream, string password) - { - SetCompressionProperties(); - var auc = (String.IsNullOrEmpty(password)) - ? new ArchiveUpdateCallback(inStream, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() } - : new ArchiveUpdateCallback(inStream, password, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() }; - CommonUpdateCallbackInit(auc); - return auc; - } - - /// - /// Produces a new instance of ArchiveUpdateCallback class. - /// - /// Dictionary<name of the archive entry, stream>. - /// The archive password - /// - private ArchiveUpdateCallback GetArchiveUpdateCallback( - Dictionary streamDict, string password) - { - SetCompressionProperties(); - var auc = (String.IsNullOrEmpty(password)) - ? new ArchiveUpdateCallback(streamDict, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() } - : new ArchiveUpdateCallback(streamDict, password, this, GetUpdateData(), DirectoryStructure) - { DictionarySize = GetDictionarySize() }; - CommonUpdateCallbackInit(auc); - return auc; - } - - #endregion - - #region Service "Get" functions - - private void FreeCompressionCallback(ArchiveUpdateCallback callback) - { - callback.FileCompressionStarted -= FileCompressionStartedEventProxy; - callback.Compressing -= CompressingEventProxy; - callback.FileCompressionFinished -= FileCompressionFinishedEventProxy; - } - - private string GetTempArchiveFileName(string archiveName) - { - return Path.Combine(TempFolderPath, Path.GetFileName(archiveName) + ".~"); - } - - private FileStream GetArchiveFileStream(string archiveName) - { - if ((CompressionMode != CompressionMode.Create || _updateData.FileNamesToModify != null) && !File.Exists(archiveName)) - { - if ( - !ThrowException(null, new CompressionFailedException("file \"" + archiveName + "\" does not exist."))) - { - return null; - } - } - return _volumeSize == 0 - ? CompressionMode == CompressionMode.Create && _updateData.FileNamesToModify == null - ? File.Create(archiveName) - : File.Create(GetTempArchiveFileName(archiveName)) - : null; - } - - private void FinalizeUpdate() - { - if (_volumeSize == 0 && (CompressionMode != CompressionMode.Create || _updateData.FileNamesToModify != null)) - { - File.Move(GetTempArchiveFileName(_archiveName), _archiveName); - } - } - - private UpdateData GetUpdateData() - { - if (_updateData.FileNamesToModify == null) - { - var updateData = new UpdateData { Mode = (InternalCompressionMode)((int)CompressionMode) }; - switch (CompressionMode) - { - case CompressionMode.Create: - updateData.FilesCount = UInt32.MaxValue; - break; - case CompressionMode.Append: - updateData.FilesCount = _oldFilesCount; - break; - } - return updateData; - } - return _updateData; - } - - private ISequentialOutStream GetOutStream(Stream outStream) - { - if (!_compressingFilesOnDisk) - { - return new OutStreamWrapper(outStream, false); - } - if (_volumeSize == 0 || CompressionMode != CompressionMode.Create || _updateData.FileNamesToModify != null) - { - return new OutStreamWrapper(outStream, true); - } - return new OutMultiStreamWrapper(_archiveName, _volumeSize); - } - - private IInStream GetInStream() - { - return File.Exists(_archiveName) && - (CompressionMode != CompressionMode.Create && _compressingFilesOnDisk || _updateData.FileNamesToModify != null) - ? - new InStreamWrapper( - new FileStream(_archiveName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), - true) - : null; - } - - private ArchiveOpenCallback GetArchiveOpenCallback() - { - return String.IsNullOrEmpty(Password) - ? - new ArchiveOpenCallback(_archiveName) - : - new ArchiveOpenCallback(_archiveName, Password); - } - - #endregion - - #region Core public Members - - #region Events - - /// - /// Occurs when the next file is going to be packed. - /// - /// Occurs when 7-zip engine requests for an input stream for the next file to pack it - public event EventHandler FileCompressionStarted; - - /// - /// Occurs when the current file was compressed. - /// - public event EventHandler FileCompressionFinished; - - /// - /// Occurs when data are being compressed - /// - /// Use this event for accurate progress handling and various ProgressBar.StepBy(e.PercentDelta) routines - public event EventHandler Compressing; - - /// - /// Occurs when all files information was determined and SevenZipCompressor is about to start to compress them. - /// - /// The incoming int value indicates the number of scanned files. - public event EventHandler FilesFound; - - /// - /// Occurs when the compression procedure is finished - /// - public event EventHandler CompressionFinished; - - #region Event proxies - /// - /// Event proxy for FileCompressionStarted. - /// - /// The sender of the event. - /// The event arguments. - private void FileCompressionStartedEventProxy(object sender, FileNameEventArgs e) - { - OnEvent(FileCompressionStarted, e, false); - } - - /// - /// Event proxy for FileCompressionFinished. - /// - /// The sender of the event. - /// The event arguments. - private void FileCompressionFinishedEventProxy(object sender, EventArgs e) - { - OnEvent(FileCompressionFinished, e, false); - } - - /// - /// Event proxy for Compressing. - /// - /// The sender of the event. - /// The event arguments. - private void CompressingEventProxy(object sender, ProgressEventArgs e) - { - OnEvent(Compressing, e, false); - } - - /// - /// Event proxy for FilesFound. - /// - /// The sender of the event. - /// The event arguments. - private void FilesFoundEventProxy(object sender, IntEventArgs e) - { - OnEvent(FilesFound, e, false); - } - #endregion - #endregion - - #region Properties - - /// - /// Gets or sets the archive format - /// - public OutArchiveFormat ArchiveFormat - { - get - { - return _archiveFormat; - } - - set - { - _archiveFormat = value; - if (!MethodIsValid(_compressionMethod)) - { - _compressionMethod = CompressionMethod.Default; - } - } - } - - /// - /// Gets or sets the compression method - /// - public CompressionMethod CompressionMethod - { - get - { - return _compressionMethod; - } - - set - { - _compressionMethod = !MethodIsValid(value) ? CompressionMethod.Default : value; - } - } - - /// - /// Gets or sets the size in bytes of an archive volume (0 for no volumes). - /// - public int VolumeSize - { - get - { - return _volumeSize; - } - - set - { - _volumeSize = value > 0 ? value : 0; - } - } - #endregion - - #region CompressFiles overloads - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The archive file name. - public void CompressFiles( - string archiveName, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveName, "", fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles(string archiveName ... ) overloads for archiving to disk. - public void CompressFiles( - Stream archiveStream, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveStream, "", fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive file name. - public void CompressFiles( - string archiveName, int commonRootLength, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveName, commonRootLength, "", fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive output stream. - /// Use CompressFiles(string archiveName, ... ) overloads for archiving to disk. - public void CompressFiles( - Stream archiveStream, int commonRootLength, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveStream, commonRootLength, "", fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The archive file name. - /// The archive password. - public void CompressFilesEncrypted( - string archiveName, string password, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveName, CommonRoot(fileFullNames), password, fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressFilesEncrypted( - Stream archiveStream, string password, params string[] fileFullNames) - { - CompressFilesEncrypted(archiveStream, CommonRoot(fileFullNames), password, fileFullNames); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive file name. - /// The archive password. - public void CompressFilesEncrypted( - string archiveName, int commonRootLength, string password, params string[] fileFullNames) - { - _compressingFilesOnDisk = true; - _archiveName = archiveName; - using (FileStream fs = GetArchiveFileStream(archiveName)) - { - if (fs == null && _volumeSize == 0) - { - return; - } - CompressFilesEncrypted(fs, commonRootLength, password, fileFullNames); - } - FinalizeUpdate(); - } - - /// - /// Packs files into the archive. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressFilesEncrypted( - Stream archiveStream, int commonRootLength, string password, params string[] fileFullNames) - { - ClearExceptions(); - if (fileFullNames.Length > 1 && - (_archiveFormat == OutArchiveFormat.BZip2 || _archiveFormat == OutArchiveFormat.GZip || - _archiveFormat == OutArchiveFormat.XZ)) - { - if (!ThrowException(null, - new CompressionFailedException("Can not compress more than one file in this format."))) - { - return; - } - } - if (_volumeSize == 0 || !_compressingFilesOnDisk) - { - ValidateStream(archiveStream); - } - FileInfo[] files = null; - try - { - files = ProduceFileInfoArray(fileFullNames, commonRootLength, _directoryCompress, DirectoryStructure); - } - catch (Exception e) - { - if (!ThrowException(null, e)) - { - return; - } - } - _directoryCompress = false; - if (FilesFound != null) - { - FilesFound(this, new IntEventArgs(fileFullNames.Length)); - } - try - { - ISequentialOutStream sequentialArchiveStream; - using ((sequentialArchiveStream = GetOutStream(archiveStream)) as IDisposable) - { - IInStream inArchiveStream; - using ((inArchiveStream = GetInStream()) as IDisposable) - { - IOutArchive outArchive; - if (CompressionMode == CompressionMode.Create || !_compressingFilesOnDisk) - { - SevenZipLibraryManager.LoadLibrary(this, _archiveFormat); - outArchive = SevenZipLibraryManager.OutArchive(_archiveFormat, this); - } - else - { - // Create IInArchive, read it and convert to IOutArchive - SevenZipLibraryManager.LoadLibrary( - this, Formats.InForOutFormats[_archiveFormat]); - if ((outArchive = MakeOutArchive(inArchiveStream)) == null) - { - return; - } - } - using (var auc = GetArchiveUpdateCallback(files, commonRootLength, password)) - { - try - { - if (files != null) //ReSharper - CheckedExecute( - outArchive.UpdateItems( - sequentialArchiveStream, (uint)files.Length + _oldFilesCount, auc), - SevenZipCompressionFailedException.DEFAULT_MESSAGE, auc); - } - finally - { - FreeCompressionCallback(auc); - } - } - } - } - } - finally - { - if (CompressionMode == CompressionMode.Create || !_compressingFilesOnDisk) - { - SevenZipLibraryManager.FreeLibrary(this, _archiveFormat); - } - else - { - SevenZipLibraryManager.FreeLibrary(this, Formats.InForOutFormats[_archiveFormat]); - File.Delete(_archiveName); - } - _compressingFilesOnDisk = false; - OnEvent(CompressionFinished, EventArgs.Empty, false); - } - ThrowUserException(); - } - - #endregion - - #region CompressDirectory overloads - -#if !CS4 - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - public void CompressDirectory( - string directory, string archiveName) - { - CompressDirectory(directory, archiveName, "", "*", true); - } - - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - public void CompressDirectory( - string directory, Stream archiveStream) - { - CompressDirectory(directory, archiveStream, "", "*", true); - } - - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - public void CompressDirectory( - string directory, string archiveName, string password) - { - CompressDirectory(directory, archiveName, password, "*", true); - } - - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressDirectory( - string directory, Stream archiveStream, string password) - { - CompressDirectory(directory, archiveStream, password, "*", true); - } - - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, string archiveName, bool recursion) - { - CompressDirectory(directory, archiveName, "", "*", recursion); - } - - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, Stream archiveStream, bool recursion) - { - CompressDirectory(directory, archiveStream, "", "*", recursion); - } - - /// - /// Packs all files found by the specified pattern in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, string archiveName, - string searchPattern, bool recursion) - { - CompressDirectory(directory, archiveName, "", searchPattern, recursion); - } - - /// - /// Packs all files found by the specified pattern in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, Stream archiveStream, - string searchPattern, bool recursion) - { - CompressDirectory(directory, archiveStream, "", searchPattern, recursion); - } - - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// If true, files will be searched for recursively; otherwise, not. - /// The archive password. - public void CompressDirectory( - string directory, string archiveName, - bool recursion, string password) - { - CompressDirectory(directory, archiveName, password, "*", recursion); - } - - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// If true, files will be searched for recursively; otherwise, not. - /// The archive password. - public void CompressDirectory( - string directory, Stream archiveStream, - bool recursion, string password) - { - CompressDirectory(directory, archiveStream, password, "*", recursion); - } -#endif - -#if !CS4 - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, string archiveName, - string password, string searchPattern, bool recursion) -#else - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, string archiveName, - string password = "", string searchPattern = "*", bool recursion = true) -#endif - { - _compressingFilesOnDisk = true; - _archiveName = archiveName; - using (FileStream fs = GetArchiveFileStream(archiveName)) - { - if (fs == null && _volumeSize == 0) - { - return; - } - CompressDirectory(directory, fs, password, searchPattern, recursion); - } - FinalizeUpdate(); - } - -#if !CS4 - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, Stream archiveStream, - string password, string searchPattern, bool recursion) -#else - /// - /// Packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - public void CompressDirectory( - string directory, Stream archiveStream, - string password = "", string searchPattern = "*", bool recursion = true) -#endif - { - var files = new List(); - if (!Directory.Exists(directory)) - { - throw new ArgumentException("Directory \"" + directory + "\" does not exist!"); - } - if (RecursiveDirectoryEmptyCheck(directory)) - { - throw new SevenZipInvalidFileNamesException("the specified directory is empty!"); - } - if (recursion) - { - AddFilesFromDirectory(directory, files, searchPattern); - } - else - { -#if CS4 - files.AddRange((new DirectoryInfo(directory)).GetFiles(searchPattern).Select(fi => fi.FullName)); -#else - foreach (FileInfo fi in (new DirectoryInfo(directory)).GetFiles(searchPattern)) - { - files.Add(fi.FullName); - } -#endif - } - int commonRootLength = directory.Length; - if (directory.EndsWith("\\", StringComparison.OrdinalIgnoreCase)) - { - directory = directory.Substring(0, directory.Length - 1); - } - else - { - commonRootLength++; - } - if (PreserveDirectoryRoot) - { - var upperRoot = Path.GetDirectoryName(directory); - commonRootLength = upperRoot.Length + - (upperRoot.EndsWith("\\", StringComparison.OrdinalIgnoreCase) ? 0 : 1); - } - _directoryCompress = true; - CompressFilesEncrypted(archiveStream, commonRootLength, password, files.ToArray()); - } - - #endregion - - #region CompressFileDictionary overloads - -#if !CS4 - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive file name. - public void CompressFileDictionary( - Dictionary fileDictionary, string archiveName) - { - CompressFileDictionary(fileDictionary, archiveName, ""); - } - - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive output stream. - /// Use CompressFileDictionary( ... string archiveName ... ) overloads for archiving to disk. - public void CompressFileDictionary( - Dictionary fileDictionary, Stream archiveStream) - { - CompressFileDictionary(fileDictionary, archiveStream, ""); - } -#endif - -#if !CS4 - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive file name. - /// The archive password. - public void CompressFileDictionary( - Dictionary fileDictionary, string archiveName, string password) -#else - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive file name. - /// The archive password. - public void CompressFileDictionary( - Dictionary fileDictionary, string archiveName, string password = "") -#endif - { - _compressingFilesOnDisk = true; - _archiveName = archiveName; - using (FileStream fs = GetArchiveFileStream(archiveName)) - { - if (fs == null && _volumeSize == 0) - { - return; - } - CompressFileDictionary(fileDictionary, fs, password); - } - FinalizeUpdate(); - } - -#if !CS4 - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive output stream. - /// Use CompressStreamDictionary( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressFileDictionary( - Dictionary fileDictionary, Stream archiveStream, string password) -#else - /// - /// Packs the specified file dictionary. - /// - /// Dictionary<name of the archive entry, file name>. - /// If a file name is null, the corresponding archive entry becomes a directory. - /// The archive output stream. - /// Use CompressStreamDictionary( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressFileDictionary( - Dictionary fileDictionary, Stream archiveStream, string password = "") -#endif - { - var streamDict = new Dictionary(fileDictionary.Count); - foreach (var pair in fileDictionary) - { - if (pair.Value == null) - { - streamDict.Add(pair.Key, null); - } - else - { - if (!File.Exists(pair.Value)) - { - throw new CompressionFailedException("The file corresponding to the archive entry \"" + pair.Key + "\" does not exist."); - } - streamDict.Add( - pair.Key, - new FileStream(pair.Value, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); - } - } - //The created streams will be automatically disposed inside. - CompressStreamDictionary(streamDict, archiveStream, password); - } - - #endregion - - #region CompressStreamDictionary overloads -#if !CS4 - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive file name. - public void CompressStreamDictionary( - Dictionary streamDictionary, string archiveName) - { - CompressStreamDictionary(streamDictionary, archiveName, ""); - } - - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive output stream. - /// Use CompressStreamDictionary( ... string archiveName ... ) overloads for archiving to disk. - public void CompressStreamDictionary( - Dictionary streamDictionary, Stream archiveStream) - { - CompressStreamDictionary(streamDictionary, archiveStream, ""); - } -#endif - -#if !CS4 - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive file name. - /// The archive password. - public void CompressStreamDictionary( - Dictionary streamDictionary, string archiveName, string password) -#else - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive file name. - /// The archive password. - public void CompressStreamDictionary( - Dictionary streamDictionary, string archiveName, string password = "") -#endif - { - _compressingFilesOnDisk = true; - _archiveName = archiveName; - using (FileStream fs = GetArchiveFileStream(archiveName)) - { - if (fs == null && _volumeSize == 0) - { - return; - } - CompressStreamDictionary(streamDictionary, fs, password); - } - FinalizeUpdate(); - } - -#if !CS4 - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive output stream. - /// Use CompressStreamDictionary( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressStreamDictionary( - Dictionary streamDictionary, Stream archiveStream, string password) -#else - /// - /// Packs the specified stream dictionary. - /// - /// Dictionary<name of the archive entry, stream>. - /// If a stream is null, the corresponding string becomes a directory name. - /// The archive output stream. - /// Use CompressStreamDictionary( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - public void CompressStreamDictionary( - Dictionary streamDictionary, Stream archiveStream, string password = "") -#endif - { - ClearExceptions(); - if (streamDictionary.Count > 1 && - (_archiveFormat == OutArchiveFormat.BZip2 || _archiveFormat == OutArchiveFormat.GZip || - _archiveFormat == OutArchiveFormat.XZ)) - { - if (!ThrowException(null, - new CompressionFailedException("Can not compress more than one file/stream in this format."))) - { - return; - } - } - if (_volumeSize == 0 || !_compressingFilesOnDisk) - { - ValidateStream(archiveStream); - } -#if CS4 - if (streamDictionary.Where( - pair => pair.Value != null && (!pair.Value.CanSeek || !pair.Value.CanRead)).Any( - pair => !ThrowException(null, - new ArgumentException("The specified stream dictionary contains an invalid stream corresponding to the archive entry \"" - + pair.Key + "\".", "streamDictionary")))) - { - return; - } -#else - foreach (var pair in streamDictionary) - { - if (pair.Value != null && ( - //!pair.Value.CanSeek || //zero 11-oct-2014 - this is dumb, and I made it no longer necessary - !pair.Value.CanRead)) - { - if (!ThrowException(null, new ArgumentException( - "The specified stream dictionary contains an invalid stream corresponding to the archive entry \"" + pair.Key + "\".", - "streamDictionary"))) - { - return; - } - } - } -#endif - try - { - ISequentialOutStream sequentialArchiveStream; - using ((sequentialArchiveStream = GetOutStream(archiveStream)) as IDisposable) - { - IInStream inArchiveStream; - using ((inArchiveStream = GetInStream()) as IDisposable) - { - IOutArchive outArchive; - if (CompressionMode == CompressionMode.Create || !_compressingFilesOnDisk) - { - SevenZipLibraryManager.LoadLibrary(this, _archiveFormat); - outArchive = SevenZipLibraryManager.OutArchive(_archiveFormat, this); - } - else - { - // Create IInArchive, read it and convert to IOutArchive - SevenZipLibraryManager.LoadLibrary( - this, Formats.InForOutFormats[_archiveFormat]); - if ((outArchive = MakeOutArchive(inArchiveStream)) == null) - { - return; - } - } - using (ArchiveUpdateCallback auc = GetArchiveUpdateCallback( - streamDictionary, password)) - { - try - { - CheckedExecute(outArchive.UpdateItems(sequentialArchiveStream, - (uint)streamDictionary.Count + _oldFilesCount, auc), - SevenZipCompressionFailedException.DEFAULT_MESSAGE, auc); - } - finally - { - FreeCompressionCallback(auc); - } - } - } - } - } - finally - { - if (CompressionMode == CompressionMode.Create || !_compressingFilesOnDisk) - { - SevenZipLibraryManager.FreeLibrary(this, _archiveFormat); - } - else - { - SevenZipLibraryManager.FreeLibrary(this, Formats.InForOutFormats[_archiveFormat]); - File.Delete(_archiveName); - } - _compressingFilesOnDisk = false; - OnEvent(CompressionFinished, EventArgs.Empty, false); - } - ThrowUserException(); - } - - #endregion - - #region CompressStream overloads - -#if !CS4 - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// ArgumentException: at least one of the specified streams is invalid. - public void CompressStream(Stream inStream, Stream outStream) - { - CompressStream(inStream, outStream, ""); - } -#endif - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// The archive password. - /// ArgumentException: at least one of the specified streams is invalid. - public void CompressStream(Stream inStream, Stream outStream, string password -#if CS4 - = "" -#endif - ) - { - ClearExceptions(); - if (!inStream.CanSeek || !inStream.CanRead || !outStream.CanWrite) - { - if (!ThrowException(null, new ArgumentException("The specified streams are invalid."))) - { - return; - } - } - try - { - SevenZipLibraryManager.LoadLibrary(this, _archiveFormat); - ISequentialOutStream sequentialArchiveStream; - using ((sequentialArchiveStream = GetOutStream(outStream)) as IDisposable) - { - using (ArchiveUpdateCallback auc = GetArchiveUpdateCallback(inStream, password)) - { - try - { - CheckedExecute( - SevenZipLibraryManager.OutArchive(_archiveFormat, this).UpdateItems( - sequentialArchiveStream, 1, auc), - SevenZipCompressionFailedException.DEFAULT_MESSAGE, auc); - } - finally - { - FreeCompressionCallback(auc); - } - } - } - } - finally - { - SevenZipLibraryManager.FreeLibrary(this, _archiveFormat); - OnEvent(CompressionFinished, EventArgs.Empty, false); - } - ThrowUserException(); - } - - #endregion - - #region ModifyArchive overloads -#if !CS4 - /// - /// Modifies the existing archive (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. - public void ModifyArchive(string archiveName, Dictionary newFileNames) - { - ModifyArchive(archiveName, newFileNames, ""); - } -#endif - - /// - /// Modifies the existing archive (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. - /// The archive password. - public void ModifyArchive(string archiveName, Dictionary newFileNames, string password -#if CS4 - = "" -#endif - ) - { - ClearExceptions(); - if (!SevenZipLibraryManager.ModifyCapable) - { - throw new SevenZipLibraryException("The specified 7zip native library does not support this method."); - } - if (!File.Exists(archiveName)) - { - if (!ThrowException(null, new ArgumentException("The specified archive does not exist.", "archiveName"))) - { - return; - } - } - if (newFileNames == null || newFileNames.Count == 0) - { - if (!ThrowException(null, new ArgumentException("Invalid new file names.", "newFileNames"))) - { - return; - } - } - try - { - using (var extr = new SevenZipExtractor(archiveName)) - { - _updateData = new UpdateData(); - var archiveData = new ArchiveFileInfo[extr.ArchiveFileData.Count]; - extr.ArchiveFileData.CopyTo(archiveData, 0); - _updateData.ArchiveFileData = new List(archiveData); - } - _updateData.FileNamesToModify = newFileNames; - _updateData.Mode = InternalCompressionMode.Modify; - } - catch (SevenZipException e) - { - if (!ThrowException(null, e)) - { - return; - } - } - try - { - ISequentialOutStream sequentialArchiveStream; - _compressingFilesOnDisk = true; - using ((sequentialArchiveStream = GetOutStream(GetArchiveFileStream(archiveName))) as IDisposable) - { - IInStream inArchiveStream; - _archiveName = archiveName; - using ((inArchiveStream = GetInStream()) as IDisposable) - { - IOutArchive outArchive; - // Create IInArchive, read it and convert to IOutArchive - SevenZipLibraryManager.LoadLibrary( - this, Formats.InForOutFormats[_archiveFormat]); - if ((outArchive = MakeOutArchive(inArchiveStream)) == null) - { - return; - } - using (ArchiveUpdateCallback auc = GetArchiveUpdateCallback(null, 0, password)) - { - UInt32 deleteCount = 0; - if (_updateData.FileNamesToModify != null) - { -#if CS4 // System.Linq of C# 4 is great - deleteCount = (UInt32)_updateData.FileNamesToModify.Sum( - pairDeleted => pairDeleted.Value == null ? 1 : 0); -#else - foreach(var pairDeleted in _updateData.FileNamesToModify) - { - if (pairDeleted.Value == null) - { - deleteCount++; - } - } -#endif - } - try - { - CheckedExecute( - outArchive.UpdateItems( - sequentialArchiveStream, _oldFilesCount - deleteCount, auc), - SevenZipCompressionFailedException.DEFAULT_MESSAGE, auc); - } - finally - { - FreeCompressionCallback(auc); - } - } - } - } - } - finally - { - SevenZipLibraryManager.FreeLibrary(this, Formats.InForOutFormats[_archiveFormat]); - File.Delete(archiveName); - FinalizeUpdate(); - _compressingFilesOnDisk = false; - _updateData.FileNamesToModify = null; - _updateData.ArchiveFileData = null; - OnEvent(CompressionFinished, EventArgs.Empty, false); - } - ThrowUserException(); - } - #endregion - - #endregion - -#endif - - /// - /// Gets or sets the dictionary size for the managed LZMA algorithm. - /// - public static int LzmaDictionarySize - { - get - { - return _lzmaDictionarySize; - } - set - { - _lzmaDictionarySize = value; - } - } - - internal static void WriteLzmaProperties(Encoder encoder) - { - #region LZMA properties definition - - CoderPropId[] propIDs = - { - CoderPropId.DictionarySize, - CoderPropId.PosStateBits, - CoderPropId.LitContextBits, - CoderPropId.LitPosBits, - CoderPropId.Algorithm, - CoderPropId.NumFastBytes, - CoderPropId.MatchFinder, - CoderPropId.EndMarker - }; - object[] properties = - { - _lzmaDictionarySize, - 2, - 3, - 0, - 2, - 256, - "bt4", - false - }; - - #endregion - - encoder.SetCoderProperties(propIDs, properties); - } - - /// - /// Compresses the specified stream with LZMA algorithm (C# inside) - /// - /// The source uncompressed stream - /// The destination compressed stream - /// The length of uncompressed data (null for inStream.Length) - /// The event for handling the code progress - public static void CompressStream(Stream inStream, Stream outStream, int? inLength, - EventHandler codeProgressEvent) - { - if (!inStream.CanRead || !outStream.CanWrite) - { - throw new ArgumentException("The specified streams are invalid."); - } - var encoder = new Encoder(); - WriteLzmaProperties(encoder); - encoder.WriteCoderProperties(outStream); - long streamSize = inLength.HasValue ? inLength.Value : inStream.Length; - for (int i = 0; i < 8; i++) - { - outStream.WriteByte((byte)(streamSize >> (8 * i))); - } - encoder.Code(inStream, outStream, -1, -1, new LzmaProgressCallback(streamSize, codeProgressEvent)); - } - - /// - /// Compresses byte array with LZMA algorithm (C# inside) - /// - /// Byte array to compress - /// Compressed byte array - public static byte[] CompressBytes(byte[] data) - { - using (var inStream = new MemoryStream(data)) - { - using (var outStream = new MemoryStream()) - { - var encoder = new Encoder(); - WriteLzmaProperties(encoder); - encoder.WriteCoderProperties(outStream); - long streamSize = inStream.Length; - for (int i = 0; i < 8; i++) - outStream.WriteByte((byte)(streamSize >> (8 * i))); - encoder.Code(inStream, outStream, -1, -1, null); - return outStream.ToArray(); - } - } - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/SevenZipCompressorAsynchronous.cs b/BizHawk.Client.Common/7z/SevenZipCompressorAsynchronous.cs deleted file mode 100644 index d6efc582ce..0000000000 --- a/BizHawk.Client.Common/7z/SevenZipCompressorAsynchronous.cs +++ /dev/null @@ -1,705 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -namespace SevenZip -{ - using System.Collections.Generic; - using System.IO; -#if DOTNET20 - using System.Threading; -#else - using System.Windows.Threading; -#endif - - partial class SevenZipCompressor - { - #region Delegates - private delegate void CompressFiles1Delegate(string archiveName, string[] fileFullNames); - private delegate void CompressFiles2Delegate(Stream archiveStream, string[] fileFullNames); - private delegate void CompressFiles3Delegate(string archiveName, int commonRootLength, string[] fileFullNames); - private delegate void CompressFiles4Delegate(Stream archiveStream, int commonRootLength, string[] fileFullNames); - - private delegate void CompressFilesEncrypted1Delegate(string archiveName, string password, string[] fileFullNames); - private delegate void CompressFilesEncrypted2Delegate(Stream archiveStream, string password, string[] fileFullNames); - private delegate void CompressFilesEncrypted3Delegate(string archiveName, int commonRootLength, string password, string[] fileFullNames); - private delegate void CompressFilesEncrypted4Delegate(Stream archiveStream, int commonRootLength, string password, string[] fileFullNames); - - private delegate void CompressDirectory1Delegate(string directory, string archiveName); - private delegate void CompressDirectory2Delegate(string directory, Stream archiveStream); - private delegate void CompressDirectory3Delegate(string directory, string archiveName, string password); - private delegate void CompressDirectory4Delegate(string directory, Stream archiveStream, string password); - private delegate void CompressDirectory5Delegate(string directory, string archiveName, - string password, string searchPattern, bool recursion); - private delegate void CompressDirectory6Delegate(string directory, Stream archiveStream, - string password, string searchPattern, bool recursion); - - private delegate void CompressStream1Delegate(Stream inStream, Stream outStream); - private delegate void CompressStream2Delegate(Stream inStream, Stream outStream, string password); - - private delegate void ModifyArchive1Delegate(string archiveName, Dictionary newFileNames); - private delegate void ModifyArchive2Delegate(string archiveName, Dictionary newFileNames, - string password); - #endregion - - #region CompressFiles overloads -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name. -#endif - public void BeginCompressFiles( - string archiveName -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFiles1Delegate(CompressFiles)).BeginInvoke(archiveName, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles(string archiveName ... ) overloads for archiving to disk. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles(string archiveName ... ) overloads for archiving to disk. -#endif - public void BeginCompressFiles( - Stream archiveStream -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFiles2Delegate(CompressFiles)).BeginInvoke(archiveStream, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive file name. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive file name. -#endif - public void BeginCompressFiles( - string archiveName, int commonRootLength -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFiles3Delegate(CompressFiles)).BeginInvoke(archiveName, commonRootLength, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive output stream. - /// Use CompressFiles(string archiveName, ... ) overloads for archiving to disk. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The length of the common root of the file names. - /// The archive output stream. - /// Use CompressFiles(string archiveName, ... ) overloads for archiving to disk. -#endif - public void BeginCompressFiles( - Stream archiveStream, int commonRootLength -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFiles4Delegate(CompressFiles)).BeginInvoke(archiveStream, commonRootLength, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name - /// The archive password. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name - /// The archive password. -#endif - public void BeginCompressFilesEncrypted( - string archiveName, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFilesEncrypted1Delegate(CompressFilesEncrypted)).BeginInvoke(archiveName, password, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. -#endif - public void BeginCompressFilesEncrypted( - Stream archiveStream, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFilesEncrypted2Delegate(CompressFilesEncrypted)).BeginInvoke(archiveStream, password, fileFullNames, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name - /// The archive password. - /// The length of the common root of the file names. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive file name - /// The archive password. - /// The length of the common root of the file names. -#endif - public void BeginCompressFilesEncrypted( - string archiveName, int commonRootLength, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFilesEncrypted3Delegate(CompressFilesEncrypted)).BeginInvoke(archiveName, commonRootLength, password, - fileFullNames, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// The length of the common root of the file names. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs files into the archive asynchronously. - /// - /// Array of file names to pack. - /// The archive output stream. - /// Use CompressFiles( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// The length of the common root of the file names. -#endif - public void BeginCompressFilesEncrypted( - Stream archiveStream, int commonRootLength, string password -#if !DOTNET20 -, DispatcherPriority eventPriority -#endif - , params string[] fileFullNames - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressFilesEncrypted4Delegate(CompressFilesEncrypted)).BeginInvoke(archiveStream, commonRootLength, password, - fileFullNames, AsyncCallbackImplementation, this); - } - #endregion - - #region BeginCompressDirectory overloads - -#if !CS4 -#if !DOTNET20 - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. -#endif - public void BeginCompressDirectory( - string directory, string archiveName -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory1Delegate(CompressDirectory)).BeginInvoke(directory, archiveName, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. -#endif - public void BeginCompressDirectory( - string directory, Stream archiveStream -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory2Delegate(CompressDirectory)).BeginInvoke(directory, archiveStream, - AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. -#endif - public void BeginCompressDirectory( - string directory, string archiveName, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory3Delegate(CompressDirectory)).BeginInvoke(directory, archiveName, - password, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Recursively packs all files in the specified directory. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. -#endif - public void BeginCompressDirectory( - string directory, Stream archiveStream, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory4Delegate(CompressDirectory)).BeginInvoke(directory, archiveStream, - password, AsyncCallbackImplementation, this); - } -#endif - -#if !DOTNET20 - /// - /// Packs all files in the specified directory asynchronously. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs all files in the specified directory asynchronously. - /// - /// The directory to compress. - /// The archive file name. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. -#endif - public void BeginCompressDirectory(string directory, string archiveName, - string password -#if CS4 - = "" -#endif - , string searchPattern -#if CS4 - = "*" -#endif - , bool recursion -#if CS4 - = true -#endif -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory5Delegate(CompressDirectory)).BeginInvoke(directory, archiveName, - password, searchPattern, recursion, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Packs all files in the specified directory asynchronously. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Packs all files in the specified directory asynchronously. - /// - /// The directory to compress. - /// The archive output stream. - /// Use CompressDirectory( ... string archiveName ... ) overloads for archiving to disk. - /// The archive password. - /// Search string, such as "*.txt". - /// If true, files will be searched for recursively; otherwise, not. -#endif - public void BeginCompressDirectory(string directory, Stream archiveStream, - string password -#if CS4 - = "" -#endif - , string searchPattern -#if CS4 - = "*" -#endif - , bool recursion -#if CS4 - = true -#endif -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressDirectory6Delegate(CompressDirectory)).BeginInvoke(directory, archiveStream, - password, searchPattern, recursion, AsyncCallbackImplementation, this); - } -#endregion - - #region BeginCompressStream overloads -#if !CS4 -#if !DOTNET20 - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// ArgumentException: at least one of the specified streams is invalid. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// ArgumentException: at least one of the specified streams is invalid. -#endif - public void BeginCompressStream(Stream inStream, Stream outStream -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressStream1Delegate(CompressStream)).BeginInvoke(inStream, outStream, AsyncCallbackImplementation, this); - } -#endif - -#if !DOTNET20 - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// The archive password. - /// ArgumentException: at least one of the specified streams is invalid. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Compresses the specified stream. - /// - /// The source uncompressed stream. - /// The destination compressed stream. - /// The archive password. - /// ArgumentException: at least one of the specified streams is invalid. -#endif - public void BeginCompressStream(Stream inStream, Stream outStream, string password -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new CompressStream2Delegate(CompressStream)).BeginInvoke(inStream, outStream, password, AsyncCallbackImplementation, this); - - } - #endregion - - #region BeginModifyArchive overloads -#if !CS4 -#if !DOTNET20 - /// - /// Modifies the existing archive asynchronously (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Modifies the existing archive asynchronously (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. -#endif - public void BeginModifyArchive(string archiveName, Dictionary newFileNames -#if !DOTNET20 - , DispatcherPriority eventPriority -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ModifyArchive1Delegate(ModifyArchive)).BeginInvoke(archiveName, newFileNames, AsyncCallbackImplementation, this); - } -#endif - -#if !DOTNET20 - /// - /// Modifies the existing archive asynchronously (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. - /// The archive password. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Modifies the existing archive asynchronously (renames files or deletes them). - /// - /// The archive file name. - /// New file names. Null value to delete the corresponding index. - /// The archive password. -#endif - public void BeginModifyArchive(string archiveName, Dictionary newFileNames, - string password -#if CS4 - = "" -#endif -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif - ) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ModifyArchive2Delegate(ModifyArchive)).BeginInvoke(archiveName, newFileNames, password, AsyncCallbackImplementation, this); - } - #endregion - } -} diff --git a/BizHawk.Client.Common/7z/SevenZipExtractor.cs b/BizHawk.Client.Common/7z/SevenZipExtractor.cs deleted file mode 100644 index c7250e0231..0000000000 --- a/BizHawk.Client.Common/7z/SevenZipExtractor.cs +++ /dev/null @@ -1,1451 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.Globalization; -using System.IO; -#if DOTNET20 -using System.Threading; -#else -using System.Linq; -#endif -using SevenZip.Sdk.Compression.Lzma; -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ - /// - /// Class to unpack data from archives supported by 7-Zip. - /// - /// - /// using (var extr = new SevenZipExtractor(@"C:\Test.7z")) - /// { - /// extr.ExtractArchive(@"C:\TestDirectory"); - /// } - /// - public sealed partial class SevenZipExtractor -#if UNMANAGED - : SevenZipBase, IDisposable -#endif - { -#if UNMANAGED - private List _archiveFileData; - private IInArchive _archive; - private IInStream _archiveStream; - private int _offset; - private ArchiveOpenCallback _openCallback; - private string _fileName; - private Stream _inStream; - private long? _packedSize; - private long? _unpackedSize; - private uint? _filesCount; - private bool? _isSolid; - private bool _opened; - private bool _disposed; - private InArchiveFormat _format = (InArchiveFormat)(-1); - private ReadOnlyCollection _archiveFileInfoCollection; - private ReadOnlyCollection _archiveProperties; - private ReadOnlyCollection _volumeFileNames; - /// - /// This is used to lock possible Dispose() calls. - /// - private bool _asynchronousDisposeLock; - - #region Constructors - /// - /// General initialization function. - /// - /// The archive file name. - private void Init(string archiveFullName) - { - _fileName = archiveFullName; - bool isExecutable = false; - if ((int)_format == -1) - { - _format = FileChecker.CheckSignature(archiveFullName, out _offset, out isExecutable); - } - PreserveDirectoryStructure = true; - SevenZipLibraryManager.LoadLibrary(this, _format); - try - { - _archive = SevenZipLibraryManager.InArchive(_format, this); - } - catch (SevenZipLibraryException) - { - SevenZipLibraryManager.FreeLibrary(this, _format); - throw; - } - if (isExecutable && _format != InArchiveFormat.PE) - { - if (!Check()) - { - CommonDispose(); - _format = InArchiveFormat.PE; - SevenZipLibraryManager.LoadLibrary(this, _format); - try - { - _archive = SevenZipLibraryManager.InArchive(_format, this); - } - catch (SevenZipLibraryException) - { - SevenZipLibraryManager.FreeLibrary(this, _format); - throw; - } - } - } - } - - /// - /// General initialization function. - /// - /// The stream to read the archive from. - private void Init(Stream stream) - { - ValidateStream(stream); - bool isExecutable = false; - if ((int)_format == -1) - { - _format = FileChecker.CheckSignature(stream, out _offset, out isExecutable); - } - PreserveDirectoryStructure = true; - SevenZipLibraryManager.LoadLibrary(this, _format); - try - { - _inStream = new ArchiveEmulationStreamProxy(stream, _offset); - _packedSize = stream.Length; - _archive = SevenZipLibraryManager.InArchive(_format, this); - } - catch (SevenZipLibraryException) - { - SevenZipLibraryManager.FreeLibrary(this, _format); - throw; - } - if (isExecutable && _format != InArchiveFormat.PE) - { - if (!Check()) - { - CommonDispose(); - _format = InArchiveFormat.PE; - try - { - _inStream = new ArchiveEmulationStreamProxy(stream, _offset); - _packedSize = stream.Length; - _archive = SevenZipLibraryManager.InArchive(_format, this); - } - catch (SevenZipLibraryException) - { - SevenZipLibraryManager.FreeLibrary(this, _format); - throw; - } - } - } - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The stream to read the archive from. - /// Use SevenZipExtractor(string) to extract from disk, though it is not necessary. - /// The archive format is guessed by the signature. - public SevenZipExtractor(Stream archiveStream) - { - Init(archiveStream); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The stream to read the archive from. - /// Use SevenZipExtractor(string) to extract from disk, though it is not necessary. - /// Manual archive format setup. You SHOULD NOT normally specify it this way. - /// Instead, use SevenZipExtractor(Stream archiveStream), that constructor - /// automatically detects the archive format. - public SevenZipExtractor(Stream archiveStream, InArchiveFormat format) - { - _format = format; - Init(archiveStream); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The archive full file name. - public SevenZipExtractor(string archiveFullName) - { - Init(archiveFullName); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The archive full file name. - /// Manual archive format setup. You SHOULD NOT normally specify it this way. - /// Instead, use SevenZipExtractor(string archiveFullName), that constructor - /// automatically detects the archive format. - public SevenZipExtractor(string archiveFullName, InArchiveFormat format) - { - _format = format; - Init(archiveFullName); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The archive full file name. - /// Password for an encrypted archive. - public SevenZipExtractor(string archiveFullName, string password) - : base(password) - { - Init(archiveFullName); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The archive full file name. - /// Password for an encrypted archive. - /// Manual archive format setup. You SHOULD NOT normally specify it this way. - /// Instead, use SevenZipExtractor(string archiveFullName, string password), that constructor - /// automatically detects the archive format. - public SevenZipExtractor(string archiveFullName, string password, InArchiveFormat format) - : base(password) - { - _format = format; - Init(archiveFullName); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The stream to read the archive from. - /// Password for an encrypted archive. - /// The archive format is guessed by the signature. - public SevenZipExtractor(Stream archiveStream, string password) - : base(password) - { - Init(archiveStream); - } - - /// - /// Initializes a new instance of SevenZipExtractor class. - /// - /// The stream to read the archive from. - /// Password for an encrypted archive. - /// Manual archive format setup. You SHOULD NOT normally specify it this way. - /// Instead, use SevenZipExtractor(Stream archiveStream, string password), that constructor - /// automatically detects the archive format. - public SevenZipExtractor(Stream archiveStream, string password, InArchiveFormat format) - : base(password) - { - _format = format; - Init(archiveStream); - } - - #endregion - - #region Properties - - /// - /// Gets or sets archive full file name - /// - public string FileName - { - get - { - DisposedCheck(); - return _fileName; - } - } - - /// - /// Gets the size of the archive file - /// - public long PackedSize - { - get - { - DisposedCheck(); - return _packedSize.HasValue - ? - _packedSize.Value - : - _fileName != null - ? - (new FileInfo(_fileName)).Length - : - -1; - } - } - - /// - /// Gets the size of unpacked archive data - /// - public long UnpackedSize - { - get - { - DisposedCheck(); - if (!_unpackedSize.HasValue) - { - return -1; - } - return _unpackedSize.Value; - } - } - - /// - /// Gets a value indicating whether the archive is solid - /// - public bool IsSolid - { - get - { - DisposedCheck(); - if (!_isSolid.HasValue) - { - GetArchiveInfo(true); - } - Debug.Assert(_isSolid != null); - return _isSolid.Value; - } - } - - /// - /// Gets the number of files in the archive - /// - public uint FilesCount - { - get - { - DisposedCheck(); - if (!_filesCount.HasValue) - { - GetArchiveInfo(true); - } - Debug.Assert(_filesCount != null); - return _filesCount.Value; - } - } - - /// - /// Gets archive format - /// - public InArchiveFormat Format - { - get - { - DisposedCheck(); - return _format; - } - } - - /// - /// Gets or sets the value indicating whether to preserve the directory structure of extracted files. - /// - public bool PreserveDirectoryStructure { get; set; } - #endregion - - /// - /// Checked whether the class was disposed. - /// - /// - private void DisposedCheck() - { - if (_disposed) - { - throw new ObjectDisposedException("SevenZipExtractor"); - } -#if !WINCE - RecreateInstanceIfNeeded(); -#endif - } - - #region Core private functions - - private ArchiveOpenCallback GetArchiveOpenCallback() - { - return _openCallback ?? (_openCallback = String.IsNullOrEmpty(Password) - ? new ArchiveOpenCallback(_fileName) - : new ArchiveOpenCallback(_fileName, Password)); - } - - /// - /// Gets the archive input stream. - /// - /// The archive input wrapper stream. - private IInStream GetArchiveStream(bool dispose) - { - if (_archiveStream != null) - { - if (_archiveStream is DisposeVariableWrapper) - { - (_archiveStream as DisposeVariableWrapper).DisposeStream = dispose; - } - return _archiveStream; - } - - if (_inStream != null) - { - _inStream.Seek(0, SeekOrigin.Begin); - _archiveStream = new InStreamWrapper(_inStream, false); - } - else - { - if (!_fileName.EndsWith(".001", StringComparison.OrdinalIgnoreCase) - || (_volumeFileNames.Count == 1)) - { - _archiveStream = new InStreamWrapper( - new ArchiveEmulationStreamProxy(new FileStream( - _fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), - _offset), - dispose); - } - else - { - _archiveStream = new InMultiStreamWrapper(_fileName, dispose); - _packedSize = (_archiveStream as InMultiStreamWrapper).Length; - } - } - return _archiveStream; - } - - /// - /// Opens the archive and throws exceptions or returns OperationResult.DataError if any error occurs. - /// - /// The IInStream compliant class instance, that is, the input stream. - /// The ArchiveOpenCallback instance. - /// OperationResult.Ok if Open() succeeds. - private OperationResult OpenArchiveInner(IInStream archiveStream, - IArchiveOpenCallback openCallback) - { - ulong checkPos = 1 << 15; - int res = _archive.Open(archiveStream, ref checkPos, openCallback); - return (OperationResult)res; - } - - /// - /// Opens the archive and throws exceptions or returns OperationResult.DataError if any error occurs. - /// - /// The IInStream compliant class instance, that is, the input stream. - /// The ArchiveOpenCallback instance. - /// True if Open() succeeds; otherwise, false. - private bool OpenArchive(IInStream archiveStream, - ArchiveOpenCallback openCallback) - { - if (!_opened) - { - if (OpenArchiveInner(archiveStream, openCallback) != OperationResult.Ok) - { - if (!ThrowException(null, new SevenZipArchiveException())) - { - return false; - } - } - _volumeFileNames = new ReadOnlyCollection(openCallback.VolumeFileNames); - _opened = true; - } - return true; - } - - /// - /// Retrieves all information about the archive. - /// - /// - private void GetArchiveInfo(bool disposeStream) - { - if (_archive == null) - { - if (!ThrowException(null, new SevenZipArchiveException())) - { - return; - } - } - else - { - IInStream archiveStream; - using ((archiveStream = GetArchiveStream(disposeStream)) as IDisposable) - { - var openCallback = GetArchiveOpenCallback(); - if (!_opened) - { - if (!OpenArchive(archiveStream, openCallback)) - { - return; - } - _opened = !disposeStream; - } - _filesCount = _archive.GetNumberOfItems(); - _archiveFileData = new List((int)_filesCount); - if (_filesCount != 0) - { - var data = new PropVariant(); - try - { - #region Getting archive items data - - for (uint i = 0; i < _filesCount; i++) - { - try - { - var fileInfo = new ArchiveFileInfo { Index = (int)i }; - _archive.GetProperty(i, ItemPropId.Path, ref data); - fileInfo.FileName = NativeMethods.SafeCast(data, "[no name]"); - _archive.GetProperty(i, ItemPropId.LastWriteTime, ref data); - fileInfo.LastWriteTime = NativeMethods.SafeCast(data, DateTime.Now); - _archive.GetProperty(i, ItemPropId.CreationTime, ref data); - fileInfo.CreationTime = NativeMethods.SafeCast(data, DateTime.Now); - _archive.GetProperty(i, ItemPropId.LastAccessTime, ref data); - fileInfo.LastAccessTime = NativeMethods.SafeCast(data, DateTime.Now); - _archive.GetProperty(i, ItemPropId.Size, ref data); - fileInfo.Size = NativeMethods.SafeCast(data, 0); - if (fileInfo.Size == 0) - { - fileInfo.Size = NativeMethods.SafeCast(data, 0); - } - _archive.GetProperty(i, ItemPropId.Attributes, ref data); - fileInfo.Attributes = NativeMethods.SafeCast(data, 0); - _archive.GetProperty(i, ItemPropId.IsDirectory, ref data); - fileInfo.IsDirectory = NativeMethods.SafeCast(data, false); - _archive.GetProperty(i, ItemPropId.Encrypted, ref data); - fileInfo.Encrypted = NativeMethods.SafeCast(data, false); - _archive.GetProperty(i, ItemPropId.Crc, ref data); - fileInfo.Crc = NativeMethods.SafeCast(data, 0); - _archive.GetProperty(i, ItemPropId.Comment, ref data); - fileInfo.Comment = NativeMethods.SafeCast(data, ""); - _archiveFileData.Add(fileInfo); - } - catch (InvalidCastException) - { - ThrowException(null, new SevenZipArchiveException("probably archive is corrupted.")); - } - } - - #endregion - - #region Getting archive properties - - uint numProps = _archive.GetNumberOfArchiveProperties(); - var archProps = new List((int)numProps); - for (uint i = 0; i < numProps; i++) - { - string propName; - ItemPropId propId; - ushort varType; - _archive.GetArchivePropertyInfo(i, out propName, out propId, out varType); - _archive.GetArchiveProperty(propId, ref data); - if (propId == ItemPropId.Solid) - { - _isSolid = NativeMethods.SafeCast(data, true); - } - // TODO Add more archive properties - if (PropIdToName.PropIdNames.ContainsKey(propId)) - { - archProps.Add(new ArchiveProperty - { - Name = PropIdToName.PropIdNames[propId], - Value = data.Object - }); - } - else - { - Debug.WriteLine( - "An unknown archive property encountered (code " + - ((int)propId).ToString(CultureInfo.InvariantCulture) + ')'); - } - } - _archiveProperties = new ReadOnlyCollection(archProps); - if (!_isSolid.HasValue && _format == InArchiveFormat.Zip) - { - _isSolid = false; - } - if (!_isSolid.HasValue) - { - _isSolid = true; - } - - #endregion - } - catch (Exception) - { - if (openCallback.ThrowException()) - { - throw; - } - } - } - } - if (disposeStream) - { - _archive.Close(); - _archiveStream = null; - } - _archiveFileInfoCollection = new ReadOnlyCollection(_archiveFileData); - } - } - - /// - /// Ensure that _archiveFileData is loaded. - /// - /// Dispose the archive stream after this operation. - private void InitArchiveFileData(bool disposeStream) - { - if (_archiveFileData == null) - { - GetArchiveInfo(disposeStream); - } - } - - /// - /// Produces an array of indexes from 0 to the maximum value in the specified array - /// - /// The source array - /// The array of indexes from 0 to the maximum value in the specified array - private static uint[] SolidIndexes(uint[] indexes) - { -#if CS4 - int max = indexes.Aggregate(0, (current, i) => Math.Max(current, (int) i)); -#else - int max = 0; - foreach (uint i in indexes) - { - max = Math.Max(max, (int)i); - } -#endif - if (max > 0) - { - max++; - var res = new uint[max]; - for (int i = 0; i < max; i++) - { - res[i] = (uint)i; - } - return res; - } - return indexes; - } - - /// - /// Checkes whether all the indexes are valid. - /// - /// The indexes to check. - /// True is valid; otherwise, false. - private static bool CheckIndexes(params int[] indexes) - { -#if CS4 // Wow, C# 4 is great! - return indexes.All(i => i >= 0); -#else - bool res = true; - foreach (int i in indexes) - { - if (i < 0) - { - res = false; - break; - } - } - return res; -#endif - } - - private void ArchiveExtractCallbackCommonInit(ArchiveExtractCallback aec) - { - aec.Open += ((s, e) => { _unpackedSize = (long)e.TotalSize; }); - aec.FileExtractionStarted += FileExtractionStartedEventProxy; - aec.FileExtractionFinished += FileExtractionFinishedEventProxy; - aec.Extracting += ExtractingEventProxy; - aec.FileExists += FileExistsEventProxy; - } - - /// - /// Gets the IArchiveExtractCallback callback - /// - /// The directory where extract the files - /// The number of files to be extracted - /// The list of actual indexes (solid archives support) - /// The ArchiveExtractCallback callback - private ArchiveExtractCallback GetArchiveExtractCallback(string directory, int filesCount, - List actualIndexes) - { - var aec = String.IsNullOrEmpty(Password) - ? new ArchiveExtractCallback(_archive, directory, filesCount, PreserveDirectoryStructure, actualIndexes, this) - : new ArchiveExtractCallback(_archive, directory, filesCount, PreserveDirectoryStructure, actualIndexes, Password, this); - ArchiveExtractCallbackCommonInit(aec); - return aec; - } - - /// - /// Gets the IArchiveExtractCallback callback - /// - /// The stream where extract the file - /// The file index - /// The number of files to be extracted - /// The ArchiveExtractCallback callback - private ArchiveExtractCallback GetArchiveExtractCallback(Stream stream, uint index, int filesCount) - { - var aec = String.IsNullOrEmpty(Password) - ? new ArchiveExtractCallback(_archive, stream, filesCount, index, this) - : new ArchiveExtractCallback(_archive, stream, filesCount, index, Password, this); - ArchiveExtractCallbackCommonInit(aec); - return aec; - } - - private void FreeArchiveExtractCallback(ArchiveExtractCallback callback) - { - callback.Open -= ((s, e) => { _unpackedSize = (long)e.TotalSize; }); - callback.FileExtractionStarted -= FileExtractionStartedEventProxy; - callback.FileExtractionFinished -= FileExtractionFinishedEventProxy; - callback.Extracting -= ExtractingEventProxy; - callback.FileExists -= FileExistsEventProxy; - } - #endregion -#endif - - /// - /// Checks if the specified stream supports extraction. - /// - /// The stream to check. - private static void ValidateStream(Stream stream) - { - if (stream == null) - { - throw new ArgumentNullException("stream"); - } - if (!stream.CanSeek || !stream.CanRead) - { - throw new ArgumentException("The specified stream can not seek or read.", "stream"); - } - if (stream.Length == 0) - { - throw new ArgumentException("The specified stream has zero length.", "stream"); - } - } - -#if UNMANAGED - - #region IDisposable Members - - private void CommonDispose() - { - if (_opened) - { - try - { - if (_archive != null) - { - _archive.Close(); - } - } - catch (Exception) { } - } - _archive = null; - _archiveFileData = null; - _archiveProperties = null; - _archiveFileInfoCollection = null; - if (_inStream != null) - { - _inStream.Dispose(); - } - _inStream = null; - if (_openCallback != null) - { - try - { - _openCallback.Dispose(); - } - catch (ObjectDisposedException) { } - _openCallback = null; - } - if (_archiveStream != null) - { - if (_archiveStream is IDisposable) - { - try - { - if (_archiveStream is DisposeVariableWrapper) - { - (_archiveStream as DisposeVariableWrapper).DisposeStream = true; - } - (_archiveStream as IDisposable).Dispose(); - } - catch (ObjectDisposedException) { } - _archiveStream = null; - } - } - SevenZipLibraryManager.FreeLibrary(this, _format); - } - - /// - /// Releases the unmanaged resources used by SevenZipExtractor. - /// - public void Dispose() - { - if (_asynchronousDisposeLock) - { - throw new InvalidOperationException("SevenZipExtractor instance must not be disposed " + - "while making an asynchronous method call."); - } - if (!_disposed) - { - CommonDispose(); - } - _disposed = true; - GC.SuppressFinalize(this); - } - - #endregion - - #region Core public Members - - #region Events - - /// - /// Occurs when a new file is going to be unpacked. - /// - /// Occurs when 7-zip engine requests for an output stream for a new file to unpack in. - public event EventHandler FileExtractionStarted; - - /// - /// Occurs when a file has been successfully unpacked. - /// - public event EventHandler FileExtractionFinished; - - /// - /// Occurs when the archive has been unpacked. - /// - public event EventHandler ExtractionFinished; - - /// - /// Occurs when data are being extracted. - /// - /// Use this event for accurate progress handling and various ProgressBar.StepBy(e.PercentDelta) routines. - public event EventHandler Extracting; - - /// - /// Occurs during the extraction when a file already exists. - /// - public event EventHandler FileExists; - - #region Event proxies - /// - /// Event proxy for FileExtractionStarted. - /// - /// The sender of the event. - /// The event arguments. - private void FileExtractionStartedEventProxy(object sender, FileInfoEventArgs e) - { - OnEvent(FileExtractionStarted, e, true); - } - - /// - /// Event proxy for FileExtractionFinished. - /// - /// The sender of the event. - /// The event arguments. - private void FileExtractionFinishedEventProxy(object sender, FileInfoEventArgs e) - { - OnEvent(FileExtractionFinished, e, true); - } - - /// - /// Event proxy for Extractng. - /// - /// The sender of the event. - /// The event arguments. - private void ExtractingEventProxy(object sender, ProgressEventArgs e) - { - OnEvent(Extracting, e, false); - } - - /// - /// Event proxy for FileExists. - /// - /// The sender of the event. - /// The event arguments. - private void FileExistsEventProxy(object sender, FileOverwriteEventArgs e) - { - OnEvent(FileExists, e, true); - } - #endregion - #endregion - - #region Properties - /// - /// Gets the collection of ArchiveFileInfo with all information about files in the archive - /// - public ReadOnlyCollection ArchiveFileData - { - get - { - DisposedCheck(); - InitArchiveFileData(true); - return _archiveFileInfoCollection; - } - } - - /// - /// Gets the properties for the current archive - /// - public ReadOnlyCollection ArchiveProperties - { - get - { - DisposedCheck(); - InitArchiveFileData(true); - return _archiveProperties; - } - } - - /// - /// Gets the collection of all file names contained in the archive. - /// - /// - /// Each get recreates the collection - /// - public ReadOnlyCollection ArchiveFileNames - { - get - { - DisposedCheck(); - InitArchiveFileData(true); - var fileNames = new List(_archiveFileData.Count); -#if CS4 - fileNames.AddRange(_archiveFileData.Select(afi => afi.FileName)); -#else - foreach (var afi in _archiveFileData) - { - fileNames.Add(afi.FileName); - } -#endif - return new ReadOnlyCollection(fileNames); - } - } - - /// - /// Gets the list of archive volume file names. - /// - public ReadOnlyCollection VolumeFileNames - { - get - { - DisposedCheck(); - InitArchiveFileData(true); - return _volumeFileNames; - } - } - #endregion - - /// - /// Performs the archive integrity test. - /// - /// True is the archive is ok; otherwise, false. - public bool Check() - { - DisposedCheck(); - try - { - InitArchiveFileData(false); - var archiveStream = GetArchiveStream(true); - var openCallback = GetArchiveOpenCallback(); - if (!OpenArchive(archiveStream, openCallback)) - { - return false; - } - using (var aec = GetArchiveExtractCallback("", (int)_filesCount, null)) - { - try - { - CheckedExecute( - _archive.Extract(null, UInt32.MaxValue, 1, aec), - SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec); - } - finally - { - FreeArchiveExtractCallback(aec); - } - } - } - catch (Exception) - { - return false; - } - finally - { - if (_archive != null) - { - _archive.Close(); - } - ((InStreamWrapper)_archiveStream).Dispose(); - _archiveStream = null; - _opened = false; - } - return true; - } - - #region ExtractFile overloads - /// - /// Unpacks the file by its name to the specified stream. - /// - /// The file full name in the archive file table. - /// The stream where the file is to be unpacked. - public void ExtractFile(string fileName, Stream stream) - { - DisposedCheck(); - InitArchiveFileData(false); - int index = -1; - foreach (ArchiveFileInfo afi in _archiveFileData) - { - if (afi.FileName == fileName && !afi.IsDirectory) - { - index = afi.Index; - break; - } - } - if (index == -1) - { - if (!ThrowException(null, new ArgumentOutOfRangeException( - "fileName", - "The specified file name was not found in the archive file table."))) - { - return; - } - } - else - { - ExtractFile(index, stream); - } - } - - /// - /// Unpacks the file by its index to the specified stream. - /// - /// Index in the archive file table. - /// The stream where the file is to be unpacked. - public void ExtractFile(int index, Stream stream) - { - DisposedCheck(); - ClearExceptions(); - if (!CheckIndexes(index)) - { - if (!ThrowException(null, new ArgumentException("The index must be more or equal to zero.", "index"))) - { - return; - } - } - if (!stream.CanWrite) - { - if (!ThrowException(null, new ArgumentException("The specified stream can not be written.", "stream"))) - { - return; - } - } - InitArchiveFileData(false); - if (index > _filesCount - 1) - { - if (!ThrowException(null, new ArgumentOutOfRangeException( - "index", "The specified index is greater than the archive files count."))) - { - return; - } - } - var indexes = new[] {(uint) index}; - if (_isSolid.Value) - { - indexes = SolidIndexes(indexes); - } - var archiveStream = GetArchiveStream(false); - var openCallback = GetArchiveOpenCallback(); - if (!OpenArchive(archiveStream, openCallback)) - { - return; - } - try - { - using (var aec = GetArchiveExtractCallback(stream, (uint) index, indexes.Length)) - { - try - { - CheckedExecute( - _archive.Extract(indexes, (uint) indexes.Length, 0, aec), - SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec); - } - finally - { - FreeArchiveExtractCallback(aec); - } - } - } - catch (Exception) - { - if (openCallback.ThrowException()) - { - throw; - } - } - OnEvent(ExtractionFinished, EventArgs.Empty, false); - ThrowUserException(); - } - #endregion - - #region ExtractFiles overloads - /// - /// Unpacks files by their indices to the specified directory. - /// - /// indexes of the files in the archive file table. - /// Directory where the files are to be unpacked. - public void ExtractFiles(string directory, params int[] indexes) - { - DisposedCheck(); - ClearExceptions(); - if (!CheckIndexes(indexes)) - { - if ( - !ThrowException(null, new ArgumentException("The indexes must be more or equal to zero.", "indexes"))) - { - return; - } - } - InitArchiveFileData(false); - - #region Indexes stuff - - var uindexes = new uint[indexes.Length]; - for (int i = 0; i < indexes.Length; i++) - { - uindexes[i] = (uint) indexes[i]; - } -#if CS4 - if (uindexes.Where(i => i >= _filesCount).Any( - i => !ThrowException(null, - new ArgumentOutOfRangeException("indexes", - "Index must be less than " + - _filesCount.Value.ToString( - CultureInfo.InvariantCulture) + "!")))) - { - return; - } -#else - foreach (uint i in uindexes) - { - if (i >= _filesCount) - { - if (!ThrowException(null, - new ArgumentOutOfRangeException("indexes", - "Index must be less than " + - _filesCount.Value.ToString( - CultureInfo.InvariantCulture) + "!"))) - { - return; - } - } - } -#endif - var origIndexes = new List(uindexes); - origIndexes.Sort(); - uindexes = origIndexes.ToArray(); - if (_isSolid.Value) - { - uindexes = SolidIndexes(uindexes); - } - - #endregion - - try - { - IInStream archiveStream; - using ((archiveStream = GetArchiveStream(origIndexes.Count != 1)) as IDisposable) - { - var openCallback = GetArchiveOpenCallback(); - if (!OpenArchive(archiveStream, openCallback)) - { - return; - } - try - { - using (var aec = GetArchiveExtractCallback(directory, (int) _filesCount, origIndexes)) - { - try - { - CheckedExecute( - _archive.Extract(uindexes, (uint) uindexes.Length, 0, aec), - SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec); - } - finally - { - FreeArchiveExtractCallback(aec); - } - } - } - catch (Exception) - { - if (openCallback.ThrowException()) - { - throw; - } - } - } - OnEvent(ExtractionFinished, EventArgs.Empty, false); - } - finally - { - if (origIndexes.Count > 1) - { - if (_archive != null) - { - _archive.Close(); - } - _archiveStream = null; - _opened = false; - } - } - ThrowUserException(); - } - - /// - /// Unpacks files by their full names to the specified directory. - /// - /// Full file names in the archive file table. - /// Directory where the files are to be unpacked. - public void ExtractFiles(string directory, params string[] fileNames) - { - DisposedCheck(); - InitArchiveFileData(false); - var indexes = new List(fileNames.Length); - var archiveFileNames = new List(ArchiveFileNames); - foreach (string fn in fileNames) - { - if (!archiveFileNames.Contains(fn)) - { - if ( - !ThrowException(null, - new ArgumentOutOfRangeException("fileNames", - "File \"" + fn + - "\" was not found in the archive file table."))) - { - return; - } - } - else - { - foreach (ArchiveFileInfo afi in _archiveFileData) - { - if (afi.FileName == fn && !afi.IsDirectory) - { - indexes.Add(afi.Index); - break; - } - } - } - } - ExtractFiles(directory, indexes.ToArray()); - } - - /// - /// Extracts files from the archive, giving a callback the choice what - /// to do with each file. The order of the files is given by the archive. - /// 7-Zip (and any other solid) archives are NOT supported. - /// - /// The callback to call for each file in the archive. - public void ExtractFiles(ExtractFileCallback extractFileCallback) - { - DisposedCheck(); - InitArchiveFileData(false); - if (IsSolid) - { - // solid strategy - } - else - { - foreach (ArchiveFileInfo archiveFileInfo in ArchiveFileData) - { - var extractFileCallbackArgs = new ExtractFileCallbackArgs(archiveFileInfo); - extractFileCallback(extractFileCallbackArgs); - if (extractFileCallbackArgs.CancelExtraction) - { - break; - } - if (extractFileCallbackArgs.ExtractToStream != null || extractFileCallbackArgs.ExtractToFile != null) - { - bool callDone = false; - try - { - if (extractFileCallbackArgs.ExtractToStream != null) - { - ExtractFile(archiveFileInfo.Index, extractFileCallbackArgs.ExtractToStream); - } - else - { - using (var file = new FileStream(extractFileCallbackArgs.ExtractToFile, FileMode.CreateNew, - FileAccess.Write, FileShare.None, 8192)) - { - ExtractFile(archiveFileInfo.Index, file); - } - } - callDone = true; - } - catch (Exception ex) - { - extractFileCallbackArgs.Exception = ex; - extractFileCallbackArgs.Reason = ExtractFileCallbackReason.Failure; - extractFileCallback(extractFileCallbackArgs); - if (!ThrowException(null, ex)) - { - return; - } - } - if (callDone) - { - extractFileCallbackArgs.Reason = ExtractFileCallbackReason.Done; - extractFileCallback(extractFileCallbackArgs); - } - } - } - } - } - #endregion - - /// - /// Unpacks the whole archive to the specified directory. - /// - /// The directory where the files are to be unpacked. - public void ExtractArchive(string directory) - { - DisposedCheck(); - ClearExceptions(); - InitArchiveFileData(false); - try - { - IInStream archiveStream; - using ((archiveStream = GetArchiveStream(true)) as IDisposable) - { - var openCallback = GetArchiveOpenCallback(); - if (!OpenArchive(archiveStream, openCallback)) - { - return; - } - try - { - using (var aec = GetArchiveExtractCallback(directory, (int) _filesCount, null)) - { - try - { - CheckedExecute( - _archive.Extract(null, UInt32.MaxValue, 0, aec), - SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec); - OnEvent(ExtractionFinished, EventArgs.Empty, false); - } - finally - { - FreeArchiveExtractCallback(aec); - } - } - } - catch (Exception) - { - if (openCallback.ThrowException()) - { - throw; - } - } - } - } - finally - { - if (_archive != null) - { - _archive.Close(); - } - _archiveStream = null; - _opened = false; - } - ThrowUserException(); - } - #endregion - -#endif - - #region LZMA SDK functions - - internal static byte[] GetLzmaProperties(Stream inStream, out long outSize) - { - var lzmAproperties = new byte[5]; - if (inStream.Read(lzmAproperties, 0, 5) != 5) - { - throw new LzmaException(); - } - outSize = 0; - for (int i = 0; i < 8; i++) - { - int b = inStream.ReadByte(); - if (b < 0) - { - throw new LzmaException(); - } - outSize |= ((long) (byte) b) << (i << 3); - } - return lzmAproperties; - } - - /// - /// Decompress the specified stream (C# inside) - /// - /// The source compressed stream - /// The destination uncompressed stream - /// The length of compressed data (null for inStream.Length) - /// The event for handling the code progress - public static void DecompressStream(Stream inStream, Stream outStream, int? inLength, - EventHandler codeProgressEvent) - { - if (!inStream.CanRead || !outStream.CanWrite) - { - throw new ArgumentException("The specified streams are invalid."); - } - var decoder = new Decoder(); - long outSize, inSize = (inLength.HasValue ? inLength.Value : inStream.Length) - inStream.Position; - decoder.SetDecoderProperties(GetLzmaProperties(inStream, out outSize)); - decoder.Code( - inStream, outStream, inSize, outSize, - new LzmaProgressCallback(inSize, codeProgressEvent)); - } - - /// - /// Decompress byte array compressed with LZMA algorithm (C# inside) - /// - /// Byte array to decompress - /// Decompressed byte array - public static byte[] ExtractBytes(byte[] data) - { - using (var inStream = new MemoryStream(data)) - { - var decoder = new Decoder(); - inStream.Seek(0, 0); - using (var outStream = new MemoryStream()) - { - long outSize; - decoder.SetDecoderProperties(GetLzmaProperties(inStream, out outSize)); - decoder.Code(inStream, outStream, inStream.Length - inStream.Position, outSize, null); - return outStream.ToArray(); - } - } - } - - #endregion - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/SevenZipExtractorAsynchronous.cs b/BizHawk.Client.Common/7z/SevenZipExtractorAsynchronous.cs deleted file mode 100644 index 4d00ddc4ce..0000000000 --- a/BizHawk.Client.Common/7z/SevenZipExtractorAsynchronous.cs +++ /dev/null @@ -1,317 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -namespace SevenZip -{ - using System; - using System.IO; -#if DOTNET20 - using System.Threading; -#else - using System.Windows.Threading; -#endif - - partial class SevenZipExtractor - { - #region Asynchronous core methods - - /// - /// Recreates the instance of the SevenZipExtractor class. - /// Used in asynchronous methods. - /// - private void RecreateInstanceIfNeeded() - { - if (NeedsToBeRecreated) - { - NeedsToBeRecreated = false; - Stream backupStream = null; - string backupFileName = null; - if (String.IsNullOrEmpty(_fileName)) - { - backupStream = _inStream; - } - else - { - backupFileName = _fileName; - } - CommonDispose(); - if (backupStream == null) - { - Init(backupFileName); - } - else - { - Init(backupStream); - } - } - } - - internal override void SaveContext( -#if !DOTNET20 - DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - DisposedCheck(); - _asynchronousDisposeLock = true; - base.SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - - } - - internal override void ReleaseContext() - { - base.ReleaseContext(); - _asynchronousDisposeLock = false; - } - - #endregion - - #region Delegates - /// - /// The delegate to use in BeginExtractArchive. - /// - /// The directory where the files are to be unpacked. - private delegate void ExtractArchiveDelegate(string directory); - - /// - /// The delegate to use in BeginExtractFile (by file name). - /// - /// The file full name in the archive file table. - /// The stream where the file is to be unpacked. - private delegate void ExtractFileByFileNameDelegate(string fileName, Stream stream); - - /// - /// The delegate to use in BeginExtractFile (by index). - /// - /// Index in the archive file table. - /// The stream where the file is to be unpacked. - private delegate void ExtractFileByIndexDelegate(int index, Stream stream); - - /// - /// The delegate to use in BeginExtractFiles(string directory, params int[] indexes). - /// - /// indexes of the files in the archive file table. - /// Directory where the files are to be unpacked. - private delegate void ExtractFiles1Delegate(string directory, int[] indexes); - - /// - /// The delegate to use in BeginExtractFiles(string directory, params string[] fileNames). - /// - /// Full file names in the archive file table. - /// Directory where the files are to be unpacked. - private delegate void ExtractFiles2Delegate(string directory, string[] fileNames); - - /// - /// The delegate to use in BeginExtractFiles(ExtractFileCallback extractFileCallback). - /// - /// The callback to call for each file in the archive. - private delegate void ExtractFiles3Delegate(ExtractFileCallback extractFileCallback); - #endregion - -#if !DOTNET20 - /// - /// Unpacks the whole archive asynchronously to the specified directory name at the specified priority. - /// - /// The directory where the files are to be unpacked. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Unpacks the whole archive asynchronously to the specified directory name at the specified priority. - /// - /// The directory where the files are to be unpacked. -#endif - public void BeginExtractArchive(string directory -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractArchiveDelegate(ExtractArchive)).BeginInvoke(directory, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Unpacks the file asynchronously by its name to the specified stream. - /// - /// The file full name in the archive file table. - /// The stream where the file is to be unpacked. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Unpacks the file asynchronously by its name to the specified stream. - /// - /// The file full name in the archive file table. - /// The stream where the file is to be unpacked. -#endif - public void BeginExtractFile(string fileName, Stream stream -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractFileByFileNameDelegate(ExtractFile)).BeginInvoke(fileName, stream, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Unpacks the file asynchronously by its index to the specified stream. - /// - /// Index in the archive file table. - /// The stream where the file is to be unpacked. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Unpacks the file asynchronously by its index to the specified stream. - /// - /// Index in the archive file table. - /// The stream where the file is to be unpacked. -#endif - public void BeginExtractFile(int index, Stream stream -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractFileByIndexDelegate(ExtractFile)).BeginInvoke(index, stream, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Unpacks files asynchronously by their indices to the specified directory. - /// - /// indexes of the files in the archive file table. - /// Directory where the files are to be unpacked. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Unpacks files asynchronously by their indices to the specified directory. - /// - /// indexes of the files in the archive file table. - /// Directory where the files are to be unpacked. -#endif - public void BeginExtractFiles(string directory -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif - , params int[] indexes) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractFiles1Delegate(ExtractFiles)).BeginInvoke(directory, indexes, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Unpacks files asynchronously by their full names to the specified directory. - /// - /// Full file names in the archive file table. - /// Directory where the files are to be unpacked. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Unpacks files asynchronously by their full names to the specified directory. - /// - /// Full file names in the archive file table. - /// Directory where the files are to be unpacked. -#endif - public void BeginExtractFiles(string directory -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif - , params string[] fileNames) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractFiles2Delegate(ExtractFiles)).BeginInvoke(directory, fileNames, AsyncCallbackImplementation, this); - } - -#if !DOTNET20 - /// - /// Extracts files from the archive asynchronously, giving a callback the choice what - /// to do with each file. The order of the files is given by the archive. - /// 7-Zip (and any other solid) archives are NOT supported. - /// - /// The callback to call for each file in the archive. - /// The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked. -#else - /// - /// Extracts files from the archive asynchronously, giving a callback the choice what - /// to do with each file. The order of the files is given by the archive. - /// 7-Zip (and any other solid) archives are NOT supported. - /// - /// The callback to call for each file in the archive. -#endif - public void BeginExtractFiles(ExtractFileCallback extractFileCallback -#if !DOTNET20 - , DispatcherPriority eventPriority -#if CS4 - = DispatcherPriority.Normal -#endif -#endif -) - { - SaveContext( -#if !DOTNET20 - eventPriority -#endif - ); - (new ExtractFiles3Delegate(ExtractFiles)).BeginInvoke(extractFileCallback, AsyncCallbackImplementation, this); - } - } -} diff --git a/BizHawk.Client.Common/7z/SevenZipSfx.cs b/BizHawk.Client.Common/7z/SevenZipSfx.cs deleted file mode 100644 index c02d279fd9..0000000000 --- a/BizHawk.Client.Common/7z/SevenZipSfx.cs +++ /dev/null @@ -1,499 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Text; -using System.Xml; -using System.Xml.Schema; - -namespace SevenZip -{ -#if SFX - using SfxSettings = Dictionary; - - /// - /// Sfx module choice enumeration - /// - public enum SfxModule - { - /// - /// Default module (leave this if unsure) - /// - Default, - /// - /// The simple sfx module by Igor Pavlov with no adjustable parameters - /// - Simple, - /// - /// The installer sfx module by Igor Pavlov - /// - Installer, - /// - /// The extended installer sfx module by Oleg Scherbakov - /// - Extended, - /// - /// The custom sfx module. First you must specify the module file name. - /// - Custom - } - - /// - /// The class for making 7-zip based self-extracting archives. - /// - public class SevenZipSfx - { - private static readonly Dictionary> SfxSupportedModuleNames = - new Dictionary>(3) - { - {SfxModule.Default, new List(1) {"7zxSD_All.sfx"}}, - {SfxModule.Simple, new List(2) {"7z.sfx", "7zCon.sfx"}}, - {SfxModule.Installer, new List(2) {"7zS.sfx", "7zSD.sfx"}}, - { - SfxModule.Extended, - new List(4) {"7zxSD_All.sfx", "7zxSD_Deflate", "7zxSD_LZMA", "7zxSD_PPMd"} - } - }; - - private SfxModule _module = SfxModule.Default; - private string _moduleFileName; - private Dictionary> _sfxCommands; - - /// - /// Initializes a new instance of the SevenZipSfx class. - /// - public SevenZipSfx() - { - _module = SfxModule.Default; - CommonInit(); - } - - /// - /// Initializes a new instance of the SevenZipSfx class. - /// - /// The sfx module to use as a front-end. - public SevenZipSfx(SfxModule module) - { - if (module == SfxModule.Custom) - { - throw new ArgumentException("You must specify the custom module executable.", "module"); - } - _module = module; - CommonInit(); - } - - /// - /// Initializes a new instance of the SevenZipSfx class. - /// - /// - public SevenZipSfx(string moduleFileName) - { - _module = SfxModule.Custom; - ModuleFileName = moduleFileName; - CommonInit(); - } - - /// - /// Gets the sfx module type. - /// - public SfxModule SfxModule - { - get - { - return _module; - } - } - - /// - /// Gets or sets the custom sfx module file name - /// - public string ModuleFileName - { - get - { - return _moduleFileName; - } - - set - { - if (!File.Exists(value)) - { - throw new ArgumentException("The specified file does not exist."); - } - _moduleFileName = value; - _module = SfxModule.Custom; - string sfxName = Path.GetFileName(value); - foreach (SfxModule mod in SfxSupportedModuleNames.Keys) - { - if (SfxSupportedModuleNames[mod].Contains(sfxName)) - { - _module = mod; - } - } - } - } - - private void CommonInit() - { - LoadCommandsFromResource("Configs"); - } - - private static string GetResourceString(string str) - { -#if !WINCE - return "SevenZip.sfx." + str; -#else - return "SevenZipSharpMobile.sfx." + str; -#endif - } - - /// - /// Gets the sfx module enum by the list of supported modules - /// - /// - /// - private static SfxModule GetModuleByName(string name) - { - if (name.IndexOf("7z.sfx", StringComparison.Ordinal) > -1) - { - return SfxModule.Simple; - } - if (name.IndexOf("7zS.sfx", StringComparison.Ordinal) > -1) - { - return SfxModule.Installer; - } - if (name.IndexOf("7zxSD_All.sfx", StringComparison.Ordinal) > -1) - { - return SfxModule.Extended; - } - throw new SevenZipSfxValidationException("The specified configuration is unsupported."); - } - - /// - /// Loads the commands for each supported sfx module configuration - /// - /// The resource name for xml definitions - private void LoadCommandsFromResource(string xmlDefinitions) - { - using (Stream cfg = Assembly.GetExecutingAssembly().GetManifestResourceStream( - GetResourceString(xmlDefinitions + ".xml"))) - { - if (cfg == null) - { - throw new SevenZipSfxValidationException("The configuration \"" + xmlDefinitions + - "\" does not exist."); - } - using (Stream schm = Assembly.GetExecutingAssembly().GetManifestResourceStream( - GetResourceString(xmlDefinitions + ".xsd"))) - { - if (schm == null) - { - throw new SevenZipSfxValidationException("The configuration schema \"" + xmlDefinitions + - "\" does not exist."); - } - var sc = new XmlSchemaSet(); - using (XmlReader scr = XmlReader.Create(schm)) - { - sc.Add(null, scr); - var settings = new XmlReaderSettings {ValidationType = ValidationType.Schema, Schemas = sc}; - string validationErrors = ""; - settings.ValidationEventHandler += - ((s, t) => - { - validationErrors += String.Format(CultureInfo.InvariantCulture, "[{0}]: {1}\n", - t.Severity.ToString(), t.Message); - }); - using (XmlReader rdr = XmlReader.Create(cfg, settings)) - { - _sfxCommands = new Dictionary>(); - rdr.Read(); - rdr.Read(); - rdr.Read(); - rdr.Read(); - rdr.Read(); - rdr.ReadStartElement("sfxConfigs"); - rdr.Read(); - do - { - SfxModule mod = GetModuleByName(rdr["modules"]); - rdr.ReadStartElement("config"); - rdr.Read(); - if (rdr.Name == "id") - { - var cmds = new List(); - _sfxCommands.Add(mod, cmds); - do - { - cmds.Add(rdr["command"]); - rdr.Read(); - rdr.Read(); - } while (rdr.Name == "id"); - rdr.ReadEndElement(); - rdr.Read(); - } - else - { - _sfxCommands.Add(mod, null); - } - } while (rdr.Name == "config"); - } - if (!String.IsNullOrEmpty(validationErrors)) - { - throw new SevenZipSfxValidationException( - "\n" + validationErrors.Substring(0, validationErrors.Length - 1)); - } - _sfxCommands.Add(SfxModule.Default, _sfxCommands[SfxModule.Extended]); - } - } - } - } - - /// - /// Validates the sfx scenario commands. - /// - /// The sfx settings dictionary to validate. - private void ValidateSettings(SfxSettings settings) - { - if (_module == SfxModule.Custom) - { - return; - } - List commands = _sfxCommands[_module]; - if (commands == null) - { - return; - } - var invalidCommands = new List(); - foreach (string command in settings.Keys) - { - if (!commands.Contains(command)) - { - invalidCommands.Add(command); - } - } - if (invalidCommands.Count > 0) - { - var invalidText = new StringBuilder("\nInvalid commands:\n"); - foreach (string str in invalidCommands) - { - invalidText.Append(str); - } - throw new SevenZipSfxValidationException(invalidText.ToString()); - } - } - - /// - /// Gets the stream containing the sfx settings. - /// - /// The sfx settings dictionary. - /// - private static Stream GetSettingsStream(SfxSettings settings) - { - var ms = new MemoryStream(); - byte[] buf = Encoding.UTF8.GetBytes(@";!@Install@!UTF-8!" + '\n'); - ms.Write(buf, 0, buf.Length); - foreach (string command in settings.Keys) - { - buf = - Encoding.UTF8.GetBytes(String.Format(CultureInfo.InvariantCulture, "{0}=\"{1}\"\n", command, - settings[command])); - ms.Write(buf, 0, buf.Length); - } - buf = Encoding.UTF8.GetBytes(@";!@InstallEnd@!"); - ms.Write(buf, 0, buf.Length); - return ms; - } - - private SfxSettings GetDefaultSettings() - { - switch (_module) - { - default: - return null; - case SfxModule.Installer: - var settings = new Dictionary {{"Title", "7-Zip self-extracting archive"}}; - return settings; - case SfxModule.Default: - case SfxModule.Extended: - settings = new Dictionary - { - {"GUIMode", "0"}, - {"InstallPath", "."}, - {"GUIFlags", "128+8"}, - {"ExtractPathTitle", "7-Zip self-extracting archive"}, - {"ExtractPathText", "Specify the path where to extract the files:"} - }; - return settings; - } - } - - /// - /// Writes the whole to the other one. - /// - /// The source stream to read from. - /// The destination stream to wrie to. - private static void WriteStream(Stream src, Stream dest) - { - src.Seek(0, SeekOrigin.Begin); - var buf = new byte[32768]; - int bytesRead; - while ((bytesRead = src.Read(buf, 0, buf.Length)) > 0) - { - dest.Write(buf, 0, bytesRead); - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive stream. - /// The name of the self-extracting executable. - public void MakeSfx(Stream archive, string sfxFileName) - { - using (Stream sfxStream = File.Create(sfxFileName)) - { - MakeSfx(archive, GetDefaultSettings(), sfxStream); - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive stream. - /// The stream to write the self-extracting executable to. - public void MakeSfx(Stream archive, Stream sfxStream) - { - MakeSfx(archive, GetDefaultSettings(), sfxStream); - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive stream. - /// The sfx settings. - /// The name of the self-extracting executable. - public void MakeSfx(Stream archive, SfxSettings settings, string sfxFileName) - { - using (Stream sfxStream = File.Create(sfxFileName)) - { - MakeSfx(archive, settings, sfxStream); - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive stream. - /// The sfx settings. - /// The stream to write the self-extracting executable to. - public void MakeSfx(Stream archive, SfxSettings settings, Stream sfxStream) - { - if (!sfxStream.CanWrite) - { - throw new ArgumentException("The specified output stream can not write.", "sfxStream"); - } - ValidateSettings(settings); - using (Stream sfx = _module == SfxModule.Default - ? Assembly.GetExecutingAssembly().GetManifestResourceStream( - GetResourceString(SfxSupportedModuleNames[_module][0])) - : new FileStream(_moduleFileName, FileMode.Open, FileAccess.Read, - FileShare.ReadWrite)) - { - WriteStream(sfx, sfxStream); - } - if (_module == SfxModule.Custom || _sfxCommands[_module] != null) - { - using (Stream set = GetSettingsStream(settings)) - { - WriteStream(set, sfxStream); - } - } - WriteStream(archive, sfxStream); - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive file name. - /// The name of the self-extracting executable. - public void MakeSfx(string archiveFileName, string sfxFileName) - { - using (Stream sfxStream = File.Create(sfxFileName)) - { - using ( - Stream archive = new FileStream(archiveFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - ) - { - MakeSfx(archive, GetDefaultSettings(), sfxStream); - } - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive file name. - /// The stream to write the self-extracting executable to. - public void MakeSfx(string archiveFileName, Stream sfxStream) - { - using (Stream archive = new FileStream(archiveFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - ) - { - MakeSfx(archive, GetDefaultSettings(), sfxStream); - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive file name. - /// The sfx settings. - /// The name of the self-extracting executable. - public void MakeSfx(string archiveFileName, SfxSettings settings, string sfxFileName) - { - using (Stream sfxStream = File.Create(sfxFileName)) - { - using ( - Stream archive = new FileStream(archiveFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - ) - { - MakeSfx(archive, settings, sfxStream); - } - } - } - - /// - /// Makes the self-extracting archive. - /// - /// The archive file name. - /// The sfx settings. - /// The stream to write the self-extracting executable to. - public void MakeSfx(string archiveFileName, SfxSettings settings, Stream sfxStream) - { - using (Stream archive = new FileStream(archiveFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - ) - { - MakeSfx(archive, settings, sfxStream); - } - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/StreamWrappers.cs b/BizHawk.Client.Common/7z/StreamWrappers.cs deleted file mode 100644 index 36a60fac98..0000000000 --- a/BizHawk.Client.Common/7z/StreamWrappers.cs +++ /dev/null @@ -1,545 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -#if MONO -using SevenZip.Mono.COM; -#endif - -namespace SevenZip -{ -#if UNMANAGED - - /// - /// A class that has DisposeStream property. - /// - internal class DisposeVariableWrapper - { - public bool DisposeStream { protected get; set; } - - protected DisposeVariableWrapper(bool disposeStream) { DisposeStream = disposeStream; } - } - - /// - /// Stream wrapper used in InStreamWrapper - /// - internal class StreamWrapper : DisposeVariableWrapper, IDisposable - { - /// - /// File name associated with the stream (for date fix) - /// - private readonly string _fileName; - - private readonly DateTime _fileTime; - - /// - /// Worker stream for reading, writing and seeking. - /// - private Stream _baseStream; - - /// - /// Initializes a new instance of the StreamWrapper class - /// - /// Worker stream for reading, writing and seeking - /// File name associated with the stream (for attributes fix) - /// File last write time (for attributes fix) - /// Indicates whether to dispose the baseStream - protected StreamWrapper(Stream baseStream, string fileName, DateTime time, bool disposeStream) - : base(disposeStream) - { - _baseStream = baseStream; - _fileName = fileName; - _fileTime = time; - } - - /// - /// Initializes a new instance of the StreamWrapper class - /// - /// Worker stream for reading, writing and seeking - /// Indicates whether to dispose the baseStream - protected StreamWrapper(Stream baseStream, bool disposeStream) - : base(disposeStream) - { - _baseStream = baseStream; - } - - /// - /// Gets the worker stream for reading, writing and seeking. - /// - protected Stream BaseStream - { - get - { - return _baseStream; - } - } - - #region IDisposable Members - - /// - /// Cleans up any resources used and fixes file attributes. - /// - public void Dispose() - { - if (_baseStream != null && DisposeStream) - { - try - { - _baseStream.Dispose(); - } - catch (ObjectDisposedException) { } - _baseStream = null; - } - if (!String.IsNullOrEmpty(_fileName) && File.Exists(_fileName)) - { - try - { -#if !WINCE - - File.SetLastWriteTime(_fileName, _fileTime); - File.SetLastAccessTime(_fileName, _fileTime); - File.SetCreationTime(_fileName, _fileTime); -#elif WINCE - OpenNETCF.IO.FileHelper.SetLastWriteTime(_fileName, _fileTime); - OpenNETCF.IO.FileHelper.SetLastAccessTime(_fileName, _fileTime); - OpenNETCF.IO.FileHelper.SetCreationTime(_fileName, _fileTime); -#endif - //TODO: time support for Windows Phone - } - catch (ArgumentOutOfRangeException) {} - } - GC.SuppressFinalize(this); - } - - #endregion - - public virtual void Seek(long offset, SeekOrigin seekOrigin, IntPtr newPosition) - { - if (BaseStream != null) - { - long position = BaseStream.Seek(offset, seekOrigin); - if (newPosition != IntPtr.Zero) - { - Marshal.WriteInt64(newPosition, position); - } - } - } - } - - /// - /// IInStream wrapper used in stream read operations. - /// - internal sealed class InStreamWrapper : StreamWrapper, ISequentialInStream, IInStream - { - /// - /// Initializes a new instance of the InStreamWrapper class. - /// - /// Stream for writing data - /// Indicates whether to dispose the baseStream - public InStreamWrapper(Stream baseStream, bool disposeStream) : base(baseStream, disposeStream) { } - - #region ISequentialInStream Members - - /// - /// Reads data from the stream. - /// - /// A data array. - /// The array size. - /// The read bytes count. - public int Read(byte[] data, uint size) - { - int readCount = 0; - if (BaseStream != null) - { - readCount = BaseStream.Read(data, 0, (int) size); - if (readCount > 0) - { - OnBytesRead(new IntEventArgs(readCount)); - } - } - return readCount; - } - - #endregion - - /// - /// Occurs when IntEventArgs.Value bytes were read from the source. - /// - public event EventHandler BytesRead; - - private void OnBytesRead(IntEventArgs e) - { - if (BytesRead != null) - { - BytesRead(this, e); - } - } - } - - /// - /// IOutStream wrapper used in stream write operations. - /// - internal sealed class OutStreamWrapper : StreamWrapper, ISequentialOutStream, IOutStream - { - /// - /// Initializes a new instance of the OutStreamWrapper class - /// - /// Stream for writing data - /// File name (for attributes fix) - /// Time of the file creation (for attributes fix) - /// Indicates whether to dispose the baseStream - public OutStreamWrapper(Stream baseStream, string fileName, DateTime time, bool disposeStream) : - base(baseStream, fileName, time, disposeStream) {} - - /// - /// Initializes a new instance of the OutStreamWrapper class - /// - /// Stream for writing data - /// Indicates whether to dispose the baseStream - public OutStreamWrapper(Stream baseStream, bool disposeStream) : - base(baseStream, disposeStream) {} - - #region IOutStream Members - - public int SetSize(long newSize) - { - BaseStream.SetLength(newSize); - return 0; - } - - #endregion - - #region ISequentialOutStream Members - - /// - /// Writes data to the stream - /// - /// Data array - /// Array size - /// Count of written bytes - /// Zero if Ok - public int Write(byte[] data, uint size, IntPtr processedSize) - { - BaseStream.Write(data, 0, (int) size); - if (processedSize != IntPtr.Zero) - { - Marshal.WriteInt32(processedSize, (int) size); - } - OnBytesWritten(new IntEventArgs((int) size)); - return 0; - } - - #endregion - - /// - /// Occurs when IntEventArgs.Value bytes were written. - /// - public event EventHandler BytesWritten; - - private void OnBytesWritten(IntEventArgs e) - { - if (BytesWritten != null) - { - BytesWritten(this, e); - } - } - } - - /// - /// Base multi volume stream wrapper class. - /// - internal class MultiStreamWrapper : DisposeVariableWrapper, IDisposable - { - protected readonly Dictionary> StreamOffsets = - new Dictionary>(); - - protected readonly List Streams = new List(); - protected int CurrentStream; - protected long Position; - protected long StreamLength; - - /// - /// Initializes a new instance of the MultiStreamWrapper class. - /// - /// Perform Dispose() if requested to. - protected MultiStreamWrapper(bool dispose) : base(dispose) {} - - /// - /// Gets the total length of input data. - /// - public long Length - { - get - { - return StreamLength; - } - } - - #region IDisposable Members - - /// - /// Cleans up any resources used and fixes file attributes. - /// - public virtual void Dispose() - { - if (DisposeStream) - { - foreach (Stream stream in Streams) - { - try - { - stream.Dispose(); - } - catch (ObjectDisposedException) {} - } - Streams.Clear(); - } - GC.SuppressFinalize(this); - } - - #endregion - - protected static string VolumeNumber(int num) - { - if (num < 10) - { - return ".00" + num.ToString(CultureInfo.InvariantCulture); - } - if (num > 9 && num < 100) - { - return ".0" + num.ToString(CultureInfo.InvariantCulture); - } - if (num > 99 && num < 1000) - { - return "." + num.ToString(CultureInfo.InvariantCulture); - } - return ""; - } - - private int StreamNumberByOffset(long offset) - { - foreach (int number in StreamOffsets.Keys) - { - if (StreamOffsets[number].Key <= offset && - StreamOffsets[number].Value >= offset) - { - return number; - } - } - return -1; - } - - public void Seek(long offset, SeekOrigin seekOrigin, IntPtr newPosition) - { - long absolutePosition = (seekOrigin == SeekOrigin.Current) - ? Position + offset - : offset; - CurrentStream = StreamNumberByOffset(absolutePosition); - long delta = Streams[CurrentStream].Seek( - absolutePosition - StreamOffsets[CurrentStream].Key, SeekOrigin.Begin); - Position = StreamOffsets[CurrentStream].Key + delta; - if (newPosition != IntPtr.Zero) - { - Marshal.WriteInt64(newPosition, Position); - } - } - } - - /// - /// IInStream wrapper used in stream multi volume read operations. - /// - internal sealed class InMultiStreamWrapper : MultiStreamWrapper, ISequentialInStream, IInStream - { - /// - /// Initializes a new instance of the InMultiStreamWrapper class. - /// - /// The archive file name. - /// Perform Dispose() if requested to. - public InMultiStreamWrapper(string fileName, bool dispose) : - base(dispose) - { - string baseName = fileName.Substring(0, fileName.Length - 4); - int i = 0; - while (File.Exists(fileName)) - { - Streams.Add(new FileStream(fileName, FileMode.Open)); - long length = Streams[i].Length; - StreamOffsets.Add(i++, new KeyValuePair(StreamLength, StreamLength + length)); - StreamLength += length; - fileName = baseName + VolumeNumber(i + 1); - } - } - - #region ISequentialInStream Members - - /// - /// Reads data from the stream. - /// - /// A data array. - /// The array size. - /// The read bytes count. - public int Read(byte[] data, uint size) - { - var readSize = (int) size; - int readCount = Streams[CurrentStream].Read(data, 0, readSize); - readSize -= readCount; - Position += readCount; - while (readCount < (int) size) - { - if (CurrentStream == Streams.Count - 1) - { - return readCount; - } - CurrentStream++; - Streams[CurrentStream].Seek(0, SeekOrigin.Begin); - int count = Streams[CurrentStream].Read(data, readCount, readSize); - readCount += count; - readSize -= count; - Position += count; - } - return readCount; - } - - #endregion - } - -#if COMPRESS - /// - /// IOutStream wrapper used in multi volume stream write operations. - /// - internal sealed class OutMultiStreamWrapper : MultiStreamWrapper, ISequentialOutStream, IOutStream - { - private readonly string _archiveName; - private readonly int _volumeSize; - private long _overallLength; - - /// - /// Initializes a new instance of the OutMultiStreamWrapper class. - /// - /// The archive name. - /// The volume size. - public OutMultiStreamWrapper(string archiveName, int volumeSize) : - base(true) - { - _archiveName = archiveName; - _volumeSize = volumeSize; - CurrentStream = -1; - NewVolumeStream(); - } - - #region IOutStream Members - - public int SetSize(long newSize) - { - return 0; - } - - #endregion - - #region ISequentialOutStream Members - - public int Write(byte[] data, uint size, IntPtr processedSize) - { - int offset = 0; - var originalSize = (int) size; - Position += size; - _overallLength = Math.Max(Position + 1, _overallLength); - while (size > _volumeSize - Streams[CurrentStream].Position) - { - var count = (int) (_volumeSize - Streams[CurrentStream].Position); - Streams[CurrentStream].Write(data, offset, count); - size -= (uint) count; - offset += count; - NewVolumeStream(); - } - Streams[CurrentStream].Write(data, offset, (int) size); - if (processedSize != IntPtr.Zero) - { - Marshal.WriteInt32(processedSize, originalSize); - } - return 0; - } - - #endregion - - public override void Dispose() - { - int lastIndex = Streams.Count - 1; - Streams[lastIndex].SetLength(lastIndex > 0? Streams[lastIndex].Position : _overallLength); - base.Dispose(); - } - - private void NewVolumeStream() - { - CurrentStream++; - Streams.Add(File.Create(_archiveName + VolumeNumber(CurrentStream + 1))); - Streams[CurrentStream].SetLength(_volumeSize); - StreamOffsets.Add(CurrentStream, new KeyValuePair(0, _volumeSize - 1)); - } - } -#endif - - internal sealed class FakeOutStreamWrapper : ISequentialOutStream, IDisposable - { - #region IDisposable Members - - public void Dispose() - { - GC.SuppressFinalize(this); - } - - #endregion - - #region ISequentialOutStream Members - - /// - /// Does nothing except calling the BytesWritten event - /// - /// Data array - /// Array size - /// Count of written bytes - /// Zero if Ok - public int Write(byte[] data, uint size, IntPtr processedSize) - { - OnBytesWritten(new IntEventArgs((int) size)); - if (processedSize != IntPtr.Zero) - { - Marshal.WriteInt32(processedSize, (int) size); - } - return 0; - } - - #endregion - - /// - /// Occurs when IntEventArgs.Value bytes were written - /// - public event EventHandler BytesWritten; - - private void OnBytesWritten(IntEventArgs e) - { - if (BytesWritten != null) - { - BytesWritten(this, e); - } - } - } -#endif -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Common/CRC.cs b/BizHawk.Client.Common/7z/sdk/Common/CRC.cs deleted file mode 100644 index 7ef7958604..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Common/CRC.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -namespace SevenZip.Sdk -{ - internal class CRC - { - public static readonly uint[] Table; - - private uint _value = 0xFFFFFFFF; - - static CRC() - { - Table = new uint[256]; - const uint kPoly = 0xEDB88320; - for (uint i = 0; i < 256; i++) - { - uint r = i; - for (int j = 0; j < 8; j++) - if ((r & 1) != 0) - r = (r >> 1) ^ kPoly; - else - r >>= 1; - Table[i] = r; - } - } - - public void Init() - { - _value = 0xFFFFFFFF; - } - - public void UpdateByte(byte b) - { - _value = Table[(((byte) (_value)) ^ b)] ^ (_value >> 8); - } - - public void Update(byte[] data, uint offset, uint size) - { - for (uint i = 0; i < size; i++) - _value = Table[(((byte) (_value)) ^ data[offset + i])] ^ (_value >> 8); - } - - public uint GetDigest() - { - return _value ^ 0xFFFFFFFF; - } - - private static uint CalculateDigest(byte[] data, uint offset, uint size) - { - var crc = new CRC(); - // crc.Init(); - crc.Update(data, offset, size); - return crc.GetDigest(); - } - - private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) - { - return (CalculateDigest(data, offset, size) == digest); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Common/InBuffer.cs b/BizHawk.Client.Common/7z/sdk/Common/InBuffer.cs deleted file mode 100644 index 26f3ae4104..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Common/InBuffer.cs +++ /dev/null @@ -1,119 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System.IO; - -namespace SevenZip.Sdk.Buffer -{ - /// - /// Implements the input buffer work - /// - internal class InBuffer - { - private readonly byte[] m_Buffer; - private readonly uint m_BufferSize; - private uint m_Limit; - private uint m_Pos; - private ulong m_ProcessedSize; - private Stream m_Stream; - private bool m_StreamWasExhausted; - - /// - /// Initializes the input buffer - /// - /// - private InBuffer(uint bufferSize) - { - m_Buffer = new byte[bufferSize]; - m_BufferSize = bufferSize; - } - - /// - /// Initializes the class - /// - /// - private void Init(Stream stream) - { - m_Stream = stream; - m_ProcessedSize = 0; - m_Limit = 0; - m_Pos = 0; - m_StreamWasExhausted = false; - } - - /// - /// Reads the whole block - /// - /// - private bool ReadBlock() - { - if (m_StreamWasExhausted) - return false; - m_ProcessedSize += m_Pos; - int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int) m_BufferSize); - m_Pos = 0; - m_Limit = (uint) aNumProcessedBytes; - m_StreamWasExhausted = (aNumProcessedBytes == 0); - return (!m_StreamWasExhausted); - } - - /// - /// Releases the stream - /// - private void ReleaseStream() - { - // m_Stream.Close(); - m_Stream = null; - } - - /// - /// Reads the byte to check it - /// - /// - /// - private bool ReadByte(out byte b) - { - b = 0; - if (m_Pos >= m_Limit) - if (!ReadBlock()) - return false; - b = m_Buffer[m_Pos++]; - return true; - } - - /// - /// Reads the next byte - /// - /// - private byte ReadByte() - { - // return (byte)m_Stream.ReadByte(); - if (m_Pos >= m_Limit) - if (!ReadBlock()) - return 0xFF; - return m_Buffer[m_Pos++]; - } - - /// - /// Gets processed size - /// - /// - private ulong GetProcessedSize() - { - return m_ProcessedSize + m_Pos; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Common/OutBuffer.cs b/BizHawk.Client.Common/7z/sdk/Common/OutBuffer.cs deleted file mode 100644 index 85117e038d..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Common/OutBuffer.cs +++ /dev/null @@ -1,85 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System.IO; - -namespace SevenZip.Sdk.Buffer -{ - internal class OutBuffer - { - private readonly byte[] m_Buffer; - private readonly uint m_BufferSize; - private uint m_Pos; - private ulong m_ProcessedSize; - private Stream m_Stream; - - /// - /// Initializes a new instance of the OutBuffer class - /// - /// - public OutBuffer(uint bufferSize) - { - m_Buffer = new byte[bufferSize]; - m_BufferSize = bufferSize; - } - - public void SetStream(Stream stream) - { - m_Stream = stream; - } - - public void FlushStream() - { - m_Stream.Flush(); - } - - public void CloseStream() - { - m_Stream.Close(); - } - - public void ReleaseStream() - { - m_Stream = null; - } - - public void Init() - { - m_ProcessedSize = 0; - m_Pos = 0; - } - - public void WriteByte(byte b) - { - m_Buffer[m_Pos++] = b; - if (m_Pos >= m_BufferSize) - FlushData(); - } - - public void FlushData() - { - if (m_Pos == 0) - return; - m_Stream.Write(m_Buffer, 0, (int) m_Pos); - m_Pos = 0; - } - - public ulong GetProcessedSize() - { - return m_ProcessedSize + m_Pos; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZ/IMatchFinder.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZ/IMatchFinder.cs deleted file mode 100644 index d7a792c91e..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZ/IMatchFinder.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip.Sdk.Compression.LZ -{ - internal interface IInWindowStream - { - void SetStream(Stream inStream); - void Init(); - void ReleaseStream(); - Byte GetIndexByte(Int32 index); - UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit); - UInt32 GetNumAvailableBytes(); - } - - internal interface IMatchFinder : IInWindowStream - { - void Create(UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter); - - UInt32 GetMatches(UInt32[] distances); - void Skip(UInt32 num); - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzBinTree.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzBinTree.cs deleted file mode 100644 index 6669a5b2d5..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzBinTree.cs +++ /dev/null @@ -1,405 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip.Sdk.Compression.LZ -{ - internal class BinTree : InWindow, IMatchFinder - { - private const UInt32 kBT2HashSize = 1 << 16; - private const UInt32 kEmptyHashValue = 0; - private const UInt32 kHash2Size = 1 << 10; - private const UInt32 kHash3Offset = kHash2Size; - private const UInt32 kHash3Size = 1 << 16; - private const UInt32 kMaxValForNormalize = ((UInt32) 1 << 31) - 1; - private const UInt32 kStartMaxLen = 1; - private UInt32 _cutValue = 0xFF; - private UInt32 _cyclicBufferPos; - private UInt32 _cyclicBufferSize; - private UInt32[] _hash; - - private UInt32 _hashMask; - private UInt32 _hashSizeSum; - private UInt32 _matchMaxLen; - - private UInt32[] _son; - - private bool HASH_ARRAY = true; - - private UInt32 kFixHashSize = kHash2Size + kHash3Size; - private UInt32 kMinMatchCheck = 4; - private UInt32 kNumHashDirectBytes; - - #region IMatchFinder Members - - public new void SetStream(Stream stream) - { - base.SetStream(stream); - } - - public new void ReleaseStream() - { - base.ReleaseStream(); - } - - public new void Init() - { - base.Init(); - for (UInt32 i = 0; i < _hashSizeSum; i++) - _hash[i] = kEmptyHashValue; - _cyclicBufferPos = 0; - ReduceOffsets(-1); - } - - public new Byte GetIndexByte(Int32 index) - { - return base.GetIndexByte(index); - } - - public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) - { - return base.GetMatchLen(index, distance, limit); - } - - public new UInt32 GetNumAvailableBytes() - { - return base.GetNumAvailableBytes(); - } - - public void Create(UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter) - { - if (historySize + 256 > kMaxValForNormalize) - { - throw new ArgumentException("historySize + 256 > kMaxValForNormalize", "historySize"); - } - _cutValue = 16 + (matchMaxLen >> 1); - - UInt32 windowReservSize = (historySize + keepAddBufferBefore + - matchMaxLen + keepAddBufferAfter)/2 + 256; - - base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); - - _matchMaxLen = matchMaxLen; - - UInt32 cyclicBufferSize = historySize + 1; - if (_cyclicBufferSize != cyclicBufferSize) - _son = new UInt32[(_cyclicBufferSize = cyclicBufferSize)*2]; - - UInt32 hs = kBT2HashSize; - - if (HASH_ARRAY) - { - hs = historySize - 1; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - hs >>= 1; - hs |= 0xFFFF; - if (hs > (1 << 24)) - hs >>= 1; - _hashMask = hs; - hs++; - hs += kFixHashSize; - } - if (hs != _hashSizeSum) - _hash = new UInt32[_hashSizeSum = hs]; - } - - public UInt32 GetMatches(UInt32[] distances) - { - UInt32 lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - return 0; - } - } - - UInt32 offset = 0; - UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; - UInt32 cur = _bufferOffset + _pos; - UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize; - UInt32 hashValue, hash2Value = 0, hash3Value = 0; - - if (HASH_ARRAY) - { - UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - hash2Value = (temp & (((int) kHash2Size) - 1)); - temp ^= (uint) ((_bufferBase[cur + 2]) << 8); - hash3Value = (temp & (((int) kHash3Size) - 1)); - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((UInt32) (_bufferBase[cur + 1]) << 8); - - UInt32 curMatch = _hash[kFixHashSize + hashValue]; - if (HASH_ARRAY) - { - UInt32 curMatch2 = _hash[hash2Value]; - UInt32 curMatch3 = _hash[kHash3Offset + hash3Value]; - _hash[hash2Value] = _pos; - _hash[kHash3Offset + hash3Value] = _pos; - if (curMatch2 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) - { - distances[offset++] = maxLen = 2; - distances[offset++] = _pos - curMatch2 - 1; - } - if (curMatch3 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) - { - if (curMatch3 == curMatch2) - offset -= 2; - distances[offset++] = maxLen = 3; - distances[offset++] = _pos - curMatch3 - 1; - curMatch2 = curMatch3; - } - if (offset != 0 && curMatch2 == curMatch) - { - offset -= 2; - maxLen = kStartMaxLen; - } - } - - _hash[kFixHashSize + hashValue] = _pos; - - UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; - UInt32 ptr1 = (_cyclicBufferPos << 1); - - UInt32 len0, len1; - len0 = len1 = kNumHashDirectBytes; - - if (kNumHashDirectBytes != 0) - { - if (curMatch > matchMinPos) - { - if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != - _bufferBase[cur + kNumHashDirectBytes]) - { - distances[offset++] = maxLen = kNumHashDirectBytes; - distances[offset++] = _pos - curMatch - 1; - } - } - } - - UInt32 count = _cutValue; - - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - UInt32 delta = _pos - curMatch; - UInt32 cyclicPos = ((delta <= _cyclicBufferPos) - ? - (_cyclicBufferPos - delta) - : - (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; - - UInt32 pby1 = _bufferOffset + curMatch; - UInt32 len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (maxLen < len) - { - distances[offset++] = maxLen = len; - distances[offset++] = delta - 1; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - return offset; - } - - public void Skip(UInt32 num) - { - do - { - UInt32 lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - continue; - } - } - - UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; - UInt32 cur = _bufferOffset + _pos; - - UInt32 hashValue; - - if (HASH_ARRAY) - { - UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - UInt32 hash2Value = (temp & (((int) kHash2Size) - 1)); - _hash[hash2Value] = _pos; - temp ^= ((UInt32) (_bufferBase[cur + 2]) << 8); - UInt32 hash3Value = (temp & (((int) kHash3Size) - 1)); - _hash[kHash3Offset + hash3Value] = _pos; - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((UInt32) (_bufferBase[cur + 1]) << 8); - - UInt32 curMatch = _hash[kFixHashSize + hashValue]; - _hash[kFixHashSize + hashValue] = _pos; - - UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; - UInt32 ptr1 = (_cyclicBufferPos << 1); - - UInt32 len0, len1; - len0 = len1 = kNumHashDirectBytes; - - UInt32 count = _cutValue; - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - - UInt32 delta = _pos - curMatch; - UInt32 cyclicPos = ((delta <= _cyclicBufferPos) - ? - (_cyclicBufferPos - delta) - : - (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; - - UInt32 pby1 = _bufferOffset + curMatch; - UInt32 len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - } while (--num != 0); - } - - #endregion - - public void SetType(int numHashBytes) - { - HASH_ARRAY = (numHashBytes > 2); - if (HASH_ARRAY) - { - kNumHashDirectBytes = 0; - kMinMatchCheck = 4; - kFixHashSize = kHash2Size + kHash3Size; - } - else - { - kNumHashDirectBytes = 2; - kMinMatchCheck = 2 + 1; - kFixHashSize = 0; - } - } - - public new void MovePos() - { - if (++_cyclicBufferPos >= _cyclicBufferSize) - _cyclicBufferPos = 0; - base.MovePos(); - if (_pos == kMaxValForNormalize) - Normalize(); - } - - private static void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue) - { - for (UInt32 i = 0; i < numItems; i++) - { - UInt32 value = items[i]; - if (value <= subValue) - value = kEmptyHashValue; - else - value -= subValue; - items[i] = value; - } - } - - private void Normalize() - { - UInt32 subValue = _pos - _cyclicBufferSize; - NormalizeLinks(_son, _cyclicBufferSize*2, subValue); - NormalizeLinks(_hash, _hashSizeSum, subValue); - ReduceOffsets((Int32) subValue); - } - - //public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzInWindow.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzInWindow.cs deleted file mode 100644 index 8cb05038da..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzInWindow.cs +++ /dev/null @@ -1,197 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ -using System; -using System.IO; - -namespace SevenZip.Sdk.Compression.LZ -{ - /// - /// Input window class - /// - internal class InWindow - { - /// - /// Size of Allocated memory block - /// - public UInt32 _blockSize; - - /// - /// The pointer to buffer with data - /// - public Byte[] _bufferBase; - - /// - /// Buffer offset value - /// - public UInt32 _bufferOffset; - - /// - /// How many BYTEs must be kept buffer after _pos - /// - private UInt32 _keepSizeAfter; - - /// - /// How many BYTEs must be kept in buffer before _pos - /// - private UInt32 _keepSizeBefore; - - private UInt32 _pointerToLastSafePosition; - - /// - /// Offset (from _buffer) of curent byte - /// - public UInt32 _pos; - - private UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done - private Stream _stream; - private bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream - - /// - /// Offset (from _buffer) of first not read byte from Stream - /// - public UInt32 _streamPos; - - public void MoveBlock() - { - UInt32 offset = (_bufferOffset) + _pos - _keepSizeBefore; - // we need one additional byte, since MovePos moves on 1 byte. - if (offset > 0) - offset--; - - UInt32 numBytes = (_bufferOffset) + _streamPos - offset; - - // check negative offset ???? - for (UInt32 i = 0; i < numBytes; i++) - _bufferBase[i] = _bufferBase[offset + i]; - _bufferOffset -= offset; - } - - public virtual void ReadBlock() - { - if (_streamEndWasReached) - return; - while (true) - { - var size = (int) ((0 - _bufferOffset) + _blockSize - _streamPos); - if (size == 0) - return; - int numReadBytes = _stream.Read(_bufferBase, (int) (_bufferOffset + _streamPos), size); - if (numReadBytes == 0) - { - _posLimit = _streamPos; - UInt32 pointerToPostion = _bufferOffset + _posLimit; - if (pointerToPostion > _pointerToLastSafePosition) - _posLimit = (_pointerToLastSafePosition - _bufferOffset); - - _streamEndWasReached = true; - return; - } - _streamPos += (UInt32) numReadBytes; - if (_streamPos >= _pos + _keepSizeAfter) - _posLimit = _streamPos - _keepSizeAfter; - } - } - - private void Free() - { - _bufferBase = null; - } - - public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv) - { - _keepSizeBefore = keepSizeBefore; - _keepSizeAfter = keepSizeAfter; - UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; - if (_bufferBase == null || _blockSize != blockSize) - { - Free(); - _blockSize = blockSize; - _bufferBase = new Byte[_blockSize]; - } - _pointerToLastSafePosition = _blockSize - keepSizeAfter; - } - - public void SetStream(Stream stream) - { - _stream = stream; - } - - public void ReleaseStream() - { - _stream = null; - } - - public void Init() - { - _bufferOffset = 0; - _pos = 0; - _streamPos = 0; - _streamEndWasReached = false; - ReadBlock(); - } - - public void MovePos() - { - _pos++; - if (_pos > _posLimit) - { - UInt32 pointerToPostion = _bufferOffset + _pos; - if (pointerToPostion > _pointerToLastSafePosition) - MoveBlock(); - ReadBlock(); - } - } - - public Byte GetIndexByte(Int32 index) - { - return _bufferBase[_bufferOffset + _pos + index]; - } - - /// - /// index + limit have not to exceed _keepSizeAfter - /// - /// - /// - /// - /// - public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) - { - if (_streamEndWasReached) - if ((_pos + index) + limit > _streamPos) - limit = _streamPos - (UInt32) (_pos + index); - distance++; - // Byte *pby = _buffer + (size_t)_pos + index; - UInt32 pby = _bufferOffset + _pos + (UInt32) index; - - UInt32 i; - for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++) ; - return i; - } - - public UInt32 GetNumAvailableBytes() - { - return _streamPos - _pos; - } - - public void ReduceOffsets(Int32 subValue) - { - _bufferOffset += (UInt32) subValue; - _posLimit -= (UInt32) subValue; - _pos -= (UInt32) subValue; - _streamPos -= (UInt32) subValue; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzOutWindow.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzOutWindow.cs deleted file mode 100644 index 6cf788ad06..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZ/LzOutWindow.cs +++ /dev/null @@ -1,125 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System.IO; - -namespace SevenZip.Sdk.Compression.LZ -{ - internal class OutWindow - { - private byte[] _buffer; - private uint _pos; - private Stream _stream; - private uint _streamPos; - private uint _windowSize; - public uint TrainSize; - - public void Create(uint windowSize) - { - if (_windowSize != windowSize) - { - // System.GC.Collect(); - _buffer = new byte[windowSize]; - } - _windowSize = windowSize; - _pos = 0; - _streamPos = 0; - } - - public void Init(Stream stream, bool solid) - { - ReleaseStream(); - _stream = stream; - if (!solid) - { - _streamPos = 0; - _pos = 0; - TrainSize = 0; - } - } - - public bool Train(Stream stream) - { - long len = stream.Length; - uint size = (len < _windowSize) ? (uint) len : _windowSize; - TrainSize = size; - stream.Position = len - size; - _streamPos = _pos = 0; - while (size > 0) - { - uint curSize = _windowSize - _pos; - if (size < curSize) - curSize = size; - int numReadBytes = stream.Read(_buffer, (int) _pos, (int) curSize); - if (numReadBytes == 0) - return false; - size -= (uint) numReadBytes; - _pos += (uint) numReadBytes; - _streamPos += (uint) numReadBytes; - if (_pos == _windowSize) - _streamPos = _pos = 0; - } - return true; - } - - public void ReleaseStream() - { - Flush(); - _stream = null; - } - - public void Flush() - { - uint size = _pos - _streamPos; - if (size == 0) - return; - _stream.Write(_buffer, (int) _streamPos, (int) size); - if (_pos >= _windowSize) - _pos = 0; - _streamPos = _pos; - } - - public void CopyBlock(uint distance, uint len) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - for (; len > 0; len--) - { - if (pos >= _windowSize) - pos = 0; - _buffer[_pos++] = _buffer[pos++]; - if (_pos >= _windowSize) - Flush(); - } - } - - public void PutByte(byte b) - { - _buffer[_pos++] = b; - if (_pos >= _windowSize) - Flush(); - } - - public byte GetByte(uint distance) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - return _buffer[pos]; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaBase.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaBase.cs deleted file mode 100644 index cba427c016..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaBase.cs +++ /dev/null @@ -1,108 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -namespace SevenZip.Sdk.Compression.Lzma -{ - internal abstract class Base - { - public const uint kAlignMask = (kAlignTableSize - 1); - public const uint kAlignTableSize = 1 << kNumAlignBits; - public const int kDicLogSizeMin = 0; - public const uint kEndPosModelIndex = 14; - public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; - // public const int kDicLogSizeMax = 30; - // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; - - public const uint kMatchMinLen = 2; - - public const int kNumAlignBits = 4; - - public const uint kNumFullDistances = 1 << ((int) kEndPosModelIndex/2); - public const int kNumHighLenBits = 8; - - public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + - (1 << kNumHighLenBits); - - public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; - public const int kNumLenToPosStatesBits = 2; // it's for speed optimization - - public const uint kNumLitContextBitsMax = 8; - public const uint kNumLitPosStatesBitsEncodingMax = 4; - - public const int kNumLowLenBits = 3; - public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; - public const int kNumMidLenBits = 3; - public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; - public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; - public const int kNumPosSlotBits = 6; - public const int kNumPosStatesBitsEncodingMax = 4; - public const int kNumPosStatesBitsMax = 4; - public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); - public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax); - public const uint kNumRepDistances = 4; - public const uint kNumStates = 12; - public const uint kStartPosModelIndex = 4; - - public static uint GetLenToPosState(uint len) - { - len -= kMatchMinLen; - if (len < kNumLenToPosStates) - return len; - return (kNumLenToPosStates - 1); - } - - #region Nested type: State - - public struct State - { - public uint Index; - - public void Init() - { - Index = 0; - } - - public void UpdateChar() - { - if (Index < 4) Index = 0; - else if (Index < 10) Index -= 3; - else Index -= 6; - } - - public void UpdateMatch() - { - Index = (uint) (Index < 7 ? 7 : 10); - } - - public void UpdateRep() - { - Index = (uint) (Index < 7 ? 8 : 11); - } - - public void UpdateShortRep() - { - Index = (uint) (Index < 7 ? 9 : 11); - } - - public bool IsCharState() - { - return Index < 7; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaDecoder.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaDecoder.cs deleted file mode 100644 index f3f993d488..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaDecoder.cs +++ /dev/null @@ -1,480 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; -using SevenZip.Sdk.Compression.LZ; -using SevenZip.Sdk.Compression.RangeCoder; - -namespace SevenZip.Sdk.Compression.Lzma -{ - /// - /// The LZMA decoder class - /// - public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream - { - private readonly BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - - private readonly BitDecoder[] m_IsRep0LongDecoders = - new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - - private readonly BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; - - private readonly LenDecoder m_LenDecoder = new LenDecoder(); - - private readonly LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); - private readonly OutWindow m_OutWindow = new OutWindow(); - private readonly BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; - private readonly RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); - private readonly LenDecoder m_RepLenDecoder = new LenDecoder(); - private bool _solid; - - private uint m_DictionarySize; - private uint m_DictionarySizeCheck; - private BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); - - private uint m_PosStateMask; - - /// - /// Initializes the Lzma Decoder class. - /// - public Decoder() - { - m_DictionarySize = 0xFFFFFFFF; - for (int i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); - } - - #region ICoder Members - - /// - /// Codes a stream with LZMA algorithm to an output stream - /// - /// The input stream - /// The input size - /// The output size - /// The output stream - /// Progress interface - public void Code(Stream inStream, Stream outStream, - Int64 inSize, Int64 outSize, ICodeProgress progress) - { - Init(inStream, outStream); - - var state = new Base.State(); - state.Init(); - uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; - - UInt64 nowPos64 = 0; - var outSize64 = (UInt64) outSize; - if (nowPos64 < outSize64) - { - if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) - throw new DataErrorException(); - state.UpdateChar(); - byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); - m_OutWindow.PutByte(b); - nowPos64++; - } - while (nowPos64 < outSize64) - { - // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); - // while(nowPos64 < next) - { - uint posState = (uint) nowPos64 & m_PosStateMask; - if ( - m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == - 0) - { - byte b; - byte prevByte = m_OutWindow.GetByte(0); - if (!state.IsCharState()) - b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, - (uint) nowPos64, prevByte, - m_OutWindow.GetByte(rep0)); - else - b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint) nowPos64, prevByte); - m_OutWindow.PutByte(b); - state.UpdateChar(); - nowPos64++; - } - else - { - uint len; - if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) - { - if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - if ( - m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode( - m_RangeDecoder) == 0) - { - state.UpdateShortRep(); - m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); - nowPos64++; - continue; - } - } - else - { - UInt32 distance; - if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - distance = rep1; - } - else - { - if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) - distance = rep2; - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; - state.UpdateRep(); - } - else - { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); - state.UpdateMatch(); - uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); - if (posSlot >= Base.kStartPosModelIndex) - { - var numDirectBits = (int) ((posSlot >> 1) - 1); - rep0 = ((2 | (posSlot & 1)) << numDirectBits); - if (posSlot < Base.kEndPosModelIndex) - rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, - rep0 - posSlot - 1, m_RangeDecoder, - numDirectBits); - else - { - rep0 += (m_RangeDecoder.DecodeDirectBits( - numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits); - rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); - } - } - else - rep0 = posSlot; - } - if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) - { - if (rep0 == 0xFFFFFFFF) - break; - throw new DataErrorException(); - } - m_OutWindow.CopyBlock(rep0, len); - nowPos64 += len; - } - } - } - m_OutWindow.Flush(); - m_OutWindow.ReleaseStream(); - m_RangeDecoder.ReleaseStream(); - } - - #endregion - - #region ISetDecoderProperties Members - - /// - /// Sets decoder properties - /// - /// Array of byte properties - public void SetDecoderProperties(byte[] properties) - { - if (properties.Length < 5) - throw new InvalidParamException(); - int lc = properties[0]%9; - int remainder = properties[0]/9; - int lp = remainder%5; - int pb = remainder/5; - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - UInt32 dictionarySize = 0; - for (int i = 0; i < 4; i++) - dictionarySize += ((UInt32) (properties[1 + i])) << (i*8); - SetDictionarySize(dictionarySize); - SetLiteralProperties(lp, lc); - SetPosBitsProperties(pb); - } - - #endregion - - private void SetDictionarySize(uint dictionarySize) - { - if (m_DictionarySize != dictionarySize) - { - m_DictionarySize = dictionarySize; - m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); - uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12)); - m_OutWindow.Create(blockSize); - } - } - - private void SetLiteralProperties(int lp, int lc) - { - if (lp > 8) - throw new InvalidParamException(); - if (lc > 8) - throw new InvalidParamException(); - m_LiteralDecoder.Create(lp, lc); - } - - private void SetPosBitsProperties(int pb) - { - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - uint numPosStates = (uint) 1 << pb; - m_LenDecoder.Create(numPosStates); - m_RepLenDecoder.Create(numPosStates); - m_PosStateMask = numPosStates - 1; - } - - private void Init(Stream inStream, Stream outStream) - { - m_RangeDecoder.Init(inStream); - m_OutWindow.Init(outStream, _solid); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= m_PosStateMask; j++) - { - uint index = (i << Base.kNumPosStatesBitsMax) + j; - m_IsMatchDecoders[index].Init(); - m_IsRep0LongDecoders[index].Init(); - } - m_IsRepDecoders[i].Init(); - m_IsRepG0Decoders[i].Init(); - m_IsRepG1Decoders[i].Init(); - m_IsRepG2Decoders[i].Init(); - } - - m_LiteralDecoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i].Init(); - // m_PosSpecDecoder.Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - m_PosDecoders[i].Init(); - - m_LenDecoder.Init(); - m_RepLenDecoder.Init(); - m_PosAlignDecoder.Init(); - } - - /// - /// Trains a stream - /// - /// The stream to train. - /// true if Ok; otherwise, false. - public bool Train(Stream stream) - { - _solid = true; - return m_OutWindow.Train(stream); - } - - #region Nested type: LenDecoder - - private class LenDecoder - { - private readonly BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private readonly BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private BitDecoder m_Choice; - private BitDecoder m_Choice2; - private BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); - private uint m_NumPosStates; - - internal void Create(uint numPosStates) - { - for (uint posState = m_NumPosStates; posState < numPosStates; posState++) - { - m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); - m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); - } - m_NumPosStates = numPosStates; - } - - internal void Init() - { - m_Choice.Init(); - for (uint posState = 0; posState < m_NumPosStates; posState++) - { - m_LowCoder[posState].Init(); - m_MidCoder[posState].Init(); - } - m_Choice2.Init(); - m_HighCoder.Init(); - } - - /// - /// Decodes the stream - /// - /// The specified RangeCoder - /// The position state - /// - public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) - { - if (m_Choice.Decode(rangeDecoder) == 0) - return m_LowCoder[posState].Decode(rangeDecoder); - else - { - uint symbol = Base.kNumLowLenSymbols; - if (m_Choice2.Decode(rangeDecoder) == 0) - symbol += m_MidCoder[posState].Decode(rangeDecoder); - else - { - symbol += Base.kNumMidLenSymbols; - symbol += m_HighCoder.Decode(rangeDecoder); - } - return symbol; - } - } - } - - #endregion - - #region Nested type: LiteralDecoder - - private class LiteralDecoder - { - private Decoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && - m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint) 1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint) 1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Decoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint) 1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - private uint GetState(uint pos, byte prevByte) - { - return ((pos & m_PosMask) << m_NumPrevBits) + (uint) (prevByte >> (8 - m_NumPrevBits)); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); - } - - #region Nested type: Decoder2 - - private struct Decoder2 - { - private BitDecoder[] m_Decoders; - - public void Create() - { - m_Decoders = new BitDecoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) - { - uint symbol = 1; - do - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); while (symbol < 0x100); - return (byte) symbol; - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) - { - uint symbol = 1; - do - { - uint matchBit = (uint) (matchByte >> 7) & 1; - matchByte <<= 1; - uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); - symbol = (symbol << 1) | bit; - if (matchBit != bit) - { - while (symbol < 0x100) - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - break; - } - } while (symbol < 0x100); - return (byte) symbol; - } - } - - #endregion - } ; - - #endregion - - /* - public override bool CanRead { get { return true; }} - public override bool CanWrite { get { return true; }} - public override bool CanSeek { get { return true; }} - public override long Length { get { return 0; }} - public override long Position - { - get { return 0; } - set { } - } - public override void Flush() { } - public override int Read(byte[] buffer, int offset, int count) - { - return 0; - } - public override void Write(byte[] buffer, int offset, int count) - { - } - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - return 0; - } - public override void SetLength(long value) {} - */ - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaEncoder.cs b/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaEncoder.cs deleted file mode 100644 index cf3e528e91..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/LZMA/LzmaEncoder.cs +++ /dev/null @@ -1,1587 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.Globalization; -using System.IO; -using SevenZip.Sdk.Compression.LZ; -using SevenZip.Sdk.Compression.RangeCoder; - -namespace SevenZip.Sdk.Compression.Lzma -{ - /// - /// The LZMA encoder class - /// - public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties - { - private const int kDefaultDictionaryLogSize = 22; - private const UInt32 kIfinityPrice = 0xFFFFFFF; - private const UInt32 kNumFastBytesDefault = 0x20; - - private const UInt32 kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; - - private const UInt32 kNumOpts = 1 << 12; - private const int kPropSize = 5; - private static readonly Byte[] g_FastPos = new Byte[1 << 11]; - - private static readonly string[] kMatchFinderIDs = - { - "BT2", - "BT4", - }; - - private readonly UInt32[] _alignPrices = new UInt32[Base.kAlignTableSize]; - private readonly UInt32[] _distancesPrices = new UInt32[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; - - private readonly BitEncoder[] _isMatch = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRep = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRep0Long = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRepG0 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG1 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG2 = new BitEncoder[Base.kNumStates]; - - private readonly LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); - - private readonly LiteralEncoder _literalEncoder = new LiteralEncoder(); - - private readonly UInt32[] _matchDistances = new UInt32[Base.kMatchMaxLen*2 + 2]; - private readonly Optimal[] _optimum = new Optimal[kNumOpts]; - private readonly BitEncoder[] _posEncoders = new BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[Base.kNumLenToPosStates]; - - private readonly UInt32[] _posSlotPrices = new UInt32[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; - private readonly RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); - private readonly UInt32[] _repDistances = new UInt32[Base.kNumRepDistances]; - private readonly LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); - private readonly Byte[] properties = new Byte[kPropSize]; - private readonly UInt32[] repLens = new UInt32[Base.kNumRepDistances]; - private readonly UInt32[] reps = new UInt32[Base.kNumRepDistances]; - private readonly UInt32[] tempPrices = new UInt32[Base.kNumFullDistances]; - private UInt32 _additionalOffset; - private UInt32 _alignPriceCount; - - private UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize); - private UInt32 _dictionarySizePrev = 0xFFFFFFFF; - private UInt32 _distTableSize = (kDefaultDictionaryLogSize*2); - private bool _finished; - private Stream _inStream; - private UInt32 _longestMatchLength; - private bool _longestMatchWasFound; - private IMatchFinder _matchFinder; - - private EMatchFinderType _matchFinderType = EMatchFinderType.BT4; - private UInt32 _matchPriceCount; - - private bool _needReleaseMFStream; - private UInt32 _numDistancePairs; - private UInt32 _numFastBytes = kNumFastBytesDefault; - private UInt32 _numFastBytesPrev = 0xFFFFFFFF; - private int _numLiteralContextBits = 3; - private int _numLiteralPosStateBits; - private UInt32 _optimumCurrentIndex; - private UInt32 _optimumEndIndex; - private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits); - private int _posStateBits = 2; - private UInt32 _posStateMask = (4 - 1); - private Byte _previousByte; - private Base.State _state; - private uint _trainSize; - private bool _writeEndMark; - private Int64 nowPos64; - - static Encoder() - { - const Byte kFastSlots = 22; - int c = 2; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) - { - UInt32 k = ((UInt32) 1 << ((slotFast >> 1) - 1)); - for (UInt32 j = 0; j < k; j++, c++) - g_FastPos[c] = slotFast; - } - } - - /// - /// Initializes a new instance of the Encoder class - /// - public Encoder() - { - for (int i = 0; i < kNumOpts; i++) - _optimum[i] = new Optimal(); - for (int i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i] = new BitTreeEncoder(Base.kNumPosSlotBits); - } - - #region ICoder Members - - /// - /// Codes the specified stream - /// - /// The input stream - /// The input size - /// The output size - /// The output stream - /// The progress callback - public void Code(Stream inStream, Stream outStream, - Int64 inSize, Int64 outSize, ICodeProgress progress) - { - _needReleaseMFStream = false; - try - { - SetStreams(inStream, outStream /*, inSize, outSize*/); - while (true) - { - Int64 processedInSize; - Int64 processedOutSize; - bool finished; - CodeOneBlock(out processedInSize, out processedOutSize, out finished); - if (finished) - return; - if (progress != null) - { - progress.SetProgress(processedInSize, processedOutSize); - } - } - } - finally - { - ReleaseStreams(); - } - } - - #endregion - - #region ISetCoderProperties Members - - /// - /// Sets the coder properties - /// - /// The property identificators - /// The array of properties - public void SetCoderProperties(CoderPropId[] propIDs, object[] properties) - { - for (UInt32 i = 0; i < properties.Length; i++) - { - object prop = properties[i]; - switch (propIDs[i]) - { - case CoderPropId.NumFastBytes: - { - if (!(prop is Int32)) - throw new InvalidParamException(); - var numFastBytes = (Int32) prop; - if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) - throw new InvalidParamException(); - _numFastBytes = (UInt32) numFastBytes; - break; - } - case CoderPropId.Algorithm: - { - /* - if (!(prop is Int32)) - throw new InvalidParamException(); - Int32 maximize = (Int32)prop; - _fastMode = (maximize == 0); - _maxMode = (maximize >= 2); - */ - break; - } - case CoderPropId.MatchFinder: - { - if (!(prop is String)) - throw new InvalidParamException(); - EMatchFinderType matchFinderIndexPrev = _matchFinderType; - int m = FindMatchFinder(((string) prop).ToUpper(CultureInfo.CurrentCulture)); - if (m < 0) - throw new InvalidParamException(); - _matchFinderType = (EMatchFinderType) m; - if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) - { - _dictionarySizePrev = 0xFFFFFFFF; - _matchFinder = null; - } - break; - } - case CoderPropId.DictionarySize: - { - const int kDicLogSizeMaxCompress = 30; - if (!(prop is Int32)) - throw new InvalidParamException(); - ; - var dictionarySize = (Int32) prop; - if (dictionarySize < (UInt32) (1 << Base.kDicLogSizeMin) || - dictionarySize > (UInt32) (1 << kDicLogSizeMaxCompress)) - throw new InvalidParamException(); - _dictionarySize = (UInt32) dictionarySize; - int dicLogSize; - for (dicLogSize = 0; dicLogSize < (UInt32) kDicLogSizeMaxCompress; dicLogSize++) - if (dictionarySize <= ((UInt32) (1) << dicLogSize)) - break; - _distTableSize = (UInt32) dicLogSize*2; - break; - } - case CoderPropId.PosStateBits: - { - if (!(prop is Int32)) - throw new InvalidParamException(); - var v = (Int32) prop; - if (v < 0 || v > (UInt32) Base.kNumPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _posStateBits = v; - _posStateMask = (((UInt32) 1) << _posStateBits) - 1; - break; - } - case CoderPropId.LitPosBits: - { - if (!(prop is Int32)) - throw new InvalidParamException(); - var v = (Int32) prop; - if (v < 0 || v > Base.kNumLitPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _numLiteralPosStateBits = v; - break; - } - case CoderPropId.LitContextBits: - { - if (!(prop is Int32)) - throw new InvalidParamException(); - var v = (Int32) prop; - if (v < 0 || v > Base.kNumLitContextBitsMax) - throw new InvalidParamException(); - ; - _numLiteralContextBits = v; - break; - } - case CoderPropId.EndMarker: - { - if (!(prop is Boolean)) - throw new InvalidParamException(); - SetWriteEndMarkerMode((Boolean) prop); - break; - } - default: - throw new InvalidParamException(); - } - } - } - - #endregion - - #region IWriteCoderProperties Members - - /// - /// Writes the coder properties - /// - /// The output stream to write the properties to. - public void WriteCoderProperties(Stream outStream) - { - properties[0] = (Byte) ((_posStateBits*5 + _numLiteralPosStateBits)*9 + _numLiteralContextBits); - for (int i = 0; i < 4; i++) - properties[1 + i] = (Byte) (_dictionarySize >> (8*i)); - outStream.Write(properties, 0, kPropSize); - } - - #endregion - - private static UInt32 GetPosSlot(UInt32 pos) - { - if (pos < (1 << 11)) - return g_FastPos[pos]; - if (pos < (1 << 21)) - return (UInt32) (g_FastPos[pos >> 10] + 20); - return (UInt32) (g_FastPos[pos >> 20] + 40); - } - - private static UInt32 GetPosSlot2(UInt32 pos) - { - if (pos < (1 << 17)) - return (UInt32) (g_FastPos[pos >> 6] + 12); - if (pos < (1 << 27)) - return (UInt32) (g_FastPos[pos >> 16] + 32); - return (UInt32) (g_FastPos[pos >> 26] + 52); - } - - private void BaseInit() - { - _state.Init(); - _previousByte = 0; - for (UInt32 i = 0; i < Base.kNumRepDistances; i++) - _repDistances[i] = 0; - } - - private void Create() - { - if (_matchFinder == null) - { - var bt = new BinTree(); - int numHashBytes = 4; - if (_matchFinderType == EMatchFinderType.BT2) - numHashBytes = 2; - bt.SetType(numHashBytes); - _matchFinder = bt; - } - _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); - - if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) - return; - _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); - _dictionarySizePrev = _dictionarySize; - _numFastBytesPrev = _numFastBytes; - } - - private void SetWriteEndMarkerMode(bool writeEndMarker) - { - _writeEndMark = writeEndMarker; - } - - private void Init() - { - BaseInit(); - _rangeEncoder.Init(); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= _posStateMask; j++) - { - uint complexState = (i << Base.kNumPosStatesBitsMax) + j; - _isMatch[complexState].Init(); - _isRep0Long[complexState].Init(); - } - _isRep[i].Init(); - _isRepG0[i].Init(); - _isRepG1[i].Init(); - _isRepG2[i].Init(); - } - _literalEncoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i].Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - _posEncoders[i].Init(); - - _lenEncoder.Init((UInt32) 1 << _posStateBits); - _repMatchLenEncoder.Init((UInt32) 1 << _posStateBits); - - _posAlignEncoder.Init(); - - _longestMatchWasFound = false; - _optimumEndIndex = 0; - _optimumCurrentIndex = 0; - _additionalOffset = 0; - } - - private void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs) - { - lenRes = 0; - numDistancePairs = _matchFinder.GetMatches(_matchDistances); - if (numDistancePairs > 0) - { - lenRes = _matchDistances[numDistancePairs - 2]; - if (lenRes == _numFastBytes) - lenRes += _matchFinder.GetMatchLen((int) lenRes - 1, _matchDistances[numDistancePairs - 1], - Base.kMatchMaxLen - lenRes); - } - _additionalOffset++; - } - - - private void MovePos(UInt32 num) - { - if (num > 0) - { - _matchFinder.Skip(num); - _additionalOffset += num; - } - } - - private UInt32 GetRepLen1Price(Base.State state, UInt32 posState) - { - return _isRepG0[state.Index].GetPrice0() + - _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); - } - - private UInt32 GetPureRepPrice(UInt32 repIndex, Base.State state, UInt32 posState) - { - UInt32 price; - if (repIndex == 0) - { - price = _isRepG0[state.Index].GetPrice0(); - price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - } - else - { - price = _isRepG0[state.Index].GetPrice1(); - if (repIndex == 1) - price += _isRepG1[state.Index].GetPrice0(); - else - { - price += _isRepG1[state.Index].GetPrice1(); - price += _isRepG2[state.Index].GetPrice(repIndex - 2); - } - } - return price; - } - - private UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, Base.State state, UInt32 posState) - { - UInt32 price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - return price + GetPureRepPrice(repIndex, state, posState); - } - - private UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) - { - UInt32 price; - UInt32 lenToPosState = Base.GetLenToPosState(len); - if (pos < Base.kNumFullDistances) - price = _distancesPrices[(lenToPosState*Base.kNumFullDistances) + pos]; - else - price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + - _alignPrices[pos & Base.kAlignMask]; - return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - } - - private UInt32 Backward(out UInt32 backRes, UInt32 cur) - { - _optimumEndIndex = cur; - UInt32 posMem = _optimum[cur].PosPrev; - UInt32 backMem = _optimum[cur].BackPrev; - do - { - if (_optimum[cur].Prev1IsChar) - { - _optimum[posMem].MakeAsChar(); - _optimum[posMem].PosPrev = posMem - 1; - if (_optimum[cur].Prev2) - { - _optimum[posMem - 1].Prev1IsChar = false; - _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; - _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; - } - } - UInt32 posPrev = posMem; - UInt32 backCur = backMem; - - backMem = _optimum[posPrev].BackPrev; - posMem = _optimum[posPrev].PosPrev; - - _optimum[posPrev].BackPrev = backCur; - _optimum[posPrev].PosPrev = cur; - cur = posPrev; - } while (cur > 0); - backRes = _optimum[0].BackPrev; - _optimumCurrentIndex = _optimum[0].PosPrev; - return _optimumCurrentIndex; - } - - - private UInt32 GetOptimum(UInt32 position, out UInt32 backRes) - { - if (_optimumEndIndex != _optimumCurrentIndex) - { - UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; - backRes = _optimum[_optimumCurrentIndex].BackPrev; - _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; - return lenRes; - } - _optimumCurrentIndex = _optimumEndIndex = 0; - - UInt32 lenMain, numDistancePairs; - if (!_longestMatchWasFound) - { - ReadMatchDistances(out lenMain, out numDistancePairs); - } - else - { - lenMain = _longestMatchLength; - numDistancePairs = _numDistancePairs; - _longestMatchWasFound = false; - } - - UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; - if (numAvailableBytes < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - if (numAvailableBytes > Base.kMatchMaxLen) - numAvailableBytes = Base.kMatchMaxLen; - - UInt32 repMaxIndex = 0; - - for (UInt32 i = 0; i < Base.kNumRepDistances; i++) - { - reps[i] = _repDistances[i]; - repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); - if (repLens[i] > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= _numFastBytes) - { - backRes = repMaxIndex; - UInt32 lenRes = repLens[repMaxIndex]; - MovePos(lenRes - 1); - return lenRes; - } - - if (lenMain >= _numFastBytes) - { - backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; - MovePos(lenMain - 1); - return lenMain; - } - - Byte currentByte = _matchFinder.GetIndexByte(0 - 1); - Byte matchByte = _matchFinder.GetIndexByte((Int32) (0 - _repDistances[0] - 1 - 1)); - - if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - - _optimum[0].State = _state; - - UInt32 posState = (position & _posStateMask); - - _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), - matchByte, currentByte); - _optimum[1].MakeAsChar(); - - UInt32 matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); - - if (matchByte == currentByte) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); - if (shortRepPrice < _optimum[1].Price) - { - _optimum[1].Price = shortRepPrice; - _optimum[1].MakeAsShortRep(); - } - } - - UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); - - if (lenEnd < 2) - { - backRes = _optimum[1].BackPrev; - return 1; - } - - _optimum[1].PosPrev = 0; - - _optimum[0].Backs0 = reps[0]; - _optimum[0].Backs1 = reps[1]; - _optimum[0].Backs2 = reps[2]; - _optimum[0].Backs3 = reps[3]; - - UInt32 len = lenEnd; - do - _optimum[len--].Price = kIfinityPrice; while (len >= 2); - - for (UInt32 i = 0; i < Base.kNumRepDistances; i++) - { - UInt32 repLen = repLens[i]; - if (repLen < 2) - continue; - UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); - do - { - UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); - Optimal optimum = _optimum[repLen]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = i; - optimum.Prev1IsChar = false; - } - } while (--repLen >= 2); - } - - UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); - - len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); - if (len <= lenMain) - { - UInt32 offs = 0; - while (len > _matchDistances[offs]) - offs += 2; - for (;; len++) - { - UInt32 distance = _matchDistances[offs + 1]; - UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); - Optimal optimum = _optimum[len]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = distance + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - if (len == _matchDistances[offs]) - { - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - - UInt32 cur = 0; - - while (true) - { - cur++; - if (cur == lenEnd) - return Backward(out backRes, cur); - UInt32 newLen; - ReadMatchDistances(out newLen, out numDistancePairs); - if (newLen >= _numFastBytes) - { - _numDistancePairs = numDistancePairs; - _longestMatchLength = newLen; - _longestMatchWasFound = true; - return Backward(out backRes, cur); - } - position++; - UInt32 posPrev = _optimum[cur].PosPrev; - Base.State state; - if (_optimum[cur].Prev1IsChar) - { - posPrev--; - if (_optimum[cur].Prev2) - { - state = _optimum[_optimum[cur].PosPrev2].State; - if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - else - state = _optimum[posPrev].State; - state.UpdateChar(); - } - else - state = _optimum[posPrev].State; - if (posPrev == cur - 1) - { - if (_optimum[cur].IsShortRep()) - state.UpdateShortRep(); - else - state.UpdateChar(); - } - else - { - UInt32 pos; - if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) - { - posPrev = _optimum[cur].PosPrev2; - pos = _optimum[cur].BackPrev2; - state.UpdateRep(); - } - else - { - pos = _optimum[cur].BackPrev; - if (pos < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - Optimal opt = _optimum[posPrev]; - if (pos < Base.kNumRepDistances) - { - if (pos == 0) - { - reps[0] = opt.Backs0; - reps[1] = opt.Backs1; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 1) - { - reps[0] = opt.Backs1; - reps[1] = opt.Backs0; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 2) - { - reps[0] = opt.Backs2; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs3; - } - else - { - reps[0] = opt.Backs3; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - else - { - reps[0] = (pos - Base.kNumRepDistances); - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - _optimum[cur].State = state; - _optimum[cur].Backs0 = reps[0]; - _optimum[cur].Backs1 = reps[1]; - _optimum[cur].Backs2 = reps[2]; - _optimum[cur].Backs3 = reps[3]; - UInt32 curPrice = _optimum[cur].Price; - - currentByte = _matchFinder.GetIndexByte(0 - 1); - matchByte = _matchFinder.GetIndexByte((Int32) (0 - reps[0] - 1 - 1)); - - posState = (position & _posStateMask); - - UInt32 curAnd1Price = curPrice + - _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). - GetPrice(!state.IsCharState(), matchByte, currentByte); - - Optimal nextOptimum = _optimum[cur + 1]; - - bool nextIsChar = false; - if (curAnd1Price < nextOptimum.Price) - { - nextOptimum.Price = curAnd1Price; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsChar(); - nextIsChar = true; - } - - matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); - - if (matchByte == currentByte && - !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); - if (shortRepPrice <= nextOptimum.Price) - { - nextOptimum.Price = shortRepPrice; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsShortRep(); - nextIsChar = true; - } - } - - UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; - numAvailableBytesFull = Math.Min(((int) kNumOpts) - 1 - cur, numAvailableBytesFull); - numAvailableBytes = numAvailableBytesFull; - - if (numAvailableBytes < 2) - continue; - if (numAvailableBytes > _numFastBytes) - numAvailableBytes = _numFastBytes; - if (!nextIsChar && matchByte != currentByte) - { - // try Literal + rep0 - UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); - if (lenTest2 >= 2) - { - Base.State state2 = state; - state2.UpdateChar(); - UInt32 posStateNext = (position + 1) & _posStateMask; - UInt32 nextRepMatchPrice = curAnd1Price + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext]. - GetPrice1() + - _isRep[state2.Index].GetPrice1(); - { - UInt32 offset = cur + 1 + lenTest2; - while (lenEnd < offset) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( - 0, lenTest2, state2, posStateNext); - Optimal optimum = _optimum[offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = false; - } - } - } - } - - UInt32 startLen = 2; // speed optimization - - for (UInt32 repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) - { - UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); - if (lenTest < 2) - continue; - UInt32 lenTestTemp = lenTest; - do - { - while (lenEnd < cur + lenTest) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); - Optimal optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = repIndex; - optimum.Prev1IsChar = false; - } - } while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; - - // if (_maxMode) - if (lenTest < numAvailableBytesFull) - { - UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32) lenTest, reps[repIndex], t); - if (lenTest2 >= 2) - { - Base.State state2 = state; - state2.UpdateRep(); - UInt32 posStateNext = (position + lenTest) & _posStateMask; - UInt32 curAndLenCharPrice = - repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((Int32) lenTest - 1 - 1)).GetPrice - (true, - _matchFinder.GetIndexByte(((Int32) lenTest - 1 - (Int32) (reps[repIndex] + 1))), - _matchFinder.GetIndexByte((Int32) lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - UInt32 nextMatchPrice = curAndLenCharPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext] - .GetPrice1(); - UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - // for(; lenTest2 >= 2; lenTest2--) - { - UInt32 offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = nextRepMatchPrice + - GetRepPrice(0, lenTest2, state2, posStateNext); - Optimal optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = repIndex; - } - } - } - } - } - - if (newLen > numAvailableBytes) - { - newLen = numAvailableBytes; - for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; - _matchDistances[numDistancePairs] = newLen; - numDistancePairs += 2; - } - if (newLen >= startLen) - { - normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); - while (lenEnd < cur + newLen) - _optimum[++lenEnd].Price = kIfinityPrice; - - UInt32 offs = 0; - while (startLen > _matchDistances[offs]) - offs += 2; - - for (UInt32 lenTest = startLen;; lenTest++) - { - UInt32 curBack = _matchDistances[offs + 1]; - UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); - Optimal optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = curBack + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - - if (lenTest == _matchDistances[offs]) - { - if (lenTest < numAvailableBytesFull) - { - UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32) lenTest, curBack, t); - if (lenTest2 >= 2) - { - Base.State state2 = state; - state2.UpdateMatch(); - UInt32 posStateNext = (position + lenTest) & _posStateMask; - UInt32 curAndLenCharPrice = curAndLenPrice + - _isMatch[ - (state2.Index << Base.kNumPosStatesBitsMax) + - posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte( - (Int32) lenTest - 1 - 1)) - . - GetPrice(true, - _matchFinder.GetIndexByte((Int32) lenTest - - (Int32) - (curBack + 1) - 1), - _matchFinder.GetIndexByte((Int32) lenTest - - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - UInt32 nextMatchPrice = curAndLenCharPrice + - _isMatch[ - (state2.Index << Base.kNumPosStatesBitsMax) + - posStateNext].GetPrice1(); - UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - UInt32 offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = curBack + Base.kNumRepDistances; - } - } - } - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - } - } - - /*static bool ChangePair(UInt32 smallDist, UInt32 bigDist) - { - const int kDif = 7; - return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif)); - }*/ - - private void WriteEndMarker(UInt32 posState) - { - if (!_writeEndMark) - return; - - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - UInt32 len = Base.kMatchMinLen; - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - UInt32 posSlot = (1 << Base.kNumPosSlotBits) - 1; - UInt32 lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - int footerBits = 30; - UInt32 posReduced = (((UInt32) 1) << footerBits) - 1; - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - } - - private void Flush(UInt32 nowPos) - { - ReleaseMFStream(); - WriteEndMarker(nowPos & _posStateMask); - _rangeEncoder.FlushData(); - _rangeEncoder.FlushStream(); - } - - internal void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished) - { - inSize = 0; - outSize = 0; - finished = true; - - if (_inStream != null) - { - _matchFinder.SetStream(_inStream); - _matchFinder.Init(); - _needReleaseMFStream = true; - _inStream = null; - if (_trainSize > 0) - _matchFinder.Skip(_trainSize); - } - - if (_finished) - return; - _finished = true; - - - Int64 progressPosValuePrev = nowPos64; - if (nowPos64 == 0) - { - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32) nowPos64); - return; - } - UInt32 len, numDistancePairs; // it's not used - ReadMatchDistances(out len, out numDistancePairs); - UInt32 posState = (UInt32) (nowPos64) & _posStateMask; - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); - _state.UpdateChar(); - Byte curByte = _matchFinder.GetIndexByte((Int32) (0 - _additionalOffset)); - _literalEncoder.GetSubCoder((UInt32) (nowPos64), _previousByte).Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _additionalOffset--; - nowPos64++; - } - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32) nowPos64); - return; - } - while (true) - { - UInt32 pos; - UInt32 len = GetOptimum((UInt32) nowPos64, out pos); - - UInt32 posState = ((UInt32) nowPos64) & _posStateMask; - UInt32 complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; - if (len == 1 && pos == 0xFFFFFFFF) - { - _isMatch[complexState].Encode(_rangeEncoder, 0); - Byte curByte = _matchFinder.GetIndexByte((Int32) (0 - _additionalOffset)); - LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32) nowPos64, _previousByte); - if (!_state.IsCharState()) - { - Byte matchByte = - _matchFinder.GetIndexByte((Int32) (0 - _repDistances[0] - 1 - _additionalOffset)); - subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); - } - else - subCoder.Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _state.UpdateChar(); - } - else - { - _isMatch[complexState].Encode(_rangeEncoder, 1); - if (pos < Base.kNumRepDistances) - { - _isRep[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 0) - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 0); - if (len == 1) - _isRep0Long[complexState].Encode(_rangeEncoder, 0); - else - _isRep0Long[complexState].Encode(_rangeEncoder, 1); - } - else - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 1) - _isRepG1[_state.Index].Encode(_rangeEncoder, 0); - else - { - _isRepG1[_state.Index].Encode(_rangeEncoder, 1); - _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); - } - } - if (len == 1) - _state.UpdateShortRep(); - else - { - _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - _state.UpdateRep(); - } - UInt32 distance = _repDistances[pos]; - if (pos != 0) - { - for (UInt32 i = pos; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - } - } - else - { - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - pos -= Base.kNumRepDistances; - UInt32 posSlot = GetPosSlot(pos); - UInt32 lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - - if (posSlot >= Base.kStartPosModelIndex) - { - var footerBits = (int) ((posSlot >> 1) - 1); - UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); - UInt32 posReduced = pos - baseVal; - - if (posSlot < Base.kEndPosModelIndex) - BitTreeEncoder.ReverseEncode(_posEncoders, - baseVal - posSlot - 1, _rangeEncoder, footerBits, - posReduced); - else - { - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, - footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - _alignPriceCount++; - } - } - UInt32 distance = pos; - for (Int32 i = ((int) Base.kNumRepDistances) - 1; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - _matchPriceCount++; - } - _previousByte = _matchFinder.GetIndexByte((Int32) (len - 1 - _additionalOffset)); - } - _additionalOffset -= len; - nowPos64 += len; - if (_additionalOffset == 0) - { - // if (!_fastMode) - if (_matchPriceCount >= (1 << 7)) - FillDistancesPrices(); - if (_alignPriceCount >= Base.kAlignTableSize) - FillAlignPrices(); - inSize = nowPos64; - outSize = _rangeEncoder.GetProcessedSizeAdd(); - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32) nowPos64); - return; - } - - if (nowPos64 - progressPosValuePrev >= (1 << 12)) - { - _finished = false; - finished = false; - return; - } - } - } - } - - private void ReleaseMFStream() - { - if (_matchFinder != null && _needReleaseMFStream) - { - _matchFinder.ReleaseStream(); - _needReleaseMFStream = false; - } - } - - private void SetOutStream(Stream outStream) - { - _rangeEncoder.SetStream(outStream); - } - - private void ReleaseOutStream() - { - _rangeEncoder.ReleaseStream(); - } - - private void ReleaseStreams() - { - ReleaseMFStream(); - ReleaseOutStream(); - } - - private void SetStreams(Stream inStream, Stream outStream /*, - Int64 inSize, Int64 outSize*/) - { - _inStream = inStream; - _finished = false; - Create(); - SetOutStream(outStream); - Init(); - - // if (!_fastMode) - { - FillDistancesPrices(); - FillAlignPrices(); - } - - _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _lenEncoder.UpdateTables((UInt32) 1 << _posStateBits); - _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _repMatchLenEncoder.UpdateTables((UInt32) 1 << _posStateBits); - - nowPos64 = 0; - } - - private void FillDistancesPrices() - { - for (UInt32 i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) - { - UInt32 posSlot = GetPosSlot(i); - var footerBits = (int) ((posSlot >> 1) - 1); - UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); - tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, - baseVal - posSlot - 1, footerBits, i - baseVal); - } - - for (UInt32 lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) - { - UInt32 posSlot; - BitTreeEncoder encoder = _posSlotEncoder[lenToPosState]; - - UInt32 st = (lenToPosState << Base.kNumPosSlotBits); - for (posSlot = 0; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); - for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << - BitEncoder.kNumBitPriceShiftBits); - - UInt32 st2 = lenToPosState*Base.kNumFullDistances; - UInt32 i; - for (i = 0; i < Base.kStartPosModelIndex; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + i]; - for (; i < Base.kNumFullDistances; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; - } - _matchPriceCount = 0; - } - - private void FillAlignPrices() - { - for (UInt32 i = 0; i < Base.kAlignTableSize; i++) - _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); - _alignPriceCount = 0; - } - - - private static int FindMatchFinder(string s) - { - for (int m = 0; m < kMatchFinderIDs.Length; m++) - if (s == kMatchFinderIDs[m]) - return m; - return -1; - } - - #region Nested type: EMatchFinderType - - private enum EMatchFinderType - { - BT2, - BT4, - } ; - - #endregion - - #region Nested type: LenEncoder - - private class LenEncoder - { - private readonly BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private readonly BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private BitEncoder _choice; - private BitEncoder _choice2; - private BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits); - - public LenEncoder() - { - for (UInt32 posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) - { - _lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits); - _midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits); - } - } - - public void Init(UInt32 numPosStates) - { - _choice.Init(); - _choice2.Init(); - for (UInt32 posState = 0; posState < numPosStates; posState++) - { - _lowCoder[posState].Init(); - _midCoder[posState].Init(); - } - _highCoder.Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) - { - if (symbol < Base.kNumLowLenSymbols) - { - _choice.Encode(rangeEncoder, 0); - _lowCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - symbol -= Base.kNumLowLenSymbols; - _choice.Encode(rangeEncoder, 1); - if (symbol < Base.kNumMidLenSymbols) - { - _choice2.Encode(rangeEncoder, 0); - _midCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - _choice2.Encode(rangeEncoder, 1); - _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); - } - } - } - - public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st) - { - UInt32 a0 = _choice.GetPrice0(); - UInt32 a1 = _choice.GetPrice1(); - UInt32 b0 = a1 + _choice2.GetPrice0(); - UInt32 b1 = a1 + _choice2.GetPrice1(); - UInt32 i = 0; - for (i = 0; i < Base.kNumLowLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); - } - for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); - } - for (; i < numSymbols; i++) - prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); - } - } ; - - #endregion - - #region Nested type: LenPriceTableEncoder - - private class LenPriceTableEncoder : LenEncoder - { - private readonly UInt32[] _counters = new UInt32[Base.kNumPosStatesEncodingMax]; - private readonly UInt32[] _prices = new UInt32[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; - private UInt32 _tableSize; - - public void SetTableSize(UInt32 tableSize) - { - _tableSize = tableSize; - } - - public UInt32 GetPrice(UInt32 symbol, UInt32 posState) - { - return _prices[posState*Base.kNumLenSymbols + symbol]; - } - - private void UpdateTable(UInt32 posState) - { - SetPrices(posState, _tableSize, _prices, posState*Base.kNumLenSymbols); - _counters[posState] = _tableSize; - } - - public void UpdateTables(UInt32 numPosStates) - { - for (UInt32 posState = 0; posState < numPosStates; posState++) - UpdateTable(posState); - } - - public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) - { - base.Encode(rangeEncoder, symbol, posState); - if (--_counters[posState] == 0) - UpdateTable(posState); - } - } - - #endregion - - #region Nested type: LiteralEncoder - - private class LiteralEncoder - { - private Encoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - internal void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint) 1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint) 1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Encoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - internal void Init() - { - uint numStates = (uint) 1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - internal Encoder2 GetSubCoder(UInt32 pos, Byte prevByte) - { - return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint) (prevByte >> (8 - m_NumPrevBits))]; - } - - #region Nested type: Encoder2 - - public struct Encoder2 - { - private BitEncoder[] m_Encoders; - - public void Create() - { - m_Encoders = new BitEncoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) - { - uint context = 1; - for (int i = 7; i >= 0; i--) - { - var bit = (uint) ((symbol >> i) & 1); - m_Encoders[context].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) - { - uint context = 1; - bool same = true; - for (int i = 7; i >= 0; i--) - { - var bit = (uint) ((symbol >> i) & 1); - uint state = context; - if (same) - { - var matchBit = (uint) ((matchByte >> i) & 1); - state += ((1 + matchBit) << 8); - same = (matchBit == bit); - } - m_Encoders[state].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public uint GetPrice(bool matchMode, byte matchByte, byte symbol) - { - uint price = 0; - uint context = 1; - int i = 7; - if (matchMode) - { - for (; i >= 0; i--) - { - uint matchBit = (uint) (matchByte >> i) & 1; - uint bit = (uint) (symbol >> i) & 1; - price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); - context = (context << 1) | bit; - if (matchBit != bit) - { - i--; - break; - } - } - } - for (; i >= 0; i--) - { - uint bit = (uint) (symbol >> i) & 1; - price += m_Encoders[context].GetPrice(bit); - context = (context << 1) | bit; - } - return price; - } - } - - #endregion - } - - #endregion - - #region Nested type: Optimal - - private class Optimal - { - public UInt32 BackPrev; - public UInt32 BackPrev2; - - public UInt32 Backs0; - public UInt32 Backs1; - public UInt32 Backs2; - public UInt32 Backs3; - public UInt32 PosPrev; - public UInt32 PosPrev2; - public bool Prev1IsChar; - public bool Prev2; - public UInt32 Price; - public Base.State State; - - public void MakeAsChar() - { - BackPrev = 0xFFFFFFFF; - Prev1IsChar = false; - } - - public void MakeAsShortRep() - { - BackPrev = 0; - ; - Prev1IsChar = false; - } - - public bool IsShortRep() - { - return (BackPrev == 0); - } - } ; - - #endregion - - internal void SetTrainSize(uint trainSize) - { - _trainSize = trainSize; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoder.cs b/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoder.cs deleted file mode 100644 index b371fe34ce..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoder.cs +++ /dev/null @@ -1,249 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip.Sdk.Compression.RangeCoder -{ - internal class Encoder - { - public const uint kTopValue = (1 << 24); - private byte _cache; - private uint _cacheSize; - - public UInt64 Low; - public uint Range; - - private long StartPosition; - private Stream Stream; - - public void SetStream(Stream stream) - { - Stream = stream; - } - - public void ReleaseStream() - { - Stream = null; - } - - public void Init() - { - StartPosition = Stream.Position; - - Low = 0; - Range = 0xFFFFFFFF; - _cacheSize = 1; - _cache = 0; - } - - public void FlushData() - { - for (int i = 0; i < 5; i++) - ShiftLow(); - } - - public void FlushStream() - { - Stream.Flush(); - } - - /*public void CloseStream() - { - Stream.Close(); - }*/ - - /*public void Encode(uint start, uint size, uint total) - { - Low += start * (Range /= total); - Range *= size; - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - }*/ - - public void ShiftLow() - { - if ((uint) Low < 0xFF000000 || (uint) (Low >> 32) == 1) - { - byte temp = _cache; - do - { - Stream.WriteByte((byte) (temp + (Low >> 32))); - temp = 0xFF; - } while (--_cacheSize != 0); - _cache = (byte) (((uint) Low) >> 24); - } - _cacheSize++; - Low = ((uint) Low) << 8; - } - - public void EncodeDirectBits(uint v, int numTotalBits) - { - for (int i = numTotalBits - 1; i >= 0; i--) - { - Range >>= 1; - if (((v >> i) & 1) == 1) - Low += Range; - if (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - } - - /*public void EncodeBit(uint size0, int numTotalBits, uint symbol) - { - uint newBound = (Range >> numTotalBits) * size0; - if (symbol == 0) - Range = newBound; - else - { - Low += newBound; - Range -= newBound; - } - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - }*/ - - public long GetProcessedSizeAdd() - { - return _cacheSize + - Stream.Position - StartPosition + 4; - // (long)Stream.GetProcessedSize(); - } - } - - internal class Decoder - { - public const uint kTopValue = (1 << 24); - public uint Code; - public uint Range; - // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); - public Stream Stream; - - public void Init(Stream stream) - { - // Stream.Init(stream); - Stream = stream; - - Code = 0; - Range = 0xFFFFFFFF; - for (int i = 0; i < 5; i++) - Code = (Code << 8) | (byte) Stream.ReadByte(); - } - - public void ReleaseStream() - { - // Stream.ReleaseStream(); - Stream = null; - } - - /*public void CloseStream() - { - Stream.Close(); - }*/ - - /*public void Normalize() - { - while (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - }*/ - - /*public void Normalize2() - { - if (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - }*/ - - /*public uint GetThreshold(uint total) - { - return Code / (Range /= total); - }*/ - - /*public void Decode(uint start, uint size, uint total) - { - Code -= start * Range; - Range *= size; - Normalize(); - }*/ - - public uint DecodeDirectBits(int numTotalBits) - { - uint range = Range; - uint code = Code; - uint result = 0; - for (int i = numTotalBits; i > 0; i--) - { - range >>= 1; - /* - result <<= 1; - if (code >= range) - { - code -= range; - result |= 1; - } - */ - uint t = (code - range) >> 31; - code -= range & (t - 1); - result = (result << 1) | (1 - t); - - if (range < kTopValue) - { - code = (code << 8) | (byte) Stream.ReadByte(); - range <<= 8; - } - } - Range = range; - Code = code; - return result; - } - - /*public uint DecodeBit(uint size0, int numTotalBits) - { - uint newBound = (Range >> numTotalBits) * size0; - uint symbol; - if (Code < newBound) - { - symbol = 0; - Range = newBound; - } - else - { - symbol = 1; - Code -= newBound; - Range -= newBound; - } - Normalize(); - return symbol; - }*/ - - // ulong GetProcessedSize() {return Stream.GetProcessedSize(); } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBit.cs b/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBit.cs deleted file mode 100644 index 48fa6db98f..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBit.cs +++ /dev/null @@ -1,146 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; - -namespace SevenZip.Sdk.Compression.RangeCoder -{ - internal struct BitEncoder - { - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); - public const int kNumBitModelTotalBits = 11; - public const int kNumBitPriceShiftBits = 6; - private const int kNumMoveBits = 5; - private const int kNumMoveReducingBits = 2; - private static readonly UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits]; - - private uint Prob; - - static BitEncoder() - { - const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); - for (int i = kNumBits - 1; i >= 0; i--) - { - UInt32 start = (UInt32) 1 << (kNumBits - i - 1); - UInt32 end = (UInt32) 1 << (kNumBits - i); - for (UInt32 j = start; j < end; j++) - ProbPrices[j] = ((UInt32) i << kNumBitPriceShiftBits) + - (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); - } - } - - public void Init() - { - Prob = kBitModelTotal >> 1; - } - - /*public void UpdateModel(uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - else - Prob -= (Prob) >> kNumMoveBits; - }*/ - - public void Encode(Encoder encoder, uint symbol) - { - // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); - // UpdateModel(symbol); - uint newBound = (encoder.Range >> kNumBitModelTotalBits)*Prob; - if (symbol == 0) - { - encoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - } - else - { - encoder.Low += newBound; - encoder.Range -= newBound; - Prob -= (Prob) >> kNumMoveBits; - } - if (encoder.Range < Encoder.kTopValue) - { - encoder.Range <<= 8; - encoder.ShiftLow(); - } - } - - public uint GetPrice(uint symbol) - { - return ProbPrices[(((Prob - symbol) ^ ((-(int) symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; - } - - public uint GetPrice0() - { - return ProbPrices[Prob >> kNumMoveReducingBits]; - } - - public uint GetPrice1() - { - return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; - } - } - - internal struct BitDecoder - { - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); - public const int kNumBitModelTotalBits = 11; - private const int kNumMoveBits = 5; - - private uint Prob; - - /*public void UpdateModel(int numMoveBits, uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> numMoveBits; - else - Prob -= (Prob) >> numMoveBits; - }*/ - - public void Init() - { - Prob = kBitModelTotal >> 1; - } - - public uint Decode(Decoder rangeDecoder) - { - uint newBound = (rangeDecoder.Range >> kNumBitModelTotalBits)*Prob; - if (rangeDecoder.Code < newBound) - { - rangeDecoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte) rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 0; - } - else - { - rangeDecoder.Range -= newBound; - rangeDecoder.Code -= newBound; - Prob -= (Prob) >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte) rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 1; - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBitTree.cs b/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBitTree.cs deleted file mode 100644 index 2e3bd4d18b..0000000000 --- a/BizHawk.Client.Common/7z/sdk/Compress/RangeCoder/RangeCoderBitTree.cs +++ /dev/null @@ -1,173 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; - -namespace SevenZip.Sdk.Compression.RangeCoder -{ - internal struct BitTreeEncoder - { - private readonly BitEncoder[] Models; - private readonly int NumBitLevels; - - public BitTreeEncoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitEncoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < (1 << NumBitLevels); i++) - Models[i].Init(); - } - - public void Encode(Encoder rangeEncoder, UInt32 symbol) - { - UInt32 m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - UInt32 bit = (symbol >> bitIndex) & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - } - } - - public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol) - { - UInt32 m = 1; - for (UInt32 i = 0; i < NumBitLevels; i++) - { - UInt32 bit = symbol & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - - public UInt32 GetPrice(UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - UInt32 bit = (symbol >> bitIndex) & 1; - price += Models[m].GetPrice(bit); - m = (m << 1) + bit; - } - return price; - } - - public UInt32 ReverseGetPrice(UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += Models[m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex, - int NumBitLevels, UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += Models[startIndex + m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex, - Encoder rangeEncoder, int NumBitLevels, UInt32 symbol) - { - UInt32 m = 1; - for (int i = 0; i < NumBitLevels; i++) - { - UInt32 bit = symbol & 1; - Models[startIndex + m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - } - - internal struct BitTreeDecoder - { - private readonly BitDecoder[] Models; - private readonly int NumBitLevels; - - public BitTreeDecoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitDecoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < (1 << NumBitLevels); i++) - Models[i].Init(); - } - - public uint Decode(Decoder rangeDecoder) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) - m = (m << 1) + Models[m].Decode(rangeDecoder); - return m - ((uint) 1 << NumBitLevels); - } - - public uint ReverseDecode(Decoder rangeDecoder) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= (bit << bitIndex); - } - return symbol; - } - - public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex, - Decoder rangeDecoder, int NumBitLevels) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[startIndex + m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= (bit << bitIndex); - } - return symbol; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/7z/sdk/ICoder.cs b/BizHawk.Client.Common/7z/sdk/ICoder.cs deleted file mode 100644 index 7db184bff6..0000000000 --- a/BizHawk.Client.Common/7z/sdk/ICoder.cs +++ /dev/null @@ -1,192 +0,0 @@ -/* This file is part of SevenZipSharp. - - SevenZipSharp is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - SevenZipSharp is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with SevenZipSharp. If not, see . -*/ - -using System; -using System.IO; - -namespace SevenZip.Sdk -{ - /// - /// The exception that is thrown when an error in input stream occurs during decoding. - /// - [Serializable] - internal class DataErrorException : ApplicationException - { - public DataErrorException() : base("Data Error") {} - } - - /// - /// The exception that is thrown when the value of an argument is outside the allowable range. - /// - [Serializable] - internal class InvalidParamException : ApplicationException - { - public InvalidParamException() : base("Invalid Parameter") {} - } - - /// - /// Callback progress interface. - /// - public interface ICodeProgress - { - /// - /// Callback progress. - /// - /// - /// Processed input size. -1 if unknown. - /// - /// - /// Processed output size. -1 if unknown. - /// - void SetProgress(Int64 inSize, Int64 outSize); - } ; - - /// - /// Stream coder interface - /// - public interface ICoder - { - /// - /// Codes streams. - /// - /// - /// input Stream. - /// - /// - /// output Stream. - /// - /// - /// input Size. -1 if unknown. - /// - /// - /// output Size. -1 if unknown. - /// - /// - /// callback progress reference. - /// - /// - /// if input stream is not valid - /// - void Code(Stream inStream, Stream outStream, - Int64 inSize, Int64 outSize, ICodeProgress progress); - } ; - - /* - public interface ICoder2 - { - void Code(ISequentialInStream []inStreams, - const UInt64 []inSizes, - ISequentialOutStream []outStreams, - UInt64 []outSizes, - ICodeProgress progress); - }; - */ - - /// - /// Provides the fields that represent properties idenitifiers for compressing. - /// - public enum CoderPropId - { - /// - /// Specifies default property. - /// - DefaultProp = 0, - /// - /// Specifies size of dictionary. - /// - DictionarySize, - /// - /// Specifies size of memory for PPM*. - /// - UsedMemorySize, - /// - /// Specifies order for PPM methods. - /// - Order, - /// - /// Specifies Block Size. - /// - BlockSize, - /// - /// Specifies number of postion state bits for LZMA (0 <= x <= 4). - /// - PosStateBits, - /// - /// Specifies number of literal context bits for LZMA (0 <= x <= 8). - /// - LitContextBits, - /// - /// Specifies number of literal position bits for LZMA (0 <= x <= 4). - /// - LitPosBits, - /// - /// Specifies number of fast bytes for LZ*. - /// - NumFastBytes, - /// - /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". - /// - MatchFinder, - /// - /// Specifies the number of match finder cyckes. - /// - MatchFinderCycles, - /// - /// Specifies number of passes. - /// - NumPasses, - /// - /// Specifies number of algorithm. - /// - Algorithm, - /// - /// Specifies the number of threads. - /// - NumThreads, - /// - /// Specifies mode with end marker. - /// - EndMarker = 0x490 - } ; - - /// - /// The ISetCoderProperties interface - /// - internal interface ISetCoderProperties - { - void SetCoderProperties(CoderPropId[] propIDs, object[] properties); - } ; - - /// - /// The IWriteCoderProperties interface - /// - internal interface IWriteCoderProperties - { - void WriteCoderProperties(Stream outStream); - } - - /// - /// The ISetDecoderPropertiesinterface - /// - internal interface ISetDecoderProperties - { - /// - /// Sets decoder properties - /// - /// Array of byte properties - void SetDecoderProperties(byte[] properties); - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/Api/CoreSystem.cs b/BizHawk.Client.Common/Api/CoreSystem.cs deleted file mode 100644 index d76625b963..0000000000 --- a/BizHawk.Client.Common/Api/CoreSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace BizHawk.Client.ApiHawk -{ - /// - /// Enumeration of each system emulated by BizHawk - /// - public enum CoreSystem - { - Null = 0, - TI83, - AppleII, - Commodore64, - Atari2600, - Atari7800, - Lynx, - ColecoVision, - Intellivision, - GameBoy, - DualGameBoy, - GameBoyAdvance, - Nintendo64, - NES, - SNES, - PCEngine, - Genesis, - Saturn, - MasterSystem, - PSP, - Playstation, - WonderSwan, - Libretro, - VirtualBoy, - NeoGeoPocket, - ZXSpectrum, - AmstradCPC - } -} diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj deleted file mode 100644 index cee56ac8a8..0000000000 --- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj +++ /dev/null @@ -1,336 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {24A0AA3C-B25F-4197-B23D-476D6462DBA0} - Library - Properties - BizHawk.Client.Common - BizHawk.Client.Common - v4.6.1 - 512 - - None - - - true - ..\output\dll\ - TRACE;DEBUG;DOTNET20;UNMANAGED;COMPRESS;WINDOWS - true - full - AnyCPU - prompt - - MinimumRecommendedRules.ruleset - false - false - - - ..\output\dll\ - TRACE;DOTNET20;UNMANAGED;COMPRESS;WINDOWS - true - true - pdbonly - AnyCPU - prompt - - MinimumRecommendedRules.ruleset - false - false - - - - ..\References\ICSharpCode.SharpZipLib.dll - - - ..\References\Ionic.Zip.dll - - - False - ..\References\Newtonsoft.Json.dll - - - ..\output\dll\nlua\NLua.dll - False - - - - - False - ..\References\x64\SQLite\System.Data.SQLite.dll - - - - - - - - - - - - - svnrev.cs - - - VersionInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Bk2Movie.cs - - - - - - - - - Bk2Movie.cs - - - Bk2Movie.cs - - - Bk2Movie.cs - - - - - - - - BkmMovie.cs - - - BkmMovie.cs - - - BkmMovie.cs - - - BkmMovie.cs - - - - - - - - - - - - - - - - - - - - TasMovie.cs - - - TasMovie.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3} - BizHawk.Common - - - {e1a23168-b571-411c-b360-2229e7225e0e} - BizHawk.Emulation.Common - - - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA} - BizHawk.Emulation.Cores - - - {f51946ea-827f-4d82-b841-1f2f6d060312} - BizHawk.Emulation.DiscSystem - - - {337ca23e-65e7-44e1-9411-97ee08bb8116} - BizHawk.Bizware.BizwareGL.GdiPlus - - - {5160CFB1-5389-47C1-B7F6-8A0DC97641EE} - BizHawk.Bizware.BizwareGL.OpenTK - - - {E6B436B1-A3CD-4C9A-8F76-5D7154726884} - BizHawk.Bizware.BizwareGL.SlimDX - - - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465} - BizHawk.Bizware.BizwareGL - - - - - - - - - - \ No newline at end of file diff --git a/BizHawk.Client.Common/ControllerBinding.cs b/BizHawk.Client.Common/ControllerBinding.cs deleted file mode 100644 index 8b7de3b1ef..0000000000 --- a/BizHawk.Client.Common/ControllerBinding.cs +++ /dev/null @@ -1,360 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class Controller : IController - { - public Controller(ControllerDefinition definition) - { - _type = definition; - for (int i = 0; i < _type.FloatControls.Count; i++) - { - _floatButtons[_type.FloatControls[i]] = _type.FloatRanges[i].Mid; - _floatRanges[_type.FloatControls[i]] = _type.FloatRanges[i]; - } - } - - public ControllerDefinition Definition => _type; - - public bool IsPressed(string button) - { - return _buttons[button]; - } - - public float GetFloat(string name) - { - return _floatButtons[name]; - } - - private readonly WorkingDictionary> _bindings = new WorkingDictionary>(); - private readonly WorkingDictionary _buttons = new WorkingDictionary(); - private readonly WorkingDictionary _floatButtons = new WorkingDictionary(); - private readonly Dictionary _floatRanges = new WorkingDictionary(); - private readonly Dictionary _floatBinds = new Dictionary(); - - private ControllerDefinition _type; - - /// don't do this - public void ForceType(ControllerDefinition newtype) { _type = newtype; } - - public bool this[string button] => IsPressed(button); - - public bool AnyPressed - { - get - { - if (_buttons.Any(b => b.Value)) - { - return true; - } - - return _floatButtons.Any(b => b.Value != 0); - } - } - - // Looks for bindings which are activated by the supplied physical button. - public List SearchBindings(string button) - { - return (from kvp in _bindings from boundButton in kvp.Value where boundButton == button select kvp.Key).ToList(); - } - - // Searches bindings for the controller and returns true if this binding is mapped somewhere in this controller - public bool HasBinding(string button) - { - return _bindings.SelectMany(kvp => kvp.Value).Any(boundButton => boundButton == button); - } - - public void NormalizeFloats(IController controller) - { - foreach (var kvp in _floatBinds) - { - var input = _floatButtons[kvp.Key]; - string outkey = kvp.Key; - float multiplier = kvp.Value.Mult; - float deadzone = kvp.Value.Deadzone; - ControllerDefinition.FloatRange range; - if (_floatRanges.TryGetValue(outkey, out range)) - { - // input range is assumed to be -10000,0,10000 - - // first, modify for deadzone - { - float absinput = Math.Abs(input); - float zeropoint = deadzone * 10000.0f; - if (absinput < zeropoint) - { - input = 0.0f; - } - else - { - absinput -= zeropoint; - absinput *= 10000.0f; - absinput /= 10000.0f - zeropoint; - input = absinput * Math.Sign(input); - } - } - - // zero 09-mar-2015 - not sure if adding + 1 here is correct.. but... maybe? - var output = (((input * multiplier) + 10000.0f) * (range.Max - range.Min + 1) / 20000.0f) + range.Min; - - // zero 09-mar-2015 - at this point, we should only have integers, since thats all 100% of consoles ever see - // if this becomes a problem we can add flags to the range and update GUIs to be able to display floats - output = (int)output; - - float lbound = Math.Min(range.Min, range.Max); - float ubound = Math.Max(range.Min, range.Max); - - if (output < lbound) - { - output = lbound; - } - - if (output > ubound) - { - output = ubound; - } - - _floatButtons[outkey] = output; - } - } - } - - /// - /// uses the bindings to latch our own logical button state from the source controller's button state (which are assumed to be the physical side of the binding). - /// this will clobber any existing data (use OR_* or other functions to layer in additional input sources) - /// - public void LatchFromPhysical(IController controller) - { - _buttons.Clear(); - - foreach (var kvp in _bindings) - { - _buttons[kvp.Key] = false; - foreach (var bound_button in kvp.Value) - { - if (controller.IsPressed(bound_button)) - { - _buttons[kvp.Key] = true; - } - } - } - - foreach (var kvp in _floatBinds) - { - var input = controller.GetFloat(kvp.Value.Value); - string outkey = kvp.Key; - if (_floatRanges.ContainsKey(outkey)) - { - _floatButtons[outkey] = input; - } - } - - // it's not sure where this should happen, so for backwards compatibility.. do it every time - NormalizeFloats(controller); - } - - public void ApplyAxisConstraints(string constraintClass) - { - _type.ApplyAxisConstraints(constraintClass, _floatButtons); - } - - /// - /// merges pressed logical buttons from the supplied controller, effectively ORing it with the current state - /// - public void OR_FromLogical(IController controller) - { - // change: or from each button that the other input controller has - // foreach (string button in type.BoolButtons) - if (controller.Definition != null) - { - foreach (var button in controller.Definition.BoolButtons) - { - if (controller.IsPressed(button)) - { - _buttons[button] = true; - } - } - } - } - - public void Overrides(OverrideAdaptor controller) - { - foreach (var button in controller.Overrides) - { - _buttons[button] = controller.IsPressed(button); - } - - foreach (var button in controller.FloatOverrides) - { - _floatButtons[button] = controller.GetFloat(button); - } - - foreach (var button in controller.InversedButtons) - { - _buttons[button] ^= true; - } - } - - public void BindButton(string button, string control) - { - _bindings[button].Add(control); - } - - public void BindMulti(string button, string controlString) - { - if (string.IsNullOrEmpty(controlString)) - { - return; - } - - var controlbindings = controlString.Split(','); - foreach (var control in controlbindings) - { - _bindings[button].Add(control.Trim()); - } - } - - public void BindFloat(string button, Config.AnalogBind bind) - { - _floatBinds[button] = bind; - } - - /// - /// Returns a list of all keys mapped and the name of the button they are mapped to - /// - public List> MappingList() - { - return (from key in _bindings from binding in key.Value select new KeyValuePair(binding, key.Key)).ToList(); - } - - public List PressedButtons => (from button in _buttons where button.Value select button.Key).ToList(); - } - - public class AutofireController : IController - { - public AutofireController(ControllerDefinition definition, IEmulator emulator) - { - On = Global.Config.AutofireOn < 1 ? 0 : Global.Config.AutofireOn; - Off = Global.Config.AutofireOff < 1 ? 0 : Global.Config.AutofireOff; - _type = definition; - _emulator = emulator; - } - - private readonly IEmulator _emulator; - - private readonly ControllerDefinition _type; - private readonly WorkingDictionary> _bindings = new WorkingDictionary>(); - private readonly WorkingDictionary _buttons = new WorkingDictionary(); - private readonly WorkingDictionary _buttonStarts = new WorkingDictionary(); - - private bool _autofire = true; - - public bool Autofire { get { return false; } set { _autofire = value; } } - public int On { get; set; } - public int Off { get; set; } - - public ControllerDefinition Definition => _type; - - public bool IsPressed(string button) - { - if (_autofire) - { - var a = (_emulator.Frame - _buttonStarts[button]) % (On + Off); - return a < On && _buttons[button]; - } - - return _buttons[button]; - } - - public void ClearStarts() - { - _buttonStarts.Clear(); - } - - public float GetFloat(string name) - { - throw new NotImplementedException(); - } - - // look for bindings which are activated by the supplied physical button. - public List SearchBindings(string button) - { - return (from kvp in _bindings from bound_button in kvp.Value where bound_button == button select kvp.Key).ToList(); - } - - /// - /// uses the bindings to latch our own logical button state from the source controller's button state (which are assumed to be the physical side of the binding). - /// this will clobber any existing data (use OR_* or other functions to layer in additional input sources) - /// - public void LatchFromPhysical(IController controller) - { - foreach (var kvp in _bindings) - { - foreach (var boundBtn in kvp.Value) - { - if (_buttons[kvp.Key] == false && controller.IsPressed(boundBtn)) - { - _buttonStarts[kvp.Key] = _emulator.Frame; - } - } - } - - _buttons.Clear(); - foreach (var kvp in _bindings) - { - _buttons[kvp.Key] = false; - foreach (var bound_button in kvp.Value) - { - if (controller.IsPressed(bound_button)) - { - _buttons[kvp.Key] = true; - } - } - } - } - - /// - /// merges pressed logical buttons from the supplied controller, effectively ORing it with the current state - /// - public void OR_FromLogical(IController controller) - { - foreach (var button in _type.BoolButtons.Where(controller.IsPressed)) - { - _buttons[button] = true; - Console.WriteLine(button); - } - } - - public void BindButton(string button, string control) - { - _bindings[button].Add(control); - } - - public void BindMulti(string button, string controlString) - { - if (!string.IsNullOrEmpty(controlString)) - { - var controlbindings = controlString.Split(','); - foreach (var control in controlbindings) - { - _bindings[button].Add(control.Trim()); - } - } - } - - public void IncrementStarts() - { - foreach (var key in _buttonStarts.Keys.ToArray()) - { - _buttonStarts[key]++; - } - } - - public List PressedButtons => (from button in _buttons where button.Value select button.Key).ToList(); - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/CoreFileProvider.cs b/BizHawk.Client.Common/CoreFileProvider.cs deleted file mode 100644 index d251915264..0000000000 --- a/BizHawk.Client.Common/CoreFileProvider.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class CoreFileProvider : ICoreFileProvider - { - public string SubfileDirectory { get; set; } - public FirmwareManager FirmwareManager { get; set; } - - private readonly Action _showWarning; - - public CoreFileProvider(Action showWarning) - { - _showWarning = showWarning; - } - - public string PathSubfile(string fname) - { - return Path.Combine(SubfileDirectory ?? "", fname); - } - - public string DllPath() - { - return Path.Combine(PathManager.GetExeDirectoryAbsolute(), "dll"); - } - - public string GetSaveRAMPath() - { - return PathManager.SaveRamPath(Global.Game); - } - - public string GetRetroSaveRAMDirectory() - { - return PathManager.RetroSaveRAMDirectory(Global.Game); - } - - public string GetRetroSystemPath() - { - return PathManager.RetroSystemPath(Global.Game); - } - - public string GetGameBasePath() - { - return PathManager.GetGameBasePath(Global.Game); - } - - #region EmuLoadHelper api - - private void FirmwareWarn(string sysID, string firmwareID, bool required, string msg = null) - { - if (required) - { - var fullmsg = $"Couldn't find required firmware \"{sysID}:{firmwareID}\". This is fatal{(msg != null ? ": " + msg : ".")}"; - throw new MissingFirmwareException(fullmsg); - } - - if (msg != null) - { - var fullmsg = $"Couldn't find firmware \"{sysID}:{firmwareID}\". Will attempt to continue: {msg}"; - _showWarning(fullmsg); - } - } - - public string GetFirmwarePath(string sysId, string firmwareId, bool required, string msg = null) - { - var path = FirmwareManager.Request(sysId, firmwareId); - if (path != null && !File.Exists(path)) - { - path = null; - } - - if (path == null) - { - FirmwareWarn(sysId, firmwareId, required, msg); - } - - return path; - } - - private byte[] GetFirmwareWithPath(string sysId, string firmwareId, bool required, string msg, out string path) - { - byte[] ret = null; - var path_ = GetFirmwarePath(sysId, firmwareId, required, msg); - if (path_ != null && File.Exists(path_)) - { - try - { - ret = File.ReadAllBytes(path_); - } - catch (IOException) - { - } - } - - if (ret == null && path_ != null) - { - FirmwareWarn(sysId, firmwareId, required, msg); - } - - path = path_; - return ret; - } - - public byte[] GetFirmware(string sysId, string firmwareId, bool required, string msg = null) - { - string unused; - return GetFirmwareWithPath(sysId, firmwareId, required, msg, out unused); - } - - public byte[] GetFirmwareWithGameInfo(string sysId, string firmwareId, bool required, out GameInfo gi, string msg = null) - { - string path; - byte[] ret = GetFirmwareWithPath(sysId, firmwareId, required, msg, out path); - if (ret != null && path != null) - { - gi = Database.GetGameInfo(ret, path); - } - else - { - gi = null; - } - - return ret; - } - - #endregion - - // this should go away now - public static void SyncCoreCommInputSignals(CoreComm target) - { - string superhack = null; - if (target.CoreFileProvider is CoreFileProvider) - { - superhack = ((CoreFileProvider)target.CoreFileProvider).SubfileDirectory; - } - - var cfp = new CoreFileProvider(target.ShowMessage) { SubfileDirectory = superhack }; - target.CoreFileProvider = cfp; - cfp.FirmwareManager = Global.FirmwareManager; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/Extensions.cs b/BizHawk.Client.Common/Extensions.cs deleted file mode 100644 index 8385f19d7b..0000000000 --- a/BizHawk.Client.Common/Extensions.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.GdiPlus; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; -using BizHawk.Bizware.BizwareGL.Drivers.SlimDX; - -namespace BizHawk.Client.Common -{ - public static class Extensions - { - public static IGuiRenderer CreateRenderer(this IGL gl) - { - if (gl is IGL_TK) - { - return new GuiRenderer(gl); - } - - if (gl is IGL_SlimDX9) - { - return new GuiRenderer(gl); - } - - if (gl is IGL_GdiPlus) - { - return new GDIPlusGuiRenderer((IGL_GdiPlus)gl); - } - - throw new NotSupportedException(); - } - } -} diff --git a/BizHawk.Client.Common/FirmwareManager.cs b/BizHawk.Client.Common/FirmwareManager.cs deleted file mode 100644 index f6bbbe3abf..0000000000 --- a/BizHawk.Client.Common/FirmwareManager.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.IO; -using System.Linq; - -using BizHawk.Common.BufferExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class FirmwareManager - { - // represents a file found on disk in the user's firmware directory matching a file in our database - public class RealFirmwareFile - { - public FileInfo FileInfo { get; set; } - public string Hash { get; set; } - } - - public List RecentlyServed { get; } - - public class ResolutionInfo - { - public bool UserSpecified { get; set; } - public bool Missing { get; set; } - public bool KnownMismatching { get; set; } - public FirmwareDatabase.FirmwareFile KnownFirmwareFile { get; set; } - public string FilePath { get; set; } - public string Hash { get; set; } - public long Size { get; set; } - } - - private readonly Dictionary _resolutionDictionary = new Dictionary(); - - public class FirmwareEventArgs - { - public string Hash { get; set; } - public long Size { get; set; } - public string SystemId { get; set; } - public string FirmwareId { get; set; } - } - - public FirmwareManager() - { - RecentlyServed = new List(); - } - - public ResolutionInfo Resolve(string sysId, string firmwareId) - { - return Resolve(FirmwareDatabase.LookupFirmwareRecord(sysId, firmwareId)); - } - - public ResolutionInfo Resolve(FirmwareDatabase.FirmwareRecord record, bool forbidScan = false) - { - // purpose of forbidScan: sometimes this is called from a loop in Scan(). we dont want to repeatedly DoScanAndResolve in that case, its already been done. - bool first = true; - - RETRY: - ResolutionInfo resolved; - _resolutionDictionary.TryGetValue(record, out resolved); - - // couldnt find it! do a scan and resolve to try harder - // NOTE: this could result in bad performance in some cases if the scanning happens repeatedly.. - if (resolved == null && first) - { - if (!forbidScan) - { - DoScanAndResolve(); - } - - first = false; - goto RETRY; - } - - return resolved; - } - - // Requests the spcified firmware. tries really hard to scan and resolve as necessary - public string Request(string sysId, string firmwareId) - { - var resolved = Resolve(sysId, firmwareId); - if (resolved == null) - { - return null; - } - - RecentlyServed.Add(new FirmwareEventArgs - { - SystemId = sysId, - FirmwareId = firmwareId, - Hash = resolved.Hash, - Size = resolved.Size - }); - - return resolved.FilePath; - } - - private class RealFirmwareReader : IDisposable - { - private readonly List _files = new List(); - private SHA1 _sha1 = SHA1.Create(); - - public void Dispose() - { - _sha1.Dispose(); - _sha1 = null; - } - - public RealFirmwareFile Read(FileInfo fi) - { - var rff = new RealFirmwareFile { FileInfo = fi }; - long len = fi.Length; - - using (var fs = fi.OpenRead()) - { - _sha1.ComputeHash(fs); - } - - rff.Hash = _sha1.Hash.BytesToHexString(); - Dict[rff.Hash] = rff; - _files.Add(rff); - return rff; - } - - public Dictionary Dict { get; } = new Dictionary(); - } - - /// - /// Test to determine whether the supplied firmware file matches something in the firmware database - /// - /// - /// - public bool CanFileBeImported(string f) - { - try - { - var fi = new FileInfo(f); - if (!fi.Exists) - return false; - - // weed out filesizes first to reduce the unnecessary overhead of a hashing operation - if (FirmwareDatabase.FirmwareFiles.Where(a => a.Size == fi.Length).FirstOrDefault() == null) - return false; - - // check the hash - using (var reader = new RealFirmwareReader()) - { - reader.Read(fi); - if (FirmwareDatabase.FirmwareFiles.Where(a => a.Hash == reader.Dict.FirstOrDefault().Value.Hash).FirstOrDefault() != null) - return true; - } - } - catch { } - - return false; - } - - public void DoScanAndResolve() - { - // build a list of file sizes. Only those will be checked during scanning - HashSet sizes = new HashSet(); - foreach (var ff in FirmwareDatabase.FirmwareFiles) - { - sizes.Add(ff.Size); - } - - using (var reader = new RealFirmwareReader()) - { - // build a list of files under the global firmwares path, and build a hash for each of them while we're at it - var todo = new Queue(); - todo.Enqueue(new DirectoryInfo(PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null))); - - while (todo.Count != 0) - { - var di = todo.Dequeue(); - - if (!di.Exists) - { - continue; - } - - // we're going to allow recursing into subdirectories, now. its been verified to work OK - foreach (var disub in di.GetDirectories()) - { - todo.Enqueue(disub); - } - - foreach (var fi in di.GetFiles()) - { - if (sizes.Contains(fi.Length)) - { - reader.Read(fi); - } - } - } - - // now, for each firmware record, try to resolve it - foreach (var fr in FirmwareDatabase.FirmwareRecords) - { - // clear previous resolution results - _resolutionDictionary.Remove(fr); - - // get all options for this firmware (in order) - var fr1 = fr; - var options = - from fo in FirmwareDatabase.FirmwareOptions - where fo.SystemId == fr1.SystemId && fo.FirmwareId == fr1.FirmwareId && fo.IsAcceptableOrIdeal - select fo; - - // try each option - foreach (var fo in options) - { - var hash = fo.Hash; - - // did we find this firmware? - if (reader.Dict.ContainsKey(hash)) - { - // rad! then we can use it - var ri = new ResolutionInfo - { - FilePath = reader.Dict[hash].FileInfo.FullName, - KnownFirmwareFile = FirmwareDatabase.FirmwareFilesByHash[hash], - Hash = hash, - Size = fo.Size - }; - _resolutionDictionary[fr] = ri; - goto DONE_FIRMWARE; - } - } - - DONE_FIRMWARE: ; - } - - // apply user overrides - foreach (var fr in FirmwareDatabase.FirmwareRecords) - { - string userSpec; - - // do we have a user specification for this firmware record? - if (Global.Config.FirmwareUserSpecifications.TryGetValue(fr.ConfigKey, out userSpec)) - { - // flag it as user specified - ResolutionInfo ri; - if (!_resolutionDictionary.TryGetValue(fr, out ri)) - { - ri = new ResolutionInfo(); - _resolutionDictionary[fr] = ri; - } - - ri.UserSpecified = true; - ri.KnownFirmwareFile = null; - ri.FilePath = userSpec; - ri.Hash = null; - - // check whether it exists - var fi = new FileInfo(userSpec); - if (!fi.Exists) - { - ri.Missing = true; - continue; - } - - // compute its hash - var rff = reader.Read(fi); - ri.Size = fi.Length; - ri.Hash = rff.Hash; - - // check whether it was a known file anyway, and go ahead and bind to the known file, as a perk (the firmwares config doesnt really use this information right now) - FirmwareDatabase.FirmwareFile ff; - if (FirmwareDatabase.FirmwareFilesByHash.TryGetValue(rff.Hash, out ff)) - { - ri.KnownFirmwareFile = ff; - - // if the known firmware file is for a different firmware, flag it so we can show a warning - var option = - (from fo in FirmwareDatabase.FirmwareOptions - where fo.Hash == rff.Hash && fo.ConfigKey != fr.ConfigKey - select fr).FirstOrDefault(); - - if (option != null) - { - ri.KnownMismatching = true; - } - } - } - } // foreach(firmware record) - } // using(new RealFirmwareReader()) - } // DoScanAndResolve() - } // class FirmwareManager -} // namespace \ No newline at end of file diff --git a/BizHawk.Client.Common/FrameworkFastZipWriter.cs b/BizHawk.Client.Common/FrameworkFastZipWriter.cs deleted file mode 100644 index 8612b66b44..0000000000 --- a/BizHawk.Client.Common/FrameworkFastZipWriter.cs +++ /dev/null @@ -1,296 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BizHawk.Client.Common -{ - /// - /// this almost works, but it loses all of its speed advantages over FrameworkZipWriter from slow CRC calculation. - /// - public class FrameworkFastZipWriter : IZipWriter - { - private Stream _output; - private readonly CompressionLevel _level; - - private byte[] _localHeader; - private List _endBlobs = new List(); - private byte[] _fileHeaderTemplate; - private int _numEntries; - private bool _disposed; - - private class CRC32Stream : Stream - { - // Lookup table for speed. - private static readonly uint[] Crc32Table; - - static CRC32Stream() - { - Crc32Table = new uint[256]; - for (uint i = 0; i < 256; ++i) - { - uint crc = i; - for (int j = 8; j > 0; --j) - { - if ((crc & 1) == 1) - { - crc = (crc >> 1) ^ 0xEDB88320; - } - else - { - crc >>= 1; - } - } - - Crc32Table[i] = crc; - } - } - - private uint _crc = 0xffffffff; - private int _count = 0; - private Stream _baseStream; - - public int Size => _count; - public uint Crc => ~_crc; - - public CRC32Stream(Stream baseStream) - { - _baseStream = baseStream; - } - - private void CalculateByte(byte b) - { - _crc = (_crc >> 8) ^ Crc32Table[b ^ (_crc & 0xff)]; - } - - public override void Write(byte[] buffer, int offset, int count) - { - for (int i = offset; i < offset + count; i++) - { - CalculateByte(buffer[i]); - } - _count += count; - _baseStream.Write(buffer, offset, count); - } - - public override void WriteByte(byte value) - { - CalculateByte(value); - _count++; - _baseStream.WriteByte(value); - } - - public override void Flush() - { - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotImplementedException(); - } - - public override bool CanRead => false; - - public override bool CanSeek => false; - - public override bool CanWrite => true; - - public override long Length - { - get - { - throw new NotImplementedException(); - } - } - - public override long Position - { - get - { - throw new NotImplementedException(); - } - - set - { - throw new NotImplementedException(); - } - } - } - - public FrameworkFastZipWriter(string path, int compressionlevel) - { - _output = new FileStream(path, FileMode.Create, FileAccess.Write); - if (compressionlevel == 0) - throw new NotImplementedException(); - //_level = CompressionLevel.NoCompression; - else if (compressionlevel < 5) - _level = CompressionLevel.Fastest; - else - _level = CompressionLevel.Optimal; - - var dt = DateTime.Now; - var mtime = dt.Second >> 1 - | dt.Minute << 5 - | dt.Hour << 11; - var mdate = dt.Day - | dt.Month << 5 - | (dt.Year - 1980) << 9; - - var modifiedDate = new byte[] - { - (byte)(mtime & 0xff), - (byte)(mtime >> 8), - (byte)(mdate & 0xff), - (byte)(mdate >> 8) - }; - - _localHeader = new byte[] - { - 0x50, 0x4b, 0x03, 0x04, // signature - 0x14, 0x00, // version - 0x08, 0x00, // flags: has data descriptor - 0x08, 0x00, // method: deflate - modifiedDate[0], modifiedDate[1], // mod time - modifiedDate[2], modifiedDate[3], // mod date - 0x00, 0x00, 0x00, 0x00, // crc32 - 0x00, 0x00, 0x00, 0x00, // compressed size - 0x00, 0x00, 0x00, 0x00, // uncompressed size - 0x00, 0x00, // filename length - 0x00, 0x00, // extra field length - }; - - _fileHeaderTemplate = new byte[] - { - 0x50, 0x4b, 0x01, 0x02, // signature - 0x17, 0x03, // ?? - 0x14, 0x00, // version - 0x08, 0x00, // flags: has data descriptor - 0x08, 0x00, // method: deflate - modifiedDate[0], modifiedDate[1], // mod time - modifiedDate[2], modifiedDate[3], // mod date - 0x00, 0x00, 0x00, 0x00, // crc32 - 0x00, 0x00, 0x00, 0x00, // compressed size - 0x00, 0x00, 0x00, 0x00, // uncompressed size - 0x00, 0x00, // filename length - 0x00, 0x00, // extra field length - 0x00, 0x00, // file comment length - 0x00, 0x00, // disk #, - 0x00, 0x00, // internal attributes - 0x00, 0x00, 0x00, 0x00, // external attributes - 0x00, 0x00, 0x00, 0x00, // local header offset - }; - } - - public void Dispose() - { - if (!_disposed) - { - WriteFooter(); - _output.Dispose(); - _output = null; - _disposed = true; - } - } - - public void WriteItem(string name, Action callback) - { - var nameb = Encoding.ASCII.GetBytes(name); - _localHeader[26] = (byte)nameb.Length; - _localHeader[27] = (byte)(nameb.Length >> 8); - - var localHeaderOffset = (int)(_output.Position); - - _output.Write(_localHeader, 0, _localHeader.Length); - _output.Write(nameb, 0, nameb.Length); - - var fileStart = (int)(_output.Position); - - var s2 = new DeflateStream(_output, _level, true); - var s3 = new CRC32Stream(s2); - callback(s3); - s2.Flush(); - - var fileEnd = (int)(_output.Position); - - var crc = s3.Crc; - var compressedSize = fileEnd - fileStart; - var uncompressedSize = s3.Size; - var descriptor = new byte[] - { - (byte)crc, - (byte)(crc >> 8), - (byte)(crc >> 16), - (byte)(crc >> 24), - (byte)compressedSize, - (byte)(compressedSize >> 8), - (byte)(compressedSize >> 16), - (byte)(compressedSize >> 24), - (byte)uncompressedSize, - (byte)(uncompressedSize >> 8), - (byte)(uncompressedSize >> 16), - (byte)(uncompressedSize >> 24) - }; - _output.Write(descriptor, 0, descriptor.Length); - - var fileHeader = (byte[])_fileHeaderTemplate.Clone(); - - fileHeader[28] = (byte)nameb.Length; - fileHeader[29] = (byte)(nameb.Length >> 8); - Array.Copy(descriptor, 0, fileHeader, 16, 12); - fileHeader[42] = (byte)localHeaderOffset; - fileHeader[43] = (byte)(localHeaderOffset >> 8); - fileHeader[44] = (byte)(localHeaderOffset >> 16); - fileHeader[45] = (byte)(localHeaderOffset >> 24); - - _endBlobs.Add(fileHeader); - _endBlobs.Add(nameb); - _numEntries++; - } - - private void WriteFooter() - { - var centralHeaderOffset = (int)(_output.Position); - - foreach (var blob in _endBlobs) - _output.Write(blob, 0, blob.Length); - - var centralHeaderEnd = (int)(_output.Position); - - var centralHeaderSize = centralHeaderEnd - centralHeaderOffset; - - var footer = new byte[] - { - 0x50, 0x4b, 0x05, 0x06, // signature - 0x00, 0x00, // disk number - 0x00, 0x00, // central record disk number - (byte)_numEntries, (byte)(_numEntries >> 8), // number of entries on disk - (byte)_numEntries, (byte)(_numEntries >> 8), // number of entries total - (byte)centralHeaderSize, - (byte)(centralHeaderSize >> 8), - (byte)(centralHeaderSize >> 16), - (byte)(centralHeaderSize >> 24), // central directory size - (byte)centralHeaderOffset, - (byte)(centralHeaderOffset >> 8), - (byte)(centralHeaderOffset >> 16), - (byte)(centralHeaderOffset >> 24), // central directory offset - 0x07, 0x00, // comment length - 0x42, 0x69, 0x7a, 0x48, 0x61, 0x77, 0x6b // comment - }; - - _output.Write(footer, 0, footer.Length); - } - } -} diff --git a/BizHawk.Client.Common/FrameworkZipWriter.cs b/BizHawk.Client.Common/FrameworkZipWriter.cs deleted file mode 100644 index 1bbe33910b..0000000000 --- a/BizHawk.Client.Common/FrameworkZipWriter.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text; - -namespace BizHawk.Client.Common -{ - public class FrameworkZipWriter : IZipWriter - { - private ZipArchive _archive; - private readonly CompressionLevel _level; - - public FrameworkZipWriter(string path, int compressionlevel) - { - _archive = new ZipArchive(new FileStream(path, FileMode.Create, FileAccess.Write), - ZipArchiveMode.Create, false); - if (compressionlevel == 0) - _level = CompressionLevel.NoCompression; - else if (compressionlevel < 5) - _level = CompressionLevel.Fastest; - else - _level = CompressionLevel.Optimal; - } - - public void WriteItem(string name, Action callback) - { - using (var stream = _archive.CreateEntry(name, _level).Open()) - { - callback(stream); - } - } - - public void Dispose() - { - if (_archive != null) - { - _archive.Dispose(); - _archive = null; - } - } - } -} diff --git a/BizHawk.Client.Common/Global.cs b/BizHawk.Client.Common/Global.cs deleted file mode 100644 index c233e7a7ec..0000000000 --- a/BizHawk.Client.Common/Global.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Sega.MasterSystem; - -// ReSharper disable StyleCop.SA1401 -namespace BizHawk.Client.Common -{ - public static class Global - { - public static IEmulator Emulator; - public static Config Config; - public static GameInfo Game; - public static CheatCollection CheatList; - public static FirmwareManager FirmwareManager; - public static Rewinder Rewinder; - - public static IMovieSession MovieSession = new MovieSession(); - - /// - /// Used to disable secondary throttling (e.g. vsync, audio) for unthrottled modes or when the primary (clock) throttle is taking over (e.g. during fast forward/rewind). - /// - public static bool DisableSecondaryThrottling; - - /// - /// The maximum number of milliseconds the sound output buffer can go below full before causing a noticeable sound interruption. - /// - public static int SoundMaxBufferDeficitMs; - - // the movie will be spliced inbetween these if it is present - public static readonly CopyControllerAdapter MovieInputSourceAdapter = new CopyControllerAdapter(); - public static readonly CopyControllerAdapter MovieOutputHardpoint = new CopyControllerAdapter(); - public static readonly MultitrackRewiringControllerAdapter MultitrackRewiringAdapter = new MultitrackRewiringControllerAdapter(); - - // dont take my word for it, since the final word is actually in RewireInputChain, but here is a guide... - // user -> Input -> ActiveController -> UDLR -> StickyXORPlayerInputAdapter -> TurboAdapter(TBD) -> Lua(?TBD?) -> .. - // .. -> MultitrackRewiringControllerAdapter -> MovieInputSourceAdapter -> (MovieSession) -> MovieOutputAdapter -> ControllerOutput(1) -> Game - // (1)->Input Display - - // the original source controller, bound to the user, sort of the "input" port for the chain, i think - public static Controller ActiveController; - - // rapid fire version on the user controller, has its own key bindings and is OR'ed against ActiveController - public static AutofireController AutoFireController; - - // the "output" port for the controller chain. - public static readonly CopyControllerAdapter ControllerOutput = new CopyControllerAdapter(); - - public static readonly UD_LR_ControllerAdapter UD_LR_ControllerAdapter = new UD_LR_ControllerAdapter(); - - public static readonly AutoFireStickyXorAdapter AutofireStickyXORAdapter = new AutoFireStickyXorAdapter(); - - /// - /// provides an opportunity to mutate the player's input in an autohold style - /// - public static readonly StickyXorAdapter StickyXORAdapter = new StickyXorAdapter(); - - /// - /// Used to AND to another controller, used for Joypad.Set() - /// - public static readonly OverrideAdaptor LuaAndAdaptor = new OverrideAdaptor(); - - /// - /// fire off one-frame logical button clicks here. useful for things like ti-83 virtual pad and reset buttons - /// - public static readonly ClickyVirtualPadController ClickyVirtualPadController = new ClickyVirtualPadController(); - - public static Controller ClientControls; - - // Input state which has been estine for game controller inputs are coalesce here - // This relies on a client specific implementation! - public static SimpleController ControllerInputCoalescer; - - public static SystemInfo SystemInfo - { - get - { - switch (Emulator.SystemId) - { - default: - case "NULL": - return SystemInfo.Null; - case "NES": - return SystemInfo.Nes; - case "INTV": - return SystemInfo.Intellivision; - case "SG": - return SystemInfo.SG; - case "SMS": - if ((Emulator as SMS).IsGameGear) - { - return SystemInfo.GG; - } - - if ((Emulator as SMS).IsSG1000) - { - return SystemInfo.SG; - } - - return SystemInfo.SMS; - case "PCECD": - return SystemInfo.PCECD; - case "PCE": - return SystemInfo.PCE; - case "SGX": - return SystemInfo.SGX; - case "GEN": - return SystemInfo.Genesis; - case "TI83": - return SystemInfo.TI83; - case "SNES": - return SystemInfo.SNES; - case "GB": - /* - if ((Emulator as IGameboyCommon).IsCGBMode()) - { - return SystemInfo.GBC; - } - */ - return SystemInfo.GB; - case "A26": - return SystemInfo.Atari2600; - case "A78": - return SystemInfo.Atari7800; - case "C64": - return SystemInfo.C64; - case "Coleco": - return SystemInfo.Coleco; - case "GBA": - return SystemInfo.GBA; - case "N64": - return SystemInfo.N64; - case "SAT": - return SystemInfo.Saturn; - case "DGB": - return SystemInfo.DualGB; - case "WSWAN": - return SystemInfo.WonderSwan; - case "Lynx": - return SystemInfo.Lynx; - case "PSX": - return SystemInfo.PSX; - case "AppleII": - return SystemInfo.AppleII; - case "Libretro": - return SystemInfo.Libretro; - case "VB": - return SystemInfo.VirtualBoy; - case "NGP": - return SystemInfo.NeoGeoPocket; - case "ZXSpectrum": - return SystemInfo.ZXSpectrum; - case "AmstradCPC": - return SystemInfo.AmstradCPC; - } - } - } - - public static Dictionary UserBag = new Dictionary(); - } -} diff --git a/BizHawk.Client.Common/IonicZipWriter.cs b/BizHawk.Client.Common/IonicZipWriter.cs deleted file mode 100644 index a858be48f1..0000000000 --- a/BizHawk.Client.Common/IonicZipWriter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.IO; - -using Ionic.Zip; - -namespace BizHawk.Client.Common -{ - public class IonicZipWriter : IZipWriter - { - private readonly int _level; - private ZipOutputStream _zipOutputStream; - - public IonicZipWriter(string path, int compressionlevel) - { - _level = compressionlevel; - _zipOutputStream = new ZipOutputStream(path) - { - EnableZip64 = Zip64Option.Never, - CompressionLevel = (Ionic.Zlib.CompressionLevel)_level, - CompressionMethod = CompressionMethod.Deflate - }; - } - - public void WriteItem(string name, Action callback) - { - var e = _zipOutputStream.PutNextEntry(name); - e.CompressionMethod = _level == 0 - ? CompressionMethod.None - : CompressionMethod.Deflate; - - callback(_zipOutputStream); // there is no CloseEntry() call - } - - public void Dispose() - { - if (_zipOutputStream != null) - { - _zipOutputStream.Dispose(); - _zipOutputStream = null; - } - } - } -} diff --git a/BizHawk.Client.Common/KeyTurbo.cs b/BizHawk.Client.Common/KeyTurbo.cs deleted file mode 100644 index d04306cfde..0000000000 --- a/BizHawk.Client.Common/KeyTurbo.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace BizHawk.Client.Common -{ - public class TurboKey - { - private int _upTime, _downTime, _timer; - - public bool Value { get; set; } - - public void Reset(int downTime, int upTime) - { - Value = false; - _timer = 0; - _upTime = upTime; - _downTime = downTime; - } - - public void Tick(bool down) - { - if (!down) - { - Reset(_downTime, _upTime); - return; - } - - _timer++; - - Value = true; - if (_timer > _downTime) - { - Value = false; - } - - if (_timer > _upTime + _downTime) - { - _timer = 0; - Value = true; - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/NESGameGenieEncoderDecoder.cs b/BizHawk.Client.Common/NESGameGenieEncoderDecoder.cs deleted file mode 100644 index f986effd6a..0000000000 --- a/BizHawk.Client.Common/NESGameGenieEncoderDecoder.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - public class NESGameGenieDecoder - { - private readonly string _code = ""; - - private readonly Dictionary _gameGenieTable = new Dictionary - { - { 'A', 0 }, // 0000 - { 'P', 1 }, // 0001 - { 'Z', 2 }, // 0010 - { 'L', 3 }, // 0011 - { 'G', 4 }, // 0100 - { 'I', 5 }, // 0101 - { 'T', 6 }, // 0110 - { 'Y', 7 }, // 0111 - { 'E', 8 }, // 1000 - { 'O', 9 }, // 1001 - { 'X', 10 }, // 1010 - { 'U', 11 }, // 1011 - { 'K', 12 }, // 1100 - { 'S', 13 }, // 1101 - { 'V', 14 }, // 1110 - { 'N', 15 }, // 1111 - }; - - public NESGameGenieDecoder(string code) - { - _code = code; - Decode(); - } - - public int Address { get; private set; } - public int Value { get; private set; } - public int? Compare { get; private set; } - - public void Decode() - { - // char 3 bit 3 denotes the code length. - if (_code.Length == 6) - { - // Char # | 1 | 2 | 3 | 4 | 5 | 6 | - // Bit # |3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0| - // maps to|1|6|7|8|H|2|3|4|-|I|J|K|L|A|B|C|D|M|N|O|5|E|F|G| - Value = 0; - Address = 0x8000; - int x; - - _gameGenieTable.TryGetValue(_code[0], out x); - Value |= x & 0x07; - Value |= (x & 0x08) << 4; - - _gameGenieTable.TryGetValue(_code[1], out x); - Value |= (x & 0x07) << 4; - Address |= (x & 0x08) << 4; - - _gameGenieTable.TryGetValue(_code[2], out x); - Address |= (x & 0x07) << 4; - - _gameGenieTable.TryGetValue(_code[3], out x); - Address |= (x & 0x07) << 12; - Address |= x & 0x08; - - _gameGenieTable.TryGetValue(_code[4], out x); - Address |= x & 0x07; - Address |= (x & 0x08) << 8; - - _gameGenieTable.TryGetValue(_code[5], out x); - Address |= (x & 0x07) << 8; - Value |= x & 0x08; - } - else if (_code.Length == 8) - { - // Char # | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | - // Bit # |3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0| - // maps to|1|6|7|8|H|2|3|4|-|I|J|K|L|A|B|C|D|M|N|O|%|E|F|G|!|^|&|*|5|@|#|$| - Value = 0; - Address = 0x8000; - Compare = 0; - int x; - - _gameGenieTable.TryGetValue(_code[0], out x); - Value |= x & 0x07; - Value |= (x & 0x08) << 4; - - _gameGenieTable.TryGetValue(_code[1], out x); - Value |= (x & 0x07) << 4; - Address |= (x & 0x08) << 4; - - _gameGenieTable.TryGetValue(_code[2], out x); - Address |= (x & 0x07) << 4; - - _gameGenieTable.TryGetValue(_code[3], out x); - Address |= (x & 0x07) << 12; - Address |= x & 0x08; - - _gameGenieTable.TryGetValue(_code[4], out x); - Address |= x & 0x07; - Address |= (x & 0x08) << 8; - - _gameGenieTable.TryGetValue(_code[5], out x); - Address |= (x & 0x07) << 8; - Compare |= x & 0x08; - - _gameGenieTable.TryGetValue(_code[6], out x); - Compare |= x & 0x07; - Compare |= (x & 0x08) << 4; - - _gameGenieTable.TryGetValue(_code[7], out x); - Compare |= (x & 0x07) << 4; - Value |= x & 0x08; - } - } - } - - public class NESGameGenieEncoder - { - private readonly char[] _letters = { 'A', 'P', 'Z', 'L', 'G', 'I', 'T', 'Y', 'E', 'O', 'X', 'U', 'K', 'S', 'V', 'N' }; - - private readonly int _address; - private readonly int _value; - private int? _compare; - - public NESGameGenieEncoder(int address, int value, int? compare) - { - _address = address; - if (_address >= 0x8000) - { - _address -= 0x8000; - } - - _value = value; - _compare = compare; - - GameGenieCode = ""; - } - - public string GameGenieCode { get; private set; } - - public string Encode() - { - byte[] num = { 0, 0, 0, 0, 0, 0, 0, 0 }; - num[0] = (byte)((_value & 7) + ((_value >> 4) & 8)); - num[1] = (byte)(((_value >> 4) & 7) + ((_address >> 4) & 8)); - num[2] = (byte)((_address >> 4) & 7); - num[3] = (byte)((_address >> 12) + (_address & 8)); - num[4] = (byte)((_address & 7) + ((_address >> 8) & 8)); - num[5] = (byte)((_address >> 8) & 7); - - if (_compare.HasValue) - { - num[2] += 8; - num[5] += (byte)(_compare & 8); - num[6] = (byte)((_compare & 7) + ((_compare >> 4) & 8)); - num[7] = (byte)(((_compare >> 4) & 7) + (_value & 8)); - for (var i = 0; i < 8; i++) - { - GameGenieCode += _letters[num[i]]; - } - } - else - { - num[5] += (byte)(_value & 8); - for (var i = 0; i < 6; i++) - { - GameGenieCode += _letters[num[i]]; - } - } - - return GameGenieCode; - } - } -} diff --git a/BizHawk.Client.Common/OpenAdvanced.cs b/BizHawk.Client.Common/OpenAdvanced.cs deleted file mode 100644 index b26bff967e..0000000000 --- a/BizHawk.Client.Common/OpenAdvanced.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.Text; -using System.IO; -using System.Collections.Generic; - -using BizHawk.Emulation.Cores; - -using Newtonsoft.Json; - -//this file contains some cumbersome self-"serialization" in order to gain a modicum of control over what the serialized output looks like -//I don't want them to look like crufty json - -namespace BizHawk.Client.Common -{ - public interface IOpenAdvanced - { - string TypeName { get; } - string DisplayName { get; } - - /// - /// returns a sole path to use for opening a rom (not sure if this is a good idea) - /// - string SimplePath { get; } - - void Deserialize(string str); - void Serialize(TextWriter tw); - } - - public interface IOpenAdvancedLibretro - { - string CorePath { get; set; } - } - - public static class OpenAdvancedTypes - { - public const string OpenRom = "OpenRom"; - public const string Libretro = "Libretro"; - public const string LibretroNoGame = "LibretroNoGame"; - } - - - public class OpenAdvancedSerializer - { - - public static IOpenAdvanced ParseWithLegacy(string text) - { - if (text.StartsWith("*")) - return Deserialize(text.Substring(1)); - else return new OpenAdvanced_OpenRom { Path = text }; - } - - private static IOpenAdvanced Deserialize(string text) - { - int idx = text.IndexOf('*'); - string type = text.Substring(0, idx); - string token = text.Substring(idx + 1); - IOpenAdvanced ioa; - if (type == OpenAdvancedTypes.OpenRom) ioa = new OpenAdvanced_OpenRom(); - else if (type == OpenAdvancedTypes.Libretro) ioa = new OpenAdvanced_Libretro(); - else if (type == OpenAdvancedTypes.LibretroNoGame) ioa = new OpenAdvanced_LibretroNoGame(); - else ioa = null; - if (ioa == null) - throw new InvalidOperationException("IOpenAdvanced deserialization error"); - ioa.Deserialize(token); - return ioa; - } - - public static string Serialize(IOpenAdvanced ioa) - { - StringWriter sw = new StringWriter(); - sw.Write("{0}*", ioa.TypeName); - ioa.Serialize(sw); - return sw.ToString(); - } - } - - public class OpenAdvanced_Libretro : IOpenAdvanced, IOpenAdvancedLibretro - { - public OpenAdvanced_Libretro() - { - } - - public struct Token - { - public string Path, CorePath; - } - public Token token = new Token(); - - public string TypeName { get { return "Libretro"; } } - public string DisplayName { get { return string.Format("{0}:{1}", Path.GetFileNameWithoutExtension(token.CorePath), token.Path); } } - public string SimplePath { get { return token.Path; } } - - public void Deserialize(string str) - { - token = JsonConvert.DeserializeObject(str); - } - - public void Serialize(TextWriter tw) - { - tw.Write(JsonConvert.SerializeObject(token)); - } - - public string CorePath { get { return token.CorePath; } set { token.CorePath = value; } } - } - - public class OpenAdvanced_LibretroNoGame : IOpenAdvanced, IOpenAdvancedLibretro - { - //you might think ideally we'd fetch the libretro core name from the core info inside it - //but that would involve spinning up excess libretro core instances, which probably isnt good for stability, no matter how much we wish otherwise, not to mention slow. - //moreover it's kind of complicated here, - //and finally, I think the Displayname should really be file-based in all cases, since the user is going to be loading cores by filename and - //this is related to the recent roms filename management. - //so, leave it. - - public OpenAdvanced_LibretroNoGame() - { - } - - public OpenAdvanced_LibretroNoGame(string corepath) - { - _corePath = corepath; - } - - string _corePath; - - public string TypeName { get { return "LibretroNoGame"; } } - public string DisplayName { get { return Path.GetFileName(_corePath); } } //assume we like the filename of the core - public string SimplePath { get { return ""; } } //effectively a signal to not use a game - - public void Deserialize(string str) - { - _corePath = str; - } - - public void Serialize(TextWriter tw) - { - tw.Write(_corePath); - } - - public string CorePath { get { return _corePath; } set { _corePath = value; } } - } - - public class OpenAdvanced_OpenRom : IOpenAdvanced - { - public OpenAdvanced_OpenRom() - {} - - public string Path; - - public string TypeName { get { return "OpenRom"; } } - public string DisplayName { get { return Path; } } - public string SimplePath { get { return Path; } } - - public void Deserialize(string str) - { - Path = str; - } - - public void Serialize(TextWriter tw) - { - tw.Write(Path); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/PathManager.cs b/BizHawk.Client.Common/PathManager.cs deleted file mode 100644 index 465dacb381..0000000000 --- a/BizHawk.Client.Common/PathManager.cs +++ /dev/null @@ -1,482 +0,0 @@ -using System; -using System.Linq; -using System.IO; -using System.Reflection; - -using BizHawk.Common.StringExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; - -namespace BizHawk.Client.Common -{ - public static class PathManager - { - static PathManager() - { - SetDefaultIniPath(MakeProgramRelativePath("config.ini")); - } - - public static string GetExeDirectoryAbsolute() - { - var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); - if (path.EndsWith(Path.DirectorySeparatorChar.ToString())) - { - path = path.Remove(path.Length - 1, 1); - } - - return path; - } - - /// - /// Makes a path relative to the %exe% directory - /// - public static string MakeProgramRelativePath(string path) - { - return MakeAbsolutePath("%exe%/" + path, null); - } - - public static string GetDllDirectory() - { - return Path.Combine(GetExeDirectoryAbsolute(), "dll"); - } - - /// - /// The location of the default INI file - /// - public static string DefaultIniPath { get; private set; } - - public static void SetDefaultIniPath(string newDefaultIniPath) - { - DefaultIniPath = newDefaultIniPath; - } - - /// - /// Gets absolute base as derived from EXE - /// - public static string GetGlobalBasePathAbsolute() - { - var gbase = Global.Config.PathEntries.GlobalBaseFragment; - - // if %exe% prefixed then substitute exe path and repeat - if(gbase.StartsWith("%exe%",StringComparison.InvariantCultureIgnoreCase)) - gbase = GetExeDirectoryAbsolute() + gbase.Substring(5); - - //rooted paths get returned without change - //(this is done after keyword substitution to avoid problems though) - if (Path.IsPathRooted(gbase)) - return gbase; - - //not-rooted things are relative to exe path - gbase = Path.Combine(GetExeDirectoryAbsolute(), gbase); - - return gbase; - } - - public static string GetPlatformBase(string system) - { - return Global.Config.PathEntries[system, "Base"].Path; - } - - public static string StandardFirmwareName(string name) - { - return Path.Combine(MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null), name); - } - - public static string MakeAbsolutePath(string path, string system) - { - //warning: supposedly Path.GetFullPath accesses directories (and needs permissions) - //if this poses a problem, we need to paste code from .net or mono sources and fix them to not pose problems, rather than homebrew stuff - return Path.GetFullPath(MakeAbsolutePathInner(path, system)); - } - - static string MakeAbsolutePathInner(string path, string system) - { - // Hack - if (system == "Global") - { - system = null; - } - - // This function translates relative path and special identifiers in absolute paths - if (path.Length < 1) - { - return GetGlobalBasePathAbsolute(); - } - - if (path == "%recent%") - { - return Environment.SpecialFolder.Recent.ToString(); - } - - if (path.StartsWith("%exe%")) - return GetExeDirectoryAbsolute() + path.Substring(5); - if (path.StartsWith("%rom%")) - return Global.Config.LastRomPath + path.Substring(5); - - if (path[0] == '.') - { - if (!string.IsNullOrWhiteSpace(system)) - { - path = path.Remove(0, 1); - path = path.Insert(0, GetPlatformBase(system)); - } - - if (path.Length == 1) - { - return GetGlobalBasePathAbsolute(); - } - - if (path[0] == '.') - { - path = path.Remove(0, 1); - path = path.Insert(0, GetGlobalBasePathAbsolute()); - } - - return path; - } - - if (Path.IsPathRooted(path)) - return path; - - //handling of initial .. was removed (Path.GetFullPath can handle it) - //handling of file:// or file:\\ was removed (can Path.GetFullPath handle it? not sure) - - // all bad paths default to EXE - return GetExeDirectoryAbsolute(); - } - - public static string RemoveParents(string path, string workingpath) - { - // determines number of parents, then removes directories from working path, return absolute path result - // Ex: "..\..\Bob\", "C:\Projects\Emulators\Bizhawk" will return "C:\Projects\Bob\" - int x = NumParentDirectories(path); - if (x > 0) - { - int y = path.HowMany("..\\"); - int z = workingpath.HowMany("\\"); - if (y >= z) - { - // Return drive letter only, working path must be absolute? - } - - return ""; - } - - return path; - } - - public static int NumParentDirectories(string path) - { - // determine the number of parent directories in path and return result - int x = path.HowMany('\\'); - if (x > 0) - { - return path.HowMany("..\\"); - } - - return 0; - } - - public static bool IsRecent(string path) - { - return path == "%recent%"; - } - - public static string GetLuaPath() - { - return MakeAbsolutePath(Global.Config.PathEntries.LuaPathFragment, null); - } - - // Decides if a path is non-empty, not . and not .\ - private static bool PathIsSet(string path) - { - if (!string.IsNullOrWhiteSpace(path)) - { - return path != "." && path != ".\\"; - } - - return false; - } - - public static string GetRomsPath(string sysId) - { - if (Global.Config.UseRecentForROMs) - { - return Environment.SpecialFolder.Recent.ToString(); - } - - var path = Global.Config.PathEntries[sysId, "ROM"]; - - if (path == null || !PathIsSet(path.Path)) - { - path = Global.Config.PathEntries["Global", "ROM"]; - - if (path != null && PathIsSet(path.Path)) - { - return MakeAbsolutePath(path.Path, null); - } - } - - return MakeAbsolutePath(path.Path, sysId); - } - - public static string RemoveInvalidFileSystemChars(string name) - { - var newStr = name; - var chars = Path.GetInvalidFileNameChars(); - return chars.Aggregate(newStr, (current, c) => current.Replace(c.ToString(), "")); - } - - public static string FilesystemSafeName(GameInfo game) - { - var filesystemSafeName = game.Name - .Replace("|", "+") - .Replace(":", " -") // adelikat - Path.GetFileName scraps everything to the left of a colon unfortunately, so we need this hack here - .Replace("\"", "") // adelikat - Ivan Ironman Stewart's Super Off-Road has quotes in game name - .Replace("/", "+"); // Narry - Mario Bros / Duck hunt has a slash in the name which GetDirectoryName and GetFileName treat as if it were a folder - - // zero 06-nov-2015 - regarding the below, i changed my mind. for libretro i want subdirectories here. - var filesystemDir = Path.GetDirectoryName(filesystemSafeName); - filesystemSafeName = Path.GetFileName(filesystemSafeName); - - filesystemSafeName = RemoveInvalidFileSystemChars(filesystemSafeName); - - // zero 22-jul-2012 - i dont think this is used the same way it used to. game.Name shouldnt be a path, so this stuff is illogical. - // if game.Name is a path, then someone shouldve made it not-a-path already. - // return Path.Combine(Path.GetDirectoryName(filesystemSafeName), Path.GetFileNameWithoutExtension(filesystemSafeName)); - - // adelikat: - // This hack is to prevent annoying things like Super Mario Bros..bk2 - if (filesystemSafeName.EndsWith(".")) - { - filesystemSafeName = filesystemSafeName.Remove(filesystemSafeName.Length - 1, 1); - } - - return Path.Combine(filesystemDir, filesystemSafeName); - } - - public static string SaveRamPath(GameInfo game) - { - var name = FilesystemSafeName(game); - if (Global.MovieSession.Movie.IsActive) - { - name += "." + Path.GetFileNameWithoutExtension(Global.MovieSession.Movie.Filename); - } - - var pathEntry = Global.Config.PathEntries[game.System, "Save RAM"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return Path.Combine(MakeAbsolutePath(pathEntry.Path, game.System), name) + ".SaveRAM"; - } - - public static string AutoSaveRamPath(GameInfo game) - { - var path = SaveRamPath(game); - return path.Insert(path.Length - 8, ".AutoSaveRAM"); - } - - public static string RetroSaveRAMDirectory(GameInfo game) - { - // hijinx here to get the core name out of the game name - var name = FilesystemSafeName(game); - name = Path.GetDirectoryName(name); - if (name == "") - { - name = FilesystemSafeName(game); - } - - if (Global.MovieSession.Movie.IsActive) - { - name = Path.Combine(name, "movie-" + Path.GetFileNameWithoutExtension(Global.MovieSession.Movie.Filename)); - } - - var pathEntry = Global.Config.PathEntries[game.System, "Save RAM"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return Path.Combine(MakeAbsolutePath(pathEntry.Path, game.System), name); - } - - public static string RetroSystemPath(GameInfo game) - { - // hijinx here to get the core name out of the game name - var name = FilesystemSafeName(game); - name = Path.GetDirectoryName(name); - if (name == "") - { - name = FilesystemSafeName(game); - } - - var pathEntry = Global.Config.PathEntries[game.System, "System"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return Path.Combine(MakeAbsolutePath(pathEntry.Path, game.System), name); - } - - public static string GetGameBasePath(GameInfo game) - { - var name = FilesystemSafeName(game); - - var pathEntry = Global.Config.PathEntries[game.System, "Base"]; - return MakeAbsolutePath(pathEntry.Path, game.System); - } - - public static string GetSaveStatePath(GameInfo game) - { - var pathEntry = Global.Config.PathEntries[game.System, "Savestates"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return MakeAbsolutePath(pathEntry.Path, game.System); - } - - public static string SaveStatePrefix(GameInfo game) - { - var name = FilesystemSafeName(game); - - // Neshawk and Quicknes have incompatible savestates, store the name to keep them separate - if (Global.Emulator.SystemId == "NES") - { - name += "." + Global.Emulator.Attributes().CoreName; - } - - // Gambatte and GBHawk have incompatible savestates, store the name to keep them separate - if (Global.Emulator.SystemId == "GB") - { - name += "." + Global.Emulator.Attributes().CoreName; - } - - if (Global.Emulator is Snes9x) // Keep snes9x savestate away from libsnes, we want to not be too tedious so bsnes names will just have the profile name not the core name - { - name += "." + Global.Emulator.Attributes().CoreName; - } - - // Bsnes profiles have incompatible savestates so save the profile name - if (Global.Emulator is LibsnesCore) - { - name += "." + (Global.Emulator as LibsnesCore).CurrentProfile; - } - - if (Global.Emulator.SystemId == "GBA") - { - name += "." + Global.Emulator.Attributes().CoreName; - } - - if (Global.MovieSession.Movie.IsActive) - { - name += "." + Path.GetFileNameWithoutExtension(Global.MovieSession.Movie.Filename); - } - - var pathEntry = Global.Config.PathEntries[game.System, "Savestates"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return Path.Combine(MakeAbsolutePath(pathEntry.Path, game.System), name); - } - - public static string GetCheatsPath(GameInfo game) - { - var pathEntry = Global.Config.PathEntries[game.System, "Cheats"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return MakeAbsolutePath(pathEntry.Path, game.System); - } - - public static string GetPathType(string system, string type) - { - var path = GetPathEntryWithFallback(type, system).Path; - return MakeAbsolutePath(path, system); - } - - public static string ScreenshotPrefix(GameInfo game) - { - var name = FilesystemSafeName(game); - - var pathEntry = Global.Config.PathEntries[game.System, "Screenshots"] ?? - Global.Config.PathEntries[game.System, "Base"]; - - return Path.Combine(MakeAbsolutePath(pathEntry.Path, game.System), name); - } - - /// - /// Takes an absolute path and attempts to convert it to a relative, based on the system, - /// or global base if no system is supplied, if it is not a subfolder of the base, it will return the path unaltered - /// - public static string TryMakeRelative(string absolutePath, string system = null) - { - var parentPath = string.IsNullOrWhiteSpace(system) ? - GetGlobalBasePathAbsolute() : - MakeAbsolutePath(GetPlatformBase(system), system); - - if (IsSubfolder(parentPath, absolutePath)) - { - return absolutePath.Replace(parentPath, "."); - } - - return absolutePath; - } - - public static string MakeRelativeTo(string absolutePath, string basePath) - { - if (IsSubfolder(basePath, absolutePath)) - { - return absolutePath.Replace(basePath, "."); - } - - return absolutePath; - } - - // http://stackoverflow.com/questions/3525775/how-to-check-if-directory-1-is-a-subdirectory-of-dir2-and-vice-versa - private static bool IsSubfolder(string parentPath, string childPath) - { - var parentUri = new Uri(parentPath); - - var childUri = new DirectoryInfo(childPath).Parent; - - while (childUri != null) - { - if (new Uri(childUri.FullName) == parentUri) - { - return true; - } - - childUri = childUri.Parent; - } - - return false; - } - - /// - /// Don't only valid system ids to system ID, pathType is ROM, Screenshot, etc - /// Returns the desired path, if does not exist, returns platform base, else it returns base - /// - private static PathEntry GetPathEntryWithFallback(string pathType, string systemId) - { - var entry = Global.Config.PathEntries[systemId, pathType]; - if (entry == null) - { - entry = Global.Config.PathEntries[systemId, "Base"]; - } - - if (entry == null) - { - entry = Global.Config.PathEntries["Global", "Base"]; - } - - return entry; - } - - /// - /// Puts the currently configured temp path into the environment for use as actual temp directory - /// - public static void RefreshTempPath() - { - if (Global.Config.PathEntries.TempFilesFragment != "") - { - //TODO - BUG - needs to route through PathManager.MakeAbsolutePath or something similar, but how? - string target = Global.Config.PathEntries.TempFilesFragment; - BizHawk.Common.TempFileManager.HelperSetTempPath(target); - } - } - } - -} diff --git a/BizHawk.Client.Common/Properties/AssemblyInfo.cs b/BizHawk.Client.Common/Properties/AssemblyInfo.cs deleted file mode 100644 index 0135df64f6..0000000000 --- a/BizHawk.Client.Common/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BizHawk.Client.Common")] -[assembly: AssemblyDescription("http://tasvideos.org/Bizhawk.html")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("BizHawk")] -[assembly: AssemblyProduct("BizHawk.Client.Common")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8281b376-a1d5-4157-97b8-dab7246ef4c8")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] -[assembly: AssemblyFileVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] diff --git a/BizHawk.Client.Common/RecentFiles.cs b/BizHawk.Client.Common/RecentFiles.cs deleted file mode 100644 index b3fa4b91c6..0000000000 --- a/BizHawk.Client.Common/RecentFiles.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; - -namespace BizHawk.Client.Common -{ - [JsonObject] - public class RecentFiles : IEnumerable - { - // ReSharper disable once FieldCanBeMadeReadOnly.Local - private List recentlist; - - public RecentFiles() - : this(8) - { - } - - public RecentFiles(int max) - { - recentlist = new List(); - MAX_RECENT_FILES = max; - } - - public int MAX_RECENT_FILES { get; set; } - public bool AutoLoad { get; set; } - - /// - /// If true, the list can not change, or be cleared - /// - public bool Frozen { get; set; } - - [JsonIgnore] - public bool Empty => !recentlist.Any(); - - [JsonIgnore] - public int Count => recentlist.Count; - - [JsonIgnore] - public string MostRecent => recentlist.Any() ? recentlist[0] : ""; - - public string this[int index] - { - get - { - if (recentlist.Any()) - { - return recentlist[index]; - } - - return ""; - } - } - - public IEnumerator GetEnumerator() - { - return recentlist.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Clear() - { - if (!Frozen) - { - recentlist.Clear(); - } - } - - public void Add(string newFile) - { - if (!Frozen) - { - Remove(newFile); - recentlist.Insert(0, newFile); - - if (recentlist.Count > MAX_RECENT_FILES) - { - recentlist.Remove(recentlist.Last()); - } - } - } - - public bool Remove(string newFile) - { - if (!Frozen) - { - var removed = false; - foreach (var recent in recentlist.ToList()) - { - if (string.Compare(newFile, recent, StringComparison.CurrentCultureIgnoreCase) == 0) - { - recentlist.Remove(newFile); // intentionally keeps iterating after this to remove duplicate instances, though those should never exist in the first place - removed = true; - } - } - - return removed; - } - - return false; - } - - public void ToggleAutoLoad() - { - AutoLoad ^= true; - } - } -} diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs deleted file mode 100644 index 3a4b1d69a6..0000000000 --- a/BizHawk.Client.Common/RomLoader.cs +++ /dev/null @@ -1,1168 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores; -using BizHawk.Emulation.Cores.Libretro; -using BizHawk.Emulation.Cores.Atari.A7800Hawk; -using BizHawk.Emulation.Cores.Calculators; -using BizHawk.Emulation.Cores.Computers.AppleII; -using BizHawk.Emulation.Cores.Computers.Commodore64; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Nintendo.GBHawk; -using BizHawk.Emulation.Cores.Nintendo.GBHawkLink; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Sega.Saturn; -using BizHawk.Emulation.Cores.Sony.PSP; -using BizHawk.Emulation.Cores.Sony.PSX; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using BizHawk.Emulation.DiscSystem; - -using GPGX64 = BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Consoles.Sega.Saturn; -using BizHawk.Emulation.Cores.Consoles.NEC.PCFX; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; - -namespace BizHawk.Client.Common -{ - public class RomLoader - { - public enum LoadErrorType - { - Unknown, MissingFirmware, XML, DiscError - } - - // helper methods for the settings events - private object GetCoreSettings() - where T : IEmulator - { - return GetCoreSettings(typeof(T)); - } - - private object GetCoreSyncSettings() - where T : IEmulator - { - return GetCoreSyncSettings(typeof(T)); - } - - private object GetCoreSettings(Type t) - { - var e = new SettingsLoadArgs(t); - OnLoadSettings?.Invoke(this, e); - return e.Settings; - } - - private object GetCoreSyncSettings(Type t) - { - var e = new SettingsLoadArgs(t); - OnLoadSyncSettings?.Invoke(this, e); - return e.Settings; - } - - // For not throwing errors but simply outputing information to the screen - public Action MessageCallback { get; set; } - - private void DoMessageCallback(string message) - { - MessageCallback?.Invoke(message); - } - - // TODO: reconsider the need for exposing these; - public IEmulator LoadedEmulator { get; private set; } - public GameInfo Game { get; private set; } - public RomGame Rom { get; private set; } - public string CanonicalFullPath { get; private set; } - - public bool Deterministic { get; set; } - - public class RomErrorArgs : EventArgs - { - // TODO: think about naming here, what to pass, a lot of potential good information about what went wrong could go here! - public RomErrorArgs(string message, string systemId, LoadErrorType type) - { - Message = message; - AttemptedCoreLoad = systemId; - Type = type; - } - - public RomErrorArgs(string message, string systemId, string path, bool? det, LoadErrorType type) - : this(message, systemId, type) - { - Deterministic = det; - RomPath = path; - } - - public string Message { get; private set; } - public string AttemptedCoreLoad { get; private set; } - public string RomPath { get; private set; } - public bool? Deterministic { get; set; } - public bool Retry { get; set; } - public LoadErrorType Type { get; private set; } - } - - public class SettingsLoadArgs : EventArgs - { - public object Settings { get; set; } - public Type Core { get; private set; } - public SettingsLoadArgs(Type t) - { - Core = t; - Settings = null; - } - } - - public delegate void SettingsLoadEventHandler(object sender, SettingsLoadArgs e); - public event SettingsLoadEventHandler OnLoadSettings; - public event SettingsLoadEventHandler OnLoadSyncSettings; - - public delegate void LoadErrorEventHandler(object sender, RomErrorArgs e); - public event LoadErrorEventHandler OnLoadError; - - public Func ChooseArchive { get; set; } - - public Func ChoosePlatform { get; set; } - - // in case we get sent back through the picker more than once, use the same choice the second time - private int? previouschoice; - private int? HandleArchive(HawkFile file) - { - if (previouschoice.HasValue) - { - return previouschoice; - } - - if (ChooseArchive != null) - { - previouschoice = ChooseArchive(file); - return previouschoice; - } - - return null; - } - - // May want to phase out this method in favor of the overload with more paramaters - private void DoLoadErrorCallback(string message, string systemId, LoadErrorType type = LoadErrorType.Unknown) - { - OnLoadError?.Invoke(this, new RomErrorArgs(message, systemId, type)); - } - - private void DoLoadErrorCallback(string message, string systemId, string path, bool det, LoadErrorType type = LoadErrorType.Unknown) - { - OnLoadError?.Invoke(this, new RomErrorArgs(message, systemId, path, det, type)); - } - - private bool PreferredPlatformIsDefined(string extension) - { - if (Global.Config.PreferredPlatformsForExtensions.ContainsKey(extension)) - { - return !string.IsNullOrEmpty(Global.Config.PreferredPlatformsForExtensions[extension]); - } - - return false; - } - - public bool AsLibretro { get; set; } - - private bool HandleArchiveBinding(HawkFile file) - { - var romExtensions = new[] { "SMS", "SMC", "SFC", "PCE", "SGX", "GG", "SG", "BIN", "GEN", "MD", "SMD", "GB", "NES", "FDS", "ROM", "INT", "GBC", "UNF", "A78", "CRT", "COL", "XML", "Z64", "V64", "N64", "WS", "WSC", "GBA", "32X" }; - - // try binding normal rom extensions first - if (!file.IsBound) - { - file.BindSoleItemOf(romExtensions); - } - - // if we have an archive and need to bind something, then pop the dialog - if (file.IsArchive && !file.IsBound) - { - int? result = HandleArchive(file); - if (result.HasValue) - { - file.BindArchiveMember(result.Value); - } - else - { - return false; - } - } - - CanonicalFullPath = file.CanonicalFullPath; - - return true; - } - - private List DiscsFromXml(XmlGame xmlGame, string systemId, DiscType diskType) - { - var discs = new List(); - var sw = new StringWriter(); - foreach (var e in xmlGame.AssetFullPaths) - { - Disc disc = null; - string discPath = e; - - //--- load the disc in a context which will let us abort if it's going to take too long - var discMountJob = new DiscMountJob { IN_FromPath = discPath, IN_SlowLoadAbortThreshold = 8 }; - discMountJob.Run(); - disc = discMountJob.OUT_Disc; - - if (discMountJob.OUT_SlowLoadAborted) - { - DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", systemId, LoadErrorType.DiscError); - } - - else if (discMountJob.OUT_ErrorLevel) - { - throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log); - } - - else if (disc == null) - { - throw new InvalidOperationException("Can't load one of the files specified in the XML"); - } - - else - { - discs.Add(disc); - - var discType = new DiscIdentifier(disc).DetectDiscType(); - - if (discType != diskType) - { - DoLoadErrorCallback($"Not a {systemId} disc", systemId, LoadErrorType.DiscError); - } - } - } - - return discs; - } - - public bool LoadRom(string path, CoreComm nextComm, bool forceAccurateCore = false, - int recursiveCount = 0) // forceAccurateCore is currently just for Quicknes vs Neshawk but could be used for other situations - { - if (recursiveCount > 1) // hack to stop recursive calls from endlessly rerunning if we can't load it - { - DoLoadErrorCallback("Failed multiple attempts to load ROM.", ""); - return false; - } - - bool cancel = false; - - if (path == null) - { - return false; - } - - using (var file = new HawkFile()) - { - // only try mounting a file if a filename was given - if (!string.IsNullOrEmpty(path)) - { - // lets not use this unless we need to - // file.NonArchiveExtensions = romExtensions; - file.Open(path); - - // if the provided file doesnt even exist, give up! - if (!file.Exists) - { - return false; - } - } - - CanonicalFullPath = file.CanonicalFullPath; - - IEmulator nextEmulator = null; - RomGame rom = null; - GameInfo game = null; - - try - { - string ext = null; - - if (AsLibretro) - { - string codePathPart = Path.GetFileNameWithoutExtension(nextComm.LaunchLibretroCore); - - var retro = new LibretroCore(nextComm, nextComm.LaunchLibretroCore); - nextEmulator = retro; - - // kind of dirty.. we need to stash this, and then we can unstash it in a moment, in case the core doesnt fail - var oldGame = Global.Game; - - if (retro.Description.SupportsNoGame && string.IsNullOrEmpty(path)) - { - // must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core) - // game name == name of core - var gameName = codePathPart; - Global.Game = game = new GameInfo { Name = gameName, System = "Libretro" }; - - // if we are allowed to run NoGame and we dont have a game, boot up the core that way - bool ret = retro.LoadNoGame(); - - Global.Game = oldGame; - - if (!ret) - { - DoLoadErrorCallback("LibretroNoGame failed to load. This is weird", "Libretro"); - retro.Dispose(); - return false; - } - } - else - { - bool ret; - - // must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core) - // game name == name of core + extensionless_game_filename - var gameName = Path.Combine(codePathPart, Path.GetFileNameWithoutExtension(file.Name)); - Global.Game = game = new GameInfo { Name = gameName, System = "Libretro" }; - - // if the core requires an archive file, then try passing the filename of the archive - // (but do we ever need to actually load the contents of the archive file into ram?) - if (retro.Description.NeedsArchives) - { - if (file.IsArchiveMember) - { - throw new InvalidOperationException("Should not have bound file member for libretro block_extract core"); - } - - ret = retro.LoadPath(file.FullPathWithoutMember); - } - else - { - // otherwise load the data or pass the filename, as requested. but.. - if (retro.Description.NeedsRomAsPath && file.IsArchiveMember) - { - throw new InvalidOperationException("Cannot pass archive member to libretro needs_fullpath core"); - } - - if (retro.Description.NeedsRomAsPath) - { - ret = retro.LoadPath(file.FullPathWithoutMember); - } - else - { - ret = HandleArchiveBinding(file); - if (ret) - { - ret = retro.LoadData(file.ReadAllBytes(), file.Name); - } - } - } - - Global.Game = oldGame; - - if (!ret) - { - DoLoadErrorCallback("Libretro failed to load the given file. This is probably due to a core/content mismatch. Moreover, the process is now likely to be hosed. We suggest you restart the program.", "Libretro"); - retro.Dispose(); - return false; - } - } - } - else - { - // at this point, file is either assigned to the ROM path, if it exists, - // or is empty and corecomm is not a libretro core - // so, we still need to check path here before continuing - if (string.IsNullOrEmpty(path)) - { - Console.WriteLine("No ROM to Load"); - return false; - } - - // if not libretro: - // do extension checknig - ext = file.Extension.ToLowerInvariant(); - - // do the archive binding we had to skip - if (!HandleArchiveBinding(file)) - { - return false; - } - } - - if (string.IsNullOrEmpty(ext)) - { - } - else if (ext == ".m3u") - { - // HACK ZONE - currently only psx supports m3u - M3U_File m3u; - using (var sr = new StreamReader(path)) - { - m3u = M3U_File.Read(sr); - } - - if (m3u.Entries.Count == 0) - { - throw new InvalidOperationException("Can't load an empty M3U"); - } - - // load discs for all the m3u - m3u.Rebase(Path.GetDirectoryName(path)); - List discs = new List(); - List discNames = new List(); - StringWriter sw = new StringWriter(); - foreach (var e in m3u.Entries) - { - Disc disc = null; - string discPath = e.Path; - - //--- load the disc in a context which will let us abort if it's going to take too long - var discMountJob = new DiscMountJob { IN_FromPath = discPath, IN_SlowLoadAbortThreshold = 8 }; - discMountJob.Run(); - disc = discMountJob.OUT_Disc; - - if (discMountJob.OUT_SlowLoadAborted) - { - DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", "", LoadErrorType.DiscError); - return false; - } - - if (discMountJob.OUT_ErrorLevel) - { - throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log); - } - - if (disc == null) - { - throw new InvalidOperationException("Can't load one of the files specified in the M3U"); - } - - var discName = Path.GetFileNameWithoutExtension(discPath); - discNames.Add(discName); - discs.Add(disc); - - var discType = new DiscIdentifier(disc).DetectDiscType(); - sw.WriteLine("{0}", Path.GetFileName(discPath)); - if (discType == DiscType.SonyPSX) - { - string discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8"); - game = Database.CheckDatabase(discHash); - if (game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase) - { - sw.WriteLine("Disc could not be identified as known-good. Look for a better rip."); - } - else - { - sw.WriteLine("Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{0:X8}", discHash); - sw.WriteLine("Nonetheless it could be an unrecognized romhack or patched version."); - sw.WriteLine("According to redump.org, the ideal hash for entire disc is: CRC32:{0:X8}", game.GetStringValue("dh")); - sw.WriteLine("The file you loaded hasn't been hashed entirely (it would take too long)"); - sw.WriteLine("Compare it with the full hash calculated by the PSX menu's Hash Discs tool"); - } - } - else - { - sw.WriteLine("Not a PSX disc"); - } - - sw.WriteLine("-------------------------"); - } - - nextEmulator = new Octoshock(nextComm, discs, discNames, null, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator.CoreComm.RomStatusDetails = sw.ToString(); - game = new GameInfo - { - Name = Path.GetFileNameWithoutExtension(file.Name), - System = "PSX" - }; - } - else if (ext == ".iso" || ext == ".cue" || ext == ".ccd" || ext == ".mds") - { - if (file.IsArchive) - { - throw new InvalidOperationException("Can't load CD files from archives!"); - } - - string discHash = null; - - //--- load the disc in a context which will let us abort if it's going to take too long - var discMountJob = new DiscMountJob { IN_FromPath = path, IN_SlowLoadAbortThreshold = 8 }; - discMountJob.Run(); - - if (discMountJob.OUT_SlowLoadAborted) - { - DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", "", LoadErrorType.DiscError); - return false; - } - - if (discMountJob.OUT_ErrorLevel) - { - throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log); - } - - var disc = discMountJob.OUT_Disc; - - // ----------- - // TODO - use more sophisticated IDer - var discType = new DiscIdentifier(disc).DetectDiscType(); - if (discType == DiscType.SonyPSX) - { - discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8"); - } - else - { - discHash = new DiscHasher(disc).OldHash(); - } - - game = Database.CheckDatabase(discHash); - if (game == null) - { - // try to use our wizard methods - game = new GameInfo { Name = Path.GetFileNameWithoutExtension(file.Name), Hash = discHash }; - - var dt = new DiscIdentifier(disc).DetectDiscType(); - - switch (dt) - { - case DiscType.SegaSaturn: - game.System = "SAT"; - break; - case DiscType.SonyPSP: - game.System = "PSP"; - break; - default: - case DiscType.SonyPSX: - game.System = "PSX"; - break; - case DiscType.MegaCD: - game.System = "GEN"; - break; - case DiscType.PCFX: - game.System = "PCFX"; - break; - case DiscType.TurboCD: - game.System = "PCECD"; - break; - - case DiscType.Amiga: - case DiscType.CDi: - case DiscType.Dreamcast: - case DiscType.GameCube: - case DiscType.NeoGeoCD: - case DiscType.Panasonic3DO: - case DiscType.Playdia: - case DiscType.Wii: - // no supported emulator core for these (yet) - game.System = dt.ToString(); - throw new NoAvailableCoreException(dt.ToString()); - - case DiscType.AudioDisc: - case DiscType.UnknownCDFS: - case DiscType.UnknownFormat: - if (PreferredPlatformIsDefined(ext)) - { - game.System = Global.Config.PreferredPlatformsForExtensions[ext]; - } - else - { - game.System = "NULL"; // "PCECD"; - } - - break; - } - } - - switch (game.System) - { - case "NULL": - nextEmulator = null; - break; - case "GEN": - var genesis = new GPGX(nextComm, null, new[] { disc }, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = genesis; - break; - case "SAT": - nextEmulator = new Saturnus(nextComm, new[] { disc }, Deterministic, - (Saturnus.Settings)GetCoreSettings(), (Saturnus.SyncSettings)GetCoreSyncSettings()); - break; - case "PSP": - nextEmulator = new PSP(nextComm, file.Name); - break; - case "PSX": - nextEmulator = new Octoshock(nextComm, new List(new[] { disc }), new List(new[] { Path.GetFileNameWithoutExtension(path) }), null, GetCoreSettings(), GetCoreSyncSettings()); - if (game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase) - { - nextEmulator.CoreComm.RomStatusDetails = "Disc could not be identified as known-good. Look for a better rip."; - } - else - { - StringWriter sw = new StringWriter(); - sw.WriteLine("Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{0:X8}", discHash); - sw.WriteLine("Nonetheless it could be an unrecognized romhack or patched version."); - sw.WriteLine("According to redump.org, the ideal hash for entire disc is: CRC32:{0:X8}", game.GetStringValue("dh")); - sw.WriteLine("The file you loaded hasn't been hashed entirely (it would take too long)"); - sw.WriteLine("Compare it with the full hash calculated by the PSX menu's Hash Discs tool"); - nextEmulator.CoreComm.RomStatusDetails = sw.ToString(); - } - - break; - case "PCFX": - nextEmulator = new Tst(nextComm, new[] { disc }, - (Tst.Settings)GetCoreSettings(), (Tst.SyncSettings)GetCoreSyncSettings()); - break; - case "PCE": - case "PCECD": - nextEmulator = new PCEngine(nextComm, game, disc, GetCoreSettings(), GetCoreSyncSettings()); - break; - } - } - else if (file.Extension.ToLowerInvariant() == ".xml") - { - try - { - var xmlGame = XmlGame.Create(file); // if load fails, are we supposed to retry as a bsnes XML???????? - game = xmlGame.GI; - - switch (game.System) - { - case "GB": - case "DGB": - // adelikat: remove need for tags to be hardcoded to left and right, we should clean this up, also maybe the DGB core should just take the xml file and handle it itself - var leftBytes = xmlGame.Assets.First().Value; - var rightBytes = xmlGame.Assets.Skip(1).First().Value; - - var left = Database.GetGameInfo(leftBytes, "left.gb"); - var right = Database.GetGameInfo(rightBytes, "right.gb"); - if (Global.Config.GB_UseGBHawk) - { - nextEmulator = new GBHawkLink( - nextComm, - left, - leftBytes, - right, - rightBytes, - GetCoreSettings(), - GetCoreSyncSettings()); - } - else - { - nextEmulator = new GambatteLink( - nextComm, - left, - leftBytes, - right, - rightBytes, - GetCoreSettings(), - GetCoreSyncSettings(), - Deterministic); - } - - // other stuff todo - break; - case "AppleII": - var assets = xmlGame.Assets.Select(a => Database.GetGameInfo(a.Value, a.Key)); - var roms = xmlGame.Assets.Select(a => a.Value); - nextEmulator = new AppleII( - nextComm, - assets, - roms, - (AppleII.Settings)GetCoreSettings()); - break; - case "C64": - nextEmulator = new C64( - nextComm, - xmlGame.Assets.Select(a => a.Value), - GameInfo.NullInstance, - (C64.C64Settings)GetCoreSettings(), - (C64.C64SyncSettings)GetCoreSyncSettings()); - break; - case "ZXSpectrum": - - List zxGI = new List(); - foreach (var a in xmlGame.Assets) - { - zxGI.Add(new GameInfo { Name = Path.GetFileNameWithoutExtension(a.Key) }); - } - - nextEmulator = new ZXSpectrum( - nextComm, - xmlGame.Assets.Select(a => a.Value), //.First(), - zxGI, // GameInfo.NullInstance, - (ZXSpectrum.ZXSpectrumSettings)GetCoreSettings(), - (ZXSpectrum.ZXSpectrumSyncSettings)GetCoreSyncSettings(), - Deterministic); - break; - case "AmstradCPC": - - List cpcGI = new List(); - foreach (var a in xmlGame.Assets) - { - cpcGI.Add(new GameInfo { Name = Path.GetFileNameWithoutExtension(a.Key) }); - } - - nextEmulator = new AmstradCPC( - nextComm, - xmlGame.Assets.Select(a => a.Value), //.First(), - cpcGI, // GameInfo.NullInstance, - (AmstradCPC.AmstradCPCSettings)GetCoreSettings(), - (AmstradCPC.AmstradCPCSyncSettings)GetCoreSyncSettings()); - break; - case "PSX": - var entries = xmlGame.AssetFullPaths; - var discs = new List(); - var discNames = new List(); - var sw = new StringWriter(); - foreach (var e in entries) - { - Disc disc = null; - string discPath = e; - - //--- load the disc in a context which will let us abort if it's going to take too long - var discMountJob = new DiscMountJob { IN_FromPath = discPath, IN_SlowLoadAbortThreshold = 8 }; - discMountJob.Run(); - disc = discMountJob.OUT_Disc; - - if (discMountJob.OUT_SlowLoadAborted) - { - DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", "PSX", LoadErrorType.DiscError); - return false; - } - - if (discMountJob.OUT_ErrorLevel) - { - throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log); - } - - if (disc == null) - { - throw new InvalidOperationException("Can't load one of the files specified in the M3U"); - } - - var discName = Path.GetFileNameWithoutExtension(discPath); - discNames.Add(discName); - discs.Add(disc); - - var discType = new DiscIdentifier(disc).DetectDiscType(); - sw.WriteLine("{0}", Path.GetFileName(discPath)); - if (discType == DiscType.SonyPSX) - { - string discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8"); - game = Database.CheckDatabase(discHash); - if (game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase) - { - sw.WriteLine("Disc could not be identified as known-good. Look for a better rip."); - } - else - { - sw.WriteLine("Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{0:X8}", discHash); - sw.WriteLine("Nonetheless it could be an unrecognized romhack or patched version."); - sw.WriteLine("According to redump.org, the ideal hash for entire disc is: CRC32:{0:X8}", game.GetStringValue("dh")); - sw.WriteLine("The file you loaded hasn't been hashed entirely (it would take too long)"); - sw.WriteLine("Compare it with the full hash calculated by the PSX menu's Hash Discs tool"); - } - } - else - { - sw.WriteLine("Not a PSX disc"); - } - - sw.WriteLine("-------------------------"); - } - - // todo: copy pasta from PSX .cue section - nextEmulator = new Octoshock(nextComm, discs, discNames, null, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator.CoreComm.RomStatusDetails = sw.ToString(); - game = new GameInfo - { - Name = Path.GetFileNameWithoutExtension(file.Name), - System = "PSX" - }; - break; - case "SAT": - var saturnDiscs = DiscsFromXml(xmlGame, "SAT", DiscType.SegaSaturn); - if (!saturnDiscs.Any()) - { - return false; - } - - nextEmulator = new Saturnus(nextComm, saturnDiscs, Deterministic, - (Saturnus.Settings)GetCoreSettings(), (Saturnus.SyncSettings)GetCoreSyncSettings()); - break; - case "PCFX": - var pcfxDiscs = DiscsFromXml(xmlGame, "PCFX", DiscType.PCFX); - if (!pcfxDiscs.Any()) - { - return false; - } - - nextEmulator = new Tst(nextComm, pcfxDiscs, - (Tst.Settings)GetCoreSettings(), (Tst.SyncSettings)GetCoreSyncSettings()); - break; - case "GEN": - // We are assuming discs only, for now - var genDiscs = DiscsFromXml(xmlGame, "GEN", DiscType.MegaCD); - if (!genDiscs.Any()) - { - return false; - } - nextEmulator = new GPGX(nextComm, null, genDiscs, GetCoreSettings(), GetCoreSyncSettings()); - break; - default: - return false; - } - } - catch (Exception ex) - { - try - { - // need to get rid of this hack at some point - rom = new RomGame(file); - ((CoreFileProvider)nextComm.CoreFileProvider).SubfileDirectory = Path.GetDirectoryName(path.Replace("|", "")); // Dirty hack to get around archive filenames (since we are just getting the directory path, it is safe to mangle the filename - byte[] romData = null; - byte[] xmlData = rom.FileData; - - game = rom.GameInfo; - game.System = "SNES"; - - var snes = new LibsnesCore(game, romData, xmlData, nextComm, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = snes; - } - catch - { - DoLoadErrorCallback(ex.ToString(), "DGB", LoadErrorType.XML); - return false; - } - } - } - else if (file.Extension.ToLowerInvariant() == ".psf" || file.Extension.ToLowerInvariant() == ".minipsf") - { - Func cbDeflater = (Stream instream, int size) => - { - var inflater = new ICSharpCode.SharpZipLib.Zip.Compression.Inflater(false); - var iis = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(instream, inflater); - MemoryStream ret = new MemoryStream(); - iis.CopyTo(ret); - return ret.ToArray(); - }; - PSF psf = new PSF(); - psf.Load(path, cbDeflater); - nextEmulator = new Octoshock(nextComm, psf, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator.CoreComm.RomStatusDetails = "It's a PSF, what do you want. Oh, tags maybe?"; - - // total garbage, this - rom = new RomGame(file); - game = rom.GameInfo; - } - else if (ext != null) // most extensions - { - rom = new RomGame(file); - - // hacky for now - if (file.Extension.ToLowerInvariant() == ".exe") - { - rom.GameInfo.System = "PSX"; - } - else if (file.Extension.ToLowerInvariant() == ".nsf") - { - rom.GameInfo.System = "NES"; - } - - if (string.IsNullOrEmpty(rom.GameInfo.System)) - { - // Has the user picked a preference for this extension? - if (PreferredPlatformIsDefined(rom.Extension.ToLowerInvariant())) - { - rom.GameInfo.System = Global.Config.PreferredPlatformsForExtensions[rom.Extension.ToLowerInvariant()]; - } - else if (ChoosePlatform != null) - { - var result = ChoosePlatform(rom); - if (!string.IsNullOrEmpty(result)) - { - rom.GameInfo.System = result; - } - else - { - cancel = true; - } - } - } - - game = rom.GameInfo; - - var isXml = false; - - // other xml has already been handled - if (file.Extension.ToLowerInvariant() == ".xml") - { - game.System = "SNES"; - isXml = true; - } - - CoreInventory.Core core = null; - - switch (game.System) - { - default: - core = CoreInventory.Instance[game.System]; - break; - - case null: - // The user picked nothing in the Core picker - break; - case "83P": - var ti83Bios = ((CoreFileProvider)nextComm.CoreFileProvider).GetFirmware("TI83", "Rom", true); - var ti83BiosPath = ((CoreFileProvider)nextComm.CoreFileProvider).GetFirmwarePath("TI83", "Rom", true); - using (var ti83AsHawkFile = new HawkFile()) - { - ti83AsHawkFile.Open(ti83BiosPath); - var ti83BiosAsRom = new RomGame(ti83AsHawkFile); - var ti83 = new TI83(nextComm, ti83BiosAsRom.GameInfo, ti83Bios, GetCoreSettings()); - ti83.LinkPort.SendFileToCalc(File.OpenRead(path), false); - nextEmulator = ti83; - } - - break; - case "SNES": - bool useSnes9x = Global.Config.SNES_InSnes9x; - if (Global.Config.CoreForcingViaGameDB && !string.IsNullOrEmpty(game.ForcedCore)) - { - if (game.ForcedCore.ToLower() == "snes9x") - { - useSnes9x = true; - } - else if (game.ForcedCore.ToLower() == "bsnes") - { - useSnes9x = false; - } - } - - if (useSnes9x) - { - core = CoreInventory.Instance["SNES", "Snes9x"]; - } - else - { - // need to get rid of this hack at some point - ((CoreFileProvider)nextComm.CoreFileProvider).SubfileDirectory = Path.GetDirectoryName(path.Replace("|", "")); // Dirty hack to get around archive filenames (since we are just getting the directory path, it is safe to mangle the filename - var romData = isXml ? null : rom.FileData; - var xmlData = isXml ? rom.FileData : null; - var snes = new LibsnesCore(game, romData, xmlData, nextComm, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = snes; - } - - break; - case "NES": - { - // apply main spur-of-the-moment switcheroo as lowest priority - string preference = "neshawk"; - if (Global.Config.NES_InQuickNES) - { - preference = "quicknes"; - } - - // if user has saw fit to override in gamedb, apply that - if (Global.Config.CoreForcingViaGameDB && !string.IsNullOrEmpty(game.ForcedCore)) - { - preference = game.ForcedCore; - } - - // but only neshawk is accurate - if (forceAccurateCore) - { - preference = "neshawk"; - } - - if (preference == "neshawk") - { - core = CoreInventory.Instance["NES", "NesHawk"]; - } - else - { - core = CoreInventory.Instance["NES", "QuickNes"]; - } - } - - break; - - case "GB": - if (!Global.Config.GB_AsSGB) - { - if (Global.Config.GB_UseGBHawk) - { - core = CoreInventory.Instance["GB", "GBHawk"]; - } - else - { - core = CoreInventory.Instance["GB", "Gambatte"]; - } - } - else - { - if (Global.Config.SGB_UseBsnes) - { - game.System = "SNES"; - game.AddOption("SGB"); - var snes = new LibsnesCore(game, rom.FileData, null, nextComm, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = snes; - } - else - { - core = CoreInventory.Instance["SGB", "SameBoy"]; - } - } - break; - case "GBC": - if (!Global.Config.GB_AsSGB) - { - if (Global.Config.GB_UseGBHawk) - { - core = CoreInventory.Instance["GBC", "GBHawk"]; - } - else - { - core = CoreInventory.Instance["GBC", "Gambatte"]; - } - } - else - { - if (Global.Config.SGB_UseBsnes) - { - game.System = "SNES"; - game.AddOption("SGB"); - var snes = new LibsnesCore(game, rom.FileData, null, nextComm, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = snes; - } - else - { - core = CoreInventory.Instance["SGB", "SameBoy"]; - } - } - break; - case "A78": - var gamedbpath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb_a7800.csv"); - nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpath, GetCoreSettings(), GetCoreSyncSettings()); - break; - case "C64": - var c64 = new C64(nextComm, Enumerable.Repeat(rom.FileData, 1), rom.GameInfo, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = c64; - break; - case "ZXSpectrum": - var zx = new ZXSpectrum(nextComm, - Enumerable.Repeat(rom.RomData, 1), - Enumerable.Repeat(rom.GameInfo, 1).ToList(), - GetCoreSettings(), - GetCoreSyncSettings(), - Deterministic); - nextEmulator = zx; - break; - case "AmstradCPC": - var cpc = new AmstradCPC(nextComm, Enumerable.Repeat(rom.RomData, 1), Enumerable.Repeat(rom.GameInfo, 1).ToList(), GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = cpc; - break; - case "GBA": - if (Global.Config.GBA_UsemGBA) - { - core = CoreInventory.Instance["GBA", "mGBA"]; - } - else - { - core = CoreInventory.Instance["GBA", "VBA-Next"]; - } - - break; - case "PSX": - nextEmulator = new Octoshock(nextComm, null, null, rom.FileData, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator.CoreComm.RomStatusDetails = "PSX etc."; - break; - case "GEN": - if (Global.Config.CoreForcingViaGameDB && game.ForcedCore?.ToLower() == "pico") - { - core = CoreInventory.Instance["GEN", "PicoDrive"]; - } - else - { - core = CoreInventory.Instance["GEN", "Genplus-gx"]; - } - - break; - case "32X": - core = CoreInventory.Instance["GEN", "PicoDrive"]; - break; - } - - if (core != null) - { - // use coreinventory - nextEmulator = core.Create(nextComm, game, rom.RomData, rom.FileData, Deterministic, GetCoreSettings(core.Type), GetCoreSyncSettings(core.Type)); - } - } - - if (nextEmulator == null) - { - if (!cancel) - { - DoLoadErrorCallback("No core could load the rom.", null); - } - - return false; - } - } - catch (Exception ex) - { - string system = null; - if (game != null) - { - system = game.System; - } - - // all of the specific exceptions we're trying to catch here aren't expected to have inner exceptions, - // so drill down in case we got a TargetInvocationException or something like that - while (ex.InnerException != null) - { - ex = ex.InnerException; - } - - // Specific hack here, as we get more cores of the same system, this isn't scalable - if (ex is UnsupportedGameException) - { - if (system == "NES") - { - DoMessageCallback("Unable to use quicknes, using NESHawk instead"); - } - - return LoadRom(path, nextComm, true, recursiveCount + 1); - } - else if (ex is MissingFirmwareException) - { - DoLoadErrorCallback(ex.Message, system, path, Deterministic, LoadErrorType.MissingFirmware); - } - else if (ex is CGBNotSupportedException) - { - // failed to load SGB bios or game does not support SGB mode. - // To avoid catch-22, disable SGB mode - Global.Config.GB_AsSGB = false; - DoMessageCallback("Failed to load a GB rom in SGB mode. Disabling SGB Mode."); - return LoadRom(path, nextComm, false, recursiveCount + 1); - } - - // handle exceptions thrown by the new detected systems that bizhawk does not have cores for - else if (ex is NoAvailableCoreException) - { - DoLoadErrorCallback(ex.Message + "\n\n" + ex, system); - } - - else - { - DoLoadErrorCallback("A core accepted the rom, but threw an exception while loading it:\n\n" + ex, system); - } - - return false; - } - - Rom = rom; - LoadedEmulator = nextEmulator; - Game = game; - return true; - } - } - } -} diff --git a/BizHawk.Client.Common/SaveSlotManager.cs b/BizHawk.Client.Common/SaveSlotManager.cs deleted file mode 100644 index 5996ac4a9c..0000000000 --- a/BizHawk.Client.Common/SaveSlotManager.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.IO; -using System.Linq; - -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public class SaveSlotManager - { - private readonly bool[] _slots = new bool[10]; - private readonly bool[] _redo = new bool[10]; - - public SaveSlotManager() - { - Update(); - } - - public void Update() - { - if (Global.Game == null || Global.Emulator == null) - { - for (int i = 0; i < 10; i++) - { - _slots[i] = false; - } - - return; - } - - for (int i = 0; i < 10; i++) - { - var file = new FileInfo( - PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave" + i + ".State"); - if (file.Directory != null && file.Directory.Exists == false) - { - file.Directory.Create(); - } - - _slots[i] = file.Exists; - } - } - - public bool HasSavestateSlots - { - get - { - if (!Global.Emulator.HasSavestates()) - { - return false; - } - - Update(); - return _slots.Any(slot => slot); - } - } - - public bool HasSlot(int slot) - { - if (!Global.Emulator.HasSavestates()) - { - return false; - } - - if (slot < 0 || slot > 10) - { - return false; - } - - Update(); - return _slots[slot]; - } - - public void ClearRedoList() - { - for (int i = 0; i < 10; i++) - { - _redo[i] = false; - } - } - - public void ToggleRedo(int slot) - { - if (slot < 0 || slot > 9) - { - return; - } - - _redo[slot] ^= true; - } - - public bool IsRedo(int slot) - { - if (slot < 0 || slot > 9) - { - return false; - } - - return _redo[slot]; - } - - public void Clear() - { - ClearRedoList(); - Update(); - } - - public void SwapBackupSavestate(string path) - { - // Takes the .state and .bak files and swaps them - var state = new FileInfo(path); - var backup = new FileInfo(path + ".bak"); - var temp = new FileInfo(path + ".bak.tmp"); - - if (!state.Exists || !backup.Exists) - { - return; - } - - if (temp.Exists) - { - temp.Delete(); - } - - backup.CopyTo(path + ".bak.tmp"); - backup.Delete(); - state.CopyTo(path + ".bak"); - state.Delete(); - temp.CopyTo(path); - temp.Delete(); - - ToggleRedo(Global.Config.SaveSlot); - } - } -} diff --git a/BizHawk.Client.Common/SavestateManager.cs b/BizHawk.Client.Common/SavestateManager.cs deleted file mode 100644 index 8f250bc135..0000000000 --- a/BizHawk.Client.Common/SavestateManager.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Common.BufferExtensions; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public static class SavestateManager - { - public static void SaveStateFile(string filename, string name) - { - var core = Global.Emulator.AsStatable(); - - // the old method of text savestate save is now gone. - // a text savestate is just like a binary savestate, but with a different core lump - using (var bs = new BinaryStateSaver(filename)) - { - if (Global.Config.SaveStateType == Config.SaveStateTypeE.Text || - (Global.Config.SaveStateType == Config.SaveStateTypeE.Default && !core.BinarySaveStatesPreferred)) - { - // text savestate format - using (new SimpleTime("Save Core")) - { - bs.PutLump(BinaryStateLump.CorestateText, (tw) => core.SaveStateText(tw)); - } - } - else - { - // binary core lump format - using (new SimpleTime("Save Core")) - { - bs.PutLump(BinaryStateLump.Corestate, bw => core.SaveStateBinary(bw)); - } - } - - if (Global.Config.SaveScreenshotWithStates && Global.Emulator.HasVideoProvider()) - { - var vp = Global.Emulator.AsVideoProvider(); - var buff = vp.GetVideoBuffer(); - if (buff.Length == 1) - { - // is a hacky opengl texture ID. can't handle this now! - // need to discuss options - // 1. cores must be able to provide a pixels videoprovider in addition to a texture ID, on command (not very hard overall but interface changing and work per core) - // 2. SavestateManager must be setup with a mechanism for resolving texture IDs (even less work, but sloppy) - // There are additional problems with AVWriting. They depend on VideoProvider providing pixels. - } - else - { - int out_w = vp.BufferWidth; - int out_h = vp.BufferHeight; - - // if buffer is too big, scale down screenshot - if (!Global.Config.NoLowResLargeScreenshotWithStates && buff.Length >= Global.Config.BigScreenshotSize) - { - out_w /= 2; - out_h /= 2; - } - - using (new SimpleTime("Save Framebuffer")) - { - bs.PutLump(BinaryStateLump.Framebuffer, s => QuickBmpFile.Save(Global.Emulator.AsVideoProvider(), s, out_w, out_h)); - } - } - } - - if (Global.MovieSession.Movie.IsActive) - { - bs.PutLump(BinaryStateLump.Input, - delegate(TextWriter tw) - { - // this never should have been a core's responsibility - tw.WriteLine("Frame {0}", Global.Emulator.Frame); - Global.MovieSession.HandleMovieSaveState(tw); - }); - } - - if (Global.UserBag.Any()) - { - bs.PutLump(BinaryStateLump.UserData, - delegate(TextWriter tw) - { - var data = ConfigService.SaveWithType(Global.UserBag); - tw.WriteLine(data); - }); - } - - if (Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie is TasMovie) - { - bs.PutLump(BinaryStateLump.LagLog, - delegate(BinaryWriter bw) - { - (Global.MovieSession.Movie as TasMovie).TasLagLog.Save(bw); - }); - } - } - } - - public static void PopulateFramebuffer(BinaryReader br) - { - if (!Global.Emulator.HasVideoProvider()) - { - return; - } - - try - { - using (new SimpleTime("Load Framebuffer")) - { - QuickBmpFile.Load(Global.Emulator.AsVideoProvider(), br.BaseStream); - } - } - catch - { - var buff = Global.Emulator.AsVideoProvider().GetVideoBuffer(); - try - { - for (int i = 0; i < buff.Length; i++) - { - int j = br.ReadInt32(); - buff[i] = j; - } - } - catch (EndOfStreamException) - { - } - } - } - - public static void PopulateFramebuffer(byte[] bytes) - { - using (var ms = new MemoryStream(bytes)) - { - using (var br = new BinaryReader(ms)) - { - PopulateFramebuffer(br); - } - } - } - - public static bool LoadStateFile(string path, string name) - { - var core = Global.Emulator.AsStatable(); - - // try to detect binary first - var bl = BinaryStateLoader.LoadAndDetect(path); - if (bl != null) - { - try - { - var succeed = false; - - if (Global.MovieSession.Movie.IsActive) - { - bl.GetLump(BinaryStateLump.Input, true, tr => succeed = Global.MovieSession.HandleMovieLoadState_HackyStep1(tr)); - if (!succeed) - { - return false; - } - - bl.GetLump(BinaryStateLump.Input, true, tr => succeed = Global.MovieSession.HandleMovieLoadState_HackyStep2(tr)); - if (!succeed) - { - return false; - } - } - - using (new SimpleTime("Load Core")) - { - bl.GetCoreState(br => core.LoadStateBinary(br), tr => core.LoadStateText(tr)); - } - - bl.GetLump(BinaryStateLump.Framebuffer, false, PopulateFramebuffer); - - string userData = ""; - bl.GetLump(BinaryStateLump.UserData, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - userData = line; - } - } - }); - - if (!string.IsNullOrWhiteSpace(userData)) - { - Global.UserBag = (Dictionary)ConfigService.LoadWithType(userData); - } - - if (Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie is TasMovie) - { - bl.GetLump(BinaryStateLump.LagLog, false, delegate(BinaryReader br, long length) - { - ((TasMovie)Global.MovieSession.Movie).TasLagLog.Load(br); - }); - } - } - finally - { - bl.Dispose(); - } - - return true; - } - else - { - return false; - } - } - } -} diff --git a/BizHawk.Client.Common/SevenZipSharpArchiveHandler.cs b/BizHawk.Client.Common/SevenZipSharpArchiveHandler.cs deleted file mode 100644 index 59222db47b..0000000000 --- a/BizHawk.Client.Common/SevenZipSharpArchiveHandler.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Collections.Generic; -using System.IO; - -using BizHawk.Common; - -namespace BizHawk.Client.Common -{ - /// - /// Implementation of IHawkFileArchiveHandler using SevenZipSharp pure managed code - /// - public class SevenZipSharpArchiveHandler : IHawkFileArchiveHandler - { - private SevenZip.SevenZipExtractor _extractor; - - public void Dispose() - { - if (_extractor != null) - { - _extractor.Dispose(); - _extractor = null; - } - } - - public bool CheckSignature(string fileName, out int offset, out bool isExecutable) - { - SevenZip.FileChecker.ThrowExceptions = false; - return SevenZip.FileChecker.CheckSignature(fileName, out offset, out isExecutable) != SevenZip.InArchiveFormat.None; - } - - public IHawkFileArchiveHandler Construct(string path) - { - var ret = new SevenZipSharpArchiveHandler(); - ret.Open(path); - return ret; - } - - private void Open(string path) - { - _extractor = new SevenZip.SevenZipExtractor(path); - } - - public List Scan() - { - var ret = new List(); - for (int i = 0; i < _extractor.ArchiveFileData.Count; i++) - { - var afd = _extractor.ArchiveFileData[i]; - if (afd.IsDirectory) - { - continue; - } - - var ai = new HawkFileArchiveItem - { - Name = HawkFile.Util_FixArchiveFilename(afd.FileName), - Size = (long)afd.Size, ArchiveIndex = i, Index = ret.Count - }; - - ret.Add(ai); - } - - return ret; - } - - public void ExtractFile(int index, Stream stream) - { - _extractor.ExtractFile(index, stream); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/SevenZipWriter.cs b/BizHawk.Client.Common/SevenZipWriter.cs deleted file mode 100644 index de14457e9f..0000000000 --- a/BizHawk.Client.Common/SevenZipWriter.cs +++ /dev/null @@ -1,409 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using System.Threading; - -namespace BizHawk.Client.Common -{ - public class SevenZipWriter : IZipWriter - { - private class RangBuffer - { - private const int Len = 4096; - private const int Mask = 4095; - - private readonly byte[] _buff = new byte[Len]; - - private readonly object _sharedlock = new object(); - private readonly ManualResetEvent _full = new ManualResetEvent(true); - private readonly ManualResetEvent _empty = new ManualResetEvent(false); - - private int _wpos; - private int _rpos; - - private bool _writeclosed; - private bool _readclosed; - - public Stream W { get; } - public Stream R { get; } - - public RangBuffer() - { - W = new WStream(this); - R = new RStream(this); - } - - public int ReadByte() - { - // slow, but faster than using the other overload with byte[1] - while (true) - { - _empty.WaitOne(); - lock (_sharedlock) - { - if (_rpos != _wpos) - { - byte ret = _buff[_rpos++]; - _rpos &= Mask; - _full.Set(); - return ret; - } - else if (_writeclosed) - { - return -1; - } - else - { - _empty.Reset(); - } - } - } - } - - public int Read(byte[] buffer, int offset, int count) - { - int ret = 0; - while (count > 0) - { - _empty.WaitOne(); - lock (_sharedlock) - { - int start = _rpos; - int end = _wpos; - if (end < start) // wrap - { - end = Len; - } - - if (end - start > count) - { - end = start + count; - } - - int c = end - start; - if (c > 0) - { - Buffer.BlockCopy(_buff, start, buffer, offset, c); - count -= c; - ret += c; - offset += c; - _rpos = end & Mask; - _full.Set(); - } - else if (_writeclosed) - { - break; - } - else - { - _empty.Reset(); - } - } - } - - return ret; - } - - public void CloseRead() - { - lock (_sharedlock) - { - _readclosed = true; - _full.Set(); - } - } - - public bool WriteByte(byte value) - { - while (true) - { - _full.WaitOne(); - lock (_sharedlock) - { - int next = (_wpos + 1) & Mask; - if (next != _rpos) - { - _buff[_wpos] = value; - _wpos = next; - _empty.Set(); - return true; - } - - if (_readclosed) - { - return false; - } - - _full.Reset(); - } - } - } - - public int Write(byte[] buffer, int offset, int count) - { - int ret = 0; - while (count > 0) - { - _full.WaitOne(); - lock (_sharedlock) - { - int start = _wpos; - int end = (_rpos - 1) & Mask; - if (end < start) // wrap - { - end = Len; - } - - if (end - start > count) - { - end = start + count; - } - - int c = end - start; - if (c > 0) - { - Buffer.BlockCopy(buffer, offset, _buff, start, c); - count -= c; - ret += c; - offset += c; - _wpos = end & Mask; - _empty.Set(); - } - else if (_readclosed) - { - break; - } - else - { - _full.Reset(); - } - } - } - - return ret; - } - - public void CloseWrite() - { - lock (_sharedlock) - { - _writeclosed = true; - _empty.Set(); - } - } - - private class WStream : Stream - { - public override bool CanRead => false; - public override bool CanSeek => false; - public override bool CanWrite => true; - - public override void Flush() { } - public override long Length { get { throw new NotSupportedException(); } } - public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } - public override void SetLength(long value) { throw new NotSupportedException(); } - public override long Position - { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } - } - - private RangBuffer _r; - private long _total; // bytes written so far - public WStream(RangBuffer r) - { - _r = r; - } - - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotSupportedException(); - } - - public override void Write(byte[] buffer, int offset, int count) - { -#if true - int cnt = _r.Write(buffer, offset, count); - _total += cnt; - if (cnt < count) - { - throw new IOException("broken pipe"); - } -#else - int end = offset + count; - while (offset < end) - { - WriteByte(buffer[offset++]); - _total++; - } -#endif - } - - public override void WriteByte(byte value) - { - if (!_r.WriteByte(value)) - { - throw new IOException("broken pipe"); - } - } - - protected override void Dispose(bool disposing) - { - if (disposing && _r != null) - { - _r.CloseWrite(); - _r = null; - } - - base.Dispose(disposing); - } - } - - private class RStream : Stream - { - public override bool CanRead => true; - public override bool CanSeek => false; - public override bool CanWrite => false; - - public override void Flush() { } - public override long Length => 1; // { get { throw new NotSupportedException(); } } - public override long Seek(long offset, SeekOrigin origin) { return 0; } // { throw new NotSupportedException(); } - public override void SetLength(long value) { throw new NotSupportedException(); } - public override long Position - { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } - } - - private RangBuffer _r; - private long _total; // bytes read so far - public RStream(RangBuffer r) - { - _r = r; - } - - public override int Read(byte[] buffer, int offset, int count) - { -#if true - int cnt = _r.Read(buffer, offset, count); - _total += cnt; - return cnt; -#else - int ret = 0; - int end = offset + count; - while (offset < end) - { - int val = ReadByte(); - if (val == -1) - break; - buffer[offset] = (byte)val; - offset++; - ret++; - _total++; - } - return ret; -#endif - } - - public override int ReadByte() - { - return _r.ReadByte(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException(); - } - - protected override void Dispose(bool disposing) - { - if (disposing && _r != null) - { - _r.CloseRead(); - _r = null; - } - - base.Dispose(disposing); - } - } - } - - private readonly SevenZip.SevenZipCompressor _svc; - private readonly string _path; - - private bool _first = true; - private int _compressionlevel; - - public SevenZipWriter(string path, int compressionlevel) - { - _path = path; - _compressionlevel = compressionlevel; - - _svc = new SevenZip.SevenZipCompressor { ArchiveFormat = SevenZip.OutArchiveFormat.Zip }; - - switch (compressionlevel) - { - default: - case 0: - _svc.CompressionLevel = SevenZip.CompressionLevel.None; - break; - case 1: - case 2: - _svc.CompressionLevel = SevenZip.CompressionLevel.Fast; - break; - case 3: - case 4: - _svc.CompressionLevel = SevenZip.CompressionLevel.Low; - break; - case 5: - case 6: - _svc.CompressionLevel = SevenZip.CompressionLevel.Normal; - break; - case 7: - case 8: - _svc.CompressionLevel = SevenZip.CompressionLevel.High; - break; - case 9: - _svc.CompressionLevel = SevenZip.CompressionLevel.Ultra; - break; - } - } - - public void WriteItem(string name, Action callback) - { - var dict = new Dictionary(); - var r = new RangBuffer(); - dict[name] = r.R; - if (_first) - { - _first = false; - _svc.CompressionMode = SevenZip.CompressionMode.Create; - } - else - { - _svc.CompressionMode = SevenZip.CompressionMode.Append; - } - - var task = Task.Factory.StartNew(() => - { - _svc.CompressStreamDictionary(dict, _path); - }); - try - { - callback(r.W); - } - finally - { - r.W.Dispose(); - } - - task.Wait(); - } - - public void Dispose() - { - // nothing to do - } - } -} diff --git a/BizHawk.Client.Common/SharpZipWriter.cs b/BizHawk.Client.Common/SharpZipWriter.cs deleted file mode 100644 index e95acc7e04..0000000000 --- a/BizHawk.Client.Common/SharpZipWriter.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.IO; - -using ICSharpCode.SharpZipLib.Zip; - -namespace BizHawk.Client.Common -{ - public class SharpZipWriter : IZipWriter - { - private readonly int _level; - private ZipOutputStream _zipOutputStream; - - public SharpZipWriter(string path, int compressionlevel) - { - _level = compressionlevel; - _zipOutputStream = new ZipOutputStream(new FileStream(path, FileMode.Create, FileAccess.Write)) - { - IsStreamOwner = true, - UseZip64 = UseZip64.Off - }; - _zipOutputStream.SetLevel(_level); - } - - public void WriteItem(string name, Action callback) - { - var e = new ZipEntry(name) - { - CompressionMethod = _level == 0 ? CompressionMethod.Stored : CompressionMethod.Deflated - }; - - _zipOutputStream.PutNextEntry(e); - callback(_zipOutputStream); - _zipOutputStream.CloseEntry(); - } - - public void Dispose() - { - if (_zipOutputStream != null) - { - _zipOutputStream.Dispose(); - _zipOutputStream = null; - } - } - } -} diff --git a/BizHawk.Client.Common/SystemInfo.cs b/BizHawk.Client.Common/SystemInfo.cs deleted file mode 100644 index dc9e7be92b..0000000000 --- a/BizHawk.Client.Common/SystemInfo.cs +++ /dev/null @@ -1,296 +0,0 @@ -using System.Collections.Generic; -using BizHawk.Client.ApiHawk; - -namespace BizHawk.Client.Common -{ - /// - /// This class holds logic for System information. - /// That means specifications about a system that BizHawk emulates - /// - public sealed class SystemInfo - { - #region Fields - - private const JoypadButton UpDownLeftRight = JoypadButton.Up | JoypadButton.Down | JoypadButton.Left | JoypadButton.Right; - private const JoypadButton StandardButtons = JoypadButton.A | JoypadButton.B | JoypadButton.Start | JoypadButton.Select | UpDownLeftRight; - - private static readonly List _allSystemInfos = new List(); - - #endregion - - #region cTor(s) - - /// - /// Initializes a new instance of the class - /// - /// A that specify how the system name is displayed - /// A that specify what core is used - /// Maximum controller allowed by this system - /// Which buttons are available (i.e. are actually on the controller) for this system - private SystemInfo(string displayName, CoreSystem system, int maxControllers, JoypadButton availableButtons = 0) - { - DisplayName = displayName; - System = system; - MaxControllers = maxControllers; - AvailableButtons = availableButtons; - - _allSystemInfos.Add(this); - } - - #endregion - - #region Methods - - #region Get SystemInfo - - /// - /// Gets the instance for Apple II - /// - public static SystemInfo Libretro { get; } = new SystemInfo("Libretro", CoreSystem.Libretro, 1); - - /// - /// Gets the instance for Apple II - /// - public static SystemInfo AppleII { get; } = new SystemInfo("Apple II", CoreSystem.AppleII, 1); - - /// - /// Gets the instance for Atari 2600 - /// - public static SystemInfo Atari2600 { get; } = new SystemInfo("Atari 2600", CoreSystem.Atari2600, 1); - - /// - /// Gets the instance for Atari 7800 - /// - public static SystemInfo Atari7800 { get; } = new SystemInfo("Atari 7800", CoreSystem.Atari7800, 1); - - /// - /// Gets the instance for Commodore 64 - /// - public static SystemInfo C64 { get; } = new SystemInfo("Commodore 64", CoreSystem.Commodore64, 1); - - /// - /// Gets the instance for Coleco Vision - /// - public static SystemInfo Coleco { get; } = new SystemInfo("ColecoVision", CoreSystem.ColecoVision, 1); - - /// - /// Gets the instance for Dual Gameboy - /// - public static SystemInfo DualGB { get; } = new SystemInfo("Game Boy Link", CoreSystem.DualGameBoy, 2, StandardButtons); - - /// - /// Gets the instance for Gameboy - /// - public static SystemInfo GB { get; } = new SystemInfo("GB", CoreSystem.GameBoy, 1, StandardButtons); - - /// - /// Gets the instance for Gameboy Advance - /// - public static SystemInfo GBA { get; } = new SystemInfo("Gameboy Advance", CoreSystem.GameBoyAdvance, 1, StandardButtons | JoypadButton.L | JoypadButton.R); - - /// - /// Gets the instance for Gameboy Color - /// - public static SystemInfo GBC { get; } = new SystemInfo("Gameboy Color", CoreSystem.GameBoy, 1, StandardButtons); - - /// - /// Gets the instance for Genesis - /// - public static SystemInfo Genesis { get; } = new SystemInfo("Genesis", CoreSystem.Genesis, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z); - - /// - /// Gets the instance for Game Gear - /// - public static SystemInfo GG { get; } = new SystemInfo("Game Gear", CoreSystem.MasterSystem, 1, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2); - - /// - /// Gets the instance for Intellivision - /// - public static SystemInfo Intellivision { get; } = new SystemInfo("Intellivision", CoreSystem.Intellivision, 2); - - /// - /// Gets the instance for Lynx - /// - public static SystemInfo Lynx { get; } = new SystemInfo("Lynx", CoreSystem.Lynx, 1); - - /// - /// Gets the instance for NES - /// - public static SystemInfo Nes { get; } = new SystemInfo("NES", CoreSystem.NES, 2, StandardButtons); - - /// - /// Gets the instance for Nintendo 64 - /// - public static SystemInfo N64 { get; } = new SystemInfo("Nintendo 64", CoreSystem.Nintendo64, 4, StandardButtons ^ JoypadButton.Select | JoypadButton.Z | JoypadButton.CUp | JoypadButton.CDown | JoypadButton.CLeft | JoypadButton.CRight | JoypadButton.AnalogStick | JoypadButton.L | JoypadButton.R); - - /// - /// Gets the instance for Null (i.e. nothing is emulated) emulator - /// - public static SystemInfo Null { get; } = new SystemInfo("", CoreSystem.Null, 0); - - /// - /// Gets the instance for PCEngine (TurboGrafx-16) - /// - public static SystemInfo PCE { get; } = new SystemInfo("TurboGrafx-16", CoreSystem.PCEngine, 1); - - /// - /// Gets the instance for PCEngine (TurboGrafx-16) + CD - /// - public static SystemInfo PCECD { get; } = new SystemInfo("TurboGrafx - 16(CD)", CoreSystem.PCEngine, 1); - - /// - /// Gets the instance for PlayStation - /// - public static SystemInfo PSX { get; } = new SystemInfo("PlayStation", CoreSystem.Playstation, 2); - - /// - /// Gets the instance for Sega Saturn - /// - public static SystemInfo Saturn { get; } = new SystemInfo("Saturn", CoreSystem.Saturn, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z); - - /// - /// Gets the instance for SG-1000 (Sega Game 1000) - /// - public static SystemInfo SG { get; } = new SystemInfo("SG-1000", CoreSystem.MasterSystem, 1); - - /// - /// Gets the instance for PCEngine (Supergraph FX) - /// - public static SystemInfo SGX { get; } = new SystemInfo("SuperGrafx", CoreSystem.PCEngine, 1); - - /// - /// Gets the instance for Sega Master System - /// - public static SystemInfo SMS { get; } = new SystemInfo("Sega Master System", CoreSystem.MasterSystem, 2, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2); - - /// - /// Gets the instance for SNES - /// - public static SystemInfo SNES { get; } = new SystemInfo("SNES", CoreSystem.SNES, 8, StandardButtons | JoypadButton.X | JoypadButton.Y | JoypadButton.L | JoypadButton.R); - - /// - /// Gets the instance for TI-83 - /// - public static SystemInfo TI83 { get; } = new SystemInfo("TI - 83", CoreSystem.TI83, 1); - - /// - /// Gets the instance for Wonderswan - /// - public static SystemInfo WonderSwan { get; } = new SystemInfo("WonderSwan", CoreSystem.WonderSwan, 1); - - /// - /// Gets the instance for Virtual Boy - /// - public static SystemInfo VirtualBoy { get; } = new SystemInfo("Virtual Boy", CoreSystem.VirtualBoy, 1); - - /// - /// Gets the instance for TI-83 - /// - public static SystemInfo NeoGeoPocket { get; } = new SystemInfo("Neo-Geo Pocket", CoreSystem.NeoGeoPocket, 1); - - /// - /// Gets the instance for ZXSpectrum - /// - public static SystemInfo ZXSpectrum { get; } = new SystemInfo("ZX Spectrum", CoreSystem.ZXSpectrum, 2); - - /// - /// Gets the instance for AmstradCPC - /// - public static SystemInfo AmstradCPC { get; } = new SystemInfo("Amstrad CPC", CoreSystem.AmstradCPC, 2); - - #endregion Get SystemInfo - - /// - /// Get a by its - /// - /// you're looking for - /// - public static SystemInfo FindByCoreSystem(CoreSystem system) - { - return _allSystemInfos.Find(s => s.System == system); - } - - /// - /// Determine if this is equal to specified - /// - /// to compare to - /// True if object is equal to this instance; otherwise, false - public override bool Equals(object obj) - { - if (obj is SystemInfo) - { - return this == (SystemInfo)obj; - } - - return base.Equals(obj); - } - - /// - /// Gets the haschode for current instance - /// - /// This instance hashcode - public override int GetHashCode() - { - return base.GetHashCode(); - } - - /// - /// Returns a representation of current - /// In fact, return the same as DisplayName property - /// - public override string ToString() - { - return DisplayName; - } - - /// - /// Determine if two are equals. - /// As it is all static instance, it just compare their reference - /// - /// First - /// Second - /// True if both system are equals; otherwise, false - public static bool operator ==(SystemInfo system1, SystemInfo system2) - { - return ReferenceEquals(system1, system2); - } - - /// - /// Determine if two are different. - /// As it is all static instance, it just compare their reference - /// - /// First - /// Second - /// True if both system are different; otherwise, false - public static bool operator !=(SystemInfo system1, SystemInfo system2) - { - return !(system1 == system2); - } - - #endregion - - #region Properties - - /// - /// Gets available for this system - /// - public JoypadButton AvailableButtons { get; } - - /// - /// Gets the system name as - /// - public string DisplayName { get; } - - /// - /// Gets the maximum amount of controller allowed for this system - /// - public int MaxControllers { get; } - - /// - /// Gets core used for this system as enum - /// - public CoreSystem System { get; } - - #endregion - } -} diff --git a/BizHawk.Client.Common/XmlGame.cs b/BizHawk.Client.Common/XmlGame.cs deleted file mode 100644 index 27022fdc9f..0000000000 --- a/BizHawk.Client.Common/XmlGame.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Xml; - -using BizHawk.Common; -using BizHawk.Common.BufferExtensions; -using BizHawk.Common.IOExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class XmlGame - { - public XmlDocument Xml { get; set; } - public GameInfo GI { get; } = new GameInfo(); - public IList> Assets { get; } = new List>(); - public IList AssetFullPaths { get; } = new List(); // TODO: Hack work around, to avoid having to refactor Assets into a object array, should be refactored! - - public static XmlGame Create(HawkFile f) - { - try - { - var x = new XmlDocument(); - x.Load(f.GetStream()); - var y = x.SelectSingleNode("./BizHawk-XMLGame"); - if (y == null) - { - return null; - } - - var ret = new XmlGame - { - GI = - { - System = y.Attributes["System"].Value, - Name = y.Attributes["Name"].Value, - Status = RomStatus.Unknown - }, - Xml = x - }; - string fullpath = ""; - - var n = y.SelectSingleNode("./LoadAssets"); - if (n != null) - { - var hashStream = new MemoryStream(); - int? originalIndex = null; - - foreach (XmlNode a in n.ChildNodes) - { - string filename = a.Attributes["FileName"].Value; - byte[] data = new byte[0]; - if (filename[0] == '|') - { - // in same archive - var ai = f.FindArchiveMember(filename.Substring(1)); - if (ai != null) - { - if (originalIndex == null) - { - originalIndex = f.GetBoundIndex(); - } - - f.Unbind(); - f.BindArchiveMember(ai); - data = f.GetStream().ReadAllBytes(); - } - else - { - throw new Exception("Couldn't load XMLGame Asset \"" + filename + "\""); - } - } - else - { - // relative path - fullpath = Path.GetDirectoryName(f.CanonicalFullPath.Split('|').First()) ?? ""; - fullpath = Path.Combine(fullpath, filename.Split('|').First()); - try - { - using (var hf = new HawkFile(fullpath)) - { - if (hf.IsArchive) - { - var archiveItem = hf.ArchiveItems.First(ai => ai.Name == filename.Split('|').Skip(1).First()); - hf.Unbind(); - hf.BindArchiveMember(archiveItem); - data = hf.GetStream().ReadAllBytes(); - - filename = filename.Split('|').Skip(1).First(); - } - else - { - data = File.ReadAllBytes(fullpath.Split('|').First()); - } - } - } - catch - { - throw new Exception("Couldn't load XMLGame LoadAsset \"" + filename + "\""); - } - } - - ret.Assets.Add(new KeyValuePair(filename, data)); - ret.AssetFullPaths.Add(fullpath); - using (var sha1 = System.Security.Cryptography.SHA1.Create()) - { - sha1.TransformFinalBlock(data, 0, data.Length); - hashStream.Write(sha1.Hash, 0, sha1.Hash.Length); - } - } - - ret.GI.Hash = hashStream.GetBuffer().HashSHA1(0, (int)hashStream.Length); - hashStream.Close(); - if (originalIndex != null) - { - f.Unbind(); - f.BindArchiveMember((int)originalIndex); - } - } - else - { - ret.GI.Hash = "0000000000000000000000000000000000000000"; - } - - return ret; - } - catch (Exception ex) - { - throw new InvalidOperationException(ex.ToString()); - } - } - } -} diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs deleted file mode 100644 index b7f72ab639..0000000000 --- a/BizHawk.Client.Common/config/Config.cs +++ /dev/null @@ -1,573 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; - -using BizHawk.Emulation.Common; - -// ReSharper disable FieldCanBeMadeReadOnly.Global -// ReSharper disable InconsistentNaming -// ReSharper disable StyleCop.SA1310 -// ReSharper disable StyleCop.SA1401 -namespace BizHawk.Client.Common -{ - public class Config - { - public static string ControlDefaultPath - { - get { return PathManager.MakeProgramRelativePath("defctrl.json"); } - } - - public void ConfigCheckAllControlDefaults() - { - if (AllTrollers.Count == 0 && AllTrollersAutoFire.Count == 0 && AllTrollersAnalog.Count == 0) - { - var cd = ConfigService.Load(ControlDefaultPath); - AllTrollers = cd.AllTrollers; - AllTrollersAutoFire = cd.AllTrollersAutoFire; - AllTrollersAnalog = cd.AllTrollersAnalog; - } - } - - public Config() - { - ConfigCheckAllControlDefaults(); - } - - public void ResolveDefaults() - { - PathEntries.ResolveWithDefaults(); - HotkeyBindings.ResolveWithDefaults(); - PathManager.RefreshTempPath(); - } - - // Core preference for generic file extension, key: file extension, value: a systemID or empty if no preference - public Dictionary PreferredPlatformsForExtensions = new Dictionary - { - { ".bin", "" }, - { ".rom", "" }, - { ".iso", "" }, - { ".img", "" }, - { ".cue", "" } - }; - - // Path Settings ************************************/ - public bool UseRecentForROMs = false; - public string LastRomPath = "."; - public PathEntryCollection PathEntries = new PathEntryCollection(); - - // BIOS Paths - public Dictionary FirmwareUserSpecifications = new Dictionary(); // key: sysid+firmwareId; value: absolute path - - // General Client Settings - public int Input_Hotkey_OverrideOptions = 0; - public bool StackOSDMessages = true; - public int TargetZoomFactor = 2; - - // TODO: move me - public class ToomFactors : Dictionary - { - public new int this[string index] - { - get - { - if (!ContainsKey(index)) - { - Add(index, 2); - } - - return base[index]; - } - - set - { - base[index] = value; - } - } - } - - public ToomFactors TargetZoomFactors = new ToomFactors(); - - public int TargetScanlineFilterIntensity = 128; // choose between 0 and 256 - public int TargetDisplayFilter = 0; - public int DispFinalFilter = 0; // None - public string DispUserFilterPath = ""; - public RecentFiles RecentRoms = new RecentFiles(10); - public RecentFiles RecentRomSessions = new RecentFiles(8); // Only used for MultiHawk - public bool PauseWhenMenuActivated = true; - public bool SaveWindowPosition = true; - public bool StartPaused = false; - public bool StartFullscreen = false; - public int MainWndx = -1; // Negative numbers will be ignored - public int MainWndy = -1; - public int MainWidth = -1; - public int MainHeight = -1; - public bool RunInBackground = true; - public bool AcceptBackgroundInput = false; - public bool SingleInstanceMode = false; - public bool AllowUD_LR = false; - public bool ForbidUD_LR = false; - public bool ShowContextMenu = true; - public bool EnableBackupMovies = true; - public bool MoviesOnDisk = false; - public bool MoviesInAWE = false; - public bool HotkeyConfigAutoTab = true; - public bool InputConfigAutoTab = true; - public bool ShowLogWindow = false; - public bool BackupSavestates = true; - public bool SaveScreenshotWithStates = true; - public int BigScreenshotSize = 128 * 1024; - public bool NoLowResLargeScreenshotWithStates = false; - public int AutofireOn = 1; - public int AutofireOff = 1; - public bool AutofireLagFrames = true; - public int SaveSlot = 0; // currently selected savestate slot - public bool AutoLoadLastSaveSlot = false; - public bool WIN32_CONSOLE = true; - public bool SkipLagFrame = false; - public bool SupressAskSave = false; - public bool AVI_CaptureOSD = false; - public bool Screenshot_CaptureOSD = false; - public bool FirstBoot = true; - public bool Update_AutoCheckEnabled = false; - public DateTime? Update_LastCheckTimeUTC = null; - public string Update_LatestVersion = ""; - public string Update_IgnoreVersion = ""; - public bool CDLAutoSave = true, CDLAutoStart = true, CDLAutoResume = true; - - /// - /// Makes a .bak file before any saveram-writing operation (could be extended to make timestamped backups) - /// - public bool BackupSaveram = true; - - /// - /// Whether to make AutoSave files at periodic intervals - /// - public bool AutosaveSaveRAM; - - /// - /// Intervals at which to make AutoSave files - /// - public int FlushSaveRamFrames; - - //check CurrentDomain_AssemblyResolve if you change the defaults or name of this key - public bool UseNLua = true; // Whether or not to use a good, reliable, memory-leak-free lua interface that is slower than the original luainterface - - ////public bool TurboSeek = true; // When PauseOnFrame is set, this will decide whether the client goes into turbo mode or not - - private bool _turboSeek; - public bool TurboSeek - { - get - { - return _turboSeek; - } - - set - { - _turboSeek = value; - } - } - - public enum EDispMethod - { - OpenGL, GdiPlus, SlimDX9 - } - - public enum ESoundOutputMethod - { - DirectSound, XAudio2, OpenAL, Dummy - } - - public enum EDispManagerAR - { - None, - System, - - // actually, custom SIZE (fixme on major release) - Custom, - CustomRatio - } - - public enum SaveStateTypeE - { - Default, Binary, Text - } - - public MovieEndAction MovieEndAction = MovieEndAction.Finish; - - public enum ClientProfile - { - Unknown = 0, - Casual = 1, - Longplay = 2, - Tas = 3, - N64Tas = 4, - Custom = 99 - } - - public ClientProfile SelectedProfile = ClientProfile.Unknown; - - // N64 - public bool N64UseCircularAnalogConstraint = true; - - // Run-Control settings - public int FrameProgressDelayMs = 500; // how long until a frame advance hold turns into a frame progress? - public int FrameSkip = 4; - public int SpeedPercent = 100; - public int SpeedPercentAlternate = 400; - public bool ClockThrottle = true; - public bool AutoMinimizeSkipping = true; - public bool VSyncThrottle = false; - - // Rewind settings - public bool Rewind_UseDelta = true; - public bool RewindEnabledSmall = true; - public bool RewindEnabledMedium = false; - public bool RewindEnabledLarge = false; - public int RewindFrequencySmall = 1; - public int RewindFrequencyMedium = 4; - public int RewindFrequencyLarge = 60; - public int Rewind_MediumStateSize = 262144; // 256kb - public int Rewind_LargeStateSize = 1048576; // 1mb - public int Rewind_BufferSize = 128; // in mb - public bool Rewind_OnDisk = false; - public bool Rewind_IsThreaded = Environment.ProcessorCount > 1; - public int RewindSpeedMultiplier = 1; - - // Savestate settings - public SaveStateTypeE SaveStateType = SaveStateTypeE.Default; - public const int DefaultSaveStateCompressionLevelNormal = 1; - public int SaveStateCompressionLevelNormal = DefaultSaveStateCompressionLevelNormal; - public const int DefaultSaveStateCompressionLevelRewind = 0; // this isnt actually used yet - public int SaveStateCompressionLevelRewind = DefaultSaveStateCompressionLevelRewind; // this isnt actually used yet - public int MovieCompressionLevel = 2; - - /// - /// Use vsync when presenting all 3d accelerated windows. - /// For the main window, if VSyncThrottle = false, this will try to use vsync without throttling to it - /// - public bool VSync = false; - - /// - /// Tries to use an alternate vsync mechanism, for video cards that just can't do it right - /// - public bool DispAlternateVsync = false; - - public static class DefaultMessageOptions - { - public const int - DispFPSx = 0, - DispFPSy = 0, - DispFrameCx = 0, - DispFrameCy = 14, - DispLagx = 0, - DispLagy = 42, - DispInpx = 0, - DispInpy = 28, - DispRecx = 0, - DispRecy = 56, - DispMultix = 0, - DispMultiy = 14, - DispMessagex = 3, - DispMessagey = 0, - DispAutoholdx = 0, - DispAutoholdy = 0, - DispRamWatchx = 0, - DispRamWatchy = 70, - - MessagesColor = -1, - AlertMessageColor = -65536, - LastInputColor = -23296, - MovieInput = -8355712, - - DispFPSanchor = 0, // 0 = UL, 1 = UR, 2 = DL, 3 = DR - DispFrameanchor = 0, - DispLaganchor = 0, - DispInpanchor = 0, - DispWatchAnchor = 0, - DispRecanchor = 0, - DispMultianchor = 1, - DispMessageanchor = 2, - DispAutoholdanchor = 1; - } - - // Display options - public bool DisplayFPS = false; - public bool DisplayFrameCounter = false; - public bool DisplayLagCounter = false; - public bool DisplayInput = false; - public bool DisplayRerecordCount = false; - public bool DisplayMessages = true; - - public bool DispFixAspectRatio = true; - public bool DispFixScaleInteger = false; - public bool DispFullscreenHacks = true; - public bool DispAutoPrescale = true; - public int DispSpeedupFeatures = 2; - - public int DispFPSx = DefaultMessageOptions.DispFPSx; - public int DispFPSy = DefaultMessageOptions.DispFPSy; - public int DispFrameCx = DefaultMessageOptions.DispFrameCx; - public int DispFrameCy = DefaultMessageOptions.DispFrameCy; - public int DispLagx = DefaultMessageOptions.DispLagx; - public int DispLagy = DefaultMessageOptions.DispLagy; - public int DispInpx = DefaultMessageOptions.DispInpx; - public int DispInpy = DefaultMessageOptions.DispInpy; - public int DispRecx = DefaultMessageOptions.DispRecx; - public int DispRecy = DefaultMessageOptions.DispRecy; - public int DispMultix = DefaultMessageOptions.DispMultix; - public int DispMultiy = DefaultMessageOptions.DispMultiy; - public int DispRamWatchx = DefaultMessageOptions.DispRamWatchx; - public int DispRamWatchy = DefaultMessageOptions.DispRamWatchy; - public int DispMessagex = DefaultMessageOptions.DispMessagex; - public int DispMessagey = DefaultMessageOptions.DispMessagey; - public int DispAutoholdx = DefaultMessageOptions.DispAutoholdx; - public int DispAutoholdy = DefaultMessageOptions.DispAutoholdy; - - public int DispFPSanchor = DefaultMessageOptions.DispFPSanchor; // 0 = UL, 1 = UR, 2 = DL, 3 = DR - public int DispFrameanchor = DefaultMessageOptions.DispFrameanchor; - public int DispLaganchor = DefaultMessageOptions.DispLaganchor; - public int DispInpanchor = DefaultMessageOptions.DispInpanchor; - public int DispWatchesanchor = DefaultMessageOptions.DispWatchAnchor; - public int DispRecanchor = DefaultMessageOptions.DispRecanchor; - public int DispMultianchor = DefaultMessageOptions.DispMultianchor; - public int DispMessageanchor = DefaultMessageOptions.DispMessageanchor; - public int DispAutoholdanchor = DefaultMessageOptions.DispAutoholdanchor; - - public int MessagesColor = DefaultMessageOptions.MessagesColor; - public int AlertMessageColor = DefaultMessageOptions.AlertMessageColor; - public int LastInputColor = DefaultMessageOptions.LastInputColor; - public int MovieInput = DefaultMessageOptions.MovieInput; - - public int DispPrescale = 1; - - // warning: we dont even want to deal with changing this at runtime. but we want it changed here for config purposes. so dont check this variable. check in GlobalWin or something like that. - public EDispMethod DispMethod = EDispMethod.SlimDX9; - - public int DispChrome_FrameWindowed = 2; - public bool DispChrome_StatusBarWindowed = true; - public bool DispChrome_CaptionWindowed = true; - public bool DispChrome_MenuWindowed = true; - public bool DispChrome_StatusBarFullscreen = false; - public bool DispChrome_MenuFullscreen = false; - public bool DispChrome_Fullscreen_AutohideMouse = true; - public bool DispChrome_AllowDoubleClickFullscreen = true; - - public EDispManagerAR DispManagerAR = EDispManagerAR.System; - - // these are misnomers. they're actually a fixed size (fixme on major release) - public int DispCustomUserARWidth = -1; - public int DispCustomUserARHeight = -1; - - // these are more like the actual AR ratio (i.e. 4:3) (fixme on major release) - public float DispCustomUserARX = -1; - public float DispCustomUserARY = -1; - - // Sound options -#if WINDOWS - public ESoundOutputMethod SoundOutputMethod = ESoundOutputMethod.DirectSound; -#else - public ESoundOutputMethod SoundOutputMethod = ESoundOutputMethod.OpenAL; -#endif - public bool SoundEnabled = true; - public bool SoundEnabledNormal = true; - public bool SoundEnabledRWFF = true; - public bool MuteFrameAdvance = true; - public int SoundVolume = 100; // Range 0-100 - public int SoundVolumeRWFF = 50; // Range 0-100 - public bool SoundThrottle = false; - public string SoundDevice = ""; - public int SoundBufferSizeMs = 100; - - // Log Window - public bool LogWindowSaveWindowPosition = true; - public int LogWindowWndx = -1; - public int LogWindowWndy = -1; - public int LogWindowWidth = -1; - public int LogWindowHeight = -1; - - // Lua - public RecentFiles RecentLua = new RecentFiles(8); - public RecentFiles RecentLuaSession = new RecentFiles(8); - public bool DisableLuaScriptsOnLoad = false; - public bool ToggleAllIfNoneSelected = true; - public bool RemoveRegisteredFunctionsOnToggle = true; - public bool LuaReloadOnScriptFileChange = false; - public bool RunLuaDuringTurbo = true; - - // Watch Settings - public RecentFiles RecentWatches = new RecentFiles(8); - public PreviousType RamWatchDefinePrevious = PreviousType.LastFrame; - public bool DisplayRamWatch = false; - - // Hex Editor Colors - public Color HexBackgrndColor = Color.FromName("Control"); - public Color HexForegrndColor = Color.FromName("ControlText"); - public Color HexMenubarColor = Color.FromName("Control"); - public Color HexFreezeColor = Color.LightBlue; - public Color HexHighlightColor = Color.Pink; - public Color HexHighlightFreezeColor = Color.Violet; - - // Video dumping settings - public string VideoWriter = ""; - public int JMDCompression = 3; - public int JMDThreads = 3; - public string FFmpegFormat = ""; - public string FFmpegCustomCommand = "-c:a foo -c:v bar -f baz"; - public string AVICodecToken = ""; - public int GifWriterFrameskip = 3; - public int GifWriterDelay = -1; - public bool VideoWriterAudioSync = true; - - #region emulation core settings - - public Dictionary CoreSettings = new Dictionary(); - public Dictionary CoreSyncSettings = new Dictionary(); - - public object GetCoreSettings() - where T : IEmulator - { - return GetCoreSettings(typeof(T)); - } - - public object GetCoreSettings(Type t) - { - object ret; - CoreSettings.TryGetValue(t.ToString(), out ret); - return ret; - } - - public void PutCoreSettings(object o) - where T : IEmulator - { - PutCoreSettings(o, typeof(T)); - } - - public void PutCoreSettings(object o, Type t) - { - if (o != null) - { - CoreSettings[t.ToString()] = o; - } - else - { - CoreSettings.Remove(t.ToString()); - } - } - - public object GetCoreSyncSettings() - where T : IEmulator - { - return GetCoreSyncSettings(typeof(T)); - } - - public object GetCoreSyncSettings(Type t) - { - object ret; - CoreSyncSettings.TryGetValue(t.ToString(), out ret); - return ret; - } - - public void PutCoreSyncSettings(object o) - where T : IEmulator - { - PutCoreSyncSettings(o, typeof(T)); - } - - public void PutCoreSyncSettings(object o, Type t) - { - if (o != null) - { - CoreSyncSettings[t.ToString()] = o; - } - else - { - CoreSyncSettings.Remove(t.ToString()); - } - } - - #endregion - - public Dictionary CommonToolSettings = new Dictionary(); - public Dictionary> CustomToolSettings = new Dictionary>(); - - // Cheats - public bool DisableCheatsOnLoad = false; - public bool LoadCheatFileByGame = true; - public bool CheatsAutoSaveOnClose = true; - public RecentFiles RecentCheats = new RecentFiles(8); - - // TAStudio - public TasStateManagerSettings DefaultTasProjSettings = new TasStateManagerSettings(); - - // Macro Tool - public RecentFiles RecentMacros = new RecentFiles(8); - - // Movie Settings - public RecentFiles RecentMovies = new RecentFiles(8); - public string DefaultAuthor = "default user"; - public bool UseDefaultAuthor = true; - public bool DisplaySubtitles = true; - public bool VBAStyleMovieLoadState = false; - public bool MoviePlaybackPokeMode = false; - - // Play Movie Dialog - public bool PlayMovie_IncludeSubdir = false; - public bool PlayMovie_MatchHash = true; - - // TI83 - public ToolDialogSettings TI83KeypadSettings = new ToolDialogSettings(); - public bool TI83autoloadKeyPad = true; - public bool TI83ToolTips = true; - - public BindingCollection HotkeyBindings = new BindingCollection(); - - // Analog Hotkey values - public int Analog_LargeChange = 10; - public int Analog_SmallChange = 1; - - public struct AnalogBind - { - /// the physical stick that we're bound to - public string Value; - - /// sensitivity and flip - public float Mult; - - /// portion of axis to ignore - public float Deadzone; - - public AnalogBind(string value, float mult, float deadzone) - { - Value = value; - Mult = mult; - Deadzone = deadzone; - } - } - - // [ControllerType][ButtonName] => Physical Bind - public Dictionary> AllTrollers = new Dictionary>(); - public Dictionary> AllTrollersAutoFire = new Dictionary>(); - public Dictionary> AllTrollersAnalog = new Dictionary>(); - - // Core Pick - // as this setting spans multiple cores and doesn't actually affect the behavior of any core, - // it hasn't been absorbed into the new system - public bool GB_AsSGB = false; - public bool NES_InQuickNES = true; - public bool SNES_InSnes9x = true; - public bool GBA_UsemGBA = true; - public bool SGB_UseBsnes = false; - public bool GB_UseGBHawk = false; - public bool CoreForcingViaGameDB = true; - public string LibretroCore; - } - - // These are used in the defctrl.json or wherever - public class ControlDefaults - { - public Dictionary> AllTrollers = new Dictionary>(); - public Dictionary> AllTrollersAutoFire = new Dictionary>(); - public Dictionary> AllTrollersAnalog = new Dictionary>(); - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/config/ConfigPersistAttribute.cs b/BizHawk.Client.Common/config/ConfigPersistAttribute.cs deleted file mode 100644 index 1cbd45ab39..0000000000 --- a/BizHawk.Client.Common/config/ConfigPersistAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Define if the property has to be persisted in config - /// - [AttributeUsage(AttributeTargets.Property)] - public class ConfigPersistAttribute : Attribute - { - } -} diff --git a/BizHawk.Client.Common/config/ConfigService.cs b/BizHawk.Client.Common/config/ConfigService.cs deleted file mode 100644 index d8e0037b8d..0000000000 --- a/BizHawk.Client.Common/config/ConfigService.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -#pragma warning disable 618 - -namespace BizHawk.Client.Common -{ - public static class ConfigService - { - private static readonly JsonSerializer Serializer; - - static ConfigService() - { - Serializer = new JsonSerializer - { - MissingMemberHandling = MissingMemberHandling.Ignore, - MissingTypeHandling = MissingTypeHandling.Ignore, - TypeNameHandling = TypeNameHandling.Auto, - ConstructorHandling = ConstructorHandling.Default, - - // because of the peculiar setup of Binding.cs and PathEntry.cs - ObjectCreationHandling = ObjectCreationHandling.Replace, - - ContractResolver = new DefaultContractResolver - { - DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic - }, - }; - } - - public static T Load(string filepath) where T : new() - { - T config = default(T); - - try - { - var file = new FileInfo(filepath); - if (file.Exists) - { - using (var reader = file.OpenText()) - { - var r = new JsonTextReader(reader); - config = (T)Serializer.Deserialize(r, typeof(T)); - } - } - } - catch (Exception ex) - { - throw new InvalidOperationException("Config Error", ex); - } - - if (config == null) - { - return new T(); - } - - return config; - } - - public static void Save(string filepath, object config) - { - var file = new FileInfo(filepath); - try - { - using (var writer = file.CreateText()) - { - var w = new JsonTextWriter(writer) { Formatting = Formatting.Indented }; - Serializer.Serialize(w, config); - } - } - catch - { - /* Eat it */ - } - } - - // movie 1.0 header stuff - private class TypeNameEncapsulator - { - public object o; - } - - public static object LoadWithType(string serialized) - { - using (TextReader tr = new StringReader(serialized)) - using (JsonTextReader jr = new JsonTextReader(tr)) - { - TypeNameEncapsulator tne = (TypeNameEncapsulator)Serializer.Deserialize(jr, typeof(TypeNameEncapsulator)); - - // in the case of trying to deserialize nothing, tne will be nothing - // we want to return nothing - return tne?.o; - } - } - - public static string SaveWithType(object o) - { - using (StringWriter sw = new StringWriter()) - using (JsonTextWriter jw = new JsonTextWriter(sw) { Formatting = Formatting.None }) - { - TypeNameEncapsulator tne = new TypeNameEncapsulator { o = o }; - Serializer.Serialize(jw, tne, typeof(TypeNameEncapsulator)); - sw.Flush(); - return sw.ToString(); - } - } - } -} diff --git a/BizHawk.Client.Common/config/PathEntry.cs b/BizHawk.Client.Common/config/PathEntry.cs deleted file mode 100644 index 9b6b710212..0000000000 --- a/BizHawk.Client.Common/config/PathEntry.cs +++ /dev/null @@ -1,387 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace BizHawk.Client.Common -{ - public class PathEntry - { - public string SystemDisplayName { get; set; } - public string Type { get; set; } - public string Path { get; set; } - public string System { get; set; } - public int Ordinal { get; set; } - - public bool HasSystem(string systemID) - { - if (systemID == System) - { - return true; - } - - return System.Split('_').Contains(systemID); - } - } - - [Newtonsoft.Json.JsonObject] - public class PathEntryCollection : IEnumerable - { - public List Paths { get; } - - public PathEntryCollection() - { - Paths = new List(); - Paths.AddRange(DefaultValues); - } - - [Newtonsoft.Json.JsonConstructor] - public PathEntryCollection(List paths) - { - Paths = paths; - } - - public void Add(PathEntry p) - { - Paths.Add(p); - } - - public IEnumerator GetEnumerator() - { - return Paths.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public PathEntry this[string system, string type] - { - get - { - return Paths.FirstOrDefault(p => p.HasSystem(system) && p.Type == type) ?? TryGetDebugPath(system, type); - } - } - - private PathEntry TryGetDebugPath(string system, string type) - { - if (Paths.Any(p => p.HasSystem(system))) - { - // we have the system, but not the type. don't attempt to add an unknown type - return null; - } - - // we don't have anything for the system in question. add a set of stock paths - var systempath = PathManager.RemoveInvalidFileSystemChars(system) + "_INTERIM"; - var systemdisp = system + " (INTERIM)"; - - Paths.AddRange(new[] - { - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Base", Path = Path.Combine(".", systempath), Ordinal = 0 }, - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 } - }); - - return this[system, type]; - } - - public void ResolveWithDefaults() - { - // Add missing entries - foreach (PathEntry defaultpath in DefaultValues) - { - var path = Paths.FirstOrDefault(p => p.System == defaultpath.System && p.Type == defaultpath.Type); - if (path == null) - { - Paths.Add(defaultpath); - } - } - - List entriesToRemove = new List(); - - // Remove entries that no longer exist in defaults - foreach (PathEntry pathEntry in Paths) - { - var path = DefaultValues.FirstOrDefault(p => p.System == pathEntry.System && p.Type == pathEntry.Type); - if (path == null) - { - entriesToRemove.Add(pathEntry); - } - } - - foreach (PathEntry entry in entriesToRemove) - { - Paths.Remove(entry); - } - - // Add missing displaynames - var missingDisplayPaths = Paths.Where(p => p.SystemDisplayName == null).ToList(); - foreach (PathEntry path in missingDisplayPaths) - { - path.SystemDisplayName = DefaultValues.First(p => p.System == path.System).SystemDisplayName; - } - } - - private static string ResolveToolsPath(string subPath) - { - if (Path.IsPathRooted(subPath) || subPath.StartsWith("%")) - { - return subPath; - } - - var toolsPath = Global.Config.PathEntries["Global", "Tools"].Path; - - // Hack for backwards compatibility, prior to 1.11.5, .wch files were in .\Tools, we don't want that to turn into .Tools\Tools - if (subPath == "Tools") - { - return toolsPath; - } - - return Path.Combine(toolsPath, subPath); - } - - // Some frequently requested paths, made into a property for convenience - public string ToolsPathFragment => Global.Config.PathEntries["Global", "Tools"].Path; - - public string WatchPathFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Watch (.wch)"].Path); - - public string MultiDiskBundlesFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Multi-Disk Bundles"].Path); - - public string LogPathFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Debug Logs"].Path); - - public string MoviesPathFragment => Global.Config.PathEntries["Global", "Movies"].Path; - - public string MoviesBackupsPathFragment => Global.Config.PathEntries["Global", "Movie backups"].Path; - - public string LuaPathFragment => Global.Config.PathEntries["Global", "Lua"].Path; - - public string FirmwaresPathFragment => Global.Config.PathEntries["Global", "Firmware"].Path; - - public string AvPathFragment => Global.Config.PathEntries["Global", "A/V Dumps"].Path; - - public string GlobalRomFragment => Global.Config.PathEntries["Global", "ROM"].Path; - - public string TempFilesFragment => Global.Config.PathEntries["Global", "Temp Files"].Path; - - // this one is special - public string GlobalBaseFragment => Global.Config.PathEntries["Global", "Base"].Path; - - public static List DefaultValues => new List - { - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Base", Path = ".", Ordinal = 1 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "ROM", Path = ".", Ordinal = 2 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Firmware", Path = Path.Combine(".", "Firmware"), Ordinal = 3 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Movies", Path = Path.Combine(".", "Movies"), Ordinal = 4 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Movie backups", Path = Path.Combine(".", "Movies", "backup"), Ordinal = 5 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "A/V Dumps", Path = ".", Ordinal = 6 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Tools", Path = Path.Combine(".", "Tools"), Ordinal = 7 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Lua", Path = Path.Combine(".", "Lua"), Ordinal = 8 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Watch (.wch)", Path = Path.Combine(".", "."), Ordinal = 9 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Debug Logs", Path = Path.Combine(".", ""), Ordinal = 10 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Macros", Path = Path.Combine(".", "Movies", "Macros"), Ordinal = 11 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "TAStudio states", Path = Path.Combine(".", "Movies", "TAStudio states"), Ordinal = 12 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Multi-Disk Bundles", Path = Path.Combine(".", ""), Ordinal = 13 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "External Tools", Path = Path.Combine(".", "ExternalTools"), Ordinal = 14 }, - new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Temp Files", Path = "", Ordinal = 15 }, - - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Base", Path = Path.Combine(".", "Intellivision"), Ordinal = 0 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 }, - - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Base", Path = Path.Combine(".", "NES"), Ordinal = 0 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 }, - - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Base", Path = Path.Combine(".", "SNES"), Ordinal = 0 }, - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Base", Path = Path.Combine(".", "GBA"), Ordinal = 0 }, - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Base", Path = Path.Combine(".", "SMS"), Ordinal = 0 }, - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Base", Path = Path.Combine(".", "Game Gear"), Ordinal = 0 }, - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Base", Path = Path.Combine(".", "SG-1000"), Ordinal = 0 }, - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Base", Path = Path.Combine(".", "Genesis"), Ordinal = 0 }, - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Base", Path = Path.Combine(".", "PC Engine"), Ordinal = 0 }, - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Base", Path = Path.Combine(".", "Gameboy"), Ordinal = 0 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 }, - - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Base", Path = Path.Combine(".", "Dual Gameboy"), Ordinal = 0 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 }, - - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Base", Path = Path.Combine(".", "TI83"), Ordinal = 0 }, - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Base", Path = Path.Combine(".", "Atari 2600"), Ordinal = 0 }, - new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Base", Path = Path.Combine(".", "Atari 7800"), Ordinal = 0 }, - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Base", Path = Path.Combine(".", "C64"), Ordinal = 0 }, - new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "ZXSpectrum", SystemDisplayName = "Sinclair ZX Spectrum", Type = "Base", Path = Path.Combine(".", "ZXSpectrum"), Ordinal = 0 }, - new PathEntry { System = "ZXSpectrum", SystemDisplayName = "Sinclair ZX Spectrum", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "ZXSpectrum", SystemDisplayName = "Sinclair ZX Spectrum", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "ZXSpectrum", SystemDisplayName = "Sinclair ZX Spectrum", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "ZXSpectrum", SystemDisplayName = "Sinclair ZX Spectrum", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "AmstradCPC", SystemDisplayName = "Amstrad CPC", Type = "Base", Path = Path.Combine(".", "AmstradCPC"), Ordinal = 0 }, - new PathEntry { System = "AmstradCPC", SystemDisplayName = "Amstrad CPC", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "AmstradCPC", SystemDisplayName = "Amstrad CPC", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "AmstradCPC", SystemDisplayName = "Amstrad CPC", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "AmstradCPC", SystemDisplayName = "Amstrad CPC", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Base", Path = Path.Combine(".", "PSX"), Ordinal = 0 }, - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Base", Path = Path.Combine(".", "Coleco"), Ordinal = 0 }, - new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Base", Path = Path.Combine(".", "N64"), Ordinal = 0 }, - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Base", Path = Path.Combine(".", "Saturn"), Ordinal = 0 }, - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Base", Path = Path.Combine(".", "WonderSwan"), Ordinal = 0 }, - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Base", Path = Path.Combine(".", "Lynx"), Ordinal = 0 }, - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Base", Path = Path.Combine(".", "Apple II"), Ordinal = 0 }, - new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Base", Path = Path.Combine(".", "Libretro"), Ordinal = 0 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cores", Path = Path.Combine(".", "Cores"), Ordinal = 1 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "System", Path = Path.Combine(".", "System"), Ordinal = 2 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 3 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 4 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 5 }, - new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 6 }, - - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "Base", Path = Path.Combine(".", "VB"), Ordinal = 0 }, - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "VB", SystemDisplayName = "VB", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "Base", Path = Path.Combine(".", "NGP"), Ordinal = 0 }, - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "NGP", SystemDisplayName = "NGP", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "Base", Path = Path.Combine(".", "PCFX"), Ordinal = 0 }, - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "ROM", Path = ".", Ordinal = 1 }, - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 }, - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 }, - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 }, - new PathEntry { System = "PCFX", SystemDisplayName = "PCFX", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }, - }; - } -} diff --git a/BizHawk.Client.Common/config/ToolDialogSettings.cs b/BizHawk.Client.Common/config/ToolDialogSettings.cs deleted file mode 100644 index 0ca9e031a2..0000000000 --- a/BizHawk.Client.Common/config/ToolDialogSettings.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; - -using Newtonsoft.Json; - -namespace BizHawk.Client.Common -{ - public class ToolDialogSettings - { - private int? _wndx; - private int? _wndy; - - public ToolDialogSettings() - { - SaveWindowPosition = true; - FloatingWindow = true; - } - - public void RestoreDefaults() - { - _wndx = null; - _wndy = null; - SaveWindowPosition = true; - FloatingWindow = true; - TopMost = false; - AutoLoad = false; - Width = null; - Height = null; - } - - [JsonIgnore] - public int? Wndx - { - get - { - return _wndx; - } - - set - { - if (value != -32000) - { - _wndx = value; - } - } - } - - [JsonIgnore] - public int? Wndy - { - get - { - return _wndy; - } - - set - { - if (value != -32000) - { - _wndy = value; - } - } - } - - /// - /// Gets a value that represents the top left corner coordinate, if and form a valid point - /// Throws an InvalidOperationException if or is null - /// It is expected to check for this before using this property - /// - [JsonIgnore] - public Point TopLeft - { - get - { - if (_wndx.HasValue && _wndy.HasValue) - { - return new Point(_wndx.Value, _wndy.Value); - } - - throw new InvalidOperationException("TopLeft can not be used when one of the coordinates is null"); - } - } - - public int? Width { get; set; } - public int? Height { get; set; } - - public bool SaveWindowPosition { get; set; } - public bool TopMost { get; set; } - public bool FloatingWindow { get; set; } - public bool AutoLoad { get; set; } - - [JsonIgnore] - public bool UseWindowPosition => SaveWindowPosition && Wndx.HasValue - && Wndy.HasValue - && Wndx != -32000 && Wndy != -32000; - - [JsonIgnore] - public bool UseWindowSize => SaveWindowPosition && Width.HasValue && Height.HasValue; - - [JsonIgnore] - public Point WindowPosition => new Point(Wndx ?? 0, Wndy ?? 0); - - [JsonIgnore] - public Size WindowSize => new Size(Width ?? 0, Height ?? 0); - - public class ColumnList : List - { - public Column this[string name] - { - get - { - return this.FirstOrDefault(c => c.Name == name); - } - } - } - - public class Column - { - public string Name { get; set; } - public int Width { get; set; } - public bool Visible { get; set; } - public int Index { get; set; } - } - } -} diff --git a/BizHawk.Client.Common/inputAdapters/ClickyVirtualPadController.cs b/BizHawk.Client.Common/inputAdapters/ClickyVirtualPadController.cs deleted file mode 100644 index 2157fa6d17..0000000000 --- a/BizHawk.Client.Common/inputAdapters/ClickyVirtualPadController.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Collections.Generic; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// Will hold buttons for 1 frame and then release them. - /// (Calling Click() from your button click is what you want to do) - /// TODO - should the duration be controllable? - /// - public class ClickyVirtualPadController : IController - { - public ControllerDefinition Definition { get; set; } - - public bool IsPressed(string button) - { - return _pressed.Contains(button); - } - - public float GetFloat(string name) - { - return 0.0f; - } - - /// - /// Call this once per frame to do the timekeeping for the hold and release - /// - public void FrameTick() - { - _pressed.Clear(); - } - - /// - /// Call this to hold the button down for one frame - /// - public void Click(string button) - { - _pressed.Add(button); - } - - public void Unclick(string button) - { - _pressed.Remove(button); - } - - public void Toggle(string button) - { - if (IsPressed(button)) - { - _pressed.Remove(button); - } - else - { - _pressed.Add(button); - } - } - - public void SetBool(string button, bool value) - { - if (value) - { - _pressed.Remove(button); - } - else - { - _pressed.Add(button); - } - } - - private readonly HashSet _pressed = new HashSet(); - } -} diff --git a/BizHawk.Client.Common/inputAdapters/CopyController.cs b/BizHawk.Client.Common/inputAdapters/CopyController.cs deleted file mode 100644 index e1be847648..0000000000 --- a/BizHawk.Client.Common/inputAdapters/CopyController.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// Just copies source to sink, or returns whatever a NullController would if it is disconnected. useful for immovable hard-points. - /// - public class CopyControllerAdapter : IController - { - public ControllerDefinition Definition => Curr.Definition; - - public bool IsPressed(string button) - { - return Curr.IsPressed(button); - } - - public float GetFloat(string name) - { - return Curr.GetFloat(name); - } - - public IController Source { get; set; } - - private IController Curr => Source ?? NullController.Instance; - } -} diff --git a/BizHawk.Client.Common/inputAdapters/InputManager.cs b/BizHawk.Client.Common/inputAdapters/InputManager.cs deleted file mode 100644 index 91647cac6a..0000000000 --- a/BizHawk.Client.Common/inputAdapters/InputManager.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common.InputAdapterExtensions; - -namespace BizHawk.Client.Common -{ - public static class InputManager - { - public static void RewireInputChain() - { - Global.ControllerInputCoalescer.Clear(); - Global.ControllerInputCoalescer.Definition = Global.ActiveController.Definition; - - Global.UD_LR_ControllerAdapter.Source = Global.ActiveController.Or(Global.AutoFireController); - - Global.StickyXORAdapter.Source = Global.UD_LR_ControllerAdapter; - Global.AutofireStickyXORAdapter.Source = Global.StickyXORAdapter; - - Global.MultitrackRewiringAdapter.Source = Global.AutofireStickyXORAdapter; - Global.MovieInputSourceAdapter.Source = Global.MultitrackRewiringAdapter; - Global.ControllerOutput.Source = Global.MovieOutputHardpoint; - - Global.MovieSession.MovieControllerAdapter.Definition = Global.MovieInputSourceAdapter.Definition; - - // connect the movie session before MovieOutputHardpoint if it is doing anything - // otherwise connect the MovieInputSourceAdapter to it, effectively bypassing the movie session - if (Global.MovieSession != null) - { - Global.MovieOutputHardpoint.Source = Global.MovieSession.MovieControllerAdapter; - } - else - { - Global.MovieOutputHardpoint.Source = Global.MovieInputSourceAdapter; - } - } - - public static void SyncControls() - { - var def = Global.Emulator.ControllerDefinition; - - Global.ActiveController = BindToDefinition(def, Global.Config.AllTrollers, Global.Config.AllTrollersAnalog); - Global.AutoFireController = BindToDefinitionAF(def, Global.Emulator, Global.Config.AllTrollersAutoFire); - - // allow propogating controls that are in the current controller definition but not in the prebaked one - // these two lines shouldn't be required anymore under the new system? - Global.ActiveController.ForceType(new ControllerDefinition(def)); - Global.ClickyVirtualPadController.Definition = new ControllerDefinition(def); - RewireInputChain(); - } - - private static Controller BindToDefinition(ControllerDefinition def, IDictionary> allbinds, IDictionary> analogbinds) - { - var ret = new Controller(def); - Dictionary binds; - if (allbinds.TryGetValue(def.Name, out binds)) - { - foreach (var cbutton in def.BoolButtons) - { - string bind; - if (binds.TryGetValue(cbutton, out bind)) - { - ret.BindMulti(cbutton, bind); - } - } - } - - Dictionary abinds; - if (analogbinds.TryGetValue(def.Name, out abinds)) - { - foreach (var cbutton in def.FloatControls) - { - Config.AnalogBind bind; - if (abinds.TryGetValue(cbutton, out bind)) - { - ret.BindFloat(cbutton, bind); - } - } - } - - return ret; - } - - private static AutofireController BindToDefinitionAF(ControllerDefinition def, IEmulator emulator, IDictionary> allbinds) - { - var ret = new AutofireController(def, emulator); - Dictionary binds; - if (allbinds.TryGetValue(def.Name, out binds)) - { - foreach (var cbutton in def.BoolButtons) - { - string bind; - if (binds.TryGetValue(cbutton, out bind)) - { - ret.BindMulti(cbutton, bind); - } - } - } - - return ret; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/inputAdapters/OverrideAdaptor.cs b/BizHawk.Client.Common/inputAdapters/OverrideAdaptor.cs deleted file mode 100644 index 2fc25a4ad8..0000000000 --- a/BizHawk.Client.Common/inputAdapters/OverrideAdaptor.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// Used to pass into an Override method to manage the logic overriding input - /// This only works with bool buttons! - /// - public class OverrideAdaptor : IController - { - public ControllerDefinition Definition { get; private set; } - - private readonly Dictionary _overrides = new Dictionary(); - private readonly Dictionary _floatOverrides = new Dictionary(); - private readonly List _inverses = new List(); - - public bool IsPressed(string button) - { - if (_overrides.ContainsKey(button)) - { - return _overrides[button]; - } - - throw new InvalidOperationException(); - } - - public float GetFloat(string name) - { - if (_floatOverrides.ContainsKey(name)) - { - return _floatOverrides[name]; - } - - return 0.0F; - } - - public IEnumerable Overrides - { - get - { - foreach (var kvp in _overrides) - { - yield return kvp.Key; - } - } - } - - public IEnumerable FloatOverrides - { - get - { - foreach (var kvp in _floatOverrides) - { - yield return kvp.Key; - } - } - } - - public IEnumerable InversedButtons - { - get - { - foreach (var name in _inverses) - { - yield return name; - } - } - } - - public void SetFloat(string name, float value) - { - if (_floatOverrides.ContainsKey(name)) - { - _floatOverrides[name] = value; - } - else - { - _floatOverrides.Add(name, value); - } - } - - public void SetButton(string button, bool value) - { - if (_overrides.ContainsKey(button)) - { - _overrides[button] = value; - } - else - { - _overrides.Add(button, value); - } - - _inverses.Remove(button); - } - - public void UnSet(string button) - { - _overrides.Remove(button); - _inverses.Remove(button); - } - - public void SetInverse(string button) - { - _inverses.Add(button); - } - - public void FrameTick() - { - _overrides.Clear(); - _floatOverrides.Clear(); - _inverses.Clear(); - } - } -} diff --git a/BizHawk.Client.Common/inputAdapters/SimpleController.cs b/BizHawk.Client.Common/inputAdapters/SimpleController.cs deleted file mode 100644 index e38fb133db..0000000000 --- a/BizHawk.Client.Common/inputAdapters/SimpleController.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// A basic implementation of IController - /// - public class SimpleController : IController - { - public ControllerDefinition Definition { get; set; } - - protected WorkingDictionary Buttons { get; private set; } = new WorkingDictionary(); - protected WorkingDictionary Floats { get; private set; } = new WorkingDictionary(); - - public void Clear() - { - Buttons = new WorkingDictionary(); - Floats = new WorkingDictionary(); - } - - public bool this[string button] - { - get { return Buttons[button]; } - set { Buttons[button] = value; } - } - - public virtual bool IsPressed(string button) - { - return this[button]; - } - - public float GetFloat(string name) - { - return Floats[name]; - } - - public IEnumerable> BoolButtons() - { - return Buttons; - } - - public void AcceptNewFloats(IEnumerable> newValues) - { - foreach (var sv in newValues) - { - Floats[sv.Item1] = sv.Item2; - } - } - } -} diff --git a/BizHawk.Client.Common/inputAdapters/StickyAdapters.cs b/BizHawk.Client.Common/inputAdapters/StickyAdapters.cs deleted file mode 100644 index bf663c38df..0000000000 --- a/BizHawk.Client.Common/inputAdapters/StickyAdapters.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public interface ISticky : IController - { - bool StickyIsInEffect(string button); - } - - /// - /// Used by input display, to determine if either autofire or regular stickies - /// are "in effect" because we color this scenario differently - /// - public class StickyOrAdapter : IController - { - public ControllerDefinition Definition => Source.Definition; - - public bool IsPressed(string button) - { - return Source.StickyIsInEffect(button) - || SourceStickyOr.StickyIsInEffect(button); - } - - // pass floats solely from the original source - // this works in the code because SourceOr is the autofire controller - public float GetFloat(string name) - { - int i = Source.Definition.FloatControls.IndexOf(name); - return Source.Definition.FloatRanges[i].Mid; // Floats don't make sense in sticky land - } - - public ISticky Source { get; set; } - public ISticky SourceStickyOr { get; set; } - } - - public class StickyXorAdapter : ISticky, IController - { - /// - /// Determines if a sticky is current mashing the button itself, - /// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false - /// - public bool StickyIsInEffect(string button) - { - if (IsSticky(button)) - { - return !Source.IsPressed(button); - } - - return false; - } - - public ControllerDefinition Definition => Source.Definition; - - public bool IsPressed(string button) - { - var source = Source.IsPressed(button); - source ^= _stickySet.Contains(button); - return source; - } - - public float GetFloat(string name) - { - var val = _floatSet[name]; - - if (val.HasValue) - { - return val.Value; - } - - if (Source == null) - { - return 0; - } - - return Source.GetFloat(name); - } - - public IController Source { get; set; } - - private List _justPressed = new List(); - - private readonly HashSet _stickySet = new HashSet(); - - // if SetFloat() is called (typically virtual pads), then that float will entirely override the Source input - // otherwise, the source is passed thru. - private readonly WorkingDictionary _floatSet = new WorkingDictionary(); - - public void SetFloat(string name, float? value) - { - if (value.HasValue) - { - _floatSet[name] = value; - } - else - { - _floatSet.Remove(name); - } - } - - public void ClearStickyFloats() - { - _floatSet.Clear(); - } - - public void SetSticky(string button, bool isSticky) - { - if (isSticky) - { - _stickySet.Add(button); - } - else - { - _stickySet.Remove(button); - } - } - - public void Unset(string button) - { - _stickySet.Remove(button); - _floatSet.Remove(button); - } - - public bool IsSticky(string button) - { - return _stickySet.Contains(button); - } - - public HashSet CurrentStickies => _stickySet; - - public void ClearStickies() - { - _stickySet.Clear(); - _floatSet.Clear(); - } - - public void MassToggleStickyState(List buttons) - { - foreach (var button in buttons.Where(button => !_justPressed.Contains(button))) - { - if (_stickySet.Contains(button)) - { - _stickySet.Remove(button); - } - else - { - _stickySet.Add(button); - } - } - - _justPressed = buttons; - } - } - - public class AutoFireStickyXorAdapter : ISticky, IController - { - /// - /// Determines if a sticky is current mashing the button itself, - /// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false - /// - public bool StickyIsInEffect(string button) - { - if (IsSticky(button)) - { - return !Source.IsPressed(button); - } - - return false; - } - - public ControllerDefinition Definition => Source.Definition; - - public bool IsPressed(string button) - { - var source = Source.IsPressed(button); - bool patternValue = false; - if (_boolPatterns.ContainsKey(button)) - { - // I can't figure a way to determine right here if it should Peek or Get. - patternValue = _boolPatterns[button].PeekNextValue(); - } - - source ^= patternValue; - - return source; - } - - public float GetFloat(string name) - { - if (_floatPatterns.ContainsKey(name)) - { - return _floatPatterns[name].PeekNextValue(); - } - - if (Source == null) - { - return 0; - } - - return Source.GetFloat(name); - } - - // TODO: Change the AutoHold adapter to be one of these, with an 'Off' value of 0? - // Probably would have slightly lower performance, but it seems weird to have such a similar class that is only used once. - private int _on; - private int _off; - - public void SetOnOffPatternFromConfig() - { - _on = Global.Config.AutofireOn < 1 ? 0 : Global.Config.AutofireOn; - _off = Global.Config.AutofireOff < 1 ? 0 : Global.Config.AutofireOff; - } - - private readonly WorkingDictionary _boolPatterns = new WorkingDictionary(); - private readonly WorkingDictionary _floatPatterns = new WorkingDictionary(); - - public AutoFireStickyXorAdapter() - { - _on = 1; - _off = 1; - } - - public IController Source { get; set; } - - public void SetFloat(string name, float? value, AutoPatternFloat pattern = null) - { - if (value.HasValue) - { - if (pattern == null) - { - pattern = new AutoPatternFloat(value.Value, _on, 0, _off); - } - - _floatPatterns[name] = pattern; - } - else - { - _floatPatterns.Remove(name); - } - } - - public void SetSticky(string button, bool isSticky, AutoPatternBool pattern = null) - { - if (isSticky) - { - if (pattern == null) - { - pattern = new AutoPatternBool(_on, _off); - } - - _boolPatterns[button] = pattern; - } - else - { - _boolPatterns.Remove(button); - } - } - - public bool IsSticky(string button) - { - return _boolPatterns.ContainsKey(button) || _floatPatterns.ContainsKey(button); - } - - public HashSet CurrentStickies => new HashSet(_boolPatterns.Keys); - - public void ClearStickies() - { - _boolPatterns.Clear(); - _floatPatterns.Clear(); - } - - public void IncrementLoops(bool lagged) - { - for (int i = 0; i < _boolPatterns.Count; i++) - { - _boolPatterns.ElementAt(i).Value.GetNextValue(lagged); - } - - for (int i = 0; i < _floatPatterns.Count; i++) - { - _floatPatterns.ElementAt(i).Value.GetNextValue(lagged); - } - } - - private List _justPressed = new List(); - - public void MassToggleStickyState(List buttons) - { - foreach (var button in buttons.Where(button => !_justPressed.Contains(button))) - { - SetSticky(button, !_boolPatterns.ContainsKey(button)); - } - - _justPressed = buttons; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs deleted file mode 100644 index e5f8a0e37b..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.ComponentModel; - -using NLua; - -namespace BizHawk.Client.Common -{ - [Description("A library for performing standard bitwise operations.")] - public sealed class BitLuaLibrary : LuaLibraryBase - { - public BitLuaLibrary(Lua lua) - : base(lua) { } - - public BitLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "bit"; - - [LuaMethodExample("local uibitban = bit.band( 1000, 4 );")] - [LuaMethod("band", "Bitwise AND of 'val' against 'amt'")] - public static uint Band(uint val, uint amt) - { - return val & amt; - } - - [LuaMethodExample("local uibitbno = bit.bnot( 1000 );")] - [LuaMethod("bnot", "Bitwise NOT of 'val' against 'amt'")] - public static uint Bnot(uint val) - { - return ~val; - } - - [LuaMethodExample("local uibitbor = bit.bor( 1000, 4 );")] - [LuaMethod("bor", "Bitwise OR of 'val' against 'amt'")] - public static uint Bor(uint val, uint amt) - { - return val | amt; - } - - [LuaMethodExample("local uibitbxo = bit.bxor( 1000, 4 );")] - [LuaMethod("bxor", "Bitwise XOR of 'val' against 'amt'")] - public static uint Bxor(uint val, uint amt) - { - return val ^ amt; - } - - [LuaMethodExample("local uibitlsh = bit.lshift( 1000, 4 );")] - [LuaMethod("lshift", "Logical shift left of 'val' by 'amt' bits")] - public static uint Lshift(uint val, int amt) - { - return val << amt; - } - - [LuaMethodExample("local uibitrol = bit.rol( 1000, 4 );")] - [LuaMethod("rol", "Left rotate 'val' by 'amt' bits")] - public static uint Rol(uint val, int amt) - { - return (val << amt) | (val >> (32 - amt)); - } - - [LuaMethodExample("local uibitror = bit.ror( 1000, 4 );")] - [LuaMethod("ror", "Right rotate 'val' by 'amt' bits")] - public static uint Ror(uint val, int amt) - { - return (val >> amt) | (val << (32 - amt)); - } - - [LuaMethodExample("local uibitrsh = bit.rshift( 1000, 4 );")] - [LuaMethod("rshift", "Logical shift right of 'val' by 'amt' bits")] - public static uint Rshift(uint val, int amt) - { - return (uint)(val >> amt); - } - - [LuaMethodExample("local inbitars = bit.arshift( -1000, 4 );")] - [LuaMethod("arshift", "Arithmetic shift right of 'val' by 'amt' bits")] - public static int Arshift(int val, int amt) - { - return val >> amt; - } - - [LuaMethodExample("if ( bit.check( -12345, 35 ) ) then\r\n\tconsole.log( \"Returns result of bit 'pos' being set in 'num'\" );\r\nend;")] - [LuaMethod("check", "Returns result of bit 'pos' being set in 'num'")] - public static bool Check(long num, int pos) - { - return (num & (1 << pos)) != 0; - } - - [LuaMethodExample("local uibitset = bit.set( 25, 35 );")] - [LuaMethod("set", "Sets the bit 'pos' in 'num'")] - public static uint Set(uint num, int pos) - { - return (uint)(num | (uint)1 << pos); - } - - [LuaMethodExample("local lobitcle = bit.clear( 25, 35 );")] - [LuaMethod("clear", "Clears the bit 'pos' in 'num'")] - public static long Clear(uint num, int pos) - { - return num & ~(1 << pos); - } - - [LuaMethodExample("local usbitbyt = bit.byteswap_16( 100 );")] - [LuaMethod("byteswap_16", "Byte swaps 'short', i.e. bit.byteswap_16(0xFF00) would return 0x00FF")] - public static ushort Byteswap16(ushort val) - { - return (ushort)((val & 0xFFU) << 8 | (val & 0xFF00U) >> 8); - } - - [LuaMethodExample("local uibitbyt = bit.byteswap_32( 1000 );")] - [LuaMethod("byteswap_32", "Byte swaps 'dword'")] - public static uint Byteswap32(uint val) - { - return (val & 0x000000FFU) << 24 | (val & 0x0000FF00U) << 8 | - (val & 0x00FF0000U) >> 8 | (val & 0xFF000000U) >> 24; - } - - [LuaMethodExample("local ulbitbyt = bit.byteswap_64( 10000 );")] - [LuaMethod("byteswap_64", "Byte swaps 'long'")] - public static ulong Byteswap64(ulong val) - { - return (val & 0x00000000000000FFUL) << 56 | (val & 0x000000000000FF00UL) << 40 | - (val & 0x0000000000FF0000UL) << 24 | (val & 0x00000000FF000000UL) << 8 | - (val & 0x000000FF00000000UL) >> 8 | (val & 0x0000FF0000000000UL) >> 24 | - (val & 0x00FF000000000000UL) >> 40 | (val & 0xFF00000000000000UL) >> 56; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs deleted file mode 100644 index 2ce9d776f3..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs +++ /dev/null @@ -1,378 +0,0 @@ -using System; -using System.ComponentModel; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Cores.WonderSwan; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; - -using NLua; - -namespace BizHawk.Client.Common -{ - [Description("A library for interacting with the currently loaded emulator core")] - public sealed class EmulatorLuaLibrary : LuaLibraryBase - { - [RequiredService] - private IEmulator Emulator { get; set; } - - [OptionalService] - private IDebuggable DebuggableCore { get; set; } - - [OptionalService] - private IDisassemblable DisassemblableCore { get; set; } - - [OptionalService] - private IMemoryDomains MemoryDomains { get; set; } - - [OptionalService] - private IInputPollable InputPollableCore { get; set; } - - [OptionalService] - private IRegionable RegionableCore { get; set; } - - [OptionalService] - private IBoardInfo BoardInfo { get; set; } - - public Action FrameAdvanceCallback { get; set; } - public Action YieldCallback { get; set; } - - public EmulatorLuaLibrary(Lua lua) - : base(lua) { } - - public EmulatorLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "emu"; - - [LuaMethodExample("emu.displayvsync( true );")] - [LuaMethod("displayvsync", "Sets the display vsync property of the emulator")] - public static void DisplayVsync(bool enabled) - { - Global.Config.VSync = enabled; - } - - [LuaMethodExample("emu.frameadvance( );")] - [LuaMethod("frameadvance", "Signals to the emulator to resume emulation. Necessary for any lua script while loop or else the emulator will freeze!")] - public void FrameAdvance() - { - FrameAdvanceCallback(); - } - - [LuaMethodExample("local inemufra = emu.framecount( );")] - [LuaMethod("framecount", "Returns the current frame count")] - public int FrameCount() - { - return Emulator.Frame; - } - - [LuaMethodExample("local obemudis = emu.disassemble( 0x8000 );")] - [LuaMethod("disassemble", "Returns the disassembly object (disasm string and length int) for the given PC address. Uses System Bus domain if no domain name provided")] - public object Disassemble(uint pc, string name = "") - { - try - { - if (DisassemblableCore == null) - { - throw new NotImplementedException(); - } - - int l; - MemoryDomain domain = MemoryDomains.SystemBus; - - if (!string.IsNullOrEmpty(name)) - { - domain = MemoryDomains[name]; - } - - var d = DisassemblableCore.Disassemble(domain, pc, out l); - return new { disasm = d, length = l }; - } - catch (NotImplementedException) - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement disassemble()"); - return null; - } - } - - // TODO: what about 64 bit registers? - [LuaMethodExample("local inemuget = emu.getregister( emu.getregisters( )[ 0 ] );")] - [LuaMethod("getregister", "returns the value of a cpu register or flag specified by name. For a complete list of possible registers or flags for a given core, use getregisters")] - public int GetRegister(string name) - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - var registers = DebuggableCore.GetCpuFlagsAndRegisters(); - return registers.ContainsKey(name) - ? (int)registers[name].Value - : 0; - } - catch (NotImplementedException) - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement getregister()"); - return 0; - } - } - - [LuaMethodExample("local nlemuget = emu.getregisters( );")] - [LuaMethod("getregisters", "returns the complete set of available flags and registers for a given core")] - public LuaTable GetRegisters() - { - var table = Lua.NewTable(); - - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - foreach (var kvp in DebuggableCore.GetCpuFlagsAndRegisters()) - { - table[kvp.Key] = kvp.Value.Value; - } - } - catch (NotImplementedException) - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement getregisters()"); - } - - return table; - } - - [LuaMethodExample("emu.setregister( emu.getregisters( )[ 0 ], -1000 );")] - [LuaMethod("setregister", "sets the given register name to the given value")] - public void SetRegister(string register, int value) - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - DebuggableCore.SetCpuRegister(register, value); - } - catch (NotImplementedException) - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement setregister()"); - } - } - - [LuaMethodExample("local inemutot = emu.totalexecutedcycles( );")] - [LuaMethod("totalexecutedcycles", "gets the total number of executed cpu cycles")] - public long TotalExecutedycles() - { - try - { - if (DebuggableCore == null) - { - throw new NotImplementedException(); - } - - return DebuggableCore.TotalExecutedCycles; - } - catch (NotImplementedException) - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement totalexecutedcycles()"); - - return 0; - } - } - - [LuaMethodExample("local stemuget = emu.getsystemid( );")] - [LuaMethod("getsystemid", "Returns the ID string of the current core loaded. Note: No ROM loaded will return the string NULL")] - public static string GetSystemId() - { - return Global.Game.System; - } - - [LuaMethodExample("if ( emu.islagged( ) ) then\r\n\tconsole.log( \"Returns whether or not the current frame is a lag frame\" );\r\nend;")] - [LuaMethod("islagged", "Returns whether or not the current frame is a lag frame")] - public bool IsLagged() - { - if (InputPollableCore != null) - { - return InputPollableCore.IsLagFrame; - } - - Log($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - return false; - } - - [LuaMethodExample("emu.setislagged( true );")] - [LuaMethod("setislagged", "Sets the lag flag for the current frame. If no value is provided, it will default to true")] - public void SetIsLagged(bool value = true) - { - if (InputPollableCore != null) - { - InputPollableCore.IsLagFrame = value; - } - else - { - Log($"Can not set lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - } - } - - [LuaMethodExample("local inemulag = emu.lagcount( );")] - [LuaMethod("lagcount", "Returns the current lag count")] - public int LagCount() - { - if (InputPollableCore != null) - { - return InputPollableCore.LagCount; - } - - Log($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - return 0; - } - - [LuaMethodExample("emu.setlagcount( 50 );")] - [LuaMethod("setlagcount", "Sets the current lag count")] - public void SetLagCount(int count) - { - if (InputPollableCore != null) - { - InputPollableCore.LagCount = count; - } - else - { - Log($"Can not set lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable"); - } - } - - [LuaMethodExample("emu.limitframerate( true );")] - [LuaMethod("limitframerate", "sets the limit framerate property of the emulator")] - public static void LimitFramerate(bool enabled) - { - Global.Config.ClockThrottle = enabled; - } - - [LuaMethodExample("emu.minimizeframeskip( true );")] - [LuaMethod("minimizeframeskip", "Sets the autominimizeframeskip value of the emulator")] - public static void MinimizeFrameskip(bool enabled) - { - Global.Config.AutoMinimizeSkipping = enabled; - } - - [LuaMethodExample("emu.setrenderplanes( true, false );")] - [LuaMethod("setrenderplanes", "Toggles the drawing of sprites and background planes. Set to false or nil to disable a pane, anything else will draw them")] - public void SetRenderPlanes(params bool[] luaParam) - { - if (Emulator is NES) - { - // in the future, we could do something more arbitrary here. - // but this isn't any worse than the old system - var nes = Emulator as NES; - var s = nes.GetSettings(); - s.DispSprites = luaParam[0]; - s.DispBackground = luaParam[1]; - nes.PutSettings(s); - } - else if (Emulator is QuickNES) - { - var quicknes = Emulator as QuickNES; - var s = quicknes.GetSettings(); - - // this core doesn't support disabling BG - bool showsp = GetSetting(0, luaParam); - if (showsp && s.NumSprites == 0) - { - s.NumSprites = 8; - } - else if (!showsp && s.NumSprites > 0) - { - s.NumSprites = 0; - } - - quicknes.PutSettings(s); - } - else if (Emulator is PCEngine) - { - var pce = Emulator as PCEngine; - var s = pce.GetSettings(); - s.ShowOBJ1 = GetSetting(0, luaParam); - s.ShowBG1 = GetSetting(1, luaParam); - if (luaParam.Length > 2) - { - s.ShowOBJ2 = GetSetting(2, luaParam); - s.ShowBG2 = GetSetting(3, luaParam); - } - - pce.PutSettings(s); - } - else if (Emulator is SMS) - { - var sms = Emulator as SMS; - var s = sms.GetSettings(); - s.DispOBJ = GetSetting(0, luaParam); - s.DispBG = GetSetting(1, luaParam); - sms.PutSettings(s); - } - else if (Emulator is WonderSwan) - { - var ws = Emulator as WonderSwan; - var s = ws.GetSettings(); - s.EnableSprites = GetSetting(0, luaParam); - s.EnableFG = GetSetting(1, luaParam); - s.EnableBG = GetSetting(2, luaParam); - ws.PutSettings(s); - } - } - - private static bool GetSetting(int index, bool[] settings) - { - if (index < settings.Length) - { - return settings[index]; - } - - return true; - } - - [LuaMethodExample("emu.yield( );")] - [LuaMethod("yield", "allows a script to run while emulation is paused and interact with the gui/main window in realtime ")] - public void Yield() - { - YieldCallback(); - } - - [LuaMethodExample("local stemuget = emu.getdisplaytype();")] - [LuaMethod("getdisplaytype", "returns the display type (PAL vs NTSC) that the emulator is currently running in")] - public string GetDisplayType() - { - if (RegionableCore != null) - { - return RegionableCore.Region.ToString(); - } - - return ""; - } - - [LuaMethodExample("local stemuget = emu.getboardname();")] - [LuaMethod("getboardname", "returns (if available) the board name of the loaded ROM")] - public string GetBoardName() - { - if (BoardInfo != null) - { - return BoardInfo.BoardName; - } - - return ""; - } - - [LuaMethod("getluacore", "returns the name of the Lua core currently in use")] - public string GetLuaBackend() - { - return Lua.WhichLua; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs deleted file mode 100644 index f8d94f10e8..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs +++ /dev/null @@ -1,382 +0,0 @@ -using System; -using System.Linq; -using System.ComponentModel; - -using NLua; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -using BizHawk.Emulation.Cores.Nintendo.N64; - -namespace BizHawk.Client.Common -{ - [Description("A library for registering lua functions to emulator events.\n All events support multiple registered methods.\nAll registered event methods can be named and return a Guid when registered")] - public sealed class EventLuaLibrary : LuaLibraryBase - { - [OptionalService] - private IInputPollable InputPollableCore { get; set; } - - [OptionalService] - private IDebuggable DebuggableCore { get; set; } - - [RequiredService] - private IEmulator Emulator { get; set; } - - [OptionalService] - private IMemoryDomains Domains { get; set; } - - private readonly LuaFunctionList _luaFunctions = new LuaFunctionList(); - - public EventLuaLibrary(Lua lua) - : base(lua) { } - - public EventLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "event"; - - #region Events Library Helpers - - public void CallExitEvent(Lua thread) - { - var exitCallbacks = _luaFunctions.Where(l => l.Lua == thread && l.Event == "OnExit"); - foreach (var exitCallback in exitCallbacks) - { - exitCallback.Call(); - } - } - - public LuaFunctionList RegisteredFunctions => _luaFunctions; - - public void CallSaveStateEvent(string name) - { - var lfs = _luaFunctions.Where(l => l.Event == "OnSavestateSave").ToList(); - if (lfs.Any()) - { - try - { - foreach (var lf in lfs) - { - lf.Call(name); - } - } - catch (Exception e) - { - Log( - "error running function attached by lua function event.onsavestate" + - "\nError message: " + - e.Message); - } - } - } - - public void CallLoadStateEvent(string name) - { - var lfs = _luaFunctions.Where(l => l.Event == "OnSavestateLoad").ToList(); - if (lfs.Any()) - { - try - { - foreach (var lf in lfs) - { - lf.Call(name); - } - } - catch (Exception e) - { - Log( - "error running function attached by lua function event.onloadstate" + - "\nError message: " + - e.Message); - } - } - } - - public void CallFrameBeforeEvent() - { - var lfs = _luaFunctions.Where(l => l.Event == "OnFrameStart").ToList(); - if (lfs.Any()) - { - try - { - foreach (var lf in lfs) - { - lf.Call(); - } - } - catch (Exception e) - { - Log( - "error running function attached by lua function event.onframestart" + - "\nError message: " + - e.Message); - } - } - } - - public void CallFrameAfterEvent() - { - var lfs = _luaFunctions.Where(l => l.Event == "OnFrameEnd").ToList(); - if (lfs.Any()) - { - try - { - foreach (var lf in lfs) - { - lf.Call(); - } - } - catch (Exception e) - { - Log( - "error running function attached by lua function event.onframeend" + - "\nError message: " + - e.Message); - } - } - } - - private bool N64CoreTypeDynarec() - { - //if ((Emulator as N64)?.GetSyncSettings().Core == N64SyncSettings.CoreType.Dynarec) - //{ - // Log("N64 Error: Memory callbacks are not implemented for Dynamic Recompiler core type\nUse Interpreter or Pure Interpreter\n"); - // return true; - //} - - return false; - } - - private void LogMemoryCallbacksNotImplemented() - { - Log($"{Emulator.Attributes().CoreName} does not implement memory callbacks"); - } - - private void LogMemoryExecuteCallbacksNotImplemented() - { - Log($"{Emulator.Attributes().CoreName} does not implement memory execute callbacks"); - } - - #endregion - - - [LuaMethodExample("local steveonf = event.onframeend(\r\n\tfunction()\r\n\t\tconsole.log( \"Calls the given lua function at the end of each frame, after all emulation and drawing has completed. Note: this is the default behavior of lua scripts\" );\r\n\tend\r\n\t, \"Frame name\" );")] - [LuaMethod("onframeend", "Calls the given lua function at the end of each frame, after all emulation and drawing has completed. Note: this is the default behavior of lua scripts")] - public string OnFrameEnd(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnFrameEnd", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - return nlf.Guid.ToString(); - } - - [LuaMethodExample("local steveonf = event.onframestart(\r\n\tfunction()\r\n\t\tconsole.log( \"Calls the given lua function at the beginning of each frame before any emulation and drawing occurs\" );\r\n\tend\r\n\t, \"Frame name\" );")] - [LuaMethod("onframestart", "Calls the given lua function at the beginning of each frame before any emulation and drawing occurs")] - public string OnFrameStart(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnFrameStart", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - return nlf.Guid.ToString(); - } - - [LuaMethodExample("local steveoni = event.oninputpoll(\r\n\tfunction()\r\n\t\tconsole.log( \"Calls the given lua function after each time the emulator core polls for input\" );\r\n\tend\r\n\t, \"Frame name\" );")] - [LuaMethod("oninputpoll", "Calls the given lua function after each time the emulator core polls for input")] - public string OnInputPoll(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnInputPoll", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - - if (InputPollableCore != null) - { - try - { - InputPollableCore.InputCallbacks.Add(nlf.Callback); - return nlf.Guid.ToString(); - } - catch (NotImplementedException) - { - LogNotImplemented(); - return Guid.Empty.ToString(); - } - } - - LogNotImplemented(); - return Guid.Empty.ToString(); - } - - private void LogNotImplemented() - { - Log($"Error: {Emulator.Attributes().CoreName} does not yet implement input polling callbacks"); - } - - [LuaMethodExample("local steveonl = event.onloadstate(\r\n\tfunction()\r\n\tconsole.log( \"Fires after a state is loaded. Receives a lua function name, and registers it to the event immediately following a successful savestate event\" );\r\nend\", \"Frame name\" );")] - [LuaMethod("onloadstate", "Fires after a state is loaded. Receives a lua function name, and registers it to the event immediately following a successful savestate event")] - public string OnLoadState(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnSavestateLoad", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - return nlf.Guid.ToString(); - } - - [LuaMethodExample("local steveonm = event.onmemoryexecute(\r\n\tfunction()\r\n\t\tconsole.log( \"Fires after the given address is executed by the core\" );\r\n\tend\r\n\t, 0x200, \"Frame name\", \"System Bus\" );")] - [LuaMethod("onmemoryexecute", "Fires after the given address is executed by the core")] - public string OnMemoryExecute(LuaFunction luaf, uint address, string name = null, string domain = null) - { - try - { - if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable() && - DebuggableCore.MemoryCallbacks.ExecuteCallbacksAvailable) - { - if (N64CoreTypeDynarec()) - { - return Guid.Empty.ToString(); - } - - var nlf = new NamedLuaFunction(luaf, "OnMemoryExecute", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - - if (string.IsNullOrWhiteSpace(domain)) - { - if (Domains != null && Domains.HasSystemBus) - { - domain = Domains.SystemBus.Name; - } - } - - DebuggableCore.MemoryCallbacks.Add( - new MemoryCallback(domain, MemoryCallbackType.Execute, "Lua Hook", nlf.Callback, address, null)); - return nlf.Guid.ToString(); - } - } - catch (NotImplementedException) - { - LogMemoryExecuteCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - LogMemoryExecuteCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - [LuaMethodExample("local steveonm = event.onmemoryread(\r\n\tfunction()\r\n\t\tconsole.log( \"Fires after the given address is read by the core. If no address is given, it will attach to every memory read\" );\r\n\tend\r\n\t, 0x200, \"Frame name\" );")] - [LuaMethod("onmemoryread", "Fires after the given address is read by the core. If no address is given, it will attach to every memory read")] - public string OnMemoryRead(LuaFunction luaf, uint? address = null, string name = null, string domain = null) - { - try - { - if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable()) - { - if (N64CoreTypeDynarec()) - { - return Guid.Empty.ToString(); - } - - var nlf = new NamedLuaFunction(luaf, "OnMemoryRead", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - - if (string.IsNullOrWhiteSpace(domain)) - { - if (Domains != null && Domains.HasSystemBus) - { - domain = Domains.SystemBus.Name; - } - } - - DebuggableCore.MemoryCallbacks.Add( - new MemoryCallback(domain, MemoryCallbackType.Read, "Lua Hook", nlf.Callback, address, null)); - return nlf.Guid.ToString(); - } - } - catch (NotImplementedException) - { - LogMemoryCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - LogMemoryCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - [LuaMethodExample("local steveonm = event.onmemorywrite(\r\n\tfunction()\r\n\t\tconsole.log( \"Fires after the given address is written by the core. If no address is given, it will attach to every memory write\" );\r\n\tend\r\n\t, 0x200, \"Frame name\" );")] - [LuaMethod("onmemorywrite", "Fires after the given address is written by the core. If no address is given, it will attach to every memory write")] - public string OnMemoryWrite(LuaFunction luaf, uint? address = null, string name = null, string domain = null) - { - try - { - if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable()) - { - if (N64CoreTypeDynarec()) - { - return Guid.Empty.ToString(); - } - - var nlf = new NamedLuaFunction(luaf, "OnMemoryWrite", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - - if (string.IsNullOrWhiteSpace(domain)) - { - if (Domains != null && Domains.HasSystemBus) - { - domain = Domains.SystemBus.Name; - } - } - - DebuggableCore.MemoryCallbacks.Add( - new MemoryCallback(domain, MemoryCallbackType.Write, "Lua Hook", nlf.Callback, address, null)); - return nlf.Guid.ToString(); - } - } - catch (NotImplementedException) - { - LogMemoryCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - LogMemoryCallbacksNotImplemented(); - return Guid.Empty.ToString(); - } - - [LuaMethodExample("local steveons = event.onsavestate(\r\n\tfunction()\r\n\t\tconsole.log( \"Fires after a state is saved\" );\r\n\tend\r\n\t, \"Frame name\" );")] - [LuaMethod("onsavestate", "Fires after a state is saved")] - public string OnSaveState(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnSavestateSave", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - return nlf.Guid.ToString(); - } - - [LuaMethodExample("local steveone = event.onexit(\r\n\tfunction()\r\n\t\tconsole.log( \"Fires after the calling script has stopped\" );\r\n\tend\r\n\t, \"Frame name\" );")] - [LuaMethod("onexit", "Fires after the calling script has stopped")] - public string OnExit(LuaFunction luaf, string name = null) - { - var nlf = new NamedLuaFunction(luaf, "OnExit", LogOutputCallback, CurrentThread, name); - _luaFunctions.Add(nlf); - return nlf.Guid.ToString(); - } - - [LuaMethodExample("if ( event.unregisterbyid( \"4d1810b7 - 0d28 - 4acb - 9d8b - d87721641551\" ) ) then\r\n\tconsole.log( \"Removes the registered function that matches the guid.If a function is found and remove the function will return true.If unable to find a match, the function will return false.\" );\r\nend;")] - [LuaMethod("unregisterbyid", "Removes the registered function that matches the guid. If a function is found and remove the function will return true. If unable to find a match, the function will return false.")] - public bool UnregisterById(string guid) - { - foreach (var nlf in _luaFunctions.Where(nlf => nlf.Guid.ToString() == guid.ToString())) - { - _luaFunctions.Remove(nlf); - return true; - } - - return false; - } - - [LuaMethodExample("if ( event.unregisterbyname( \"Function name\" ) ) then\r\n\tconsole.log( \"Removes the first registered function that matches Name.If a function is found and remove the function will return true.If unable to find a match, the function will return false.\" );\r\nend;")] - [LuaMethod("unregisterbyname", "Removes the first registered function that matches Name. If a function is found and remove the function will return true. If unable to find a match, the function will return false.")] - public bool UnregisterByName(string name) - { - foreach (var nlf in _luaFunctions.Where(nlf => nlf.Name == name)) - { - _luaFunctions.Remove(nlf); - return true; - } - - return false; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs deleted file mode 100644 index 61d2d4afb0..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using NLua; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public sealed class GameInfoLuaLibrary : LuaLibraryBase - { - [OptionalService] - private IBoardInfo BoardInfo { get; set; } - - public GameInfoLuaLibrary(Lua lua) - : base(lua) { } - - public GameInfoLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "gameinfo"; - - [LuaMethodExample("local stgamget = gameinfo.getromname( );")] - [LuaMethod("getromname", "returns the name of the currently loaded rom, if a rom is loaded")] - public string GetRomName() - { - if (Global.Game != null) - { - return Global.Game.Name ?? ""; - } - - return ""; - } - - [LuaMethodExample("local stgamget = gameinfo.getromhash( );")] - [LuaMethod("getromhash", "returns the hash of the currently loaded rom, if a rom is loaded")] - public string GetRomHash() - { - if (Global.Game != null) - { - return Global.Game.Hash ?? ""; - } - - return ""; - } - - [LuaMethodExample("if ( gameinfo.indatabase( ) ) then\r\n\tconsole.log( \"returns whether or not the currently loaded rom is in the game database\" );\r\nend;")] - [LuaMethod("indatabase", "returns whether or not the currently loaded rom is in the game database")] - public bool InDatabase() - { - if (Global.Game != null) - { - return !Global.Game.NotInDatabase; - } - - return false; - } - - [LuaMethodExample("local stgamget = gameinfo.getstatus( );")] - [LuaMethod("getstatus", "returns the game database status of the currently loaded rom. Statuses are for example: GoodDump, BadDump, Hack, Unknown, NotInDatabase")] - public string GetStatus() - { - if (Global.Game != null) - { - return Global.Game.Status.ToString(); - } - - return ""; - } - - [LuaMethodExample("if ( gameinfo.isstatusbad( ) ) then\r\n\tconsole.log( \"returns the currently loaded rom's game database status is considered 'bad'\" );\r\nend;")] - [LuaMethod("isstatusbad", "returns the currently loaded rom's game database status is considered 'bad'")] - public bool IsStatusBad() - { - if (Global.Game != null) - { - return Global.Game.IsRomStatusBad(); - } - - return true; - } - - [LuaMethodExample("local stgamget = gameinfo.getboardtype( );")] - [LuaMethod("getboardtype", "returns identifying information about the 'mapper' or similar capability used for this game. empty if no such useful distinction can be drawn")] - public string GetBoardType() - { - return BoardInfo?.BoardName ?? ""; - } - - [LuaMethodExample("local nlgamget = gameinfo.getoptions( );")] - [LuaMethod("getoptions", "returns the game options for the currently loaded rom. Options vary per platform")] - public LuaTable GetOptions() - { - var options = Lua.NewTable(); - - if (Global.Game != null) - { - foreach (var option in Global.Game.GetOptionsDict()) - { - options[option.Key] = option.Value; - } - } - - return options; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs deleted file mode 100644 index de469a25d7..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.ComponentModel; - -using NLua; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; - -namespace BizHawk.Client.Common -{ - [Description("Functions specific to GenesisHawk (functions may not run when an Genesis game is not loaded)")] - public sealed class GenesisLuaLibrary : LuaLibraryBase - { - [OptionalService] - private GPGX Genesis { get; set; } - - public GenesisLuaLibrary(Lua lua) - : base(lua) { } - - public GenesisLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "genesis"; - - private GPGX.GPGXSettings GetSettings() - { - if (Genesis != null) - { - return Genesis.GetSettings(); - } - - return new GPGX.GPGXSettings(); - } - - private void PutSettings(GPGX.GPGXSettings settings) - { - Genesis?.PutSettings(settings); - } - - [LuaMethodExample("if ( genesis.getlayer_bga( ) ) then\r\n\tconsole.log( \"Returns whether the bg layer A is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bga", "Returns whether the bg layer A is displayed")] - public bool GetLayerBgA() - { - return GetSettings().DrawBGA; - } - - [LuaMethodExample("if ( genesis.getlayer_bgb( ) ) then\r\n\tconsole.log( \"Returns whether the bg layer B is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bgb", "Returns whether the bg layer B is displayed")] - public bool GetLayerBgB() - { - return GetSettings().DrawBGB; - } - - [LuaMethodExample("if ( genesis.getlayer_bgw( ) ) then\r\n\tconsole.log( \"Returns whether the bg layer W is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bgw", "Returns whether the bg layer W is displayed")] - public bool GetLayerBgW() - { - return GetSettings().DrawBGW; - } - - [LuaMethodExample("genesis.setlayer_bga( true );")] - [LuaMethod("setlayer_bga", "Sets whether the bg layer A is displayed")] - public void SetLayerBgA(bool value) - { - var s = GetSettings(); - s.DrawBGA = value; - PutSettings(s); - } - - [LuaMethodExample("genesis.setlayer_bgb( true );")] - [LuaMethod("setlayer_bgb", "Sets whether the bg layer B is displayed")] - public void SetLayerBgB(bool value) - { - var s = GetSettings(); - s.DrawBGB = value; - PutSettings(s); - } - - [LuaMethodExample("genesis.setlayer_bgw( true );")] - [LuaMethod("setlayer_bgw", "Sets whether the bg layer W is displayed")] - public void SetLayerBgW(bool value) - { - var s = GetSettings(); - s.DrawBGW = value; - PutSettings(s); - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs deleted file mode 100644 index e5bc81d9be..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System; -using NLua; - -namespace BizHawk.Client.Common -{ - public sealed class JoypadLuaLibrary : LuaLibraryBase - { - public JoypadLuaLibrary(Lua lua) - : base(lua) { } - - public JoypadLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "joypad"; - - [LuaMethodExample("local nljoyget = joypad.get( 1 );")] - [LuaMethod("get", "returns a lua table of the controller buttons pressed. If supplied, it will only return a table of buttons for the given controller")] - public LuaTable Get(int? controller = null) - { - var buttons = Lua.NewTable(); - var adaptor = Global.AutofireStickyXORAdapter; - foreach (var button in adaptor.Source.Definition.BoolButtons) - { - if (!controller.HasValue) - { - buttons[button] = adaptor.IsPressed(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller) - { - buttons[button.Substring(3)] = adaptor.IsPressed("P" + controller + " " + button.Substring(3)); - } - } - - foreach (var button in adaptor.Source.Definition.FloatControls) - { - if (controller == null) - { - buttons[button] = adaptor.GetFloat(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller) - { - buttons[button.Substring(3)] = adaptor.GetFloat("P" + controller + " " + button.Substring(3)); - } - } - - buttons["clear"] = null; - buttons["getluafunctionslist"] = null; - buttons["output"] = null; - - return buttons; - } - - // TODO: what about float controls? - [LuaMethodExample("local nljoyget = joypad.getimmediate( );")] - [LuaMethod("getimmediate", "returns a lua table of any controller buttons currently pressed by the user")] - public LuaTable GetImmediate() - { - var buttons = Lua.NewTable(); - foreach (var button in Global.ActiveController.Definition.BoolButtons) - { - buttons[button] = Global.ActiveController.IsPressed(button); - } - - return buttons; - } - - [LuaMethodExample("joypad.setfrommnemonicstr( \"| 0, 0, 0, 100,...R..B....|\" );")] - [LuaMethod("setfrommnemonicstr", "sets the given buttons to their provided values for the current frame, string will be interpretted the same way an entry from a movie input log would be")] - public void SetFromMnemonicStr(string inputLogEntry) - { - try - { - var lg = Global.MovieSession.MovieControllerInstance(); - lg.SetControllersAsMnemonic(inputLogEntry); - - foreach (var button in lg.Definition.BoolButtons) - { - Global.LuaAndAdaptor.SetButton(button, lg.IsPressed(button)); - } - - foreach (var floatButton in lg.Definition.FloatControls) - { - Global.LuaAndAdaptor.SetFloat(floatButton, lg.GetFloat(floatButton)); - } - } - catch (Exception) - { - Log("invalid mnemonic string: " + inputLogEntry); - } - } - - [LuaMethodExample("joypad.set( { [\"Left\"] = true, [ \"A\" ] = true, [ \"B\" ] = true } );")] - [LuaMethod("set", "sets the given buttons to their provided values for the current frame")] - public void Set(LuaTable buttons, int? controller = null) - { - try - { - foreach (var button in buttons.Keys) - { - var invert = false; - bool? theValue; - var theValueStr = buttons[button].ToString(); - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - if (theValueStr.ToLower() == "false") - { - theValue = false; - } - else if (theValueStr.ToLower() == "true") - { - theValue = true; - } - else - { - invert = true; - theValue = null; - } - } - else - { - theValue = null; - } - - var toPress = button.ToString(); - if (controller.HasValue) - { - toPress = "P" + controller + " " + button; - } - - if (!invert) - { - if (theValue.HasValue) // Force - { - Global.LuaAndAdaptor.SetButton(toPress, theValue.Value); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - else // Unset - { - Global.LuaAndAdaptor.UnSet(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - else // Inverse - { - Global.LuaAndAdaptor.SetInverse(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - } - catch - { - /*Eat it*/ - } - } - - [LuaMethodExample("joypad.setanalog( { [ \"Tilt X\" ] = true, [ \"Tilt Y\" ] = false } );")] - [LuaMethod("setanalog", "sets the given analog controls to their provided values for the current frame. Note that unlike set() there is only the logic of overriding with the given value.")] - public void SetAnalog(LuaTable controls, object controller = null) - { - try - { - foreach (var name in controls.Keys) - { - var theValueStr = controls[name].ToString(); - float? theValue = null; - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - float f; - if (float.TryParse(theValueStr, out f)) - { - theValue = f; - } - } - - if (controller == null) - { - Global.StickyXORAdapter.SetFloat(name.ToString(), theValue); - } - else - { - Global.StickyXORAdapter.SetFloat("P" + controller + " " + name, theValue); - } - } - } - catch - { - /*Eat it*/ - } - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs deleted file mode 100644 index 1d41611cde..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs +++ /dev/null @@ -1,314 +0,0 @@ -using System; -using System.ComponentModel; - -using NLua; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - [Description("Main memory library reads and writes from the Main memory domain (the default memory domain set by any given core)")] - public sealed class MainMemoryLuaLibrary : LuaMemoryBase - { - public MainMemoryLuaLibrary(Lua lua) - : base(lua) { } - - public MainMemoryLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "mainmemory"; - - protected override MemoryDomain Domain - { - get - { - if (MemoryDomainCore != null) - { - return MemoryDomainCore.MainMemory; - } - else - { - var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains"; - Log(error); - throw new NotImplementedException(error); - } - } - } - - #region Unique Library Methods - - [LuaMethodExample("local stmaiget = mainmemory.getname( );")] - [LuaMethod("getname", "returns the name of the domain defined as main memory for the given core")] - public string GetName() - { - return Domain.Name; - } - - [LuaMethodExample("local uimaiget = mainmemory.getcurrentmemorydomainsize( );")] - [LuaMethod("getcurrentmemorydomainsize", "Returns the number of bytes of the domain defined as main memory")] - public uint GetSize() - { - return (uint)Domain.Size; - } - - #endregion - - #region Common Special and Legacy Methods - - [LuaMethodExample("local uimairea = mainmemory.readbyte( 0x100 );")] - [LuaMethod("readbyte", "gets the value from the given address as an unsigned byte")] - public uint ReadByte(int addr) - { - return ReadUnsignedByte(addr); - } - - [LuaMethodExample("mainmemory.writebyte( 0x100, 1000 );")] - [LuaMethod("writebyte", "Writes the given value to the given address as an unsigned byte")] - public void WriteByte(int addr, uint value) - { - WriteUnsignedByte(addr, value); - } - - [LuaMethodExample("local nlmairea = mainmemory.readbyterange( 0x100, 64 );")] - [LuaMethod("readbyterange", "Reads the address range that starts from address, and is length long. Returns the result into a table of key value pairs (where the address is the key).")] - public LuaTable ReadByteRange(int addr, int length) - { - return base.ReadByteRange(addr, length); - } - - [LuaMethodExample("")] - [LuaMethod("writebyterange", "Writes the given values to the given addresses as unsigned bytes")] - public void WriteByteRange(LuaTable memoryblock) - { - base.WriteByteRange(memoryblock); - } - - [LuaMethodExample("local simairea = mainmemory.readfloat(0x100, false);")] - [LuaMethod("readfloat", "Reads the given address as a 32-bit float value from the main memory domain with th e given endian")] - public float ReadFloat(int addr, bool bigendian) - { - return base.ReadFloat(addr, bigendian); - } - - [LuaMethodExample("mainmemory.writefloat( 0x100, 10.0, false );")] - [LuaMethod("writefloat", "Writes the given 32-bit float value to the given address and endian")] - public void WriteFloat(int addr, double value, bool bigendian) - { - base.WriteFloat(addr, value, bigendian); - } - - #endregion - - #region 1 Byte - - [LuaMethodExample("local inmairea = mainmemory.read_s8( 0x100 );")] - [LuaMethod("read_s8", "read signed byte")] - public int ReadS8(int addr) - { - return (sbyte)ReadUnsignedByte(addr); - } - - [LuaMethodExample("mainmemory.write_s8( 0x100, 1000 );")] - [LuaMethod("write_s8", "write signed byte")] - public void WriteS8(int addr, uint value) - { - WriteUnsignedByte(addr, value); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u8( 0x100 );")] - [LuaMethod("read_u8", "read unsigned byte")] - public uint ReadU8(int addr) - { - return ReadUnsignedByte(addr); - } - - [LuaMethodExample("mainmemory.write_u8( 0x100, 1000 );")] - [LuaMethod("write_u8", "write unsigned byte")] - public void WriteU8(int addr, uint value) - { - WriteUnsignedByte(addr, value); - } - - #endregion - - #region 2 Byte - - [LuaMethodExample("local inmairea = mainmemory.read_s16_le( 0x100 );")] - [LuaMethod("read_s16_le", "read signed 2 byte value, little endian")] - public int ReadS16Little(int addr) - { - return ReadSignedLittleCore(addr, 2); - } - - [LuaMethodExample("mainmemory.write_s16_le( 0x100, -1000 );")] - [LuaMethod("write_s16_le", "write signed 2 byte value, little endian")] - public void WriteS16Little(int addr, int value) - { - WriteSignedLittle(addr, value, 2); - } - - [LuaMethodExample("local inmairea = mainmemory.read_s16_be( 0x100 );")] - [LuaMethod("read_s16_be", "read signed 2 byte value, big endian")] - public int ReadS16Big(int addr) - { - return ReadSignedBig(addr, 2); - } - - [LuaMethodExample("mainmemory.write_s16_be( 0x100, -1000 );")] - [LuaMethod("write_s16_be", "write signed 2 byte value, big endian")] - public void WriteS16Big(int addr, int value) - { - WriteSignedBig(addr, value, 2); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u16_le( 0x100 );")] - [LuaMethod("read_u16_le", "read unsigned 2 byte value, little endian")] - public uint ReadU16Little(int addr) - { - return ReadSignedLittle(addr, 2); - } - - [LuaMethodExample("mainmemory.write_u16_le( 0x100, 1000 );")] - [LuaMethod("write_u16_le", "write unsigned 2 byte value, little endian")] - public void WriteU16Little(int addr, uint value) - { - WriteUnsignedLittle(addr, value, 2); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u16_be( 0x100 );")] - [LuaMethod("read_u16_be", "read unsigned 2 byte value, big endian")] - public uint ReadU16Big(int addr) - { - return ReadUnsignedBig(addr, 2); - } - - [LuaMethodExample("mainmemory.write_u16_be( 0x100, 1000 );")] - [LuaMethod("write_u16_be", "write unsigned 2 byte value, big endian")] - public void WriteU16Big(int addr, uint value) - { - WriteUnsignedBig(addr, value, 2); - } - - #endregion - - #region 3 Byte - - [LuaMethodExample("local inmairea = mainmemory.read_s24_le( 0x100 );")] - [LuaMethod("read_s24_le", "read signed 24 bit value, little endian")] - public int ReadS24Little(int addr) - { - return ReadSignedLittleCore(addr, 3); - } - - [LuaMethodExample("mainmemory.write_s24_le( 0x100, -1000 );")] - [LuaMethod("write_s24_le", "write signed 24 bit value, little endian")] - public void WriteS24Little(int addr, int value) - { - WriteSignedLittle(addr, value, 3); - } - - [LuaMethodExample("local inmairea = mainmemory.read_s24_be( 0x100 );")] - [LuaMethod("read_s24_be", "read signed 24 bit value, big endian")] - public int ReadS24Big(int addr) - { - return ReadSignedBig(addr, 3); - } - - [LuaMethodExample("mainmemory.write_s24_be( 0x100, -1000 );")] - [LuaMethod("write_s24_be", "write signed 24 bit value, big endian")] - public void WriteS24Big(int addr, int value) - { - WriteSignedBig(addr, value, 3); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u24_le( 0x100 );")] - [LuaMethod("read_u24_le", "read unsigned 24 bit value, little endian")] - public uint ReadU24Little(int addr) - { - return ReadSignedLittle(addr, 3); - } - - [LuaMethodExample("mainmemory.write_u24_le( 0x100, 1000 );")] - [LuaMethod("write_u24_le", "write unsigned 24 bit value, little endian")] - public void WriteU24Little(int addr, uint value) - { - WriteUnsignedLittle(addr, value, 3); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u24_be( 0x100 );")] - [LuaMethod("read_u24_be", "read unsigned 24 bit value, big endian")] - public uint ReadU24Big(int addr) - { - return ReadUnsignedBig(addr, 3); - } - - [LuaMethodExample("mainmemory.write_u24_be( 0x100, 1000 );")] - [LuaMethod("write_u24_be", "write unsigned 24 bit value, big endian")] - public void WriteU24Big(int addr, uint value) - { - WriteUnsignedBig(addr, value, 3); - } - - #endregion - - #region 4 Byte - - [LuaMethodExample("local inmairea = mainmemory.read_s32_le( 0x100 );")] - [LuaMethod("read_s32_le", "read signed 4 byte value, little endian")] - public int ReadS32Little(int addr) - { - return ReadSignedLittleCore(addr, 4); - } - - [LuaMethodExample("mainmemory.write_s32_le( 0x100, -1000 );")] - [LuaMethod("write_s32_le", "write signed 4 byte value, little endian")] - public void WriteS32Little(int addr, int value) - { - WriteSignedLittle(addr, value, 4); - } - - [LuaMethodExample("local inmairea = mainmemory.read_s32_be( 0x100 );")] - [LuaMethod("read_s32_be", "read signed 4 byte value, big endian")] - public int ReadS32Big(int addr) - { - return ReadSignedBig(addr, 4); - } - - [LuaMethodExample("mainmemory.write_s32_be( 0x100, -1000 );")] - [LuaMethod("write_s32_be", "write signed 4 byte value, big endian")] - public void WriteS32Big(int addr, int value) - { - WriteSignedBig(addr, value, 4); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u32_le( 0x100 );")] - [LuaMethod("read_u32_le", "read unsigned 4 byte value, little endian")] - public uint ReadU32Little(int addr) - { - return ReadSignedLittle(addr, 4); - } - - [LuaMethodExample("mainmemory.write_u32_le( 0x100, 1000 );")] - [LuaMethod("write_u32_le", "write unsigned 4 byte value, little endian")] - public void WriteU32Little(int addr, uint value) - { - WriteUnsignedLittle(addr, value, 4); - } - - [LuaMethodExample("local uimairea = mainmemory.read_u32_be( 0x100 );")] - [LuaMethod("read_u32_be", "read unsigned 4 byte value, big endian")] - public uint ReadU32Big(int addr) - { - return ReadUnsignedBig(addr, 4); - } - - [LuaMethodExample("mainmemory.write_u32_be( 0x100, 1000 );")] - [LuaMethod("write_u32_be", "write unsigned 4 byte value, big endian")] - public void WriteU32Big(int addr, uint value) - { - WriteUnsignedBig(addr, value, 4); - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs deleted file mode 100644 index 71395b4737..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs +++ /dev/null @@ -1,409 +0,0 @@ -using System; -using System.ComponentModel; - -using NLua; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Common.BufferExtensions; - -namespace BizHawk.Client.Common -{ - [Description("These functions behavior identically to the mainmemory functions but the user can set the memory domain to read and write from. The default domain is main memory. Use getcurrentmemorydomain(), and usememorydomain() to control which domain is used. Each core has its own set of valid memory domains. Use getmemorydomainlist() to get a list of memory domains for the current core loaded.")] - public sealed class MemoryLuaLibrary : LuaMemoryBase - { - private MemoryDomain _currentMemoryDomain; - - public MemoryLuaLibrary(Lua lua) - : base(lua) - { - } - - public MemoryLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) - { - } - - public override string Name => "memory"; - - protected override MemoryDomain Domain - { - get - { - if (MemoryDomainCore != null) - { - if (_currentMemoryDomain == null) - { - _currentMemoryDomain = MemoryDomainCore.HasSystemBus - ? MemoryDomainCore.SystemBus - : MemoryDomainCore.MainMemory; - } - - return _currentMemoryDomain; - } - - var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains"; - Log(error); - throw new NotImplementedException(error); - } - } - - #region Unique Library Methods - - [LuaMethodExample("local nlmemget = memory.getmemorydomainlist();")] - [LuaMethod("getmemorydomainlist", "Returns a string of the memory domains for the loaded platform core. List will be a single string delimited by line feeds")] - public LuaTable GetMemoryDomainList() - { - var table = Lua.NewTable(); - - int i = 0; - foreach (var domain in DomainList) - { - table[i] = domain.Name; - i++; - } - - return table; - } - - [LuaMethodExample("local uimemget = memory.getmemorydomainsize( mainmemory.getname( ) );")] - [LuaMethod("getmemorydomainsize", "Returns the number of bytes of the specified memory domain. If no domain is specified, or the specified domain doesn't exist, returns the current domain size")] - public uint GetMemoryDomainSize(string name = "") - { - if (string.IsNullOrEmpty(name)) - { - return (uint)Domain.Size; - } - - return (uint)DomainList[VerifyMemoryDomain(name)].Size; - } - - [LuaMethodExample("local stmemget = memory.getcurrentmemorydomain( );")] - [LuaMethod("getcurrentmemorydomain", "Returns a string name of the current memory domain selected by Lua. The default is Main memory")] - public string GetCurrentMemoryDomain() - { - return Domain.Name; - } - - [LuaMethodExample("local uimemget = memory.getcurrentmemorydomainsize( );")] - [LuaMethod("getcurrentmemorydomainsize", "Returns the number of bytes of the current memory domain selected by Lua. The default is Main memory")] - public uint GetCurrentMemoryDomainSize() - { - return (uint)Domain.Size; - } - - [LuaMethodExample("if ( memory.usememorydomain( mainmemory.getname( ) ) ) then\r\n\tconsole.log( \"Attempts to set the current memory domain to the given domain. If the name does not match a valid memory domain, the function returns false, else it returns true\" );\r\nend;")] - [LuaMethod("usememorydomain", "Attempts to set the current memory domain to the given domain. If the name does not match a valid memory domain, the function returns false, else it returns true")] - public bool UseMemoryDomain(string domain) - { - try - { - if (DomainList[domain] != null) - { - _currentMemoryDomain = DomainList[domain]; - return true; - } - - Log($"Unable to find domain: {domain}"); - return false; - } - catch // Just in case - { - Log($"Unable to find domain: {domain}"); - } - - return false; - } - - [LuaMethodExample("local stmemhas = memory.hash_region( 0x100, 50, mainmemory.getname( ) );")] - [LuaMethod("hash_region", "Returns a hash as a string of a region of memory, starting from addr, through count bytes. If the domain is unspecified, it uses the current region.")] - public string HashRegion(int addr, int count, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - - // checks - if (addr < 0 || addr >= d.Size) - { - string error = $"Address {addr} is outside the bounds of domain {d.Name}"; - Log(error); - throw new ArgumentOutOfRangeException(error); - } - if (addr + count > d.Size) - { - string error = $"Address {addr} + count {count} is outside the bounds of domain {d.Name}"; - Log(error); - throw new ArgumentOutOfRangeException(error); - } - - byte[] data = new byte[count]; - for (int i = 0; i < count; i++) - { - data[i] = d.PeekByte(addr + i); - } - - using (var hasher = System.Security.Cryptography.SHA256.Create()) - { - return hasher.ComputeHash(data).BytesToHexString(); - } - } - - #endregion - - #region Common Special and Legacy Methods - - [LuaMethodExample("local uimemrea = memory.readbyte( 0x100, mainmemory.getname( ) );")] - [LuaMethod("readbyte", "gets the value from the given address as an unsigned byte")] - public uint ReadByte(int addr, string domain = null) - { - return ReadUnsignedByte(addr, domain); - } - - [LuaMethodExample("memory.writebyte( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("writebyte", "Writes the given value to the given address as an unsigned byte")] - public void WriteByte(int addr, uint value, string domain = null) - { - WriteUnsignedByte(addr, value, domain); - } - - [LuaMethodExample("local nlmemrea = memory.readbyterange( 0x100, 30, mainmemory.getname( ) );")] - [LuaMethod("readbyterange", "Reads the address range that starts from address, and is length long. Returns the result into a table of key value pairs (where the address is the key).")] - public new LuaTable ReadByteRange(int addr, int length, string domain = null) - { - return base.ReadByteRange(addr, length, domain); - } - - [LuaMethodExample("")] - [LuaMethod("writebyterange", "Writes the given values to the given addresses as unsigned bytes")] - public new void WriteByteRange(LuaTable memoryblock, string domain = null) - { - base.WriteByteRange(memoryblock, domain); - } - - [LuaMethodExample("local simemrea = memory.readfloat( 0x100, false, mainmemory.getname( ) );")] - [LuaMethod("readfloat", "Reads the given address as a 32-bit float value from the main memory domain with th e given endian")] - public new float ReadFloat(int addr, bool bigendian, string domain = null) - { - return base.ReadFloat(addr, bigendian, domain); - } - - [LuaMethodExample("memory.writefloat( 0x100, 10.0, false, mainmemory.getname( ) );")] - [LuaMethod("writefloat", "Writes the given 32-bit float value to the given address and endian")] - public new void WriteFloat(int addr, double value, bool bigendian, string domain = null) - { - base.WriteFloat(addr, value, bigendian, domain); - } - - #endregion - - #region 1 Byte - - [LuaMethodExample("local inmemrea = memory.read_s8( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s8", "read signed byte")] - public int ReadS8(int addr, string domain = null) - { - return (sbyte)ReadUnsignedByte(addr, domain); - } - - [LuaMethodExample("memory.write_s8( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_s8", "write signed byte")] - public void WriteS8(int addr, uint value, string domain = null) - { - WriteUnsignedByte(addr, value, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u8( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u8", "read unsigned byte")] - public uint ReadU8(int addr, string domain = null) - { - return ReadUnsignedByte(addr, domain); - } - - [LuaMethodExample("memory.write_u8( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u8", "write unsigned byte")] - public void WriteU8(int addr, uint value, string domain = null) - { - WriteUnsignedByte(addr, value, domain); - } - - #endregion - - #region 2 Byte - - [LuaMethodExample("local inmemrea = memory.read_s16_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s16_le", "read signed 2 byte value, little endian")] - public int ReadS16Little(int addr, string domain = null) - { - return ReadSignedLittleCore(addr, 2, domain); - } - - [LuaMethodExample("memory.write_s16_le( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s16_le", "write signed 2 byte value, little endian")] - public void WriteS16Little(int addr, int value, string domain = null) - { - WriteSignedLittle(addr, value, 2, domain); - } - - [LuaMethodExample("local inmemrea = memory.read_s16_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s16_be", "read signed 2 byte value, big endian")] - public int ReadS16Big(int addr, string domain = null) - { - return ReadSignedBig(addr, 2, domain); - } - - [LuaMethodExample("memory.write_s16_be( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s16_be", "write signed 2 byte value, big endian")] - public void WriteS16Big(int addr, int value, string domain = null) - { - WriteSignedBig(addr, value, 2, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u16_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u16_le", "read unsigned 2 byte value, little endian")] - public uint ReadU16Little(int addr, string domain = null) - { - return ReadUnsignedLittle(addr, 2, domain); - } - - [LuaMethodExample("memory.write_u16_le( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u16_le", "write unsigned 2 byte value, little endian")] - public void WriteU16Little(int addr, uint value, string domain = null) - { - WriteUnsignedLittle(addr, value, 2, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u16_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u16_be", "read unsigned 2 byte value, big endian")] - public uint ReadU16Big(int addr, string domain = null) - { - return ReadUnsignedBig(addr, 2, domain); - } - - [LuaMethodExample("memory.write_u16_be( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u16_be", "write unsigned 2 byte value, big endian")] - public void WriteU16Big(int addr, uint value, string domain = null) - { - WriteUnsignedBig(addr, value, 2, domain); - } - - #endregion - - #region 3 Byte - - [LuaMethodExample("local inmemrea = memory.read_s24_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s24_le", "read signed 24 bit value, little endian")] - public int ReadS24Little(int addr, string domain = null) - { - return ReadSignedLittleCore(addr, 3, domain); - } - - [LuaMethodExample("memory.write_s24_le( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s24_le", "write signed 24 bit value, little endian")] - public void WriteS24Little(int addr, int value, string domain = null) - { - WriteSignedLittle(addr, value, 3, domain); - } - - [LuaMethodExample("local inmemrea = memory.read_s24_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s24_be", "read signed 24 bit value, big endian")] - public int ReadS24Big(int addr, string domain = null) - { - return ReadSignedBig(addr, 3, domain); - } - - [LuaMethodExample("memory.write_s24_be( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s24_be", "write signed 24 bit value, big endian")] - public void WriteS24Big(int addr, int value, string domain = null) - { - WriteSignedBig(addr, value, 3, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u24_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u24_le", "read unsigned 24 bit value, little endian")] - public uint ReadU24Little(int addr, string domain = null) - { - return ReadUnsignedLittle(addr, 3, domain); - } - - [LuaMethodExample("memory.write_u24_le( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u24_le", "write unsigned 24 bit value, little endian")] - public void WriteU24Little(int addr, uint value, string domain = null) - { - WriteUnsignedLittle(addr, value, 3, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u24_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u24_be", "read unsigned 24 bit value, big endian")] - public uint ReadU24Big(int addr, string domain = null) - { - return ReadUnsignedBig(addr, 3, domain); - } - - [LuaMethodExample("memory.write_u24_be( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u24_be", "write unsigned 24 bit value, big endian")] - public void WriteU24Big(int addr, uint value, string domain = null) - { - WriteUnsignedBig(addr, value, 3, domain); - } - - #endregion - - #region 4 Byte - - [LuaMethodExample("local inmemrea = memory.read_s32_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s32_le", "read signed 4 byte value, little endian")] - public int ReadS32Little(int addr, string domain = null) - { - return ReadSignedLittleCore(addr, 4, domain); - } - - [LuaMethodExample("memory.write_s32_le( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s32_le", "write signed 4 byte value, little endian")] - public void WriteS32Little(int addr, int value, string domain = null) - { - WriteSignedLittle(addr, value, 4, domain); - } - - [LuaMethodExample("local inmemrea = memory.read_s32_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_s32_be", "read signed 4 byte value, big endian")] - public int ReadS32Big(int addr, string domain = null) - { - return ReadSignedBig(addr, 4, domain); - } - - [LuaMethodExample("memory.write_s32_be( 0x100, -1000, mainmemory.getname( ) );")] - [LuaMethod("write_s32_be", "write signed 4 byte value, big endian")] - public void WriteS32Big(int addr, int value, string domain = null) - { - WriteSignedBig(addr, value, 4, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u32_le( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u32_le", "read unsigned 4 byte value, little endian")] - public uint ReadU32Little(int addr, string domain = null) - { - return ReadUnsignedLittle(addr, 4, domain); - } - - [LuaMethodExample("memory.write_u32_le( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u32_le", "write unsigned 4 byte value, little endian")] - public void WriteU32Little(int addr, uint value, string domain = null) - { - WriteUnsignedLittle(addr, value, 4, domain); - } - - [LuaMethodExample("local uimemrea = memory.read_u32_be( 0x100, mainmemory.getname( ) );")] - [LuaMethod("read_u32_be", "read unsigned 4 byte value, big endian")] - public uint ReadU32Big(int addr, string domain = null) - { - return ReadUnsignedBig(addr, 4, domain); - } - - [LuaMethodExample("memory.write_u32_be( 0x100, 1000, mainmemory.getname( ) );")] - [LuaMethod("write_u32_be", "write unsigned 4 byte value, big endian")] - public void WriteU32Big(int addr, uint value, string domain = null) - { - WriteUnsignedBig(addr, value, 4, domain); - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.MemorySavestate.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.MemorySavestate.cs deleted file mode 100644 index b8a52a6122..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.MemorySavestate.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using NLua; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public sealed class MemorySavestateEmuLuaLibrary : LuaLibraryBase - { - public MemorySavestateEmuLuaLibrary(Lua lua) - : base(lua) { } - - public MemorySavestateEmuLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "memorysavestate"; - - [RequiredService] - private IStatable StatableCore { get; set; } - - private readonly Dictionary _memorySavestates = new Dictionary(); - - [LuaMethodExample("local mmsvstsvcst = memorysavestate.savecorestate( );")] - [LuaMethod("savecorestate", "creates a core savestate and stores it in memory. Note: a core savestate is only the raw data from the core, and not extras such as movie input logs, or framebuffers. Returns a unique identifer for the savestate")] - public string SaveCoreStateToMemory() - { - var guid = Guid.NewGuid(); - var bytes = (byte[])StatableCore.SaveStateBinary().Clone(); - - _memorySavestates.Add(guid, bytes); - - return guid.ToString(); - } - - [LuaMethodExample("memorysavestate.loadcorestate( \"3fcf120f-0778-43fd-b2c5-460fb7d34184\" );")] - [LuaMethod("loadcorestate", "loads an in memory state with the given identifier")] - public void LoadCoreStateFromMemory(string identifier) - { - var guid = new Guid(identifier); - - try - { - var state = _memorySavestates[guid]; - - using (var ms = new MemoryStream(state)) - using (var br = new BinaryReader(ms)) - { - StatableCore.LoadStateBinary(br); - } - } - catch - { - Log("Unable to find the given savestate in memory"); - } - } - - [LuaMethodExample("memorysavestate.removestate( \"3fcf120f-0778-43fd-b2c5-460fb7d34184\" );")] - [LuaMethod("removestate", "removes the savestate with the given identifier from memory")] - public void DeleteState(string identifier) - { - var guid = new Guid(identifier); - _memorySavestates.Remove(guid); - } - - [LuaMethodExample("memorysavestate.clearstatesfrommemory( );")] - [LuaMethod("clearstatesfrommemory", "clears all savestates stored in memory")] - public void ClearInMemoryStates() - { - _memorySavestates.Clear(); - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs deleted file mode 100644 index 4131788a70..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs +++ /dev/null @@ -1,268 +0,0 @@ -using System; -using System.IO; -using NLua; - -namespace BizHawk.Client.Common -{ - public sealed class MovieLuaLibrary : LuaLibraryBase - { - public MovieLuaLibrary(Lua lua) - : base(lua) { } - - public MovieLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "movie"; - - [LuaMethodExample("if ( movie.startsfromsavestate( ) ) then\r\n\tconsole.log( \"Returns whether or not the movie is a savestate-anchored movie\" );\r\nend;")] - [LuaMethod("startsfromsavestate", "Returns whether or not the movie is a savestate-anchored movie")] - public bool StartsFromSavestate() - { - return Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.StartsFromSavestate; - } - - [LuaMethodExample("if ( movie.startsfromsaveram( ) ) then\r\n\tconsole.log( \"Returns whether or not the movie is a saveram-anchored movie\" );\r\nend;")] - [LuaMethod("startsfromsaveram", "Returns whether or not the movie is a saveram-anchored movie")] - public bool StartsFromSaveram() - { - return Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.StartsFromSaveRam; - } - - [LuaMethodExample("local stmovfil = movie.filename( );")] - [LuaMethod("filename", "Returns the file name including path of the currently loaded movie")] - public static string Filename() - { - return Global.MovieSession.Movie.Filename; - } - - [LuaMethodExample("local nlmovget = movie.getinput( 500 );")] - [LuaMethod("getinput", "Returns a table of buttons pressed on a given frame of the loaded movie")] - public LuaTable GetInput(int frame) - { - if (!Global.MovieSession.Movie.IsActive) - { - Log("No movie loaded"); - return null; - } - - var input = Lua.NewTable(); - var adapter = Global.MovieSession.Movie.GetInputState(frame); - - if (adapter == null) - { - Log("Can't get input of the last frame of the movie. Use the previous frame"); - return null; - } - - foreach (var button in adapter.Definition.BoolButtons) - { - input[button] = adapter.IsPressed(button); - } - - foreach (var button in adapter.Definition.FloatControls) - { - input[button] = adapter.GetFloat(button); - } - - return input; - } - - [LuaMethodExample("local stmovget = movie.getinputasmnemonic( 500 );")] - [LuaMethod("getinputasmnemonic", "Returns the input of a given frame of the loaded movie in a raw inputlog string")] - public string GetInputAsMnemonic(int frame) - { - if (Global.MovieSession.Movie.IsActive && frame < Global.MovieSession.Movie.InputLogLength) - { - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.Movie.GetInputState(frame)); - return lg.GenerateLogEntry(); - } - - return ""; - } - - [LuaMethodExample("if ( movie.getreadonly( ) ) then\r\n\tconsole.log( \"Returns true if the movie is in read-only mode, false if in read+write\" );\r\nend;")] - [LuaMethod("getreadonly", "Returns true if the movie is in read-only mode, false if in read+write")] - public static bool GetReadOnly() - { - return Global.MovieSession.ReadOnly; - } - - [LuaMethodExample("local ulmovget = movie.getrerecordcount();")] - [LuaMethod("getrerecordcount", "Gets the rerecord count of the current movie.")] - public static ulong GetRerecordCount() - { - return Global.MovieSession.Movie.Rerecords; - } - - [LuaMethodExample("if ( movie.getrerecordcounting( ) ) then\r\n\tconsole.log( \"Returns whether or not the current movie is incrementing rerecords on loadstate\" );\r\nend;")] - [LuaMethod("getrerecordcounting", "Returns whether or not the current movie is incrementing rerecords on loadstate")] - public static bool GetRerecordCounting() - { - return Global.MovieSession.Movie.IsCountingRerecords; - } - - [LuaMethodExample("if ( movie.isloaded( ) ) then\r\n\tconsole.log( \"Returns true if a movie is loaded in memory ( play, record, or finished modes ), false if not ( inactive mode )\" );\r\nend;")] - [LuaMethod("isloaded", "Returns true if a movie is loaded in memory (play, record, or finished modes), false if not (inactive mode)")] - public static bool IsLoaded() - { - return Global.MovieSession.Movie.IsActive; - } - - [LuaMethodExample("local domovlen = movie.length( );")] - [LuaMethod("length", "Returns the total number of frames of the loaded movie")] - public static double Length() - { - return Global.MovieSession.Movie.FrameCount; - } - - [LuaMethodExample("local stmovmod = movie.mode( );")] - [LuaMethod("mode", "Returns the mode of the current movie. Possible modes: \"PLAY\", \"RECORD\", \"FINISHED\", \"INACTIVE\"")] - public static string Mode() - { - if (Global.MovieSession.Movie.IsFinished) - { - return "FINISHED"; - } - - if (Global.MovieSession.Movie.IsPlaying) - { - return "PLAY"; - } - - if (Global.MovieSession.Movie.IsRecording) - { - return "RECORD"; - } - - return "INACTIVE"; - } - - [LuaMethodExample("movie.save( \"C:\\moviename.ext\" );")] - [LuaMethod("save", "Saves the current movie to the disc. If the filename is provided (no extension or path needed), the movie is saved under the specified name to the current movie directory. The filename may contain a subdirectory, it will be created if it doesn't exist. Existing files won't get overwritten.")] - public void Save(string filename = "") - { - if (!Global.MovieSession.Movie.IsActive) - { - return; - } - - if (!string.IsNullOrEmpty(filename)) - { - filename += "." + Global.MovieSession.Movie.PreferredExtension; - var test = new FileInfo(filename); - if (test.Exists) - { - Log($"File {filename} already exists, will not overwrite"); - return; - } - - Global.MovieSession.Movie.Filename = filename; - } - - Global.MovieSession.Movie.Save(); - } - - [LuaMethodExample("movie.setreadonly( false );")] - [LuaMethod("setreadonly", "Sets the read-only state to the given value. true for read only, false for read+write")] - public static void SetReadOnly(bool readOnly) - { - Global.MovieSession.ReadOnly = readOnly; - } - - [LuaMethodExample("movie.setrerecordcount( 20.0 );")] - [LuaMethod("setrerecordcount", "Sets the rerecord count of the current movie.")] - public static void SetRerecordCount(double count) - { - // Lua numbers are always double, integer precision holds up - // to 53 bits, so throw an error if it's bigger than that. - const double PrecisionLimit = 9007199254740992d; - - if (count > PrecisionLimit) - { - throw new Exception("Rerecord count exceeds Lua integer precision."); - } - - Global.MovieSession.Movie.Rerecords = (ulong)count; - } - - [LuaMethodExample("movie.setrerecordcounting( true );")] - [LuaMethod("setrerecordcounting", "Sets whether or not the current movie will increment the rerecord counter on loadstate")] - public static void SetRerecordCounting(bool counting) - { - Global.MovieSession.Movie.IsCountingRerecords = counting; - } - - [LuaMethodExample("movie.stop( );")] - [LuaMethod("stop", "Stops the current movie")] - public static void Stop() - { - Global.MovieSession.Movie.Stop(); - } - - [LuaMethodExample("local domovget = movie.getfps( );")] - [LuaMethod("getfps", "If a movie is loaded, gets the frames per second used by the movie to determine the movie length time")] - public static double GetFps() - { - if (Global.MovieSession.Movie.IsActive) - { - var movie = Global.MovieSession.Movie; - var system = movie.HeaderEntries[HeaderKeys.PLATFORM]; - var pal = movie.HeaderEntries.ContainsKey(HeaderKeys.PAL) && - movie.HeaderEntries[HeaderKeys.PAL] == "1"; - - return new PlatformFrameRates()[system, pal]; - } - - return 0.0; - } - - [LuaMethodExample("local nlmovget = movie.getheader( );")] - [LuaMethod("getheader", "If a movie is active, will return the movie header as a lua table")] - public LuaTable GetHeader() - { - var luaTable = Lua.NewTable(); - if (Global.MovieSession.Movie.IsActive) - { - foreach (var kvp in Global.MovieSession.Movie.HeaderEntries) - { - luaTable[kvp.Key] = kvp.Value; - } - } - - return luaTable; - } - - [LuaMethodExample("local nlmovget = movie.getcomments( );")] - [LuaMethod("getcomments", "If a movie is active, will return the movie comments as a lua table")] - public LuaTable GetComments() - { - var luaTable = Lua.NewTable(); - if (Global.MovieSession.Movie.IsActive) - { - for (int i = 0; i < Global.MovieSession.Movie.Comments.Count; i++) - { - luaTable[i] = Global.MovieSession.Movie.Comments[i]; - } - } - - return luaTable; - } - - [LuaMethodExample("local nlmovget = movie.getsubtitles( );")] - [LuaMethod("getsubtitles", "If a movie is active, will return the movie subtitles as a lua table")] - public LuaTable GetSubtitles() - { - var luaTable = Lua.NewTable(); - if (Global.MovieSession.Movie.IsActive) - { - for (int i = 0; i < Global.MovieSession.Movie.Subtitles.Count; i++) - { - luaTable[i] = Global.MovieSession.Movie.Subtitles[i].ToString(); - } - } - - return luaTable; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs deleted file mode 100644 index d1e4ea11b1..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.ComponentModel; -using System.Linq; - -using NLua; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; - -namespace BizHawk.Client.Common -{ - [Description("Functions related specifically to Nes Cores")] - public sealed class NesLuaLibrary : LuaLibraryBase - { - // TODO: - // perhaps with the new core config system, one could - // automatically bring out all of the settings to a lua table, with names. that - // would be completely arbitrary and would remove the whole requirement for this mess - public NesLuaLibrary(Lua lua) - : base(lua) { } - - [OptionalService] - private NES Neshawk { get; set; } - - [OptionalService] - private QuickNES Quicknes { get; set; } - - [OptionalService] - private IMemoryDomains MemoryDomains { get; set; } - - private bool NESAvailable => Neshawk != null || Quicknes != null; - - private bool HasMemoryDOmains => MemoryDomains != null; - - public NesLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "nes"; - - [LuaMethodExample("nes.addgamegenie( \"GXXZZLVI\" );")] - [LuaMethod("addgamegenie", "Adds the specified game genie code. If an NES game is not currently loaded or the code is not a valid game genie code, this will have no effect")] - public void AddGameGenie(string code) - { - if (NESAvailable && HasMemoryDOmains) - { - var decoder = new NESGameGenieDecoder(code); - var watch = Watch.GenerateWatch( - MemoryDomains["System Bus"], - decoder.Address, - WatchSize.Byte, - DisplayType.Hex, - false, - code); - - Global.CheatList.Add(new Cheat( - watch, - decoder.Value, - decoder.Compare)); - } - } - - [LuaMethodExample("if ( nes.getallowmorethaneightsprites( ) ) then\r\n\tconsole.log( \"Gets the NES setting 'Allow more than 8 sprites per scanline' value\" );\r\nend;")] - [LuaMethod("getallowmorethaneightsprites", "Gets the NES setting 'Allow more than 8 sprites per scanline' value")] - public bool GetAllowMoreThanEightSprites() - { - if (Quicknes != null) - { - return Quicknes.GetSettings().NumSprites != 8; - } - - if (Neshawk != null) - { - return Neshawk.GetSettings().AllowMoreThanEightSprites; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("local innesget = nes.getbottomscanline( false );")] - [LuaMethod("getbottomscanline", "Gets the current value for the bottom scanline value")] - public int GetBottomScanline(bool pal = false) - { - if (Quicknes != null) - { - return Quicknes.GetSettings().ClipTopAndBottom ? 231 : 239; - } - - if (Neshawk != null) - { - return pal - ? Neshawk.GetSettings().PAL_BottomLine - : Neshawk.GetSettings().NTSC_BottomLine; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("if ( nes.getclipleftandright( ) ) then\r\n\tconsole.log( \"Gets the current value for the Clip Left and Right sides option\" );\r\nend;")] - [LuaMethod("getclipleftandright", "Gets the current value for the Clip Left and Right sides option")] - public bool GetClipLeftAndRight() - { - if (Quicknes != null) - { - return Quicknes.GetSettings().ClipLeftAndRight; - } - - if (Neshawk != null) - { - return Neshawk.GetSettings().ClipLeftAndRight; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("if ( nes.getdispbackground( ) ) then\r\n\tconsole.log( \"Indicates whether or not the bg layer is being displayed\" );\r\nend;")] - [LuaMethod("getdispbackground", "Indicates whether or not the bg layer is being displayed")] - public bool GetDisplayBackground() - { - if (Quicknes != null) - { - return true; - } - - if (Neshawk != null) - { - return Neshawk.GetSettings().DispBackground; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("if ( nes.getdispsprites( ) ) then\r\n\tconsole.log( \"Indicates whether or not sprites are being displayed\" );\r\nend;")] - [LuaMethod("getdispsprites", "Indicates whether or not sprites are being displayed")] - public bool GetDisplaySprites() - { - if (Quicknes != null) - { - return Quicknes.GetSettings().NumSprites > 0; - } - - if (Neshawk != null) - { - return Neshawk.GetSettings().DispSprites; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("local innesget = nes.gettopscanline(false);")] - [LuaMethod("gettopscanline", "Gets the current value for the top scanline value")] - public int GetTopScanline(bool pal = false) - { - if (Quicknes != null) - { - return Quicknes.GetSettings().ClipTopAndBottom ? 8 : 0; - } - - if (Neshawk != null) - { - return pal - ? Neshawk.GetSettings().PAL_TopLine - : Neshawk.GetSettings().NTSC_TopLine; - } - - throw new InvalidOperationException(); - } - - [LuaMethodExample("nes.removegamegenie( \"GXXZZLVI\" );")] - [LuaMethod("removegamegenie", "Removes the specified game genie code. If an NES game is not currently loaded or the code is not a valid game genie code, this will have no effect")] - public void RemoveGameGenie(string code) - { - if (NESAvailable) - { - var decoder = new NESGameGenieDecoder(code); - Global.CheatList.RemoveRange( - Global.CheatList.Where(c => c.Address == decoder.Address)); - } - } - - [LuaMethodExample("nes.setallowmorethaneightsprites( true );")] - [LuaMethod("setallowmorethaneightsprites", "Sets the NES setting 'Allow more than 8 sprites per scanline'")] - public void SetAllowMoreThanEightSprites(bool allow) - { - if (Neshawk != null) - { - var s = Neshawk.GetSettings(); - s.AllowMoreThanEightSprites = allow; - Neshawk.PutSettings(s); - } - else if (Quicknes != null) - { - var s = Quicknes.GetSettings(); - s.NumSprites = allow ? 64 : 8; - Quicknes.PutSettings(s); - } - } - - [LuaMethodExample("nes.setclipleftandright( true );")] - [LuaMethod("setclipleftandright", "Sets the Clip Left and Right sides option")] - public void SetClipLeftAndRight(bool leftandright) - { - if (Neshawk != null) - { - var s = Neshawk.GetSettings(); - s.ClipLeftAndRight = leftandright; - Neshawk.PutSettings(s); - } - else if (Quicknes != null) - { - var s = Quicknes.GetSettings(); - s.ClipLeftAndRight = leftandright; - Quicknes.PutSettings(s); - } - } - - [LuaMethodExample("nes.setdispbackground( true );")] - [LuaMethod("setdispbackground", "Sets whether or not the background layer will be displayed")] - public void SetDisplayBackground(bool show) - { - if (Neshawk != null) - { - var s = Neshawk.GetSettings(); - s.DispBackground = show; - Neshawk.PutSettings(s); - } - } - - [LuaMethodExample("nes.setdispsprites( true );")] - [LuaMethod("setdispsprites", "Sets whether or not sprites will be displayed")] - public void SetDisplaySprites(bool show) - { - if (Neshawk != null) - { - var s = Neshawk.GetSettings(); - s.DispSprites = show; - Neshawk.PutSettings(s); - } - else if (Quicknes != null) - { - var s = Quicknes.GetSettings(); - s.NumSprites = show ? 8 : 0; - Quicknes.PutSettings(s); - } - } - - [LuaMethodExample("nes.setscanlines( 10, 20, false );")] - [LuaMethod("setscanlines", "sets the top and bottom scanlines to be drawn (same values as in the graphics options dialog). Top must be in the range of 0 to 127, bottom must be between 128 and 239. Not supported in the Quick Nes core")] - public void SetScanlines(int top, int bottom, bool pal = false) - { - if (Neshawk != null) - { - if (top > 127) - { - top = 127; - } - else if (top < 0) - { - top = 0; - } - - if (bottom > 239) - { - bottom = 239; - } - else if (bottom < 128) - { - bottom = 128; - } - - var s = Neshawk.GetSettings(); - - if (pal) - { - s.PAL_TopLine = top; - s.PAL_BottomLine = bottom; - } - else - { - s.NTSC_TopLine = top; - s.NTSC_BottomLine = bottom; - } - - Neshawk.PutSettings(s); - } - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs deleted file mode 100644 index 3a5bbdc617..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.ComponentModel; -using BizHawk.Emulation.Common; -using NLua; -using BizHawk.Emulation.Cores.Nintendo.SNES; - -namespace BizHawk.Client.Common -{ - [Description("Functions specific to SNESHawk (functions may not run when an SNES game is not loaded)")] - public sealed class SnesLuaLibrary : LuaLibraryBase - { - [OptionalService] - private LibsnesCore Snes { get; set; } - - public SnesLuaLibrary(Lua lua) - : base(lua) { } - - public SnesLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "snes"; - - private LibsnesCore.SnesSettings GetSettings() - { - if (Snes != null) - { - return Snes.GetSettings(); - } - - return new LibsnesCore.SnesSettings(); - } - - private void PutSettings(LibsnesCore.SnesSettings settings) - { - Snes?.PutSettings(settings); - } - - [LuaMethodExample("if ( snes.getlayer_bg_1( ) ) then\r\n\tconsole.log( \"Returns whether the bg 1 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bg_1", "Returns whether the bg 1 layer is displayed")] - public bool GetLayerBg1() - { - return GetSettings().ShowBG1_1; - } - - [LuaMethodExample("if ( snes.getlayer_bg_2( ) ) then\r\n\tconsole.log( \"Returns whether the bg 2 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bg_2", "Returns whether the bg 2 layer is displayed")] - public bool GetLayerBg2() - { - return GetSettings().ShowBG2_1; - } - - [LuaMethodExample("if ( snes.getlayer_bg_3( ) ) then\r\n\tconsole.log( \"Returns whether the bg 3 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bg_3", "Returns whether the bg 3 layer is displayed")] - public bool GetLayerBg3() - { - return GetSettings().ShowBG3_1; - } - - [LuaMethodExample("if ( snes.getlayer_bg_4( ) ) then\r\n\tconsole.log( \"Returns whether the bg 4 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_bg_4", "Returns whether the bg 4 layer is displayed")] - public bool GetLayerBg4() - { - return GetSettings().ShowBG4_1; - } - - [LuaMethodExample("if ( snes.getlayer_obj_1( ) ) then\r\n\tconsole.log( \"Returns whether the obj 1 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_obj_1", "Returns whether the obj 1 layer is displayed")] - public bool GetLayerObj1() - { - return GetSettings().ShowOBJ_0; - } - - [LuaMethodExample("if ( snes.getlayer_obj_2( ) ) then\r\n\tconsole.log( \"Returns whether the obj 2 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_obj_2", "Returns whether the obj 2 layer is displayed")] - public bool GetLayerObj2() - { - return GetSettings().ShowOBJ_1; - } - - [LuaMethodExample("if ( snes.getlayer_obj_3( ) ) then\r\n\tconsole.log( \"Returns whether the obj 3 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_obj_3", "Returns whether the obj 3 layer is displayed")] - public bool GetLayerObj3() - { - return GetSettings().ShowOBJ_2; - } - - [LuaMethodExample("if ( snes.getlayer_obj_4( ) ) then\r\n\tconsole.log( \"Returns whether the obj 4 layer is displayed\" );\r\nend;")] - [LuaMethod("getlayer_obj_4", "Returns whether the obj 4 layer is displayed")] - public bool GetLayerObj4() - { - return GetSettings().ShowOBJ_3; - } - - [LuaMethodExample("snes.setlayer_bg_1( true );")] - [LuaMethod("setlayer_bg_1", "Sets whether the bg 1 layer is displayed")] - public void SetLayerBg1(bool value) - { - var s = GetSettings(); - s.ShowBG1_1 = s.ShowBG1_0 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_bg_2( true );")] - [LuaMethod("setlayer_bg_2", "Sets whether the bg 2 layer is displayed")] - public void SetLayerBg2(bool value) - { - var s = GetSettings(); - s.ShowBG2_1 = s.ShowBG2_0 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_bg_3( true );")] - [LuaMethod("setlayer_bg_3", "Sets whether the bg 3 layer is displayed")] - public void SetLayerBg3(bool value) - { - var s = GetSettings(); - s.ShowBG3_1 = s.ShowBG3_0 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_bg_4( true );")] - [LuaMethod("setlayer_bg_4", "Sets whether the bg 4 layer is displayed")] - public void SetLayerBg4(bool value) - { - var s = GetSettings(); - s.ShowBG4_1 = s.ShowBG4_0 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_obj_1( true );")] - [LuaMethod("setlayer_obj_1", "Sets whether the obj 1 layer is displayed")] - public void SetLayerObj1(bool value) - { - var s = GetSettings(); - s.ShowOBJ_0 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_obj_2( true );")] - [LuaMethod("setlayer_obj_2", "Sets whether the obj 2 layer is displayed")] - public void SetLayerObj2(bool value) - { - var s = GetSettings(); - s.ShowOBJ_1 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_obj_3( true );")] - [LuaMethod("setlayer_obj_3", "Sets whether the obj 3 layer is displayed")] - public void SetLayerObj3(bool value) - { - var s = GetSettings(); - s.ShowOBJ_2 = value; - PutSettings(s); - } - - [LuaMethodExample("snes.setlayer_obj_4( true );")] - [LuaMethod("setlayer_obj_4", "Sets whether the obj 4 layer is displayed")] - public void SetLayerObj4(bool value) - { - var s = GetSettings(); - s.ShowOBJ_3 = value; - PutSettings(s); - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.SQL.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.SQL.cs deleted file mode 100644 index 5cbc8d2df2..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.SQL.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data.SQLite; -using NLua; - -namespace BizHawk.Client.Common -{ - [Description("A library for performing SQLite operations.")] - public sealed class SQLLuaLibrary : LuaLibraryBase - { - public SQLLuaLibrary(Lua lua) - : base(lua) { } - - public SQLLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "SQL"; - - SQLiteConnection m_dbConnection; - string connectionString; - - [LuaMethodExample("local stSQLcre = SQL.createdatabase( \"eg_db\" );")] - [LuaMethod("createdatabase", "Creates a SQLite Database. Name should end with .db")] - public string CreateDatabase(string name) - { - try - { - SQLiteConnection.CreateFile(name); - return "Database Created Successfully"; - } - catch (SQLiteException sqlEX) - { - return sqlEX.Message; - } - - } - - - [LuaMethodExample("local stSQLope = SQL.opendatabase( \"eg_db\" );")] - [LuaMethod("opendatabase", "Opens a SQLite database. Name should end with .db")] - public string OpenDatabase(string name) - { - try - { - SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder(); - connBuilder.DataSource = name; - connBuilder.Version = 3; //SQLite version - connBuilder.JournalMode = SQLiteJournalModeEnum.Wal; //Allows for reads and writes to happen at the same time - connBuilder.DefaultIsolationLevel = System.Data.IsolationLevel.ReadCommitted; //This only helps make the database lock left. May be pointless now - connBuilder.SyncMode = SynchronizationModes.Off; //This shortens the delay for do synchronous calls. - m_dbConnection = new SQLiteConnection(connBuilder.ToString()); - connectionString = connBuilder.ToString(); - m_dbConnection.Open(); - m_dbConnection.Close(); - return "Database Opened Successfully"; - } - catch (SQLiteException sqlEX) - { - return sqlEX.Message; - } - } - - [LuaMethodExample("local stSQLwri = SQL.writecommand( \"CREATE TABLE eg_tab ( eg_tab_id integer PRIMARY KEY, eg_tab_row_name text NOT NULL ); INSERT INTO eg_tab ( eg_tab_id, eg_tab_row_name ) VALUES ( 1, 'Example table row' );\" );")] - [LuaMethod("writecommand", "Runs a SQLite write command which includes CREATE,INSERT, UPDATE. " + - "Ex: create TABLE rewards (ID integer PRIMARY KEY, action VARCHAR(20)) ")] - public string WriteCommand(string query = "") - { - if (query == "") - { - return "query is empty"; - } - try - { - m_dbConnection.Open(); - string sql = query; - SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); - command.ExecuteNonQuery(); - m_dbConnection.Close(); - - return "Command ran successfully"; - - } - catch (NullReferenceException nullEX) - { - return "Database not open."; - } - catch (SQLiteException sqlEX) - { - m_dbConnection.Close(); - return sqlEX.Message; - } - } - - [LuaMethodExample("local obSQLrea = SQL.readcommand( \"SELECT * FROM eg_tab WHERE eg_tab_id = 1;\" );")] - [LuaMethod("readcommand", "Run a SQLite read command which includes Select. Returns all rows into a LuaTable." + - "Ex: select * from rewards")] - public dynamic ReadCommand(string query = "") - { - if (query == "") - { - return "query is empty"; - } - try - { - var table = Lua.NewTable(); - m_dbConnection.Open(); - string sql = "PRAGMA read_uncommitted =1;" + query; - SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); - SQLiteDataReader reader = command.ExecuteReader(); - bool rows = reader.HasRows; - long rowCount = 0; - var columns = new List(); - for (int i = 0; i < reader.FieldCount; ++i) //Add all column names into list - { - columns.Add(reader.GetName(i)); - } - while (reader.Read()) - { - for (int i = 0; i < reader.FieldCount; ++i) - { - table[columns[i] + " " + rowCount.ToString()] = reader.GetValue(i); - } - rowCount += 1; - } - reader.Close(); - m_dbConnection.Close(); - if (rows == false) - { - return "No rows found"; - } - - return table; - - } - catch (NullReferenceException) - { - return "Database not opened."; - } - catch (SQLiteException sqlEX) - { - m_dbConnection.Close(); - return sqlEX.Message; - } - } - - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs deleted file mode 100644 index d73936aa17..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.ComponentModel; -using System.Linq; - -using NLua; - -namespace BizHawk.Client.Common -{ - [Description("A library exposing standard .NET string methods")] - public sealed class StringLuaLibrary : LuaLibraryBase - { - public override string Name => "bizstring"; - - public StringLuaLibrary(Lua lua) - : base(lua) { } - - public StringLuaLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - [LuaMethodExample("local stbizhex = bizstring.hex( -12345 );")] - [LuaMethod("hex", "Converts the number to a string representation of the hexadecimal value of the given number")] - public static string Hex(long num) - { - var hex = $"{num:X}"; - if (hex.Length == 1) - { - hex = "0" + hex; - } - - return hex; - } - - [LuaMethodExample("local stbizbin = bizstring.binary( -12345 );")] - [LuaMethod("binary", "Converts the number to a string representation of the binary value of the given number")] - public static string Binary(long num) - { - var binary = Convert.ToString(num, 2); - binary = binary.TrimStart('0'); - return binary; - } - - [LuaMethodExample("local stbizoct = bizstring.octal( -12345 );")] - [LuaMethod("octal", "Converts the number to a string representation of the octal value of the given number")] - public static string Octal(long num) - { - var octal = Convert.ToString(num, 8); - if (octal.Length == 1) - { - octal = "0" + octal; - } - - return octal; - } - - [LuaMethodExample("local stbiztri = bizstring.trim( \"Some trim string\t \" );")] - [LuaMethod("trim", "returns a string that trims whitespace on the left and right ends of the string")] - public static string Trim(string str) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.Trim(); - } - - [LuaMethodExample("local stbizrep = bizstring.replace( \"Some string\", \"Some\", \"Replaced\" );")] - [LuaMethod("replace", "Returns a string that replaces all occurances of str2 in str1 with the value of replace")] - public static string Replace(string str, string str2, string replace) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.Replace(str2, replace); - } - - [LuaMethodExample("local stbiztou = bizstring.toupper( \"Some string\" );")] - [LuaMethod("toupper", "Returns an uppercase version of the given string")] - public static string ToUpper(string str) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.ToUpper(); - } - - [LuaMethodExample("local stbiztol = bizstring.tolower( \"Some string\" );")] - [LuaMethod("tolower", "Returns an lowercase version of the given string")] - public static string ToLower(string str) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.ToLower(); - } - - [LuaMethodExample("local stbizsub = bizstring.substring( \"Some string\", 6, 3 );")] - [LuaMethod("substring", "Returns a string that represents a substring of str starting at position for the specified length")] - public static string SubString(string str, int position, int length) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.Substring(position, length); - } - - [LuaMethodExample("local stbizrem = bizstring.remove( \"Some string\", 4, 5 );")] - [LuaMethod("remove", "Returns a string that represents str with the given position and count removed")] - public static string Remove(string str, int position, int count) - { - if (string.IsNullOrEmpty(str)) - { - return null; - } - - return str.Remove(position, count); - } - - [LuaMethodExample("if ( bizstring.contains( \"Some string\", \"Some\") ) then\r\n\tconsole.log( \"Returns whether or not str contains str2\" );\r\nend;")] - [LuaMethod("contains", "Returns whether or not str contains str2")] - public static bool Contains(string str, string str2) - { - if (string.IsNullOrEmpty(str)) - { - return false; - } - - return str.Contains(str2); - } - - [LuaMethodExample("if ( bizstring.startswith( \"Some string\", \"Some\") ) then\r\n\tconsole.log( \"Returns whether str starts with str2\" );\r\nend;")] - [LuaMethod("startswith", "Returns whether str starts with str2")] - public static bool StartsWith(string str, string str2) - { - if (string.IsNullOrEmpty(str)) - { - return false; - } - - return str.StartsWith(str2); - } - - [LuaMethodExample("if ( bizstring.endswith( \"Some string\", \"string\") ) then\r\n\tconsole.log( \"Returns whether str ends wth str2\" );\r\nend;")] - [LuaMethod("endswith", "Returns whether str ends wth str2")] - public static bool EndsWith(string str, string str2) - { - if (string.IsNullOrEmpty(str)) - { - return false; - } - - return str.EndsWith(str2); - } - - [LuaMethodExample("local nlbizspl = bizstring.split( \"Some, string\", \", \" );")] - [LuaMethod("split", "Splits str based on separator into a LuaTable. Separator must be one character!. Same functionality as .NET string.Split() using the RemoveEmptyEntries option")] - public LuaTable Split(string str, string separator) - { - var table = Lua.NewTable(); - if (!string.IsNullOrEmpty(str)) - { - var splitStr = str.Split( - new[] { separator.FirstOrDefault() }, - StringSplitOptions.RemoveEmptyEntries); - - for (int i = 0; i < splitStr.Length; i++) - { - table[i + 1] = splitStr[i]; - } - } - - return table; - } - } -} diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.UserData.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.UserData.cs deleted file mode 100644 index 101674a187..0000000000 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.UserData.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.ComponentModel; - -using NLua; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - [Description("A library for setting and retrieving dynamic data that will be saved and loaded with savestates")] - public sealed class UserDataLibrary : LuaLibraryBase - { - public UserDataLibrary(Lua lua) - : base(lua) { } - - public UserDataLibrary(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - public override string Name => "userdata"; - - [LuaMethodExample("userdata.set(\"Unique key\", \"Current key data\");")] - [LuaMethod("set", "adds or updates the data with the given key with the given value")] - public void Set(string name, object value) - { - if (value != null) - { - var t = value.GetType(); - if (!t.IsPrimitive && t != typeof(string)) - { - throw new InvalidOperationException("Invalid type for userdata"); - } - } - - Global.UserBag[name] = value; - } - - [LuaMethodExample("local obuseget = userdata.get( \"Unique key\" );")] - [LuaMethod("get", "gets the data with the given key, if the key does not exist it will return nil")] - public object Get(string key) - { - if (Global.UserBag.ContainsKey(key)) - { - return Global.UserBag[key]; - } - - return null; - } - - [LuaMethodExample("userdata.clear( );")] - [LuaMethod("clear", "clears all user data")] - public void Clear() - { - Global.UserBag.Clear(); - } - - [LuaMethodExample("if ( userdata.remove( \"Unique key\" ) ) then\r\n\tconsole.log( \"remove the data with the given key.Returns true if the element is successfully found and removed; otherwise, false.\" );\r\nend;")] - [LuaMethod("remove", "remove the data with the given key. Returns true if the element is successfully found and removed; otherwise, false.")] - public bool Remove(string key) - { - return Global.UserBag.Remove(key); - } - - [LuaMethodExample("if ( userdata.containskey( \"Unique key\" ) ) then\r\n\tconsole.log( \"returns whether or not there is an entry for the given key\" );\r\nend;")] - [LuaMethod("containskey", "returns whether or not there is an entry for the given key")] - public bool ContainsKey(string key) - { - return Global.UserBag.ContainsKey(key); - } - } -} diff --git a/BizHawk.Client.Common/lua/LuaAttributes.cs b/BizHawk.Client.Common/lua/LuaAttributes.cs deleted file mode 100644 index 398046f01a..0000000000 --- a/BizHawk.Client.Common/lua/LuaAttributes.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -namespace BizHawk.Client.Common -{ - [AttributeUsage(AttributeTargets.Method)] - public class LuaMethodAttribute : Attribute - { - public LuaMethodAttribute(string name, string description) - { - Name = name; - Description = description; - } - - public string Name { get; } - public string Description { get; } - } - - [AttributeUsage(AttributeTargets.Method)] - public class LuaMethodExampleAttribute : Attribute - { - public LuaMethodExampleAttribute(string example) - { - Example = example; - } - - public string Name { get; } - public string Example { get; } - } - - [AttributeUsage(AttributeTargets.Class)] - public class LuaLibraryAttribute : Attribute - { - public LuaLibraryAttribute(bool released) - { - Released = released; - } - - public bool Released { get; } - } -} diff --git a/BizHawk.Client.Common/lua/LuaExamples.cs b/BizHawk.Client.Common/lua/LuaExamples.cs deleted file mode 100644 index ff39999bad..0000000000 --- a/BizHawk.Client.Common/lua/LuaExamples.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace BizHawk.Client.Common -{ - [AttributeUsage(AttributeTargets.Method)] - public class LuaMethodExample : Attribute - { - public LuaMethodExample(string name, string example) - { - Name = name; - Example = example; - } - - public string Name { get; } - public string Example { get; } - } - - [AttributeUsage(AttributeTargets.Class)] - public class LuaLibraryExample : Attribute - { - public LuaLibraryExample(bool released) - { - Released = released; - } - - public bool Released { get; } - } -} diff --git a/BizHawk.Client.Common/lua/LuaFunctionList.cs b/BizHawk.Client.Common/lua/LuaFunctionList.cs deleted file mode 100644 index 45ec368722..0000000000 --- a/BizHawk.Client.Common/lua/LuaFunctionList.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public class LuaFunctionList : List - { - public NamedLuaFunction this[string guid] - { - get - { - return this.FirstOrDefault(nlf => nlf.Guid.ToString() == guid); - } - } - - public new bool Remove(NamedLuaFunction function) - { - if (Global.Emulator.InputCallbacksAvailable()) - { - Global.Emulator.AsInputPollable().InputCallbacks.Remove(function.Callback); - } - - if (Global.Emulator.MemoryCallbacksAvailable()) - { - Global.Emulator.AsDebuggable().MemoryCallbacks.Remove(function.Callback); - } - - return base.Remove(function); - } - - public void ClearAll() - { - if (Global.Emulator.InputCallbacksAvailable()) - { - Global.Emulator.AsInputPollable().InputCallbacks.RemoveAll(this.Select(w => w.Callback)); - } - - if (Global.Emulator.MemoryCallbacksAvailable()) - { - var memoryCallbacks = Global.Emulator.AsDebuggable().MemoryCallbacks; - memoryCallbacks.RemoveAll(this.Select(w => w.Callback)); - } - - Clear(); - } - } -} diff --git a/BizHawk.Client.Common/lua/LuaHelper.cs b/BizHawk.Client.Common/lua/LuaHelper.cs deleted file mode 100644 index 2d04fcad95..0000000000 --- a/BizHawk.Client.Common/lua/LuaHelper.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Linq; -using System.Reflection; - -using NLua; - -namespace BizHawk.Client.Common -{ - public static class LuaHelper - { - public static LuaTable ToLuaTable(Lua lua, object obj) - { - var table = lua.NewTable(); - - var type = obj.GetType(); - - var methods = type.GetMethods(); - foreach (var method in methods) - { - if (method.IsPublic) - { - string luaName = ""; // Empty will default to the actual method name; - - var luaMethodAttr = (LuaMethodAttribute)method.GetCustomAttributes(typeof(LuaMethodAttribute)).FirstOrDefault(); - if (luaMethodAttr != null) - { - luaName = luaMethodAttr.Name; - } - - table[method.Name] = lua.RegisterFunction(luaName, obj, method); - } - } - - return table; - } - } -} diff --git a/BizHawk.Client.Common/lua/LuaLibraryBase.cs b/BizHawk.Client.Common/lua/LuaLibraryBase.cs deleted file mode 100644 index bcf0a6845e..0000000000 --- a/BizHawk.Client.Common/lua/LuaLibraryBase.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Drawing; -using System.Linq; -using System.Threading; - -using NLua; -using BizHawk.Common.ReflectionExtensions; - -namespace BizHawk.Client.Common -{ - public abstract class LuaLibraryBase - { - protected LuaLibraryBase(Lua lua) - { - Lua = lua; - } - - protected LuaLibraryBase(Lua lua, Action logOutputCallback) - : this(lua) - { - LogOutputCallback = logOutputCallback; - } - - protected static Lua CurrentThread { get; private set; } - - private static Thread CurrentHostThread; - private static readonly object ThreadMutex = new object(); - - public abstract string Name { get; } - public Action LogOutputCallback { protected get; set; } - protected Lua Lua { get; } - - public static void ClearCurrentThread() - { - lock (ThreadMutex) - { - CurrentHostThread = null; - CurrentThread = null; - } - } - - public static void SetCurrentThread(Lua luaThread) - { - lock (ThreadMutex) - { - if (CurrentHostThread != null) - { - throw new InvalidOperationException("Can't have lua running in two host threads at a time!"); - } - - CurrentHostThread = Thread.CurrentThread; - CurrentThread = luaThread; - } - } - - protected static int LuaInt(object luaArg) - { - return (int)(double)luaArg; - } - - protected static uint LuaUInt(object luaArg) - { - return (uint)(double)luaArg; - } - - protected static Color? ToColor(object o) - { - if (o == null) - { - return null; - } - - if (o.GetType() == typeof(double)) - { - return Color.FromArgb((int)(long)(double)o); - } - - if (o.GetType() == typeof(string)) - { - return Color.FromName(o.ToString()); - } - - return null; - } - - protected void Log(object message) - { - LogOutputCallback?.Invoke(message.ToString()); - } - - public void LuaRegister(Type callingLibrary, LuaDocumentation docs = null) - { - Lua.NewTable(Name); - - var luaAttr = typeof(LuaMethodAttribute); - - var methods = GetType() - .GetMethods() - .Where(m => m.GetCustomAttributes(luaAttr, false).Any()); - - foreach (var method in methods) - { - var luaMethodAttr = (LuaMethodAttribute)method.GetCustomAttributes(luaAttr, false).First(); - var luaName = Name + "." + luaMethodAttr.Name; - Lua.RegisterFunction(luaName, this, method); - - docs?.Add(new LibraryFunction(Name, callingLibrary.Description(), method)); - } - } - } -} diff --git a/BizHawk.Client.Common/lua/LuaMemoryBase.cs b/BizHawk.Client.Common/lua/LuaMemoryBase.cs deleted file mode 100644 index b0b814983c..0000000000 --- a/BizHawk.Client.Common/lua/LuaMemoryBase.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using NLua; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - /// - /// Base class for the Memory and MainMemory lua libraries - /// - public abstract class LuaMemoryBase : LuaLibraryBase - { - [RequiredService] - protected IEmulator Emulator { get; set; } - - [OptionalService] - protected IMemoryDomains MemoryDomainCore { get; set; } - - protected LuaMemoryBase(Lua lua) - : base(lua) { } - - protected LuaMemoryBase(Lua lua, Action logOutputCallback) - : base(lua, logOutputCallback) { } - - protected abstract MemoryDomain Domain { get; } - - protected IMemoryDomains DomainList - { - get - { - if (MemoryDomainCore != null) - { - return MemoryDomainCore; - } - - var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains"; - Log(error); - throw new NotImplementedException(error); - } - } - - public string VerifyMemoryDomain(string domain) - { - try - { - if (DomainList[domain] == null) - { - Log($"Unable to find domain: {domain}, falling back to current"); - return Domain.Name; - } - - return domain; - } - catch // Just in case - { - Log($"Unable to find domain: {domain}, falling back to current"); - } - - return Domain.Name; - } - - protected uint ReadUnsignedByte(int addr, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (addr < d.Size) - { - return d.PeekByte(addr); - } - - Log("Warning: attempted read of " + addr + - " outside the memory size of " + d.Size); - return 0; - } - - protected void WriteUnsignedByte(int addr, uint v, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - if (addr < Domain.Size) - { - d.PokeByte(addr, (byte)v); - } - else - { - Log("Warning: attempted write to " + addr + - " outside the memory size of " + d.Size); - } - } - else - { - Log($"Error: the domain {d.Name} is not writable"); - } - } - - protected static int U2S(uint u, int size) - { - var s = (int)u; - s <<= 8 * (4 - size); - s >>= 8 * (4 - size); - return s; - } - - protected int ReadSignedLittleCore(int addr, int size, string domain = null) - { - return U2S(ReadUnsignedLittle(addr, size, domain), size); - } - - protected uint ReadUnsignedLittle(int addr, int size, string domain = null) - { - uint v = 0; - for (var i = 0; i < size; ++i) - { - v |= ReadUnsignedByte(addr + i, domain) << (8 * i); - } - - return v; - } - - protected int ReadSignedBig(int addr, int size, string domain = null) - { - return U2S(ReadUnsignedBig(addr, size, domain), size); - } - - protected uint ReadUnsignedBig(int addr, int size, string domain = null) - { - uint v = 0; - for (var i = 0; i < size; ++i) - { - v |= ReadUnsignedByte(addr + i, domain) << (8 * (size - 1 - i)); - } - - return v; - } - - protected void WriteSignedLittle(int addr, int v, int size, string domain = null) - { - WriteUnsignedLittle(addr, (uint)v, size, domain); - } - - protected void WriteUnsignedLittle(int addr, uint v, int size, string domain = null) - { - for (var i = 0; i < size; ++i) - { - WriteUnsignedByte(addr + i, (v >> (8 * i)) & 0xFF, domain); - } - } - - protected void WriteSignedBig(int addr, int v, int size, string domain = null) - { - WriteUnsignedBig(addr, (uint)v, size, domain); - } - - protected void WriteUnsignedBig(int addr, uint v, int size, string domain = null) - { - for (var i = 0; i < size; ++i) - { - WriteUnsignedByte(addr + i, (v >> (8 * (size - 1 - i))) & 0xFF, domain); - } - } - - protected uint ReadSignedLittle(int addr, int size) // only used by mainmemory, so no domain can be passed - { - uint v = 0; - for (var i = 0; i < size; ++i) - { - v |= ReadUnsignedByte(addr + i) << (8 * i); - } - - return v; - } - - #region public Library implementations - - protected LuaTable ReadByteRange(int addr, int length, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - var lastAddr = length + addr; - var table = Lua.NewTable(); - if (lastAddr <= d.Size) - { - for (var i = 0; i < length; i++) - { - int a = addr + i; - var v = d.PeekByte(a); - table[i] = v; - } - } - else - { - Log("Warning: Attempted read " + lastAddr + " outside memory domain size of " + - d.Size + " in readbyterange()"); - } - - return table; - } - - protected void WriteByteRange(LuaTable memoryblock, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - foreach (var address in memoryblock.Keys) - { - var addr = LuaInt(address); - if (addr < d.Size) - { - d.PokeByte(addr, (byte)LuaInt(memoryblock[address])); - } - else - { - Log("Warning: Attempted write " + addr + " outside memory domain size of " + - d.Size + " in writebyterange()"); - } - } - } - else - { - Log($"Error: the domain {d.Name} is not writable"); - } - } - - protected float ReadFloat(int addr, bool bigendian, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (addr < d.Size) - { - var val = d.PeekUint(addr, bigendian); - var bytes = BitConverter.GetBytes(val); - return BitConverter.ToSingle(bytes, 0); - } - - Log("Warning: Attempted read " + addr + - " outside memory size of " + d.Size); - - return 0; - } - - protected void WriteFloat(int addr, double value, bool bigendian, string domain = null) - { - var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; - if (d.CanPoke()) - { - if (addr < d.Size) - { - var dv = (float)value; - var bytes = BitConverter.GetBytes(dv); - var v = BitConverter.ToUInt32(bytes, 0); - d.PokeUint(addr, v, bigendian); - } - else - { - Log("Warning: Attempted write " + addr + - " outside memory size of " + d.Size); - } - } - else - { - Log($"Error: the domain {Domain.Name} is not writable"); - } - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/lua/LuaSandbox.cs b/BizHawk.Client.Common/lua/LuaSandbox.cs deleted file mode 100644 index 7a025ebfa6..0000000000 --- a/BizHawk.Client.Common/lua/LuaSandbox.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using NLua; - -// TODO - evaluate for re-entrancy problems -namespace BizHawk.Client.Common -{ - public unsafe class LuaSandbox - { - private static readonly System.Runtime.CompilerServices.ConditionalWeakTable SandboxForThread = new System.Runtime.CompilerServices.ConditionalWeakTable(); - - public static Action DefaultLogger { get; set; } - - public void SetSandboxCurrentDirectory(string dir) - { - _currentDirectory = dir; - } - - private string _currentDirectory; - - #if WINDOWS - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool SetCurrentDirectoryW(byte* lpPathName); - [DllImport("kernel32.dll", SetLastError=true)] - static extern uint GetCurrentDirectoryW(uint nBufferLength, byte* pBuffer); - #endif - - private bool CoolSetCurrentDirectory(string path, string currDirSpeedHack = null) - { - string target = _currentDirectory + "\\"; - - // first we'll bypass it with a general hack: dont do any setting if the value's already there (even at the OS level, setting the directory can be slow) - // yeah I know, not the smoothest move to compare strings here, in case path normalization is happening at some point - // but you got any better ideas? - if (currDirSpeedHack == null) - { - currDirSpeedHack = CoolGetCurrentDirectory(); - } - - if (currDirSpeedHack == path) - { - return true; - } - - // WARNING: setting the current directory is SLOW!!! security checks for some reason. - // so we're bypassing it with windows hacks - #if WINDOWS - fixed (byte* pstr = &System.Text.Encoding.Unicode.GetBytes(target + "\0")[0]) - return SetCurrentDirectoryW(pstr); - #else - if (System.IO.Directory.Exists(CurrentDirectory)) // race condition for great justice - { - Environment.CurrentDirectory = CurrentDirectory; // thats right, you can't set a directory as current that doesnt exist because .net's got to do SENSELESS SLOW-ASS SECURITY CHECKS on it and it can't do that on a NONEXISTENT DIRECTORY - return true; - } - else - { - return false; - } - #endif - } - - private string CoolGetCurrentDirectory() - { - // GUESS WHAT! - // .NET DOES A SECURITY CHECK ON THE DIRECTORY WE JUST RETRIEVED - // AS IF ASKING FOR THE CURRENT DIRECTORY IS EQUIVALENT TO TRYING TO ACCESS IT - // SCREW YOU - #if WINDOWS - var buf = new byte[32768]; - fixed(byte* pBuf = &buf[0]) - { - uint ret = GetCurrentDirectoryW(32767, pBuf); - return System.Text.Encoding.Unicode.GetString(buf, 0, (int)ret*2); - } - #else - return Environment.CurrentDirectory; - #endif - } - - private void Sandbox(Action callback, Action exceptionCallback) - { - string savedEnvironmentCurrDir = null; - try - { - savedEnvironmentCurrDir = Environment.CurrentDirectory; - - if (_currentDirectory != null) - { - CoolSetCurrentDirectory(_currentDirectory, savedEnvironmentCurrDir); - } - - EnvironmentSandbox.Sandbox(callback); - } - catch (NLua.Exceptions.LuaException ex) - { - Console.WriteLine(ex); - DefaultLogger(ex.ToString()); - exceptionCallback?.Invoke(); - } - finally - { - if (_currentDirectory != null) - { - CoolSetCurrentDirectory(savedEnvironmentCurrDir); - } - } - } - - public static LuaSandbox CreateSandbox(Lua thread, string initialDirectory) - { - var sandbox = new LuaSandbox(); - SandboxForThread.Add(thread, sandbox); - sandbox.SetSandboxCurrentDirectory(initialDirectory); - return sandbox; - } - - public static LuaSandbox GetSandbox(Lua thread) - { - // this is just placeholder. - // we shouldnt be calling a sandbox with no thread--construct a sandbox properly - if (thread == null) - { - return new LuaSandbox(); - } - - lock (SandboxForThread) - { - LuaSandbox sandbox; - if (SandboxForThread.TryGetValue(thread, out sandbox)) - { - return sandbox; - } - - // for now: throw exception (I want to manually creating them) - // return CreateSandbox(thread); - throw new InvalidOperationException("HOARY GORILLA HIJINX"); - } - } - - public static void Sandbox(Lua thread, Action callback, Action exceptionCallback = null) - { - GetSandbox(thread).Sandbox(callback, exceptionCallback); - } - } -} diff --git a/BizHawk.Client.Common/lua/NamedLuaFunction.cs b/BizHawk.Client.Common/lua/NamedLuaFunction.cs deleted file mode 100644 index d10d2eb0b3..0000000000 --- a/BizHawk.Client.Common/lua/NamedLuaFunction.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using NLua; - -namespace BizHawk.Client.Common -{ - public class NamedLuaFunction - { - private readonly LuaFunction _function; - - public NamedLuaFunction(LuaFunction function, string theevent, Action logCallback, Lua lua, string name = null) - { - _function = function; - Name = name ?? "Anonymous"; - Event = theevent; - Lua = lua; - Guid = Guid.NewGuid(); - - Callback = delegate - { - try - { - _function.Call(); - } - catch (Exception ex) - { - logCallback( - "error running function attached by the event " + - Event + - "\nError message: " + - ex.Message); - } - }; - } - - public Guid Guid { get; private set; } - - public string Name { get; } - - public Lua Lua { get; } - - public string Event { get; } - - public Action Callback { get; } - - public void Call(string name = null) - { - LuaSandbox.Sandbox(Lua, () => - { - _function.Call(name); - }); - } - } -} diff --git a/BizHawk.Client.Common/miniz/LibMiniz.cs b/BizHawk.Client.Common/miniz/LibMiniz.cs deleted file mode 100644 index 32a914b0b5..0000000000 --- a/BizHawk.Client.Common/miniz/LibMiniz.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace BizHawk.Client.Common.Miniz -{ - public static class LibMiniz - { - private const string DllName = "libminiz.dll"; - private const CallingConvention CC = CallingConvention.Cdecl; - - public enum mz_zip_flags : uint - { - MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, - MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, - MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, - MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 - }; - - enum mz_compression_level : uint - { - MZ_NO_COMPRESSION = 0, - MZ_BEST_SPEED = 1, - MZ_BEST_COMPRESSION = 9, - MZ_UBER_COMPRESSION = 10, - MZ_DEFAULT_LEVEL = 6, - MZ_DEFAULT_COMPRESSION = unchecked((uint)-1) - }; - - [DllImport(DllName, CallingConvention = CC)] - public static extern bool mz_zip_writer_init_file(IntPtr pZip, string pFilename, long size_to_reserve_at_beginning); - - // Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. - // To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. - // level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. - [DllImport(DllName, CallingConvention = CC)] - public static extern bool mz_zip_writer_add_mem(IntPtr pZip, string pArchive_name, byte[] pBuf, ulong buf_size, uint level_and_flags); - - // Finalizes the archive by writing the central directory records followed by the end of central directory record. - // After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). - // An archive must be manually finalized by calling this function for it to be valid. - [DllImport(DllName, CallingConvention = CC)] - public static extern bool mz_zip_writer_finalize_archive(IntPtr pZip); - - // Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. - // Note for the archive to be valid, it must have been finalized before ending. - [DllImport(DllName, CallingConvention = CC)] - public static extern bool mz_zip_writer_end(IntPtr pZip); - } -} diff --git a/BizHawk.Client.Common/miniz/MinizZipWriter.cs b/BizHawk.Client.Common/miniz/MinizZipWriter.cs deleted file mode 100644 index 19e2c8f672..0000000000 --- a/BizHawk.Client.Common/miniz/MinizZipWriter.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace BizHawk.Client.Common.Miniz -{ - public class MinizZipWriter : IZipWriter - { - private IntPtr _zip; - private uint _flags; - private static readonly byte[] _shitcock = new byte[32 * 1024 * 1024]; - - public MinizZipWriter(string path, int compressionlevel) - { - _zip = Marshal.AllocHGlobal(128); - unsafe - { - var p = (int*)_zip; - for (int i = 0; i < 32; i++) - p[i] = 0; - } - if (!LibMiniz.mz_zip_writer_init_file(_zip, path, 0)) - { - Marshal.FreeHGlobal(_zip); - _zip = IntPtr.Zero; - throw new InvalidOperationException("mz_zip_writer_init_file returned FALSE"); - } - _flags = (uint)compressionlevel; - } - - void IDisposable.Dispose() - { - Dispose(); - GC.SuppressFinalize(this); - } - - ~MinizZipWriter() - { - Dispose(); - } - - private void Dispose() - { - if (_zip != IntPtr.Zero) - { - if (LibMiniz.mz_zip_writer_finalize_archive(_zip)) - LibMiniz.mz_zip_writer_end(_zip); - Marshal.FreeHGlobal(_zip); - _zip = IntPtr.Zero; - } - } - - public void WriteItem(string name, Action callback) - { - lock (_shitcock) - { - var ms = new MemoryStream(_shitcock); - callback(ms); - if (!LibMiniz.mz_zip_writer_add_mem(_zip, name, _shitcock /*ms.GetBuffer()*/, (ulong)ms.Position, _flags)) - throw new InvalidOperationException("mz_zip_writer_add_mem returned FALSE"); - } - } - } -} diff --git a/BizHawk.Client.Common/movie/HeaderKeys.cs b/BizHawk.Client.Common/movie/HeaderKeys.cs deleted file mode 100644 index 691c188aeb..0000000000 --- a/BizHawk.Client.Common/movie/HeaderKeys.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Linq; - -namespace BizHawk.Client.Common -{ - public static class HeaderKeys - { - public const string EMULATIONVERSION = "emuVersion"; - public const string MOVIEVERSION = "MovieVersion"; - public const string PLATFORM = "Platform"; - public const string GAMENAME = "GameName"; - public const string AUTHOR = "Author"; - public const string RERECORDS = "rerecordCount"; - public const string STARTSFROMSAVESTATE = "StartsFromSavestate"; - public const string STARTSFROMSAVERAM = "StartsFromSaveRam"; - public const string SAVESTATEBINARYBASE64BLOB = "SavestateBinaryBase64Blob"; // this string will not contain base64: ; it's implicit (this is to avoid another big string op to dice off the base64: substring) - public const string FOURSCORE = "FourScore"; - public const string SHA1 = "SHA1"; - public const string FIRMWARESHA1 = "FirmwareSHA1"; - public const string PAL = "PAL"; - public const string BOARDNAME = "BoardName"; - public const string SYNCSETTINGS = "SyncSettings"; - public const string LOOPOFFSET = "LoopOffset"; - - // Core Setting - public const string CORE = "Core"; - - // Plugin Settings - public const string VIDEOPLUGIN = "VideoPlugin"; - - public static bool Contains(string val) - { - return typeof(HeaderKeys) - .GetFields() - .Select(field => field.GetValue(null).ToString()) - .Contains(val); - } - } -} diff --git a/BizHawk.Client.Common/movie/MovieService.cs b/BizHawk.Client.Common/movie/MovieService.cs deleted file mode 100644 index 0989ba0f9f..0000000000 --- a/BizHawk.Client.Common/movie/MovieService.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using BizHawk.Client.Common.MovieConversionExtensions; - -namespace BizHawk.Client.Common -{ - public static class MovieService - { - public static IMovie Get(string path) - { - // TODO: change IMovies to take HawkFiles only and not path - if (Path.GetExtension(path).EndsWith("tasproj")) - { - return new TasMovie(path); - } - - if (Path.GetExtension(path).EndsWith("bkm")) - { - var bkm = new BkmMovie(path); - bkm.Load(false); - - // Hackery to fix how things used to work - if (bkm.SystemID == "GBC") - { - bkm.SystemID = "GB"; - } - - return bkm.ToBk2(); - } - - // Default to bk2 - return new Bk2Movie(path); - } - - /// - /// Gets the file extension for the default movie implementation used in the client - /// - public static string DefaultExtension - { - get - { - return "bk2"; - } - } - - /// - /// Gets a list of extensions for all implementations - /// - public static IEnumerable MovieExtensions - { - get - { - yield return "bkm"; - yield return "bk2"; - yield return "tasproj"; - } - } - - public static bool IsValidMovieExtension(string ext) - { - if (MovieExtensions.Contains(ext.ToLower().Replace(".", ""))) - { - return true; - } - - return false; - } - - /// - /// Creates a default instance of the default implementation, - /// no path is specified so this is in a minimal state that would not be able to be saved - /// - public static IMovie DefaultInstance => new Bk2Movie(); - } -} diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs deleted file mode 100644 index 1a4a5940e7..0000000000 --- a/BizHawk.Client.Common/movie/MovieSession.cs +++ /dev/null @@ -1,547 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.GBA; -using BizHawk.Emulation.Cores.Atari.A7800Hawk; - -namespace BizHawk.Client.Common -{ - public enum MovieEndAction { Stop, Pause, Record, Finish } - - public class MovieSession : IMovieSession - { - public MovieSession() - { - ReadOnly = true; - MovieControllerAdapter = MovieService.DefaultInstance.LogGeneratorInstance().MovieControllerAdapter; - MultiTrack = new MultitrackRecorder(); - } - - /// - /// Gets the queued movie - /// When initializing a movie, it will be stored here until Rom processes have been completed, then it will be moved to the Movie property - /// If an existing movie is still active, it will remain in the Movie property while the new movie is queued - /// - public IMovie QueuedMovie { get; private set; } - - // This wrapper but the logic could change, don't make the client code understand these details - public bool MovieIsQueued => QueuedMovie != null; - - public MultitrackRecorder MultiTrack { get; } - public IMovieController MovieControllerAdapter { get; set; } - - public IMovie Movie { get; set; } - public bool ReadOnly { get; set; } - public Action MessageCallback { get; set; } - public Func AskYesNoCallback { get; set; } - - /// - /// Gets or sets a callback that allows the movie session to pause the emulator - /// This is Required! - /// - public Action PauseCallback { get; set; } - - /// - /// Gets or sets a callback that is invoked when the movie mode has changed - /// This is Required! - /// - public Action ModeChangedCallback { get; set; } - - /// - /// Simply shortens the verbosity necessary otherwise - /// - public ILogEntryGenerator LogGeneratorInstance() - { - return Movie.LogGeneratorInstance(); - } - - public IMovieController MovieControllerInstance() - { - var adapter = Movie.LogGeneratorInstance().MovieControllerAdapter; - adapter.Definition = MovieControllerAdapter.Definition; - return adapter; - } - - // Convenience property that gets the controller state from the movie for the most recent frame - public IController CurrentInput - { - get - { - if (Movie.IsActive && !Movie.IsFinished && Global.Emulator.Frame > 0) - { - return Movie.GetInputState(Global.Emulator.Frame - 1); - } - - return null; - } - } - - public IController PreviousFrame - { - get - { - if (Movie.IsActive && !Movie.IsFinished && Global.Emulator.Frame > 1) - { - return Movie.GetInputState(Global.Emulator.Frame - 2); - } - - return null; - } - } - - private void Output(string message) - { - MessageCallback?.Invoke(message); - } - - private void LatchMultitrackPlayerInput(MultitrackRewiringControllerAdapter rewiredSource) - { - if (MultiTrack.IsActive) - { - rewiredSource.PlayerSource = 1; - rewiredSource.PlayerTargetMask = 1 << MultiTrack.CurrentPlayer; - if (MultiTrack.RecordAll) - { - rewiredSource.PlayerTargetMask = unchecked((int)0xFFFFFFFF); - } - - if (Movie.InputLogLength > Global.Emulator.Frame) - { - var input = Movie.GetInputState(Global.Emulator.Frame); - MovieControllerAdapter.LatchFromSource(input); - } - - MovieControllerAdapter.LatchPlayerFromSource(rewiredSource, MultiTrack.CurrentPlayer); - } - } - - public void LatchInputFromPlayer(IController source) - { - MovieControllerAdapter.LatchFromSource(source); - } - - /// - /// Latch input from the input log, if available - /// - public void LatchInputFromLog() - { - var input = Movie.GetInputState(Global.Emulator.Frame); - - // adelikat: TODO: this is likely the source of frame 0 TAStudio bugs, I think the intent is to check if the movie is 0 length? - if (Global.Emulator.Frame == 0) // Hacky - { - HandleMovieAfterFrameLoop(); // Frame 0 needs to be handled. - } - - if (input == null) - { - HandleMovieAfterFrameLoop(); - return; - } - - MovieControllerAdapter.LatchFromSource(input); - if (MultiTrack.IsActive) - { - Global.MultitrackRewiringAdapter.Source = MovieControllerAdapter; - } - } - - private void HandlePlaybackEnd() - { - // TODO: mainform callback to update on mode change - switch (Global.Config.MovieEndAction) - { - case MovieEndAction.Stop: - Movie.Stop(); - break; - case MovieEndAction.Record: - Movie.SwitchToRecord(); - break; - case MovieEndAction.Pause: - Movie.Stop(); - PauseCallback(); - break; - default: - case MovieEndAction.Finish: - Movie.FinishedMode(); - break; - } - - ModeChangedCallback(); - } - - // Movie Refactor TODO: delete me, any code calling this is poorly designed - public bool MovieLoad() - { - MovieControllerAdapter = Movie.LogGeneratorInstance().MovieControllerAdapter; - return Movie.Load(false); - } - - public void StopMovie(bool saveChanges = true) - { - var message = "Movie "; - if (Movie.IsRecording) - { - message += "recording "; - } - else if (Movie.IsPlaying) - { - message += "playback "; - } - - message += "stopped."; - - if (Movie.IsActive) - { - var result = Movie.Stop(saveChanges); - if (result) - { - Output(Path.GetFileName(Movie.Filename) + " written to disk."); - } - - Output(message); - ReadOnly = true; - } - - MultiTrack.Restart(); - ModeChangedCallback(); - } - - public void HandleMovieSaveState(TextWriter writer) - { - if (Movie.IsActive) - { - Movie.WriteInputLog(writer); - } - } - - public void ClearFrame() - { - if (Movie.IsPlaying) - { - Movie.ClearFrame(Global.Emulator.Frame); - Output("Scrubbed input at frame " + Global.Emulator.Frame); - } - } - - public void HandleMovieOnFrameLoop() - { - if (!Movie.IsActive) - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - } - else if (Movie.IsFinished) - { - if (Global.Emulator.Frame < Movie.FrameCount) // This scenario can happen from rewinding (suddenly we are back in the movie, so hook back up to the movie - { - Movie.SwitchToPlay(); - LatchInputFromLog(); - } - else - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - } - } - else if (Movie.IsPlaying) - { - LatchInputFromLog(); - - if (Movie.IsRecording) // The movie end situation can cause the switch to record mode, in that case we need to capture some input for this frame - { - HandleFrameLoopForRecordMode(); - } - else - { - // Movie may go into finished mode as a result from latching - if (!Movie.IsFinished) - { - if (Global.ClientControls.IsPressed("Scrub Input")) - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - ClearFrame(); - } - else if (Global.Config.MoviePlaybackPokeMode) - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - var lg = Movie.LogGeneratorInstance(); - lg.SetSource(Global.MovieOutputHardpoint); - if (!lg.IsEmpty) - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - Movie.PokeFrame(Global.Emulator.Frame, Global.MovieOutputHardpoint); - } - else - { // Why, this was already done? - LatchInputFromLog(); - } - } - } - } - } - else if (Movie.IsRecording) - { - HandleFrameLoopForRecordMode(); - } - } - - private void HandleFrameLoopForRecordMode() - { - // we don't want tasmovie to latch user input outside its internal recording mode, so limit it to autohold - if (Movie is TasMovie && Movie.IsPlaying) - { - MovieControllerAdapter.LatchSticky(); - } - else - { - if (MultiTrack.IsActive) - { - LatchMultitrackPlayerInput(Global.MultitrackRewiringAdapter); - } - else - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - } - } - - // the movie session makes sure that the correct input has been read and merged to its MovieControllerAdapter; - // this has been wired to Global.MovieOutputHardpoint in RewireInputChain - Movie.RecordFrame(Global.Emulator.Frame, Global.MovieOutputHardpoint); - } - - public void HandleMovieAfterFrameLoop() - { - if (Movie is TasMovie) - { - (Movie as TasMovie).GreenzoneCurrentFrame(); - if (Movie.IsPlaying && Global.Emulator.Frame >= Movie.InputLogLength) - { - HandleFrameLoopForRecordMode(); - } - } - else if (Movie.IsPlaying && !Movie.IsFinished && Global.Emulator.Frame >= Movie.InputLogLength) - { - HandlePlaybackEnd(); - } - } - - public bool HandleMovieLoadState(string path) - { - using (var sr = new StreamReader(path)) - { - return HandleMovieLoadState(sr); - } - } - - // TODO: maybe someone who understands more about what's going on here could rename these step1 and step2 into something more descriptive - public bool HandleMovieLoadState_HackyStep2(TextReader reader) - { - if (!Movie.IsActive) - { - return true; - } - - if (ReadOnly) - { - } - else - { - string errorMsg; - - //// fixme: this is evil (it causes crashes in binary states because InflaterInputStream can't have its position set, even to zero. - ////((StreamReader)reader).BaseStream.Position = 0; - ////((StreamReader)reader).DiscardBufferedData(); - // edit: zero 18-apr-2014 - this was solved by HackyStep1 and HackyStep2, so that the zip stream can be re-acquired instead of needing its position reset - var result = Movie.ExtractInputLog(reader, out errorMsg); - if (!result) - { - Output(errorMsg); - return false; - } - } - - return true; - } - - public bool HandleMovieLoadState(TextReader reader) - { - if (!HandleMovieLoadState_HackyStep1(reader)) - { - return false; - } - - return HandleMovieLoadState_HackyStep2(reader); - } - - public bool HandleMovieLoadState_HackyStep1(TextReader reader) - { - if (!Movie.IsActive) - { - return true; - } - - if (ReadOnly) - { - string errorMsg; - var result = Movie.CheckTimeLines(reader, out errorMsg); - if (!result) - { - Output(errorMsg); - return false; - } - - if (Movie.IsRecording) - { - Movie.SwitchToPlay(); - } - else if (Movie.IsFinished) - { - LatchInputFromPlayer(Global.MovieInputSourceAdapter); - } - } - else - { - if (Movie.IsFinished) - { - Movie.StartNewRecording(); - } - else if (Movie.IsPlaying) - { - Movie.SwitchToRecord(); - } - } - - return true; - } - - public void ToggleMultitrack() - { - if (Movie.IsActive) - { - if (Global.Config.VBAStyleMovieLoadState) - { - Output("Multi-track can not be used in Full Movie Loadstates mode"); - } - else - { - MultiTrack.IsActive ^= true; - MultiTrack.SelectNone(); - Output(MultiTrack.IsActive ? "MultiTrack Enabled" : "MultiTrack Disabled"); - } - } - else - { - Output("MultiTrack cannot be enabled while not recording."); - } - } - - /// - /// Sets the Movie property with the QueuedMovie, clears the queued movie, and starts the new movie - /// - public void RunQueuedMovie(bool recordMode) - { - Movie = QueuedMovie; - QueuedMovie = null; - MultiTrack.Restart(); - - if (recordMode) - { - Movie.StartNewRecording(); - ReadOnly = false; - } - else - { - Movie.StartNewPlayback(); - } - } - - // The behavior here is to only temporarily override these settings when playing a movie and then restore the user's preferred settings - // A more elegant approach would be appreciated - public bool? PreviousNES_InQuickNES { get; set; } - public bool? PreviousSNES_InSnes9x { get; set; } - public bool? PreviousGBA_UsemGBA { get; set; } - - public void QueueNewMovie(IMovie movie, bool record, IEmulator emulator) - { - if (!record) // The semantics of record is that we are starting a new movie, and even wiping a pre-existing movie with the same path, but non-record means we are loading an existing movie into playback mode - { - movie.Load(false); - - if (movie.SystemID != emulator.SystemId) - { - throw new MoviePlatformMismatchException( - $"Movie system Id ({movie.SystemID}) does not match the currently loaded platform ({emulator.SystemId}), unable to load"); - } - } - - // Note: this populates MovieControllerAdapter's Type with the approparite controller - // Don't set it to a movie instance of the adapter or you will lose the definition! - InputManager.RewireInputChain(); - - if (!record && emulator.SystemId == "NES") // For NES we need special logic since the movie will drive which core to load - { - var quicknesName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(QuickNES), typeof(CoreAttribute))).CoreName; - var neshawkName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(NES), typeof(CoreAttribute))).CoreName; - - // If either is specified use that, else use whatever is currently set - if (movie.Core == quicknesName) - { - PreviousNES_InQuickNES = Global.Config.NES_InQuickNES; - Global.Config.NES_InQuickNES = true; - } - else if (movie.Core == neshawkName) - { - PreviousNES_InQuickNES = Global.Config.NES_InQuickNES; - Global.Config.NES_InQuickNES = false; - } - } - else if (!record && emulator.SystemId == "SNES") // ditto with snes9x vs bsnes - { - var snes9xName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(Snes9x), typeof(CoreAttribute))).CoreName; - var bsnesName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(LibsnesCore), typeof(CoreAttribute))).CoreName; - - if (movie.Core == snes9xName) - { - PreviousSNES_InSnes9x = Global.Config.SNES_InSnes9x; - Global.Config.SNES_InSnes9x = true; - } - else if (movie.Core == bsnesName) - { - PreviousSNES_InSnes9x = Global.Config.SNES_InSnes9x; - Global.Config.SNES_InSnes9x = false; - } - } - else if (!record && emulator.SystemId == "GBA") // ditto with GBA, we should probably architect this at some point, this isn't sustainable - { - var mGBAName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(MGBAHawk), typeof(CoreAttribute))).CoreName; - var vbaNextName = ((CoreAttribute)Attribute.GetCustomAttribute(typeof(VBANext), typeof(CoreAttribute))).CoreName; - - if (movie.Core == mGBAName) - { - PreviousGBA_UsemGBA = Global.Config.GBA_UsemGBA; - Global.Config.GBA_UsemGBA = true; - } - else if (movie.Core == vbaNextName) - { - PreviousGBA_UsemGBA = Global.Config.GBA_UsemGBA; - Global.Config.GBA_UsemGBA = false; - } - } - - if (record) // This is a hack really, we need to set the movie to its propert state so that it will be considered active later - { - movie.SwitchToRecord(); - } - else - { - movie.SwitchToPlay(); - } - - QueuedMovie = movie; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/movie/PlatformFrameRates.cs b/BizHawk.Client.Common/movie/PlatformFrameRates.cs deleted file mode 100644 index 11b25b77a8..0000000000 --- a/BizHawk.Client.Common/movie/PlatformFrameRates.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - public class PlatformFrameRates - { - // these are political numbers, designed to be in accord with tasvideos.org tradition. theyre not necessarily mathematical factualities (although they may be in some cases) - // it would be nice if we could turn this into a rational expression natively, and also, to write some comments about the derivation and ideal values (since this seems to be where theyre all collected) - // are we collecting them anywhere else? for avi-writing code perhaps? - - // just some constants, according to specs - private static readonly double PALCarrier = (15625 * 283.75) + 25; // 4.43361875 MHz - private static readonly double NTSCCarrier = 4500000 * 227.5 / 286; // 3.579545454... MHz - private static readonly double PALNCarrier = (15625 * 229.25) + 25; // 3.58205625 MHz - - private static readonly Dictionary Rates = new Dictionary - { - ["NES"] = 60.098813897440515532, // discussion here: http://forums.nesdev.com/viewtopic.php?t=492 ; a rational expression would be (19687500 / 11) / ((341*262-0.529780.5)/3) -> (118125000 / 1965513) -> 60.098813897440515529533511098629 (so our chosen number is very close) - ["NES_PAL"] = 50.006977968268290849, - ["FDS"] = 60.098813897440515532, - ["FDS_PAL"] = 50.006977968268290849, - ["SNES"] = (double)21477272 / (4 * 341 * 262), // 60.098475521 - ["SNES_PAL"] = (double)21281370 / (4 * 341 * 312), // 50.0069789082 - ["SGB"] = (double)21477272 / (4 * 341 * 262), // 60.098475521 - ["SGB_PAL"] = (double)21281370 / (4 * 341 * 312), // 50.0069789082 - ["PCE"] = (7159090.90909090 / 455 / 263), // 59.8261054535 - ["PCECD"] = (7159090.90909090 / 455 / 263), // 59.8261054535 - ["SMS"] = (3579545 / 262.0 / 228.0), // 59.9227434043 - ["SMS_PAL"] = (3546893 / 313.0 / 228.0), // 49.7014320946 - ["GG"] = (3579545 / 262.0 / 228.0), // 59.9227434043 - ["GG_PAL"] = (3546893 / 313.0 / 228.0), // 49.7014320946 - ["SG"] = (3579545 / 262.0 / 228.0), // 59.9227434043 - ["SG_PAL"] = (3546893 / 313.0 / 228.0), // 49.7014320946 - ["NGP"] = (6144000.0 / (515 * 198)), // 60.2530155928 - ["VB"] = (20000000.0 / (259 * 384 * 4)), // 50.2734877735 - ["Lynx"] = 16000000.0 / (16 * 105 * 159), // 59.89817310572028 - ["WSWAN"] = (3072000.0 / (159 * 256)), // 75.4716981132 - ["GB"] = 262144.0 / 4389.0, // 59.7275005696 - ["GBC"] = 262144.0 / 4389.0, // 59.7275005696 - ["GBA"] = 262144.0 / 4389.0, // 59.7275005696 - ["GEN"] = 53693175 / (3420.0 * 262), - ["GEN_PAL"] = 53203424 / (3420.0 * 313), - - // while the number of scanlines per frame is software controlled and variable, we - // enforce exactly 262 (NTSC) 312 (PAL) per reference time frame - ["A26"] = 315000000.0 / 88.0 / 262.0 / 228.0, // 59.922751013550531429197560173856 - // this pal clock ref is exact - ["A26_PAL"] = 3546895.0 / 312.0 / 228.0, // 49.860759671614934772829509671615 - - ["A78"] = 59.9227510135505, - ["Coleco"] = 59.9227510135505, - - // according to http://problemkaputt.de/psx-spx.htm - ["PSX"] = 44100.0 * 768 * 11 / 7 / 263 / 3413, // 59.292862562 - ["PSX_PAL"] = 44100.0 * 768 * 11 / 7 / 314 / 3406, // 49.7645593576 - - ["C64_PAL"] = PALCarrier * 2 / 9 / 312 / 63, - ["C64_NTSC"] = NTSCCarrier * 2 / 7 / 263 / 65, - ["C64_NTSC_OLD"] = NTSCCarrier * 2 / 7 / 262 / 64, - ["C64_DREAN"] = PALNCarrier * 2 / 7 / 312 / 65, - ["INTV"] = 59.92, - - ["ZXSpectrum_PAL"] = 50.080128205, - ["AmstradCPC_PAL"] = 50.08012820512821, - - // according to ryphecha, using - // clocks[2] = { 53.693182e06, 53.203425e06 }; //ntsc console, pal console - // lpf[2][2] = { { 263, 262.5 }, { 314, 312.5 } }; //ntsc,pal; noninterlaced, interlaced - // cpl[2] = { 3412.5, 3405 }; //ntsc mode, pal mode - // PAL PS1: 0, PAL Mode: 0, Interlaced: 0 --- 59.826106 (53.693182e06/(263*3412.5)) - // PAL PS1: 0, PAL Mode: 0, Interlaced: 1 --- 59.940060 (53.693182e06/(262.5*3412.5)) - // PAL PS1: 1, PAL Mode: 1, Interlaced: 0 --- 49.761427 (53.203425e06/(314*3405)) - // PAL PS1: 1, PAL Mode: 1, Interlaced: 1 --- 50.000282(53.203425e06/(312.5*3405)) - }; - - public double this[string systemId, bool pal] - { - get - { - var key = systemId + (pal ? "_PAL" : ""); - if (Rates.ContainsKey(key)) - { - return Rates[key]; - } - - return 60.0; - } - } - - public TimeSpan MovieTime(IMovie movie) - { - var dblseconds = GetSeconds(movie); - var seconds = (int)(dblseconds % 60); - var days = seconds / 86400; - var hours = seconds / 3600; - var minutes = (seconds / 60) % 60; - var milliseconds = (int)((dblseconds - seconds) * 1000); - return new TimeSpan(days, hours, minutes, seconds, milliseconds); - } - - private double Fps(IMovie movie) - { - var system = movie.HeaderEntries[HeaderKeys.PLATFORM]; - var pal = movie.HeaderEntries.ContainsKey(HeaderKeys.PAL) && - movie.HeaderEntries[HeaderKeys.PAL] == "1"; - - return this[system, pal]; - } - - private double GetSeconds(IMovie movie) - { - double frames = movie.InputLogLength; - - if (frames < 1) - { - return 0; - } - - return frames / Fps(movie); - } - } -} diff --git a/BizHawk.Client.Common/movie/Subtitle.cs b/BizHawk.Client.Common/movie/Subtitle.cs deleted file mode 100644 index b59be8679f..0000000000 --- a/BizHawk.Client.Common/movie/Subtitle.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Text; - -namespace BizHawk.Client.Common -{ - public class Subtitle - { - public Subtitle() - { - Message = ""; - X = 0; - Y = 0; - Duration = 120; - Frame = 0; - Color = 0xFFFFFFFF; - } - - public Subtitle(Subtitle s) - { - Message = s.Message; - Frame = s.Frame; - X = s.X; - Y = s.Y; - Duration = s.Duration; - Color = s.Color; - } - - public string Message { get; set; } - public int Frame { get; set; } - public int X { get; set; } - public int Y { get; set; } - public int Duration { get; set; } - public uint Color { get; set; } - - public override string ToString() - { - var sb = new StringBuilder("subtitle "); - sb - .Append(Frame).Append(" ") - .Append(X).Append(" ") - .Append(Y).Append(" ") - .Append(Duration).Append(" ") - .Append($"{Color:X8}").Append(" ") - .Append(Message); - - return sb.ToString(); - } - - public string ToSubRip(int index, double fps, bool addcolortag) - { - var sb = new StringBuilder(); - - sb.Append(index.ToString()); - sb.Append("\r\n"); - - // Frame timing - double start = (double)Frame; - double end = (double)(Frame + Duration); - - int startTime = (int)(start * 1000 / fps); - int endTime = (int)(end * 1000 / fps); - - var startString = string.Format( - "{0:d2}:{1:d2}:{2:d2},{3:d3}", - startTime / 3600000, - (startTime / 60000) % 60, - (startTime / 1000) % 60, - startTime % 1000); - - var endString = string.Format( - "{0:d2}:{1:d2}:{2:d2},{3:d3}", - endTime / 3600000, - (endTime / 60000) % 60, - (endTime / 1000) % 60, - endTime % 1000); - - sb.Append(startString); - sb.Append(" --> "); - sb.Append(endString); - sb.Append("\r\n"); - - // TODO: Positioning - - // Color tag open - if (addcolortag) - { - uint rgb = Color & 0x00FFFFFF; - sb.Append(""); - } - - // Message text - sb.Append(Message.Trim()); - - // Color tag closeaddcolortag - if (addcolortag) - { - sb.Append(""); - } - - sb.Append("\r\n"); - - // Seperator - sb.Append("\r\n"); - - return sb.ToString(); - } - } -} diff --git a/BizHawk.Client.Common/movie/SubtitleList.cs b/BizHawk.Client.Common/movie/SubtitleList.cs deleted file mode 100644 index d3f5fee533..0000000000 --- a/BizHawk.Client.Common/movie/SubtitleList.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace BizHawk.Client.Common -{ - public class SubtitleList : List - { - public bool ConcatMultilines { get; set; } - public bool AddColorTag { get; set; } - - public SubtitleList() - { - ConcatMultilines = false; - AddColorTag = false; - } - - public IEnumerable GetSubtitles(int frame) - { - return this.Where(t => frame >= t.Frame && frame <= t.Frame + t.Duration); - } - - public override string ToString() - { - var sb = new StringBuilder(); - Sort(); - ForEach(subtitle => sb.AppendLine(subtitle.ToString())); - return sb.ToString(); - } - - public bool AddFromString(string subtitleStr) - { - if (!string.IsNullOrWhiteSpace(subtitleStr)) - { - try - { - var subparts = subtitleStr.Split(' '); - - // Unfortunately I made the file format space delminated so this hack is necessary to get the message - var message = ""; - for (var i = 6; i < subparts.Length; i++) - { - message += subparts[i] + ' '; - } - - Add(new Subtitle - { - Frame = int.Parse(subparts[1]), - X = int.Parse(subparts[2]), - Y = int.Parse(subparts[3]), - Duration = int.Parse(subparts[4]), - Color = uint.Parse(subparts[5], NumberStyles.HexNumber), - Message = message.Trim() - }); - - return true; - } - catch - { - return false; - } - } - - return false; - } - - public new void Sort() - { - Sort((x, y) => - { - int result = x.Frame.CompareTo(y.Frame); - return result != 0 ? result : x.Y.CompareTo(y.Y); - }); - } - - public string ToSubRip(double fps) - { - int index = 1; - var sb = new StringBuilder(); - List subs = new List(); - foreach (var subtitle in this) - { - subs.Add(subtitle); - } - - // absense of line wrap forces miltiline subtitle macros - // so we sort them just in case and optionally concat back to a single unit - // todo: instead of making this pretty, add the line wrap feature to subtitles - if (ConcatMultilines) - { - int lastframe = 0; - subs = subs.OrderBy(s => s.Frame).ThenBy(s => s.Y).ToList(); - - for (int i = 0;; i++) - { - if (i == subs.Count) // we're modifying it - { - break; - } - - subs[i].Message = subs[i].Message.Trim(); - - if (i > 0 && lastframe == subs[i].Frame) - { - subs[i].Message = subs[i - 1].Message + " " + subs[i].Message; - subs.Remove(subs[i - 1]); - i--; - } - - lastframe = subs[i].Frame; - } - } - else - { - // srt stacks musltilines upwards - subs = subs.OrderBy(s => s.Frame).ThenByDescending(s => s.Y).ToList(); - } - - foreach (var subtitle in subs) - { - sb.Append(subtitle.ToSubRip(index++, fps, AddColorTag)); - } - - return sb.ToString(); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs b/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs deleted file mode 100644 index 0fd295a010..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class Bk2ControllerAdapter : IMovieController - { - private readonly string _logKey = ""; - private readonly WorkingDictionary _myBoolButtons = new WorkingDictionary(); - private readonly WorkingDictionary _myFloatControls = new WorkingDictionary(); - - public Bk2ControllerAdapter() - { - } - - public Bk2ControllerAdapter(string key) - { - _logKey = key; - SetLogOverride(); - } - - private void SetLogOverride() - { - if (!string.IsNullOrEmpty(_logKey)) - { - var groups = _logKey.Split(new[] { "#" }, StringSplitOptions.RemoveEmptyEntries); - var controls = groups - .Select(group => group.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries).ToList()) - .ToList(); - - _type.ControlsFromLog = controls; - } - } - - // TODO: get rid of this, add a SetBool() method or something for the set access, replace get wtih IsPressed - public bool this[string button] - { - get - { - return _myBoolButtons[button]; - } - - set - { - if (_myBoolButtons.ContainsKey(button)) - { - _myBoolButtons[button] = value; - } - } - } - - #region IController Implementation - - public bool IsPressed(string button) - { - return _myBoolButtons[button]; - } - - public float GetFloat(string name) - { - return _myFloatControls[name]; - } - - #endregion - - #region IMovieController Implementation - - private Bk2ControllerDefinition _type = new Bk2ControllerDefinition(); - - public ControllerDefinition Definition - { - get - { - return _type; - } - - set - { - _type = new Bk2ControllerDefinition(value); - SetLogOverride(); - } - } - - /// - /// latches one player from the source - /// - public void LatchPlayerFromSource(IController playerSource, int playerNum) - { - foreach (var button in playerSource.Definition.BoolButtons) - { - var bnp = ButtonNameParser.Parse(button); - - if (bnp?.PlayerNum != playerNum) - { - continue; - } - - var val = playerSource.IsPressed(button); - _myBoolButtons[button] = val; - } - - foreach (var button in Definition.FloatControls) - { - var bnp = ButtonNameParser.Parse(button); - - if (bnp?.PlayerNum != playerNum) - { - continue; - } - - var val = playerSource.GetFloat(button); - - _myFloatControls[button] = val; - } - } - - /// - /// latches all buttons from the provided source - /// - public void LatchFromSource(IController source) - { - foreach (var button in Definition.BoolButtons) - { - _myBoolButtons[button] = source.IsPressed(button); - } - - foreach (var name in Definition.FloatControls) - { - _myFloatControls[name] = source.GetFloat(name); - } - } - - /// - /// latches sticky buttons from - /// - public void LatchSticky() - { - foreach (var button in Definition.BoolButtons) - { - _myBoolButtons[button] = Global.AutofireStickyXORAdapter.IsSticky(button); - } - - // float controls don't have sticky logic. but old values remain in MovieOutputHardpoint if we don't update this here - foreach (var name in Definition.FloatControls) - { - _myFloatControls[name] = Global.AutofireStickyXORAdapter.GetFloat(name); - } - } - - /// - /// latches all buttons from the supplied mnemonic string - /// - public void SetControllersAsMnemonic(string mnemonic) - { - if (!string.IsNullOrWhiteSpace(mnemonic)) - { - var def = Global.Emulator.ControllerDefinition; - var trimmed = mnemonic.Replace("|", ""); - var buttons = Definition.ControlsOrdered.SelectMany(c => c).ToList(); - var iterator = 0; - - foreach (var key in buttons) - { - if (def.BoolButtons.Contains(key)) - { - _myBoolButtons[key] = trimmed[iterator] != '.'; - iterator++; - } - else if (def.FloatControls.Contains(key)) - { - var commaIndex = trimmed.Substring(iterator).IndexOf(','); - var temp = trimmed.Substring(iterator, commaIndex); - var val = int.Parse(temp.Trim()); - _myFloatControls[key] = val; - - iterator += commaIndex + 1; - } - } - } - } - - #endregion - - public void SetFloat(string buttonName, float value) - { - _myFloatControls[buttonName] = value; - } - - public class Bk2ControllerDefinition : ControllerDefinition - { - public Bk2ControllerDefinition() - { - } - - public Bk2ControllerDefinition(ControllerDefinition source) - : base(source) - { - } - - public List> ControlsFromLog { private get; set; } = new List>(); - - public override IEnumerable> ControlsOrdered - { - get - { - if (ControlsFromLog.Any()) - { - return ControlsFromLog; - } - - return base.ControlsOrdered; - } - } - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2FloatConstants.cs b/BizHawk.Client.Common/movie/bk2/Bk2FloatConstants.cs deleted file mode 100644 index 6851f27823..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2FloatConstants.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - public class Bk2FloatConstants - { - public string this[string button] - { - get - { - var key = button - .Replace("P1 ", "") - .Replace("P2 ", "") - .Replace("P3 ", "") - .Replace("P4 ", "") - .Replace("Key ", ""); - - if (_systemOverrides.ContainsKey(Global.Emulator.SystemId) && _systemOverrides[Global.Emulator.SystemId].ContainsKey(key)) - { - return _systemOverrides[Global.Emulator.SystemId][key]; - } - - if (_baseMnemonicLookupTable.ContainsKey(key)) - { - return _baseMnemonicLookupTable[key]; - } - - return button; - } - } - - private readonly Dictionary _baseMnemonicLookupTable = new Dictionary - { - ["Zapper X"] = "zapX", - ["Zapper Y"] = "zapY", - ["Paddle"] = "Pad", - ["Pen"] = "Pen", - ["Mouse X"] = "mX", - ["Mouse Y"] = "mY", - ["Lightgun X"] = "lX", - ["Lightgun Y"] = "lY", - ["X Axis"] = "aX", - ["Y Axis"] = "aY", - ["LStick X"] = "lsX", - ["LStick Y"] = "lsY", - ["RStick X"] = "rsX", - ["RStick Y"] = "rsY", - ["Disc Select"] = "Disc" - }; - - private readonly Dictionary> _systemOverrides = new Dictionary> - { - ["A78"] = new Dictionary - { - ["VPos"] = "X", - ["HPos"] = "Y" - } - }; - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Header.cs b/BizHawk.Client.Common/movie/bk2/Bk2Header.cs deleted file mode 100644 index aac0a3463b..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Header.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using System.Text; - -namespace BizHawk.Client.Common -{ - public class Bk2Header : Dictionary - { - public new string this[string key] - { - get - { - return ContainsKey(key) ? base[key] : ""; - } - - set - { - if (ContainsKey(key)) - { - base[key] = value; - } - else - { - Add(key, value); - } - } - } - - public override string ToString() - { - var sb = new StringBuilder(); - - foreach (var kvp in this) - { - sb - .Append(kvp.Key) - .Append(' ') - .Append(kvp.Value) - .AppendLine(); - } - - return sb.ToString(); - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs b/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs deleted file mode 100644 index 1df809e86b..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class Bk2LogEntryGenerator : ILogEntryGenerator - { - private readonly Bk2MnemonicConstants _mnemonics = new Bk2MnemonicConstants(); - private readonly Bk2FloatConstants _floatLookup = new Bk2FloatConstants(); - - private readonly string _logKey; - private IController _source; - - public Bk2LogEntryGenerator(string logKey) - { - _logKey = logKey; - } - - public IMovieController MovieControllerAdapter => new Bk2ControllerAdapter(_logKey); - - #region ILogEntryGenerator Implementation - - public void SetSource(IController source) - { - _source = source; - } - - public string GenerateInputDisplay() - { - return CreateLogEntry(forInputDisplay: true); - } - - public bool IsEmpty => EmptyEntry == GenerateLogEntry(); - - public string EmptyEntry => CreateLogEntry(createEmpty: true); - - public string GenerateLogEntry() - { - return CreateLogEntry(); - } - - #endregion - - public string GenerateLogKey() - { - var sb = new StringBuilder(); - sb.Append("LogKey:"); - - foreach (var group in _source.Definition.ControlsOrdered.Where(c => c.Any())) - { - sb.Append("#"); - foreach (var button in group) - { - sb - .Append(button) - .Append('|'); - } - } - - return sb.ToString(); - } - - public Dictionary Map() - { - var dict = new Dictionary(); - foreach (var group in _source.Definition.ControlsOrdered.Where(c => c.Any())) - { - foreach (var button in group) - { - if (_source.Definition.BoolButtons.Contains(button)) - { - dict.Add(button, _mnemonics[button].ToString()); - } - else if (_source.Definition.FloatControls.Contains(button)) - { - dict.Add(button, _floatLookup[button]); - } - } - } - - return dict; - } - - private string CreateLogEntry(bool createEmpty = false, bool forInputDisplay = false) - { - var sb = new StringBuilder(); - - if (!forInputDisplay) - { - sb.Append('|'); - } - - foreach (var group in _source.Definition.ControlsOrdered) - { - if (group.Any()) - { - foreach (var button in group) - { - if (_source.Definition.FloatControls.Contains(button)) - { - int val; - int i = _source.Definition.FloatControls.IndexOf(button); - int mid = (int)_source.Definition.FloatRanges[i].Mid; - - if (createEmpty) - { - val = mid; - } - else - { - val = (int)_source.GetFloat(button); - } - - if (forInputDisplay && val == mid) - { - sb.Append(" "); - } - else - { - sb.Append(val.ToString().PadLeft(5, ' ')).Append(','); - } - } - else if (_source.Definition.BoolButtons.Contains(button)) - { - if (createEmpty) - { - sb.Append('.'); - } - else - { - sb.Append(_source.IsPressed(button) ? _mnemonics[button] : forInputDisplay ? ' ' : '.'); - } - } - } - - if (!forInputDisplay) - { - sb.Append('|'); - } - } - } - - return sb.ToString(); - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2MnemonicConstants.cs b/BizHawk.Client.Common/movie/bk2/Bk2MnemonicConstants.cs deleted file mode 100644 index 4607722cd4..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2MnemonicConstants.cs +++ /dev/null @@ -1,410 +0,0 @@ -using System.Collections.Generic; - -// ReSharper disable StyleCop.SA1509 -namespace BizHawk.Client.Common -{ - public class Bk2MnemonicConstants - { - public char this[string button] - { - get - { - var key = button.Replace("Key ", ""); - if (key.StartsWith("P")) - { - if (key.Length > 2 && key[1] == '1' && key[2] >= '0' && key[2] <= '9') // Hack to support 10-20 controllers, TODO: regex this thing instead - { - key = key.Substring(4); - } - else if (key.Length > 1 && key[1] >= '0' && key[1] <= '9') - { - key = key.Substring(3); - } - } - - - if (_systemOverrides.ContainsKey(Global.Emulator.SystemId) && _systemOverrides[Global.Emulator.SystemId].ContainsKey(key)) - { - return _systemOverrides[Global.Emulator.SystemId][key]; - } - - if (_baseMnemonicLookupTable.ContainsKey(key)) - { - return _baseMnemonicLookupTable[key]; - } - - if (key.Length == 1) - { - return key[0]; - } - - return '!'; - } - } - - private readonly Dictionary _baseMnemonicLookupTable = new Dictionary - { - ["Power"] = 'P', - ["Reset"] = 'r', - ["Pause"] = 'p', - ["Rotate"] = 'R', - - ["Up"] = 'U', - ["Down"] = 'D', - ["Left"] = 'L', - ["Right"] = 'R', - - ["A"] = 'A', - ["B"] = 'B', - ["C"] = 'C', - - ["X"] = 'X', - ["Y"] = 'Y', - ["Z"] = 'Z', - - ["Select"] = 's', - ["Start"] = 'S', - ["Run"] = 'R', - - ["L"] = 'l', - ["R"] = 'r', - - ["L1"] = 'l', - ["R1"] = 'r', - - ["L2"] = 'L', - ["R2"] = 'R', - - ["L3"] = '<', - ["R3"] = '>', - - ["Button"] = 'B', - ["Button 1"] = '1', - ["Button 2"] = '2', - ["B1"] = '1', - ["B2"] = '2', - - ["Trigger"] = '1', - ["Trigger 1"] = '1', - ["Trigger 2"] = '2', - - ["Mouse Left"] = 'l', - ["Mouse Right"] = 'r', - ["Mouse Center"] = 'c', - ["Mouse Start"] = 's', - - ["Mode"] = 'M', - ["MODE"] = 'M', - ["Mode 1"] = 'M', - ["Mode 2"] = 'm', - - ["Fire"] = 'F', - ["Lightgun Trigger"] = 'T', - ["Lightgun Start"] = 'S', - ["Lightgun B"] = 'B', - ["Lightgun C"] = 'C', - ["Microphone"] = 'M', - - ["Star"] = '*', - ["Pound"] = '#', - - ["X1"] = '1', - ["X2"] = '2', - ["X3"] = '3', - ["X4"] = '4', - - ["Y1"] = '1', - ["Y2"] = '2', - ["Y3"] = '3', - ["Y4"] = '4', - - ["Triangle"] = 'T', - ["Circle"] = 'O', - ["Cross"] = 'X', - ["Square"] = 'Q', - - ["Toggle Left Difficulty"] = 'l', - ["Toggle Right Difficulty"] = 'r', - ["BW"] = 'b', - - ["Open"] = 'O', - ["Close"] = 'C', - ["Pedal"] = 'P', - - ["Next Disk"] = '>', - ["Previous Disk"] = '<' - }; - - private readonly Dictionary> _systemOverrides = new Dictionary> - { - ["NES"] = new Dictionary - { - ["FDS Eject"] = 'E', - ["FDS Insert 0"] = '0', - ["FDS Insert 1"] = '1', - ["Insert Coin P1"] = 'c', - ["Insert Coin P2"] = 'C', - ["Service Switch"] = 'w', - - ["PP1"] = '1', - ["PP2"] = '2', - ["PP3"] = '3', - ["PP4"] = '4', - - ["PP5"] = '5', - ["PP6"] = '6', - ["PP7"] = '7', - ["PP8"] = '8', - - ["PP9"] = '9', - ["PP10"] = 'A', - ["PP11"] = 'B', - ["PP12"] = 'C', - ["Click"] = 'C', - ["Touch"] = 'T', - }, - ["SNES"] = new Dictionary - { - ["Cursor"] = 'c', - ["Turbo"] = 't', - ["Toggle Multitap"] = 't', - - ["B0"] = '0', - ["B1"] = '1', - ["B2"] = '2', - ["B3"] = '3', - ["B4"] = '4', - ["B5"] = '5', - ["B6"] = '6', - ["B7"] = '7', - ["B8"] = '8', - ["B9"] = '9', - ["B10"] = 'a', - ["B11"] = 'b', - ["B12"] = 'c', - ["B13"] = 'd', - ["B14"] = 'e', - ["B15"] = 'f', - ["B16"] = 'g', - ["B17"] = 'h', - ["B18"] = 'i', - ["B19"] = 'j', - ["B20"] = 'k', - ["B21"] = 'l', - ["B22"] = 'm', - ["B23"] = 'n', - ["B24"] = 'o', - ["B25"] = 'p', - ["B26"] = 'q', - ["B27"] = 'r', - ["B28"] = 's', - ["B29"] = 't', - ["B30"] = 'u', - ["B31"] = 'v' - }, - ["TI83"] = new Dictionary - { - ["UP"] = 'U', - ["DOWN"] = 'D', - ["LEFT"] = 'L', - ["RIGHT"] = 'R', - ["DOT"] = '`', - ["ON"] = 'O', - ["ENTER"] = '=', - ["PLUS"] = '+', - ["MINUS"] = '_', - ["MULTIPLY"] = '*', - ["DIVIDE"] = '/', - ["CLEAR"] = 'c', - ["EXP"] = '^', - ["DASH"] = '-', - ["PARAOPEN"] = '(', - ["PARACLOSE"] = ')', - ["TAN"] = 'T', - ["VARS"] = 'V', - ["COS"] = 'C', - ["PRGM"] = 'P', - ["STAT"] = 's', - ["MATRIX"] = 'm', - ["X"] = 'X', - ["STO"] = '>', - ["LN"] = 'n', - ["LOG"] = 'L', - ["SQUARED"] = '2', - ["NEG1"] = '1', - ["MATH"] = 'H', - ["ALPHA"] = 'A', - ["GRAPH"] = 'G', - ["TRACE"] = 't', - ["ZOOM"] = 'Z', - ["WINDOW"] = 'W', - ["Y"] = 'Y', - ["2ND"] = '&', - ["MODE"] = 'O', - ["DEL"] = 'D', - ["COMMA"] = ',', - ["SIN"] = 'S' - }, - ["C64"] = new Dictionary - { - ["L"] = 'L', - ["R"] = 'R', - ["F1"] = '1', - ["F3"] = '3', - ["F5"] = '5', - ["F7"] = '7', - ["Left Arrow"] = 'l', - ["Plus"] = '+', - ["Minus"] = '-', - ["Pound"] = 'l', - ["Clear/Home"] = 'c', - ["Insert/Delete"] = 'i', - ["Control"] = 'c', - ["At"] = '@', - ["Asterisk"] = '*', - ["Up Arrow"] = 'u', - ["Restore"] = 'r', - ["Run/Stop"] = 's', - ["Lck"] = 'k', - ["Colon"] = ':', - ["Semicolon"] = ';', - ["Equal"] = '=', - ["Return"] = 'e', - ["Commodore"] = 'o', - ["Left Shift"] = 's', - ["Comma"] = ',', - ["Period"] = '>', - ["Slash"] = '/', - ["Right Shift"] = 's', - ["Cursor Up/Down"] = 'u', - ["Cursor Left/Right"] = 'l', - ["Space"] = '_' - }, - ["ZXSpectrum"] = new Dictionary - { - ["Caps Shift"] = '^', - ["Caps Lock"] = 'L', - ["Period"] = '_', - ["Symbol Shift"] = 'v', - ["Semi-Colon"] = ';', - ["Quote"] = '"', - ["Comma"] = ',', - ["True Video"] = 'T', - ["Inv Video"] = 'I', - ["Break"] = 'B', - ["Delete"] = 'D', - ["Graph"] = 'G', - ["Extend Mode"] = 'M', - ["Edit"] = 'E', - ["Play Tape"] = 'P', - ["Stop Tape"] = 'S', - ["RTZ Tape"] = 'r', - ["Record Tape"] = 'R', - ["Insert Next Tape"] = '>', - ["Insert Previous Tape"] = '<', - ["Next Tape Block"] = ']', - ["Prev Tape Block"] = '[', - ["Get Tape Status"] = 'S', - ["Insert Next Disk"] = '}', - ["Insert Previous Disk"] = '{', - ["Get Disk Status"] = 's', - ["Return"] = 'e', - ["Space"] = '-', - ["Up Cursor"] = 'u', - ["Down Cursor"] = 'd', - ["Left Cursor"] = 'l', - ["Right Cursor"] = 'r' - }, - ["N64"] = new Dictionary - { - ["C Up"] = 'u', - ["C Down"] = 'd', - ["C Left"] = 'l', - ["C Right"] = 'r', - - ["A Up"] = 'U', - ["A Down"] = 'D', - ["A Left"] = 'L', - ["A Right"] = 'R', - - ["DPad U"] = 'U', - ["DPad D"] = 'D', - ["DPad L"] = 'L', - ["DPad R"] = 'R', - }, - ["DGB"] = new Dictionary - { - ["Toggle Cable"] = 'L' - }, - ["Lynx"] = new Dictionary - { - ["Option 1"] = '1', - ["Option 2"] = '2' - }, - ["NGP"] = new Dictionary - { - ["Option"] = 'O' - }, - ["AppleII"] = new Dictionary - { - ["Tab"] = 't' , - ["Return"] = 'e' , - ["Escape"] = 'x' , - ["Delete"] = 'b' , - ["Space"] = 's' , - ["Control"] = 'c' , - ["Shift"] = '^' , - ["Caps Lock"] = 'C' , - ["White Apple"] = 'w' , - ["Black Apple"] = 'b' , - ["L"] = 'L' , - ["R"] = 'R' - }, - ["INTV"] = new Dictionary - { - ["Clear"] = 'C' , - ["Enter"] = 'E' , - ["Top"] = 'T' , - ["NNE"] = 'n' , - ["NE"] = '/' , - ["ENE"] = 'e' , - ["ESE"] = 'e' , - ["SE"] = '\\' , - ["SSE"] = 's' , - ["SSW"] = 's' , - ["SW"] = '/' , - ["WSW"] = 'w' , - ["WNW"] = 'w' , - ["NW"] = '\\' , - ["NNW"] = 'n' - }, - ["Coleco"] = new Dictionary - { - ["Yellow"] = 'Y', - ["Red"] = 'R', - ["Blue"] = 'B', - ["Purple"] = 'P' - }, - ["VB"] = new Dictionary - { - ["L_Up"] = 'U', - ["L_Down"] = 'D', - ["L_Left"] = 'L', - ["L_Right"] = 'R', - ["R_Up"] = 'u', - ["R_Down"] = 'd', - ["R_Left"] = 'l', - ["R_Right"] = 'r', - }, - ["PCFX"] = new Dictionary - { - ["I"] = '1', - ["II"] = '2', - ["III"] = '3', - ["IV"] = '4', - ["V"] = '5', - ["VI"] = '6', - } - }; - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs deleted file mode 100644 index e042e1bd39..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System.Collections.Generic; -using System.Text; - -namespace BizHawk.Client.Common -{ - public partial class Bk2Movie - { - protected readonly Bk2Header Header = new Bk2Header(); - private string _syncSettingsJson = ""; - - public IDictionary HeaderEntries => Header; - - public SubtitleList Subtitles { get; } - public IList Comments { get; } - - public string SyncSettingsJson - { - get - { - return _syncSettingsJson; - } - - set - { - if (_syncSettingsJson != value) - { - Changes = true; - _syncSettingsJson = value; - } - } - } - - public ulong Rerecords - { - get - { - if (!Header.ContainsKey(HeaderKeys.RERECORDS)) - { - Header[HeaderKeys.RERECORDS] = "0"; - } - - return ulong.Parse(Header[HeaderKeys.RERECORDS]); - } - - set - { - if (Header[HeaderKeys.RERECORDS] != value.ToString()) - { - Changes = true; - Header[HeaderKeys.RERECORDS] = value.ToString(); - } - } - } - - public bool StartsFromSavestate - { - get - { - if (Header.ContainsKey(HeaderKeys.STARTSFROMSAVESTATE)) - { - return bool.Parse(Header[HeaderKeys.STARTSFROMSAVESTATE]); - } - - return false; - } - - set - { - if (value) - { - Header[HeaderKeys.STARTSFROMSAVESTATE] = "True"; - } - else - { - Header.Remove(HeaderKeys.STARTSFROMSAVESTATE); - } - } - } - - public bool StartsFromSaveRam - { - get - { - if (Header.ContainsKey(HeaderKeys.STARTSFROMSAVERAM)) - { - return bool.Parse(Header[HeaderKeys.STARTSFROMSAVERAM]); - } - - return false; - } - - set - { - if (value) - { - Header.Add(HeaderKeys.STARTSFROMSAVERAM, "True"); - } - else - { - Header.Remove(HeaderKeys.STARTSFROMSAVERAM); - } - } - } - - public string GameName - { - get - { - if (Header.ContainsKey(HeaderKeys.GAMENAME)) - { - return Header[HeaderKeys.GAMENAME]; - } - - return ""; - } - - set - { - if (Header[HeaderKeys.GAMENAME] != value) - { - Changes = true; - Header[HeaderKeys.GAMENAME] = value; - } - } - } - - public string SystemID - { - get - { - if (Header.ContainsKey(HeaderKeys.PLATFORM)) - { - return Header[HeaderKeys.PLATFORM]; - } - - return ""; - } - - set - { - if (Header[HeaderKeys.PLATFORM] != value) - { - Changes = true; - Header[HeaderKeys.PLATFORM] = value; - } - } - } - - public string Hash - { - get - { - return Header[HeaderKeys.SHA1]; - } - - set - { - if (Header[HeaderKeys.SHA1] != value) - { - Changes = true; - Header[HeaderKeys.SHA1] = value; - } - } - } - - public string Author - { - get - { - return Header[HeaderKeys.AUTHOR]; - } - - set - { - if (Header[HeaderKeys.AUTHOR] != value) - { - Changes = true; - Header[HeaderKeys.AUTHOR] = value; - } - } - } - - public string Core - { - get - { - return Header[HeaderKeys.CORE]; - } - - set - { - if (Header[HeaderKeys.CORE] != value) - { - Changes = true; - Header[HeaderKeys.CORE] = value; - } - } - } - - public string BoardName - { - get - { - return Header[HeaderKeys.BOARDNAME]; - } - - set - { - if (Header[HeaderKeys.BOARDNAME] != value) - { - Changes = true; - Header[HeaderKeys.BOARDNAME] = value; - } - } - } - - public string EmulatorVersion - { - get - { - return Header[HeaderKeys.EMULATIONVERSION]; - } - - set - { - if (Header[HeaderKeys.EMULATIONVERSION] != value) - { - Changes = true; - Header[HeaderKeys.EMULATIONVERSION] = value; - } - } - } - - public string FirmwareHash - { - get - { - return Header[HeaderKeys.FIRMWARESHA1]; - } - - set - { - if (Header[HeaderKeys.FIRMWARESHA1] != value) - { - Changes = true; - Header[HeaderKeys.FIRMWARESHA1] = value; - } - } - } - - protected int? LoopOffset - { - get - { - var offsetStr = Header[HeaderKeys.LOOPOFFSET]; - if (!string.IsNullOrWhiteSpace(offsetStr)) - { - return int.Parse(offsetStr); - } - - return null; - } - - set - { - if (value.HasValue) - { - Header[HeaderKeys.LOOPOFFSET] = value.ToString(); - } - else - { - Header.Remove(HeaderKeys.LOOPOFFSET); - } - } - } - - protected string CommentsString() - { - var sb = new StringBuilder(); - - foreach (var comment in Comments) - { - sb.AppendLine(comment); - } - - return sb.ToString(); - } - - public string TextSavestate { get; set; } - public byte[] BinarySavestate { get; set; } - public int[] SavestateFramebuffer { get; set; } - public byte[] SaveRam { get; set; } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs deleted file mode 100644 index f56331b533..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Common; -using BizHawk.Common.IOExtensions; - -namespace BizHawk.Client.Common -{ - public partial class Bk2Movie - { - public void Save() - { - Write(Filename); - } - - public void SaveBackup() - { - if (string.IsNullOrWhiteSpace(Filename)) - { - return; - } - - var backupDir = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesBackupsPathFragment, null); - var backupName = Filename; - backupName = backupName.Insert(Filename.LastIndexOf("."), $".{DateTime.Now:yyyy-MM-dd HH.mm.ss}"); - backupName = Path.Combine(backupDir, Path.GetFileName(backupName)); - - var directoryInfo = new FileInfo(backupName).Directory; - if (directoryInfo != null) - { - Directory.CreateDirectory(directoryInfo.FullName); - } - - Write(backupName, backup: true); - } - - public virtual bool Load(bool preload) - { - var file = new FileInfo(Filename); - if (!file.Exists) - { - return false; - } - - using (var bl = BinaryStateLoader.LoadAndDetect(Filename, true)) - { - if (bl == null) - { - return false; - } - - ClearBeforeLoad(); - - bl.GetLump(BinaryStateLump.Movieheader, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - var pair = line.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); - - if (pair.Length > 1) - { - if (!Header.ContainsKey(pair[0])) - { - Header.Add(pair[0], pair[1]); - } - } - } - } - }); - - bl.GetLump(BinaryStateLump.Comments, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Comments.Add(line); - } - } - }); - - bl.GetLump(BinaryStateLump.Subtitles, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Subtitles.AddFromString(line); - } - } - - Subtitles.Sort(); - }); - - bl.GetLump(BinaryStateLump.SyncSettings, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - _syncSettingsJson = line; - } - } - }); - - bl.GetLump(BinaryStateLump.Input, true, delegate(TextReader tr) - { - string errorMessage; - IsCountingRerecords = false; - ExtractInputLog(tr, out errorMessage); - IsCountingRerecords = true; - }); - - if (StartsFromSavestate) - { - bl.GetCoreState( - delegate(BinaryReader br, long length) - { - BinarySavestate = br.ReadBytes((int)length); - }, - delegate(TextReader tr) - { - TextSavestate = tr.ReadToEnd(); - }); - bl.GetLump(BinaryStateLump.Framebuffer, false, - delegate(BinaryReader br, long length) - { - SavestateFramebuffer = new int[length / sizeof(int)]; - for (int i = 0; i < SavestateFramebuffer.Length; i++) - { - SavestateFramebuffer[i] = br.ReadInt32(); - } - }); - } - else if (StartsFromSaveRam) - { - bl.GetLump(BinaryStateLump.MovieSaveRam, false, - delegate(BinaryReader br, long length) - { - SaveRam = br.ReadBytes((int)length); - }); - } - } - - Changes = false; - return true; - } - - public bool PreLoadHeaderAndLength(HawkFile hawkFile) - { - var file = new FileInfo(Filename); - if (!file.Exists) - { - return false; - } - - Filename = file.FullName; - return Load(true); - } - - protected virtual void Write(string fn, bool backup = false) - { - var file = new FileInfo(fn); - if (!file.Directory.Exists) - { - Directory.CreateDirectory(file.Directory.ToString()); - } - - using (var bs = new BinaryStateSaver(fn, false)) - { - bs.PutLump(BinaryStateLump.Movieheader, tw => tw.WriteLine(Header.ToString())); - bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString())); - bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); - bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(_syncSettingsJson)); - - bs.PutLump(BinaryStateLump.Input, WriteInputLog); - - if (StartsFromSavestate) - { - if (TextSavestate != null) - { - bs.PutLump(BinaryStateLump.CorestateText, (TextWriter tw) => tw.Write(TextSavestate)); - } - else - { - bs.PutLump(BinaryStateLump.Corestate, (BinaryWriter bw) => bw.Write(BinarySavestate)); - } - - if (SavestateFramebuffer != null) - { - bs.PutLump(BinaryStateLump.Framebuffer, (BinaryWriter bw) => bw.Write(SavestateFramebuffer)); - } - } - else if (StartsFromSaveRam) - { - bs.PutLump(BinaryStateLump.MovieSaveRam, (BinaryWriter bw) => bw.Write(SaveRam)); - } - } - - if (!backup) - { - Changes = false; - } - } - - protected void ClearBeforeLoad() - { - Header.Clear(); - Log.Clear(); - Subtitles.Clear(); - Comments.Clear(); - _syncSettingsJson = ""; - TextSavestate = null; - BinarySavestate = null; - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs deleted file mode 100644 index 9d9ac17618..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs +++ /dev/null @@ -1,322 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using System.IO; - -namespace BizHawk.Client.Common -{ - public partial class Bk2Movie - { - protected IStringLog Log { get; set; } - protected string LogKey { get; set; } = ""; - - public void WriteInputLog(TextWriter writer) - { - writer.WriteLine("[Input]"); - WriteRawInputLog(writer); - writer.WriteLine("[/Input]"); - } - - public string GetInputLogEntry(int frame) - { - if (frame < FrameCount && frame >= 0) - { - int getframe; - - if (LoopOffset.HasValue) - { - if (frame < Log.Count) - { - getframe = frame; - } - else - { - getframe = ((frame - LoopOffset.Value) % (Log.Count - LoopOffset.Value)) + LoopOffset.Value; - } - } - else - { - getframe = frame; - } - - return Log[getframe]; - } - - return ""; - } - - public virtual bool ExtractInputLog(TextReader reader, out string errorMessage) - { - errorMessage = ""; - int? stateFrame = null; - - // We are in record mode so replace the movie log with the one from the savestate - if (!Global.MovieSession.MultiTrack.IsActive) - { - if (Global.Config.EnableBackupMovies && MakeBackup && Log.Count != 0) - { - SaveBackup(); - MakeBackup = false; - } - - Log.Clear(); - while (true) - { - var line = reader.ReadLine(); - if (string.IsNullOrEmpty(line)) - { - break; - } - - // in BK2, this is part of the input log, and not involved with the core state at all - // accordingly, this case (for special neshawk format frame numbers) is irrelevant - // probably - else if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.StartsWith("LogKey:")) - { - LogKey = line.Replace("LogKey:", ""); - } - else if (line[0] == '|') - { - Log.Add(line); - } - } - } - else - { - var i = 0; - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - break; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.StartsWith("LogKey:")) - { - LogKey = line.Replace("LogKey:", ""); - } - else if (line.StartsWith("|")) - { - SetFrameAt(i, line); - i++; - } - } - } - - if (!stateFrame.HasValue) - { - errorMessage = "Savestate Frame number failed to parse"; - } - - var stateFramei = stateFrame ?? 0; - - if (stateFramei > 0 && stateFramei < Log.Count) - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(stateFramei); - } - } - else if (stateFramei > Log.Count) // Post movie savestate - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(Log.Count); - } - - Mode = Moviemode.Finished; - } - - if (IsCountingRerecords) - { - Rerecords++; - } - - return true; - } - - public bool CheckTimeLines(TextReader reader, out string errorMessage) - { - // This function will compare the movie data to the savestate movie data to see if they match - errorMessage = ""; - var newLog = new List(); - var stateFrame = 0; - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - break; - } - - if (line.Trim() == "") - { - continue; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line[0] == '|') - { - newLog.Add(line); - } - } - - if (stateFrame == 0) - { - stateFrame = newLog.Count; // In case the frame count failed to parse, revert to using the entire state input log - } - - if (Log.Count < stateFrame) - { - if (IsFinished) - { - return true; - } - - errorMessage = "The savestate is from frame " - + newLog.Count - + " which is greater than the current movie length of " - + Log.Count; - - return false; - } - - for (var i = 0; i < stateFrame; i++) - { - if (Log[i] != newLog[i]) - { - errorMessage = "The savestate input does not match the movie input at frame " - + (i + 1) - + "."; - - return false; - } - } - - if (stateFrame > newLog.Count) // stateFrame is greater than state input log, so movie finished mode - { - if (Mode == Moviemode.Play || Mode == Moviemode.Finished) - { - Mode = Moviemode.Finished; - return true; - } - - return false; - } - - if (Mode == Moviemode.Finished) - { - Mode = Moviemode.Play; - } - - return true; - } - - protected void WriteRawInputLog(TextWriter writer) - { - var lg = new Bk2LogEntryGenerator(LogKey); - lg.SetSource(Global.MovieOutputHardpoint); - - writer.WriteLine(lg.GenerateLogKey()); - - foreach (var record in Log) - { - writer.WriteLine(record); - } - } - - /// - /// Takes a log entry from a line in an input log, - /// If the log key differs from the system's, it will be converted - /// - /// a log entry line of text from the input log - /// a key used to describe the mnemonic values and positions in the log - private string ConvertLogEntryFromFile(string line, string logKey) - { - var adapter = new Bk2LogEntryGenerator(logKey).MovieControllerAdapter; - adapter.Definition = Global.MovieSession.MovieControllerAdapter.Definition; - adapter.SetControllersAsMnemonic(line); - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - return lg.GenerateLogEntry(); - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs deleted file mode 100644 index 84ba6b80e0..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Linq; - -namespace BizHawk.Client.Common -{ - public partial class Bk2Movie - { - protected enum Moviemode - { - Inactive, Play, Record, Finished - } - - protected Moviemode Mode { get; set; } = Moviemode.Inactive; - - public bool IsActive => Mode != Moviemode.Inactive; - - public bool IsPlaying => Mode == Moviemode.Play || Mode == Moviemode.Finished; - - public bool IsRecording => Mode == Moviemode.Record; - - public bool IsFinished => Mode == Moviemode.Finished; - - public virtual void StartNewRecording() - { - Mode = Moviemode.Record; - if (Global.Config.EnableBackupMovies && MakeBackup && Log.Any()) - { - SaveBackup(); - MakeBackup = false; - } - - Log.Clear(); - } - - public virtual void StartNewPlayback() - { - Mode = Moviemode.Play; - } - - public virtual void SwitchToRecord() - { - Mode = Moviemode.Record; - } - - public virtual void SwitchToPlay() - { - Mode = Moviemode.Play; - } - - public virtual bool Stop(bool saveChanges = true) - { - bool saved = false; - if (saveChanges) - { - if (Mode == Moviemode.Record || (IsActive && Changes)) - { - Save(); - saved = true; - } - } - - Changes = false; - Mode = Moviemode.Inactive; - - return saved; - } - - public void FinishedMode() - { - Mode = Moviemode.Finished; - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs deleted file mode 100644 index a7bf3f088d..0000000000 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs +++ /dev/null @@ -1,185 +0,0 @@ -using System.Collections.Generic; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public partial class Bk2Movie : IMovie - { - public Bk2Movie(string filename) - : this() - { - Rerecords = 0; - Filename = filename; - } - - public Bk2Movie() - { - Subtitles = new SubtitleList(); - Comments = new List(); - - Filename = ""; - IsCountingRerecords = true; - Mode = Moviemode.Inactive; - MakeBackup = true; - - Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0.0"; - - Log = StringLogUtil.MakeStringLog(); - } - - protected bool MakeBackup { get; set; } - - private string _filename; - - public string Filename - { - get - { - return _filename; - } - - set - { - _filename = value; - int index = Filename.LastIndexOf("\\"); - Name = Filename.Substring(index + 1, Filename.Length - index - 1); - } - } - - public string Name { get; private set; } - - public virtual string PreferredExtension => Extension; - - public const string Extension = "bk2"; - - public virtual bool Changes { get; protected set; } - public bool IsCountingRerecords { get; set; } - - public ILogEntryGenerator LogGeneratorInstance() - { - return new Bk2LogEntryGenerator(LogKey); - } - - public double FrameCount - { - get - { - if (LoopOffset.HasValue) - { - return double.PositiveInfinity; - } - - return Log.Count; - } - } - - public int InputLogLength => Log.Count; - - #region Log Editing - - public void AppendFrame(IController source) - { - var lg = LogGeneratorInstance(); - lg.SetSource(source); - Log.Add(lg.GenerateLogEntry()); - Changes = true; - } - - public virtual void RecordFrame(int frame, IController source) - { - if (Global.Config.VBAStyleMovieLoadState) - { - if (Global.Emulator.Frame < Log.Count) - { - Truncate(Global.Emulator.Frame); - } - } - - var lg = LogGeneratorInstance(); - lg.SetSource(source); - SetFrameAt(frame, lg.GenerateLogEntry()); - - Changes = true; - } - - public virtual void Truncate(int frame) - { - // This is a bad way to do multitrack logic, pass the info in instead of going to the global - // and it is weird for Truncate to possibly not truncate - if (!Global.MovieSession.MultiTrack.IsActive) - { - if (frame < Log.Count) - { - Log.RemoveRange(frame, Log.Count - frame); - Changes = true; - } - } - } - - public virtual IController GetInputState(int frame) - { - if (frame < FrameCount && frame >= 0) - { - int getframe; - - if (LoopOffset.HasValue) - { - if (frame < Log.Count) - { - getframe = frame; - } - else - { - getframe = ((frame - LoopOffset.Value) % (Log.Count - LoopOffset.Value)) + LoopOffset.Value; - } - } - else - { - getframe = frame; - } - - var adapter = new Bk2ControllerAdapter - { - Definition = Global.MovieSession.MovieControllerAdapter.Definition - }; - - adapter.SetControllersAsMnemonic(Log[getframe]); - return adapter; - } - - return null; - } - - public virtual void PokeFrame(int frame, IController source) - { - var lg = LogGeneratorInstance(); - lg.SetSource(source); - - Changes = true; - SetFrameAt(frame, lg.GenerateLogEntry()); - } - - public virtual void ClearFrame(int frame) - { - var lg = LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerInstance()); - SetFrameAt(frame, lg.EmptyEntry); - Changes = true; - } - - #endregion - - protected void SetFrameAt(int frameNum, string frame) - { - if (Log.Count > frameNum) - { - Log[frameNum] = frame; - } - else - { - Log.Add(frame); - } - } - } -} diff --git a/BizHawk.Client.Common/movie/bk2/StringLogs.cs b/BizHawk.Client.Common/movie/bk2/StringLogs.cs deleted file mode 100644 index 0473ba7cf6..0000000000 --- a/BizHawk.Client.Common/movie/bk2/StringLogs.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using BizHawk.Common; - -namespace BizHawk.Client.Common -{ - public static class StringLogUtil - { - public static bool DefaultToDisk { get; set; } - public static bool DefaultToAWE { get; set; } - public static IStringLog MakeStringLog() - { - if (DefaultToDisk) - { - return new StreamStringLog(true); - } - - if (DefaultToAWE) - { - return new StreamStringLog(false); - } - - return new ListStringLog(); - } - } - - public interface IStringLog : IDisposable, IEnumerable - { - void RemoveAt(int index); - int Count { get; } - void Clear(); - void Add(string str); - string this[int index] { get; set; } - void Insert(int index, string val); - void InsertRange(int index, IEnumerable collection); - void AddRange(IEnumerable collection); - void RemoveRange(int index, int count); - IStringLog Clone(); - void CopyTo(string[] array); - void CopyTo(int index, string[] array, int arrayIndex, int count); - } - - internal class ListStringLog : List, IStringLog - { - public IStringLog Clone() - { - ListStringLog ret = new ListStringLog(); - ret.AddRange(this); - return ret; - } - - public void Dispose() { } - } - - /// - /// A dumb IStringLog with storage on disk with no provision for recovering lost space, except upon Clear() - /// The purpose here is to avoid having too complicated buggy logic or a dependency on SQLite or such. - /// It should be faster than those alternatives, but wasteful of disk space. - /// It should also be easier to add new IList<string>-like methods than dealing with a database - /// - internal class StreamStringLog : IStringLog - { - private readonly Stream stream; - private readonly List _offsets = new List(); - private readonly BinaryWriter _bw; - private readonly BinaryReader _br; - private readonly bool _mDisk; - - private long _cursor; - - public StreamStringLog(bool disk) - { - _mDisk = disk; - if (disk) - { - var path = TempFileManager.GetTempFilename("movieOnDisk"); - stream = new FileStream(path, FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.None, 4 * 1024, FileOptions.DeleteOnClose); - } - else - { - stream = new AWEMemoryStream(); - } - - _bw = new BinaryWriter(stream); - _br = new BinaryReader(stream); - } - - public IStringLog Clone() - { - StreamStringLog ret = new StreamStringLog(_mDisk); // doesnt necessarily make sense to copy the mDisk value, they could be designated for different targets... - for (int i = 0; i < Count; i++) - { - ret.Add(this[i]); - } - - return ret; - } - - public void Dispose() - { - stream.Dispose(); - } - - public int Count => _offsets.Count; - - public void Clear() - { - stream.SetLength(0); - _offsets.Clear(); - _cursor = 0; - } - - public void Add(string str) - { - stream.Position = stream.Length; - _offsets.Add(stream.Position); - _bw.Write(str); - _bw.Flush(); - } - - public void RemoveAt(int index) - { - // no garbage collection in the disk file... oh well. - _offsets.RemoveAt(index); - } - - public string this[int index] - { - get - { - stream.Position = _offsets[index]; - return _br.ReadString(); - } - - set - { - stream.Position = stream.Length; - _offsets[index] = stream.Position; - _bw.Write(value); - _bw.Flush(); - } - } - - public void Insert(int index, string val) - { - stream.Position = stream.Length; - _offsets.Insert(index, stream.Position); - _bw.Write(val); - _bw.Flush(); - } - - public void InsertRange(int index, IEnumerable collection) - { - foreach (var item in collection) - { - Insert(index++, item); - } - } - - public void AddRange(IEnumerable collection) - { - foreach (var item in collection) - { - Add(item); - } - } - - private class Enumerator : IEnumerator - { - public StreamStringLog Log { get; set; } - private int _index = -1; - - public string Current => Log[_index]; - object System.Collections.IEnumerator.Current => Log[_index]; - - bool System.Collections.IEnumerator.MoveNext() - { - _index++; - if (_index >= Log.Count) - { - _index = Log.Count; - return false; - } - - return true; - } - - void System.Collections.IEnumerator.Reset() { _index = -1; } - - public void Dispose() { } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return new Enumerator { Log = this }; - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return new Enumerator { Log = this }; - } - - public void RemoveRange(int index, int count) - { - int end = index + count - 1; - for (int i = 0; i < count; i++) - { - RemoveAt(end); - end--; - } - } - - public void CopyTo(string[] array) - { - for (int i = 0; i < Count; i++) - { - array[i] = this[i]; - } - } - - public void CopyTo(int index, string[] array, int arrayIndex, int count) - { - for (int i = 0; i < count; i++) - { - array[i + arrayIndex] = this[index + i]; - } - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmControllerAdapter.cs b/BizHawk.Client.Common/movie/bkm/BkmControllerAdapter.cs deleted file mode 100644 index 5e44bdcd56..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmControllerAdapter.cs +++ /dev/null @@ -1,682 +0,0 @@ -using System; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class BkmControllerAdapter : IMovieController - { - #region IController Implementation - - public ControllerDefinition Definition { get; set; } - - public bool IsPressed(string button) - { - return _myBoolButtons[button]; - } - - public float GetFloat(string name) - { - return _myFloatControls[name]; - } - - #endregion - - #region IMovieController Implementation - - /// - /// latches one player from the source - /// - public void LatchPlayerFromSource(IController playerSource, int playerNum) - { - foreach (var button in playerSource.Definition.BoolButtons) - { - var bnp = ButtonNameParser.Parse(button); - - if (bnp?.PlayerNum != playerNum) - { - continue; - } - - var val = playerSource.IsPressed(button); - _myBoolButtons[button] = val; - } - } - - /// - /// latches all buttons from the provided source - /// - public void LatchFromSource(IController source) - { - foreach (var button in Definition.BoolButtons) - { - _myBoolButtons[button] = source.IsPressed(button); - } - - foreach (var name in Definition.FloatControls) - { - _myFloatControls[name] = source.GetFloat(name); - } - } - - /// - /// latches sticky buttons from Global.AutofireStickyXORAdapter - /// - public void LatchSticky() - { - foreach (var button in Definition.BoolButtons) - { - _myBoolButtons[button] = Global.AutofireStickyXORAdapter.IsSticky(button); - } - } - - /// - /// latches all buttons from the supplied mnemonic string - /// - public void SetControllersAsMnemonic(string mnemonic) - { - if (ControlType == "Null Controller") - { - return; - } - - if (ControlType == "Lynx Controller") - { - SetLynxControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "SNES Controller") - { - SetSNESControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "Commodore 64 Controller") - { - SetC64ControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "GBA Controller") - { - SetGBAControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "Atari 7800 ProLine Joystick Controller") - { - SetAtari7800AsMnemonic(mnemonic); - return; - } - - if (ControlType == "Dual Gameboy Controller") - { - SetDualGameBoyControllerAsMnemonic(mnemonic); - return; - } - - if (ControlType == "WonderSwan Controller") - { - SetWonderSwanControllerAsMnemonic(mnemonic); - return; - } - - if (ControlType == "Nintento 64 Controller") - { - SetN64ControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "Saturn Controller") - { - SetSaturnControllersAsMnemonic(mnemonic); - return; - } - - if (ControlType == "PSP Controller") - { - // TODO - return; - } - - if (ControlType == "GPGX Genesis Controller") - { - if (IsGenesis6Button()) - { - SetGenesis6ControllersAsMnemonic(mnemonic); - } - else - { - SetGenesis3ControllersAsMnemonic(mnemonic); - } - - return; - } - - var c = new MnemonicChecker(mnemonic); - - _myBoolButtons.Clear(); - - int start = 3; - if (ControlType == "NES Controller") - { - if (mnemonic.Length < 2) - { - return; - } - else if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] == 'E') - { - Force("FDS Eject", true); - } - else if (mnemonic[1] == '0') - { - Force("FDS Insert 0", true); - } - else if (mnemonic[1] == '1') - { - Force("FDS Insert 1", true); - } - else if (mnemonic[1] == '2') - { - Force("FDS Insert 2", true); - } - else if (mnemonic[1] == '3') - { - Force("FDS Insert 3", true); - } - else if (mnemonic[1] == 'c') - { - Force("VS Coin 1", true); - } - else if (mnemonic[1] == 'C') - { - Force("VS Coin 2", true); - } - else if (mnemonic[1] != '.') - { - Force("Reset", true); - } - } - - if (ControlType == "Gameboy Controller") - { - if (mnemonic.Length < 2) - { - return; - } - - Force("Power", mnemonic[1] != '.'); - } - - if (ControlType == "Genesis 3-Button Controller") - { - if (mnemonic.Length < 2) - { - return; - } - - Force("Reset", mnemonic[1] != '.'); - } - - if (ControlType == "SMS Controller" || ControlType == "TI83 Controller" || ControlType == "ColecoVision Basic Controller") - { - start = 1; - } - - if (ControlType == "Atari 2600 Basic Controller") - { - if (mnemonic.Length < 2) - { - return; - } - - Force("Reset", mnemonic[1] != '.' && mnemonic[1] != '0'); - Force("Select", mnemonic[2] != '.' && mnemonic[2] != '0'); - start = 4; - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - int ctr = start; - if (mnemonic.Length < srcindex + ctr + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - string prefix = ""; - if (ControlType != "Gameboy Controller" && ControlType != "TI83 Controller") - { - prefix = "P" + player + " "; - } - - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force(prefix + button, c[srcindex + ctr++]); - } - } - - if (ControlType == "SMS Controller") - { - int srcindex = BkmMnemonicConstants.Players[ControlType] * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - int ctr = start; - foreach (var command in BkmMnemonicConstants.Commands[ControlType].Keys) - { - Force(command, c[srcindex + ctr++]); - } - } - } - - #endregion - - private readonly WorkingDictionary _myBoolButtons = new WorkingDictionary(); - private readonly WorkingDictionary _myFloatControls = new WorkingDictionary(); - - private bool IsGenesis6Button() - { - return Definition.BoolButtons.Contains("P1 X"); - } - - private void Force(string button, bool state) - { - _myBoolButtons[button] = state; - } - - private void Force(string name, float state) - { - _myFloatControls[name] = state; - } - - private string ControlType => Definition.Name; - - private void SetGBAControllersAsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - - int start = 3; - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force(button, c[start++]); - } - } - - private void SetGenesis6ControllersAsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] != '.' && mnemonic[1] != '0') - { - Force("Reset", true); - } - - if (mnemonic.Length < 9) - { - return; - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 3; - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - } - - private void SetGenesis3ControllersAsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] != '.' && mnemonic[1] != '0') - { - Force("Reset", true); - } - - if (mnemonic.Length < 9) - { - return; - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons["GPGX 3-Button Controller"].Count + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons["GPGX 3-Button Controller"].Count - 1) - { - return; - } - - int start = 3; - foreach (string button in BkmMnemonicConstants.Buttons["GPGX 3-Button Controller"].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - } - - private void SetSNESControllersAsMnemonic(string mnemonic) - { - var c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] != '.' && mnemonic[1] != '0') - { - Force("Reset", true); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 3; - foreach (var button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - } - - private void SetLynxControllersAsMnemonic(string mnemonic) - { - var c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 3; - foreach (var button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force(button, c[srcindex + start++]); - } - } - } - - private void SetN64ControllersAsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] != '.' && mnemonic[1] != '0') - { - Force("Reset", true); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + (BkmMnemonicConstants.Analogs[ControlType].Count * 4) + 1 + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 3; - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - - foreach (string name in BkmMnemonicConstants.Analogs[ControlType].Keys) - { - Force("P" + player + " " + name, int.Parse(mnemonic.Substring(srcindex + start, 4))); - start += 5; - } - } - } - - private void SetSaturnControllersAsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 2) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - else if (mnemonic[1] != '.' && mnemonic[1] != '0') - { - Force("Reset", true); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - - if (mnemonic.Length < srcindex + 3 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 3; - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - } - - private void SetAtari7800AsMnemonic(string mnemonic) - { - MnemonicChecker c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - if (mnemonic.Length < 5) - { - return; - } - - if (mnemonic[1] == 'P') - { - Force("Power", true); - } - - if (mnemonic[2] == 'r') - { - Force("Reset", true); - } - - if (mnemonic[3] == 's') - { - Force("Select", true); - } - - if (mnemonic[4] == 'p') - { - Force("Pause", true); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - int start = 6; - if (mnemonic.Length < srcindex + start + BkmMnemonicConstants.Buttons[ControlType].Count) - { - return; - } - - foreach (string button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - } - - private void SetDualGameBoyControllerAsMnemonic(string mnemonic) - { - var checker = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - for (int i = 0; i < BkmMnemonicConstants.DgbMnemonic.Length; i++) - { - var t = BkmMnemonicConstants.DgbMnemonic[i]; - if (t.Item1 != null) - { - Force(t.Item1, checker[i]); - } - } - } - - private void SetWonderSwanControllerAsMnemonic(string mnemonic) - { - var checker = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - for (int i = 0; i < BkmMnemonicConstants.WsMnemonic.Length; i++) - { - var t = BkmMnemonicConstants.WsMnemonic[i]; - if (t.Item1 != null) - { - Force(t.Item1, checker[i]); - } - } - } - - private void SetC64ControllersAsMnemonic(string mnemonic) - { - var c = new MnemonicChecker(mnemonic); - _myBoolButtons.Clear(); - - for (int player = 1; player <= BkmMnemonicConstants.Players[ControlType]; player++) - { - int srcindex = (player - 1) * (BkmMnemonicConstants.Buttons[ControlType].Count + 1); - - if (mnemonic.Length < srcindex + 1 + BkmMnemonicConstants.Buttons[ControlType].Count - 1) - { - return; - } - - int start = 1; - foreach (var button in BkmMnemonicConstants.Buttons[ControlType].Keys) - { - Force("P" + player + " " + button, c[srcindex + start++]); - } - } - - int startk = 13; - foreach (string button in BkmMnemonicConstants.Buttons["Commodore 64 Keyboard"].Keys) - { - Force(button, c[startk++]); - } - } - - private sealed class MnemonicChecker - { - private readonly string _mnemonic; - - public MnemonicChecker(string mnemonic) - { - _mnemonic = mnemonic; - } - - public bool this[int c] - { - get - { - if (string.IsNullOrEmpty(_mnemonic)) - { - return false; - } - - if (_mnemonic[c] == '.') - { - return false; - } - - if (_mnemonic[c] == '?') - { - return new Random((int)DateTime.Now.Ticks).Next(0, 10) > 5; - } - - return true; - } - } - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmHeader.cs b/BizHawk.Client.Common/movie/bkm/BkmHeader.cs deleted file mode 100644 index e33895a0e6..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmHeader.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System.Collections.Generic; -using System.Text; - -namespace BizHawk.Client.Common -{ - public class BkmHeader : Dictionary - { - public BkmHeader() - { - Comments = new List(); - Subtitles = new SubtitleList(); - - this[HeaderKeys.EMULATIONVERSION] = VersionInfo.GetEmuVersion(); - this[HeaderKeys.PLATFORM] = Global.Emulator != null ? Global.Emulator.SystemId : ""; - this[HeaderKeys.GAMENAME] = ""; - this[HeaderKeys.AUTHOR] = ""; - this[HeaderKeys.RERECORDS] = "0"; - } - - public List Comments { get; } - public SubtitleList Subtitles { get; } - - public string SavestateBinaryBase64Blob - { - get - { - if (ContainsKey(HeaderKeys.SAVESTATEBINARYBASE64BLOB)) - { - return this[HeaderKeys.SAVESTATEBINARYBASE64BLOB]; - } - - return null; - } - - set - { - if (value == null) - { - Remove(HeaderKeys.SAVESTATEBINARYBASE64BLOB); - } - else - { - Add(HeaderKeys.SAVESTATEBINARYBASE64BLOB, value); - } - } - } - - public ulong Rerecords - { - get - { - if (!ContainsKey(HeaderKeys.RERECORDS)) - { - this[HeaderKeys.RERECORDS] = "0"; - } - - return ulong.Parse(this[HeaderKeys.RERECORDS]); - } - - set - { - this[HeaderKeys.RERECORDS] = value.ToString(); - } - } - - public bool StartsFromSavestate - { - get - { - if (ContainsKey(HeaderKeys.STARTSFROMSAVESTATE)) - { - return bool.Parse(this[HeaderKeys.STARTSFROMSAVESTATE]); - } - - return false; - } - - set - { - if (value) - { - Add(HeaderKeys.STARTSFROMSAVESTATE, "True"); - } - else - { - Remove(HeaderKeys.STARTSFROMSAVESTATE); - } - } - } - - public string GameName - { - get - { - if (ContainsKey(HeaderKeys.GAMENAME)) - { - return this[HeaderKeys.GAMENAME]; - } - - return ""; - } - - set - { - this[HeaderKeys.GAMENAME] = value; - } - } - - public string SystemId - { - get - { - if (ContainsKey(HeaderKeys.PLATFORM)) - { - return this[HeaderKeys.PLATFORM]; - } - - return ""; - } - - set - { - this[HeaderKeys.PLATFORM] = value; - } - } - - public new string this[string key] - { - get - { - return ContainsKey(key) ? base[key] : ""; - } - - set - { - if (ContainsKey(key)) - { - base[key] = value; - } - else - { - Add(key, value); - } - } - } - - public new void Clear() - { - Comments.Clear(); - Subtitles.Clear(); - base.Clear(); - } - - public override string ToString() - { - var sb = new StringBuilder(); - - foreach (var kvp in this) - { - sb - .Append(kvp.Key) - .Append(' ') - .Append(kvp.Value) - .AppendLine(); - } - - sb.Append(Subtitles); - Comments.ForEach(comment => sb.AppendLine(comment)); - - return sb.ToString(); - } - - public bool ParseLineFromFile(string line) - { - if (!string.IsNullOrWhiteSpace(line)) - { - var splitLine = line.Split(new[] { ' ' }, 2); - - if (HeaderKeys.Contains(splitLine[0]) && !ContainsKey(splitLine[0])) - { - Add(splitLine[0], splitLine[1]); - } - else if (line.StartsWith("subtitle") || line.StartsWith("sub")) - { - Subtitles.AddFromString(line); - } - else if (line.StartsWith("comment")) - { - Comments.Add(line.Substring(8, line.Length - 8)); - } - else if (line.StartsWith("|")) - { - return false; - } - } - - return true; - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmLogEntryGenerator.cs b/BizHawk.Client.Common/movie/bkm/BkmLogEntryGenerator.cs deleted file mode 100644 index d444507047..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmLogEntryGenerator.cs +++ /dev/null @@ -1,610 +0,0 @@ -using System.Text; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public class BkmLogEntryGenerator : ILogEntryGenerator - { - private IController _source; - - public void SetSource(IController source) - { - _source = source; - _controlType = source.Definition.Name; - } - - public string GenerateLogEntry() - { - if (_controlType == "Null Controller") - { - return "|.|"; - } - - if (_controlType == "Lynx Controller") - { - return GetLynxControllersAsMnemonic(); - } - - if (_controlType == "Atari 7800 ProLine Joystick Controller") - { - return GetA78ControllersAsMnemonic(); - } - - if (_controlType == "SNES Controller") - { - return GetSNESControllersAsMnemonic(); - } - - if (_controlType == "Commodore 64 Controller") - { - return GetC64ControllersAsMnemonic(); - } - - if (_controlType == "GBA Controller") - { - return GetGBAControllersAsMnemonic(); - } - - if (_controlType == "Dual Gameboy Controller") - { - return GetDualGameBoyControllerAsMnemonic(); - } - - if (_controlType == "WonderSwan Controller") - { - return GetWonderSwanControllerAsMnemonic(); - } - - if (_controlType == "Nintento 64 Controller") - { - return GetN64ControllersAsMnemonic(); - } - - if (_controlType == "Saturn Controller") - { - return GetSaturnControllersAsMnemonic(); - } - - if (_controlType == "PSP Controller") - { - return "|.|"; // TODO - } - - if (_controlType == "GPGX Genesis Controller") - { - return GetGeneis6ButtonControllersAsMnemonic(); - } - - if (_controlType == "GPGX 3-Button Controller") - { - return GetGeneis3ButtonControllersAsMnemonic(); - } - - var input = new StringBuilder("|"); - - if (_controlType == "PC Engine Controller") - { - input.Append("."); - } - else if (_controlType == "Atari 2600 Basic Controller") - { - input.Append(IsBasePressed("Reset") ? "r" : "."); - input.Append(IsBasePressed("Select") ? "s" : "."); - } - else if (_controlType == "NES Controller") - { - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else if (IsBasePressed("Reset")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Reset"]); - } - else if (IsBasePressed("FDS Eject")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["FDS Eject"]); - } - else if (IsBasePressed("FDS Insert 0")) - { - input.Append("0"); - } - else if (IsBasePressed("FDS Insert 1")) - { - input.Append("1"); - } - else if (IsBasePressed("FDS Insert 2")) - { - input.Append("2"); - } - else if (IsBasePressed("FDS Insert 3")) - { - input.Append("3"); - } - else if (IsBasePressed("VS Coin 1")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["VS Coin 1"]); - } - else if (IsBasePressed("VS Coin 2")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["VS Coin 2"]); - } - else - { - input.Append('.'); - } - } - else if (_controlType == "Genesis 3-Button Controller") - { - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else if (IsBasePressed("Reset")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Reset"]); - } - else - { - input.Append('.'); - } - } - else if (_controlType == "Gameboy Controller") - { - input.Append(IsBasePressed("Power") ? BkmMnemonicConstants.Commands[_controlType]["Power"] : "."); - } - - if (_controlType != "SMS Controller" && _controlType != "TI83 Controller" && _controlType != "ColecoVision Basic Controller") - { - input.Append("|"); - } - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - var prefix = ""; - if (_controlType != "Gameboy Controller" && _controlType != "TI83 Controller") - { - prefix = "P" + player + " "; - } - - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed(prefix + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append("|"); - } - - if (_controlType == "SMS Controller") - { - foreach (var command in BkmMnemonicConstants.Commands[_controlType].Keys) - { - input.Append(IsBasePressed(command) ? BkmMnemonicConstants.Commands[_controlType][command] : "."); - } - - input.Append("|"); - } - - if (_controlType == "TI83 Controller") - { - input.Append(".|"); // TODO: perhaps ON should go here? - } - - return input.ToString(); - } - - public string GenerateInputDisplay() - { - return GenerateLogEntry() - .Replace(".", " ") - .Replace("|", "") - .Replace(" 000, 000", " "); - } - - public bool IsEmpty => EmptyEntry == GenerateLogEntry(); - - public string EmptyEntry - { - get - { - switch (Global.Emulator.SystemId) - { - default: - case "NULL": - return "|.|"; - case "A26": - return "|..|.....|.....|"; - case "A78": - return "|....|......|......|"; - case "TI83": - return "|..................................................|.|"; - case "NES": - return "|.|........|........|........|........|"; - case "SNES": - return "|.|............|............|............|............|"; - case "SMS": - case "GG": - case "SG": - return "|......|......|..|"; - case "GEN": - return "|.|........|........|"; - case "GB": - return "|.|........|"; - case "DGB": - return "|.|........|.|........|"; - case "PCE": - case "PCECD": - case "SGX": - return "|.|........|........|........|........|........|"; - case "Coleco": - return "|..................|..................|"; - case "C64": - return "|.....|.....|..................................................................|"; - case "GBA": - return "|.|..........|"; - case "N64": - return "|.|............|............|............|............|"; - case "SAT": - return "|.|.............|.............|"; - case "WSWAN": - return "|...........|...........|..|"; - } - } - } - - public IMovieController MovieControllerAdapter => new BkmControllerAdapter(); - - #region Privates - - private bool IsBasePressed(string name) - { - return _source.IsPressed(name); - } - - private float GetBaseFloat(string name) - { - return _source.GetFloat(name); - } - - private string _controlType; - - private string GetGBAControllersAsMnemonic() - { - var input = new StringBuilder("|"); - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else - { - input.Append("."); - } - - input.Append("|"); - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed(button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append("|"); - return input.ToString(); - } - - private string GetSNESControllersAsMnemonic() - { - var input = new StringBuilder("|"); - - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else if (IsBasePressed("Reset")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Reset"]); - } - else - { - input.Append('.'); - } - - input.Append("|"); - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append("|"); - } - - return input.ToString(); - } - - private string GetC64ControllersAsMnemonic() - { - var input = new StringBuilder("|"); - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append('|'); - } - - foreach (var button in BkmMnemonicConstants.Buttons["Commodore 64 Keyboard"].Keys) - { - input.Append(IsBasePressed(button) ? BkmMnemonicConstants.Buttons["Commodore 64 Keyboard"][button] : "."); - } - - input.Append('|'); - return input.ToString(); - } - - private string GetDualGameBoyControllerAsMnemonic() - { - // |.|........|.|........| - var input = new StringBuilder(); - - foreach (var t in BkmMnemonicConstants.DgbMnemonic) - { - if (t.Item1 != null) - { - input.Append(IsBasePressed(t.Item1) ? t.Item2 : '.'); - } - else - { - input.Append(t.Item2); // Separator - } - } - - return input.ToString(); - } - - private string GetWonderSwanControllerAsMnemonic() - { - // |....|....|...| - var input = new StringBuilder(); - - foreach (var t in BkmMnemonicConstants.WsMnemonic) - { - if (t.Item1 != null) - { - input.Append(IsBasePressed(t.Item1) ? t.Item2 : '.'); - } - else - { - input.Append(t.Item2); // Separator - } - } - - return input.ToString(); - } - - private string GetA78ControllersAsMnemonic() - { - var input = new StringBuilder("|"); - input.Append(IsBasePressed("Power") ? 'P' : '.'); - input.Append(IsBasePressed("Reset") ? 'r' : '.'); - input.Append(IsBasePressed("Select") ? 's' : '.'); - input.Append(IsBasePressed("Pause") ? 'p' : '.'); - input.Append('|'); - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append('|'); - } - - return input.ToString(); - } - - private string GetLynxControllersAsMnemonic() - { - var input = new StringBuilder("|"); - input.Append(IsBasePressed("Power") ? 'P' : '.'); - input.Append('|'); - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed(button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append('|'); - } - - return input.ToString(); - } - - private string GetN64ControllersAsMnemonic() - { - var input = new StringBuilder("|"); - if (IsBasePressed("Power")) - { - input.Append('P'); - } - else if (IsBasePressed("Reset")) - { - input.Append('r'); - } - else - { - input.Append('.'); - } - - input.Append('|'); - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - if (BkmMnemonicConstants.Analogs[_controlType].Keys.Count > 0) - { - foreach (var name in BkmMnemonicConstants.Analogs[_controlType].Keys) - { - int val; - - // Nasty hackery - if (name == "Y Axis") - { - if (IsBasePressed("P" + player + " A Up")) - { - val = 127; - } - else if (IsBasePressed("P" + player + " A Down")) - { - val = -127; - } - else - { - val = (int)GetBaseFloat("P" + player + " " + name); - } - } - else if (name == "X Axis") - { - if (IsBasePressed("P" + player + " A Left")) - { - val = -127; - } - else if (IsBasePressed("P" + player + " A Right")) - { - val = 127; - } - else - { - val = (int)GetBaseFloat("P" + player + " " + name); - } - } - else - { - val = (int)GetBaseFloat("P" + player + " " + name); - } - - if (val >= 0) - { - input.Append(' '); - } - - input.Append($"{val:000}").Append(','); - } - - input.Remove(input.Length - 1, 1); - } - - input.Append('|'); - } - - return input.ToString(); - } - - private string GetSaturnControllersAsMnemonic() - { - var input = new StringBuilder("|"); - if (IsBasePressed("Power")) - { - input.Append('P'); - } - else if (IsBasePressed("Reset")) - { - input.Append('r'); - } - else - { - input.Append('.'); - } - - input.Append('|'); - - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append('|'); - } - - return input.ToString(); - } - - private string GetGeneis6ButtonControllersAsMnemonic() - { - var input = new StringBuilder("|"); - - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else if (IsBasePressed("Reset")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Reset"]); - } - else - { - input.Append('.'); - } - - input.Append("|"); - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append("|"); - } - - input.Append("|"); - return input.ToString(); - } - - private string GetGeneis3ButtonControllersAsMnemonic() - { - var input = new StringBuilder("|"); - - if (IsBasePressed("Power")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Power"]); - } - else if (IsBasePressed("Reset")) - { - input.Append(BkmMnemonicConstants.Commands[_controlType]["Reset"]); - } - else - { - input.Append('.'); - } - - input.Append("|"); - for (int player = 1; player <= BkmMnemonicConstants.Players[_controlType]; player++) - { - foreach (var button in BkmMnemonicConstants.Buttons[_controlType].Keys) - { - input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.Buttons[_controlType][button] : "."); - } - - input.Append("|"); - } - - input.Append("|"); - return input.ToString(); - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMnemonicConstants.cs b/BizHawk.Client.Common/movie/bkm/BkmMnemonicConstants.cs deleted file mode 100644 index 720050e329..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMnemonicConstants.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - public static class BkmMnemonicConstants - { - public static readonly Dictionary> Buttons = new Dictionary> - { - { - "Gameboy Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, { "A", "A" } - } - }, - { - "Lynx Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, { "A", "A" } - } - }, - { - "GBA Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, - { "A", "A" }, { "L", "L" }, { "R", "R" } - } - }, - { - "Genesis 3-Button Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Start", "S" }, { "A", "A" }, { "B", "B" }, - { "C", "C" } - } - }, - { - "GPGX Genesis Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "A", "A" }, { "B", "B" }, { "C", "C" }, - { "Start", "S" }, { "X", "X" }, { "Y", "Y" }, { "Z", "Z" }, { "Mode", "M" } - } - }, - { - "GPGX 3-Button Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "A", "A" }, { "B", "B" }, - { "C", "C" }, { "Start", "S" }, - } - }, - { - "NES Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, - { "A", "A" } - } - }, - { - "SNES Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, - { "A", "A" }, { "X", "X" }, { "Y", "Y" }, { "L", "L" }, { "R", "R" } - } - }, - { - "PC Engine Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Run", "r" }, { "B2", "2" }, - { "B1", "1" } - } - }, - { - "SMS Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "B1", "1" }, { "B2", "2" } - } - }, - { - "TI83 Controller", new Dictionary - { - { "0", "0" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, - { "8", "8" }, { "9", "9" }, { "DOT", "`" }, { "ON", "O" }, { "ENTER", "=" }, { "UP", "U" }, { "DOWN", "D" }, - { "LEFT", "L" }, { "RIGHT", "R" }, { "PLUS", "+" }, { "MINUS", "_" }, { "MULTIPLY", "*" }, { "DIVIDE", "/" }, - { "CLEAR", "c" }, { "EXP", "^" }, { "DASH", "-" }, { "PARAOPEN", "(" }, { "PARACLOSE", ")" }, { "TAN", "T" }, - { "VARS", "V" }, { "COS", "C" }, { "PRGM", "P" }, { "STAT", "s" }, { "MATRIX", "m" }, { "X", "X" }, { "STO", ">" }, - { "LN", "n" }, { "LOG", "L" }, { "SQUARED", "2" }, { "NEG1", "1" }, { "MATH", "H" }, { "ALPHA", "A" }, - { "GRAPH", "G" }, { "TRACE", "t" }, { "ZOOM", "Z" }, { "WINDOW", "W" }, { "Y", "Y" }, { "2ND", "&" }, { "MODE", "O" }, - { "DEL", "D" }, { "COMMA", "," }, { "SIN", "S" } - } - }, - { - "Atari 2600 Basic Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Button", "B" } - } - }, - { - "Atari 7800 ProLine Joystick Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Trigger", "1" }, { "Trigger 2", "2" } - } - }, - { - "Commodore 64 Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Button", "B" } - } - }, - { - "Commodore 64 Keyboard", new Dictionary - { - { "Key F1", "1" }, { "Key F3", "3" }, { "Key F5", "5" }, { "Key F7", "7" }, - { "Key Left Arrow", "l" }, { "Key 1", "1" }, { "Key 2", "2" }, { "Key 3", "3" }, { "Key 4", "4" }, { "Key 5", "5" }, { "Key 6", "6" }, { "Key 7", "7" }, { "Key 8", "8" }, { "Key 9", "9" }, { "Key 0", "0" }, { "Key Plus", "+" }, { "Key Minus", "-" }, { "Key Pound", "l" }, { "Key Clear/Home", "c" }, { "Key Insert/Delete", "i" }, - { "Key Control", "c" }, { "Key Q", "Q" }, { "Key W", "W" }, { "Key E", "E" }, { "Key R", "R" }, { "Key T", "T" }, { "Key Y", "Y" }, { "Key U", "U" }, { "Key I", "I" }, { "Key O", "O" }, { "Key P", "P" }, { "Key At", "@" }, { "Key Asterisk", "*" }, { "Key Up Arrow", "u" }, { "Key Restore", "r" }, - { "Key Run/Stop", "s" }, { "Key Lck", "k" }, { "Key A", "A" }, { "Key S", "S" }, { "Key D", "D" }, { "Key F", "F" }, { "Key G", "G" }, { "Key H", "H" }, { "Key J", "J" }, { "Key K", "K" }, { "Key L", "L" }, { "Key Colon", ":" }, { "Key Semicolon", ";" }, { "Key Equal", "=" }, { "Key Return", "e" }, - { "Key Commodore", "o" }, { "Key Left Shift", "s" }, { "Key Z", "Z" }, { "Key X", "X" }, { "Key C", "C" }, { "Key V", "V" }, { "Key B", "B" }, { "Key N", "N" }, { "Key M", "M" }, { "Key Comma", "," }, { "Key Period", ">" }, { "Key Slash", "/" }, { "Key Right Shift", "s" }, { "Key Cursor Up/Down", "u" }, { "Key Cursor Left/Right", "l" }, - { "Key Space", "_" } - } - }, - { - "ColecoVision Basic Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "L", "l" }, { "R", "r" }, - { "Key1", "1" }, { "Key2", "2" }, { "Key3", "3" }, { "Key4", "4" }, { "Key5", "5" }, { "Key6", "6" }, - { "Key7", "7" }, { "Key8", "8" }, { "Key9", "9" }, { "Star", "*" }, { "Key0", "0" }, { "Pound", "#" } - } - }, - { - "Nintento 64 Controller", new Dictionary - { - { "DPad U", "U" }, { "DPad D", "D" }, { "DPad L", "L" }, { "DPad R", "R" }, - { "B", "B" }, { "A", "A" }, { "Z", "Z" }, { "Start", "S" }, { "L", "L" }, { "R", "R" }, - { "C Up", "u" }, { "C Down", "d" }, { "C Left", "l" }, { "C Right", "r" } - } - }, - { - "Saturn Controller", new Dictionary - { - { "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, - { "Start", "S" }, { "X", "X" }, { "Y", "Y" }, { "Z", "Z" }, { "A", "A" }, { "B", "B" }, { "C", "C" }, - { "L", "l" }, { "R", "r" }, - } - } - }; - - public static readonly Dictionary> Analogs = new Dictionary> - { - { "Nintento 64 Controller", new Dictionary { { "X Axis", "X" }, { "Y Axis", "Y" } } } - }; - - public static readonly Dictionary> Commands = new Dictionary> - { - { "Atari 2600 Basic Controller", new Dictionary { { "Reset", "r" }, { "Select", "s" } } }, - { "Atari 7800 ProLine Joystick Controller", new Dictionary { { "Reset", "r" }, { "Select", "s" } } }, - { "Gameboy Controller", new Dictionary { { "Power", "P" } } }, - { "GBA Controller", new Dictionary { { "Power", "P" } } }, - { "Genesis 3-Button Controller", new Dictionary { { "Reset", "r" } } }, - { "GPGX Genesis Controller", new Dictionary { { "Power", "P" }, { "Reset", "r" } } }, - { "NES Controller", new Dictionary { { "Reset", "r" }, { "Power", "P" }, { "FDS Eject", "E" }, { "FDS Insert 0", "0" }, { "FDS Insert 1", "1" }, { "VS Coin 1", "c" }, { "VS Coin 2", "C" } } }, - { "SNES Controller", new Dictionary { { "Power", "P" }, { "Reset", "r" } } }, - { "PC Engine Controller", new Dictionary() }, - { "SMS Controller", new Dictionary { { "Pause", "p" }, { "Reset", "r" } } }, - { "TI83 Controller", new Dictionary() }, - { "Nintento 64 Controller", new Dictionary { { "Power", "P" }, { "Reset", "r" } } }, - { "Saturn Controller", new Dictionary { { "Power", "P" }, { "Reset", "r" } } }, - { "GPGX 3-Button Controller", new Dictionary { { "Power", "P" }, { "Reset", "r" } } } - }; - - public static readonly Dictionary Players = new Dictionary - { - { "Gameboy Controller", 1 }, { "GBA Controller", 1 }, { "Genesis 3-Button Controller", 2 }, { "GPGX Genesis Controller", 2 }, { "NES Controller", 4 }, - { "SNES Controller", 4 }, { "PC Engine Controller", 5 }, { "SMS Controller", 2 }, { "TI83 Controller", 1 }, { "Atari 2600 Basic Controller", 2 }, { "Atari 7800 ProLine Joystick Controller", 2 }, - { "ColecoVision Basic Controller", 2 }, { "Commodore 64 Controller", 2 }, { "Nintento 64 Controller", 4 }, { "Saturn Controller", 2 }, - { "GPGX 3-Button Controller", 2 }, { "Lynx Controller", 1 } - }; - - // just experimenting with different possibly more painful ways to handle mnemonics - // |P|UDLRsSBA| - public static readonly Tuple[] DgbMnemonic = - { - new Tuple(null, '|'), - new Tuple("P1 Power", 'P'), - new Tuple(null, '|'), - new Tuple("P1 Up", 'U'), - new Tuple("P1 Down", 'D'), - new Tuple("P1 Left", 'L'), - new Tuple("P1 Right", 'R'), - new Tuple("P1 Select", 's'), - new Tuple("P1 Start", 'S'), - new Tuple("P1 B", 'B'), - new Tuple("P1 A", 'A'), - new Tuple(null, '|'), - new Tuple("P2 Power", 'P'), - new Tuple(null, '|'), - new Tuple("P2 Up", 'U'), - new Tuple("P2 Down", 'D'), - new Tuple("P2 Left", 'L'), - new Tuple("P2 Right", 'R'), - new Tuple("P2 Select", 's'), - new Tuple("P2 Start", 'S'), - new Tuple("P2 B", 'B'), - new Tuple("P2 A", 'A'), - new Tuple(null, '|') - }; - - public static readonly Tuple[] WsMnemonic = - { - new Tuple(null, '|'), - new Tuple("P1 X1", '1'), - new Tuple("P1 X3", '3'), - new Tuple("P1 X4", '4'), - new Tuple("P1 X2", '2'), - new Tuple("P1 Y1", '1'), - new Tuple("P1 Y3", '3'), - new Tuple("P1 Y4", '4'), - new Tuple("P1 Y2", '2'), - new Tuple("P1 Start", 'S'), - new Tuple("P1 B", 'B'), - new Tuple("P1 A", 'A'), - new Tuple(null, '|'), - new Tuple("P2 X1", '1'), - new Tuple("P2 X3", '3'), - new Tuple("P2 X4", '4'), - new Tuple("P2 X2", '2'), - new Tuple("P2 Y1", '1'), - new Tuple("P2 Y3", '3'), - new Tuple("P2 Y4", '4'), - new Tuple("P2 Y2", '2'), - new Tuple("P2 Start", 'S'), - new Tuple("P2 B", 'B'), - new Tuple("P2 A", 'A'), - new Tuple(null, '|'), - new Tuple("Power", 'P'), - new Tuple("Rotate", 'R'), - new Tuple(null, '|') - }; - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs deleted file mode 100644 index e4329a2280..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - public partial class BkmMovie - { - public IDictionary HeaderEntries => Header; - - public SubtitleList Subtitles => Header.Subtitles; - - public IList Comments => Header.Comments; - - public string SyncSettingsJson - { - get { return Header[HeaderKeys.SYNCSETTINGS]; } - set { Header[HeaderKeys.SYNCSETTINGS] = value; } - } - - public ulong Rerecords - { - get { return Header.Rerecords; } - set { Header.Rerecords = value; } - } - - public bool StartsFromSavestate - { - get { return Header.StartsFromSavestate; } - set { Header.StartsFromSavestate = value; } - } - - // Bkm doesn't support saveram anchored movies - public bool StartsFromSaveRam - { - get { return false; } set { } - } - - public string GameName - { - get { return Header.GameName; } - set { Header.GameName = value; } - } - - public string SystemID - { - get { return Header.SystemId; } - set { Header.SystemId = value; } - } - - public string Hash - { - get { return Header[HeaderKeys.SHA1]; } - set { Header[HeaderKeys.SHA1] = value; } - } - - public string Author - { - get { return Header[HeaderKeys.AUTHOR]; } - set { Header[HeaderKeys.AUTHOR] = value; } - } - - public string Core - { - get { return Header[HeaderKeys.CORE]; } - set { Header[HeaderKeys.CORE] = value; } - } - - public string BoardName - { - get { return Header[HeaderKeys.BOARDNAME]; } - set { Header[HeaderKeys.BOARDNAME] = value; } - } - - public string EmulatorVersion - { - get { return Header[HeaderKeys.EMULATIONVERSION]; } - set { Header[HeaderKeys.EMULATIONVERSION] = value; } - } - - public string FirmwareHash - { - get { return Header[HeaderKeys.FIRMWARESHA1]; } - set { Header[HeaderKeys.FIRMWARESHA1] = value; } - } - - public string TextSavestate { get; set; } - public byte[] BinarySavestate { get; set; } - public int[] SavestateFramebuffer { get { return null; } set { } } // eat and ignore framebuffers - public byte[] SaveRam { get { return null; } set { } } // Bkm does not support Saveram anchored movies - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs deleted file mode 100644 index 28304ff050..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs +++ /dev/null @@ -1,281 +0,0 @@ -using System; -using System.IO; -using System.Text; - -using BizHawk.Common; - -namespace BizHawk.Client.Common -{ - public partial class BkmMovie - { - private int _preloadFramecount; // Not a a reliable number, used for preloading (when no log has yet been loaded), this is only for quick stat compilation for dialogs such as play movie - - public void SaveAs(string path) - { - Filename = path; - if (!Loaded) - { - return; - } - - var directoryInfo = new FileInfo(Filename).Directory; - if (directoryInfo != null) - { - Directory.CreateDirectory(directoryInfo.FullName); - } - - Write(Filename); - } - - public void Save() - { - if (!Loaded || string.IsNullOrWhiteSpace(Filename)) - { - return; - } - - SaveAs(Filename); - _changes = false; - } - - public void SaveBackup() - { - if (!Loaded || string.IsNullOrWhiteSpace(Filename)) - { - return; - } - - var backupName = Filename; - backupName = backupName.Insert(Filename.LastIndexOf("."), $".{DateTime.Now:yyyy-MM-dd HH.mm.ss}"); - backupName = Path.Combine(Global.Config.PathEntries["Global", "Movie backups"].Path, Path.GetFileName(backupName)); - - var directoryInfo = new FileInfo(backupName).Directory; - if (directoryInfo != null) - { - Directory.CreateDirectory(directoryInfo.FullName); - } - - Write(backupName); - } - - public bool Load(bool preload) - { - var file = new FileInfo(Filename); - - if (file.Exists == false) - { - Loaded = false; - return false; - } - - Header.Clear(); - _log.Clear(); - - using (var sr = file.OpenText()) - { - string line; - - while ((line = sr.ReadLine()) != null) - { - if (line == "") - { - continue; - } - - if (line.Contains("LoopOffset")) - { - try - { - _loopOffset = int.Parse(line.Split(new[] { ' ' }, 2)[1]); - } - catch (Exception) - { - continue; - } - } - else if (Header.ParseLineFromFile(line)) - { - continue; - } - else if (line.StartsWith("|")) - { - _log.Add(line); - } - else - { - Header.Comments.Add(line); - } - } - } - - if (Header.SavestateBinaryBase64Blob != null) - { - BinarySavestate = Convert.FromBase64String(Header.SavestateBinaryBase64Blob); - } - - Loaded = true; - _changes = false; - return true; - } - - /// - /// Load Header information only for displaying file information in dialogs such as play movie - /// TODO - consider not loading the SavestateBinaryBase64Blob key? - /// - public bool PreLoadHeaderAndLength(HawkFile hawkFile) - { - Loaded = false; - var file = new FileInfo(hawkFile.CanonicalFullPath); - - if (file.Exists == false) - { - return false; - } - - Header.Clear(); - _log.Clear(); - - var origStreamPosn = hawkFile.GetStream().Position; - hawkFile.GetStream().Position = 0; // Reset to start - - // No using block because we're sharing the stream and need to give it back undisposed. - var sr = new StreamReader(hawkFile.GetStream()); - - for (;;) - { - // read to first space (key/value delimeter), or pipe, or EOF - int first = sr.Read(); - - if (first == -1) - { - break; - } // EOF - - if (first == '|') // pipe: begin input log - { - // NOTE - this code is a bit convoluted due to its predating the basic outline of the parser which was upgraded in may 2014 - var line = '|' + sr.ReadLine(); - - // how many bytes are left, total? - long remain = sr.BaseStream.Length - sr.BaseStream.Position; - - // try to find out whether we use \r\n or \n - // but only look for 1K characters. - bool usesR = false; - for (int i = 0; i < 1024; i++) - { - int c = sr.Read(); - if (c == -1) - { - break; - } - - if (c == '\r') - { - usesR = true; - break; - } - - if (c == '\n') - { - break; - } - } - - int lineLen = line.Length + 1; // account for \n - if (usesR) - { - lineLen++; // account for \r - } - - _preloadFramecount = (int)(remain / lineLen); // length is remaining bytes / length per line - _preloadFramecount++; // account for the current line - break; - } - else - { - // a header line. finish reading key token, to make sure it isn't one of the FORBIDDEN keys - var sbLine = new StringBuilder(); - sbLine.Append((char)first); - for (;;) - { - int c = sr.Read(); - if (c == -1 || c == '\n' || c == ' ') - { - break; - } - - sbLine.Append((char)c); - } - - var line = sbLine.ToString(); - - // ignore these suckers, theyre way too big for preloading. seriously, we will get out of memory errors. - var skip = line == HeaderKeys.SAVESTATEBINARYBASE64BLOB; - - if (skip) - { - // skip remainder of the line - sr.DiscardBufferedData(); - var stream = sr.BaseStream; - for (;;) - { - int c = stream.ReadByte(); - if (c == -1 || c == '\n') - { - break; - } - } - - // proceed to next line - continue; - } - - var remainder = sr.ReadLine(); - sbLine.Append(' '); - sbLine.Append(remainder); - line = sbLine.ToString(); - - if (string.IsNullOrWhiteSpace(line) || Header.ParseLineFromFile(line)) - { - continue; - } - - Header.Comments.Add(line); - } - } - - hawkFile.GetStream().Position = origStreamPosn; - - return true; - } - - private void Write(string fn) - { - Header.SavestateBinaryBase64Blob = BinarySavestate != null - ? Convert.ToBase64String(BinarySavestate) - : null; - - using (var fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read)) - { - using (var sw = new StreamWriter(fs)) - { - sw.Write(Header.ToString()); - - // TODO: clean this up - if (_loopOffset.HasValue) - { - sw.WriteLine("LoopOffset " + _loopOffset); - } - - foreach (var input in _log) - { - sw.WriteLine(input); - } - } - } - - _changes = false; - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs deleted file mode 100644 index 59cc7bf267..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs +++ /dev/null @@ -1,296 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace BizHawk.Client.Common -{ - public partial class BkmMovie - { - private readonly List _log = new List(); - - public void WriteInputLog(TextWriter writer) - { - writer.WriteLine("[Input]"); - - foreach (var record in _log) - { - writer.WriteLine(record); - } - - writer.WriteLine("[/Input]"); - } - - public string GetInputLogEntry(int frame) - { - if (frame < FrameCount && frame >= 0) - { - return _log[frame]; - } - - return ""; - } - - public bool ExtractInputLog(TextReader reader, out string errorMessage) - { - errorMessage = ""; - int? stateFrame = null; - - // We are in record mode so replace the movie log with the one from the savestate - if (!Global.MovieSession.MultiTrack.IsActive) - { - if (Global.Config.EnableBackupMovies && _makeBackup && _log.Any()) - { - SaveBackup(); - _makeBackup = false; - } - - _log.Clear(); - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - break; - } - - if (line.Trim() == "" || line == "[Input]") - { - continue; - } - - if (line == "[/Input]") - { - break; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line[0] == '|') - { - _log.Add(line); - } - } - } - else - { - var i = 0; - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - break; - } - - if (line.Trim() == "" || line == "[Input]") - { - continue; - } - - if (line == "[/Input]") - { - break; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.StartsWith("|")) - { - SetFrameAt(i, line); - i++; - } - } - } - - if (!stateFrame.HasValue) - { - errorMessage = "Savestate Frame number failed to parse"; - } - - var stateFramei = stateFrame ?? 0; - - if (stateFramei > 0 && stateFramei < _log.Count) - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(stateFramei); - } - } - else if (stateFramei > _log.Count) // Post movie savestate - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(_log.Count); - } - - _mode = Moviemode.Finished; - } - - if (IsCountingRerecords) - { - Rerecords++; - } - - return true; - } - - public bool CheckTimeLines(TextReader reader, out string errorMessage) - { - // This function will compare the movie data to the savestate movie data to see if they match - errorMessage = ""; - var log = new List(); - var stateFrame = 0; - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - return false; - } - - if (line.Trim() == "") - { - continue; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line == "[Input]") - { - continue; - } - else if (line == "[/Input]") - { - break; - } - else if (line[0] == '|') - { - log.Add(line); - } - } - - if (stateFrame == 0) - { - stateFrame = log.Count; // In case the frame count failed to parse, revert to using the entire state input log - } - - if (_log.Count < stateFrame) - { - if (IsFinished) - { - return true; - } - - errorMessage = "The savestate is from frame " - + log.Count - + " which is greater than the current movie length of " - + _log.Count; - - return false; - } - - for (var i = 0; i < stateFrame; i++) - { - if (_log[i] != log[i]) - { - errorMessage = "The savestate input does not match the movie input at frame " - + (i + 1) - + "."; - - return false; - } - } - - if (stateFrame > log.Count) // stateFrame is greater than state input log, so movie finished mode - { - if (_mode == Moviemode.Play || _mode == Moviemode.Finished) - { - _mode = Moviemode.Finished; - return true; - } - - return false; - } - - if (_mode == Moviemode.Finished) - { - _mode = Moviemode.Play; - } - - return true; - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.ModeApi.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.ModeApi.cs deleted file mode 100644 index 437ea64e68..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.ModeApi.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Linq; - -namespace BizHawk.Client.Common -{ - public partial class BkmMovie - { - private enum Moviemode - { - Inactive, Play, Record, Finished - } - - private Moviemode _mode = Moviemode.Inactive; - - public bool IsPlaying => _mode == Moviemode.Play || _mode == Moviemode.Finished; - - public bool IsRecording => _mode == Moviemode.Record; - - public bool IsActive => _mode != Moviemode.Inactive; - - public bool IsFinished => _mode == Moviemode.Finished; - - public void StartNewRecording() - { - _mode = Moviemode.Record; - if (Global.Config.EnableBackupMovies && _makeBackup && _log.Any()) - { - SaveBackup(); - _makeBackup = false; - } - - _log.Clear(); - } - - public void StartNewPlayback() - { - _mode = Moviemode.Play; - } - - public void SwitchToRecord() - { - _mode = Moviemode.Record; - } - - public void SwitchToPlay() - { - _mode = Moviemode.Play; - Save(); - } - - public bool Stop(bool saveChanges = true) - { - bool saved = false; - if (saveChanges) - { - if (_mode == Moviemode.Record || _changes) - { - Save(); - saved = true; - } - } - - _changes = false; - _mode = Moviemode.Inactive; - - return saved; - } - - public void FinishedMode() - { - _mode = Moviemode.Finished; - } - } -} diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.cs deleted file mode 100644 index b90058addd..0000000000 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.cs +++ /dev/null @@ -1,172 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public partial class BkmMovie : IMovie - { - private bool _makeBackup; - private bool _changes; - private int? _loopOffset; - - public BkmMovie(string filename) - : this() - { - Rerecords = 0; - Filename = filename; - Loaded = !string.IsNullOrWhiteSpace(filename); - } - - public BkmMovie() - { - Header = new BkmHeader { [HeaderKeys.MOVIEVERSION] = "BizHawk v0.0.1" }; - Filename = ""; - _preloadFramecount = 0; - - IsCountingRerecords = true; - _mode = Moviemode.Inactive; - _makeBackup = true; - } - - #region Properties - - public ILogEntryGenerator LogGeneratorInstance() - { - return new BkmLogEntryGenerator(); - } - - public string PreferredExtension => Extension; - - public const string Extension = "bkm"; - - public BkmHeader Header { get; } - public string Filename { get; set; } - public bool IsCountingRerecords { get; set; } - public bool Loaded { get; private set; } - - public int InputLogLength => _log.Count; - - public double FrameCount - { - get - { - if (_loopOffset.HasValue) - { - return double.PositiveInfinity; - } - - if (Loaded) - { - return _log.Count; - } - - return _preloadFramecount; - } - } - - public bool Changes => _changes; - - #endregion - - #region Public Log Editing - - public IController GetInputState(int frame) - { - if (frame < FrameCount && frame >= 0) - { - int getframe; - - if (_loopOffset.HasValue) - { - if (frame < _log.Count) - { - getframe = frame; - } - else - { - getframe = ((frame - _loopOffset.Value) % (_log.Count - _loopOffset.Value)) + _loopOffset.Value; - } - } - else - { - getframe = frame; - } - - var adapter = new BkmControllerAdapter - { - Definition = Global.MovieSession.MovieControllerAdapter.Definition - }; - adapter.SetControllersAsMnemonic(_log[getframe]); - return adapter; - } - - return null; - } - - public void ClearFrame(int frame) - { - var lg = LogGeneratorInstance(); - SetFrameAt(frame, lg.EmptyEntry); - _changes = true; - } - - public void AppendFrame(IController source) - { - var lg = LogGeneratorInstance(); - lg.SetSource(source); - _log.Add(lg.GenerateLogEntry()); - _changes = true; - } - - public void Truncate(int frame) - { - if (frame < _log.Count) - { - _log.RemoveRange(frame, _log.Count - frame); - _changes = true; - } - } - - public void PokeFrame(int frame, IController source) - { - var lg = LogGeneratorInstance(); - lg.SetSource(source); - - _changes = true; - SetFrameAt(frame, lg.GenerateLogEntry()); - } - - public void RecordFrame(int frame, IController source) - { - // Note: Truncation here instead of loadstate will make VBA style loadstates - // (Where an entire movie is loaded then truncated on the next frame - // this allows users to restore a movie with any savestate from that "timeline" - if (Global.Config.VBAStyleMovieLoadState) - { - if (Global.Emulator.Frame < _log.Count) - { - Truncate(Global.Emulator.Frame); - } - } - - var lg = LogGeneratorInstance(); - lg.SetSource(source); - SetFrameAt(frame, lg.GenerateLogEntry()); - - _changes = true; - } - - #endregion - - private void SetFrameAt(int frameNum, string frame) - { - if (_log.Count > frameNum) - { - _log[frameNum] = frame; - } - else - { - _log.Add(frame); - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs b/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs deleted file mode 100644 index dd5c1e36c4..0000000000 --- a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs +++ /dev/null @@ -1,344 +0,0 @@ -using System; -using System.IO; -using System.Linq; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive; - -namespace BizHawk.Client.Common.MovieConversionExtensions -{ - public static class MovieConversionExtensions - { - public static TasMovie ToTasMovie(this IMovie old, bool copy = false) - { - string newFilename = old.Filename + "." + TasMovie.Extension; - - if (File.Exists(newFilename)) - { - int fileNum = 1; - bool fileConflict = true; - while (fileConflict) - { - if (File.Exists(newFilename)) - { - newFilename = old.Filename + " (" + fileNum + ")" + "." + TasMovie.Extension; - fileNum++; - } - else - { - fileConflict = false; - } - } - } - - var tas = new TasMovie(newFilename, old.StartsFromSavestate); - tas.TasStateManager.MountWriteAccess(); - - for (var i = 0; i < old.InputLogLength; i++) - { - var input = old.GetInputState(i); - tas.AppendFrame(input); - } - - if (!copy) - { - old.Truncate(0); // Trying to minimize ram usage - } - - tas.HeaderEntries.Clear(); - foreach (var kvp in old.HeaderEntries) - { - tas.HeaderEntries[kvp.Key] = kvp.Value; - } - - tas.SyncSettingsJson = old.SyncSettingsJson; - - tas.Comments.Clear(); - foreach (var comment in old.Comments) - { - tas.Comments.Add(comment); - } - - tas.Subtitles.Clear(); - foreach (var sub in old.Subtitles) - { - tas.Subtitles.Add(sub); - } - - tas.TextSavestate = old.TextSavestate; - tas.BinarySavestate = old.BinarySavestate; - tas.SaveRam = old.SaveRam; - - return tas; - } - - public static Bk2Movie ToBk2(this IMovie old, bool copy = false, bool backup = false) - { - var bk2 = new Bk2Movie(old.Filename.Replace(old.PreferredExtension, Bk2Movie.Extension)); - - for (var i = 0; i < old.InputLogLength; i++) - { - var input = old.GetInputState(i); - bk2.AppendFrame(input); - } - - if (!copy) - { - old.Truncate(0); // Trying to minimize ram usage - } - - bk2.HeaderEntries.Clear(); - foreach (var kvp in old.HeaderEntries) - { - bk2.HeaderEntries[kvp.Key] = kvp.Value; - } - - bk2.SyncSettingsJson = old.SyncSettingsJson; - - bk2.Comments.Clear(); - foreach (var comment in old.Comments) - { - bk2.Comments.Add(comment); - } - - bk2.Subtitles.Clear(); - foreach (var sub in old.Subtitles) - { - bk2.Subtitles.Add(sub); - } - - bk2.TextSavestate = old.TextSavestate; - bk2.BinarySavestate = old.BinarySavestate; - bk2.SaveRam = old.SaveRam; - - if (!backup) - { - bk2.Save(); - } - - return bk2; - } - - public static TasMovie ConvertToSavestateAnchoredMovie(this TasMovie old, int frame, byte[] savestate) - { - string newFilename = old.Filename + "." + TasMovie.Extension; - - if (File.Exists(newFilename)) - { - int fileNum = 1; - bool fileConflict = true; - while (fileConflict) - { - if (File.Exists(newFilename)) - { - newFilename = old.Filename + " (" + fileNum + ")" + "." + TasMovie.Extension; - fileNum++; - } - else - { - fileConflict = false; - } - } - } - - var tas = new TasMovie(newFilename, true) { BinarySavestate = savestate }; - tas.ClearLagLog(); - - var entries = old.GetLogEntries(); - - tas.CopyLog(entries.Skip(frame)); - tas.CopyVerificationLog(old.VerificationLog); - tas.CopyVerificationLog(entries.Take(frame)); - - // States can't be easily moved over, because they contain the frame number. - // TODO? I'm not sure how this would be done. - tas.TasStateManager.MountWriteAccess(); - old.TasStateManager.ClearStateHistory(); - - // Lag Log - tas.TasLagLog.FromLagLog(old.TasLagLog); - tas.TasLagLog.StartFromFrame(frame); - - tas.HeaderEntries.Clear(); - foreach (var kvp in old.HeaderEntries) - { - tas.HeaderEntries[kvp.Key] = kvp.Value; - } - - tas.StartsFromSavestate = true; - tas.SyncSettingsJson = old.SyncSettingsJson; - - tas.Comments.Clear(); - foreach (string comment in old.Comments) - { - tas.Comments.Add(comment); - } - - tas.Subtitles.Clear(); - foreach (Subtitle sub in old.Subtitles) - { - tas.Subtitles.Add(sub); - } - - foreach (TasMovieMarker marker in old.Markers) - { - if (marker.Frame > frame) - { - tas.Markers.Add(new TasMovieMarker(marker.Frame - frame, marker.Message)); - } - } - - tas.TasStateManager.Settings = old.TasStateManager.Settings; - - tas.Save(); - return tas; - } - - public static TasMovie ConvertToSaveRamAnchoredMovie(this TasMovie old, byte[] saveRam) - { - string newFilename = old.Filename + "." + TasMovie.Extension; - - if (File.Exists(newFilename)) - { - int fileNum = 1; - bool fileConflict = true; - while (fileConflict) - { - if (File.Exists(newFilename)) - { - newFilename = old.Filename + " (" + fileNum + ")" + "." + TasMovie.Extension; - fileNum++; - } - else - { - fileConflict = false; - } - } - } - - var tas = new TasMovie(newFilename, true) { SaveRam = saveRam }; - tas.TasStateManager.ClearStateHistory(); - tas.ClearLagLog(); - - var entries = old.GetLogEntries(); - - tas.CopyVerificationLog(old.VerificationLog); - tas.CopyVerificationLog(entries); - - tas.HeaderEntries.Clear(); - foreach (var kvp in old.HeaderEntries) - { - tas.HeaderEntries[kvp.Key] = kvp.Value; - } - - tas.StartsFromSaveRam = true; - tas.StartsFromSavestate = false; - tas.SyncSettingsJson = old.SyncSettingsJson; - - tas.Comments.Clear(); - foreach (string comment in old.Comments) - { - tas.Comments.Add(comment); - } - - tas.Subtitles.Clear(); - foreach (Subtitle sub in old.Subtitles) - { - tas.Subtitles.Add(sub); - } - - tas.TasStateManager.Settings = old.TasStateManager.Settings; - - tas.Save(); - return tas; - } - - // TODO: This doesn't really belong here, but not sure where to put it - public static void PopulateWithDefaultHeaderValues(this IMovie movie, string author = null) - { - movie.Author = author ?? Global.Config.DefaultAuthor; - movie.EmulatorVersion = VersionInfo.GetEmuVersion(); - movie.SystemID = Global.Emulator.SystemId; - - var settable = new SettingsAdapter(Global.Emulator); - if (settable.HasSyncSettings) - { - movie.SyncSettingsJson = ConfigService.SaveWithType(settable.GetSyncSettings()); - } - - if (Global.Game != null) - { - movie.GameName = PathManager.FilesystemSafeName(Global.Game); - movie.Hash = Global.Game.Hash; - if (Global.Game.FirmwareHash != null) - { - movie.FirmwareHash = Global.Game.FirmwareHash; - } - } - else - { - movie.GameName = "NULL"; - } - - if (Global.Emulator.HasBoardInfo()) - { - movie.BoardName = Global.Emulator.AsBoardInfo().BoardName; - } - - if (Global.Emulator.HasRegions()) - { - var region = Global.Emulator.AsRegionable().Region; - if (region == Emulation.Common.DisplayType.PAL) - { - movie.HeaderEntries.Add(HeaderKeys.PAL, "1"); - } - } - - if (Global.FirmwareManager.RecentlyServed.Any()) - { - foreach (var firmware in Global.FirmwareManager.RecentlyServed) - { - var key = firmware.SystemId + "_Firmware_" + firmware.FirmwareId; - - if (!movie.HeaderEntries.ContainsKey(key)) - { - movie.HeaderEntries.Add(key, firmware.Hash); - } - } - } - - if (Global.Emulator is Gameboy && (Global.Emulator as Gameboy).IsCGBMode()) - { - movie.HeaderEntries.Add("IsCGBMode", "1"); - } - - if (Global.Emulator is SMS && (Global.Emulator as SMS).IsSG1000) - { - movie.HeaderEntries.Add("IsSGMode", "1"); - } - - if (Global.Emulator is SMS && (Global.Emulator as SMS).IsGameGear) - { - movie.HeaderEntries.Add("IsGGMode", "1"); - } - - if (Global.Emulator is GPGX && (Global.Emulator as GPGX).IsMegaCD) - { - movie.HeaderEntries.Add("IsSegaCDMode", "1"); - } - - if (Global.Emulator is PicoDrive && Global.Game["32X"]) - { - movie.HeaderEntries.Add("Is32X", "1"); - } - - movie.Core = ((CoreAttribute)Attribute - .GetCustomAttribute(Global.Emulator.GetType(), typeof(CoreAttribute))) - .CoreName; - } - } -} diff --git a/BizHawk.Client.Common/movie/import/Fm2Import.cs b/BizHawk.Client.Common/movie/import/Fm2Import.cs deleted file mode 100644 index 194f7ce244..0000000000 --- a/BizHawk.Client.Common/movie/import/Fm2Import.cs +++ /dev/null @@ -1,195 +0,0 @@ -using System; - -using BizHawk.Common; -using BizHawk.Common.BufferExtensions; - -namespace BizHawk.Client.Common -{ - [ImportExtension(".fm2")] - public class Fm2Import : MovieImporter - { - protected override void RunImport() - { - var emulator = "FCEUX"; - var platform = "NES"; // TODO: FDS? - - Result.Movie.HeaderEntries[HeaderKeys.PLATFORM] = platform; - - using (var sr = SourceFile.OpenText()) - { - string line; - int lineNum = 0; - - while ((line = sr.ReadLine()) != null) - { - lineNum++; - - if (line == "") - { - continue; - } - - if (line[0] == '|') - { - // TODO: import a frame of input - // TODO: report any errors importing this frame and bail out if so - } - else if (line.ToLower().StartsWith("sub")) - { - var subtitle = ImportTextSubtitle(line); - - if (!string.IsNullOrEmpty(subtitle)) - { - Result.Movie.Subtitles.AddFromString(subtitle); - } - } - else if (line.ToLower().StartsWith("emuversion")) - { - Result.Movie.Comments.Add($"{Emulationorigin} {emulator} version {ParseHeader(line, "emuVersion")}"); - } - else if (line.ToLower().StartsWith("version")) - { - string version = ParseHeader(line, "version"); - - if (version != "3") - { - Result.Warnings.Add("Detected a .fm2 movie version other than 3, which is unsupported"); - } - else - { - Result.Movie.Comments.Add(Movieorigin + " .fm2 version 3"); - } - } - else if (line.ToLower().StartsWith("romfilename")) - { - Result.Movie.HeaderEntries[HeaderKeys.GAMENAME] = ParseHeader(line, "romFilename"); - } - else if (line.ToLower().StartsWith("cdgamename")) - { - Result.Movie.HeaderEntries[HeaderKeys.GAMENAME] = ParseHeader(line, "cdGameName"); - } - else if (line.ToLower().StartsWith("romchecksum")) - { - string blob = ParseHeader(line, "romChecksum"); - byte[] md5 = DecodeBlob(blob); - if (md5 != null && md5.Length == 16) - { - Result.Movie.HeaderEntries[MD5] = md5.BytesToHexString().ToLower(); - } - else - { - Result.Warnings.Add("Bad ROM checksum."); - } - } - else if (line.ToLower().StartsWith("comment author")) - { - Result.Movie.HeaderEntries[HeaderKeys.AUTHOR] = ParseHeader(line, "comment author"); - } - else if (line.ToLower().StartsWith("rerecordcount")) - { - int rerecordCount = 0; - int.TryParse(ParseHeader(line, "rerecordCount"), out rerecordCount); - - Result.Movie.Rerecords = (ulong)rerecordCount; - } - else if (line.ToLower().StartsWith("guid")) - { - continue; // We no longer care to keep this info - } - else if (line.ToLower().StartsWith("startsfromsavestate")) - { - // If this movie starts from a savestate, we can't support it. - if (ParseHeader(line, "StartsFromSavestate") == "1") - { - Result.Errors.Add("Movies that begin with a savestate are not supported."); - break; - } - } - else if (line.ToLower().StartsWith("palflag")) - { - Result.Movie.HeaderEntries[HeaderKeys.PAL] = ParseHeader(line, "palFlag"); - } - else if (line.ToLower().StartsWith("fourscore")) - { - bool fourscore = ParseHeader(line, "fourscore") == "1"; - if (fourscore) - { - // TODO: set controller config sync settings - } - } - else - { - Result.Movie.Comments.Add(line); // Everything not explicitly defined is treated as a comment. - } - } - } - } - - private static string ImportTextSubtitle(string line) - { - line = SingleSpaces(line); - - // The header name, frame, and message are separated by whitespace. - int first = line.IndexOf(' '); - int second = line.IndexOf(' ', first + 1); - if (first != -1 && second != -1) - { - // Concatenate the frame and message with default values for the additional fields. - string frame = line.Substring(0, first); - string length = line.Substring(first + 1, second - first - 1); - string message = line.Substring(second + 1).Trim(); - - return "subtitle " + frame + " 0 0 " + length + " FFFFFFFF " + message; - } - - return null; - } - - // Reduce all whitespace to single spaces. - private static string SingleSpaces(string line) - { - line = line.Replace("\t", " "); - line = line.Replace("\n", " "); - line = line.Replace("\r", " "); - line = line.Replace("\r\n", " "); - string prev; - do - { - prev = line; - line = line.Replace(" ", " "); - } - while (prev != line); - return line; - } - - // Decode a blob used in FM2 (base64:..., 0x123456...) - private static byte[] DecodeBlob(string blob) - { - if (blob.Length < 2) - { - return null; - } - - if (blob[0] == '0' && (blob[1] == 'x' || blob[1] == 'X')) - { - // hex - return Util.HexStringToBytes(blob.Substring(2)); - } - - // base64 - if (!blob.ToLower().StartsWith("base64:")) - { - return null; - } - - try - { - return Convert.FromBase64String(blob.Substring(7)); - } - catch (FormatException) - { - return null; - } - } - } -} diff --git a/BizHawk.Client.Common/movie/import/IMovieImport.cs b/BizHawk.Client.Common/movie/import/IMovieImport.cs deleted file mode 100644 index 255b0e6477..0000000000 --- a/BizHawk.Client.Common/movie/import/IMovieImport.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace BizHawk.Client.Common -{ - public interface IMovieImport - { - ImportResult Import(string path); - } - - public abstract class MovieImporter : IMovieImport - { - public const string Comment = "comment"; - public const string Coreorigin = "CoreOrigin"; - public const string CRC16 = "CRC16"; - public const string CRC32 = "CRC32"; - protected const string Emulationorigin = "emuOrigin"; - public const string Gamecode = "GameCode"; - public const string InternalChecksum = "InternalChecksum"; - public const string Japan = "Japan"; - protected const string MD5 = "MD5"; - protected const string Movieorigin = "MovieOrigin"; - public const string Port1 = "port1"; - public const string Port2 = "port2"; - public const string ProjectId = "ProjectID"; - public const string SHA256 = "SHA256"; - public const string SuperGameboyMode = "SuperGameBoyMode"; - public const string StartSecond = "StartSecond"; - public const string StartSubSecond = "StartSubSecond"; - public const string SyncHack = "SyncHack"; - public const string UnitCode = "UnitCode"; - - public ImportResult Import(string path) - { - SourceFile = new FileInfo(path); - - if (!SourceFile.Exists) - { - Result.Errors.Add($"Could not find the file {path}"); - return Result; - } - - var newFileName = SourceFile.FullName + "." + Bk2Movie.Extension; - Result.Movie = new Bk2Movie(newFileName); - - RunImport(); - - return Result; - } - - protected ImportResult Result { get; } = new ImportResult(); - - protected FileInfo SourceFile { get; private set; } - - protected abstract void RunImport(); - - // Get the content for a particular header. - protected static string ParseHeader(string line, string headerName) - { - // Case-insensitive search. - int x = line.ToLower().LastIndexOf( - headerName.ToLower()) + headerName.Length; - string str = line.Substring(x + 1, line.Length - x - 1); - return str.Trim(); - } - } - - public class ImportResult - { - public ImportResult() - { - Warnings = new List(); - Errors = new List(); - } - - public IList Warnings { get; private set; } - public IList Errors { get; } - - public Bk2Movie Movie { get; set; } - } - - [AttributeUsage(AttributeTargets.Class)] - public class ImportExtensionAttribute : Attribute - { - public ImportExtensionAttribute(string extension) - { - Extension = extension; - } - - public string Extension { get; private set; } - } -} diff --git a/BizHawk.Client.Common/movie/import/MovieImport.cs b/BizHawk.Client.Common/movie/import/MovieImport.cs deleted file mode 100644 index 9110615a37..0000000000 --- a/BizHawk.Client.Common/movie/import/MovieImport.cs +++ /dev/null @@ -1,3210 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -using BizHawk.Common; -using BizHawk.Common.BufferExtensions; -using BizHawk.Common.IOExtensions; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common.MovieConversionExtensions; - -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; - -namespace BizHawk.Client.Common -{ - public static class MovieImport - { - // Movies 2.0 TODO: this is Movie.cs specific, can it be IMovie based? If not, needs to be refactored to a hardcoded 2.0 implementation, client needs to know what kind of type it imported to, or the mainform method needs to be moved here - private const string COMMENT = "comment"; - private const string COREORIGIN = "CoreOrigin"; - private const string CRC16 = "CRC16"; - private const string CRC32 = "CRC32"; - private const string EMULATIONORIGIN = "emuOrigin"; - private const string GAMECODE = "GameCode"; - private const string INTERNALCHECKSUM = "InternalChecksum"; - private const string JAPAN = "Japan"; - private const string MD5 = "MD5"; - private const string MOVIEORIGIN = "MovieOrigin"; - private const string PORT1 = "port1"; - private const string PORT2 = "port2"; - private const string PROJECTID = "ProjectID"; - private const string SHA256 = "SHA256"; - private const string SUPERGAMEBOYMODE = "SuperGameBoyMode"; - private const string STARTSECOND = "StartSecond"; - private const string STARTSUBSECOND = "StartSubSecond"; - private const string SYNCHACK = "SyncHack"; - private const string UNITCODE = "UnitCode"; - - public static void ProcessMovieImport(string fn, Action conversionErrorCallback, Action messageCallback) - { - var d = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null); - string errorMsg; - string warningMsg; - var m = ImportFile(fn, out errorMsg, out warningMsg); - - if (!string.IsNullOrWhiteSpace(errorMsg)) - { - conversionErrorCallback(errorMsg); - } - - if (!string.IsNullOrWhiteSpace(warningMsg)) - { - messageCallback(warningMsg); - } - else - { - messageCallback(Path.GetFileName(fn) + " imported as " + m.Filename); - } - - if (!Directory.Exists(d)) - { - Directory.CreateDirectory(d); - } - } - - // Attempt to import another type of movie file into a movie object. - public static Bk2Movie ImportFile(string path, out string errorMsg, out string warningMsg) - { - errorMsg = ""; - warningMsg = ""; - string ext = path != null ? Path.GetExtension(path).ToUpper() : ""; - - if (UsesLegacyImporter(ext)) - { - return LegacyImportFile(ext, path, out errorMsg, out warningMsg).ToBk2(); - } - - var importers = ImportersForExtension(ext); - var importerType = importers.FirstOrDefault(); - - if (importerType == default(Type)) - { - errorMsg = "No importer found for file type " + ext; - return null; - } - - // Create a new instance of the importer class using the no-argument constructor - IMovieImport importer = importerType.GetConstructor(new Type[] { }) - .Invoke(new object[] { }) as IMovieImport; - - Bk2Movie movie = null; - - try - { - var result = importer.Import(path); - if (result.Errors.Count > 0) - { - errorMsg = result.Errors.First(); - } - - if (result.Warnings.Count > 0) - { - warningMsg = result.Warnings.First(); - } - - movie = result.Movie; - } - catch (Exception ex) - { - errorMsg = ex.ToString(); - } - - return movie; - } - - private static IEnumerable ImportersForExtension(string ext) - { - var info = typeof(MovieImport).Module; - var importers = from t in info.GetTypes() - where typeof(IMovieImport).IsAssignableFrom(t) - && TypeImportsExtension(t, ext) - select t; - - return importers; - } - - private static bool TypeImportsExtension(Type t, string ext) - { - var attrs = (ImportExtensionAttribute[])t.GetCustomAttributes(typeof(ImportExtensionAttribute), inherit: false); - - if (attrs.Any(a => a.Extension.ToUpper() == ext.ToUpper())) - { - return true; - } - - return false; - } - - private static BkmMovie LegacyImportFile(string ext, string path, out string errorMsg, out string warningMsg) - { - errorMsg = ""; - warningMsg = ""; - - BkmMovie m = new BkmMovie(); - - try - { - switch (ext) - { - case ".FCM": - m = ImportFcm(path, out errorMsg, out warningMsg); - break; - case ".FM2": - m = ImportFm2(path, out errorMsg, out warningMsg); - break; - case ".FMV": - m = ImportFmv(path, out errorMsg, out warningMsg); - break; - case ".GMV": - m = ImportGmv(path, out errorMsg, out warningMsg); - break; - case ".LSMV": - m = ImportLsmv(path, out errorMsg, out warningMsg); - break; - case ".MCM": - m = ImportMcm(path, out errorMsg, out warningMsg); - break; - case ".MC2": - m = ImportMc2(path, out errorMsg, out warningMsg); - break; - case ".MMV": - m = ImportMmv(path, out errorMsg, out warningMsg); - break; - case ".NMV": - m = ImportNmv(path, out errorMsg, out warningMsg); - break; - case ".SMV": - m = ImportSmv(path, out errorMsg, out warningMsg); - break; - case ".VBM": - m = ImportVbm(path, out errorMsg, out warningMsg); - break; - case ".VMV": - m = ImportVmv(path, out errorMsg, out warningMsg); - break; - case ".YMV": - m = ImportYmv(path, out errorMsg, out warningMsg); - break; - case ".ZMV": - m = ImportZmv(path, out errorMsg, out warningMsg); - break; - case ".BKM": - m.Filename = path; - m.Load(false); - break; - } - } - catch (Exception except) - { - errorMsg = except.ToString(); - } - - if (m != null) - { - m.Filename += "." + BkmMovie.Extension; - } - else - { - throw new Exception(errorMsg); - } - - return m; - } - - // Return whether or not the type of file provided can currently be imported. - public static bool IsValidMovieExtension(string extension) - { - // TODO: Other movie formats that don't use a legacy importer (PJM/PXM, etc), - // when those are implemented - return UsesLegacyImporter(extension); - } - - // Return whether or not the type of file provided is currently imported by a legacy (i.e. to BKM not BK2) importer - public static bool UsesLegacyImporter(string extension) - { - string[] extensions = - { - "BKM", "FCM", "FM2", "FMV", "GMV", "MCM", "MC2", "MMV", "NMV", "LSMV", "SMV", "VBM", "VMV", "YMV", "ZMV" - }; - return extensions.Any(ext => extension.ToUpper() == "." + ext); - } - - // Reduce all whitespace to single spaces. - private static string SingleSpaces(string line) - { - line = line.Replace("\t", " "); - line = line.Replace("\n", " "); - line = line.Replace("\r", " "); - line = line.Replace("\r\n", " "); - string prev; - do - { - prev = line; - line = line.Replace(" ", " "); - } - while (prev != line); - return line; - } - - private static IController EmptyLmsvFrame(string line) - { - var emptyController = new SimpleController { Definition = new ControllerDefinition { Name = "SNES Controller" } }; - emptyController["Reset"] = false; - emptyController["Power"] = false; - - string[] buttons = { "B", "Y", "Select", "Start", "Up", "Down", "Left", "Right", "A", "X", "L", "R" }; - string[] sections = line.Split('|'); - for (int section = 2; section < sections.Length - 1; section++) - { - int player = section - 1; // We start with 1 - string prefix = "P" + player + " "; // "P1" - - for (int button = 0; button < buttons.Length; button++) - { - emptyController[prefix + buttons[button]] = false; - } - } - - return emptyController; - } - - // Import a frame from a text-based format. - private static BkmMovie ImportTextFrame(string line, int lineNum, BkmMovie m, string path, string platform, ref string warningMsg) - { - string[] buttons = { }; - var controller = ""; - var ext = path != null ? Path.GetExtension(path).ToUpper() : ""; - switch (ext) - { - case ".FM2": - buttons = new[] { "Right", "Left", "Down", "Up", "Start", "Select", "B", "A" }; - controller = "NES Controller"; - break; - case ".MC2": - buttons = new[] { "Up", "Down", "Left", "Right", "B1", "B2", "Run", "Select" }; - controller = "PC Engine Controller"; - break; - case ".LSMV": - buttons = new[] - { - "B", "Y", "Select", "Start", "Up", "Down", "Left", "Right", "A", "X", "L", "R" - }; - controller = "SNES Controller"; - if (platform == "GB" || platform == "GBC") - { - buttons = new[] { "A", "B", "Select", "Start", "Right", "Left", "Up", "Down" }; - controller = "Gameboy Controller"; - } - - break; - case ".YMV": - buttons = new[] { "Left", "Right", "Up", "Down", "Start", "A", "B", "C", "X", "Y", "Z", "L", "R" }; - controller = "Saturn Controller"; - break; - } - - var controllers = new SimpleController { Definition = new ControllerDefinition { Name = controller } }; - - // Split up the sections of the frame. - string[] sections = line.Split('|'); - if (ext == ".FM2" && sections.Length >= 2 && sections[1].Length != 0) - { - controllers["Reset"] = sections[1][0] == '1'; - - // Get the first invalid command warning message that arises. - if (string.IsNullOrEmpty(warningMsg)) - { - switch (sections[1][0]) - { - case '0': - break; - case '1': - break; - case '2': - if ((int)m.FrameCount != 0) - { - warningMsg = "hard reset"; - } - - break; - case '4': - warningMsg = "FDS Insert"; - break; - case '8': - warningMsg = "FDS Select Side"; - break; - default: - warningMsg = "unknown"; - break; - } - - if (warningMsg != "") - { - warningMsg = "Unable to import " + warningMsg + " command on line " + lineNum + "."; - } - } - } - - if (ext == ".LSMV" && sections.Length != 0) - { - string flags = sections[0]; - char[] off = { '.', ' ', '\t', '\n', '\r' }; - if (flags.Length == 0 || off.Contains(flags[0])) - { - if (warningMsg == "") - { - warningMsg = "Unable to import subframe."; - } - - return m; - } - - bool reset = flags.Length >= 2 && !off.Contains(flags[1]); - flags = SingleSpaces(flags.Substring(2)); - if (reset && ((flags.Length >= 2 && flags[1] != '0') || (flags.Length >= 4 && flags[3] != '0'))) - { - if (warningMsg == "") - { - warningMsg = "Unable to import delayed reset."; - } - - return m; - } - - controllers["Reset"] = reset; - } - - /* - Skip the first two sections of the split, which consist of everything before the starting | and the command. - Do not use the section after the last |. In other words, get the sections for the players. - */ - int start = 2; - int end = sections.Length - 1; - int playerOffset = -1; - if (ext == ".LSMV") - { - // LSNES frames don't start or end with a |. - start--; - end++; - playerOffset++; - } - - for (int section = start; section < end; section++) - { - // The player number is one less than the section number for the reasons explained above. - int player = section + playerOffset; - string prefix = "P" + player + " "; - - // Gameboy doesn't currently have a prefix saying which player the input is for. - if (controllers.Definition.Name == "Gameboy Controller") - { - prefix = ""; - } - - // Only count lines with that have the right number of buttons and are for valid players. - if ( - sections[section].Length == buttons.Length && - player <= BkmMnemonicConstants.Players[controllers.Definition.Name]) - { - for (int button = 0; button < buttons.Length; button++) - { - // Consider the button pressed so long as its spot is not occupied by a ".". - controllers[prefix + buttons[button]] = sections[section][button] != '.'; - } - } - } - - // Convert the data for the controllers to a mnemonic and add it as a frame. - m.AppendFrame(controllers); - return m; - } - - // Import a subtitle from a text-based format. - private static BkmMovie ImportTextSubtitle(string line, BkmMovie m, string path) - { - line = SingleSpaces(line); - - // The header name, frame, and message are separated by whitespace. - int first = line.IndexOf(' '); - int second = line.IndexOf(' ', first + 1); - if (first != -1 && second != -1) - { - // Concatenate the frame and message with default values for the additional fields. - string frame; - string length; - string ext = path != null ? Path.GetExtension(path).ToUpper() : ""; - - if (ext != ".LSMV") - { - frame = line.Substring(first + 1, second - first - 1); - length = "200"; - } - else - { - frame = line.Substring(0, first); - length = line.Substring(first + 1, second - first - 1); - } - - string message = line.Substring(second + 1).Trim(); - m.Subtitles.AddFromString("subtitle " + frame + " 0 0 " + length + " FFFFFFFF " + message); - } - - return m; - } - - // Import a text-based movie format. This works for .FM2, .MC2, and .YMV. - private static BkmMovie ImportText(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - var m = new BkmMovie(path); - var file = new FileInfo(path); - var sr = file.OpenText(); - var emulator = ""; - var platform = ""; - switch (Path.GetExtension(path).ToUpper()) - { - case ".FM2": - emulator = "FCEUX"; - platform = "NES"; - break; - case ".MC2": - emulator = "Mednafen/PCEjin"; - platform = "PCE"; - break; - case ".YMV": - emulator = "Yabause"; - platform = "Sega Saturn"; - break; - } - - m.Header[HeaderKeys.PLATFORM] = platform; - int lineNum = 0; - string line; - while ((line = sr.ReadLine()) != null) - { - lineNum++; - if (line == "") - { - continue; - } - - if (line[0] == '|') - { - m = ImportTextFrame(line, lineNum, m, path, platform, ref warningMsg); - if (errorMsg != "") - { - sr.Close(); - return null; - } - } - else if (line.ToLower().StartsWith("sub")) - { - m = ImportTextSubtitle(line, m, path); - } - else if (line.ToLower().StartsWith("emuversion")) - { - m.Comments.Add( - EMULATIONORIGIN + " " + emulator + " version " + ParseHeader(line, "emuVersion")); - } - else if (line.ToLower().StartsWith("version")) - { - string version = ParseHeader(line, "version"); - m.Comments.Add( - MOVIEORIGIN + " " + Path.GetExtension(path) + " version " + version); - if (Path.GetExtension(path).ToUpper() == ".FM2" && version != "3") - { - errorMsg = ".FM2 movie version must always be 3."; - sr.Close(); - return null; - } - } - else if (line.ToLower().StartsWith("romfilename")) - { - m.Header[HeaderKeys.GAMENAME] = ParseHeader(line, "romFilename"); - } - else if (line.ToLower().StartsWith("cdgamename")) - { - m.Header[HeaderKeys.GAMENAME] = ParseHeader(line, "cdGameName"); - } - else if (line.ToLower().StartsWith("romchecksum")) - { - string blob = ParseHeader(line, "romChecksum"); - byte[] md5 = DecodeBlob(blob); - if (md5 != null && md5.Length == 16) - { - m.Header[MD5] = md5.BytesToHexString().ToLower(); - } - else - { - warningMsg = "Bad ROM checksum."; - } - } - else if (line.ToLower().StartsWith("comment author")) - { - m.Header[HeaderKeys.AUTHOR] = ParseHeader(line, "comment author"); - } - else if (line.ToLower().StartsWith("rerecordcount")) - { - int rerecordCount; - - // Try to parse the re-record count as an integer, defaulting to 0 if it fails. - try - { - rerecordCount = int.Parse(ParseHeader(line, "rerecordCount")); - } - catch - { - rerecordCount = 0; - } - - m.Rerecords = (ulong)rerecordCount; - } - else if (line.ToLower().StartsWith("guid")) - { - continue; // We no longer care to keep this info - } - else if (line.ToLower().StartsWith("startsfromsavestate")) - { - // If this movie starts from a savestate, we can't support it. - if (ParseHeader(line, "StartsFromSavestate") == "1") - { - errorMsg = "Movies that begin with a savestate are not supported."; - sr.Close(); - return null; - } - } - else if (line.ToLower().StartsWith("palflag")) - { - bool pal = ParseHeader(line, "palFlag") == "1"; - m.Header[HeaderKeys.PAL] = pal.ToString(); - } - else if (line.ToLower().StartsWith("ispal")) - { - bool pal = ParseHeader(line, "isPal") == "1"; - m.Header[HeaderKeys.PAL] = pal.ToString(); - } - else if (line.ToLower().StartsWith("fourscore")) - { - bool fourscore = ParseHeader(line, "fourscore") == "1"; - m.Header[HeaderKeys.FOURSCORE] = fourscore.ToString(); - } - else - { - // Everything not explicitly defined is treated as a comment. - m.Comments.Add(line); - } - } - - sr.Close(); - return m; - } - - // Get the content for a particular header. - private static string ParseHeader(string line, string headerName) - { - // Case-insensitive search. - int x = line.ToLower().LastIndexOf( - headerName.ToLower()) + headerName.Length; - string str = line.Substring(x + 1, line.Length - x - 1); - return str.Trim(); - } - - // Decode a blob used in FM2 (base64:..., 0x123456...) - private static byte[] DecodeBlob(string blob) - { - if (blob.Length < 2) - { - return null; - } - - if (blob[0] == '0' && (blob[1] == 'x' || blob[1] == 'X')) - { - // hex - return Util.HexStringToBytes(blob.Substring(2)); - } - - // base64 - if (!blob.ToLower().StartsWith("base64:")) - { - return null; - } - - try - { - return Convert.FromBase64String(blob.Substring(7)); - } - catch (FormatException) - { - return null; - } - } - - // Ends the string where a NULL character is found. - private static string NullTerminated(string str) - { - int pos = str.IndexOf('\0'); - if (pos != -1) - { - str = str.Substring(0, pos); - } - - return str; - } - - // FCM file format: http://code.google.com/p/fceu/wiki/FCM - private static BkmMovie ImportFcm(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 4-byte signature: 46 43 4D 1A "FCM\x1A" - string signature = r.ReadStringFixedAscii(4); - if (signature != "FCM\x1A") - { - errorMsg = "This is not a valid .FCM file."; - r.Close(); - fs.Close(); - return null; - } - - // 004 4-byte little-endian unsigned int: version number, must be 2 - uint version = r.ReadUInt32(); - if (version != 2) - { - errorMsg = ".FCM movie version must always be 2."; - r.Close(); - fs.Close(); - return null; - } - - m.Comments.Add(MOVIEORIGIN + " .FCM version " + version); - - // 008 1-byte flags - byte flags = r.ReadByte(); - - /* - * bit 0: reserved, set to 0 - * bit 1: - * if "0", movie begins from an embedded "quicksave" snapshot - * if "1", movie begins from reset or power-on[1] - */ - if (((flags >> 1) & 0x1) == 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - /* - bit 2: - * if "0", NTSC timing - * if "1", "PAL" timing - Starting with version 0.98.12 released on September 19, 2004, a "PAL" flag was added to the header but - unfortunately it is not reliable - the emulator does not take the "PAL" setting from the ROM, but from a user - preference. This means that this site cannot calculate movie lengths reliably. - */ - bool pal = ((flags >> 2) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // other: reserved, set to 0 - bool syncHack = ((flags >> 4) & 0x1) != 0; - m.Comments.Add(SYNCHACK + " " + syncHack); - - // 009 1-byte flags: reserved, set to 0 - r.ReadByte(); - - // 00A 1-byte flags: reserved, set to 0 - r.ReadByte(); - - // 00B 1-byte flags: reserved, set to 0 - r.ReadByte(); - - // 00C 4-byte little-endian unsigned int: number of frames - uint frameCount = r.ReadUInt32(); - - // 010 4-byte little-endian unsigned int: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - /* - 018 4-byte little-endian unsigned int: offset to the savestate inside file - The savestate offset is . The savestate offset should be - 4-byte aligned. At the savestate offset there is a savestate file. The savestate exists even if the movie is - reset-based. - */ - r.ReadUInt32(); - - // 01C 4-byte little-endian unsigned int: offset to the controller data inside file - uint firstFrameOffset = r.ReadUInt32(); - - // 020 16-byte md5sum of the ROM used - byte[] md5 = r.ReadBytes(16); - m.Header[MD5] = md5.BytesToHexString().ToLower(); - - // 030 4-byte little-endian unsigned int: version of the emulator used - uint emuVersion = r.ReadUInt32(); - m.Comments.Add(EMULATIONORIGIN + " FCEU " + emuVersion); - - // 034 name of the ROM used - UTF8 encoded nul-terminated string. - List gameBytes = new List(); - while (r.PeekChar() != 0) - { - gameBytes.Add(r.ReadByte()); - } - - // Advance past null byte. - r.ReadByte(); - string gameName = Encoding.UTF8.GetString(gameBytes.ToArray()); - m.Header[HeaderKeys.GAMENAME] = gameName; - - /* - After the header comes "metadata", which is UTF8-coded movie title string. The metadata begins after the ROM - name and ends at the savestate offset. This string is displayed as "Author Info" in the Windows version of the - emulator. - */ - List authorBytes = new List(); - while (r.PeekChar() != 0) - { - authorBytes.Add(r.ReadByte()); - } - - // Advance past null byte. - r.ReadByte(); - string author = Encoding.UTF8.GetString(authorBytes.ToArray()); - m.Header[HeaderKeys.AUTHOR] = author; - - // Advance to first byte of input data. - r.BaseStream.Position = firstFrameOffset; - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = "NES Controller" } }; - string[] buttons = { "A", "B", "Select", "Start", "Up", "Down", "Left", "Right" }; - bool fds = false; - bool fourscore = false; - int frame = 1; - while (frame <= frameCount) - { - byte update = r.ReadByte(); - - // aa: Number of delta bytes to follow - int delta = (update >> 5) & 0x3; - int frames = 0; - - /* - The delta byte(s) indicate the number of emulator frames between this update and the next update. It is - encoded in little-endian format and its size depends on the magnitude of the delta: - Delta of: Number of bytes: - 0 0 - 1-255 1 - 256-65535 2 - 65536-(2^24-1) 3 - */ - for (int b = 0; b < delta; b++) - { - frames += r.ReadByte() * (int)Math.Pow(2, b * 8); - } - - frame += frames; - while (frames > 0) - { - m.AppendFrame(controllers); - if (controllers["Reset"]) - { - controllers["Reset"] = false; - } - - frames--; - } - - if (((update >> 7) & 0x1) != 0) - { - // Control update: 1aabbbbb - bool reset = false; - int command = update & 0x1F; - - // bbbbb: - controllers["Reset"] = command == 1; - if (warningMsg == "") - { - switch (command) - { - case 0: // Do nothing - break; - case 1: // Reset - reset = true; - break; - case 2: // Power cycle - reset = true; - if (frame != 1) - { - warningMsg = "hard reset"; - } - - break; - case 7: // VS System Insert Coin - warningMsg = "VS System Insert Coin"; - break; - case 8: // VS System Dipswitch 0 Toggle - warningMsg = "VS System Dipswitch 0 Toggle"; - break; - case 24: // FDS Insert - fds = true; - warningMsg = "FDS Insert"; - break; - case 25: // FDS Eject - fds = true; - warningMsg = "FDS Eject"; - break; - case 26: // FDS Select Side - fds = true; - warningMsg = "FDS Select Side"; - break; - default: - warningMsg = "unknown"; - break; - } - - if (warningMsg != "") - { - warningMsg = "Unable to import " + warningMsg + " command at frame " + frame + "."; - } - } - - /* - 1 Even if the header says "movie begins from reset", the file still contains a quicksave, and the - quicksave is actually loaded. This flag can't therefore be trusted. To check if the movie actually - begins from reset, one must analyze the controller data and see if the first non-idle command in the - file is a Reset or Power Cycle type control command. - */ - if (!reset && frame == 1) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - } - else - { - /* - Controller update: 0aabbccc - * bb: Gamepad number minus one (?) - */ - int player = ((update >> 3) & 0x3) + 1; - if (player > 2) - { - fourscore = true; - } - - /* - ccc: - * 0 A - * 1 B - * 2 Select - * 3 Start - * 4 Up - * 5 Down - * 6 Left - * 7 Right - */ - int button = update & 0x7; - - /* - The controller update toggles the affected input. Controller update data is emitted to the movie file - only when the state of the controller changes. - */ - controllers["P" + player + " " + buttons[button]] = !controllers["P" + player + " " + buttons[button]]; - } - } - - m.Header[HeaderKeys.PLATFORM] = "NES"; - if (fds) - { - m.Header[HeaderKeys.BOARDNAME] = "FDS"; - } - - m.Header[HeaderKeys.FOURSCORE] = fourscore.ToString(); - r.Close(); - fs.Close(); - return m; - } - - // FM2 file format: http://www.fceux.com/web/FM2.html - private static BkmMovie ImportFm2(string path, out string errorMsg, out string warningMsg) - { - return ImportText(path, out errorMsg, out warningMsg); - } - - // FMV file format: http://tasvideos.org/FMV.html - private static BkmMovie ImportFmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 4-byte signature: 46 4D 56 1A "FMV\x1A" - string signature = r.ReadStringFixedAscii(4); - if (signature != "FMV\x1A") - { - errorMsg = "This is not a valid .FMV file."; - r.Close(); - fs.Close(); - return null; - } - - // 004 1-byte flags: - byte flags = r.ReadByte(); - - // bit 7: 0=reset-based, 1=savestate-based - if (((flags >> 2) & 0x1) != 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // other bits: unknown, set to 0 - // 005 1-byte flags: - flags = r.ReadByte(); - - // bit 5: is a FDS recording - bool fds; - if (((flags >> 5) & 0x1) != 0) - { - fds = true; - m.Header[HeaderKeys.BOARDNAME] = "FDS"; - } - else - { - fds = false; - } - - m.Header[HeaderKeys.PLATFORM] = "NES"; - - // bit 6: uses controller 2 - bool controller2 = ((flags >> 6) & 0x1) != 0; - - // bit 7: uses controller 1 - bool controller1 = ((flags >> 7) & 0x1) != 0; - - // other bits: unknown, set to 0 - // 006 4-byte little-endian unsigned int: unknown, set to 00000000 - r.ReadInt32(); - - // 00A 4-byte little-endian unsigned int: rerecord count minus 1 - uint rerecordCount = r.ReadUInt32(); - - /* - The rerecord count stored in the file is the number of times a savestate was loaded. If a savestate was never - loaded, the number is 0. Famtasia however displays "1" in such case. It always adds 1 to the number found in - the file. - */ - m.Rerecords = rerecordCount + 1; - - // 00E 2-byte little-endian unsigned int: unknown, set to 0000 - r.ReadInt16(); - - // 010 64-byte zero-terminated emulator identifier string - string emuVersion = NullTerminated(r.ReadStringFixedAscii(64)); - m.Comments.Add(EMULATIONORIGIN + " Famtasia version " + emuVersion); - m.Comments.Add(MOVIEORIGIN + " .FMV"); - - // 050 64-byte zero-terminated movie title string - string description = NullTerminated(r.ReadStringFixedAscii(64)); - m.Comments.Add(COMMENT + " " + description); - if (!controller1 && !controller2 && !fds) - { - warningMsg = "No input recorded."; - r.Close(); - fs.Close(); - return m; - } - - /* - The file format has no means of identifying NTSC/"PAL". It is always assumed that the game is NTSC - that is, - 60 fps. - */ - m.Header[HeaderKeys.PAL] = "False"; - - // 090 frame data begins here - var controllers = new SimpleController { Definition = new ControllerDefinition { Name = "NES Controller" } }; - - /* - * 01 Right - * 02 Left - * 04 Up - * 08 Down - * 10 B - * 20 A - * 40 Select - * 80 Start - */ - string[] buttons = { "Right", "Left", "Up", "Down", "B", "A", "Select", "Start" }; - bool[] masks = { controller1, controller2, fds }; - /* - The file has no terminator byte or frame count. The number of frames is the divided by - . - */ - int bytesPerFrame = 0; - for (int player = 1; player <= masks.Length; player++) - { - if (masks[player - 1]) - { - bytesPerFrame++; - } - } - - long frameCount = (fs.Length - 144) / bytesPerFrame; - for (long frame = 1; frame <= frameCount; frame++) - { - /* - Each frame consists of 1 or more bytes. Controller 1 takes 1 byte, controller 2 takes 1 byte, and the FDS - data takes 1 byte. If all three exist, the frame is 3 bytes. For example, if the movie is a regular NES game - with only controller 1 data, a frame is 1 byte. - */ - for (int player = 1; player <= masks.Length; player++) - { - if (!masks[player - 1]) - { - continue; - } - - byte controllerState = r.ReadByte(); - if (player != 3) - { - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - } - } - else - { - warningMsg = "FDS commands are not properly supported."; - } - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - // GMV file format: http://code.google.com/p/gens-rerecording/wiki/GMV - private static BkmMovie ImportGmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - var m = new BkmMovie(path); - var fs = new FileStream(path, FileMode.Open, FileAccess.Read); - var r = new BinaryReader(fs); - - // 000 16-byte signature and format version: "Gens Movie TEST9" - string signature = r.ReadStringFixedAscii(15); - if (signature != "Gens Movie TEST") - { - errorMsg = "This is not a valid .GMV file."; - r.Close(); - fs.Close(); - return null; - } - - m.Header[HeaderKeys.PLATFORM] = "GEN"; - - // 00F ASCII-encoded GMV file format version. The most recent is 'A'. (?) - string version = r.ReadStringFixedAscii(1); - m.Comments.Add(MOVIEORIGIN + " .GMV version " + version); - m.Comments.Add(EMULATIONORIGIN + " Gens"); - - // 010 4-byte little-endian unsigned int: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - // 014 ASCII-encoded controller config for player 1. '3' or '6'. - string player1Config = r.ReadStringFixedAscii(1); - - // 015 ASCII-encoded controller config for player 2. '3' or '6'. - string player2Config = r.ReadStringFixedAscii(1); - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition() }; - if (player1Config == "6" || player2Config == "6") - { - controllers.Definition.Name = "GPGX Genesis Controller"; - } - else - { - controllers.Definition.Name = "GPGX 3-Button Controller"; - } - - // 016 special flags (Version A and up only) - byte flags = r.ReadByte(); - - /* - bit 7 (most significant): if "1", movie runs at 50 frames per second; if "0", movie runs at 60 frames per - second The file format has no means of identifying NTSC/"PAL", but the FPS can still be derived from the - header. - */ - bool pal = ((flags >> 7) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // bit 6: if "1", movie requires a savestate. - if (((flags >> 6) & 0x1) != 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // bit 5: if "1", movie is 3-player movie; if "0", movie is 2-player movie - bool threePlayers = ((flags >> 5) & 0x1) != 0; - - // Unknown. - r.ReadByte(); - - // 018 40-byte zero-terminated ASCII movie name string - string description = NullTerminated(r.ReadStringFixedAscii(40)); - m.Comments.Add(COMMENT + " " + description); - - /* - 040 frame data - For controller bytes, each value is determined by OR-ing together values for whichever of the following are - left unpressed: - * 0x01 Up - * 0x02 Down - * 0x04 Left - * 0x08 Right - * 0x10 A - * 0x20 B - * 0x40 C - * 0x80 Start - */ - string[] buttons = { "Up", "Down", "Left", "Right", "A", "B", "C", "Start" }; - /* - For XYZ-mode, each value is determined by OR-ing together values for whichever of the following are left - unpressed: - * 0x01 Controller 1 X - * 0x02 Controller 1 Y - * 0x04 Controller 1 Z - * 0x08 Controller 1 Mode - * 0x10 Controller 2 X - * 0x20 Controller 2 Y - * 0x40 Controller 2 Z - * 0x80 Controller 2 Mode - */ - string[] other = { "X", "Y", "Z", "Mode" }; - - // The file has no terminator byte or frame count. The number of frames is the divided by 3. - long frameCount = (fs.Length - 64) / 3; - for (long frame = 1; frame <= frameCount; frame++) - { - // Each frame consists of 3 bytes. - for (int player = 1; player <= 3; player++) - { - byte controllerState = r.ReadByte(); - - // * is controller 3 if a 3-player movie, or XYZ-mode if a 2-player movie. - if (player != 3 || threePlayers) - { - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = ((controllerState >> button) & 0x1) == 0; - } - } - else - { - for (int button = 0; button < other.Length; button++) - { - if (player1Config == "6") - { - controllers["P1 " + other[button]] = ((controllerState >> button) & 0x1) == 0; - } - - if (player2Config == "6") - { - controllers["P2 " + other[button]] = ((controllerState >> (button + 4)) & 0x1) == 0; - } - } - } - } - - m.AppendFrame(controllers); - } - - return m; - } - - // LSMV file format: http://tasvideos.org/Lsnes/Movieformat.html - private static BkmMovie ImportLsmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - var m = new BkmMovie(path); - var hf = new HawkFile(path); - - // .LSMV movies are .zip files containing data files. - if (!hf.IsArchive) - { - errorMsg = "This is not an archive."; - return null; - } - - string platform = "SNES"; - foreach (var item in hf.ArchiveItems) - { - if (item.Name == "authors") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string authors = Encoding.UTF8.GetString(stream.ReadAllBytes()); - string authorList = ""; - string authorLast = ""; - using (var reader = new StringReader(authors)) - { - string line; - - // Each author is on a different line. - while ((line = reader.ReadLine()) != null) - { - string author = line.Trim(); - if (author != "") - { - if (authorLast != "") - { - authorList += authorLast + ", "; - } - - authorLast = author; - } - } - } - - if (authorList != "") - { - authorList += "and "; - } - - if (authorLast != "") - { - authorList += authorLast; - } - - m.Header[HeaderKeys.AUTHOR] = authorList; - hf.Unbind(); - } - else if (item.Name == "coreversion") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string coreversion = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Comments.Add(COREORIGIN + " " + coreversion); - hf.Unbind(); - } - else if (item.Name == "gamename") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string gamename = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[HeaderKeys.GAMENAME] = gamename; - hf.Unbind(); - } - else if (item.Name == "gametype") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string gametype = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - - // TODO: Handle the other types. - switch (gametype) - { - case "gdmg": - platform = "GB"; - break; - case "ggbc": - case "ggbca": - platform = "GBC"; - break; - case "sgb_ntsc": - case "sgb_pal": - platform = "SNES"; - Global.Config.GB_AsSGB = true; - break; - } - - bool pal = gametype == "snes_pal" || gametype == "sgb_pal"; - m.Header[HeaderKeys.PAL] = pal.ToString(); - hf.Unbind(); - } - else if (item.Name == "input") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string input = Encoding.UTF8.GetString(stream.ReadAllBytes()); - - int lineNum = 0; - using (var reader = new StringReader(input)) - { - lineNum++; - string line; - while ((line = reader.ReadLine()) != null) - { - if (line == "") - { - continue; - } - - // Insert an empty frame in lsmv snes movies - // https://github.com/TASVideos/BizHawk/issues/721 - // Both emulators send the input to bsnes core at the same V interval, but: - // lsnes' frame boundary occurs at V = 241, after which the input is read; - // BizHawk's frame boundary is just before automatic polling; - // This isn't a great place to add this logic but this code is a mess - if (lineNum == 1 && platform == "SNES") - { - // Note that this logic assumes the first non-empty log entry is a valid input log entry - // and that it is NOT a subframe input entry. It seems safe to assume subframe input would not be on the first line - m.AppendFrame(EmptyLmsvFrame(line)); // line is needed to parse pipes and know the controller configuration - } - - m = ImportTextFrame(line, lineNum, m, path, platform, ref warningMsg); - if (errorMsg != "") - { - hf.Unbind(); - return null; - } - } - } - - hf.Unbind(); - } - else if (item.Name.StartsWith("moviesram.")) - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - byte[] moviesram = stream.ReadAllBytes(); - if (moviesram.Length != 0) - { - errorMsg = "Movies that begin with SRAM are not supported."; - hf.Unbind(); - return null; - } - - hf.Unbind(); - } - else if (item.Name == "port1") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string port1 = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[PORT1] = port1; - hf.Unbind(); - } - else if (item.Name == "port2") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string port2 = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[PORT2] = port2; - hf.Unbind(); - } - else if (item.Name == "projectid") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string projectid = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[PROJECTID] = projectid; - hf.Unbind(); - } - else if (item.Name == "rerecords") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string rerecords = Encoding.UTF8.GetString(stream.ReadAllBytes()); - int rerecordCount; - - // Try to parse the re-record count as an integer, defaulting to 0 if it fails. - try - { - rerecordCount = int.Parse(rerecords); - } - catch - { - rerecordCount = 0; - } - - m.Rerecords = (ulong)rerecordCount; - hf.Unbind(); - } - else if (item.Name.EndsWith(".sha256")) - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string rom = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - int pos = item.Name.LastIndexOf(".sha256"); - string name = item.Name.Substring(0, pos); - m.Header[SHA256 + "_" + name] = rom; - hf.Unbind(); - } - else if (item.Name == "savestate") - { - errorMsg = "Movies that begin with a savestate are not supported."; - return null; - } - else if (item.Name == "subtitles") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string subtitles = Encoding.UTF8.GetString(stream.ReadAllBytes()); - using (StringReader reader = new StringReader(subtitles)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - m = ImportTextSubtitle(line, m, path); - } - } - - hf.Unbind(); - } - else if (item.Name == "starttime.second") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string startSecond = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[STARTSECOND] = startSecond; - hf.Unbind(); - } - else if (item.Name == "starttime.subsecond") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string startSubSecond = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Header[STARTSUBSECOND] = startSubSecond; - hf.Unbind(); - } - else if (item.Name == "systemid") - { - hf.BindArchiveMember(item.Index); - var stream = hf.GetStream(); - string systemid = Encoding.UTF8.GetString(stream.ReadAllBytes()).Trim(); - m.Comments.Add(EMULATIONORIGIN + " " + systemid); - hf.Unbind(); - } - } - - m.Header[HeaderKeys.PLATFORM] = platform; - - var ss = new LibsnesCore.SnesSyncSettings(); - m.SyncSettingsJson = ConfigService.SaveWithType(ss); - Global.Config.SNES_InSnes9x = true; // This could be annoying to a user if they don't notice we set this preference, but the alternative is for the movie import to fail to load the movie - - return m; - } - - /* - MCM file format: http://code.google.com/p/mednafen-rr/wiki/MCM - Mednafen-rr switched to MC2 from r261, so see r260 for details. - */ - private static BkmMovie ImportMcm(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 8-byte "MDFNMOVI" signature - var signature = r.ReadStringFixedAscii(8); - if (signature != "MDFNMOVI") - { - errorMsg = "This is not a valid .MCM file."; - r.Close(); - fs.Close(); - return null; - } - - // 008 uint32 Mednafen Version (Current is 0A 08) - uint emuVersion = r.ReadUInt32(); - m.Comments.Add(EMULATIONORIGIN + " Mednafen " + emuVersion); - - // 00C uint32 Movie Format Version (Current is 01) - uint version = r.ReadUInt32(); - m.Comments.Add(MOVIEORIGIN + " .MCM version " + version); - - // 010 32-byte MD5 of the ROM used - byte[] md5 = r.ReadBytes(16); - - // Discard the second 16 bytes. - r.ReadBytes(16); - m.Header[MD5] = md5.BytesToHexString().ToLower(); - - // 030 64-byte Filename of the ROM used (with extension) - string gameName = NullTerminated(r.ReadStringFixedAscii(64)); - m.Header[HeaderKeys.GAMENAME] = gameName; - - // 070 uint32 Re-record Count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - // 074 5-byte Console indicator (pce, ngp, pcfx, wswan) - string platform = NullTerminated(r.ReadStringFixedAscii(5)); - Dictionary> platforms = new Dictionary> - { - // Normally, NES receives from 5 input ports, where the first 4 have a length of 1 byte, and the last has - // a length of 0. For the sake of simplicity, it is interpreted as 4 ports of 1 byte length for - // re-recording. - ["nes"] = new Dictionary - { - ["name"] = "NES", - ["ports"] = 4, - ["bytesPerPort"] = 1, - ["buttons"] = new[] { "A", "B", "Select", "Start", "Up", "Down", "Left", "Right" } - }, - ["pce"] = new Dictionary - { - ["name"] = "PC Engine", - ["ports"] = 5, - ["bytesPerPort"] = 2, - ["buttons"] = new[] { "B1", "B2", "Select", "Run", "Up", "Right", "Down", "Left" } - }, - ["lynx"] = new Dictionary - { - ["name"] = "Lynx", - ["ports"] = 2, - ["bytesPerPort"] = 1, - ["buttons"] = new[] { "A", "B", "Up", "Down", "Left", "Right" } - } - }; - if (!platforms.ContainsKey(platform)) - { - errorMsg = "Platform " + platform + " not supported."; - r.Close(); - fs.Close(); - return null; - } - - string name = (string)platforms[platform]["name"]; - - string systemId = name.ToUpper(); // Hack - - m.Header[HeaderKeys.PLATFORM] = systemId; - - // 079 32-byte Author name - string author = NullTerminated(r.ReadStringFixedAscii(32)); - m.Header[HeaderKeys.AUTHOR] = author; - - // 099 103-byte Padding 0s - r.ReadBytes(103); - - // TODO: Verify if NTSC/"PAL" mode used for the movie can be detected or not. - // 100 variable Input data - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = name + " Controller" } }; - int bytes = 256; - - // The input stream consists of 1 byte for power-on and reset, and then X bytes per each input port per frame. - if (platform == "nes") - { - // Power-on. - r.ReadByte(); - bytes++; - } - - string[] buttons = (string[])platforms[platform]["buttons"]; - int ports = (int)platforms[platform]["ports"]; - int bytesPerPort = (int)platforms[platform]["bytesPerPort"]; - - // Frame Size (with Control Byte) - int size = (ports * bytesPerPort) + 1; - long frameCount = (fs.Length - bytes) / size; - for (int frame = 1; frame <= frameCount; frame++) - { - for (int player = 1; player <= ports; player++) - { - if (bytesPerPort == 2) - { - // Discard the first byte. - r.ReadByte(); - } - - ushort controllerState = r.ReadByte(); - for (int button = 0; button < buttons.Length; button++) - { - string prefix = platform == "lynx" ? "" : "P" + player + " "; // hack - controllers[prefix + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - } - } - - r.ReadByte(); - if (platform == "nes" && warningMsg == "") - { - warningMsg = "Control commands are not properly supported."; - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - // MC2 file format: http://code.google.com/p/pcejin/wiki/MC2 - private static BkmMovie ImportMc2(string path, out string errorMsg, out string warningMsg) - { - return ImportText(path, out errorMsg, out warningMsg); - } - - // MMV file format: http://tasvideos.org/MMV.html - private static BkmMovie ImportMmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 0000: 4-byte signature: "MMV\0" - string signature = r.ReadStringFixedAscii(4); - if (signature != "MMV\0") - { - errorMsg = "This is not a valid .MMV file."; - r.Close(); - fs.Close(); - return null; - } - - // 0004: 4-byte little endian unsigned int: dega version - uint emuVersion = r.ReadUInt32(); - m.Comments.Add(EMULATIONORIGIN + " Dega version " + emuVersion); - m.Comments.Add(MOVIEORIGIN + " .MMV"); - - // 0008: 4-byte little endian unsigned int: frame count - uint frameCount = r.ReadUInt32(); - - // 000c: 4-byte little endian unsigned int: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - // 0010: 4-byte little endian flag: begin from reset? - uint reset = r.ReadUInt32(); - if (reset == 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // 0014: 4-byte little endian unsigned int: offset of state information - r.ReadUInt32(); - - // 0018: 4-byte little endian unsigned int: offset of input data - r.ReadUInt32(); - - // 001c: 4-byte little endian unsigned int: size of input packet - r.ReadUInt32(); - - // 0020-005f: string: author info (UTF-8) - string author = NullTerminated(r.ReadStringFixedAscii(64)); - m.Header[HeaderKeys.AUTHOR] = author; - - // 0060: 4-byte little endian flags - byte flags = r.ReadByte(); - - // bit 0: unused - // bit 1: "PAL" - bool pal = ((flags >> 1) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // bit 2: Japan - bool japan = ((flags >> 2) & 0x1) != 0; - m.Header[JAPAN] = japan.ToString(); - - // bit 3: Game Gear (version 1.16+) - bool gamegear; - if (((flags >> 3) & 0x1) != 0) - { - gamegear = true; - m.Header[HeaderKeys.PLATFORM] = "GG"; - } - else - { - gamegear = false; - m.Header[HeaderKeys.PLATFORM] = "SMS"; - } - - // bits 4-31: unused - r.ReadBytes(3); - - // 0064-00e3: string: rom name (ASCII) - string gameName = NullTerminated(r.ReadStringFixedAscii(128)); - m.Header[HeaderKeys.GAMENAME] = gameName; - - // 00e4-00f3: binary: rom MD5 digest - byte[] md5 = r.ReadBytes(16); - m.Header[MD5] = $"{md5.BytesToHexString().ToLower():x8}"; - var controllers = new SimpleController { Definition = new ControllerDefinition { Name = "SMS Controller" } }; - - /* - 76543210 - * bit 0 (0x01): up - * bit 1 (0x02): down - * bit 2 (0x04): left - * bit 3 (0x08): right - * bit 4 (0x10): 1 - * bit 5 (0x20): 2 - * bit 6 (0x40): start (Master System) - * bit 7 (0x80): start (Game Gear) - */ - string[] buttons = { "Up", "Down", "Left", "Right", "B1", "B2" }; - for (int frame = 1; frame <= frameCount; frame++) - { - /* - Controller data is made up of one input packet per frame. Each packet currently consists of 2 bytes. The - first byte is for controller 1 and the second controller 2. The Game Gear only uses the controller 1 input - however both bytes are still present. - */ - for (int player = 1; player <= 2; player++) - { - byte controllerState = r.ReadByte(); - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - } - - if (player == 1) - { - controllers["Pause"] = - (((controllerState >> 6) & 0x1) != 0 && (!gamegear)) - || (((controllerState >> 7) & 0x1) != 0 && gamegear); - } - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - // NMV file format: http://tasvideos.org/NMV.html - private static BkmMovie ImportNmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - var m = new BkmMovie(path); - var fs = new FileStream(path, FileMode.Open, FileAccess.Read); - var r = new BinaryReader(fs); - - // 000 4-byte signature: 4E 53 53 1A "NSS\x1A" - string signature = r.ReadStringFixedAscii(4); - if (signature != "NSS\x1A") - { - errorMsg = "This is not a valid .NMV file."; - r.Close(); - fs.Close(); - return null; - } - - // 004 4-byte version string (example "0960") - string emuVersion = r.ReadStringFixedAscii(4); - m.Comments.Add(EMULATIONORIGIN + " Nintendulator version " + emuVersion); - m.Comments.Add(MOVIEORIGIN + " .NMV"); - - // 008 4-byte file size, not including the 16-byte header - r.ReadUInt32(); - - /* - 00C 4-byte file type string - * "NSAV" - standard savestate - * "NREC" - savestate saved during movie recording - * "NMOV" - standalone movie file - */ - string type = r.ReadStringFixedAscii(4); - if (type != "NMOV") - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - /* - Individual blocks begin with an 8-byte header, consisting of a 4-byte signature and a 4-byte length (which - does not include the length of the block header). - The final block in the file is of type "NMOV" - */ - string header = r.ReadStringFixedAscii(4); - if (header != "NMOV") - { - errorMsg = "This is not a valid .NMV file."; - r.Close(); - fs.Close(); - return null; - } - - r.ReadUInt32(); - - // 000 1-byte controller #1 type (see below) - byte controller1 = r.ReadByte(); - - // 001 1-byte controller #2 type (or four-score mask, see below) - byte controller2 = r.ReadByte(); - - /* - Controller data is variant, depending on which controllers are attached at the time of recording. The - following controllers are implemented: - * 0 - Unconnected - * 1 - Standard Controller (1 byte) - * 2 - Zapper (3 bytes) - * 3 - Arkanoid Paddle (2 bytes) - * 4 - Power Pad (2 bytes) - * 5 - Four-Score (special) - * 6 - SNES controller (2 bytes) - A/B become B/Y, adds A/X and L/R shoulder buttons - * 7 - Vs Unisystem Zapper (3 bytes) - */ - bool fourscore = controller1 == 5; - m.Header[HeaderKeys.FOURSCORE] = fourscore.ToString(); - bool[] masks = { false, false, false, false, false }; - if (fourscore) - { - /* - When a Four-Score is indicated for Controller #1, the Controller #2 byte becomes a bit mask to indicate - which ports on the Four-Score have controllers connected to them. Each connected controller stores 1 byte - per frame. Nintendulator's Four-Score recording is seemingly broken. - */ - for (int controller = 1; controller < masks.Length; controller++) - { - masks[controller - 1] = ((controller2 >> (controller - 1)) & 0x1) != 0; - } - - warningMsg = "Nintendulator's Four Score recording is seemingly broken."; - } - else - { - byte[] types = { controller1, controller2 }; - for (int controller = 1; controller <= types.Length; controller++) - { - masks[controller - 1] = types[controller - 1] == 1; - - // Get the first unsupported controller warning message that arises. - if (warningMsg == "") - { - switch (types[controller - 1]) - { - case 0: - break; - case 2: - warningMsg = "Zapper"; - break; - case 3: - warningMsg = "Arkanoid Paddle"; - break; - case 4: - warningMsg = "Power Pad"; - break; - case 5: - warningMsg = "A Four Score in the second controller port is invalid."; - continue; - case 6: - warningMsg = "SNES controller"; - break; - case 7: - warningMsg = "Vs Unisystem Zapper"; - break; - } - - if (warningMsg != "") - { - warningMsg = warningMsg + " is not properly supported."; - } - } - } - } - - // 002 1-byte expansion port controller type - byte expansion = r.ReadByte(); - - /* - The expansion port can potentially have an additional controller connected. The following expansion - controllers are implemented: - * 0 - Unconnected - * 1 - Famicom 4-player adapter (2 bytes) - * 2 - Famicom Arkanoid paddle (2 bytes) - * 3 - Family Basic Keyboard (currently does not support demo recording) - * 4 - Alternate keyboard layout (currently does not support demo recording) - * 5 - Family Trainer (2 bytes) - * 6 - Oeka Kids writing tablet (3 bytes) - */ - string[] expansions = - { - "Unconnected", "Famicom 4-player adapter", "Famicom Arkanoid paddle", "Family Basic Keyboard", - "Alternate keyboard layout", "Family Trainer", "Oeka Kids writing tablet" - }; - if (expansion != 0 && warningMsg == "") - { - warningMsg = "Expansion port is not properly supported. This movie uses " + expansions[expansion] + "."; - } - - // 003 1-byte number of bytes per frame, plus flags - byte data = r.ReadByte(); - int bytesPerFrame = data & 0xF; - int bytes = 0; - for (int controller = 1; controller < masks.Length; controller++) - { - if (masks[controller - 1]) - { - bytes++; - } - } - - /* - Depending on the mapper used by the game in question, an additional byte of data may be stored during each - frame. This is most frequently used for FDS games (storing either the disk number or 0xFF to eject) or VS - Unisystem coin/DIP switch toggles (limited to 1 action per frame). This byte exists if the bytes per frame do - not match up with the amount of bytes the controllers take up. - */ - if (bytes != bytesPerFrame) - { - masks[4] = true; - } - - // bit 6: Game Genie active - /* - bit 7: Framerate - * if "0", NTSC timing - * if "1", "PAL" timing - */ - bool pal = ((data >> 7) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // 004 4-byte little-endian unsigned int: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - /* - 008 4-byte little-endian unsigned int: length of movie description - 00C (variable) null-terminated UTF-8 text, movie description (currently not implemented) - */ - string movieDescription = NullTerminated(r.ReadStringFixedAscii((int)r.ReadUInt32())); - m.Comments.Add(COMMENT + " " + movieDescription); - - // ... 4-byte little-endian unsigned int: length of controller data in bytes - uint length = r.ReadUInt32(); - - // ... (variable) controller data - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = "NES Controller" } }; - /* - Standard controllers store data in the following format: - * 01: A - * 02: B - * 04: Select - * 08: Start - * 10: Up - * 20: Down - * 40: Left - * 80: Right - Other controllers store data in their own formats, and are beyond the scope of this document. - */ - string[] buttons = { "A", "B", "Select", "Start", "Up", "Down", "Left", "Right" }; - - // The controller data contains / frames. - long frameCount = length / bytesPerFrame; - for (int frame = 1; frame <= frameCount; frame++) - { - // Controller update data is emitted to the movie file during every frame. - for (int player = 1; player <= masks.Length; player++) - { - if (!masks[player - 1]) - { - continue; - } - - byte controllerState = r.ReadByte(); - if (player != 5) - { - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - } - } - else if (warningMsg == "") - { - warningMsg = "Extra input is not properly supported."; - } - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - private static BkmMovie ImportSmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 4-byte signature: 53 4D 56 1A "SMV\x1A" - string signature = r.ReadStringFixedAscii(4); - if (signature != "SMV\x1A") - { - errorMsg = "This is not a valid .SMV file."; - r.Close(); - fs.Close(); - return null; - } - - m.Header[HeaderKeys.PLATFORM] = "SNES"; - - // 004 4-byte little-endian unsigned int: version number - uint versionNumber = r.ReadUInt32(); - string version; - switch (versionNumber) - { - case 1: - version = "1.43"; - break; - case 4: - version = "1.51"; - break; - case 5: - version = "1.52"; - break; - default: - errorMsg = "SMV version not recognized. 1.43, 1.51, and 1.52 are currently supported."; - r.Close(); - fs.Close(); - return null; - } - - m.Comments.Add(EMULATIONORIGIN + " Snes9x version " + version); - m.Comments.Add(MOVIEORIGIN + " .SMV"); - /* - 008 4-byte little-endian integer: movie "uid" - identifies the movie-savestate relationship, also used as the - recording time in Unix epoch format - */ - uint uid = r.ReadUInt32(); - - // 00C 4-byte little-endian unsigned int: rerecord count - m.Rerecords = r.ReadUInt32(); - - // 010 4-byte little-endian unsigned int: number of frames - uint frameCount = r.ReadUInt32(); - - // 014 1-byte flags "controller mask" - byte controllerFlags = r.ReadByte(); - /* - * bit 0: controller 1 in use - * bit 1: controller 2 in use - * bit 2: controller 3 in use - * bit 3: controller 4 in use - * bit 4: controller 5 in use - * other: reserved, set to 0 - */ - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = "SNES Controller" } }; - bool[] controllersUsed = new bool[5]; - for (int controller = 1; controller <= controllersUsed.Length; controller++) - { - controllersUsed[controller - 1] = ((controllerFlags >> (controller - 1)) & 0x1) != 0; - } - - // 015 1-byte flags "movie options" - byte movieFlags = r.ReadByte(); - /* - bit 0: - if "0", movie begins from an embedded "quicksave" snapshot - if "1", a SRAM is included instead of a quicksave; movie begins from reset - */ - if ((movieFlags & 0x1) == 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // bit 1: if "0", movie is NTSC (60 fps); if "1", movie is PAL (50 fps) - bool pal = ((movieFlags >> 1) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // other: reserved, set to 0 - /* - 016 1-byte flags "sync options": - bit 0: MOVIE_SYNC2_INIT_FASTROM - other: reserved, set to 0 - */ - r.ReadByte(); - /* - 017 1-byte flags "sync options": - bit 0: MOVIE_SYNC_DATA_EXISTS - if "1", all sync options flags are defined. - if "0", all sync options flags have no meaning. - bit 1: MOVIE_SYNC_WIP1TIMING - bit 2: MOVIE_SYNC_LEFTRIGHT - bit 3: MOVIE_SYNC_VOLUMEENVX - bit 4: MOVIE_SYNC_FAKEMUTE - bit 5: MOVIE_SYNC_SYNCSOUND - bit 6: MOVIE_SYNC_HASROMINFO - if "1", there is extra ROM info located right in between of the metadata and the savestate. - bit 7: set to 0. - */ - byte syncFlags = r.ReadByte(); - /* - Extra ROM info is always positioned right before the savestate. Its size is 30 bytes if MOVIE_SYNC_HASROMINFO - is used (and MOVIE_SYNC_DATA_EXISTS is set), 0 bytes otherwise. - */ - int extraRomInfo = (((syncFlags >> 6) & 0x1) != 0 && (syncFlags & 0x1) != 0) ? 30 : 0; - - // 018 4-byte little-endian unsigned int: offset to the savestate inside file - uint savestateOffset = r.ReadUInt32(); - - // 01C 4-byte little-endian unsigned int: offset to the controller data inside file - uint firstFrameOffset = r.ReadUInt32(); - int[] controllerTypes = new int[2]; - - // The (.SMV 1.51 and up) header has an additional 32 bytes at the end - if (version != "1.43") - { - // 020 4-byte little-endian unsigned int: number of input samples, primarily for peripheral-using games - r.ReadBytes(4); - /* - 024 2 1-byte unsigned ints: what type of controller is plugged into ports 1 and 2 respectively: 0=NONE, - 1=JOYPAD, 2=MOUSE, 3=SUPERSCOPE, 4=JUSTIFIER, 5=MULTITAP - */ - controllerTypes[0] = r.ReadByte(); - controllerTypes[1] = r.ReadByte(); - - // 026 4 1-byte signed ints: controller IDs of port 1, or -1 for unplugged - r.ReadBytes(4); - - // 02A 4 1-byte signed ints: controller IDs of port 2, or -1 for unplugged - r.ReadBytes(4); - - // 02E 18 bytes: reserved for future use - r.ReadBytes(18); - } - - /* - After the header comes "metadata", which is UTF16-coded movie title string (author info). The metadata begins - from position 32 (0x20 (0x40 for 1.51 and up)) and ends at . - */ - byte[] metadata = r.ReadBytes((int)(savestateOffset - extraRomInfo - ((version != "1.43") ? 0x40 : 0x20))); - string author = NullTerminated(Encoding.Unicode.GetString(metadata).Trim()); - if (author != "") - { - m.Header[HeaderKeys.AUTHOR] = author; - } - - if (extraRomInfo == 30) - { - // 000 3 bytes of zero padding: 00 00 00 003 4-byte integer: CRC32 of the ROM 007 23-byte ascii string - r.ReadBytes(3); - int crc32 = r.ReadInt32(); - m.Header[CRC32] = crc32.ToString(); - - // the game name copied from the ROM, truncated to 23 bytes (the game name in the ROM is 21 bytes) - string gameName = NullTerminated(Encoding.UTF8.GetString(r.ReadBytes(23))); - m.Header[HeaderKeys.GAMENAME] = gameName; - } - - r.BaseStream.Position = firstFrameOffset; - /* - 01 00 (reserved) - 02 00 (reserved) - 04 00 (reserved) - 08 00 (reserved) - 10 00 R - 20 00 L - 40 00 X - 80 00 A - 00 01 Right - 00 02 Left - 00 04 Down - 00 08 Up - 00 10 Start - 00 20 Select - 00 40 Y - 00 80 B - */ - string[] buttons = - { - "Right", "Left", "Down", "Up", "Start", "Select", "Y", "B", "R", "L", "X", "A" - }; - - for (int frame = 0; frame <= frameCount; frame++) - { - controllers["Reset"] = true; - for (int player = 1; player <= controllersUsed.Length; player++) - { - if (!controllersUsed[player - 1]) - { - continue; - } - - /* - Each frame consists of 2 bytes per controller. So if there are 3 controllers, a frame is 6 bytes and - if there is only 1 controller, a frame is 2 bytes. - */ - byte controllerState1 = r.ReadByte(); - byte controllerState2 = r.ReadByte(); - - /* - In the reset-recording patch, a frame that contains the value FF FF for every controller denotes a - reset. The reset is done through the S9xSoftReset routine. - */ - if (controllerState1 != 0xFF || controllerState2 != 0xFF) - { - controllers["Reset"] = false; - } - - /* - While the meaning of controller data (for 1.51 and up) for a single standard SNES controller pad - remains the same, each frame of controller data can contain additional bytes if input for peripherals - is being recorded. - */ - if (version != "1.43" && player <= controllerTypes.Length) - { - var peripheral = ""; - switch (controllerTypes[player - 1]) - { - case 0: // NONE - continue; - case 1: // JOYPAD - break; - case 2: // MOUSE - peripheral = "Mouse"; - - // 5*num_mouse_ports - r.ReadBytes(5); - break; - case 3: // SUPERSCOPE - peripheral = "Super Scope"; // 6*num_superscope_ports - r.ReadBytes(6); - break; - case 4: // JUSTIFIER - peripheral = "Justifier"; - - // 11*num_justifier_ports - r.ReadBytes(11); - break; - case 5: // MULTITAP - peripheral = "Multitap"; - break; - } - - if (peripheral != "" && warningMsg == "") - { - warningMsg = "Unable to import " + peripheral + "."; - } - } - - ushort controllerState = (ushort)(((controllerState1 << 4) & 0x0F00) | controllerState2); - if (player <= BkmMnemonicConstants.Players[controllers.Definition.Name]) - { - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = - ((controllerState >> button) & 0x1) != 0; - } - } - else if (warningMsg == "") - { - warningMsg = "Controller " + player + " not supported."; - } - } - - // The controller data contains frames. - if (frame == 0) - { - continue; - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - - var ss = new Snes9x.SyncSettings(); - m.SyncSettingsJson = ConfigService.SaveWithType(ss); - Global.Config.SNES_InSnes9x = true; // This could be annoying to a user if they don't notice we set this preference, but the alternative is for the movie import to fail to load the movie - return m; - } - - // VBM file format: http://code.google.com/p/vba-rerecording/wiki/VBM - private static BkmMovie ImportVbm(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - var m = new BkmMovie(path); - var fs = new FileStream(path, FileMode.Open, FileAccess.Read); - var r = new BinaryReader(fs); - - // 000 4-byte signature: 56 42 4D 1A "VBM\x1A" - string signature = r.ReadStringFixedAscii(4); - if (signature != "VBM\x1A") - { - errorMsg = "This is not a valid .VBM file."; - r.Close(); - fs.Close(); - return null; - } - - // 004 4-byte little-endian unsigned int: major version number, must be "1" - uint majorVersion = r.ReadUInt32(); - if (majorVersion != 1) - { - errorMsg = ".VBM major movie version must be 1."; - r.Close(); - fs.Close(); - return null; - } - - /* - 008 4-byte little-endian integer: movie "uid" - identifies the movie-savestate relationship, also used as the - recording time in Unix epoch format - */ - uint uid = r.ReadUInt32(); - - // 00C 4-byte little-endian unsigned int: number of frames - uint frameCount = r.ReadUInt32(); - - // 010 4-byte little-endian unsigned int: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - // 014 1-byte flags: (movie start flags) - byte flags = r.ReadByte(); - - // bit 0: if "1", movie starts from an embedded "quicksave" snapshot - bool startfromquicksave = (flags & 0x1) != 0; - - // bit 1: if "1", movie starts from reset with an embedded SRAM - bool startfromsram = ((flags >> 1) & 0x1) != 0; - - // other: reserved, set to 0 - // (If both bits 0 and 1 are "1", the movie file is invalid) - if (startfromquicksave && startfromsram) - { - errorMsg = "This is not a valid .VBM file."; - r.Close(); - fs.Close(); - return null; - } - - if (startfromquicksave) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - if (startfromsram) - { - errorMsg = "Movies that begin with SRAM are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // 015 1-byte flags: controller flags - byte controllerFlags = r.ReadByte(); - /* - * bit 0: controller 1 in use - * bit 1: controller 2 in use (SGB games can be 2-player multiplayer) - * bit 2: controller 3 in use (SGB games can be 3- or 4-player multiplayer with multitap) - * bit 3: controller 4 in use (SGB games can be 3- or 4-player multiplayer with multitap) - */ - bool[] controllersUsed = new bool[4]; - for (int controller = 1; controller <= controllersUsed.Length; controller++) - { - controllersUsed[controller - 1] = ((controllerFlags >> (controller - 1)) & 0x1) != 0; - } - - if (!controllersUsed[0]) - { - errorMsg = "Controller 1 must be in use."; - r.Close(); - fs.Close(); - return null; - } - - // other: reserved - // 016 1-byte flags: system flags (game always runs at 60 frames/sec) - flags = r.ReadByte(); - - // bit 0: if "1", movie is for the GBA system - bool isGBA = (flags & 0x1) != 0; - - // bit 1: if "1", movie is for the GBC system - bool isGBC = ((flags >> 1) & 0x1) != 0; - - // bit 2: if "1", movie is for the SGB system - bool isSGB = ((flags >> 2) & 0x1) != 0; - - // other: reserved, set to 0 - - // (At most one of bits 0, 1, 2 can be "1") - ////if (!(is_gba ^ is_gbc ^ is_sgb) && (is_gba || is_gbc || is_sgb)) //TODO: adelikat: this doesn't do what the comment above suggests it is trying to check for, it is always false! - ////{ - ////errorMsg = "This is not a valid .VBM file."; - ////r.Close(); - ////fs.Close(); - ////return null; - ////} - - // (If all 3 of these bits are "0", it is for regular GB.) - string platform = "GB"; - if (isGBA) - { - platform = "GBA"; - } - - if (isGBC) - { - platform = "GBC"; - } - - if (isSGB) - { - m.Comments.Add(SUPERGAMEBOYMODE + " True"); - } - - m.Header[HeaderKeys.PLATFORM] = platform; - - // 017 1-byte flags: (values of some boolean emulator options) - flags = r.ReadByte(); - /* - * bit 0: (useBiosFile) if "1" and the movie is of a GBA game, the movie was made using a GBA BIOS file. - * bit 1: (skipBiosFile) if "0" and the movie was made with a GBA BIOS file, the BIOS intro is included in the - * movie. - * bit 2: (rtcEnable) if "1", the emulator "real time clock" feature was enabled. - * bit 3: (unsupported) must be "0" or the movie file is considered invalid (legacy). - */ - if (((flags >> 3) & 0x1) != 0) - { - errorMsg = "This is not a valid .VBM file."; - r.Close(); - fs.Close(); - return null; - } - - /* - * bit 4: (lagReduction) if "0" and the movie is of a GBA game, the movie was made using the old excessively - * laggy GBA timing. - * bit 5: (gbcHdma5Fix) if "0" and the movie is of a GBC game, the movie was made using the old buggy HDMA5 - * timing. - * bit 6: (echoRAMFix) if "1" and the movie is of a GB, GBC, or SGB game, the movie was made with Echo RAM - * Fix on, otherwise it was made with Echo RAM Fix off. - * bit 7: reserved, set to 0. - */ - /* - 018 4-byte little-endian unsigned int: theApp.winSaveType (value of that emulator option) - 01C 4-byte little-endian unsigned int: theApp.winFlashSize (value of that emulator option) - 020 4-byte little-endian unsigned int: gbEmulatorType (value of that emulator option) - */ - r.ReadBytes(12); - /* - 024 12-byte character array: the internal game title of the ROM used while recording, not necessarily - null-terminated (ASCII?) - */ - string gameName = NullTerminated(r.ReadStringFixedAscii(12)); - m.Header[HeaderKeys.GAMENAME] = gameName; - - // 030 1-byte unsigned char: minor version/revision number of current VBM version, the latest is "1" - byte minorVersion = r.ReadByte(); - m.Comments.Add(MOVIEORIGIN + " .VBM version " + majorVersion + "." + minorVersion); - m.Comments.Add(EMULATIONORIGIN + " Visual Boy Advance"); - - // 031 1-byte unsigned char: the internal CRC of the ROM used while recording - r.ReadByte(); - /* - 032 2-byte little-endian unsigned short: the internal Checksum of the ROM used while recording, or a - calculated CRC16 of the BIOS if GBA - */ - ushort checksumCRC16 = r.ReadUInt16(); - /* - 034 4-byte little-endian unsigned int: the Game Code of the ROM used while recording, or the Unit Code if not - GBA - */ - uint gameCodeUnitCode = r.ReadUInt32(); - if (platform == "GBA") - { - m.Header[CRC16] = checksumCRC16.ToString(); - m.Header[GAMECODE] = gameCodeUnitCode.ToString(); - } - else - { - m.Header[INTERNALCHECKSUM] = checksumCRC16.ToString(); - m.Header[UNITCODE] = gameCodeUnitCode.ToString(); - } - - // 038 4-byte little-endian unsigned int: offset to the savestate or SRAM inside file, set to 0 if unused - r.ReadBytes(4); - - // 03C 4-byte little-endian unsigned int: offset to the controller data inside file - uint firstFrameOffset = r.ReadUInt32(); - - // After the header is 192 bytes of text. The first 64 of these 192 bytes are for the author's name (or names). - string author = NullTerminated(r.ReadStringFixedAscii(64)); - m.Header[HeaderKeys.AUTHOR] = author; - - // The following 128 bytes are for a description of the movie. Both parts must be null-terminated. - string movieDescription = NullTerminated(r.ReadStringFixedAscii(128)); - m.Comments.Add(COMMENT + " " + movieDescription); - r.BaseStream.Position = firstFrameOffset; - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition() }; - controllers.Definition.Name = platform != "GBA" - ? "Gameboy Controller" - : "GBA Controller"; - - /* - * 01 00 A - * 02 00 B - * 04 00 Select - * 08 00 Start - * 10 00 Right - * 20 00 Left - * 40 00 Up - * 80 00 Down - * 00 01 R - * 00 02 L - */ - string[] buttons = { "A", "B", "Select", "Start", "Right", "Left", "Up", "Down", "R", "L" }; - /* - * 00 04 Reset (old timing) - * 00 08 Reset (new timing since version 1.1) - * 00 10 Left motion sensor - * 00 20 Right motion sensor - * 00 40 Down motion sensor - * 00 80 Up motion sensor - */ - string[] other = - { - "Reset (old timing)", "Reset (new timing since version 1.1)", "Left motion sensor", - "Right motion sensor", "Down motion sensor", "Up motion sensor" - }; - for (int frame = 1; frame <= frameCount; frame++) - { - /* - A stream of 2-byte bitvectors which indicate which buttons are pressed at each point in time. They will - come in groups of however many controllers are active, in increasing order. - */ - ushort controllerState = r.ReadUInt16(); - for (int button = 0; button < buttons.Length; button++) - { - controllers[buttons[button]] = ((controllerState >> button) & 0x1) != 0; - if (((controllerState >> button) & 0x1) != 0 && button > 7) - { - continue; - } - } - - // TODO: Handle the other buttons. - if (warningMsg == "") - { - for (int button = 0; button < other.Length; button++) - { - if (((controllerState >> (button + 10)) & 0x1) != 0) - { - warningMsg = "Unable to import " + other[button] + " at frame " + frame + "."; - break; - } - } - } - - // TODO: Handle the additional controllers. - for (int player = 2; player <= controllersUsed.Length; player++) - { - if (controllersUsed[player - 1]) - { - r.ReadBytes(2); - } - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - // VMV file format: http://tasvideos.org/VMV.html - private static BkmMovie ImportVmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 12-byte signature: "VirtuaNES MV" - string signature = r.ReadStringFixedAscii(12); - if (signature != "VirtuaNES MV") - { - errorMsg = "This is not a valid .VMV file."; - r.Close(); - fs.Close(); - return null; - } - - m.Header[HeaderKeys.PLATFORM] = "NES"; - - // 00C 2-byte little-endian integer: movie version 0x0400 - ushort version = r.ReadUInt16(); - m.Comments.Add(MOVIEORIGIN + " .VMV version " + version); - m.Comments.Add(EMULATIONORIGIN + " VirtuaNES"); - - // 00E 2-byte little-endian integer: record version - ushort recordVersion = r.ReadUInt16(); - m.Comments.Add(COMMENT + " Record version " + recordVersion); - - // 010 4-byte flags (control byte) - uint flags = r.ReadUInt32(); - /* - * bit 0: controller 1 in use - * bit 1: controller 2 in use - * bit 2: controller 3 in use - * bit 3: controller 4 in use - */ - bool[] controllersUsed = new bool[4]; - for (int controller = 1; controller <= controllersUsed.Length; controller++) - { - controllersUsed[controller - 1] = ((flags >> (controller - 1)) & 0x1) != 0; - } - - bool fourscore = controllersUsed[2] || controllersUsed[3]; - m.Header[HeaderKeys.FOURSCORE] = fourscore.ToString(); - /* - bit 6: 1=reset-based, 0=savestate-based (movie version <= 0x300 is always savestate-based) - If the movie version is < 0x400, or the "from-reset" flag is not set, a savestate is loaded from the movie. - Otherwise, the savestate is ignored. - */ - if (version < 0x400 || ((flags >> 6) & 0x1) == 0) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - /* - bit 7: disable rerecording - For the other control bytes, if a key from 1P to 4P (whichever one) is entirely ON, the following 4 bytes - becomes the controller data. TODO: Figure out what this means. - Other bits: reserved, set to 0 - */ - - // 014 DWORD Ext0; // ROM:program CRC FDS:program ID - r.ReadBytes(4); - - // 018 WORD Ext1; // ROM:unused,0 FDS:maker ID - r.ReadBytes(2); - - // 01A WORD Ext2; // ROM:unused,0 FDS:disk no. - r.ReadBytes(2); - - // 01C 4-byte little-endian integer: rerecord count - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - /* - 020 BYTE RenderMethod - 0=POST_ALL,1=PRE_ALL - 2=POST_RENDER,3=PRE_RENDER - 4=TILE_RENDER - */ - r.ReadByte(); - - // 021 BYTE IRQtype // IRQ type - r.ReadByte(); - - // 022 BYTE FrameIRQ // FrameIRQ not allowed - r.ReadByte(); - - // 023 1-byte flag: 0=NTSC (60 Hz), 1="PAL" (50 Hz) - bool pal = r.ReadByte() == 1; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // 024 8-bytes: reserved, set to 0 - r.ReadBytes(8); - - // 02C 4-byte little-endian integer: save state start offset - r.ReadBytes(4); - - // 030 4-byte little-endian integer: save state end offset - r.ReadBytes(4); - - // 034 4-byte little-endian integer: movie data offset - uint firstFrameOffset = r.ReadUInt32(); - - // 038 4-byte little-endian integer: movie frame count - uint frameCount = r.ReadUInt32(); - - // 03C 4-byte little-endian integer: CRC (CRC excluding this data(to prevent cheating)) - int crc32 = r.ReadInt32(); - m.Header[CRC32] = crc32.ToString(); - if (!controllersUsed[0] && !controllersUsed[1] && !controllersUsed[2] && !controllersUsed[3]) - { - warningMsg = "No input recorded."; - r.Close(); - fs.Close(); - return m; - } - - r.BaseStream.Position = firstFrameOffset; - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = "NES Controller" } }; - /* - * 01 A - * 02 B - * 04 Select - * 08 Start - * 10 Up - * 20 Down - * 40 Left - * 80 Right - */ - string[] buttons = { "A", "B", "Select", "Start", "Up", "Down", "Left", "Right" }; - for (int frame = 1; frame <= frameCount; frame++) - { - /* - Each frame consists of 1 or more bytes. Controller 1 takes 1 byte, controller 2 takes 1 byte, controller - 3 takes 1 byte, and controller 4 takes 1 byte. If all four exist, the frame is 4 bytes. For example, if - the movie only has controller 1 data, a frame is 1 byte. - */ - controllers["Reset"] = false; - for (int player = 1; player <= controllersUsed.Length; player++) - { - if (!controllersUsed[player - 1]) - { - continue; - } - - byte controllerState = r.ReadByte(); - if (controllerState >= 0xF0) - { - if (controllerState == 0xF0) - { - ushort command = r.ReadUInt16(); - string commandName = ""; - if ((command & 0xFF00) == 0) - { - switch (command & 0x00FF) - { - case 0: // NESCMD_NONE - break; - case 1: // NESCMD_HWRESET - controllers["Reset"] = true; - break; - case 2: // NESCMD_SWRESET - controllers["Reset"] = true; - break; - case 3: // NESCMD_EXCONTROLLER - commandName = "NESCMD_EXCONTROLLER, 0"; - break; - case 4: // NESCMD_DISK_THROTTLE_ON - commandName = "NESCMD_DISK_THROTTLE_ON, 0"; - break; - case 5: // NESCMD_DISK_THROTTLE_OFF - commandName = "NESCMD_DISK_THROTTLE_OFF, 0"; - break; - case 6: // NESCMD_DISK_EJECT - commandName = "NESCMD_DISK_EJECT, 0"; - break; - case 7: // NESCMD_DISK_0A - commandName = "NESCMD_DISK_0A, 0"; - break; - case 8: // NESCMD_DISK_0B - commandName = "NESCMD_DISK_0B, 0"; - break; - case 9: // NESCMD_DISK_1A - commandName = "NESCMD_DISK_1A, 0"; - break; - case 10: // NESCMD_DISK_1B - commandName = "NESCMD_DISK_1B, 0"; - break; - default: - commandName = "invalid command"; - break; - } - } - else - { - commandName = "NESCMD_EXCONTROLLER, " + (command & 0xFF00); - } - - if (commandName != "" && warningMsg == "") - { - warningMsg = "Unable to run command \"" + commandName + "\"."; - } - } - else if (controllerState == 0xF3) - { - uint dwdata = r.ReadUInt32(); - - // TODO: Make a clearer warning message. - if (warningMsg == "") - { - warningMsg = "Unable to run SetSyncExData(" + dwdata + ")."; - } - } - - controllerState = r.ReadByte(); - } - - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - } - } - - m.AppendFrame(controllers); - } - - r.Close(); - fs.Close(); - return m; - } - - // YMV file format: https://code.google.com/p/yabause-rr/wiki/YMVfileformat - private static BkmMovie ImportYmv(string path, out string errorMsg, out string warningMsg) - { - return ImportText(path, out errorMsg, out warningMsg); - } - - // ZMV file format: http://tasvideos.org/ZMV.html - private static BkmMovie ImportZmv(string path, out string errorMsg, out string warningMsg) - { - errorMsg = warningMsg = ""; - BkmMovie m = new BkmMovie(path); - FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); - BinaryReader r = new BinaryReader(fs); - - // 000 3-byte signature: 5A 4D 56 "ZMV" - string signature = r.ReadStringFixedAscii(3); - if (signature != "ZMV") - { - errorMsg = "This is not a valid .ZMV file."; - r.Close(); - fs.Close(); - return null; - } - - m.Header[HeaderKeys.PLATFORM] = "SNES"; - - // 003 2-byte little-endian unsigned int: zsnes version number - short version = r.ReadInt16(); - m.Comments.Add(EMULATIONORIGIN + " ZSNES version " + version); - m.Comments.Add(MOVIEORIGIN + " .ZMV"); - - // 005 4-byte little-endian integer: CRC32 of the ROM - int crc32 = r.ReadInt32(); - m.Header[CRC32] = crc32.ToString(); - - // 009 4-byte little-endian unsigned int: number of frames - uint frameCount = r.ReadUInt32(); - - // 00D 4-byte little-endian unsigned int: number of rerecords - uint rerecordCount = r.ReadUInt32(); - m.Rerecords = rerecordCount; - - // 011 4-byte little-endian unsigned int: number of frames removed by rerecord - r.ReadBytes(4); - - // 015 4-byte little-endian unsigned int: number of frames advanced step by step - r.ReadBytes(4); - - // 019 1-byte: average recording frames per second - r.ReadByte(); - - // 01A 4-byte little-endian unsigned int: number of key combos - r.ReadBytes(4); - - // 01E 2-byte little-endian unsigned int: number of internal chapters - ushort internalChaptersCount = r.ReadUInt16(); - - // 020 2-byte little-endian unsigned int: length of the author name field in bytes - ushort authorSize = r.ReadUInt16(); - - // 022 3-byte little-endian unsigned int: size of an uncompressed save state in bytes - r.ReadBytes(3); - - // 025 1-byte: reserved - r.ReadByte(); - /* - 026 1-byte flags: initial input configuration - bit 7: first input enabled - bit 6: second input enabled - bit 5: third input enabled - bit 4: fourth input enabled - bit 3: fifth input enabled - bit 2: mouse in first port - bit 1: mouse in second port - bit 0: super scope in second port - */ - byte controllerFlags = r.ReadByte(); - string peripheral = ""; - bool superScope = (controllerFlags & 0x1) != 0; - if (superScope) - { - peripheral = "Super Scope"; - } - - controllerFlags >>= 1; - bool secondMouse = (controllerFlags & 0x1) != 0; - if (secondMouse && peripheral == "") - { - peripheral = "Second Mouse"; - } - - controllerFlags >>= 1; - bool firstMouse = (controllerFlags & 0x1) != 0; - if (firstMouse && peripheral == "") - { - peripheral = "First Mouse"; - } - - if (peripheral != "") - { - warningMsg = "Unable to import " + peripheral + "."; - } - - // 027 1-byte flags: - byte movieFlags = r.ReadByte(); - byte begins = (byte)(movieFlags & 0xC0); - /* - bits 7,6: - if "00", movie begins from savestate - */ - if (begins == 0x00) - { - errorMsg = "Movies that begin with a savestate are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // if "10", movie begins from reset - // if "01", movie begins from power-on - if (begins == 0x40) - { - errorMsg = "Movies that begin with SRAM are not supported."; - r.Close(); - fs.Close(); - return null; - } - - // if "11", movie begins from power-on with SRAM clear - // bit 5: if "0", movie is NTSC (60 fps); if "1", movie is PAL (50 fps) - bool pal = ((movieFlags >> 5) & 0x1) != 0; - m.Header[HeaderKeys.PAL] = pal.ToString(); - - // other: reserved, set to 0 - /* - 028 3-byte little-endian unsigned int: initial save state size, highest bit specifies compression, next 23 - specifies size - */ - uint savestateSize = (uint)((r.ReadByte() | (r.ReadByte() << 8) | (r.ReadByte() << 16)) & 0x7FFFFF); - - // Next follows a ZST format savestate. - r.ReadBytes((int)savestateSize); - SimpleController controllers = new SimpleController { Definition = new ControllerDefinition { Name = "SNES Controller" } }; - /* - * bit 11: A - * bit 10: X - * bit 9: L - * bit 8: R - * bit 7: B - * bit 6: Y - * bit 5: Select - * bit 4: Start - * bit 3: Up - * bit 2: Down - * bit 1: Left - * bit 0: Right - */ - string[] buttons = - { - "Right", "Left", "Down", "Up", "Start", "Select", "Y", "B", "R", "L", "X", "A" - }; - int frames = 1; - int internalChapters = 1; - while (frames <= frameCount || internalChapters <= internalChaptersCount) - { - /* - 000 1-byte flags: - bit 7: "1" if controller 1 changed, "0" otherwise - bit 6: "1" if controller 2 changed, "0" otherwise - bit 5: "1" if controller 3 changed, "0" otherwise - bit 4: "1" if controller 4 changed, "0" otherwise - bit 3: "1" if controller 5 changed, "0" otherwise - bit 2: "1" if this is a "chapter" update, "0" if it's a "controller" update - bit 1: "1" if this is RLE data instead of any of the above - bit 0: "1" if this is command data instead any of the above - */ - byte flag = r.ReadByte(); - if ((flag & 0x1) != 0) - { - /* - If the event is a command, the other seven bits define the command. The command could be "reset now" - or similar things. - */ - flag >>= 1; - if (flag == 0x0) - { - controllers["Reset"] = true; - m.AppendFrame(controllers); - controllers["Reset"] = false; - } - - /*TODO: Other commands.*/ - } - else if (((flag >> 1) & 0x1) != 0) - { - // If the event is RLE data, next follows 4 bytes which is the frame to repeat current input till. - uint frame = r.ReadUInt32(); - if (frame > frameCount) - { - throw new ArgumentException("RLE data repeats for frames beyond the total frame count."); - } - - for (; frames <= frame; frames++) - { - m.AppendFrame(controllers); - } - } - else if (((flag >> 2) & 0x1) != 0) - { - /* - If the event is a "chapter" update, the packet follows with a ZST format savestate. Using a header of: - 000 3-byte little endian unsigned int: save state size in format defined above - */ - savestateSize = (uint)((r.ReadByte() | (r.ReadByte() << 8) | (r.ReadByte() << 16)) & 0x7FFFFF); - - // 001 above size: save state - r.ReadBytes((int)savestateSize); - - // above size+001 4-byte little endian unsigned int: frame number save state loads to - r.ReadBytes(4); - - // above size+005 2-byte: controller status bit field, see below - r.ReadBytes(2); - - // above size+007 9-byte: previous controller input bits - r.ReadBytes(9); - internalChapters++; - } - else - { - flag >>= 3; - /* - If the event is a "controller" update, next comes the controller data for each changed controller, 12 - bits per controller, or 20 bits in the case of the super scope, zeropadding up to full bytes. The - minimum length of the controller data is 2 bytes, and the maximum length is 9 bytes. - */ - bool leftOver = false; - byte leftOverValue = 0x0; - for (int player = 1; player <= 5; player++) - { - // If the controller has changed: - if (((flag >> (5 - player)) & 0x1) != 0) - { - /* - For example, if this frame contained input for controllers 1 and 2: - byte 1: - bit 7: P1 B - bit 6: P1 Y - bit 5: P1 Select - bit 4: P1 Start - bit 3: P1 Up - bit 2: P1 Down - bit 1: P1 Left - bit 0: P1 Right - byte 2: - bit 7: P2 B - bit 6: P2 Y - bit 5: P2 Select - bit 4: P2 Start - bit 3: P1 A - bit 2: P1 X - bit 1: P1 L - bit 0: P1 R - byte 3: - bit 7: P2 Up - bit 6: P2 Down - bit 5: P2 Left - bit 4: P2 Right - bit 3: P2 A - bit 2: P2 X - bit 1: P2 L - bit 0: P2 R - */ - byte controllerState1 = r.ReadByte(); - uint controllerState; - if (!leftOver) - { - byte controllerState2 = r.ReadByte(); - if (player == 2 && superScope) - { - byte controllerState3 = r.ReadByte(); - controllerState = (uint)((controllerState1 | (controllerState2 << 8) | - (controllerState3 << 12)) & 0x0FFFFF); - leftOverValue = (byte)((controllerState3 >> 4) & 0x0F); - } - else - { - controllerState = (uint)((controllerState1 | (controllerState2 << 4)) & 0x0FFF); - leftOverValue = (byte)((controllerState2 >> 4) & 0x0F); - } - } - else - { - controllerState = (uint)((controllerState1 >> 4) | (leftOverValue << 4) | - ((controllerState1 << 8) & 0x0F00)); - if (player == 2 && superScope) - { - byte controllerState2 = r.ReadByte(); - controllerState |= (uint)(controllerState2 << 12); - } - } - - leftOver = !leftOver; - if (player <= BkmMnemonicConstants.Players[controllers.Definition.Name]) - { - if (player != 2 || !superScope) - { - for (int button = 0; button < buttons.Length; button++) - { - controllers["P" + player + " " + buttons[button]] = - ((controllerState >> button) & 0x1) != 0; - } - } - } - else if (warningMsg == "") - { - warningMsg = "Controller " + player + " not supported."; - } - } - } - - m.AppendFrame(controllers); - frames++; - } - } - - r.BaseStream.Position = r.BaseStream.Length - authorSize; - - // Last in the file comes the author name field, which is an UTF-8 encoded text string. - var author = Encoding.UTF8.GetString(r.ReadBytes(authorSize)); - m.Header[HeaderKeys.AUTHOR] = author; - return m; - } - } -} diff --git a/BizHawk.Client.Common/movie/import/PJMImport.cs b/BizHawk.Client.Common/movie/import/PJMImport.cs deleted file mode 100644 index 0ced2f3f15..0000000000 --- a/BizHawk.Client.Common/movie/import/PJMImport.cs +++ /dev/null @@ -1,446 +0,0 @@ -using System; -using System.IO; - -using Newtonsoft.Json; - -using BizHawk.Emulation.Cores.Sony.PSX; - -namespace BizHawk.Client.Common -{ - [ImportExtension(".pjm")] - public class PjmImport : MovieImporter - { - protected override void RunImport() - { - Bk2Movie movie = Result.Movie; - - movie.HeaderEntries[HeaderKeys.PLATFORM] = "PSX"; - - using (var fs = SourceFile.OpenRead()) - { - using (var br = new BinaryReader(fs)) - { - var info = ParseHeader(movie, "PJM ", br); - - fs.Seek(info.ControllerDataOffset, SeekOrigin.Begin); - - if (info.BinaryFormat) - { - ParseBinaryInputLog(br, movie, info); - } - else - { - ParseTextInputLog(br, movie, info); - } - } - } - - movie.Save(); - } - - protected MiscHeaderInfo ParseHeader(Bk2Movie movie, string expectedMagic, BinaryReader br) - { - var info = new MiscHeaderInfo(); - - string magic = new string(br.ReadChars(4)); - if (magic != expectedMagic) - { - Result.Errors.Add("Not a " + expectedMagic + "file: invalid magic number in file header."); - return info; - } - - uint movieVersionNumber = br.ReadUInt32(); - if (movieVersionNumber != 2) - { - Result.Warnings.Add($"Unexpected movie version: got {movieVersionNumber}, expecting 2"); - } - - // 008: UInt32 emulator version. - br.ReadUInt32(); - - byte flags = br.ReadByte(); - byte flags2 = br.ReadByte(); - if ((flags & 0x02) != 0) - { - Result.Errors.Add("Movie starts from savestate; this is currently unsupported."); - } - - if ((flags & 0x04) != 0) - { - movie.HeaderEntries[HeaderKeys.PAL] = "1"; - } - - if ((flags & 0x08) != 0) - { - Result.Errors.Add("Movie contains embedded memory cards; this is currently unsupported."); - } - - if ((flags & 0x10) != 0) - { - Result.Errors.Add("Movie contains embedded cheat list; this is currently unsupported."); - } - - if ((flags & 0x20) != 0 || (flags2 & 0x06) != 0) - { - Result.Errors.Add("Movie relies on emulator hacks; this is currently unsupported."); - } - - if ((flags & 0x40) != 0) - { - info.BinaryFormat = false; - } - - if ((flags & 0x80) != 0 || (flags2 & 0x01) != 0) - { - Result.Errors.Add("Movie uses multitap; this is currently unsupported."); - return info; - } - - // Player 1 controller type - switch (br.ReadByte()) - { - // It seems to be inconsistent in the files I looked at which of these is used - // to mean no controller present. - case 0: - case 8: - info.Player1Type = OctoshockDll.ePeripheralType.None; - break; - case 4: - info.Player1Type = OctoshockDll.ePeripheralType.Pad; - break; - case 7: - info.Player1Type = OctoshockDll.ePeripheralType.DualShock; - break; - default: - Result.Errors.Add("Movie has unrecognised controller type for Player 1."); - return info; - } - - // Player 2 controller type - switch (br.ReadByte()) - { - case 0: - case 8: - info.Player2Type = OctoshockDll.ePeripheralType.None; - break; - case 4: - info.Player2Type = OctoshockDll.ePeripheralType.Pad; - break; - case 7: - info.Player2Type = OctoshockDll.ePeripheralType.DualShock; - break; - default: - Result.Errors.Add("Movie has unrecognised controller type for Player 2."); - return info; - } - - var syncsettings = new Octoshock.SyncSettings - { - FIOConfig = - { - Devices8 = new[] - { - info.Player1Type, - OctoshockDll.ePeripheralType.None, - OctoshockDll.ePeripheralType.None, - OctoshockDll.ePeripheralType.None, - info.Player2Type, - OctoshockDll.ePeripheralType.None, - OctoshockDll.ePeripheralType.None, - OctoshockDll.ePeripheralType.None - } - } - }; - - // Annoying kludge to force the json serializer to serialize the type name for "o" object. - // For just the "o" object to have type information, it must be cast to a superclass such - // that the TypeNameHandling.Auto decides to serialize the type as well as the object - // contents. As such, the object cast is NOT redundant - var jsonSettings = new JsonSerializerSettings - { - TypeNameHandling = TypeNameHandling.Auto - }; - movie.SyncSettingsJson = JsonConvert.SerializeObject(new { o = (object)syncsettings }, jsonSettings); - - info.FrameCount = br.ReadUInt32(); - uint rerecordCount = br.ReadUInt32(); - movie.HeaderEntries[HeaderKeys.RERECORDS] = rerecordCount.ToString(); - - // 018: UInt32 savestateOffset - // 01C: UInt32 memoryCard1Offset - // 020: UInt32 memoryCard2Offset - // 024: UInt32 cheatListOffset - - // 028: UInt32 cdRomIdOffset - // Source format is just the first up-to-8 alphanumeric characters of the CD label, - // so not so useful. - br.ReadBytes(20); - - info.ControllerDataOffset = br.ReadUInt32(); - - uint authorNameLength = br.ReadUInt32(); - char[] authorName = br.ReadChars((int)authorNameLength); - - movie.HeaderEntries[HeaderKeys.AUTHOR] = new string(authorName); - - info.ParseSuccessful = true; - return info; - } - - protected void ParseBinaryInputLog(BinaryReader br, Bk2Movie movie, MiscHeaderInfo info) - { - Octoshock.SyncSettings settings = new Octoshock.SyncSettings(); - SimpleController controllers = new SimpleController(); - settings.FIOConfig.Devices8 = new[] - { - info.Player1Type, - OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, - info.Player2Type, - OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None - }; - controllers.Definition = Octoshock.CreateControllerDefinition(settings); - - string[] buttons = - { - "Select", "L3", "R3", "Start", "Up", "Right", "Down", "Left", - "L2", "R2", "L1", "R1", "Triangle", "Circle", "Cross", "Square" - }; - - bool isCdTrayOpen = false; - int cdNumber = 1; - - for (int frame = 0; frame < info.FrameCount; ++frame) - { - if (info.Player1Type != OctoshockDll.ePeripheralType.None) - { - ushort controllerState = br.ReadUInt16(); - - // As L3 and R3 don't exist on a standard gamepad, handle them separately later. Unfortunately - // due to the layout, we handle select separately too first. - controllers["P1 Select"] = (controllerState & 0x1) != 0; - - for (int button = 3; button < buttons.Length; button++) - { - controllers["P1 " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - if (((controllerState >> button) & 0x1) != 0 && button > 15) - { - continue; - } - } - - if (info.Player1Type == OctoshockDll.ePeripheralType.DualShock) - { - controllers["P1 L3"] = (controllerState & 0x2) != 0; - controllers["P1 R3"] = (controllerState & 0x4) != 0; - Tuple leftX = new Tuple("P1 LStick X", (float)br.ReadByte()); - Tuple leftY = new Tuple("P1 LStick Y", (float)br.ReadByte()); - Tuple rightX = new Tuple("P1 RStick X", (float)br.ReadByte()); - Tuple rightY = new Tuple("P1 RStick Y", (float)br.ReadByte()); - - controllers.AcceptNewFloats(new[] { leftX, leftY, rightX, rightY }); - } - } - - if (info.Player2Type != OctoshockDll.ePeripheralType.None) - { - ushort controllerState = br.ReadUInt16(); - for (int button = 0; button < buttons.Length; button++) - { - controllers["P2 " + buttons[button]] = ((controllerState >> button) & 0x1) != 0; - if (((controllerState >> button) & 0x1) != 0 && button > 15) - { - continue; - } - } - - if (info.Player2Type == OctoshockDll.ePeripheralType.DualShock) - { - Tuple leftX = new Tuple("P2 LStick X", (float)br.ReadByte()); - Tuple leftY = new Tuple("P2 LStick Y", (float)br.ReadByte()); - Tuple rightX = new Tuple("P2 RStick X", (float)br.ReadByte()); - Tuple rightY = new Tuple("P2 RStick Y", (float)br.ReadByte()); - - controllers.AcceptNewFloats(new[] { leftX, leftY, rightX, rightY }); - } - } - - byte controlState = br.ReadByte(); - controllers["Reset"] = (controlState & 0x02) != 0; - if ((controlState & 0x04) != 0) - { - if (isCdTrayOpen) - { - controllers["Close"] = true; - cdNumber++; - } - else - { - controllers["Open"] = true; - } - - isCdTrayOpen = !isCdTrayOpen; - } - else - { - controllers["Close"] = false; - controllers["Open"] = false; - } - - Tuple discSelect = new Tuple("Disc Select", cdNumber); - controllers.AcceptNewFloats(new[] { discSelect }); - - if ((controlState & 0xFC) != 0) - { - Result.Warnings.Add("Ignored toggle hack flag on frame " + frame); - } - - movie.AppendFrame(controllers); - } - } - - protected void ParseTextInputLog(BinaryReader br, Bk2Movie movie, MiscHeaderInfo info) - { - Octoshock.SyncSettings settings = new Octoshock.SyncSettings(); - SimpleController controllers = new SimpleController(); - settings.FIOConfig.Devices8 = new[] - { - info.Player1Type, - OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, - info.Player2Type, - OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None, OctoshockDll.ePeripheralType.None - }; - controllers.Definition = Octoshock.CreateControllerDefinition(settings); - - string[] buttons = - { - "Select", "L3", "R3", "Start", "Up", "Right", "Down", "Left", - "L2", "R2", "L1", "R1", "Triangle", "Circle", "Cross", "Square" - }; - - bool isCdTrayOpen = false; - int cdNumber = 1; - - for (int frame = 0; frame < info.FrameCount; ++frame) - { - if (info.Player1Type != OctoshockDll.ePeripheralType.None) - { - // As L3 and R3 don't exist on a standard gamepad, handle them separately later. Unfortunately - // due to the layout, we handle select separately too first. - controllers["P1 Select"] = br.ReadChar() != '.'; - - if (info.Player1Type == OctoshockDll.ePeripheralType.DualShock) - { - controllers["P1 L3"] = br.ReadChar() != '.'; - controllers["P1 R3"] = br.ReadChar() != '.'; - } - - for (int button = 3; button < buttons.Length; button++) - { - controllers["P1 " + buttons[button]] = br.ReadChar() != '.'; - } - - if (info.Player1Type == OctoshockDll.ePeripheralType.DualShock) - { - // The analog controls are encoded as four space-separated numbers with a leading space - string leftXRaw = new string(br.ReadChars(4)).Trim(); - string leftYRaw = new string(br.ReadChars(4)).Trim(); - string rightXRaw = new string(br.ReadChars(4)).Trim(); - string rightYRaw = new string(br.ReadChars(4)).Trim(); - - Tuple leftX = new Tuple("P1 LStick X", float.Parse(leftXRaw)); - Tuple leftY = new Tuple("P1 LStick Y", float.Parse(leftYRaw)); - Tuple rightX = new Tuple("P1 RStick X", float.Parse(rightXRaw)); - Tuple rightY = new Tuple("P1 RStick Y", float.Parse(rightYRaw)); - - controllers.AcceptNewFloats(new[] { leftX, leftY, rightX, rightY }); - } - } - - // Each controller is terminated with a pipeline. - br.ReadChar(); - - if (info.Player2Type != OctoshockDll.ePeripheralType.None) - { - // As L3 and R3 don't exist on a standard gamepad, handle them separately later. Unfortunately - // due to the layout, we handle select separately too first. - controllers["P2 Select"] = br.ReadChar() != '.'; - - if (info.Player2Type == OctoshockDll.ePeripheralType.DualShock) - { - controllers["P2 L3"] = br.ReadChar() != '.'; - controllers["P2 R3"] = br.ReadChar() != '.'; - } - - for (int button = 3; button < buttons.Length; button++) - { - controllers["P2 " + buttons[button]] = br.ReadChar() != '.'; - } - - if (info.Player2Type == OctoshockDll.ePeripheralType.DualShock) - { - // The analog controls are encoded as four space-separated numbers with a leading space - string leftXRaw = new string(br.ReadChars(4)).Trim(); - string leftYRaw = new string(br.ReadChars(4)).Trim(); - string rightXRaw = new string(br.ReadChars(4)).Trim(); - string rightYRaw = new string(br.ReadChars(4)).Trim(); - - Tuple leftX = new Tuple("P2 LStick X", float.Parse(leftXRaw)); - Tuple leftY = new Tuple("P2 LStick Y", float.Parse(leftYRaw)); - Tuple rightX = new Tuple("P2 RStick X", float.Parse(rightXRaw)); - Tuple rightY = new Tuple("P2 RStick Y", float.Parse(rightYRaw)); - - controllers.AcceptNewFloats(new[] { leftX, leftY, rightX, rightY }); - } - } - - // Each controller is terminated with a pipeline. - br.ReadChar(); - - byte controlState = br.ReadByte(); - controllers["Reset"] = (controlState & 0x02) != 0; - if ((controlState & 0x04) != 0) - { - if (isCdTrayOpen) - { - controllers["Close"] = true; - cdNumber++; - } - else - { - controllers["Open"] = true; - } - - isCdTrayOpen = !isCdTrayOpen; - } - else - { - controllers["Close"] = false; - controllers["Open"] = false; - } - - Tuple discSelect = new Tuple("Disc Select", cdNumber); - controllers.AcceptNewFloats(new[] { discSelect }); - - if ((controlState & 0xFC) != 0) - { - Result.Warnings.Add("Ignored toggle hack flag on frame " + frame); - } - - // Each controller is terminated with a pipeline. - br.ReadChar(); - - movie.AppendFrame(controllers); - } - } - - protected class MiscHeaderInfo - { - public bool BinaryFormat { get; set; } = true; - public uint ControllerDataOffset { get; set; } - public uint FrameCount { get; set; } - public OctoshockDll.ePeripheralType Player1Type { get; set; } - public OctoshockDll.ePeripheralType Player2Type { get; set; } - public bool ParseSuccessful { get; set; } - } - } -} diff --git a/BizHawk.Client.Common/movie/import/PXMImport.cs b/BizHawk.Client.Common/movie/import/PXMImport.cs deleted file mode 100644 index 4b0481ce47..0000000000 --- a/BizHawk.Client.Common/movie/import/PXMImport.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; - -namespace BizHawk.Client.Common.Movie.Import -{ - // PXM files are directly compatible with binary-format PJM files, with the only - // difference being fewer flags implemented in the header, hence just calling the - // base class methods via a subclass. - // - // However, the magic number/file signature is slightly different, requiring some - // refactoring to avoid PXM-specific code in the PJMImport class. - [ImportExtension(".pxm")] - public class PxmImport : PjmImport - { - protected override void RunImport() - { - Bk2Movie movie = Result.Movie; - - movie.HeaderEntries[HeaderKeys.PLATFORM] = "PSX"; - - using (var fs = SourceFile.OpenRead()) - { - using (var br = new BinaryReader(fs)) - { - var info = ParseHeader(movie, "PXM ", br); - - fs.Seek(info.ControllerDataOffset, SeekOrigin.Begin); - - if (info.BinaryFormat) - { - ParseBinaryInputLog(br, movie, info); - } - else - { - ParseTextInputLog(br, movie, info); - } - } - } - - movie.Save(); - } - } -} diff --git a/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs b/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs deleted file mode 100644 index 897dd79281..0000000000 --- a/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public interface ILogEntryGenerator - { - /// - /// Sets the controller source used to generate an input log entry - /// - void SetSource(IController source); - - /// - /// Generates an input log entry for the current state of Source - /// - string GenerateLogEntry(); - - /// - /// Generates a display friendly version of the input log entry - /// - string GenerateInputDisplay(); - - /// - /// Gets a value indicating whether or not the current controller state is "empty" - /// - bool IsEmpty { get; } - - /// - /// Gets an input log entry that is considered empty. (booleans will be false, floats will be 0) - /// - string EmptyEntry { get; } - - /// - /// Gets a movie controller adapter in the same state as the log entry - /// - /// - IMovieController MovieControllerAdapter { get; } - } -} diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs deleted file mode 100644 index 8ff81ea8cb..0000000000 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ /dev/null @@ -1,216 +0,0 @@ -using System.Collections.Generic; -using System.IO; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - // TODO: message callback / event handler - // TODO: consider other event handlers, switching modes? - public interface IMovie - { - #region Status - - bool IsCountingRerecords { get; set; } - bool IsActive { get; } - bool IsPlaying { get; } - bool IsRecording { get; } - bool IsFinished { get; } - bool Changes { get; } - - #endregion - - #region Properties - - /// - /// Gets the total number of frames that count towards the completion time of the movie - /// Possibly (but unlikely different from InputLogLength (could be infinity, or maybe an implementation automatically discounts empty frames at the end of a movie, etc) - /// - double FrameCount { get; } - - /// - /// Gets the actual length of the input log, should only be used by code that iterates or needs a real length - /// - int InputLogLength { get; } - - /// - /// Gets the file extension for the current implementation - /// - string PreferredExtension { get; } - - /// - /// Gets or sets the Sync Settings from the Core - /// - string SyncSettingsJson { get; set; } - - SubtitleList Subtitles { get; } - IList Comments { get; } - - // savestate anchor. - string TextSavestate { get; set; } - byte[] BinarySavestate { get; set; } - int[] SavestateFramebuffer { get; set; } - - // saveram anchor - byte[] SaveRam { get; set; } - - ulong Rerecords { get; set; } - bool StartsFromSavestate { get; set; } - bool StartsFromSaveRam { get; set; } - string GameName { get; set; } - string SystemID { get; set; } - string Hash { get; set; } - string Author { get; set; } - string Core { get; set; } - string EmulatorVersion { get; set; } - string FirmwareHash { get; set; } - string BoardName { get; set; } - - /// - /// Loads from the HawkFile the minimal amount of information needed to determine Header info and Movie length - /// This method is intended to be more performant than a full load - /// - bool PreLoadHeaderAndLength(HawkFile hawkFile); - - /// - /// Gets the header key value pairs stored in the movie file - /// - IDictionary HeaderEntries { get; } - - /// - /// Forces the creation of a backup file of the current movie state - /// - void SaveBackup(); - - /// - /// Creates an instance of the Input log entry used to generate the input log - /// - ILogEntryGenerator LogGeneratorInstance(); - - #endregion - - #region File Handling API - - // Filename of the movie, settable by the client - string Filename { get; set; } - - /// - /// Tells the movie to load the contents of Filename - /// - /// Return whether or not the file was successfully loaded - bool Load(bool preload); - - /// - /// Instructs the movie to save the current contents to Filename - /// - void Save(); - - /// - /// Writes the input log directly to the stream, bypassing the need to load it all into ram as a string - /// - void WriteInputLog(TextWriter writer); - - /// - /// Gets one frame from the input log. - /// - /// The frame to get. - string GetInputLogEntry(int frame); - - /// - /// Compares the input log inside reader with the movie's current input to see if the reader's input belongs to the same timeline, - /// in other words, if reader's input is completely contained in the movie's input, then it is considered in the same timeline - /// - /// The reader containing the contents of the input log - /// Returns an error message, if any - /// Returns whether or not the input log in reader is in the same timeline as the movie - bool CheckTimeLines(TextReader reader, out string errorMessage); - - /// - /// Takes reader and extracts the input log, then replaces the movies input log with it - /// - /// The reader containing the contents of the input log - /// Returns an error message, if any - bool ExtractInputLog(TextReader reader, out string errorMessage); - - #endregion - - #region Mode Handling API - - /// - /// Tells the movie to start recording from the beginning. - /// - void StartNewRecording(); - - /// - /// Tells the movie to start playback from the beginning - /// - void StartNewPlayback(); - - /// - /// Sets the movie to inactive (note that it will still be in memory) - /// The saveChanges flag will tell the movie to save its contents to disk - /// - /// if true, will save to disk - /// Whether or not the movie was saved - bool Stop(bool saveChanges = true); - - /// - /// Switches to record mode - /// - void SwitchToRecord(); - - /// - /// Switches to playback mode - /// - void SwitchToPlay(); - - /// - /// Tells the movie to go into "Finished" mode, where the user resumes control of input but the movie is still loaded in memory - /// - void FinishedMode(); - - #endregion - - #region Editing API - - /// - /// Replaces the given frame's input with an empty frame - /// - void ClearFrame(int frame); - - /// - /// Adds the given input to the movie - /// Note: this edits the input log without the normal movie recording logic applied - /// - void AppendFrame(IController source); - - /// - /// Replaces the input at the given frame with the given input - /// Note: this edits the input log without the normal movie recording logic applied - /// - void PokeFrame(int frame, IController source); - - /// - /// Records the given input into the given frame, - /// This is subject to normal movie recording logic - /// - void RecordFrame(int frame, IController source); - - /// - /// Instructs the movie to remove all input from its input log after frame, - /// After truncating, frame will be the last frame of input in the movie's input log - /// - /// The frame at which to truncate - void Truncate(int frame); - - /// - /// Gets a single frame of input via a controller state - /// - /// The frame of input to be retrieved - /// A controller state representing the specified frame of input, if frame is out of range, will return null - IController GetInputState(int frame); - - #endregion - } -} diff --git a/BizHawk.Client.Common/movie/interfaces/IMovieController.cs b/BizHawk.Client.Common/movie/interfaces/IMovieController.cs deleted file mode 100644 index af9a76ab05..0000000000 --- a/BizHawk.Client.Common/movie/interfaces/IMovieController.cs +++ /dev/null @@ -1,17 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public interface IMovieController : IController - { - new ControllerDefinition Definition { get; set; } - - void LatchPlayerFromSource(IController playerSource, int playerNum); - - void LatchFromSource(IController source); - - void LatchSticky(); - - void SetControllersAsMnemonic(string mnemonic); - } -} diff --git a/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs b/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs deleted file mode 100644 index 3c8b605edc..0000000000 --- a/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - public interface IMovieSession - { - IMovie Movie { get; set; } - IMovie QueuedMovie { get; } - IMovieController MovieControllerAdapter { get; } - IMovieController MovieControllerInstance(); - MultitrackRecorder MultiTrack { get; } - - IController PreviousFrame { get; } - IController CurrentInput { get; } - - bool ReadOnly { get; set; } - bool MovieIsQueued { get; } - - bool? PreviousNES_InQuickNES { get; set; } - bool? PreviousSNES_InSnes9x { get; set; } - bool? PreviousGBA_UsemGBA { get; set; } - - void HandleMovieOnFrameLoop(); - void HandleMovieAfterFrameLoop(); - void HandleMovieSaveState(TextWriter writer); - bool HandleMovieLoadState(string path); - - // To function as a MovieSession, you must have hacky LoadState steps, non-hacky steps just won't do - bool HandleMovieLoadState_HackyStep1(TextReader reader); - bool HandleMovieLoadState_HackyStep2(TextReader reader); - - ILogEntryGenerator LogGeneratorInstance(); - - void QueueNewMovie(IMovie movie, bool record, IEmulator emulator); - void RunQueuedMovie(bool recordMode); - - void ToggleMultitrack(); - - void StopMovie(bool saveChanges = true); - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/StateManagerState.cs b/BizHawk.Client.Common/movie/tasproj/StateManagerState.cs deleted file mode 100644 index ae5255c80c..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/StateManagerState.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.IO; - -namespace BizHawk.Client.Common -{ - /// - /// Represents a savestate in the - /// - internal class StateManagerState : IDisposable - { - private static long _stateId; - private readonly TasStateManager _manager; - private readonly long _id; - - private byte[] _state; - - public int Frame { get; } - - public static StateManagerState Read(BinaryReader r, TasStateManager m) - { - int frame = r.ReadInt32(); - byte[] data = r.ReadBytes(r.ReadInt32()); - return new StateManagerState(m, data, frame); - } - - public void Write(BinaryWriter w) - { - w.Write(Frame); - w.Write(_state.Length); - w.Write(_state); - } - - public byte[] State - { - get - { - if (_state != null) - { - return _state; - } - - return _manager.NdbDatabase.FetchAll(_id.ToString()); - } - - set - { - if (_state != null) - { - _state = value; - } - else - { - throw new Exception("Attempted to set a state to null."); - } - } - } - - public int Length => State.Length; - - public bool IsOnDisk => _state == null; - - public StateManagerState(TasStateManager manager, byte[] state, int frame) - { - _manager = manager; - _state = state; - Frame = frame; - - if (_stateId > long.MaxValue - 100) - { - throw new InvalidOperationException(); - } - - _id = System.Threading.Interlocked.Increment(ref _stateId); - } - - public void MoveToDisk() - { - if (IsOnDisk) - { - return; - } - - _manager.NdbDatabase.Store(_id.ToString(), _state, 0, _state.Length); - _state = null; - } - - public void MoveToRAM() - { - if (!IsOnDisk) - { - return; - } - - string key = _id.ToString(); - _state = _manager.NdbDatabase.FetchAll(key); - _manager.NdbDatabase.Release(key); - } - - public void Dispose() - { - if (!IsOnDisk) - { - return; - } - - _manager.NdbDatabase.Release(_id.ToString()); - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasBranch.cs b/BizHawk.Client.Common/movie/tasproj/TasBranch.cs deleted file mode 100644 index 2eae586ab0..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasBranch.cs +++ /dev/null @@ -1,226 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Newtonsoft.Json; -using BizHawk.Bizware.BizwareGL; - -namespace BizHawk.Client.Common -{ - public class TasBranch - { - public int Frame { get; set; } - public byte[] CoreData { get; set; } - public IStringLog InputLog { get; set; } - public BitmapBuffer OSDFrameBuffer { get; set; } - public TasLagLog LagLog { get; set; } - public TasMovieChangeLog ChangeLog { get; set; } - public DateTime TimeStamp { get; set; } - public TasMovieMarkerList Markers { get; set; } - public Guid UniqueIdentifier { get; set; } - public string UserText { get; set; } - - public TasBranch Clone() - { - return (TasBranch)MemberwiseClone(); - } - } - - public class TasBranchCollection : List - { - public new void Add(TasBranch item) - { - if (item.UniqueIdentifier == Guid.Empty) - { - var currentHashes = this.Select(b => b.UniqueIdentifier.GetHashCode()).ToList(); - - do - { - item.UniqueIdentifier = Guid.NewGuid(); - } - while (currentHashes.Contains(item.UniqueIdentifier.GetHashCode())); - } - - base.Add(item); - } - - public void Save(BinaryStateSaver bs) - { - var nheader = new IndexedStateLump(BinaryStateLump.BranchHeader); - var ncore = new IndexedStateLump(BinaryStateLump.BranchCoreData); - var ninput = new IndexedStateLump(BinaryStateLump.BranchInputLog); - var nframebuffer = new IndexedStateLump(BinaryStateLump.BranchFrameBuffer); - var nlaglog = new IndexedStateLump(BinaryStateLump.BranchLagLog); - var nmarkers = new IndexedStateLump(BinaryStateLump.BranchMarkers); - var nusertext = new IndexedStateLump(BinaryStateLump.BranchUserText); - foreach (var b in this) - { - bs.PutLump(nheader, delegate(TextWriter tw) - { - // if this header needs more stuff in it, handle it sensibly - tw.WriteLine(JsonConvert.SerializeObject(new - { - b.Frame, - b.TimeStamp, - b.UniqueIdentifier - })); - }); - - bs.PutLump(ncore, delegate(Stream s) - { - s.Write(b.CoreData, 0, b.CoreData.Length); - }); - - bs.PutLump(ninput, delegate(TextWriter tw) - { - int todo = b.InputLog.Count; - for (int i = 0; i < todo; i++) - { - tw.WriteLine(b.InputLog[i]); - } - }); - - bs.PutLump(nframebuffer, delegate(Stream s) - { - var vp = new BitmapBufferVideoProvider(b.OSDFrameBuffer); - QuickBmpFile.Save(vp, s, b.OSDFrameBuffer.Width, b.OSDFrameBuffer.Height); - }); - - bs.PutLump(nlaglog, delegate(BinaryWriter bw) - { - b.LagLog.Save(bw); - }); - - bs.PutLump(nmarkers, delegate(TextWriter tw) - { - tw.WriteLine(b.Markers.ToString()); - }); - - bs.PutLump(nusertext, delegate(TextWriter tw) - { - tw.WriteLine(b.UserText); - }); - - nheader.Increment(); - ncore.Increment(); - ninput.Increment(); - nframebuffer.Increment(); - nlaglog.Increment(); - nmarkers.Increment(); - nusertext.Increment(); - } - } - - public void Load(BinaryStateLoader bl, TasMovie movie) - { - var nheader = new IndexedStateLump(BinaryStateLump.BranchHeader); - var ncore = new IndexedStateLump(BinaryStateLump.BranchCoreData); - var ninput = new IndexedStateLump(BinaryStateLump.BranchInputLog); - var nframebuffer = new IndexedStateLump(BinaryStateLump.BranchFrameBuffer); - var nlaglog = new IndexedStateLump(BinaryStateLump.BranchLagLog); - var nmarkers = new IndexedStateLump(BinaryStateLump.BranchMarkers); - var nusertext = new IndexedStateLump(BinaryStateLump.BranchUserText); - - Clear(); - - while (true) - { - var b = new TasBranch(); - - if (!bl.GetLump(nheader, false, delegate(TextReader tr) - { - var header = (dynamic)JsonConvert.DeserializeObject(tr.ReadLine()); - b.Frame = (int)header.Frame; - - var timestamp = header.TimeStamp; - - if (timestamp != null) - { - b.TimeStamp = (DateTime)timestamp; - } - else - { - b.TimeStamp = DateTime.Now; - } - - var identifier = header.UniqueIdentifier; - if (identifier != null) - { - b.UniqueIdentifier = (Guid)identifier; - } - else - { - b.UniqueIdentifier = Guid.NewGuid(); - } - })) - { - return; - } - - bl.GetLump(ncore, true, delegate(Stream s, long length) - { - b.CoreData = new byte[length]; - s.Read(b.CoreData, 0, b.CoreData.Length); - }); - - bl.GetLump(ninput, true, delegate(TextReader tr) - { - b.InputLog = StringLogUtil.MakeStringLog(); - string line; - while ((line = tr.ReadLine()) != null) - { - b.InputLog.Add(line); - } - }); - - bl.GetLump(nframebuffer, true, delegate(Stream s, long length) - { - var vp = new QuickBmpFile.LoadedBMP(); - QuickBmpFile.Load(vp, s); - b.OSDFrameBuffer = new BitmapBuffer(vp.BufferWidth, vp.BufferHeight, vp.VideoBuffer); - }); - - bl.GetLump(nlaglog, true, delegate(BinaryReader br) - { - b.LagLog = new TasLagLog(); - b.LagLog.Load(br); - }); - - b.Markers = new TasMovieMarkerList(movie); - bl.GetLump(nmarkers, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - b.Markers.Add(new TasMovieMarker(line)); - } - } - }); - - bl.GetLump(nusertext, false, delegate(TextReader tr) - { - string line; - if ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - b.UserText = line; - } - } - }); - - Add(b); - - nheader.Increment(); - ncore.Increment(); - ninput.Increment(); - nframebuffer.Increment(); - nlaglog.Increment(); - nmarkers.Increment(); - nusertext.Increment(); - } - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasLagLog.cs b/BizHawk.Client.Common/movie/tasproj/TasLagLog.cs deleted file mode 100644 index e02b10a009..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasLagLog.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public class TasLagLog - { - // TODO: Change this into a regular list. - private List _lagLog = new List(); - private List _wasLag = new List(); - - public bool? this[int frame] - { - get - { - if (frame < _lagLog.Count) - { - if (frame < 0) - { - return null; - } - - return _lagLog[frame]; - } - - if (frame == Global.Emulator.Frame && frame == _lagLog.Count) - { - ////LagLog[frame] = Global.Emulator.AsInputPollable().IsLagFrame; // Note: Side effects! - return Global.Emulator.AsInputPollable().IsLagFrame; - } - - return null; - } - - set - { - if (!value.HasValue) - { - _lagLog.RemoveAt(frame); - return; - } - - if (frame < 0) - { - return; // Nothing to do - } - - if (frame > _lagLog.Count) - { - System.Diagnostics.Debug.Print("Lag Log error. f" + frame + ", log: " + _lagLog.Count); - return; // Can this break anything? - } - - bool wasValue; - if (frame < _lagLog.Count) - { - wasValue = _lagLog[frame]; - } - else if (frame == _wasLag.Count) - { - wasValue = value.Value; - } - else - { - wasValue = _wasLag[frame]; - } - - if (frame == _wasLag.Count) - { - _wasLag.Add(wasValue); - } - else - { - _wasLag[frame] = wasValue; - } - - if (frame != 0) - { - _wasLag[frame - 1] = _lagLog[frame - 1]; - } - - if (frame >= _lagLog.Count) - { - _lagLog.Add(value.Value); - } - else - { - _lagLog[frame] = value.Value; - } - } - } - - public void Clear() - { - _lagLog.Clear(); - } - - public bool RemoveFrom(int frame) - { - if (_lagLog.Count > frame && frame >= 0) - { - _lagLog.RemoveRange(frame + 1, _lagLog.Count - frame - 1); - return true; - } - - return false; - } - - public void RemoveHistoryAt(int frame) - { - _wasLag.RemoveAt(frame); - } - - public void InsertHistoryAt(int frame, bool isLag) - { - // LagLog was invalidated when the frame was inserted - if (frame <= _lagLog.Count) - { - _lagLog.Insert(frame, isLag); - } - - _wasLag.Insert(frame, isLag); - } - - public void Save(BinaryWriter bw) - { - bw.Write((byte)1); // New saving format. - bw.Write(_lagLog.Count); - bw.Write(_wasLag.Count); - for (int i = 0; i < _lagLog.Count; i++) - { - bw.Write(_lagLog[i]); - bw.Write(_wasLag[i]); - } - - for (int i = _lagLog.Count; i < _wasLag.Count; i++) - { - bw.Write(_wasLag[i]); - } - } - - public void Load(BinaryReader br) - { - _lagLog.Clear(); - _wasLag.Clear(); - ////if (br.BaseStream.Length > 0) - ////{ BaseStream.Length does not return the expected value. - int formatVersion = br.ReadByte(); - if (formatVersion == 0) - { - int length = (br.ReadByte() << 8) | formatVersion; // The first byte should be a part of length. - length = (br.ReadInt16() << 16) | length; - for (int i = 0; i < length; i++) - { - br.ReadInt32(); - _lagLog.Add(br.ReadBoolean()); - _wasLag.Add(_lagLog.Last()); - } - } - else if (formatVersion == 1) - { - int length = br.ReadInt32(); - int lenWas = br.ReadInt32(); - for (int i = 0; i < length; i++) - { - _lagLog.Add(br.ReadBoolean()); - _wasLag.Add(br.ReadBoolean()); - } - - for (int i = length; i < lenWas; i++) - { - _wasLag.Add(br.ReadBoolean()); - } - } - ////} - } - - public bool? History(int frame) - { - if (frame < _wasLag.Count) - { - if (frame < 0) - { - return null; - } - - return _wasLag[frame]; - } - - return null; - } - - public int LastValidFrame - { - get - { - if (_lagLog.Count == 0) - { - return 0; - } - - return _lagLog.Count - 1; - } - } - - public TasLagLog Clone() - { - return new TasLagLog - { - _lagLog = _lagLog.ToList(), - _wasLag = _wasLag.ToList() - }; - } - - public void FromLagLog(TasLagLog log) - { - _lagLog = log._lagLog.ToList(); - _wasLag = log._wasLag.ToList(); - } - - public void StartFromFrame(int index) - { - _lagLog.RemoveRange(0, index); - _wasLag.RemoveRange(0, index); - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs deleted file mode 100644 index f08d163849..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs +++ /dev/null @@ -1,563 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public partial class TasMovie - { - public TasMovieChangeLog ChangeLog { get; set; } - - public override void RecordFrame(int frame, IController source) - { - if (frame != 0) - { - ChangeLog.AddGeneralUndo(frame - 1, frame - 1, "Record Frame: " + frame); - } - - base.RecordFrame(frame, source); - - _lagLog.RemoveFrom(frame); - _lagLog[frame] = Global.Emulator.AsInputPollable().IsLagFrame; - - if (IsRecording) - { - _stateManager.Invalidate(frame + 1); - } - - if (frame != 0) - { - ChangeLog.SetGeneralRedo(); - } - } - - public override void Truncate(int frame) - { - bool endBatch = ChangeLog.BeginNewBatch("Truncate Movie: " + frame, true); - ChangeLog.AddGeneralUndo(frame, InputLogLength - 1); - - if (frame < Log.Count - 1) - { - Changes = true; - } - - base.Truncate(frame); - - _lagLog.RemoveFrom(frame); - _stateManager.Invalidate(frame); - Markers.TruncateAt(frame); - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - public override void PokeFrame(int frame, IController source) - { - ChangeLog.AddGeneralUndo(frame, frame, "Set Frame At: " + frame); - - base.PokeFrame(frame, source); - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - } - - public void SetFrame(int frame, string source) - { - ChangeLog.AddGeneralUndo(frame, frame, "Set Frame At: " + frame); - - SetFrameAt(frame, source); - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - } - - public override void ClearFrame(int frame) - { - ChangeLog.AddGeneralUndo(frame, frame, "Clear Frame: " + frame); - - base.ClearFrame(frame); - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - } - - public void RemoveFrame(int frame) - { - bool endBatch = ChangeLog.BeginNewBatch("Remove Frame: " + frame, true); - ChangeLog.AddGeneralUndo(frame, InputLogLength - 1); - - Log.RemoveAt(frame); - if (BindMarkersToInput) - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= frame); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - if (m.Frame == frame) - { - Markers.Remove(m); - } - else - { - Markers.Move(m.Frame, m.Frame - 1); - } - } - } - - ChangeLog.IsRecording = wasRecording; - } - - Changes = true; - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - // TODO: consider making this IEnumerable instead of forcing the collection to be an array - public void RemoveFrames(int[] frames) - { - if (frames.Any()) - { - var invalidateAfter = frames.Min(); - - bool endBatch = ChangeLog.BeginNewBatch("Remove Multiple Frames", true); - ChangeLog.AddGeneralUndo(invalidateAfter, InputLogLength - 1); - - foreach (var frame in frames.OrderByDescending(f => f)) // Removing them in reverse order allows us to remove by index; - { - if (frame < Log.Count) - { - Log.RemoveAt(frame); - } - - if (BindMarkersToInput) // TODO: This is slow, is there a better way to do it? - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= frame); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - if (m.Frame == frame) - { - Markers.Remove(m); - } - else - { - Markers.Move(m.Frame, m.Frame - 1); - } - } - } - - ChangeLog.IsRecording = wasRecording; - } - } - - Changes = true; - InvalidateAfter(invalidateAfter); - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - } - - public void RemoveFrames(int removeStart, int removeUpTo, bool fromHistory = false) - { - bool endBatch = ChangeLog.BeginNewBatch("Remove Frames: " + removeStart + "-" + removeUpTo, true); - ChangeLog.AddGeneralUndo(removeStart, InputLogLength - 1); - - for (int i = removeUpTo - 1; i >= removeStart; i--) - { - Log.RemoveAt(i); - } - - if (BindMarkersToInput) - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= removeStart); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - if (m.Frame < removeUpTo) - { - Markers.Remove(m); - } - else - { - Markers.Move(m.Frame, m.Frame - (removeUpTo - removeStart), fromHistory); - } - } - } - - ChangeLog.IsRecording = wasRecording; - } - - Changes = true; - InvalidateAfter(removeStart); - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - public void InsertInput(int frame, string inputState) - { - bool endBatch = ChangeLog.BeginNewBatch("Insert Frame: " + frame, true); - ChangeLog.AddGeneralUndo(frame, InputLogLength); - - Log.Insert(frame, inputState); - Changes = true; - InvalidateAfter(frame); - - if (BindMarkersToInput) - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= frame); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - Markers.Move(m.Frame, m.Frame + 1); - } - } - - ChangeLog.IsRecording = wasRecording; - } - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - public void InsertInput(int frame, IEnumerable inputLog) - { - bool endBatch = ChangeLog.BeginNewBatch("Insert Frame: " + frame, true); - ChangeLog.AddGeneralUndo(frame, InputLogLength + inputLog.Count() - 1); - - Log.InsertRange(frame, inputLog); - Changes = true; - InvalidateAfter(frame); - - if (BindMarkersToInput) - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= frame); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - Markers.Move(m.Frame, m.Frame + inputLog.Count()); - } - } - - ChangeLog.IsRecording = wasRecording; - } - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - public void InsertInput(int frame, IEnumerable inputStates) - { - // ChangeLog is done in the InsertInput call. - var lg = LogGeneratorInstance(); - - var inputLog = new List(); - - foreach (var input in inputStates) - { - lg.SetSource(input); - inputLog.Add(lg.GenerateLogEntry()); - } - - InsertInput(frame, inputLog); // Sets the ChangeLog - } - - public void CopyOverInput(int frame, IEnumerable inputStates) - { - ChangeLog.BeginNewBatch("Copy Over Input: " + frame); - var lg = LogGeneratorInstance(); - var states = inputStates.ToList(); - - if (Log.Count < states.Count + frame) - { - ExtendMovieForEdit(states.Count + frame - Log.Count); - } - - ChangeLog.AddGeneralUndo(frame, frame + inputStates.Count() - 1, "Copy Over Input: " + frame); - - for (int i = 0; i < states.Count; i++) - { - if (Log.Count <= frame + i) - { - break; - } - - lg.SetSource(states[i]); - Log[frame + i] = lg.GenerateLogEntry(); - } - - ChangeLog.EndBatch(); - Changes = true; - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - } - - public void InsertEmptyFrame(int frame, int count = 1, bool fromHistory = false) - { - bool endBatch = ChangeLog.BeginNewBatch("Insert Empty Frame: " + frame, true); - ChangeLog.AddGeneralUndo(frame, InputLogLength + count - 1); - - var lg = LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerInstance()); - - if (frame > Log.Count()) - { - frame = Log.Count(); - } - - for (int i = 0; i < count; i++) - { - Log.Insert(frame, lg.EmptyEntry); - } - - if (BindMarkersToInput) - { - bool wasRecording = ChangeLog.IsRecording; - ChangeLog.IsRecording = false; - int firstIndex = Markers.FindIndex(m => m.Frame >= frame); - if (firstIndex != -1) - { - for (int i = firstIndex; i < Markers.Count; i++) - { - TasMovieMarker m = Markers[i]; - Markers.Move(m.Frame, m.Frame + count, fromHistory); - } - } - - ChangeLog.IsRecording = wasRecording; - } - - Changes = true; - InvalidateAfter(frame); - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - private void ExtendMovieForEdit(int numFrames) - { - bool endBatch = ChangeLog.BeginNewBatch("Auto-Extend Movie", true); - int oldLength = InputLogLength; - ChangeLog.AddGeneralUndo(oldLength, oldLength + numFrames - 1); - - Global.MovieSession.MovieControllerAdapter.LatchSticky(); - - var lg = LogGeneratorInstance(); - lg.SetSource(Global.MovieOutputHardpoint); // account for autohold. needs autohold pattern to be already recorded in the current frame - - for (int i = 0; i < numFrames; i++) - { - Log.Add(lg.GenerateLogEntry()); - } - - Changes = true; - - ChangeLog.SetGeneralRedo(); - if (endBatch) - { - ChangeLog.EndBatch(); - } - } - - public void ToggleBoolState(int frame, string buttonName) - { - if (frame >= Log.Count) // Insert blank frames up to this point - { - ExtendMovieForEdit(frame - Log.Count + 1); - } - - var adapter = GetInputState(frame) as Bk2ControllerAdapter; - adapter[buttonName] = !adapter.IsPressed(buttonName); - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - Log[frame] = lg.GenerateLogEntry(); - Changes = true; - InvalidateAfter(frame); - - ChangeLog.AddBoolToggle(frame, buttonName, !adapter.IsPressed(buttonName), "Toggle " + buttonName + ": " + frame); - } - - public void SetBoolState(int frame, string buttonName, bool val) - { - if (frame >= Log.Count) // Insert blank frames up to this point - { - ExtendMovieForEdit(frame - Log.Count + 1); - } - - var adapter = GetInputState(frame) as Bk2ControllerAdapter; - var old = adapter.IsPressed(buttonName); - adapter[buttonName] = val; - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - Log[frame] = lg.GenerateLogEntry(); - - if (old != val) - { - InvalidateAfter(frame); - Changes = true; - ChangeLog.AddBoolToggle(frame, buttonName, old, "Set " + buttonName + "(" + (val ? "On" : "Off") + "): " + frame); - } - } - - public void SetBoolStates(int frame, int count, string buttonName, bool val) - { - if (Log.Count < frame + count) - { - ExtendMovieForEdit(frame + count - Log.Count); - } - - ChangeLog.AddGeneralUndo(frame, frame + count - 1, "Set " + buttonName + "(" + (val ? "On" : "Off") + "): " + frame + "-" + (frame + count - 1)); - - int changed = -1; - for (int i = 0; i < count; i++) - { - var adapter = GetInputState(frame + i) as Bk2ControllerAdapter; - bool old = adapter.IsPressed(buttonName); - adapter[buttonName] = val; - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - Log[frame + i] = lg.GenerateLogEntry(); - - if (changed == -1 && old != val) - { - changed = frame + i; - } - } - - if (changed != -1) - { - InvalidateAfter(changed); - Changes = true; - } - - ChangeLog.SetGeneralRedo(); - } - - public void SetFloatState(int frame, string buttonName, float val) - { - if (frame >= Log.Count) // Insert blank frames up to this point - { - ExtendMovieForEdit(frame - Log.Count + 1); - } - - var adapter = GetInputState(frame) as Bk2ControllerAdapter; - var old = adapter.GetFloat(buttonName); - adapter.SetFloat(buttonName, val); - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - Log[frame] = lg.GenerateLogEntry(); - - if (old != val) - { - InvalidateAfter(frame); - Changes = true; - ChangeLog.AddFloatChange(frame, buttonName, old, val, "Set " + buttonName + "(" + val + "): " + frame); - } - } - - public void SetFloatStates(int frame, int count, string buttonName, float val) - { - if (frame + count >= Log.Count) // Insert blank frames up to this point - { - ExtendMovieForEdit(frame - Log.Count + 1); - } - - ChangeLog.AddGeneralUndo(frame, frame + count - 1, "Set " + buttonName + "(" + val + "): " + frame + "-" + (frame + count - 1)); - - int changed = -1; - for (int i = 0; i < count; i++) - { - var adapter = GetInputState(frame + i) as Bk2ControllerAdapter; - float old = adapter.GetFloat(buttonName); - adapter.SetFloat(buttonName, val); - - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); - Log[frame + i] = lg.GenerateLogEntry(); - - if (changed == -1 && old != val) - { - changed = frame + i; - } - } - - if (changed != -1) - { - InvalidateAfter(changed); - Changes = true; - } - - ChangeLog.SetGeneralRedo(); - } - - #region LagLog - - public void RemoveLagHistory(int frame) - { - _lagLog.RemoveHistoryAt(frame); - } - - public void InsertLagHistory(int frame, bool isLag) - { - _lagLog.InsertHistoryAt(frame, isLag); - } - - public void SetLag(int frame, bool? value) - { - _lagLog[frame] = value; - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs deleted file mode 100644 index 9cbc90ebcb..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; - -namespace BizHawk.Client.Common -{ - public partial class TasMovie - { - public Func ClientSettingsForSave { get; set; } - public Action GetClientSettingsOnLoad { get; set; } - - protected override void Write(string fn, bool backup = false) - { - var file = new FileInfo(fn); - if (!file.Directory.Exists) - { - Directory.CreateDirectory(file.Directory.ToString()); - } - - using (var bs = new BinaryStateSaver(fn, false)) - { - bs.PutLump(BinaryStateLump.Movieheader, tw => tw.WriteLine(Header.ToString())); - bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString())); - bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); - bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(SyncSettingsJson)); - bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw)); - - // TasProj extras - bs.PutLump(BinaryStateLump.StateHistorySettings, tw => tw.WriteLine(_stateManager.Settings.ToString())); - - bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => _lagLog.Save(bw)); - bs.PutLump(BinaryStateLump.Markers, tw => tw.WriteLine(Markers.ToString())); - - if (StartsFromSavestate) - { - if (TextSavestate != null) - { - bs.PutLump(BinaryStateLump.CorestateText, (TextWriter tw) => tw.Write(TextSavestate)); - } - else - { - bs.PutLump(BinaryStateLump.Corestate, (BinaryWriter bw) => bw.Write(BinarySavestate)); - } - } - else if (StartsFromSaveRam) - { - bs.PutLump(BinaryStateLump.MovieSaveRam, (BinaryWriter bw) => bw.Write(SaveRam)); - } - - if (ClientSettingsForSave != null) - { - var clientSettingsJson = ClientSettingsForSave(); - bs.PutLump(BinaryStateLump.ClientSettings, (TextWriter tw) => tw.Write(clientSettingsJson)); - } - - if (VerificationLog.Any()) - { - bs.PutLump(BinaryStateLump.VerificationLog, tw => tw.WriteLine(InputLogToString(VerificationLog))); - } - - if (Branches.Any()) - { - Branches.Save(bs); - } - - bs.PutLump(BinaryStateLump.Session, tw => tw.WriteLine(Session.ToString())); - - if (_stateManager.Settings.SaveStateHistory && !backup) - { - bs.PutLump(BinaryStateLump.StateHistory, (BinaryWriter bw) => _stateManager.Save(bw)); - } - } - - if (!backup) - { - Changes = false; - } - } - - public override bool Load(bool preload) - { - var file = new FileInfo(Filename); - if (!file.Exists) - { - return false; - } - - using (var bl = BinaryStateLoader.LoadAndDetect(Filename, true)) - { - if (bl == null) - { - return false; - } - - ClearBeforeLoad(); - ClearTasprojExtras(); - - bl.GetLump(BinaryStateLump.Movieheader, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - var pair = line.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); - - if (pair.Length > 1) - { - Header.Add(pair[0], pair[1]); - } - } - } - }); - - bl.GetLump(BinaryStateLump.Comments, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Comments.Add(line); - } - } - }); - - bl.GetLump(BinaryStateLump.Subtitles, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Subtitles.AddFromString(line); - } - } - }); - - bl.GetLump(BinaryStateLump.SyncSettings, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - SyncSettingsJson = line; - } - } - }); - - bl.GetLump(BinaryStateLump.Input, true, delegate(TextReader tr) // Note: ExtractInputLog will clear Lag and State data potentially, this must come before loading those - { - var errorMessage = ""; - IsCountingRerecords = false; - ExtractInputLog(tr, out errorMessage); - IsCountingRerecords = true; - }); - - if (StartsFromSavestate) - { - bl.GetCoreState( - delegate(BinaryReader br, long length) - { - BinarySavestate = br.ReadBytes((int)length); - }, - delegate(TextReader tr) - { - TextSavestate = tr.ReadToEnd(); - }); - } - else if (StartsFromSaveRam) - { - bl.GetLump(BinaryStateLump.MovieSaveRam, false, - delegate(BinaryReader br, long length) - { - SaveRam = br.ReadBytes((int)length); - }); - } - - // TasMovie enhanced information - bl.GetLump(BinaryStateLump.LagLog, false, delegate(BinaryReader br, long length) - { - _lagLog.Load(br); - }); - - bl.GetLump(BinaryStateLump.StateHistorySettings, false, delegate(TextReader tr) - { - _stateManager.Settings.PopulateFromString(tr.ReadToEnd()); - }); - - bl.GetLump(BinaryStateLump.Markers, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Markers.Add(new TasMovieMarker(line)); - } - } - }); - - if (GetClientSettingsOnLoad != null) - { - string clientSettings = ""; - bl.GetLump(BinaryStateLump.ClientSettings, false, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - clientSettings = line; - } - } - }); - - if (!string.IsNullOrWhiteSpace(clientSettings)) - { - GetClientSettingsOnLoad(clientSettings); - } - } - - bl.GetLump(BinaryStateLump.VerificationLog, false, delegate(TextReader tr) - { - VerificationLog.Clear(); - while (true) - { - var line = tr.ReadLine(); - if (string.IsNullOrEmpty(line)) - { - break; - } - - if (line.StartsWith("|")) - { - VerificationLog.Add(line); - } - } - }); - - Branches.Load(bl, this); - - bl.GetLump(BinaryStateLump.Session, false, delegate(TextReader tr) - { - Session.PopulateFromString(tr.ReadToEnd()); - }); - - if (!preload) - { - if (_stateManager.Settings.SaveStateHistory) - { - bl.GetLump(BinaryStateLump.StateHistory, false, delegate(BinaryReader br, long length) - { - _stateManager.Load(br); - }); - } - - // Movie should always have a state at frame 0. - if (!StartsFromSavestate && Global.Emulator.Frame == 0) - { - _stateManager.Capture(); - } - } - } - - Changes = false; - return true; - } - - private void ClearTasprojExtras() - { - _lagLog.Clear(); - _stateManager.ClearStateHistory(); - Markers.Clear(); - ChangeLog.ClearLog(); - } - - private static string InputLogToString(IStringLog log) - { - var sb = new StringBuilder(); - foreach (var record in log) - { - sb.AppendLine(record); - } - - return sb.ToString(); - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs deleted file mode 100644 index a226d2d17f..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ /dev/null @@ -1,604 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.IO; -using System.Linq; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public sealed partial class TasMovie : Bk2Movie, INotifyPropertyChanged - { - private readonly Bk2MnemonicConstants _mnemonics = new Bk2MnemonicConstants(); - private readonly TasStateManager _stateManager; - private readonly TasLagLog _lagLog = new TasLagLog(); - private readonly Dictionary _inputStateCache = new Dictionary(); - private BackgroundWorker _progressReportWorker; - - public readonly IStringLog VerificationLog = StringLogUtil.MakeStringLog(); // For movies that do not begin with power-on, this is the input required to get into the initial state - public readonly TasBranchCollection Branches = new TasBranchCollection(); - public readonly TasSession Session; - - public new const string Extension = "tasproj"; - public const string DefaultProjectName = "default"; - public string NewBranchText { get; set; } = ""; - public int LastEditedFrame { get; set; } = -1; - public bool LastPositionStable { get; set; } = true; - public TasMovieMarkerList Markers { get; private set; } - public bool BindMarkersToInput { get; set; } - public bool UseInputCache { get; set; } - public int CurrentBranch { get; set; } - - public TasLagLog TasLagLog => _lagLog; - public IStringLog InputLog => Log; - public int BranchCount => Branches.Count; - public int LastValidFrame => _lagLog.LastValidFrame; - public override string PreferredExtension => Extension; - public TasStateManager TasStateManager => _stateManager; - - public TasMovieRecord this[int index] => new TasMovieRecord - { - // State = StateManager[index], - HasState = _stateManager.HasState(index), - LogEntry = GetInputLogEntry(index), - Lagged = _lagLog[index + 1], - WasLagged = _lagLog.History(index + 1) - }; - - public TasMovie(string path, bool startsFromSavestate = false, BackgroundWorker progressReportWorker = null) - : base(path) - { - // TODO: how to call the default constructor AND the base(path) constructor? And is base(path) calling base() ? - _progressReportWorker = progressReportWorker; - if (!Global.Emulator.HasSavestates()) - { - throw new InvalidOperationException("Cannot create a TasMovie against a core that does not implement IStatable"); - } - - ChangeLog = new TasMovieChangeLog(this); - _stateManager = new TasStateManager(this); - Session = new TasSession(this); - Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0 Tasproj v1.0"; - Markers = new TasMovieMarkerList(this); - Markers.CollectionChanged += Markers_CollectionChanged; - Markers.Add(0, startsFromSavestate ? "Savestate" : "Power on"); - BindMarkersToInput = false; - CurrentBranch = -1; - } - - public TasMovie(bool startsFromSavestate = false, BackgroundWorker progressReportWorker = null) - { - _progressReportWorker = progressReportWorker; - if (!Global.Emulator.HasSavestates()) - { - throw new InvalidOperationException("Cannot create a TasMovie against a core that does not implement IStatable"); - } - - ChangeLog = new TasMovieChangeLog(this); - _stateManager = new TasStateManager(this); - Session = new TasSession(this); - Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0 Tasproj v1.0"; - Markers = new TasMovieMarkerList(this); - Markers.CollectionChanged += Markers_CollectionChanged; - Markers.Add(0, startsFromSavestate ? "Savestate" : "Power on"); - BindMarkersToInput = false; - CurrentBranch = -1; - } - - public void NewBGWorker(BackgroundWorker newWorker) - { - _progressReportWorker = newWorker; - } - - public void ReportProgress(double percent) - { - if (percent > 100d) - { - return; - } - - _progressReportWorker?.ReportProgress((int)percent); - } - - // TODO: use LogGenerators rather than string comparisons - private int? DivergentPoint(IStringLog currentLog, IStringLog newLog) - { - int max = newLog.Count; - if (currentLog.Count < newLog.Count) - { - max = currentLog.Count; - } - - for (int i = 0; i < max; i++) - { - if (newLog[i] != currentLog[i]) - { - return i; - } - } - - return null; - } - - public override void StartNewRecording() - { - ClearTasprojExtras(); - Markers.Add(0, StartsFromSavestate ? "Savestate" : "Power on"); - ChangeLog = new TasMovieChangeLog(this); - - base.StartNewRecording(); - } - - public override void SwitchToPlay() - { - Mode = Moviemode.Play; - } - - public override void SwitchToRecord() - { - Mode = Moviemode.Record; - } - - /// - /// Removes lag log and greenzone after this frame - /// - /// The last frame that can be valid. - private void InvalidateAfter(int frame) - { - var anyInvalidated = _lagLog.RemoveFrom(frame); - _stateManager.Invalidate(frame + 1); - Changes = anyInvalidated; - LastEditedFrame = frame; - - if (anyInvalidated && Global.MovieSession.Movie.IsCountingRerecords) - { - Rerecords++; - } - } - - /// - /// Returns the mnemonic value for boolean buttons, and actual value for floats, - /// for a given frame and button. - /// - public string DisplayValue(int frame, string buttonName) - { - if (UseInputCache && _inputStateCache.ContainsKey(frame)) - { - return CreateDisplayValueForButton(_inputStateCache[frame], buttonName); - } - - var adapter = GetInputState(frame); - - if (UseInputCache) - { - _inputStateCache.Add(frame, adapter); - } - - return CreateDisplayValueForButton(adapter, buttonName); - } - - public void FlushInputCache() - { - _inputStateCache.Clear(); - } - - public string CreateDisplayValueForButton(IController adapter, string buttonName) - { - if (adapter.Definition.BoolButtons.Contains(buttonName)) - { - return adapter.IsPressed(buttonName) - ? _mnemonics[buttonName].ToString() - : ""; - } - - if (adapter.Definition.FloatControls.Contains(buttonName)) - { - return adapter.GetFloat(buttonName).ToString(); - } - - return "!"; - } - - public bool BoolIsPressed(int frame, string buttonName) - { - return ((Bk2ControllerAdapter)GetInputState(frame)) - .IsPressed(buttonName); - } - - public float GetFloatState(int frame, string buttonName) - { - return ((Bk2ControllerAdapter)GetInputState(frame)) - .GetFloat(buttonName); - } - - public void ClearGreenzone() - { - if (_stateManager.Any()) - { - _stateManager.ClearStateHistory(); - Changes = true; - } - } - - public void GreenzoneCurrentFrame() - { - if (Global.Emulator.Frame > LastValidFrame) - { - // emulated a new frame, current editing segment may change now. taseditor logic - LastPositionStable = false; - } - - _lagLog[Global.Emulator.Frame] = Global.Emulator.AsInputPollable().IsLagFrame; - - if (!_stateManager.HasState(Global.Emulator.Frame)) - { - _stateManager.Capture(Global.Emulator.Frame == LastEditedFrame - 1); - } - } - - public void ClearLagLog() - { - _lagLog.Clear(); - } - - public void DeleteLogBefore(int frame) - { - if (frame < Log.Count) - { - Log.RemoveRange(0, frame); - } - } - - public void CopyLog(IEnumerable log) - { - Log.Clear(); - foreach (var entry in log) - { - Log.Add(entry); - } - } - - public void CopyVerificationLog(IEnumerable log) - { - foreach (string entry in log) - { - VerificationLog.Add(entry); - } - } - - public IStringLog GetLogEntries() - { - return Log; - } - - private int? _timelineBranchFrame = null; - - // TODO: this is 99% copy pasting of bad code - public override bool ExtractInputLog(TextReader reader, out string errorMessage) - { - errorMessage = ""; - int? stateFrame = null; - - var newLog = new List(); - - // We are in record mode so replace the movie log with the one from the savestate - if (!Global.MovieSession.MultiTrack.IsActive) - { - _timelineBranchFrame = null; - - if (Global.Config.EnableBackupMovies && MakeBackup && Log.Count != 0) - { - SaveBackup(); - MakeBackup = false; - } - - int counter = 0; - while (true) - { - var line = reader.ReadLine(); - if (string.IsNullOrEmpty(line)) - { - break; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.StartsWith("LogKey:")) - { - LogKey = line.Replace("LogKey:", ""); - } - else if (line[0] == '|') - { - newLog.Add(line); - if (!_timelineBranchFrame.HasValue && counter < Log.Count && line != Log[counter]) - { - _timelineBranchFrame = counter; - } - - counter++; - } - } - - Log.Clear(); - Log.AddRange(newLog); - } - else // Multitrack mode - { - // TODO: consider TimelineBranchFrame here, my thinking is that there's never a scenario to invalidate state/lag data during multitrack - var i = 0; - while (true) - { - var line = reader.ReadLine(); - if (line == null) - { - break; - } - - if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay - { - var strs = line.Split('x'); - try - { - stateFrame = int.Parse(strs[1], NumberStyles.HexNumber); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.Contains("Frame ")) - { - var strs = line.Split(' '); - try - { - stateFrame = int.Parse(strs[1]); - } - catch - { - errorMessage = "Savestate Frame number failed to parse"; - return false; - } - } - else if (line.StartsWith("LogKey:")) - { - LogKey = line.Replace("LogKey:", ""); - } - else if (line.StartsWith("|")) - { - SetFrame(i, line); - i++; - } - } - } - - if (!stateFrame.HasValue) - { - errorMessage = "Savestate Frame number failed to parse"; - } - - var stateFramei = stateFrame ?? 0; - - if (stateFramei > 0 && stateFramei < Log.Count) - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(stateFramei); - } - } - else if (stateFramei > Log.Count) // Post movie savestate - { - if (!Global.Config.VBAStyleMovieLoadState) - { - Truncate(Log.Count); - } - - Mode = Moviemode.Finished; - } - - if (IsCountingRerecords) - { - Rerecords++; - } - - if (_timelineBranchFrame.HasValue) - { - _lagLog.RemoveFrom(_timelineBranchFrame.Value); - TasStateManager.Invalidate(_timelineBranchFrame.Value); - } - - return true; - } - - #region Branches - - public TasBranch GetBranch(int index) - { - if (index >= Branches.Count || index < 0) - { - return null; - } - - return Branches[index]; - } - - public TasBranch GetBranch(Guid id) - { - return Branches.SingleOrDefault(b => b.UniqueIdentifier == id); - } - - public int BranchHashByIndex(int index) - { - if (index >= Branches.Count) - { - return -1; - } - - return Branches[index].UniqueIdentifier.GetHashCode(); - } - - public int BranchIndexByHash(int hash) - { - TasBranch branch = Branches.SingleOrDefault(b => b.UniqueIdentifier.GetHashCode() == hash); - if (branch == null) - { - return -1; - } - - return Branches.IndexOf(branch); - } - - public int BranchIndexByFrame(int frame) - { - TasBranch branch = Branches - .Where(b => b.Frame == frame) - .OrderByDescending(b => b.TimeStamp) - .FirstOrDefault(); - - if (branch == null) - { - return -1; - } - - return Branches.IndexOf(branch); - } - - public void AddBranch(TasBranch branch) - { - Branches.Add(branch); - Changes = true; - } - - public void RemoveBranch(TasBranch branch) - { - Branches.Remove(branch); - Changes = true; - } - - public void LoadBranch(TasBranch branch) - { - int? divergentPoint = DivergentPoint(Log, branch.InputLog); - - Log?.Dispose(); - Log = branch.InputLog.Clone(); - - if (divergentPoint.HasValue) - { - InvalidateAfter(divergentPoint.Value); - } - else - { - InvalidateAfter(branch.InputLog.Count); - } - - if (BindMarkersToInput) // pretty critical not to erase them - { - Markers = branch.Markers; - } - - Changes = true; - } - - public void UpdateBranch(TasBranch old, TasBranch newBranch) - { - int index = Branches.IndexOf(old); - newBranch.UniqueIdentifier = old.UniqueIdentifier; - if (newBranch.UserText == "") - { - newBranch.UserText = old.UserText; - } - - Branches[index] = newBranch; - Changes = true; - } - - public void SwapBranches(int b1, int b2) - { - TasBranch branch = Branches[b1]; - - if (b2 >= Branches.Count) - { - b2 = Branches.Count - 1; - } - - Branches.Remove(branch); - Branches.Insert(b2, branch); - Changes = true; - } - - #endregion - - #region Events and Handlers - - public event PropertyChangedEventHandler PropertyChanged; - - private bool _changes; - public override bool Changes - { - get - { - return _changes; - } - - protected set - { - if (_changes != value) - { - _changes = value; - OnPropertyChanged("Changes"); - } - } - } - - // This event is Raised only when Changes is TOGGLED. - private void OnPropertyChanged(string propertyName) - { - // Raising the event when FirstName or LastName property value changed - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - private void Markers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) - { - Changes = true; - } - - public void ClearChanges() - { - Changes = false; - } - - public void FlagChanges() - { - Changes = true; - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovieRecord.cs b/BizHawk.Client.Common/movie/tasproj/TasMovieRecord.cs deleted file mode 100644 index 0351032521..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasMovieRecord.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BizHawk.Client.Common -{ - public class TasMovieRecord - { - public bool? Lagged { get; set; } - public bool? WasLagged { get; set; } - public string LogEntry { get; set; } - - public bool HasState { get; set; } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasSession.cs b/BizHawk.Client.Common/movie/tasproj/TasSession.cs deleted file mode 100644 index 4e1bc173ae..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasSession.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Text; - -namespace BizHawk.Client.Common -{ - public class TasSession - { - private readonly TasMovie _movie; - public int CurrentFrame { get; private set; } - public int CurrentBranch { get; private set; } - - public TasSession(TasMovie movie) - { - _movie = movie; - CurrentFrame = 0; - CurrentBranch = -1; - } - - public void UpdateValues() - { - CurrentFrame = Global.Emulator.Frame; - CurrentBranch = _movie.CurrentBranch; - } - - public override string ToString() - { - UpdateValues(); - - var sb = new StringBuilder(); - sb.AppendLine(CurrentFrame.ToString()); - sb.AppendLine(CurrentBranch.ToString()); - - return sb.ToString(); - } - - public void PopulateFromString(string session) - { - if (!string.IsNullOrWhiteSpace(session)) - { - string[] lines = session.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); - - CurrentFrame = lines.Length > 0 ? int.Parse(lines[0]) : 0; - - if (lines.Length > 1) - { - CurrentBranch = int.Parse(lines[1]); - } - else - { - CurrentBranch = -1; - } - } - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs deleted file mode 100644 index 3b2920814c..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ /dev/null @@ -1,556 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Common.NumberExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - /// - /// Captures savestates and manages the logic of adding, retrieving, - /// invalidating/clearing of states. Also does memory management and limiting of states - /// - public class TasStateManager : IDisposable - { - // TODO: pass this in, and find a solution to a stale reference (this is instantiated BEFORE a new core instance is made, making this one stale if it is simply set in the constructor - private IStatable Core => Global.Emulator.AsStatable(); - - public Action InvalidateCallback { get; set; } - - private void CallInvalidateCallback(int index) - { - InvalidateCallback?.Invoke(index); - } - - internal NDBDatabase NdbDatabase { get; set; } - private Guid _guid = Guid.NewGuid(); - private SortedList _states = new SortedList(); - - private string StatePath - { - get - { - var basePath = PathManager.MakeAbsolutePath(Global.Config.PathEntries["Global", "TAStudio states"].Path, null); - return Path.Combine(basePath, _guid.ToString()); - } - } - - private bool _isMountedForWrite; - private readonly TasMovie _movie; - - private StateManagerDecay _decay; - private ulong _expectedStateSize; - private int _stateFrequency; - private readonly int _minFrequency = 1; - private readonly int _maxFrequency = 16; - private int _maxStates => (int)(Settings.Cap / _expectedStateSize) + - (int)((ulong)Settings.DiskCapacitymb * 1024 * 1024 / _expectedStateSize); - private int _fileStateGap => 1 << Settings.FileStateGap; - - public TasStateManager(TasMovie movie) - { - _movie = movie; - Settings = new TasStateManagerSettings(Global.Config.DefaultTasProjSettings); - - if (_movie.StartsFromSavestate) - { - SetState(0, _movie.BinarySavestate); - } - - _decay = new StateManagerDecay(this); - } - - public void Dispose() - { - // States and BranchStates don't need cleaning because they would only contain an ndbdatabase entry which was demolished by the below - NdbDatabase?.Dispose(); - } - - public void UpdateStateFrequency() - { - _stateFrequency = NumberExtensions.Clamp( - ((int)_expectedStateSize / Settings.MemStateGapDivider / 1024), - _minFrequency, _maxFrequency); - - _decay.UpdateSettings(_maxStates, _stateFrequency, 4); - } - - /// - /// Mounts this instance for write access. Prior to that it's read-only - /// - public void MountWriteAccess() - { - if (_isMountedForWrite) - { - return; - } - - int limit = 0; - _isMountedForWrite = true; - _expectedStateSize = (ulong)Core.SaveStateBinary().Length; - UpdateStateFrequency(); - - if (_expectedStateSize > 0) - { - limit = _maxStates; - } - - _states = new SortedList(limit); - - if (_expectedStateSize > int.MaxValue) - { - throw new InvalidOperationException(); - } - - NdbDatabase = new NDBDatabase(StatePath, Settings.DiskCapacitymb * 1024 * 1024, (int)_expectedStateSize); - } - - public TasStateManagerSettings Settings { get; set; } - - /// - /// Retrieves the savestate for the given frame, - /// If this frame does not have a state currently, will return an empty array - /// - /// A savestate for the given frame or an empty array if there isn't one - public KeyValuePair this[int frame] - { - get - { - if (frame == 0) - { - return new KeyValuePair(0, InitialState); - } - - if (_states.ContainsKey(frame)) - { - return new KeyValuePair(frame, _states[frame].State); - } - - return new KeyValuePair(-1, new byte[0]); - } - } - - public byte[] InitialState - { - get - { - if (_movie.StartsFromSavestate) - { - return _movie.BinarySavestate; - } - - return _states[0].State; - } - } - - /// - /// Requests that the current emulator state be captured - /// Unless force is true, the state may or may not be captured depending on the logic employed by "greenzone" management - /// - public void Capture(bool force = false) - { - bool shouldCapture; - int frame = Global.Emulator.Frame; - - if (_movie.StartsFromSavestate && frame == 0) // Never capture frame 0 on savestate anchored movies since we have it anyway - { - shouldCapture = false; - } - else if (force) - { - shouldCapture = force; - } - else if (frame == 0) // For now, long term, TasMovie should have a .StartState property, and a tasproj file for the start state in non-savestate anchored movies - { - shouldCapture = true; - } - else if (StateIsMarker(frame)) - { - shouldCapture = true; // Markers shoudl always get priority - } - else - { - shouldCapture = frame % _stateFrequency == 0; - } - - if (shouldCapture) - { - SetState(frame, (byte[])Core.SaveStateBinary().Clone(), skipRemoval: false); - } - } - - private void MoveStateToDisk(int index) - { - Used -= (ulong)_states[index].Length; - _states[index].MoveToDisk(); - } - - private void MoveStateToMemory(int index) - { - _states[index].MoveToRAM(); - Used += (ulong)_states[index].Length; - } - - internal void SetState(int frame, byte[] state, bool skipRemoval = true) - { - if (!skipRemoval) // skipRemoval: false only when capturing new states - { - LimitStateCount(); // Remove before adding so this state won't be removed. - } - - if (_states.ContainsKey(frame)) - { - _states[frame].State = state; - } - else - { - Used += (ulong)state.Length; - _states.Add(frame, new StateManagerState(this, state, frame)); - } - } - - public bool HasState(int frame) - { - if (_movie.StartsFromSavestate && frame == 0) - { - return true; - } - - return _states.ContainsKey(frame); - } - - /// - /// Clears out all savestates after the given frame number - /// - public bool Invalidate(int frame) - { - bool anyInvalidated = false; - - if (Any()) - { - if (frame == 0) // Never invalidate frame 0 - { - frame = 1; - } - - List> statesToRemove = _states.Where(s => s.Key >= frame).ToList(); - anyInvalidated = statesToRemove.Any(); - - foreach (var state in statesToRemove) - { - RemoveState(state.Key); - } - - CallInvalidateCallback(frame); - } - - return anyInvalidated; - } - - public bool StateIsMarker(int frame) - { - if (frame == -1) - { - return false; - } - - return _movie.Markers.IsMarker(frame + 1); - } - - public bool RemoveState(int frame) - { - int index = _states.IndexOfKey(frame); - - if (frame < 1 || index < 1) - { - return false; - } - - StateManagerState state = _states.Values[index]; - - if (state.IsOnDisk) - { - state.Dispose(); - } - else - { - Used -= (ulong)state.Length; - } - - _states.RemoveAt(index); - - return true; - } - - /// - /// Deletes states to follow the state storage size limits. - /// Used after changing the settings too. - /// - public void LimitStateCount() - { - if (StateCount + 1 > _maxStates || DiskUsed > (ulong)Settings.DiskCapacitymb * 1024 * 1024) - { - _decay.Trigger(StateCount + 1 - _maxStates); - } - } - - private List ExcludeStates() - { - List ret = new List(); - ulong saveUsed = Used + DiskUsed; - - // respect state gap no matter how small the resulting size will be - // still leave marker states - for (int i = 1; i < _states.Count; i++) - { - int frame = GetStateFrameByIndex(i); - - if (StateIsMarker(frame) || frame % _fileStateGap < _stateFrequency) - { - continue; - } - - ret.Add(i); - - if (_states.Values[i].IsOnDisk) - { - saveUsed -= _expectedStateSize; - } - else - { - saveUsed -= (ulong)_states.Values[i].Length; - } - } - - // if the size is still too big, exclude states form the beginning - // still leave marker states - int index = 0; - while (saveUsed > (ulong)Settings.DiskSaveCapacitymb * 1024 * 1024) - { - do - { - if (++index >= _states.Count) - { - break; - } - } - while (StateIsMarker(GetStateFrameByIndex(index))); - - if (index >= _states.Count) - { - break; - } - - ret.Add(index); - - if (_states.Values[index].IsOnDisk) - { - saveUsed -= _expectedStateSize; - } - else - { - saveUsed -= (ulong)_states.Values[index].Length; - } - } - - // if there are enough markers to still be over the limit, remove marker frames - index = 0; - while (saveUsed > (ulong)Settings.DiskSaveCapacitymb * 1024 * 1024) - { - if (!ret.Contains(++index)) - { - ret.Add(index); - } - - if (_states.Values[index].IsOnDisk) - { - saveUsed -= _expectedStateSize; - } - else - { - saveUsed -= (ulong)_states.Values[index].Length; - } - } - - return ret; - } - - public void ClearStateHistory() - { - if (_states.Any()) - { - StateManagerState power = _states.Values.First(s => s.Frame == 0); - _states.Clear(); - SetState(0, power.State); - Used = (ulong)power.State.Length; - NdbDatabase?.Clear(); - } - } - - // Map: - // 4 bytes - total savestate count - // [Foreach state] - // 4 bytes - frame - // 4 bytes - length of savestate - // 0 - n savestate - public void Save(BinaryWriter bw) - { - List noSave = ExcludeStates(); - bw.Write(_states.Count - noSave.Count); - - for (int i = 0; i < _states.Count; i++) - { - if (noSave.Contains(i)) - { - continue; - } - - bw.Write(_states.Keys[i]); - bw.Write(_states.Values[i].Length); - bw.Write(_states.Values[i].State); - } - } - - public void Load(BinaryReader br) - { - _states.Clear(); - - try - { - int nstates = br.ReadInt32(); - - for (int i = 0; i < nstates; i++) - { - int frame = br.ReadInt32(); - int len = br.ReadInt32(); - byte[] data = br.ReadBytes(len); - - // whether we should allow state removal check here is an interesting question - // nothing was edited yet, so it might make sense to show the project untouched first - SetState(frame, data); - } - } - catch (EndOfStreamException) - { - } - } - - public KeyValuePair GetStateClosestToFrame(int frame) - { - var s = _states.LastOrDefault(state => state.Key < frame); - - return this[s.Key]; - } - - /// - /// Returns index of the state right above the given frame - /// - /// - /// - public int GetStateIndexByFrame(int frame) - { - return _states.IndexOfKey(GetStateClosestToFrame(frame).Key); - } - - /// - /// Returns frame of the state at the given index - /// - /// - /// - public int GetStateFrameByIndex(int index) - { - // feos: this is called super often by decay - // this method is hundred times faster than _states.ElementAt(index).Key - return _states.Keys[index]; - } - - private ulong _used; - private ulong Used - { - get - { - return _used; - } - - set - { - // TODO: Shouldn't we throw an exception? Debug.Fail only runs in debug mode? - if (value > 0xf000000000000000) - { - System.Diagnostics.Debug.Fail("ulong Used underfow!"); - } - else - { - _used = value; - } - } - } - - private ulong DiskUsed - { - get - { - if (NdbDatabase == null) - { - return 0; - } - - return (ulong)NdbDatabase.Consumed; - } - } - - public int StateCount => _states.Count; - public int LastEditedFrame => _movie.LastEditedFrame; - - public bool Any() - { - if (_movie.StartsFromSavestate) - { - return _states.Count > 0; - } - - return _states.Count > 1; - } - - public int LastKey - { - get - { - if (_states.Count == 0) - { - return 0; - } - - return _states.Last().Key; - } - } - - public int LastStatedFrame - { - get - { - if (StateCount > 0) - { - return LastKey; - } - - return 0; - } - } - - private int FindState(StateManagerState s) - { - if (!_states.ContainsValue(s)) - { - return -1; - } - - return s.Frame; - } - } -} diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs deleted file mode 100644 index 7a7f07ea14..0000000000 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.ComponentModel; -using System.Text; -using Newtonsoft.Json; - -namespace BizHawk.Client.Common -{ - public class TasStateManagerSettings - { - public TasStateManagerSettings() - { - DiskSaveCapacitymb = 512; - Capacitymb = 512; - DiskCapacitymb = 1; // not working yet - MemStateGapDivider = 64; - FileStateGap = 4; - } - - public TasStateManagerSettings(TasStateManagerSettings settings) - { - DiskSaveCapacitymb = settings.DiskSaveCapacitymb; - Capacitymb = settings.Capacitymb; - DiskCapacitymb = settings.DiskCapacitymb; - MemStateGapDivider = settings.MemStateGapDivider; - FileStateGap = settings.FileStateGap; - } - - /// - /// Whether or not to save state history information to disk - /// - [DisplayName("Save History")] - [Description("Whether or not to use savestate history")] - public bool SaveStateHistory => DiskSaveCapacitymb != 0; - - /// - /// Gets or sets the size limit to use when saving the TAS project to disk. - /// - [DisplayName("Save Capacity (in megabytes)")] - [Description("The size limit to use when saving the tas project to disk.")] - public int DiskSaveCapacitymb { get; set; } - - /// - /// Gets or sets the total amount of memory to devote to state history in megabytes - /// - [DisplayName("Capacity (in megabytes)")] - [Description("The size limit of the state history buffer. When this limit is reached it will start moving to disk.")] - public int Capacitymb { get; set; } - - /// - /// Gets or sets the total amount of disk space to devote to state history in megabytes - /// - [DisplayName("Disk Capacity (in megabytes)")] - [Description("The size limit of the state history buffer on the disk. When this limit is reached it will start removing previous savestates")] - public int DiskCapacitymb { get; set; } - - /// - /// Gets or sets the divider that determines memory state gap - /// - [DisplayName("Divider for memory state interval")] - [Description("The actual state gap in frames is calculated as ExpectedStateSize / div / 1024")] - public int MemStateGapDivider { get; set; } - - /// - /// Gets or sets the amount of states to skip during project saving - /// - [DisplayName("State interval for .tasproj")] - [Description("The actual state gap in frames is calculated as Nth power on 2")] - public int FileStateGap { get; set; } - - /// - /// The total state capacity in bytes. - /// - [JsonIgnore] - [Browsable(false)] - public ulong CapTotal => (ulong)(Capacitymb + DiskCapacitymb) * 1024UL * 1024UL; - - /// - /// The memory state capacity in bytes. - /// - [JsonIgnore] - [Browsable(false)] - public ulong Cap => (ulong)Capacitymb * 1024UL * 1024UL; - - public override string ToString() - { - var sb = new StringBuilder(); - - sb.AppendLine(DiskSaveCapacitymb.ToString()); - sb.AppendLine(Capacitymb.ToString()); - sb.AppendLine(DiskCapacitymb.ToString()); - sb.AppendLine(FileStateGap.ToString()); - sb.AppendLine(MemStateGapDivider.ToString()); - - return sb.ToString(); - } - - public void PopulateFromString(string settings) - { - if (!string.IsNullOrWhiteSpace(settings)) - { - try - { - string[] lines = settings.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); - Capacitymb = int.Parse(lines[1]); - int refCapacity; - - if (!int.TryParse(lines[0], out refCapacity)) - { - DiskSaveCapacitymb = bool.Parse(lines[0]) ? Capacitymb : 0; - } - else - { - DiskSaveCapacitymb = refCapacity; - } - - int i = 2; - - DiskCapacitymb = lines.Length > i ? int.Parse(lines[i++]) : 1; - FileStateGap = lines.Length > i ? int.Parse(lines[i++]) : 4; - MemStateGapDivider = lines.Length > i ? int.Parse(lines[i++]) : 64; - } - catch (Exception) // TODO: this is bad - { - // "GreenZoneSettings inconsistent, ignoring" - // if we don't catch it, the project won't load - // but dialog boxes aren't supposed to exist here? - } - } - } - } -} diff --git a/BizHawk.Client.Common/rewind/Rewinder.cs b/BizHawk.Client.Common/rewind/Rewinder.cs deleted file mode 100644 index 69d3e8a2a6..0000000000 --- a/BizHawk.Client.Common/rewind/Rewinder.cs +++ /dev/null @@ -1,395 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public class Rewinder - { - private const int MaxByteArraySize = 0x7FFFFFC7; // .NET won't let us allocate more than this in one array - - private StreamBlobDatabase _rewindBuffer; - private byte[] _rewindBufferBacking; - private long _memoryLimit = MaxByteArraySize; - private RewindThreader _rewindThread; - private byte[] _lastState; - private bool _rewindDeltaEnable; - private bool _lastRewindLoadedState; - private byte[] _deltaBuffer = new byte[0]; - - public Action MessageCallback { get; set; } - - public bool RewindActive => RewindEnabled && !SuspendRewind; - - private bool RewindEnabled { get; set; } - - public bool SuspendRewind { get; set; } - - public float FullnessRatio => _rewindBuffer?.FullnessRatio ?? 0; - - public int Count => _rewindBuffer?.Count ?? 0; - - public long Size => _rewindBuffer?.Size ?? 0; - - public bool HasBuffer => _rewindBuffer != null; - - public int RewindFrequency { get; private set; } - - public void Initialize() - { - Uninitialize(); - - if (Global.Emulator.HasSavestates()) - { - int stateSize = Global.Emulator.AsStatable().SaveStateBinary().Length; - - if (stateSize >= Global.Config.Rewind_LargeStateSize) - { - RewindEnabled = Global.Config.RewindEnabledLarge; - RewindFrequency = Global.Config.RewindFrequencyLarge; - } - else if (stateSize >= Global.Config.Rewind_MediumStateSize) - { - RewindEnabled = Global.Config.RewindEnabledMedium; - RewindFrequency = Global.Config.RewindFrequencyMedium; - } - else - { - RewindEnabled = Global.Config.RewindEnabledSmall; - RewindFrequency = Global.Config.RewindFrequencySmall; - } - } - - DoMessage(RewindEnabled ? - $"Rewind enabled, frequency: {RewindFrequency}" : - "Rewind disabled"); - - _rewindDeltaEnable = Global.Config.Rewind_UseDelta; - - if (RewindActive) - { - var capacity = Global.Config.Rewind_BufferSize * (long)1024 * 1024; - - _rewindBuffer = new StreamBlobDatabase(Global.Config.Rewind_OnDisk, capacity, BufferManage); - - _rewindThread = new RewindThreader(CaptureInternal, RewindInternal, Global.Config.Rewind_IsThreaded); - } - } - - public void Uninitialize() - { - if (_rewindThread != null) - { - _rewindThread.Dispose(); - _rewindThread = null; - } - - if (_rewindBuffer != null) - { - _rewindBuffer.Dispose(); - _rewindBuffer = null; - } - - Clear(); - - RewindEnabled = false; - RewindFrequency = 0; - } - - public void Clear() - { - _rewindBuffer?.Clear(); - _lastState = new byte[0]; - } - - private void DoMessage(string message) - { - MessageCallback?.Invoke(message); - } - - private byte[] BufferManage(byte[] inbuf, ref long size, bool allocate) - { - if (!allocate) - { - _rewindBufferBacking = inbuf; - return null; - } - - size = Math.Min(size, _memoryLimit); - - // if we have an appropriate buffer free, return it - var buf = _rewindBufferBacking; - _rewindBufferBacking = null; - if (buf != null && buf.LongLength == size) - { - return buf; - } - - // otherwise, allocate it - do - { - try - { - return new byte[size]; - } - catch (OutOfMemoryException) - { - size /= 2; - _memoryLimit = size; - } - } - while (size > 1); - throw new OutOfMemoryException(); - } - - public void Capture() - { - if (!RewindActive) - { - return; - } - - if (_rewindThread == null) - { - Initialize(); - } - - if (_rewindThread == null || Global.Emulator.Frame % RewindFrequency != 0) - { - return; - } - - _rewindThread.Capture(Global.Emulator.AsStatable().SaveStateBinary()); - } - - private void CaptureInternal(byte[] coreSavestate) - { - if (_rewindDeltaEnable) - { - CaptureStateDelta(coreSavestate); - } - else - { - CaptureStateNonDelta(coreSavestate); - } - } - - private void CaptureStateNonDelta(byte[] state) - { - long offset = _rewindBuffer.Enqueue(0, state.Length + 1); - var stream = _rewindBuffer.Stream; - stream.Position = offset; - - // write the header for a non-delta frame - stream.WriteByte(1); // Full state = true - stream.Write(state, 0, state.Length); - } - - private void UpdateLastState(byte[] state, int index, int length) - { - if (_lastState.Length != length) - { - _lastState = new byte[length]; - } - - Buffer.BlockCopy(state, index, _lastState, 0, length); - } - - private void UpdateLastState(byte[] state) - { - UpdateLastState(state, 0, state.Length); - } - - private unsafe void CaptureStateDelta(byte[] currentState) - { - // Keep in mind that everything captured here is intended to be played back in - // reverse. The goal is, given the current state, how to get back to the previous - // state. That's why the data portion of the delta comes from the previous state, - // and also why the previous state is used if we have to bail out and capture the - // full state instead. - if (currentState.Length != _lastState.Length) - { - // If the state sizes mismatch, capture a full state rather than trying to do anything clever - goto CaptureFullState; - } - - if (currentState.Length == 0) - { - // handle empty states as a "full" (empty) state - goto CaptureFullState; - } - - int index = 0; - int stateLength = Math.Min(currentState.Length, _lastState.Length); - bool inChangeSequence = false; - int changeSequenceStartOffset = 0; - int lastChangeSequenceStartOffset = 0; - - if (_deltaBuffer.Length < stateLength + 1) - { - _deltaBuffer = new byte[stateLength + 1]; - } - - _deltaBuffer[index++] = 0; // Full state = false (i.e. delta) - - fixed (byte* pCurrentState = ¤tState[0]) - fixed (byte* pLastState = &_lastState[0]) - for (int i = 0; i < stateLength; i++) - { - bool thisByteMatches = *(pCurrentState + i) == *(pLastState + i); - - if (inChangeSequence == false) - { - if (thisByteMatches) - { - continue; - } - - inChangeSequence = true; - changeSequenceStartOffset = i; - } - - if (thisByteMatches || i == stateLength - 1) - { - const int MaxHeaderSize = 10; - int length = i - changeSequenceStartOffset + (thisByteMatches ? 0 : 1); - - if (index + length + MaxHeaderSize >= stateLength) - { - // If the delta ends up being larger than the full state, capture the full state instead - goto CaptureFullState; - } - - // Offset Delta - VLInteger.WriteUnsigned((uint)(changeSequenceStartOffset - lastChangeSequenceStartOffset), _deltaBuffer, ref index); - - // Length - VLInteger.WriteUnsigned((uint)length, _deltaBuffer, ref index); - - // Data - Buffer.BlockCopy(_lastState, changeSequenceStartOffset, _deltaBuffer, index, length); - index += length; - - inChangeSequence = false; - lastChangeSequenceStartOffset = changeSequenceStartOffset; - } - } - - _rewindBuffer.Push(new ArraySegment(_deltaBuffer, 0, index)); - - UpdateLastState(currentState); - return; - - CaptureFullState: - CaptureStateNonDelta(_lastState); - UpdateLastState(currentState); - } - - public bool Rewind(int frames) - { - if (!RewindActive || _rewindThread == null) - { - return false; - } - - _rewindThread.Rewind(frames); - - return _lastRewindLoadedState; - } - - private void RewindInternal(int frames) - { - _lastRewindLoadedState = false; - - for (int i = 0; i < frames; i++) - { - // Always leave the first item in the rewind buffer. For full states, once there's - // one item remaining, we've already gone back as far as possible because the code - // to load the previous state has already peeked at the first item after removing - // the second item. We want to hold on to the first item anyway since it's a copy - // of the current state (see comment in the following method). For deltas, since - // each one records how to get back to the previous state, once we've gone back to - // the second item, it's already resulted in the first state being loaded. The - // first item is just a junk entry with the initial value of _lastState (0 bytes). - if (_rewindBuffer.Count <= 1 || (Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.InputLogLength == 0)) - { - break; - } - - LoadPreviousState(); - _lastRewindLoadedState = true; - } - } - - private MemoryStream GetPreviousStateMemoryStream() - { - if (_rewindDeltaEnable) - { - // When capturing deltas, the most recent state is stored in _lastState, and the - // last item in the rewind buffer gets us back to the previous state. - return _rewindBuffer.PopMemoryStream(); - } - else - { - // When capturing full states, the last item in the rewind buffer is the most - // recent state, so we need to get the item before it. - _rewindBuffer.Pop(); - return _rewindBuffer.PeekMemoryStream(); - } - - // Note that in both cases, after loading the state, we still have a copy of it - // either in _lastState or as the last item in the rewind buffer. This is good - // because once we resume capturing, the first capture doesn't happen until - // stepping forward to the following frame, which would result in a gap if we - // didn't still have a copy of the current state here. - } - - private void LoadPreviousState() - { - using (var reader = new BinaryReader(GetPreviousStateMemoryStream())) - { - byte[] buf = ((MemoryStream)reader.BaseStream).GetBuffer(); - bool fullState = reader.ReadByte() == 1; - if (_rewindDeltaEnable) - { - if (fullState) - { - UpdateLastState(buf, 1, buf.Length - 1); - } - else - { - int index = 1; - int offset = 0; - - while (index < buf.Length) - { - int offsetDelta = (int)VLInteger.ReadUnsigned(buf, ref index); - int length = (int)VLInteger.ReadUnsigned(buf, ref index); - - offset += offsetDelta; - - Buffer.BlockCopy(buf, index, _lastState, offset, length); - index += length; - } - } - - using (var lastStateReader = new BinaryReader(new MemoryStream(_lastState))) - { - Global.Emulator.AsStatable().LoadStateBinary(lastStateReader); - } - } - else - { - if (!fullState) - { - throw new InvalidOperationException(); - } - - Global.Emulator.AsStatable().LoadStateBinary(reader); - } - } - } - } -} diff --git a/BizHawk.Client.Common/tools/CheatList.cs b/BizHawk.Client.Common/tools/CheatList.cs deleted file mode 100644 index 1ec255a96e..0000000000 --- a/BizHawk.Client.Common/tools/CheatList.cs +++ /dev/null @@ -1,736 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -namespace BizHawk.Client.Common -{ - public class CheatCollection : ICollection - { - private const string NameColumn = "NamesColumn"; - private const string AddressColumn = "AddressColumn"; - private const string ValueColumn = "ValueColumn"; - private const string CompareColumn = "CompareColumn"; - private const string OnColumn = "OnColumn"; - private const string DomainColumn = "DomainColumn"; - private const string SizeColumn = "SizeColumn"; - private const string EndianColumn = "EndianColumn"; - private const string TypeColumn = "DisplayTypeColumn"; - private const string ComparisonType = "ComparisonTypeColumn"; - - private List _cheatList = new List(); - private string _currentFileName = ""; - private string _defaultFileName = ""; - private bool _changes; - - public delegate void CheatListEventHandler(object sender, CheatListEventArgs e); - public event CheatListEventHandler Changed; - - public int Count => _cheatList.Count; - - public int CheatCount - { - get { return _cheatList.Count(c => !c.IsSeparator); } - } - - public int ActiveCount - { - get { return _cheatList.Count(c => c.Enabled); } - } - - public bool Changes - { - get - { - return _changes; - } - - set - { - _changes = value; - if (value) - { - CheatChanged(Cheat.Separator); // Pass a dummy, no cheat invoked this change - } - } - } - - public string CurrentFileName => _currentFileName; - - public bool IsReadOnly => false; - - public Cheat this[int index] => _cheatList[index]; - - public Cheat this[MemoryDomain domain, long address] - { - get - { - return _cheatList.FirstOrDefault(cheat => cheat.Domain == domain && cheat.Address == address); - } - } - - public IEnumerator GetEnumerator() - { - return _cheatList.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Pulse() - { - _cheatList.ForEach(cheat => cheat.Pulse()); - } - - /// - /// Looks for a .cht file that matches the ROM loaded based on the default filename for a given ROM - /// - public bool AttemptToLoadCheatFile() - { - var file = new FileInfo(_defaultFileName); - - if (file.Exists) - { - return Load(file.FullName, false); - } - - return false; - } - - public void NewList(string defaultFileName, bool autosave = false) - { - _defaultFileName = defaultFileName; - - if (_cheatList.Any() && _changes && autosave) - { - if (string.IsNullOrEmpty(_currentFileName)) - { - _currentFileName = _defaultFileName; - } - - Save(); - } - - _cheatList.Clear(); - _currentFileName = ""; - Changes = false; - } - - public void Add(Cheat cheat) - { - if (cheat.IsSeparator) - { - _cheatList.Add(cheat); - } - else - { - cheat.Changed += CheatChanged; - if (Contains(cheat)) - { - _cheatList.Remove(Global.CheatList.FirstOrDefault(c => c.Domain == cheat.Domain && c.Address == cheat.Address)); - } - - _cheatList.Add(cheat); - } - - Changes = true; - } - - public void AddRange(IEnumerable cheats) - { - _cheatList.AddRange( - cheats.Where(c => !_cheatList.Contains(c))); - Changes = true; - } - - public void Insert(int index, Cheat cheat) - { - cheat.Changed += CheatChanged; - if (_cheatList.Any(c => c.Domain == cheat.Domain && c.Address == cheat.Address)) - { - _cheatList.First(c => c.Domain == cheat.Domain && c.Address == cheat.Address).Enable(); - } - else - { - _cheatList.Insert(index, cheat); - } - - Changes = true; - } - - public bool Exchange(Cheat oldCheat, Cheat newCheat) - { - int index = _cheatList.IndexOf(oldCheat); - if (index == -1) - { - return false; - } - - _cheatList[index] = newCheat; - Changes = true; - - return true; - } - - public bool Remove(Cheat cheat) - { - var result = _cheatList.Remove(cheat); - if (result) - { - Changes = true; - return true; - } - - return false; - } - - public bool Remove(Watch watch) - { - var cheat = _cheatList.FirstOrDefault(c => c == watch); - if (cheat != (Cheat)null) - { - _cheatList.Remove(cheat); - Changes = true; - return true; - } - - return false; - } - - public bool Contains(Cheat cheat) - { - return _cheatList.Any(c => c == cheat); - } - - public bool Contains(MemoryDomain domain, long address) - { - return _cheatList.Any(c => c.Domain == domain && c.Address == address); - } - - public void CopyTo(Cheat[] array, int arrayIndex) - { - _cheatList.CopyTo(array, arrayIndex); - } - - public void RemoveRange(IEnumerable cheats) - { - foreach (var cheat in cheats.ToList()) - { - _cheatList.Remove(cheat); - } - - Changes = true; - } - - public void RemoveRange(IEnumerable watches) - { - var removeList = _cheatList.Where(cheat => watches.Any(w => w == cheat)).ToList(); - foreach (var cheat in removeList) - { - _cheatList.Remove(cheat); - } - - Changes = true; - } - - public void RemoveAll() - { - _cheatList.Clear(); - Changes = true; - } - - public void Clear() - { - _cheatList.Clear(); - Changes = true; - } - - public void DisableAll() - { - _cheatList.ForEach(c => c.Disable(false)); - Changes = true; - } - - public void EnableAll() - { - _cheatList.ForEach(c => c.Enable(false)); - Changes = true; - } - - public bool IsActive(MemoryDomain domain, long address) - { - return _cheatList.Any(cheat => - !cheat.IsSeparator && - cheat.Enabled && - cheat.Domain == domain - && cheat.Contains(address)); - } - - /// - /// Returns the value of a given byte in a cheat, If the cheat is a single byte this will be the same indexing the cheat, - /// But if the cheat is multi-byte, this will return just the cheat value for that specific byte - /// - /// Returns null if address is not a part of a cheat, else returns the value of that specific byte only - public byte? GetByteValue(MemoryDomain domain, long addr) - { - var activeCheat = _cheatList.FirstOrDefault(cheat => cheat.Contains(addr)); - if (activeCheat == (Cheat)null) - { - return null; - } - - return activeCheat.GetByteVal(addr); - } - - /// - /// Returns the value of a given cheat, or a partial value of a multi-byte cheat - /// Note that address + size MUST NOT exceed the range of the cheat or undefined behavior will occur - /// - /// The to apply cheats to - /// The starting address for which you will get the number of bytes - /// The number of bytes of the cheat to return - /// The value, or null if it can't resolve the address with a given cheat - public int? GetCheatValue(MemoryDomain domain, long addr, WatchSize size) - { - var activeCheat = _cheatList.FirstOrDefault(cheat => cheat.Contains(addr)); - if (activeCheat == (Cheat)null) - { - return null; - } - - switch (activeCheat.Size) - { - default: - case WatchSize.Byte: - return activeCheat.Value; - case WatchSize.Word: - if (size == WatchSize.Byte) - { - return GetByteValue(domain, addr); - } - - return activeCheat.Value; - case WatchSize.DWord: - if (size == WatchSize.Byte) - { - return GetByteValue(domain, addr); - } - else if (size == WatchSize.Word) - { - if (activeCheat.Address == addr) - { - return (activeCheat.Value.Value >> 16) & 0xFFFF; - } - - return activeCheat.Value.Value & 0xFFFF; - } - - return activeCheat.Value; - } - } - - public void SaveOnClose() - { - if (Global.Config.CheatsAutoSaveOnClose) - { - if (Changes && _cheatList.Any()) - { - if (string.IsNullOrWhiteSpace(_currentFileName)) - { - _currentFileName = _defaultFileName; - } - - SaveFile(_currentFileName); - } - else if (!_cheatList.Any() && !string.IsNullOrWhiteSpace(_currentFileName)) - { - new FileInfo(_currentFileName).Delete(); - } - } - } - - public bool Save() - { - if (string.IsNullOrWhiteSpace(_currentFileName)) - { - _currentFileName = _defaultFileName; - } - - return SaveFile(_currentFileName); - } - - public bool SaveFile(string path) - { - try - { - var file = new FileInfo(path); - if (file.Directory != null && !file.Directory.Exists) - { - file.Directory.Create(); - } - - using (var sw = new StreamWriter(path)) - { - var sb = new StringBuilder(); - - foreach (var cheat in _cheatList) - { - if (cheat.IsSeparator) - { - sb.AppendLine("----"); - } - else - { - // Set to hex for saving - cheat.SetType(DisplayType.Hex); - - sb - .Append(cheat.AddressStr).Append('\t') - .Append(cheat.ValueStr).Append('\t') - .Append(cheat.Compare?.ToString() ?? "N").Append('\t') - .Append(cheat.Domain != null ? cheat.Domain.Name : "").Append('\t') - .Append(cheat.Enabled ? '1' : '0').Append('\t') - .Append(cheat.Name).Append('\t') - .Append(cheat.SizeAsChar).Append('\t') - .Append(cheat.TypeAsChar).Append('\t') - .Append((cheat.BigEndian ?? false) ? '1' : '0').Append('\t') - .Append(cheat.ComparisonType).Append('\t') - .AppendLine(); - } - } - - sw.WriteLine(sb.ToString()); - } - - _currentFileName = path; - Global.Config.RecentCheats.Add(_currentFileName); - Changes = false; - return true; - } - catch - { - return false; - } - } - - public bool Load(string path, bool append) - { - var file = new FileInfo(path); - if (file.Exists == false) - { - return false; - } - - if (!append) - { - _currentFileName = path; - } - - using (var sr = file.OpenText()) - { - if (!append) - { - Clear(); - } - - string s; - while ((s = sr.ReadLine()) != null) - { - try - { - if (s == "----") - { - _cheatList.Add(Cheat.Separator); - } - else - { - int? compare; - var size = WatchSize.Byte; - var type = DisplayType.Hex; - var bigendian = false; - Cheat.CompareType comparisonType = Cheat.CompareType.None; - - if (s.Length < 6) - { - continue; - } - - var vals = s.Split('\t'); - var address = int.Parse(vals[0], NumberStyles.HexNumber); - var value = int.Parse(vals[1], NumberStyles.HexNumber); - - if (vals[2] == "N") - { - compare = null; - } - else - { - compare = int.Parse(vals[2], NumberStyles.HexNumber); - } - - var domain = Global.Emulator.AsMemoryDomains()[vals[3]]; - var enabled = vals[4] == "1"; - var name = vals[5]; - - // For backwards compatibility, don't assume these values exist - if (vals.Length > 6) - { - size = Watch.SizeFromChar(vals[6][0]); - type = Watch.DisplayTypeFromChar(vals[7][0]); - bigendian = vals[8] == "1"; - } - - // For backwards compatibility, don't assume these values exist - if (vals.Length > 9) - { - if (!Enum.TryParse(vals[9], out comparisonType)) - { - continue; // Not sure if this is the best answer, could just resort to == - } - } - - var watch = Watch.GenerateWatch( - domain, - address, - size, - type, - bigendian, - name); - - Add(new Cheat(watch, value, compare, !Global.Config.DisableCheatsOnLoad && enabled, comparisonType)); - } - } - catch - { - continue; - } - } - } - - Changes = false; - return true; - } - - public void Sort(string column, bool reverse) - { - switch (column) - { - case NameColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case AddressColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Address ?? 0) - .ThenBy(c => c.Name) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Address ?? 0) - .ThenBy(c => c.Name) - .ToList(); - } - - break; - case ValueColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Value ?? 0) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Value ?? 0) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case CompareColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Compare ?? 0) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Compare ?? 0) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case OnColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Enabled) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Enabled) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case DomainColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Domain) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Domain) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case SizeColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => ((int)c.Size)) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => ((int)c.Size)) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case EndianColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.BigEndian) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.BigEndian) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case TypeColumn: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.Type) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.Type) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - case ComparisonType: - if (reverse) - { - _cheatList = _cheatList - .OrderByDescending(c => c.ComparisonType) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - else - { - _cheatList = _cheatList - .OrderBy(c => c.ComparisonType) - .ThenBy(c => c.Name) - .ThenBy(c => c.Address ?? 0) - .ToList(); - } - - break; - } - } - - public void SetDefaultFileName(string defaultFileName) - { - _defaultFileName = defaultFileName; - } - - private void CheatChanged(object sender) - { - Changed?.Invoke(this, new CheatListEventArgs(sender as Cheat)); - _changes = true; - } - - public class CheatListEventArgs : EventArgs - { - public CheatListEventArgs(Cheat c) - { - Cheat = c; - } - - public Cheat Cheat { get; private set; } - } - } -} diff --git a/BizHawk.Client.Common/tools/Interfaces/IToolForm.cs b/BizHawk.Client.Common/tools/Interfaces/IToolForm.cs deleted file mode 100644 index 2ed987ffd2..0000000000 --- a/BizHawk.Client.Common/tools/Interfaces/IToolForm.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - public enum ToolFormUpdateType - { - // reserved - Legacy, LegacyFast, - - // reserved concept: we can run other events through here (should probably rename then) - Reset, - - /// - /// Called before a frame emulates - /// - PreFrame, - - /// - /// Called after a frame emulates - /// - PostFrame - } - - public interface IToolForm - { - /// - /// Will be called by the client anytime an Update needs to occur, such as after an emulated frame, a loadstate, or a related dialog has made a relevant change - /// - void UpdateValues(); - - /// - /// A new extensible update method - /// - void NewUpdate(ToolFormUpdateType type); - - /// - /// Will be called by the client when performance is critical, - /// The tool should only do the minimum to still function, - /// Drawing should not occur if possible, during a fast update - /// - void FastUpdate(); - - /// - /// Will be called anytime the dialog needs to be restarted, such as when a new ROM is loaded - /// The tool implementing this needs to account for a Game and Core change - /// - void Restart(); - - /// - /// This gives the opportunity for the tool dialog to ask the user to save changes (such is necessary when - /// This tool dialog edits a file. Returning false will tell the client the user wants to cancel the given action, - /// Return false to tell the client to back out of an action (such as closing the emulator) - /// - bool AskSaveChanges(); - - /// - /// Indicates whether the tool should be updated before a frame loop or after. - /// In general, tools that draw graphics from the core should update before the loop, - /// Information tools such as those that display core ram values should be after. - /// AWESOME! no separate preupdate and postupdate hooks. seriously? - /// - bool UpdateBefore { get; } - - // Necessary winform calls - bool Focus(); - bool ContainsFocus { get; } - void Show(); - void Close(); - bool IsDisposed { get; } - bool IsHandleCreated { get; } - } -} diff --git a/BizHawk.Client.Common/tools/RamSearchEngine.cs b/BizHawk.Client.Common/tools/RamSearchEngine.cs deleted file mode 100644 index 945312ff44..0000000000 --- a/BizHawk.Client.Common/tools/RamSearchEngine.cs +++ /dev/null @@ -1,1166 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Common.CollectionExtensions; -using BizHawk.Emulation.Common; - -// ReSharper disable PossibleInvalidCastExceptionInForeachLoop -namespace BizHawk.Client.Common -{ - public class RamSearchEngine - { - public enum ComparisonOperator - { - Equal, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, NotEqual, DifferentBy - } - - public enum Compare - { - Previous, SpecificValue, SpecificAddress, Changes, Difference - } - - private int? _differentBy; // zero 07-sep-2014 - this isnt ideal. but dont bother changing it (to a long, for instance) until it can support floats. maybe store it as a double here. - - private Compare _compareTo = Compare.Previous; - private long? _compareValue; - private ComparisonOperator _operator = ComparisonOperator.Equal; - - private List _watchList = new List(); - private readonly Settings _settings; - private readonly UndoHistory _history = new UndoHistory(true); - private bool _keepHistory = true; - private bool _isSorted = true; // Tracks whether or not the list is sorted by address, if it is, binary search can be used for finding watches - - public RamSearchEngine(Settings settings, IMemoryDomains memoryDomains) - { - _settings = new Settings(memoryDomains) - { - Mode = settings.Mode, - Domain = settings.Domain, - Size = settings.Size, - CheckMisAligned = settings.CheckMisAligned, - Type = settings.Type, - BigEndian = settings.BigEndian, - PreviousType = settings.PreviousType - }; - } - - public RamSearchEngine(Settings settings, IMemoryDomains memoryDomains, Compare compareTo, long? compareValue, int? differentBy) - : this(settings, memoryDomains) - { - _compareTo = compareTo; - _differentBy = differentBy; - _compareValue = compareValue; - } - - #region API - - public IEnumerable OutOfRangeAddress - { - get - { - return _watchList - .Where(watch => watch.Address >= Domain.Size) - .Select(watch => watch.Address); - } - } - - public void Start() - { - _history.Clear(); - var domain = _settings.Domain; - var listSize = domain.Size; - if (!_settings.CheckMisAligned) - { - listSize /= (int)_settings.Size; - } - - _watchList = new List((int)listSize); - - switch (_settings.Size) - { - default: - case WatchSize.Byte: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - for (int i = 0; i < domain.Size; i++) - { - _watchList.Add(new MiniByteWatchDetailed(domain, i)); - } - } - else - { - for (int i = 0; i < domain.Size; i++) - { - _watchList.Add(new MiniByteWatch(domain, i)); - } - } - - break; - case WatchSize.Word: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - for (int i = 0; i < domain.Size - 1; i += _settings.CheckMisAligned ? 1 : 2) - { - _watchList.Add(new MiniWordWatchDetailed(domain, i, _settings.BigEndian)); - } - } - else - { - for (int i = 0; i < domain.Size - 1; i += _settings.CheckMisAligned ? 1 : 2) - { - _watchList.Add(new MiniWordWatch(domain, i, _settings.BigEndian)); - } - } - - break; - case WatchSize.DWord: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - for (int i = 0; i < domain.Size - 3; i += _settings.CheckMisAligned ? 1 : 4) - { - _watchList.Add(new MiniDWordWatchDetailed(domain, i, _settings.BigEndian)); - } - } - else - { - for (int i = 0; i < domain.Size - 3; i += _settings.CheckMisAligned ? 1 : 4) - { - _watchList.Add(new MiniDWordWatch(domain, i, _settings.BigEndian)); - } - } - - break; - } - } - - /// - /// Exposes the current watch state based on index - /// - public Watch this[int index] - { - get - { - if (_settings.Mode == Settings.SearchMode.Detailed) - { - return Watch.GenerateWatch( - _settings.Domain, - _watchList[index].Address, - _settings.Size, - _settings.Type, - _settings.BigEndian, - "", - 0, - _watchList[index].Previous, - (_watchList[index] as IMiniWatchDetails).ChangeCount); - } - - return Watch.GenerateWatch( - _settings.Domain, - _watchList[index].Address, - _settings.Size, - _settings.Type, - _settings.BigEndian, - "", - 0, - _watchList[index].Previous); - } - } - - public int DoSearch() - { - int before = _watchList.Count; - - switch (_compareTo) - { - default: - case Compare.Previous: - _watchList = ComparePrevious(_watchList).ToList(); - break; - case Compare.SpecificValue: - _watchList = CompareSpecificValue(_watchList).ToList(); - break; - case Compare.SpecificAddress: - _watchList = CompareSpecificAddress(_watchList).ToList(); - break; - case Compare.Changes: - _watchList = CompareChanges(_watchList).ToList(); - break; - case Compare.Difference: - _watchList = CompareDifference(_watchList).ToList(); - break; - } - - if (_settings.PreviousType == PreviousType.LastSearch) - { - SetPreviousToCurrent(); - } - - if (_keepHistory) - { - _history.AddState(_watchList); - } - - return before - _watchList.Count; - } - - public bool Preview(long address) - { - IEnumerable listOfOne; - - if (_isSorted) - { - listOfOne = Enumerable.Repeat(_watchList.BinarySearch(w => w.Address, address), 1); - } - else - { - listOfOne = Enumerable.Repeat(_watchList.FirstOrDefault(w => w.Address == address), 1); - } - - switch (_compareTo) - { - default: - case Compare.Previous: - return !ComparePrevious(listOfOne).Any(); - case Compare.SpecificValue: - return !CompareSpecificValue(listOfOne).Any(); - case Compare.SpecificAddress: - return !CompareSpecificAddress(listOfOne).Any(); - case Compare.Changes: - return !CompareChanges(listOfOne).Any(); - case Compare.Difference: - return !CompareDifference(listOfOne).Any(); - } - } - - public int Count => _watchList.Count; - - public Settings.SearchMode Mode => _settings.Mode; - - public MemoryDomain Domain => _settings.Domain; - - public Compare CompareTo - { - get - { - return _compareTo; - } - - set - { - if (CanDoCompareType(value)) - { - _compareTo = value; - } - else - { - throw new InvalidOperationException(); - } - } - } - - public long? CompareValue - { - get { return _compareValue; } - set { _compareValue = value; } - } - - public ComparisonOperator Operator - { - get { return _operator; } - set { _operator = value; } - } - - public int? DifferentBy - { - get { return _differentBy; } - set { _differentBy = value; } - } - - public void Update() - { - if (_settings.Mode == Settings.SearchMode.Detailed) - { - foreach (IMiniWatchDetails watch in _watchList) - { - watch.Update(_settings.PreviousType, _settings.Domain, _settings.BigEndian); - } - } - } - - public void SetType(DisplayType type) - { - _settings.Type = type; - } - - public void SetEndian(bool bigendian) - { - _settings.BigEndian = bigendian; - } - - public void SetPreviousType(PreviousType type) - { - if (_settings.Mode == Settings.SearchMode.Fast) - { - if (type == PreviousType.LastFrame) - { - throw new InvalidOperationException(); - } - } - - _settings.PreviousType = type; - } - - public void SetPreviousToCurrent() - { - _watchList.ForEach(w => w.SetPreviousToCurrent(_settings.Domain, _settings.BigEndian)); - } - - public void ClearChangeCounts() - { - if (_settings.Mode == Settings.SearchMode.Detailed) - { - foreach (var watch in _watchList.Cast()) - { - watch.ClearChangeCount(); - } - } - } - - /// - /// Remove a set of watches - /// However, this should not be used with large data sets (100k or more) as it uses a contains logic to perform the task - /// - public void RemoveSmallWatchRange(IEnumerable watches) - { - if (_keepHistory) - { - _history.AddState(_watchList); - } - - var addresses = watches.Select(w => w.Address); - var removeList = _watchList.Where(w => addresses.Contains(w.Address)).ToList(); - _watchList = _watchList.Except(removeList).ToList(); - } - - public void RemoveRange(IEnumerable indices) - { - if (_keepHistory) - { - _history.AddState(_watchList); - } - - var removeList = indices.Select(i => _watchList[i]); // This will fail after int.MaxValue but RAM Search fails on domains that large anyway - _watchList = _watchList.Except(removeList).ToList(); - } - - public void AddRange(List addresses, bool append) - { - if (!append) - { - _watchList.Clear(); - } - - switch (_settings.Size) - { - default: - case WatchSize.Byte: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniByteWatchDetailed(_settings.Domain, addr)); - } - } - else - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniByteWatch(_settings.Domain, addr)); - } - } - - break; - case WatchSize.Word: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniWordWatchDetailed(_settings.Domain, addr, _settings.BigEndian)); - } - } - else - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniWordWatch(_settings.Domain, addr, _settings.BigEndian)); - } - } - - break; - case WatchSize.DWord: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniDWordWatchDetailed(_settings.Domain, addr, _settings.BigEndian)); - } - } - else - { - foreach (var addr in addresses) - { - _watchList.Add(new MiniDWordWatch(_settings.Domain, addr, _settings.BigEndian)); - } - } - - break; - } - } - - public void Sort(string column, bool reverse) - { - _isSorted = false; - switch (column) - { - case WatchList.ADDRESS: - if (reverse) - { - _watchList = _watchList.OrderByDescending(w => w.Address).ToList(); - } - else - { - _watchList = _watchList.OrderBy(w => w.Address).ToList(); - _isSorted = true; - } - - break; - case WatchList.VALUE: - _watchList = reverse - ? _watchList.OrderByDescending(w => GetValue(w.Address)).ToList() - : _watchList.OrderBy(w => GetValue(w.Address)).ToList(); - - break; - case WatchList.PREV: - _watchList = reverse - ? _watchList.OrderByDescending(w => w.Previous).ToList() - : _watchList.OrderBy(w => w.Previous).ToList(); - - break; - case WatchList.CHANGES: - if (_settings.Mode == Settings.SearchMode.Detailed) - { - if (reverse) - { - _watchList = _watchList - .Cast() - .OrderByDescending(w => w.ChangeCount) - .Cast().ToList(); - } - else - { - _watchList = _watchList - .Cast() - .OrderBy(w => w.ChangeCount) - .Cast().ToList(); - } - } - - break; - case WatchList.DIFF: - _watchList = reverse - ? _watchList.OrderByDescending(w => (GetValue(w.Address) - w.Previous)).ToList() - : _watchList.OrderBy(w => GetValue(w.Address) - w.Previous).ToList(); - - break; - } - } - - #endregion - - #region Undo API - - public bool UndoEnabled - { - get { return _keepHistory; } - set { _keepHistory = value; } - } - - public bool CanUndo => _keepHistory && _history.CanUndo; - - public bool CanRedo => _keepHistory && _history.CanRedo; - - public void ClearHistory() - { - _history.Clear(); - } - - public int Undo() - { - int origCount = _watchList.Count; - if (_keepHistory) - { - _watchList = _history.Undo().ToList(); - return _watchList.Count - origCount; - } - - return _watchList.Count; - } - - public int Redo() - { - int origCount = _watchList.Count; - if (_keepHistory) - { - _watchList = _history.Redo().ToList(); - return origCount - _watchList.Count; - } - - return _watchList.Count; - } - - #endregion - - #region Comparisons - - private IEnumerable ComparePrevious(IEnumerable watchList) - { - switch (_operator) - { - default: - case ComparisonOperator.Equal: - return watchList.Where(w => GetValue(w.Address) == w.Previous); - case ComparisonOperator.NotEqual: - return watchList.Where(w => GetValue(w.Address) != w.Previous); - - case ComparisonOperator.GreaterThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) > ToFloat(w.Previous)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) > SignExtendAsNeeded(w.Previous)); - - case ComparisonOperator.GreaterThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) >= ToFloat(w.Previous)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) >= SignExtendAsNeeded(w.Previous)); - - case ComparisonOperator.LessThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) < ToFloat(w.Previous)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) < SignExtendAsNeeded(w.Previous)); - - case ComparisonOperator.LessThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) <= ToFloat(w.Previous)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) <= SignExtendAsNeeded(w.Previous)); - - case ComparisonOperator.DifferentBy: - if (_differentBy.HasValue) - { - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) + _differentBy.Value == ToFloat(w.Previous) - || ToFloat(GetValue(w.Address)) - _differentBy.Value == ToFloat(w.Previous)); - } - - return watchList.Where(w => - { - long val = SignExtendAsNeeded(GetValue(w.Address)); - long prev = SignExtendAsNeeded(w.Previous); - return val + _differentBy.Value == prev - || val - _differentBy.Value == prev; - }); - } - else - { - throw new InvalidOperationException(); - } - } - } - - private IEnumerable CompareSpecificValue(IEnumerable watchList) - { - if (_compareValue.HasValue) - { - switch (_operator) - { - default: - case ComparisonOperator.Equal: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) == ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => GetValue(w.Address) == _compareValue.Value); - case ComparisonOperator.NotEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) != ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => GetValue(w.Address) != _compareValue.Value); - - case ComparisonOperator.GreaterThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) > ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) > _compareValue.Value); - case ComparisonOperator.GreaterThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) >= ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) >= _compareValue.Value); - case ComparisonOperator.LessThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) < ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) < _compareValue.Value); - case ComparisonOperator.LessThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) <= ToFloat(_compareValue.Value)); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) <= _compareValue.Value); - case ComparisonOperator.DifferentBy: - if (_differentBy.HasValue) - { - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) + _differentBy.Value == _compareValue.Value - || ToFloat(GetValue(w.Address)) - _differentBy.Value == _compareValue.Value); - } - - return watchList.Where(w - => SignExtendAsNeeded(GetValue(w.Address)) + _differentBy.Value == _compareValue.Value - || SignExtendAsNeeded(GetValue(w.Address)) - _differentBy.Value == _compareValue.Value); - } - - throw new InvalidOperationException(); - } - } - - throw new InvalidOperationException(); - } - - private IEnumerable CompareSpecificAddress(IEnumerable watchList) - { - if (_compareValue.HasValue) - { - switch (_operator) - { - default: - case ComparisonOperator.Equal: - return watchList.Where(w => w.Address == _compareValue.Value); - case ComparisonOperator.NotEqual: - return watchList.Where(w => w.Address != _compareValue.Value); - case ComparisonOperator.GreaterThan: - return watchList.Where(w => w.Address > _compareValue.Value); - case ComparisonOperator.GreaterThanEqual: - return watchList.Where(w => w.Address >= _compareValue.Value); - case ComparisonOperator.LessThan: - return watchList.Where(w => w.Address < _compareValue.Value); - case ComparisonOperator.LessThanEqual: - return watchList.Where(w => w.Address <= _compareValue.Value); - case ComparisonOperator.DifferentBy: - if (_differentBy.HasValue) - { - return watchList.Where(w => w.Address + _differentBy.Value == _compareValue.Value - || w.Address - _differentBy.Value == _compareValue.Value); - } - - throw new InvalidOperationException(); - } - } - - throw new InvalidOperationException(); - } - - private IEnumerable CompareChanges(IEnumerable watchList) - { - if (_settings.Mode == Settings.SearchMode.Detailed && _compareValue.HasValue) - { - switch (_operator) - { - default: - case ComparisonOperator.Equal: - return watchList - .Cast() - .Where(w => w.ChangeCount == _compareValue.Value) - .Cast(); - case ComparisonOperator.NotEqual: - return watchList - .Cast() - .Where(w => w.ChangeCount != _compareValue.Value) - .Cast(); - case ComparisonOperator.GreaterThan: - return watchList - .Cast() - .Where(w => w.ChangeCount > _compareValue.Value) - .Cast(); - case ComparisonOperator.GreaterThanEqual: - return watchList - .Cast() - .Where(w => w.ChangeCount >= _compareValue.Value) - .Cast(); - case ComparisonOperator.LessThan: - return watchList - .Cast() - .Where(w => w.ChangeCount < _compareValue.Value) - .Cast(); - case ComparisonOperator.LessThanEqual: - return watchList - .Cast() - .Where(w => w.ChangeCount <= _compareValue.Value) - .Cast(); - case ComparisonOperator.DifferentBy: - if (_differentBy.HasValue) - { - return watchList - .Cast() - .Where(w => w.ChangeCount + _differentBy.Value == _compareValue.Value - || w.ChangeCount - _differentBy.Value == _compareValue.Value) - .Cast(); - } - - throw new InvalidOperationException(); - } - } - - throw new InvalidCastException(); - } - - private IEnumerable CompareDifference(IEnumerable watchList) - { - if (_compareValue.HasValue) - { - switch (_operator) - { - default: - case ComparisonOperator.Equal: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - ToFloat(w.Previous) == _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) == _compareValue.Value); - case ComparisonOperator.NotEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous != _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) != _compareValue.Value); - case ComparisonOperator.GreaterThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous > _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) > _compareValue.Value); - case ComparisonOperator.GreaterThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous >= _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) >= _compareValue.Value); - case ComparisonOperator.LessThan: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous < _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) < _compareValue.Value); - case ComparisonOperator.LessThanEqual: - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous <= _compareValue.Value); - } - - return watchList.Where(w => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) <= _compareValue.Value); - case ComparisonOperator.DifferentBy: - if (_differentBy.HasValue) - { - if (_settings.Type == DisplayType.Float) - { - return watchList.Where(w => ToFloat(GetValue(w.Address)) - w.Previous + _differentBy.Value == _compareValue - || ToFloat(GetValue(w.Address)) - w.Previous - _differentBy.Value == w.Previous); - } - - return watchList.Where(w - => SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) + _differentBy.Value == _compareValue - || SignExtendAsNeeded(GetValue(w.Address)) - SignExtendAsNeeded(w.Previous) - _differentBy.Value == _compareValue); - } - - throw new InvalidOperationException(); - } - } - - throw new InvalidCastException(); - } - - #endregion - - #region Private parts - - private float ToFloat(long val) - { - var bytes = BitConverter.GetBytes((int)val); - return BitConverter.ToSingle(bytes, 0); - } - - private long SignExtendAsNeeded(long val) - { - if (_settings.Type != DisplayType.Signed) - { - return val; - } - - switch (_settings.Size) - { - default: - case WatchSize.Byte: - return (sbyte)val; - case WatchSize.Word: - return (short)val; - case WatchSize.DWord: - return (int)val; - } - } - - private long GetValue(long addr) - { - // do not return sign extended variables from here. - switch (_settings.Size) - { - default: - case WatchSize.Byte: - var theByte = _settings.Domain.PeekByte(addr % Domain.Size); - return theByte; - - case WatchSize.Word: - var theWord = _settings.Domain.PeekUshort(addr % Domain.Size, _settings.BigEndian); - return theWord; - - case WatchSize.DWord: - var theDWord = _settings.Domain.PeekUint(addr % Domain.Size, _settings.BigEndian); - return theDWord; - } - } - - private bool CanDoCompareType(Compare compareType) - { - switch (_settings.Mode) - { - default: - case Settings.SearchMode.Detailed: - return true; - case Settings.SearchMode.Fast: - return compareType != Compare.Changes; - } - } - - #endregion - - #region Classes - - private interface IMiniWatch - { - long Address { get; } - long Previous { get; } // do not store sign extended variables in here. - void SetPreviousToCurrent(MemoryDomain domain, bool bigendian); - } - - private interface IMiniWatchDetails - { - int ChangeCount { get; } - - void ClearChangeCount(); - void Update(PreviousType type, MemoryDomain domain, bool bigendian); - } - - private sealed class MiniByteWatch : IMiniWatch - { - public long Address { get; } - private byte _previous; - - public MiniByteWatch(MemoryDomain domain, long addr) - { - Address = addr; - _previous = domain.PeekByte(Address % domain.Size); - } - - public long Previous => _previous; - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = domain.PeekByte(Address % domain.Size); - } - } - - private sealed class MiniWordWatch : IMiniWatch - { - public long Address { get; } - private ushort _previous; - - public MiniWordWatch(MemoryDomain domain, long addr, bool bigEndian) - { - Address = addr; - _previous = domain.PeekUshort(Address % domain.Size, bigEndian); - } - - public long Previous => _previous; - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = domain.PeekUshort(Address, bigendian); - } - } - - private sealed class MiniDWordWatch : IMiniWatch - { - public long Address { get; } - private uint _previous; - - public MiniDWordWatch(MemoryDomain domain, long addr, bool bigEndian) - { - Address = addr; - _previous = domain.PeekUint(Address % domain.Size, bigEndian); - } - - public long Previous => _previous; - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = domain.PeekUint(Address, bigendian); - } - } - - private sealed class MiniByteWatchDetailed : IMiniWatch, IMiniWatchDetails - { - public long Address { get; } - - private byte _previous; - private byte _prevFrame; - private int _changecount; - - public MiniByteWatchDetailed(MemoryDomain domain, long addr) - { - Address = addr; - SetPreviousToCurrent(domain, false); - } - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = _prevFrame = domain.PeekByte(Address % domain.Size); - } - - public long Previous => _previous; - - public int ChangeCount => _changecount; - - public void Update(PreviousType type, MemoryDomain domain, bool bigendian) - { - var value = domain.PeekByte(Address % domain.Size); - - if (value != _prevFrame) - { - _changecount++; - } - - switch (type) - { - case PreviousType.Original: - case PreviousType.LastSearch: - break; - case PreviousType.LastFrame: - _previous = _prevFrame; - break; - case PreviousType.LastChange: - if (_prevFrame != value) - { - _previous = _prevFrame; - } - - break; - } - - _prevFrame = value; - } - - public void ClearChangeCount() - { - _changecount = 0; - } - } - - private sealed class MiniWordWatchDetailed : IMiniWatch, IMiniWatchDetails - { - public long Address { get; } - - private ushort _previous; - private ushort _prevFrame; - private int _changecount; - - public MiniWordWatchDetailed(MemoryDomain domain, long addr, bool bigEndian) - { - Address = addr; - SetPreviousToCurrent(domain, bigEndian); - } - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = _prevFrame = domain.PeekUshort(Address % domain.Size, bigendian); - } - - public long Previous => _previous; - - public int ChangeCount => _changecount; - - public void Update(PreviousType type, MemoryDomain domain, bool bigendian) - { - var value = domain.PeekUshort(Address % domain.Size, bigendian); - if (value != Previous) - { - _changecount++; - } - - switch (type) - { - case PreviousType.Original: - case PreviousType.LastSearch: - break; - case PreviousType.LastFrame: - _previous = _prevFrame; - break; - case PreviousType.LastChange: - if (_prevFrame != value) - { - _previous = _prevFrame; - } - - break; - } - - _prevFrame = value; - } - - public void ClearChangeCount() - { - _changecount = 0; - } - } - - private sealed class MiniDWordWatchDetailed : IMiniWatch, IMiniWatchDetails - { - public long Address { get; } - - private uint _previous; - private uint _prevFrame; - private int _changecount; - - public MiniDWordWatchDetailed(MemoryDomain domain, long addr, bool bigEndian) - { - Address = addr; - SetPreviousToCurrent(domain, bigEndian); - } - - public void SetPreviousToCurrent(MemoryDomain domain, bool bigendian) - { - _previous = _prevFrame = domain.PeekUint(Address % domain.Size, bigendian); - } - - public long Previous => (int)_previous; - - public int ChangeCount => _changecount; - - public void Update(PreviousType type, MemoryDomain domain, bool bigendian) - { - var value = domain.PeekUint(Address % domain.Size, bigendian); - if (value != Previous) - { - _changecount++; - } - - switch (type) - { - case PreviousType.Original: - case PreviousType.LastSearch: - break; - case PreviousType.LastFrame: - _previous = _prevFrame; - break; - case PreviousType.LastChange: - if (_prevFrame != value) - { - _previous = _prevFrame; - } - - break; - } - - _prevFrame = value; - } - - public void ClearChangeCount() - { - _changecount = 0; - } - } - - public class Settings - { - public Settings(IMemoryDomains memoryDomains) - { - BigEndian = memoryDomains.MainMemory.EndianType == MemoryDomain.Endian.Big; - Size = (WatchSize)memoryDomains.MainMemory.WordSize; - Type = DisplayType.Unsigned; - Mode = memoryDomains.MainMemory.Size > (1024 * 1024) ? - SearchMode.Fast : - SearchMode.Detailed; - - Domain = memoryDomains.MainMemory; - CheckMisAligned = false; - PreviousType = PreviousType.LastSearch; - } - - /*Require restart*/ - public enum SearchMode - { - Fast, Detailed - } - - public SearchMode Mode { get; set; } - public MemoryDomain Domain { get; set; } - public WatchSize Size { get; set; } - public bool CheckMisAligned { get; set; } - - /*Can be changed mid-search*/ - public DisplayType Type { get; set; } - public bool BigEndian { get; set; } - public PreviousType PreviousType { get; set; } - } - - #endregion - } -} diff --git a/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs b/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs deleted file mode 100644 index 91153369e3..0000000000 --- a/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Collections.Generic; - -namespace BizHawk.Client.Common -{ - /// - /// This class holds a separator for RamWatch - /// Use the static property Instance to get it - /// - public sealed class SeparatorWatch : Watch - { - /// - /// Initializes a new instance of the class. - /// - internal SeparatorWatch() - : base(null, 0, WatchSize.Separator, DisplayType.Separator, true, "") - { - } - - /// - /// Gets the separator instance - /// - public static SeparatorWatch Instance => new SeparatorWatch(); - - public static SeparatorWatch NewSeparatorWatch(string description) - { - return new SeparatorWatch - { - Notes = description - }; - } - - /// - /// Get the appropriate DisplayType - /// - /// DisplayType.Separator nothing else - public override IEnumerable AvailableTypes() - { - yield return DisplayType.Separator; - } - - /// - /// Ignore that stuff - /// - public override int Value => 0; - - /// - /// Ignore that stuff - /// - public override int ValueNoFreeze => 0; - - /// - /// Ignore that stuff - /// - public override int Previous => 0; - - /// - /// Ignore that stuff - /// - public override string ValueString => Notes; //""; - - /// - /// Ignore that stuff - /// - public override string PreviousStr => ""; - - /// - /// TTransform the current instance into a displayable (short representation) string - /// It's used by the "Display on screen" option in the RamWatch window - /// - /// A well formatted string representation - public override string ToDisplayString() - { - if (Notes == null || Notes == "") - return "----"; - else - return Notes; - } - - /// - /// Transforms the current instance into a string - /// - /// A representation of the current - public override string ToString() - { - return $"0\tS\t_\t1\t\t{Notes.Trim('\r', '\n')}"; - //return $"{(Domain == null && Address == 0 ? "0" : Address.ToHexString((Domain?.Size ?? 0xFF - 1).NumHexDigits()))}\t{SizeAsChar}\t{TypeAsChar}\t{Convert.ToInt32(BigEndian)}\t{Domain?.Name}\t{Notes.Trim('\r', '\n')}"; - } - - /// - /// Ignore that stuff - /// - public override bool Poke(string value) - { - return false; - } - - /// - /// Ignore that stuff - /// - public override void ResetPrevious() - { - } - - /// - /// Ignore that stuff - /// - public override string Diff => ""; - - /// - /// Ignore that stuff - /// - public override uint MaxValue => 0; - - /// - /// Ignore that stuff - /// - public override void Update() - { - //AddressString = (Notes == null || Notes == "") ? "" : Notes; - - } - } -} diff --git a/BizHawk.Client.Common/tools/Watch/Watch.cs b/BizHawk.Client.Common/tools/Watch/Watch.cs deleted file mode 100644 index 4b4aa4ca5f..0000000000 --- a/BizHawk.Client.Common/tools/Watch/Watch.cs +++ /dev/null @@ -1,790 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Diagnostics; - -using BizHawk.Common.NumberExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// This class holds a watch i.e. something inside a identified by an address - /// with a specific size (8, 16 or 32bits). - /// This is an abstract class - /// - [DebuggerDisplay("Note={Notes}, Value={ValueString}")] - public abstract class Watch - : IEquatable, - IEquatable, - IComparable - { - private MemoryDomain _domain; - private DisplayType _type; - - /// - /// Initializes a new instance of the class - /// - /// where you want to track - /// The address you want to track - /// A (byte, word, double word) - /// How you you want to display the value See - /// Specify the endianess. true for big endian - /// A custom note about the - /// Occurs when a is incompatible with the - protected Watch(MemoryDomain domain, long address, WatchSize size, DisplayType type, bool bigEndian, string note) - { - if (IsDiplayTypeAvailable(type)) - { - _domain = domain; - Address = address; - Size = size; - _type = type; - BigEndian = bigEndian; - Notes = note; - } - else - { - throw new ArgumentException($"DisplayType {type} is invalid for this type of Watch", nameof(type)); - } - } - - #region Methods - - #region Static - - /// - /// Generate sa from a given string - /// String is tab separate - /// - /// Entire string, tab separated for each value Order is: - /// - /// - /// 0x00 - /// Address in hexadecimal - /// - /// - /// b,w or d - /// The , byte, word or double word - /// s, u, h, b, 1, 2, 3, f - /// The signed, unsigned,etc... - /// - /// - /// 0 or 1 - /// Big endian or not - /// - /// - /// RDRAM,ROM,... - /// The - /// - /// - /// Plain text - /// Notes - /// - /// - /// - /// 's memory domain - /// A brand new - public static Watch FromString(string line, IMemoryDomains domains) - { - string[] parts = line.Split(new[] { '\t' }, 6); - - if (parts.Length < 6) - { - if (parts.Length >= 3 && parts[2] == "_") - { - return SeparatorWatch.Instance; - } - - return null; - } - - long address; - - if (long.TryParse(parts[0], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out address)) - { - WatchSize size = SizeFromChar(parts[1][0]); - DisplayType type = DisplayTypeFromChar(parts[2][0]); - bool bigEndian = parts[3] != "0"; - MemoryDomain domain = domains[parts[4]]; - string notes = parts[5].Trim('\r', '\n'); - - return GenerateWatch( - domain, - address, - size, - type, - bigEndian, - notes); - } - - return null; - } - - /// - /// Generates a new instance - /// Can be either , , or - /// - /// The where you want to watch - /// The address into the - /// The size - /// How the watch will be displayed - /// Endianess (true for big endian) - /// A custom note about the - /// The current watch value - /// Previous value - /// Number of changes occurs in current - /// New instance. True type is depending of size parameter - public static Watch GenerateWatch(MemoryDomain domain, long address, WatchSize size, DisplayType type, bool bigEndian, string note = "", long value = 0, long prev = 0, int changeCount = 0) - { - switch (size) - { - default: - case WatchSize.Separator: - return SeparatorWatch.NewSeparatorWatch(note); - case WatchSize.Byte: - return new ByteWatch(domain, address, type, bigEndian, note, (byte)value, (byte)prev, changeCount); - case WatchSize.Word: - return new WordWatch(domain, address, type, bigEndian, note, (ushort)value, (ushort)prev, changeCount); - case WatchSize.DWord: - return new DWordWatch(domain, address, type, bigEndian, note, (uint)value, (uint)prev, changeCount); - } - } - - #region Operators - - /// - /// Equality operator between two - /// - /// First watch - /// Second watch - /// True if both watch are equals; otherwise, false - public static bool operator ==(Watch a, Watch b) - { - if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) - { - return false; - } - - if (ReferenceEquals(a, b)) - { - return true; - } - - return a.Equals(b); - } - - /// - /// Equality operator between a and a - /// - /// The watch - /// The cheat - /// True if they are equals; otherwise, false - public static bool operator ==(Watch a, Cheat b) - { - if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) - { - return false; - } - - return a.Equals(b); - } - - /// - /// Inequality operator between two - /// - /// First watch - /// Second watch - /// True if both watch are different; otherwise, false - public static bool operator !=(Watch a, Watch b) - { - return !(a == b); - } - - /// - /// Inequality operator between a and a - /// - /// The watch - /// The cheat - /// True if they are different; otherwise, false - public static bool operator !=(Watch a, Cheat b) - { - return !(a == b); - } - - /// - /// Compare two together - /// - /// First - /// Second - /// True if first is lesser than b; otherwise, false - /// Occurs when you try to compare two throughout different - public static bool operator <(Watch a, Watch b) - { - return a.CompareTo(b) < 0; - } - - /// - /// Compare two together - /// - /// First - /// Second - /// True if first is greater than b; otherwise, false - /// Occurs when you try to compare two throughout different - public static bool operator >(Watch a, Watch b) - { - return a.CompareTo(b) > 0; - } - - /// - /// Compare two together - /// - /// First - /// Second - /// True if first is lesser or equals to b; otherwise, false - /// Occurs when you try to compare two throughout different - public static bool operator <=(Watch a, Watch b) - { - return a.CompareTo(b) <= 0; - } - - /// - /// Compare two together - /// - /// First - /// Second - /// True if first is greater or equals to b; otherwise, false - /// Occurs when you try to compare two throughout different - public static bool operator >=(Watch a, Watch b) - { - return a.CompareTo(b) >= 0; - } - - #endregion Operators - - #endregion Static - - #region Abstracts - - /// - /// Gets a list a that can be used for this - /// - /// An enumeration that contains all valid - public abstract IEnumerable AvailableTypes(); - - /// - /// Resets the previous value; set it to the current one - /// - public abstract void ResetPrevious(); - - /// - /// Updates the Watch (read it from - /// - public abstract void Update(); - - #endregion Abstracts - - #region Protected - - protected byte GetByte(bool bypassFreeze = false) - { - if (!bypassFreeze && Global.CheatList.IsActive(_domain, Address)) - { - // LIAR logic - return Global.CheatList.GetByteValue(_domain, Address) ?? 0; - } - - if (_domain.Size == 0) - { - return _domain.PeekByte(Address); - } - - return _domain.PeekByte(Address % _domain.Size); - } - - protected ushort GetWord(bool bypassFreeze = false) - { - if (!bypassFreeze && Global.CheatList.IsActive(_domain, Address)) - { - // LIAR logic - return (ushort)(Global.CheatList.GetCheatValue(_domain, Address, WatchSize.Word) ?? 0); - } - - if (_domain.Size == 0) - { - return _domain.PeekUshort(Address, BigEndian); - } - - return _domain.PeekUshort(Address % _domain.Size, BigEndian); // TODO: % size stil lisn't correct since it could be the last byte of the domain - } - - protected uint GetDWord(bool bypassFreeze = false) - { - if (!bypassFreeze && Global.CheatList.IsActive(_domain, Address)) - { - // LIAR logic - return (uint)(Global.CheatList.GetCheatValue(_domain, Address, WatchSize.DWord) ?? 0); - } - - if (_domain.Size == 0) - { - return _domain.PeekUint(Address, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - - return _domain.PeekUint(Address % _domain.Size, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - - protected void PokeByte(byte val) - { - if (_domain.Size == 0) - { - _domain.PokeByte(Address, val); - } - else - { - _domain.PokeByte(Address % _domain.Size, val); - } - } - - protected void PokeWord(ushort val) - { - if (_domain.Size == 0) - { - _domain.PokeUshort(Address, val, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - else - { - _domain.PokeUshort(Address % _domain.Size, val, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - } - - protected void PokeDWord(uint val) - { - if (_domain.Size == 0) - { - _domain.PokeUint(Address, val, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - else - { - _domain.PokeUint(Address % _domain.Size, val, BigEndian); // TODO: % size still isn't correct since it could be the last byte of the domain - } - } - - #endregion Protected - - /// - /// Sets the number of changes to 0 - /// - public void ClearChangeCount() - { - ChangeCount = 0; - } - - #region IEquatable - - /// - /// Determines if this is equals to another - /// - /// The to compare - /// True if both object are equals; otherwise, false - public bool Equals(Watch other) - { - if (ReferenceEquals(other, null)) - { - return false; - } - - return _domain == other._domain && - Address == other.Address && - Size == other.Size; - } - - #endregion IEquatable - - #region IEquatable - - /// - /// Determines if this is equals to an instance of - /// - /// The to compare - /// True if both object are equals; otherwise, false - public bool Equals(Cheat other) - { - return !ReferenceEquals(other, null) - && _domain == other.Domain - && Address == other.Address - && Size == other.Size; - } - - #endregion IEquatable - - #region IComparable - - /// - /// Compares two together and determine which one comes first. - /// First we look the address and then the size - /// - /// The other to compare to - /// 0 if they are equals, 1 if the other is greater, -1 if the other is lesser - /// Occurs when you try to compare two throughout different - public int CompareTo(Watch other) - { - if (_domain != other._domain) - { - throw new InvalidOperationException("Watch cannot be compared through different domain"); - } - - if (Equals(other)) - { - return 0; - } - - if (Address.Equals(other.Address)) - { - return ((int)Size).CompareTo((int)other.Size); - } - - return Address.CompareTo(other.Address); - } - - #endregion IComparable - - /// - /// Determines if this object is Equals to another - /// - /// The object to compare - /// True if both object are equals; otherwise, false - public override bool Equals(object obj) - { - if (obj is Watch) - { - return Equals((Watch)obj); - } - - if (obj is Cheat) - { - return Equals((Cheat)obj); - } - - return base.Equals(obj); - } - - /// - /// Hash the current watch and gets a unique value - /// - /// that can serves as a unique representation of current Watch - public override int GetHashCode() - { - return Domain.GetHashCode() + (int)Address; - } - - /// - /// Determines if the specified can be - /// used for the current - /// - /// you want to check - public bool IsDiplayTypeAvailable(DisplayType type) - { - return AvailableTypes().Any(d => d == type); - } - - /// - /// Transforms the current instance into a string - /// - /// A representation of the current - public override string ToString() - { - return $"{(Domain == null && Address == 0 ? "0" : Address.ToHexString((Domain?.Size ?? 0xFF - 1).NumHexDigits()))}\t{SizeAsChar}\t{TypeAsChar}\t{Convert.ToInt32(BigEndian)}\t{Domain?.Name}\t{Notes.Trim('\r', '\n')}"; - } - - /// - /// Transform the current instance into a displayable (short representation) string - /// It's used by the "Display on screen" option in the RamWatch window - /// - /// A well formatted string representation - public virtual string ToDisplayString() - { - return $"{Notes}: {ValueString}"; - } - - #endregion - - #region Properties - - #region Abstracts - - /// - /// Gets a string representation of difference - /// between current value and the previous one - /// - public abstract string Diff { get; } - - /// - /// Gets the maximum possible value - /// - public abstract uint MaxValue { get; } - - /// - /// Gets the current value - /// - public abstract int Value { get; } - - /// - /// Gets the current value - /// but with stuff I don't understand - /// - /// zero 15-nov-2015 - bypass LIAR LOGIC, see fdc9ea2aa922876d20ba897fb76909bf75fa6c92 https://github.com/TASVideos/BizHawk/issues/326 - public abstract int ValueNoFreeze { get; } - - /// - /// Gets a string representation of the current value - /// - public abstract string ValueString { get; } - - /// - /// Try to sets the value into the - /// at the current address - /// - /// Value to set - /// True if value successfully sets; otherwise, false - public abstract bool Poke(string value); - - /// - /// Gets the previous value - /// - public abstract int Previous { get; } - - /// - /// Gets a string representation of the previous value - /// - public abstract string PreviousStr { get; } - - #endregion Abstracts - - /// - /// Gets the address in the - /// - public long Address { get; } - - private string AddressFormatStr - { - get - { - if (_domain != null) - { - return "X" + (_domain.Size - 1).NumHexDigits(); - } - - return ""; - } - } - - /// - /// Gets the address in the formatted as string - /// - public string AddressString => Address.ToString(AddressFormatStr); - - /// - /// Gets or sets a value indicating the endianess of current - /// True for big endian, false for little endian - /// - public bool BigEndian { get; set; } - - /// - /// Gets or sets the number of times that value of current value has changed - /// - public int ChangeCount { get; protected set; } - - /// - /// Gets or sets the way current is displayed - /// - /// Occurs when a is incompatible with the - public DisplayType Type - { - get - { - return _type; - } - - set - { - if (IsDiplayTypeAvailable(value)) - { - _type = value; - } - else - { - throw new ArgumentException($"DisplayType {value} is invalid for this type of Watch"); - } - } - } - - /// - /// Gets the current - /// - public MemoryDomain Domain - { - get - { - return _domain; - } - - internal set - { - if (value != null && _domain.Name == value.Name) - { - _domain = value; - } - else - { - throw new InvalidOperationException("You cannot set a different domain to a watch on the fly"); - } - } - } - - /// - /// Gets a value indicating whether the current address is - /// within in the range of current - /// - public bool IsOutOfRange => !IsSeparator && _domain.Size != 0 && Address >= _domain.Size; - - /// - /// Gets a value that defined if the current is actually a - /// - public bool IsSeparator => this is SeparatorWatch; - - /// - /// Gets or sets notes for current - /// - public string Notes { get; set; } - - /// - /// Gets the current size of the watch - /// - public WatchSize Size { get; } - - #endregion - - // TODO: Replace all the following stuff by implementing ISerializable - public static string DisplayTypeToString(DisplayType type) - { - switch (type) - { - default: - return type.ToString(); - case DisplayType.FixedPoint_12_4: - return "Fixed Point 12.4"; - case DisplayType.FixedPoint_20_12: - return "Fixed Point 20.12"; - case DisplayType.FixedPoint_16_16: - return "Fixed Point 16.16"; - } - } - - public static DisplayType StringToDisplayType(string name) - { - switch (name) - { - default: - return (DisplayType)Enum.Parse(typeof(DisplayType), name); - case "Fixed Point 12.4": - return DisplayType.FixedPoint_12_4; - case "Fixed Point 20.12": - return DisplayType.FixedPoint_20_12; - case "Fixed Point 16.16": - return DisplayType.FixedPoint_16_16; - } - } - - public char SizeAsChar - { - get - { - switch (Size) - { - default: - case WatchSize.Separator: - return 'S'; - case WatchSize.Byte: - return 'b'; - case WatchSize.Word: - return 'w'; - case WatchSize.DWord: - return 'd'; - } - } - } - - public static WatchSize SizeFromChar(char c) - { - switch (c) - { - default: - case 'S': - return WatchSize.Separator; - case 'b': - return WatchSize.Byte; - case 'w': - return WatchSize.Word; - case 'd': - return WatchSize.DWord; - } - } - - public char TypeAsChar - { - get - { - switch (Type) - { - default: - case DisplayType.Separator: - return '_'; - case DisplayType.Unsigned: - return 'u'; - case DisplayType.Signed: - return 's'; - case DisplayType.Hex: - return 'h'; - case DisplayType.Binary: - return 'b'; - case DisplayType.FixedPoint_12_4: - return '1'; - case DisplayType.FixedPoint_20_12: - return '2'; - case DisplayType.FixedPoint_16_16: - return '3'; - case DisplayType.Float: - return 'f'; - } - } - } - - public static DisplayType DisplayTypeFromChar(char c) - { - switch (c) - { - default: - case '_': - return DisplayType.Separator; - case 'u': - return DisplayType.Unsigned; - case 's': - return DisplayType.Signed; - case 'h': - return DisplayType.Hex; - case 'b': - return DisplayType.Binary; - case '1': - return DisplayType.FixedPoint_12_4; - case '2': - return DisplayType.FixedPoint_20_12; - case '3': - return DisplayType.FixedPoint_16_16; - case 'f': - return DisplayType.Float; - } - } - } -} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs deleted file mode 100644 index 833e3595e8..0000000000 --- a/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs +++ /dev/null @@ -1,623 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using BizHawk.Common.StringExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.Common -{ - /// - /// This class hold a collection - /// Different memory domain can be mixed - /// - public sealed partial class WatchList - : IList - { - #region Fields - - public const string ADDRESS = "AddressColumn"; - public const string VALUE = "ValueColumn"; - public const string PREV = "PrevColumn"; - public const string CHANGES = "ChangesColumn"; - public const string DIFF = "DiffColumn"; - public const string TYPE = "TypeColumn"; - public const string DOMAIN = "DomainColumn"; - public const string NOTES = "NotesColumn"; - - private static readonly WatchDomainComparer DomainComparer = new WatchDomainComparer(); - private static readonly WatchAddressComparer AddressComparer = new WatchAddressComparer(); - private static readonly WatchFullDisplayTypeComparer DisplayTypeComparer = new WatchFullDisplayTypeComparer(); - private static readonly WatchValueComparer ValueComparer = new WatchValueComparer(); - private static readonly WatchPreviousValueComparer PreviousValueComparer = new WatchPreviousValueComparer(); - private static readonly WatchValueDifferenceComparer ValueDifferenceComparer = new WatchValueDifferenceComparer(); - private static readonly WatchChangeCountComparer ChangeCountComparer = new WatchChangeCountComparer(); - private static readonly WatchNoteComparer NoteComparer = new WatchNoteComparer(); - - private readonly List _watchList = new List(0); - private readonly string _systemid; - private IMemoryDomains _memoryDomains; - - #endregion - - #region cTor(s) - - /// - /// Initializes a new instance of the class - /// that will contains a set of - /// - /// All available memory domains - /// System identifier (NES, SNES, ...) - public WatchList(IMemoryDomains core, string systemid) - { - _memoryDomains = core; - _systemid = systemid; - } - - #endregion - - #region Methods - - #region ICollection - - /// - /// Adds a into the current collection - /// - /// to add - public void Add(Watch watch) - { - _watchList.Add(watch); - Changes = true; - } - - /// - /// Removes all item from the current collection - /// Clear also the file name - /// - public void Clear() - { - _watchList.Clear(); - Changes = false; - CurrentFileName = ""; - } - - /// - /// Determines if the current contains the - /// specified - /// - /// The object to - public bool Contains(Watch watch) - { - return _watchList.Contains(watch); - } - - /// - /// Copies the elements of the current - /// into an starting at a particular index - /// - /// The one-dimension that will serve as destination to copy - /// Zero-based index where the copy should starts - /// - /// - /// - public void CopyTo(Watch[] array, int arrayIndex) - { - _watchList.CopyTo(array, arrayIndex); - } - - /// - /// Removes the first of specified - /// - /// to remove - /// True if successfully removed; otherwise, false - public bool Remove(Watch watch) - { - bool result = _watchList.Remove(watch); - if (result) - { - Changes = true; - } - - return result; - } - - #endregion - - #region IList - - /// - /// Determines the zero-base position of the specified - /// into the - /// - /// to look for - /// Zero-base position if has been found; otherwise -1 - public int IndexOf(Watch watch) - { - return _watchList.IndexOf(watch); - } - - /// - /// Insert a at the specified index - /// - /// The zero-base index where the should be inserted - /// to insert - /// - public void Insert(int index, Watch watch) - { - _watchList.Insert(index, watch); - } - - /// - /// Removes item at the specified index - /// - /// Zero-based index of the to remove - /// - public void RemoveAt(int index) - { - _watchList.RemoveAt(index); - Changes = true; - } - - #endregion IList - - #region IEnumerable - - /// - /// Returns an enumerator that iterates through the collection - /// - /// An for the current collection - public IEnumerator GetEnumerator() - { - return _watchList.GetEnumerator(); - } - - /// - /// Returns an enumerator that iterates through the collection - /// - /// An for the current collection - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion IEnumerable - - /// - /// Add an existing collection of into the current one - /// equality will be checked to avoid doubles - /// - /// of watch to merge - public void AddRange(IEnumerable watches) - { - Parallel.ForEach(watches, watch => - { - if (!_watchList.Contains(watch)) - { - _watchList.Add(watch); - } - }); - Changes = true; - } - - /// - /// Clears change count of all in the collection - /// - public void ClearChangeCounts() - { - Parallel.ForEach(_watchList, watch => watch.ClearChangeCount()); - } - - /// - /// Sort the current list based on one of the constant - /// - /// Value that specify sorting base - /// Value that define the ordering. Ascending (true) or descending (false) - public void OrderWatches(string column, bool reverse) - { - switch (column) - { - case ADDRESS: - if (reverse) - { - _watchList.Sort(AddressComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(); - } - - break; - - case VALUE: - if (reverse) - { - _watchList.Sort(ValueComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(ValueComparer); - } - - break; - - case PREV: - if (reverse) - { - _watchList.Sort(PreviousValueComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(PreviousValueComparer); - } - - break; - - case DIFF: - if (reverse) - { - _watchList.Sort(ValueDifferenceComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(ValueDifferenceComparer); - } - - break; - - case CHANGES: - if (reverse) - { - _watchList.Sort(ChangeCountComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(ChangeCountComparer); - } - - break; - - case DOMAIN: - if (reverse) - { - _watchList.Sort(DomainComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(DomainComparer); - } - - break; - - case TYPE: - if (reverse) - { - _watchList.Sort(DisplayTypeComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(DisplayTypeComparer); - } - - break; - - case NOTES: - if (reverse) - { - _watchList.Sort(NoteComparer); - _watchList.Reverse(); - } - else - { - _watchList.Sort(NoteComparer); - } - - break; - } - } - - /// - /// Sets WatchList's domain list to a new one - /// domain will also be refreshed - /// - /// New domains - public void RefreshDomains(IMemoryDomains core) - { - _memoryDomains = core; - Parallel.ForEach(_watchList, watch => - { - if (watch.IsSeparator) - { - return; - } - - watch.Domain = core[watch.Domain.Name]; - watch.ResetPrevious(); - watch.Update(); - watch.ClearChangeCount(); - }); - } - - /// - /// Updates all in the current collection - /// - public void UpdateValues() - { - Parallel.ForEach(_watchList, watch => - { - watch.Update(); - }); - } - - #endregion - - #region Propeties - - #region ICollection - - /// - /// Gets the number of elements contained in this - /// - public int Count => _watchList.Count; - - /// - /// is always read-write - /// so this value will be always false - /// - public bool IsReadOnly => false; - - #endregion ICollection - - #region IList - - /// - /// Gets or sets element at the specified index - /// - /// The zero based index of the element you want to get or set - /// at the specified index - public Watch this[int index] - { - get - { - return _watchList[index]; - } - - set - { - _watchList[index] = value; - } - } - - #endregion IList - - /// - /// Gets or sets a value indicating whether the collection has changed or not - /// - public bool Changes { get; set; } - - /// - /// Gets or sets current 's filename - /// - public string CurrentFileName { get; set; } - - /// - /// Gets the number of that are not - /// - public int WatchCount - { - get - { - return _watchList.Count(watch => !watch.IsSeparator); - } - } - - #endregion - - #region File handling logic - probably needs to be its own class - - public bool Load(string path, bool append) - { - var result = LoadFile(path, append); - - if (result) - { - if (append) - { - Changes = true; - } - else - { - CurrentFileName = path; - Changes = false; - } - } - - return result; - } - - public void Reload() - { - if (!string.IsNullOrWhiteSpace(CurrentFileName)) - { - LoadFile(CurrentFileName, append: false); - Changes = false; - } - } - - public bool Save() - { - if (string.IsNullOrWhiteSpace(CurrentFileName)) - { - return false; - } - - using (var sw = new StreamWriter(CurrentFileName)) - { - var sb = new StringBuilder(); - sb.Append("SystemID ").AppendLine(_systemid); - - foreach (var watch in _watchList) - { - sb.AppendLine(watch.ToString()); - } - - sw.WriteLine(sb.ToString()); - } - - Changes = false; - return true; - } - - public bool SaveAs(FileInfo file) - { - if (file != null) - { - CurrentFileName = file.FullName; - return Save(); - } - - return false; - } - - private bool LoadFile(string path, bool append) - { - var file = new FileInfo(path); - if (file.Exists == false) - { - return false; - } - - var isBizHawkWatch = true; // Hack to support .wch files from other emulators - using (var sr = file.OpenText()) - { - string line; - - if (!append) - { - Clear(); - } - - while ((line = sr.ReadLine()) != null) - { - // .wch files from other emulators start with a number representing the number of watch, that line can be discarded here - // Any properly formatted line couldn't possibly be this short anyway, this also takes care of any garbage lines that might be in a file - if (line.Length < 5) - { - isBizHawkWatch = false; - continue; - } - - if (line.Length >= 6 && line.Substring(0, 6) == "Domain") - { - isBizHawkWatch = true; - } - - if (line.Length >= 8 && line.Substring(0, 8) == "SystemID") - { - continue; - } - - var numColumns = line.HowMany('\t'); - int startIndex; - if (numColumns == 5) - { - // If 5, then this is a post 1.0.5 .wch file - if (isBizHawkWatch) - { - // Do nothing here - } - else - { - startIndex = line.IndexOf('\t') + 1; - line = line.Substring(startIndex, line.Length - startIndex); // 5 digit value representing the watch position number - } - } - else - { - continue; // If not 4, something is wrong with this line, ignore it - } - - // Temporary, rename if kept - int addr; - var memDomain = _memoryDomains.MainMemory; - - var temp = line.Substring(0, line.IndexOf('\t')); - try - { - addr = int.Parse(temp, NumberStyles.HexNumber); - } - catch - { - continue; - } - - startIndex = line.IndexOf('\t') + 1; - line = line.Substring(startIndex, line.Length - startIndex); // Type - var size = Watch.SizeFromChar(line[0]); - - startIndex = line.IndexOf('\t') + 1; - line = line.Substring(startIndex, line.Length - startIndex); // Signed - var type = Watch.DisplayTypeFromChar(line[0]); - - startIndex = line.IndexOf('\t') + 1; - line = line.Substring(startIndex, line.Length - startIndex); // Endian - try - { - startIndex = short.Parse(line[0].ToString()); - } - catch - { - continue; - } - - var bigEndian = startIndex != 0; - - if (isBizHawkWatch) - { - startIndex = line.IndexOf('\t') + 1; - line = line.Substring(startIndex, line.Length - startIndex); // Domain - temp = line.Substring(0, line.IndexOf('\t')); - memDomain = _memoryDomains[temp] ?? _memoryDomains.MainMemory; - } - - startIndex = line.IndexOf('\t') + 1; - var notes = line.Substring(startIndex, line.Length - startIndex); - - _watchList.Add( - Watch.GenerateWatch( - memDomain, - addr, - size, - type, - bigEndian, - notes)); - } - - CurrentFileName = path; - } - - if (!append) - { - Changes = false; - } - else - { - Changes = true; - } - - return true; - } - #endregion - } -} diff --git a/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj b/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj deleted file mode 100644 index e65442660a..0000000000 --- a/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - None - - - true - ..\output\ - TRACE;DEBUG;WINDOWS - full - AnyCPU - false - prompt - - MinimumRecommendedRules.ruleset - - - ..\output\ - TRACE;WINDOWS - true - pdbonly - AnyCPU - false - prompt - - MinimumRecommendedRules.ruleset - - - - Debug - x86 - {2D2890A8-C338-4439-AD8B-CB9EE85A94F9} - Exe - Properties - BizHawk.Client.DBMan - BizHawk.Client.DBMan - v4.6.1 - 512 - - true - - - - .\CSharp-SQLite.dll - - - - - - - - - - - - - Form - - - DATConverter.cs - - - - - - - Form - - - DBMan_MainForm.cs - - - - - - - - - DATConverter.cs - - - DBMan_MainForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {24a0aa3c-b25f-4197-b23d-476d6462dba0} - BizHawk.Client.Common - - - {866f8d13-0678-4ff9-80a4-a3993fd4d8a3} - BizHawk.Common - - - {e1a23168-b571-411c-b360-2229e7225e0e} - BizHawk.Emulation.Common - - - {f51946ea-827f-4d82-b841-1f2f6d060312} - BizHawk.Emulation.DiscSystem - - - - - \ No newline at end of file diff --git a/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj.DotSettings b/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj.DotSettings deleted file mode 100644 index 73e96563f9..0000000000 --- a/BizHawk.Client.DBMan/BizHawk.Client.DBMan.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - CSharp60 \ No newline at end of file diff --git a/BizHawk.Client.DBMan/DBMan_MainForm.Designer.cs b/BizHawk.Client.DBMan/DBMan_MainForm.Designer.cs deleted file mode 100644 index 0ed1f2534b..0000000000 --- a/BizHawk.Client.DBMan/DBMan_MainForm.Designer.cs +++ /dev/null @@ -1,793 +0,0 @@ -namespace BizHawk.Client.DBMan -{ - partial class DBMan_MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.filterPanel = new System.Windows.Forms.Panel(); - this.whereLabel = new System.Windows.Forms.Label(); - this.systemBox = new System.Windows.Forms.ComboBox(); - this.whereBox = new System.Windows.Forms.TextBox(); - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.romListView = new System.Windows.Forms.ListView(); - this.romListColumnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.romListColumnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.romListColumnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.romListColumnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.romListColumnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.detailPanel = new System.Windows.Forms.Panel(); - this.sizeLabel = new System.Windows.Forms.Label(); - this.sizeBox = new System.Windows.Forms.TextBox(); - this.notesLabel = new System.Windows.Forms.Label(); - this.notesBox = new System.Windows.Forms.TextBox(); - this.altNamesLabel = new System.Windows.Forms.Label(); - this.altNamesBox = new System.Windows.Forms.TextBox(); - this.cancelButton = new System.Windows.Forms.Button(); - this.saveButton = new System.Windows.Forms.Button(); - this.playersBox = new System.Windows.Forms.TextBox(); - this.catalogLabel = new System.Windows.Forms.Label(); - this.catalogBox = new System.Windows.Forms.TextBox(); - this.playersLabel = new System.Windows.Forms.Label(); - this.releaseDateLabel = new System.Windows.Forms.Label(); - this.releaseDateBox = new System.Windows.Forms.TextBox(); - this.classificationLabel = new System.Windows.Forms.Label(); - this.classificationBox = new System.Windows.Forms.ComboBox(); - this.publisherLabel = new System.Windows.Forms.Label(); - this.publisherBox = new System.Windows.Forms.TextBox(); - this.developerLabel = new System.Windows.Forms.Label(); - this.developerBox = new System.Windows.Forms.TextBox(); - this.romStatusLabel = new System.Windows.Forms.Label(); - this.romStatusBox = new System.Windows.Forms.ComboBox(); - this.tagsLabel = new System.Windows.Forms.Label(); - this.tagsBox = new System.Windows.Forms.TextBox(); - this.romMetaLabel = new System.Windows.Forms.Label(); - this.romMetaBox = new System.Windows.Forms.TextBox(); - this.gameMetaLabel = new System.Windows.Forms.Label(); - this.gameMetaBox = new System.Windows.Forms.TextBox(); - this.versionLabel = new System.Windows.Forms.Label(); - this.versionBox = new System.Windows.Forms.TextBox(); - this.regionLabel = new System.Windows.Forms.Label(); - this.regionBox = new System.Windows.Forms.TextBox(); - this.sha1Box = new System.Windows.Forms.TextBox(); - this.md5Box = new System.Windows.Forms.TextBox(); - this.crcBox = new System.Windows.Forms.TextBox(); - this.sha1Label = new System.Windows.Forms.Label(); - this.md5Label = new System.Windows.Forms.Label(); - this.crcLabel = new System.Windows.Forms.Label(); - this.gameSystemBox = new System.Windows.Forms.ComboBox(); - this.systemLabel = new System.Windows.Forms.Label(); - this.nameBox = new System.Windows.Forms.TextBox(); - this.nameLabel = new System.Windows.Forms.Label(); - this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); - this.databaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.directoryScanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cleanupDBToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.exportGameDBToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteButton = new System.Windows.Forms.Button(); - this.filterPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.detailPanel.SuspendLayout(); - this.mainMenuStrip.SuspendLayout(); - this.SuspendLayout(); - // - // filterPanel - // - this.filterPanel.Controls.Add(this.whereLabel); - this.filterPanel.Controls.Add(this.systemBox); - this.filterPanel.Controls.Add(this.whereBox); - this.filterPanel.Controls.Add(this.menuStrip1); - this.filterPanel.Dock = System.Windows.Forms.DockStyle.Top; - this.filterPanel.Location = new System.Drawing.Point(0, 24); - this.filterPanel.Name = "filterPanel"; - this.filterPanel.Size = new System.Drawing.Size(963, 30); - this.filterPanel.TabIndex = 0; - // - // whereLabel - // - this.whereLabel.AutoSize = true; - this.whereLabel.Location = new System.Drawing.Point(131, 9); - this.whereLabel.Name = "whereLabel"; - this.whereLabel.Size = new System.Drawing.Size(42, 13); - this.whereLabel.TabIndex = 2; - this.whereLabel.Text = "Where:"; - // - // systemBox - // - this.systemBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.systemBox.FormattingEnabled = true; - this.systemBox.Location = new System.Drawing.Point(4, 3); - this.systemBox.Name = "systemBox"; - this.systemBox.Size = new System.Drawing.Size(121, 21); - this.systemBox.TabIndex = 1; - this.systemBox.SelectedIndexChanged += new System.EventHandler(this.systemBox_SelectedIndexChanged); - // - // whereBox - // - this.whereBox.Location = new System.Drawing.Point(179, 3); - this.whereBox.Name = "whereBox"; - this.whereBox.Size = new System.Drawing.Size(334, 20); - this.whereBox.TabIndex = 2; - // - // menuStrip1 - // - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(963, 24); - this.menuStrip1.TabIndex = 3; - this.menuStrip1.Text = "menuStrip1"; - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(0, 54); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.romListView); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.detailPanel); - this.splitContainer1.Size = new System.Drawing.Size(963, 624); - this.splitContainer1.SplitterDistance = 561; - this.splitContainer1.TabIndex = 0; - this.splitContainer1.TabStop = false; - // - // romListView - // - this.romListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.romListColumnHeader1, - this.romListColumnHeader2, - this.romListColumnHeader3, - this.romListColumnHeader4, - this.romListColumnHeader5}); - this.romListView.Dock = System.Windows.Forms.DockStyle.Fill; - this.romListView.FullRowSelect = true; - this.romListView.GridLines = true; - this.romListView.Location = new System.Drawing.Point(0, 0); - this.romListView.MultiSelect = false; - this.romListView.Name = "romListView"; - this.romListView.Size = new System.Drawing.Size(561, 624); - this.romListView.TabIndex = 0; - this.romListView.TabStop = false; - this.romListView.UseCompatibleStateImageBehavior = false; - this.romListView.View = System.Windows.Forms.View.Details; - this.romListView.SelectedIndexChanged += new System.EventHandler(this.selectedRomChanged); - // - // romListColumnHeader1 - // - this.romListColumnHeader1.Text = "Game"; - this.romListColumnHeader1.Width = 86; - // - // romListColumnHeader2 - // - this.romListColumnHeader2.Text = "Region"; - this.romListColumnHeader2.Width = 80; - // - // romListColumnHeader3 - // - this.romListColumnHeader3.Text = "Version"; - this.romListColumnHeader3.Width = 80; - // - // romListColumnHeader4 - // - this.romListColumnHeader4.Text = "Meta"; - this.romListColumnHeader4.Width = 80; - // - // romListColumnHeader5 - // - this.romListColumnHeader5.Text = "Tags"; - // - // detailPanel - // - this.detailPanel.Controls.Add(this.deleteButton); - this.detailPanel.Controls.Add(this.sizeLabel); - this.detailPanel.Controls.Add(this.sizeBox); - this.detailPanel.Controls.Add(this.notesLabel); - this.detailPanel.Controls.Add(this.notesBox); - this.detailPanel.Controls.Add(this.altNamesLabel); - this.detailPanel.Controls.Add(this.altNamesBox); - this.detailPanel.Controls.Add(this.cancelButton); - this.detailPanel.Controls.Add(this.saveButton); - this.detailPanel.Controls.Add(this.playersBox); - this.detailPanel.Controls.Add(this.catalogLabel); - this.detailPanel.Controls.Add(this.catalogBox); - this.detailPanel.Controls.Add(this.playersLabel); - this.detailPanel.Controls.Add(this.releaseDateLabel); - this.detailPanel.Controls.Add(this.releaseDateBox); - this.detailPanel.Controls.Add(this.classificationLabel); - this.detailPanel.Controls.Add(this.classificationBox); - this.detailPanel.Controls.Add(this.publisherLabel); - this.detailPanel.Controls.Add(this.publisherBox); - this.detailPanel.Controls.Add(this.developerLabel); - this.detailPanel.Controls.Add(this.developerBox); - this.detailPanel.Controls.Add(this.romStatusLabel); - this.detailPanel.Controls.Add(this.romStatusBox); - this.detailPanel.Controls.Add(this.tagsLabel); - this.detailPanel.Controls.Add(this.tagsBox); - this.detailPanel.Controls.Add(this.romMetaLabel); - this.detailPanel.Controls.Add(this.romMetaBox); - this.detailPanel.Controls.Add(this.gameMetaLabel); - this.detailPanel.Controls.Add(this.gameMetaBox); - this.detailPanel.Controls.Add(this.versionLabel); - this.detailPanel.Controls.Add(this.versionBox); - this.detailPanel.Controls.Add(this.regionLabel); - this.detailPanel.Controls.Add(this.regionBox); - this.detailPanel.Controls.Add(this.sha1Box); - this.detailPanel.Controls.Add(this.md5Box); - this.detailPanel.Controls.Add(this.crcBox); - this.detailPanel.Controls.Add(this.sha1Label); - this.detailPanel.Controls.Add(this.md5Label); - this.detailPanel.Controls.Add(this.crcLabel); - this.detailPanel.Controls.Add(this.gameSystemBox); - this.detailPanel.Controls.Add(this.systemLabel); - this.detailPanel.Controls.Add(this.nameBox); - this.detailPanel.Controls.Add(this.nameLabel); - this.detailPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.detailPanel.Location = new System.Drawing.Point(0, 0); - this.detailPanel.Name = "detailPanel"; - this.detailPanel.Size = new System.Drawing.Size(398, 624); - this.detailPanel.TabIndex = 0; - // - // sizeLabel - // - this.sizeLabel.AutoSize = true; - this.sizeLabel.Location = new System.Drawing.Point(6, 557); - this.sizeLabel.Name = "sizeLabel"; - this.sizeLabel.Size = new System.Drawing.Size(27, 13); - this.sizeLabel.TabIndex = 50; - this.sizeLabel.Text = "Size"; - // - // sizeBox - // - this.sizeBox.Location = new System.Drawing.Point(80, 557); - this.sizeBox.Name = "sizeBox"; - this.sizeBox.ReadOnly = true; - this.sizeBox.Size = new System.Drawing.Size(255, 20); - this.sizeBox.TabIndex = 49; - // - // notesLabel - // - this.notesLabel.AutoSize = true; - this.notesLabel.Location = new System.Drawing.Point(3, 408); - this.notesLabel.Name = "notesLabel"; - this.notesLabel.Size = new System.Drawing.Size(35, 13); - this.notesLabel.TabIndex = 48; - this.notesLabel.Text = "Notes"; - // - // notesBox - // - this.notesBox.Location = new System.Drawing.Point(80, 408); - this.notesBox.Multiline = true; - this.notesBox.Name = "notesBox"; - this.notesBox.Size = new System.Drawing.Size(296, 61); - this.notesBox.TabIndex = 44; - // - // altNamesLabel - // - this.altNamesLabel.AutoSize = true; - this.altNamesLabel.Location = new System.Drawing.Point(3, 381); - this.altNamesLabel.Name = "altNamesLabel"; - this.altNamesLabel.Size = new System.Drawing.Size(55, 13); - this.altNamesLabel.TabIndex = 46; - this.altNamesLabel.Text = "Alt Names"; - // - // altNamesBox - // - this.altNamesBox.Location = new System.Drawing.Point(80, 381); - this.altNamesBox.Name = "altNamesBox"; - this.altNamesBox.Size = new System.Drawing.Size(296, 20); - this.altNamesBox.TabIndex = 42; - // - // cancelButton - // - this.cancelButton.Location = new System.Drawing.Point(125, 589); - this.cancelButton.Name = "cancelButton"; - this.cancelButton.Size = new System.Drawing.Size(75, 23); - this.cancelButton.TabIndex = 48; - this.cancelButton.Text = "Cancel"; - this.cancelButton.UseVisualStyleBackColor = true; - this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); - // - // saveButton - // - this.saveButton.Location = new System.Drawing.Point(6, 589); - this.saveButton.Name = "saveButton"; - this.saveButton.Size = new System.Drawing.Size(75, 23); - this.saveButton.TabIndex = 46; - this.saveButton.Text = "&Save"; - this.saveButton.UseVisualStyleBackColor = true; - this.saveButton.Click += new System.EventHandler(this.saveButton_Click); - // - // playersBox - // - this.playersBox.AutoCompleteCustomSource.AddRange(new string[] { - "1 Player", - "2 Players Alternating", - "2 Players Cooperative", - "2 Players Versus"}); - this.playersBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.playersBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.playersBox.Location = new System.Drawing.Point(80, 326); - this.playersBox.Name = "playersBox"; - this.playersBox.Size = new System.Drawing.Size(194, 20); - this.playersBox.TabIndex = 38; - // - // catalogLabel - // - this.catalogLabel.AutoSize = true; - this.catalogLabel.Location = new System.Drawing.Point(3, 354); - this.catalogLabel.Name = "catalogLabel"; - this.catalogLabel.Size = new System.Drawing.Size(43, 13); - this.catalogLabel.TabIndex = 41; - this.catalogLabel.Text = "Catalog"; - // - // catalogBox - // - this.catalogBox.Location = new System.Drawing.Point(80, 354); - this.catalogBox.Name = "catalogBox"; - this.catalogBox.Size = new System.Drawing.Size(194, 20); - this.catalogBox.TabIndex = 40; - // - // playersLabel - // - this.playersLabel.AutoSize = true; - this.playersLabel.Location = new System.Drawing.Point(3, 326); - this.playersLabel.Name = "playersLabel"; - this.playersLabel.Size = new System.Drawing.Size(41, 13); - this.playersLabel.TabIndex = 39; - this.playersLabel.Text = "Players"; - // - // releaseDateLabel - // - this.releaseDateLabel.AutoSize = true; - this.releaseDateLabel.Location = new System.Drawing.Point(3, 299); - this.releaseDateLabel.Name = "releaseDateLabel"; - this.releaseDateLabel.Size = new System.Drawing.Size(48, 13); - this.releaseDateLabel.TabIndex = 37; - this.releaseDateLabel.Text = "Rls Date"; - // - // releaseDateBox - // - this.releaseDateBox.Location = new System.Drawing.Point(80, 299); - this.releaseDateBox.Name = "releaseDateBox"; - this.releaseDateBox.Size = new System.Drawing.Size(100, 20); - this.releaseDateBox.TabIndex = 36; - // - // classificationLabel - // - this.classificationLabel.AutoSize = true; - this.classificationLabel.Location = new System.Drawing.Point(3, 271); - this.classificationLabel.Name = "classificationLabel"; - this.classificationLabel.Size = new System.Drawing.Size(32, 13); - this.classificationLabel.TabIndex = 35; - this.classificationLabel.Text = "Class"; - // - // classificationBox - // - this.classificationBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.classificationBox.FormattingEnabled = true; - this.classificationBox.Items.AddRange(new object[] { - "Licensed", - "Unlicensed", - "Unreleased", - "Homebrew", - "Test Rom", - "Firmware"}); - this.classificationBox.Location = new System.Drawing.Point(80, 271); - this.classificationBox.Name = "classificationBox"; - this.classificationBox.Size = new System.Drawing.Size(121, 21); - this.classificationBox.TabIndex = 34; - // - // publisherLabel - // - this.publisherLabel.AutoSize = true; - this.publisherLabel.Location = new System.Drawing.Point(3, 244); - this.publisherLabel.Name = "publisherLabel"; - this.publisherLabel.Size = new System.Drawing.Size(50, 13); - this.publisherLabel.TabIndex = 33; - this.publisherLabel.Text = "Publisher"; - // - // publisherBox - // - this.publisherBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.publisherBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.publisherBox.Location = new System.Drawing.Point(80, 244); - this.publisherBox.Name = "publisherBox"; - this.publisherBox.Size = new System.Drawing.Size(194, 20); - this.publisherBox.TabIndex = 32; - // - // developerLabel - // - this.developerLabel.AutoSize = true; - this.developerLabel.Location = new System.Drawing.Point(3, 217); - this.developerLabel.Name = "developerLabel"; - this.developerLabel.Size = new System.Drawing.Size(56, 13); - this.developerLabel.TabIndex = 31; - this.developerLabel.Text = "Developer"; - // - // developerBox - // - this.developerBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.developerBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.developerBox.Location = new System.Drawing.Point(80, 217); - this.developerBox.Name = "developerBox"; - this.developerBox.Size = new System.Drawing.Size(194, 20); - this.developerBox.TabIndex = 30; - // - // romStatusLabel - // - this.romStatusLabel.AutoSize = true; - this.romStatusLabel.Location = new System.Drawing.Point(3, 189); - this.romStatusLabel.Name = "romStatusLabel"; - this.romStatusLabel.Size = new System.Drawing.Size(62, 13); - this.romStatusLabel.TabIndex = 29; - this.romStatusLabel.Text = "Rom Status"; - // - // romStatusBox - // - this.romStatusBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.romStatusBox.FormattingEnabled = true; - this.romStatusBox.Items.AddRange(new object[] { - "OK", - "Bad Dump", - "Hack", - "Translation", - "Overdump", - "Trained"}); - this.romStatusBox.Location = new System.Drawing.Point(80, 189); - this.romStatusBox.Name = "romStatusBox"; - this.romStatusBox.Size = new System.Drawing.Size(121, 21); - this.romStatusBox.TabIndex = 28; - // - // tagsLabel - // - this.tagsLabel.AutoSize = true; - this.tagsLabel.Location = new System.Drawing.Point(3, 162); - this.tagsLabel.Name = "tagsLabel"; - this.tagsLabel.Size = new System.Drawing.Size(31, 13); - this.tagsLabel.TabIndex = 27; - this.tagsLabel.Text = "Tags"; - // - // tagsBox - // - this.tagsBox.Location = new System.Drawing.Point(80, 162); - this.tagsBox.Name = "tagsBox"; - this.tagsBox.Size = new System.Drawing.Size(296, 20); - this.tagsBox.TabIndex = 26; - // - // romMetaLabel - // - this.romMetaLabel.AutoSize = true; - this.romMetaLabel.Location = new System.Drawing.Point(3, 135); - this.romMetaLabel.Name = "romMetaLabel"; - this.romMetaLabel.Size = new System.Drawing.Size(62, 13); - this.romMetaLabel.TabIndex = 25; - this.romMetaLabel.Text = "Meta (Rom)"; - // - // romMetaBox - // - this.romMetaBox.Location = new System.Drawing.Point(80, 135); - this.romMetaBox.Name = "romMetaBox"; - this.romMetaBox.Size = new System.Drawing.Size(296, 20); - this.romMetaBox.TabIndex = 24; - // - // gameMetaLabel - // - this.gameMetaLabel.AutoSize = true; - this.gameMetaLabel.Location = new System.Drawing.Point(3, 108); - this.gameMetaLabel.Name = "gameMetaLabel"; - this.gameMetaLabel.Size = new System.Drawing.Size(68, 13); - this.gameMetaLabel.TabIndex = 23; - this.gameMetaLabel.Text = "Meta (Game)"; - // - // gameMetaBox - // - this.gameMetaBox.Location = new System.Drawing.Point(80, 108); - this.gameMetaBox.Name = "gameMetaBox"; - this.gameMetaBox.Size = new System.Drawing.Size(296, 20); - this.gameMetaBox.TabIndex = 22; - // - // versionLabel - // - this.versionLabel.AutoSize = true; - this.versionLabel.Location = new System.Drawing.Point(3, 81); - this.versionLabel.Name = "versionLabel"; - this.versionLabel.Size = new System.Drawing.Size(42, 13); - this.versionLabel.TabIndex = 21; - this.versionLabel.Text = "Version"; - // - // versionBox - // - this.versionBox.Location = new System.Drawing.Point(80, 81); - this.versionBox.Name = "versionBox"; - this.versionBox.Size = new System.Drawing.Size(296, 20); - this.versionBox.TabIndex = 20; - // - // regionLabel - // - this.regionLabel.AutoSize = true; - this.regionLabel.Location = new System.Drawing.Point(3, 54); - this.regionLabel.Name = "regionLabel"; - this.regionLabel.Size = new System.Drawing.Size(41, 13); - this.regionLabel.TabIndex = 19; - this.regionLabel.Text = "Region"; - // - // regionBox - // - this.regionBox.AutoCompleteCustomSource.AddRange(new string[] { - "USA", - "Japan", - "Europe", - "Taiwan", - "Brazil", - "Korea"}); - this.regionBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.regionBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.regionBox.Location = new System.Drawing.Point(80, 54); - this.regionBox.Name = "regionBox"; - this.regionBox.Size = new System.Drawing.Size(194, 20); - this.regionBox.TabIndex = 18; - // - // sha1Box - // - this.sha1Box.Location = new System.Drawing.Point(80, 530); - this.sha1Box.Name = "sha1Box"; - this.sha1Box.ReadOnly = true; - this.sha1Box.Size = new System.Drawing.Size(296, 20); - this.sha1Box.TabIndex = 17; - this.sha1Box.TabStop = false; - // - // md5Box - // - this.md5Box.Location = new System.Drawing.Point(80, 503); - this.md5Box.Name = "md5Box"; - this.md5Box.ReadOnly = true; - this.md5Box.Size = new System.Drawing.Size(255, 20); - this.md5Box.TabIndex = 16; - this.md5Box.TabStop = false; - // - // crcBox - // - this.crcBox.Location = new System.Drawing.Point(80, 477); - this.crcBox.Name = "crcBox"; - this.crcBox.ReadOnly = true; - this.crcBox.Size = new System.Drawing.Size(100, 20); - this.crcBox.TabIndex = 15; - this.crcBox.TabStop = false; - // - // sha1Label - // - this.sha1Label.AutoSize = true; - this.sha1Label.Location = new System.Drawing.Point(3, 530); - this.sha1Label.Name = "sha1Label"; - this.sha1Label.Size = new System.Drawing.Size(35, 13); - this.sha1Label.TabIndex = 14; - this.sha1Label.Text = "SHA1"; - // - // md5Label - // - this.md5Label.AutoSize = true; - this.md5Label.Location = new System.Drawing.Point(3, 503); - this.md5Label.Name = "md5Label"; - this.md5Label.Size = new System.Drawing.Size(30, 13); - this.md5Label.TabIndex = 13; - this.md5Label.Text = "MD5"; - // - // crcLabel - // - this.crcLabel.AutoSize = true; - this.crcLabel.Location = new System.Drawing.Point(3, 477); - this.crcLabel.Name = "crcLabel"; - this.crcLabel.Size = new System.Drawing.Size(41, 13); - this.crcLabel.TabIndex = 12; - this.crcLabel.Text = "CRC32"; - // - // gameSystemBox - // - this.gameSystemBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.gameSystemBox.FormattingEnabled = true; - this.gameSystemBox.Location = new System.Drawing.Point(80, 4); - this.gameSystemBox.Name = "gameSystemBox"; - this.gameSystemBox.Size = new System.Drawing.Size(121, 21); - this.gameSystemBox.TabIndex = 10; - // - // systemLabel - // - this.systemLabel.AutoSize = true; - this.systemLabel.Location = new System.Drawing.Point(3, 3); - this.systemLabel.Name = "systemLabel"; - this.systemLabel.Size = new System.Drawing.Size(41, 13); - this.systemLabel.TabIndex = 11; - this.systemLabel.Text = "System"; - // - // nameBox - // - this.nameBox.Location = new System.Drawing.Point(80, 27); - this.nameBox.Name = "nameBox"; - this.nameBox.Size = new System.Drawing.Size(233, 20); - this.nameBox.TabIndex = 11; - // - // nameLabel - // - this.nameLabel.AutoSize = true; - this.nameLabel.Location = new System.Drawing.Point(3, 27); - this.nameLabel.Name = "nameLabel"; - this.nameLabel.Size = new System.Drawing.Size(35, 13); - this.nameLabel.TabIndex = 0; - this.nameLabel.Text = "Name"; - // - // mainMenuStrip - // - this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.databaseToolStripMenuItem}); - this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); - this.mainMenuStrip.Name = "mainMenuStrip"; - this.mainMenuStrip.Size = new System.Drawing.Size(963, 24); - this.mainMenuStrip.TabIndex = 2; - this.mainMenuStrip.Text = "menuStrip2"; - // - // databaseToolStripMenuItem - // - this.databaseToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.directoryScanToolStripMenuItem, - this.cleanupDBToolStripMenuItem, - this.exportGameDBToolStripMenuItem}); - this.databaseToolStripMenuItem.Name = "databaseToolStripMenuItem"; - this.databaseToolStripMenuItem.Size = new System.Drawing.Size(67, 20); - this.databaseToolStripMenuItem.Text = "Database"; - // - // directoryScanToolStripMenuItem - // - this.directoryScanToolStripMenuItem.Name = "directoryScanToolStripMenuItem"; - this.directoryScanToolStripMenuItem.Size = new System.Drawing.Size(156, 22); - this.directoryScanToolStripMenuItem.Text = "Directory Scan"; - this.directoryScanToolStripMenuItem.Click += new System.EventHandler(this.directoryScanToolStripMenuItem_Click); - // - // cleanupDBToolStripMenuItem - // - this.cleanupDBToolStripMenuItem.Name = "cleanupDBToolStripMenuItem"; - this.cleanupDBToolStripMenuItem.Size = new System.Drawing.Size(156, 22); - this.cleanupDBToolStripMenuItem.Text = "Cleanup DB"; - this.cleanupDBToolStripMenuItem.Click += new System.EventHandler(this.cleanupDBToolStripMenuItem_Click); - // - // exportGameDBToolStripMenuItem - // - this.exportGameDBToolStripMenuItem.Name = "exportGameDBToolStripMenuItem"; - this.exportGameDBToolStripMenuItem.Size = new System.Drawing.Size(156, 22); - this.exportGameDBToolStripMenuItem.Text = "Export GameDB"; - this.exportGameDBToolStripMenuItem.Click += new System.EventHandler(this.exportGameDBToolStripMenuItem_Click); - // - // deleteButton - // - this.deleteButton.Location = new System.Drawing.Point(301, 589); - this.deleteButton.Name = "deleteButton"; - this.deleteButton.Size = new System.Drawing.Size(75, 23); - this.deleteButton.TabIndex = 51; - this.deleteButton.Text = "Delete"; - this.deleteButton.UseVisualStyleBackColor = true; - this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click); - // - // DBMan_MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(963, 678); - this.Controls.Add(this.splitContainer1); - this.Controls.Add(this.filterPanel); - this.Controls.Add(this.mainMenuStrip); - this.KeyPreview = true; - this.MainMenuStrip = this.menuStrip1; - this.Name = "DBMan_MainForm"; - this.Text = "Bizhawk DBMan"; - this.filterPanel.ResumeLayout(false); - this.filterPanel.PerformLayout(); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.detailPanel.ResumeLayout(false); - this.detailPanel.PerformLayout(); - this.mainMenuStrip.ResumeLayout(false); - this.mainMenuStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Panel filterPanel; - private System.Windows.Forms.Label whereLabel; - private System.Windows.Forms.ComboBox systemBox; - private System.Windows.Forms.TextBox whereBox; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.ListView romListView; - private System.Windows.Forms.MenuStrip menuStrip1; - private System.Windows.Forms.MenuStrip mainMenuStrip; - private System.Windows.Forms.ToolStripMenuItem databaseToolStripMenuItem; - private System.Windows.Forms.Panel detailPanel; - private System.Windows.Forms.ToolStripMenuItem directoryScanToolStripMenuItem; - private System.Windows.Forms.ComboBox gameSystemBox; - private System.Windows.Forms.Label systemLabel; - private System.Windows.Forms.TextBox nameBox; - private System.Windows.Forms.Label nameLabel; - private System.Windows.Forms.ColumnHeader romListColumnHeader1; - private System.Windows.Forms.ColumnHeader romListColumnHeader2; - private System.Windows.Forms.ColumnHeader romListColumnHeader3; - private System.Windows.Forms.ColumnHeader romListColumnHeader4; - private System.Windows.Forms.ColumnHeader romListColumnHeader5; - private System.Windows.Forms.TextBox crcBox; - private System.Windows.Forms.Label sha1Label; - private System.Windows.Forms.Label md5Label; - private System.Windows.Forms.Label crcLabel; - private System.Windows.Forms.TextBox sha1Box; - private System.Windows.Forms.TextBox md5Box; - private System.Windows.Forms.Label regionLabel; - private System.Windows.Forms.TextBox regionBox; - private System.Windows.Forms.Label versionLabel; - private System.Windows.Forms.TextBox versionBox; - private System.Windows.Forms.Label romMetaLabel; - private System.Windows.Forms.TextBox romMetaBox; - private System.Windows.Forms.Label gameMetaLabel; - private System.Windows.Forms.TextBox gameMetaBox; - private System.Windows.Forms.TextBox tagsBox; - private System.Windows.Forms.Label romStatusLabel; - private System.Windows.Forms.ComboBox romStatusBox; - private System.Windows.Forms.Label tagsLabel; - private System.Windows.Forms.Label developerLabel; - private System.Windows.Forms.TextBox developerBox; - private System.Windows.Forms.Label classificationLabel; - private System.Windows.Forms.ComboBox classificationBox; - private System.Windows.Forms.Label publisherLabel; - private System.Windows.Forms.TextBox publisherBox; - private System.Windows.Forms.Label releaseDateLabel; - private System.Windows.Forms.TextBox releaseDateBox; - private System.Windows.Forms.Label playersLabel; - private System.Windows.Forms.Label catalogLabel; - private System.Windows.Forms.TextBox catalogBox; - private System.Windows.Forms.TextBox playersBox; - private System.Windows.Forms.Button cancelButton; - private System.Windows.Forms.Button saveButton; - private System.Windows.Forms.ToolStripMenuItem cleanupDBToolStripMenuItem; - private System.Windows.Forms.Label altNamesLabel; - private System.Windows.Forms.TextBox altNamesBox; - private System.Windows.Forms.Label notesLabel; - private System.Windows.Forms.TextBox notesBox; - private System.Windows.Forms.Label sizeLabel; - private System.Windows.Forms.TextBox sizeBox; - private System.Windows.Forms.ToolStripMenuItem exportGameDBToolStripMenuItem; - private System.Windows.Forms.Button deleteButton; - - } -} - diff --git a/BizHawk.Client.DBMan/DBMan_MainForm.cs b/BizHawk.Client.DBMan/DBMan_MainForm.cs deleted file mode 100644 index c3dbd793b6..0000000000 --- a/BizHawk.Client.DBMan/DBMan_MainForm.cs +++ /dev/null @@ -1,345 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.DBMan -{ - public partial class DBMan_MainForm : Form - { - string[] Systems = { "SMS", "GG", "SG", "PCE", "PCECD", "SGX", "NES", "GEN" }; - Rom SelectedRom; - - public DBMan_MainForm() - { - InitializeComponent(); - - nameBox.GotFocus += (o, e) => { nameBox.SelectionLength = 0; nameBox.SelectionStart = nameBox.Text.Length; }; - regionBox.GotFocus += (o, e) => { regionBox.SelectionLength = 0; regionBox.SelectionStart = versionBox.Text.Length; }; - versionBox.GotFocus += (o, e) => { versionBox.SelectionLength = 0; versionBox.SelectionStart = versionBox.Text.Length; }; - gameMetaBox.GotFocus += (o, e) => { gameMetaBox.SelectionLength = 0; gameMetaBox.SelectionStart = gameMetaBox.Text.Length; }; - romMetaBox.GotFocus += (o, e) => { romMetaBox.SelectionLength = 0; romMetaBox.SelectionStart = romMetaBox.Text.Length; }; - tagsBox.GotFocus += (o, e) => { tagsBox.SelectionLength = 0; tagsBox.SelectionStart = tagsBox.Text.Length; }; - developerBox.GotFocus += (o, e) => { developerBox.SelectionLength = 0; developerBox.SelectionStart = developerBox.Text.Length; }; - publisherBox.GotFocus += (o, e) => { publisherBox.SelectionLength = 0; publisherBox.SelectionStart = publisherBox.Text.Length; }; - releaseDateBox.GotFocus += (o, e) => { releaseDateBox.SelectionLength = 0; releaseDateBox.SelectionStart = releaseDateBox.Text.Length; }; - playersBox.GotFocus += (o, e) => { playersBox.SelectionLength = 0; playersBox.SelectionStart = playersBox.Text.Length; }; - catalogBox.GotFocus += (o, e) => { catalogBox.SelectionLength = 0; catalogBox.SelectionStart = catalogBox.Text.Length; }; - altNamesBox.GotFocus += (o, e) => { altNamesBox.SelectionLength = 0; altNamesBox.SelectionStart = altNamesBox.Text.Length; }; - notesBox.GotFocus += (o, e) => { notesBox.SelectionLength = 0; notesBox.SelectionStart = notesBox.Text.Length; }; - - configSystemBox(); - loadRomsForSelectedSystem(); - } - - void configSystemBox() - { - systemBox.Items.AddRange(Systems); - systemBox.Items.Add("Unassigned"); - systemBox.SelectedIndex = 0; - gameSystemBox.Items.AddRange(Systems); - gameSystemBox.Items.Add("Unassigned"); - } - - void loadRomsForSelectedSystem() - { - DB.LoadDbForSystem(systemBox.SelectedItem.ToString()); - var names = DB.GetDeveloperPublisherNames().ToArray(); - - romListView.Items.Clear(); - foreach (var rom in DB.Roms) - { - var lvi = new ListViewItem(new string[] { rom.DisplayName, rom.Region, rom.VersionTags, rom.CombinedMetaData, rom.Game.Tags }); - lvi.Tag = rom; - lvi.BackColor = rom.New ? Color.LightGreen : Color.White; - romListView.Items.Add(lvi); - } - detailPanel.Visible = false; - SelectedRom = null; - - developerBox.AutoCompleteCustomSource.Clear(); - developerBox.AutoCompleteCustomSource.AddRange(names); - publisherBox.AutoCompleteCustomSource.Clear(); - publisherBox.AutoCompleteCustomSource.AddRange(names); - } - - void systemBox_SelectedIndexChanged(object sender, EventArgs e) - { - loadRomsForSelectedSystem(); - } - - void directoryScanToolStripMenuItem_Click(object sender, EventArgs e) - { - var ds = new FolderBrowserDialog { ShowNewFolderButton = false }; - var result = ds.ShowDialog(); - if (result == DialogResult.OK) - { - var infos = DirectoryScan.GetRomInfos(ds.SelectedPath); - DirectoryScan.MergeRomInfosWithDatabase(infos); - MessageBox.Show("Directory Import complete!"); - } - } - - void selectedRomChanged(object sender, EventArgs e) - { - if (RomChangesMade()) - { - var result = MessageBox.Show("Save changes?", "Save or Cancel Changes", MessageBoxButtons.YesNo); - if (result == DialogResult.Yes) - saveButton_Click(null, null); - SelectedRom = null; - } - - if (romListView.SelectedItems.Count == 0) - { - detailPanel.Visible = false; - return; - } - - var rom = (Rom)romListView.SelectedItems[0].Tag; - SelectedRom = rom; - - gameSystemBox.Text = rom.System; - nameBox.Text = rom.Name; - crcBox.Text = rom.CRC32; - md5Box.Text = rom.MD5; - sha1Box.Text = rom.SHA1; - sizeBox.Text = rom.SizeFriendly; - regionBox.Text = rom.Region; - versionBox.Text = rom.VersionTags; - gameMetaBox.Text = rom.Game.GameMetadata; - romMetaBox.Text = rom.RomMetadata; - tagsBox.Text = rom.Game.Tags; - romStatusBox.Text = rom.RomStatus; - developerBox.Text = rom.Game.Developer; - publisherBox.Text = rom.Game.Publisher; - classificationBox.Text = rom.Game.Classification; - releaseDateBox.Text = rom.Game.ReleaseDate; - playersBox.Text = rom.Game.Players; - catalogBox.Text = rom.Catalog; - altNamesBox.Text = rom.Game.AltNames; - notesBox.Text = rom.Game.Notes; - - detailPanel.Visible = true; - } - - void cancelButton_Click(object sender, EventArgs e) - { - gameSystemBox.Text = SelectedRom.System; - nameBox.Text = SelectedRom.Name; - crcBox.Text = SelectedRom.CRC32; - md5Box.Text = SelectedRom.MD5; - sha1Box.Text = SelectedRom.SHA1; - sizeBox.Text = SelectedRom.SizeFriendly; - regionBox.Text = SelectedRom.Region; - versionBox.Text = SelectedRom.VersionTags; - gameMetaBox.Text = SelectedRom.Game.GameMetadata; - romMetaBox.Text = SelectedRom.RomMetadata; - tagsBox.Text = SelectedRom.Game.Tags; - romStatusBox.Text = SelectedRom.RomStatus; - developerBox.Text = SelectedRom.Game.Developer; - publisherBox.Text = SelectedRom.Game.Publisher; - classificationBox.Text = SelectedRom.Game.Classification; - releaseDateBox.Text = SelectedRom.Game.ReleaseDate; - playersBox.Text = SelectedRom.Game.Players; - catalogBox.Text = SelectedRom.Catalog; - altNamesBox.Text = SelectedRom.Game.AltNames; - notesBox.Text = SelectedRom.Game.Notes; - } - - void saveButton_Click(object sender, EventArgs e) - { - // Check if any changes were made - if (SelectedRom.New == false && RomChangesMade() == false) - return; - - int saveMode = 0; - string origSystem = SelectedRom.System; - string origName = SelectedRom.Name; - - // Did we change System or Name? - if (KeyChangesMade()) - { - var rslt = MessageBox.Show("Change all instances of this system/name?\n\nClicking Yes will change all roms to point to the new game info.\nClicking No will create a new Game instance.", "Confirm game change action", MessageBoxButtons.YesNo); - saveMode = (rslt == DialogResult.Yes) ? 1 : 2; - } - - // Actually save the stuff - SelectedRom.System = fmt(gameSystemBox.Text); - SelectedRom.Name = fmt(nameBox.Text); - SelectedRom.Region = fmt(regionBox.Text); - SelectedRom.VersionTags = fmt(versionBox.Text); - SelectedRom.Game.GameMetadata = fmt(gameMetaBox.Text); - SelectedRom.RomMetadata = fmt(romMetaBox.Text); - SelectedRom.Game.Tags = fmt(tagsBox.Text); - SelectedRom.RomStatus = fmt(romStatusBox.Text); - SelectedRom.Game.Developer = fmt(developerBox.Text); - SelectedRom.Game.Publisher = fmt(publisherBox.Text); - SelectedRom.Game.Classification = fmt(classificationBox.Text); - SelectedRom.Game.ReleaseDate = fmt(releaseDateBox.Text); - SelectedRom.Game.Players = fmt(playersBox.Text); - SelectedRom.Catalog = fmt(catalogBox.Text); - SelectedRom.Game.AltNames = fmt(altNamesBox.Text); - SelectedRom.Game.Notes = fmt(notesBox.Text); - SelectedRom.Modified = DateTime.Now; - - if (saveMode == 0) DB.SaveRom(SelectedRom); - if (saveMode == 1) DB.SaveRom1(SelectedRom, origSystem, origName); - if (saveMode == 2) DB.SaveRom2(SelectedRom); - - if (romListView.SelectedItems.Count > 0) - { - // Update the side listing - var romListItem = (ListViewItem)romListView.SelectedItems[0]; - romListItem.SubItems[0] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.DisplayName); - romListItem.SubItems[1] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.Region); - romListItem.SubItems[2] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.VersionTags); - romListItem.SubItems[3] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.CombinedMetaData); - romListItem.SubItems[4] = new ListViewItem.ListViewSubItem(romListItem, SelectedRom.Game.Tags); - romListItem.BackColor = SelectedRom.New ? Color.LightGreen : Color.White; - } - - if (saveMode > 0) loadRomsForSelectedSystem(); - } - - bool RomChangesMade() - { - if (SelectedRom == null) - return false; - - if (!streq(SelectedRom.System, gameSystemBox.Text)) return true; - if (!streq(SelectedRom.Name, nameBox.Text)) return true; - if (!streq(SelectedRom.Region, regionBox.Text)) return true; - if (!streq(SelectedRom.VersionTags, versionBox.Text)) return true; - if (!streq(SelectedRom.Game.GameMetadata, gameMetaBox.Text)) return true; - if (!streq(SelectedRom.RomMetadata, romMetaBox.Text)) return true; - if (!streq(SelectedRom.Game.Tags, tagsBox.Text)) return true; - if (!streq(SelectedRom.RomStatus, romStatusBox.Text)) return true; - if (!streq(SelectedRom.Game.Developer, developerBox.Text)) return true; - if (!streq(SelectedRom.Game.Publisher, publisherBox.Text)) return true; - if (!streq(SelectedRom.Game.Classification, classificationBox.Text)) return true; - if (!streq(SelectedRom.Game.ReleaseDate, releaseDateBox.Text)) return true; - if (!streq(SelectedRom.Game.Players, playersBox.Text)) return true; - if (!streq(SelectedRom.Catalog, catalogBox.Text)) return true; - if (!streq(SelectedRom.Game.AltNames, altNamesBox.Text)) return true; - if (!streq(SelectedRom.Game.Notes, notesBox.Text)) return true; - - return false; - } - - bool KeyChangesMade() - { - if (SelectedRom == null) - return false; - - if (!streq(SelectedRom.System, gameSystemBox.Text)) return true; - if (!streq(SelectedRom.Name, nameBox.Text)) return true; - return false; - } - - - static bool streq(string s1, string s2) - { - if (string.IsNullOrWhiteSpace(s1) && string.IsNullOrWhiteSpace(s2)) return true; - if (s1 == null || s2 == null) return false; - return s1.Trim() == s2.Trim(); - } - - static string fmt(string s) - { - var trimmed = s.Trim(); - if (trimmed.Length == 0) - return null; - return trimmed; - } - - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - if (keyData == (Keys.F5)) - { - loadRomsForSelectedSystem(); - return true; - } - if (keyData == (Keys.S | Keys.Control) && SelectedRom != null) - { - saveButton_Click(null, null); - return true; - } - return base.ProcessCmdKey(ref msg, keyData); - } - - void cleanupDBToolStripMenuItem_Click(object sender, EventArgs e) - { - DB.Cleanup(); - MessageBox.Show("Orphaned GAME records deleted and Sqlite VACUUM performed."); - } - - void exportGameDBToolStripMenuItem_Click(object sender, EventArgs e) - { - var sfd = new SaveFileDialog(); - sfd.DefaultExt = ".txt"; - sfd.AddExtension = true; - var result = sfd.ShowDialog(); - if (result == System.Windows.Forms.DialogResult.Cancel) - return; - - var tw = new StreamWriter(sfd.FileName); - - loadRomsForSelectedSystem(); - foreach (var rom in DB.Roms) - { - string romCode = ""; - if (rom.Game.Classification == "Homebrew") romCode = "D"; - if (rom.RomStatus == "Overdump") romCode = "O"; - if (rom.RomStatus == "Bad Dump") romCode = "V"; - - string regionStr = ""; - if (rom.Region != null) - { - if (rom.Region.IndexOf("Japan") >= 0) regionStr += "J"; - if (rom.Region.IndexOf("USA") >= 0) regionStr += "U"; - if (rom.Region.IndexOf("Europe") >= 0) regionStr += "E"; - if (rom.Region.IndexOf("Brazil") >= 0) regionStr += "B"; - if (rom.Region.IndexOf("Taiwan") >= 0) regionStr += "T"; - if (rom.Region.IndexOf("Korea") >= 0) regionStr += "K"; - if (rom.Region.IndexOf("Australia") >= 0) regionStr += "Aus"; - if (rom.Region.IndexOf("World") >= 0) regionStr += "W"; - } - - string romName = rom.NameWithTheFlipped; - if (regionStr.Length > 0) - romName += " ("+regionStr+")"; - - if (rom.VersionTags != null) - { - var versions = rom.VersionTags.Split(';'); - foreach (var version in versions) - { - if (version.Trim().Length == 0) - continue; - romName += " (" + version + ")"; - } - } - - tw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", rom.MD5, romCode, romName, rom.System, rom.Game.Tags, rom.CombinedMetaData, rom.Region); - } - - tw.Close(); - } - - void deleteButton_Click(object sender, EventArgs e) - { - var rslt = MessageBox.Show("Confirm deletion for ROM: "+SelectedRom.Name+" "+SelectedRom.Region+" "+SelectedRom.VersionTags+"?", "Confirm ROM Delete", MessageBoxButtons.YesNo); - if (rslt != System.Windows.Forms.DialogResult.Yes) - return; - - DB.DeleteRom(SelectedRom); - loadRomsForSelectedSystem(); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.DBMan/Program.cs b/BizHawk.Client.DBMan/Program.cs deleted file mode 100644 index e4ddd6a1e9..0000000000 --- a/BizHawk.Client.DBMan/Program.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Collections.Generic; -using Community.CsharpSqlite.SQLiteClient; -using System.IO; - - -namespace BizHawk.Client.DBMan -{ - internal static class Program - { - static Program() - { -#if WINDOWS - //http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips - // this will look in subdirectory "dll" to load pinvoked stuff - string dllDir = System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll"); - SetDllDirectory(dllDir); - - //in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them - AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); - - //but before we even try doing that, whack the MOTW from everything in that directory (thats a dll) - //otherwise, some people will have crashes at boot-up due to .net security disliking MOTW. - //some people are getting MOTW through a combination of browser used to download bizhawk, and program used to dearchive it - WhackAllMOTW(dllDir); -#endif - } - - public static string GetExeDirectoryAbsolute() - { - var uri = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase); - string module = uri.LocalPath + System.Web.HttpUtility.UrlDecode(uri.Fragment); - return Path.GetDirectoryName(module); - } - - static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - lock (AppDomain.CurrentDomain) - { - var asms = AppDomain.CurrentDomain.GetAssemblies(); - foreach (var asm in asms) - if (asm.FullName == args.Name) - return asm; - - //load missing assemblies by trying to find them in the dll directory - string dllname = new AssemblyName(args.Name).Name + ".dll"; - string directory = Path.Combine(GetExeDirectoryAbsolute(), "dll"); - string fname = Path.Combine(directory, dllname); - if (!File.Exists(fname)) return null; - //it is important that we use LoadFile here and not load from a byte array; otherwise mixed (managed/unamanged) assemblies can't load - return Assembly.LoadFile(fname); - } - } - - //declared here instead of a more usual place to avoid dependencies on the more usual place -#if WINDOWS - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool SetDllDirectory(string lpPathName); - - [DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)] - static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName); - static void RemoveMOTW(string path) - { - DeleteFileW(path + ":Zone.Identifier"); - } - - static void WhackAllMOTW(string dllDir) - { - var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); - while (todo.Count > 0) - { - var di = todo.Dequeue(); - foreach (var disub in di.GetDirectories()) todo.Enqueue(disub); - foreach (var fi in di.GetFiles("*.dll")) - RemoveMOTW(fi.FullName); - foreach (var fi in di.GetFiles("*.exe")) - RemoveMOTW(fi.FullName); - } - - } -#endif - - [STAThread] - static void Main(string[] args) - { - if (args.Length > 0 && args[0] == "--dischash") - { - new DiscHash().Run(args.Skip(1).ToArray()); - return; - } - if (args.Length > 0 && args[0] == "--psxdb") - { - new PsxDBJob().Run(args.Skip(1).ToArray()); - return; - } - if (args.Length > 0 && args[0] == "--dbman") - { - try - { - InitDB(); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new DBMan_MainForm()); - } - catch (Exception e) - { - MessageBox.Show(e.ToString()); - } - finally - { - if (DB.Con != null) DB.Con.Dispose(); - } - - return; - } - //if (args.Length > 0 && args[0] == "--disccmp") - //{ - // new DiscCmp().Run(args.Skip(1).ToArray()); - // return; - //} - - try - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new DATConverter()); - } - catch (Exception e) - { - MessageBox.Show(e.ToString()); - } - - return; - } - - static void InitDB() - { - DB.Con = new SqliteConnection(); - DB.Con.ConnectionString = @"Version=3,uri=file://gamedb/game.db"; - DB.Con.Open(); - } - } -} diff --git a/BizHawk.Client.DBMan/Properties/AssemblyInfo.cs b/BizHawk.Client.DBMan/Properties/AssemblyInfo.cs deleted file mode 100644 index be679ef382..0000000000 --- a/BizHawk.Client.DBMan/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BizHawk.Client.DBMan")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("BizHawk.Client.DBMan")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("58cef5c3-fb2d-4d02-8f02-46a53c1c49cf")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BizHawk.Client.DBMan/Properties/Resources.Designer.cs b/BizHawk.Client.DBMan/Properties/Resources.Designer.cs deleted file mode 100644 index 2f2ae431a5..0000000000 --- a/BizHawk.Client.DBMan/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18034 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace BizHawk.Client.DBMan.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BizHawk.Client.DBMan.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/BizHawk.Client.DBMan/Properties/Resources.resx b/BizHawk.Client.DBMan/Properties/Resources.resx deleted file mode 100644 index ffecec851a..0000000000 --- a/BizHawk.Client.DBMan/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/BizHawk.Client.DBMan/Properties/Settings.Designer.cs b/BizHawk.Client.DBMan/Properties/Settings.Designer.cs deleted file mode 100644 index 963414f15f..0000000000 --- a/BizHawk.Client.DBMan/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace BizHawk.Client.DBMan.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/BizHawk.Client.DBMan/app.config b/BizHawk.Client.DBMan/app.config deleted file mode 100644 index b33a20518b..0000000000 --- a/BizHawk.Client.DBMan/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/BizHawk.Client.DiscoHawk/About.cs b/BizHawk.Client.DiscoHawk/About.cs deleted file mode 100644 index c89e7b4cad..0000000000 --- a/BizHawk.Client.DiscoHawk/About.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.DiscoHawk -{ - public partial class About : Form - { - public About() - { - InitializeComponent(); - lblVersion.Text = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); - } - - private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e) - { - System.Diagnostics.Process.Start(e.LinkText); - } - - private void button1_Click(object sender, EventArgs e) - { - Close(); - } - } -} diff --git a/BizHawk.Client.DiscoHawk/BizHawk.Client.DiscoHawk.csproj b/BizHawk.Client.DiscoHawk/BizHawk.Client.DiscoHawk.csproj deleted file mode 100644 index 19809199c9..0000000000 --- a/BizHawk.Client.DiscoHawk/BizHawk.Client.DiscoHawk.csproj +++ /dev/null @@ -1,170 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {C4366030-6D03-424B-AE53-F4F43BB217C3} - Exe - Properties - BizHawk.Client.DiscoHawk - DiscoHawk - v4.6.1 - 512 - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - true - - - - - - discohawk.ico - - - true - ..\output\ - TRACE;DEBUG;WINDOWS - true - full - AnyCPU - false - prompt - - AllRules.ruleset - - - ..\output\ - TRACE;WINDOWS - true - pdbonly - AnyCPU - false - prompt - - AllRules.ruleset - false - false - - - - - - svnrev.cs - - - VersionInfo.cs - - - Form - - - About.cs - - - - Form - - - ComparisonResults.cs - - - - Form - - - MainDiscoForm.cs - - - - - - - 3.5 - - - - - - - - - - About.cs - - - ComparisonResults.cs - - - MainDiscoForm.cs - Designer - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3} - BizHawk.Common - - - {f51946ea-827f-4d82-b841-1f2f6d060312} - BizHawk.Emulation.DiscSystem - - - - - - - "$(SolutionDir)subwcrev.bat" "$(ProjectDir)" - "$(SolutionDir)subwcrev.sh" "$(ProjectDir)" - - - - - diff --git a/BizHawk.Client.DiscoHawk/ComparisonResults.cs b/BizHawk.Client.DiscoHawk/ComparisonResults.cs deleted file mode 100644 index 4090833139..0000000000 --- a/BizHawk.Client.DiscoHawk/ComparisonResults.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.DiscoHawk -{ - public partial class ComparisonResults : Form - { - public ComparisonResults() - { - InitializeComponent(); - } - } -} diff --git a/BizHawk.Client.DiscoHawk/DiscoHawk.cs b/BizHawk.Client.DiscoHawk/DiscoHawk.cs deleted file mode 100644 index ee2b6eda31..0000000000 --- a/BizHawk.Client.DiscoHawk/DiscoHawk.cs +++ /dev/null @@ -1,582 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using System.IO; - -using BizHawk.Emulation.DiscSystem; - -//cue format preferences notes - -//pcejin - -//does not like session commands -//it can handle binpercue -//it seems not to be able to handle binpertrack, or maybe i am doing something wrong (still havent ruled it out) - -namespace BizHawk.Client.DiscoHawk -{ - static class Program - { - static Program() - { -#if WINDOWS - //http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips - // this will look in subdirectory "dll" to load pinvoked stuff - string dllDir = System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll"); - SetDllDirectory(dllDir); - - //in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them - AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); - - //but before we even try doing that, whack the MOTW from everything in that directory (thats a dll) - //otherwise, some people will have crashes at boot-up due to .net security disliking MOTW. - //some people are getting MOTW through a combination of browser used to download bizhawk, and program used to dearchive it - WhackAllMOTW(dllDir); -#endif - } - - [STAThread] - static void Main(string[] args) - { - SubMain(args); - } - - //NoInlining should keep this code from getting jammed into Main() which would create dependencies on types which havent been setup by the resolver yet... or something like that - [DllImport("user32.dll", SetLastError = true)] - public static extern bool ChangeWindowMessageFilterEx(IntPtr hWnd, uint msg, ChangeWindowMessageFilterExAction action, ref CHANGEFILTERSTRUCT changeInfo); - private static class Win32 - { - [DllImport("kernel32.dll")] - public static extern IntPtr LoadLibrary(string dllToLoad); - [DllImport("kernel32.dll")] - public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); - [DllImport("kernel32.dll")] - public static extern bool FreeLibrary(IntPtr hModule); - } - - static void SubMain(string[] args) - { - //MICROSOFT BROKE DRAG AND DROP IN WINDOWS 7. IT DOESNT WORK ANYMORE - //WELL, OBVIOUSLY IT DOES SOMETIMES. I DONT REMEMBER THE DETAILS OR WHY WE HAD TO DO THIS SHIT -#if WINDOWS - //BUT THE FUNCTION WE NEED DOESNT EXIST UNTIL WINDOWS 7, CONVENIENTLY - //SO CHECK FOR IT - IntPtr lib = Win32.LoadLibrary("user32.dll"); - IntPtr proc = Win32.GetProcAddress(lib, "ChangeWindowMessageFilterEx"); - if (proc != IntPtr.Zero) - { - ChangeWindowMessageFilter(WM_DROPFILES, ChangeWindowMessageFilterFlags.Add); - ChangeWindowMessageFilter(WM_COPYDATA, ChangeWindowMessageFilterFlags.Add); - ChangeWindowMessageFilter(0x0049, ChangeWindowMessageFilterFlags.Add); - } - Win32.FreeLibrary(lib); -#endif - - var ffmpegPath = Path.Combine(GetExeDirectoryAbsolute(), "ffmpeg.exe"); - if (!File.Exists(ffmpegPath)) - ffmpegPath = Path.Combine(Path.Combine(GetExeDirectoryAbsolute(), "dll"), "ffmpeg.exe"); - FFMpeg.FFMpegPath = ffmpegPath; - AudioExtractor.FFmpegPath = ffmpegPath; - new DiscoHawk().Run(args); - } - - - public static string GetExeDirectoryAbsolute() - { - var uri = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase); - string module = uri.LocalPath + System.Web.HttpUtility.UrlDecode(uri.Fragment); - return Path.GetDirectoryName(module); - } - - static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - lock (AppDomain.CurrentDomain) - { - var asms = AppDomain.CurrentDomain.GetAssemblies(); - foreach (var asm in asms) - if (asm.FullName == args.Name) - return asm; - - //load missing assemblies by trying to find them in the dll directory - string dllname = new AssemblyName(args.Name).Name + ".dll"; - string directory = Path.Combine(GetExeDirectoryAbsolute(), "dll"); - string fname = Path.Combine(directory, dllname); - if (!File.Exists(fname)) return null; - //it is important that we use LoadFile here and not load from a byte array; otherwise mixed (managed/unamanged) assemblies can't load - return Assembly.LoadFile(fname); - } - } - - //declared here instead of a more usual place to avoid dependencies on the more usual place -#if WINDOWS - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool SetDllDirectory(string lpPathName); - - [DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)] - static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName); - static void RemoveMOTW(string path) - { - DeleteFileW(path + ":Zone.Identifier"); - } - - static void WhackAllMOTW(string dllDir) - { - var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); - while (todo.Count > 0) - { - var di = todo.Dequeue(); - foreach (var disub in di.GetDirectories()) todo.Enqueue(disub); - foreach (var fi in di.GetFiles("*.dll")) - RemoveMOTW(fi.FullName); - foreach (var fi in di.GetFiles("*.exe")) - RemoveMOTW(fi.FullName); - } - - } -#endif - - private const UInt32 WM_DROPFILES = 0x0233; - private const UInt32 WM_COPYDATA = 0x004A; - [DllImport("user32")] - public static extern bool ChangeWindowMessageFilter(uint msg, ChangeWindowMessageFilterFlags flags); - public enum ChangeWindowMessageFilterFlags : uint - { - Add = 1, Remove = 2 - }; - public enum MessageFilterInfo : uint - { - None = 0, AlreadyAllowed = 1, AlreadyDisAllowed = 2, AllowedHigher = 3 - }; - - public enum ChangeWindowMessageFilterExAction : uint - { - Reset = 0, Allow = 1, DisAllow = 2 - }; - - [StructLayout(LayoutKind.Sequential)] - public struct CHANGEFILTERSTRUCT - { - public uint size; - public MessageFilterInfo info; - } - } - - class DiscoHawk - { - static List FindCuesRecurse(string dir) - { - List ret = new List(); - Queue dpTodo = new Queue(); - dpTodo.Enqueue(dir); - for (; ; ) - { - string dpCurr; - if (dpTodo.Count == 0) - break; - dpCurr = dpTodo.Dequeue(); - foreach(var fi in new DirectoryInfo(dpCurr).GetFiles("*.cue")) - { - ret.Add(fi.FullName); - } - Parallel.ForEach(new DirectoryInfo(dpCurr).GetDirectories(), (di) => - { - lock(dpTodo) - dpTodo.Enqueue(di.FullName); - }); - } - - return ret; - } - - public void Run(string[] args) - { - if (args.Length == 0) - { - var dialog = new MainDiscoForm(); - dialog.ShowDialog(); - return; - } - - bool scanCues = false; - string dirArg = null; - string infile = null; - var loadDiscInterface = DiscInterface.BizHawk; - var compareDiscInterfaces = new List (); - bool hawk = false; - - int idx = 0; - while (idx < args.Length) - { - string a = args[idx++]; - string au = a.ToUpperInvariant(); - if (au == "LOAD") - loadDiscInterface = (DiscInterface)Enum.Parse(typeof(DiscInterface), args[idx++], true); - else if (au == "COMPARE") - compareDiscInterfaces.Add((DiscInterface)Enum.Parse(typeof(DiscInterface), args[idx++], true)); - else if (au == "HAWK") - hawk = true; - else if (au == "CUEDIR") - { - dirArg = args[idx++]; - scanCues = true; - } - else infile = a; - } - - if (hawk) - { - if (infile == null) - return; - - //TODO - write it out - var dmj = new DiscMountJob { IN_DiscInterface = loadDiscInterface, IN_FromPath = infile }; - dmj.Run(); - //var disc = dmj.OUT_Disc; - } - - bool verbose = true; - - if (scanCues) - { - verbose = false; - var todo = FindCuesRecurse(dirArg); - var po = new ParallelOptions(); - var cts = new CancellationTokenSource(); - po.CancellationToken = cts.Token; - po.MaxDegreeOfParallelism = 1; - //po.MaxDegreeOfParallelism = System.Environment.ProcessorCount - 2; //I'm disk or network bound, no sense hammering this - if(po.MaxDegreeOfParallelism < 0) po.MaxDegreeOfParallelism = 1; - object olock = new object(); - int ctr=0; - bool blocked = false; - try - { - Parallel.ForEach(todo, po, (fp) => - { - lock (olock) - { - ctr++; - int strlen = todo.Count.ToString().Length; - string fmt = string.Format("{{0,{0}}}/{{1,{0}}} {{2}}", strlen); - Console.WriteLine(fmt, ctr, todo.Count, Path.GetFileNameWithoutExtension(fp)); - //if (fp.Contains("Break Out")) - // blocked = false; - } - - if(!blocked) - foreach (var cmpif in compareDiscInterfaces) - { - StringWriter sw = new StringWriter(); - bool success = CompareFile(fp, loadDiscInterface, cmpif, verbose, cts, sw); - if (!success) - { - lock (Console.Out) - Console.Out.Write(sw.ToString()); - - cts.Cancel(); - return; - } - } - }); - } - catch (AggregateException ae) { - Console.WriteLine(ae.ToString()); - } - catch (OperationCanceledException oce) - { - Console.WriteLine(oce.ToString()); - } - Console.WriteLine("--TERMINATED--"); - return; - } - - if (compareDiscInterfaces.Count != 0) - { - StringWriter sw = new StringWriter(); - foreach (var cmpif in compareDiscInterfaces) - CompareFile(infile, loadDiscInterface, cmpif, verbose, null, sw); - sw.Flush(); - string results = sw.ToString(); - var cr = new ComparisonResults(); - cr.textBox1.Text = results; - cr.ShowDialog(); - } - - - } //Run() - - static bool CompareFile(string infile, DiscInterface loadDiscInterface, DiscInterface cmpif, bool verbose, CancellationTokenSource cancelToken, StringWriter sw) - { - Disc src_disc = null, dst_disc = null; - - try - { - bool success = false; - - sw.WriteLine("BEGIN COMPARE: {0}\nSRC {1} vs DST {2}", infile, loadDiscInterface, cmpif); - - //reload the original disc, with new policies as needed - var dmj = new DiscMountJob { IN_DiscInterface = loadDiscInterface, IN_FromPath = infile }; - if (cmpif == DiscInterface.MednaDisc) - { - dmj.IN_DiscMountPolicy.CUE_PregapContradictionModeA = false; - } - dmj.Run(); - - src_disc = dmj.OUT_Disc; - - var dst_dmj = new DiscMountJob { IN_DiscInterface = cmpif, IN_FromPath = infile }; - dst_dmj.Run(); - dst_disc = dst_dmj.OUT_Disc; - - var src_dsr = new DiscSectorReader(src_disc); - var dst_dsr = new DiscSectorReader(dst_disc); - - var src_toc = src_disc.TOC; - var dst_toc = dst_disc.TOC; - - var src_databuf = new byte[2448]; - var dst_databuf = new byte[2448]; - - Action sw_dump_toc_one = (item) => - { - if (!item.Exists) - sw.Write("(---missing---)"); - else - sw.Write("({0:X2} - {1})", (byte)item.Control, item.LBA); - }; - - - Action sw_dump_toc = (index) => - { - sw.Write("SRC TOC#{0,3} ", index); sw_dump_toc_one(src_toc.TOCItems[index]); sw.WriteLine(); - sw.Write("DST TOC#{0,3} ", index); sw_dump_toc_one(dst_toc.TOCItems[index]); sw.WriteLine(); - }; - - //verify sector count - if (src_disc.Session1.LeadoutLBA != dst_disc.Session1.LeadoutLBA) - { - sw.Write("LeadoutTrack.LBA {0} vs {1}\n", src_disc.Session1.LeadoutTrack.LBA, dst_disc.Session1.LeadoutTrack.LBA); - goto SKIPPO; - } - - //verify TOC match - if (src_disc.TOC.FirstRecordedTrackNumber != dst_disc.TOC.FirstRecordedTrackNumber - || src_disc.TOC.LastRecordedTrackNumber != dst_disc.TOC.LastRecordedTrackNumber) - { - sw.WriteLine("Mismatch of RecordedTrackNumbers: {0}-{1} vs {2}-{3}", - src_disc.TOC.FirstRecordedTrackNumber, src_disc.TOC.LastRecordedTrackNumber, - dst_disc.TOC.FirstRecordedTrackNumber, dst_disc.TOC.LastRecordedTrackNumber - ); - goto SKIPPO; - } - - bool badToc = false; - for (int t = 0; t < 101; t++) - { - if (src_toc.TOCItems[t].Exists != dst_toc.TOCItems[t].Exists - || src_toc.TOCItems[t].Control != dst_toc.TOCItems[t].Control - || src_toc.TOCItems[t].LBA != dst_toc.TOCItems[t].LBA - ) - { - sw.WriteLine("Mismatch in TOCItem"); - sw_dump_toc(t); - badToc = true; - } - } - if (badToc) - goto SKIPPO; - - Action sw_dump_chunk_one = (comment, lba, buf, addr, count) => - { - sw.Write("{0} - ", comment); - for (int i = 0; i < count; i++) - { - if (i + addr >= buf.Length) continue; - sw.Write("{0:X2}{1}", buf[addr + i], (i == count - 1) ? " " : " "); - } - sw.WriteLine(); - }; - - int[] offenders = new int[12]; - Action sw_dump_chunk = (lba, dispaddr, addr, count, numoffenders) => - { - var hashedOffenders = new HashSet(); - for (int i = 0; i < numoffenders; i++) hashedOffenders.Add(offenders[i]); - sw.Write(" "); - for (int i = 0; i < count; i++) sw.Write((hashedOffenders.Contains(dispaddr + i)) ? "vvv " : " "); - sw.WriteLine(); - sw.Write(" "); - for (int i = 0; i < count; i++) sw.Write("{0:X3} ", dispaddr + i, (i == count - 1) ? " " : " "); - sw.WriteLine(); - sw.Write(" "); - sw.Write(new string('-', count * 4)); - sw.WriteLine(); - sw_dump_chunk_one(string.Format("SRC #{0,6} ({1})", lba, new Timestamp(lba)), lba, src_databuf, addr, count); - sw_dump_chunk_one(string.Format("DST #{0,6} ({1})", lba, new Timestamp(lba)), lba, dst_databuf, addr, count); - }; - - //verify each sector contents - int nSectors = src_disc.Session1.LeadoutLBA; - for (int lba = -150; lba < nSectors; lba++) - { - if (verbose) - if (lba % 1000 == 0) - Console.WriteLine("LBA {0} of {1}", lba, nSectors); - - if (cancelToken != null) - if (cancelToken.Token.IsCancellationRequested) - return false; - - src_dsr.ReadLBA_2448(lba, src_databuf, 0); - dst_dsr.ReadLBA_2448(lba, dst_databuf, 0); - - //check the header - for (int b = 0; b < 16; b++) - { - if (src_databuf[b] != dst_databuf[b]) - { - sw.WriteLine("Mismatch in sector header at byte {0}", b); - offenders[0] = b; - sw_dump_chunk(lba, 0, 0, 16, 1); - goto SKIPPO; - } - } - - //check userdata - for (int b = 16; b < 2352; b++) - { - if (src_databuf[b] != dst_databuf[b]) - { - sw.Write("LBA {0} mismatch at userdata byte {1}; terminating sector cmp\n", lba, b); - goto SKIPPO; - } - } - - //check subchannels - for (int c = 0, b = 2352; c < 8; c++) - { - int numOffenders = 0; - for (int e = 0; e < 12; e++, b++) - { - if (src_databuf[b] != dst_databuf[b]) - { - offenders[numOffenders++] = e; - } - } - if (numOffenders != 0) - { - sw.Write("LBA {0} mismatch(es) at subchannel {1}; terminating sector cmp\n", lba, (char)('P' + c)); - sw_dump_chunk(lba, 0, 2352 + c * 12, 12, numOffenders); - goto SKIPPO; - } - } - } - - success = true; - - SKIPPO: - sw.WriteLine("END COMPARE"); - sw.WriteLine("-----------------------------"); - - return success; - } - finally - { - if (src_disc != null) - src_disc.Dispose(); - if (dst_disc != null) - dst_disc.Dispose(); - } - - } //CompareFile - - } //class DiscoHawk - -} - -//code to test ECM: -//static class test -//{ -// public static void Shuffle(this IList list, Random rng) -// { -// int n = list.Count; -// while (n > 1) -// { -// n--; -// int k = rng.Next(n + 1); -// T value = list[k]; -// list[k] = list[n]; -// list[n] = value; -// } -// } - -// public static void Test() -// { -// var plaindisc = BizHawk.DiscSystem.Disc.FromCuePath("d:\\ecmtest\\test.cue", BizHawk.MainDiscoForm.GetCuePrefs()); -// var ecmdisc = BizHawk.DiscSystem.Disc.FromCuePath("d:\\ecmtest\\ecmtest.cue", BizHawk.MainDiscoForm.GetCuePrefs()); - -// //var prefs = new BizHawk.DiscSystem.CueBinPrefs(); -// //prefs.AnnotateCue = false; -// //prefs.OneBlobPerTrack = false; -// //prefs.ReallyDumpBin = true; -// //prefs.SingleSession = true; -// //prefs.DumpToBitbucket = true; -// //var dump = ecmdisc.DumpCueBin("test", prefs); -// //dump.Dump("test", prefs); - -// //var prefs = new BizHawk.DiscSystem.CueBinPrefs(); -// //prefs.AnnotateCue = false; -// //prefs.OneBlobPerTrack = false; -// //prefs.ReallyDumpBin = true; -// //prefs.SingleSession = true; -// //var dump = ecmdisc.DumpCueBin("test", prefs); -// //dump.Dump(@"D:\ecmtest\myout", prefs); - -// int seed = 102; - -// for (; ; ) -// { -// Console.WriteLine("running seed {0}", seed); -// Random r = new Random(seed); -// seed++; - -// byte[] chunkbuf_corlet = new byte[2352 * 20]; -// byte[] chunkbuf_mine = new byte[2352 * 20]; -// int length = ecmdisc.LBACount * 2352; -// int counter = 0; -// List> testChunks = new List>(); -// while (counter < length) -// { -// int chunk = r.Next(1, 2352 * 20); -// if (r.Next(20) == 0) -// chunk /= 100; -// if (r.Next(40) == 0) -// chunk = 0; -// if (counter + chunk > length) -// chunk = length - counter; -// testChunks.Add(new Tuple(counter, chunk)); -// counter += chunk; -// } -// testChunks.Shuffle(r); - -// for (int t = 0; t < testChunks.Count; t++) -// { -// //Console.WriteLine("skank"); -// var item = testChunks[t]; -// //Console.WriteLine("chunk {0} of {3} is {1} bytes @ {2:X8}", t, item.Item2, item.Item1, testChunks.Count); -// plaindisc.ReadLBA_2352_Flat(item.Item1, chunkbuf_corlet, 0, item.Item2); -// ecmdisc.ReadLBA_2352_Flat(item.Item1, chunkbuf_mine, 0, item.Item2); -// for (int i = 0; i < item.Item2; i++) -// if (chunkbuf_corlet[i] != chunkbuf_mine[i]) -// { -// Debug.Assert(false); -// } -// } -// } -// } -//} \ No newline at end of file diff --git a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.Designer.cs b/BizHawk.Client.DiscoHawk/DiscoHawkDialog.Designer.cs deleted file mode 100644 index 3f3550a176..0000000000 --- a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.Designer.cs +++ /dev/null @@ -1,481 +0,0 @@ -namespace BizHawk.Client.DiscoHawk -{ - partial class DiscoHawkDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DiscoHawkDialog)); - this.btnAddDisc = new System.Windows.Forms.Button(); - this.lvDiscs = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.lblSize = new System.Windows.Forms.Label(); - this.lblTracks = new System.Windows.Forms.Label(); - this.lblSessions = new System.Windows.Forms.Label(); - this.lblSectors = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.txtCuePreview = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.checkCueProp_OneBlobPerTrack = new System.Windows.Forms.CheckBox(); - this.label6 = new System.Windows.Forms.Label(); - this.panel1 = new System.Windows.Forms.Panel(); - this.panel2 = new System.Windows.Forms.Panel(); - this.label7 = new System.Windows.Forms.Label(); - this.checkCueProp_Annotations = new System.Windows.Forms.CheckBox(); - this.panel3 = new System.Windows.Forms.Panel(); - this.btnPresetCanonical = new System.Windows.Forms.Button(); - this.btnPresetDaemonTools = new System.Windows.Forms.Button(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label9 = new System.Windows.Forms.Label(); - this.treeView1 = new System.Windows.Forms.TreeView(); - this.label10 = new System.Windows.Forms.Label(); - this.btnExportCue = new System.Windows.Forms.Button(); - this.label11 = new System.Windows.Forms.Label(); - this.label12 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.lblMagicDragArea = new System.Windows.Forms.Label(); - this.groupBox1.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // btnAddDisc - // - this.btnAddDisc.Location = new System.Drawing.Point(12, 46); - this.btnAddDisc.Name = "btnAddDisc"; - this.btnAddDisc.Size = new System.Drawing.Size(75, 23); - this.btnAddDisc.TabIndex = 0; - this.btnAddDisc.Text = "Add Disc"; - this.btnAddDisc.UseVisualStyleBackColor = true; - this.btnAddDisc.Click += new System.EventHandler(this.btnAddDisc_Click); - // - // lvDiscs - // - this.lvDiscs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1}); - this.lvDiscs.GridLines = true; - this.lvDiscs.HideSelection = false; - this.lvDiscs.Location = new System.Drawing.Point(12, 80); - this.lvDiscs.Name = "lvDiscs"; - this.lvDiscs.Size = new System.Drawing.Size(248, 165); - this.lvDiscs.TabIndex = 1; - this.lvDiscs.UseCompatibleStateImageBehavior = false; - this.lvDiscs.View = System.Windows.Forms.View.Details; - this.lvDiscs.SelectedIndexChanged += new System.EventHandler(this.lvDiscs_SelectedIndexChanged); - // - // columnHeader1 - // - this.columnHeader1.Text = "Name"; - this.columnHeader1.Width = 240; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.tableLayoutPanel1); - this.groupBox1.Location = new System.Drawing.Point(21, 251); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 0); - this.groupBox1.Size = new System.Drawing.Size(203, 107); - this.groupBox1.TabIndex = 2; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Quick Info"; - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.Controls.Add(this.lblSize, 0, 3); - this.tableLayoutPanel1.Controls.Add(this.lblTracks, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.lblSessions, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.lblSectors, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3); - this.tableLayoutPanel1.Location = new System.Drawing.Point(6, 19); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 5; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(184, 79); - this.tableLayoutPanel1.TabIndex = 3; - // - // lblSize - // - this.lblSize.AutoSize = true; - this.lblSize.Location = new System.Drawing.Point(61, 39); - this.lblSize.Name = "lblSize"; - this.lblSize.Size = new System.Drawing.Size(30, 13); - this.lblSize.TabIndex = 7; - this.lblSize.Text = "Size:"; - // - // lblTracks - // - this.lblTracks.AutoSize = true; - this.lblTracks.Location = new System.Drawing.Point(61, 13); - this.lblTracks.Name = "lblTracks"; - this.lblTracks.Size = new System.Drawing.Size(30, 13); - this.lblTracks.TabIndex = 6; - this.lblTracks.Text = "Size:"; - // - // lblSessions - // - this.lblSessions.AutoSize = true; - this.lblSessions.Location = new System.Drawing.Point(61, 0); - this.lblSessions.Name = "lblSessions"; - this.lblSessions.Size = new System.Drawing.Size(30, 13); - this.lblSessions.TabIndex = 5; - this.lblSessions.Text = "Size:"; - // - // lblSectors - // - this.lblSectors.AutoSize = true; - this.lblSectors.Location = new System.Drawing.Point(61, 26); - this.lblSectors.Name = "lblSectors"; - this.lblSectors.Size = new System.Drawing.Size(30, 13); - this.lblSectors.TabIndex = 4; - this.lblSectors.Text = "Size:"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(52, 13); - this.label3.TabIndex = 2; - this.label3.Text = "Sessions:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(3, 26); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(46, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Sectors:"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(3, 13); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(43, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Tracks:"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 39); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(30, 13); - this.label4.TabIndex = 3; - this.label4.Text = "Size:"; - // - // txtCuePreview - // - this.txtCuePreview.Font = new System.Drawing.Font("Courier New", 8F); - this.txtCuePreview.Location = new System.Drawing.Point(284, 25); - this.txtCuePreview.Multiline = true; - this.txtCuePreview.Name = "txtCuePreview"; - this.txtCuePreview.ReadOnly = true; - this.txtCuePreview.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.txtCuePreview.Size = new System.Drawing.Size(375, 571); - this.txtCuePreview.TabIndex = 3; - this.txtCuePreview.WordWrap = false; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(281, 6); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(102, 13); - this.label5.TabIndex = 4; - this.label5.Text = "Output Cue Preview"; - // - // checkCueProp_OneBlobPerTrack - // - this.checkCueProp_OneBlobPerTrack.AutoSize = true; - this.checkCueProp_OneBlobPerTrack.Location = new System.Drawing.Point(7, 6); - this.checkCueProp_OneBlobPerTrack.Name = "checkCueProp_OneBlobPerTrack"; - this.checkCueProp_OneBlobPerTrack.Size = new System.Drawing.Size(111, 17); - this.checkCueProp_OneBlobPerTrack.TabIndex = 5; - this.checkCueProp_OneBlobPerTrack.Text = "OneBlobPerTrack"; - this.checkCueProp_OneBlobPerTrack.UseVisualStyleBackColor = true; - this.checkCueProp_OneBlobPerTrack.CheckedChanged += new System.EventHandler(this.checkCueProp_CheckedChanged); - // - // label6 - // - this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label6.Location = new System.Drawing.Point(4, 26); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(196, 42); - this.label6.TabIndex = 6; - this.label6.Text = "Should the output be split into several blobs, or just use one?"; - // - // panel1 - // - this.panel1.AutoSize = true; - this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel1.Controls.Add(this.label6); - this.panel1.Controls.Add(this.checkCueProp_OneBlobPerTrack); - this.panel1.Location = new System.Drawing.Point(15, 19); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(203, 68); - this.panel1.TabIndex = 9; - // - // panel2 - // - this.panel2.AutoSize = true; - this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel2.Controls.Add(this.label7); - this.panel2.Controls.Add(this.checkCueProp_Annotations); - this.panel2.Location = new System.Drawing.Point(224, 19); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(154, 68); - this.panel2.TabIndex = 10; - // - // label7 - // - this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label7.Location = new System.Drawing.Point(4, 26); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(147, 42); - this.label7.TabIndex = 6; - this.label7.Text = "Annotate cue with non-standard comments"; - // - // checkCueProp_Annotations - // - this.checkCueProp_Annotations.AutoSize = true; - this.checkCueProp_Annotations.Location = new System.Drawing.Point(7, 6); - this.checkCueProp_Annotations.Name = "checkCueProp_Annotations"; - this.checkCueProp_Annotations.Size = new System.Drawing.Size(82, 17); - this.checkCueProp_Annotations.TabIndex = 5; - this.checkCueProp_Annotations.Text = "Annotations"; - this.checkCueProp_Annotations.UseVisualStyleBackColor = true; - this.checkCueProp_Annotations.CheckedChanged += new System.EventHandler(this.checkCueProp_CheckedChanged); - // - // panel3 - // - this.panel3.AutoSize = true; - this.panel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel3.Location = new System.Drawing.Point(15, 94); - this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(0, 0); - this.panel3.TabIndex = 10; - // - // btnPresetCanonical - // - this.btnPresetCanonical.Location = new System.Drawing.Point(720, 210); - this.btnPresetCanonical.Name = "btnPresetCanonical"; - this.btnPresetCanonical.Size = new System.Drawing.Size(114, 23); - this.btnPresetCanonical.TabIndex = 11; - this.btnPresetCanonical.Text = "BizHawk Canonical"; - this.btnPresetCanonical.UseVisualStyleBackColor = true; - this.btnPresetCanonical.Click += new System.EventHandler(this.btnPresetCanonical_Click); - // - // btnPresetDaemonTools - // - this.btnPresetDaemonTools.Location = new System.Drawing.Point(840, 210); - this.btnPresetDaemonTools.Name = "btnPresetDaemonTools"; - this.btnPresetDaemonTools.Size = new System.Drawing.Size(115, 23); - this.btnPresetDaemonTools.TabIndex = 12; - this.btnPresetDaemonTools.Text = "Daemon Tools"; - this.btnPresetDaemonTools.UseVisualStyleBackColor = true; - this.btnPresetDaemonTools.Click += new System.EventHandler(this.btnPresetDaemonTools_Click); - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.panel1); - this.groupBox2.Controls.Add(this.panel2); - this.groupBox2.Controls.Add(this.panel3); - this.groupBox2.Location = new System.Drawing.Point(665, 25); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(394, 179); - this.groupBox2.TabIndex = 13; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Cue Export Properties"; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(672, 214); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(42, 13); - this.label9.TabIndex = 14; - this.label9.Text = "Presets"; - // - // treeView1 - // - this.treeView1.Location = new System.Drawing.Point(12, 384); - this.treeView1.Name = "treeView1"; - this.treeView1.Size = new System.Drawing.Size(239, 225); - this.treeView1.TabIndex = 15; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(18, 364); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(137, 13); - this.label10.TabIndex = 16; - this.label10.Text = "tree/list like isobuster (TBD)"; - // - // btnExportCue - // - this.btnExportCue.Location = new System.Drawing.Point(665, 335); - this.btnExportCue.Name = "btnExportCue"; - this.btnExportCue.Size = new System.Drawing.Size(101, 23); - this.btnExportCue.TabIndex = 17; - this.btnExportCue.Text = "Export Cue+XXX"; - this.btnExportCue.UseVisualStyleBackColor = true; - this.btnExportCue.Click += new System.EventHandler(this.btnExportCue_Click); - // - // label11 - // - this.label11.Location = new System.Drawing.Point(677, 251); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(297, 81); - this.label11.TabIndex = 18; - this.label11.Text = resources.GetString("label11.Text"); - // - // label12 - // - this.label12.Location = new System.Drawing.Point(93, 5); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(167, 67); - this.label12.TabIndex = 19; - this.label12.Text = "Why is this a list? Not sure. I thought we might want to make multi-disc archive" + - " format of our own one day. Also disc hopper demo"; - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(21, 620); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(522, 13); - this.label13.TabIndex = 20; - this.label13.Text = "Wouldnt it be cool if you could edit the disc by deleting and moving and adding t" + - "racks and such .. yeahhhhhh"; - // - // lblMagicDragArea - // - this.lblMagicDragArea.AllowDrop = true; - this.lblMagicDragArea.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.lblMagicDragArea.Location = new System.Drawing.Point(665, 384); - this.lblMagicDragArea.Name = "lblMagicDragArea"; - this.lblMagicDragArea.Size = new System.Drawing.Size(147, 70); - this.lblMagicDragArea.TabIndex = 21; - this.lblMagicDragArea.Text = "Drag a cue into the DRAG HERE FOR MAGIC area for magic"; - this.lblMagicDragArea.Click += new System.EventHandler(this.lblMagicDragArea_Click); - this.lblMagicDragArea.DragDrop += new System.Windows.Forms.DragEventHandler(this.handleDragDrop); - this.lblMagicDragArea.DragEnter += new System.Windows.Forms.DragEventHandler(this.handleDragEnter); - // - // DiscoHawkDialog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1151, 645); - this.Controls.Add(this.lblMagicDragArea); - this.Controls.Add(this.label13); - this.Controls.Add(this.label12); - this.Controls.Add(this.label11); - this.Controls.Add(this.btnExportCue); - this.Controls.Add(this.label10); - this.Controls.Add(this.treeView1); - this.Controls.Add(this.label9); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.btnPresetDaemonTools); - this.Controls.Add(this.btnPresetCanonical); - this.Controls.Add(this.label5); - this.Controls.Add(this.txtCuePreview); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.lvDiscs); - this.Controls.Add(this.btnAddDisc); - this.Name = "DiscoHawkDialog"; - this.Text = "DiscoHawkDialog"; - this.groupBox1.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnAddDisc; - private System.Windows.Forms.ListView lvDiscs; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label lblSectors; - private System.Windows.Forms.Label lblSize; - private System.Windows.Forms.Label lblTracks; - private System.Windows.Forms.Label lblSessions; - private System.Windows.Forms.TextBox txtCuePreview; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.CheckBox checkCueProp_OneBlobPerTrack; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.CheckBox checkCueProp_Annotations; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.Button btnPresetCanonical; - private System.Windows.Forms.Button btnPresetDaemonTools; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.TreeView treeView1; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Button btnExportCue; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.Label lblMagicDragArea; - } -} \ No newline at end of file diff --git a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.cs b/BizHawk.Client.DiscoHawk/DiscoHawkDialog.cs deleted file mode 100644 index 557d15aa87..0000000000 --- a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.cs +++ /dev/null @@ -1,224 +0,0 @@ -using System; -using System.Threading; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.DiscSystem; - -namespace BizHawk.Client.DiscoHawk -{ - public partial class DiscoHawkDialog : Form - { - public DiscoHawkDialog() - { - InitializeComponent(); - PresetCanonical(); - } - - private class DiscRecord - { - public Disc Disc; - public string BaseName; - } - - private void btnAddDisc_Click(object sender, EventArgs e) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "CUE files (*.cue)|*.cue|ISO files (*.iso)|*.iso"; - ofd.CheckFileExists = true; - ofd.CheckPathExists = true; - ofd.Multiselect = false; - if (ofd.ShowDialog() != DialogResult.OK) - return; - - Disc disc = Disc.FromCuePath(ofd.FileName, new CueBinPrefs()); - - string baseName = Path.GetFileName(ofd.FileName); - ListViewItem lvi = new ListViewItem(baseName); - DiscRecord dr = new DiscRecord(); - dr.Disc = disc; - dr.BaseName = baseName; - lvi.Tag = dr; - lvDiscs.SelectedIndices.Clear(); - lvDiscs.Items.Add(lvi); - lvDiscs.Items[lvDiscs.Items.Count-1].Selected = true; - } - - private void lvDiscs_SelectedIndexChanged(object sender, EventArgs e) - { - UnbindDisc(); - if (lvDiscs.SelectedIndices.Count != 0) - { - DiscRecord dr = (DiscRecord) lvDiscs.SelectedItems[0].Tag; - BindDisc(dr); - } - } - - void UnbindDisc() - { - btnExportCue.Enabled = false; - lblSessions.Text = ""; - lblTracks.Text = ""; - lblSectors.Text = ""; - lblSize.Text = ""; - } - - Disc boundDisc; - DiscRecord boundDiscRecord; - void BindDisc(DiscRecord discRecord) - { - Disc disc = discRecord.Disc; - boundDiscRecord = discRecord; - - DiscStructure toc = disc.ReadStructure(); - boundDisc = disc; - lblSessions.Text = toc.Sessions.Count.ToString(); - lblTracks.Text = toc.Sessions.Sum((ses) => ses.Tracks.Count).ToString(); - lblSectors.Text = string.Format("{0} ({1})", toc.LengthInSectors, toc.FriendlyLength.Value); - lblSize.Text = string.Format("{0:0.00} MB", toc.BinarySize / 1024.0 / 1024.0); - btnExportCue.Enabled = true; - UpdateCue(); - } - - void UpdateCue() - { - if (boundDisc == null) - { - txtCuePreview.Text = ""; - return; - } - - var cueBin = boundDisc.DumpCueBin(boundDiscRecord.BaseName, GetCuePrefs()); - txtCuePreview.Text = cueBin.cue.Replace("\n", "\r\n"); ; - } - - private void btnPresetCanonical_Click(object sender, EventArgs e) - { - PresetCanonical(); - } - void PresetCanonical() - { - checkCueProp_Annotations.Checked = false; - checkCueProp_OneBlobPerTrack.Checked = false; - } - - private void btnPresetDaemonTools_Click(object sender, EventArgs e) - { - PresetDaemonTools(); - } - void PresetDaemonTools() - { - checkCueProp_Annotations.Checked = false; - } - - private void checkCueProp_CheckedChanged(object sender, EventArgs e) - { - UpdateCue(); - } - - private void Form1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) - { - e.Action = DragAction.Continue; - } - - private void handleDragEnter(object sender, DragEventArgs e) - { - List files = validateDrop(e.Data); - if (files.Count > 0) - e.Effect = DragDropEffects.Link; - else e.Effect = DragDropEffects.None; - } - - private void handleDragDrop(object sender, DragEventArgs e) - { - List files = validateDrop(e.Data); - if (files.Count == 0) return; - try - { - foreach (var file in files) - { - Disc disc = Disc.FromCuePath(file, new CueBinPrefs()); - string baseName = Path.GetFileNameWithoutExtension(file); - baseName += "_hawked"; - var prefs = GetCuePrefs(); - prefs.ReallyDumpBin = true; - var cueBin = disc.DumpCueBin(baseName, GetCuePrefs()); - Dump(cueBin, Path.GetDirectoryName(file), prefs); - } - } - catch (Exception ex) - { - MessageBox.Show(ex.ToString(), "oops! error"); - throw; - } - } - - List validateDrop(IDataObject ido) - { - List ret = new List(); - string[] files = (string[])ido.GetData(System.Windows.Forms.DataFormats.FileDrop); - if (files == null) return new List(); - foreach (string str in files) - { - if (Path.GetExtension(str).ToUpper() != ".CUE") - { - return new List(); - } - ret.Add(str); - } - return ret; - } - - //bool Dump(CueBin cueBin, string directoryTo, CueBinPrefs prefs) - //{ - // ProgressReport pr = new ProgressReport(); - // Thread workThread = new Thread(() => - // { - // cueBin.Dump(directoryTo, prefs, pr); - // }); - - // ProgressDialog pd = new ProgressDialog(pr); - // pd.Show(this); - // this.Enabled = false; - // workThread.Start(); - // for (; ; ) - // { - // Application.DoEvents(); - // Thread.Sleep(10); - // if (workThread.ThreadState != ThreadState.Running) - // break; - // pd.Update(); - // } - // this.Enabled = true; - // pd.Dispose(); - // return !pr.CancelSignal; - //} - - private void btnExportCue_Click(object sender, EventArgs e) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "CUE files (*.cue)|*.cue"; - sfd.OverwritePrompt = true; - if (sfd.ShowDialog() != DialogResult.OK) - return; - string baseName = Path.GetFileNameWithoutExtension(sfd.FileName); - var prefs = GetCuePrefs(); - prefs.ReallyDumpBin = true; - var cueBin = boundDisc.DumpCueBin(baseName, prefs); - - Dump(cueBin, Path.GetDirectoryName(sfd.FileName), prefs); - } - - private void lblMagicDragArea_Click(object sender, EventArgs e) - { - - } - - } -} diff --git a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.resx b/BizHawk.Client.DiscoHawk/DiscoHawkDialog.resx deleted file mode 100644 index 570069991b..0000000000 --- a/BizHawk.Client.DiscoHawk/DiscoHawkDialog.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - This stuff is front and center because it is a primary way of visualizing the data. But maybe not later (later it would be tree-and-list). Maybe then all these options and 'output cue preview' will move into another window that pops up when you chooes Export Cue+XXX - - \ No newline at end of file diff --git a/BizHawk.Client.DiscoHawk/MainDiscoForm.cs b/BizHawk.Client.DiscoHawk/MainDiscoForm.cs deleted file mode 100644 index cdd2c1a0f7..0000000000 --- a/BizHawk.Client.DiscoHawk/MainDiscoForm.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.IO; -using System.Threading; - -using BizHawk.Common; -using BizHawk.Common.StringExtensions; -using BizHawk.Emulation.DiscSystem; - -namespace BizHawk.Client.DiscoHawk -{ - public partial class MainDiscoForm : Form - { - //Release TODO: - //An input (queue) list - //An outputted list showing new file name - //Progress bar should show file being converted - //Add disc button, which puts it on the progress cue (converts it) - - public MainDiscoForm() - { - InitializeComponent(); - } - - private void MainDiscoForm_Load(object sender, EventArgs e) - { - lvCompareTargets.Columns[0].Width = lvCompareTargets.ClientSize.Width; - } - - private void ExitButton_Click(object sender, EventArgs e) - { - this.Close(); - } - - private void lblMagicDragArea_DragDrop(object sender, DragEventArgs e) - { - List files = validateDrop(e.Data); - if (files.Count == 0) return; - try - { - this.Cursor = Cursors.WaitCursor; - foreach (var file in files) - { - var job = new DiscMountJob { IN_FromPath = file }; - job.Run(); - var disc = job.OUT_Disc; - if (job.OUT_ErrorLevel) - { - System.Windows.Forms.MessageBox.Show(job.OUT_Log, "Error loading disc"); - break; - } - - string baseName = Path.GetFileNameWithoutExtension(file); - baseName += "_hawked"; - string outfile = Path.Combine(Path.GetDirectoryName(file), baseName) + ".ccd"; - CCD_Format.Dump(disc, outfile); - } - this.Cursor = Cursors.Default; - } - catch (Exception ex) - { - MessageBox.Show(ex.ToString(), "Error loading disc"); - throw; - } - } - - //bool Dump(CueBin cueBin, string directoryTo, CueBinPrefs prefs) - //{ - // ProgressReport pr = new ProgressReport(); - // Thread workThread = new Thread(() => - // { - // cueBin.Dump(directoryTo, prefs, pr); - // }); - - // ProgressDialog pd = new ProgressDialog(pr); - // pd.Show(this); - // this.Enabled = false; - // workThread.Start(); - // for (; ; ) - // { - // Application.DoEvents(); - // Thread.Sleep(10); - // if (workThread.ThreadState != ThreadState.Running) - // break; - // pd.Update(); - // } - // this.Enabled = true; - // pd.Dispose(); - // return !pr.CancelSignal; - //} - - private void lblMagicDragArea_DragEnter(object sender, DragEventArgs e) - { - List files = validateDrop(e.Data); - if (files.Count > 0) - e.Effect = DragDropEffects.Link; - else e.Effect = DragDropEffects.None; - } - - List validateDrop(IDataObject ido) - { - List ret = new List(); - string[] files = (string[])ido.GetData(System.Windows.Forms.DataFormats.FileDrop); - if (files == null) return new List(); - foreach (string str in files) - { - string ext = Path.GetExtension(str).ToUpper(); - if(!ext.In(new string[]{".CUE",".ISO",".CCD", ".MDS"})) - { - return new List(); - } - ret.Add(str); - } - return ret; - } - - private void lblMp3ExtractMagicArea_DragDrop(object sender, DragEventArgs e) - { - var files = validateDrop(e.Data); - if (files.Count == 0) return; - foreach (var file in files) - { - using (var disc = Disc.LoadAutomagic(file)) - { - var path = Path.GetDirectoryName(file); - var filename = Path.GetFileNameWithoutExtension(file); - AudioExtractor.Extract(disc, path, filename); - } - } - } - - private void btnAbout_Click(object sender, EventArgs e) - { - new About().ShowDialog(); - } - - } -} diff --git a/BizHawk.Client.DiscoHawk/ProgressDialog.Designer.cs b/BizHawk.Client.DiscoHawk/ProgressDialog.Designer.cs deleted file mode 100644 index 32d453e23c..0000000000 --- a/BizHawk.Client.DiscoHawk/ProgressDialog.Designer.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace BizHawk.Client.DiscoHawk -{ - partial class ProgressDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.btnCancel = new System.Windows.Forms.Button(); - this.lblMessage = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // progressBar1 - // - this.progressBar1.Location = new System.Drawing.Point(12, 18); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(353, 23); - this.progressBar1.TabIndex = 0; - // - // btnCancel - // - this.btnCancel.Location = new System.Drawing.Point(290, 63); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 1; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); - // - // lblMessage - // - this.lblMessage.AutoSize = true; - this.lblMessage.Location = new System.Drawing.Point(12, 63); - this.lblMessage.Name = "lblMessage"; - this.lblMessage.Size = new System.Drawing.Size(31, 13); - this.lblMessage.TabIndex = 2; - this.lblMessage.Text = "Task"; - // - // ProgressDialog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(377, 98); - this.ControlBox = false; - this.Controls.Add(this.lblMessage); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.progressBar1); - this.Name = "ProgressDialog"; - this.Text = "Progress"; - this.Load += new System.EventHandler(this.ProgressDialog_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.Label lblMessage; - } -} \ No newline at end of file diff --git a/BizHawk.Client.DiscoHawk/ProgressDialog.cs b/BizHawk.Client.DiscoHawk/ProgressDialog.cs deleted file mode 100644 index b3c1e718ab..0000000000 --- a/BizHawk.Client.DiscoHawk/ProgressDialog.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.DiscSystem; - -namespace BizHawk.Client.DiscoHawk -{ - public partial class ProgressDialog : Form - { - public ProgressDialog(ProgressReport pr) - { - InitializeComponent(); - this.pr = pr; - } - - ProgressReport pr; - - private void btnCancel_Click(object sender, EventArgs e) - { - btnCancel.Enabled = false; - pr.CancelSignal = true; - } - - new public void Update() - { - double curr = pr.ProgressCurrent; - double max = pr.ProgressEstimate; - if (pr.InfoPresent) - { - double value = curr/max*100; - int nValue = (int) value; - if (nValue < 0 || nValue > 100) - nValue = 0; - progressBar1.Value = nValue; - } - lblMessage.Text = pr.Message + " - " + progressBar1.Value.ToString(CultureInfo.CurrentCulture) + "%"; - } - - private void ProgressDialog_Load(object sender, EventArgs e) - { - - } - } -} diff --git a/BizHawk.Client.DiscoHawk/Properties/AssemblyInfo.cs b/BizHawk.Client.DiscoHawk/Properties/AssemblyInfo.cs deleted file mode 100644 index d3c12a6be3..0000000000 --- a/BizHawk.Client.DiscoHawk/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BizHawk.Client.DiscoHawk")] -[assembly: AssemblyDescription("http://tasvideos.org/Bizhawk.html")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("BizHawk")] -[assembly: AssemblyProduct("BizHawk.Client.DiscoHawk")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("0DE267F2-039C-44A3-8489-97A4D99649C2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] -[assembly: AssemblyFileVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] diff --git a/BizHawk.Client.EmuHawk/AVOut/AVSync.cs b/BizHawk.Client.EmuHawk/AVOut/AVSync.cs deleted file mode 100644 index 045ad03808..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/AVSync.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - [VideoWriterIgnore] - public class AudioStretcher : AVStretcher - { - public AudioStretcher(IVideoWriter w) - { - this.w = w; - } - - private long _soundRemainder; // audio timekeeping for video dumping - - public void DumpAV(IVideoProvider v, ISoundProvider asyncSoundProvider, out short[] samples, out int samplesprovided) - { - // Sound refactor TODO: we could try set it here, but we want the client to be responsible for mode switching? There may be non-trivial complications with when to switch modes that we don't want this object worrying about - if (asyncSoundProvider.SyncMode != SyncSoundMode.Async) - { - throw new InvalidOperationException("Only async mode is supported, set async mode before passing in the sound provider"); - } - - if (!aset || !vset) - throw new InvalidOperationException("Must set params first!"); - - long nsampnum = samplerate * (long)fpsden + _soundRemainder; - long nsamp = nsampnum / fpsnum; - - // exactly remember fractional parts of an audio sample - _soundRemainder = nsampnum % fpsnum; - - samples = new short[nsamp * channels]; - asyncSoundProvider.GetSamplesAsync(samples); - samplesprovided = (int)nsamp; - - w.AddFrame(v); - w.AddSamples(samples); - } - } - - [VideoWriterIgnore] - public class VideoStretcher : AVStretcher - { - public VideoStretcher(IVideoWriter w) - { - this.w = w; - } - - private short[] _samples = new short[0]; - - // how many extra audio samples there are (* fpsnum) - private long exaudio_num; - - private bool pset = false; - private long threshone; - private long threshmore; - private long threshtotal; - - private void VerifyParams() - { - if (!aset || !vset) - { - throw new InvalidOperationException("Must set params first!"); - } - - if (!pset) - { - pset = true; - - // each video frame committed counts as (fpsden * samplerate / fpsnum) audio samples - threshtotal = fpsden * (long)samplerate; - - // blah blah blah - threshone = (long)(threshtotal * 0.4); - threshmore = (long)(threshtotal * 0.9); - } - } - - public void DumpAV(IVideoProvider v, ISoundProvider syncSoundProvider, out short[] samples, out int samplesprovided) - { - // Sound refactor TODO: we could just set it here, but we want the client to be responsible for mode switching? There may be non-trivial complications with when to switch modes that we don't want this object worrying about - if (syncSoundProvider.SyncMode != SyncSoundMode.Sync) - { - throw new InvalidOperationException("Only sync mode is supported, set sync mode before passing in the sound provider"); - } - - VerifyParams(); - syncSoundProvider.GetSamplesSync(out samples, out samplesprovided); - exaudio_num += samplesprovided * (long)fpsnum; - - // todo: scan for duplicate frames (ie, video content exactly matches previous frame) and for them, skip the threshone step - // this is a good idea, but expensive on time. is it worth it? - if (exaudio_num >= threshone) - { - // add frame once - w.AddFrame(v); - exaudio_num -= threshtotal; - } - else - { - Console.WriteLine("Dropped Frame!"); - } - while (exaudio_num >= threshmore) - { - // add frame again! - w.AddFrame(v); - exaudio_num -= threshtotal; - Console.WriteLine("Dupped Frame!"); - } - - // a bit of hackey due to the fact that this api can't read a - // usable buffer length separately from the actual length of the buffer - if (samples.Length == samplesprovided * channels) - { - w.AddSamples(samples); - } - else - { - if (_samples.Length != samplesprovided * channels) - { - _samples = new short[samplesprovided * channels]; - } - - Buffer.BlockCopy(samples, 0, _samples, 0, samplesprovided * channels * sizeof(short)); - w.AddSamples(_samples); - } - } - } - - public abstract class AVStretcher : VWWrap, IVideoWriter - { - protected int fpsnum; - protected int fpsden; - protected bool vset = false; - - protected int samplerate; - protected int channels; - protected int bits; - protected bool aset = false; - - - public new virtual void SetMovieParameters(int fpsnum, int fpsden) - { - if (vset) - { - throw new InvalidOperationException(); - } - - vset = true; - this.fpsnum = fpsnum; - this.fpsden = fpsden; - - base.SetMovieParameters(fpsnum, fpsden); - } - - public new virtual void SetAudioParameters(int sampleRate, int channels, int bits) - { - if (aset) - { - throw new InvalidOperationException(); - } - - if (bits != 16) - { - throw new InvalidOperationException("Only 16 bit audio is supported!"); - } - - aset = true; - this.samplerate = sampleRate; - this.channels = channels; - this.bits = bits; - - base.SetAudioParameters(sampleRate, channels, bits); - } - - public new virtual void SetFrame(int frame) - { - // this writer will never support this capability - } - - public new virtual void AddFrame(IVideoProvider source) - { - throw new InvalidOperationException("Must call AddAV()!"); - } - - public new virtual void AddSamples(short[] samples) - { - throw new InvalidOperationException("Must call AddAV()!"); - } - - } - - public abstract class VWWrap : IVideoWriter - { - protected IVideoWriter w; - - public bool UsesAudio => w.UsesAudio; - - public bool UsesVideo => w.UsesVideo; - - public void SetVideoCodecToken(IDisposable token) - { - w.SetVideoCodecToken(token); - } - - public void SetDefaultVideoCodecToken() - { - w.SetDefaultVideoCodecToken(); - } - - public void OpenFile(string baseName) - { - w.OpenFile(baseName); - } - - public void CloseFile() - { - w.CloseFile(); - } - - public void SetFrame(int frame) - { - w.SetFrame(frame); - } - - public void AddFrame(IVideoProvider source) - { - w.AddFrame(source); - } - - public void AddSamples(short[] samples) - { - w.AddSamples(samples); - } - - public IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd) - { - return w.AcquireVideoCodecToken(hwnd); - } - - public void SetMovieParameters(int fpsnum, int fpsden) - { - w.SetMovieParameters(fpsnum, fpsden); - } - - public void SetVideoParameters(int width, int height) - { - w.SetVideoParameters(width, height); - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - w.SetAudioParameters(sampleRate, channels, bits); - } - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - w.SetMetaData(gameName, authors, lengthMS, rerecords); - } - - public string DesiredExtension() - { - return w.DesiredExtension(); - } - - public void Dispose() - { - w.Dispose(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs b/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs deleted file mode 100644 index a74765fa87..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs +++ /dev/null @@ -1,1002 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -// some helpful p/invoke from http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx?msg=1142967 -namespace BizHawk.Client.EmuHawk -{ - [VideoWriter("vfwavi", "AVI writer", - "Uses the Microsoft AVIFIL32 system to write .avi files. Audio is uncompressed; Video can be compressed with any installed VCM codec. Splits on 2G and resolution change.")] - internal class AviWriter : IVideoWriter - { - private CodecToken _currVideoCodecToken = null; - private AviWriterSegment _currSegment; - private IEnumerator _nameProvider; - - public void SetFrame(int frame) - { - } - - private bool IsOpen => _nameProvider != null; - - public void Dispose() - { - _currSegment?.Dispose(); - } - - /// - /// sets the codec token to be used for video compression - /// - public void SetVideoCodecToken(IDisposable token) - { - if (token is CodecToken) - { - _currVideoCodecToken = (CodecToken)token; - } - else - { - throw new ArgumentException("AviWriter only takes its own Codec Tokens!"); - } - } - - public static IEnumerator CreateBasicNameProvider(string template) - { - string dir = Path.GetDirectoryName(template); - string baseName = Path.GetFileNameWithoutExtension(template); - string ext = Path.GetExtension(template); - yield return template; - int counter = 1; - for (;;) - { - yield return Path.Combine(dir, baseName) + "_" + counter + ext; - counter++; - } - } - - /// - /// opens an avi file for recording with names based on the supplied template. - /// set a video codec token first. - /// - public void OpenFile(string baseName) - { - OpenFile(CreateBasicNameProvider(baseName)); - } - - // thread communication - // synchronized queue with custom messages - // it seems like there are 99999 ways to do everything in C#, so i'm sure this is not the best - System.Collections.Concurrent.BlockingCollection threadQ; - System.Threading.Thread workerT; - - private void threadproc() - { - try - { - while (true) - { - object o = threadQ.Take(); - if (o is IVideoProvider) - { - AddFrameEx((IVideoProvider)o); - } - else if (o is short[]) - { - AddSamplesEx((short[])o); - } - else - { - // anything else is assumed to be quit time - return; - } - } - } - catch (Exception e) - { - MessageBox.Show("AVIFIL32 Thread died:\n\n" + e); - } - } - - // we can't pass the IVideoProvider we get to another thread, because it doesn't actually keep a local copy of its data, - // instead grabbing it from the emu as needed. this causes frame loss/dupping as a race condition - // instead we pass this - private class VideoCopy : IVideoProvider - { - private readonly int[] _vb; - public int VirtualWidth { get; } - public int VirtualHeight { get; } - public int BufferWidth { get; } - public int BufferHeight { get; } - public int BackgroundColor { get; } - public int VsyncNumerator { get; } - public int VsyncDenominator { get; } - public VideoCopy(IVideoProvider c) - { - _vb = (int[])c.GetVideoBuffer().Clone(); - BufferWidth = c.BufferWidth; - BufferHeight = c.BufferHeight; - BackgroundColor = c.BackgroundColor; - VirtualWidth = c.VirtualWidth; - VirtualHeight = c.VirtualHeight; - VsyncNumerator = c.VsyncNumerator; - VsyncDenominator = c.VsyncDenominator; - } - - public int[] GetVideoBuffer() - { - return _vb; - } - } - - /// - /// opens an avi file for recording with the supplied enumerator used to name files. - /// set a video codec token first. - /// - /// - public void OpenFile(IEnumerator nameProvider) - { - _nameProvider = nameProvider; - if (_currVideoCodecToken == null) - { - throw new InvalidOperationException("Tried to start recording an AVI with no video codec token set"); - } - - threadQ = new System.Collections.Concurrent.BlockingCollection(30); - workerT = new System.Threading.Thread(new System.Threading.ThreadStart(threadproc)); - workerT.Start(); - } - - public void CloseFile() - { - threadQ.Add(new object()); // acts as stop message - workerT.Join(); - _currSegment?.Dispose(); - _currSegment = null; - } - - public void AddFrame(IVideoProvider source) - { - while (!threadQ.TryAdd(new VideoCopy(source), 1000)) - { - if (!workerT.IsAlive) - { - throw new Exception("AVI Worker thread died!"); - } - } - } - - private void AddFrameEx(IVideoProvider source) - { - SetVideoParameters(source.BufferWidth, source.BufferHeight); - ConsiderLengthSegment(); - if (_currSegment == null) - { - Segment(); - } - - _currSegment.AddFrame(source); - } - - public void AddSamples(short[] samples) - { - // as MainForm.cs is written now, samples is all ours (nothing else will use it for anything) - // but that's a bad assumption to make and could change in the future, so copy it since we're passing to another thread - while (!threadQ.TryAdd((short[])samples.Clone(), 1000)) - { - if (!workerT.IsAlive) - { - throw new Exception("AVI Worker thread died!"); - } - } - } - - private void AddSamplesEx(short[] samples) - { - ConsiderLengthSegment(); - if (_currSegment == null) - { - Segment(); - } - - _currSegment.AddSamples(samples); - } - - private void ConsiderLengthSegment() - { - if (_currSegment == null) - { - return; - } - - long len = _currSegment.GetLengthApproximation(); - const long segment_length_limit = 2 * 1000 * 1000 * 1000; // 2GB - - // const long segment_length_limit = 10 * 1000 * 1000; //for testing - if (len > segment_length_limit) - { - Segment(); - } - } - - private void StartRecording() - { - // i guess theres nothing to do here - } - - private void Segment() - { - if (!IsOpen) - { - return; - } - - if (_currSegment == null) - { - StartRecording(); - } - else - { - _currSegment.Dispose(); - } - - _currSegment = new AviWriterSegment(); - _nameProvider.MoveNext(); - _currSegment.OpenFile(_nameProvider.Current, parameters, _currVideoCodecToken); - try - { - _currSegment.OpenStreams(); - } - catch // will automatically try again with 32 bit - { - _currSegment.OpenStreams(); - } - } - - /// - /// Acquires a video codec configuration from the user. you may save it for future use, but you must dispose of it when you're done with it. - /// returns null if the user canceled the dialog - /// - public IDisposable AcquireVideoCodecToken(IWin32Window hwnd) - { - var tempParams = new Parameters - { - height = 256, - width = 256, - fps = 60, - fps_scale = 1, - a_bits = 16, - a_samplerate = 44100, - a_channels = 2 - }; - var temp = new AviWriterSegment(); - string tempfile = Path.GetTempFileName(); - File.Delete(tempfile); - tempfile = Path.ChangeExtension(tempfile, "avi"); - temp.OpenFile(tempfile, tempParams, null); - CodecToken token = (CodecToken)temp.AcquireVideoCodecToken(hwnd.Handle, _currVideoCodecToken); - temp.CloseFile(); - File.Delete(tempfile); - return token; - } - - private class Parameters - { - public int width, height; - public int pitch; //in bytes - public int pitch_add; - public void PopulateBITMAPINFOHEADER24(ref Win32.BITMAPINFOHEADER bmih) - { - bmih.Init(); - bmih.biPlanes = 1; - bmih.biBitCount = 24; - bmih.biHeight = height; - - // pad up width so that we end up with multiple of 4 bytes - pitch = width * 3; - pitch = (pitch + 3) & ~3; - pitch_add = pitch - (width * 3); - bmih.biWidth = width; - bmih.biSizeImage = (uint)(pitch * height); - } - - public void PopulateBITMAPINFOHEADER32(ref Win32.BITMAPINFOHEADER bmih) - { - bmih.Init(); - bmih.biPlanes = 1; - bmih.biBitCount = 32; - pitch = width * 4; - bmih.biHeight = height; - bmih.biWidth = width; - bmih.biSizeImage = (uint)(pitch * height); - } - - public bool has_audio; - public int a_samplerate, a_channels, a_bits; - public void PopulateWAVEFORMATEX(ref Win32.WAVEFORMATEX wfex) - { - int bytes = 0; - if (a_bits == 16) bytes = 2; - else if (a_bits == 8) bytes = 1; - else throw new InvalidOperationException("only 8/16 bits audio are supported by AviWriter and you chose: " + a_bits); - if (a_channels == 1) { } - else if (a_channels == 2) { } - else throw new InvalidOperationException("only 1/2 channels audio are supported by AviWriter and you chose: " + a_channels); - - wfex.Init(); - wfex.nBlockAlign = (ushort)(bytes * a_channels); - wfex.nChannels = (ushort)a_channels; - wfex.wBitsPerSample = (ushort)a_bits; - wfex.wFormatTag = Win32.WAVE_FORMAT_PCM; - wfex.nSamplesPerSec = (uint)a_samplerate; - wfex.nAvgBytesPerSec = (uint)(wfex.nBlockAlign * a_samplerate); - } - - public int fps, fps_scale; - } - - private readonly Parameters parameters = new Parameters(); - - - /// - /// set basic movie timing parameters for the avi file. must be set before the file is opened. - /// - public void SetMovieParameters(int fps, int fps_scale) - { - bool change = false; - - change |= fps != parameters.fps; - parameters.fps = fps; - - change |= parameters.fps_scale != fps_scale; - parameters.fps_scale = fps_scale; - - if (change) - { - Segment(); - } - } - - /// - /// set basic video parameters for the avi file. must be set before the file is opened. - /// - public void SetVideoParameters(int width, int height) - { - bool change = false; - - change |= parameters.width != width; - parameters.width = width; - - change |= parameters.height != height; - parameters.height = height; - - if (change) - { - Segment(); - } - } - - /// - /// set basic audio parameters for the avi file. must be set before the file isopened. - /// - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - bool change = false; - - change |= parameters.a_samplerate != sampleRate; - parameters.a_samplerate = sampleRate; - - change |= parameters.a_channels != channels; - parameters.a_channels = channels; - - change |= parameters.a_bits != bits; - parameters.a_bits = bits; - - change |= parameters.has_audio != true; - parameters.has_audio = true; - - if (change) - { - Segment(); - } - } - - public class CodecToken : IDisposable - { - public void Dispose() { } - private CodecToken() { } - private Win32.AVICOMPRESSOPTIONS comprOptions; - public string codec; - public byte[] Format = new byte[0]; - public byte[] Parms = new byte[0]; - - public static CodecToken CreateFromAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) - { - var ret = new CodecToken - { - comprOptions = opts, - codec = Win32.decode_mmioFOURCC(opts.fccHandler), - Format = new byte[opts.cbFormat], - Parms = new byte[opts.cbParms] - }; - - if (opts.lpFormat != IntPtr.Zero) - { - Marshal.Copy(opts.lpFormat, ret.Format, 0, opts.cbFormat); - } - - if (opts.lpParms != IntPtr.Zero) - { - Marshal.Copy(opts.lpParms, ret.Parms, 0, opts.cbParms); - } - - return ret; - } - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool HeapFree(IntPtr hHeap, uint dwFlags, IntPtr lpMem); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr GetProcessHeap(); - - [DllImport("kernel32.dll", SetLastError = false)] - public static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, int dwBytes); - - public static void DeallocateAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) - { - // test: increase stability by never freeing anything, ever - // if (opts.lpParms != IntPtr.Zero) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpParms); - // if (opts.lpFormat != IntPtr.Zero) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpFormat); - opts.lpParms = IntPtr.Zero; - opts.lpFormat = IntPtr.Zero; - } - - public void AllocateToAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) - { - opts = comprOptions; - if (opts.cbParms != 0) - { - opts.lpParms = HeapAlloc(GetProcessHeap(), 0, opts.cbParms); - Marshal.Copy(Parms, 0, opts.lpParms, opts.cbParms); - } - if (opts.cbFormat != 0) - { - opts.lpFormat = HeapAlloc(GetProcessHeap(), 0, opts.cbFormat); - Marshal.Copy(Format, 0, opts.lpFormat, opts.cbFormat); - } - } - - private byte[] SerializeToByteArray() - { - var m = new MemoryStream(); - var b = new BinaryWriter(m); - - b.Write(comprOptions.fccType); - b.Write(comprOptions.fccHandler); - b.Write(comprOptions.dwKeyFrameEvery); - b.Write(comprOptions.dwQuality); - b.Write(comprOptions.dwBytesPerSecond); - b.Write(comprOptions.dwFlags); - //b.Write(comprOptions.lpFormat); - b.Write(comprOptions.cbFormat); - //b.Write(comprOptions.lpParms); - b.Write(comprOptions.cbParms); - b.Write(comprOptions.dwInterleaveEvery); - b.Write(Format); - b.Write(Parms); - b.Close(); - return m.ToArray(); - } - - private static CodecToken DeSerializeFromByteArray(byte[] data) - { - var m = new MemoryStream(data, false); - var b = new BinaryReader(m); - - Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); - - byte[] Format; - byte[] Parms; - - try - { - - comprOptions.fccType = b.ReadInt32(); - comprOptions.fccHandler = b.ReadInt32(); - comprOptions.dwKeyFrameEvery = b.ReadInt32(); - comprOptions.dwQuality = b.ReadInt32(); - comprOptions.dwBytesPerSecond = b.ReadInt32(); - comprOptions.dwFlags = b.ReadInt32(); - //comprOptions.lpFormat = b.ReadInt32(); - comprOptions.cbFormat = b.ReadInt32(); - //comprOptions.lpParms = b.ReadInt32(); - comprOptions.cbParms = b.ReadInt32(); - comprOptions.dwInterleaveEvery = b.ReadInt32(); - - Format = b.ReadBytes(comprOptions.cbFormat); - Parms = b.ReadBytes(comprOptions.cbParms); - } - catch (IOException) - { - // ran off end of array most likely - return null; - } - finally - { - b.Close(); - } - - var ret = new CodecToken - { - comprOptions = comprOptions, - Format = Format, - Parms = Parms, - codec = Win32.decode_mmioFOURCC(comprOptions.fccHandler) - }; - return ret; - } - - public string Serialize() - { - return Convert.ToBase64String(SerializeToByteArray()); - } - - public static CodecToken DeSerialize(string s) - { - return DeSerializeFromByteArray(Convert.FromBase64String(s)); - } - } - - /// - /// set metadata parameters; should be called before opening file - /// NYI - /// - public void SetMetaData(string gameName, string authors, UInt64 lengthMS, UInt64 rerecords) - { - } - - unsafe class AviWriterSegment : IDisposable - { - static AviWriterSegment() - { - Win32.AVIFileInit(); - } - - public AviWriterSegment() - { - } - - public void Dispose() - { - CloseFile(); - } - - private CodecToken currVideoCodecToken = null; - private bool IsOpen; - private IntPtr pAviFile, pAviRawVideoStream, pAviRawAudioStream, pAviCompressedVideoStream; - private IntPtr pGlobalBuf; - private int pGlobalBuf_size; - - // are we sending 32 bit RGB to avi or 24? - private bool bit32 = false; - - /// - /// there is just ony global buf. this gets it and makes sure its big enough. don't get all re-entrant on it! - /// - private IntPtr GetStaticGlobalBuf(int amount) - { - if (amount > pGlobalBuf_size) - { - if (pGlobalBuf != IntPtr.Zero) - { - Marshal.FreeHGlobal(pGlobalBuf); - } - - pGlobalBuf_size = amount; - pGlobalBuf = Marshal.AllocHGlobal(pGlobalBuf_size); - } - - return pGlobalBuf; - } - - - private class OutputStatus - { - public int video_frames; - public int video_bytes; - public int audio_bytes; - public int audio_samples; - public int audio_buffered_shorts; - public const int AUDIO_SEGMENT_SIZE = 44100 * 2; - public short[] BufferedShorts = new short[AUDIO_SEGMENT_SIZE]; - } - - private OutputStatus outStatus; - - public long GetLengthApproximation() - { - return outStatus.video_bytes + outStatus.audio_bytes; - } - - static unsafe int AVISaveOptions(IntPtr stream, ref Win32.AVICOMPRESSOPTIONS opts, IntPtr owner) - { - fixed (Win32.AVICOMPRESSOPTIONS* _popts = &opts) - { - IntPtr* pStream = &stream; - Win32.AVICOMPRESSOPTIONS* popts = _popts; - Win32.AVICOMPRESSOPTIONS** ppopts = &popts; - return Win32.AVISaveOptions(owner, 0, 1, (void*)pStream, (void*)ppopts); - } - } - - Parameters parameters; - public void OpenFile(string destPath, Parameters parameters, CodecToken videoCodecToken) - { - this.parameters = parameters; - this.currVideoCodecToken = videoCodecToken; - - // TODO - try creating the file once first before we let vfw botch it up? - - // open the avi output file handle - if (File.Exists(destPath)) - { - File.Delete(destPath); - } - - if (Win32.FAILED(Win32.AVIFileOpenW(ref pAviFile, destPath, Win32.OpenFileStyle.OF_CREATE | Win32.OpenFileStyle.OF_WRITE, 0))) - { - throw new InvalidOperationException("Couldnt open dest path for avi file: " + destPath); - } - - // initialize the video stream - Win32.AVISTREAMINFOW vidstream_header = new Win32.AVISTREAMINFOW(); - Win32.BITMAPINFOHEADER bmih = new Win32.BITMAPINFOHEADER(); - parameters.PopulateBITMAPINFOHEADER24(ref bmih); - vidstream_header.fccType = Win32.mmioFOURCC("vids"); - vidstream_header.dwRate = parameters.fps; - vidstream_header.dwScale = parameters.fps_scale; - vidstream_header.dwSuggestedBufferSize = (int)bmih.biSizeImage; - if (Win32.FAILED(Win32.AVIFileCreateStreamW(pAviFile, out pAviRawVideoStream, ref vidstream_header))) - { - CloseFile(); - throw new InvalidOperationException("Failed opening raw video stream. Not sure how this could happen"); - } - - // initialize audio stream - Win32.AVISTREAMINFOW audstream_header = new Win32.AVISTREAMINFOW(); - Win32.WAVEFORMATEX wfex = new Win32.WAVEFORMATEX(); - parameters.PopulateWAVEFORMATEX(ref wfex); - audstream_header.fccType = Win32.mmioFOURCC("auds"); - audstream_header.dwQuality = -1; - audstream_header.dwScale = wfex.nBlockAlign; - audstream_header.dwRate = (int)wfex.nAvgBytesPerSec; - audstream_header.dwSampleSize = wfex.nBlockAlign; - audstream_header.dwInitialFrames = 1; // ??? optimal value? - if (Win32.FAILED(Win32.AVIFileCreateStreamW(pAviFile, out pAviRawAudioStream, ref audstream_header))) - { - CloseFile(); - throw new InvalidOperationException("Failed opening raw audio stream. Not sure how this could happen"); - } - - outStatus = new OutputStatus(); - IsOpen = true; - } - - - /// - /// Acquires a video codec configuration from the user - /// - public IDisposable AcquireVideoCodecToken(IntPtr hwnd, CodecToken lastCodecToken) - { - if (!IsOpen) - { - throw new InvalidOperationException("File must be opened before acquiring a codec token (or else the stream formats wouldnt be known)"); - } - - if (lastCodecToken != null) - { - currVideoCodecToken = lastCodecToken; - } - - // encoder params - Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); - currVideoCodecToken?.AllocateToAVICOMPRESSOPTIONS(ref comprOptions); - - bool result = AVISaveOptions(pAviRawVideoStream, ref comprOptions, hwnd) != 0; - CodecToken ret = CodecToken.CreateFromAVICOMPRESSOPTIONS(ref comprOptions); - - // so, AVISaveOptions may have changed some of the pointers - // if it changed the pointers, did it it free the old ones? we don't know - // let's assume it frees them. if we're wrong, we leak. if we assume otherwise and we're wrong, we may crash. - // so that means any pointers that come in here are either - // 1. ones we allocated a minute ago - // 2. ones VFW allocated - // guess what? doesn't matter. We'll free them all ourselves. - CodecToken.DeallocateAVICOMPRESSOPTIONS(ref comprOptions); - - if (result) - { - // save to config and return it - Global.Config.AVICodecToken = ret.Serialize(); - return ret; - } - - return null; - } - - /// - /// begin recording - /// - public void OpenStreams() - { - if (currVideoCodecToken == null) - { - throw new InvalidOperationException("set a video codec token before opening the streams!"); - } - - // open compressed video stream - Win32.AVICOMPRESSOPTIONS opts = new Win32.AVICOMPRESSOPTIONS(); - currVideoCodecToken.AllocateToAVICOMPRESSOPTIONS(ref opts); - bool failed = Win32.FAILED(Win32.AVIMakeCompressedStream(out pAviCompressedVideoStream, pAviRawVideoStream, ref opts, IntPtr.Zero)); - CodecToken.DeallocateAVICOMPRESSOPTIONS(ref opts); - - if (failed) - { - CloseStreams(); - throw new InvalidOperationException("Failed making compressed video stream"); - } - - // set the compressed video stream input format - Win32.BITMAPINFOHEADER bmih = new Win32.BITMAPINFOHEADER(); - if (bit32) - { - parameters.PopulateBITMAPINFOHEADER32(ref bmih); - } - else - { - parameters.PopulateBITMAPINFOHEADER24(ref bmih); - } - - if (Win32.FAILED(Win32.AVIStreamSetFormat(pAviCompressedVideoStream, 0, ref bmih, Marshal.SizeOf(bmih)))) - { - bit32 = true; // we'll try again - CloseStreams(); - throw new InvalidOperationException("Failed setting compressed video stream input format"); - } - - // set audio stream input format - Win32.WAVEFORMATEX wfex = new Win32.WAVEFORMATEX(); - parameters.PopulateWAVEFORMATEX(ref wfex); - if (Win32.FAILED(Win32.AVIStreamSetFormat(pAviRawAudioStream, 0, ref wfex, Marshal.SizeOf(wfex)))) - { - CloseStreams(); - throw new InvalidOperationException("Failed setting raw audio stream input format"); - } - } - - /// - /// wrap up the AVI writing - /// - public void CloseFile() - { - CloseStreams(); - if (pAviRawAudioStream != IntPtr.Zero) - { - Win32.AVIStreamRelease(pAviRawAudioStream); - pAviRawAudioStream = IntPtr.Zero; - } - - if (pAviRawVideoStream != IntPtr.Zero) - { - Win32.AVIStreamRelease(pAviRawVideoStream); - pAviRawVideoStream = IntPtr.Zero; - } - - if (pAviFile != IntPtr.Zero) - { - Win32.AVIFileRelease(pAviFile); - pAviFile = IntPtr.Zero; - } - - if (pGlobalBuf != IntPtr.Zero) - { - Marshal.FreeHGlobal(pGlobalBuf); - pGlobalBuf = IntPtr.Zero; - pGlobalBuf_size = 0; - } - } - - /// - /// end recording - /// - public void CloseStreams() - { - if (pAviRawAudioStream != IntPtr.Zero) - { - FlushBufferedAudio(); - } - - if (pAviCompressedVideoStream != IntPtr.Zero) - { - Win32.AVIStreamRelease(pAviCompressedVideoStream); - pAviCompressedVideoStream = IntPtr.Zero; - } - } - - // todo - why couldnt this take an ISoundProvider? it could do the timekeeping as well.. hmm - public unsafe void AddSamples(short[] samples) - { - int todo = samples.Length; - int idx = 0; - while (todo > 0) - { - int remain = OutputStatus.AUDIO_SEGMENT_SIZE - outStatus.audio_buffered_shorts; - int chunk = Math.Min(remain, todo); - for (int i = 0; i < chunk; i++) - { - outStatus.BufferedShorts[outStatus.audio_buffered_shorts++] = samples[idx++]; - } - todo -= chunk; - - if (outStatus.audio_buffered_shorts == OutputStatus.AUDIO_SEGMENT_SIZE) - { - FlushBufferedAudio(); - } - } - } - - unsafe void FlushBufferedAudio() - { - int todo = outStatus.audio_buffered_shorts; - int todo_realsamples = todo / 2; - IntPtr buf = GetStaticGlobalBuf(todo * 2); - - short* sptr = (short*)buf.ToPointer(); - for (int i = 0; i < todo; i++) - { - sptr[i] = outStatus.BufferedShorts[i]; - } - - // (TODO - inefficient- build directly in a buffer) - int bytes_written; - Win32.AVIStreamWrite(pAviRawAudioStream, outStatus.audio_samples, todo_realsamples, buf, todo_realsamples * 4, 0, IntPtr.Zero, out bytes_written); - outStatus.audio_samples += todo_realsamples; - outStatus.audio_bytes += bytes_written; - outStatus.audio_buffered_shorts = 0; - } - - public unsafe void AddFrame(IVideoProvider source) - { - if (parameters.width != source.BufferWidth - || parameters.height != source.BufferHeight) - throw new InvalidOperationException("video buffer changed between start and now"); - - int pitch_add = parameters.pitch_add; - - int todo = parameters.pitch * parameters.height; - int w = source.BufferWidth; - int h = source.BufferHeight; - - if (!bit32) - { - IntPtr buf = GetStaticGlobalBuf(todo); - - // TODO - would using a byte* be faster? - int[] buffer = source.GetVideoBuffer(); - fixed (int* buffer_ptr = &buffer[0]) - { - byte* bytes_ptr = (byte*)buf.ToPointer(); - { - byte* bp = bytes_ptr; - - for (int idx = w * h - w, y = 0; y < h; y++) - { - for (int x = 0; x < w; x++, idx++) - { - int r = (buffer[idx] >> 0) & 0xFF; - int g = (buffer[idx] >> 8) & 0xFF; - int b = (buffer[idx] >> 16) & 0xFF; - *bp++ = (byte)r; - *bp++ = (byte)g; - *bp++ = (byte)b; - } - idx -= w * 2; - bp += pitch_add; - } - - int bytes_written; - int ret = Win32.AVIStreamWrite(pAviCompressedVideoStream, outStatus.video_frames, 1, new IntPtr(bytes_ptr), todo, Win32.AVIIF_KEYFRAME, IntPtr.Zero, out bytes_written); - outStatus.video_bytes += bytes_written; - outStatus.video_frames++; - } - } - } - else // 32 bit - { - IntPtr buf = GetStaticGlobalBuf(todo * 4); - int[] buffer = source.GetVideoBuffer(); - fixed (int* buffer_ptr = &buffer[0]) - { - byte* bytes_ptr = (byte*)buf.ToPointer(); - { - byte* bp = bytes_ptr; - - for (int idx = w * h - w, y = 0; y < h; y++) - { - for (int x = 0; x < w; x++, idx++) - { - int r = (buffer[idx] >> 0) & 0xFF; - int g = (buffer[idx] >> 8) & 0xFF; - int b = (buffer[idx] >> 16) & 0xFF; - *bp++ = (byte)r; - *bp++ = (byte)g; - *bp++ = (byte)b; - *bp++ = 0; - } - idx -= w * 2; - } - - int bytes_written; - int ret = Win32.AVIStreamWrite(pAviCompressedVideoStream, outStatus.video_frames, 1, new IntPtr(bytes_ptr), todo * 3, Win32.AVIIF_KEYFRAME, IntPtr.Zero, out bytes_written); - outStatus.video_bytes += bytes_written; - outStatus.video_frames++; - } - } - } - } - } - - public void SetDefaultVideoCodecToken() - { - CodecToken ct = CodecToken.DeSerialize(Global.Config.AVICodecToken); - if (ct == null) - { - throw new Exception("No default AVICodecToken in config!"); - } - - _currVideoCodecToken = ct; - } - - public string DesiredExtension() - { - return "avi"; - } - - public bool UsesAudio => parameters.has_audio; - - public bool UsesVideo => true; - } -} - -////TEST AVI -//AviWriter aw = new AviWriter(); -//aw.SetVideoParameters(256, 256); -//aw.SetMovieParameters(60, 1); -//aw.OpenFile("d:\\bizhawk.avi"); -//CreateHandle(); -//var token = aw.AcquireVideoCodecToken(Handle); -//aw.SetVideoCodecToken(token); -//aw.OpenStreams(); - -//for (int i = 0; i < 100; i++) -//{ -// TestVideoProvider video = new TestVideoProvider(); -// Bitmap bmp = new Bitmap(256, 256, System.Drawing.Imaging.PixelFormat.Format32bppArgb); -// using (Graphics g = Graphics.FromImage(bmp)) -// { -// g.Clear(Color.Red); -// using (Font f = new Font(FontFamily.GenericMonospace, 10)) -// g.DrawString(i.ToString(), f, Brushes.Black, 0, 0); -// } -// //bmp.Save(string.Format("c:\\dump\\{0}.bmp", i), ImageFormat.Bmp); -// for (int y = 0, idx = 0; y < 256; y++) -// for (int x = 0; x < 256; x++) -// video.buffer[idx++] = bmp.GetPixel(x, y).ToArgb(); -// aw.AddFrame(video); -//} -//aw.CloseStreams(); -//aw.CloseFile(); -////----- diff --git a/BizHawk.Client.EmuHawk/AVOut/BmpVideoProvder.cs b/BizHawk.Client.EmuHawk/AVOut/BmpVideoProvder.cs deleted file mode 100644 index 0045e87c1c..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/BmpVideoProvder.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Drawing; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// an IVideoProvider wrapping a Bitmap - /// - public class BmpVideoProvider : IVideoProvider, IDisposable - { - private Bitmap _bmp; - - public BmpVideoProvider(Bitmap bmp, int vsyncnum, int vsyncden) - { - _bmp = bmp; - VsyncNumerator = vsyncnum; - VsyncDenominator = vsyncden; - } - - public void Dispose() - { - if (_bmp != null) - { - _bmp.Dispose(); - _bmp = null; - } - } - - public int[] GetVideoBuffer() - { - // is there a faster way to do this? - var data = _bmp.LockBits(new Rectangle(0, 0, _bmp.Width, _bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - int[] ret = new int[_bmp.Width * _bmp.Height]; - - // won't work if stride is messed up - System.Runtime.InteropServices.Marshal.Copy(data.Scan0, ret, 0, _bmp.Width * _bmp.Height); - _bmp.UnlockBits(data); - return ret; - } - - public int VirtualWidth => _bmp.Width; - - // todo: Bitmap actually has size metric data; use it - public int VirtualHeight => _bmp.Height; - - public int BufferWidth => _bmp.Width; - - public int BufferHeight => _bmp.Height; - - public int BackgroundColor => 0; - - public int VsyncNumerator { get; private set; } - - public int VsyncDenominator { get; private set; } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs b/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs deleted file mode 100644 index 8806900b34..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs +++ /dev/null @@ -1,323 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Diagnostics; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// uses pipes to launch an external ffmpeg process and encode - /// - [VideoWriter("ffmpeg", "FFmpeg writer", "Uses an external FFMPEG process to encode video and audio. Various formats supported. Splits on resolution change.")] - public class FFmpegWriter : IVideoWriter - { - /// - /// handle to external ffmpeg process - /// - private Process _ffmpeg; - - /// - /// the commandline actually sent to ffmpeg; for informative purposes - /// - private string _commandline; - - /// - /// current file segment (for multires) - /// - private int _segment; - - /// - /// base filename before segment number is attached - /// - private string _baseName; - - /// - /// recent lines in ffmpeg's stderr, for informative purposes - /// - private Queue _stderr; - - /// - /// number of lines of stderr to buffer - /// - private const int Consolebuffer = 5; - - /// - /// muxer handle for the current segment - /// - private NutMuxer _muxer; - - /// - /// codec token in use - /// - private FFmpegWriterForm.FormatPreset _token; - - /// - /// file extension actually used - /// - private string _ext; - - public void SetFrame(int frame) - { - } - - public void OpenFile(string baseName) - { - _baseName = Path.Combine( - Path.GetDirectoryName(baseName), - Path.GetFileNameWithoutExtension(baseName)); - - _ext = Path.GetExtension(baseName); - - _segment = 0; - OpenFileSegment(); - } - - /// - /// starts an ffmpeg process and sets up associated sockets - /// - private void OpenFileSegment() - { - try - { - _ffmpeg = new Process(); -#if WINDOWS - _ffmpeg.StartInfo.FileName = Path.Combine(PathManager.GetDllDirectory(), "ffmpeg.exe"); -#else - ffmpeg.StartInfo.FileName = "ffmpeg"; // expecting native version to be in path -#endif - - string filename = _baseName + (_segment > 0 ? $"_{_segment}" : "") + _ext; - _ffmpeg.StartInfo.Arguments = string.Format("-y -f nut -i - {1} \"{0}\"", filename, _token.Commandline); - _ffmpeg.StartInfo.CreateNoWindow = true; - - // ffmpeg sends informative display to stderr, and nothing to stdout - _ffmpeg.StartInfo.RedirectStandardError = true; - _ffmpeg.StartInfo.RedirectStandardInput = true; - _ffmpeg.StartInfo.UseShellExecute = false; - - _commandline = "ffmpeg " + _ffmpeg.StartInfo.Arguments; - - _ffmpeg.ErrorDataReceived += new DataReceivedEventHandler(StderrHandler); - - _stderr = new Queue(Consolebuffer); - - _ffmpeg.Start(); - } - catch - { - _ffmpeg.Dispose(); - _ffmpeg = null; - throw; - } - - _ffmpeg.BeginErrorReadLine(); - - _muxer = new NutMuxer(width, height, fpsnum, fpsden, sampleRate, channels, _ffmpeg.StandardInput.BaseStream); - } - - /// - /// saves stderr lines from ffmpeg in a short queue - /// - private void StderrHandler(object p, DataReceivedEventArgs line) - { - if (!string.IsNullOrEmpty(line.Data)) - { - if (_stderr.Count == Consolebuffer) - { - _stderr.Dequeue(); - } - - _stderr.Enqueue(line.Data + "\n"); - } - } - - /// - /// finishes an ffmpeg process - /// - private void CloseFileSegment() - { - _muxer.Finish(); - //ffmpeg.StandardInput.Close(); - - // how long should we wait here? - _ffmpeg.WaitForExit(20000); - _ffmpeg.Dispose(); - _ffmpeg = null; - _stderr = null; - _commandline = null; - _muxer = null; - } - - - public void CloseFile() - { - CloseFileSegment(); - _baseName = null; - } - - /// - /// returns a string containing the commandline sent to ffmpeg and recent console (stderr) output - /// - /// - private string ffmpeg_geterror() - { - if (_ffmpeg.StartInfo.RedirectStandardError) - { - _ffmpeg.CancelErrorRead(); - } - - var s = new StringBuilder(); - s.Append(_commandline); - s.Append('\n'); - while (_stderr.Count > 0) - { - var foo = _stderr.Dequeue(); - s.Append(foo); - } - - return s.ToString(); - } - - - public void AddFrame(IVideoProvider source) - { - if (source.BufferWidth != width || source.BufferHeight != height) - { - SetVideoParameters(source.BufferWidth, source.BufferHeight); - } - - if (_ffmpeg.HasExited) - { - throw new Exception("unexpected ffmpeg death:\n" + ffmpeg_geterror()); - } - - var video = source.GetVideoBuffer(); - try - { - _muxer.WriteVideoFrame(video); - } - catch - { - MessageBox.Show("Exception! ffmpeg history:\n" + ffmpeg_geterror()); - throw; - } - - // have to do binary write! - //ffmpeg.StandardInput.BaseStream.Write(b, 0, b.Length); - } - - public IDisposable AcquireVideoCodecToken(IWin32Window hwnd) - { - return FFmpegWriterForm.DoFFmpegWriterDlg(hwnd); - } - - public void SetVideoCodecToken(IDisposable token) - { - if (token is FFmpegWriterForm.FormatPreset) - { - _token = (FFmpegWriterForm.FormatPreset)token; - } - else - { - throw new ArgumentException("FFmpegWriter can only take its own codec tokens!"); - } - } - - /// - /// video params - /// - private int fpsnum, fpsden, width, height, sampleRate, channels; - - public void SetMovieParameters(int fpsnum, int fpsden) - { - this.fpsnum = fpsnum; - this.fpsden = fpsden; - } - - public void SetVideoParameters(int width, int height) - { - this.width = width; - this.height = height; - - /* ffmpeg theoretically supports variable resolution videos, but in practice that's not handled very well. - * so we start a new segment. - */ - if (_ffmpeg != null) - { - CloseFileSegment(); - _segment++; - OpenFileSegment(); - } - } - - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - // can be implemented with ffmpeg "-metadata" parameter??? - // nyi - } - - public void Dispose() - { - if (_ffmpeg != null) - { - CloseFile(); - } - } - - public void AddSamples(short[] samples) - { - if (_ffmpeg.HasExited) - { - throw new Exception("unexpected ffmpeg death:\n" + ffmpeg_geterror()); - } - - if (samples.Length == 0) - { - // has special meaning for the muxer, so don't pass on - return; - } - - try - { - _muxer.WriteAudioFrame(samples); - } - catch - { - MessageBox.Show("Exception! ffmpeg history:\n" + ffmpeg_geterror()); - throw; - } - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - if (bits != 16) - { - throw new ArgumentOutOfRangeException(nameof(bits), "Sampling depth must be 16 bits!"); - } - - this.sampleRate = sampleRate; - this.channels = channels; - } - - public string DesiredExtension() - { - // this needs to interface with the codec token - return _token.Extension; - } - - public void SetDefaultVideoCodecToken() - { - _token = FFmpegWriterForm.FormatPreset.GetDefaultPreset(); - } - - public bool UsesAudio => true; - - public bool UsesVideo => true; - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/GifWriter.cs b/BizHawk.Client.EmuHawk/AVOut/GifWriter.cs deleted file mode 100644 index 34b7a2e47d..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/GifWriter.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.IO; -using System.Drawing; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - [VideoWriter("gif", "GIF writer", "Creates an animated .gif")] - public class GifWriter : IVideoWriter - { - public class GifToken : IDisposable - { - private int _frameskip, _framedelay; - - /// - /// Gets how many frames to skip for each frame deposited - /// - public int Frameskip - { - get - { - return _frameskip; - } - - private set - { - if (value < 0) - { - _frameskip = 0; - } - else if (value > 999) - { - _frameskip = 999; - } - else - { - _frameskip = value; - } - } - } - - /// - /// how long to delay between each gif frame (units of 10ms, -1 = auto) - /// - public int FrameDelay - { - get - { - return _framedelay; - } - - private set - { - if (value < -1) - { - _framedelay = -1; - } - else if (value > 100) - { - _framedelay = 100; - } - else - { - _framedelay = value; - } - } - } - - public static GifToken LoadFromConfig() - { - return new GifToken(0, 0) - { - Frameskip = Global.Config.GifWriterFrameskip, - FrameDelay = Global.Config.GifWriterDelay - }; - } - - public void Dispose() - { - } - - private GifToken(int frameskip, int framedelay) - { - Frameskip = frameskip; - FrameDelay = framedelay; - } - } - - private GifToken _token; - - public void SetVideoCodecToken(IDisposable token) - { - if (token is GifToken) - { - _token = (GifToken)token; - CalcDelay(); - } - else - { - throw new ArgumentException("GifWriter only takes its own tokens!"); - } - } - - public void SetDefaultVideoCodecToken() - { - _token = GifToken.LoadFromConfig(); - CalcDelay(); - } - - /// - /// true if the first frame has been written to the file; false otherwise - /// - private bool firstdone = false; - - /// - /// the underlying stream we're writing to - /// - private Stream f; - - /// - /// a final byte we must write before closing the stream - /// - private byte lastbyte; - - /// - /// keep track of skippable frames - /// - private int skipindex = 0; - - private int fpsnum = 1, fpsden = 1; - - public void SetFrame(int frame) - { - } - - public void OpenFile(string baseName) - { - f = new FileStream(baseName, FileMode.OpenOrCreate, FileAccess.Write); - skipindex = _token.Frameskip; - } - - public void CloseFile() - { - f.WriteByte(lastbyte); - f.Close(); - } - - /// - /// precooked gif header - /// - static byte[] GifAnimation = { 33, 255, 11, 78, 69, 84, 83, 67, 65, 80, 69, 50, 46, 48, 3, 1, 0, 0, 0 }; - - /// - /// little endian frame length in 10ms units - /// - byte[] Delay = {100, 0}; - - public void AddFrame(IVideoProvider source) - { - if (skipindex == _token.Frameskip) - { - skipindex = 0; - } - else - { - skipindex++; - return; // skip this frame - } - - using (var bmp = new Bitmap(source.BufferWidth, source.BufferHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) - { - var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - System.Runtime.InteropServices.Marshal.Copy(source.GetVideoBuffer(), 0, data.Scan0, bmp.Width * bmp.Height); - bmp.UnlockBits(data); - - using (var qBmp = new OctreeQuantizer(255, 8).Quantize(bmp)) - { - MemoryStream ms = new MemoryStream(); - qBmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); - byte[] b = ms.GetBuffer(); - if (!firstdone) - { - firstdone = true; - b[10] = (byte)(b[10] & 0x78); // no global color table - f.Write(b, 0, 13); - f.Write(GifAnimation, 0, GifAnimation.Length); - } - - b[785] = Delay[0]; - b[786] = Delay[1]; - b[798] = (byte)(b[798] | 0x87); - f.Write(b, 781, 18); - f.Write(b, 13, 768); - f.Write(b, 799, (int)(ms.Length - 800)); - - lastbyte = b[ms.Length - 1]; - } - } - } - - public void AddSamples(short[] samples) - { - // ignored - } - - public IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd) - { - return GifWriterForm.DoTokenForm(hwnd); - } - - private void CalcDelay() - { - if (_token == null) - { - return; - } - - int delay; - if (_token.FrameDelay == -1) - { - delay = (100 * fpsden * (_token.Frameskip + 1) + (fpsnum / 2)) / fpsnum; - } - else - { - delay = _token.FrameDelay; - } - - Delay[0] = (byte)(delay & 0xff); - Delay[1] = (byte)(delay >> 8 & 0xff); - } - - public void SetMovieParameters(int fpsnum, int fpsden) - { - this.fpsnum = fpsnum; - this.fpsden = fpsden; - CalcDelay(); - } - - public void SetVideoParameters(int width, int height) - { - // we read them directly from each individual frame, ignore the rest - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - // ignored - } - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - // gif can't support this - } - - - public string DesiredExtension() - { - return "gif"; - } - - public void Dispose() - { - if (f != null) - { - f.Dispose(); - f = null; - } - } - - public bool UsesAudio => false; - - public bool UsesVideo => true; - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/GifWriterForm.cs b/BizHawk.Client.EmuHawk/AVOut/GifWriterForm.cs deleted file mode 100644 index 3e5d4f760c..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/GifWriterForm.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GifWriterForm : Form - { - public GifWriterForm() - { - InitializeComponent(); - } - - public static GifWriter.GifToken DoTokenForm(IWin32Window parent) - { - using (var dlg = new GifWriterForm()) - { - dlg.numericUpDown1.Value = Global.Config.GifWriterFrameskip; - dlg.numericUpDown2.Value = Global.Config.GifWriterDelay; - dlg.NumericUpDown2_ValueChanged(null, null); - - var result = dlg.ShowDialog(parent); - if (result == DialogResult.OK) - { - Global.Config.GifWriterFrameskip = (int)dlg.numericUpDown1.Value; - Global.Config.GifWriterDelay = (int)dlg.numericUpDown2.Value; - - return GifWriter.GifToken.LoadFromConfig(); - } - - return null; - } - } - - private void NumericUpDown2_ValueChanged(object sender, EventArgs e) - { - if (numericUpDown2.Value == -1) - { - label3.Text = "Auto"; - } - else if (numericUpDown2.Value == 0) - { - label3.Text = "Fastest"; - } - else - { - label3.Text = $"{(int)((100 + numericUpDown2.Value / 2) / numericUpDown2.Value)} FPS"; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/IVideoWriter.cs b/BizHawk.Client.EmuHawk/AVOut/IVideoWriter.cs deleted file mode 100644 index e067b327a5..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/IVideoWriter.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Common.ReflectionExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public interface IVideoWriter : IDisposable - { - /// - /// sets the codec token to be used for video compression - /// - void SetVideoCodecToken(IDisposable token); - - /// - /// sets to a default video codec token without calling any UI - for automated dumping - /// - void SetDefaultVideoCodecToken(); - - /// - /// Returns whether this videowriter dumps audio - /// - bool UsesAudio { get; } - - /// - /// Returns whether this videowriter dumps video - /// - bool UsesVideo { get; } - - // why no OpenFile(IEnumerator) ? - // different video writers may have different ideas of how and why splitting is to occur - /// - /// opens a recording stream - /// set a video codec token first. - /// - void OpenFile(string baseName); - - /// - /// close recording stream - /// - void CloseFile(); - - /// - /// tells which emulation frame we're on. Happens before AddFrame() or AddSamples() - /// - void SetFrame(int frame); - - /// - /// adds a frame to the stream - /// - void AddFrame(IVideoProvider source); - - /// - /// adds audio samples to the stream - /// no attempt is made to sync this to the video - /// recommendation: try not to have the size or pacing of the audio chunks be too "weird" - /// - void AddSamples(short[] samples); - - /// - /// obtain a set of recording compression parameters - /// return null on user cancel - /// - /// hwnd to attach to if the user is shown config dialog - /// codec token, dispose of it when you're done with it - IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd); - - /// - /// set framerate to fpsnum/fpsden (assumed to be unchanging over the life of the stream) - /// - void SetMovieParameters(int fpsnum, int fpsden); - - /// - /// set resolution parameters (width x height) - /// must be set before file is opened - /// can be changed in future - /// should always match IVideoProvider - /// - void SetVideoParameters(int width, int height); - - /// - /// set audio parameters. cannot change later - /// - void SetAudioParameters(int sampleRate, int channels, int bits); - - /// - /// set metadata parameters; should be called before opening file - /// ok to not set at all, if not applicable - /// - /// The name of the game loaded - /// Authors on movie file - /// Length of movie file in milliseconds - /// Number of rerecords on movie file - void SetMetaData(string gameName, string authors, UInt64 lengthMS, UInt64 rerecords); - - /// - /// short description of this IVideoWriter - /// - // string WriterDescription(); - /// - /// what default extension this writer would like to put on its output - /// - string DesiredExtension(); - /// - /// name that command line parameters can refer to - /// - /// - // string ShortName(); - } - - public static class VideoWriterExtensions - { - public static string WriterDescription(this IVideoWriter w) - { - return w.GetAttribute().Description; - } - - public static string ShortName(this IVideoWriter w) - { - return w.GetAttribute().ShortName; - } - - public static string LongName(this IVideoWriter w) - { - return w.GetAttribute().Name; - } - } - - - [AttributeUsage(AttributeTargets.Class)] - public class VideoWriterAttribute : Attribute - { - public string ShortName { get; } - public string Name { get; } - public string Description { get; } - - public VideoWriterAttribute(string shortName, string name, string description) - { - ShortName = shortName; - Name = name; - Description = description; - } - } - - [AttributeUsage(AttributeTargets.Class)] - public class VideoWriterIgnoreAttribute : Attribute - { - } - - public class VideoWriterInfo - { - public VideoWriterAttribute Attribs { get; } - private Type _type; - - public VideoWriterInfo(VideoWriterAttribute attribs, Type type) - { - _type = type; - Attribs = attribs; - } - - public IVideoWriter Create() - { - return (IVideoWriter)Activator.CreateInstance(_type); - } - - public override string ToString() - { - return Attribs.Name; - } - } - - /// - /// contains methods to find all IVideoWriter - /// - public static class VideoWriterInventory - { - private static Dictionary vws = new Dictionary(); - - static VideoWriterInventory() - { - foreach (Type t in typeof(VideoWriterInventory).Assembly.GetTypes()) - { - if (!t.IsInterface - && typeof(IVideoWriter).IsAssignableFrom(t) - && !t.IsAbstract - && t.GetCustomAttributes(typeof(VideoWriterIgnoreAttribute), false).Length == 0) - { - var a = (VideoWriterAttribute)t.GetCustomAttributes(typeof(VideoWriterAttribute), false)[0]; - vws.Add(a.ShortName, new VideoWriterInfo(a, t)); - } - } - } - - public static IEnumerable GetAllWriters() - { - return vws.Values; - } - - /// - /// find an IVideoWriter by its short name - /// - public static IVideoWriter GetVideoWriter(string name) - { - VideoWriterInfo ret; - if (vws.TryGetValue(name, out ret)) - { - return ret.Create(); - } - - return null; - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/ImageSequenceWriter.cs b/BizHawk.Client.EmuHawk/AVOut/ImageSequenceWriter.cs deleted file mode 100644 index 50217ef9ec..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/ImageSequenceWriter.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.IO; -using System.Windows.Forms; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Writes a sequence of 24bpp PNG or JPG files - /// - [VideoWriter("imagesequence", "Image sequence writer", "Writes a sequence of 24bpp PNG or JPG files (default compression quality)")] - public class ImageSequenceWriter : IDisposable, IVideoWriter - { - private string _baseName; - private int _frame; - - public void SetVideoCodecToken(IDisposable token) - { - } - - public void SetDefaultVideoCodecToken() - { - } - - public bool UsesAudio => false; - - public bool UsesVideo => true; - - public void OpenFile(string baseName) - { - _baseName = baseName; - } - - public void CloseFile() - { - } - - public void SetFrame(int frame) - { - // eh? this gets ditched somehow - } - - public void AddFrame(IVideoProvider source) - { - string ext = Path.GetExtension(_baseName); - string name = Path.GetFileNameWithoutExtension(_baseName) + "_" + _frame; - name += ext; - name = Path.Combine(Path.GetDirectoryName(_baseName), name); - BitmapBuffer bb = new BitmapBuffer(source.BufferWidth, source.BufferHeight, source.GetVideoBuffer()); - using (var bmp = bb.ToSysdrawingBitmap()) - { - if (ext.ToUpper() == ".PNG") - { - bmp.Save(name, System.Drawing.Imaging.ImageFormat.Png); - } - else if (ext.ToUpper() == ".JPG") - { - bmp.Save(name, System.Drawing.Imaging.ImageFormat.Jpeg); - } - } - - _frame++; - } - - public void AddSamples(short[] samples) - { - } - - private class CodecToken : IDisposable - { - public void Dispose() - { - } - } - - public IDisposable AcquireVideoCodecToken(IWin32Window hwnd) - { - return new CodecToken(); - } - - public void SetMovieParameters(int fpsnum, int fpsden) - { - } - - public void SetVideoParameters(int width, int height) - { - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - } - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - } - - public string DesiredExtension() - { - return "png"; - } - - public void Dispose() - { - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/JMDForm.cs b/BizHawk.Client.EmuHawk/AVOut/JMDForm.cs deleted file mode 100644 index 613274208a..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/JMDForm.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// implements a minimal dialog for configuring JMDWriter - /// - public partial class JMDForm : Form - { - public JMDForm() - { - InitializeComponent(); - } - - private void okButton_Click(object sender, EventArgs e) - { - - } - - private void cancelButton_Click(object sender, EventArgs e) - { - - } - - private void threadsBar_Scroll(object sender, EventArgs e) - { - threadTop.Text = $"Number of compression threads: {threadsBar.Value}"; - } - - private void compressionBar_Scroll(object sender, EventArgs e) - { - compressionTop.Text = compressionBar.Value == compressionBar.Minimum - ? "Compression Level: NONE" - : $"Compression Level: {compressionBar.Value}"; - } - - /// - /// Show a configuration dialog (modal) for JMDWriter - /// - /// number of threads - /// compression level - /// minimum possible number of threads - /// maximum possible number of threads - /// minimum compression level, assumed to be "no compression" - /// maximum compression level - /// hwnd of parent - /// false if user canceled; true if user consented - public static bool DoCompressionDlg(ref int threads, ref int complevel, int tmin, int tmax, int cmin, int cmax, IWin32Window hwnd) - { - JMDForm j = new JMDForm(); - j.threadsBar.Minimum = tmin; - j.threadsBar.Maximum = tmax; - j.compressionBar.Minimum = cmin; - j.compressionBar.Maximum = cmax; - j.threadsBar.Value = threads; - j.compressionBar.Value = complevel; - j.threadsBar_Scroll(null, null); - j.compressionBar_Scroll(null, null); - j.threadLeft.Text = $"{tmin}"; - j.threadRight.Text = $"{tmax}"; - j.compressionLeft.Text = $"{cmin}"; - j.compressionRight.Text = $"{cmax}"; - - DialogResult d = j.ShowDialog(hwnd); - - threads = j.threadsBar.Value; - complevel = j.compressionBar.Value; - - j.Dispose(); - if (d == DialogResult.OK) - { - return true; - } - - return false; - } - - - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/JMDWriter.cs b/BizHawk.Client.EmuHawk/AVOut/JMDWriter.cs deleted file mode 100644 index 7f7fbfab7d..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/JMDWriter.cs +++ /dev/null @@ -1,817 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -using ICSharpCode.SharpZipLib.Zip.Compression.Streams; -using ICSharpCode.SharpZipLib.Zip.Compression; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// implements IVideoWriter, outputting to format "JMD" - /// this is the JPC-rr multidump format; there are no filesize limits, and resolution can switch dynamically - /// so each dump is always one file - /// they can be processed with JPC-rr streamtools or JMDSource (avisynth) - /// - [VideoWriter("jmd", "JMD writer", "Writes a JPC-rr multidump file (JMD). These can be read and further processed with jpc-streamtools. One JMD file contains all audio (uncompressed) and video (compressed).")] - class JMDWriter : IVideoWriter - { - /// - /// carries private compression information data - /// - class CodecToken : IDisposable - { - public void Dispose() - { - } - - /// - /// how hard the zlib compressor works - /// - public int compressionlevel - { - get; - set; - } - - /// - /// number of threads to be used for video compression (sort of) - /// - public int numthreads - { - get; - set; - } - - /// - /// instantiates a CodecToken with default parameters - /// - public CodecToken() - { - compressionlevel = Deflater.DEFAULT_COMPRESSION; - numthreads = 3; - } - } - - /// - /// stores compression parameters - /// - CodecToken token; - - /// - /// fps numerator, constant - /// - int fpsnum; - - /// - /// fps denominator, constant - /// - int fpsden; - - /// - /// audio samplerate, constant - /// - int audiosamplerate; - - /// - /// audio number of channels, constant; 1 or 2 only - /// - int audiochannels; - - /// - /// audio bits per sample, constant; only 16 supported - /// - int audiobits; - - /// - /// actual disk file being written - /// - JMDfile jmdfile; - - /// - /// metadata for a movie - /// not needed if we aren't dumping something that's not a movie - /// - class MovieMetaData - { - /// - /// name of the game (rom) - /// - public string gamename; - /// - /// author(s) names - /// - public string authors; - /// - /// total length of the movie: ms - /// - public UInt64 lengthms; - /// - /// number of rerecords - /// - public UInt64 rerecords; - } - - /// - /// represents the metadata for the active movie (if applicable) - /// - MovieMetaData moviemetadata; - - /// - /// represents a JMD file packet ready to be written except for sorting and timestamp offset - /// - class JMDPacket - { - public UInt16 stream; - public UInt64 timestamp; // final muxed timestamp will be relative to previous - public byte subtype; - public byte[] data; - } - - /// - /// writes JMDfile packets to an underlying bytestream - /// handles one video, one pcm audio, and one metadata track - /// - class JMDfile - { - /// - /// current timestamp position - /// - UInt64 timestampoff; - - /// - /// total number of video frames written - /// - UInt64 totalframes; - - /// - /// total number of sample pairs written - /// - UInt64 totalsamples; - - /// - /// fps of the video stream is fpsnum/fpsden - /// - int fpsnum; - - /// - /// fps of the video stream is fpsnum/fpsden - /// - int fpsden; - - /// - /// audio samplerate in hz - /// - int audiosamplerate; - - /// - /// true if input will be stereo; mono otherwise - /// output stream is always stereo - /// - bool stereo; - - /// - /// underlying bytestream that is being written to - /// - Stream f; - public JMDfile(Stream f, int fpsnum, int fpsden, int audiosamplerate, bool stereo) - { - if (!f.CanWrite) - { - throw new ArgumentException("Stream must be writable!"); - } - - this.f = f; - this.fpsnum = fpsnum; - this.fpsden = fpsden; - this.audiosamplerate = audiosamplerate; - this.stereo = stereo; - - timestampoff = 0; - totalframes = 0; - totalsamples = 0; - - astorage = new Queue(); - vstorage = new Queue(); - - writeheader(); - } - - /// - /// write header to the JPC file - /// assumes one video, one audio, and one metadata stream, with hardcoded IDs - /// - void writeheader() - { - // write JPC MAGIC - writeBE16(0xffff); - f.Write(Encoding.ASCII.GetBytes("JPCRRMULTIDUMP"), 0, 14); - - // write channel table - writeBE16(3); // number of streams - - // for each stream - writeBE16(0); // channel 0 - writeBE16(0); // video - writeBE16(0); // no name - - writeBE16(1); // channel 1 - writeBE16(1); // pcm audio - writeBE16(0); // no name - - writeBE16(2); // channel 2 - writeBE16(5); // metadata - writeBE16(0); // no name - } - - /// - /// write metadata for a movie file - /// can be called at any time - /// - /// metadata to write - public void writemetadata(MovieMetaData mmd) - { - byte[] temp; - // write metadatas - writeBE16(2); // data channel - writeBE32(0); // timestamp (same time as previous packet) - f.WriteByte(71); // gamename - temp = Encoding.UTF8.GetBytes(mmd.gamename); - writeVar(temp.Length); - f.Write(temp, 0, temp.Length); - - writeBE16(2); - writeBE32(0); - f.WriteByte(65); // authors - temp = Encoding.UTF8.GetBytes(mmd.authors); - writeVar(temp.Length); - f.Write(temp, 0, temp.Length); - - writeBE16(2); - writeBE32(0); - f.WriteByte(76); // length - writeVar(8); - writeBE64(mmd.lengthms * 1000000); - - writeBE16(2); - writeBE32(0); - f.WriteByte(82); // rerecords - writeVar(8); - writeBE64(mmd.rerecords); - } - - /// - /// write big endian 16 bit unsigned - /// - /// - void writeBE16(UInt16 v) - { - byte[] b = new byte[2]; - b[0] = (byte)(v >> 8); - b[1] = (byte)(v & 255); - f.Write(b, 0, 2); - } - - /// - /// write big endian 32 bit unsigned - /// - /// - void writeBE32(UInt32 v) - { - byte[] b = new byte[4]; - b[0] = (byte)(v >> 24); - b[1] = (byte)(v >> 16); - b[2] = (byte)(v >> 8); - b[3] = (byte)(v & 255); - f.Write(b, 0, 4); - } - - /// - /// write big endian 64 bit unsigned - /// - /// - void writeBE64(UInt64 v) - { - byte[] b = new byte[8]; - for (int i = 7; i >= 0; i--) - { - b[i] = (byte)(v & 255); - v >>= 8; - } - f.Write(b, 0, 8); - } - - /// - /// write variable length value - /// encoding is similar to MIDI - /// - /// - void writeVar(UInt64 v) - { - byte[] b = new byte[10]; - int i = 0; - while (v > 0) - { - if (i > 0) - b[i++] = (byte)((v & 127) | 128); - else - b[i++] = (byte)(v & 127); - v /= 128; - } - if (i == 0) - f.WriteByte(0); - else - for (; i > 0; i--) - f.WriteByte(b[i - 1]); - } - - /// - /// write variable length value - /// encoding is similar to MIDI - /// - /// - private void writeVar(int v) - { - if (v < 0) - { - throw new ArgumentException("length cannot be less than 0!"); - } - - writeVar((UInt64)v); - } - - /// - /// creates a timestamp out of fps value - /// - /// fpsnum - /// fpsden - /// frame position - /// timestamp in nanoseconds - static UInt64 timestampcalc(int rate, int scale, UInt64 pos) - { - // rate/scale events per second - // timestamp is in nanoseconds - // round down, consistent with JPC-rr apparently? - var b = new System.Numerics.BigInteger(pos) * scale * 1000000000 / rate; - - return (UInt64)b; - } - - /// - /// actually write a packet to file - /// timestamp sequence must be nondecreasing - /// - /// - void writeActual(JMDPacket j) - { - if (j.timestamp < timestampoff) - { - throw new ArithmeticException("JMD Timestamp problem?"); - } - - UInt64 timestampout = j.timestamp - timestampoff; - while (timestampout > 0xffffffff) - { - timestampout -= 0xffffffff; - // write timestamp skipper - for (int i = 0; i < 6; i++) - f.WriteByte(0xff); - } - timestampoff = j.timestamp; - writeBE16(j.stream); - writeBE32((UInt32)timestampout); - f.WriteByte(j.subtype); - writeVar((UInt64)j.data.LongLength); - f.Write(j.data, 0, j.data.Length); - } - - /// - /// assemble JMDPacket and send to packetqueue - /// - /// zlibed frame with width and height prepended - public void AddVideo(byte[] source) - { - var j = new JMDPacket(); - j.stream = 0; - j.subtype = 1; // zlib compressed, other possibility is 0 = uncompressed - j.data = source; - j.timestamp = timestampcalc(fpsnum, fpsden, (UInt64)totalframes); - totalframes++; - writevideo(j); - } - - /// - /// assemble JMDPacket and send to packetqueue - /// one audio packet is split up into many many JMD packets, since JMD requires only 2 samples (1 left, 1 right) per packet - /// - /// - public void AddSamples(short[] samples) - { - if (!stereo) - for (int i = 0; i < samples.Length; i++) - doaudiopacket(samples[i], samples[i]); - else - for (int i = 0; i < samples.Length / 2; i++) - doaudiopacket(samples[2 * i], samples[2 * i + 1]); - } - - /// - /// helper function makes a JMDPacket out of one sample pair and adds it to the order queue - /// - /// left sample - /// right sample - void doaudiopacket(short l, short r) - { - var j = new JMDPacket(); - j.stream = 1; - j.subtype = 1; // raw PCM audio - j.data = new byte[4]; - j.data[0] = (byte)(l >> 8); - j.data[1] = (byte)(l & 255); - j.data[2] = (byte)(r >> 8); - j.data[3] = (byte)(r & 255); - - j.timestamp = timestampcalc(audiosamplerate, 1, totalsamples); - totalsamples++; - writesound(j); - } - - // ensure outputs are in order - // JMD packets must be in nondecreasing timestamp order, but there's no obligation - // for us to get handed that. this code is a bit overcomplex to handle edge cases - // that may not be a problem with the current system? - - /// - /// collection of JMDpackets yet to be written (audio) - /// - Queue astorage; - /// - /// collection of JMDpackets yet to be written (video) - /// - Queue vstorage; - - /// - /// add a sound packet to the file write queue - /// will be written when order-appropriate wrt video - /// the sound packets added must be internally ordered (but need not match video order) - /// - /// - void writesound(JMDPacket j) - { - while (vstorage.Count > 0) - { - var p = vstorage.Peek(); - if (p.timestamp <= j.timestamp) - writeActual(vstorage.Dequeue()); - else - break; - } - - astorage.Enqueue(j); - } - - /// - /// add a video packet to the file write queue - /// will be written when order-appropriate wrt audio - /// the video packets added must be internally ordered (but need not match audio order) - /// - /// - void writevideo(JMDPacket j) - { - while (astorage.Count > 0) - { - var p = astorage.Peek(); - if (p.timestamp <= j.timestamp) - writeActual(astorage.Dequeue()); - else - break; - } - vstorage.Enqueue(j); - } - - /// - /// flush all remaining JMDPackets to file - /// call before closing the file - /// - void flushpackets() - { - while (astorage.Count > 0 && vstorage.Count > 0) - { - var ap = astorage.Peek(); - var av = vstorage.Peek(); - if (ap.timestamp <= av.timestamp) - writeActual(astorage.Dequeue()); - else - writeActual(vstorage.Dequeue()); - } - while (astorage.Count > 0) - writeActual(astorage.Dequeue()); - while (vstorage.Count > 0) - writeActual(vstorage.Dequeue()); - } - - /// - /// flush any remaining packets and close underlying stream - /// - public void Close() - { - flushpackets(); - f.Close(); - } - } - - /// - /// sets default (probably wrong) parameters - /// - public JMDWriter() - { - fpsnum = 25; - fpsden = 1; - audiosamplerate = 22050; - audiochannels = 1; - audiobits = 8; - token = null; - - moviemetadata = null; - } - - public void Dispose() - { - // we have no unmanaged resources - } - - /// - /// sets the codec token to be used for video compression - /// - public void SetVideoCodecToken(IDisposable token) - { - if (token is CodecToken) - this.token = (CodecToken)token; - else - throw new ArgumentException("codec token must be of right type"); - } - - /// - /// obtain a set of recording compression parameters - /// - /// hwnd to attach to if the user is shown config dialog - /// codec token, dispose of it when you're done with it - public IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd) - { - CodecToken ret = new CodecToken(); - - // load from config and sanitize - int t = Math.Min(Math.Max(Global.Config.JMDThreads, 1), 6); - - int c = Math.Min(Math.Max(Global.Config.JMDCompression, Deflater.NO_COMPRESSION), Deflater.BEST_COMPRESSION); - - if (!JMDForm.DoCompressionDlg(ref t, ref c, 1, 6, Deflater.NO_COMPRESSION, Deflater.BEST_COMPRESSION, hwnd)) - return null; - - Global.Config.JMDThreads = ret.numthreads = t; - Global.Config.JMDCompression = ret.compressionlevel = c; - - return ret; - } - - /// - /// set framerate to fpsnum/fpsden (assumed to be unchanging over the life of the stream) - /// - public void SetMovieParameters(int fpsnum, int fpsden) - { - this.fpsnum = fpsnum; - this.fpsden = fpsden; - } - - /// - /// set resolution parameters (width x height) - /// must be set before file is opened - /// can be changed in future - /// should always match IVideoProvider - /// - /// - /// - public void SetVideoParameters(int width, int height) - { - // each frame is dumped independently with its own resolution tag, so we don't care to store this - } - - /// - /// set audio parameters. cannot change later - /// - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - // the sampleRate limits are arbitrary, just to catch things which are probably silly-wrong - // if a larger range of sampling rates is needed, it should be supported - if (sampleRate < 8000 || sampleRate > 96000 || channels < 1 || channels > 2 || bits != 16) - throw new ArgumentException("Audio parameters out of range!"); - audiosamplerate = sampleRate; - audiochannels = channels; - audiobits = bits; - } - - /// - /// opens a recording stream - /// set a video codec token first. - /// - public void OpenFile(string baseName) - { - string ext = Path.GetExtension(baseName); - if (ext == null || ext.ToLower() != ".jmd") - baseName = baseName + ".jmd"; - - jmdfile = new JMDfile(File.Open(baseName, FileMode.Create), fpsnum, fpsden, audiosamplerate, audiochannels == 2); - - - if (moviemetadata != null) - jmdfile.writemetadata(moviemetadata); - - // start up thread - // problem: since audio chunks and video frames both go through here, exactly how many zlib workers - // gives is not known without knowing how the emulator will chunk audio packets - // this shouldn't affect results though, just performance - threadQ = new System.Collections.Concurrent.BlockingCollection(token.numthreads * 2); - workerT = new System.Threading.Thread(new System.Threading.ThreadStart(threadproc)); - workerT.Start(); - GzipFrameDelegate = new GzipFrameD(GzipFrame); - } - - // some of this code is copied from AviWriter... not sure how if at all it should be abstracted - /// - /// blocking threadsafe queue, used for communication between main program and file writing thread - /// - System.Collections.Concurrent.BlockingCollection threadQ; - /// - /// file writing thread; most of the work happens here - /// - System.Threading.Thread workerT; - - /// - /// filewriting thread's loop - /// - void threadproc() - { - try - { - while (true) - { - Object o = threadQ.Take(); - if (o is IAsyncResult) - jmdfile.AddVideo(GzipFrameDelegate.EndInvoke((IAsyncResult)o)); - else if (o is short[]) - jmdfile.AddSamples((short[])o); - else - // anything else is assumed to be quit time - return; - } - } - catch (Exception e) - { - System.Windows.Forms.MessageBox.Show("JMD Worker Thread died:\n\n" + e); - return; - } - } - - /// - /// close recording stream - /// - public void CloseFile() - { - threadQ.Add(new Object()); // acts as stop message - workerT.Join(); - - jmdfile.Close(); - } - - /// - /// makes a copy of an IVideoProvider - /// handles conversion to a byte array suitable for compression by zlib - /// - class VideoCopy - { - public byte[] VideoBuffer; - - public int BufferWidth; - public int BufferHeight; - public VideoCopy(IVideoProvider c) - { - int[] vb = c.GetVideoBuffer(); - VideoBuffer = new byte[vb.Length * sizeof(int)]; - // we have to switch RGB ordering here - for (int i = 0; i < vb.Length; i++) - { - VideoBuffer[i * 4 + 0] = (byte)(vb[i] >> 16); - VideoBuffer[i * 4 + 1] = (byte)(vb[i] >> 8); - VideoBuffer[i * 4 + 2] = (byte)(vb[i] & 255); - VideoBuffer[i * 4 + 3] = 0; - } - //Buffer.BlockCopy(vb, 0, VideoBuffer, 0, VideoBuffer.Length); - BufferWidth = c.BufferWidth; - BufferHeight = c.BufferHeight; - } - } - - /// - /// deflates (zlib) a VideoCopy, returning a byte array suitable for insertion into a JMD file - /// the byte array includes width and height dimensions at the beginning - /// this is run asynchronously for speedup, as compressing can be slow - /// - /// video frame to compress - /// zlib compressed frame, with width and height prepended - byte[] GzipFrame(VideoCopy v) - { - MemoryStream m = new MemoryStream(); - // write frame height and width first - m.WriteByte((byte)(v.BufferWidth >> 8)); - m.WriteByte((byte)(v.BufferWidth & 255)); - m.WriteByte((byte)(v.BufferHeight >> 8)); - m.WriteByte((byte)(v.BufferHeight & 255)); - var g = new DeflaterOutputStream(m, new Deflater(token.compressionlevel)); - g.IsStreamOwner = false; // leave memory stream open so we can pick its contents - g.Write(v.VideoBuffer, 0, v.VideoBuffer.Length); - g.Flush(); - g.Close(); - byte[] ret = m.GetBuffer(); - Array.Resize(ref ret, (int)m.Length); - m.Close(); - return ret; - } - - /// - /// delegate for GzipFrame - /// - /// VideoCopy to compress - /// gzipped stream with width and height prepended - delegate byte[] GzipFrameD(VideoCopy v); - /// - /// delegate for GzipFrame - /// - GzipFrameD GzipFrameDelegate; - - /// - /// adds a frame to the stream - /// - public void AddFrame(IVideoProvider source) - { - if (!workerT.IsAlive) - // signal some sort of error? - return; - threadQ.Add(GzipFrameDelegate.BeginInvoke(new VideoCopy(source), null, null)); - } - - /// - /// adds audio samples to the stream - /// no attempt is made to sync this to the video - /// - public void AddSamples(short[] samples) - { - if (!workerT.IsAlive) - // signal some sort of error? - return; - threadQ.Add((short[])samples.Clone()); - } - - /// - /// set metadata parameters; should be called before opening file - /// - public void SetMetaData(string gameName, string authors, UInt64 lengthMS, UInt64 rerecords) - { - moviemetadata = new MovieMetaData(); - moviemetadata.gamename = gameName; - moviemetadata.authors = authors; - moviemetadata.lengthms = lengthMS; - moviemetadata.rerecords = rerecords; - } - - public string DesiredExtension() - { - return "jmd"; - } - - public void SetDefaultVideoCodecToken() - { - CodecToken ct = new CodecToken(); - - // load from config and sanitize - int t = Math.Min(Math.Max(Global.Config.JMDThreads, 1), 6); - - int c = Math.Min(Math.Max(Global.Config.JMDCompression, Deflater.NO_COMPRESSION), Deflater.BEST_COMPRESSION); - - ct.compressionlevel = c; - ct.numthreads = t; - - token = ct; - } - - public void SetFrame(int frame) { } - - public bool UsesAudio { get { return true; } } - public bool UsesVideo { get { return true; } } - } - - -} diff --git a/BizHawk.Client.EmuHawk/AVOut/NutMuxer.cs b/BizHawk.Client.EmuHawk/AVOut/NutMuxer.cs deleted file mode 100644 index 4c9a2365df..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/NutMuxer.cs +++ /dev/null @@ -1,710 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using System.Numerics; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// implements a simple muxer for the NUT media format - /// http://ffmpeg.org/~michael/nut.txt - /// - class NutMuxer - { - // this code isn't really any good for general purpose nut creation - - #region simple buffer reuser - - public class ReusableBufferPool - { - private List _available = new List(); - private ICollection _inuse = new HashSet(); - - private readonly int _capacity; - - /// - /// - /// - /// total number of buffers to keep around - public ReusableBufferPool(int capacity) - { - _capacity = capacity; - } - - private T[] GetBufferInternal(int length, bool zerofill, Func criteria) - { - if (_inuse.Count == _capacity) - throw new InvalidOperationException(); - - T[] candidate = _available.FirstOrDefault(criteria); - if (candidate == null) - { - if (_available.Count + _inuse.Count == _capacity) - { - // out of space! should not happen often - Console.WriteLine("Purging"); - _available.Clear(); - } - candidate = new T[length]; - } - else - { - if (zerofill) - Array.Clear(candidate, 0, candidate.Length); - _available.Remove(candidate); - } - _inuse.Add(candidate); - return candidate; - } - - public T[] GetBuffer(int length, bool zerofill = false) - { - return GetBufferInternal(length, zerofill, a => a.Length == length); - } - - public T[] GetBufferAtLeast(int length, bool zerofill = false) - { - return GetBufferInternal(length, zerofill, a => a.Length >= length && a.Length / (float)length <= 2.0f); - } - - public void ReleaseBuffer(T[] buffer) - { - if (!_inuse.Remove(buffer)) - throw new ArgumentException(); - _available.Add(buffer); - } - } - - #endregion - - #region binary write helpers - - /// - /// variable length value, unsigned - /// - static void WriteVarU(ulong v, Stream stream) - { - byte[] b = new byte[10]; - int i = 0; - do - { - if (i > 0) - b[i++] = (byte)((v & 127) | 128); - else - b[i++] = (byte)(v & 127); - v /= 128; - } while (v > 0); - for (; i > 0; i--) - stream.WriteByte(b[i - 1]); - } - - /// - /// variable length value, unsigned - /// - static void WriteVarU(int v, Stream stream) - { - if (v < 0) - throw new ArgumentOutOfRangeException(nameof(v), "unsigned must be non-negative"); - WriteVarU((ulong)v, stream); - } - - /// - /// variable length value, unsigned - /// - static void WriteVarU(long v, Stream stream) - { - if (v < 0) - throw new ArgumentOutOfRangeException(nameof(v), "unsigned must be non-negative"); - WriteVarU((ulong)v, stream); - } - - /// - /// variable length value, signed - /// - static void WriteVarS(long v, Stream stream) - { - ulong temp; - if (v < 0) - temp = 1 + 2 * (ulong)(-v); - else - temp = 2 * (ulong)(v); - WriteVarU(temp - 1, stream); - } - - /// - /// utf-8 string with length prepended - /// - static void WriteString(string s, Stream stream) - { - WriteBytes(Encoding.UTF8.GetBytes(s), stream); - } - - /// - /// arbitrary sequence of bytes with length prepended - /// - static void WriteBytes(byte[] b, Stream stream) - { - WriteVarU(b.Length, stream); - stream.Write(b, 0, b.Length); - } - - /// - /// big endian 64 bit unsigned - /// - /// - /// - static void WriteBE64(ulong v, Stream stream) - { - byte[] b = new byte[8]; - for (int i = 7; i >= 0; i--) - { - b[i] = (byte)(v & 255); - v >>= 8; - } - stream.Write(b, 0, 8); - } - - /// - /// big endian 32 bit unsigned - /// - /// - /// - static void WriteBE32(uint v, Stream stream) - { - byte[] b = new byte[4]; - for (int i = 3; i >= 0; i--) - { - b[i] = (byte)(v & 255); - v >>= 8; - } - stream.Write(b, 0, 4); - } - - /// - /// big endian 32 bit unsigned - /// - /// - /// - static void WriteBE32(int v, Stream stream) - { - byte[] b = new byte[4]; - for (int i = 3; i >= 0; i--) - { - b[i] = (byte)(v & 255); - v >>= 8; - } - stream.Write(b, 0, 4); - } - - #endregion - - #region CRC calculator - - static readonly uint[] CRCtable = new uint[] - { - 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, - 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, - 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, - 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, - }; - - /// - /// seems to be different than standard CRC32????? - /// - /// - /// crc32, nut variant - static uint NutCRC32(byte[] buf) - { - uint crc = 0; - for (int i = 0; i < buf.Length; i++) - { - crc ^= (uint)buf[i] << 24; - crc = (crc << 4) ^ CRCtable[crc >> 28]; - crc = (crc << 4) ^ CRCtable[crc >> 28]; - } - return crc; - } - - #endregion - - /// - /// writes a single packet out, including checksums - /// - class NutPacket : Stream - { - public enum StartCode : ulong - { - Main = 0x4e4d7a561f5f04ad, - Stream = 0x4e5311405bf2f9db, - Syncpoint = 0x4e4be4adeeca4569, - Index = 0x4e58dd672f23e64e, - Info = 0x4e49ab68b596ba78 - }; - - MemoryStream data; - StartCode startcode; - Stream underlying; - - /// - /// create a new NutPacket - /// - /// startcode for this packet - /// stream to write to - public NutPacket(StartCode startcode, Stream underlying) - { - data = new MemoryStream(); - this.startcode = startcode; - this.underlying = underlying; - } - - - public override bool CanRead => false; - - public override bool CanSeek => false; - - public override bool CanWrite => true; - - /// - /// write data out to underlying stream, including header, footer, checksums - /// this cannot be done more than once! - /// - public override void Flush() - { - // first, prep header - var header = new MemoryStream(); - WriteBE64((ulong)startcode, header); - WriteVarU(data.Length + 4, header); // +4 for checksum - if (data.Length > 4092) - { - WriteBE32(NutCRC32(header.ToArray()), header); - } - - var tmp = header.ToArray(); - underlying.Write(tmp, 0, tmp.Length); - - tmp = data.ToArray(); - underlying.Write(tmp, 0, tmp.Length); - WriteBE32(NutCRC32(tmp), underlying); - - data = null; - } - - public override long Length - { - get { throw new NotImplementedException(); } - } - - public override long Position - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotImplementedException(); - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - data.Write(buffer, offset, count); - } - } - - #region fields - - /// - /// stores basic AV parameters - /// - class AVParams - { - public int width, height, samplerate, fpsnum, fpsden, channels; - /// - /// puts fpsnum, fpsden in lowest terms - /// - public void Reduce() - { - int gcd = (int) BigInteger.GreatestCommonDivisor(new BigInteger(fpsnum), new BigInteger(fpsden)); - fpsnum /= gcd; - fpsden /= gcd; - } - } - - /// - /// stores basic AV parameters - /// - AVParams avparams; - - /// - /// target output for nut stream - /// - Stream output; - - /// - /// PTS of video stream. timebase is 1/framerate, so this is equal to number of frames - /// - ulong videopts; - - /// - /// PTS of audio stream. timebase is 1/samplerate, so this is equal to number of samples - /// - ulong audiopts; - - /// - /// has EOR been writen on this stream? - /// - bool videodone; - /// - /// has EOR been written on this stream? - /// - bool audiodone; - - /// - /// video packets waiting to be written - /// - Queue videoqueue; - /// - /// audio packets waiting to be written - /// - Queue audioqueue; - - ReusableBufferPool _bufferpool = new ReusableBufferPool(12); - - #endregion - - #region header writers - - /// - /// write out the main header - /// - void writemainheader() - { - // note: this file starttag not actually part of main headers - var tmp = Encoding.ASCII.GetBytes("nut/multimedia container\0"); - output.Write(tmp, 0, tmp.Length); - - var header = new NutPacket(NutPacket.StartCode.Main, output); - - WriteVarU(3, header); // version - WriteVarU(2, header); // stream_count - WriteVarU(65536, header); // max_distance - - WriteVarU(2, header); // time_base_count - // timebase is length of single frame, so reversed num+den is intentional - WriteVarU(avparams.fpsden, header); // time_base_num[0] - WriteVarU(avparams.fpsnum, header); // time_base_den[0] - WriteVarU(1, header); // time_base_num[1] - WriteVarU(avparams.samplerate, header); // time_base_den[1] - - // frame flag compression is ignored for simplicity - for (int i = 0; i < 255; i++) // not 256 because entry 0x4e is skipped (as it would indicate a startcode) - { - WriteVarU((1 << 12), header); // tmp_flag = FLAG_CODED - WriteVarU(0, header); // tmp_fields - } - - // header compression ignored because it's not useful to us - WriteVarU(0, header); // header_count_minus1 - - // BROADCAST_MODE only useful for realtime transmission clock recovery - WriteVarU(0, header); // main_flags - - header.Flush(); - } - - /// - /// write out the 0th stream header (video) - /// - void writevideoheader() - { - var header = new NutPacket(NutPacket.StartCode.Stream, output); - WriteVarU(0, header); // stream_id - WriteVarU(0, header); // stream_class = video - WriteString("BGRA", header); // fourcc = "BGRA" - WriteVarU(0, header); // time_base_id = 0 - WriteVarU(8, header); // msb_pts_shift - WriteVarU(1, header); // max_pts_distance - WriteVarU(0, header); // decode_delay - WriteVarU(1, header); // stream_flags = FLAG_FIXED_FPS - WriteBytes(new byte[0], header); // codec_specific_data - - // stream_class = video - WriteVarU(avparams.width, header); // width - WriteVarU(avparams.height, header); // height - WriteVarU(1, header); // sample_width - WriteVarU(1, header); // sample_height - WriteVarU(18, header); // colorspace_type = full range rec709 (avisynth's "PC.709") - - header.Flush(); - } - - /// - /// write out the 1st stream header (audio) - /// - void writeaudioheader() - { - var header = new NutPacket(NutPacket.StartCode.Stream, output); - WriteVarU(1, header); // stream_id - WriteVarU(1, header); // stream_class = audio - WriteString("\x01\x00\x00\x00", header); // fourcc = 01 00 00 00 - WriteVarU(1, header); // time_base_id = 1 - WriteVarU(8, header); // msb_pts_shift - WriteVarU(avparams.samplerate, header); // max_pts_distance - WriteVarU(0, header); // decode_delay - WriteVarU(0, header); // stream_flags = none; no FIXED_FPS because we aren't guaranteeing same-size audio chunks - WriteBytes(new byte[0], header); // codec_specific_data - - // stream_class = audio - WriteVarU(avparams.samplerate, header); // samplerate_num - WriteVarU(1, header); // samplerate_den - WriteVarU(avparams.channels, header); // channel_count - - header.Flush(); - } - - #endregion - - /// - /// stores a single frame with syncpoint, in mux-ready form - /// used because reordering of audio and video can be needed for proper interleave - /// - class NutFrame - { - /// - /// data ready to be written to stream/disk - /// - byte[] data; - - /// - /// valid length of the data - /// - int actual_length; - - /// - /// presentation timestamp - /// - ulong pts; - - /// - /// fraction of the specified timebase - /// - ulong ptsnum, ptsden; - - ReusableBufferPool _pool; - - /// - /// - /// frame data - /// actual length of frame data - /// presentation timestamp - /// numerator of timebase - /// denominator of timebase - /// which timestamp base is used, assumed to be also stream number - public NutFrame(byte[] payload, int payloadlen, ulong pts, ulong ptsnum, ulong ptsden, int ptsindex, ReusableBufferPool pool) - { - this.pts = pts; - this.ptsnum = ptsnum; - this.ptsden = ptsden; - - this._pool = pool; - data = pool.GetBufferAtLeast(payloadlen + 2048); - var frame = new MemoryStream(data); - - // create syncpoint - var sync = new NutPacket(NutPacket.StartCode.Syncpoint, frame); - WriteVarU(pts * 2 + (ulong)ptsindex, sync); // global_key_pts - WriteVarU(1, sync); // back_ptr_div_16, this is wrong - sync.Flush(); - - - var frameheader = new MemoryStream(); - frameheader.WriteByte(0); // frame_code - // frame_flags = FLAG_CODED, so: - int flags = 0; - flags |= 1 << 0; // FLAG_KEY - if (payloadlen == 0) - flags |= 1 << 1; // FLAG_EOR - flags |= 1 << 3; // FLAG_CODED_PTS - flags |= 1 << 4; // FLAG_STREAM_ID - flags |= 1 << 5; // FLAG_SIZE_MSB - flags |= 1 << 6; // FLAG_CHECKSUM - WriteVarU(flags, frameheader); - WriteVarU(ptsindex, frameheader); // stream_id - WriteVarU(pts + 256, frameheader); // coded_pts = pts + 1 << msb_pts_shift - WriteVarU(payloadlen, frameheader); // data_size_msb - - var frameheaderarr = frameheader.ToArray(); - frame.Write(frameheaderarr, 0, frameheaderarr.Length); - WriteBE32(NutCRC32(frameheaderarr), frame); // checksum - frame.Write(payload, 0, payloadlen); - - actual_length = (int)frame.Position; - } - - /// - /// compare two NutFrames by pts - /// - /// - /// - /// - public static bool operator <=(NutFrame lhs, NutFrame rhs) - { - BigInteger left = new BigInteger(lhs.pts); - left = left * lhs.ptsnum * rhs.ptsden; - BigInteger right = new BigInteger(rhs.pts); - right = right * rhs.ptsnum * lhs.ptsden; - - return left <= right; - } - public static bool operator >=(NutFrame lhs, NutFrame rhs) - { - BigInteger left = new BigInteger(lhs.pts); - left = left * lhs.ptsnum * rhs.ptsden; - BigInteger right = new BigInteger(rhs.pts); - right = right * rhs.ptsnum * lhs.ptsden; - - return left >= right; - } - - /// - /// write out frame, with syncpoint and all headers - /// - /// - public void WriteData(Stream dest) - { - dest.Write(data, 0, actual_length); - _pool.ReleaseBuffer(data); - //dbg.WriteLine(string.Format("{0},{1},{2}", pts, ptsnum, ptsden)); - } - } - - /// - /// write a video frame to the stream - /// - /// raw video data; if length 0, write EOR - public void WriteVideoFrame(int[] video) - { - if (videodone) - throw new InvalidOperationException("Can't write data after end of relevance!"); - if (audioqueue.Count > 5) - throw new Exception("A\\V Desync?"); - int datalen = video.Length * sizeof(int); - byte[] data = _bufferpool.GetBufferAtLeast(datalen); - Buffer.BlockCopy(video, 0, data, 0, datalen); - if (datalen == 0) - videodone = true; - var f = new NutFrame(data, datalen, videopts, (ulong) avparams.fpsden, (ulong) avparams.fpsnum, 0, _bufferpool); - _bufferpool.ReleaseBuffer(data); - videopts++; - videoqueue.Enqueue(f); - while (audioqueue.Count > 0 && f >= audioqueue.Peek()) - audioqueue.Dequeue().WriteData(output); - } - - /// - /// write an audio frame to the stream - /// - /// raw audio data; if length 0, write EOR - public void WriteAudioFrame(short[] samples) - { - if (audiodone) - throw new Exception("Can't write audio after end of relevance!"); - if (videoqueue.Count > 5) - throw new Exception("A\\V Desync?"); - int datalen = samples.Length * sizeof(short); - byte[] data = _bufferpool.GetBufferAtLeast(datalen); - Buffer.BlockCopy(samples, 0, data, 0, datalen); - if (datalen == 0) - audiodone = true; - - var f = new NutFrame(data, datalen, audiopts, 1, (ulong)avparams.samplerate, 1, _bufferpool); - _bufferpool.ReleaseBuffer(data); - audiopts += (ulong)samples.Length / (ulong)avparams.channels; - audioqueue.Enqueue(f); - while (videoqueue.Count > 0 && f >= videoqueue.Peek()) - videoqueue.Dequeue().WriteData(output); - } - - /// - /// create a new NutMuxer - /// - /// video width - /// video height - /// fps numerator - /// fps denominator - /// audio samplerate - /// audio number of channels - /// Stream to write to - public NutMuxer(int width, int height, int fpsnum, int fpsden, int samplerate, int channels, Stream underlying) - { - avparams = new AVParams(); - avparams.width = width; - avparams.height = height; - avparams.fpsnum = fpsnum; - avparams.fpsden = fpsden; - avparams.Reduce(); // timebases in nut MUST be relatively prime - avparams.samplerate = samplerate; - avparams.channels = channels; - output = underlying; - - audiopts = 0; - videopts = 0; - - audioqueue = new Queue(); - videoqueue = new Queue(); - - writemainheader(); - writevideoheader(); - writeaudioheader(); - - videodone = false; - audiodone = false; - } - - /// - /// finish and flush everything - /// closes underlying stream!! - /// - public void Finish() - { - if (!videodone) - WriteVideoFrame(new int[0]); - if (!audiodone) - WriteAudioFrame(new short[0]); - - // flush any remaining queued packets - while (audioqueue.Count > 0 && videoqueue.Count > 0) - { - if (audioqueue.Peek() <= videoqueue.Peek()) - audioqueue.Dequeue().WriteData(output); - else - videoqueue.Dequeue().WriteData(output); - } - while (audioqueue.Count > 0) - audioqueue.Dequeue().WriteData(output); - while (videoqueue.Count > 0) - videoqueue.Dequeue().WriteData(output); - - output.Close(); - output = null; - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/NutWriter.cs b/BizHawk.Client.EmuHawk/AVOut/NutWriter.cs deleted file mode 100644 index 3dbd1b4ca6..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/NutWriter.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// dumps in the "nut" container format - /// uncompressed video and audio - /// - [VideoWriter("nut", "NUT writer", "Writes a series of .nut files to disk, a container format which can be opened by ffmpeg. All data is uncompressed. Splits occur on resolution changes. NOT RECCOMENDED FOR USE.")] - class NutWriter : IVideoWriter - { - /// - /// dummy codec token class - /// - class NutWriterToken : IDisposable - { - public void Dispose() - { - } - } - - public void SetFrame(int frame) { } - - public void SetVideoCodecToken(IDisposable token) - { - // ignored - } - public IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd) - { - return new NutWriterToken(); - } - - /// - /// avparams - /// - private int fpsnum, fpsden, width, height, sampleRate, channels; - - private NutMuxer _current = null; - private string _baseName; - private int _segment; - - public void OpenFile(string baseName) - { - _baseName = Path.Combine( - Path.GetDirectoryName(baseName), - Path.GetFileNameWithoutExtension(baseName)); - _segment = 0; - - startsegment(); - } - - private void startsegment() - { - var currentfile = File.Open($"{_baseName}_{_segment,4:D4}.nut", FileMode.Create, FileAccess.Write); - _current = new NutMuxer(width, height, fpsnum, fpsden, sampleRate, channels, currentfile); - } - - private void endsegment() - { - _current.Finish(); - _current = null; - } - - public void CloseFile() - { - endsegment(); - } - - public void AddFrame(IVideoProvider source) - { - if (source.BufferHeight != height || source.BufferWidth != width) - { - SetVideoParameters(source.BufferWidth, source.BufferHeight); - } - - _current.WriteVideoFrame(source.GetVideoBuffer()); - } - - public void AddSamples(short[] samples) - { - _current.WriteAudioFrame(samples); - } - - public void SetMovieParameters(int fpsnum, int fpsden) - { - this.fpsnum = fpsnum; - this.fpsden = fpsden; - if (_current != null) - { - endsegment(); - _segment++; - startsegment(); - } - } - - public void SetVideoParameters(int width, int height) - { - this.width = width; - this.height = height; - if (_current != null) - { - endsegment(); - _segment++; - startsegment(); - } - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - if (bits != 16) - { - throw new ArgumentOutOfRangeException(nameof(bits), "Audio depth must be 16 bit!"); - } - - this.sampleRate = sampleRate; - this.channels = channels; - } - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - // could be implemented? - } - - public void Dispose() - { - if (_current != null) - { - endsegment(); - } - - _baseName = null; - } - - public string DesiredExtension() - { - return "nut"; - } - - public void SetDefaultVideoCodecToken() - { - // ignored - } - - public bool UsesAudio => true; - - public bool UsesVideo => true; - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/Quantize/OctreeQuantizer.cs b/BizHawk.Client.EmuHawk/AVOut/Quantize/OctreeQuantizer.cs deleted file mode 100644 index 5033f6d327..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/Quantize/OctreeQuantizer.cs +++ /dev/null @@ -1,583 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// Paint.NET -// Copyright (C) Rick Brewster, Chris Crosetto, Dennis Dietrich, Tom Jackson, -// Michael Kelsey, Brandon Ortiz, Craig Taylor, Chris Trevino, -// and Luke Walker -// Portions Copyright (C) Microsoft Corporation. All Rights Reserved. -// See src/setup/License.rtf for complete licensing and attribution information. -///////////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////////// -// Copied for Paint.NET PCX Plugin -// Copyright (C) Joshua Bell -///////////////////////////////////////////////////////////////////////////////// - -// Based on: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/colorquant.asp - -//Bizhawk says: adapted from https://github.com/inexorabletash/PcxFileType/blob/master/Quantize - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Quantize using an Octree - /// - unsafe class OctreeQuantizer : Quantizer - { - /// - /// Stores the tree - /// - private Octree _octree; - - /// - /// Maximum allowed color depth - /// - private int _maxColors; - - /// - /// Construct the octree quantizer - /// - /// - /// The Octree quantizer is a two pass algorithm. The initial pass sets up the octree, - /// the second pass quantizes a color based on the nodes in the tree - /// - /// The maximum number of colors to return - /// The number of significant bits - public OctreeQuantizer(int maxColors, int maxColorBits) - : base(false) - { - if (maxColors > 255) - throw new ArgumentOutOfRangeException(nameof(maxColors), maxColors, "The number of colors should be less than 256"); - - if ((maxColorBits < 1) |(maxColorBits > 8)) - throw new ArgumentOutOfRangeException(nameof(maxColorBits), maxColorBits, "This should be between 1 and 8"); - - _octree = new Octree(maxColorBits); - _maxColors = maxColors; - } - - /// - /// Process the pixel in the first pass of the algorithm - /// - /// The pixel to quantize - /// - /// This function need only be overridden if your quantize algorithm needs two passes, - /// such as an Octree quantizer. - /// - protected override void InitialQuantizePixel(int pixel) - { - _octree.AddColor(pixel); - } - - /// - /// Override this to process the pixel in the second pass of the algorithm - /// - /// The pixel to quantize - /// The quantized value - protected override byte QuantizePixel(int pixel) - { - byte paletteIndex = (byte)_maxColors; // The color at [_maxColors] is set to transparent - - // Get the palette index if this non-transparent - int a = (pixel>>24)&0xFF; - -#if HANDLE_TRANSPARENCY - if (a > 0) -#endif - { - paletteIndex = (byte)_octree.GetPaletteIndex(pixel); - } - - return paletteIndex; - } - - /// - /// Retrieve the palette for the quantized image - /// - /// Any old palette, this is overrwritten - /// The new color palette - protected override ColorPalette GetPalette(ColorPalette original) - { - // First off convert the octree to _maxColors colors - List palette = _octree.Palletize(_maxColors - 1); - - // Then convert the palette based on those colors - for (int index = 0; index < palette.Count; index++) - { - original.Entries[index] = palette[index]; - } - -#if ORIGINAL_CODE - for (int i = palette.Count; i < original.Entries.Length; ++i) - { - original.Entries[i] = Color.FromArgb(255, 0, 0, 0); - } - - // Add the transparent color - original.Entries[_maxColors] = Color.FromArgb(0, 0, 0, 0); -#else // PCX Plugin - // For PCX: Pad with transparency - for (int i = palette.Count; i < original.Entries.Length; ++i) - original.Entries[i] = Color.Transparent; -#endif - return original; - } - - /// - /// Class which does the actual quantization - /// - private class Octree - { - /// - /// Construct the octree - /// - /// The maximum number of significant bits in the image - public Octree(int maxColorBits) - { - _maxColorBits = maxColorBits; - _leafCount = 0; - _reducibleNodes = new OctreeNode[9]; - _root = new OctreeNode(0, _maxColorBits, this); - _previousColor = 0; - _previousNode = null; - } - - /// - /// Add a given color value to the octree - /// - /// - public void AddColor(int pixel) - { - // Check if this request is for the same color as the last - if (_previousColor == pixel) - { - // If so, check if I have a previous node setup. This will only ocurr if the first color in the image - // happens to be black, with an alpha component of zero. - if (null == _previousNode) - { - _previousColor = pixel; - _root.AddColor(pixel, _maxColorBits, 0, this); - } - else - { - // Just update the previous node - _previousNode.Increment(pixel); - } - } - else - { - _previousColor = pixel; - _root.AddColor(pixel, _maxColorBits, 0, this); - } - } - - /// - /// Reduce the depth of the tree - /// - public void Reduce() - { - int index; - - // Find the deepest level containing at least one reducible node - for (index = _maxColorBits - 1; (index > 0) && (null == _reducibleNodes[index]); index--) - { - // intentionally blank - } - - // Reduce the node most recently added to the list at level 'index' - OctreeNode node = _reducibleNodes[index]; - _reducibleNodes[index] = node.NextReducible; - - // Decrement the leaf count after reducing the node - _leafCount -= node.Reduce(); - - // And just in case I've reduced the last color to be added, and the next color to - // be added is the same, invalidate the previousNode... - _previousNode = null; - } - - /// - /// Get/Set the number of leaves in the tree - /// - public int Leaves - { - get - { - return _leafCount; - } - - set - { - _leafCount = value; - } - } - - /// - /// Return the array of reducible nodes - /// - protected OctreeNode[] ReducibleNodes - { - get - { - return _reducibleNodes; - } - } - - /// - /// Keep track of the previous node that was quantized - /// - /// The node last quantized - protected void TrackPrevious(OctreeNode node) - { - _previousNode = node; - } - - private Color[] _palette; - private PaletteTable paletteTable; - - /// - /// Convert the nodes in the octree to a palette with a maximum of colorCount colors - /// - /// The maximum number of colors - /// A list with the palettized colors - public List Palletize(int colorCount) - { - while (Leaves > colorCount) - { - Reduce(); - } - - // Now palettize the nodes - List palette = new List(Leaves); - int paletteIndex = 0; - - _root.ConstructPalette(palette, ref paletteIndex); - - // And return the palette - this._palette = palette.ToArray(); - this.paletteTable = null; - - return palette; - } - - /// - /// Get the palette index for the passed color - /// - /// - /// - public int GetPaletteIndex(int pixel) - { - int ret = -1; - - ret = _root.GetPaletteIndex(pixel, 0); - - if (ret < 0) - { - if (this.paletteTable == null) - { - this.paletteTable = new PaletteTable(this._palette); - } - - ret = this.paletteTable.FindClosestPaletteIndex(Color.FromArgb(pixel)); - } - - return ret; - } - - /// - /// Mask used when getting the appropriate pixels for a given node - /// - private static int[] mask = new int[8] { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; - - /// - /// The root of the octree - /// - private OctreeNode _root; - - /// - /// Number of leaves in the tree - /// - private int _leafCount; - - /// - /// Array of reducible nodes - /// - private OctreeNode[] _reducibleNodes; - - /// - /// Maximum number of significant bits in the image - /// - private int _maxColorBits; - - /// - /// Store the last node quantized - /// - private OctreeNode _previousNode; - - /// - /// Cache the previous color quantized - /// - private int _previousColor; - - /// - /// Class which encapsulates each node in the tree - /// - protected class OctreeNode - { - /// - /// Construct the node - /// - /// The level in the tree = 0 - 7 - /// The number of significant color bits in the image - /// The tree to which this node belongs - public OctreeNode(int level, int colorBits, Octree octree) - { - // Construct the new node - _leaf = (level == colorBits); - - _red = 0; - _green = 0; - _blue = 0; - _pixelCount = 0; - - // If a leaf, increment the leaf count - if (_leaf) - { - octree.Leaves++; - _nextReducible = null; - _children = null; - } - else - { - // Otherwise add this to the reducible nodes - _nextReducible = octree.ReducibleNodes[level]; - octree.ReducibleNodes[level] = this; - _children = new OctreeNode[8]; - } - } - - /// - /// Add a color into the tree - /// - /// The color - /// The number of significant color bits - /// The level in the tree - /// The tree to which this node belongs - public void AddColor(int pixel, int colorBits, int level, Octree octree) - { - // Update the color information if this is a leaf - if (_leaf) - { - Increment(pixel); - - // Setup the previous node - octree.TrackPrevious(this); - } - else - { - // Go to the next level down in the tree - int shift = 7 - level; - int b = pixel & 0xFF; - int g = (pixel >> 8) & 0xFF; - int r = (pixel >> 16) & 0xFF; - int index = ((r & mask[level]) >> (shift - 2)) | - ((g & mask[level]) >> (shift - 1)) | - ((b & mask[level]) >> (shift)); - - OctreeNode child = _children[index]; - - if (null == child) - { - // Create a new child node & store in the array - child = new OctreeNode(level + 1, colorBits, octree); - _children[index] = child; - } - - // Add the color to the child node - child.AddColor(pixel, colorBits, level + 1, octree); - } - - } - - /// - /// Get/Set the next reducible node - /// - public OctreeNode NextReducible - { - get - { - return _nextReducible; - } - - set - { - _nextReducible = value; - } - } - - /// - /// Return the child nodes - /// - public OctreeNode[] Children - { - get - { - return _children; - } - } - - /// - /// Reduce this node by removing all of its children - /// - /// The number of leaves removed - public int Reduce() - { - int children = 0; - _red = 0; - _green = 0; - _blue = 0; - - // Loop through all children and add their information to this node - for (int index = 0; index < 8; index++) - { - if (null != _children[index]) - { - _red += _children[index]._red; - _green += _children[index]._green; - _blue += _children[index]._blue; - _pixelCount += _children[index]._pixelCount; - ++children; - _children[index] = null; - } - } - - // Now change this to a leaf node - _leaf = true; - - // Return the number of nodes to decrement the leaf count by - return(children - 1); - } - - /// - /// Traverse the tree, building up the color palette - /// - /// The palette - /// The current palette index - public void ConstructPalette(List palette, ref int paletteIndex) - { - if (_leaf) - { - // Consume the next palette index - _paletteIndex = paletteIndex++; - - // And set the color of the palette entry - int r = _red / _pixelCount; - int g = _green / _pixelCount; - int b = _blue / _pixelCount; - - palette.Add(Color.FromArgb(r, g, b)); - } - else - { - // Loop through children looking for leaves - for (int index = 0; index < 8; index++) - { - if (null != _children[index]) - { - _children[index].ConstructPalette(palette, ref paletteIndex); - } - } - } - } - - /// - /// Return the palette index for the passed color - /// - public int GetPaletteIndex(int pixel, int level) - { - int paletteIndex = _paletteIndex; - - if (!_leaf) - { - int shift = 7 - level; - int b = pixel & 0xFF; - int g = (pixel >> 8) & 0xFF; - int r = (pixel >> 16) & 0xFF; - int index = ((r & mask[level]) >> (shift - 2)) | - ((g & mask[level]) >> (shift - 1)) | - ((b & mask[level]) >> (shift)); - - if (null != _children[index]) - { - paletteIndex = _children[index].GetPaletteIndex(pixel, level + 1); - } - else - { - paletteIndex = -1; - } - } - - return paletteIndex; - } - - /// - /// Increment the pixel count and add to the color information - /// - public void Increment(int pixel) - { - ++_pixelCount; - int b = pixel&0xFF; - int g = (pixel>>8) & 0xFF; - int r = (pixel >> 16) & 0xFF; - _red += r; - _green += g; - _blue += b; - } - - /// - /// Flag indicating that this is a leaf node - /// - private bool _leaf; - - /// - /// Number of pixels in this node - /// - private int _pixelCount; - - /// - /// Red component - /// - private int _red; - - /// - /// Green Component - /// - private int _green; - - /// - /// Blue component - /// - private int _blue; - - /// - /// Pointers to any child nodes - /// - private OctreeNode[] _children; - - /// - /// Pointer to next reducible node - /// - private OctreeNode _nextReducible; - - /// - /// The index of this node in the palette - /// - private int _paletteIndex; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/Quantize/PaletteTable.cs b/BizHawk.Client.EmuHawk/AVOut/Quantize/PaletteTable.cs deleted file mode 100644 index 367e73319f..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/Quantize/PaletteTable.cs +++ /dev/null @@ -1,77 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// Paint.NET -// Copyright (C) Rick Brewster, Chris Crosetto, Dennis Dietrich, Tom Jackson, -// Michael Kelsey, Brandon Ortiz, Craig Taylor, Chris Trevino, -// and Luke Walker -// Portions Copyright (C) Microsoft Corporation. All Rights Reserved. -// See src/setup/License.rtf for complete licensing and attribution information. -///////////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////////// -// Copied for Paint.NET PCX Plugin -// Copyright (C) Joshua Bell -///////////////////////////////////////////////////////////////////////////////// - -//Bizhawk says: adapted from https://github.com/inexorabletash/PcxFileType/blob/master/Quantize - -using System.Drawing; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class PaletteTable - { - private Color[] palette; - - public Color this[int index] - { - get - { - return this.palette[index]; - } - - set - { - this.palette[index] = value; - } - } - - private int GetDistanceSquared(Color a, Color b) - { - int dsq = 0; // delta squared - int v; - - v = a.B - b.B; - dsq += v * v; - v = a.G - b.G; - dsq += v * v; - v = a.R - b.R; - dsq += v * v; - - return dsq; - } - - public int FindClosestPaletteIndex(Color pixel) - { - int dsqBest = int.MaxValue; - int ret = 0; - - for (int i = 0; i < this.palette.Length; ++i) - { - int dsq = GetDistanceSquared(this.palette[i], pixel); - - if (dsq < dsqBest) - { - dsqBest = dsq; - ret = i; - } - } - - return ret; - } - - public PaletteTable(Color[] palette) - { - this.palette = (Color[])palette.Clone(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/Quantize/Quantizer.cs b/BizHawk.Client.EmuHawk/AVOut/Quantize/Quantizer.cs deleted file mode 100644 index eea04b96fe..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/Quantize/Quantizer.cs +++ /dev/null @@ -1,372 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// Paint.NET -// Copyright (C) Rick Brewster, Chris Crosetto, Dennis Dietrich, Tom Jackson, -// Michael Kelsey, Brandon Ortiz, Craig Taylor, Chris Trevino, -// and Luke Walker -// Portions Copyright (C) Microsoft Corporation. All Rights Reserved. -// See src/setup/License.rtf for complete licensing and attribution information. -///////////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////////// -// Copied for Paint.NET PCX Plugin -// Copyright (C) Joshua Bell -///////////////////////////////////////////////////////////////////////////////// - -// Based on: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/colorquant.asp - -//Bizhawk says: adapted from https://github.com/inexorabletash/PcxFileType/blob/master/Quantize - -using System; -using System.Drawing; -using System.Drawing.Imaging; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Summary description for Class1. - /// - internal unsafe abstract class Quantizer - { - /// - /// Flag used to indicate whether a single pass or two passes are needed for quantization. - /// - private bool _singlePass; - - protected bool highquality; - public bool HighQuality - { - get - { - return highquality; - } - - set - { - highquality = value; - } - } - - protected int ditherLevel; - public int DitherLevel - { - get - { - return this.ditherLevel; - } - - set - { - this.ditherLevel = value; - } - } - - /// - /// Construct the quantizer - /// - /// If true, the quantization only needs to loop through the source pixels once - /// - /// If you construct this class with a true value for singlePass, then the code will, when quantizing your image, - /// only call the 'QuantizeImage' function. If two passes are required, the code will call 'InitialQuantizeImage' - /// and then 'QuantizeImage'. - /// - public Quantizer(bool singlePass) - { - _singlePass = singlePass; - } - - /// - /// Quantize an image and return the resulting output bitmap - /// - /// The image to quantize - /// A quantized version of the image - public Bitmap Quantize(Image source) - { - // Get the size of the source image - int height = source.Height; - int width = source.Width; - - // And construct a rectangle from these dimensions - Rectangle bounds = new Rectangle(0, 0, width, height); - - // First off take a 32bpp copy of the image - Bitmap copy; - - if (source is Bitmap && source.PixelFormat == PixelFormat.Format32bppArgb) - { - copy = (Bitmap)source; - } - else - { - copy = new Bitmap(width, height, PixelFormat.Format32bppArgb); - - // Now lock the bitmap into memory - using (Graphics g = Graphics.FromImage(copy)) - { - g.PageUnit = GraphicsUnit.Pixel; - - // Draw the source image onto the copy bitmap, - // which will effect a widening as appropriate. - g.DrawImage(source, 0, 0, bounds.Width, bounds.Height); - } - } - - // And construct an 8bpp version - Bitmap output = new Bitmap(width, height, PixelFormat.Format8bppIndexed); - - // Define a pointer to the bitmap data - BitmapData sourceData = null; - - try - { - // Get the source image bits and lock into memory - sourceData = copy.LockBits(bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - - // Call the FirstPass function if not a single pass algorithm. - // For something like an octree quantizer, this will run through - // all image pixels, build a data structure, and create a palette. - if (!_singlePass) - { - FirstPass(sourceData, width, height); - } - - // Then set the color palette on the output bitmap. I'm passing in the current palette - // as there's no way to construct a new, empty palette. - output.Palette = this.GetPalette(output.Palette); - - // Then call the second pass which actually does the conversion - SecondPass(sourceData, output, width, height, bounds); - } - - finally - { - // Ensure that the bits are unlocked - copy.UnlockBits(sourceData); - } - - if (copy != source) - { - copy.Dispose(); - } - - // Last but not least, return the output bitmap - return output; - } - - /// - /// Execute the first pass through the pixels in the image - /// - /// The source data - /// The width in pixels of the image - /// The height in pixels of the image - protected virtual void FirstPass(BitmapData sourceData, int width, int height) - { - // Define the source data pointers. The source row is a byte to - // keep addition of the stride value easier (as this is in bytes) - byte* pSourceRow = (byte*)sourceData.Scan0.ToPointer(); - int* pSourcePixel; - - // Loop through each row - for (int row = 0; row < height; row++) - { - // Set the source pixel to the first pixel in this row - pSourcePixel = (Int32*)pSourceRow; - - // And loop through each column - for (int col = 0; col < width; col++, pSourcePixel++) - { - InitialQuantizePixel(*pSourcePixel); - } - - // Add the stride to the source row - pSourceRow += sourceData.Stride; - - } - } - - int ClampToByte(int val) - { - if (val < 0) return 0; - else if (val > 255) return 255; - else return val; - } - - /// - /// Execute a second pass through the bitmap - /// - /// The source bitmap, locked into memory - /// The output bitmap - /// The width in pixels of the image - /// The height in pixels of the image - /// The bounding rectangle - protected virtual void SecondPass(BitmapData sourceData, Bitmap output, int width, int height, Rectangle bounds) - { - BitmapData outputData = null; - Color[] pallete = output.Palette.Entries; - int weight = ditherLevel; - - try - { - // Lock the output bitmap into memory - outputData = output.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed); - - // Define the source data pointers. The source row is a byte to - // keep addition of the stride value easier (as this is in bytes) - byte* pSourceRow = (byte *)sourceData.Scan0.ToPointer(); - Int32* pSourcePixel = (Int32 *)pSourceRow; - - // Now define the destination data pointers - byte* pDestinationRow = (byte *)outputData.Scan0.ToPointer(); - byte* pDestinationPixel = pDestinationRow; - - int[] errorThisRowR = new int[width + 1]; - int[] errorThisRowG = new int[width + 1]; - int[] errorThisRowB = new int[width + 1]; - - for (int row = 0; row < height; row++) - { - int[] errorNextRowR = new int[width + 1]; - int[] errorNextRowG = new int[width + 1]; - int[] errorNextRowB = new int[width + 1]; - - int ptrInc; - - if ((row & 1) == 0) - { - pSourcePixel = (Int32*)pSourceRow; - pDestinationPixel = pDestinationRow; - ptrInc = +1; - } - else - { - pSourcePixel = (Int32*)pSourceRow + width - 1; - pDestinationPixel = pDestinationRow + width - 1; - ptrInc = -1; - } - - // Loop through each pixel on this scan line - for (int col = 0; col < width; ++col) - { - // Quantize the pixel - int srcPixel = *pSourcePixel; - - int srcR = srcPixel & 0xFF; //not - int srcG = (srcPixel>>8) & 0xFF; //a - int srcB = (srcPixel>>16) & 0xFF; //mistake - int srcA = (srcPixel >> 24) & 0xFF; - - int targetB = ClampToByte(srcB - ((errorThisRowB[col] * weight) / 8)); - int targetG = ClampToByte(srcG - ((errorThisRowG[col] * weight) / 8)); - int targetR = ClampToByte(srcR - ((errorThisRowR[col] * weight) / 8)); - int targetA = srcA; - - int target = (targetA<<24)|(targetB<<16)|(targetG<<8)|targetR; - - byte pixelValue = QuantizePixel(target); - *pDestinationPixel = pixelValue; - - int actual = pallete[pixelValue].ToArgb(); - - int actualR = actual & 0xFF; - int actualG = (actual >> 8) & 0xFF; - int actualB = (actual >> 16) & 0xFF; - int errorR = actualR - targetR; - int errorG = actualG - targetG; - int errorB = actualB - targetB; - - // Floyd-Steinberg Error Diffusion: - // a) 7/16 error goes to x+1 - // b) 5/16 error goes to y+1 - // c) 3/16 error goes to x-1,y+1 - // d) 1/16 error goes to x+1,y+1 - - const int a = 7; - const int b = 5; - const int c = 3; - - int errorRa = (errorR * a) / 16; - int errorRb = (errorR * b) / 16; - int errorRc = (errorR * c) / 16; - int errorRd = errorR - errorRa - errorRb - errorRc; - - int errorGa = (errorG * a) / 16; - int errorGb = (errorG * b) / 16; - int errorGc = (errorG * c) / 16; - int errorGd = errorG - errorGa - errorGb - errorGc; - - int errorBa = (errorB * a) / 16; - int errorBb = (errorB * b) / 16; - int errorBc = (errorB * c) / 16; - int errorBd = errorB - errorBa - errorBb - errorBc; - - errorThisRowR[col + 1] += errorRa; - errorThisRowG[col + 1] += errorGa; - errorThisRowB[col + 1] += errorBa; - - errorNextRowR[width - col] += errorRb; - errorNextRowG[width - col] += errorGb; - errorNextRowB[width - col] += errorBb; - - if (col != 0) - { - errorNextRowR[width - (col - 1)] += errorRc; - errorNextRowG[width - (col - 1)] += errorGc; - errorNextRowB[width - (col - 1)] += errorBc; - } - - errorNextRowR[width - (col + 1)] += errorRd; - errorNextRowG[width - (col + 1)] += errorGd; - errorNextRowB[width - (col + 1)] += errorBd; - - unchecked - { - pSourcePixel += ptrInc; - pDestinationPixel += ptrInc; - } - } - - // Add the stride to the source row - pSourceRow += sourceData.Stride; - - // And to the destination row - pDestinationRow += outputData.Stride; - - errorThisRowB = errorNextRowB; - errorThisRowG = errorNextRowG; - errorThisRowR = errorNextRowR; - } - } - - finally - { - // Ensure that I unlock the output bits - output.UnlockBits(outputData); - } - } - - /// - /// Override this to process the pixel in the first pass of the algorithm - /// - /// The pixel to quantize - /// - /// This function need only be overridden if your quantize algorithm needs two passes, - /// such as an Octree quantizer. - /// - protected virtual void InitialQuantizePixel(int pixel) - { - } - - /// - /// Override this to process the pixel in the second pass of the algorithm - /// - /// The pixel to quantize - /// The quantized value - protected abstract byte QuantizePixel(int pixel); - - /// - /// Retrieve the palette for the quantized image - /// - /// Any old palette, this is overrwritten - /// The new color palette - protected abstract ColorPalette GetPalette(ColorPalette original); - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/SynclessRecorder.cs b/BizHawk.Client.EmuHawk/AVOut/SynclessRecorder.cs deleted file mode 100644 index 04e731333d..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/SynclessRecorder.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; -using BizHawk.Bizware.BizwareGL; - -namespace BizHawk.Client.EmuHawk -{ - [VideoWriter("syncless", "Syncless Recording", "Writes each frame to a directory as a PNG and WAV pair, identified by frame number. The results can be exported into one video file.")] - public class SynclessRecorder : IVideoWriter - { - public void Dispose() - { - } - - public void SetVideoCodecToken(IDisposable token) - { - } - - public void SetDefaultVideoCodecToken() - { - } - - public void SetFrame(int frame) - { - mCurrFrame = frame; - } - - private int mCurrFrame; - private string mBaseDirectory, mFramesDirectory; - private string mProjectFile; - - public void OpenFile(string projFile) - { - mProjectFile = projFile; - mBaseDirectory = Path.GetDirectoryName(mProjectFile); - string basename = Path.GetFileNameWithoutExtension(projFile); - string framesDirFragment = basename + "_frames"; - mFramesDirectory = Path.Combine(mBaseDirectory, framesDirFragment); - StringBuilder sb = new StringBuilder(); - sb.AppendLine("version=1"); - sb.AppendLine("framesdir=" + framesDirFragment); - File.WriteAllText(mProjectFile, sb.ToString()); - } - - public void CloseFile() - { - } - - public void AddFrame(IVideoProvider source) - { - using (var bb = new BitmapBuffer(source.BufferWidth, source.BufferHeight, source.GetVideoBuffer())) - { - string subpath = GetAndCreatePathForFrameNum(mCurrFrame); - string path = subpath + ".png"; - bb.ToSysdrawingBitmap().Save(path, System.Drawing.Imaging.ImageFormat.Png); - } - } - - public void AddSamples(short[] samples) - { - string subpath = GetAndCreatePathForFrameNum(mCurrFrame); - string path = subpath + ".wav"; - WavWriterV wwv = new WavWriterV(); - wwv.SetAudioParameters(paramSampleRate, paramChannels, paramBits); - wwv.OpenFile(path); - wwv.AddSamples(samples); - wwv.CloseFile(); - wwv.Dispose(); - } - - public bool UsesAudio => true; - - public bool UsesVideo => true; - - private class DummyDisposable : IDisposable - { - public void Dispose() - { - } - } - - public IDisposable AcquireVideoCodecToken(IWin32Window hwnd) - { - return new DummyDisposable(); - } - - public void SetMovieParameters(int fpsnum, int fpsden) - { - //should probably todo in here - } - - public void SetVideoParameters(int width, int height) - { - // may want to todo - } - - private int paramSampleRate, paramChannels, paramBits; - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - paramSampleRate = sampleRate; - paramChannels = channels; - paramBits = bits; - } - - public void SetMetaData(string gameName, string authors, UInt64 lengthMS, UInt64 rerecords) - { - // not needed - } - - public string DesiredExtension() - { - return "syncless.txt"; - } - - /// - /// splits the string into chunks of length s - /// - private static List StringChunkSplit(string s, int len) - { - if (len == 0) - { - throw new ArgumentException("Invalid len", nameof(len)); - } - - int numChunks = (s.Length + len - 1) / len; - var output = new List(numChunks); - for (int i = 0, j = 0; i < numChunks; i++, j += len) - { - int todo = len; - int remain = s.Length - j; - if (remain < todo) - { - todo = remain; - } - - output.Add(s.Substring(j, todo)); - } - - return output; - } - - private string GetAndCreatePathForFrameNum(int index) - { - string subpath = GetPathFragmentForFrameNum(index); - string path = mFramesDirectory; - path = Path.Combine(path, subpath); - string fpath = path + ".nothing"; - Directory.CreateDirectory(Path.GetDirectoryName(fpath)); - return path; - } - - public static string GetPathFragmentForFrameNum(int index) - { - var chunks = StringChunkSplit(index.ToString(), 2); - string subpath = string.Join("/", chunks); - return subpath; - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/SynclessRecordingTools.cs b/BizHawk.Client.EmuHawk/AVOut/SynclessRecordingTools.cs deleted file mode 100644 index 1afbc35bf4..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/SynclessRecordingTools.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class SynclessRecordingTools : Form - { - public SynclessRecordingTools() - { - InitializeComponent(); - } - - private void GetPaths(int index, out string png, out string wav) - { - string subpath = SynclessRecorder.GetPathFragmentForFrameNum(index); - string path = mFramesDirectory; - path = Path.Combine(path, subpath); - png = path + ".png"; - wav = path + ".wav"; - } - - private string mSynclessConfigFile; - private string mFramesDirectory; - - public void Run() - { - var ofd = new OpenFileDialog - { - FileName = PathManager.FilesystemSafeName(Global.Game) + ".syncless.txt", - InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.AvPathFragment, null) - }; - - if (ofd.ShowDialog() == DialogResult.Cancel) - { - return; - } - - mSynclessConfigFile = ofd.FileName; - - //---- this is pretty crappy: - var lines = File.ReadAllLines(mSynclessConfigFile); - - string framesdir = ""; - foreach (var line in lines) - { - int idx = line.IndexOf('='); - string key = line.Substring(0, idx); - string value = line.Substring(idx + 1, line.Length - (idx + 1)); - if (key == "framesdir") - { - framesdir = value; - } - } - - mFramesDirectory = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(mSynclessConfigFile)), framesdir); - - // scan frames directory - int frame = 1; // hacky! skip frame 0, because we have a problem with dumping that frame somehow - for (;;) - { - string wav, png; - GetPaths(frame, out png, out wav); - if (!File.Exists(png) || !File.Exists(wav)) - { - break; - } - - mFrameInfos.Add(new FrameInfo - { - pngPath = png, - wavPath = wav - }); - - frame++; - } - - ShowDialog(); - } - - private readonly List mFrameInfos = new List(); - - struct FrameInfo - { - public string wavPath, pngPath; - } - - - private void btnExport_Click(object sender, EventArgs e) - { - if (mFrameInfos.Count == 0) - { - return; - } - - int width, height; - using(var bmp = new Bitmap(mFrameInfos[0].pngPath)) - { - width = bmp.Width; - height = bmp.Height; - } - - var sfd = new SaveFileDialog - { - FileName = Path.ChangeExtension(mSynclessConfigFile, ".avi") - }; - sfd.InitialDirectory = Path.GetDirectoryName(sfd.FileName); - if (sfd.ShowDialog() == DialogResult.Cancel) - { - return; - } - - using (var avw = new AviWriter()) - { - avw.SetAudioParameters(44100, 2, 16); // hacky - avw.SetMovieParameters(60, 1); // hacky - avw.SetVideoParameters(width, height); - var token = avw.AcquireVideoCodecToken(this); - avw.SetVideoCodecToken(token); - avw.OpenFile(sfd.FileName); - foreach (var fi in mFrameInfos) - { - using (var bb = new BitmapBuffer(fi.pngPath, new BitmapLoadOptions())) - { - var bbvp = new BitmapBufferVideoProvider(bb); - avw.AddFrame(bbvp); - } - - // offset = 44 dec - var wavBytes = File.ReadAllBytes(fi.wavPath); - var ms = new MemoryStream(wavBytes) { Position = 44 }; - var br = new BinaryReader(ms); - var sampledata = new List(); - while (br.BaseStream.Position != br.BaseStream.Length) - { - sampledata.Add(br.ReadInt16()); - } - - avw.AddSamples(sampledata.ToArray()); - } - - avw.CloseFile(); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/VideoWriterChooserForm.cs b/BizHawk.Client.EmuHawk/AVOut/VideoWriterChooserForm.cs deleted file mode 100644 index af71887eaa..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/VideoWriterChooserForm.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// implements a simple dialog which chooses an IVideoWriter to record with - /// - public partial class VideoWriterChooserForm : Form - { - private VideoWriterChooserForm() - { - InitializeComponent(); - - CaptureWidth = Global.Emulator.CoreComm.NominalWidth; - CaptureHeight = Global.Emulator.CoreComm.NominalHeight; - - if (Global.Config.AVI_CaptureOSD) - { - using (var bb = GlobalWin.MainForm.CaptureOSD()) - { - CaptureWidth = bb.Width; - CaptureHeight = bb.Height; - } - } - - lblSize.Text = $"Size:\r\n{CaptureWidth}x{CaptureHeight}"; - - if (CaptureWidth % 4 != 0 || CaptureHeight % 4 != 0) - { - lblResolutionWarning.Visible = true; - } - else - { - lblResolutionWarning.Visible = false; - } - } - - private int CaptureWidth, CaptureHeight; - - /// - /// chose an IVideoWriter - /// - /// list of IVideoWriters to choose from - /// parent window - /// user choice, or null on Cancel\Close\invalid - public static IVideoWriter DoVideoWriterChoserDlg(IEnumerable list, IWin32Window owner, out int resizew, out int resizeh, out bool pad, ref bool audiosync) - { - VideoWriterChooserForm dlg = new VideoWriterChooserForm - { - labelDescriptionBody = { Text = "" } - }; - - int idx = 0; - int idx_select = -1; - dlg.listBox1.BeginUpdate(); - foreach (var vw in list) - { - dlg.listBox1.Items.Add(vw); - if (vw.Attribs.ShortName == Global.Config.VideoWriter) - { - idx_select = idx; - } - - idx++; - } - - dlg.listBox1.SelectedIndex = idx_select; - dlg.listBox1.EndUpdate(); - - foreach (Control c in dlg.panelSizeSelect.Controls) - { - c.Enabled = false; - } - - dlg.checkBoxASync.Checked = audiosync; - DialogResult result = dlg.ShowDialog(owner); - - IVideoWriter ret; - - if (result == DialogResult.OK && dlg.listBox1.SelectedIndex != -1) - { - var vwi = (VideoWriterInfo)dlg.listBox1.SelectedItem; - ret = vwi.Create(); - Global.Config.VideoWriter = vwi.Attribs.ShortName; - } - else - { - ret = null; - } - - if (ret != null && dlg.checkBoxResize.Checked) - { - resizew = dlg.numericTextBoxW.IntValue; - resizeh = dlg.numericTextBoxH.IntValue; - } - else - { - resizew = -1; - resizeh = -1; - } - - pad = dlg.checkBoxPad.Checked; - audiosync = dlg.checkBoxASync.Checked; - - dlg.Dispose(); - return ret; - } - - private void listBox1_SelectedIndexChanged(object sender, EventArgs e) - { - labelDescriptionBody.Text = listBox1.SelectedIndex != -1 - ? ((VideoWriterInfo)listBox1.SelectedItem).Attribs.Description - : ""; - } - - private void checkBoxResize_CheckedChanged(object sender, EventArgs e) - { - foreach (Control c in panelSizeSelect.Controls) - { - c.Enabled = checkBoxResize.Checked; - } - } - - private void buttonAuto_Click(object sender, EventArgs e) - { - numericTextBoxW.Text = CaptureWidth.ToString(); - numericTextBoxH.Text = CaptureHeight.ToString(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (checkBoxResize.Checked) - { - try - { - if (numericTextBoxW.IntValue < 1 || numericTextBoxH.IntValue < 1) - { - MessageBox.Show(this, "Size must be positive!"); - DialogResult = DialogResult.None; - } - } - catch (FormatException) - { - MessageBox.Show(this, "Size must be numeric!"); - DialogResult = DialogResult.None; - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/AVOut/WavWriter.cs b/BizHawk.Client.EmuHawk/AVOut/WavWriter.cs deleted file mode 100644 index 9fefade2e7..0000000000 --- a/BizHawk.Client.EmuHawk/AVOut/WavWriter.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -using BizHawk.Common.IOExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// writes MS standard riff files containing uncompressed PCM wav data - /// supports 16 bit signed data only - /// - public class WavWriter : IDisposable - { - /// - /// underlying file being written to - /// - BinaryWriter file; - - /// - /// sequence of files to write to (split on 32 bit limit) - /// - IEnumerator filechain; - - /// - /// samplerate in HZ - /// - int samplerate; - - /// - /// number of audio channels - /// - int numchannels; - - /// - /// number of bytes of PCM data written to current file - /// - UInt64 numbytes; - - /// - /// number of bytes after which a file split should be made - /// - const UInt64 splitpoint = 2 * 1000 * 1000 * 1000; - - /// - /// write riff headers to current file - /// - private void writeheaders() - { - file.Write(Encoding.ASCII.GetBytes("RIFF")); // ChunkID - file.Write((uint)0); // ChunkSize - file.Write(Encoding.ASCII.GetBytes("WAVE")); // Format - - file.Write(Encoding.ASCII.GetBytes("fmt ")); // SubchunkID - file.Write((uint)16); // SubchunkSize - file.Write((ushort)1); // AudioFormat (PCM) - file.Write((ushort)numchannels); // NumChannels - file.Write((uint)samplerate); // SampleRate - file.Write((uint)(samplerate * numchannels * 2)); // ByteRate - file.Write((ushort)(numchannels * 2)); // BlockAlign - file.Write((ushort)16); // BitsPerSample - - file.Write(Encoding.ASCII.GetBytes("data")); // SubchunkID - file.Write((uint)0); // SubchunkSize - } - - /// - /// seek back to beginning of file and fix header sizes (if possible) - /// - private void finalizeheaders() - { - if (numbytes + 36 >= 0x100000000) - // passed 4G limit, nothing to be done - return; - try - { - file.Seek(4, SeekOrigin.Begin); - file.Write((uint)(36 + numbytes)); - file.Seek(40, SeekOrigin.Begin); - file.Write((uint)(numbytes)); - } - catch (NotSupportedException) - { // unseekable; oh well - } - } - - /// - /// close current underlying stream - /// - private void closecurrent() - { - if (file != null) - { - finalizeheaders(); - file.Close(); - file.Dispose(); - } - - file = null; - } - - /// - /// open a new underlying stream - /// - /// - private void opencurrent(Stream next) - { - file = new BinaryWriter(next, Encoding.ASCII); - numbytes = 0; - writeheaders(); - } - - /// - /// write samples to file - /// - /// samples to write; should contain one for each channel - public void writesamples(short[] samples) - { - file.Write(samples); - numbytes += (ulong)(samples.Length * sizeof(short)); - - // try splitting if we can - if (numbytes >= splitpoint && filechain != null) - { - if (!filechain.MoveNext()) - { // out of files, just keep on writing to this one - filechain = null; - } - else - { - Stream next = filechain.Current; - closecurrent(); - opencurrent(next); - } - } - } - - public void Dispose() - { - Close(); - } - - /// - /// finishes writing - /// - public void Close() - { - closecurrent(); - } - - /// - /// checks sampling rate, number of channels for validity - /// - private void checkargs() - { - if (samplerate < 1 || numchannels < 1) - { - throw new ArgumentException("Bad samplerate/numchannels"); - } - } - - /// - /// initializes WavWriter with a single output stream - /// no attempt is made to split - /// - /// WavWriter now owns this stream - /// sampling rate in HZ - /// number of audio channels - public WavWriter(Stream s, int samplerate, int numchannels) - { - this.samplerate = samplerate; - this.numchannels = numchannels; - filechain = null; - checkargs(); - opencurrent(s); - } - - /// - /// initializes WavWriter with an enumeration of Streams - /// one is consumed every time 2G is hit - /// if the enumerator runs out before the audio stream does, the last file could be >2G - /// - /// WavWriter now owns any of these streams that it enumerates - /// sampling rate in HZ - /// number of audio channels - public WavWriter(IEnumerator ss, int samplerate, int numchannels) - { - this.samplerate = samplerate; - this.numchannels = numchannels; - checkargs(); - filechain = ss; - - // advance to first - if (!filechain.MoveNext()) - { - throw new ArgumentException("Iterator was empty!"); - } - - opencurrent(ss.Current); - } - } - - /// - /// slim wrapper on WavWriter that implements IVideoWriter (discards all video!) - /// - [VideoWriter("wave", "WAV writer", "Writes a series of standard RIFF wav files containing uncompressed audio. Does not write video. Splits every 2G.")] - public class WavWriterV : IVideoWriter - { - public void SetVideoCodecToken(IDisposable token) { } - public void AddFrame(IVideoProvider source) { } - public void SetMovieParameters(int fpsnum, int fpsden) { } - public void SetVideoParameters(int width, int height) { } - public void SetFrame(int frame) { } - - public bool UsesAudio => true; - - public bool UsesVideo => false; - - private class WavWriterVToken : IDisposable - { - public void Dispose() { } - } - - public IDisposable AcquireVideoCodecToken(System.Windows.Forms.IWin32Window hwnd) - { - // don't care - return new WavWriterVToken(); - } - - public void SetAudioParameters(int sampleRate, int channels, int bits) - { - this.sampleRate = sampleRate; - this.channels = channels; - if (bits != 16) - { - throw new ArgumentException("Only support 16bit audio!"); - } - } - - public void SetMetaData(string gameName, string authors, ulong lengthMS, ulong rerecords) - { - // not implemented - } - - public void Dispose() - { - wavwriter?.Dispose(); - } - - private WavWriter wavwriter = null; - private int sampleRate = 0; - private int channels = 0; - - /// - /// create a simple wav stream iterator - /// - private static IEnumerator CreateStreamIterator(string template) - { - string dir = Path.GetDirectoryName(template); - string baseName = Path.GetFileNameWithoutExtension(template); - string ext = Path.GetExtension(template); - yield return new FileStream(template, FileMode.Create); - int counter = 1; - while (true) - { - yield return new FileStream(Path.Combine(dir, baseName) + "_" + counter + ext, FileMode.Create); - counter++; - } - } - - public void OpenFile(string baseName) - { - wavwriter = new WavWriter(CreateStreamIterator(baseName), sampleRate, channels); - } - - public void CloseFile() - { - wavwriter.Close(); - wavwriter.Dispose(); - wavwriter = null; - } - - public void AddSamples(short[] samples) - { - wavwriter.writesamples(samples); - } - - public string DesiredExtension() - { - return "wav"; - } - - public void SetDefaultVideoCodecToken() - { - // don't use codec tokens, so don't care - } - } -} diff --git a/BizHawk.Client.EmuHawk/AboutBox.Designer.cs b/BizHawk.Client.EmuHawk/AboutBox.Designer.cs deleted file mode 100644 index a3a62f6bda..0000000000 --- a/BizHawk.Client.EmuHawk/AboutBox.Designer.cs +++ /dev/null @@ -1,321 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class AboutBox - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.mom2 = new System.Windows.Forms.PictureBox(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.mom1 = new System.Windows.Forms.PictureBox(); - this.pictureBox4 = new System.Windows.Forms.PictureBox(); - this.pictureBox3 = new System.Windows.Forms.PictureBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.CloseBtn = new System.Windows.Forms.Button(); - this.btnBizBox = new System.Windows.Forms.Button(); - this.tbBranch = new System.Windows.Forms.TextBox(); - this.tbCommit = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.pictureBox5 = new BizHawk.Client.EmuHawk.MyViewportPanel(); - this.HR = new BizHawk.Client.EmuHawk.HorizontalLine(); - ((System.ComponentModel.ISupportInitialize)(this.mom2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.mom1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 72F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(0, -3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(490, 108); - this.label1.TabIndex = 1; - this.label1.Text = "BIZHAWK"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(12, 311); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(291, 165); - this.label2.TabIndex = 2; - this.label2.Text = "EMULATES\r\nYͨ̒͂Íͪ͂̒̄ͯͯ͌ͨͯ̽ͨÍÍ̶̷̼̬̟̘̦̼͙Ì̯̦̠̜͙͖̘ͅOͪ͂̊ͭ͑ͮͤ̀̄͌̑ͨͣͩ̿ͫ͂͟ÍÌ¡ÍžÌ̞̗̩͖͖̼̹̖̫ͅÍ̙̖͓̩U̴ͥ̓ͩ̌̎̾ͥͪ̋̾ÍÍ Ì®ÌÍ̜̰̦Rͨ͊̉̾҉̢̫͔̗͓͖̫̫̘̖̰͟\r\nMOM"; - // - // timer1 - // - this.timer1.Enabled = true; - this.timer1.Interval = 50; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label3.Location = new System.Drawing.Point(164, 423); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(311, 39); - this.label3.TabIndex = 3; - this.label3.Text = "COPYRITE 20011"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(338, 223); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(175, 48); - this.label4.TabIndex = 5; - this.label4.Text = "(LEVAR BURTON\r\nCAMEO)"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.Location = new System.Drawing.Point(222, 369); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(104, 55); - this.label5.TabIndex = 8; - this.label5.Text = "--->"; - // - // mom2 - // - this.mom2.Image = ((System.Drawing.Image)(resources.GetObject("mom2.Image"))); - this.mom2.Location = new System.Drawing.Point(372, 274); - this.mom2.Name = "mom2"; - this.mom2.Size = new System.Drawing.Size(115, 150); - this.mom2.TabIndex = 6; - this.mom2.TabStop = false; - // - // pictureBox2 - // - this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); - this.pictureBox2.Location = new System.Drawing.Point(353, 97); - this.pictureBox2.Name = "pictureBox2"; - this.pictureBox2.Size = new System.Drawing.Size(122, 108); - this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pictureBox2.TabIndex = 9; - this.pictureBox2.TabStop = false; - // - // mom1 - // - this.mom1.Image = ((System.Drawing.Image)(resources.GetObject("mom1.Image"))); - this.mom1.Location = new System.Drawing.Point(372, 274); - this.mom1.Name = "mom1"; - this.mom1.Size = new System.Drawing.Size(115, 150); - this.mom1.TabIndex = 7; - this.mom1.TabStop = false; - this.mom1.Visible = false; - // - // pictureBox4 - // - this.pictureBox4.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox4.Image"))); - this.pictureBox4.Location = new System.Drawing.Point(21, 89); - this.pictureBox4.Name = "pictureBox4"; - this.pictureBox4.Size = new System.Drawing.Size(128, 128); - this.pictureBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox4.TabIndex = 16; - this.pictureBox4.TabStop = false; - // - // pictureBox3 - // - this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image"))); - this.pictureBox3.Location = new System.Drawing.Point(21, 89); - this.pictureBox3.Name = "pictureBox3"; - this.pictureBox3.Size = new System.Drawing.Size(128, 128); - this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox3.TabIndex = 17; - this.pictureBox3.TabStop = false; - // - // pictureBox1 - // - this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); - this.pictureBox1.Location = new System.Drawing.Point(155, 108); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(171, 216); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pictureBox1.TabIndex = 0; - this.pictureBox1.TabStop = false; - // - // CloseBtn - // - this.CloseBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CloseBtn.Location = new System.Drawing.Point(424, 462); - this.CloseBtn.Name = "CloseBtn"; - this.CloseBtn.Size = new System.Drawing.Size(75, 23); - this.CloseBtn.TabIndex = 18; - this.CloseBtn.Text = "&Close"; - this.CloseBtn.UseVisualStyleBackColor = true; - this.CloseBtn.Click += new System.EventHandler(this.Close_Click); - this.CloseBtn.MouseEnter += new System.EventHandler(this.Close_MouseEnter); - // - // btnBizBox - // - this.btnBizBox.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnBizBox.Location = new System.Drawing.Point(-4, -3); - this.btnBizBox.Name = "btnBizBox"; - this.btnBizBox.Size = new System.Drawing.Size(75, 23); - this.btnBizBox.TabIndex = 19; - this.btnBizBox.Text = "BizBox"; - this.btnBizBox.UseVisualStyleBackColor = true; - this.btnBizBox.Click += new System.EventHandler(this.btnBizBox_Click); - // - // tbBranch - // - this.tbBranch.Location = new System.Drawing.Point(49, 476); - this.tbBranch.Name = "tbBranch"; - this.tbBranch.ReadOnly = true; - this.tbBranch.Size = new System.Drawing.Size(100, 20); - this.tbBranch.TabIndex = 20; - // - // tbCommit - // - this.tbCommit.Location = new System.Drawing.Point(203, 476); - this.tbCommit.Name = "tbCommit"; - this.tbCommit.ReadOnly = true; - this.tbCommit.Size = new System.Drawing.Size(100, 20); - this.tbCommit.TabIndex = 20; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(2, 479); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(44, 13); - this.label6.TabIndex = 21; - this.label6.Text = "Branch:"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(155, 479); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(44, 13); - this.label7.TabIndex = 22; - this.label7.Text = "Commit:"; - // - // pictureBox5 - // - this.pictureBox5.Enabled = false; - this.pictureBox5.Location = new System.Drawing.Point(71, 223); - this.pictureBox5.Name = "pictureBox5"; - this.pictureBox5.Size = new System.Drawing.Size(376, 48); - this.pictureBox5.TabIndex = 15; - this.pictureBox5.TabStop = false; - // - // HR - // - this.HR.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.HR.Location = new System.Drawing.Point(349, 213); - this.HR.Name = "HR"; - this.HR.Size = new System.Drawing.Size(158, 2); - this.HR.TabIndex = 4; - this.HR.Text = "COPYRITE 2001"; - // - // AboutBox - // - this.AcceptButton = this.CloseBtn; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CloseBtn; - this.ClientSize = new System.Drawing.Size(519, 497); - this.Controls.Add(this.label7); - this.Controls.Add(this.label6); - this.Controls.Add(this.tbCommit); - this.Controls.Add(this.tbBranch); - this.Controls.Add(this.btnBizBox); - this.Controls.Add(this.CloseBtn); - this.Controls.Add(this.pictureBox5); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.pictureBox3); - this.Controls.Add(this.pictureBox4); - this.Controls.Add(this.pictureBox2); - this.Controls.Add(this.label5); - this.Controls.Add(this.mom1); - this.Controls.Add(this.mom2); - this.Controls.Add(this.label4); - this.Controls.Add(this.HR); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.DoubleBuffered = true; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(527, 524); - this.MinimumSize = new System.Drawing.Size(527, 524); - this.Name = "AboutBox"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "EmuHawk Interim Build"; - this.Load += new System.EventHandler(this.AboutBox_Load); - ((System.ComponentModel.ISupportInitialize)(this.mom2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.mom1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.Label label3; - private HorizontalLine HR; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.PictureBox mom2; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.PictureBox mom1; - private MyViewportPanel pictureBox5; - private System.Windows.Forms.PictureBox pictureBox4; - private System.Windows.Forms.PictureBox pictureBox3; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.Button CloseBtn; - private System.Windows.Forms.Button btnBizBox; - private System.Windows.Forms.TextBox tbBranch; - private System.Windows.Forms.TextBox tbCommit; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label7; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/AboutBox.cs b/BizHawk.Client.EmuHawk/AboutBox.cs deleted file mode 100644 index 5229ca78c8..0000000000 --- a/BizHawk.Client.EmuHawk/AboutBox.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Drawing; -using System.Media; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AboutBox : Form - { - private readonly SoundPlayer sfx; - private readonly Random r = new Random(); - private int ctr; - private Point loc; - - public AboutBox() - { - InitializeComponent(); - loc = label1.Location; - - label1.Text = ""; - try - { - var rm = new System.Resources.ResourceManager("BizHawk.Client.EmuHawk.Properties.Resources", GetType().Assembly); - sfx = new SoundPlayer(rm.GetStream("nothawk")); - sfx.Play(); - } - catch - { - } - - - //panel1.Size = new System.Drawing.Size(1000, 1000); - //pictureBox5.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod).Invoke(pictureBox5, new object[] { ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true }); - pictureBox5.BackColor = Color.Transparent; - pictureBox5.SendToBack(); - pictureBox3.BringToFront(); - pictureBox2.BringToFront(); - pictureBox1.BringToFront(); - pictureBox5.Visible = false; - - tbBranch.Text = SubWCRev.GIT_BRANCH; - tbCommit.Text = SubWCRev.GIT_SHORTHASH; - } - - protected override void OnClosed(EventArgs e) - { - if(sfx != null) - sfx.Dispose(); - } - - //int smack = 0; - private void timer1_Tick(object sender, EventArgs e) - { - ctr++; - if (ctr == 3) - label1.Text = "BIZ"; - else if (ctr == 10) - label1.Text = "BIZ HAWK"; - else if (ctr == 20) - { - label1.ForeColor = Color.LightGreen; - label1.Text = "BIZHAWK"; - } - else if (ctr > 20) - { - if (label1.ForeColor == Color.LightGreen) - label1.ForeColor = Color.Pink; - else label1.ForeColor = Color.LightGreen; - } - - if (ctr/5 % 2 ==0) - { - mom1.Visible = true; - mom2.Visible = false; - } - else - { - mom1.Visible = false; - mom2.Visible = true; - } - - if (ctr > 30) - { - if(ctr/7%7<4) - label1.Location = new Point(loc.X + r.Next(3) - 1, loc.Y + r.Next(3) - 1); - else - label1.Location = new Point(loc.X + r.Next(5) - 3, loc.Y + r.Next(5) - 3); - } - - pictureBox2.Location = new Point((int)(353 + 800 + -800* Math.Abs(Math.Sin(ctr / 18.0))), pictureBox2.Location.Y); - - if ((ctr) % 40 == 0) - { - xbleh = -10; - bounceCounter = 0; - pictureBox5.Visible = true; - pictureBox3.Visible = false; - } - if (bounceCounter == 10) - { - bounceCounter++; - xbleh = 0; - pictureBox3.Visible = true; - } - else if (bounceCounter == 30) - { - bounceCounter = -1; - pictureBox5.Visible = false; - } - else if(bounceCounter != -1) - { - bounceCounter++; - if (xbleh == -10) - xbleh = 10; - else xbleh = -10; - } - - pictureBox5.Invalidate(); - pictureBox5.Update(); - pictureBox4.Location = new Point(21 + xbleh, 89); - } - - private int xbleh; - private int bounceCounter = -1; - - public void PaintJunk(Graphics g) - { - g.FillRectangle(Brushes.Transparent, 0, 0, 1000, 1000); - - using (Font font = new Font("Courier New", 20, FontStyle.Bold)) - { - if (bounceCounter == -1) return; - const string str = "DEVELOPER BUILD"; - float x = 0; - int timefactor = bounceCounter; - for (int i = 0; i < str.Length; i++) - { - string slice = str.Substring(i, 1); - g.PageUnit = GraphicsUnit.Pixel; - x += g.MeasureString(slice, font).Width - 1; - - int offset = -i * 3 + timefactor*3; - int yofs = 0; - if (offset < 0) - { continue; } - else - if (offset < DigitTable.Length) - yofs = DigitTable[offset]; - g.DrawString(slice, font, Brushes.Black, 5 + x, 15 - yofs); - } - } - } - - private readonly int[] DigitTable ={ - 0,3,6,9,12, - 14,15,15,16,16,16,15,15,14,12, - 9,6,3,0,2,4,4,5,5,5, - 4,4,2,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0, - 0,0,0,0}; - - private void AboutBox_Load(object sender, EventArgs e) - { -#if DEBUG - Text = "BizHawk Developer Build (DEBUG MODE) GIT " + SubWCRev.GIT_BRANCH + "#" + SubWCRev.GIT_SHORTHASH; -#else - Text = "BizHawk Developer Build (RELEASE MODE) GIT " + SubWCRev.GIT_BRANCH + "#" + SubWCRev.GIT_SHORTHASH; -#endif - if (DateTime.Now.Month == 12) - if (DateTime.Now.Day > 17 && DateTime.Now.Day <= 25) - { - pictureBox1.Image = Properties.Resources.alt_about_image; - } - - if (DateTime.Now.Month == 2) - { - if (DateTime.Now.Day >= 7 && DateTime.Now.Day <= 14) - { - pictureBox1.Image = Properties.Resources.HawkInLove; - pictureBox1.Location = new Point(pictureBox1.Location.X - 40, pictureBox1.Location.Y); - pictureBox1.Width = pictureBox1.Width + 80; - } - } - } - - private void Close_Click(object sender, EventArgs e) - { - Close(); - } - - private void Close_MouseEnter(object sender, EventArgs e) - { - Random random = new Random(); - int width = random.Next(1, Width - CloseBtn.Width); - int height = random.Next(1, Height - CloseBtn.Height); - CloseBtn.Location = new Point(width, height); - CloseBtn.BringToFront(); - } - - private void btnBizBox_Click(object sender, EventArgs e) - { - new BizBox().ShowDialog(); - } - } - - class MyViewportPanel : Control - { - public MyViewportPanel() - { - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.DoubleBuffer, true); - SetStyle(ControlStyles.UserMouse, true); - SetStyle(ControlStyles.SupportsTransparentBackColor, true); - } - - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - AboutBox ab = FindForm() as AboutBox; - if (ab != null) - ab.PaintJunk(e.Graphics); - } - - protected override CreateParams CreateParams - { - get - { - CreateParams cp = base.CreateParams; - cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS - cp.Style &= ~0x02000000; //WS_CLIPCHILDREN - return cp; - } - } - - } - -} diff --git a/BizHawk.Client.EmuHawk/AboutBox.resx b/BizHawk.Client.EmuHawk/AboutBox.resx deleted file mode 100644 index 17afc11b6f..0000000000 --- a/BizHawk.Client.EmuHawk/AboutBox.resx +++ /dev/null @@ -1,2612 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAAGwAAACQCAIAAABiVBn4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK9gAA - CvYBwq9wAwAAh6hJREFUeF7U/QdgG+eV7o1rU+24yOoSRbFXsKD33ntvBFEIohBE7wRBAOy9906KkqhC - 9S5bkrvjEidxYidxejY9m2Rd1UVR/xeyd+/ee7+96++72d383xyPhpRCDn7znHOeMzMgNz38Amv97oON - 9Y2N9Yfr9zc2Hjx88ODhOtgHn3mwce/mzfsff7hx99O//uIHZ5bGRhP1LXWisI7SZGZPJcz9AbVfTfAo - sHYhrJZbbmAUW3gVYN8pRWmp+UEDM2hkuTRkswhhFsHrVVi3Bq8gZFXRCrS03CpaXp0Y6pIjXHKkiQNR - k/NruBXBalq0ht8fMV9Znfjj+2/dv/XXjfu37t745MH6xo2b92/evv9gY+Pzg/4vXF8I4sMHAOTD9XsP - 7935HCKIe/ce3L+3vrF+d2P99q1/+vVrF9ZWxzunWz0pmyCqp/X5VTMpS7ONDyACpjYBVI7N5FZsVeKz - AEfwDzxqvE2KqREiDDyojJQrIWTrWMVqWkENt6xOArcKK0zsYqugHIRNWGFkl6pIeTJclp4J8VfRO326 - 8RbPwbGON66evf3BHzce3H+w/iB9Ru8/uL/+dwxx494DIMMH9x+mIa6DSMvwzs0b929+snH/xse//cmL - Zw5MtodaXeqmWm7KyhsIagDHFrsAEATUAEFO+RYhfKeJVWrlV3qVOKsQJicV8NGZICiQzVTIZjFuHwu6 - Xc8stovhDgnMzC2t5UEs/DKnDAHIWgSVBlZpNaPYqyZ1eDXdYVN3xDrdm/jh2y9vrN+5e/vm/fv3AUQA - 8/Nj/i9cXxDixv079wA1EOAwAcEHIJkf3L9/98bG+o0Ht//yvZcvnFwcGGv2NFrEMRO72SZosQvjNexu - jzxUReZWbKMXP0UrelKE2FVFKZBh9qqJOUBWPEQGpXQLFbIVl/8NUtFTQnQGDaBE7wEcrYKKGk5pDafE - JigP6YhuJSakp4SqyU45yqMiNDskQ3FLb8za1+S6uLZ07/YHGxt37t27fe/+3Y2Hf8cQ1+8BHQKID+7e - vvVwY/3+vVuffPTnTz78w4M7f73155+9dGb55ELPTKc/YZdEDcxQFTWqZzSa2IlanplTQcp7nFb0FLP0 - GV7lDgFsF6XgCT50pwi9V4LLYcN30yBbycWbmRU7BMg9rPKtUmwmSN46EdzCKwcZXcstDVYRGs2MkJ7k - 0+JcSpRNBHPKsXGbMGoVd0UtU33x77/1/F/+9Mv19Zv37t0Ep/fhfznHLwZxA+BLJ/CDB/du3fwYHO7v - f/2TK+eOPn/p6J9/9c4ff/LNkwvd053e8ea6NrcCQAxoyJFqOoDolGIkqL304qcBOxUht4pSqCbmAYIK - XLYUu09LL1WSixjlOziw3VJcDh++W4TK0DNK68QIrwLrEMFNrBI9vdAlQyUsLI8aYxOWWwRlOnq+grBP - Qysw8mERm7jBpZ4eTFw8vXLrxj+t3//0wfrdv1eIoAau39vYAL357r07H9/4+E9XLxzraQkMtvtXp9sP - T7e0+jV+PT1kYPi1ZMCuzSEJ62g+FbGWWwnwAQEamRCbAA5UqaeXaEj5YEdNKtTRy3TMchpkmwiVpaOX - ChAZanKBiVXmECG9Cly9GGFillRTC8AOyGh/Fd6jRFn4ECVhLw+2hQffqqYV1kjQQatoojc8Mdj0T7// - 0f27H6zfu/F3CvH++j2Q0LdufwIgPrj/yW9+/v3ZkbZEoGYg5epttLiraQED3S5DebWEQBW5x6tOWUXx - Gq5diHKI0dyKHWpivolVYeUjwFZHLTEygdcpU+By5bj8akYFD5ohw+ZqyMUKfJ6BWWbhwpxitE9BcInR - Fla5iVZkZBQDrxOsJoK8Bt1Ght0tQm4XoXYYuBA9r8JjZLWGDNODjT9976X12396AGp0OmnSHNeBEXuU - RZ99+J+3vhBEcAgbD4F7uP3w4e379z76ybvfnB9tGesMjLa5+uPmzoA6buM6FciEjRM3c5IWAeAV0FDd - ckJQSwOwADWbAOkQY2rYlVpyEeAItkJ4JrcyQ0Us5sMyAU0AUU0oNHOgTjHWrySFtVS/guDgw2uZpQCi - mVMGchwYzGp6voq4T0XMVOD3qsm5CnJerQwTtYt7EnUvXDzwyQe/eLhxcz3tZj+HCAoQ2Afbz17If9L6 - jyGCwwG24ZGluXv3zqe3bvz57ZcvLY42zw9ER1P2wZhhIKyNGKg+NbbLI/Gp8AZ6Gb9yj42PMrNhDhFW - Syo2MStBGBkVSly+AJoB/pZTtpOS/zQx72khPItfuVeCzJGhc6WobD0VYuXCAUeflOASos0MiA6fp0Jn - aQh5oAiAqgqskpqwr4qcoyFlCWBAjxkmATxqFcaciv7m+u+/cXH99geg6wF8n7G7B9zsfzJBsL4QxPsb - D28BD7bx4N7dTz/9+E8vXTm+PNo8kqzvjxi6vMqAhuhWoCJ6cqdbZGJD2JDtbMgOQA1A0RCLVPgCwA7s - ixH7ADtqwWYQ5Lyn8FmPE3Ke4kMzRfBsAFEEzxJUZqjxBTpSSQ2j3MqCmullVfg8KWwPH7JNitwnQe4T - IfaK4HtkqD0qHECZJUXtkeP26Zhl4RpOg10cd6leu3rk/h1gd9YBO7A+4/j3AhGUlnvAYwMPtn730w// - +NLFY0tDyaG4dShqADOJQwRNmJlxE73HIwM9gV68hVu+C4ATwvZWkUtk6Bxa4TPMkm0gwA4gSC/aAvbp - RVupBVt5FZlSFECcJ0ZkS+DZVcQSNSZPRygykEv0pGINJlcG2yOA7FCgc4FUZahsGXKfHLlXid6rwWcr - sJkqQraaXAhmx66wvi9uef3a0Vuf/NMDMMA8eHDr1i1w8GAHmPD//pr4mRJBpLW4fu/mB398+/nzq+Nt - S72huRZHR704pqcOBpRtdt5EoyGooTCKtwJArNIdUlRONbUM5C8h+wla4RZG8TY2ZCevYo8ACgS1D1Dj - lGVwy0Eu50mRuVJkjhyVV00uAxC1uIJqwJFUrCcWVeFAOudo8SVyTL4clavG5WtxeRoc+Ewuv2K7DJ2p - pRZHTJzRpG04ZT842fqd15+/eeNTQA1A/NeM/juCeOsmGFrur9/88Hc/evv6sdnzC90HewPjMUNnnbDD - IRoMqJY7690yHIDFKN7OKt2pIZYocYVC2D4pKlcE3QeEpsQWaIklVeRSHaVUTy3XkcsV2EItsVSNL9YQ - ioAMaxhQIwVSQy2z0CvtbHg9DwmijoOoIpQKoVmCigw1Ng+IVEcsUONyhNBdSnwOUKJVjG7zqvtjNd0x - y4G5od/95hdAf7du3QQEAb7PevRntf1R/O2BfrHG8ijWwXh/6+bD25/c+eC3P3rl/KXF3vkW54Bf02IR - gBGl168eaTBa+UhmyU564XYRLFtPKVfhitT4QjMLZmMj7FykUwg6BjGoIIdV1Iia5ldQ3FKiV0J0i/Ee - Cd4rJQbkZLcIF1HTEwYuiKZqdtLAba0V+WVkLa6QW7JdAs3QEQp1xEIVPk8EB94oW0UqMHKhjTZhd7g6 - 7lTMDSf/+Psf37/zEciZjUfN+X76mgSQItimxZB+KeAlfRZ/o/UfQwQr/R3BtwZx/87DGx/d+dMv3n/p - 3KmJlsGgvr1O0mIThXT0VJ04ZuZXUUrpRTtoBdtV2GIbF2PjogG4sIrWoGU2VrESek6rSdBZK+6xS3vs - snarBABqrhG01AjaLeLuOnmvUwViyKebCJumoubJRzHdUNtWK3JwkZLKdH2UI7PU+Hw5NocH3QX8uZyY - X8OHh0zspFMWsQlHOjx/+NW3N+59sHH/5oNHo2q6JKYhpgvSo7j/PxT5N+L4RSHevZO+1vQQVJgP/vyb - 733zrXMH14YTvR5ti1UI5pNQFd2roViEKAEsk5j9NDVviwZf7JGSgypGk57baZf3OlT9TvWgRzvqq54M - GmciptlozWyDZSpingybpqPmxUTdartvrS9ysr/hWG/4eG/k7EjTxYmWcyOJ4/1RwBSANtPKROW7xNAM - JTZXis7iQnfxYLsVpAKrBOOrpodqOGGboDlU/e3Xzt2/+9eH67fu3boNTjyQ431gv/8HxHv/bRDv3F5P - X4BYv3PjD79696WLzx0YO9Qb7fNqm0wcMOcBI61jQKS4PGbpTvy+p+gF23QkiF9Bi+v5HTbZMAAXNk9H - a2cbrYtN9v3J+gPN9YdaXcc6g0c7A2B7oid8bih+Zbzl6kzH1an2y+PNVyZaXpjveW1l6OWl/uem2k70 - RpZT9SC7q3D5MnimGpcnQ2cBx8OH7wEQ3WpyxMwNmlgRm6DRrTp9ZOLDf/r5xoPb63fupi82gXb49wAx - bbYfXUlcv3PzTz997zvXzpyZ7Z5ssrfapVEdPaAhg4FEQSjgwTMZJTup+duElZkWNrJJz++qUw379bON - 9qWkc3/KdbDFvdrmPdLhP9rpW+sKnOqNnulrODcYvzicuDLW/NxE69XJNrADaF6ban95ofeb+wdfWx54 - aaH3uan2C6NJoEeXAK3B5qkwOVJU2jkCJcoIeR4NpaGWB9xi1CpoDlbPj7f88sdvbzy49Wg8AHYHsPq3 - 6fzfBHEdHEf6W27c/viff/m9N968fOzUdOdgyNhsETcaWGDCq5fgq+nlEmyeAAZ66D7QTL0ySptFNuQz - TMesy83uQ22+1Xb/I3yBte7g8e7AiZ7g6Z7Iub6GCwPxS0OJy8PJK8PJyyPp7bNjLS9Mdbwy3/vNpQEQ - ry70PT/bdW2280hXoNUsBEmtQGaJYXuFsAxe5S4pNtsiAmM71a9nNNiEPU3WiYHGn/7gjX+BCKilryP/ - HUB8lBTAdd355J/ff+vFF04tn53rGYtZOuoVcSMXyBDMJ1VUiBw4FSLEzEB4JeTmGvGgVz/VYAMaPNDq - PdTqBRo83O472uE91ukDcbwrcK4neq6n4XxPw4Xe2KWB+JXBxLPDqetjrdfGWl+YaH91rveNpYHXF/pf - mul6YbbrpaW+yxMtU+EajxCrRGVL4ZkC6B4BDAwtuaCS1AqRgGPSJR9sqZ8cjP/ul98H6QwaC2jN6SIE - /vd3AnF9/e7dmx9++8VLL51eubQ8uNTh66xXBlSUamppepzAFcjxJQYaLKhgttXK+l1V0w225WYvEODR - rtBqmw/k8oGU82Cq/nCr+3iX/1R36Hx39Fxn5HxX5GJv7Ep/03NDyWsjzS+Mtb000f7KVNc353rfXBh4 - fb7vpalOkNHXZ7uuTrcfaHZFFBQ1mGQAxIpdYiQYWvI1lKIaHixQzUg65T1xy+Jk2+9/9S6YrUBNfFQQ - H/xd1MT02QTn8/7tu7c/fPPq2dcvHn7u4OjB3jCoiU4xtpoKAcOvFFOgJJbpKJUAYq9DO+o3Lac8R7uj - a93ho53BpSbHStK52uI52uZd6/CBON7uO9UWPN0aONseOt8ZudjdcLm38epg8qXx9lcmO1+b7n59tveN - uT6wfXGy48XZrsugaE62rXUFm/VcE7lUjtgnrNglQWYq8XlaSrFFiAzpmY02UdKnnRlJ/vxHb63fu/Hg - 7r31dTD2pefVvweIgOKD+/du3r39AYD48lmgxIGFNm+TiW/jIcGAnIaILlAQyrSEMp+E2u/UzTU6jnc3 - nBlIHOsKHW73H0i6DoLGAlI74Tjc7DnS6jnbEz7ZFjjdETrTET7dHjzTEbrQE3t2MHF1OPXccOr5sdZX - AMf5vtdme16a7Lw+3XF5NAUgglbeXiO0M6FKZBYw3hJEGqKJVVEnwQSrGQm7uMmjbo3ZXnvh3IN7NzYe - Xc1JH/vfA8S0DtM+4fbdOx9+6/mz147Pn5ruGG+0BTV0U/oCF5jtskWIfCkWDHDlARl90K1fTLhO9zed - G0od6QikC2KL92DStT9et7+xbiFSuxyzHm12n+4Mn+2KnOkMA5TnuqMX+xov9cfBZy4PNp3pioD6+Ops - Tzrmel+c6waNG7ifw63elI5joZWrUNlgpgbFsYpUVCdCe1XkqJHd4VUPphypaO25E8v3bn4IDhnAS1+D - eAAI/rdDBN0tfW/g3r27H77zyuVnj8wcG2sZDJk8MmIVsRSMxulLCZXZQmSRClcWlDMHnbr5hrqTvY3n - h5uPd4WPtPmPtvpXmz3LMfuYq2rQrpx0Vy2Eak60B052BI+3+cHO+b4YCLBzpjtyOOk6EHfMB2sWI7Xg - b8Fnzg/GQQA9AlfUbhLaGJXpaxP4AmB3DDSIS4oDbj9pEQ42mBaGGkZ7o69cP/Ng/Wba2ILjBrX83t2/ - C4h37t5I32C5/c/vvHLp3Mrogf7GPr/eIyNVEUtE8CxG8R5WWSYfVqDElAZkjIF63WJj/dnB5OXxthMA - SqvvUNK9GLUCfF0mUW+tdMAmX0mL0XOqM3SqC0T4Qn/jxYE4gHikxTsTqJnyGcY91YB4X61kzKmdA149 - YDzbH7s0mhp0qOpZMCOpRIvLB3N0DbPCJcFFqpldHtVsu2uuP7w01f6L97+18WhiSXdnMGr9PVgcAPHG - zY82Nm7dv/3XH7xx7eLBicPDyaGwOaim68llYgCxaBf7EUQVFhJVsif85qMd4atTXc9Ndh5q9kwHa0ac - WsCutZrbbZaAnV6zaLhOsRSzne6NAomd7A6DHcAI7JzqiUx6DWPu6tmgebheM+nTH0jUH2vzT3irD7d4 - gQ+f8OmdbEQttQyIsZZR4RBi3DJCvIY/0WQ9OtZ08cjot145e/Oj34HZ+faNm+mDT1ucfwvxv2l2Bufy - zt2bIJ3X733yj++++cKJxTMzPdNN9bEqdi0dKoPnMIt3ckqB+82rwpe1GCX7k57TA4mrMz3nR1rmo7Yx - j34ccPHqR1xVI86qoXr1QJ1y2KmeCQJxNZwbaAR95lDKdaIrdKwdWJ/IXMgy7NBOeAwHm9znwdcZ77g+ - 2XWqq+Foi//qeOtKvC4kwjtZMDMV4pMS7QKMT8tocakPjCSfP7Xw6x+/eefTP208uLl+79a9u3fTBNfX - 768Dgv/dV3HSM/yjh0g27t/68Nc/fuvS2pnp3rmEu6mKa2fCDYQSUfleTtFOKTzXxkYDc3OiP35yoOnU - YOJQe3AqbJmJ2uYbHWA74tUPe/SDIEkd6omAcS5iOtMXOdEVWGmyLzZY1toDIOuPtQXnQtYZf22vWdlv - 0Z7sjJ/oaDzZ3vD64ujZ7ti1sbaL/fFOAz8swXtF2MZqtpmH9hsFUz2xt14880+//dH63Y8fPAD28F66 - nfyb9YjZvyrwb7z+Y4jge6ZPIjgQMD8Dv/3hn374ypWDfcmJaF1bjTQgJjVp2DY6XFaZpcNDmnT8g22B - C6AU9scBwfl4/XTUttDkBDEVsfY7q9rN0i6bEsSYr3oqYDiYdKw2Ow+3uFeaHMfSBdF3MOGe8pl6zYqI - iNokZ405jUtR14zX/NxI63OjIFqujjZPeqta9OwGNc3GQ3nULJ9RfHhu4M+/e3/j/scgZ9Lm+n9bn7+Y - /5z1hSCCHACxvn7v4frt9dsf/fbdN49P9kw0OkcDtcMe42Lc2aoX+gVEDxffa1OfHkxcnGg/3te4lHTP - NNhnY3VgO+w1NOuFtZQKNxebqub31ql77YoBu2Ihaj6Uqj/Tl74ScbavcSVeP+qsWohYu43SII8QlzFn - fJYuk6zHKAFd6MXpzqtjqWsTLUDCXRZxUEE2MeHdgdrJztiB6f5P//Kbjfs3NtIa/F8XSOrPX8x/zvpC - EEF6gOqSHvzu3wJd785Hf/jV2y+dm+tfaPYvJb2XRtqn/ZbhuuohW9XBhO/iaOvFsbZT/U2gMs5EbBMB - 87Bb32VROFkoM6kcbEMSSlzNHvHoYnLKXNB4tMUD+vLzk+3PjbRMuKrDfHy/WdYgpvo52GYVe8imHbJp - ptzVRxLO1xf7Xl/qeXmuc6nROujW+OQUl5z+3OGZn3/31deunb9/44P1uzcfpq3YI2vzP6/PX8x/zvpC - EG89WL8DKvTDB3fv3li/92n6SbCbf/7Du6+/uDpzpCv+rcOzq8nAvN92vCXyrZXJ1/aPvLw0dHW6+1CL - fxIQdOpaDaIGOb2ODvcLCC06fqqKnwZKLPXz0fsbrKe7wleGk68t9L082zPpqu7SC7v0oriU7qIhmlWc - tZYQSOST7d6z3b7X5jvePjT0ylL3gRbnkN8QUnNSdbp//O5rD2789f7H/7xx79b9u+BI0/f2/vf1+Yv5 - z1lfCOK9hw/vpLcPbt27eefOJw/uffLwzgcPb/3l9++89tz8yPdOrqw2+faHHFd6m397+fhvrp385bPH - 3j21dLI7Nhu2zkdsc2HrsbbQcmN9v13db1MN1mmTao6fh22SU1cTTuAQr462vDzT882FgWPNvtE6TauG - A1COObSLIcuZrobrE23nevzPjzVcHY29utDx/Gzb0e7QgM8w3xr61uUTDz/808b9Ow/u303PJ6B4/yfz - +n9cXyydH0G8DZQIGszGvY2NOxsPbgCOH/zs3ZdW51/dP70YrF+Nui93J//p2plb33nxo7euApSXh1sO - JjwA39GW4OGUf60tdCDu2h+rnw9Zu02yRhm9vYq3v8EGhpZLA01XR1tfme29MpQatatb1Ow+k2R/1H6q - I3yhL36hN3amw/3abOLqWPT56dS1mbZzo6mRsPXFtaW7H//Tw3s3H9y98+kHH94DQ+ltUHU+P+z/yvWF - IK4/4ggCdJZ7YI5KQ7z58N4nd//59z964fLV+bHT3alph+lkU/Cjly9/8sbV31879fPzqy9O9VzoSxyK - uw8nvCsN9QtB67THNF5fPVCrbK8SpJTsGbfxQLTuaNJzvif2zfn+t1dGX5rqujKYnAJJXS0Yq9Msh62r - cedayrWWtLwwHn19qf2l+bZrc52XZ7pPT/X+8b23Hnz4p4f3bqe9V/rp0/SziX+/EIFB+KxB33u4AZL6 - HnDdD+6spy+T3Lj1u1+8dHDh5YWJ/cH6K92pv14/96frZ359ee1XF4+8uTT63HDr4SbPWnPwQINz1lsz - ZFH1GKR9JvkI6BUu45G490Rz8Ex75NmB1OvzA28tDb0w1v7cUOpyX9PxZt+iv2bWo18JW9dS9Zd7/d+c - Tbw8nXpuPPHsdMerR2Z++e2X7v71dw9vf5I+rcBP31u/n3Zhf68QwfqMIwgA8W46qdN6vH/3xoN7Nx/e - /OB7l8/+6Pzxb86Nvjk38vNTB397ee2X5w+/e2TupckeEGc7Y+e744dirsNxD9juD9ct+C0gloP2tSb/ - iWTwdGv4uYHmN+YGv7U4/PJE59XB1PXh5gtd0SON9SDOdYavDze9ONr41mLrS5OpZ8dTl6e7Xjux9OHv - fvrw7o2HoOGtr6cfnrx7795nED8/5P/S9YUgpg/tUckGhfvuw43bACVInQf37tz46MHdT2/902//9MaL - Pzl77M2FsVcmen94bOGX51bfXBh+frTjuysTF7rjx1OBo01esF1L+g81OJcjdYtB60qo7kQyBCCeag5f - 6km8NN716lTPC6Nt31ocuj7cAiCe7wyfaQ+AuNwTeXGk8bWp1PXRxOWxlosTXS8eWfjnX/zw4a1P07m8 - fj8NEZzT9CN16euvnx/zf+H6AhD/VYefQwQd5iFwPPcAxFugU9/4+B9/eqy//ZvLU28tTVwdbP3ewamf - nVq5OthyuTfx3uHZ852xwzHXWsIHAuws+GunXcbxOt2wRX200bfWFDjVHLnQFb821PryRPdr0z2XehrX - Eu5TLf61lPt0m//acOKVydZXJpKvjCevj6YujrRcnu5/59KpT3/7i41PP35w5+Y6oJcuio8u1T16KPq/ - nuIXhgiay2dvX9lIQwRivHn/3v11oMg7V48eCKrFJ3ubf3pq9YdHFn5x+uCPjy1e6Ihd6Um8d2jmcnfT - 2dbIyWTgVCp4MFo/ZtcOmVWDJsWASb4/4FiNeoEez7XHrvQlX5ns+e7K2Mlm/7zHsOgz7g+Z15Kui93h - i10hQPCVidSr090Xh1uvLYz96b1vb9z8eOPOrY17t9MQwTD18MH9dLFOX8n+O4b4KABEcKqBjwDw0kq8 - 8+mnf/ndmf0zA+H6FrPq2Ymun19Y/cfzh3+ytvDaZPf3D0z89Pji+fbIxc6Gcx0NhxvdqzHXgWj9csgO - xBjjUQ5FXGkltkSAGE+1hJ/tT70+2/fe4alTLb4Fn2HaqT3UYAUQrw5Enx9qvDYYe3mm+8xg6vL82F9/ - +f7GXeD5wYEAao+udKUX2P6nT3j/j+uL1kRwbOn4bPfRE/DA5Wzc++jn770xN9Dc6q9ptMpnW32/eun0 - H54/8dNTC2/M97y92P/GbNfzw82nW0PHmjzHEl5QE48lfECPU/X6OY/5aMJ/LOk/1RYBnedCb/zZodSL - k50vTXVeG20Zskhn3FXnu0Lnu4JXesPPDzfuDxlPdIcvz/S8ffn4xqd/vn/rowcP7gFLAzIk/dTXv57p - R4f4X7z+v0FM++31ex8/WP/497/43uxAMuHSJxzahFW5lHStNXu+vTTw9kLvj9em3tk/+PpM18lm32rU - cazJC2K1wbnkt8w4DTPumhm3acFnWQk7gDyBYVxL+S71xc93N1zujx9LeQDElbD5dKv3heH4c32RY032 - wy3uM+NtP3j50sM7Hz54cBtYw/Rlkf8F4mcc/2vXF4X4CN5nBwlOPpDAnXWgxI0bNz743Qvnju4fbJtr - axjw2QZsVa0yxgsDqe8sDPzg4Pg3J9qv9TUeDNWebgmdSPhAZTwUSZfFUat2IVQ3ZNaMmDWjtWCrHrNq - 9gdt5zujL461g9YMXM6RuONUi/d8h+/Z3vC5du9y0LDWFrgw0fmHd994ePeTtNcC2fv5oT367+8a4r8e - 3yOI99OHv37n4b37D+/eX78FuvOHv//Hf3z7zXfOnn52YuJYU0O3jHehKfjewtibY50XWvzLHv1svfZc - W/hMW+RgpP5AxDHjrVmM1s8H6w5E3Yte+6yzdqa+Zt5tPhR1nmmLXh1oPd0WOtXqP90aXI3Zz7R5TzU7 - 5z3aE8n6i4OJl1cmbv/mJw/vAI8NIKZ7yOfQ/v8GImgs6eFv49ZDMPSt3354/9bd22Dyf3j37sZHn370 - 3R+8PrtyqaVzqabmqMP2w5mxb4/3nY17xoyS402ugxH78aTvaNwNPPZy2A4gHoj7D4Q9+wOu1aj/VHPs - XHvThc7Epe7kpe74tcEWQPBA2LoStqzGrKeaXadbXJd7G66OtX/v3OGND37/8M6nD8H3TZvrz9M57Q/B - cf5r/NeuLwbx8yNNQ7zz8OHNhxufPty4ATrL3bsPbt9/eOvBg7/e/vn5ly+1jb3QOnjGFZxXaV9pbv7p - 4szlZHihrupiZ/hyT8ORRufhBjCEuJcCNmC298e9iz7ngqtu0mbuq5KBaFOIOpTiQxHn0bjrYNi64DUe - CNceilrOtnqON9Wd6wo9N9H9y1efe3jjrw/v3ACWJt3g/sdQ/+iy8aMHUf/LGX5xiOAY/wfEh58+fHhr - Y+P23fUHtzce3ty4+/6fTjSNngz2/XT6+PVgywRPcUhv/tXy4qXG8PGw41DYejrlORJzHG10HW10H4w6 - Zjw1o/XVbUrJuKVqOWDf73UMGpWfoRyzVIHms+g3HWl0HIrajsXtJ5PO40nHs8PJqzP9f37vrYd3Pn54 - DyRD2lcDfOB4/iU27qTfRfx3CxEQfAQR7ILjvvXZ0AKYgtfx6frDP919ZfZ0M89yLTn7lwPXvxUfOSir - 7cDQ3x0c/cnizLGA7WTcBZwzENeJlH9/wHIo6pjz1rSoeX166bBZu+SvP9oYOhzxHWsIAIjDNeoxi3Yl - ZD0Wd66ELECMywHTwaj1ZFfDt44u3P71+w9vf3L/ow/W79wBJfk2OJGPDuYz/38b+O3/GWLaSYCp+tG7 - MMD6/LN/6/WFayIYCO6kH2357M7jvfUNUA8fgOnvz3d+/cK7+wP9IZzmQnD0r0vX3olPHlXUd2E4S2rD - 90aHX+hKrsUcBxssB6LWeX/NqEO74DUDT3PQ5xy1aGbrzSM1mnmHeUAvGzTIL3W2tMnF49aqMy2Btbhv - qk4359KvRuzHGn3HUqFzAx3vnFn79Fe/2LiTLiMb6aeIN26vb3x0987H94H5Tt+7ePSG4n93ff6K/tbr - C0AEGIEGAcf0Nj0fAK+dFubNBw9vbNz+2V8vDRxo4VttJawVQ9Pvpi99v2n+tDY0RJaFIMhzodBbY71H - YnVLQeNS2DTj0/fVSIYsmv0hUPW8U1bDfL15LRZccNeOmzWA4LPdqSWP9UJ74/X+1itdTacSgdk6/aLT - dCzimaszTzusK7GGtw4fu/mPv3/4yb2HN9IXNsHxpB/9As4bTKDrd++uf36jCpxwsD7b/xzhfyNE8J3T - o+lnRfv+xvrNdRDp/Pnkwcafbv/u+e/NOVIBrFS7G9lJNbzfu/Z+y6GLhuQYTRsuw3ZyuFdaYieTnjmv - btqtmfcZZz0GkK1TNuOq3zVXZ1yoN805TAAfiENBx5LXuuKve7Y7fqU7frYldKEtshq2H/JZzoX9Ewrl - bLVpf733SCT1oxOXb//8TxsfAo4bGzcf3L95b/3WPQDw0dVZMAR+Tu0zfOmX8C/rs1f0N19fCOL9Bw/v - 3E8/+w7y9yHoJDcePPjL7fXffHzj7V++MXW8V+Zww7iCJ/Lr8imvNcz8qufUFXPHAFHVQeTX5hdMGlXn - 2oIrQdNEnWLKoTkEoAQdi07roYDjaNC56DTP1BlAKTyeCpxofWQkg3XXB1KXOqPnWoPP9TYdj7tWPeZZ - qbQXS5kXaQ7pHYs658XG/u8vnf3Nte/+8/d+s/6HTx9++iCdFrfuAee6cX/9s9vOoA7eAXUT+Ie/EyUC - A3EbHOStR/cFPr1/41d/+e3L7/7x2nf+8dTLJ0K9CarKWkBgfmWPbhf0hKnlZ+0nrlp7h8hVHUSBOa8g - REIt+0Crtc24NMM1khWf+WSDb9Vbf9hbf8BlORJ0HY04p52maXfNrLf20kDyUlfj1Z74cz2NV7qiz3Y3 - LLqqB6Sstkr4CJR0iKM5qao7We0/72g+7+85Fx2+3rv/+4eu/PjZN//xm+/++d2fffqr39/+54/u3gZJ - /uhq96OW8l8C8VG1A8NIutn+yzwPPpX+huC/Ryb21q30j6gAne/BJ+sfvPebd9auX+yaf2Ps6A/nzu43 - x0IInnZ3OfOru6szoJM8x7eCC8/XDSwIHU1wRiOOYirKbWTjl7zGeY9+yCTZ7605lwqfiHiPh9zHo+5T - jd7jMc+hWP3hpOdYyn+qPfziUMu1vqbrvU1XOqOn4q6UkFhbmNGQWzwJpa3S1afE1tMK10l14Hxt6lx9 - 12l39wl/71q452TTwKWuyevjyy8fPvXd51/9409+uf7hp2A0fXgXnPh7G5/9AIv/RIj30xdY74M/Ht6/ - 8fD+zYcPwBb4mPRlTmAD74JB+eE6KH+fbDz84+37P/vw/UNXTwb61+rafzpx9s3WpUlxvb+cKdmSz3hs - jyoDkkRLX/GMfdM3vsivb0OLIlCyvbjCWgbplAsOBB0TNu2gUXqy2X+lv2k1ZDsVdZ1tChyJOA/H3XMR - 20K07vpY23MDqVfHOy+1RS63RY7HXKbKPMWebZ68suZC3ARatMarPS10rHHtF9WRF+wdF8ypAyr/SlVw - zZo4Ym48bI6tuVsP+1pPRHvenD764avvPfztRxuf3N+4/eDerbv3H71T8tObN0COp5mm552/zdq0ce/2 - /Xs3bz24dfPRPYtPAbGNex/fvQ263P1b90DZfvCnG59+95cfvfTeh5ffuf/yz77ff+xwVfyqc/D3U5ev - e4cGaCZnAYn/ZA79iT2KfWVROP9iTdsb/vEDYk8PXtlQQfeV4fXZhXYodEivGbNWdVbxR+pUK032Qw22 - /XX6ExH3kZj7UJNntcV/tD10fih1pj16tS91NhE4HfPNWfXy7N2i3dvteeWRIkI/UnCYYz7NqzvBqL0o - cr9mabtekzwq9x1VBs7oG4+rQsdk/qMK/1FV4JQhdtaSvOTt/vbo4Q9efffhn29s3Fpfv30HVMvPGva9 - O+kHxj5n8H+9NqWfVQLSe/Do9u3G+t20NwAUb28AA/HXuzd//pefn//m2/OnXuiaf617/0fH3/h268oh - ZeSdxP4/TV45V9PajlGbM5HMr2UwvrFHmV0eqmAvcp1vBiZOVzUOEDVNCHYYRqneVyDfneHGotrVog6t - MC6ltBu4C37jdK1qwVE96zbMhWonQ+YJf83+Jvec13I04jkTCx721HUIOdLMHYJtW8xZpYFCfA+Cv59h - OM6xHqXXHGPWvmBMPG9OnQLsFP7TVdGjUu8qv/4A37EicByWeQHZg2rf4dr4ldbx7x+7/Omv/rRx58H9 - 9I3ptApv3rz5N8ztTXc3Ht1zTPuBBxt3H4DmuwEGuj/cuPnTv/zh0tu/PPbSN/sPvdi2cC7Qd9bV/cP+ - Y9fdg0fk0Z92Hf/N0LljmlgrUm7YWUn/0i7mE3uUWeXeUlo3XPmGd/R5R88wWZeEsWNwmrWgXJeVq8rJ - chNRzXJOg4QSlZJ7TeIpm6ZHw0vI6a0GfluNpEUvGrRVDRiUB9x1Z6OROaOhiUKxlZeJd+zW7M7zFuHa - EdxZivYIu/YQ1bgEvL3c/5whflodXlP4TylDR0WuI7z6Q4L6RY51iWtbUwXP1yRO1SYO1TaueJvfPnz+ - 1u//eePm3Xu37wCIoFgBv/u34rjp0/X0MywgeR/eWn/40b0Hf7i18bubN198/2eLz170Db0UnX47tfyd - jgMvxyfPWNvO1rTs53uOSiO/6Tvzo5bVFbGvBS4z7KgErZm/Jac6Hx4oozcVcJ6raX8jODrDMjfDOHEY - wwvBWArLFJn7qksLvDRMkE8MiyjNKtZoraKnmh9X0BqU9LCCHlOyh2zV8/W2Y37fkXp3J5vfgCWnmFxt - VoFoS6ajEJ2Es0cJilVO7SrNNAmTrHHrrugaLlTFTsgDJ6S+w5y6VabtIMe+zLUDMR4SOQ8KnYdknpPm - piP2xJFQ5/vnXrj350/Wb9wGKQ0ECQrW3wwi+Eppi/rhnbu//Oudd3776fUffnrhnd8tXH2n5dApbep8 - desrzpE3IlPfSsw96+jZL3APo3XHZdE/Dl74dnh2nl3XBpeZd8O4j+2T7y6uLcFGoexYLn2Z4/hmYHhV - BsqiNAlnhcoJ9sLK6twCXWGBCQaxYivdTFxcQh8xy8fr1F0mUZOG3aBidxgVKyHv6XjjYYd7RKyOIclN - OOaQRFeTV8l8fKc5H9EIY/TjpId4lsMs80g5/yCt5pI2eqk6flIeOC50H2JYD1LNh9j2FU46VnmOw7z6 - IyLXKW3kbG3ygDFysrH/j9/8/san6ad20o9w/A0hrt9av/W7j/767V/++dr3P7z4vU+Ov/3r0Qs/7Vj7 - Qfzg9Zq+c8rkWWXigMBz2dx6va73iDgwitatiYK/7jzxqnN4nlXXiVLaMpDCx7PVe0pri9ANME5DHr29 - TPiCs/ussXGKZWhF8hphoL1gavJKjUUl5spyI7TMhKxwU9Gjtco+gzjEJ3i5uKRGMGI3rYYDZyKxUYkm - jqQmUaxehnJcWmvMghK//Iw+DxqG0ruxokMC21GebaicN4fTnFH4L+oaT8n8xwWuwwzbYbr1GK8e4Fth - WQ9z69b4rhNC92mp/4w6slYVWbXEXx0/ePPnvweZnJ4RQW38HML/7dr08Q//+Nvr7/7u7Nv/tPbmn/e/ - /Jfp6z9MHnrdOf6KdejZ6vYTkoYVjmcIXTVB1B+TBp81ts6Ras8qGv+x48Tzlp5lnqsXq7XtQYofy1bt - KKrJQ0QqmY2FzPA+0gGx60VP97LQ3oMVd+KEcQTgiLUWVZqKyxwodDWkxFhR2i7nJUU0PbRACclJyPgL - 7vq5WmsHU9iCZbciOf0U5ZzENsKvUW0rRm16wlCI8JSTuvGSZa75pMQ5ChNNoOTHhPVn1ZFzqvBBuuUY - 036SXX+c6wR5fZBlO8i0Am0eYzvOiXznZcHTiuDpmvgRZ+oHZ6+nET66T/Tgs07wL+tzJP/v16YPrr// - 13Pv/OXwG7+fuvrr/vM/ih98vW7ssqb1jCx+TBReYrunqdZBtLathNdTLj0uDR3heV8wd/+qfe25ms79 - fHc/rsqegZI9nqPaVmDOgYfKaOECmjsD04ORP1fXuiJxgAQcIMrasXygLFcJyphT4oRjq/KLtXn5fjw6 - SifakBX6suIIk9YtkyfIrCYkrZ8knWToplmmBYmjl1IlfiIXvulxQxHSBSH0kGQLbONpuWcCLRtFSA9x - rKcUwQvahiWyaY1Vd5bnPsmpP8yyA4Ir9FoQR1j2MwLPJUnwvNh/VhNZUnme7Ztb/9NHG8A1Pnp7xmfr - /xbix8e/++nRb//T9PUftxx9N7L8mnXwWW3raWnssMC/yK6fpFkmaJYxorGzXBTbR+utkB8R+L9ZP/zT - lsPXrb3LfPcQyeDOxqueLFBtzqvZBw2UUb35xLoMVKSIviJzHlF6+7HyEbJqkKzoIUljUJqjAOGCYGsK - KixFFV442gWD1xSXqPflaPblWQsrAmXYYZpikVdzSFS3wLVMsWtbUFLBY9mITY/r8qBAib1k+QLbdFLm - nsIqBiqFSzTjcanvvLZhhVZ7guc8K/Cc5roATQBxmW5epNWAnZMc52VR4Io4eEbiXxTYV+zxX11/c+OT - 2w/u3vvXh7v/byF+NP/ab/ov/KL9xLvR5ReM3YDgGWn0EM+7n+OaZdjGqWYQE1TTAErVVSkL7SUPwNWv - 1A/9tO0omO0AxDGqOVpMr36mVP10nnFPmb+c6ioiOXJwdZnoXoJirSo0TqmaZuinGNVTLH0fWR6HsSKV - tDCMniRw2yg8fwWmOrNAsnm3YkumrwQ7ylRP0auW2KaDPPsCo3acZkxBRdLHc9GbnlDtg3gryOArzLMM - x6XOeZK2F8KdImiOiN0XdLGDbNspkees0Hua4zrBrFtlWBdoNdM04wK9ZpVtvyD0XZdFzgt9B7l1w/za - F8cObPzl0w0wEf6tIP5p4NIPYwe+6597o37suer2C6rkKt+7QLPN06xztNpxkmEYV9WPVrWWCUaJhmgO - vSmf81Zw6iftx67aevcLvZMMawrKt+2G654pMO4o9UEozlKKPR9n2FEWLqEekDlnWaZZhhHEAts8xdB3 - oyXRUkoSwe2myPppsj6qtA0vSKLZnUTxFM+wIrHP0arnSbolqhFQmKIaWmBC9eZC/KanZbsLA5WUXoJs - lqFfE9cfYJq6StijGMVBgeNCdeMhvuOU1H8aQGTXn6DbD9JqZyiGUUr1JM2wxKg9JXA/Jw5eFvhBdndh - FcfD3bd/9JuHt9KXdf82EH/RdOT7gYUXanrPq5KXq1vPaRKHhb4lpn2JaV1iWGZJxglcVQ9cFi/ldMEV - 7ZXSboTqu02L73ccveroOyDxT7NsXWi5P5dYs73UsLWovghfByHX5KLUW4utGfBBknqWVTNN1c/RDAsM - 0xzd2IeSejMxDcW0FhivA8kfpihH6ZphhnaKa5znmaepuv100zy+aplsXAIQKfp2hKhmdyX1y9sk23KD - 5ZRunHiaWnVMVHdUYO8sZQ8ipfsBRGPTqth1EvRovvMko+4E1boCsodcPUCpGqJVzzJq1njOi3zvFb7v - ANHUAuEsGkO/uPjKw3+++TeD+G5g8RXLwBlFfJXvXxX41qThVYFnhVMHXMISBbwe3RxBN4RRdWOUoVxa - qkLUDlecNjS/FZt/yTd6UB6c5tj7CepYKaNud6XxmcK6fExdOdmQg1DvKDFuL2uEMObZtZOk6kW6GShi - iVk7itN4d6Mb8iiJEmZrGacbIejHSPtwclA6h3HKCbx6kVg9j9WsUIxAjKMEdRuc78jBsL++W/xMdqiM - 0okWTJDUR4V1p6TurjLuAEKShmhKrErcx2W+IxzHGtVynFwLzsE4SddL0fbTdFMM0zGB66LA+5wwsIBQ - N+XRpuSO16cOP/zDBxv/+naNf0sR/PFv4rM//89r01uuiYua1FFBYIXtBCm8n+XYz7KvMK0HGJYlomEO - rZlGq0ZxilGK1puJDmYTG4vZwNacqWl50TdyWB2Z5thGqNWtMJ47A2bZVlyfh3KWk2rykNqdpdXbSgL5 - hDFa1ThZN8cwLTLMS0wLyLLoPmIwA5cqZiWKmS0V3G6UpBcj70FK+pHScZx6CqeZwqgXKMYZICWMvA0m - 8BYSud/Yy3kyMwChdKBE40T1Ia7ttNzfVynqggpXhPVnDI1HZN5jEu8hjv0Yw3KUYlok6UaJ2h6iqo+o - nqYbgVu8Ig5c5nunK2XxbPIwV3+1c+Lj935+7/ZdsD676Pjoyv2ju1wgHt0L+eyC4L/8+X9am16w9p7T - NK3yPQfZzhWmY4lSu0ytPUC3gNp8kFq7gNWNwWUjaMkIQRYrIHozkJF8cjifNsGyXrR3rlU3zvLskyzT - IE4WzcO591S4c5GuUry9AF29s0S3pdCTh+lEi0Yomsl0WhnnGTXz9JpUAcO5GdpUwIgW0hoh7GYovx0u - 6kJI+lFyIPkxvBbENJAhqaoXLQd/5Sskc5/Ioj+W4YXQOjHSUYJmmVkLDPYoStkG4QKIxzXhY3LfUbH7 - ENt2jGUFk/UcUTOCV3ZjZb0Y2QzVeBLURGn4LNsxXiZqzCL0UBTnY93vX37x3o3bYJS+ey/98wEf3dB8 - pEbA7N9cVf3sRud/APGCLnVa1XiI517leZYZ9gVyzSLFfIBeewjMoTTLIkE/gVQOIkQjeGlLGSOUg/Vm - oC1boYly4RFtA4A4L3BMsowTVG0XnBvKRtbvgzqLsI5CjGlPmW5roSMLAcbnQaJynKqbounnmeZltrW7 - QhjYgY7lUiOFtAYIK1HBbYUKAMQBtGIED168ZoxYNU03jRCrulDSNrgoUETlPJFFe2yvp4zWjpWBf7BE - N5+QeCdx2o5ywTK/7pjCf1TmPSpyH2JajzAth6imOWLVME7Rg5L2oeVA+6BWXpGFTrPqB4o4kQxML1l1 - 1JV8denY7T9/BKYXkM3pi6cPP/Pg/58ggjp4WhkDEFfY9XOU2jmSCXBcptaAdD5Aq10iGWewmgG4cBAr - 6UbwkxB6IAtvehrizMCN0GpW5L55Yd04Qz9BrRrCyxsLCI69FfUFaMDRsg+q31Zcu7sc9OIujHiQoBoh - ameZ5hWefQynSeXRY7mUWAmjsYwNILZU8Dqgwj6kbBin/leIw0RtJ1ICurO/mMb8RhblsQwXJA1xiKCZ - o5mOidwzJH1PpWiJazss9RyVeNaELtCUV2mWAxTTDLF6EKMEJwZAnKYYjvLqL8nDa0x7axbVtxPZT9Me - sDaebB/9zfd//OBO+gecpx+bf/Sg7ecQP+P4xSFOEWtOyCNHhL5Fum0B2BoiyAXjHEm/SDEClOneQqoe - QIi6YNz2Sk47jJsoZdfvRlm2wRpLOWMgPQV1Y/TqYYJqGC9vhtC92UhXPsZdhLPnIAzbQW8p8efjWhH8 - fpxiCK8GjXKZYwXS6K0QNeRSmgDBcm6ygttczmsr53fDxCCjAcRRgnaCoh/Aqdrh4maowFtEoT2eSfj6 - bgeE2oKVDj6CeETomqMY+2CSZY4NWEXQOsDUfJBiBrFCMc8QDf1IZQcMQFROkvWH+fUXFOEVam10J86x - FT7EMKxamlZC7d+9/MLGx7fS08u9e/8D4r9yfAQRwPyPIQLzvJ9df1TkBxBBVwFKnMZVT2A1UzgtQLlE - NS3TTKMYWWsZo6mI0lrBBq0gXECx74I7MzBtSMkMzzLBNAwTFCNEZR9a2AihegpxnkKsMw9Vswti2Fbs - ykYlYOx+onKQAIy0CRhgUKRG0arGHEoSwkkTrOC1lqWjs1LYA5cAiEBEw3gN6DatCBEwoc58IulruzFf - 22mDUJI4aT9BM/sI4izZ0AeVrHDtx8QeoLVj7LpDZPMBsnk/tXaGaOyFy9uh4l60coxSfVBQf0oZmiHo - PVuR9q2wYYbpqDV10NP60tLarT988DB9STX9SwvSSZ1uMI+Y/Ut8ltn/AcRBhGYQoT7AdQEZzlMtMyTj - OLZqCCEHMYHTLlCN+1m1c3R9F5QXLyQ3lVATIAdL6b4cnG0nNFJEHaZogRIBwTGSGmzbELxQKckLIOYg - QS4DJTr2wWPl9A60uBtMu2QdUBlAAIx0WyknVkhrKmU1l3HbKvgdlcIuqAhkNPgHYNuLkoNcBhATlTxr - Dhb7lR2IL2+rLSElAESiBij6iMg1ia8Cil7l14PJ7yi3/hjDvkoyHyBZ9lOsM0RTD0zRVi4EEIHlXhY6 - jij8g1h1/XakfTtqEFQDU/KQo+VM5+Sf3vtF+ibwvfSDUGmO6Ycq/ieIYPMfQ5yn2dpLhFNE0xzVMkUA - xsI0jtMNwmUDMOkISgl8xjK7dplbO0pQtpSxGgpIsUJyHMIIF5LrdkPd+9DtSCHgOExIQxwna3qx4ngF - 3V+Iq89GAIimHaX2ffBgCTkB5bYhRAN49SBONUM3HeDYh9CKhnxqYxEDQAQEgQz/NZ17ENIOuLgVLmxB - iBoruTX7kKgvb4d9eauxANeElQyQtPOsWtCLgZz7KsWHeA7QZI5yHUfo1kPEmv3E2kWKdZpo6oXJ28oF - PSjZEEU7L7IfUHm7cQrrDrh1B3KIYjymT6zWJg/4Wn/6/LcefnT34e37Dx/9GKJHb+L4nyE+4vh/Xpuu - 6FtHkFWA4wzZvMiwz9Nrp0iGEYxqACHrhYqH0YoFZs1nQ1s/RhbKwUfy8dFicqiA4M1GO/ZAG4rJQxQV - qIljJM0kVTdMUnZhRbFymjMLYd5VVrMTYt0LdedhE3BeO1rSh1MO4tSgb4ByNs8wgzqYLGG3QLiAYEeF - ACgRJHI/BpQFeUslv6mMk4IJImXM6j1Q9Fe2I76yXbUX2ogStpKFrRQh6MVAhuBk72dZj/Drj3IcR0BL - IZgWCTVzpFqghkGksh0IHC7oJ6tmJJYlrbuNINVuLjJurRwDg6A+uWZKLJij31o+vf6Hj9O31R9spN9Q - 9Aji/yLG/5DipqumjsMCX2+lvB+mXGLWzQGIZOMoXtMH5FDO70VIZhmmGbpxnmUewqvixbRIHt6fgwnm - 4wL5OE82KpSPByk8StIARz1OqhojawcJ8hY4J1SIr8uEW/ZU1O6psGchImX0ZoSgB5tuL2MkHYC4wKwd - wCjbK4VtZbwuUA2h4n6EbAir6scogD0EpqepgpuACQIlNM2OMpDOKS69RcBpFfITPG6LWNQqkTTxuHEu - +wC3DmR02pCBlgIgEmtmSeZJvGEQqWiv4HYgeH1UxZjENK2ti+F4om/ss2YgwYBwQh07rmtcrg691L94 - 4/3fpx+gAMVwI33b/VE7+Z8Jpj/+P61NJ6QRYLbHsNWdEPEC3TZLq52m1oDBsxchTZWwQb0HRWqeaVnm - 1oGO2YUQNpWAFowK5GPDRYRgAc6bhQoXEEYIAGL1KF4LxDhKVvViRIkKhr8Ab8+EGYEeMyoCJZQEjN+N - lQMlgoSdJOhmqIYpmhHkb1qDFULQZ4dQCmBxgFsEOdgKEyah/CYY351PlD1TGBRg/CJMQEYMK2kBOS2u - E8Q0goicG5Vza/BwQd5eWWF+LRwTJvPamIpummoSrxtEyjor2B1Ibi9dOizRjeusfiyD9vVtjjzsgqj+ - uDxyVtd0WBc5H+n702vvPfwkfXsdQASu+zOO/+8gzlOsZ1SNKxznCLoKxBTZNEMzA5vWj1YkipixAhoo - WLP02v28evCahwgqkCCBPKwnGxnIxwC5OffCnBmwXqRshKAdxmoB/TGyepAg60DxoxCqIxtp2AXR74K4 - Cwgx8JLQ0j6schCrGsWqJ4k6UNrAGQKlsLNC8BlEoEQAEfi7FpggCROAgujmI+uEsFpRhVEMqVFCbdUY - u57gs3FDNlGTS9Pi1nvUXLuI5pFwI3Jpp8E0XFPXKzdOErSDCPBlmZ1IZi9D1C9VDVebnFgS4etP2fJQ - iyL7SXnosj55XBdZrW38xcnnN/5662H6JuDGHWAY/z9AnCXVHhMFz6jTHNtKhQDEJNU0w6gBXjcF4YSy - iaD8D2A0cwzrNB18Ut2LlUSLiM7MSncWzJeLcu6FOnZXNhXRQTcYwlSBejdGVI4QFb04MXA2ngIckGH1 - zlLrPkSgmJqCC7pRMlD4xvFaYJUXmOZJ4AfRiu5KIai/g0g52AfRAROlKvlAuV4BwSFGmWWVWlmxTJYn - URcIVPkGB84VEYbjmvbO+u5Ob1eLuyfp7ow4Bht9C52pAx1ti41NI2bXIELYXcnoQjN6WfweqbRbq3Hj - KJTHtpgyK2a4pjOK0LO6xHFVcF7pfmvi8J1f//UziI9Gl0ft+H+BCOLfX2mIy0zHaVXshDLah1B1Q6VD - OC1Q4gTN0AEXBXNJvkxcvJA9RtTPsaxjlKoBvCxRQfflIpyZ5fV7Kzz7EK69cM9uRHMpdxhbBYrpGEEx - SlQMEOVtGGG4jGrPRZr2VpoyoJ4CIihzoO2CFB7HaQBE4HXmGGYgyX64FCgxDRGlAIjbQEEs5zRV8jxC - kl2K1snLRNIcjjKTZ8yjVWcbYzRXp8LfrU8Ou1uG/Il2ZyLlaG/xDHRHJgZTK5N9x2cnTk5MHEx1jdf4 - u9C0Xja3SyLq0WrdZAr1yS2WXPgkW39J23BdlzilCM6JHc+2jH/yo1+nLy+mCf4LRMDm3xJMf/zvrk3j - mGpgCA7xPSdVDUucus5KcTdcAgrcNMPUi1FE8ymePSjvHuwARg1G/WmGYZio6ERwG0tInn0w+y4IyGt3 - FtK0pTRUSO3Bq/vxwHUrRknKIbKyEy+JQzneQqItG2Xdh/QBb1TOSY/JcDHwN+mrDGTTIqtunmYZQWv7 - 4YpBpGoIpRpAqVrTrZndWMmqZ+GsYpRWXsaXZVGUO0nVGdTaPFUj0T+mt3SowsOOxmFfqLM+0eVOtru6 - ByNDk6m5pYHV1Znjh5bOLCwfbOnvRPP6mZJeqbRDI/eQyILdOaJt+wIVlGMa7zVD8rwyviLxnQ/2f/Dm - +xsf3dq4d9ciQaTfjvzoNlb6qWAQ6Xczpq+AA4yP3pm+fv/hfVBB02/Q+xe0m8ax1aAUTpNMy2z7AUH9 - FNXQCQVDnmiSVg1011RMq99eCSJRzJxlmabphiHQYTGyDjC35ODcmUjQgmsz4frd5bq9lXWl5CY0v58g - Hyap+vCKLqysHS2NlXPcOYT6fVhvHrGhhNEM5XUhxX0YKaiM48SaOYp9meGaI9cNwXU95dJeqKy9TNQG - CiKUXVVYokOU6pllVfJSoTKbrNxBNWUyHUWiEMoKyl6LrL6rJjToiQ36ox2OSIu1eyo+frB3fHVw9ujk - zNLEwuTkUvdIjzHURDH0kGo7NRIPjWyAwEQ7c8II5iy/5rQyeFrSdFDsPaIK/ezIlQcf3IxYiPV1WFcN - sUUvurF+76O7N26v376ffiDkzo0bNwHFOw/ufbp+49bGzU83Pr67ATw6kOwjiDMk0whaM4xWT5H0y2wr - GAbSrRklAQGMSx9a4t+LND5R4MlADeAVM0zjGFEzTlD3ISTJYnool+DMQlv2IXQZFeqM8uo8pK+c2o4R - 9hMVYM7rJaSjDSltKGV7swj+HEK4EMzLrDa4oBMtBC14EKWdJJgW6HWL9PoxrL4PpuxHgJB3YsXRCkoU - QeJm7xAj9yoE+SJlNlWxnWfNo5iy6JZieZCiCXOtSZ2vyxHucUU7HfEed/9iy9jR/t4D3QMHBgbnBzu7 - 2kdb+gbqUu1c5xDNMy62JRliL4Ul2pPthOAX5HUXqqJHxK7DMv8RTeiFyGC/QdDkYHgdxKCD0efUrNpc - oEiCAebe/Vvpt789+t1md9N3/e/e2Pj0k/sf3lm/8cgRPYK4QKsdw1b1w+VDKCUoTwDiEtc2hFe2VXAH - cYpxCmgvdO1jOdVPFYJBZYZtGqfqJshVQI8dUH68GBRHfF022rgXpt1TrtpTVpuDjFbQWzGiboKiN81R - 0YWRtUD5DYW0YA4xkIOPFlFTUG47GnQYcR9KPorTz5KtS0znLMU2iKjqrpD0wKR9OEULgpfEcW1QpLQ0 - U8rJEsn2UaVb6VW7cYrtOHmGop6gctBtEU19oymQsqV6fb1TTYMrHT3LbcmpRMNgLNweTTWnhpJ9E97e - cXVqWdR6XNA1zLWESaIGmly9pyiFFV3wtB4QOfaLPaumhqNq17BB1mLjhWrpDWbusFV/2O5P/3699Ps6 - Hmyknw9OvxH4zt103/5s3b73afpnTjxaaYjTJOMoVgtGFFDdx4ArZNVOUHVdcGE3QgTmOdBJTFtLFY9n - O/YiJrk147TqcUrVIFbRixC3lLEjBWR3DtaehTLuhWp2lmp3Qay5qGAFvQUn6aEo+4iKHqwU8ALEGwsp - /mxsMI8Qr2C1YcU9BGkPSjKAVE/gjfN0+wKjbhRXPYTVjRB0w/iqYUp1P1EbKidVFRUZiFA6fStTsIsh - 3UPg7yDwMhQGdI2D7/CqtUZeQ6p+bK5t+mD/4FJH80RjbCiaGEo0dSZS8WRvqGPWO3TENnFaN3mcN7DK - 6FjmtEzRG5Z5LZ3kqiWR46QwfoDtv9o0viAyTOirOmtlcaOwUSOcstovx7rXAbubj97d8clnrP7dtWme - al6g185Sa0Yw6q5yAfDY6StRYIAjqADHLrhgkKjwFOCVT+drny4Y4xhHaFWjZG0/WtqPknYCI1LCCOYR - PTlYRxbauLtCtb1YtRtSm49pQHF7qMpBmnqQrBwC2Y2RtlawooXEQAGxoYzRAiBSZD14YS9KOoKtnqFY - 9nM8i2znJM06jjcOwDSgOPbAZG1QUSdVMeX2cWl7BdwCAa+EwyrkMou1CnxHk6OjyV1vVcVidZNznbMr - fZ0jsXhPoLE7mOyONbc2dTe19Xna93vHL/kOXTHtvyCZPi4aWeb3TFBT84z2U9KxC7KJ0+LkIt11UhQ7 - ovTNVlkHjcZhu33c4Tmb6PvJwXNvjR1adsb7q+2fo/r316Y5Ss0iw7LItE6TwagkBwMs4AjSGRTEAay0 - HcpNlDFicI5udznvK3sGmdUDVM0wqJUo6TBG0Y+UAI7xQioojiCv7fuQ4J/JdpWo95Y5IcRmvKiXLB8k - yYeIsn6MuBspSFUyIxBqpIzWhOK3kYW9bH43KKAo1TjBAJQ4y7Quy/3zTMcotroXruiDK4BPaEMKYiSW - il+iEaB0ApJDIRgK+68uzF9fWLi2tHBuYfrI3OjSTN/UdGf/SCLV4W/uCA0NdsyPjS32TM5HxlbqJ05b - ly5WLV6Uz1/W71/TTs2yOo5Jx46LR8/KJs5Khi8qBy9qu49rEzMK17TJfzzed6l79lvzJ39x/voLs4tz - sYbOOstkquFzWv/OSkOcp9UCiAuM9L3aHrgEjBAgkQHHCaoWvHLHHmgTRmjMhlM3bellaPsp6pG0EmVj - ePUIGD+Q0uYSZjSXGM4lurMw5iyEKrNCuqvIkAMLQWkpNLsdxelEczqBMHHCDqwgDmOFyqlhKCuF5XUR - hF0EQQ9akq6MVOtBgX/NmFrkeabJlgGktuuR2WpFC6JY+rjPbRZSYqbqI139Pzh+8f3DF35+9NKv1p79 - 1cmr7x0//9z+5ZWJgc6WUGuzf7i/+cTK4sWVIwfbp+ecgzNVvcvSgYPcoTXhxEntzJp2fFU68FL96pp8 - +LhyZJLWdFTWc0Ld1YOumRT7Dzu7Xxw8+mzf4W8duPCd02efOzR7dKpzvDO4ONHy7jvPv/fDNz9n9r+t - dE0EGT1Pr52j1cxSjcDi9KFkoNi1VXB6UaIelCgFY1tz0aZ8NOuruxNY0SBdB8zgAEY+gJQOPQrAEegx - VcqMFpA9JWR9PlqVWSbdll+bC181+xug5A4Ct4PA66FI+unKXpoqhROGILQWgqiLJB6hVw8TdQNo9QTR - OEk0DyCV8yLXArt+DK8fxIG6oe/ESRNCaSNH1F1nvTIxCwj+9uyLvz/x/D8de/4PK8/++cD13x269v7h - iz959oUXjh1dW5x+/tzJNy9fOTO1f8ie6lPGF7WDy6LBKULbEKphlBKbZMSWeMkDktZRZrgZa2+A14xy - oxOccAyiXqluPReZuTZw4ur4+ddWz19amTmx1Lu2v3N6MnzgUNt33rvUP5FIdca+873v3rp173N4/7I2 - LdItQIkA4jy9Zo5mAhBH8Brgbzphgg4orxPOb0Py64vwNfkY+pd2xJC8AZq2n6BMu0VAECEdfsSxDyYC - HAH6QAnVVcEw5WO0GaWTWttyjauXK0sQmY1oWhLPasJxUnhBF13TCOc14yVdVOkATT5IVINOMk2pBRxn - 6fZDqsgC1zXHrBun106IrAksH/y/Jpyub+0/8rNTz/32zEu/P/HiL5cu/Gr27O9mL356+NU/r1z/2dL5 - X5976dcvvfnW+YvvXH3+1VMXllJDHdrwsDJ11DR9SDo+jGpqLbc3lVUFc/iu3ZR4pSyCUZnLeTaEJMGw - tNOsXRTLuCx0yDt4onP/as/ics9AV9Q21FHX32VONCvaB4xv/GBNWUuusove/sEbf/ngL5/De7Q2bmxs - WmJYF+iWBYZlnm7+DCKIMbK2Dy1tr+QBPXYg+cFyur2EQN20NQJl9VM0gwTVME4xhJINA4hwySBCMoCQ - 9CHT1rIdLUmgxf5KhjkXLt2a3SVQLtpdLXyRBQINYMkNRE4Uw24lyxMYSQIraKUIBoXSfjIw59WLrPoF - Vv0UxTKE1szyHIt81yF9rJUoDJEpw/qaHx48+ePVC788cu23h5//6fTZt9rmvtO2+F77wZ90H/tR75Ef - jR//+eqldw+fvzq98tKBk8/OH52P9g8bm8eUrTOi7kVO3zSpdQDjaSqTG54qq91e0UQQBZkiE5VtovDq - KRIvWtCIl/vRwpTc2uaINHtCoVqdXoRxmshhP9vhwvkSzLkTEY0TXxsRvfz9C9/83vXL107/4y9+dO/m - xxuP3huwaT8r/cTIZzURiHGKogcQQXcGNRFURgAxVcGMITg+KIP5DzuiACJZPYBXDmHkIIuHEZIhmLgf - JhqAi8GH6RzHq7uxyma0KAJnynfknGxMjlttHhpFlJOlLirx4KgBDDOC4sbg/Fa6oonIATneQxEPE6vm - mXVzLNt+RWCKapnjOqZZth66sonBHq+ueb5r+E+nXvjtked/sXj5Z1PnfjBw9Hvtyz9oX/lJx5HvNMy/ - GZ15pWHi3ZGjbwweWGvofa5/6erAwWMNE8vW/glxyxgtMUNpm8I3D2NCXRhzoITegGIkeGK/VGhV8hwa - iZ3DMVagpHtyVYUQFQat4NO9dkPYqnZoqCYF3G3DW6zQtgFZ51SVsr5S7cW2L7j690eHl5ve+fFzH9/8 - 5fr6h+v3b286wHEsA44s2yIT6NEMII6TdECJoDsDjp0wfryE2oTkgVcu+GpGHM4dIKv7MTLQlwfBCAwT - D0JF/SDg4gHUI4ho+TAWTNDKJIpnKYKFmOylaGgq7JFXliI3b+Zn5ZkhaD+M0QDltpBkESyzj6kcZQLh - G+fotlVx8HhNy5LAt6ppcODQAQpp3lb33anF746v/PX0ax+eeP13S9d+P//s72cu/Wb09K/6T/ysa+29 - xMobwamXPMPfaV687O07am0+6ug87R0+5Ro9ZhyaYiSGUZEpdHIG1TKOjs8IGxNUdYwpinBFLh7frZXF - 7YaIVuak4Q3QIg2q0CDG1Np41hpRqFYeMQsNogqHAWkxliebOdEWlsSUzzXmuTr4DWPa2HjV6DHfe7+9 - cGv9l5/e+e2mg9z6FU7dfk7dEguI0TxNM4KxDxAEMUJU96LEqXJmI4wThrPFj+1LIvgDRFUvUgKKYH+l - cKBS2A8VppWYvvUuS084OM0EWgO6didekqDznWTypcmhoVB9VCdHbt+CfPIp7rYsUw7CkY0Fc04UwZ7S - 2oeYqiGydppeO021TtBMq6b4xYYRCxUxbDO8Mj76Yt/IlaaBH06e+sX0xX+cuvTnpev/vHjtlwNrP2g7 - 9OP2Y99tXPpuw8LboZlXXMOnq5LTzPoRsm2eFz4gbk77amzjSHloHNIwVZYYh8ZmhDE3StDEVweIoiBe - GaXp29V1KXVVSECrJZVq6fl6Pdzh59lMXI9WENTxavgwi7SyXocIOUjhAMNShza5salRXeusvvdwbe8R - 09m3ej688+0P735/0yGeE4hxhV23zLIuPcroGapxnKQdBfWeoBrAyrrQwmg5I1BGk3w9sxkJ5mJlN1zU - DRX0VPB7KgR9ACJSMoCRAdmOEDVTxOopTNUUSddHUjRReOqi4i6LfrE12uYwUHMzEE8+gfnKk/Kt+f48 - Qn0Wqr4IE8cxR+XqQbpqmm9vpUm7iao2mlTBKrEKUPtTvu8dPXC9f+RsQ/eVhpG3Ow7+sG/tx/1r73cd - +kHHyjdjM++0HvpWbOHdxIHvNyy9E5xfYXo7i5QjcMs8KTCHD89hYrOIxonSyFhBaCQvOFDqboUbvOWc - JoqqEa1uQ1q70O5uujfGqqpGITT4Ir2wVFMFsdgpzmpeQCM1MjB6aqWNh7RyYS45Pmrmhe2CWEjRO2Dr - GDbE+kXN0/Klc/4/fvTC+78+t+mkJHSI41xhph9imqcYQcyS9JOEtJpAevahJd1oUQrO8xYQhV/a0wTl - gJrYgRS1VHA/mwu74KIulKQXJwcKHQL6JeuBcx7Ga1MwbgLHDWBJhxujp3paAxKOtLwY++STzKd2uPNR - kRJyqJTsKsZ64fh2In9aa5tXu9p5arowVyApEHPzdPxyt5y8kow8Pzz+2tDSteTk9djk93oP/6D38FuJ - 6e+2LX2748BPhs886xw8a+w4V9U6S6hrzhYFn6HPoT0HKLFZZHgZk5iHNY0VhgZzXD2ZlvaC6kAuO1DK - TiKVbTDjAMIzgA61450hsroah5NgCzSsYgU9r5pRFpXwO3RGD4vjZTPDfLafTW2UCBMKZave0FNvH457 - e5I2v5cbiLJGZ+wrx2KxLummE+LgEa77IIBIr10gGeZJhhmCbhynAgMJGEuAT+xECcHYECgkib+0J17J - 7iWr2gDW9C1Q8Hlh+oYyTtZPUg1RtUPUqn6Cth+rnWCYR+nVPVSZuxwdpdHGrKZLwz37G8OKoiL53rxw - BakdGG+iNIHh15VgkmROL13ZShV5+Awydy9bnCOTFim5RXxkloWO2x+OvX/o/HcnTrzWsfyTyTN/OXD9 - j4uXvt+3eiU0PKcI9FNr+wg1beWaxmxRYBvT9zRjoLh2Edcwi4guopLTFY19uc72rOpkprixgOPKxsUr - ee1QTQ/EMo1unMA3JdFWL0lWTcAIUDlSTI4Gme8mYHoEmgGBtZdj72TVttB0LXTNkLSulWHsE7nHdA2z - zuZxT9SvkKRc1aE6qYRfxhTmbDoi8BwTeADERbJpkWycBfmI045iFIOAIELcCRe0I3itKGGohCr5ckas - nNmJl7WghAkYtxkBLKSwCyvtJShAt0k3HBKYlHVDJEMfUCKUF4fSkwRWm0B0bah/NujycRkaCESZXWDM - LI1j2Ekcv52iiKOFMSonRqXGGDQmPYPNzlKryjWyMhm7UEos0pNQC6HoT45d/tmBZ3+2ePn9qdPv9K28 - 3jxxxd87LqofFztnZYFRjnOc6U6Wqn07uZ5nOPE9qtFK7zQyNl7ZMFgaaC+qaSoRRiCkYDnWW4puqmS3 - lSq7c8xLmOYpfMJbqtSXkzkleTxolhZfasdhmunKBXlkiOzvwwSnGalJanSCHBjE1fei60co0XF2akKY - WjH3DihC/aaAT65loyuI+Nx0YwEcDzBs80Q9gAgITmDUwyhZH1zcBRO0Q3mtMA6AGCmjS7+WGYHQWzFi - 0F6AJJMwXgucD5QIOLaDBIfzU5XcZAW/uULcjpA2Q3mNlbQYmlqdVzjnrp/02FebG+NSkRND8CNIvnJC - DM1uJkrjaFGcwndRMHZaBY+1T8DMlvOKJcwCHn4fo2K3joQ4OzD44+OXvjNz/Aezp98ePHitcfBKoOtM - XfOaObGkjUxKvAOs+kGWuxVVY9/BjuXr+uHuCWzDNCE1jk72Vnpb0VUtbF4jhxCiIsNYTGMlvSlHmNyl - bd1bG9yrUe8gMHcVkPbukkALTViEA0Hrpbv2y/uHSK1tlQ2L7MFRVLSn2NFbUjcKDU6jEmOIxkFkaIwc - HaAGu3nBlNwfqrL3tzRtWk6/lcuxTLPMEfUgnSexmjFUeiLugQk7oPy2Sm4zlJ2E8yLlDNljWaFSapog - lNNQxgAc03qE8RIV7IYiaiiPGAQTdAGtsZSTSl/fZ8QqKKFKvHzX3iGj/mA8PGAzOWlkTVFxXTkyiqRG - kcwoktMA4yWJkiiNFaISXAwsl5nJoe5l4HZT4TsYlbt5lTlrfR0/OHXm7aUjrwwtXOsYf75l9FR9Ylnt - HuXUdBC1CYw6ga1OEcxJtNmdI2uG2UfJDUOYyAi2cQDR0IlwdvI1nTWclIkQlSLjbEIMTk3kipIZWu9m - mekZJm9zBfbJPYTtOyWFJcZSjKtU2EsIjVI7hshdjSW+MVprKEeTKNC3FtQMlQWmoM0jZdFRqH8K7xxA - mkYo4TFZx8n21XeefX3TIsOyQDUvUMzzpHQuAxmOoJTAsnTDhECGLZWcFJQN+km4nC7/Rra/hBKHcRvK - mYEicriUFoXQG0powXyiJxMNIphLiEM4LTBxspznz8UFi/HeEpStpKJHpZzz1c/4na1VSgsaWY/AuCpQ - 7gJkGM6MowQJrDhG4vpZ5MGAhUHfxaDupmC3UdHbOdhMMb6grb7qUGdirbNtKdww4/CNmhzdUl0HS9lM - ACVVGgbfi2RIkmobkMZGhLkT7+3C+DqhniFMwxQ1NcT09ldVdTpZLXWkkATWLKQ1whmDyNoZQritss6a - x1fk4Tn7SkhbMyR7y2qyyMECdR860o1qTMECHYRgJ9nhKmC5cpihPFlLSV1/eVNvSXQMHhxFmnpK5MuE - 5BHx6KJ+6Ezv6iYwNU8SqmdIxgWKaRpfNQ4gopUDSGk3HEDktgAZQtkNlUxgcWRP5npLyA1QdghCc+fh - vfkEfwHRn4d3ZaKcexC+LGy8lNGGELehpCmoIJCLa4BQ6nOh3kpMlEZfCnpmA66ESqytKDHDYfVwRARF - 9ZQS/RBqpJLdhBcmBeIUV2gjoCjU7QT8M0TsFgZxt0GGcFZRrWK8R850i5huPisklwRlkqhE5iGxg2Qh - mNgaSFUpmiWEqI7ATXG4LVVR117unCQ2TVObRjnufo2m3cRsUGL8THgjldqOkc8zQ8uC5j66v7aCpyon - yCFozp5SYza5qaKqrdQ6iAy3VrqbYDX93LokTVRfATPnl9lyiIF8TaLY014aHoCFhpHOUahjGdt8kNk3 - KWgbqWndNM+wTJOMUwT9BK5qDKMeRasGkfI+uKgDVMNyVrKcES+nB0opXghV+lSeJQsJxmdvEakuC2XN - gNkz4PUZiLrdMFcGMlpIaYPxOzGyNrQsUcEN5RMiRcRAMTqCIMao9KEaQ5dReyARcTFJwtxMJxFbD0P7 - IfhgISlSwYyD6RXHAfoa1lqr8RVY7NMI5GM43Ga1rEyvgHEImSxkhhhXIMGX8vGlUgaiikcysMhmKtWK - Z3hIojBJE8boGhCmNoyztdLRXGRpzq3tLQetoK6Xp40zGSES3gvFgN7YhzSNEnzdRFcQX6WGkgXlCAUU - b4DQA2XKfoynB+LqLHW2lNU2IeQJEivBQTbyyp3oPEtxuQ8iTlTWt1eGBjGxMVx0HBVZJLfOMtuGRE19 - xqZN09SaKbJxmmiYxOumidUA4gBC1lnJby5jNZWCAkeNQqieIqIbQpE/U2DYCw1WMOrysJa9cNOOcvPO - CkcG3LkX6c/GJctYnQhRJ1rajBA3lrGiRaRoETEGIUThRCcUFaTRliL+9hpNFbpcDSvkZe+sx2O9lcQo - hBKGUHzl5BiG3U5TdrKqpmqtLRalnFJoIEBr2WiRMI9C3I5HbKaid1BQu0nEbCwhi0zM55LLpWSEjoy3 - kOg+iiRCVPvLFeESbQpS21XmmMY2LJMSs6TAAN7YVM5NQoWNufzWHPU41NdR5qgvlCshZGZFORNersaT - DWVMd4EiWWTtKfX2VfhTJfpYJSdJI3TKKzs1JQlhsRNZ2oAWdeCd/bjYMKFxEBvurnRP01Pzys7BqkTS - 4N80iteNAg2CwGom8VUjGNUQKu0QgZduruDESmihYqI9D1NXTJBsztNlVHggFGs2ypwBNW6DAIjufWhQ - ExtL6O1wQS9G2oYSx6G8GITZUEJpKqEkKqiNCGoARWgRi+dDniG3pbdeL6nMsZBh+spyL4zQiue3EyQx - DCuKZMWwPB+MNGWzD9Yah1WmQaV5xZuIUDkODp5C2Q6HPY7GbilBPFmG3Yaj5+KJOVxmuYZH0DNJZiLN - RRBYihkBiCKUr2qFWCfQkWViYh4dHi6zd+frhkotE8XuyYLQTEWio8JjKBRgsvMhRTvg0L1sRIUoB1O9 - ixXaVzOKbpmj9gzjgn1kXTMF1yEqG9JVtInLQ3hYGMFqQZv6cP4hfHiIFO4nBXvowUFlPKHy1sn1m0Zw - VUMYTT9c3lUm6Cjh9lZ+9pCgaoio7sJI4xVMXyHeko0056O5j+1Vbi92lpBqs5HGPZX67RDLHliaIITR - CuP3YGV9WHkrUhSrYMfKGEDFKRDl1BiU7INiqouKzFjYkNs80VBHyX3GzkHJ8vMMuWWNWFYCz+ukqyKV - tDiG5y7HD2h0Cy53v1zfTJf2MTRdVFUKx0/gBGEStxaKE8BKirCbYbQ9pZgtWGq2UIiQ8zAMaLEGR6yG - kt1ouTVf0IKqG8aHp7DRkVLXaImje59hvjI0X9I4k5ecLGtuhNQJcgh5mVt3FXwtt/xJFDSHV4wwFHIa - K+vGqd2LnIlxcls/sS6JoSZJld0CRCeX0ExmxxHSDqR1AOMbJPgGGIEhSXRYFx+0JhtNbpNSuWmWaZmm - mEax2q5yYUsRq7mQ2VzCbivjgMEuVcFpLGOA+ay+CF9biKV/Zadoc66tEGfcC6vaVmLYWebMwTaWMYFD - 7EJL+rHyRxCFjVBOvIKVLGMAiAkIOVKCc5ci6uDwWa9jLGiP6flgLkbs/pKDhGuk8f2VpDiW20KWNWFF - bVgR6LmdHPl4Te2wxtTLqhoQ6iMoegBK8JfgIghWAiNKEaReIg1C3JqPfqKSshPPzQMo0egsBq5MRiSo - 0FR5CdmF1gSg1YnK2l6oow9ij+yULBCj/SX1fcWe1lKnvVhJLYbuLXhqS/mXsnFPQlEZHESFEUn3ItWt - +HAvrq0DGu9Ceodplg68oIsk6CTJpkWBYUqwo9LTB/P3430JSu2cp+tAy1izLWBWqHQayaYlnmORUzdL - M4/htKCltBSzGvOooSycNwPl2Yf25eGCJSQXhGwrJTK/vof/ZJYxC67ZUareUmTNhAOXAwi2p+8iSPow - sh60tAUhABAby9NKTBRT4kWEUAHGWQTVZOeakBVRDa/Xb2iul6Oyv26lYlwofARFi6BYERQ7RZS1CZTN - KEH6MUaSsg0v7eXoOqiKKIEJqkEDmu6FkIBDiEI5CYJoqNaGYWeTxflUeTFRlI+gZkIQu0rL9pTk7YFl - 51Lz4dwcnLFMFEIb3MWyMETZT6/3l4h9EImjXKSEUIiVJbnQrU9XfDmT+HgJagsVky2CFahLkPUV6miF - J1bs68M0zLAaRymeHrRtiBg6rJiaoQ825flThe5+ZrRRXDvb3PPc2ukapYKAh4nktE0zjNqZ9GWomklS - 9QRR14eUdVQK4kW0QDbOCTpvBsyaAa3NRVlKCKxvZHKf2KfeBVFsLTTsrvAVkRIIXgdG0oESdyFE3Ugx - aCwpGK+hghWF0GLF5HghKVaA9+ejHYVQQ3Gpi0acjjnbXZpIDYdesTVhlvlIFGcl2lOIiiBZaYgUWR9d - 3U2Ut+Ek/bzqHpZ2RGDqp2kayKwAmhKGUkJF5GglC2g2SRb2e63OsJAkyMELc9C8nL3lj23L/8qegqcy - c7eUFGVBC0uIRUheKVkD5QSZhjqMSJwFV5ZgVXCCFItjEeFQbM42yON7MU8VYbcTyXvpyG3MgszqckZd - cZU31zxMTE6Qk+OkRKLQ2YdsOSpbXZMfG8b0Jsv8UYqtTqz0mPUNASdfQMHSKsl8xKZxQvUYvmqMUDWC - VQ9iFP1oWQ9K1A7jgZEjmE9wZEAN24qqdpXqc+H8LbmsJ/YKtuRKtxVYc1HRSkYzgIgSdiIEHXB+G5zf - DOPGK1nRcnq4lBoqIoUKgL3Cu/JRlgKorrCkqrK0Qc3tcqun22x8zE67FOMkERwIeBRNC8EYMRQ/CeN2 - oEXtFFknTdMvMIyJzZMSaw+rqp0sbyEr2nHSJigrUkYNQmkdHPVqsLWjvVaigtHERVRZSQF2y9aSr+5D - bt0H25YN3V2MKMzMzSwpKmISKBqWgFRQhtmXi8/NY8EqhBQ0kwKDwPfuLn16Z+Uz2ZjtCMpeHHYXqXyv - HIY2QfiuYm0fITxBTR4UDMVyPM2liQnqxJJoaZLVH0M769gqg0rA5eMobASJh8ByKmDUgk1TxOoxnGYY - o+yFS9oruM1lTOANUxXMRAWjoZTiy0Xb9lboM8q02ZXCXQXUJ/cwN2dKdhRYC9EAYrKS1VbJ7oBy26Hp - wSZeyWyooIPXCaZDfxHZnU905GEBbmM+tLq4XF6SH6/i9/urmmxso7gEUfx1SXG2i4RzwjGBcjIwcTEI - AwyRSTQ/rUqspIek6GZrejkG0FuSSH4nUd5NUbYRpU14PkjzOVOwXaAMK4U8QSlXWl5B3LOt+Kt7oE9m - Irfshm3JROzZU56RU5lTAi8qLcsryttbUZwFyduJqszBovKQ6Ozcsi27IU9uKX1sR/mTecjtEOROeOUu - MiSPXwTTl9KDcE0X0T3JbOlExZrKwvGKUCPc24SzOXBSg4IvVBLIQhheUAllFRUT92Ujtm6aJusBxIFH - tqYXLU1C6HEIDUQjhAZGjmAh3pWHrsmFa3OhnG3ZuMe20zbvFe0qqMlHBsso8TJ6M2jN5SwQiQpmQ/ln - BMmBYrK3kOjIxQMzZMpGqDNLJZm5vKwME6kyqKHa5YjumAJT8XUVtVBSlOUk4HxQUqiQFC4kN0HZ7ThJ - E4zThhWDaMGJ0hrEy7qIsg68FBDs5xnb8JI+TnUnRTGurp/WuUF34jKLyPT8vLJn9hQ/nln59M6yb+yu - fGZ35bZd5dt2lmzdXbAls3BbVsGWnPzNxWXbIdCdcNzeCvyevWXfeCpv09N5X84ofWp33hPZOU+VZD4D - 27uTWwipriC7sbImurWBaHdVGpyVWhdCWodl6egkBg+K5ZfgJOWV3IJcwu4d5U+A77hpgqQDBLthks8u - r/bgJB1oYTOM01jBiJSSfYW4+jyUMRcuzYLgHt9e/g9P4J/axduVr8uBukoIEWAGS6mpUnoKwgDcgXLD - pWTQiHyFRFcezp6Nrd2H1O+DqrMgxnJ4FbTcQIKmrGIRbo+aW1BR9CU6ZZuRUl6LRjbCGA3FZDC9xMqZ - rXhJG07UjhGn0II2giyJ4AGsIFoJkn6+sYMkbyeli2YfqwoodJBvXHHEvXS6k0kPsLkOGEFeWZ5V/LgU - UaEkoncWfSOrYltu5c59kK27ch/PyPtGbunTJfCtRHYBlpm9q/DrX9+1afO+r+ZAtmfnb83P3gbN20uF - lArKoNVYWj1L4uQqqvE8bglWBCVUkcgaKkYiRDOUCKIKipGXF7OzdiKe3l7+eBF+16ZxSvU0s2aOZ53l - WSbYxlFGVS9Z0YoTxRHsaCUtUEp0FeN0eTBuRmHFl58q+IevIp/awdqdp8qpsBdhfcWEhiJSUxGlqZga - L6FES8jBYqKvCOcuwDpzsbYsjHEfQrevUrUPIsrMExfkG8kIj4rKQuyQMnIUgnwo9EsCUmYjkd0MYyWh - rChovuX0BEbQjBO0E0Xjcns7ECBB0oGTNGNF7SRFM1o4wNP30NQg+phgZBYBkQ7xjf0c/YzRN6Gtb6GI - Axj6uMI+bw4EqBw9EV8O3wuBZRRV7Nyb/1ROyWYIchcUv5uvQqDp+7blfvXJPV/Khexk8wlyOZtHJYiI - ZDNHYmXKXDyti69V4ZiMSjSmtAwJK6FREFQqlCsjcXV0igqPlFQWs3NySLuLKZkYbvGm8+bkOUvqlKlx - v9w5zKhOIbiNUGYQjGKlJB+E6CklOEvx2gIYK7MQ8tWncv7hq7Cnd1D35EpzykwFSEce2p+Hi+QTYvnE - aD4hmI/zFmBdwNOACQc09CzUI4jQqny4CYrVwuGM/L01PHStDFuZ+2U2ZQ+VvJ1E3uLGY3pp8jYsvwnO - jkAZDUjusKxmyR5ZcSfG5NZxmW1UZR9TOboZml66aoBdnRCKOmjyFF7cRgVOSNJDVw9w9SDBQSMa5hh6 - 2No+rnHeElqxRy+0jZbmbi0t2FlUsL2gYAcUkU2gFbNEUJ2NiaTu3VnwD9uzvoTA5Pv91p62pvpqvRjH - kCFZZrLKJ7D6hDYlWkgrJ/EpXJFITOfS8Qw8Q8iUGlQMORfBwcB4cCgPkkPYmYV4ZtM5S3JB7OjCKYJF - FFsG3LyrzLCjVLutUANiRzoUOwokORBGVkHxY09l/sNXIE9twezIYGcWqHLKa7Khjix4+h0Z2ehANsqT - jXTlouoLUHV5KFsusjYHbcxG6bIRyqwKYWahrBTCLNhXJ6G1+LRCUp5Vh5dyCyWcAh4ty0qET1c5BkFH - 1tX76AwzBcFmZ7A5GWzuHhOpIi6QePA0JarCzCIlmfJxqXVMZWtjKDrx0m66cpCr7xCqRoSmCbGlj6vv - Zmk7WFWdJMWowDRT4z3TMSYkYGUMsoxLE3FJUgm52sRTG+k4Vn5uxRN7c79eVpYh5lHNWqWcxlIRefQ8 - nKiYVUe1pKpSfmmoimYK1DYmY93GGgebL9LoDQ6fv9pqE2pVTCWvkleaTdgJoWdvSlbyPNl46y64ZRfU - thdh3l1u2AXRbi9SbM4VP7WP+/Vd5C89Q9++D7d7X+HjQP5fyf3Gk2VbtuN3ZvL3FmgyIebMCkcm1LGn - 0r673Lan3Lqv0poLteUjrfmomhxQEBFVWYiqPJSqACrMK2LkZCJ2PWXiY1v9urhTXsWFSYiFMkoxF5dN - hm7Dl28mw7ciSx/n07O4tEwJP1+tgJhNaKMeLRdW1uppyUbDiMt+0JVI4cQJBL8FK2zC8ppJctC4+0CC - 83T9PMOQsKaNIO1laHvByMhQT1R7TjcPtbtC8Tp3wGKprVYq5EyFmk7nw+C4rMLCZ2CQTBqmkoVGcuA4 - JZZLz8bRMki1eEtEkuwwj8T0Pb2RhfHuY21Nk0adOxpujTd11HtCapOBq+ZCudAKTkkZM2eTYw/SmYkJ - FlJj5aw4jButoIcr6f5yiqMAY8qqVO0oYD2xG/H1Z0oefzr3sScyv/549pNPlWzdjti2m7xjn3BnnmZn - kQ5o9sls9RNZ2s15+t0ltflQezHaVoQxZMFVu8sVuysUGZXC3cW0bfuwW7ZBn368XkyfafH7Ndx+n0WN - q1BiymSYEk7FPhm+WEEqoZTt4KD3ymiF9TryUEvt/onITL/nyHjzC0dnrh2deu7o+KzX005WxGWSLrGm - kyBLwLkAIqiS7UzFgKRmWGCaUtVNKOzABg1LrCDNh8XmgZrQXGpkItnX29hi1VW5HTUyOUMowBORhWR4 - ER1ZRigtZpTB9VSJiayWlYlrCbagINFrmx0NHhmLn5zpvLg0fLU/dXB2+FRnasrpaHD7giQ2ni5nwwUV - eaQ9m3oJqgFKVS9J046VJlGCcBk1UEZxlxDswCTnIcw5MCA39OPb8r/6jcyvfH3P176e+cSTeZufKd28 - DbV5J+XpPZwn9/IfzxB9fY/8yazqnSXWAqQTSqgrx5vyEcpdpYLN+YLNhcKtJYynshBffhr7xDb05s3C - krwWo3o64pmL+CMSoQoKUVQW6wlwLabcwsJJEQVKbHHUIFjqDh0eblrpj56caL0+P3qqr/3SeN/p4fbj - g6m1sdY5j2fO7RlSm7ppyh6KspUkB536WLi9USiphkMbsJxmlnKAbwBjz1qs57VDp/Z7u4/2rBweWO4M - JLsbky6zyaKVW5UiAQ5JKMnH5ueh9+Vxy/EyGFdYwnMwXC26vn77wnjw+HT8wmL784cG3zg0/Ppi//Xh - lmNdibnW5kGZVslRsWHsMggzd9Oq2j/KMCRhglAxNVBEdmQhbPvgpj3lup0lut0l1RkQ1Z5i0I5hW3Zl - fvWxrf/wD5u/9KWtX/5KxlcfK/zqE5VfeRr/1W2sx3aLn87W7YHYCzFOKKkOhjcWw+W7i1lPZNK+uof5 - 9WzOE3mcp/JYm7O523M4u7NlhcUJuXQxFHBSKCtRMIqK5CVFZhyKl7vXTEC1GVTjfvvx/pbz412rnQ3L - LcEzQ+3nezsWfO7VxvDBxsBCuH4+5llM+GZ89fsbg1P1jm6O+kC4ebDaEqMJFfRKgxAnI1dUlUKbGNI4 - W9FVZV90dD43fuJ09/Gp4OhUw/B0aiSkr68VyCNGs19XzYbDKzP2wvZkVe7OYRYR+KUcJ9cTlqWSuqG+ - +oMT0fPT8atLLa/PN78+Frs6nroy1npmoHW/yx0gcwg4HhItLt3kycDYd8Acu5GuLIwrB+vOw3oKcK58 - rCMf7SrCukvx9hKsphRFzi7If+qZPV9/bPtjj+18/PHspzaXb9mB37aXuytfta/ckI+wFGPryok1pUh5 - ViF/Zzb9yd3kr+4AEHlPFkq3lmkzEKY8rDarUpNTriussCPQKbF40e8ftlhiQkGAxeBnZ7RqFUO2mivD - vVcnBs8PdR5uja0kQstNgbmIa9JhGbcaO7XyHoOyXSfuMEpmAraVuG9/0ruQ8A4HLfVSWi2fYBdTHXKm - XcaoZuCpRbk+uarD7m9W1A5a42d7Tz8/cS3KD835J071HolrA2aa0isz9niiLQ6fisIiFpZjsku5lTQd - WWvnOi0sr1uUbK6Z7nMd7XEeGw1cWWp+faIh/ctAhxrOz3RebksMy6tUHBWDKIFu6scqB/HqDoQkWclt - gnL8BXgfmFLAtJcJrd1bYdhVKt+ax9mdj9i6O+/xp/Ke2Zq7c2ferp2lezKw2fnsgjJZEbSqCFGdD1ft - K5PsLmRvzSQ9uYX4jS3kx3cwn8qU7SjT78PU5hLNuQRLHtEJoYYxHC+cbIHAQ1TGWipuJ2ECXMaRVMNq - MnKqKwXiaEvscHN0tTlyKBUGcaQ1drIrsT/quTba8+xw+6uLQ8+Ot18cSZ7qa5gJWkY9ht46VbdNbWaj - q0iVRgbazCNqGTgtlcgsLbOwJA5O1ZivpzfaNd86N+IfMuL1yw1zz09enguOSyBsBZzrlZqDWls1U0Iu - gePyoUIMx8QzOWVetzQSULU2mUbbrHOttXMdtv3D/lPDgTOD/jODobND0dMjrUfdnhBLSGMqyJsOSd3D - RG0Cwo6V0Jsq2c1IXhLJjZbTgGGuy4bXZJQrtxVQn9lb+JUndm76hz1ff3zP00/teurJfZs35z31TPHj - m6Ffewb99a34r2/DfWUL+h+exj+2hb51F3v7XuGufHVWZW0RyVnG8lXw/OU8TzHDX8b0QMimrArl9mzx - zgxxXsaY23S2H2RI5w9OH3hhdqjfpjuU/h0DrS/ND7+8MHJ1sveF2cFvH5l/89Dkt45Mv7w8cGYoPhez - DHrU/R7VQsp+pCu40FQXUNPMbKSaUCrHlei5BAkZxUcj6RAoHlVYVrQPXl5sUGtD9X4lW27gVc81Tx/r - Xx3292lxcj6EYaSobXyDgiRE5VSwkXQRUahlV1eza60iX9TYGTcPNdUMNVuGe9xTzZbBqK671TY9GDw6 - Fjs7Gj7Tk5wzWc02X82mlnLeKKX6sMp/QO4aomjjZcxQMcmfT/TmYr35OF8+zp6Lku2DQJ/YtmvTl7Zu - +octX/ryM1/+yo6vfC3rq98o/OqTFV/djHlsG/3pvYLtefKMElV2qTq/RFdYVlOCckDIngqWv4zrL+UG - SjjhCr6niGbaCwXusianQrYnS5S/105DHuuMfevw7M8uHXt+ZhAEQPmt1flvrc69ODd8bar/8mjXWkfs - wkjr4Y7w8b7YdIO1t17VXCPsdsg76qRd9cpmm9gpwevplVXUMgW+RIAposHzSWUFSNie0uLtubnPZGZu - xmFhbCalrLCIS2U1eRuGW/rjroiExGOUk/kwjoqskBAk6HwMuhDDxvBFZIWUqqvm1bs1CZcq5dO2JGq7 - hiITwaqgTehoNLUMhuYHA4st1qGYvreveW5weHjTUV1kkmNuR0qCuaT63UiwdeyCuTMwkXwyiEA23pGJ - MuajGbsLy7+2peRrm8ue2lG5dQ9ixz5SZgErByLKrVDlw3U5cGM2wl6AcUCw9RVoNxQfgNMiUFa4nBMp - 4QQLWd48mr+QYc/C1eyD10PwhtwKGwxtw6MnffbnJgZeXph4bXn61aXJ84Mdz473/+D04fdOrV4Z7T3W - Hl/rSIDtQtQ94bP211V3mFXNBmlSL2mpkbZaFXGDMKBm1kuJgCAXlsks340r3Fy+96vlZVsKS57OL96c - X7K1oGR7EWRPQdHuwsIMFKJMKuQ4LGZTtRYPR1KRZClFrmUbLFJnjbhOTqvi4eUcnExI1qrZNoPQVyMK - 26WNAV1zq7Pbo3Z7te5mR3OPb3A4OhnSheK1QyNNxw4sntgUKWI6M7BxCHeAWDXLsS4KnKeN8fOm1FFl - 8KDEu59fP043xbBiK5QqySzHP7EH+fgO3OZM6q58QU65JKdSnl1pBOyKia5CYrCYEiwneyvwvgqiv4wc - LKEGC+nBPEYgl+7NpnpyKZ5CSl0R1gOj1JbAWyWyI4mGF2dHrk0OnutvB8jAzrPjvS/Ojr62PAX2j7U1 - Lsf88yHXuNvSopOltJLmKmmqSprQihs1ggY1P6Lh+hWMejFJR61kQnbCM75WuetLsMyvlJfvgFTsKIHu - zC17JqPw8X2lT+VAnimo2F6G2FtSmYFAF5IoCDwBUVFWioPjhFR5jbQ+YErViHx8tIaDUbGxCiGlSs40 - K9l1SrrbyG3yarpD+rZoTVObp6PT393m6gHh1Xg63fsHwsfGO45tihQw53iONW3siDJ80dx63tj8im/o - krntkNi7poycq06erm5aUvlGxNYESWHKx/K3FNAez6Q/mSXaVVpbSgphhP4KliuP6M0heDNxzn1IZz6q - Pg/lysV4c4jBXFqkgB0r5qagki6iZohn6uZqJqttUzW2VyfGv7Uy+8r86Pn+tktDHef6Wo63x7+5NHF5 - uOt0d/JQIjQXdAzZ9c0acUhAdzEIPi41LGY1yLkNCk5IyvQIKVYWWkcqF8NzaEXb8dlPkPKf4cIypMT8 - /OJtuZBtOWXbciq37ij8+t7yJ3NgmyGE3UXobfmwLeWYvXB8IRRVDIWVETFEGUdtUXnq1FEN08FGaNgo - NRenFlK0cpZeI7CYJH6nsiNqnPBqesKmnt7Q5FDjTKtzImxobzAn+gLLow2nRiKnNp0xpI4oowfF/qOK - yMWatpddQxdNrUtc5zLbea4qedXSdc3adam27aS+8ZgudkAT7Kbo6nIJVTsqE3jFiiF62Bgf59S2Vopb - IPyOMlFbpSCF4DcjBR1o6RCxeppp3y/yga9/prb1gqvzpDO5Whd6oWvwpaGRn51ae31x4qWZgeNt0fN9 - qWdHOtdaoxf6ms90J44kgwshx5BNF5exXXR0HQnhpON9HIqXQ6ln4G1UZA0RqkYUicr28SB7hZVZSlyx - mY1wych5JVuzirZkFW/Nh+6BEPIgpNwyWg5WDIFzc6HsrApmRh766VL8ThglH0mCkGgYkUCoklRrhbXV - gnol3SbAVAtwOhnNpGQblFydWqAzSs1+Q7zJPuBUpSySaLNzdKr1RMI659P2Rmp6B8KzQ8GFdsfopiOK - 6JoqdsHY9mxt1wuO/is1nTM06yKz/kV7/3uNSz+IL38vPPvd4PSrdf3PW7pfdg5csXQeUUdXNdHTta1r - +qbDysh5U8tlY9tpZcNlXeql+r7nPX3XXD3X6ntfdA1+0z/5dsP8t+OLr0UnL/u6l02+NV/snYWlby/M - vjo7+txIx8X+1OGE71xP0/XxrtOdjSfawmst4ZWG+tG66qSC7aQi7MRKLxMbETEbZbywkOlk4OvoGAcD - aybD3UJSUMFs0PHZzAIkcU8pcns+dFsRYk85oQDFhuKESKIMTVJiiCoEQVmBkRXj5IUQxq487NZCzK5S - DBiSkVKZRMSX88gyBdMkIhqE+GoJyaBk1uiElmqJSSfRm+Q1DbbGZH1rvdpnFjqj5o5Wz2iybsilbrZK - G7q8wyOx6YQtsWlNET9b1XxKnTwqjp7VpC7o2qZItVf0He8nD30nMPuWa+JV6+Cr5r7v1I/+KLTwfsPS - DxqWvhOefdk9siL0DWH1+/neV9zD78WXv+2f+m5g5t3GxW/HZt8ITbzsGnmhbuB5+9ALdUPXHAOnjIlF - pauHq151B14ZG355avBcD1CcbzFkXW1yXxpIXuhrAgTP9TSO1lX11ciSClaAg/Wx0GE+MS5lpNTCDr2y - tUrWpBS06WUDdfqBesN83D3f5B70Gxm8HCw3A87YU0HZg2QVEEVwogyLl6JxUhROjiIokXgFFCuHoKVF - cEFuCXX3XujTu4ufyindg8Ej2Uweny6XMfUKZg0HpZRSDHphnV5kNStsdp3LpQ8k3e1NjtaAIRo0NjVa - Oxrrkilnm1PjrxW5Wup7uvyDsdqGTddtgxcNncsc3xLT86Jt6KgoOoIyvmQb+l548YKq+UVz/9uuqe84 - xn/TdPjXTYdfMfVeq+54zTH8bE3XMsdzwdD2w5bVb0fmr9v6X3WOvFo/crW2G1SD8/rWc7qWi7r2Z43d - Vy39z9l6j+oaVnS+UbnhgMe7HHAfTvhX4q7ROs3Bxvq1Fv+huBNsT7aHpj2GMB8PIsTDNUoo3QbRkFXZ - bZC0V0t7arSdBlVzlaTXop0M2ifDjnaLMm4Q+RU0pnwfSbEHJ81ACjIw4gIiQCaFoURQlAiGlSHxciRO - DkNLyxGiIgQ/D8rOzkFufWof8L1fLYLk8zh8OV/DxomxxQw2UiYh6bTcWrO83q5x+8yxhrrOgLklZutM - uvo7AmMRS0vK05mobwsaG0KmRLt7otHS3eLq3HSlpmeJ7e2uVJ9SJs5rWybxltPK5Ct1I5eq2p6t7nwn - MP9m/cRrlqEfBhffrp+8om1/1T7yUt3IMtc3Sqh9wTn6Znj+orn7vLHzgqnrOWvfmarUCWX8mDR6XNZ4 - RtUC4rA4Os9xjjLNgxx9iioYrNItBuonPMZRt27Qphx1aIdtquNtwfO9jUCAMTHZRijzs9FJJXPQopgL - mKfc+g6doNOgAN25SS1K6aRJnTisYHtFNAcXZ6BCFdgCinonUbMdJX0Gyt+CFGcSVKUEZSVKXAYXQOD8 - MpSgAiOCYsSVKGEJjJMLoe4pwO7YnPWVr23ZtG3X03AYjE3l66WWKn6tXmC3KTx6vrWKV2NRuvzm5oC5 - q06d8BraEq7RjuBMo6MnWNvaaO9KuQeGm1ZSdfNh42DKObppiesdxdcMYQyrwtCarGGaZLti7HjW2HWp - uu111/hrdcPPVXe+Zh/5lmfqiq79pDz+gn3omm1gnu2ZYTivOUeeqx86rGk6pGo8pIwd1SRWxMFlvm+F - 7z8oDK2KGw4IwnMM5yjFPEDV97KqwjhGn1Y75bLMRey9dsWATbU/Vr/c4DjQ6Bx16nxsrJOBaNcJ2/XC - LoNkyK6ZD1kXI/Yxp37QoW81KBsUfL+E6eDgq4kVcmSRHF0oReWLUDkSXAFGvQ0qfqKU841KwTacKp9c - VY5XlKNFpQhuMYJTjOJCMLwyDK8Ewc2Hs7MhpD078h97cueXd+7dnJO9rxIC0wj1Nq3HVxOL17f5TY16 - fm0Vz2JXNzq0LXphuEYaC5h7QpYuf023Q530GduT7rGOwGSre8xb1VavTmzqQWp6kZopmvWg0L/C9yxz - Pc+aO08qG89pE686hy9WNZ9VJ77pGn3BPnBIGDgoCj5r7Tlvap9h1R+SR6+5hk4YW+fF/lmRd0bonZP4 - Jzn1kwzbHLt+nuOaYzknKPYhfE0vrrqbVNVBV7kRpGaxZNhumos6Wo3i/jrNbMg25jYOOXQdJmlMxmo3 - SqZ8tVOB2pmAdT5StxB1jLmMrXpJVMWrYxO12HIprEBQnsUuyWCX7hUicvmIHDY0kwXLZMMzywVPl7Cf - gHCegYl241VFZE0FSVmBF5dhuMVodjGGU5Le4ebh+IVQWvaeoic27/7anqytWVkZZSXlfJpILdDX6Xzh - umTQ2mRXe5WsGqu6UcX1avkBozRSp02aZZE6TXO1IGSWNUat3U3OllZPh7sqWKfwb2qrlPZhq6bo1mPK - 6CzTfkDoPSoPH5NHTqsbT6pih8WBs9rE83X9p6tTM8y6ZaHvvLn9RFVijus6UZ08V9uxLAuOse0jTNsY - pw7ECNMyRKsZZdSOUGsH8MYelK4brevC6brIVS0UhQdF9ZCoXQbNoMMQ1/LbaxQ9Nm1XrarHqgHRbpSB - /YG66s8+7LNXgW2qShgQ03UEqLAyj16wh5q/k1qwk1GawYflyomlGibUwEfXSPA1UhA4gwIX0Ss1DCRR - WUTVlFNU5QQJBMstRNHz0fR8FCMPwchCs/Ng5Ow9BU9845kvb976jYy9O+GVMA6VJ2RKlXxdrbreXROu - VbvICGHmNhi0iCVmWgyKQJXYBc6jhu+tEgSi9p6Eq6e7YTDlao+Y4wln56bmSnE/QTdE0h9VRYYJ1ROU - mhGi/og8dErbOAc0xbCtKaNHVdF5gXuYbFoQuE8BX6luWBJ5Dyuj83zXKNXcg9d1oNW9JEMPEShO10Wq - 6iJq2zCqJFSWqJS2wJWtGHU7SdtEkvpxzOoyaFTIjauEEQU3phYk9dKUXhbXCsNydlDKAsXOL6I7OAQH - m+Dik108ch0Lb6GjuZAsRvFedlmWAFEgQheKMIUSfImej7GpqPU6lkVN1fDhYnqpnYI/1tDdRVP1srSd - WlNPa5ikAFlcUE7MKEJtK8HsKCPsguB2FSN37sl94qvf+NJXH/vS7j3bSoqLyHgyi8plknhsskgtMkg4 - OgyUlZ0BzdxZDisl8xlqtcSsk9v0CofHlpgbOjY/dLgjOppy9bWHRvrj05uixawenKqPoJnn13UipR0I - WRdKNsu2rohdk1TTKEG3LHBOMa2DZGMvVjvNtq9pYiti3yTdMkE1d8LkfRhtF0KZKOF3/f8qsremNA4o - DuD5Bl5rRRRQEVh2gd2FvcHel9teWBaRBYKkxhigaAQVYlBCIDWoKWqMmWkm7XQm7WTa6afoR+t25jyc - h/P0m3PmPPyxwhDJDSJGn8ieY/oprHVBuQsqrwJ6D872IkYHV1pkPOt0V1C4maCPc8mWHj+wyFLMNo1a - u9ZIsydb6ZaeaKrci4x0kpePN1PWQEPmDMynRTy5KFTg4E0moFE+lfLqjN8QoAzvF3FXDFkUo65zJXcp - FS8sxP8zlsJ9of71eHD75d22wZV4vCbyJgL78AWQWAJQuxuweQEnAKx7PW7rvcSibJRgUZiK8xmGSoVh - zrkCzUzZHcsePBKTk5kwTIUgrFysnnbPLvr3b88n48Gn8eD+8923R/uu6FssO2FLE6Y4hNURolnNCM1c - U1sPYvUqkvsc3/3AVa+p0hgr3PM7f2bbv0h7o4Bu1ZknNSHLl1ih502NCfMNnD1D1Fdh5SWqdGGlE1Q6 - AbUDqSeQ3AKTh3CiGREV+1p8ZfkpR7Zy6b00U+EiZQYtRkNVDmuofEMTmrr0RCQes+GdOFVTuFYu1avk - +k/yR6b8XGNLIprG3VxwhQs6KGCRgpaigWUEmAv6pmK4vSbSV3L5WipdSaVLwbwznv2x3//ndPx39+LX - 591Pj5uvea1O0pTqE3REzkclmWAEjKQiJEUwLM8LCTGuSJJGkpKl6nB6p6cX5ucX3BtrfhByOFwOhxNB - QyQVDYWCvCDSNJ01jHa7/aixRg8x44NQvaXLP6HZEaJfMtY9mmO6eMNv38RKH9nqe6LwM1WcUMUH4Ycv - Sv2O3R7CmRGafQNnLoj8WUjt+BNdMNXaEI790hEoHQLij17+AEzUPHx9g28FUvt+4UVIqgUZYx3AZ2cr - XKxupKupWJ4OldiwaSEK+JGpHpjyU503k4SEuhXSn6WgCocdZuK9vNYxUrsSoUXcLGjDPd8hq3OQfRpY - moEcc/61WTi0kJB9ignu6cxLLf1azNxu7n1tDf797a9vR0ML8UbbeTCefdR2b42d30fv+u/bQgHmc4ig - Y6Ia45MMnxASiqwZW4yQjLFJnOTdXmj++8WZ+Snb8sy6d9XuWFpx2VbdNn/Q5wFWgygUIWCGj5nl/H+e - bI0KWoBxQgAAAABJRU5ErkJggg== - - - - - /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/+wAEUR1Y2t5AAEABAAAAFoAAP/bAEMA - AQEBAQEBAQEBAQIBAQECAgIBAQICAgICAgICAgMCAwMDAwIDAwQEBAQEAwUFBQUFBQcHBwcHCAgICAgI - CAgICP/bAEMBAQEBAgICBQMDBQcFBAUHCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI - CAgICAgICAgICAgICP/AABEIAPABQAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUG - BwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQz - YnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaH - iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy - 8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAAB - AncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6 - Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy - s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APmO - ysRJkNHuVyAxA4+Xj8iK/stNH8xwjY3bTTVZgJgxk/gHt05J6YzWt47LVG6Wm50ltpfmbZCMkHgnH8Ix - gH+VTKTve/kRZM6rTdN+bYy5U5809QSw6dqIyZdtWfE37faR/wDCvbi8s9W/sjX/AA1p1zcaVNIiul7a - zlILm3QlcJMo2Op+8RnHevm+KYf7NJp2aT6fhc9vh/Suo7q/9fI/ndlk81mGGYSOWfv1wT9a/FbaH6bf - QrvjcpUHGMEH5s4+tS3oO+wvl5KHZwRt57Z5556VLZUbne+GtIjurs219A88wXEcUbgbDuX55CARsXOS - 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 - IUvI8epXtTcWf//Z - - - - - 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 - TkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK9gAA - CvYBwq9wAwAABKNJREFUeF7tnC12HFcYRBXmbQSEBXgLCUxYWEK9h5DAaANZhKGht2EoGGoWGgXJjUZf - 3Vead+Z0y+n3Xt1zrkn/jFRVoM/MWHchhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIX4mngw2D4UrcYxgM - V+Iew2C4EvcYTo4W9vHhuvfvr/rD5yexuf/xhp1ooK70qim9mgGMhwbqSq+a0qsZwHhooK70qim9mgGM - hwv14uPDdT9/UHuD2Kv5GcNOXKgXXenVDGB8XKgXXenVDGB8XKgXXenVDGA8NED3oHdNFNz49hcV17PQ - x8dHFQPj+bT5fW53OTQAFNTVlV7NAE6PBoCCurrSqxnA6dEAUFBXV3o1AxgOCYQFUD700WYQ7+5VDOLT - 9prV7YcQeX8Oxo3iFvn7by6HBOBKr7IQmgGMhwTgSq+yEJoBjIcE4EqvshCaAYyPBOJGUGWhTeGdh8Kv - Ln4/4/JIIK70ahNwBjA8EogrvdoEnAEMjwTiSq82AWcAw6EBuNCqfMhjwTzOQfD1Xtlff/5RNOcsjwbi - Sq+y4AxgeDQQV3qVBWcAw6OBuNKrLDgDmA4NiAXD5o0VDgb3YyF//fm7yONvvnkj/vPvfyLP5/34+rye - xzeXRwMxpVczgPnQQEzp1QxgPjQQU3o1A5gPDYQPcXzIQ+H8sIb3Y0GUhXIAlOfz9ZoPk/BGVgbRogFk - AMuhAWQAy6EBZADL40J5tjMInu9KvyYLpjyfr9cbAOX1m8vjQnk2A5geF8qzGcD0uFCezQCWQwO6cQC9 - AvfK1zvAADSgDGA5NKAMYDk0oAxgOVxIL/r9d99e9ehBmJ8hHIwL+UVd6dUMYDxcyC/qSq9mAOPhQn5R - V3o1AxgPCbj5QggfCnG+G0GVg6Cu9CrP5+tvhp1IoBnAekigGcB6SKAZQJCAmy+EdAZxqyyY8nzC45th - JxJoBrAeEmgGsB4SaAYwPxogP/xh4fxSKeX9eD2PdyTmnLATDTQDWA4NNANYDg00A1geDbhXcMfmjSUc - f9xKvWYzSFy/GQ5GA84AlkMDzgCWQwPOAKZHA+0Ufv/b3+Kn+yeR5//04Uls7s+HRBTeXI/7b4adaKAs - CMczgPnQQFkQjmcA86GBsiAczwDmRwPuFcbjvB7yobB56OvfL7wyGjgLyQCmRwNnIRnA9GjgLCQDmB4N - HA9lTWE43lwP+QUT/kEH/gEIc4/wymjgKDgDmB8NHAVnAPOjgaPgDGB+NHAU/PGPt+LD+3cir+cbRzzO - +3Mgzfnh1dHAUVAGMD8aOArKAOZHA0dBGcB6SAEsfPtH5PkZwPhIARnAekgBGcB6SAEZQHClXGThvS+M - NB8uUZ4f/ndcKRczgPlxpVzMAObHlXIxA1iMXuF0u+RWw5nJABYnA1icDGA9tCB+idM9yFV5Pu8XTo8W - xkJd6VWez/uF06OFsVBXepXn837h9GhhLNSVXuX5vF84PVJY9z964MMeXm8MJ0cKywDWQwrLANZDCssA - 1kMK6w4AD318Y4hvJPH+m+FkSEEZwHpIQRnAekhBGUBwpR1pODmutCMNJ8eVdqTh5LjSjvTE3N19AXuR - auxwSbrOAAAAAElFTkSuQmCC - - - - - /9j/4AAQSkZJRgABAQEAZABkAAD/7gAOQWRvYmUAZAAAAAAB/+EW+EV4aWYAAE1NACoAAAAIAAcBEgAD - AAAAAQABAAABGgAFAAAAAQAAAGIBGwAFAAAAAQAAAGoBKAADAAAAAQACAAABMQACAAAAHAAAAHIBMgAC - AAAAFAAAAI6HaQAEAAAAAQAAAKIAAADCAGQAAAABAAAAZAAAAAEAAEFkb2JlIFBob3Rvc2hvcCBDUzUg - V2luZG93cwAyMDExOjAxOjE2IDIyOjQzOjM2AAACoAIABAAAAAEAAAChoAMABAAAAAEAAAChAAAAAAAA - AAYBAwADAAAAAQAGAAABGgAFAAAAAQAAARABGwAFAAAAAQAAARgBKAADAAAAAQACAAACAQAEAAAAAQAA - ASACAgAEAAAAAQAAFc8AAAAAAAAASAAAAAEAAABIAAAAAf/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUA - ZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwM - DAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwM - DAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAKADASIAAhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEA - AAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYI - BQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRF - wqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEA - AgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYW - orKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dn - d4eXp7fH/9oADAMBAAIRAxEAPwD1VJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUp - 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 - /d/vfvut07GFNQEdldTNAaITprKpJJJJT//X9VSSSSUpJJJJSxEiFmdU6TTl1lr2z3HkfJaiaJSQQCKI - sF81659WKrm7Mun7Qxsiuz6NrOfoWth3530P5v8AkLj8z6kv3E4GS0t1Pp5ALXAfmt9Wpr22Pd/xNC9y - yMKu4EELBz/q3XYSWjXyT+MH5hfjsWP2pR/m5cI/cl64fT9OP+M+KX/VzrmOGl+HY4v4FW20/wCbjutc - mb0z6wMptobgZQrvLTa30LYcWa1/mea9Sv6Bm1E+m93z1/Kqb+ndVadD/wBEJejvJV5h+jA+UpR/7h85 - o+r/AF3IsLG4VrXASfVHojXzyTStPF+pWUWi3Pya8asiS1vvcDP829zvSoZ7fz22Xrrj03qz9DYR8AB+ - ICnV9WMi1wdbuefFxJP4pXAdCfPRVZj1hDyvIf8AncDjYdPSumEjpdBuyOPtFmru/wDhIbt+ltd9mrpZ - Yr2J0rMz7m2ZBLiPoiIA/qtXTYH1VY2C5q6LD6TTQBDQgZE6bDsEwxRieI3Kf78tZf4P7v8AguZ0boTK - Gglq6KutrGgBO1gaICkmsikkkklKSSSSU//Q9VSSSSUpJJJJSkkkklKTEA8p0klI3UVu5CE7AoPZWUkl - NUdPo8AiNxam8BGSSUxDGjgKSSSSlJJJJKUkkkkpSSSSSn//2QD/7R5EUGhvdG9zaG9wIDMuMAA4QklN - BCUAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQQ6AAAAAACTAAAAEAAAAAEAAAAAAAtwcmludE91dHB1 - dAAAAAUAAAAAQ2xyU2VudW0AAAAAQ2xyUwAAAABSR0JDAAAAAEludGVlbnVtAAAAAEludGUAAAAAQ2xy - bQAAAABNcEJsYm9vbAEAAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAAAAALcHJpbnRlck5hbWVURVhUAAAA - AQAAADhCSU0EOwAAAAABsgAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRPcHRpb25zAAAAEgAAAABDcHRu - Ym9vbAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5DYm9vbAAAAAAAQ250Q2Jvb2wAAAAA - AExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wAAAAAAEludHJib29sAAAAAABCY2tnT2Jq - YwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv4AAAAAAAAAAAAEdybiBkb3ViQG/gAAAAAAAA - AAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50RiNSbHQA - AAAAAAAAAAAAAABSc2x0VW50RiNQeGxAWQAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEAAAAAUGdQc2Vu - dW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAAAAAAAFRvcCBVbnRGI1JsdAAA - AAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAOEJJTQPtAAAAAAAQAGQAAAABAAEAZAAAAAEAAThC - SU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAfThCSU0EGQAAAAAABAAAAB44QklN - A/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBs - ZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAA - AAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////// - //////////8D6AAAAAD/////////////////////////////A+gAAAAA//////////////////////// - /////wPoAAA4QklNBAAAAAAAAAIAAjhCSU0EAgAAAAAAEAAAAAAAAAAAAAAAAAAAAAA4QklNBDAAAAAA - AAgBAQEBAQEBAThCSU0ELQAAAAAABgABAAAACjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklN - BB4AAAAAAAQAAAAAOEJJTQQaAAAAAANJAAAABgAAAAAAAAAAAAAAoQAAAKEAAAAKAFUAbgB0AGkAdABs - AGUAZAAtADEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAKEAAAChAAAAAAAAAAAAAAAA - AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAA - AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcA - AAChAAAAAFJnaHRsb25nAAAAoQAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAAS - AAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xp - Y2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAA - AAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcA - AAAAAAAAAEJ0b21sb25nAAAAoQAAAABSZ2h0bG9uZwAAAKEAAAADdXJsVEVYVAAAAAEAAAAAAABudWxs - VEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0 - SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNl - SG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAH - ZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0 - b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAA - AAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBBQAAAAA - AAQAAAAQOEJJTQQMAAAAABXrAAAAAQAAAKAAAACgAAAB4AABLAAAABXPABgAAf/Y/+0ADEFkb2JlX0NN - AAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEM - DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM - DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAKADASIAAhEBAxEB/90ABAAK/8QB - PwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQ - AAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFj - czUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dX - Z3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFy - gpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaG - lqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwD1VJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ - JJJSkkkklKSSSSUpJJJJT//Q9VSSSSUpJJJJSkkkklKSWf1rreB0PD+255eKdwafTYbHCfztjPdsb+8s - 1tP1l6uX1Zb29O6dkVb4oDm5bHEua3Ee+3cz+a2W35FTa/0n6tT/ANyElPRJLkMj6hXeiDi9ez6cluOz - GFznNePTa/1bPYBS79J9D+e9n5/qqPQsfK6tkM6kcjLxc/Gfaxzc8Oc51D2+jTdTj1twMKr6HqV/oMr/ - AIf1klPYpLkDn/XzpLZycOvq2Njte+59bpyLdzv1dmKzHrq9zJb62/Ar/kLR/wCefRqr8bEzzdgZmUwP - bRfTY0tn2u32bPTaxlns9bd6P8tJTvJKFd1VoJreHgclplTSUpJJJJSkkkklKSSSSU//0fVUkkklKSSS - SUpQttqprdbc9tdbBLnuIa0D+U5yD1DqGL07FdlZLtrG6ADVznH6LGN/Oc5cd1V3UOqDHu6g40UZloZi - 4bSQRWA62zId/wAJ6TP0d37/APN/o0JyEMc8s9IY4mcu9QHEeFZKfrjjgOLJMgAdI8X6U0l/1j6E/r2T - 1FrbMnMxKBjYLa2WvJDxY+/9FWDXsfb6LfUu2f5iz/qr9cBivy6/rRmV4fV78j1X1XSxgqLGNpbXa4ux - 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 - 3UVu5CE7AoPZWUklNUdPo8AiNxam8BGSSUxDGjgKSSSSlJJJJKUkkkkpSSSSSn//2QA4QklNBCEAAAAA - AFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAA - aABvAHQAbwBzAGgAbwBwACAAQwBTADUAAAABADhCSU0EBgAAAAAABwAEAAEAAQEA/+EOOWh0dHA6Ly9u - cy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpy - ZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9 - IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAg - ICAgIj4NCgk8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm - LXN5bnRheC1ucyMiPg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0 - dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxl - bWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8x - LjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RF - dnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNy - ZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcDpDcmVhdGVEYXRlPSIyMDEx - LTAxLTE2VDIyOjIxOjU3LTA2OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxMS0wMS0xNlQyMjo0MzozNi0w - NjowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxMS0wMS0xNlQyMjo0MzozNi0wNjowMCIgZGM6Zm9ybWF0 - PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0i - c1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDM2QkIxNThGNDIxRTAx - MThBNDVDNDZCQzcxMUYyMEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDI2QkIxNThGNDIxRTAx - MThBNDVDNDZCQzcxMUYyMEYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMjZCQjE1 - OEY0MjFFMDExOEE0NUM0NkJDNzExRjIwRiI+DQoJCQk8eG1wTU06SGlzdG9yeT4NCgkJCQk8cmRmOlNl - cT4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9Inht - cC5paWQ6MDI2QkIxNThGNDIxRTAxMThBNDVDNDZCQzcxMUYyMEYiIHN0RXZ0OndoZW49IjIwMTEtMDEt - MTZUMjI6MjE6NTctMDY6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUg - V2luZG93cyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJh - bWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIv - Pg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p - aWQ6MDM2QkIxNThGNDIxRTAxMThBNDVDNDZCQzcxMUYyMEYiIHN0RXZ0OndoZW49IjIwMTEtMDEtMTZU - MjI6NDM6MzYtMDY6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu - ZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveG1wTU06SGlzdG9y - eT4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAA - AG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD2 - 1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - EWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAA - FGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAA - hnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAI - DGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQt - UGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNS - R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA4 - 9QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVD - IGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0y - LjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEg - RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA - AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAs - UmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAA - AABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA - AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA - hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8B - JQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoC - AwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyED - LQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoE - qAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoG - ewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYI - qgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyIL - OQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMO - Lg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0R - jBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQV - VhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZ - kRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe - QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj - ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQp - Bik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4v - JC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1 - wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ8 - 4z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdE - ikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJM - uk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShV - dVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxe - vV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9o - lmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZz - AXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+ - AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJ - mYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+V - yZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiai - lqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uw - ALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ - Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM - tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724Dc - BdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr - ++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8 - mP0p/br+S/7c/23////bAEMABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDAwMDAwM - DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/bAEMBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwM - DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAKEAoQMBEQACEQEDEQH/xAAfAAABBQEB - AQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEH - InEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl - ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU - 1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/ - xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ0 - 4SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS - k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4 - +fr/2gAMAwEAAhEDEQA/APqmgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC - gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo - AKACgAoAKACgAoAKACgAoAKAMfxV4s0XwtpD6trEjxWUbKrvGjSsNxxnagLbV+8zfwrQBzttc+O/EspU - hNG8O3sLOs6qy6jHh8RxFZPl3TxFZHkVf3PzQr+8/e0AYd38FNdFlCLHxzq0WoQWb2kdzL5brmWTe77F - CH7vyqu/+7uelYdyv4QtNW8QX6XA1W/i1XRLpo1bUlYRz20cbQ+bFBCtvFtMh3ZZ5t+3941AFybXfjP4 - fkla50mHXtMglnnuLlJEFy1suTHHBFEIy0xG35Ps7/8AXR6ANofF/wALWkOljX47vQb/AFRAYrG+tZ1d - XABdSwQqdmfmk/1f+1TEdlb3lpcjNvMkwwDlGDDB6dKAJqACgAoAKACgAoAKACgAoAKACgAoAKAGzTRQ - xNLM6xxIMvI5CqAO5J4FAm0ldnkOv+OfAdx44bUriaS7uNGtfI02CNZZUka43i4PkorhxhYlVnX/AMdr - OvVhR/iSjD/ExUJe1+BORy3wz+M86apq3/CeX8Gj6zd3EclrY3BaFFtVjCoELExBd2443b97Pu/hqKGI - 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 - AADABwAA4A8AAPBfAAD4fwAA - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Api/ApiContainer.cs b/BizHawk.Client.EmuHawk/Api/ApiContainer.cs deleted file mode 100644 index 6a7b7102a3..0000000000 --- a/BizHawk.Client.EmuHawk/Api/ApiContainer.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Linq; - -using BizHawk.Client.ApiHawk; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class ApiContainer : IApiContainer - { - public IComm Comm => (IComm)Libraries[typeof(CommApi)]; - public IEmu Emu => (IEmu)Libraries[typeof(EmuApi)]; - public IGameInfo GameInfo => (IGameInfo)Libraries[typeof(GameInfoApi)]; - public IGui Gui => (IGui)Libraries[typeof(GuiApi)]; - public IInput Input => (IInput)Libraries[typeof(InputApi)]; - public IJoypad Joypad => (IJoypad)Libraries[typeof(JoypadApi)]; - public IMem Mem => (IMem)Libraries[typeof(MemApi)]; - public IMemEvents MemEvents => (IMemEvents)Libraries[typeof(MemEventsApi)]; - public IMemorySaveState MemorySaveState => (IMemorySaveState)Libraries[typeof(MemorySaveStateApi)]; - public IMovie Movie => (IMovie)Libraries[typeof(MovieApi)]; - public ISaveState SaveState => (ISaveState)Libraries[typeof(SaveStateApi)]; - public ISql Sql => (ISql)Libraries[typeof(SqlApi)]; - public ITool Tool => (ITool)Libraries[typeof(ToolApi)]; - public IUserData UserData => (IUserData)Libraries[typeof(UserDataApi)]; - public Dictionary Libraries { get; set; } - public ApiContainer(Dictionary libs) - { - Libraries = libs; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Api/ApiManager.cs b/BizHawk.Client.EmuHawk/Api/ApiManager.cs deleted file mode 100644 index 9dd5b71087..0000000000 --- a/BizHawk.Client.EmuHawk/Api/ApiManager.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -using BizHawk.Common.ReflectionExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Client.ApiHawk; - -namespace BizHawk.Client.EmuHawk - -{ - public static class ApiManager - { - private static ApiContainer container; - private static void Register(IEmulatorServiceProvider serviceProvider) - { - // Register external apis - var apis = Assembly - .Load("BizHawk.Client.ApiHawk") - .GetTypes() - .Where(t => typeof(IExternalApi).IsAssignableFrom(t)) - .Where(t => t.IsSealed) - .Where(t => ServiceInjector.IsAvailable(serviceProvider, t)) - .ToList(); - - apis.AddRange( - Assembly - .GetAssembly(typeof(ApiContainer)) - .GetTypes() - .Where(t => typeof(IExternalApi).IsAssignableFrom(t)) - .Where(t => t.IsSealed) - .Where(t => ServiceInjector.IsAvailable(serviceProvider, t))); - - foreach (var api in apis) - { - var instance = (IExternalApi)Activator.CreateInstance(api); - ServiceInjector.UpdateServices(serviceProvider, instance); - Libraries.Add(api, instance); - } - container = new ApiContainer(Libraries); - GlobalWin.ApiProvider = new BasicApiProvider(container); - } - private static readonly Dictionary Libraries = new Dictionary(); - public static void Restart(IEmulatorServiceProvider newServiceProvider) - { - Libraries.Clear(); - Register(newServiceProvider); - } - } -} diff --git a/BizHawk.Client.EmuHawk/Api/Libraries/CommApi.cs b/BizHawk.Client.EmuHawk/Api/Libraries/CommApi.cs deleted file mode 100644 index 152658c639..0000000000 --- a/BizHawk.Client.EmuHawk/Api/Libraries/CommApi.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.ComponentModel; - -using BizHawk.Emulation.Common; -using BizHawk.Client.ApiHawk; -using System.Text; -using System.Collections.Generic; -using System.Net.Http; -using System.Windows.Forms; - - -namespace BizHawk.Client.EmuHawk -{ - public sealed class CommApi : IComm - { - [RequiredService] - private IEmulator Emulator { get; set; } - - [RequiredService] - private IVideoProvider VideoProvider { get; set; } - - public CommApi() : base() - { } - - public string SocketServerScreenShot() - { - return GlobalWin.socketServer.SendScreenshot(); - } - public string SocketServerScreenShotResponse() - { - return GlobalWin.socketServer.SendScreenshot(1000).ToString(); - } - - public string SocketServerSend(string SendString) - { - return "Sent : " + GlobalWin.socketServer.SendString(SendString).ToString() + " bytes"; - } - public string SocketServerResponse() - { - return GlobalWin.socketServer.ReceiveMessage(); - } - - public bool SocketServerSuccessful() - { - return GlobalWin.socketServer.Successful(); - } - public void SocketServerSetTimeout(int timeout) - { - GlobalWin.socketServer.SetTimeout(timeout); - } - // All MemoryMappedFile related methods - public void MmfSetFilename(string filename) - { - GlobalWin.memoryMappedFiles.SetFilename(filename); - } - public string MmfSetFilename() - { - return GlobalWin.memoryMappedFiles.GetFilename(); - } - - public int MmfScreenshot() - { - return GlobalWin.memoryMappedFiles.ScreenShotToFile(); - } - - public int MmfWrite(string mmf_filename, string outputString) - { - return GlobalWin.memoryMappedFiles.WriteToFile(mmf_filename, Encoding.ASCII.GetBytes(outputString)); - } - public string MmfRead(string mmf_filename, int expectedSize) - { - return GlobalWin.memoryMappedFiles.ReadFromFile(mmf_filename, expectedSize).ToString(); - } - // All HTTP related methods - public string HttpTest() - { - var list = new StringBuilder(); - list.AppendLine(GlobalWin.httpCommunication.TestGet()); - list.AppendLine(GlobalWin.httpCommunication.SendScreenshot()); - list.AppendLine("done testing"); - return list.ToString(); - } - public string HttpTestGet() - { - return GlobalWin.httpCommunication.TestGet(); - } - public string HttpGet(string url) - { - return GlobalWin.httpCommunication.ExecGet(url); - } - - public string HttpPost(string url, string payload) - { - return GlobalWin.httpCommunication.ExecPost(url, payload); - } - public string HttpPostScreenshot() - { - return GlobalWin.httpCommunication.SendScreenshot(); - } - public void HttpSetTimeout(int timeout) - { - GlobalWin.httpCommunication.SetTimeout(timeout); - } - public void HttpSetPostUrl(string url) - { - GlobalWin.httpCommunication.SetPostUrl(url); - } - public void HttpSetGetUrl(string url) - { - GlobalWin.httpCommunication.SetGetUrl(url); - } - public string HttpGetPostUrl() - { - return GlobalWin.httpCommunication.GetPostUrl(); - } - public string HttpGetGetUrl() - { - return GlobalWin.httpCommunication.GetGetUrl(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/Api/Libraries/GUIApi.cs b/BizHawk.Client.EmuHawk/Api/Libraries/GUIApi.cs deleted file mode 100644 index 5270a6eece..0000000000 --- a/BizHawk.Client.EmuHawk/Api/Libraries/GUIApi.cs +++ /dev/null @@ -1,655 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Windows.Forms; -using System.IO; - -using BizHawk.Client.ApiHawk; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class GuiApi : IGui - { - [RequiredService] - private IEmulator Emulator { get; set; } - private Color _defaultForeground = Color.White; - private Color? _defaultBackground; - private Color? _defaultTextBackground = Color.FromArgb(128, 0, 0, 0); - private int _defaultPixelFont = 1; // gens - private Padding _padding = new Padding(0); - private ImageAttributes _attributes = new ImageAttributes(); - private System.Drawing.Drawing2D.CompositingMode _compositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; - - - public GuiApi() - { } - - private DisplaySurface _GUISurface = null; - - public bool HasGUISurface => _GUISurface != null; - - #region Gui API - public void ToggleCompositingMode() - { - _compositingMode = 1 - _compositingMode; - } - - public ImageAttributes GetAttributes() - { - return _attributes; - } - public void SetAttributes(ImageAttributes a) - { - _attributes = a; - } - - public void Dispose() - { - foreach (var brush in _solidBrushes.Values) - { - brush.Dispose(); - } - - foreach (var brush in _pens.Values) - { - brush.Dispose(); - } - } - - public void DrawNew(string name, bool? clear = true) - { - try - { - DrawFinish(); - _GUISurface = GlobalWin.DisplayManager.LockLuaSurface(name, clear ?? true); - } - catch (InvalidOperationException ex) - { - Console.WriteLine(ex.ToString()); - } - } - - public void DrawFinish() - { - if (_GUISurface != null) - { - GlobalWin.DisplayManager.UnlockLuaSurface(_GUISurface); - } - - _GUISurface = null; - } - #endregion - - #region Helpers - private readonly Dictionary _imageCache = new Dictionary(); - private readonly Dictionary _solidBrushes = new Dictionary(); - private readonly Dictionary _pens = new Dictionary(); - private SolidBrush GetBrush(Color color) - { - SolidBrush b; - if (!_solidBrushes.TryGetValue(color, out b)) - { - b = new SolidBrush(color); - _solidBrushes[color] = b; - } - - return b; - } - - private Pen GetPen(Color color) - { - Pen p; - if (!_pens.TryGetValue(color, out p)) - { - p = new Pen(color); - _pens[color] = p; - } - - return p; - } - - private Graphics GetGraphics() - { - var g = _GUISurface == null ? Graphics.FromImage(new Bitmap(1,1)) : _GUISurface.GetGraphics(); - - // we don't like CoreComm, right? Someone should find a different way to do this then. - var tx = Emulator.CoreComm.ScreenLogicalOffsetX; - var ty = Emulator.CoreComm.ScreenLogicalOffsetY; - if (tx != 0 || ty != 0) - { - var transform = g.Transform; - transform.Translate(-tx, -ty); - g.Transform = transform; - } - - return g; - } - public void SetPadding(int all) - { - _padding = new Padding(all); - } - public void SetPadding(int x, int y) - { - _padding = new Padding(x / 2, y / 2, x / 2 + x & 1, y / 2 + y & 1); - } - public void SetPadding(int l, int t, int r, int b) - { - _padding = new Padding(l, t, r, b); - } - public Padding GetPadding() - { - return _padding; - } - #endregion - - public void AddMessage(string message) - { - GlobalWin.OSD.AddMessage(message); - } - - public void ClearGraphics() - { - _GUISurface.Clear(); - DrawFinish(); - } - - public void ClearText() - { - GlobalWin.OSD.ClearGUIText(); - } - - public void SetDefaultForegroundColor(Color color) - { - _defaultForeground = color; - } - - public void SetDefaultBackgroundColor(Color color) - { - _defaultBackground = color; - } - - public void SetDefaultTextBackground(Color color) - { - _defaultTextBackground = color; - } - - public void SetDefaultPixelFont(string fontfamily) - { - switch (fontfamily) - { - case "fceux": - case "0": - _defaultPixelFont = 0; - break; - case "gens": - case "1": - _defaultPixelFont = 1; - break; - default: - Console.WriteLine($"Unable to find font family: {fontfamily}"); - return; - } - } - - public void DrawBezier(Point p1, Point p2, Point p3, Point p4, Color? color = null) - { - using (var g = GetGraphics()) - { - try - { - g.CompositingMode = _compositingMode; - g.DrawBezier(GetPen(color ?? _defaultForeground), p1, p2, p3, p4); - } - catch (Exception) - { - return; - } - } - } - - public void DrawBeziers(Point[] points, Color? color = null) - { - using (var g = GetGraphics()) - { - try - { - g.CompositingMode = _compositingMode; - g.DrawBeziers(GetPen(color ?? _defaultForeground), points); - } - catch (Exception) - { - return; - } - } - } - public void DrawBox(int x, int y, int x2, int y2, Color? line = null, Color? background = null) - { - using (var g = GetGraphics()) - { - try - { - float w; - float h; - if (x < x2) - { - w = x2 - x; - } - else - { - x2 = x - x2; - x -= x2; - w = Math.Max(x2, 0.1f); - } - - if (y < y2) - { - h = y2 - y; - } - else - { - y2 = y - y2; - y -= y2; - h = Math.Max(y2, 0.1f); - } - - g.CompositingMode = _compositingMode; - g.DrawRectangle(GetPen(line ?? _defaultForeground), x, y, w, h); - - var bg = background ?? _defaultBackground; - if (bg.HasValue) - { - g.FillRectangle(GetBrush(bg.Value), x + 1, y + 1, Math.Max(w - 1, 0), Math.Max(h - 1, 0)); - } - } - catch (Exception) - { - // need to stop the script from here - return; - } - } - } - - public void DrawEllipse(int x, int y, int width, int height, Color? line = null, Color? background = null) - { - using (var g = GetGraphics()) - { - try - { - var bg = background ?? _defaultBackground; - if (bg.HasValue) - { - var brush = GetBrush(bg.Value); - g.FillEllipse(brush, x, y, width, height); - } - - g.CompositingMode = _compositingMode; - g.DrawEllipse(GetPen(line ?? _defaultForeground), x, y, width, height); - } - catch (Exception) - { - // need to stop the script from here - return; - } - } - } - - public void DrawIcon(string path, int x, int y, int? width = null, int? height = null) - { - using (var g = GetGraphics()) - { - try - { - if (!File.Exists(path)) - { - AddMessage("File not found: " + path); - return; - } - - Icon icon; - if (width.HasValue && height.HasValue) - { - icon = new Icon(path, width.Value, height.Value); - } - else - { - icon = new Icon(path); - } - - g.CompositingMode = _compositingMode; - g.DrawIcon(icon, x, y); - } - catch (Exception) - { - return; - } - } - } - - public void DrawImage(string path, int x, int y, int? width = null, int? height = null, bool cache = true) - { - if (!File.Exists(path)) - { - Console.WriteLine("File not found: " + path); - return; - } - - using (var g = GetGraphics()) - { - Image img; - if (_imageCache.ContainsKey(path)) - { - img = _imageCache[path]; - } - else - { - img = Image.FromFile(path); - if (cache) - { - _imageCache.Add(path, img); - } - } - var destRect = new Rectangle(x, y, width ?? img.Width, height ?? img.Height); - - g.CompositingMode = _compositingMode; - g.DrawImage(img, destRect, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, _attributes); - } - } - - public void ClearImageCache() - { - foreach (var image in _imageCache) - { - image.Value.Dispose(); - } - - _imageCache.Clear(); - } - - public void DrawImageRegion(string path, int source_x, int source_y, int source_width, int source_height, int dest_x, int dest_y, int? dest_width = null, int? dest_height = null) - { - if (!File.Exists(path)) - { - Console.WriteLine("File not found: " + path); - return; - } - - using (var g = GetGraphics()) - { - Image img; - if (_imageCache.ContainsKey(path)) - { - img = _imageCache[path]; - } - else - { - img = Image.FromFile(path); - _imageCache.Add(path, img); - } - - var destRect = new Rectangle(dest_x, dest_y, dest_width ?? source_width, dest_height ?? source_height); - - g.CompositingMode = _compositingMode; - g.DrawImage(img, destRect, source_x, source_y, source_width, source_height, GraphicsUnit.Pixel, _attributes); - } - } - - public void DrawLine(int x1, int y1, int x2, int y2, Color? color = null) - { - using (var g = GetGraphics()) - { - g.CompositingMode = _compositingMode; - g.DrawLine(GetPen(color ?? _defaultForeground), x1, y1, x2, y2); - } - } - - public void DrawAxis(int x, int y, int size, Color? color = null) - { - DrawLine(x + size, y, x - size, y, color ?? _defaultForeground); - DrawLine(x, y + size, x, y - size, color ?? _defaultForeground); - } - - public void DrawPie(int x, int y, int width, int height, int startangle, int sweepangle, Color? line = null, Color? background = null) - { - using (var g = GetGraphics()) - { - g.CompositingMode = _compositingMode; - var bg = background ?? _defaultBackground; - if (bg.HasValue) - { - var brush = GetBrush(bg.Value); - g.FillPie(brush, x, y, width, height, startangle, sweepangle); - } - - g.DrawPie(GetPen(line ?? _defaultForeground), x + 1, y + 1, width - 1, height - 1, startangle, sweepangle); - } - } - - public void DrawPixel(int x, int y, Color? color = null) - { - using (var g = GetGraphics()) - { - try - { - g.DrawLine(GetPen(color ?? _defaultForeground), x, y, x + 0.1F, y); - } - catch (Exception) - { - return; - } - } - } - - public void DrawPolygon(Point[] points, Color? line = null, Color? background = null) - { - using (var g = GetGraphics()) - { - try - { - g.DrawPolygon(GetPen(line ?? _defaultForeground), points); - var bg = background ?? _defaultBackground; - if (bg.HasValue) - { - g.FillPolygon(GetBrush(bg.Value), points); - } - } - catch (Exception) - { - return; - } - } - } - - public void DrawRectangle(int x, int y, int width, int height, Color? line = null, Color? background = null) - { - using (var g = GetGraphics()) - { - var w = Math.Max(width, 0.1F); - var h = Math.Max(height, 0.1F); - g.DrawRectangle(GetPen(line ?? _defaultForeground), x, y, w, h); - var bg = background ?? _defaultBackground; - if (bg.HasValue) - { - g.FillRectangle(GetBrush(bg.Value), x + 1, y + 1, Math.Max(w - 1, 0), Math.Max(h - 1, 0)); - } - } - } - - public void DrawString(int x, int y, string message, Color? forecolor = null, Color? backcolor = null, int? fontsize = null, - string fontfamily = null, string fontstyle = null, string horizalign = null, string vertalign = null) - { - using (var g = GetGraphics()) - { - try - { - var family = FontFamily.GenericMonospace; - if (fontfamily != null) - { - family = new FontFamily(fontfamily); - } - - var fstyle = FontStyle.Regular; - if (fontstyle != null) - { - switch (fontstyle.ToLower()) - { - default: - case "regular": - break; - case "bold": - fstyle = FontStyle.Bold; - break; - case "italic": - fstyle = FontStyle.Italic; - break; - case "strikethrough": - fstyle = FontStyle.Strikeout; - break; - case "underline": - fstyle = FontStyle.Underline; - break; - } - } - - // The text isn't written out using GenericTypographic, so measuring it using GenericTypographic seemed to make it worse. - // And writing it out with GenericTypographic just made it uglier. :p - var f = new StringFormat(StringFormat.GenericDefault); - var font = new Font(family, fontsize ?? 12, fstyle, GraphicsUnit.Pixel); - Size sizeOfText = g.MeasureString(message, font, 0, f).ToSize(); - if (horizalign != null) - { - switch (horizalign.ToLower()) - { - default: - case "left": - break; - case "center": - x -= sizeOfText.Width / 2; - break; - case "right": - x -= sizeOfText.Width; - break; - } - } - - if (vertalign != null) - { - switch (vertalign.ToLower()) - { - default: - case "bottom": - break; - case "middle": - y -= sizeOfText.Height / 2; - break; - case "top": - y -= sizeOfText.Height; - break; - } - } - - var bg = backcolor ?? _defaultBackground; - if (bg.HasValue) - { - for (var xd = -1; xd <= 1; xd++) - { - for (var yd = -1; yd <= 1; yd++) - { - g.DrawString(message, font, GetBrush(bg.Value), x + xd, y + yd); - } - } - } - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; - g.DrawString(message, font, GetBrush(forecolor ?? _defaultForeground), x, y); - } - catch (Exception) - { - return; - } - } - } - - public void DrawText(int x, int y, string message, Color? forecolor = null, Color? backcolor = null, string fontfamily = null) - { - using (var g = GetGraphics()) - { - try - { - var index = 0; - if (string.IsNullOrEmpty(fontfamily)) - { - index = _defaultPixelFont; - } - else - { - switch (fontfamily) - { - case "fceux": - case "0": - index = 0; - break; - case "gens": - case "1": - index = 1; - break; - default: - Console.WriteLine($"Unable to find font family: {fontfamily}"); - return; - } - } - - var f = new StringFormat(StringFormat.GenericTypographic) - { - FormatFlags = StringFormatFlags.MeasureTrailingSpaces - }; - var font = new Font(GlobalWin.DisplayManager.CustomFonts.Families[index], 8, FontStyle.Regular, GraphicsUnit.Pixel); - Size sizeOfText = g.MeasureString(message, font, 0, f).ToSize(); - var rect = new Rectangle(new Point(x, y), sizeOfText + new Size(1, 0)); - if (backcolor.HasValue) g.FillRectangle(GetBrush(backcolor.Value), rect); - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; - g.DrawString(message, font, GetBrush(forecolor ?? _defaultForeground), x, y); - } - catch (Exception) - { - return; - } - } - } - - public void Text(int x, int y, string message, Color? forecolor = null, string anchor = null) - { - var a = 0; - - if (!string.IsNullOrEmpty(anchor)) - { - switch (anchor) - { - case "0": - case "topleft": - a = 0; - break; - case "1": - case "topright": - a = 1; - break; - case "2": - case "bottomleft": - a = 2; - break; - case "3": - case "bottomright": - a = 3; - break; - } - } - else - { - x -= Emulator.CoreComm.ScreenLogicalOffsetX; - y -= Emulator.CoreComm.ScreenLogicalOffsetY; - } - - GlobalWin.OSD.AddGUIText(message, x, y, Color.Black, forecolor ?? Color.White, a); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs b/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs deleted file mode 100644 index 56e2cd767f..0000000000 --- a/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using System.Windows.Forms; - -using BizHawk.Client.ApiHawk; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class InputApi : IInput - { - public InputApi() : base() - { } - - public Dictionary Get() - { - var buttons = new Dictionary(); - foreach (var kvp in Global.ControllerInputCoalescer.BoolButtons().Where(kvp => kvp.Value)) - { - buttons[kvp.Key] = true; - } - - return buttons; - } - - public Dictionary GetMouse() - { - var buttons = new Dictionary(); - - // TODO - need to specify whether in "emu" or "native" coordinate space. - var p = GlobalWin.DisplayManager.UntransformPoint(Control.MousePosition); - buttons["X"] = p.X; - buttons["Y"] = p.Y; - buttons[MouseButtons.Left.ToString()] = (Control.MouseButtons & MouseButtons.Left) != 0; - buttons[MouseButtons.Middle.ToString()] = (Control.MouseButtons & MouseButtons.Middle) != 0; - buttons[MouseButtons.Right.ToString()] = (Control.MouseButtons & MouseButtons.Right) != 0; - buttons[MouseButtons.XButton1.ToString()] = (Control.MouseButtons & MouseButtons.XButton1) != 0; - buttons[MouseButtons.XButton2.ToString()] = (Control.MouseButtons & MouseButtons.XButton2) != 0; - buttons["Wheel"] = GlobalWin.MainForm.MouseWheelTracker; - return buttons; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs b/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs deleted file mode 100644 index df75742920..0000000000 --- a/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using BizHawk.Client.ApiHawk; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class SaveStateApi : ISaveState - { - public SaveStateApi() : base() - { } - - public void Load(string path) - { - if (!File.Exists(path)) - { - Console.WriteLine($"could not find file: {path}"); - } - else - { - GlobalWin.MainForm.LoadState(path, Path.GetFileName(path), true); - } - } - - public void LoadSlot(int slotNum) - { - if (slotNum >= 0 && slotNum <= 9) - { - GlobalWin.MainForm.LoadQuickSave("QuickSave" + slotNum, true); - } - } - - public void Save(string path) - { - GlobalWin.MainForm.SaveState(path, path, true); - } - - public void SaveSlot(int slotNum) - { - if (slotNum >= 0 && slotNum <= 9) - { - GlobalWin.MainForm.SaveQuickSave("QuickSave" + slotNum); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/Api/Libraries/ToolApi.cs b/BizHawk.Client.EmuHawk/Api/Libraries/ToolApi.cs deleted file mode 100644 index d356761cdf..0000000000 --- a/BizHawk.Client.EmuHawk/Api/Libraries/ToolApi.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using BizHawk.Client.ApiHawk; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public sealed class ToolApi : ITool - { - private class ToolStatic - { - public Type GetTool(string name) - { - var toolType = ReflectionUtil.GetTypeByName(name) - .FirstOrDefault(x => typeof(IToolForm).IsAssignableFrom(x) && !x.IsInterface); - - if (toolType != null) - { - GlobalWin.Tools.Load(toolType); - } - - var selectedTool = GlobalWin.Tools.AvailableTools - .FirstOrDefault(tool => tool.GetType().Name.ToLower() == name.ToLower()); - - if (selectedTool != null) - { - return selectedTool; - } - - return null; - } - - public object CreateInstance(string name) - { - var possibleTypes = ReflectionUtil.GetTypeByName(name); - - if (possibleTypes.Any()) - { - return Activator.CreateInstance(possibleTypes.First()); - } - - return null; - } - - public static void OpenCheats() - { - GlobalWin.Tools.Load(); - } - - public static void OpenHexEditor() - { - GlobalWin.Tools.Load(); - } - - public static void OpenRamWatch() - { - GlobalWin.Tools.LoadRamWatch(loadDialog: true); - } - - public static void OpenRamSearch() - { - GlobalWin.Tools.Load(); - } - - public static void OpenTasStudio() - { - GlobalWin.Tools.Load(); - } - - public static void OpenToolBox() - { - GlobalWin.Tools.Load(); - } - - public static void OpenTraceLogger() - { - GlobalWin.Tools.Load(); - } - - } - [RequiredService] - private static IEmulator Emulator { get; set; } - - [RequiredService] - private static IVideoProvider VideoProvider { get; set; } - - public ToolApi() - { } - - public Type GetTool(string name) - { - var toolType = ReflectionUtil.GetTypeByName(name) - .FirstOrDefault(x => typeof(IToolForm).IsAssignableFrom(x) && !x.IsInterface); - - if (toolType != null) - { - GlobalWin.Tools.Load(toolType); - } - - var selectedTool = GlobalWin.Tools.AvailableTools - .FirstOrDefault(tool => tool.GetType().Name.ToLower() == name.ToLower()); - - if (selectedTool != null) - { - return selectedTool; - } - - return null; - } - - public object CreateInstance(string name) - { - var possibleTypes = ReflectionUtil.GetTypeByName(name); - - if (possibleTypes.Any()) - { - return Activator.CreateInstance(possibleTypes.First()); - } - - return null; - } - - public void OpenCheats() - { - ToolStatic.OpenCheats(); - } - - public void OpenHexEditor() - { - ToolStatic.OpenHexEditor(); - } - - public void OpenRamWatch() - { - ToolStatic.OpenRamWatch(); - } - - public void OpenRamSearch() - { - ToolStatic.OpenRamSearch(); - } - - public void OpenTasStudio() - { - ToolStatic.OpenTasStudio(); - } - - public void OpenToolBox() - { - ToolStatic.OpenToolBox(); - } - - public void OpenTraceLogger() - { - ToolStatic.OpenTraceLogger(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/ArgParser.cs b/BizHawk.Client.EmuHawk/ArgParser.cs deleted file mode 100644 index 6c4823af50..0000000000 --- a/BizHawk.Client.EmuHawk/ArgParser.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.IO; - -namespace BizHawk.Client.EmuHawk -{ - class ArgParser - //parses command line arguments and adds the values to a class attribute - //default values are null for strings and false for boolean - //the last value will overwrite previously set values - //unrecognized parameters are simply ignored or in the worst case assumed to be a ROM name [cmdRom] - { - public string cmdRom = null; - public string cmdLoadSlot = null; - public string cmdLoadState = null; - public string cmdConfigPath = null; - public string cmdConfigFile = null; - public string cmdMovie = null; - public string cmdDumpType = null; - public string cmdDumpName = null; - public HashSet _currAviWriterFrameList; - public int _autoDumpLength; - public bool _autoCloseOnDump = false; - // chrome is never shown, even in windowed mode - public bool _chromeless = false; - public bool startFullscreen = false; - public string luaScript = null; - public bool luaConsole = false; - public int socket_port = 9999; - public string socket_ip = null; - public string mmf_filename = null; - public string URL_get = null; - public string URL_post = null; - - public void ParseArguments(string[] args) - - { - for (int i = 0; i < args.Length; i++) - { - // For some reason sometimes visual studio will pass this to us on the commandline. it makes no sense. - if (args[i] == ">") - { - i++; - var stdout = args[i]; - Console.SetOut(new StreamWriter(stdout)); - continue; - } - - var arg = args[i].ToLower(); - if (arg.StartsWith("--load-slot=")) - { - cmdLoadSlot = arg.Substring(arg.IndexOf('=') + 1); - } - - if (arg.StartsWith("--load-state=")) - { - cmdLoadState = args[i].Substring(args[i].IndexOf('=') + 1); - } - if (arg.StartsWith("--config=")) - { - cmdConfigFile = args[i].Substring(args[i].IndexOf('=') + 1); - } - else if (arg.StartsWith("--movie=")) - { - cmdMovie = args[i].Substring(args[i].IndexOf('=') + 1); - } - else if (arg.StartsWith("--dump-type=")) - { - cmdDumpType = arg.Substring(arg.IndexOf('=') + 1); - } - else if (arg.StartsWith("--dump-frames=")) - { - string list = arg.Substring(arg.IndexOf('=') + 1); - string[] items = list.Split(','); - _currAviWriterFrameList = new HashSet(); - foreach (string item in items) - { - _currAviWriterFrameList.Add(int.Parse(item)); - } - - // automatically set dump length to maximum frame - _autoDumpLength = _currAviWriterFrameList.OrderBy(x => x).Last(); - } - else if (arg.StartsWith("--dump-name=")) - { - cmdDumpName = args[i].Substring(args[i].IndexOf('=') + 1); - } - else if (arg.StartsWith("--dump-length=")) - { - int.TryParse(arg.Substring(arg.IndexOf('=') + 1), out _autoDumpLength); - } - else if (arg.StartsWith("--dump-close")) - { - _autoCloseOnDump = true; - } - else if (arg.StartsWith("--chromeless")) - { - _chromeless = true; - } - else if (arg.StartsWith("--fullscreen")) - { - startFullscreen = true; - } - else if (arg.StartsWith("--lua=")) - { - luaScript = args[i].Substring(args[i].IndexOf('=') + 1); - luaConsole = true; - } - else if (arg.StartsWith("--luaconsole")) - { - luaConsole = true; - } - else if (arg.StartsWith("--socket_port=")) - { - int.TryParse(arg.Substring(arg.IndexOf('=') + 1), out socket_port); - } - else if (arg.StartsWith("--socket_ip=")) - { - socket_ip = arg.Substring(arg.IndexOf('=') + 1); - } - else if (arg.StartsWith("--mmf=")) - { - mmf_filename = args[i].Substring(args[i].IndexOf('=') + 1); - } - else if (arg.StartsWith("--url_get=")) - { - URL_get = args[i].Substring(args[i].IndexOf('=') + 1); - } - else if (arg.StartsWith("--url_post=")) - { - URL_post = args[i].Substring(args[i].IndexOf('=') + 1); - } - else - { - cmdRom = args[i]; - } - } - ////initialize HTTP communication - if (URL_get != null || URL_post != null) - { - if (URL_get != null) - { - GlobalWin.httpCommunication.initialized = true; - GlobalWin.httpCommunication.SetGetUrl(URL_get); - } - if (URL_post != null) - { - GlobalWin.httpCommunication.initialized = true; - GlobalWin.httpCommunication.SetPostUrl(URL_post); - } - } - //inititalize socket server - if (socket_ip != null && socket_port > -1) - { - GlobalWin.socketServer.initialized = true; - GlobalWin.socketServer.SetIp(socket_ip, socket_port); - } - else if (socket_ip != null) - { - GlobalWin.socketServer.initialized = true; - GlobalWin.socketServer.SetIp(socket_ip); - } - - //initialize mapped memory files - if (mmf_filename != null) - { - GlobalWin.memoryMappedFiles.initialized = true; - GlobalWin.memoryMappedFiles.SetFilename(mmf_filename); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/BizBox.cs b/BizHawk.Client.EmuHawk/BizBox.cs deleted file mode 100644 index 14da9178bf..0000000000 --- a/BizHawk.Client.EmuHawk/BizBox.cs +++ /dev/null @@ -1,80 +0,0 @@ -using BizHawk.Emulation.Common; -using System; -using System.Linq; -using System.Reflection; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BizBox : Form - { - public BizBox() - { - InitializeComponent(); - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - linkLabel1.LinkVisited = true; - System.Diagnostics.Process.Start("http://tasvideos.org/Bizhawk.html"); - } - - private void OK_Click(object sender, EventArgs e) - { - Close(); - } - - private void BizBox_Load(object sender, EventArgs e) - { - string mainversion = VersionInfo.Mainversion; - if (IntPtr.Size == 8) - mainversion += " (x64)"; - if (VersionInfo.DeveloperBuild) - { - Text = " BizHawk (GIT " + SubWCRev.GIT_BRANCH + "#" + SubWCRev.GIT_SHORTHASH + ")"; - } - else - { - Text = "Version " + mainversion + " (GIT " + SubWCRev.GIT_BRANCH + "#" + SubWCRev.GIT_SHORTHASH + ")"; - } - - VersionLabel.Text = "Version " + mainversion; - DateLabel.Text = VersionInfo.RELEASEDATE; - - var cores = Assembly - .Load("BizHawk.Emulation.Cores") - .GetTypes() - .Where(t => typeof(IEmulator).IsAssignableFrom(t)) - .Select(t => t.GetCustomAttributes(false).OfType().FirstOrDefault()) - .Where(a => a != null) - .Where(a => a.Released) - .OrderByDescending(a => a.CoreName.ToLower()) - .ToList(); - - foreach (var core in cores) - { - CoreInfoPanel.Controls.Add(new BizBoxInfoControl(core) - { - Dock = DockStyle.Top - }); - } - - linkLabel2.Text = "Commit # " + SubWCRev.GIT_SHORTHASH; - } - - private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://github.com/TASVideos/BizHawk/commit/" + SubWCRev.GIT_SHORTHASH); - } - - private void btnCopyHash_Click(object sender, EventArgs e) - { - System.Windows.Forms.Clipboard.SetText(SubWCRev.GIT_SHORTHASH); - } - - private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://github.com/TASVideos/BizHawk/graphs/contributors"); - } - } -} diff --git a/BizHawk.Client.EmuHawk/BizBox.resx b/BizHawk.Client.EmuHawk/BizBox.resx deleted file mode 100644 index 6862218d0f..0000000000 --- a/BizHawk.Client.EmuHawk/BizBox.resx +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAGEPAABhDwAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAANTMxiCyrZv/nZyJ/5OVg/+Ym5D/ra2t/9LU2BUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA3tvJHZyZco5UVjrYPTYe/zUvFP84NBb/Tkss/29rTP+Afma0pqasVwAA - AAAAAAAAAAAAAAAAAAAAAAAAyM2sQlVUL+UXEA3/CQYA/wABAP9LTEv/EQ8Q/wUEAP8SFAb/REUo/25r - T9WblpVvAAAAAAAAAAAAAAAA0tOwPDw6HvwAAAD/Cw4H/wEFAP86Pjv/z9DP/2dkZv8HAQH/FQ0J/wsF - AP8yMBb/cHBK3qijrloAAAAA7e3ZCFVPNd0CAAD/DxUK/woOAP8WGBT/uby2/2NkY/+8vLz/Ozs5/w0O - Av8RFQv/BQIF/z04G/+FgWuu087QG52dcv8GBgr/Cg0H/xcXDf8AAAD/fXyD/83Mzv8TEhT/pKOj/6+v - rf8MCQT/GRcK/xEODf8NDwb/XV84/62vpv+Hdkr/AAEG/xQTDP8NDQb/Fg8Q/9ja3f+FhYb/AAAA/2Je - YP/u7+7/MDIt/xMPBf8ZFgv/AAAG/0REJf+poYv/0aFw/z8qEP8MDQf/AwYB/ysqLf/5+fr/qaao/woD - Bv+Df4D//////1taV/8KBAD/GRUG/xMMBf+ngU//tKeL/+iwd/+/kEn/IiMO/wABAv9GRkr/+vn7/+De - 3/8zLS7/u7e4//////94dnb/EhYU/xUWDP+Kbjj/6bJu/7eujP/kt2///daQ/5uIS/8YFQn/Ojw//8nF - yP/a2dn/OTQ1/6Wio//V2Nj/jY+T/1ZTT/98aTX/89GR/+S4Yv/AvJv/17pu//jaov/03qL/gmcn/xgX - GP8gIyb/U1VU/2FfXv+Eh4T/oKam/5+mrv+BeGf/3MaQ///lrf/buWP7ydLGNdbOnP/rznn///vN/9i7 - e/8jHBX/AgAE/xINDf96fXr/r6+w/8zQ1P/S2Nr/pqej/97Qu//82oL/ysmJrgAAAADj6tYN38x40ezY - kv+Hp6P/KTIv/wMdJv8WKTH/am5v/5ucmv/g4uX/6evw/8PExf/ZxHv/5c90293bxDkAAAAAAAAAAOjg - vUPCv3XZFJ7N/wCTyP8LbZP/EDM//0JJTv/Gx8X/5+fn/+zq8P+2rpr/1cVo89/aq2kAAAAAAAAAAAAA - AAAAAAAA1duzWEOltf8Hkbz/Fkdc/zNDRv9KWFr/kpKW//z7/P/f4dv/qqWCvt3YsV0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADi3tYNj4+Wp8rKzP/x8vD/6PLw/+fo6//b294ImJuRntfZyygAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3azx3Gysv/qK+x/8C5uP/Dw8P/wcfJOQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAPwfAADwDwAA4AcAAMADAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAIAD - AADABwAA4A8AAPBfAAD4fwAA - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs b/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs deleted file mode 100644 index a8a3c7f7c3..0000000000 --- a/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BizBoxInfoControl : UserControl - { - private string url = ""; - - public BizBoxInfoControl(CoreAttribute attributes) - { - InitializeComponent(); - CoreNameLabel.Text = attributes.CoreName; - - if (!string.IsNullOrEmpty(attributes.Author)) - { - CoreAuthorLabel.Text = "authors: " + attributes.Author; - } - else - { - CoreAuthorLabel.Visible = false; - } - - CorePortedLabel.Text = attributes.Ported ? " (Ported)" : ""; - - if (!attributes.Ported) - { - CoreUrlLink.Visible = false; - } - else - { - CoreUrlLink.Visible = true; - CoreUrlLink.Text = attributes.PortedVersion; - url = attributes.PortedUrl; - } - } - - private void BizBoxInfoControl_Load(object sender, EventArgs e) - { - - } - - private void CoreUrlLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - CoreUrlLink.LinkVisited = true; - System.Diagnostics.Process.Start(url); - } - } -} diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj deleted file mode 100644 index 53c12c988e..0000000000 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ /dev/null @@ -1,2285 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {DD448B37-BA3F-4544-9754-5406E8094723} - WinExe - Properties - BizHawk.Client.EmuHawk - EmuHawk - v4.6.1 - 512 - BizHawk.Client.EmuHawk.Program - false - images\logo.ico - - - 3.5 - - - WINDOWS - publish\ - true - Disk - false - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - None - true - - - true - - - true - ..\output\ - DEBUG;WINDOWS;EXE_PROJECT - true - full - AnyCPU - false - prompt - - AllRules.ruleset - - - ..\output\ - WINDOWS;EXE_PROJECT - true - true - pdbonly - AnyCPU - false - prompt - - AllRules.ruleset - - - - ..\References\GongShell.dll - - - ..\References\ICSharpCode.SharpZipLib.dll - - - - - - ..\References\Newtonsoft.Json.dll - - - False - ..\output\dll\nlua\NLua.dll - False - - - False - ..\References\OpenTK.dll - - - ..\References\x64\SlimDX.dll - - - - 3.5 - - - - - - - 3.5 - - - 3.5 - - - - - - - - - - - PlatformLinkedLibSingleton.cs - - - svnrev.cs - - - VersionInfo.cs - - - Form - - - AboutBox.cs - - - Form - - - ArchiveChooser.cs - - - - - - - - Form - - - FFmpegWriterForm.cs - - - - Form - - - GifWriterForm.cs - - - - Form - - - JMDForm.cs - - - - Component - - - - - - Code - - - Code - - - Code - - - - Form - - - SynclessRecordingTools.cs - - - Form - - - VideoWriterChooserForm.cs - - - - Form - - - BizBox.cs - - - UserControl - - - BizBoxInfoControl.cs - - - - Form - - - AmstradCPCCoreEmulationSettings.cs - - - Form - - - AmstradCPCAudioSettings.cs - - - Form - - - AmstradCPCPokeMemory.cs - - - Form - - - AmstradCPCNonSyncSettings.cs - - - Component - - - AnalogRangeConfig.cs - - - UserControl - - - AnalogRangeConfigControl.cs - - - Form - - - AutofireConfig.cs - - - Form - - - ControllerConfig.cs - - - UserControl - - - AnalogBindControl.cs - - - UserControl - - - UserControl - - - ControllerConfigPanel.cs - - - Form - - - DisplayConfigLite.cs - - - Form - - - FileExtensionPreferences.cs - - - UserControl - - - FileExtensionPreferencesPicker.cs - - - Form - - - FirmwaresConfig.cs - - - Form - - - FirmwaresConfigInfo.cs - - - Form - - - DisplayConfig.cs - - - Component - - - Form - - - CGBColorChooserForm.cs - - - Form - - - ColorChooserForm.cs - - - Form - - - DGBPrefs.cs - - - UserControl - - - GBPrefControl.cs - - - Form - - - GBPrefs.cs - - - Form - - - GenericCoreConfig.cs - - - Form - - - GuiOptions.cs - - - Form - - - HotkeyConfig.cs - - - UserControl - - - InputCompositeWidget.cs - - - Component - - - Form - - - ColecoControllerSettings.cs - - - Form - - - A7800ControllerSettings.cs - - - Form - - - A7800FilterSettings.cs - - - Form - - - IntvControllerSettings.cs - - - Form - - - MessageConfig.cs - - - UserControl - - - N64ControllerSettingControl.cs - - - Form - - - N64ControllersSetup.cs - - - Form - - - N64VideoPluginconfig.cs - - - - Form - - - NesControllerSettings.cs - - - Form - - - NESGraphicsConfig.cs - - - Form - - - NESSoundConfig.cs - - - Form - - - NESSyncSettingsForm.cs - - - Form - - - NESVSSettings.cs - - - Form - - - QuickNesConfig.cs - - - Form - - - PathConfig.cs - - - Form - - - PathInfo.cs - - - Form - - - PCEControllerConfig.cs - - - Form - - - PCEGraphicsConfig.cs - - - Form - - - ProfileConfig.cs - - - Form - - - PSXControllerConfigNew.cs - - - Form - - - PSXHashDiscs.cs - - - Form - - - PSXOptions.cs - - - Form - - - RewindConfig.cs - - - Form - - - SMSGraphicsConfig.cs - - - Form - - - SNESControllerConfig.cs - - - Form - - - SNESOptions.cs - - - Form - - - SoundConfig.cs - - - Form - - - TI83PaletteConfig.cs - - - Form - - - ZXSpectrumAudioSettings.cs - - - Form - - - ZXSpectrumPokeMemory.cs - - - Form - - - ZXSpectrumNonSyncSettings.cs - - - Form - - - ZXSpectrumCoreEmulationSettings.cs - - - Form - - - ZXSpectrumJoystickSettings.cs - - - Form - - - CoreFeatureAnalysis.cs - - - Form - - - ExceptionBox.cs - - - Component - - - - Component - - - Component - - - Form - - - Component - - - InputRoll.cs - Component - - - Component - - - Component - - - Form - - - MsgBox.cs - - - Form - - - PrereqsAlert.cs - - - Form - - - QuickProgressPopup.cs - - - Component - - - Component - - - Component - - - Component - - - Component - - - Component - - - Component - - - Component - - - - - - - - - - - - - - - - - - - Form - - - - - - - - - - - - - - - - - - - - - - Form - - - LogWindow.cs - - - MainForm.cs - Form - - - MainForm.cs - Form - - - Form - - - EditCommentsForm.cs - - - - - Form - - - MainForm.cs - - - MainForm.cs - Form - - - Form - - - EditSubtitlesForm.cs - - - - Form - - - PlayMovie.cs - - - Form - - - RecordMovie.cs - - - Form - - - SubtitleMaker.cs - - - Form - - - NameStateForm.cs - - - Form - - - OpenAdvancedChooser.cs - - - Form - - - PlatformChooser.cs - - - - - - True - True - Resources.resx - - - Form - - - RomStatusPicker.cs - - - - - - - - - - - - - - - Form - - - AutoHawk.cs - - - Form - - - BasicBot.cs - - - UserControl - - - BotControlsRow.cs - - - Form - - - BatchRun.cs - - - - Form - - - CDL.cs - - - UserControl - - - CheatEdit.cs - - - Form - - - Cheats.cs - - - Form - - - AddBreakpointDialog.cs - - - - UserControl - - - BreakpointControl.cs - - - Form - - - GenericDebugger.cs - - - GenericDebugger.cs - Form - - - GenericDebugger.cs - Form - - - GenericDebugger.cs - Form - - - UserControl - - - RegisterBoxControl.cs - - - Form - - - GameShark.cs - - - Form - - - GBAGPUView.cs - - - Form - - - MobileBmpView.cs - - - Form - - - MobileDetailView.cs - - - Form - - - GBGameGenie.cs - - - Form - - - GBGPUView.cs - - - Form - - - GBPrinterView.cs - - - Form - - - GenDbgWind.cs - - - Form - - - GenGameGenie.cs - - - Form - - - VDPViewer.cs - - - Form - - - HexColor.cs - - - Form - - - HexEditor.cs - - - Form - - - HexFind.cs - - - Form - - - NewHexEditor.cs - - - - - - - - - - - - - - - Form - - - LuaCanvas.cs - - - Component - - - Component - - - Form - - - LuaConsole.cs - - - Component - - - Form - - - LuaFunctionsForm.cs - - - Component - - - Form - - - LuaRegisteredFunctionsList.cs - - - Component - - - Form - - - LuaWinform.cs - - - Component - - - Form - - - Form - - - MacroInput.cs - - - - UserControl - - - MultiDiskFileSelector.cs - - - Form - - - MultiDiskBundler.cs - - - Form - - - BarcodeEntry.cs - - - Component - - - Form - - - NESGameGenie.cs - - - Form - - - NESMusicRipper.cs - - - Form - - - NESNameTableViewer.cs - - - Form - - - NESPPU.cs - - - Component - - - Component - - - Component - - - Component - - - Form - - - PCEBGViewer.cs - - - Form - - - PCESoundDebugger.cs - - - Form - - - PCETileViewer.cs - - - Form - - - VDPViewer.cs - - - Form - - - SNESGameGenie.cs - - - Form - - - SNESGraphicsDebugger.cs - - - Component - - - UserControl - - - BookmarksBranchesBox.cs - - - Form - - - DefaultGreenzoneSettings.cs - - - Form - - - FramesPrompt.cs - - - Form - - - GreenzoneSettings.cs - - - Form - - - HeaderEditor.cs - - - Form - - - PatternsForm.cs - - - Form - - - ScreenshotForm.cs - - - TAStudio.cs - Form - - - TAStudio.cs - Form - - - TAStudio.cs - Form - - - UserControl - - - MarkerControl.cs - - - UserControl - - - PlaybackBox.cs - - - Form - - - TAStudio.cs - - - TAStudio.cs - Form - - - TAStudio.cs - Form - - - TAStudio.cs - Form - - - - Form - - - UndoHistoryForm.cs - - - Form - - - TI83KeyPad.cs - - - Form - - - - Form - - - TraceLogger.cs - - - Component - - - - UserControl - - - VirtualPadAnalogButton.cs - - - UserControl - - - VirtualPadAnalogStick.cs - - - Component - - - UserControl - - - VirtualPadDiscManager.cs - - - UserControl - - - VirtualPadTargetScreen.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UserControl - - - VirtualPad.cs - - - Form - - - VirtualpadsTool.cs - - - Form - - - RamPoke.cs - - - Form - - - RamSearch.cs - - - Form - - - RamWatch.cs - - - Form - - - WatchEditor.cs - - - Component - - - - Code - - - FFmpegWriterForm.cs - - - GifWriterForm.cs - - - JMDForm.cs - - - SynclessRecordingTools.cs - - - VideoWriterChooserForm.cs - - - BizBoxInfoControl.cs - - - AmstradCPCCoreEmulationSettings.cs - - - AmstradCPCAudioSettings.cs - - - AmstradCPCPokeMemory.cs - - - AmstradCPCNonSyncSettings.cs - - - AnalogRangeConfigControl.cs - - - ControllerConfig.cs - - - AnalogBindControl.cs - - - ControllerConfigPanel.cs - - - DisplayConfig.cs - - - DisplayConfigLite.cs - Designer - - - FileExtensionPreferences.cs - - - FileExtensionPreferencesPicker.cs - - - FirmwaresConfig.cs - - - FirmwaresConfigInfo.cs - - - CGBColorChooserForm.cs - - - ColorChooserForm.cs - - - DGBPrefs.cs - - - GBPrefControl.cs - - - GBPrefs.cs - - - GenericCoreConfig.cs - - - GuiOptions.cs - - - HotkeyConfig.cs - - - InputCompositeWidget.cs - - - ColecoControllerSettings.cs - - - A7800ControllerSettings.cs - - - A7800FilterSettings.cs - - - IntvControllerSettings.cs - - - N64ControllerSettingControl.cs - - - N64ControllersSetup.cs - - - N64VideoPluginconfig.cs - - - NesControllerSettings.cs - - - NESGraphicsConfig.cs - - - NESSoundConfig.cs - - - NESSyncSettingsForm.cs - - - NESVSSettings.cs - - - QuickNesConfig.cs - - - PathConfig.cs - - - PathInfo.cs - - - PCEControllerConfig.cs - - - PCEGraphicsConfig.cs - - - ProfileConfig.cs - - - PSXControllerConfigNew.cs - - - PSXHashDiscs.cs - - - PSXOptions.cs - - - RewindConfig.cs - - - SMSGraphicsConfig.cs - - - SNESControllerConfig.cs - - - SNESOptions.cs - - - TI83PaletteConfig.cs - - - ZXSpectrumAudioSettings.cs - - - ZXSpectrumPokeMemory.cs - - - ZXSpectrumNonSyncSettings.cs - - - ZXSpectrumCoreEmulationSettings.cs - - - ZXSpectrumJoystickSettings.cs - - - CoreFeatureAnalysis.cs - - - ExceptionBox.cs - - - InputConfigBase.cs - - - MsgBox.cs - - - PrereqsAlert.cs - - - QuickProgressPopup.cs - - - TasListView.cs - - - MainForm.cs - Designer - - - PlayMovie.cs - - - RecordMovie.cs - - - NameStateForm.cs - Designer - - - OpenAdvancedChooser.cs - - - PlatformChooser.cs - - - ResXFileCodeGenerator - Designer - Resources.Designer.cs - - - RomStatusPicker.cs - - - AutoHawk.cs - - - BasicBot.cs - - - BotControlsRow.cs - - - BatchRun.cs - - - CDL.cs - - - CheatEdit.cs - - - Cheats.cs - - - AddBreakpointDialog.cs - - - BreakpointControl.cs - - - GenericDebugger.cs - - - RegisterBoxControl.cs - - - GameShark.cs - Designer - - - GBAGPUView.cs - - - MobileBmpView.cs - - - MobileDetailView.cs - - - GBGameGenie.cs - - - GBGPUView.cs - - - GBPrinterView.cs - - - GenDbgWind.cs - - - GenGameGenie.cs - - - VDPViewer.cs - - - HexColor.cs - - - HexEditor.cs - - - HexFind.cs - - - NewHexEditor.cs - - - LuaCanvas.cs - - - LuaConsole.cs - - - LuaFunctionsForm.cs - - - LuaRegisteredFunctionsList.cs - - - LuaWinform.cs - - - MacroInput.cs - - - MultiDiskFileSelector.cs - - - MultiDiskBundler.cs - - - BarcodeEntry.cs - - - NESGameGenie.cs - - - NESMusicRipper.cs - - - NESNameTableViewer.cs - - - NESPPU.cs - Designer - - - PatternViewer.cs - - - PCEBGViewer.cs - - - PCESoundDebugger.cs - - - PCETileViewer.cs - - - VDPViewer.cs - - - SNESGameGenie.cs - - - SNESGraphicsDebugger.cs - - - BookmarksBranchesBox.cs - Designer - - - DefaultGreenzoneSettings.cs - - - FramesPrompt.cs - - - GreenzoneSettings.cs - - - HeaderEditor.cs - - - MarkerControl.cs - - - PatternsForm.cs - - - PlaybackBox.cs - - - ScreenshotForm.cs - - - TAStudio.cs - - - UndoHistoryForm.cs - - - TI83KeyPad.cs - - - VirtualPadAnalogButton.cs - - - VirtualPadAnalogStick.cs - - - VirtualPadDiscManager.cs - - - VirtualPadTargetScreen.cs - - - VirtualPad.cs - - - VirtualpadsTool.cs - - - RamPoke.cs - - - RamSearch.cs - - - RamWatch.cs - - - WatchEditor.cs - - - Form - - - InputPrompt.cs - - - - Form - - - ToolBox.cs - - - - - - {8e2f11f2-3955-4382-8c3a-ceba1276caea} - BizHawk.Client.ApiHawk - - - {24A0AA3C-B25F-4197-B23D-476D6462DBA0} - BizHawk.Client.Common - - - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3} - BizHawk.Common - - - {e1a23168-b571-411c-b360-2229e7225e0e} - BizHawk.Emulation.Common - - - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA} - BizHawk.Emulation.Cores - - - {f51946ea-827f-4d82-b841-1f2f6d060312} - BizHawk.Emulation.DiscSystem - - - {337CA23E-65E7-44E1-9411-97EE08BB8116} - BizHawk.Bizware.BizwareGL.GdiPlus - - - {5160CFB1-5389-47C1-B7F6-8A0DC97641EE} - BizHawk.Bizware.BizwareGL.OpenTK - - - {E6B436B1-A3CD-4C9A-8F76-5D7154726884} - BizHawk.Bizware.BizwareGL.SlimDX - - - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465} - BizHawk.Bizware.BizwareGL - - - - - AboutBox.cs - Designer - - - ArchiveChooser.cs - Designer - - - BizBox.cs - - - AutofireConfig.cs - - - MessageConfig.cs - Designer - - - SoundConfig.cs - Designer - - - - - - - - LogWindow.cs - - - EditCommentsForm.cs - - - EditSubtitlesForm.cs - - - SubtitleMaker.cs - - - TraceLogger.cs - - - InputPrompt.cs - Designer - - - ToolBox.cs - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - false - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - - - - - "$(SolutionDir)subwcrev.bat" "$(ProjectDir)" - "$(SolutionDir)subwcrev.sh" "$(ProjectDir)" - - - - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Communication.cs b/BizHawk.Client.EmuHawk/Communication.cs deleted file mode 100644 index ba61cd1671..0000000000 --- a/BizHawk.Client.EmuHawk/Communication.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using System.Text; -using System.Net; -using System.Net.Sockets; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Net.Http; -using System.IO.MemoryMappedFiles; -using BizHawk.Bizware.BizwareGL; -using System.Drawing; -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using System.Windows.Forms; -using System.IO; - -namespace BizHawk.Client.EmuHawk -{ - - public class Communication - { - - public class HttpCommunication - { - private static HttpClient client = new HttpClient(); - private string PostUrl = "http://localhost:9876/post/"; - private string GetUrl = "http://localhost:9876/index"; - public bool initialized = false; - private ScreenShot screenShot = new ScreenShot(); - public int timeout = 0; - public int default_timeout = 500; - - public void SetTimeout(int _timeout) - { - //timeout = _timeout.TotalMilliseconds; - if (timeout == 0 && _timeout == 0) - { - timeout = default_timeout; - } - if (_timeout != 0) - { - client.Timeout = new TimeSpan(0, 0, 0, _timeout / 1000, _timeout % 1000); - timeout = _timeout; - } - - } - public void SetPostUrl(string url) - { - PostUrl = url; - } - public void SetGetUrl(string url) - { - GetUrl = url; - } - - public string GetGetUrl() - { - return GetUrl; - } - public string GetPostUrl() - { - return PostUrl; - } - - public async Task Get(string url) - { - client.DefaultRequestHeaders.ConnectionClose = false; - HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false); - if (response.IsSuccessStatusCode) { - return await response.Content.ReadAsStringAsync(); - } - else - { - return null; - } - } - - public async Task Post(string url, FormUrlEncodedContent content) - { - client.DefaultRequestHeaders.ConnectionClose = true; - HttpResponseMessage response = null; - try - { - response = await client.PostAsync(url, content).ConfigureAwait(false); - - } - catch (Exception e) - { - MessageBox.Show(e.ToString()); - return e.ToString(); - - } - if (!response.IsSuccessStatusCode) - { - return null; - } - return await response.Content.ReadAsStringAsync(); - } - - public string TestGet() - { - Task getResponse = Get(GetUrl); - return getResponse.Result; - } - - public string SendScreenshot(string url, string parameter) - { - int trials = 5; - var values = new Dictionary - { - {parameter, screenShot.GetScreenShotAsString()}, - }; - FormUrlEncodedContent content = new FormUrlEncodedContent(values); - - Task postResponse = null; - while (postResponse == null && trials > 0) - { - postResponse = Post(PostUrl, content); - trials -= 1; - } - return postResponse.Result; - } - - public string SendScreenshot() - { - return SendScreenshot(PostUrl, "screenshot"); - } - - public string SendScreenshot(string url) - { - return SendScreenshot(url, "screenshot"); - } - - public string ExecGet(string url) - { - return Get(url).Result; - } - - public string ExecGet() - { - return Get(GetUrl).Result; - } - - public string ExecPost(string url, string payload) - { - var values = new Dictionary - { - {"payload", payload}, - }; - FormUrlEncodedContent content = new FormUrlEncodedContent(values); - return Post(url, content).Result; - } - - public string ExecPost(string payload) - { - var values = new Dictionary - { - {"payload", payload}, - }; - FormUrlEncodedContent content = new FormUrlEncodedContent(values); - return Post(PostUrl, content).Result; - } - } - public class SocketServer - { - - public string ip = "192.168.178.21"; - public int port = 9999; - public Decoder decoder = Encoding.UTF8.GetDecoder(); - public Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - public IPAddress ipAdd; - public IPEndPoint remoteEP; - public IVideoProvider currentVideoProvider = null; - public bool connected = false; - public bool initialized = false; - public int retries = 10; - public bool success = false; //indicates whether the last command was executed succesfully - - public void Initialize(IVideoProvider _currentVideoProvider) - { - currentVideoProvider = _currentVideoProvider; - SetIp(ip, port); - initialized = true; - - } - public void Connect() - { - if (!initialized) - { - Initialize(currentVideoProvider); - } - remoteEP = new IPEndPoint(ipAdd, port); - soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - soc.Connect(remoteEP); - connected = true; - soc.ReceiveTimeout = 5; - - } - public void SetIp(string ip_) - { - ip = ip_; - ipAdd = System.Net.IPAddress.Parse(ip); - remoteEP = new IPEndPoint(ipAdd, port); - } - public void SetIp(string ip_, int port_) - { - ip = ip_; - port = port_; - ipAdd = System.Net.IPAddress.Parse(ip); - remoteEP = new IPEndPoint(ipAdd, port); - - } - public void SetTimeout(int timeout) - { - soc.ReceiveTimeout = timeout; - } - public void SocketConnected() - { - bool part1 = soc.Poll(1000, SelectMode.SelectRead); - bool part2 = (soc.Available == 0); - if (part1 && part2) - connected = false; - else - connected = true; - } - public int SendString(string SendString) - { - - int sentBytes = SendBytes(Encoding.ASCII.GetBytes(SendString)); - success = sentBytes > 0; - return sentBytes; - } - public int SendBytes(byte[] SendBytes) - { - int sentBytes = 0; - try - { - sentBytes = soc.Send(SendBytes); - } - catch - { - sentBytes = -1; - } - return sentBytes; - } - - public string SendScreenshot() - { - return SendScreenshot(0); - } - public string SendScreenshot(int waitingTime) - { - if (!connected) - { - Connect(); - } - ScreenShot screenShot = new ScreenShot(); - using (BitmapBuffer bb = screenShot.MakeScreenShotImage()) - { - using (var img = bb.ToSysdrawingBitmap()) - { - byte[] bmpBytes = screenShot.ImageToByte(img); - int sentBytes = 0; - int tries = 0; - while (sentBytes <= 0 && tries < retries) - { - try - { - tries++; - sentBytes = SendBytes(bmpBytes); - } - catch (SocketException) - { - Connect(); - sentBytes = 0; - } - if (sentBytes == -1) - { - Connect(); - } - } - success = (tries < retries); - } - } - String resp = ""; - if (!success) - { - resp = "Screenshot could not be sent"; - } else - { - resp = "Screenshot was sent"; - } - if (waitingTime == 0) - { - return resp; - } - resp = ""; - resp = ReceiveMessage(); - if (resp == "") - { - resp = "Failed to get a response"; - } - return resp; - } - public string ReceiveMessage() - { - if (!connected) - { - Connect(); - } - string resp = ""; - byte[] receivedBytes = new byte[256]; - int receivedLength = 1; - - while (receivedLength > 0) - { - try - { - receivedLength = soc.Receive(receivedBytes, receivedBytes.Length, 0); - resp += Encoding.ASCII.GetString(receivedBytes); - } catch - { - receivedLength = 0; - } - } - - return resp; - } - public bool Successful() - { - return success; - } - } - - public class MemoryMappedFiles - { - public string filename_main = "BizhawkTemp_main"; - public Dictionary mmf_files = new Dictionary(); - public int index = 0; - public bool initialized = false; - public int main_size = 10 ^ 5; - ScreenShot screenShot = new ScreenShot(); - - public void SetFilename(string filename) - { - filename_main = filename; - } - public string GetFilename() - { - return filename_main; - } - - public int ScreenShotToFile() - { - ScreenShot screenShot = new ScreenShot(); - var bb = screenShot.MakeScreenShotImage(); - var img = bb.ToSysdrawingBitmap(); - byte[] bmpBytes = screenShot.ImageToByte(img); - return WriteToFile(@filename_main, bmpBytes); - } - - public int WriteToFile(string filename, byte[] outputBytes) - { - MemoryMappedFile mmf_file; - int bytesWritten = -1; - if (mmf_files.TryGetValue(filename, out mmf_file) == false) - { - mmf_file = MemoryMappedFile.CreateOrOpen(filename, outputBytes.Length); - mmf_files[filename] = mmf_file; - } - try - { - using (MemoryMappedViewAccessor accessor = mmf_file.CreateViewAccessor(0, outputBytes.Length, MemoryMappedFileAccess.Write)) - { - accessor.WriteArray(0, outputBytes, 0, outputBytes.Length); - bytesWritten = outputBytes.Length; - } - } - catch (UnauthorizedAccessException) - { - try - { - mmf_file.Dispose(); - } - catch (Exception) - { - - } - - mmf_file = MemoryMappedFile.CreateOrOpen(filename, outputBytes.Length); - mmf_files[filename] = mmf_file; - using (MemoryMappedViewAccessor accessor = mmf_file.CreateViewAccessor(0, outputBytes.Length, MemoryMappedFileAccess.Write)) - { - accessor.WriteArray(0, outputBytes, 0, outputBytes.Length); - bytesWritten = outputBytes.Length; - } - } - return bytesWritten; - } - - public string ReadFromFile(string filename, int expectedSize) - { - MemoryMappedFile mmf_file = mmf_file = MemoryMappedFile.OpenExisting(@filename); - using (MemoryMappedViewAccessor viewAccessor = mmf_file.CreateViewAccessor()) - { - byte[] bytes = new byte[expectedSize]; - viewAccessor.ReadArray(0, bytes, 0, bytes.Length); - string text = Encoding.UTF8.GetString(bytes); - return text; - } - } - - } - - class ScreenShot - //makes all functionalities for providing screenshots available - { - private IVideoProvider currentVideoProvider = null; - private ImageConverter converter = new ImageConverter(); - public BitmapBuffer MakeScreenShotImage() - { - if (currentVideoProvider == null) - { - currentVideoProvider = Global.Emulator.AsVideoProviderOrDefault(); - } - return GlobalWin.DisplayManager.RenderVideoProvider(currentVideoProvider); - } - public byte[] ImageToByte(Image img) - { - return (byte[])converter.ConvertTo(img, typeof(byte[])); - } - public string ImageToString(Image img) - { - return Convert.ToBase64String(ImageToByte(img)); - } - public string GetScreenShotAsString() - { - BitmapBuffer bb = MakeScreenShotImage(); - byte[] imgBytes = ImageToByte(bb.ToSysdrawingBitmap()); - return Convert.ToBase64String(imgBytes); - } - } - } -} - diff --git a/BizHawk.Client.EmuHawk/CoreFeatureAnalysis.resx b/BizHawk.Client.EmuHawk/CoreFeatureAnalysis.resx deleted file mode 100644 index 47a90c8c86..0000000000 --- a/BizHawk.Client.EmuHawk/CoreFeatureAnalysis.resx +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 126, 17 - - - - - AAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAGEPAABhDwAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAANTMxiCyrZv/nZyJ/5OVg/+Ym5D/ra2t/9LU2BUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA3tvJHZyZco5UVjrYPTYe/zUvFP84NBb/Tkss/29rTP+Afma0pqasVwAA - AAAAAAAAAAAAAAAAAAAAAAAAyM2sQlVUL+UXEA3/CQYA/wABAP9LTEv/EQ8Q/wUEAP8SFAb/REUo/25r - T9WblpVvAAAAAAAAAAAAAAAA0tOwPDw6HvwAAAD/Cw4H/wEFAP86Pjv/z9DP/2dkZv8HAQH/FQ0J/wsF - AP8yMBb/cHBK3qijrloAAAAA7e3ZCFVPNd0CAAD/DxUK/woOAP8WGBT/uby2/2NkY/+8vLz/Ozs5/w0O - Av8RFQv/BQIF/z04G/+FgWuu087QG52dcv8GBgr/Cg0H/xcXDf8AAAD/fXyD/83Mzv8TEhT/pKOj/6+v - rf8MCQT/GRcK/xEODf8NDwb/XV84/62vpv+Hdkr/AAEG/xQTDP8NDQb/Fg8Q/9ja3f+FhYb/AAAA/2Je - YP/u7+7/MDIt/xMPBf8ZFgv/AAAG/0REJf+poYv/0aFw/z8qEP8MDQf/AwYB/ysqLf/5+fr/qaao/woD - Bv+Df4D//////1taV/8KBAD/GRUG/xMMBf+ngU//tKeL/+iwd/+/kEn/IiMO/wABAv9GRkr/+vn7/+De - 3/8zLS7/u7e4//////94dnb/EhYU/xUWDP+Kbjj/6bJu/7eujP/kt2///daQ/5uIS/8YFQn/Ojw//8nF - yP/a2dn/OTQ1/6Wio//V2Nj/jY+T/1ZTT/98aTX/89GR/+S4Yv/AvJv/17pu//jaov/03qL/gmcn/xgX - GP8gIyb/U1VU/2FfXv+Eh4T/oKam/5+mrv+BeGf/3MaQ///lrf/buWP7ydLGNdbOnP/rznn///vN/9i7 - e/8jHBX/AgAE/xINDf96fXr/r6+w/8zQ1P/S2Nr/pqej/97Qu//82oL/ysmJrgAAAADj6tYN38x40ezY - kv+Hp6P/KTIv/wMdJv8WKTH/am5v/5ucmv/g4uX/6evw/8PExf/ZxHv/5c90293bxDkAAAAAAAAAAOjg - vUPCv3XZFJ7N/wCTyP8LbZP/EDM//0JJTv/Gx8X/5+fn/+zq8P+2rpr/1cVo89/aq2kAAAAAAAAAAAAA - AAAAAAAA1duzWEOltf8Hkbz/Fkdc/zNDRv9KWFr/kpKW//z7/P/f4dv/qqWCvt3YsV0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADi3tYNj4+Wp8rKzP/x8vD/6PLw/+fo6//b294ImJuRntfZyygAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3azx3Gysv/qK+x/8C5uP/Dw8P/wcfJOQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAPwfAADwDwAA4AcAAMADAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAIAD - AADABwAA4A8AAPBfAAD4fwAA - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/FolderBrowserDialogEx.cs b/BizHawk.Client.EmuHawk/CustomControls/FolderBrowserDialogEx.cs deleted file mode 100644 index 31364d04f5..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/FolderBrowserDialogEx.cs +++ /dev/null @@ -1,311 +0,0 @@ -using System.Runtime.InteropServices; -using System.Text; -using System; -using System.Windows.Forms; -using System.ComponentModel; -using System.Security.Permissions; - -//I believe this code is from http://support.microsoft.com/kb/306285 -//The license is assumed to be effectively public domain. -//I saw a version of it with at least one bug fixed at https://github.com/slavat/MailSystem.NET/blob/master/Queuing%20System/ActiveQLibrary/CustomControl/FolderBrowser.cs - -namespace BizHawk.Client.EmuHawk -{ - - /// - /// Component wrapping access to the Browse For Folder common dialog box. - /// Call the ShowDialog() method to bring the dialog box up. - /// - public sealed class FolderBrowserEx : Component - { - private const int MAX_PATH = 260; - - // Root node of the tree view. - private FolderID startLocation = FolderID.Desktop; - - // Browse info options. - private int publicOptions = (int) Win32API.Shell32.BffStyles.RestrictToFilesystem | - (int) Win32API.Shell32.BffStyles.RestrictToDomain; - - private const int privateOptions = (int) (Win32API.Shell32.BffStyles.NewDialogStyle | Win32API.Shell32.BffStyles.ShowTextBox); - - // Description text to show. - public string Description = "Please select a folder below:"; - - /// - /// Enum of CSIDLs identifying standard shell folders. - /// - public enum FolderID - { - Desktop = 0x0000, - Printers = 0x0004, - MyDocuments = 0x0005, - Favorites = 0x0006, - Recent = 0x0008, - SendTo = 0x0009, - StartMenu = 0x000b, - MyComputer = 0x0011, - NetworkNeighborhood = 0x0012, - Templates = 0x0015, - MyPictures = 0x0027, - NetAndDialUpConnections = 0x0031, - } - - /// - /// Helper function that returns the IMalloc interface used by the shell. - /// - private static Win32API.IMalloc GetSHMalloc() - { - Win32API.IMalloc malloc; - Win32API.Shell32.SHGetMalloc(out malloc); - return malloc; - } - - /// - /// Shows the folder browser dialog box. - /// - public DialogResult ShowDialog() - { - return ShowDialog(null); - } - - - private int callback(IntPtr hwnd, uint uMsg, IntPtr lParam, IntPtr lpData) - { - switch (uMsg) - { - case 1: - { - IntPtr str = Marshal.StringToHGlobalUni(SelectedPath); - Win32.SendMessage(hwnd, (0x400 + 103), (IntPtr)1, str); - Marshal.FreeHGlobal(str); - break; - } - - } - return 0; - } - - - /// - /// Shows the folder browser dialog box with the specified owner window. - /// - public DialogResult ShowDialog(IWin32Window owner) - { - IntPtr pidlRoot = IntPtr.Zero; - - // Get/find an owner HWND for this dialog. - IntPtr hWndOwner; - - if (owner != null) - { - hWndOwner = owner.Handle; - } - else - { - hWndOwner = Win32API.GetActiveWindow(); - } - - // Get the IDL for the specific startLocation. - Win32API.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int) startLocation, out pidlRoot); - - if (pidlRoot == IntPtr.Zero) - { - return DialogResult.Cancel; - } - - int mergedOptions = (int) publicOptions | (int) privateOptions; - - if ((mergedOptions & (int) Win32API.Shell32.BffStyles.NewDialogStyle) != 0) - { - if (System.Threading.ApartmentState.MTA == Application.OleRequired()) - mergedOptions = mergedOptions & (~(int) Win32API.Shell32.BffStyles.NewDialogStyle); - } - - IntPtr pidlRet = IntPtr.Zero; - - try - { - // Construct a BROWSEINFO. - Win32API.Shell32.BROWSEINFO bi = new Win32API.Shell32.BROWSEINFO(); - IntPtr buffer = Marshal.AllocHGlobal(MAX_PATH); - - bi.pidlRoot = pidlRoot; - bi.hwndOwner = hWndOwner; - bi.pszDisplayName = buffer; - bi.lpszTitle = Description; - bi.ulFlags = mergedOptions; - bi.lpfn = new Win32API.Shell32.BFFCALLBACK(callback); - // The rest of the fields are initialized to zero by the constructor. - // bi.lParam = IntPtr.Zero; bi.iImage = 0; - - // Show the dialog. - pidlRet = Win32API.Shell32.SHBrowseForFolder(ref bi); - - // Free the buffer you've allocated on the global heap. - Marshal.FreeHGlobal(buffer); - - if (pidlRet == IntPtr.Zero) - { - // User clicked Cancel. - return DialogResult.Cancel; - } - - // Then retrieve the path from the IDList. - StringBuilder sb = new StringBuilder(MAX_PATH); - if (0 == Win32API.Shell32.SHGetPathFromIDList(pidlRet, sb)) - { - return DialogResult.Cancel; - } - - // Convert to a string. - SelectedPath = sb.ToString(); - } - finally - { - Win32API.IMalloc malloc = GetSHMalloc(); - malloc.Free(pidlRoot); - - if (pidlRet != IntPtr.Zero) - { - malloc.Free(pidlRet); - } - } - - return DialogResult.OK; - } - - /// - /// Helper function used to set and reset bits in the publicOptions bitfield. - /// - private void SetOptionField(int mask, bool turnOn) - { - if (turnOn) - publicOptions |= mask; - else - publicOptions &= ~mask; - } - - /// - /// Only return file system directories. If the user selects folders - /// that are not part of the file system, the OK button is unavailable. - /// - [Category("Navigation")] - [Description("Only return file system directories. If the user selects folders " + - "that are not part of the file system, the OK button is unavailable.")] - [DefaultValue(true)] - public bool OnlyFilesystem - { - get { return (publicOptions & (int) Win32API.Shell32.BffStyles.RestrictToFilesystem) != 0; } - set { SetOptionField((int) Win32API.Shell32.BffStyles.RestrictToFilesystem, value); } - } - - /// - /// Location of the root folder from which to start browsing. Only the specified - /// folder and any folders beneath it in the namespace hierarchy appear - /// in the dialog box. - /// - [Category("Navigation")] - [Description("Location of the root folder from which to start browsing. Only the specified " + - "folder and any folders beneath it in the namespace hierarchy appear " + - "in the dialog box.")] - [DefaultValue(typeof (FolderID), "0")] - public FolderID StartLocation - { - get { return startLocation; } - set - { - new UIPermission(UIPermissionWindow.AllWindows).Demand(); - startLocation = value; - } - } - - public string SelectedPath; - - } - - - - - - internal class Win32API - { - // C# representation of the IMalloc interface. - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), - Guid("00000002-0000-0000-C000-000000000046")] - public interface IMalloc - { - [PreserveSig] - IntPtr Alloc([In] int cb); - - [PreserveSig] - IntPtr Realloc([In] IntPtr pv, [In] int cb); - - [PreserveSig] - void Free([In] IntPtr pv); - - [PreserveSig] - int GetSize([In] IntPtr pv); - - [PreserveSig] - int DidAlloc(IntPtr pv); - - [PreserveSig] - void HeapMinimize(); - } - - [DllImport("User32.DLL")] - public static extern IntPtr GetActiveWindow(); - - public class Shell32 - { - // Styles used in the BROWSEINFO.ulFlags field. - [Flags] - public enum BffStyles - { - RestrictToFilesystem = 0x0001, // BIF_RETURNONLYFSDIRS - RestrictToDomain = 0x0002, // BIF_DONTGOBELOWDOMAIN - RestrictToSubfolders = 0x0008, // BIF_RETURNFSANCESTORS - ShowTextBox = 0x0010, // BIF_EDITBOX - ValidateSelection = 0x0020, // BIF_VALIDATE - NewDialogStyle = 0x0040, // BIF_NEWDIALOGSTYLE - BrowseForComputer = 0x1000, // BIF_BROWSEFORCOMPUTER - BrowseForPrinter = 0x2000, // BIF_BROWSEFORPRINTER - BrowseForEverything = 0x4000, // BIF_BROWSEINCLUDEFILES - } - - // Delegate type used in BROWSEINFO.lpfn field. - public delegate int BFFCALLBACK(IntPtr hwnd, uint uMsg, IntPtr lParam, IntPtr lpData); - - [StructLayout(LayoutKind.Sequential, Pack = 8)] - public struct BROWSEINFO - { - public IntPtr hwndOwner; - public IntPtr pidlRoot; - public IntPtr pszDisplayName; - [MarshalAs(UnmanagedType.LPTStr)] public string lpszTitle; - public int ulFlags; - [MarshalAs(UnmanagedType.FunctionPtr)] public BFFCALLBACK lpfn; - public IntPtr lParam; - public int iImage; - } - - [DllImport("Shell32.DLL")] - public static extern int SHGetMalloc(out IMalloc ppMalloc); - - [DllImport("Shell32.DLL")] - public static extern int SHGetSpecialFolderLocation( - IntPtr hwndOwner, int nFolder, out IntPtr ppidl); - - [DllImport("Shell32.DLL")] - public static extern int SHGetPathFromIDList( - IntPtr pidl, StringBuilder Path); - - [DllImport("Shell32.DLL", CharSet = CharSet.Auto)] - public static extern IntPtr SHBrowseForFolder(ref BROWSEINFO bi); - } - } - - - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/GDIRenderer.cs b/BizHawk.Client.EmuHawk/CustomControls/GDIRenderer.cs deleted file mode 100644 index 5bbe8445fc..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/GDIRenderer.cs +++ /dev/null @@ -1,770 +0,0 @@ -using System; -using System.Text; -using System.Collections.Generic; -using System.Drawing; -using System.Runtime.InteropServices; - -namespace BizHawk.Client.EmuHawk.CustomControls -{ - /// - /// Wrapper for GDI rendering functions - /// This class is not thread-safe as GDI functions should be called from the UI thread - /// - public sealed class GDIRenderer : IDisposable - { - /// - /// used for calculation. - /// - private static readonly int[] CharFit = new int[1]; - - /// - /// used for calculation - /// - private static readonly int[] CharFitWidth = new int[1000]; - - /// - /// Cache of all the HFONTs used, rather than create them again and again - /// - private readonly Dictionary FontsCache = new Dictionary(); - - class FontCacheEntry - { - public IntPtr HFont; - } - - /// - /// Cache of all the brushes used, rather than create them again and again - /// - private readonly Dictionary BrushCache = new Dictionary(); - - private Graphics _g; - private IntPtr _hdc; - private IntPtr _currentBrush = IntPtr.Zero; - - #region Construct and Destroy - - public GDIRenderer() - { - //zero 04-16-2016 : this can't be legal, theres no HDC yet - //SetBkMode(_hdc, BkModes.OPAQUE); - } - - public void Dispose() - { - foreach (var brush in BrushCache) - { - if (brush.Value != IntPtr.Zero) - { - DeleteObject(brush.Value); - } - } - - foreach (var fc in FontsCache) - DeleteObject(fc.Value.HFont); - - EndOffScreenBitmap(); - - System.Diagnostics.Debug.Assert(_hdc == IntPtr.Zero, "Disposed a GDIRenderer while it held an HDC"); - System.Diagnostics.Debug.Assert(_g == null, "Disposed a GDIRenderer while it held a Graphics"); - } - - #endregion - - #region Api - - /// - /// Draw a bitmap object at the given position - /// - public void DrawBitmap(Bitmap bitmap, Point point, bool blend = false) - { - IntPtr hbmp = bitmap.GetHbitmap(); - var bitHDC = CreateCompatibleDC(CurrentHDC); - IntPtr old = SelectObject(bitHDC, hbmp); - if (blend) - { - AlphaBlend(CurrentHDC, point.X, point.Y, bitmap.Width, bitmap.Height, bitHDC, 0, 0, bitmap.Width, bitmap.Height, new BLENDFUNCTION(AC_SRC_OVER, 0, 0xff, AC_SRC_ALPHA)); - } - else - { - BitBlt(CurrentHDC, point.X, point.Y, bitmap.Width, bitmap.Height, bitHDC, 0, 0, 0xCC0020); - } - SelectObject(bitHDC, old); - DeleteDC(bitHDC); - DeleteObject(hbmp); - } - - /// - /// Required to use before calling drawing methods - /// - public GdiGraphicsLock LockGraphics(Graphics g) - { - _g = g; - _hdc = g.GetHdc(); - SetBkMode(_hdc, BkModes.TRANSPARENT); - return new GdiGraphicsLock(this); - } - - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font - /// - public Size MeasureString(string str, Font font) - { - SetFont(font); - - var size = new Size(); - GetTextExtentPoint32(CurrentHDC, str, str.Length, ref size); - return size; - } - - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font - /// Restrict the width of the string and get the number of characters able to fit in the restriction and - /// the width those characters take - /// - /// the max width to render the string in - /// the number of characters that will fit under restriction - /// - public Size MeasureString(string str, Font font, float maxWidth, out int charFit, out int charFitWidth) - { - SetFont(font); - - var size = new Size(); - GetTextExtentExPoint(CurrentHDC, str, str.Length, (int)Math.Round(maxWidth), CharFit, CharFitWidth, ref size); - charFit = CharFit[0]; - charFitWidth = charFit > 0 ? CharFitWidth[charFit - 1] : 0; - return size; - } - - public void DrawString(string str, Point point) - { - TextOut(CurrentHDC, point.X, point.Y, str, str.Length); - } - - public static IntPtr CreateNormalHFont(Font font, int width) - { - LOGFONT logf = new LOGFONT(); - font.ToLogFont(logf); - logf.lfWidth = width; - logf.lfOutPrecision = (byte)FontPrecision.OUT_TT_ONLY_PRECIS; - var ret = CreateFontIndirect(logf); - return ret; - } - - //this returns an IntPtr HFONT because .net's Font class will erase the relevant properties when using its Font.FromLogFont() - //note that whether this is rotated clockwise or CCW might affect how you have to position the text (right-aligned sometimes?, up or down by the height of the font?) - public static IntPtr CreateRotatedHFont(Font font, bool CW) - { - LOGFONT logf = new LOGFONT(); - font.ToLogFont(logf); - logf.lfEscapement = CW ? 2700 : 900; - logf.lfOrientation = logf.lfEscapement; - logf.lfOutPrecision = (byte)FontPrecision.OUT_TT_ONLY_PRECIS; - - //this doesnt work! .net erases the relevant propreties.. it seems? - //return Font.FromLogFont(logf); - - var ret = CreateFontIndirect(logf); - return ret; - } - - public static void DestroyHFont(IntPtr hfont) - { - DeleteObject(hfont); - } - - public void PrepDrawString(IntPtr hfont, Color color) - { - SetGraphicsMode(CurrentHDC, 2); //shouldnt be necessary.. cant hurt - SelectObject(CurrentHDC, hfont); - SetTextColor(color); - } - - public void PrepDrawString(Font font, Color color) - { - SetFont(font); - SetTextColor(color); - } - - - /// - /// Draw the given string using the given font and foreground color at given location - /// See [http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx][15] - /// - public void DrawString(string str, Font font, Color color, Rectangle rect, TextFormatFlags flags) - { - SetFont(font); - SetTextColor(color); - - var rect2 = new Rect(rect); - DrawText(CurrentHDC, str, str.Length, ref rect2, (uint)flags); - } - - - /// - /// Set the text color of the device context - /// - public void SetTextColor(Color color) - { - int rgb = (color.B & 0xFF) << 16 | (color.G & 0xFF) << 8 | color.R; - SetTextColor(CurrentHDC, rgb); - } - - public void SetBackgroundColor(Color color) - { - int rgb = (color.B & 0xFF) << 16 | (color.G & 0xFF) << 8 | color.R; - SetBkColor(CurrentHDC, rgb); - } - - public void DrawRectangle(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) - { - Rectangle(CurrentHDC, nLeftRect, nTopRect, nRightRect, nBottomRect); - } - - public void SetBrush(Color color) - { - if (BrushCache.ContainsKey(color)) - { - _currentBrush = BrushCache[color]; - } - else - { - int rgb = (color.B & 0xFF) << 16 | (color.G & 0xFF) << 8 | color.R; - var newBrush = CreateSolidBrush(rgb); - BrushCache.Add(color, newBrush); - _currentBrush = newBrush; - } - } - - public void FillRectangle(int x, int y, int w, int h) - { - var r = new GDIRect(new Rectangle(x, y, w, h)); - FillRect(CurrentHDC, ref r, _currentBrush); - } - - public void SetPenPosition(int x, int y) - { - MoveToEx(CurrentHDC, x, y, IntPtr.Zero); - } - - public void SetSolidPen(Color color) - { - int rgb = (color.B & 0xFF) << 16 | (color.G & 0xFF) << 8 | color.R; - SelectObject(CurrentHDC, GetStockObject((int)PaintObjects.DC_PEN)); - SetDCPenColor(CurrentHDC, rgb); - } - - public void Line(int x1, int y1, int x2, int y2) - { - MoveToEx(CurrentHDC, x1, y1, IntPtr.Zero); - LineTo(CurrentHDC, x2, y2); - } - - private IntPtr CurrentHDC - { - get { return _bitHDC != IntPtr.Zero ? _bitHDC : _hdc; } - } - - private IntPtr _bitMap = IntPtr.Zero; - private IntPtr _bitHDC = IntPtr.Zero; - private int _bitW; - private int _bitH; - - public void StartOffScreenBitmap(int width, int height) - { - _bitW = width; - _bitH = height; - - _bitHDC = CreateCompatibleDC(_hdc); - _bitMap = CreateCompatibleBitmap(_hdc, width, height); - SelectObject(_bitHDC, _bitMap); - SetBkMode(_bitHDC, BkModes.TRANSPARENT); - } - - public void EndOffScreenBitmap() - { - _bitW = 0; - _bitH = 0; - - DeleteObject(_bitMap); - DeleteObject(_bitHDC); - - _bitHDC = IntPtr.Zero; - _bitMap = IntPtr.Zero; - } - - public void CopyToScreen() - { - BitBlt(_hdc, 0, 0, _bitW, _bitH, _bitHDC, 0, 0, 0x00CC0020); - } - - #endregion - - #region Helpers - - /// - /// Set a resource (e.g. a font) for the specified device context. - /// - private void SetFont(Font font) - { - SelectObject(CurrentHDC, GetCachedHFont(font)); - } - - private IntPtr GetCachedHFont(Font font) - { - //the original code struck me as bad. attempting to ID fonts by picking a subset of their fields is not gonna work. - //don't call this.Font in InputRoll.cs, it is probably slow. - //consider Fonts to be a jealously guarded resource (they need to be disposed, after all) and manage them carefully. - //this cache maintains the HFONTs only. - FontCacheEntry ce; - if (!FontsCache.TryGetValue(font, out ce)) - { - FontsCache[font] = ce = new FontCacheEntry(); - ce.HFont = font.ToHfont(); - } - return ce.HFont; - } - - #endregion - - #region Imports - - [DllImport("user32.dll")] - private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); - - [DllImport("user32.dll")] - private static extern IntPtr GetDC(IntPtr hWnd); - - [DllImport("user32.dll")] - private static extern IntPtr BeginPaint(IntPtr hWnd, ref IntPtr lpPaint); - - [DllImport("user32.dll")] - private static extern IntPtr EndPaint(IntPtr hWnd, IntPtr lpPaint); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - private static extern IntPtr CreateFontIndirect( - [In, MarshalAs(UnmanagedType.LPStruct)]LOGFONT lplf - ); - - [DllImport("gdi32.dll")] - private static extern int Rectangle(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); - - [DllImport("user32.dll")] - private static extern int FillRect(IntPtr hdc, [In] ref GDIRect lprc, IntPtr hbr); - - [DllImport("gdi32.dll")] - private static extern int SetBkMode(IntPtr hdc, BkModes mode); - - [DllImport("gdi32.dll")] - private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiObj); - - [DllImport("gdi32.dll")] - private static extern int SetTextColor(IntPtr hdc, int color); - - [DllImport("gdi32.dll")] - private static extern int SetBkColor(IntPtr hdc, int color); - - [DllImport("gdi32.dll", EntryPoint = "GetTextExtentPoint32W")] - private static extern int GetTextExtentPoint32(IntPtr hdc, [MarshalAs(UnmanagedType.LPWStr)] string str, int len, ref Size size); - - [DllImport("gdi32.dll", EntryPoint = "GetTextExtentExPointW")] - private static extern bool GetTextExtentExPoint(IntPtr hDc, [MarshalAs(UnmanagedType.LPWStr)]string str, int nLength, int nMaxExtent, int[] lpnFit, int[] alpDx, ref Size size); - - [DllImport("gdi32.dll", EntryPoint = "TextOutW")] - private static extern bool TextOut(IntPtr hdc, int x, int y, [MarshalAs(UnmanagedType.LPWStr)] string str, int len); - - [DllImport("gdi32.dll")] - public static extern int SetGraphicsMode(IntPtr hdc, int iMode); - - [DllImport("user32.dll", EntryPoint = "DrawTextW")] - private static extern int DrawText(IntPtr hdc, [MarshalAs(UnmanagedType.LPWStr)] string str, int len, ref Rect rect, uint uFormat); - - [DllImport("gdi32.dll", EntryPoint = "ExtTextOutW")] - private static extern bool ExtTextOut(IntPtr hdc, int X, int Y, uint fuOptions, uint cbCount, [In] IntPtr lpDx); - - [DllImport("gdi32.dll")] - static extern bool SetWorldTransform(IntPtr hdc, [In] ref XFORM lpXform); - - [DllImport("gdi32.dll")] - private static extern int SelectClipRgn(IntPtr hdc, IntPtr hrgn); - - [DllImport("gdi32.dll")] - private static extern bool DeleteObject(IntPtr hObject); - - [DllImport("gdi32.dll")] - private static extern IntPtr CreateSolidBrush(int color); - - [DllImport("gdi32.dll")] - private static extern IntPtr CreatePen(int fnPenStyle, int nWidth, int color); - - [DllImport("gdi32.dll")] - private static extern IntPtr MoveToEx(IntPtr hdc, int x, int y, IntPtr point); - - [DllImport("gdi32.dll")] - private static extern IntPtr LineTo(IntPtr hdc, int nXEnd, int nYEnd); - - [DllImport("gdi32.dll")] - private static extern IntPtr GetStockObject(int fnObject); - - [DllImport("gdi32.dll")] - private static extern IntPtr SetDCPenColor(IntPtr hdc, int crColor); - - [DllImport("gdi32.dll")] - private static extern IntPtr CreateCompatibleDC(IntPtr hdc); - - [DllImport("gdi32.dll", EntryPoint = "DeleteDC")] - public static extern bool DeleteDC([In] IntPtr hdc); - - [DllImport("gdi32.dll")] - private static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int width, int height); - - [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); - - [DllImport("gdi32.dll", EntryPoint = "GdiAlphaBlend")] - static extern bool AlphaBlend(IntPtr hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BLENDFUNCTION blendFunction); - - public enum FontWeight : int - { - FW_DONTCARE = 0, - FW_THIN = 100, - FW_EXTRALIGHT = 200, - FW_LIGHT = 300, - FW_NORMAL = 400, - FW_MEDIUM = 500, - FW_SEMIBOLD = 600, - FW_BOLD = 700, - FW_EXTRABOLD = 800, - FW_HEAVY = 900, - } - public enum FontCharSet : byte - { - ANSI_CHARSET = 0, - DEFAULT_CHARSET = 1, - SYMBOL_CHARSET = 2, - SHIFTJIS_CHARSET = 128, - HANGEUL_CHARSET = 129, - HANGUL_CHARSET = 129, - GB2312_CHARSET = 134, - CHINESEBIG5_CHARSET = 136, - OEM_CHARSET = 255, - JOHAB_CHARSET = 130, - HEBREW_CHARSET = 177, - ARABIC_CHARSET = 178, - GREEK_CHARSET = 161, - TURKISH_CHARSET = 162, - VIETNAMESE_CHARSET = 163, - THAI_CHARSET = 222, - EASTEUROPE_CHARSET = 238, - RUSSIAN_CHARSET = 204, - MAC_CHARSET = 77, - BALTIC_CHARSET = 186, - } - public enum FontPrecision : byte - { - OUT_DEFAULT_PRECIS = 0, - OUT_STRING_PRECIS = 1, - OUT_CHARACTER_PRECIS = 2, - OUT_STROKE_PRECIS = 3, - OUT_TT_PRECIS = 4, - OUT_DEVICE_PRECIS = 5, - OUT_RASTER_PRECIS = 6, - OUT_TT_ONLY_PRECIS = 7, - OUT_OUTLINE_PRECIS = 8, - OUT_SCREEN_OUTLINE_PRECIS = 9, - OUT_PS_ONLY_PRECIS = 10, - } - public enum FontClipPrecision : byte - { - CLIP_DEFAULT_PRECIS = 0, - CLIP_CHARACTER_PRECIS = 1, - CLIP_STROKE_PRECIS = 2, - CLIP_MASK = 0xf, - CLIP_LH_ANGLES = (1 << 4), - CLIP_TT_ALWAYS = (2 << 4), - CLIP_DFA_DISABLE = (4 << 4), - CLIP_EMBEDDED = (8 << 4), - } - public enum FontQuality : byte - { - DEFAULT_QUALITY = 0, - DRAFT_QUALITY = 1, - PROOF_QUALITY = 2, - NONANTIALIASED_QUALITY = 3, - ANTIALIASED_QUALITY = 4, - CLEARTYPE_QUALITY = 5, - CLEARTYPE_NATURAL_QUALITY = 6, - } - [Flags] - public enum FontPitchAndFamily : byte - { - DEFAULT_PITCH = 0, - FIXED_PITCH = 1, - VARIABLE_PITCH = 2, - FF_DONTCARE = (0 << 4), - FF_ROMAN = (1 << 4), - FF_SWISS = (2 << 4), - FF_MODERN = (3 << 4), - FF_SCRIPT = (4 << 4), - FF_DECORATIVE = (5 << 4), - } - - //it is important for this to be the right declaration - //see more here http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2004-04/0319.html - //if it's wrong (I had a wrong one from pinvoke.net) then ToLogFont will fail mysteriously - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - class LOGFONT - { - public int lfHeight = 0; - public int lfWidth = 0; - public int lfEscapement = 0; - public int lfOrientation = 0; - public int lfWeight = 0; - public byte lfItalic = 0; - public byte lfUnderline = 0; - public byte lfStrikeOut = 0; - public byte lfCharSet = 0; - public byte lfOutPrecision = 0; - public byte lfClipPrecision = 0; - public byte lfQuality = 0; - public byte lfPitchAndFamily = 0; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] - public string lfFaceName = null; - } - - /// - /// The graphics mode that can be set by SetGraphicsMode. - /// - public enum GraphicsMode : int - { - /// - /// Sets the graphics mode that is compatible with 16-bit Windows. This is the default mode. If - /// this value is specified, the application can only modify the world-to-device transform by - /// calling functions that set window and viewport extents and origins, but not by using - /// SetWorldTransform or ModifyWorldTransform; calls to those functions will fail. - /// Examples of functions that set window and viewport extents and origins are SetViewportExtEx - /// and SetWindowExtEx. - /// - GM_COMPATIBLE = 1, - /// - /// Sets the advanced graphics mode that allows world transformations. This value must be - /// specified if the application will set or modify the world transformation for the specified - /// device context. In this mode all graphics, including text output, fully conform to the - /// world-to-device transformation specified in the device context. - /// - GM_ADVANCED = 2, - } - - /// - /// The XFORM structure specifies a world-space to page-space transformation. - /// - [StructLayout(LayoutKind.Sequential)] - public struct XFORM - { - public float eM11; - public float eM12; - public float eM21; - public float eM22; - public float eDx; - public float eDy; - - public XFORM(float eM11, float eM12, float eM21, float eM22, float eDx, float eDy) - { - this.eM11 = eM11; - this.eM12 = eM12; - this.eM21 = eM21; - this.eM22 = eM22; - this.eDx = eDx; - this.eDy = eDy; - } - - /// - /// Allows implicit converstion to a managed transformation matrix. - /// - public static implicit operator System.Drawing.Drawing2D.Matrix(XFORM xf) - { - return new System.Drawing.Drawing2D.Matrix(xf.eM11, xf.eM12, xf.eM21, xf.eM22, xf.eDx, xf.eDy); - } - - /// - /// Allows implicit converstion from a managed transformation matrix. - /// - public static implicit operator XFORM(System.Drawing.Drawing2D.Matrix m) - { - float[] elems = m.Elements; - return new XFORM(elems[0], elems[1], elems[2], elems[3], elems[4], elems[5]); - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct BLENDFUNCTION - { - byte BlendOp; - byte BlendFlags; - byte SourceConstantAlpha; - byte AlphaFormat; - - public BLENDFUNCTION(byte op, byte flags, byte alpha, byte format) - { - BlendOp = op; - BlendFlags = flags; - SourceConstantAlpha = alpha; - AlphaFormat = format; - } - } - - const byte AC_SRC_OVER = 0x00; - const byte AC_SRC_ALPHA = 0x01; - - [DllImport("gdi32.dll")] - static extern int SetBitmapBits(IntPtr hbmp, uint cBytes, byte[] lpBits); - - #endregion - - #region Classes, Structs, and Enums - - public class GdiGraphicsLock : IDisposable - { - private readonly GDIRenderer Gdi; - - public GdiGraphicsLock(GDIRenderer gdi) - { - this.Gdi = gdi; - } - - public void Dispose() - { - Gdi._g.ReleaseHdc(Gdi._hdc); - Gdi._hdc = IntPtr.Zero; - Gdi._g = null; - } - } - - private struct Rect - { - private int _left; - private int _top; - private int _right; - private int _bottom; - - public Rect(Rectangle r) - { - _left = r.Left; - _top = r.Top; - _bottom = r.Bottom; - _right = r.Right; - } - } - - private struct GDIRect - { - private int left; - private int top; - private int right; - private int bottom; - - public GDIRect(Rectangle r) - { - left = r.Left; - top = r.Top; - bottom = r.Bottom; - right = r.Right; - } - } - - private struct GDIPoint - { - private int x; - private int y; - - private GDIPoint(int x, int y) - { - this.x = x; - this.y = y; - } - } - - [Flags] - public enum ETOOptions : uint - { - CLIPPED = 0x4, - GLYPH_INDEX = 0x10, - IGNORELANGUAGE = 0x1000, - NUMERICSLATIN = 0x800, - NUMERICSLOCAL = 0x400, - OPAQUE = 0x2, - PDY = 0x2000, - RTLREADING = 0x800, - } - - /// - /// See [http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx][15] - /// - [Flags] - public enum TextFormatFlags : uint - { - Default = 0x00000000, - Center = 0x00000001, - Right = 0x00000002, - VCenter = 0x00000004, - Bottom = 0x00000008, - WordBreak = 0x00000010, - SingleLine = 0x00000020, - ExpandTabs = 0x00000040, - TabStop = 0x00000080, - NoClip = 0x00000100, - ExternalLeading = 0x00000200, - CalcRect = 0x00000400, - NoPrefix = 0x00000800, - Internal = 0x00001000, - EditControl = 0x00002000, - PathEllipsis = 0x00004000, - EndEllipsis = 0x00008000, - ModifyString = 0x00010000, - RtlReading = 0x00020000, - WordEllipsis = 0x00040000, - NoFullWidthCharBreak = 0x00080000, - HidePrefix = 0x00100000, - ProfixOnly = 0x00200000, - } - - [Flags] - public enum PenStyles - { - PS_SOLID = 0x00000000 - // TODO - } - - public enum PaintObjects - { - WHITE_BRUSH = 0, - LTGRAY_BRUSH = 1, - GRAY_BRUSH = 2, - DKGRAY_BRUSH = 3, - BLACK_BRUSH = 4, - NULL_BRUSH = 5, - WHITE_PEN = 6, - BLACK_PEN = 7, - NULL_PEN = 8, - OEM_FIXED_FONT = 10, - ANSI_FIXED_FONT = 11, - ANSI_VAR_FONT = 12, - SYSTEM_FONT = 13, - DEVICE_DEFAULT_FONT = 14, - DEFAULT_PALETTE = 15, - SYSTEM_FIXED_FONT = 16, - DC_BRUSH = 18, - DC_PEN = 19, - } - - public enum BkModes : int - { - TRANSPARENT = 1, - OPAQUE = 2 - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/HexView.cs b/BizHawk.Client.EmuHawk/CustomControls/HexView.cs deleted file mode 100644 index 30faae953b..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/HexView.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.CustomControls; - -namespace BizHawk.Client.EmuHawk -{ - public class HexView : Control - { - private readonly GDIRenderer Gdi; - private readonly Font NormalFont; - private Size _charSize; - - private long _arrayLength; - - public HexView() - { - NormalFont = new Font("Courier New", 8); // Only support fixed width - - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.SupportsTransparentBackColor, true); - SetStyle(ControlStyles.Opaque, true); - - Gdi = new GDIRenderer(); - - using (var g = CreateGraphics()) - using (var LCK = Gdi.LockGraphics(g)) - { - _charSize = Gdi.MeasureString("A", NormalFont); // TODO make this a property so changing it updates other values. - } - } - - protected override void Dispose(bool disposing) - { - Gdi.Dispose(); - - NormalFont.Dispose(); - - base.Dispose(disposing); - } - - #region Paint - - protected override void OnPaint(PaintEventArgs e) - { - using (var LCK = Gdi.LockGraphics(e.Graphics)) - { - Gdi.StartOffScreenBitmap(Width, Height); - - // White Background - Gdi.SetBrush(Color.White); - Gdi.SetSolidPen(Color.White); - Gdi.FillRectangle(0, 0, Width, Height); - - - Gdi.DrawString("Hello World", new Point(10, 10)); - - Gdi.CopyToScreen(); - Gdi.EndOffScreenBitmap(); - } - } - - #endregion - - #region Properties - - /// - /// Gets or sets the sets the virtual number of the length of the array to display - /// - [Category("Behavior")] - public long ArrayLength - { - get - { - return _arrayLength; - } - - set - { - _arrayLength = value; - RecalculateScrollBars(); - } - } - - #endregion - - #region Event Handlers - - [Category("Virtual")] - public event QueryIndexValueHandler QueryIndexValue; - - [Category("Virtual")] - public event QueryIndexBkColorHandler QueryIndexBgColor; - - [Category("Virtual")] - public event QueryIndexForeColorHandler QueryIndexForeColor; - - public delegate void QueryIndexValueHandler(int index, out long value); - - public delegate void QueryIndexBkColorHandler(int index, ref Color color); - - public delegate void QueryIndexForeColorHandler(int index, ref Color color); - - #endregion - - private void RecalculateScrollBars() - { - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputConfigBase.cs b/BizHawk.Client.EmuHawk/CustomControls/InputConfigBase.cs deleted file mode 100644 index 74318434a4..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/InputConfigBase.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class InputConfigBase : Form - { - public void CheckDups() - { - Dictionary dups = new Dictionary(); - foreach (Control c in Controls) - { - SmartTextBoxControl stbc = c as SmartTextBoxControl; - if (stbc == null) continue; - if (dups.ContainsKey(stbc.Text)) - { - MessageBox.Show("DUP!"); - return; - } - dups[stbc.Text] = true; - } - } - - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.Drawing.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll.Drawing.cs deleted file mode 100644 index 8323a367bb..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.Drawing.cs +++ /dev/null @@ -1,621 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class InputRoll - { - protected override void OnPaint(PaintEventArgs e) - { - using (_gdi.LockGraphics(e.Graphics)) - { - _gdi.StartOffScreenBitmap(Width, Height); - - // White Background - _gdi.SetBrush(Color.White); - _gdi.SetSolidPen(Color.White); - _gdi.FillRectangle(0, 0, Width, Height); - - // Lag frame calculations - SetLagFramesArray(); - - var visibleColumns = _columns.VisibleColumns.ToList(); - - if (visibleColumns.Any()) - { - DrawColumnBg(e, visibleColumns); - DrawColumnText(e, visibleColumns); - } - - // Background - DrawBg(e, visibleColumns); - - // Foreground - DrawData(e, visibleColumns); - - DrawColumnDrag(e); - DrawCellDrag(e); - - _gdi.CopyToScreen(); - _gdi.EndOffScreenBitmap(); - } - } - - protected override void OnPaintBackground(PaintEventArgs pevent) - { - // Do nothing, and this should never be called - } - - private void DrawColumnDrag(PaintEventArgs e) - { - if (_columnDown != null && _columnDownMoved && _currentX.HasValue && _currentY.HasValue && IsHoveringOnColumnCell) - { - int x1 = _currentX.Value - (_columnDown.Width.Value / 2); - int y1 = _currentY.Value - (CellHeight / 2); - int x2 = x1 + _columnDown.Width.Value; - int y2 = y1 + CellHeight; - - _gdi.SetSolidPen(_backColor); - _gdi.DrawRectangle(x1, y1, x2, y2); - _gdi.PrepDrawString(_normalFont, _foreColor); - _gdi.DrawString(_columnDown.Text, new Point(x1 + CellWidthPadding, y1 + CellHeightPadding)); - } - } - - private void DrawCellDrag(PaintEventArgs e) - { - if (_draggingCell != null) - { - var text = ""; - int offsetX = 0; - int offsetY = 0; - QueryItemText?.Invoke(_draggingCell.RowIndex.Value, _draggingCell.Column, out text, ref offsetX, ref offsetY); - - Color bgColor = _backColor; - QueryItemBkColor?.Invoke(_draggingCell.RowIndex.Value, _draggingCell.Column, ref bgColor); - - int x1 = _currentX.Value - (_draggingCell.Column.Width.Value / 2); - int y1 = _currentY.Value - (CellHeight / 2); - int x2 = x1 + _draggingCell.Column.Width.Value; - int y2 = y1 + CellHeight; - - - _gdi.SetBrush(bgColor); - _gdi.FillRectangle(x1, y1, x2 - x1, y2 - y1); - _gdi.PrepDrawString(_normalFont, _foreColor); - _gdi.DrawString(text, new Point(x1 + CellWidthPadding + offsetX, y1 + CellHeightPadding + offsetY)); - } - } - - private void DrawColumnText(PaintEventArgs e, List visibleColumns) - { - if (HorizontalOrientation) - { - int start = -_vBar.Value; - - _gdi.PrepDrawString(_normalFont, _foreColor); - - foreach (var column in visibleColumns) - { - var point = new Point(CellWidthPadding, start + CellHeightPadding); - - if (IsHoveringOnColumnCell && column == CurrentCell.Column) - { - _gdi.PrepDrawString(_normalFont, SystemColors.HighlightText); - _gdi.DrawString(column.Text, point); - _gdi.PrepDrawString(_normalFont, _foreColor); - } - else - { - _gdi.DrawString(column.Text, point); - } - - start += CellHeight; - } - } - else - { - _gdi.PrepDrawString(_normalFont, _foreColor); - - foreach (var column in visibleColumns) - { - var point = new Point(column.Left.Value + 2 * CellWidthPadding - _hBar.Value, CellHeightPadding); // TODO: fix this CellPadding issue (2 * CellPadding vs just CellPadding) - - if (IsHoveringOnColumnCell && column == CurrentCell.Column) - { - _gdi.PrepDrawString(_normalFont, SystemColors.HighlightText); - _gdi.DrawString(column.Text, point); - _gdi.PrepDrawString(_normalFont, _foreColor); - } - else - { - _gdi.DrawString(column.Text, point); - } - } - } - } - - private void DrawData(PaintEventArgs e, List visibleColumns) - { - // Prevent exceptions with small TAStudio windows - if (visibleColumns.Count == 0) - { - return; - } - if (QueryItemText != null) - { - if (HorizontalOrientation) - { - int startRow = FirstVisibleRow; - int range = Math.Min(LastVisibleRow, RowCount - 1) - startRow + 1; - - _gdi.PrepDrawString(_normalFont, _foreColor); - for (int i = 0, f = 0; f < range; i++, f++) - { - f += _lagFrames[i]; - int LastVisible = LastVisibleColumnIndex; - for (int j = FirstVisibleColumn; j <= LastVisible; j++) - { - Bitmap image = null; - int x = 0; - int y = 0; - int bitmapOffsetX = 0; - int bitmapOffsetY = 0; - - QueryItemIcon?.Invoke(f + startRow, visibleColumns[j], ref image, ref bitmapOffsetX, ref bitmapOffsetY); - - if (image != null) - { - x = RowsToPixels(i) + CellWidthPadding + bitmapOffsetX; - y = (j * CellHeight) + (CellHeightPadding * 2) + bitmapOffsetY; - _gdi.DrawBitmap(image, new Point(x, y), true); - } - - string text; - int strOffsetX = 0; - int strOffsetY = 0; - QueryItemText(f + startRow, visibleColumns[j], out text, ref strOffsetX, ref strOffsetY); - - // Center Text - x = RowsToPixels(i) + ((CellWidth - (text.Length * _charSize.Width)) / 2); - y = (j * CellHeight) + CellHeightPadding - _vBar.Value; - var point = new Point(x + strOffsetX, y + strOffsetY); - - var rePrep = false; - if (j == 1) - if (_selectedItems.Contains(new Cell { Column = visibleColumns[j], RowIndex = i + startRow })) - { - _gdi.PrepDrawString(_rotatedFont, SystemColors.HighlightText); - rePrep = true; - } - else if (j == 1) - { - // 1. not sure about this; 2. repreps may be excess, but if we render one column at a time, we do need to change back after rendering the header - rePrep = true; - _gdi.PrepDrawString(_rotatedFont, _foreColor); - } - - if (!string.IsNullOrWhiteSpace(text)) - { - _gdi.DrawString(text, point); - } - - if (rePrep) - { - _gdi.PrepDrawString(_normalFont, _foreColor); - } - } - } - } - else - { - int startRow = FirstVisibleRow; - int range = Math.Min(LastVisibleRow, RowCount - 1) - startRow + 1; - - _gdi.PrepDrawString(_normalFont, _foreColor); - int xPadding = CellWidthPadding + 1 - _hBar.Value; - for (int i = 0, f = 0; f < range; i++, f++) // Vertical - { - f += _lagFrames[i]; - int LastVisible = LastVisibleColumnIndex; - for (int j = FirstVisibleColumn; j <= LastVisible; j++) // Horizontal - { - RollColumn col = visibleColumns[j]; - - string text; - int strOffsetX = 0; - int strOffsetY = 0; - Point point = new Point(col.Left.Value + xPadding, RowsToPixels(i) + CellHeightPadding); - - Bitmap image = null; - int bitmapOffsetX = 0; - int bitmapOffsetY = 0; - - QueryItemIcon?.Invoke(f + startRow, visibleColumns[j], ref image, ref bitmapOffsetX, ref bitmapOffsetY); - - if (image != null) - { - _gdi.DrawBitmap(image, new Point(point.X + bitmapOffsetX, point.Y + bitmapOffsetY + CellHeightPadding), true); - } - - QueryItemText(f + startRow, visibleColumns[j], out text, ref strOffsetX, ref strOffsetY); - - bool rePrep = false; - if (_selectedItems.Contains(new Cell { Column = visibleColumns[j], RowIndex = f + startRow })) - { - _gdi.PrepDrawString(_normalFont, SystemColors.HighlightText); - rePrep = true; - } - - if (!string.IsNullOrWhiteSpace(text)) - { - _gdi.DrawString(text, new Point(point.X + strOffsetX, point.Y + strOffsetY)); - } - - if (rePrep) - { - _gdi.PrepDrawString(_normalFont, _foreColor); - } - } - } - } - } - } - - private void DrawColumnBg(PaintEventArgs e, List visibleColumns) - { - _gdi.SetBrush(SystemColors.ControlLight); - _gdi.SetSolidPen(Color.Black); - - if (HorizontalOrientation) - { - _gdi.FillRectangle(0, 0, ColumnWidth + 1, DrawHeight + 1); - _gdi.Line(0, 0, 0, visibleColumns.Count * CellHeight + 1); - _gdi.Line(ColumnWidth, 0, ColumnWidth, visibleColumns.Count * CellHeight + 1); - - int start = -_vBar.Value; - foreach (var column in visibleColumns) - { - _gdi.Line(1, start, ColumnWidth, start); - start += CellHeight; - } - - if (visibleColumns.Any()) - { - _gdi.Line(1, start, ColumnWidth, start); - } - } - else - { - int bottomEdge = RowsToPixels(0); - - // Gray column box and black line underneath - _gdi.FillRectangle(0, 0, Width + 1, bottomEdge + 1); - _gdi.Line(0, 0, TotalColWidth.Value + 1, 0); - _gdi.Line(0, bottomEdge, TotalColWidth.Value + 1, bottomEdge); - - // Vertical black seperators - for (int i = 0; i < visibleColumns.Count; i++) - { - int pos = visibleColumns[i].Left.Value - _hBar.Value; - _gdi.Line(pos, 0, pos, bottomEdge); - } - - // Draw right most line - if (visibleColumns.Any()) - { - int right = TotalColWidth.Value - _hBar.Value; - _gdi.Line(right, 0, right, bottomEdge); - } - } - - // Emphasis - foreach (var column in visibleColumns.Where(c => c.Emphasis)) - { - _gdi.SetBrush(SystemColors.ActiveBorder); - if (HorizontalOrientation) - { - _gdi.FillRectangle(1, visibleColumns.IndexOf(column) * CellHeight + 1, ColumnWidth - 1, ColumnHeight - 1); - } - else - { - _gdi.FillRectangle(column.Left.Value + 1 - _hBar.Value, 1, column.Width.Value - 1, ColumnHeight - 1); - } - } - - // If the user is hovering over a column - if (IsHoveringOnColumnCell) - { - if (HorizontalOrientation) - { - for (int i = 0; i < visibleColumns.Count; i++) - { - if (visibleColumns[i] != CurrentCell.Column) - { - continue; - } - - if (CurrentCell.Column.Emphasis) - { - _gdi.SetBrush(Add(SystemColors.Highlight, 0x00222222)); - } - else - { - _gdi.SetBrush(SystemColors.Highlight); - } - - _gdi.FillRectangle(1, i * CellHeight + 1, ColumnWidth - 1, ColumnHeight - 1); - } - } - else - { - // TODO multiple selected columns - for (int i = 0; i < visibleColumns.Count; i++) - { - if (visibleColumns[i] == CurrentCell.Column) - { - // Left of column is to the right of the viewable area or right of column is to the left of the viewable area - if (visibleColumns[i].Left.Value - _hBar.Value > Width || visibleColumns[i].Right.Value - _hBar.Value < 0) - { - continue; - } - - int left = visibleColumns[i].Left.Value - _hBar.Value; - int width = visibleColumns[i].Right.Value - _hBar.Value - left; - - if (CurrentCell.Column.Emphasis) - { - _gdi.SetBrush(Add(SystemColors.Highlight, 0x00550000)); - } - else - { - _gdi.SetBrush(SystemColors.Highlight); - } - - _gdi.FillRectangle(left + 1, 1, width - 1, ColumnHeight - 1); - } - } - } - } - } - - // TODO refactor this and DoBackGroundCallback functions. - /// - /// Draw Gridlines and background colors using QueryItemBkColor. - /// - private void DrawBg(PaintEventArgs e, List visibleColumns) - { - if (UseCustomBackground && QueryItemBkColor != null) - { - DoBackGroundCallback(e, visibleColumns); - } - - if (GridLines) - { - _gdi.SetSolidPen(SystemColors.ControlLight); - if (HorizontalOrientation) - { - // Columns - for (int i = 1; i < VisibleRows + 1; i++) - { - int x = RowsToPixels(i); - _gdi.Line(x, 1, x, DrawHeight); - } - - // Rows - for (int i = 0; i < visibleColumns.Count + 1; i++) - { - _gdi.Line(RowsToPixels(0) + 1, i * CellHeight - _vBar.Value, DrawWidth, i * CellHeight - _vBar.Value); - } - } - else - { - // Columns - int y = ColumnHeight + 1; - int? totalColWidth = TotalColWidth; - foreach (var column in visibleColumns) - { - int x = column.Left.Value - _hBar.Value; - _gdi.Line(x, y, x, Height - 1); - } - - if (visibleColumns.Any()) - { - _gdi.Line(totalColWidth.Value - _hBar.Value, y, totalColWidth.Value - _hBar.Value, Height - 1); - } - - // Rows - for (int i = 1; i < VisibleRows + 1; i++) - { - _gdi.Line(0, RowsToPixels(i), Width + 1, RowsToPixels(i)); - } - } - } - - if (_selectedItems.Any()) - { - DoSelectionBG(e, visibleColumns); - } - } - - private void DoSelectionBG(PaintEventArgs e, List visibleColumns) - { - // SuuperW: This allows user to see other colors in selected frames. - Color rowColor = Color.White; - int _lastVisibleRow = LastVisibleRow; - int lastRow = -1; - foreach (Cell cell in _selectedItems) - { - if (cell.RowIndex > _lastVisibleRow || cell.RowIndex < FirstVisibleRow || !VisibleColumns.Contains(cell.Column)) - { - continue; - } - - Cell relativeCell = new Cell - { - RowIndex = cell.RowIndex - FirstVisibleRow, - Column = cell.Column, - }; - relativeCell.RowIndex -= CountLagFramesAbsolute(relativeCell.RowIndex.Value); - - if (QueryRowBkColor != null && lastRow != cell.RowIndex.Value) - { - QueryRowBkColor(cell.RowIndex.Value, ref rowColor); - lastRow = cell.RowIndex.Value; - } - - Color cellColor = rowColor; - QueryItemBkColor(cell.RowIndex.Value, cell.Column, ref cellColor); - - // Alpha layering for cell before selection - float alpha = (float)cellColor.A / 255; - if (cellColor.A != 255 && cellColor.A != 0) - { - cellColor = Color.FromArgb(rowColor.R - (int)((rowColor.R - cellColor.R) * alpha), - rowColor.G - (int)((rowColor.G - cellColor.G) * alpha), - rowColor.B - (int)((rowColor.B - cellColor.B) * alpha)); - } - - // Alpha layering for selection - alpha = 0.33f; - cellColor = Color.FromArgb(cellColor.R - (int)((cellColor.R - SystemColors.Highlight.R) * alpha), - cellColor.G - (int)((cellColor.G - SystemColors.Highlight.G) * alpha), - cellColor.B - (int)((cellColor.B - SystemColors.Highlight.B) * alpha)); - DrawCellBG(cellColor, relativeCell, visibleColumns); - } - } - - /// - /// Given a cell with rowindex inbetween 0 and VisibleRows, it draws the background color specified. Do not call with absolute rowindices. - /// - private void DrawCellBG(Color color, Cell cell, List visibleColumns) - { - int x, y, w, h; - - if (HorizontalOrientation) - { - x = RowsToPixels(cell.RowIndex.Value) + 1; - w = CellWidth - 1; - y = (CellHeight * visibleColumns.IndexOf(cell.Column)) + 1 - _vBar.Value; // We can't draw without row and column, so assume they exist and fail catastrophically if they don't - h = CellHeight - 1; - if (x < ColumnWidth) - { - return; - } - } - else - { - w = cell.Column.Width.Value - 1; - x = cell.Column.Left.Value - _hBar.Value + 1; - y = RowsToPixels(cell.RowIndex.Value) + 1; // We can't draw without row and column, so assume they exist and fail catastrophically if they don't - h = CellHeight - 1; - if (y < ColumnHeight) - { - return; - } - } - - if (x > DrawWidth || y > DrawHeight) - { - return; - } // Don't draw if off screen. - - _gdi.SetBrush(color); - _gdi.FillRectangle(x, y, w, h); - } - - /// - /// Calls QueryItemBkColor callback for all visible cells and fills in the background of those cells. - /// - /// - private void DoBackGroundCallback(PaintEventArgs e, List visibleColumns) - { - int startIndex = FirstVisibleRow; - int range = Math.Min(LastVisibleRow, RowCount - 1) - startIndex + 1; - int lastVisible = LastVisibleColumnIndex; - int firstVisibleColumn = FirstVisibleColumn; - // Prevent exceptions with small TAStudio windows - if (firstVisibleColumn < 0) - { - return; - } - if (HorizontalOrientation) - { - for (int i = 0, f = 0; f < range; i++, f++) - { - f += _lagFrames[i]; - - Color rowColor = Color.White; - QueryRowBkColor?.Invoke(f + startIndex, ref rowColor); - - for (int j = firstVisibleColumn; j <= lastVisible; j++) - { - Color itemColor = Color.White; - QueryItemBkColor(f + startIndex, visibleColumns[j], ref itemColor); - if (itemColor == Color.White) - { - itemColor = rowColor; - } - else if (itemColor.A != 255 && itemColor.A != 0) - { - float alpha = (float)itemColor.A / 255; - itemColor = Color.FromArgb(rowColor.R - (int)((rowColor.R - itemColor.R) * alpha), - rowColor.G - (int)((rowColor.G - itemColor.G) * alpha), - rowColor.B - (int)((rowColor.B - itemColor.B) * alpha)); - } - - if (itemColor != Color.White) // An easy optimization, don't draw unless the user specified something other than the default - { - var cell = new Cell - { - Column = visibleColumns[j], - RowIndex = i - }; - DrawCellBG(itemColor, cell, visibleColumns); - } - } - } - } - else - { - for (int i = 0, f = 0; f < range; i++, f++) // Vertical - { - f += _lagFrames[i]; - - Color rowColor = Color.White; - QueryRowBkColor?.Invoke(f + startIndex, ref rowColor); - - for (int j = FirstVisibleColumn; j <= lastVisible; j++) // Horizontal - { - Color itemColor = Color.White; - QueryItemBkColor(f + startIndex, visibleColumns[j], ref itemColor); - if (itemColor == Color.White) - { - itemColor = rowColor; - } - else if (itemColor.A != 255 && itemColor.A != 0) - { - float alpha = (float)itemColor.A / 255; - itemColor = Color.FromArgb(rowColor.R - (int)((rowColor.R - itemColor.R) * alpha), - rowColor.G - (int)((rowColor.G - itemColor.G) * alpha), - rowColor.B - (int)((rowColor.B - itemColor.B) * alpha)); - } - - if (itemColor != Color.White) // An easy optimization, don't draw unless the user specified something other than the default - { - var cell = new Cell - { - Column = visibleColumns[j], - RowIndex = i - }; - DrawCellBG(itemColor, cell, visibleColumns); - } - } - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs deleted file mode 100644 index b62d246e41..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs +++ /dev/null @@ -1,2266 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.CustomControls; - -namespace BizHawk.Client.EmuHawk -{ - // Row width depends on font size and padding - // Column width is specified in column headers - // Row width is specified for horizontal orientation - public partial class InputRoll : Control - { - private readonly GDIRenderer _gdi; - private readonly SortedSet _selectedItems = new SortedSet(new SortCell()); - - private readonly VScrollBar _vBar; - private readonly HScrollBar _hBar; - - private readonly Timer _hoverTimer = new Timer(); - private readonly byte[] _lagFrames = new byte[256]; // Large enough value that it shouldn't ever need resizing. // apparently not large enough for 4K - - private readonly IntPtr _rotatedFont; - private readonly IntPtr _normalFont; - private readonly Color _foreColor; - private readonly Color _backColor; - - private RollColumns _columns = new RollColumns(); - private bool _horizontalOrientation; - private bool _programmaticallyUpdatingScrollBarValues; - private int _maxCharactersInHorizontal = 1; - - private int _rowCount; - private Size _charSize; - - private RollColumn _columnDown; - - private int? _currentX; - private int? _currentY; - - // Hiding lag frames (Mainly intended for < 60fps play.) - public int LagFramesToHide { get; set; } - public bool HideWasLagFrames { get; set; } - - public bool AllowRightClickSelecton { get; set; } - public bool LetKeysModifySelection { get; set; } - public bool SuspendHotkeys { get; set; } - - public InputRoll() - { - UseCustomBackground = true; - GridLines = true; - CellWidthPadding = 3; - CellHeightPadding = 0; - CurrentCell = null; - ScrollMethod = "near"; - - var commonFont = new Font("Arial", 8, FontStyle.Bold); - _normalFont = GDIRenderer.CreateNormalHFont(commonFont, 6); - - // PrepDrawString doesn't actually set the font, so this is rather useless. - // I'm leaving this stuff as-is so it will be a bit easier to fix up with another rendering method. - _rotatedFont = GDIRenderer.CreateRotatedHFont(commonFont, true); - - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.SupportsTransparentBackColor, true); - SetStyle(ControlStyles.Opaque, true); - - _gdi = new GDIRenderer(); - - using (var g = CreateGraphics()) - using (_gdi.LockGraphics(g)) - { - _charSize = _gdi.MeasureString("A", commonFont); // TODO make this a property so changing it updates other values. - } - - UpdateCellSize(); - ColumnWidth = CellWidth; - ColumnHeight = CellHeight + 2; - - _vBar = new VScrollBar - { - // Location gets calculated later (e.g. on resize) - Visible = false, - SmallChange = CellHeight, - LargeChange = CellHeight * 20 - }; - - _hBar = new HScrollBar - { - // Location gets calculated later (e.g. on resize) - Visible = false, - SmallChange = CellWidth, - LargeChange = 20 - }; - - Controls.Add(_vBar); - Controls.Add(_hBar); - - _vBar.ValueChanged += VerticalBar_ValueChanged; - _hBar.ValueChanged += HorizontalBar_ValueChanged; - - HorizontalOrientation = false; - RecalculateScrollBars(); - _columns.ChangedCallback = ColumnChangedCallback; - - _hoverTimer.Interval = 750; - _hoverTimer.Tick += HoverTimerEventProcessor; - _hoverTimer.Stop(); - - _foreColor = ForeColor; - _backColor = BackColor; - } - - private void HoverTimerEventProcessor(object sender, EventArgs e) - { - _hoverTimer.Stop(); - - CellHovered?.Invoke(this, new CellEventArgs(LastCell, CurrentCell)); - } - - protected override void Dispose(bool disposing) - { - _gdi.Dispose(); - - GDIRenderer.DestroyHFont(_normalFont); - GDIRenderer.DestroyHFont(_rotatedFont); - - base.Dispose(disposing); - } - - #region Properties - - /// - /// Gets or sets the amount of left and right padding on the text inside a cell - /// - [DefaultValue(3)] - [Category("Behavior")] - public int CellWidthPadding { get; set; } - - /// - /// Gets or sets the amount of top and bottom padding on the text inside a cell - /// - [DefaultValue(1)] - [Category("Behavior")] - public int CellHeightPadding { get; set; } - - /// - /// Gets or sets a value indicating whether grid lines are displayed around cells - /// - [Category("Appearance")] - [DefaultValue(true)] - public bool GridLines { get; set; } - - /// - /// Gets or sets a value indicating whether the control is horizontal or vertical - /// - [Category("Behavior")] - public bool HorizontalOrientation - { - get - { - return _horizontalOrientation; - } - set - { - if (_horizontalOrientation != value) - { - int temp = ScrollSpeed; - _horizontalOrientation = value; - OrientationChanged(); - _hBar.SmallChange = CellWidth; - _vBar.SmallChange = CellHeight; - ScrollSpeed = temp; - } - } - } - - /// - /// Gets or sets the scrolling speed - /// - [Category("Behavior")] - public int ScrollSpeed - { - get - { - if (HorizontalOrientation) - { - return _hBar.SmallChange / CellWidth; - } - - return _vBar.SmallChange / CellHeight; - } - - set - { - if (HorizontalOrientation) - { - _hBar.SmallChange = value * CellWidth; - } - else - { - _vBar.SmallChange = value * CellHeight; - } - } - } - - /// - /// Gets or sets the sets the virtual number of rows to be displayed. Does not include the column header row. - /// - [Category("Behavior")] - public int RowCount - { - get - { - return _rowCount; - } - - set - { - _rowCount = value; - RecalculateScrollBars(); - } - } - - /// - /// Gets or sets a value indicating whether columns can be resized - /// - [Category("Behavior")] - public bool AllowColumnResize { get; set; } - - /// - /// Gets or sets a value indicating whether columns can be reordered - /// - [Category("Behavior")] - public bool AllowColumnReorder { get; set; } - - /// - /// Gets or sets a value indicating whether the entire row will always be selected - /// - [Category("Appearance")] - [DefaultValue(false)] - public bool FullRowSelect { get; set; } - - /// - /// Gets or sets a value indicating whether multiple items can to be selected - /// - [Category("Behavior")] - [DefaultValue(true)] - public bool MultiSelect { get; set; } - - /// - /// Gets or sets a value indicating whether the control is in input painting mode - /// - [Category("Behavior")] - [DefaultValue(false)] - public bool InputPaintingMode { get; set; } - - /// - /// All visible columns - /// - [Category("Behavior")] - public IEnumerable VisibleColumns => _columns.VisibleColumns; - - /// - /// Gets or sets how the InputRoll scrolls when calling ScrollToIndex. - /// - [DefaultValue("near")] - [Category("Behavior")] - public string ScrollMethod { get; set; } - - /// - /// Gets or sets a value indicating how the Intever for the hover event - /// - [Category("Behavior")] - public bool AlwaysScroll { get; set; } - - /// - /// Gets or sets the lowest seek interval to activate the progress bar - /// - [Category("Behavior")] - public int SeekingCutoffInterval { get; set; } - - /// - /// Returns all columns including those that are not visible - /// - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public RollColumns AllColumns => _columns; - - [DefaultValue(750)] - [Category("Behavior")] - public int HoverInterval - { - get { return _hoverTimer.Interval; } - set { _hoverTimer.Interval = value; } - } - - #endregion - - #region Event Handlers - - /// - /// Fire the event which requests the text for the passed cell - /// - [Category("Virtual")] - public event QueryItemTextHandler QueryItemText; - - /// - /// Fire the event which requests the background color for the passed cell - /// - [Category("Virtual")] - public event QueryItemBkColorHandler QueryItemBkColor; - - [Category("Virtual")] - public event QueryRowBkColorHandler QueryRowBkColor; - - /// - /// Fire the event which requests an icon for a given cell - /// - [Category("Virtual")] - public event QueryItemIconHandler QueryItemIcon; - - /// - /// Fire the QueryFrameLag event which checks if a given frame is a lag frame - /// - [Category("Virtual")] - public event QueryFrameLagHandler QueryFrameLag; - - /// - /// Fires when the mouse moves from one cell to another (including column header cells) - /// - [Category("Mouse")] - public event CellChangeEventHandler PointedCellChanged; - - /// - /// Fires when a cell is hovered on - /// - [Category("Mouse")] - public event HoverEventHandler CellHovered; - - /// - /// Occurs when a column header is clicked - /// - [Category("Action")] - public event ColumnClickEventHandler ColumnClick; - - /// - /// Occurs when a column header is right-clicked - /// - [Category("Action")] - public event ColumnClickEventHandler ColumnRightClick; - - /// - /// Occurs whenever the 'SelectedItems' property for this control changes - /// - [Category("Behavior")] - public event EventHandler SelectedIndexChanged; - - /// - /// Occurs whenever the mouse wheel is scrolled while the right mouse button is held - /// - [Category("Behavior")] - public event RightMouseScrollEventHandler RightMouseScrolled; - - [Category("Property Changed")] - [Description("Occurs when the column header has been reordered")] - public event ColumnReorderedEventHandler ColumnReordered; - - [Category("Action")] - [Description("Occurs when the scroll value of the visible rows change (in vertical orientation this is the vertical scroll bar change, and in horizontal it is the horizontal scroll bar)")] - public event RowScrollEvent RowScroll; - - [Category("Action")] - [Description("Occurs when the scroll value of the columns (in vertical orientation this is the horizontal scroll bar change, and in horizontal it is the vertical scroll bar)")] - public event ColumnScrollEvent ColumnScroll; - - [Category("Action")] - [Description("Occurs when a cell is dragged and then dropped into a new cell, old cell is the cell that was being dragged, new cell is its new destination")] - public event CellDroppedEvent CellDropped; - - /// - /// Retrieve the text for a cell - /// - public delegate void QueryItemTextHandler(int index, RollColumn column, out string text, ref int offsetX, ref int offsetY); - - /// - /// Retrieve the background color for a cell - /// - public delegate void QueryItemBkColorHandler(int index, RollColumn column, ref Color color); - public delegate void QueryRowBkColorHandler(int index, ref Color color); - - /// - /// Retrieve the image for a given cell - /// - public delegate void QueryItemIconHandler(int index, RollColumn column, ref Bitmap icon, ref int offsetX, ref int offsetY); - - /// - /// Check if a given frame is a lag frame - /// - public delegate bool QueryFrameLagHandler(int index, bool hideWasLag); - - public delegate void CellChangeEventHandler(object sender, CellEventArgs e); - - public delegate void HoverEventHandler(object sender, CellEventArgs e); - - public delegate void RightMouseScrollEventHandler(object sender, MouseEventArgs e); - - public delegate void ColumnClickEventHandler(object sender, ColumnClickEventArgs e); - - public delegate void ColumnReorderedEventHandler(object sender, ColumnReorderedEventArgs e); - - public delegate void RowScrollEvent(object sender, EventArgs e); - - public delegate void ColumnScrollEvent(object sender, EventArgs e); - - public delegate void CellDroppedEvent(object sender, CellEventArgs e); - - public class CellEventArgs - { - public CellEventArgs(Cell oldCell, Cell newCell) - { - OldCell = oldCell; - NewCell = newCell; - } - - public Cell OldCell { get; private set; } - public Cell NewCell { get; private set; } - } - - public class ColumnClickEventArgs - { - public ColumnClickEventArgs(RollColumn column) - { - Column = column; - } - - public RollColumn Column { get; private set; } - } - - public class ColumnReorderedEventArgs - { - public ColumnReorderedEventArgs(int oldDisplayIndex, int newDisplayIndex, RollColumn column) - { - Column = column; - OldDisplayIndex = oldDisplayIndex; - NewDisplayIndex = newDisplayIndex; - } - - public RollColumn Column { get; private set; } - public int OldDisplayIndex { get; private set; } - public int NewDisplayIndex { get; private set; } - } - - #endregion - - #region Api - - public void SelectRow(int index, bool val) - { - if (_columns.VisibleColumns.Any()) - { - if (val) - { - SelectCell(new Cell - { - RowIndex = index, - Column = _columns[0] - }); - } - else - { - IEnumerable items = _selectedItems.Where(cell => cell.RowIndex == index); - _selectedItems.RemoveWhere(items.Contains); - } - } - } - - public void SelectAll() - { - var oldFullRowVal = FullRowSelect; - FullRowSelect = true; - for (int i = 0; i < RowCount; i++) - { - SelectRow(i, true); - } - - FullRowSelect = oldFullRowVal; - } - - public void DeselectAll() - { - _selectedItems.Clear(); - } - - public void TruncateSelection(int index) - { - _selectedItems.RemoveWhere(cell => cell.RowIndex > index); - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool IsPointingAtColumnHeader => IsHoveringOnColumnCell; - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int? FirstSelectedIndex - { - get - { - if (AnyRowsSelected) - { - return SelectedRows.Min(); - } - - return null; - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int? LastSelectedIndex - { - get - { - if (AnyRowsSelected) - { - return SelectedRows.Max(); - } - - return null; - } - } - - /// - /// Gets or sets the current Cell that the mouse was in. - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public Cell CurrentCell { get; set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool CurrentCellIsDataCell => CurrentCell?.RowIndex != null && CurrentCell.Column != null; - - /// - /// Gets or sets the previous Cell that the mouse was in. - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public Cell LastCell { get; private set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool IsPaintDown { get; private set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool UseCustomBackground { get; set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int DrawHeight { get; private set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int DrawWidth { get; private set; } - - /// - /// Gets or sets the width of data cells when in Horizontal orientation. - /// - public int MaxCharactersInHorizontal - { - get - { - return _maxCharactersInHorizontal; - } - - set - { - _maxCharactersInHorizontal = value; - UpdateCellSize(); - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool RightButtonHeld { get; private set; } - - public string UserSettingsSerialized() - { - var settings = ConfigService.SaveWithType(Settings); - return settings; - } - - public void LoadSettingsSerialized(string settingsJson) - { - var settings = ConfigService.LoadWithType(settingsJson); - - // TODO: don't silently fail, inform the user somehow - if (settings is InputRollSettings) - { - var rollSettings = settings as InputRollSettings; - _columns = rollSettings.Columns; - _columns.ChangedCallback = ColumnChangedCallback; - HorizontalOrientation = rollSettings.HorizontalOrientation; - LagFramesToHide = rollSettings.LagFramesToHide; - HideWasLagFrames = rollSettings.HideWasLagFrames; - } - } - - private InputRollSettings Settings => new InputRollSettings - { - Columns = _columns, - HorizontalOrientation = HorizontalOrientation, - LagFramesToHide = LagFramesToHide, - HideWasLagFrames = HideWasLagFrames - }; - - public class InputRollSettings - { - public RollColumns Columns { get; set; } - public bool HorizontalOrientation { get; set; } - public int LagFramesToHide { get; set; } - public bool HideWasLagFrames { get; set; } - } - - /// - /// Gets or sets the first visible row index, if scrolling is needed - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int FirstVisibleRow - { - get // SuuperW: This was checking if the scroll bars were needed, which is useless because their Value is 0 if they aren't needed. - { - if (HorizontalOrientation) - { - return _hBar.Value / CellWidth; - } - - return _vBar.Value / CellHeight; - } - - set - { - if (HorizontalOrientation) - { - if (NeedsHScrollbar) - { - _programmaticallyUpdatingScrollBarValues = true; - if (value * CellWidth <= _hBar.Maximum) - { - _hBar.Value = value * CellWidth; - } - else - { - _hBar.Value = _hBar.Maximum; - } - - _programmaticallyUpdatingScrollBarValues = false; - } - } - else - { - if (NeedsVScrollbar) - { - _programmaticallyUpdatingScrollBarValues = true; - if (value * CellHeight <= _vBar.Maximum) - { - _vBar.Value = value * CellHeight; - } - else - { - _vBar.Value = _vBar.Maximum; - } - - _programmaticallyUpdatingScrollBarValues = false; - } - } - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - private int LastFullyVisibleRow - { - get - { - int halfRow = 0; - if ((DrawHeight - ColumnHeight - 3) % CellHeight < CellHeight / 2) - { - halfRow = 1; - } - - return FirstVisibleRow + VisibleRows - halfRow + CountLagFramesDisplay(VisibleRows - halfRow); - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int LastVisibleRow - { - get - { - return FirstVisibleRow + VisibleRows + CountLagFramesDisplay(VisibleRows); - } - - set - { - int halfRow = 0; - if ((DrawHeight - ColumnHeight - 3) % CellHeight < CellHeight / 2) - { - halfRow = 1; - } - - if (LagFramesToHide == 0) - { - FirstVisibleRow = Math.Max(value - (VisibleRows - halfRow), 0); - } - else - { - if (Math.Abs(LastFullyVisibleRow - value) > VisibleRows) // Big jump - { - FirstVisibleRow = Math.Max(value - (ExpectedDisplayRange() - halfRow), 0); - SetLagFramesArray(); - } - - // Small jump, more accurate - int lastVisible = LastFullyVisibleRow; - do - { - if ((lastVisible - value) / (LagFramesToHide + 1) != 0) - { - FirstVisibleRow = Math.Max(FirstVisibleRow - ((lastVisible - value) / (LagFramesToHide + 1)), 0); - } - else - { - FirstVisibleRow -= Math.Sign(lastVisible - value); - } - - SetLagFramesArray(); - lastVisible = LastFullyVisibleRow; - } - while ((lastVisible - value < 0 || lastVisible - value > _lagFrames[VisibleRows - halfRow]) && FirstVisibleRow != 0); - } - } - } - - public bool IsVisible(int index) - { - return (index >= FirstVisibleRow) && (index <= LastFullyVisibleRow); - } - - public bool IsPartiallyVisible(int index) - { - return index >= FirstVisibleRow && index <= LastVisibleRow; - } - - /// - /// Gets the number of rows currently visible including partially visible rows. - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int VisibleRows - { - get - { - if (HorizontalOrientation) - { - return (DrawWidth - ColumnWidth) / CellWidth; - } - - return (DrawHeight - ColumnHeight - 3) / CellHeight; // Minus three makes it work - } - } - - /// - /// Gets the first visible column index, if scrolling is needed - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int FirstVisibleColumn - { - get - { - if (HorizontalOrientation) - { - return _vBar.Value / CellHeight; - } - - var columnList = VisibleColumns.ToList(); - return columnList.FindIndex(c => c.Right > _hBar.Value); - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int LastVisibleColumnIndex - { - get - { - List columnList = VisibleColumns.ToList(); - int ret; - if (HorizontalOrientation) - { - ret = (_vBar.Value + DrawHeight) / CellHeight; - if (ret >= columnList.Count) - { - ret = columnList.Count - 1; - } - } - else - { - ret = columnList.FindLastIndex(c => c.Left <= DrawWidth + _hBar.Value); - } - - return ret; - } - } - - private Cell _draggingCell; - - public void DragCurrentCell() - { - _draggingCell = CurrentCell; - } - - public void ReleaseCurrentCell() - { - if (_draggingCell != null) - { - var draggedCell = _draggingCell; - _draggingCell = null; - - if (CurrentCell != draggedCell) - { - CellDropped?.Invoke(this, new CellEventArgs(draggedCell, CurrentCell)); - } - } - } - - /// - /// Scrolls to the given index, according to the scroll settings. - /// - public void ScrollToIndex(int index) - { - if (ScrollMethod == "near") - { - MakeIndexVisible(index); - } - - if (!IsVisible(index) || AlwaysScroll) - { - if (ScrollMethod == "top") - { - FirstVisibleRow = index; - } - else if (ScrollMethod == "bottom") - { - LastVisibleRow = index; - } - else if (ScrollMethod == "center") - { - if (LagFramesToHide == 0) - { - FirstVisibleRow = Math.Max(index - (VisibleRows / 2), 0); - } - else - { - if (Math.Abs(FirstVisibleRow + CountLagFramesDisplay(VisibleRows / 2) - index) > VisibleRows) // Big jump - { - FirstVisibleRow = Math.Max(index - (ExpectedDisplayRange() / 2), 0); - SetLagFramesArray(); - } - - // Small jump, more accurate - int lastVisible = FirstVisibleRow + CountLagFramesDisplay(VisibleRows / 2); - do - { - if ((lastVisible - index) / (LagFramesToHide + 1) != 0) - { - FirstVisibleRow = Math.Max(FirstVisibleRow - ((lastVisible - index) / (LagFramesToHide + 1)), 0); - } - else - { - FirstVisibleRow -= Math.Sign(lastVisible - index); - } - - SetLagFramesArray(); - lastVisible = FirstVisibleRow + CountLagFramesDisplay(VisibleRows / 2); - } - while ((lastVisible - index < 0 || lastVisible - index > _lagFrames[VisibleRows]) && FirstVisibleRow != 0); - } - } - } - } - - /// - /// Scrolls so that the given index is visible, if it isn't already; doesn't use scroll settings. - /// - public void MakeIndexVisible(int index) - { - if (!IsVisible(index)) - { - if (FirstVisibleRow > index) - { - FirstVisibleRow = index; - } - else - { - LastVisibleRow = index; - } - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public IEnumerable SelectedRows - { - get - { - return _selectedItems - .Where(cell => cell.RowIndex.HasValue) - .Select(cell => cell.RowIndex.Value) - .Distinct(); - } - } - - public bool AnyRowsSelected - { - get - { - return _selectedItems.Any(cell => cell.RowIndex.HasValue); - } - } - - public void ClearSelectedRows() - { - _selectedItems.Clear(); - } - - public IEnumerable GenerateContextMenuItems() - { - yield return new ToolStripSeparator(); - - var rotate = new ToolStripMenuItem - { - Name = "RotateMenuItem", - Text = "Rotate", - ShortcutKeyDisplayString = RotateHotkeyStr, - }; - - rotate.Click += (o, ev) => - { - HorizontalOrientation ^= true; - }; - - yield return rotate; - } - - public string RotateHotkeyStr => "Ctrl+Shift+F"; - - #endregion - - #region Mouse and Key Events - - private bool _columnDownMoved; - protected override void OnMouseMove(MouseEventArgs e) - { - _currentX = e.X; - _currentY = e.Y; - - if (_columnDown != null) - { - _columnDownMoved = true; - } - - Cell newCell = CalculatePointedCell(_currentX.Value, _currentY.Value); - - // SuuperW: Hide lag frames - if (QueryFrameLag != null && newCell.RowIndex.HasValue) - { - newCell.RowIndex += CountLagFramesDisplay(newCell.RowIndex.Value); - } - - newCell.RowIndex += FirstVisibleRow; - if (newCell.RowIndex < 0) - { - newCell.RowIndex = 0; - } - - if (!newCell.Equals(CurrentCell)) - { - CellChanged(newCell); - - if (IsHoveringOnColumnCell || - (WasHoveringOnColumnCell && !IsHoveringOnColumnCell)) - { - Refresh(); - } - else if (_columnDown != null) - { - Refresh(); - } - } - else if (_columnDown != null) // Kind of silly feeling to have this check twice, but the only alternative I can think of has it refreshing twice when pointed column changes with column down, and speed matters - { - Refresh(); - } - - base.OnMouseMove(e); - } - - protected override void OnMouseEnter(EventArgs e) - { - CurrentCell = new Cell - { - Column = null, - RowIndex = null - }; - - base.OnMouseEnter(e); - } - - protected override void OnMouseLeave(EventArgs e) - { - _currentX = null; - _currentY = null; - CurrentCell = null; - IsPaintDown = false; - _hoverTimer.Stop(); - Refresh(); - base.OnMouseLeave(e); - } - - // TODO add query callback of whether to select the cell or not - protected override void OnMouseDown(MouseEventArgs e) - { - if (!GlobalWin.MainForm.EmulatorPaused && _currentX.HasValue) - { - // copypaste from OnMouseMove() - Cell newCell = CalculatePointedCell(_currentX.Value, _currentY.Value); - if (QueryFrameLag != null && newCell.RowIndex.HasValue) - { - newCell.RowIndex += CountLagFramesDisplay(newCell.RowIndex.Value); - } - - newCell.RowIndex += FirstVisibleRow; - if (newCell.RowIndex < 0) - { - newCell.RowIndex = 0; - } - - if (!newCell.Equals(CurrentCell)) - { - CellChanged(newCell); - - if (IsHoveringOnColumnCell || - (WasHoveringOnColumnCell && !IsHoveringOnColumnCell)) - { - Refresh(); - } - else if (_columnDown != null) - { - Refresh(); - } - } - else if (_columnDown != null) - { - Refresh(); - } - } - - if (e.Button == MouseButtons.Left) - { - if (IsHoveringOnColumnCell) - { - _columnDown = CurrentCell.Column; - } - else if (InputPaintingMode) - { - IsPaintDown = true; - } - } - - if (e.Button == MouseButtons.Right) - { - if (!IsHoveringOnColumnCell) - { - RightButtonHeld = true; - } - } - - if (e.Button == MouseButtons.Left) - { - if (IsHoveringOnDataCell) - { - if (ModifierKeys == Keys.Alt) - { - // do marker drag here - } - else if (ModifierKeys == Keys.Shift && (CurrentCell.Column.Name == "FrameColumn" || CurrentCell.Column.Type == RollColumn.InputType.Text)) - { - if (_selectedItems.Any()) - { - if (FullRowSelect) - { - var selected = _selectedItems.Any(c => c.RowIndex.HasValue && CurrentCell.RowIndex.HasValue && c.RowIndex == CurrentCell.RowIndex); - - if (!selected) - { - var rowIndices = _selectedItems - .Where(c => c.RowIndex.HasValue) - .Select(c => c.RowIndex ?? -1) - .Where(c => c >= 0) // Hack to avoid possible Nullable exceptions - .Distinct() - .ToList(); - - var firstIndex = rowIndices.Min(); - var lastIndex = rowIndices.Max(); - - if (CurrentCell.RowIndex.Value < firstIndex) - { - for (int i = CurrentCell.RowIndex.Value; i < firstIndex; i++) - { - SelectCell(new Cell - { - RowIndex = i, - Column = CurrentCell.Column - }); - } - } - else if (CurrentCell.RowIndex.Value > lastIndex) - { - for (int i = lastIndex + 1; i <= CurrentCell.RowIndex.Value; i++) - { - SelectCell(new Cell - { - RowIndex = i, - Column = CurrentCell.Column - }); - } - } - else // Somewhere in between, a scenario that can happen with ctrl-clicking, find the previous and highlight from there - { - var nearest = rowIndices - .Where(x => x < CurrentCell.RowIndex.Value) - .Max(); - - for (int i = nearest + 1; i <= CurrentCell.RowIndex.Value; i++) - { - SelectCell(new Cell - { - RowIndex = i, - Column = CurrentCell.Column - }); - } - } - } - } - else - { - MessageBox.Show("Shift click logic for individual cells has not yet implemented"); - } - } - else - { - SelectCell(CurrentCell); - } - } - else if (ModifierKeys == Keys.Control && (CurrentCell.Column.Name == "FrameColumn" || CurrentCell.Column.Type == RollColumn.InputType.Text)) - { - SelectCell(CurrentCell, toggle: true); - } - else if (ModifierKeys != Keys.Shift) - { - var hadIndex = _selectedItems.Any(); - _selectedItems.Clear(); - SelectCell(CurrentCell); - } - - Refresh(); - - SelectedIndexChanged?.Invoke(this, new EventArgs()); - } - } - - base.OnMouseDown(e); - - if (AllowRightClickSelecton && e.Button == MouseButtons.Right) - { - if (!IsHoveringOnColumnCell) - { - _currentX = e.X; - _currentY = e.Y; - Cell newCell = CalculatePointedCell(_currentX.Value, _currentY.Value); - newCell.RowIndex += FirstVisibleRow; - CellChanged(newCell); - SelectCell(CurrentCell); - } - } - } - - protected override void OnMouseUp(MouseEventArgs e) - { - if (IsHoveringOnColumnCell) - { - if (_columnDown != null && _columnDownMoved) - { - DoColumnReorder(); - _columnDown = null; - Refresh(); - } - else if (e.Button == MouseButtons.Left) - { - ColumnClickEvent(ColumnAtX(e.X)); - } - else if (e.Button == MouseButtons.Right) - { - ColumnRightClickEvent(ColumnAtX(e.X)); - } - } - - _columnDown = null; - _columnDownMoved = false; - RightButtonHeld = false; - IsPaintDown = false; - base.OnMouseUp(e); - } - - private void IncrementScrollBar(ScrollBar bar, bool increment) - { - int newVal; - if (increment) - { - newVal = bar.Value + bar.SmallChange; - if (newVal > bar.Maximum - bar.LargeChange) - { - newVal = bar.Maximum - bar.LargeChange; - } - } - else - { - newVal = bar.Value - bar.SmallChange; - if (newVal < 0) - { - newVal = 0; - } - } - - _programmaticallyUpdatingScrollBarValues = true; - bar.Value = newVal; - _programmaticallyUpdatingScrollBarValues = false; - } - - protected override void OnMouseWheel(MouseEventArgs e) - { - if (RightButtonHeld) - { - DoRightMouseScroll(this, e); - } - else - { - if (HorizontalOrientation) - { - do - { - IncrementScrollBar(_hBar, e.Delta < 0); - SetLagFramesFirst(); - } - while (_lagFrames[0] != 0 && _hBar.Value != 0 && _hBar.Value != _hBar.Maximum); - } - else - { - do - { - IncrementScrollBar(_vBar, e.Delta < 0); - SetLagFramesFirst(); - } - while (_lagFrames[0] != 0 && _vBar.Value != 0 && _vBar.Value != _vBar.Maximum); - } - - if (_currentX != null) - { - OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, _currentX.Value, _currentY.Value, 0)); - } - - Refresh(); - } - } - - private void DoRightMouseScroll(object sender, MouseEventArgs e) - { - RightMouseScrolled?.Invoke(sender, e); - } - - private void ColumnClickEvent(RollColumn column) - { - ColumnClick?.Invoke(this, new ColumnClickEventArgs(column)); - } - - private void ColumnRightClickEvent(RollColumn column) - { - ColumnRightClick?.Invoke(this, new ColumnClickEventArgs(column)); - } - - protected override void OnKeyDown(KeyEventArgs e) - { - if (!SuspendHotkeys) - { - if (e.Control && !e.Alt && e.Shift && e.KeyCode == Keys.F) // Ctrl+Shift+F - { - HorizontalOrientation ^= true; - } - // Scroll - else if (!e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.PageUp) // Page Up - { - if (FirstVisibleRow > 0) - { - LastVisibleRow = FirstVisibleRow; - Refresh(); - } - } - else if (!e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.PageDown) // Page Down - { - var totalRows = LastVisibleRow - FirstVisibleRow; - if (totalRows <= RowCount) - { - var final = LastVisibleRow + totalRows; - if (final > RowCount) - { - final = RowCount; - } - - LastVisibleRow = final; - Refresh(); - } - } - else if (!e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.Home) // Home - { - FirstVisibleRow = 0; - Refresh(); - } - else if (!e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.End) // End - { - LastVisibleRow = RowCount; - Refresh(); - } - else if (!e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Up) // Up - { - if (FirstVisibleRow > 0) - { - FirstVisibleRow--; - Refresh(); - } - } - else if (!e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Down) // Down - { - if (FirstVisibleRow < RowCount - 1) - { - FirstVisibleRow++; - Refresh(); - } - } - // Selection courser - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Up) // Ctrl + Up - { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.First() > 0) - { - foreach (var row in SelectedRows.ToList()) - { - SelectRow(row - 1, true); - SelectRow(row, false); - } - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Down) // Ctrl + Down - { - if (SelectedRows.Any() && LetKeysModifySelection) - { - foreach (var row in SelectedRows.Reverse().ToList()) - { - SelectRow(row + 1, true); - SelectRow(row, false); - } - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Left) // Ctrl + Left - { - if (SelectedRows.Any() && LetKeysModifySelection) - { - SelectRow(SelectedRows.Last(), false); - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Right) // Ctrl + Right - { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.Last() < _rowCount - 1) - { - SelectRow(SelectedRows.Last() + 1, true); - } - } - else if (e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Left) // Ctrl + Shift + Left - { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.First() > 0) - { - SelectRow(SelectedRows.First() - 1, true); - } - } - else if (e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Right) // Ctrl + Shift + Right - { - if (SelectedRows.Any() && LetKeysModifySelection) - { - SelectRow(SelectedRows.First(), false); - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.PageUp) // Ctrl + Page Up - { - //jump to above marker with selection courser - if (LetKeysModifySelection) - { - - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.PageDown) // Ctrl + Page Down - { - //jump to below marker with selection courser - if (LetKeysModifySelection) - { - - } - - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.Home) // Ctrl + Home - { - //move selection courser to frame 0 - if (LetKeysModifySelection) - { - DeselectAll(); - SelectRow(0, true); - } - } - else if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.End) // Ctrl + End - { - //move selection courser to end of movie - if (LetKeysModifySelection) - { - DeselectAll(); - SelectRow(RowCount-1, true); - } - } - - } - - base.OnKeyDown(e); - } - - #endregion - - #region Change Events - - protected override void OnResize(EventArgs e) - { - RecalculateScrollBars(); - base.OnResize(e); - Refresh(); - } - - private void OrientationChanged() - { - RecalculateScrollBars(); - - // TODO scroll to correct positions - ColumnChangedCallback(); - RecalculateScrollBars(); - - Refresh(); - } - - /// - /// Call this function to change the CurrentCell to newCell - /// - private void CellChanged(Cell newCell) - { - LastCell = CurrentCell; - CurrentCell = newCell; - - if (PointedCellChanged != null && - (LastCell.Column != CurrentCell.Column || LastCell.RowIndex != CurrentCell.RowIndex)) - { - PointedCellChanged(this, new CellEventArgs(LastCell, CurrentCell)); - } - - if (CurrentCell?.Column != null && CurrentCell.RowIndex.HasValue) - { - _hoverTimer.Start(); - } - else - { - _hoverTimer.Stop(); - } - } - - private void VerticalBar_ValueChanged(object sender, EventArgs e) - { - if (!_programmaticallyUpdatingScrollBarValues) - { - Refresh(); - } - - if (_horizontalOrientation) - { - ColumnScroll?.Invoke(this, e); - } - else - { - RowScroll?.Invoke(this, e); - } - } - - private void HorizontalBar_ValueChanged(object sender, EventArgs e) - { - if (!_programmaticallyUpdatingScrollBarValues) - { - Refresh(); - } - - if (_horizontalOrientation) - { - RowScroll?.Invoke(this, e); - } - else - { - ColumnScroll?.Invoke(this, e); - } - } - - private void ColumnChangedCallback() - { - RecalculateScrollBars(); - if (_columns.VisibleColumns.Any()) - { - ColumnWidth = _columns.VisibleColumns.Max(c => c.Width.Value) + CellWidthPadding * 4; - } - } - - #endregion - - #region Helpers - - // TODO: Make into an extension method - private static Color Add(Color color, int val) - { - var col = color.ToArgb(); - col += val; - return Color.FromArgb(col); - } - - private void DoColumnReorder() - { - if (_columnDown != CurrentCell.Column) - { - var oldIndex = _columns.IndexOf(_columnDown); - var newIndex = _columns.IndexOf(CurrentCell.Column); - - ColumnReordered?.Invoke(this, new ColumnReorderedEventArgs(oldIndex, newIndex, _columnDown)); - - _columns.Remove(_columnDown); - _columns.Insert(newIndex, _columnDown); - } - } - - // ScrollBar.Maximum = DesiredValue + ScrollBar.LargeChange - 1 - // See MSDN Page for more information on the dumb ScrollBar.Maximum Property - private void RecalculateScrollBars() - { - UpdateDrawSize(); - - var columns = _columns.VisibleColumns.ToList(); - - if (HorizontalOrientation) - { - NeedsVScrollbar = columns.Count > DrawHeight / CellHeight; - NeedsHScrollbar = RowCount > 1; - } - else - { - NeedsVScrollbar = RowCount > 1; - NeedsHScrollbar = TotalColWidth.HasValue && TotalColWidth.Value - DrawWidth + 1 > 0; - } - - UpdateDrawSize(); - if (VisibleRows > 0) - { - if (HorizontalOrientation) - { - _vBar.LargeChange = DrawHeight / 2; - _hBar.Maximum = Math.Max((VisibleRows - 1) * CellHeight, _hBar.Maximum); - _hBar.LargeChange = (VisibleRows - 1) * CellHeight; - } - else - { - _vBar.Maximum = Math.Max((VisibleRows - 1) * CellHeight, _vBar.Maximum); // ScrollBar.Maximum is dumb - _vBar.LargeChange = (VisibleRows - 1) * CellHeight; - // DrawWidth can be negative if the TAStudio window is small enough - // Clamp LargeChange to 0 here to prevent exceptions - _hBar.LargeChange = Math.Max(0, DrawWidth / 2); - } - } - - // Update VBar - if (NeedsVScrollbar) - { - if (HorizontalOrientation) - { - _vBar.Maximum = ((columns.Count() * CellHeight) - DrawHeight) + _vBar.LargeChange; - } - else - { - _vBar.Maximum = RowsToPixels(RowCount + 1) - (CellHeight * 3) + _vBar.LargeChange - 1; - } - - _vBar.Location = new Point(Width - _vBar.Width, 0); - _vBar.Height = Height; - _vBar.Visible = true; - } - else - { - _vBar.Visible = false; - _vBar.Value = 0; - } - - // Update HBar - if (NeedsHScrollbar) - { - if (HorizontalOrientation) - { - _hBar.Maximum = RowsToPixels(RowCount + 1) - (CellHeight * 3) + _hBar.LargeChange - 1; - } - else - { - _hBar.Maximum = TotalColWidth.Value - DrawWidth + _hBar.LargeChange; - } - - _hBar.Location = new Point(0, Height - _hBar.Height); - _hBar.Width = Width - (NeedsVScrollbar ? (_vBar.Width + 1) : 0); - _hBar.Visible = true; - } - else - { - _hBar.Visible = false; - _hBar.Value = 0; - } - } - - private void UpdateDrawSize() - { - if (NeedsVScrollbar) - { - DrawWidth = Width - _vBar.Width; - } - else - { - DrawWidth = Width; - } - if (NeedsHScrollbar) - { - DrawHeight = Height - _hBar.Height; - } - else - { - DrawHeight = Height; - } - } - - /// - /// If FullRowSelect is enabled, selects all cells in the row that contains the given cell. Otherwise only given cell is added. - /// - /// The cell to select. - private void SelectCell(Cell cell, bool toggle = false) - { - if (cell.RowIndex.HasValue && cell.RowIndex < RowCount) - { - if (!MultiSelect) - { - _selectedItems.Clear(); - } - - if (FullRowSelect) - { - if (toggle && _selectedItems.Any(x => x.RowIndex.HasValue && x.RowIndex == cell.RowIndex)) - { - var items = _selectedItems - .Where(x => x.RowIndex.HasValue && x.RowIndex == cell.RowIndex) - .ToList(); - - foreach (var item in items) - { - _selectedItems.Remove(item); - } - } - else - { - foreach (var column in _columns) - { - _selectedItems.Add(new Cell - { - RowIndex = cell.RowIndex, - Column = column - }); - } - } - } - else - { - if (toggle && _selectedItems.Any(x => x.RowIndex.HasValue && x.RowIndex == cell.RowIndex)) - { - var item = _selectedItems - .FirstOrDefault(x => x.Equals(cell)); - - if (item != null) - { - _selectedItems.Remove(item); - } - } - else - { - _selectedItems.Add(CurrentCell); - } - } - } - } - - private bool IsHoveringOnColumnCell => CurrentCell?.Column != null && !CurrentCell.RowIndex.HasValue; - - private bool IsHoveringOnDataCell => CurrentCell?.Column != null && CurrentCell.RowIndex.HasValue; - - private bool WasHoveringOnColumnCell => LastCell?.Column != null && !LastCell.RowIndex.HasValue; - - private bool WasHoveringOnDataCell => LastCell?.Column != null && LastCell.RowIndex.HasValue; - - /// - /// Finds the specific cell that contains the (x, y) coordinate. - /// - /// The row number that it returns will be between 0 and VisibleRows, NOT the absolute row number. - /// X coordinate point. - /// Y coordinate point. - /// The cell with row number and RollColumn reference, both of which can be null. - private Cell CalculatePointedCell(int x, int y) - { - var newCell = new Cell(); - var columns = _columns.VisibleColumns.ToList(); - - // If pointing to a column header - if (columns.Any()) - { - if (HorizontalOrientation) - { - newCell.RowIndex = PixelsToRows(x); - - int colIndex = (y + _vBar.Value) / CellHeight; - if (colIndex >= 0 && colIndex < columns.Count) - { - newCell.Column = columns[colIndex]; - } - } - else - { - newCell.RowIndex = PixelsToRows(y); - newCell.Column = ColumnAtX(x); - } - } - - if (!(IsPaintDown || RightButtonHeld) && newCell.RowIndex <= -1) // -2 if we're entering from the top - { - newCell.RowIndex = null; - } - - return newCell; - } - - // A boolean that indicates if the InputRoll is too large vertically and requires a vertical scrollbar. - private bool NeedsVScrollbar { get; set; } - - // A boolean that indicates if the InputRoll is too large horizontally and requires a horizontal scrollbar. - private bool NeedsHScrollbar { get; set; } - - /// - /// Updates the width of the supplied column. - /// Call when changing the ColumnCell text, CellPadding, or text font. - /// - /// The RollColumn object to update. - /// The new width of the RollColumn object. - private int UpdateWidth(RollColumn col) - { - col.Width = (col.Text.Length * _charSize.Width) + (CellWidthPadding * 4); - return col.Width.Value; - } - - /// - /// Gets the total width of all the columns by using the last column's Right property. - /// - /// A nullable Int representing total width. - private int? TotalColWidth - { - get - { - if (_columns.VisibleColumns.Any()) - { - return _columns.VisibleColumns.Last().Right; - } - - return null; - } - } - - /// - /// Returns the RollColumn object at the specified visible x coordinate. Coordinate should be between 0 and Width of the InputRoll Control. - /// - /// The x coordinate. - /// RollColumn object that contains the x coordinate or null if none exists. - private RollColumn ColumnAtX(int x) - { - foreach (RollColumn column in _columns.VisibleColumns) - { - if (column.Left.Value - _hBar.Value <= x && column.Right.Value - _hBar.Value >= x) - { - return column; - } - } - - return null; - } - - /// - /// Converts a row number to a horizontal or vertical coordinate. - /// - /// A vertical coordinate if Vertical Oriented, otherwise a horizontal coordinate. - private int RowsToPixels(int index) - { - if (_horizontalOrientation) - { - return (index * CellWidth) + ColumnWidth; - } - - return (index * CellHeight) + ColumnHeight; - } - - /// - /// Converts a horizontal or vertical coordinate to a row number. - /// - /// A vertical coordinate if Vertical Oriented, otherwise a horizontal coordinate. - /// A row number between 0 and VisibleRows if it is a Datarow, otherwise a negative number if above all Datarows. - private int PixelsToRows(int pixels) - { - // Using Math.Floor and float because integer division rounds towards 0 but we want to round down. - if (_horizontalOrientation) - { - return (int)Math.Floor((float)(pixels - ColumnWidth) / CellWidth); - } - return (int)Math.Floor((float)(pixels - ColumnHeight) / CellHeight); - } - - // The width of the largest column cell in Horizontal Orientation - - private int ColumnWidth { get; set; } - - // The height of a column cell in Vertical Orientation. - private int ColumnHeight { get; set; } - - // The width of a cell in Horizontal Orientation. Only can be changed by changing the Font or CellPadding. - private int CellWidth { get; set; } - - [Browsable(false)] - public int RowHeight => CellHeight; - - /// - /// Gets or sets a value indicating the height of a cell in Vertical Orientation. Only can be changed by changing the Font or CellPadding. - /// - private int CellHeight { get; set; } - - /// - /// Call when _charSize, MaxCharactersInHorizontal, or CellPadding is changed. - /// - private void UpdateCellSize() - { - CellHeight = _charSize.Height + (CellHeightPadding * 2); - CellWidth = (_charSize.Width * MaxCharactersInHorizontal) + (CellWidthPadding * 4); // Double the padding for horizontal because it looks better - } - - // SuuperW: Count lag frames between FirstDisplayed and given display position - private int CountLagFramesDisplay(int relativeIndex) - { - if (QueryFrameLag != null && LagFramesToHide != 0) - { - int count = 0; - for (int i = 0; i <= relativeIndex; i++) - { - count += _lagFrames[i]; - } - - return count; - } - - return 0; - } - - // Count lag frames between FirstDisplayed and given relative frame index - private int CountLagFramesAbsolute(int relativeIndex) - { - if (QueryFrameLag != null && LagFramesToHide != 0) - { - int count = 0; - for (int i = 0; i + count <= relativeIndex; i++) - { - count += _lagFrames[i]; - } - - return count; - } - - return 0; - } - - private void SetLagFramesArray() - { - if (QueryFrameLag != null && LagFramesToHide != 0) - { - bool showNext = false; - - // First one needs to check BACKWARDS for lag frame count. - SetLagFramesFirst(); - int f = _lagFrames[0]; - if (QueryFrameLag(FirstVisibleRow + f, HideWasLagFrames)) - { - showNext = true; - } - - for (int i = 1; i <= VisibleRows; i++) - { - _lagFrames[i] = 0; - if (!showNext) - { - for (; _lagFrames[i] < LagFramesToHide; _lagFrames[i]++) - { - if (!QueryFrameLag(FirstVisibleRow + i + f, HideWasLagFrames)) - { - break; - } - - f++; - } - } - else - { - if (!QueryFrameLag(FirstVisibleRow + i + f, HideWasLagFrames)) - { - showNext = false; - } - } - - if (_lagFrames[i] == LagFramesToHide && QueryFrameLag(FirstVisibleRow + i + f, HideWasLagFrames)) - { - showNext = true; - } - } - } - else - { - for (int i = 0; i <= VisibleRows; i++) - { - _lagFrames[i] = 0; - } - } - } - private void SetLagFramesFirst() - { - if (QueryFrameLag != null && LagFramesToHide != 0) - { - // Count how many lag frames are above displayed area. - int count = 0; - do - { - count++; - } - while (QueryFrameLag(FirstVisibleRow - count, HideWasLagFrames) && count <= LagFramesToHide); - count--; - - // Count forward - int fCount = -1; - do - { - fCount++; - } - while (QueryFrameLag(FirstVisibleRow + fCount, HideWasLagFrames) && count + fCount < LagFramesToHide); - _lagFrames[0] = (byte)fCount; - } - else - { - _lagFrames[0] = 0; - } - } - - // Number of displayed + hidden frames, if fps is as expected - private int ExpectedDisplayRange() - { - return (VisibleRows + 1) * LagFramesToHide; - } - - #endregion - - #region Classes - - public class RollColumns : List - { - public RollColumn this[string name] - { - get - { - return this.SingleOrDefault(column => column.Name == name); - } - } - - public IEnumerable VisibleColumns - { - get - { - return this.Where(c => c.Visible); - } - } - - public Action ChangedCallback { get; set; } - - private void DoChangeCallback() - { - // no check will make it crash for user too, not sure which way of alarm we prefer. no alarm at all will cause all sorts of subtle bugs - if (ChangedCallback == null) - { - System.Diagnostics.Debug.Fail("ColumnChangedCallback has died!"); - } - else - { - ChangedCallback(); - } - } - - // TODO: this shouldn't be exposed. But in order to not expose it, each RollColumn must have a change callback, and all property changes must call it, it is quicker and easier to just call this when needed - public void ColumnsChanged() - { - int pos = 0; - - var columns = VisibleColumns.ToList(); - - for (int i = 0; i < columns.Count; i++) - { - columns[i].Left = pos; - pos += columns[i].Width.Value; - columns[i].Right = pos; - } - - DoChangeCallback(); - } - - public new void Add(RollColumn column) - { - if (this.Any(c => c.Name == column.Name)) - { - // The designer sucks, doing nothing for now - return; - //throw new InvalidOperationException("A column with this name already exists."); - } - - base.Add(column); - ColumnsChanged(); - } - - public new void AddRange(IEnumerable collection) - { - foreach (var column in collection) - { - if (this.Any(c => c.Name == column.Name)) - { - // The designer sucks, doing nothing for now - return; - - throw new InvalidOperationException("A column with this name already exists."); - } - } - - base.AddRange(collection); - ColumnsChanged(); - } - - public new void Insert(int index, RollColumn column) - { - if (this.Any(c => c.Name == column.Name)) - { - throw new InvalidOperationException("A column with this name already exists."); - } - - base.Insert(index, column); - ColumnsChanged(); - } - - public new void InsertRange(int index, IEnumerable collection) - { - foreach (var column in collection) - { - if (this.Any(c => c.Name == column.Name)) - { - throw new InvalidOperationException("A column with this name already exists."); - } - } - - base.InsertRange(index, collection); - ColumnsChanged(); - } - - public new bool Remove(RollColumn column) - { - var result = base.Remove(column); - ColumnsChanged(); - return result; - } - - public new int RemoveAll(Predicate match) - { - var result = base.RemoveAll(match); - ColumnsChanged(); - return result; - } - - public new void RemoveAt(int index) - { - base.RemoveAt(index); - ColumnsChanged(); - } - - public new void RemoveRange(int index, int count) - { - base.RemoveRange(index, count); - ColumnsChanged(); - } - - public new void Clear() - { - base.Clear(); - ColumnsChanged(); - } - - public IEnumerable Groups - { - get - { - return this - .Select(x => x.Group) - .Distinct(); - } - } - } - - public class RollColumn - { - public enum InputType { Boolean, Float, Text, Image } - - public string Group { get; set; } - public int? Width { get; set; } - public int? Left { get; set; } - public int? Right { get; set; } - public string Name { get; set; } - public string Text { get; set; } - public InputType Type { get; set; } - public bool Visible { get; set; } - - /// - /// Column will be drawn with an emphasized look, if true - /// - private bool _emphasis; - public bool Emphasis - { - get { return _emphasis; } - set { _emphasis = value; } - } - - public RollColumn() - { - Visible = true; - } - } - - /// - /// Represents a single cell of the - /// - public class Cell - { - public RollColumn Column { get; internal set; } - public int? RowIndex { get; internal set; } - public string CurrentText { get; internal set; } - - public Cell() { } - - public Cell(Cell cell) - { - Column = cell.Column; - RowIndex = cell.RowIndex; - } - - public bool IsDataCell => Column != null && RowIndex.HasValue; - - public override bool Equals(object obj) - { - if (obj is Cell) - { - var cell = obj as Cell; - return this.Column == cell.Column && this.RowIndex == cell.RowIndex; - } - - return base.Equals(obj); - } - - public override int GetHashCode() - { - return Column.GetHashCode() + RowIndex.GetHashCode(); - } - } - - private class SortCell : IComparer - { - int IComparer.Compare(Cell a, Cell b) - { - Cell c1 = a as Cell; - Cell c2 = b as Cell; - if (c1.RowIndex.HasValue) - { - if (c2.RowIndex.HasValue) - { - int row = c1.RowIndex.Value.CompareTo(c2.RowIndex.Value); - if (row == 0) - { - return c1.Column.Name.CompareTo(c2.Column.Name); - } - - return row; - } - - return 1; - } - - if (c2.RowIndex.HasValue) - { - return -1; - } - - return c1.Column.Name.CompareTo(c2.Column.Name); - } - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/MenuButton.cs b/BizHawk.Client.EmuHawk/CustomControls/MenuButton.cs deleted file mode 100644 index e958b51710..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/MenuButton.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using System.ComponentModel; - -namespace BizHawk.Client.EmuHawk -{ - public class MenuButton : Button - { - public MenuButton() { } - - [DefaultValue(null)] - public ContextMenuStrip Menu { get; set; } - - protected override void OnMouseDown(MouseEventArgs mevent) - { - base.OnMouseDown(mevent); - - if (Menu != null && mevent.Button == MouseButtons.Left) - { - Menu.Show(this, mevent.Location); - } - } - - protected override void OnPaint(PaintEventArgs pevent) - { - base.OnPaint(pevent); - - int arrowX = ClientRectangle.Width - 14; - int arrowY = ClientRectangle.Height / 2 - 1; - - Brush brush = Enabled ? SystemBrushes.ControlText : SystemBrushes.ButtonShadow; - Point[] arrows = new Point[] { new Point(arrowX, arrowY), new Point(arrowX + 7, arrowY), new Point(arrowX + 3, arrowY + 4) }; - pevent.Graphics.FillPolygon(brush, arrows); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/MiscControls.cs b/BizHawk.Client.EmuHawk/CustomControls/MiscControls.cs deleted file mode 100644 index 72fc189416..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/MiscControls.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Drawing; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class HorizontalLine : Control - { - protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) - { - base.SetBoundsCore(x, y, width, 2, specified); - } - - protected override void OnPaint(PaintEventArgs e) - { - ControlPaint.DrawBorder3D(e.Graphics, 0, 0, Width, 2, Border3DStyle.Etched); - } - } - - public class CustomCheckBox : CheckBox - { - Color _CheckBackColor = SystemColors.Control; - public Color CheckBackColor - { - get { return _CheckBackColor; } - set { _CheckBackColor = value; Refresh(); } - } - - bool? _ForceChecked; - public bool? ForceChecked - { - get { return _ForceChecked; } - set { _ForceChecked = value; Refresh(); } - } - - protected override void OnPaint(PaintEventArgs pevent) - { - //draw text-label part of the control with something so that it isn't hallofmirrorsy - using(var brush = new SolidBrush(Parent.BackColor)) - pevent.Graphics.FillRectangle(brush, ClientRectangle); - - var r = new Rectangle(ClientRectangle.Location, SystemInformation.MenuCheckSize); - var glyphLoc = ClientRectangle; - glyphLoc.Size = SystemInformation.MenuCheckSize; - - //draw the selectedbackdrop color roughly where the glyph belongs - using (var brush = new SolidBrush(_CheckBackColor)) - pevent.Graphics.FillRectangle(brush, glyphLoc); - - //draw a checkbox menu glyph (we could do this more elegantly with DrawFrameControl) - bool c = CheckState == CheckState.Checked; - if (ForceChecked.HasValue) - { - c = ForceChecked.Value; - } - if (c) - { - glyphLoc.Y--; - glyphLoc.X++; - ControlPaint.DrawMenuGlyph(pevent.Graphics, glyphLoc, MenuGlyph.Checkmark, Color.Black, Color.Transparent); - } - - //draw a border on top of it all - ControlPaint.DrawBorder3D(pevent.Graphics, r, Border3DStyle.Sunken); - - //stuff that didnt work - //CheckBoxRenderer.DrawParentBackground(pevent.Graphics, ClientRectangle, this); - //CheckBoxRenderer.DrawCheckBox(pevent.Graphics, ClientRectangle.Location, System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal); - //glyphLoc.Size = new System.Drawing.Size(SystemInformation.MenuCheckSize.Width-1,SystemInformation.MenuCheckSize.Height-1); - } - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs deleted file mode 100644 index 6a3dad199e..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs +++ /dev/null @@ -1,351 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -// http://www.codeproject.com/Articles/154680/A-customizable-NET-WinForms-Message-Box -namespace BizHawk.Client.EmuHawk.CustomControls -{ - /// - /// A customizable Dialog box with 3 buttons, custom icon, and checkbox. - /// - partial class MsgBox : Form - { - /// - /// Create a new instance of the dialog box with a message and title. - /// - /// Message text. - /// Dialog Box title. - public MsgBox(string message, string title) - : this(message, title, MessageBoxIcon.None) - { - - } - - /// - /// Create a new instance of the dialog box with a message and title and a standard windows messagebox icon. - /// - /// Message text. - /// Dialog Box title. - /// Standard system messagebox icon. - public MsgBox(string message, string title, MessageBoxIcon icon) - : this(message, title, getMessageBoxIcon(icon)) - { - - } - - /// - /// Create a new instance of the dialog box with a message and title and a custom windows icon. - /// - /// Message text. - /// Dialog Box title. - /// Custom icon. - public MsgBox(string message, string title, Icon icon) - { - InitializeComponent(); - - this.messageLbl.Text = message; - this.Text = title; - this.m_sysIcon = icon; - - if (this.m_sysIcon == null) - this.messageLbl.Location = new Point(FORM_X_MARGIN, FORM_Y_MARGIN); - } - - public void SetMessageToAutoSize() - { - this.messageLbl.AutoSize = true; - this.messageLbl.MaximumSize = new Size(this.MaximumSize.Width - this.m_sysIcon.Width - 25, this.MaximumSize.Height); - } - - /// - /// Get system icon for MessageBoxIcon. - /// - /// The MessageBoxIcon value. - /// SystemIcon type Icon. - static Icon getMessageBoxIcon(MessageBoxIcon icon) - { - switch (icon) - { - case MessageBoxIcon.Asterisk: - return SystemIcons.Asterisk; - case MessageBoxIcon.Error: - return SystemIcons.Error; - case MessageBoxIcon.Exclamation: - return SystemIcons.Exclamation; - case MessageBoxIcon.Question: - return SystemIcons.Question; - default: - return null; - } - } - - #region Setup API - - /// - /// Min set width. - /// - int m_minWidth; - /// - /// Min set height. - /// - int m_minHeight; - - /// - /// Sets the min size of the dialog box. If the text or button row needs more size then the dialog box will size to fit the text. - /// - /// Min width value. - /// Min height value. - public void SetMinSize(int width, int height) - { - m_minWidth = width; - m_minHeight = height; - } - - /// - /// Create up to 3 buttons with no DialogResult values. - /// - /// Array of button names. Must of length 1-3. - public void SetButtons(params string[] names) - { - DialogResult[] drs = new DialogResult[names.Length]; - for (int i = 0; i < names.Length; i++) - drs[i] = DialogResult.None; - this.SetButtons(names, drs); - } - - /// - /// Create up to 3 buttons with given DialogResult values. - /// - /// Array of button names. Must of length 1-3. - /// Array of DialogResult values. Must be same length as names. - public void SetButtons(string[] names, DialogResult[] results) - { - this.SetButtons(names, results, 1); - } - - /// - /// Create up to 3 buttons with given DialogResult values. - /// - /// Array of button names. Must of length 1-3. - /// Array of DialogResult values. Must be same length as names. - /// Default Button number. Must be 1-3. - public void SetButtons(string[] names, DialogResult[] results, int def) - { - if (names == null) - throw new ArgumentNullException(nameof(names), "Button Text is null"); - - int count = names.Length; - - if (count < 1 || count > 3) - throw new ArgumentException("Invalid number of buttons. Must be between 1 and 3."); - - //---- Set Button 1 - m_minButtonRowWidth += setButtonParams(btn1, names[0], def == 1 ? 1 : 2, results[0]); - - //---- Set Button 2 - if (count > 1) - { - m_minButtonRowWidth += setButtonParams(btn2, names[1], def == 2 ? 1 : 3, results[1]) + BUTTON_SPACE; - } - - //---- Set Button 3 - if (count > 2) - { - m_minButtonRowWidth += setButtonParams(btn3, names[2], def == 3 ? 1 : 4, results[2]) + BUTTON_SPACE; - } - - } - - /// - /// The min required width of the button and checkbox row. Sum of button widths + checkbox width + margins. - /// - int m_minButtonRowWidth; - - /// - /// Sets button text and returns the width. - /// - /// Button object. - /// Text of the button. - /// TabIndex of the button. - /// DialogResult of the button. - /// Width of the button. - static int setButtonParams(Button btn, string text, int tab, DialogResult dr) - { - btn.Text = text; - btn.Visible = true; - btn.DialogResult = dr; - btn.TabIndex = tab; - return btn.Size.Width; - } - - /// - /// Enables the checkbox. By default the checkbox is unchecked. - /// - /// Text of the checkbox. - public void SetCheckbox(string text) - { - this.SetCheckbox(text, false); - } - - /// - /// Enables the checkbox and the default checked state. - /// - /// Text of the checkbox. - /// Default checked state of the box. - public void SetCheckbox(string text, bool chcked) - { - this.chkBx.Visible = true; - this.chkBx.Text = text; - this.chkBx.Checked = chcked; - this.m_minButtonRowWidth += this.chkBx.Size.Width + CHECKBOX_SPACE; - } - - #endregion - - #region Sizes and Locations - private void DialogBox_Load(object sender, EventArgs e) - { - if (!btn1.Visible) - this.SetButtons(new string[] { "OK" }, new DialogResult[] { DialogResult.OK }); - - m_minButtonRowWidth += 2 * FORM_X_MARGIN; //add margin to the ends - - this.setDialogSize(); - - //this.setButtonRowLocations(); - - } - - const int FORM_Y_MARGIN = 10; - const int FORM_X_MARGIN = 16; - const int BUTTON_SPACE = 5; - const int CHECKBOX_SPACE = 15; - const int TEXT_Y_MARGIN = 30; - - /// - /// Auto fits the dialog box to fit the text and the buttons. - /// - void setDialogSize() - { - int requiredWidth = this.messageLbl.Location.X + this.messageLbl.Size.Width + FORM_X_MARGIN; - requiredWidth = requiredWidth > m_minButtonRowWidth ? requiredWidth : m_minButtonRowWidth; - - int requiredHeight = this.messageLbl.Location.Y + this.messageLbl.Size.Height - this.btn2.Location.Y + this.ClientSize.Height + TEXT_Y_MARGIN; - - int minSetWidth = this.ClientSize.Width > this.m_minWidth ? this.ClientSize.Width : this.m_minWidth; - int minSetHeight = this.ClientSize.Height > this.m_minHeight ? this.ClientSize.Height : this.m_minHeight; - - Size s = new Size(); - s.Width = requiredWidth > minSetWidth ? requiredWidth : minSetWidth; - s.Height = requiredHeight > minSetHeight ? requiredHeight : minSetHeight; - this.ClientSize = s; - } - - /// - /// Sets the buttons and checkboxe location. - /// - void setButtonRowLocations() - { - int formWidth = this.ClientRectangle.Width; - - int x = formWidth - FORM_X_MARGIN; - int y = btn1.Location.Y; - - if (btn3.Visible) - { - x -= btn3.Size.Width; - btn3.Location = new Point(x, y); - x -= BUTTON_SPACE; - } - - if (btn2.Visible) - { - x -= btn2.Size.Width; - btn2.Location = new Point(x, y); - x -= BUTTON_SPACE; - } - - x -= btn1.Size.Width; - btn1.Location = new Point(x, y); - - if (this.chkBx.Visible) - this.chkBx.Location = new Point(FORM_X_MARGIN, this.chkBx.Location.Y); - - } - - #endregion - - #region Icon Pain - /// - /// The icon to paint. - /// - Icon m_sysIcon; - - /// - /// Paint the System Icon in the top left corner. - /// - /// - protected override void OnPaint(PaintEventArgs e) - { - if (m_sysIcon != null) - { - Graphics g = e.Graphics; - g.DrawIconUnstretched(m_sysIcon, new Rectangle(FORM_X_MARGIN, FORM_Y_MARGIN, m_sysIcon.Width, m_sysIcon.Height)); - } - - base.OnPaint(e); - } - #endregion - - #region Result API - - /// - /// If visible checkbox was checked. - /// - public bool CheckboxChecked - { - get - { - return this.chkBx.Checked; - } - } - - DialogBoxResult m_result; - /// - /// Gets the button that was pressed. - /// - public DialogBoxResult DialogBoxResult - { - get - { - return m_result; - } - } - - private void btn_Click(object sender, EventArgs e) - { - if (sender == btn1) - this.m_result = DialogBoxResult.Button1; - else if (sender == btn2) - this.m_result = DialogBoxResult.Button2; - else if (sender == btn3) - this.m_result = DialogBoxResult.Button3; - - if (((Button)sender).DialogResult == DialogResult.None) - this.Close(); - } - - #endregion - } - - public enum DialogBoxResult - { - Button1, - Button2, - Button3 - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx deleted file mode 100644 index 4369d0a05f..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA - AABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJ - CSoJCQlhAAAAhgAAAKQAAAC3AAAAvwAAAL8AAAC1AAAAoQAAAIIRERFdHBwcJQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4e - HjcNDQ2TBQUF4gAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gUF - BeAODg6RHh4eNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZ - GQEdHR1UCAgIzAAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gcHB8gcHBxQHBwcAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAGxsbNggICMoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CAgIxh8fHzIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAB0dHQUSEhKJAQEB/AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB - AfsRERGDISEhBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAISEhFwoKCsQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/CgoKwB4eHhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYjBgYG3gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUFBdkjIyMfAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHiECAgLjAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4EBATdCAgIqw0NDYUSEhJsGBgYYBgYGGATExNtDQ0NhQkJ - CawFBQXfAAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBwffHBwcHQAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///////wAA///AA///AAD//gAAf/8AAP/wAAAP/wAA/+AAAAf/AAD/gAAAAf8AAP8A - AAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAH/gAHwAA8AD//wAfAADwA///wA8AAOAH///gBwAA4Avw//AH - AADAOQAH/AMAAMBwAAH8AwAAgHAAAH4BAACA8AAAPwEAAIHgDwA/gQAAgeAfgB+BAAAD4A+AH8AAAAPg - P4APwAAAB///gA/gAAAH//8AD+AAAAf//gAP4AAAB//4AB/gAAAH/8AAH+AAAA//AAA/8AAAD/4AAP/w - AAAP/AAB//AAAIf4AA//4QAAh/AAP//hAACH8AD//+EAAMfwAf//4wAAx/AB/8fjAADD8AHwB8MAAOP4 - AfAHxwAA8fgA+AePAADx/AAAD48AAPj+AAAPHwAA/H8AAA4/AAD+P8AADH8AAP8f+AOY/wAA/4////H/ - AAD/x///4/8AAP/z///P/wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAQEBBAAAABwAAAApAAAAKQAAABoBAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAwPAAAMIQAAJABAACYCQAAxiMAAPfvAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs deleted file mode 100644 index 3ebf156da0..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs +++ /dev/null @@ -1,171 +0,0 @@ -namespace BizHawk.Client.EmuHawk.CustomControls -{ - partial class PrereqsAlert - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PrereqsAlert)); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.label1 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.linkLabel2 = new System.Windows.Forms.LinkLabel(); - this.button1 = new System.Windows.Forms.Button(); - this.label4 = new System.Windows.Forms.Label(); - this.textBox2 = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // linkLabel1 - // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(21, 214); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(168, 13); - this.linkLabel1.TabIndex = 0; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "http://tasvideos.org/Bizhawk.html"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(425, 13); - this.label1.TabIndex = 1; - this.label1.Text = "You\'re missing some of the following prerequisites, which prevents BizHawk from r" + - "unning:"; - // - // textBox1 - // - this.textBox1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBox1.Location = new System.Drawing.Point(12, 34); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ReadOnly = true; - this.textBox1.Size = new System.Drawing.Size(422, 142); - this.textBox1.TabIndex = 2; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(4, 191); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(362, 13); - this.label2.TabIndex = 3; - this.label2.Text = "You should run the latest prerequisites installer from the location indexed by:"; - // - // linkLabel2 - // - this.linkLabel2.AutoSize = true; - this.linkLabel2.Location = new System.Drawing.Point(21, 261); - this.linkLabel2.Name = "linkLabel2"; - this.linkLabel2.Size = new System.Drawing.Size(283, 13); - this.linkLabel2.TabIndex = 4; - this.linkLabel2.TabStop = true; - this.linkLabel2.Text = "https://github.com/TASVideos/BizHawk-Prereqs/releases"; - this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); - // - // button1 - // - this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(374, 410); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 6; - this.button1.Text = "Close"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(4, 286); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(141, 13); - this.label4.TabIndex = 7; - this.label4.Text = "Here\'s some general advice:"; - // - // textBox2 - // - this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.textBox2.Location = new System.Drawing.Point(12, 308); - this.textBox2.Multiline = true; - this.textBox2.Name = "textBox2"; - this.textBox2.ReadOnly = true; - this.textBox2.Size = new System.Drawing.Size(332, 125); - this.textBox2.TabIndex = 8; - this.textBox2.Text = resources.GetString("textBox2.Text"); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(4, 238); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(282, 13); - this.label3.TabIndex = 5; - this.label3.Text = "In case that URL is gone, you can get more information at:"; - // - // PrereqsAlert - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(461, 445); - this.Controls.Add(this.textBox2); - this.Controls.Add(this.label4); - this.Controls.Add(this.button1); - this.Controls.Add(this.label3); - this.Controls.Add(this.linkLabel2); - this.Controls.Add(this.label2); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.label1); - this.Controls.Add(this.linkLabel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PrereqsAlert"; - this.Text = "Prerequisites Missing!"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.LinkLabel linkLabel1; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.LinkLabel linkLabel2; - private System.Windows.Forms.Button button1; - public System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox textBox2; - private System.Windows.Forms.Label label3; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs deleted file mode 100644 index eed2e55938..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk.CustomControls -{ - public partial class PrereqsAlert : Form - { - public PrereqsAlert(bool warn_only) - { - InitializeComponent(); - if (warn_only) - button1.Text = "Continue"; - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - linkLabel1.LinkVisited = true; - System.Diagnostics.Process.Start("http://tasvideos.org/Bizhawk.html"); - } - - private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - linkLabel2.LinkVisited = true; - System.Diagnostics.Process.Start("https://github.com/TASVideos/BizHawk-Prereqs/releases"); - } - - private void button1_Click(object sender, EventArgs e) - { - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx deleted file mode 100644 index 6eeb0fa9ed..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - We're not checking the version number of the VC 2010 runtime. Be sure you have the SP1 version installed. -DirectX Web Update is reportedly failing for some people as part of our prereqs installer. Try installing it manually. -The VC 2015 prerequisite has prerequisites of its own, so install it yourself manually at your own peril. -You can proceed without Direct3d9 fully installed, but we're going to continue warning you, so you'll come help us figure out what's going wrong. - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.Designer.cs b/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.Designer.cs deleted file mode 100644 index bee1d1a55b..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.Designer.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class QuickProgressPopup - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.progressBar = new System.Windows.Forms.ProgressBar(); - this.lblProgress = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // progressBar - // - this.progressBar.Location = new System.Drawing.Point(12, 12); - this.progressBar.Name = "progressBar"; - this.progressBar.Size = new System.Drawing.Size(194, 23); - this.progressBar.TabIndex = 0; - // - // lblProgress - // - this.lblProgress.AutoSize = true; - this.lblProgress.Location = new System.Drawing.Point(12, 41); - this.lblProgress.Margin = new System.Windows.Forms.Padding(3); - this.lblProgress.Name = "lblProgress"; - this.lblProgress.Size = new System.Drawing.Size(35, 13); - this.lblProgress.TabIndex = 1; - this.lblProgress.Text = "label1"; - // - // QuickProgressPopup - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(229, 63); - this.ControlBox = false; - this.Controls.Add(this.lblProgress); - this.Controls.Add(this.progressBar); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "QuickProgressPopup"; - this.Text = "Please wait..."; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ProgressBar progressBar; - private System.Windows.Forms.Label lblProgress; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.cs b/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.cs deleted file mode 100644 index 3804c354a1..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/QuickProgressPopup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class QuickProgressPopup : Form - { - public QuickProgressPopup() - { - InitializeComponent(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/ReadonlyCheckbox.cs b/BizHawk.Client.EmuHawk/CustomControls/ReadonlyCheckbox.cs deleted file mode 100644 index d7895ca95e..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/ReadonlyCheckbox.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class ReadonlyCheckBox : CheckBox - { - protected override void OnClick(EventArgs e) - { - // Do nothing - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/RepeatButton.cs b/BizHawk.Client.EmuHawk/CustomControls/RepeatButton.cs deleted file mode 100644 index 91a03a8b4c..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/RepeatButton.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - // http://www.codeproject.com/Articles/2130/NET-port-of-Joe-s-AutoRepeat-Button-class - public class RepeatButton : Button - { - private Timer m_timer; - private bool down = false; - private bool once = false; - private int m_initdelay = 1000; - private int m_repdelay = 400; - - public RepeatButton() - { - this.MouseUp += - new MouseEventHandler(RepeatButton_MouseUp); - this.MouseDown += - new MouseEventHandler(RepeatButton_MouseDown); - - m_timer = new Timer(); - m_timer.Tick += new EventHandler(timerproc); - m_timer.Enabled = false; - } - - private void timerproc(object o1, EventArgs e1) - { - m_timer.Interval = m_repdelay; - if (down) - { - once = true; - this.PerformClick(); - } - - } - - protected override void OnClick(EventArgs e) - { - if (!once || down) - base.OnClick(e); - } - - - - private void RepeatButton_MouseDown(object sender, - System.Windows.Forms.MouseEventArgs e) - { - m_timer.Interval = m_initdelay; - m_timer.Enabled = true; - down = true; - } - - private void RepeatButton_MouseUp(object sender, - System.Windows.Forms.MouseEventArgs e) - { - m_timer.Enabled = false; - down = false; - } - - public int InitialDelay - { - get - { - return m_initdelay; - } - set - { - m_initdelay = value; - if (m_initdelay < 10) - m_initdelay = 10; - } - } - - public int RepeatDelay - { - get - { - return m_repdelay; - } - set - { - m_repdelay = value; - if (m_repdelay < 10) - m_repdelay = 10; - } - } - - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/SmartTextBoxControl.cs b/BizHawk.Client.EmuHawk/CustomControls/SmartTextBoxControl.cs deleted file mode 100644 index 1813a9feb5..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/SmartTextBoxControl.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class SmartTextBoxControl : TextBox - { - public SmartTextBoxControl() - { - ReadOnly = true; - } - protected override void OnKeyDown(KeyEventArgs e) - { - base.Text = e.KeyCode.ToString(); - OnTextChanged(new EventArgs()); - } - - protected override void OnKeyPress(KeyPressEventArgs e) - { - - } - - protected override void OnKeyUp(KeyEventArgs e) - { - } - - public override string Text - { - get { return base.Text; } - set { } - } - - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/TasListView.cs b/BizHawk.Client.EmuHawk/CustomControls/TasListView.cs deleted file mode 100644 index 0038c26e20..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/TasListView.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class TasListView : VirtualListView - { - public class Cell - { - public int? RowIndex; - public string Column; - - // Convenience hack - public override string ToString() - { - return string.IsNullOrEmpty(Column) ? "?" : Column + " - " + (RowIndex.HasValue ? RowIndex.ToString() : "?"); - } - } - - public bool RightButtonHeld { get; set; } - - public int? LastSelectedIndex - { - get - { - if (SelectedIndices.Count > 0) - { - return SelectedIndices - .OfType() - .OrderBy(x => x) - .Last(); - } - - return null; - } - } - - private Cell _currentPointedCell = new Cell(); - public Cell CurrentCell - { - get { return _currentPointedCell; } - } - - private Cell _lastPointedCell = new Cell(); - public Cell LastCell - { - get { return _lastPointedCell; } - } - - public bool InputPaintingMode { get; set; } - public bool IsPaintDown { get; private set; } - - /// - /// Calculates the column name and row number that the point (x, y) lies in. - /// - /// X coordinate - /// Y coordinate - private void CalculatePointedCell(int x, int y) - { - int? newRow; - string newColumn = ""; - - var accumulator = 0; - foreach (ColumnHeader column in Columns) - { - accumulator += column.Width; - if (accumulator < x) - { - continue; - } - - newColumn = column.Name; - break; - } - - var rowHeight = this.LineHeight;// 5 (in VirtualListView) and 6 work here for me, but are they always dependable, how can I get the padding? - var headerHeight = rowHeight + 6; - - newRow = ((y - headerHeight) / rowHeight) + this.VScrollPos; - if (newRow >= ItemCount) - { - newRow = null; - } - - if (newColumn != CurrentCell.Column || newRow != CurrentCell.RowIndex) - { - LastCell.Column = CurrentCell.Column; - LastCell.RowIndex = CurrentCell.RowIndex; - - CurrentCell.Column = newColumn; - CurrentCell.RowIndex = newRow; - - CellChanged(LastCell, CurrentCell); - } - } - - public class CellEventArgs - { - public CellEventArgs(Cell oldCell, Cell newCell) - { - OldCell = oldCell; - NewCell = newCell; - } - - public Cell OldCell { get; private set; } - public Cell NewCell { get; private set; } - } - - public delegate void CellChangeEventHandler(object sender, CellEventArgs e); - public event CellChangeEventHandler PointedCellChanged; - - private void CellChanged(Cell oldCell, Cell newCell) - { - if (PointedCellChanged != null) - { - PointedCellChanged(this, new CellEventArgs(oldCell, newCell)); - } - } - - protected override void OnMouseLeave(EventArgs e) - { - _currentPointedCell.Column = ""; - _currentPointedCell.RowIndex = null; - IsPaintDown = false; - base.OnMouseLeave(e); - } - - protected override void OnMouseMove(MouseEventArgs e) - { - CalculatePointedCell(e.X, e.Y); - base.OnMouseMove(e); - } - - protected override void OnMouseDown(MouseEventArgs e) - { - if (e.Button == MouseButtons.Left && InputPaintingMode) - { - IsPaintDown = true; - } - - if (e.Button == MouseButtons.Right) - { - RightButtonHeld = true; - } - - base.OnMouseDown(e); - } - - protected override void OnMouseUp(MouseEventArgs e) - { - IsPaintDown = false; - RightButtonHeld = false; - - base.OnMouseUp(e); - } - - protected override void OnMouseWheel(MouseEventArgs e) - { - if (RightButtonHeld) - { - DoRightMouseScroll(this, e); - } - else - { - base.OnMouseWheel(e); - } - } - - public delegate void RightMouseScrollEventHandler(object sender, MouseEventArgs e); - public event RightMouseScrollEventHandler RightMouseScrolled; - - private void DoRightMouseScroll(object sender, MouseEventArgs e) - { - if (RightMouseScrolled != null) - { - RightMouseScrolled(sender, e); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/TasListView.resx b/BizHawk.Client.EmuHawk/CustomControls/TasListView.resx deleted file mode 100644 index 43b04417e2..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/TasListView.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/TextDebugView.cs b/BizHawk.Client.EmuHawk/CustomControls/TextDebugView.cs deleted file mode 100644 index 4baad2400f..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/TextDebugView.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Drawing; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public class TextDebugView : Control - { - public TextDebugView() - { - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.Opaque, true); - SetStyle(ControlStyles.OptimizedDoubleBuffer, true); - } - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - e.Graphics.Clear(SystemColors.Control); - Font font = new Font(new FontFamily("Courier New"), 8); - e.Graphics.DrawString(Text, font, Brushes.Black,0,0); - font.Dispose(); - } - - public override string Text - { - get - { - return base.Text; - } - set - { - base.Text = value; - Invalidate(); - } - } - } - - public class TextDebugForm : Form - { - public TextDebugView view = new TextDebugView(); - public TextDebugForm() - { - view.Dock = DockStyle.Fill; - Controls.Add(view); - } - - public override string Text - { - get - { - return view.Text; - } - set - { - view.Text = value; - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/ToolStripEx.cs b/BizHawk.Client.EmuHawk/CustomControls/ToolStripEx.cs deleted file mode 100644 index bfe6182d4b..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/ToolStripEx.cs +++ /dev/null @@ -1,119 +0,0 @@ -//credit: http://blogs.msdn.com/b/rickbrew/archive/2006/01/09/511003.aspx - -using System; -using System.Windows.Forms; - -/// -/// This class adds on to the functionality provided in System.Windows.Forms.ToolStrip. -/// -public class ToolStripEx : ToolStrip -{ - private bool clickThrough = true; - - /// - /// Gets or sets whether the ToolStripEx honors item clicks when its containing form does - /// not have input focus. - /// - public bool ClickThrough - { - get - { - return clickThrough; - } - set - { - clickThrough = value; - } - } - - protected override void WndProc(ref Message m) - { - base.WndProc(ref m); - if (clickThrough && - m.Msg == NativeConstants.WM_MOUSEACTIVATE && - m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) - { - m.Result = (IntPtr)NativeConstants.MA_ACTIVATE; - } - } -} - -/// -/// This class adds on to the functionality provided in System.Windows.Forms.MenuStrip. -/// -public class MenuStripEx : MenuStrip -{ - private bool clickThrough = true; - - /// - /// Gets or sets whether the ToolStripEx honors item clicks when its containing form does - /// not have input focus. - /// - public bool ClickThrough - { - get - { - return clickThrough; - } - set - { - clickThrough = value; - } - } - - protected override void WndProc(ref Message m) - { - base.WndProc(ref m); - if (clickThrough && - m.Msg == NativeConstants.WM_MOUSEACTIVATE && - m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) - { - m.Result = (IntPtr)NativeConstants.MA_ACTIVATE; - } - } -} - -/// -/// This class adds on to the functionality provided in System.Windows.Forms.MenuStrip. -/// -public class StatusStripEx : StatusStrip -{ - private bool clickThrough = true; - - /// - /// Gets or sets whether the ToolStripEx honors item clicks when its containing form does - /// not have input focus. - /// - public bool ClickThrough - { - get - { - return clickThrough; - } - set - { - clickThrough = value; - } - } - - protected override void WndProc(ref Message m) - { - base.WndProc(ref m); - if (clickThrough && - m.Msg == NativeConstants.WM_MOUSEACTIVATE && - m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) - { - m.Result = (IntPtr)NativeConstants.MA_ACTIVATE; - } - } -} - -internal sealed class NativeConstants -{ - private NativeConstants(){} - internal const uint WM_MOUSEACTIVATE = 0x21; - internal const uint MA_ACTIVATE = 1; - internal const uint MA_ACTIVATEANDEAT = 2; - internal const uint MA_NOACTIVATE = 3; - internal const uint MA_NOACTIVATEANDEAT = 4; -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/ViewportPanel.cs b/BizHawk.Client.EmuHawk/CustomControls/ViewportPanel.cs deleted file mode 100644 index f33deb75ae..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/ViewportPanel.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Drawing; -using System.Drawing.Imaging; -using System.Drawing.Drawing2D; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// A programmatic PictureBox, really, which will paint itself using the last bitmap that was provided - /// - public class RetainedViewportPanel : Control - { - Thread threadPaint; - EventWaitHandle ewh; - volatile bool killSignal; - - public Func ReleaseCallback; - - /// - /// Turns this panel into multi-threaded mode. - /// This will sort of glitch out other gdi things on the system, but at least its fast... - /// - public void ActivateThreaded() - { - ewh = new EventWaitHandle(false, EventResetMode.AutoReset); - threadPaint = new Thread(PaintProc); - threadPaint.IsBackground = true; - threadPaint.Start(); - } - - public RetainedViewportPanel(bool doubleBuffer = false) - { - CreateHandle(); - - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.DoubleBuffer, doubleBuffer); - SetStyle(ControlStyles.Opaque, true); - SetStyle(ControlStyles.UserMouse, true); - - SetBitmap(new Bitmap(2, 2)); - } - - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - if (threadPaint != null) - { - killSignal = true; - ewh.Set(); - ewh.WaitOne(); - } - CleanupDisposeQueue(); - } - - public bool ScaleImage = true; - - void DoPaint() - { - if (bmp != null) - { - using (Graphics g = CreateGraphics()) - { - g.PixelOffsetMode = PixelOffsetMode.HighSpeed; - g.InterpolationMode = InterpolationMode.NearestNeighbor; - g.CompositingMode = CompositingMode.SourceCopy; - g.CompositingQuality = CompositingQuality.HighSpeed; - if (ScaleImage) - { - g.InterpolationMode = InterpolationMode.NearestNeighbor; - g.PixelOffsetMode = PixelOffsetMode.Half; - g.DrawImage(bmp, 0, 0, Width, Height); - } - else - { - using (var sb = new SolidBrush(Color.Black)) - { - g.FillRectangle(sb, bmp.Width, 0, Width - bmp.Width, Height); - g.FillRectangle(sb, 0, bmp.Height, bmp.Width, Height - bmp.Height); - } - g.DrawImageUnscaled(bmp, 0, 0); - } - } - } - - CleanupDisposeQueue(); - } - - void PaintProc() - { - for (; ; ) - { - ewh.WaitOne(); - if (killSignal) - { - ewh.Set(); - return; - } - - DoPaint(); - } - } - - void CleanupDisposeQueue() - { - lock (this) - { - while (DisposeQueue.Count > 0) - { - var bmp = DisposeQueue.Dequeue(); - bool dispose = true; - if(ReleaseCallback != null) - dispose = ReleaseCallback(bmp); - if(dispose) bmp.Dispose(); - } - } - } - - Queue DisposeQueue = new Queue(); - - void SignalPaint() - { - if (threadPaint == null) - DoPaint(); - else - ewh.Set(); - } - - //Size logicalSize; - ////int pitch; - //public void SetLogicalSize(int w, int h) - //{ - // if (bmp != null) bmp.Dispose(); - // bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); - // logicalSize = new Size(w, h); - //} - - /// - /// Takes ownership of the provided bitmap and will use it for future painting - /// - public void SetBitmap(Bitmap newbmp) - { - lock (this) - { - if(bmp != null) DisposeQueue.Enqueue(bmp); - bmp = newbmp; - } - SignalPaint(); - } - - Bitmap bmp; - - /// bit of a hack; use at your own risk - /// you probably shouldn't modify this? - public Bitmap GetBitmap() - { - return bmp; - } - - protected override void OnPaintBackground(PaintEventArgs pevent) - { - - } - - - protected override void OnPaint(PaintEventArgs e) - { - SignalPaint(); - base.OnPaint(e); - } - - } - - /// - /// A dumb panel which functions as a placeholder for framebuffer painting - /// - public class ViewportPanel : Control - { - public ViewportPanel() - { - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.DoubleBuffer, true); - SetStyle(ControlStyles.Opaque, true); - SetStyle(ControlStyles.UserMouse, true); - } - } - - /// - /// A ViewportPanel with a vertical scroll bar - /// - public class ScrollableViewportPanel : UserControl - { - TableLayoutPanel table; - ViewportPanel view; - VScrollBar scroll; - - public ViewportPanel View { get { return view; } } - public VScrollBar Scrollbar { get { return scroll; } } - - public int ScrollMax { get { return Scrollbar.Maximum; } set { Scrollbar.Maximum = value; } } - public int ScrollLargeChange { get { return Scrollbar.LargeChange; } set { Scrollbar.LargeChange = value; } } - - public ScrollableViewportPanel() - { - InitializeComponent(); - } - - public void InitializeComponent() - { - table = new TableLayoutPanel(); - view = new ViewportPanel(); - scroll = new VScrollBar(); - - scroll.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom; - view.Dock = DockStyle.Fill; - - table.Dock = DockStyle.Fill; - table.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); - table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); - table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 0)); - table.RowCount = 1; - table.ColumnCount = 2; - table.Controls.Add(view); - table.Controls.Add(scroll); - table.SetColumn(view, 0); - table.SetColumn(scroll, 1); - - scroll.Scroll += (sender, e) => OnScroll(e); - view.Paint += (sender, e) => OnPaint(e); - - Controls.Add(table); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs b/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs deleted file mode 100644 index f0a2d07909..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs +++ /dev/null @@ -1,854 +0,0 @@ -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - #region win32interop - - [StructLayout(LayoutKind.Sequential)] - internal struct LvDispInfo - { - public NmHdr Hdr; - public LvItem Item; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NmHdr - { - public IntPtr HwndFrom; - public IntPtr IdFrom; - public int Code; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NmItemActivate - { - public NmHdr Hdr; - public int Item; - public int SubItem; - public uint NewState; - public uint OldState; - public uint uChanged; - public POINT Action; - public uint lParam; - public uint KeyFlags; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct RECT - { - public int Top; - public int Left; - public int Bottom; - public int Right; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NmCustomDrawInfo - { - public NmHdr Hdr; - public uint dwDrawStage; - public IntPtr Hdc; - public RECT Rect; - public IntPtr dwItemSpec; - public uint ItemState; - private int _pad64bits; - public IntPtr lItemlParam; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NmLvCustomDraw - { - public NmCustomDrawInfo Nmcd; - public int ClearText; - public int ClearTextBackground; - public int SubItem; - } - - - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct LvItem - { - public uint Mask; - public int Item; - public int SubItem; - public uint State; - public uint StateMask; - public IntPtr PszText; - public int cchTextMax; - public int Image; - public IntPtr lParam; - public int Indent; - } - - [FlagsAttribute] - internal enum CustomDrawReturnFlags - { - CDRF_DODEFAULT = 0x00000000, - CDRF_NEWFONT = 0x00000002, - CDRF_SKIPDEFAULT = 0x00000004, - CDRF_NOTIFYPOSTPAINT = 0x00000010, - CDRF_NOTIFYITEMDRAW = 0x00000020, - CDRF_NOTIFYSUBITEMDRAW = 0x00000020, - CDRF_NOTIFYPOSTERASE = 0x00000040, - } - - [FlagsAttribute] - internal enum CustomDrawDrawStageFlags - { - CDDS_PREPAINT = 0x00000001, - CDDS_POSTPAINT = 0x00000002, - CDDS_PREERASE = 0x00000003, - CDDS_POSTERASE = 0x00000004, - - // the 0x000010000 bit means it's individual item specific - CDDS_ITEM = 0x00010000, - CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT), - CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT), - CDDS_ITEMPREERASE = (CDDS_ITEM | CDDS_PREERASE), - CDDS_ITEMPOSTERASE = (CDDS_ITEM | CDDS_POSTERASE), - CDDS_SUBITEM = 0x00020000, - CDDS_SUBITEMPREPAINT = (CDDS_SUBITEM | CDDS_ITEMPREPAINT), - CDDS_SUBITEMPOSTPAINT = (CDDS_SUBITEM | CDDS_ITEMPOSTPAINT), - CDDS_SUBITEMPREERASE = (CDDS_SUBITEM | CDDS_ITEMPREERASE), - CDDS_SUBITEMPOSTERASE = (CDDS_SUBITEM | CDDS_ITEMPOSTERASE), - } - - [FlagsAttribute] - internal enum LvHitTestFlags - { - LVHT_NOWHERE = 0x0001, - LVHT_ONITEMICON = 0x0002, - LVHT_ONITEMLABEL = 0x0004, - LVHT_ONITEMSTATEICON = 0x0008, - LVHT_ONITEM = (LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON), - - LVHT_ABOVE = 0x0008, - LVHT_BELOW = 0x0010, - LVHT_TORIGHT = 0x0020, - LVHT_TOLEFT = 0x0040 - } - - [StructLayout(LayoutKind.Sequential)] - internal struct POINT - { - public int X; - public int Y; - } - - [StructLayout(LayoutKind.Sequential)] - internal class LvHitTestInfo - { - public POINT Point; - public uint Flags; - public int Item; - public int SubItem; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NMLISTVIEW - { - public NmHdr hdr; - public int iItem; - public int iSubItem; - public uint uNewState; - public uint uOldState; - public uint uChanged; - public POINT ptAction; - public IntPtr lParam; - } - - - internal enum ListViewItemMask : short - { - LVIF_TEXT = 0x0001, - LVIF_IMAGE = 0x0002, - LVIF_PARAM = 0x0004, - LVIF_STATE = 0x0008, - - LVIF_INDENT = 0x0010, - LVIF_NORECOMPUTE = 0x0800, - LVIF_GROUPID = 0x0100, - LVIF_COLUMNS = 0x0200 - } - - internal enum LvNi - { - ALL = 0x0000, - FOCUSED = 0x0001, - SELECTED = 0x0002, - CUT = 0x0004, - DROPHILITED = 0x0008, - - ABOVE = 0x0100, - BELOW = 0x0200, - TOLEFT = 0x0400, - TORIGHT = 0x0800 - } - - internal enum ListViewMessages - { - LVM_FIRST = 0x1000, - LVM_GETITEMCOUNT = (LVM_FIRST + 4), - LVM_SETCALLBACKMASK = (LVM_FIRST + 11), - LVM_GETNEXTITEM = (LVM_FIRST + 12), - LVM_HITTEST = (LVM_FIRST + 18), - LVM_ENSUREVISIBLE = (LVM_FIRST + 19), - LVM_SETITEMSTATE = (LVM_FIRST + 43), - LVM_GETITEMSTATE = (LVM_FIRST + 44), - LVM_SETITEMCOUNT = (LVM_FIRST + 47), - LVM_GETSUBITEMRECT = (LVM_FIRST + 56) - } - - internal enum ListViewStyles : short - { - LVS_OWNERDATA = 0x1000, - LVS_SORTASCENDING = 0x0010, - LVS_SORTDESCENDING = 0x0020, - LVS_SHAREIMAGELISTS = 0x0040, - LVS_NOLABELWRAP = 0x0080, - LVS_AUTOARRANGE = 0x0100 - } - - internal enum ListViewStylesICF : uint - { - LVSICF_NOINVALIDATEALL = 0x00000001, - LVSICF_NOSCROLL = 0x00000002 - } - - internal enum WindowsMessage : uint - { - WM_ERASEBKGND = 0x0014, - WM_SCROLL = 0x115, - WM_LBUTTONDOWN = 0x0201, - WM_LBUTTONUP = 0x0202, - WM_LBUTTONDBLCLK = 0x0203, - WM_RBUTTONDOWN = 0x0204, - WM_RBUTTONUP = 0x0205, - WM_RBUTTONDBLCLK = 0x0206, - WM_SETFOCUS = 0x0007, - WM_NOTIFY = 0x004E, - WM_USER = 0x0400, - WM_REFLECT = WM_USER + 0x1c00 - } - - internal enum Notices - { - NM_FIRST = 0, - NM_CUSTOMDRAW = NM_FIRST - 12, - NM_CLICK = NM_FIRST - 2, - NM_DBLCLICK = NM_FIRST - 3, - } - - internal enum ListViewNotices - { - LVN_FIRST = (0 - 100), - LVN_LAST = (0 - 199), - LVN_BEGINDRAG = LVN_FIRST - 9, - LVN_BEGINRDRAG = LVN_FIRST - 11, - LVN_GETDISPINFOA = LVN_FIRST - 50, - LVN_GETDISPINFOW = LVN_FIRST - 77, - LVN_SETDISPINFOA = LVN_FIRST - 51, - LVN_SETDISPINFOW = LVN_FIRST - 78, - LVN_ODCACHEHINT = LVN_FIRST - 13, - LVN_ODFINDITEMW = LVN_FIRST - 79 - } - - [Flags] - internal enum ListViewCallBackMask : uint - { - LVIS_FOCUSED = 0x0001, - LVIS_SELECTED = 0x0002, - LVIS_CUT = 0x0004, - LVIS_DROPHILITED = 0x0008, - LVIS_GLOW = 0x0010, - LVIS_ACTIVATING = 0x0020, - - LVIS_OVERLAYMASK = 0x0F00, - LVIS_STATEIMAGEMASK = 0xF000, - } - - #endregion - - #region VirtualListView Delegates - - /// - /// Retrieve the background color for a Listview cell (item and subitem). - /// - /// Listview item (row). - /// Listview subitem (column). - /// Background color to use - public delegate void QueryItemBkColorHandler(int item, int subItem, ref Color color); - - /// - /// Retrieve the text for a Listview cell (item and subitem). - /// - /// Listview item (row). - /// Listview subitem (column). - /// Text to display. - public delegate void QueryItemTextHandler(int item, int subItem, out string text); - - /// - /// Retrieve the image index for a Listview item. - /// - /// Listview item (row). - /// Listview subitem (column) - should always be zero. - /// Index of associated ImageList. - public delegate void QueryItemImageHandler(int item, int subItem, out int imageIndex); - - /// - /// Retrieve the indent for a Listview item. The indent is always width of an image. - /// For example, 1 indents the Listview item one image width. - /// - /// Listview item (row). - /// The amount to indent the Listview item. - public delegate void QueryItemIndentHandler(int item, out int itemIndent); - - public delegate void QueryItemHandler(int idx, out ListViewItem item); - - #endregion - - /// - /// VirtualListView is a virtual Listview which allows for a large number of items(rows) - /// to be displayed. The virtual Listview contains very little actual information - - /// mainly item selection and focus information. - /// - public class VirtualListView : ListView - { - // store the item count to prevent the call to SendMessage(LVM_GETITEMCOUNT) - private int _itemCount; - - #region Display query callbacks - - /// - /// Fire the QueryItemBkColor event which requests the background color for the passed Listview cell - /// - public event QueryItemBkColorHandler QueryItemBkColor; - - /// - /// Fire the QueryItemText event which requests the text for the passed Listview cell. - /// - [Category("Data")] - public event QueryItemTextHandler QueryItemText; - - /// - /// Fire the QueryItemImage event which requests the ImageIndex for the passed Listview item. - /// - [Category("Data")] - public event QueryItemImageHandler QueryItemImage; - - /// - /// Fire the QueryItemIndent event which requests the indent for the passed Listview item. - /// - [Category("Data")] - public event QueryItemIndentHandler QueryItemIndent; - - [Category("Data")] - public event QueryItemHandler QueryItem; - - #endregion - - #region Properties - - /// - /// Gets or sets the sets the virtual number of items to be displayed. - /// - [Category("Behavior")] - public int ItemCount - { - get - { - return _itemCount; - } - - set - { - _itemCount = value; - - // If the virtual item count is set before the handle is created - // then the image lists don't get loaded properly - if (!IsHandleCreated) - { - return; - } - - SetVirtualItemCount(); - } - } - - /// - /// Gets or sets how list items are to be displayed. - /// Hide the ListView.View property. - /// Virtual Listviews only allow Details or List. - /// - public new View View - { - get - { - return base.View; - } - - set - { - if (value == View.LargeIcon || - value == View.SmallIcon) - { - throw new ArgumentException("Icon views are invalid for virtual ListViews", "View"); - } - - base.View = value; - } - } - - /// - /// Gets the required creation parameters when the control handle is created. - /// Use LVS_OWNERDATA to set this as a virtual Listview. - /// - protected override CreateParams CreateParams - { - get - { - var cp = base.CreateParams; - - // LVS_OWNERDATA style must be set when the control is created - cp.Style |= (int)ListViewStyles.LVS_OWNERDATA; - return cp; - } - } - - #endregion - - [Browsable(false)] - [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)] - public int LineHeight { get; private set; } - - [Browsable(false)] - [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)] - public int NumberOfVisibleRows - { - get - { - return Height / LineHeight; - } - } - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// Create a new instance of this control. - /// - public VirtualListView() - { - // virtual listviews must be Details or List view with no sorting - View = View.Details; - Sorting = SortOrder.None; - - UseCustomBackground = true; - - ptrlvhti = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(LvHitTestInfo))); - - SetStyle(ControlStyles.OptimizedDoubleBuffer, true); - SetStyle(ControlStyles.Opaque, true); - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - - LineHeight = this.Font.Height + 5; - } - - ~VirtualListView() - { - Marshal.FreeHGlobal(ptrlvhti); - } - - #endregion - - #region Methods - /// - /// Set the state of the passed Listview item's index. - /// - /// Listview item's index. - /// Select the passed item? - public void SelectItem(int index, bool selected) - { - var ptrItem = IntPtr.Zero; - - try - { - // Determine whether selecting or unselecting. - uint select = selected ? (uint)ListViewCallBackMask.LVIS_SELECTED : 0; - - // Fill in the LVITEM structure with state fields. - var stateItem = new LvItem - { - Mask = (uint)ListViewItemMask.LVIF_STATE, - Item = index, - SubItem = 0, - State = @select, - StateMask = (uint)ListViewCallBackMask.LVIS_SELECTED - }; - - // Copy the structure to unmanaged memory. - ptrItem = Marshal.AllocHGlobal(Marshal.SizeOf(stateItem.GetType())); - Marshal.StructureToPtr(stateItem, ptrItem, true); - - // Send the message to the control window. - Win32.SendMessage( - this.Handle, - (int)ListViewMessages.LVM_SETITEMSTATE, - (IntPtr)index, - ptrItem); - } - catch (Exception ex) - { - System.Diagnostics.Trace.WriteLine("VirtualListView.SetItemState error=" + ex.Message); - - // TODO: should this eat any exceptions? - throw; - } - finally - { - // Always release the unmanaged memory. - if (ptrItem != IntPtr.Zero) - { - Marshal.FreeHGlobal(ptrItem); - } - } - } - - private void SetVirtualItemCount() - { - Win32.SendMessage( - this.Handle, - (int)ListViewMessages.LVM_SETITEMCOUNT, - (IntPtr)this._itemCount, - IntPtr.Zero); - } - - protected void OnDispInfoNotice(ref Message m, bool useAnsi) - { - var info = (LvDispInfo)m.GetLParam(typeof(LvDispInfo)); - - if ((info.Item.Mask & (uint)ListViewItemMask.LVIF_TEXT) > 0) - { - if (QueryItemText != null) - { - string lvtext; - QueryItemText(info.Item.Item, info.Item.SubItem, out lvtext); - if (lvtext != null) - { - try - { - int maxIndex = Math.Min(info.Item.cchTextMax - 1, lvtext.Length); - var data = new char[maxIndex + 1]; - lvtext.CopyTo(0, data, 0, lvtext.Length); - data[maxIndex] = '\0'; - Marshal.Copy(data, 0, info.Item.PszText, data.Length); - } - catch (Exception e) - { - Debug.WriteLine("Failed to copy text name from client: " + e, "VirtualListView.OnDispInfoNotice"); - } - } - } - } - - if ((info.Item.Mask & (uint)ListViewItemMask.LVIF_IMAGE) > 0) - { - int imageIndex = 0; - if (QueryItemImage != null) - { - QueryItemImage(info.Item.Item, info.Item.SubItem, out imageIndex); - } - - info.Item.Image = imageIndex; - Marshal.StructureToPtr(info, m.LParam, false); - } - - if ((info.Item.Mask & (uint)ListViewItemMask.LVIF_INDENT) > 0) - { - int itemIndent = 0; - if (QueryItemIndent != null) - { - QueryItemIndent(info.Item.Item, out itemIndent); - } - - info.Item.Indent = itemIndent; - Marshal.StructureToPtr(info, m.LParam, false); - } - - m.Result = new IntPtr(0); - } - - protected void OnCustomDrawNotice(ref Message m) - { - var cd = (NmLvCustomDraw)m.GetLParam(typeof(NmLvCustomDraw)); - switch (cd.Nmcd.dwDrawStage) - { - case (int)CustomDrawDrawStageFlags.CDDS_ITEMPREPAINT: - case (int)CustomDrawDrawStageFlags.CDDS_PREPAINT: - m.Result = new IntPtr((int)CustomDrawReturnFlags.CDRF_NOTIFYSUBITEMDRAW); - break; - case (int)CustomDrawDrawStageFlags.CDDS_SUBITEMPREPAINT: - if (QueryItemBkColor != null) - { - var color = Color.FromArgb(cd.ClearTextBackground & 0xFF, (cd.ClearTextBackground >> 8) & 0xFF, (cd.ClearTextBackground >> 16) & 0xFF); - QueryItemBkColor(cd.Nmcd.dwItemSpec.ToInt32(), cd.SubItem, ref color); - cd.ClearTextBackground = (color.B << 16) | (color.G << 8) | color.R; - Marshal.StructureToPtr(cd, m.LParam, false); - } - - m.Result = new IntPtr((int)CustomDrawReturnFlags.CDRF_DODEFAULT); - break; - } - } - - /// - /// Event to be fired whenever the control scrolls - /// - public event ScrollEventHandler Scroll; - protected virtual void OnScroll(ScrollEventArgs e) - { - var handler = this.Scroll; - if (handler != null) - { - handler(this, e); - } - } - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern int GetScrollPos(IntPtr hWnd, Orientation nBar); - - /// - /// Gets the Vertical Scroll position of the control. - /// - public int VScrollPos - { - get { return GetScrollPos(this.Handle, Orientation.Vertical); } - } - - protected override void WndProc(ref Message m) - { - var messageProcessed = false; - switch (m.Msg) - { - case (int)WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY: - var nm1 = (NmHdr)m.GetLParam(typeof(NmHdr)); - switch (nm1.Code) - { - case (int)Notices.NM_CUSTOMDRAW: - OnCustomDrawNotice(ref m); - messageProcessed = true; - - if (QueryItemBkColor == null || !UseCustomBackground) - { - m.Result = (IntPtr)0; - } - - break; - case (int)ListViewNotices.LVN_GETDISPINFOW: - OnDispInfoNotice(ref m, false); - messageProcessed = true; - break; - case (int)ListViewNotices.LVN_BEGINDRAG: - OnBeginItemDrag(MouseButtons.Left, ref m); - messageProcessed = true; - break; - case (int)ListViewNotices.LVN_BEGINRDRAG: - OnBeginItemDrag(MouseButtons.Right, ref m); - messageProcessed = true; - break; - } - - break; - case (int)WindowsMessage.WM_SCROLL: - // http://stackoverflow.com/questions/1851620/handling-scroll-event-on-listview-in-c-sharp - OnScroll(new ScrollEventArgs((ScrollEventType)(m.WParam.ToInt32() & 0xffff), m.WParam.ToInt32())); - break; - case (int)WindowsMessage.WM_ERASEBKGND: - if (BlazingFast) - { - messageProcessed = true; - m.Result = new IntPtr(1); - } - - break; - } - - if (!messageProcessed) - { - try - { - base.WndProc(ref m); - } - catch (Exception ex) - { - Trace.WriteLine(string.Format("Message {0} caused an exception: {1}", m, ex.Message)); - } - } - } - - public bool BlazingFast { get; set; } - public bool UseCustomBackground { get; set; } - - protected ListViewItem GetItem(int idx) - { - ListViewItem item = null; - if (QueryItem != null) - { - QueryItem(idx, out item); - } - - if (item == null) - { - throw new ArgumentException("cannot find item " + idx + " via QueryItem event"); - } - - return item; - } - - protected void OnBeginItemDrag(MouseButtons mouseButton, ref Message m) - { - var info = (NMLISTVIEW)m.GetLParam(typeof(NMLISTVIEW)); - ListViewItem item = null; - if (QueryItem != null) - { - QueryItem(info.iItem, out item); - } - - OnItemDrag(new ItemDragEventArgs(mouseButton, item)); - } - - protected override void OnHandleCreated(EventArgs e) - { - base.OnHandleCreated(e); - - // ensure the value for ItemCount is sent to the control properly if the user set it - // before the handle was created - SetVirtualItemCount(); - } - - protected override void OnHandleDestroyed(EventArgs e) - { - // the ListView OnHandleDestroyed accesses the Items list for all selected items - ItemCount = 0; - base.OnHandleDestroyed(e); - } - - #endregion - - LvHitTestInfo lvhti = new LvHitTestInfo(); - IntPtr ptrlvhti; - int selection = -1; - - public int hitTest(int x, int y) - { - lvhti.Point.X = x; - lvhti.Point.Y = y; - Marshal.StructureToPtr(lvhti, ptrlvhti, true); - int z = (int)Win32.SendMessage(this.Handle, (int)ListViewMessages.LVM_HITTEST, (IntPtr)0, ptrlvhti); - Marshal.PtrToStructure(ptrlvhti, lvhti); - return z; - } - - public void ensureVisible(int index) - { - Win32.SendMessage(Handle, (int)ListViewMessages.LVM_ENSUREVISIBLE, (IntPtr)index, (IntPtr)1); - } - - public void ensureVisible() - { - ensureVisible(selectedItem); - } - - public void setSelection(int index) - { - clearSelection(); - selection = index; - SelectItem(selection, true); - } - - public int selectedItem - { - get - { - if (SelectedIndices.Count == 0) - { - return -1; - } - else - { - return SelectedIndices[0]; - } - } - - set - { - setSelection(value); - } - } - - public void clearSelection() - { - if (selection != -1) - { - SelectItem(selection, false); - } - - selection = -1; - } - - // Informs user that a select all event is in place, can be used in change events to wait until this is false - public bool SelectAllInProgress { get; set; } - - public void SelectAll() - { - this.BeginUpdate(); - SelectAllInProgress = true; - - for (var i = 0; i < _itemCount; i++) - { - if (i == _itemCount - 1) - { - SelectAllInProgress = false; - } - - this.SelectItem(i, true); - } - - this.EndUpdate(); - } - - public void DeselectAll() - { - this.BeginUpdate(); - SelectAllInProgress = true; - - for (var i = 0; i < _itemCount; i++) - { - if (i == _itemCount - 1) - { - SelectAllInProgress = false; - } - - this.SelectItem(i, false); - } - - this.EndUpdate(); - } - - protected override void OnKeyDown(KeyEventArgs e) - { - if (e.KeyCode == Keys.A && e.Control && !e.Alt && !e.Shift) // Select All - { - SelectAll(); - } - - base.OnKeyDown(e); - } - } -} diff --git a/BizHawk.Client.EmuHawk/CustomControls/Win32.cs b/BizHawk.Client.EmuHawk/CustomControls/Win32.cs deleted file mode 100644 index dd11df172e..0000000000 --- a/BizHawk.Client.EmuHawk/CustomControls/Win32.cs +++ /dev/null @@ -1,576 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using System.Drawing; -using System.Runtime.InteropServices; -using Microsoft.Win32.SafeHandles; - -namespace BizHawk.Client.EmuHawk -{ - public unsafe static class Win32 - { - public static bool Is64BitProcess { get { return (IntPtr.Size == 8); } } - public static bool Is64BitOperatingSystem { get { return Is64BitProcess || InternalCheckIsWow64(); } } - - [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool IsWow64Process( - [In] IntPtr hProcess, - [Out] out bool wow64Process - ); - - [DllImport("kernel32.dll")] - public static extern IntPtr LoadLibrary(string dllToLoad); - [DllImport("kernel32.dll")] - public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); - [DllImport("kernel32.dll")] - public static extern bool FreeLibrary(IntPtr hModule); - - - static bool InternalCheckIsWow64() - { - if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || - Environment.OSVersion.Version.Major >= 6) - { - using (var p = System.Diagnostics.Process.GetCurrentProcess()) - { - bool retVal; - if (!IsWow64Process(p.Handle, out retVal)) - { - return false; - } - return retVal; - } - } - else - { - return false; - } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct RECT - { - private int _Left; - private int _Top; - private int _Right; - private int _Bottom; - - public RECT(RECT Rectangle) - : this(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom) - { - } - public RECT(int Left, int Top, int Right, int Bottom) - { - _Left = Left; - _Top = Top; - _Right = Right; - _Bottom = Bottom; - } - - public int X - { - get { return _Left; } - set { _Left = value; } - } - public int Y - { - get { return _Top; } - set { _Top = value; } - } - public int Left - { - get { return _Left; } - set { _Left = value; } - } - public int Top - { - get { return _Top; } - set { _Top = value; } - } - public int Right - { - get { return _Right; } - set { _Right = value; } - } - public int Bottom - { - get { return _Bottom; } - set { _Bottom = value; } - } - public int Height - { - get { return _Bottom - _Top; } - set { _Bottom = value - _Top; } - } - public int Width - { - get { return _Right - _Left; } - set { _Right = value + _Left; } - } - public Point Location - { - get { return new Point(Left, Top); } - set - { - _Left = value.X; - _Top = value.Y; - } - } - public Size Size - { - get { return new Size(Width, Height); } - set - { - _Right = value.Width + _Left; - _Bottom = value.Height + _Top; - } - } - - public static implicit operator Rectangle(RECT Rectangle) - { - return new Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height); - } - public static implicit operator RECT(Rectangle Rectangle) - { - return new RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom); - } - public static bool operator ==(RECT Rectangle1, RECT Rectangle2) - { - return Rectangle1.Equals(Rectangle2); - } - public static bool operator !=(RECT Rectangle1, RECT Rectangle2) - { - return !Rectangle1.Equals(Rectangle2); - } - - public override string ToString() - { - return "{Left: " + _Left + "; " + "Top: " + _Top + "; Right: " + _Right + "; Bottom: " + _Bottom + "}"; - } - - public override int GetHashCode() - { - return ToString().GetHashCode(); - } - - public bool Equals(RECT Rectangle) - { - return Rectangle.Left == _Left && Rectangle.Top == _Top && Rectangle.Right == _Right && Rectangle.Bottom == _Bottom; - } - - public override bool Equals(object Object) - { - if (Object is RECT) - { - return Equals((RECT)Object); - } - else if (Object is Rectangle) - { - return Equals(new RECT((Rectangle)Object)); - } - - return false; - } - } - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct AVISTREAMINFOW - { - public Int32 fccType; - public Int32 fccHandler; - public Int32 dwFlags; - public Int32 dwCaps; - public Int16 wPriority; - public Int16 wLanguage; - public Int32 dwScale; - public Int32 dwRate; - public Int32 dwStart; - public Int32 dwLength; - public Int32 dwInitialFrames; - public Int32 dwSuggestedBufferSize; - public Int32 dwQuality; - public Int32 dwSampleSize; - public RECT rcFrame; - public Int32 dwEditCount; - public Int32 dwFormatChangeCount; - [MarshalAs(UnmanagedType.LPWStr, SizeConst=64)] - public string szName; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct BITMAPINFOHEADER - { - public uint biSize; - public int biWidth; - public int biHeight; - public ushort biPlanes; - public ushort biBitCount; - public uint biCompression; - public uint biSizeImage; - public int biXPelsPerMeter; - public int biYPelsPerMeter; - public uint biClrUsed; - public uint biClrImportant; - - public void Init() - { - biSize = (uint)Marshal.SizeOf(this); - } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct WAVEFORMATEX - { - public ushort wFormatTag; - public ushort nChannels; - public uint nSamplesPerSec; - public uint nAvgBytesPerSec; - public ushort nBlockAlign; - public ushort wBitsPerSample; - public ushort cbSize; - - public void Init() - { - cbSize = (ushort)Marshal.SizeOf(this); - } - } - - public const int WAVE_FORMAT_PCM = 1; - public const int AVIIF_KEYFRAME = 0x00000010; - - - [Flags] - public enum OpenFileStyle : uint - { - OF_CANCEL = 0x00000800, // Ignored. For a dialog box with a Cancel button, use OF_PROMPT. - OF_CREATE = 0x00001000, // Creates a new file. If file exists, it is truncated to zero (0) length. - OF_DELETE = 0x00000200, // Deletes a file. - OF_EXIST = 0x00004000, // Opens a file and then closes it. Used to test that a file exists - OF_PARSE = 0x00000100, // Fills the OFSTRUCT structure, but does not do anything else. - OF_PROMPT = 0x00002000, // Displays a dialog box if a requested file does not exist - OF_READ = 0x00000000, // Opens a file for reading only. - OF_READWRITE = 0x00000002, // Opens a file with read/write permissions. - OF_REOPEN = 0x00008000, // Opens a file by using information in the reopen buffer. - - // For MS-DOS–based file systems, opens a file with compatibility mode, allows any process on a - // specified computer to open the file any number of times. - // Other efforts to open a file with other sharing modes fail. This flag is mapped to the - // FILE_SHARE_READ|FILE_SHARE_WRITE flags of the CreateFile function. - OF_SHARE_COMPAT = 0x00000000, - - // Opens a file without denying read or write access to other processes. - // On MS-DOS-based file systems, if the file has been opened in compatibility mode - // by any other process, the function fails. - // This flag is mapped to the FILE_SHARE_READ|FILE_SHARE_WRITE flags of the CreateFile function. - OF_SHARE_DENY_NONE = 0x00000040, - - // Opens a file and denies read access to other processes. - // On MS-DOS-based file systems, if the file has been opened in compatibility mode, - // or for read access by any other process, the function fails. - // This flag is mapped to the FILE_SHARE_WRITE flag of the CreateFile function. - OF_SHARE_DENY_READ = 0x00000030, - - // Opens a file and denies write access to other processes. - // On MS-DOS-based file systems, if a file has been opened in compatibility mode, - // or for write access by any other process, the function fails. - // This flag is mapped to the FILE_SHARE_READ flag of the CreateFile function. - OF_SHARE_DENY_WRITE = 0x00000020, - - // Opens a file with exclusive mode, and denies both read/write access to other processes. - // If a file has been opened in any other mode for read/write access, even by the current process, - // the function fails. - OF_SHARE_EXCLUSIVE = 0x00000010, - - // Verifies that the date and time of a file are the same as when it was opened previously. - // This is useful as an extra check for read-only files. - OF_VERIFY = 0x00000400, - - // Opens a file for write access only. - OF_WRITE = 0x00000001 - } - - [DllImport("avifil32.dll", SetLastError = true)] - public static extern int AVIFileOpenW(ref IntPtr pAviFile, [MarshalAs(UnmanagedType.LPWStr)] string szFile, OpenFileStyle uMode, int lpHandler); - - [DllImport("avifil32.dll", SetLastError = true)] - public static extern void AVIFileInit(); - - // Create a new stream in an existing file and creates an interface to the new stream - [DllImport("avifil32.dll")] - public static extern int AVIFileCreateStreamW( - IntPtr pfile, - out IntPtr ppavi, - ref AVISTREAMINFOW psi); - - [StructLayout(LayoutKind.Sequential)] - public struct AVICOMPRESSOPTIONS - { - public int fccType; - public int fccHandler; - public int dwKeyFrameEvery; - public int dwQuality; - public int dwBytesPerSecond; - public int dwFlags; - public IntPtr lpFormat; - public int cbFormat; - public IntPtr lpParms; - public int cbParms; - public int dwInterleaveEvery; - } - - [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] - public static extern SafeFileHandle CreateFile( - string lpFileName, - uint dwDesiredAccess, - uint dwShareMode, - IntPtr SecurityAttributes, - uint dwCreationDisposition, - uint dwFlagsAndAttributes, - IntPtr hTemplateFile - ); - - [DllImport("kernel32.dll")] - public static extern FileType GetFileType(IntPtr hFile); - - [DllImport("kernel32.dll", CharSet = CharSet.Auto)] - public static extern IntPtr GetCommandLine(); - - public enum FileType : uint - { - FileTypeChar = 0x0002, - FileTypeDisk = 0x0001, - FileTypePipe = 0x0003, - FileTypeRemote = 0x8000, - FileTypeUnknown = 0x0000, - } - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr GetConsoleWindow(); - - [DllImport("user32.dll", SetLastError = true)] - public static extern bool SetForegroundWindow(IntPtr hWnd); - - [DllImport("user32.dll", SetLastError = true)] - public static extern IntPtr SetActiveWindow(IntPtr hWnd); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool AttachConsole(int dwProcessId); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool AllocConsole(); - - [DllImport("kernel32.dll", SetLastError = false)] - public static extern bool FreeConsole(); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr GetStdHandle(int nStdHandle); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool SetStdHandle(int nStdHandle, IntPtr hConsoleOutput); - - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - public static extern IntPtr CreateFile( - string fileName, - int desiredAccess, - int shareMode, - IntPtr securityAttributes, - int creationDisposition, - int flagsAndAttributes, - IntPtr templateFile); - - [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)] - public static extern bool CloseHandle(IntPtr handle); - - [DllImport("user32.dll", SetLastError = false)] - public static extern IntPtr GetDesktopWindow(); - - // Retrieve the save options for a file and returns them in a buffer - [DllImport("avifil32.dll")] - public static extern int AVISaveOptions(IntPtr hwnd, int flags, int streams, void* ppAvi, void* plpOptions); - - // Free the resources allocated by the AVISaveOptions function - [DllImport("avifil32.dll")] - public static extern int AVISaveOptionsFree( - int streams, - [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] plpOptions); - - // Create a compressed stream from an uncompressed stream and a - // compression filter, and returns the address of a pointer to - // the compressed stream - [DllImport("avifil32.dll")] - public static extern int AVIMakeCompressedStream( - out IntPtr ppsCompressed, - IntPtr psSource, - ref AVICOMPRESSOPTIONS lpOptions, - IntPtr pclsidHandler); - - // Set the format of a stream at the specified position - [DllImport("avifil32.dll")] - public static extern int AVIStreamSetFormat( - IntPtr pavi, - int lPos, - ref BITMAPINFOHEADER lpFormat, - int cbFormat); - - // Set the format of a stream at the specified position - [DllImport("avifil32.dll")] - public static extern int AVIStreamSetFormat( - IntPtr pavi, - int lPos, - ref WAVEFORMATEX lpFormat, - int cbFormat); - - // Write data to a stream - [DllImport("avifil32.dll")] - public static extern int AVIStreamWrite( - IntPtr pavi, - int lStart, - int lSamples, - IntPtr lpBuffer, - int cbBuffer, - int dwFlags, - IntPtr plSampWritten, - out int plBytesWritten); - - // Release an open AVI stream - [DllImport("avifil32.dll")] - public static extern int AVIStreamRelease( - IntPtr pavi); - - // Release an open AVI stream - [DllImport("avifil32.dll")] - public static extern int AVIFileRelease( - IntPtr pfile); - - - // Replacement of mmioFOURCC macros - public static int mmioFOURCC(string str) - { - return ( - ((int)(byte)(str[0])) | - ((int)(byte)(str[1]) << 8) | - ((int)(byte)(str[2]) << 16) | - ((int)(byte)(str[3]) << 24)); - } - - public static bool FAILED(int hr) { return hr < 0; } - - - - // Inverse of mmioFOURCC - public static string decode_mmioFOURCC(int code) - { - char[] chs = new char[4]; - - for (int i = 0; i < 4; i++) - { - chs[i] = (char)(byte)((code >> (i << 3)) & 0xFF); - if (!char.IsLetterOrDigit(chs[i])) - chs[i] = ' '; - } - return new string(chs); - } - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); - - [DllImport("Kernel32.dll", EntryPoint = "RtlZeroMemory", SetLastError = false)] - public static extern void ZeroMemory(IntPtr dest, uint size); - - [DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] - public static extern IntPtr MemSet(IntPtr dest, int c, uint count); - - [DllImport("shlwapi.dll", CharSet = CharSet.Auto)] - public static extern bool PathRelativePathTo( - [Out] System.Text.StringBuilder pszPath, - [In] string pszFrom, - [In] FileAttributes dwAttrFrom, - [In] string pszTo, - [In] FileAttributes dwAttrTo - ); - - /// - /// File attributes are metadata values stored by the file system on disk and are used by the system and are available to developers via various file I/O APIs. - /// - [Flags] - //[CLSCompliant(false)] - public enum FileAttributes : uint - { - /// - /// A file that is read-only. Applications can read the file, but cannot write to it or delete it. This attribute is not honored on directories. For more information, see "You cannot view or change the Read-only or the System attributes of folders in Windows Server 2003, in Windows XP, or in Windows Vista". - /// - Readonly = 0x00000001, - - /// - /// The file or directory is hidden. It is not included in an ordinary directory listing. - /// - Hidden = 0x00000002, - - /// - /// A file or directory that the operating system uses a part of, or uses exclusively. - /// - System = 0x00000004, - - /// - /// The handle that identifies a directory. - /// - Directory = 0x00000010, - - /// - /// A file or directory that is an archive file or directory. Applications typically use this attribute to mark files for backup or removal. - /// - Archive = 0x00000020, - - /// - /// This value is reserved for system use. - /// - Device = 0x00000040, - - /// - /// A file that does not have other attributes set. This attribute is valid only when used alone. - /// - Normal = 0x00000080, - - /// - /// A file that is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because typically, an application deletes a temporary file after the handle is closed. In that scenario, the system can entirely avoid writing the data. Otherwise, the data is written after the handle is closed. - /// - Temporary = 0x00000100, - - /// - /// A file that is a sparse file. - /// - SparseFile = 0x00000200, - - /// - /// A file or directory that has an associated reparse point, or a file that is a symbolic link. - /// - ReparsePoint = 0x00000400, - - /// - /// A file or directory that is compressed. For a file, all of the data in the file is compressed. For a directory, compression is the default for newly created files and subdirectories. - /// - Compressed = 0x00000800, - - /// - /// The data of a file is not available immediately. This attribute indicates that the file data is physically moved to offline storage. This attribute is used by Remote Storage, which is the hierarchical storage management software. Applications should not arbitrarily change this attribute. - /// - Offline = 0x00001000, - - /// - /// The file or directory is not to be indexed by the content indexing service. - /// - NotContentIndexed = 0x00002000, - - /// - /// A file or directory that is encrypted. For a file, all data streams in the file are encrypted. For a directory, encryption is the default for newly created files and subdirectories. - /// - Encrypted = 0x00004000, - - /// - /// This value is reserved for system use. - /// - Virtual = 0x00010000 - } - } - -} diff --git a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs deleted file mode 100644 index fc7ccbc84b..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs +++ /dev/null @@ -1,1015 +0,0 @@ -//TODO -//we could flag textures as 'actually' render targets (keep a reference to the render target?) which could allow us to convert between them more quickly in some cases - -using System; -using System.IO; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.FilterManager; -using BizHawk.Bizware.BizwareGL; - -using OpenTK; -using BizHawk.Bizware.BizwareGL.Drivers.SlimDX; -using BizHawk.Bizware.BizwareGL.Drivers.GdiPlus; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// A DisplayManager is destined forevermore to drive the PresentationPanel it gets initialized with. - /// Its job is to receive OSD and emulator outputs, and produce one single buffer (BitampBuffer? Texture2d?) for display by the PresentationPanel. - /// Details TBD - /// - public class DisplayManager : IDisposable - { - class DisplayManagerRenderTargetProvider : IRenderTargetProvider - { - public DisplayManagerRenderTargetProvider(Func callback) { Callback = callback; } - Func Callback; - RenderTarget IRenderTargetProvider.Get(Size size) - { - return Callback(size); - } - } - - public DisplayManager(PresentationPanel presentationPanel) - { - GL = GlobalWin.GL; - GLManager = GlobalWin.GLManager; - this.presentationPanel = presentationPanel; - GraphicsControl = this.presentationPanel.GraphicsControl; - CR_GraphicsControl = GLManager.GetContextForGraphicsControl(GraphicsControl); - - //it's sort of important for these to be initialized to something nonzero - currEmuWidth = currEmuHeight = 1; - - Renderer = GL.CreateRenderer(); - - VideoTextureFrugalizer = new TextureFrugalizer(GL); - - ShaderChainFrugalizers = new RenderTargetFrugalizer[16]; //hacky hardcoded limit.. need some other way to manage these - for (int i = 0; i < 16; i++) - { - ShaderChainFrugalizers[i] = new RenderTargetFrugalizer(GL); - } - - using (var xml = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px.fnt")) - using (var tex = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px_0.png")) - TheOneFont = new StringRenderer(GL, xml, tex); - - using (var gens = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.gens.ttf")) - LoadCustomFont(gens); - using (var fceux = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.fceux.ttf")) - LoadCustomFont(fceux); - - if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK || GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9) - { - var fiHq2x = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/hq2x.cgp")); - if (fiHq2x.Exists) - using (var stream = fiHq2x.OpenRead()) - ShaderChain_hq2x = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk")); - var fiScanlines = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/BizScanlines.cgp")); - if (fiScanlines.Exists) - using (var stream = fiScanlines.OpenRead()) - ShaderChain_scanlines = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk")); - string bicubic_path = "Shaders/BizHawk/bicubic-fast.cgp"; - if(GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9) - bicubic_path = "Shaders/BizHawk/bicubic-normal.cgp"; - var fiBicubic = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), bicubic_path)); - if (fiBicubic.Exists) - using (var stream = fiBicubic.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - ShaderChain_bicubic = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk")); - } - - LuaSurfaceSets["emu"] = new SwappableDisplaySurfaceSet(); - LuaSurfaceSets["native"] = new SwappableDisplaySurfaceSet(); - LuaSurfaceFrugalizers["emu"] = new TextureFrugalizer(GL); - LuaSurfaceFrugalizers["native"] = new TextureFrugalizer(GL); - - RefreshUserShader(); - } - - public bool Disposed { get; private set; } - - public void Dispose() - { - if (Disposed) return; - Disposed = true; - VideoTextureFrugalizer.Dispose(); - foreach (var f in LuaSurfaceFrugalizers.Values) - f.Dispose(); - foreach (var f in ShaderChainFrugalizers) - if (f != null) - f.Dispose(); - foreach (var s in new[] { ShaderChain_hq2x, ShaderChain_scanlines, ShaderChain_bicubic, ShaderChain_user }) - if (s != null) - s.Dispose(); - TheOneFont.Dispose(); - Renderer.Dispose(); - } - - //rendering resources: - IGL GL; - GLManager GLManager; - StringRenderer TheOneFont; - IGuiRenderer Renderer; - - //layer resources - PresentationPanel presentationPanel; //well, its the final layer's target, at least - GraphicsControl GraphicsControl; //well, its the final layer's target, at least - GLManager.ContextRef CR_GraphicsControl; - FilterProgram CurrentFilterProgram; - - /// - /// these variables will track the dimensions of the last frame's (or the next frame? this is confusing) emulator native output size - /// THIS IS OLD JUNK. I should get rid of it, I think. complex results from the last filter ingestion should be saved instead. - /// - int currEmuWidth, currEmuHeight; - - /// - /// additional pixels added at the unscaled level for the use of lua drawing. essentially increases the input video provider dimensions - /// - public System.Windows.Forms.Padding GameExtraPadding; - - /// - /// additional pixels added at the native level for the use of lua drawing. essentially just gets tacked onto the final calculated window sizes. - /// - public System.Windows.Forms.Padding ClientExtraPadding; - - /// - /// custom fonts that don't need to be installed on the user side - /// - public System.Drawing.Text.PrivateFontCollection CustomFonts = new System.Drawing.Text.PrivateFontCollection(); - - TextureFrugalizer VideoTextureFrugalizer; - Dictionary LuaSurfaceFrugalizers = new Dictionary(); - RenderTargetFrugalizer[] ShaderChainFrugalizers; - Filters.RetroShaderChain ShaderChain_hq2x, ShaderChain_scanlines, ShaderChain_bicubic; - Filters.RetroShaderChain ShaderChain_user; - - public void RefreshUserShader() - { - if (ShaderChain_user != null) - ShaderChain_user.Dispose(); - if (File.Exists(Global.Config.DispUserFilterPath)) - { - var fi = new FileInfo(Global.Config.DispUserFilterPath); - using (var stream = fi.OpenRead()) - ShaderChain_user = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.GetDirectoryName(Global.Config.DispUserFilterPath)); - } - } - - System.Windows.Forms.Padding CalculateCompleteContentPadding(bool user, bool source) - { - var padding = new System.Windows.Forms.Padding(); - - if(user) - padding += GameExtraPadding; - - //an experimental feature - if(source) - if (Global.Emulator is BizHawk.Emulation.Cores.Sony.PSX.Octoshock) - { - var psx = Global.Emulator as BizHawk.Emulation.Cores.Sony.PSX.Octoshock; - var core_padding = psx.VideoProvider_Padding; - padding.Left += core_padding.Width / 2; - padding.Right += core_padding.Width - core_padding.Width / 2; - padding.Top += core_padding.Height / 2; - padding.Bottom += core_padding.Height - core_padding.Height / 2; - } - - return padding; - } - - FilterProgram BuildDefaultChain(Size chain_insize, Size chain_outsize, bool includeOSD) - { - //select user special FX shader chain - Dictionary selectedChainProperties = new Dictionary(); - Filters.RetroShaderChain selectedChain = null; - if (Global.Config.TargetDisplayFilter == 1 && ShaderChain_hq2x != null && ShaderChain_hq2x.Available) - selectedChain = ShaderChain_hq2x; - if (Global.Config.TargetDisplayFilter == 2 && ShaderChain_scanlines != null && ShaderChain_scanlines.Available) - { - selectedChain = ShaderChain_scanlines; - selectedChainProperties["uIntensity"] = 1.0f - Global.Config.TargetScanlineFilterIntensity / 256.0f; - } - if (Global.Config.TargetDisplayFilter == 3 && ShaderChain_user != null && ShaderChain_user.Available) - selectedChain = ShaderChain_user; - - Filters.FinalPresentation fPresent = new Filters.FinalPresentation(chain_outsize); - Filters.SourceImage fInput = new Filters.SourceImage(chain_insize); - Filters.OSD fOSD = new Filters.OSD(); - fOSD.RenderCallback = () => - { - if (!includeOSD) - return; - var size = fOSD.FindInput().SurfaceFormat.Size; - Renderer.Begin(size.Width, size.Height); - MyBlitter myBlitter = new MyBlitter(this); - myBlitter.ClipBounds = new Rectangle(0, 0, size.Width, size.Height); - Renderer.SetBlendState(GL.BlendNormal); - GlobalWin.OSD.Begin(myBlitter); - GlobalWin.OSD.DrawScreenInfo(myBlitter); - GlobalWin.OSD.DrawMessages(myBlitter); - Renderer.End(); - }; - - var chain = new FilterProgram(); - - //add the first filter, encompassing output from the emulator core - chain.AddFilter(fInput, "input"); - - //if a non-zero padding is required, add a filter to allow for that - //note, we have two sources of padding right now.. one can come from the videoprovider and one from the user. - //we're combining these now and just using black, for sake of being lean, despite the discussion below: - //keep in mind, the videoprovider design in principle might call for another color. - //we havent really been using this very hard, but users will probably want black there (they could fill it to another color if needed tho) - var padding = CalculateCompleteContentPadding(true,true); - if (padding.Vertical != 0 || padding.Horizontal != 0) - { - //TODO - add another filter just for this, its cumbersome to use final presentation... I think. but maybe theres enough similarities to justify it. - Size size = chain_insize; - size.Width += padding.Horizontal; - size.Height += padding.Vertical; - Filters.FinalPresentation fPadding = new Filters.FinalPresentation(size); - chain.AddFilter(fPadding, "padding"); - fPadding.GuiRenderer = Renderer; - fPadding.GL = GL; - fPadding.Config_PadOnly = true; - fPadding.Padding = padding; - } - - //add lua layer 'emu' - AppendLuaLayer(chain, "emu"); - - if (Global.Config.DispPrescale != 1) - { - Filters.PrescaleFilter fPrescale = new Filters.PrescaleFilter() { Scale = Global.Config.DispPrescale }; - chain.AddFilter(fPrescale, "user_prescale"); - } - - //add user-selected retro shader - if (selectedChain != null) - AppendRetroShaderChain(chain, "retroShader", selectedChain, selectedChainProperties); - - //AutoPrescale makes no sense for a None final filter - if (Global.Config.DispAutoPrescale && Global.Config.DispFinalFilter != (int)Filters.FinalPresentation.eFilterOption.None) - { - var apf = new Filters.AutoPrescaleFilter(); - chain.AddFilter(apf, "auto_prescale"); - } - - //choose final filter - Filters.FinalPresentation.eFilterOption finalFilter = Filters.FinalPresentation.eFilterOption.None; - if (Global.Config.DispFinalFilter == 1) finalFilter = Filters.FinalPresentation.eFilterOption.Bilinear; - if (Global.Config.DispFinalFilter == 2) finalFilter = Filters.FinalPresentation.eFilterOption.Bicubic; - //if bicubic is selected and unavailable, dont use it. use bilinear instead I guess - if (finalFilter == Filters.FinalPresentation.eFilterOption.Bicubic) - { - if (ShaderChain_bicubic == null || !ShaderChain_bicubic.Available) - finalFilter = Filters.FinalPresentation.eFilterOption.Bilinear; - } - fPresent.FilterOption = finalFilter; - - //now if bicubic is chosen, insert it - if (finalFilter == Filters.FinalPresentation.eFilterOption.Bicubic) - AppendRetroShaderChain(chain, "bicubic", ShaderChain_bicubic, null); - - //add final presentation - chain.AddFilter(fPresent, "presentation"); - - //add lua layer 'native' - AppendLuaLayer(chain, "native"); - - //and OSD goes on top of that - //TODO - things break if this isnt present (the final presentation filter gets messed up when used with prescaling) - //so, always include it (we'll handle this flag in the callback to do no rendering) - //if (includeOSD) - chain.AddFilter(fOSD, "osd"); - - return chain; - } - - void AppendRetroShaderChain(FilterProgram program, string name, Filters.RetroShaderChain retroChain, Dictionary properties) - { - for (int i = 0; i < retroChain.Passes.Length; i++) - { - var pass = retroChain.Passes[i]; - var rsp = new Filters.RetroShaderPass(retroChain, i); - string fname = string.Format("{0}[{1}]", name, i); - program.AddFilter(rsp, fname); - rsp.Parameters = properties; - } - } - - Filters.LuaLayer AppendLuaLayer(FilterProgram chain, string name) - { - Texture2d luaNativeTexture = null; - var luaNativeSurface = LuaSurfaceSets[name].GetCurrent(); - if (luaNativeSurface == null) - return null; - luaNativeTexture = LuaSurfaceFrugalizers[name].Get(luaNativeSurface); - var fLuaLayer = new Filters.LuaLayer(); - fLuaLayer.SetTexture(luaNativeTexture); - chain.AddFilter(fLuaLayer, name); - return fLuaLayer; - } - - /// - /// Using the current filter program, turn a mouse coordinate from window space to the original emulator screen space. - /// - public Point UntransformPoint(Point p) - { - //first, turn it into a window coordinate - p = presentationPanel.Control.PointToClient(p); - - //now, if theres no filter program active, just give up - if (CurrentFilterProgram == null) return p; - - //otherwise, have the filter program untransform it - Vector2 v = new Vector2(p.X, p.Y); - v = CurrentFilterProgram.UntransformPoint("default",v); - return new Point((int)v.X, (int)v.Y); - } - - /// - /// Using the current filter program, turn a emulator screen space coordinate to a window coordinate (suitable for lua layer drawing) - /// - public Point TransformPoint(Point p) - { - //now, if theres no filter program active, just give up - if (CurrentFilterProgram == null) return p; - - //otherwise, have the filter program untransform it - Vector2 v = new Vector2(p.X, p.Y); - v = CurrentFilterProgram.TransformPoint("default", v); - return new Point((int)v.X, (int)v.Y); - } - - /// - /// This will receive an emulated output frame from an IVideoProvider and run it through the complete frame processing pipeline - /// Then it will stuff it into the bound PresentationPanel. - /// --- - /// If the int[] is size=1, then it contains an openGL texture ID (and the size should be as specified from videoProvider) - /// Don't worry about the case where the frontend isnt using opengl; DisplayManager deals with it - /// - public void UpdateSource(IVideoProvider videoProvider) - { - bool displayNothing = Global.Config.DispSpeedupFeatures == 0; - var job = new JobInfo - { - videoProvider = videoProvider, - simulate = displayNothing, - chain_outsize = GraphicsControl.Size, - includeOSD = true, - }; - UpdateSourceInternal(job); - } - - public BitmapBuffer RenderVideoProvider(IVideoProvider videoProvider) - { - //TODO - we might need to gather more Global.Config.DispXXX properties here, so they can be overridden - var targetSize = new Size(videoProvider.BufferWidth, videoProvider.BufferHeight); - var padding = CalculateCompleteContentPadding(true,true); - targetSize.Width += padding.Horizontal; - targetSize.Height += padding.Vertical; - - var job = new JobInfo - { - videoProvider = videoProvider, - simulate = false, - chain_outsize = targetSize, - offscreen = true, - includeOSD = false - }; - UpdateSourceInternal(job); - return job.offscreenBB; - } - - /// - /// Does the entire display process to an offscreen buffer, suitable for a 'client' screenshot. - /// - public BitmapBuffer RenderOffscreen(IVideoProvider videoProvider, bool includeOSD) - { - var job = new JobInfo - { - videoProvider = videoProvider, - simulate = false, - chain_outsize = GraphicsControl.Size, - offscreen = true, - includeOSD = includeOSD - }; - UpdateSourceInternal(job); - return job.offscreenBB; - } - - class FakeVideoProvider : IVideoProvider - { - public int[] GetVideoBuffer() { return new int[] {}; } - - public int VirtualWidth { get; set; } - public int VirtualHeight { get; set; } - - public int BufferWidth { get; set; } - public int BufferHeight { get; set; } - public int BackgroundColor { get; set; } - - public int VsyncNumerator - { - get { throw new InvalidOperationException(); } - } - - public int VsyncDenominator - { - get { throw new InvalidOperationException(); } - } - } - - void FixRatio(float x, float y, int inw, int inh, out int outw, out int outh) - { - float ratio = x / y; - if (ratio <= 1) - { - //taller. weird. expand height. - outw = inw; - outh = (int)((float)inw / ratio); - } - else - { - //wider. normal. expand width. - outw = (int)((float)inh * ratio); - outh = inh; - } - } - - /// - /// Attempts to calculate a good client size with the given zoom factor, considering the user's DisplayManager preferences - /// TODO - this needs to be redone with a concept different from zoom factor. - /// basically, each increment of a 'zoomlike' factor should definitely increase the viewable area somehow, even if it isnt strictly by an entire zoom level. - /// - public Size CalculateClientSize(IVideoProvider videoProvider, int zoom) - { - bool ar_active = Global.Config.DispFixAspectRatio; - bool ar_system = Global.Config.DispManagerAR == Config.EDispManagerAR.System; - bool ar_custom = Global.Config.DispManagerAR == Config.EDispManagerAR.Custom; - bool ar_customRatio = Global.Config.DispManagerAR == Config.EDispManagerAR.CustomRatio; - bool ar_correct = ar_system || ar_custom || ar_customRatio; - bool ar_unity = !ar_correct; - bool ar_integer = Global.Config.DispFixScaleInteger; - - int bufferWidth = videoProvider.BufferWidth; - int bufferHeight = videoProvider.BufferHeight; - int virtualWidth = videoProvider.VirtualWidth; - int virtualHeight = videoProvider.VirtualHeight; - - if (ar_custom) - { - virtualWidth = Global.Config.DispCustomUserARWidth; - virtualHeight = Global.Config.DispCustomUserARHeight; - } - - if (ar_customRatio) - { - FixRatio(Global.Config.DispCustomUserARX, Global.Config.DispCustomUserARY, videoProvider.BufferWidth, videoProvider.BufferHeight, out virtualWidth, out virtualHeight); - } - - var padding = CalculateCompleteContentPadding(true, false); - virtualWidth += padding.Horizontal; - virtualHeight += padding.Vertical; - - padding = CalculateCompleteContentPadding(true, true); - bufferWidth += padding.Horizontal; - bufferHeight += padding.Vertical; - - //Console.WriteLine("DISPZOOM " + zoom); //test - - //old stuff - var fvp = new FakeVideoProvider(); - fvp.BufferWidth = bufferWidth; - fvp.BufferHeight = bufferHeight; - fvp.VirtualWidth = virtualWidth; - fvp.VirtualHeight = virtualHeight; - - Size chain_outsize = new Size(fvp.BufferWidth * zoom, fvp.BufferHeight * zoom); - - if (ar_active) - { - if (ar_correct) - { - if (ar_integer) - { - //ALERT COPYPASTE LAUNDROMAT - Vector2 VS = new Vector2(virtualWidth, virtualHeight); - Vector2 BS = new Vector2(bufferWidth, bufferHeight); - Vector2 AR = Vector2.Divide(VS, BS); - float target_par = (AR.X / AR.Y); - - //this would malfunction for AR <= 0.5 or AR >= 2.0 - //EDIT - in fact, we have AR like that coming from PSX, sometimes, so maybe we should solve this better - Vector2 PS = new Vector2(1, 1); - - //here's how we define zooming, in this case: - //make sure each step is an increment of zoom for at least one of the dimensions (or maybe both of them) - //look for the increment which helps the AR the best - //TODO - this cant possibly support scale factors like 1.5x - //TODO - also, this might be messing up zooms and stuff, we might need to run this on the output size of the filter chain - for (int i = 1; i < zoom;i++) - { - //would not be good to run this per frame, but it seems to only run when the resolution changes, etc. - Vector2[] trials = new[] { - PS + new Vector2(1, 0), - PS + new Vector2(0, 1), - PS + new Vector2(1, 1) - }; - int bestIndex = -1; - float bestValue = 1000.0f; - for (int t = 0; t < trials.Length; t++) - { - //I. - float test_ar = trials[t].X / trials[t].Y; - - //II. - //Vector2 calc = Vector2.Multiply(trials[t], VS); - //float test_ar = calc.X / calc.Y; - - //not clear which approach is superior - float deviation_linear = Math.Abs(test_ar - target_par); - float deviation_geom = test_ar / target_par; - if (deviation_geom < 1) deviation_geom = 1.0f / deviation_geom; - - float value = deviation_linear; - if (value < bestValue) - { - bestIndex = t; - bestValue = value; - } - } - //is it possible to get here without selecting one? doubtful. - //EDIT: YES IT IS. it happened with an 0,0 buffer size. of course, that was a mistake, but we shouldnt crash - if(bestIndex != -1) //so, what now? well, this will result in 0,0 getting picked, so thats probably all we can do - PS = trials[bestIndex]; - } - - chain_outsize = new Size((int)(bufferWidth * PS.X), (int)(bufferHeight * PS.Y)); - } - else - { - //obey the AR, but allow free scaling: just zoom the virtual size - chain_outsize = new Size(virtualWidth * zoom, virtualHeight * zoom); - } - } - else - { - //ar_unity: - //just choose to zoom the buffer (make no effort to incorporate AR) - chain_outsize = new Size(bufferWidth * zoom, bufferHeight * zoom); - } - } - else - { - //!ar_active: - //just choose to zoom the buffer (make no effort to incorporate AR) - chain_outsize = new Size(bufferWidth * zoom, bufferHeight * zoom); - } - - chain_outsize.Width += ClientExtraPadding.Horizontal; - chain_outsize.Height += ClientExtraPadding.Vertical; - - var job = new JobInfo - { - videoProvider = fvp, - simulate = true, - chain_outsize = chain_outsize, - }; - var filterProgram = UpdateSourceInternal(job); - - //this only happens when we're forcing the client to size itself with autoload and the core says 0x0.... - //we need some other more sensible client size. - if (filterProgram == null) - { - return new Size(256, 192); - } - - var size = filterProgram.Filters[filterProgram.Filters.Count - 1].FindOutput().SurfaceFormat.Size; - - return size; - } - - class JobInfo - { - public IVideoProvider videoProvider; - public bool simulate; - public Size chain_outsize; - public bool offscreen; - public BitmapBuffer offscreenBB; - public bool includeOSD; - } - - FilterProgram UpdateSourceInternal(JobInfo job) - { - //no drawing actually happens. it's important not to begin drawing on a control - if (!job.simulate && !job.offscreen) - { - GLManager.Activate(CR_GraphicsControl); - - if (job.chain_outsize.Width == 0 || job.chain_outsize.Height == 0) - { - //this has to be a NOP, because lots of stuff will malfunction on a 0-sized viewport - if (CurrentFilterProgram != null) - UpdateSourceDrawingWork(job); //but we still need to do this, because of vsync - return null; - } - } - - IVideoProvider videoProvider = job.videoProvider; - bool simulate = job.simulate; - Size chain_outsize = job.chain_outsize; - - //simulate = true; - - int vw = videoProvider.BufferWidth; - int vh = videoProvider.BufferHeight; - - if (Global.Config.DispFixAspectRatio) - { - if (Global.Config.DispManagerAR == Config.EDispManagerAR.System) - { - vw = videoProvider.VirtualWidth; - vh = videoProvider.VirtualHeight; - } - if (Global.Config.DispManagerAR == Config.EDispManagerAR.Custom) - { - vw = Global.Config.DispCustomUserARWidth; - vh = Global.Config.DispCustomUserARHeight; - } - if (Global.Config.DispManagerAR == Config.EDispManagerAR.CustomRatio) - { - FixRatio(Global.Config.DispCustomUserARX, Global.Config.DispCustomUserARY, videoProvider.BufferWidth, videoProvider.BufferHeight, out vw, out vh); - } - } - - var padding = CalculateCompleteContentPadding(true,false); - vw += padding.Horizontal; - vh += padding.Vertical; - - int[] videoBuffer = videoProvider.GetVideoBuffer(); - - int bufferWidth = videoProvider.BufferWidth; - int bufferHeight = videoProvider.BufferHeight; - bool isGlTextureId = videoBuffer.Length == 1; - - BitmapBuffer bb = null; - Texture2d videoTexture = null; - if (!simulate) - { - if (isGlTextureId) - { - //FYI: this is a million years from happening on n64, since it's all geriatric non-FBO code - //is it workable for saturn? - videoTexture = GL.WrapGLTexture2d(new IntPtr(videoBuffer[0]), bufferWidth, bufferHeight); - } - else - { - //wrap the videoprovider data in a BitmapBuffer (no point to refactoring that many IVideoProviders) - bb = new BitmapBuffer(bufferWidth, bufferHeight, videoBuffer); - bb.DiscardAlpha(); - - //now, acquire the data sent from the videoProvider into a texture - videoTexture = VideoTextureFrugalizer.Get(bb); - - //lets not use this. lets define BizwareGL to make clamp by default (TBD: check opengl) - //GL.SetTextureWrapMode(videoTexture, true); - } - } - - //record the size of what we received, since lua and stuff is gonna want to draw onto it - currEmuWidth = bufferWidth; - currEmuHeight = bufferHeight; - - //build the default filter chain and set it up with services filters will need - Size chain_insize = new Size(bufferWidth, bufferHeight); - - var filterProgram = BuildDefaultChain(chain_insize, chain_outsize, job.includeOSD); - filterProgram.GuiRenderer = Renderer; - filterProgram.GL = GL; - - //setup the source image filter - Filters.SourceImage fInput = filterProgram["input"] as Filters.SourceImage; - fInput.Texture = videoTexture; - - //setup the final presentation filter - Filters.FinalPresentation fPresent = filterProgram["presentation"] as Filters.FinalPresentation; - fPresent.VirtualTextureSize = new Size(vw, vh); - fPresent.TextureSize = new Size(bufferWidth, bufferHeight); - fPresent.BackgroundColor = videoProvider.BackgroundColor; - fPresent.GuiRenderer = Renderer; - fPresent.Flip = isGlTextureId; - fPresent.Config_FixAspectRatio = Global.Config.DispFixAspectRatio; - fPresent.Config_FixScaleInteger = Global.Config.DispFixScaleInteger; - fPresent.Padding = ClientExtraPadding; - fPresent.AutoPrescale = Global.Config.DispAutoPrescale; - - fPresent.GL = GL; - - filterProgram.Compile("default", chain_insize, chain_outsize, !job.offscreen); - - if (simulate) - { - } - else - { - CurrentFilterProgram = filterProgram; - UpdateSourceDrawingWork(job); - } - - //cleanup: - if (bb != null) bb.Dispose(); - - return filterProgram; - } - - public void Blank() - { - GLManager.Activate(CR_GraphicsControl); - GL.BeginScene(); - GL.BindRenderTarget(null); - GL.SetClearColor(Color.Black); - GL.Clear(OpenTK.Graphics.OpenGL.ClearBufferMask.ColorBufferBit); - GL.EndScene(); - presentationPanel.GraphicsControl.SwapBuffers(); - } - - void UpdateSourceDrawingWork(JobInfo job) - { - bool vsync = false; - bool alternateVsync = false; - //only used by alternate vsync - IGL_SlimDX9 dx9 = null; - - if (!job.offscreen) - { - //apply the vsync setting (should probably try to avoid repeating this) - vsync = Global.Config.VSyncThrottle || Global.Config.VSync; - - //ok, now this is a bit undesireable. - //maybe the user wants vsync, but not vsync throttle. - //this makes sense... but we dont have the infrastructure to support it now (we'd have to enable triple buffering or something like that) - //so what we're gonna do is disable vsync no matter what if throttling is off, and maybe nobody will notice. - //update 26-mar-2016: this upsets me. When fastforwarding and skipping frames, vsync should still work. But I'm not changing it yet - if (Global.DisableSecondaryThrottling) - vsync = false; - - //for now, it's assumed that the presentation panel is the main window, but that may not always be true - if (vsync && Global.Config.DispAlternateVsync && Global.Config.VSyncThrottle) - { - dx9 = GL as IGL_SlimDX9; - if (dx9 != null) - { - alternateVsync = true; - //unset normal vsync if we've chosen the alternate vsync - vsync = false; - } - } - - //TODO - whats so hard about triple buffering anyway? just enable it always, and change api to SetVsync(enable,throttle) - //maybe even SetVsync(enable,throttlemethod) or just SetVsync(enable,throttle,advanced) - - if (LastVsyncSetting != vsync || LastVsyncSettingGraphicsControl != presentationPanel.GraphicsControl) - { - if (LastVsyncSetting == null && vsync) - { - // Workaround for vsync not taking effect at startup (Intel graphics related?) - presentationPanel.GraphicsControl.SetVsync(false); - } - presentationPanel.GraphicsControl.SetVsync(vsync); - LastVsyncSettingGraphicsControl = presentationPanel.GraphicsControl; - LastVsyncSetting = vsync; - } - } - - //begin rendering on this context - //should this have been done earlier? - //do i need to check this on an intel video card to see if running excessively is a problem? (it used to be in the FinalTarget command below, shouldnt be a problem) - //GraphicsControl.Begin(); //CRITICAL POINT for yabause+GL - - //TODO - auto-create and age these (and dispose when old) - int rtCounter = 0; - - CurrentFilterProgram.RenderTargetProvider = new DisplayManagerRenderTargetProvider((size) => ShaderChainFrugalizers[rtCounter++].Get(size)); - - GL.BeginScene(); - - //run filter chain - Texture2d texCurr = null; - RenderTarget rtCurr = null; - bool inFinalTarget = false; - foreach (var step in CurrentFilterProgram.Program) - { - switch (step.Type) - { - case FilterProgram.ProgramStepType.Run: - { - int fi = (int)step.Args; - var f = CurrentFilterProgram.Filters[fi]; - f.SetInput(texCurr); - f.Run(); - var orec = f.FindOutput(); - if (orec != null) - { - if (orec.SurfaceDisposition == SurfaceDisposition.Texture) - { - texCurr = f.GetOutput(); - rtCurr = null; - } - } - break; - } - case FilterProgram.ProgramStepType.NewTarget: - { - var size = (Size)step.Args; - rtCurr = ShaderChainFrugalizers[rtCounter++].Get(size); - rtCurr.Bind(); - CurrentFilterProgram.CurrRenderTarget = rtCurr; - break; - } - case FilterProgram.ProgramStepType.FinalTarget: - { - var size = (Size)step.Args; - inFinalTarget = true; - rtCurr = null; - CurrentFilterProgram.CurrRenderTarget = null; - GL.BindRenderTarget(null); - break; - } - } - } - - GL.EndScene(); - - if (job.offscreen) - { - job.offscreenBB = rtCurr.Texture2d.Resolve(); - job.offscreenBB.DiscardAlpha(); - } - else - { - Debug.Assert(inFinalTarget); - - //wait for vsync to begin - if (alternateVsync) dx9.AlternateVsyncPass(0); - - //present and conclude drawing - presentationPanel.GraphicsControl.SwapBuffers(); - - //wait for vsync to end - if (alternateVsync) dx9.AlternateVsyncPass(1); - - //nope. dont do this. workaround for slow context switching on intel GPUs. just switch to another context when necessary before doing anything - //presentationPanel.GraphicsControl.End(); - } - } - - private void LoadCustomFont(Stream fontstream) - { - System.IntPtr data = System.Runtime.InteropServices.Marshal.AllocCoTaskMem((int)fontstream.Length); - byte[] fontdata = new byte[fontstream.Length]; - fontstream.Read(fontdata, 0, (int)fontstream.Length); - System.Runtime.InteropServices.Marshal.Copy(fontdata, 0, data, (int)fontstream.Length); - CustomFonts.AddMemoryFont(data, fontdata.Length); - fontstream.Close(); - System.Runtime.InteropServices.Marshal.FreeCoTaskMem(data); - } - - bool? LastVsyncSetting; - GraphicsControl LastVsyncSettingGraphicsControl; - - Dictionary MapNameToLuaSurface = new Dictionary(); - Dictionary MapLuaSurfaceToName = new Dictionary(); - Dictionary LuaSurfaceSets = new Dictionary(); - SwappableDisplaySurfaceSet luaNativeSurfaceSet = new SwappableDisplaySurfaceSet(); - public void SetLuaSurfaceNativePreOSD(DisplaySurface surface) { luaNativeSurfaceSet.SetPending(surface); } - - /// - /// Peeks a locked lua surface, or returns null if it isnt locked - /// - public DisplaySurface PeekLockedLuaSurface(string name) - { - if (MapNameToLuaSurface.ContainsKey(name)) - return MapNameToLuaSurface[name]; - return null; - } - - /// - /// Locks the requested lua surface name - /// - public DisplaySurface LockLuaSurface(string name, bool clear=true) - { - if (MapNameToLuaSurface.ContainsKey(name)) - throw new InvalidOperationException("Lua surface is already locked: " + name); - - SwappableDisplaySurfaceSet sdss; - if (!LuaSurfaceSets.TryGetValue(name, out sdss)) - { - sdss = new SwappableDisplaySurfaceSet(); - LuaSurfaceSets.Add(name, sdss); - } - - //placeholder logic for more abstracted surface definitions from filter chain - int currNativeWidth = presentationPanel.NativeSize.Width; - int currNativeHeight = presentationPanel.NativeSize.Height; - - currNativeWidth += ClientExtraPadding.Horizontal; - currNativeHeight += ClientExtraPadding.Vertical; - - int width,height; - if(name == "emu") { - width = currEmuWidth; - height = currEmuHeight; - width += GameExtraPadding.Horizontal; - height += GameExtraPadding.Vertical; - } - else if(name == "native") { width = currNativeWidth; height = currNativeHeight; } - else throw new InvalidOperationException("Unknown lua surface name: " +name); - - DisplaySurface ret = sdss.AllocateSurface(width, height, clear); - MapNameToLuaSurface[name] = ret; - MapLuaSurfaceToName[ret] = name; - return ret; - } - - public void ClearLuaSurfaces() - { - foreach (var kvp in LuaSurfaceSets) - { - try - { - var surf = PeekLockedLuaSurface(kvp.Key); - DisplaySurface surfLocked = null; - if (surf == null) - surf = surfLocked = LockLuaSurface(kvp.Key,true); - //zero 21-apr-2016 - we shouldnt need this - //surf.Clear(); - if (surfLocked != null) - UnlockLuaSurface(surfLocked); - LuaSurfaceSets[kvp.Key].SetPending(null); - } - catch (InvalidOperationException) - { - - } - } - } - - /// - /// Unlocks this DisplaySurface which had better have been locked as a lua surface - /// - public void UnlockLuaSurface(DisplaySurface surface) - { - if (!MapLuaSurfaceToName.ContainsKey(surface)) - throw new InvalidOperationException("Surface was not locked as a lua surface"); - string name = MapLuaSurfaceToName[surface]; - MapLuaSurfaceToName.Remove(surface); - MapNameToLuaSurface.Remove(name); - LuaSurfaceSets[name].SetPending(surface); - } - - //helper classes: - - class MyBlitter : IBlitter - { - DisplayManager Owner; - public MyBlitter(DisplayManager dispManager) - { - Owner = dispManager; - } - - class FontWrapper : IBlitterFont - { - public FontWrapper(StringRenderer font) - { - this.font = font; - } - - public readonly StringRenderer font; - } - - IBlitterFont IBlitter.GetFontType(string fontType) { return new FontWrapper(Owner.TheOneFont); } - void IBlitter.DrawString(string s, IBlitterFont font, Color color, float x, float y) - { - var stringRenderer = ((FontWrapper)font).font; - Owner.Renderer.SetModulateColor(color); - stringRenderer.RenderString(Owner.Renderer, x, y, s); - Owner.Renderer.SetModulateColorWhite(); - } - SizeF IBlitter.MeasureString(string s, IBlitterFont font) - { - var stringRenderer = ((FontWrapper)font).font; - return stringRenderer.Measure(s); - } - public Rectangle ClipBounds { get; set; } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/DisplaySurface.cs b/BizHawk.Client.EmuHawk/DisplayManager/DisplaySurface.cs deleted file mode 100644 index 91e0c23f01..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/DisplaySurface.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -using BizHawk.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// This is a wrapper for a Bitmap, basically, which can also be a int[]. - /// It should be phased out, in favor of BitmapBuffer and Texture2d's - /// - public unsafe class DisplaySurface : IDisposable - { - Bitmap bmp; - BitmapData bmpdata; - int[] pixels; - - public unsafe void Clear() - { - FromBitmap(false); - Util.Memset(PixelPtr, 0, Stride * Height); - } - - public Bitmap PeekBitmap() - { - ToBitmap(); - return bmp; - } - - /// - /// returns a Graphics object used to render to this surface. be sure to dispose it! - /// - public Graphics GetGraphics() - { - ToBitmap(); - return Graphics.FromImage(bmp); - } - - public unsafe void ToBitmap(bool copy=true) - { - if (isBitmap) return; - isBitmap = true; - - if (bmp == null) - { - bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); - } - - if (copy) - { - bmpdata = bmp.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - - int w = Width; - int h = Height; - int stride = bmpdata.Stride / 4; - int* bmpbuf = (int*)bmpdata.Scan0.ToPointer(); - for (int y = 0, i = 0; y < h; y++) - for (int x = 0; x < w; x++) - bmpbuf[y * stride + x] = pixels[i++]; - - bmp.UnlockBits(bmpdata); - } - - } - - public bool IsBitmap { get { return isBitmap; } } - bool isBitmap = false; - - public unsafe void FromBitmap(bool copy=true) - { - if (!isBitmap) return; - isBitmap = false; - - if (copy) - { - bmpdata = bmp.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - - int w = Width; - int h = Height; - int stride = bmpdata.Stride / 4; - int* bmpbuf = (int*)bmpdata.Scan0.ToPointer(); - for (int y = 0, i = 0; y < h; y++) - for (int x = 0; x < w; x++) - pixels[i++] = bmpbuf[y * stride + x]; - - bmp.UnlockBits(bmpdata); - } - } - - - public static DisplaySurface DisplaySurfaceWrappingBitmap(Bitmap bmp) - { - DisplaySurface ret = new DisplaySurface(); - ret.Width = bmp.Width; - ret.Height = bmp.Height; - ret.bmp = bmp; - ret.isBitmap = true; - return ret; - } - - private DisplaySurface() - { - } - - public DisplaySurface(int width, int height) - { - //can't create a bitmap with zero dimensions, so for now, just bump it up to one - if (width == 0) width = 1; - if (height == 0) height = 1; - - Width = width; - Height = height; - - pixels = new int[width * height]; - LockPixels(); - } - - public int* PixelPtr { get { return (int*)ptr; } } - public IntPtr PixelIntPtr { get { return new IntPtr(ptr); } } - public int Stride { get { return Width*4; } } - public int OffsetOf(int x, int y) { return y * Stride + x*4; } - - void* ptr; - GCHandle handle; - void LockPixels() - { - UnlockPixels(); - handle = GCHandle.Alloc(pixels, GCHandleType.Pinned); - ptr = handle.AddrOfPinnedObject().ToPointer(); - } - - void UnlockPixels() - { - if(handle.IsAllocated) handle.Free(); - } - - /// - /// returns a new surface - /// - /// - /// - /// - public DisplaySurface ToPaddedSurface(int xpad0, int ypad0, int xpad1, int ypad1) - { - int new_width = Width + xpad0 + xpad1; - int new_height = Height + ypad0 + ypad1; - DisplaySurface ret = new DisplaySurface(new_width, new_height); - int* dptr = ret.PixelPtr; - int* sptr = PixelPtr; - int dstride = ret.Stride / 4; - int sstride = Stride / 4; - for (int y = 0; y < Height; y++) - for (int x = 0; x < Width; x++) - { - dptr[(y + ypad0) * dstride + x + xpad0] = sptr[y * sstride + x]; - } - return ret; - - } - - public int Width { get; private set; } - public int Height { get; private set; } - - public void Dispose() - { - if (bmp != null) - bmp.Dispose(); - bmp = null; - UnlockPixels(); - } - - //public unsafe int[] ToIntArray() { } - - public void AcceptIntArray(int[] newpixels) - { - FromBitmap(false); - UnlockPixels(); - pixels = newpixels; - LockPixels(); - } - } - -} diff --git a/BizHawk.Client.EmuHawk/DisplayManager/FilterManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/FilterManager.cs deleted file mode 100644 index e8a23765bb..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/FilterManager.cs +++ /dev/null @@ -1,285 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.Collections.Generic; -using System.IO; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.Filters; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; - -using OpenTK; -using OpenTK.Graphics; - -namespace BizHawk.Client.EmuHawk.FilterManager -{ - public enum SurfaceDisposition - { - Unspecified, Texture, RenderTarget - } - - public class SurfaceFormat - { - public SurfaceFormat(Size size) { this.Size = size; } - public Size Size { get; private set; } - } - - public class SurfaceState - { - public SurfaceState() { } - public SurfaceState(SurfaceFormat surfaceFormat, SurfaceDisposition surfaceDisposition = SurfaceDisposition.Unspecified) - { - this.SurfaceFormat = surfaceFormat; - this.SurfaceDisposition = surfaceDisposition; - } - public SurfaceFormat SurfaceFormat; - public SurfaceDisposition SurfaceDisposition; - } - - public interface IRenderTargetProvider - { - RenderTarget Get(Size size); - } - - public class FilterProgram - { - public List Filters = new List(); - Dictionary FilterNameIndex = new Dictionary(); - public List Program = new List(); - - public BaseFilter this[string name] - { - get - { - BaseFilter ret; - FilterNameIndex.TryGetValue(name, out ret); - return ret; - } - } - - public enum ProgramStepType - { - Run, - NewTarget, - FinalTarget - } - - //services to filters: - public IGuiRenderer GuiRenderer; - public IGL GL; - public IRenderTargetProvider RenderTargetProvider; - public RenderTarget GetRenderTarget(string channel = "default") { return CurrRenderTarget; } - public RenderTarget CurrRenderTarget; - - public RenderTarget GetTempTarget(int width, int height) - { - return RenderTargetProvider.Get(new Size(width, height)); - } - - public void AddFilter(BaseFilter filter, string name = "") - { - Filters.Add(filter); - FilterNameIndex[name] = filter; - } - - /// - /// Receives a point in the coordinate space of the output of the filter program and untransforms it back to input points - /// - public Vector2 UntransformPoint(string channel, Vector2 point) - { - for (int i = Filters.Count - 1; i >= 0; i--) - { - var filter = Filters[i]; - point = filter.UntransformPoint(channel, point); - } - - //we COULD handle the case where the output size is 0,0, but it's not mathematically sensible - //it should be considered a bug to call this under those conditions - - return point; - } - - /// - /// Receives a point in the input space of the filter program and transforms it through to output points - /// - public Vector2 TransformPoint(string channel, Vector2 point) - { - for (int i = 0; i < Filters.Count; i++) - { - var filter = Filters[i]; - point = filter.TransformPoint(channel, point); - } - - //we COULD handle the case where the output size is 0,0, but it's not mathematically sensible - //it should be considered a bug to call this under those conditions - ////in case the output size is zero, transform all points to zero, since the above maths may have malfunctioned - //var size = Filters[Filters.Count - 1].FindOutput().SurfaceFormat.Size; - //if (size.Width == 0) point.X = 0; - //if (size.Height == 0) point.Y = 0; - - return point; - } - - public class ProgramStep - { - public ProgramStep(ProgramStepType type, object args, string comment = null) - { - this.Type = type; - this.Args = args; - this.Comment = comment; - } - public ProgramStepType Type; - public object Args; - public string Comment; - public override string ToString() - { - if (Type == ProgramStepType.Run) - return string.Format("Run {0} ({1})", (int)Args, Comment); - if (Type == ProgramStepType.NewTarget) - return string.Format("NewTarget {0}", (Size)Args); - if (Type == ProgramStepType.FinalTarget) - return string.Format("FinalTarget"); - return null; - } - } - - public void Compile(string channel, Size insize, Size outsize, bool finalTarget) - { - RETRY: - - Program.Clear(); - - //prep filters for initialization - foreach (var f in Filters) - { - f.BeginInitialization(this); - f.Initialize(); - } - - //propagate input size forwards through filter chain to allow a 'flex' filter to determine what its input will be - Size presize = insize; - for (int i = 0; i < Filters.Count; i++) - { - var filter = Filters[i]; - presize = filter.PresizeInput(channel, presize); - } - - //propagate output size backwards through filter chain to allow a 'flex' filter to determine its output based on the desired output needs - presize = outsize; - for (int i = Filters.Count - 1; i >= 0; i--) - { - var filter = Filters[i]; - presize = filter.PresizeOutput(channel, presize); - } - - SurfaceState currState = null; - - for (int i = 0; i < Filters.Count; i++) - { - BaseFilter f = Filters[i]; - - //check whether this filter needs input. if so, notify it of the current pipeline state - var iosi = f.FindInput(channel); - if (iosi != null) - { - iosi.SurfaceFormat = currState.SurfaceFormat; - f.SetInputFormat(channel, currState); - - if (f.IsNOP) - { - continue; - } - - //check if the desired disposition needs to change from texture to render target - //(if so, insert a render filter) - if (iosi.SurfaceDisposition == SurfaceDisposition.RenderTarget && currState.SurfaceDisposition == SurfaceDisposition.Texture) - { - var renderer = new Render(); - Filters.Insert(i, renderer); - goto RETRY; - } - //check if the desired disposition needs to change from a render target to a texture - //(if so, the current render target gets resolved, and made no longer current - else if (iosi.SurfaceDisposition == SurfaceDisposition.Texture && currState.SurfaceDisposition == SurfaceDisposition.RenderTarget) - { - var resolver = new Resolve(); - Filters.Insert(i, resolver); - goto RETRY; - } - } - - //now, the filter will have set its output state depending on its input state. check if it outputs: - iosi = f.FindOutput(channel); - if (iosi != null) - { - if (currState == null) - { - currState = new SurfaceState(); - currState.SurfaceFormat = iosi.SurfaceFormat; - currState.SurfaceDisposition = iosi.SurfaceDisposition; - } - else - { - //if output disposition is unspecified, change it to whatever we've got right now - if (iosi.SurfaceDisposition == SurfaceDisposition.Unspecified) - { - iosi.SurfaceDisposition = currState.SurfaceDisposition; - } - - bool newTarget = false; - if (iosi.SurfaceFormat.Size != currState.SurfaceFormat.Size) - newTarget = true; - else if (currState.SurfaceDisposition == SurfaceDisposition.Texture && iosi.SurfaceDisposition == SurfaceDisposition.RenderTarget) - newTarget = true; - - if (newTarget) - { - currState = new SurfaceState(); - iosi.SurfaceFormat = currState.SurfaceFormat = iosi.SurfaceFormat; - iosi.SurfaceDisposition = currState.SurfaceDisposition = iosi.SurfaceDisposition; - Program.Add(new ProgramStep(ProgramStepType.NewTarget, currState.SurfaceFormat.Size)); - } - else - { - currState.SurfaceDisposition = iosi.SurfaceDisposition; - } - } - - - } - - Program.Add(new ProgramStep(ProgramStepType.Run, i, f.GetType().Name)); - - } //filter loop - - //if the current output disposition is a texture, we need to render it - if (currState.SurfaceDisposition == SurfaceDisposition.Texture) - { - var renderer = new Render(); - Filters.Insert(Filters.Count, renderer); - goto RETRY; - } - - //patch the program so that the final rendertarget set operation is the framebuffer instead - if (finalTarget) - { - for (int i = Program.Count - 1; i >= 0; i--) - { - var ps = Program[i]; - if (ps.Type == ProgramStepType.NewTarget) - { - var size = (Size)ps.Args; - Debug.Assert(size == outsize); - ps.Type = ProgramStepType.FinalTarget; - ps.Args = size; - break; - } - } - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/BaseFilter.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/BaseFilter.cs deleted file mode 100644 index 8b6b4de1f9..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/BaseFilter.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.Collections.Generic; -using System.IO; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.FilterManager; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; - -using OpenTK; -using OpenTK.Graphics; - -//Here's how to make a filter: -//1. Reset your state entirely in Initialize(). -// The filter will be re-initialized several times while the chain is getting worked out, but not re-instantiated. -// This is sort of annoying, but there's pretty good reasons for it (some external process has created the filters and set parameters needed to govern their chaining and surface properties) -//2. In Initialize(), be sure to use DeclareInput -//(something about PresizeInput()) -//3. PresizeOutput() will be called next -//4. In SetInputFormat(), use DeclareOutput to set the output based on your desires, or the provided input format. -//5. In Run(), the render target is already set. If using a texture, use InputTexture -//6. In Run(), if supplying an output texture, use YieldOutput - -namespace BizHawk.Client.EmuHawk.Filters -{ - public class BaseFilter - { - //initialization stuff - public void BeginInitialization(FilterProgram program) { IOSurfaceInfos.Clear(); FilterProgram = program; } - public virtual void Initialize() { } - public virtual Size PresizeInput(string channel, Size size) { return size; } - public virtual Size PresizeOutput(string channel, Size size) { return size; } - public virtual void SetInputFormat(string channel, SurfaceState state) { } //TODO - why a different param order than DeclareOutput? - public Dictionary Parameters = new Dictionary(); - public bool IsNOP { get { return _IsNop; } protected set { _IsNop = value; } } - private Boolean _IsNop = false; - - //runtime signals - public virtual Vector2 UntransformPoint(string channel, Vector2 point) - { - //base class behaviour here just uses the input and output sizes, if appropriate. few filters will have to do anything more complex - var input = FindInput(channel); - var output = FindOutput(channel); - if (input != null && output != null) - { - point.X *= ((float)input.SurfaceFormat.Size.Width) / (float)output.SurfaceFormat.Size.Width; - point.Y *= ((float)input.SurfaceFormat.Size.Height) / (float)output.SurfaceFormat.Size.Height; - } - return point; - } - - public virtual Vector2 TransformPoint(string channel, Vector2 point) - { - //base class behaviour here just uses the input and output sizes, if appropriate. few filters will have to do anything more complex - var input = FindInput(channel); - var output = FindOutput(channel); - if (input != null && output != null) - { - point.X *= ((float)output.SurfaceFormat.Size.Width) / (float)input.SurfaceFormat.Size.Width; - point.Y *= ((float)output.SurfaceFormat.Size.Height) / (float)input.SurfaceFormat.Size.Height; - } - return point; - } - - public void SetInput(Texture2d tex) - { - InputTexture = tex; - } - public virtual void Run() { } - public Texture2d GetOutput() { return OutputTexture; } - - //filter actions - protected void YieldOutput(Texture2d tex) - { - OutputTexture = tex; - } - - protected FilterProgram FilterProgram; - protected Texture2d InputTexture; - private Texture2d OutputTexture; - - //setup utilities - protected IOSurfaceInfo DeclareInput(SurfaceDisposition disposition = SurfaceDisposition.Unspecified, string channel = "default") { return DeclareIO(SurfaceDirection.Input, channel, disposition); } - protected IOSurfaceInfo DeclareOutput(SurfaceDisposition disposition = SurfaceDisposition.Unspecified, string channel = "default") { return DeclareIO(SurfaceDirection.Output, channel, disposition); } - //TODO - why a different param order than DeclareOutput? - - protected RenderTarget GetTempTarget(int width, int height) { return FilterProgram.GetTempTarget(width, height); } - - protected IOSurfaceInfo DeclareOutput(SurfaceState state, string channel = "default") - { - var iosi = DeclareIO(SurfaceDirection.Output, channel, state.SurfaceDisposition); - iosi.SurfaceFormat = state.SurfaceFormat; - return iosi; - } - - public IOSurfaceInfo FindInput(string channel = "default") { return FindIOSurfaceInfo(channel, SurfaceDirection.Input); } - public IOSurfaceInfo FindOutput(string channel = "default") { return FindIOSurfaceInfo(channel, SurfaceDirection.Output); } - - private IOSurfaceInfo DeclareIO(SurfaceDirection direction, string channel, SurfaceDisposition disposition) - { - var iosi = new IOSurfaceInfo(); - iosi.SurfaceDirection = direction; - iosi.Channel = channel; - iosi.SurfaceDisposition = disposition; - IOSurfaceInfos.Add(iosi); - return iosi; - } - - List IOSurfaceInfos = new List(); - - - IOSurfaceInfo FindIOSurfaceInfo(string channel, SurfaceDirection direction) - { - foreach (var iosi in IOSurfaceInfos) - if (iosi.Channel == channel && iosi.SurfaceDirection == direction) - return iosi; - return null; - } - - public class IOSurfaceInfo - { - public SurfaceFormat SurfaceFormat; - public SurfaceDirection SurfaceDirection; - public SurfaceDisposition SurfaceDisposition; - public string Channel; - } - - public enum SurfaceDirection - { - Input, Output - } - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Gui.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Gui.cs deleted file mode 100644 index 0e12282bd8..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Gui.cs +++ /dev/null @@ -1,493 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.Collections.Generic; -using System.IO; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk; -using BizHawk.Client.EmuHawk.FilterManager; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; - -using OpenTK; -using OpenTK.Graphics; - -namespace BizHawk.Client.EmuHawk.Filters -{ - /// - /// applies letterboxing logic to figure out how to fit the source dimensions into the target dimensions. - /// In the future this could also apply rules like integer-only scaling, etc. - /// - class LetterboxingLogic - { - /// - /// the location within the destination region of the output content (scaled and translated) - /// - public int vx, vy, vw, vh; - - /// - /// the scale factor eventually used - /// - public float WidthScale, HeightScale; - - /// - /// In case you want to do it yourself - /// - public LetterboxingLogic() { } - - //do maths on the viewport and the native resolution and the user settings to get a display rectangle - public LetterboxingLogic(bool maintainAspect, bool maintainInteger, int targetWidth, int targetHeight, int sourceWidth, int sourceHeight, Size textureSize, Size virtualSize) - { - int textureWidth = textureSize.Width; - int textureHeight = textureSize.Height; - int virtualWidth = virtualSize.Width; - int virtualHeight = virtualSize.Height; - - //zero 02-jun-2014 - we passed these in, but ignored them. kind of weird.. - int oldSourceWidth = sourceWidth; - int oldSourceHeight = sourceHeight; - sourceWidth = (int)virtualWidth; - sourceHeight = (int)virtualHeight; - - //this doesnt make sense - if (!maintainAspect) - maintainInteger = false; - - float widthScale = (float)targetWidth / sourceWidth; - float heightScale = (float)targetHeight / sourceHeight; - - if (maintainAspect - //zero 20-jul-2014 - hacks upon hacks, this function needs rewriting - && !maintainInteger - ) - { - if (widthScale > heightScale) widthScale = heightScale; - if (heightScale > widthScale) heightScale = widthScale; - } - - if (maintainInteger) - { - //just totally different code - //apply the zooming algorithm (pasted and reworked, for now) - //ALERT COPYPASTE LAUNDROMAT - - Vector2 VS = new Vector2(virtualWidth, virtualHeight); - Vector2 BS = new Vector2(textureWidth, textureHeight); - Vector2 AR = Vector2.Divide(VS, BS); - float target_par = (AR.X / AR.Y); - Vector2 PS = new Vector2(1, 1); //this would malfunction for AR <= 0.5 or AR >= 2.0 - - for(;;) - { - //TODO - would be good not to run this per frame.... - Vector2[] trials = new[] { - PS + new Vector2(1, 0), - PS + new Vector2(0, 1), - PS + new Vector2(1, 1) - }; - bool[] trials_limited = new bool[3] { false,false,false}; - int bestIndex = -1; - float bestValue = 1000.0f; - for (int t = 0; t < trials.Length; t++) - { - Vector2 vTrial = trials[t]; - trials_limited[t] = false; - - //check whether this is going to exceed our allotted area - int test_vw = (int)(vTrial.X * textureWidth); - int test_vh = (int)(vTrial.Y * textureHeight); - if (test_vw > targetWidth) trials_limited[t] = true; - if (test_vh > targetHeight) trials_limited[t] = true; - - //I. - float test_ar = vTrial.X / vTrial.Y; - - //II. - //Vector2 calc = Vector2.Multiply(trials[t], VS); - //float test_ar = calc.X / calc.Y; - - //not clear which approach is superior - float deviation_linear = Math.Abs(test_ar - target_par); - float deviation_geom = test_ar / target_par; - if (deviation_geom < 1) deviation_geom = 1.0f / deviation_geom; - - float value = deviation_linear; - if (value < bestValue) - { - bestIndex = t; - bestValue = value; - } - } - - //last result was best, so bail out - if (bestIndex == -1) - break; - - //if the winner ran off the edge, bail out - if (trials_limited[bestIndex]) - break; - - PS = trials[bestIndex]; - } - - //"fix problems with gameextrapadding in >1x window scales" (other edits were made, maybe theyre whats important) - //vw = (int)(PS.X * oldSourceWidth); - //vh = (int)(PS.Y * oldSourceHeight); - vw = (int)(PS.X * sourceWidth); - vh = (int)(PS.Y * sourceHeight); - widthScale = PS.X; - heightScale = PS.Y; - } - else - { - vw = (int)(widthScale * sourceWidth); - vh = (int)(heightScale * sourceHeight); - } - - //theres only one sensible way to letterbox in case we're shrinking a dimension: "pan & scan" to the center - //this is unlikely to be what the user wants except in the one case of maybe shrinking off some overscan area - //instead, since we're more about biz than gaming, lets shrink the view to fit in the small dimension - if (targetWidth < vw) - vw = targetWidth; - if (targetHeight < vh) - vh = targetHeight; - - //determine letterboxing parameters - vx = (targetWidth - vw) / 2; - vy = (targetHeight - vh) / 2; - - //zero 09-oct-2014 - changed this for TransformPoint. scenario: basic 1x (but system-specified AR) NES window. - //vw would be 293 but WidthScale would be 1.0. I think it should be something different. - //FinalPresentation doesnt use the LL.WidthScale, so this is unlikely to be breaking anything old that depends on it - //WidthScale = widthScale; - //HeightScale = heightScale; - WidthScale = (float)vw / oldSourceWidth; - HeightScale = (float)vh / oldSourceHeight; - } - - } - - public class FinalPresentation : BaseFilter - { - public enum eFilterOption - { - None, Bilinear, Bicubic - } - - public eFilterOption FilterOption = eFilterOption.None; - public RetroShaderChain BicubicFilter; - - public FinalPresentation(Size size) - { - this.OutputSize = size; - } - - Size OutputSize, InputSize; - public Size TextureSize, VirtualTextureSize; - public int BackgroundColor; - public bool AutoPrescale; - public IGuiRenderer GuiRenderer; - public bool Flip; - public IGL GL; - bool nop; - LetterboxingLogic LL; - Size ContentSize; - - public bool Config_FixAspectRatio, Config_FixScaleInteger, Config_PadOnly; - - /// - /// only use with Config_PadOnly - /// - public System.Windows.Forms.Padding Padding; - - public override void Initialize() - { - DeclareInput(); - nop = false; - } - - public override Size PresizeOutput(string channel, Size size) - { - if (FilterOption == eFilterOption.Bicubic) - { - size.Width = LL.vw; - size.Height = LL.vh; - return size; - } - return base.PresizeOutput(channel, size); - } - - public override Size PresizeInput(string channel, Size size) - { - if (FilterOption != eFilterOption.Bicubic) - return size; - - if (Config_PadOnly) - { - //TODO - redundant fix - LL = new LetterboxingLogic(); - LL.vx += Padding.Left; - LL.vy += Padding.Top; - LL.vw = size.Width; - LL.vh = size.Height; - } - else - { - LL = new LetterboxingLogic(Config_FixAspectRatio, Config_FixScaleInteger, OutputSize.Width, OutputSize.Height, size.Width, size.Height, TextureSize, VirtualTextureSize); - LL.vx += Padding.Left; - LL.vy += Padding.Top; - } - - return size; - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - bool need = false; - if (state.SurfaceFormat.Size != OutputSize) - need = true; - if (FilterOption != eFilterOption.None) - need = true; - if (Flip) - need = true; - - if (!need) - { - nop = true; - ContentSize = state.SurfaceFormat.Size; - return; - } - - FindInput().SurfaceDisposition = SurfaceDisposition.Texture; - DeclareOutput(new SurfaceState(new SurfaceFormat(OutputSize), SurfaceDisposition.RenderTarget)); - InputSize = state.SurfaceFormat.Size; - if (Config_PadOnly) - { - //TODO - redundant fix - LL = new LetterboxingLogic(); - LL.vx += Padding.Left; - LL.vy += Padding.Top; - LL.vw = InputSize.Width; - LL.vh = InputSize.Height; - LL.WidthScale = 1; - LL.HeightScale = 1; - } - else - { - int ow = OutputSize.Width; - int oh = OutputSize.Height; - ow -= Padding.Horizontal; - oh -= Padding.Vertical; - LL = new LetterboxingLogic(Config_FixAspectRatio, Config_FixScaleInteger, ow, oh, InputSize.Width, InputSize.Height, TextureSize, VirtualTextureSize); - LL.vx += Padding.Left; - LL.vy += Padding.Top; - } - ContentSize = new Size(LL.vw,LL.vh); - - if (InputSize == OutputSize) //any reason we need to check vx and vy? - IsNOP = true; - } - - public Size GetContentSize() { return ContentSize; } - - public override Vector2 UntransformPoint(string channel, Vector2 point) - { - if (nop) - return point; - point.X -= LL.vx; - point.Y -= LL.vy; - point.X /= LL.WidthScale; - point.Y /= LL.HeightScale; - return point; - } - - public override Vector2 TransformPoint(string channel, Vector2 point) - { - if (nop) - return point; - point.X *= LL.WidthScale; - point.Y *= LL.HeightScale; - point.X += LL.vx; - point.Y += LL.vy; - return point; - } - - public override void Run() - { - if (nop) - return; - - GL.SetClearColor(Color.FromArgb(BackgroundColor)); - GL.Clear(OpenTK.Graphics.OpenGL.ClearBufferMask.ColorBufferBit); - - GuiRenderer.Begin(OutputSize.Width, OutputSize.Height); - GuiRenderer.SetBlendState(GL.BlendNoneCopy); - - if(FilterOption != eFilterOption.None) - InputTexture.SetFilterLinear(); - else - InputTexture.SetFilterNearest(); - - if (FilterOption == eFilterOption.Bicubic) - { - //this was handled earlier by another filter - } - - GuiRenderer.Modelview.Translate(LL.vx, LL.vy); - if (Flip) - { - GuiRenderer.Modelview.Scale(1, -1); - GuiRenderer.Modelview.Translate(0, -LL.vh); - } - GuiRenderer.Draw(InputTexture,0,0,LL.vw,LL.vh); - - GuiRenderer.End(); - } - } - - //TODO - turn this into a NOP at 1x, just in case something accidentally activates it with 1x - public class PrescaleFilter : BaseFilter - { - public int Scale; - - public override void Initialize() - { - DeclareInput(SurfaceDisposition.Texture); - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - var OutputSize = state.SurfaceFormat.Size; - OutputSize.Width *= Scale; - OutputSize.Height *= Scale; - var ss = new SurfaceState(new SurfaceFormat(OutputSize), SurfaceDisposition.RenderTarget); - DeclareOutput(ss, channel); - } - - public override void Run() - { - var outSize = FindOutput().SurfaceFormat.Size; - FilterProgram.GuiRenderer.Begin(outSize); - FilterProgram.GuiRenderer.SetBlendState(FilterProgram.GL.BlendNoneCopy); - FilterProgram.GuiRenderer.Modelview.Scale(Scale); - FilterProgram.GuiRenderer.Draw(InputTexture); - FilterProgram.GuiRenderer.End(); - } - } - - public class AutoPrescaleFilter : BaseFilter - { - Size OutputSize, InputSize; - int XIS, YIS; - - public override void Initialize() - { - DeclareInput(SurfaceDisposition.Texture); - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - //calculate integer scaling factors - XIS = OutputSize.Width / state.SurfaceFormat.Size.Width; - YIS = OutputSize.Height / state.SurfaceFormat.Size.Height; - - if (XIS == 0) XIS = 1; - if (YIS == 0) YIS = 1; - - OutputSize = state.SurfaceFormat.Size; - - if (XIS <= 1 && YIS <= 1) - { - IsNOP = true; - } - else - { - OutputSize.Width *= XIS; - OutputSize.Height *= YIS; - } - - var outState = new SurfaceState(); - outState.SurfaceFormat = new SurfaceFormat(OutputSize); - outState.SurfaceDisposition = SurfaceDisposition.RenderTarget; - DeclareOutput(outState); - } - - public override Size PresizeOutput(string channel, Size size) - { - OutputSize = size; - return base.PresizeOutput(channel, size); - } - - public override Size PresizeInput(string channel, Size insize) - { - InputSize = insize; - return insize; - } - public override void Run() - { - FilterProgram.GuiRenderer.Begin(OutputSize); //hope this didnt change - FilterProgram.GuiRenderer.SetBlendState(FilterProgram.GL.BlendNoneCopy); - FilterProgram.GuiRenderer.Modelview.Scale(XIS,YIS); - FilterProgram.GuiRenderer.Draw(InputTexture); - FilterProgram.GuiRenderer.End(); - } - } - - public class LuaLayer : BaseFilter - { - public override void Initialize() - { - DeclareInput(SurfaceDisposition.RenderTarget); - } - public override void SetInputFormat(string channel, SurfaceState state) - { - DeclareOutput(state); - } - - Texture2d Texture; - - public void SetTexture(Texture2d tex) - { - Texture = tex; - } - - public override void Run() - { - var outSize = FindOutput().SurfaceFormat.Size; - FilterProgram.GuiRenderer.Begin(outSize); - FilterProgram.GuiRenderer.SetBlendState(FilterProgram.GL.BlendNormal); - FilterProgram.GuiRenderer.Draw(Texture); - FilterProgram.GuiRenderer.End(); - } - } - - public class OSD : BaseFilter - { - //this class has the ability to disable its operations for higher performance when the callback is removed, - //without having to take it out of the chain. although, its presence in the chain may slow down performance due to added resolves/renders - //so, we should probably rebuild the chain. - - public override void Initialize() - { - if (RenderCallback == null) return; - DeclareInput(SurfaceDisposition.RenderTarget); - } - public override void SetInputFormat(string channel, SurfaceState state) - { - if (RenderCallback == null) return; - DeclareOutput(state); - } - - public Action RenderCallback; - - public override void Run() - { - if (RenderCallback == null) return; - RenderCallback(); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs deleted file mode 100644 index 4e90b9b3ae..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs +++ /dev/null @@ -1,326 +0,0 @@ -//https://github.com/Themaister/RetroArch/wiki/GLSL-shaders -//https://github.com/Themaister/Emulator-Shader-Pack/blob/master/Cg/README -//https://github.com/libretro/common-shaders/ - -using System; -using System.Linq; -using System.Diagnostics; -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk; -using BizHawk.Client.EmuHawk.FilterManager; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; - -using OpenTK; -using OpenTK.Graphics; - -namespace BizHawk.Client.EmuHawk.Filters -{ - public class RetroShaderChain : IDisposable - { - static System.Text.RegularExpressions.Regex rxInclude = new Regex(@"^(\s)?\#include(\s)+(""|<)(.*)?(""|>)", RegexOptions.Multiline | RegexOptions.IgnoreCase); - static string ResolveIncludes(string content, string baseDirectory) - { - for (; ; ) - { - var match = rxInclude.Match(content); - if(match.Value == "") break; - string fname = match.Groups[4].Value; - fname = Path.Combine(baseDirectory,fname); - string includedContent = ResolveIncludes(File.ReadAllText(fname),Path.GetDirectoryName(fname)); - content = content.Substring(0, match.Index) + includedContent + content.Substring(match.Index + match.Length); - } - return content; - } - - public RetroShaderChain(IGL owner, RetroShaderPreset preset, string baseDirectory, bool debug = false) - { - Owner = owner; - this.Preset = preset; - Passes = preset.Passes.ToArray(); - - bool ok = true; - Errors = ""; - - //load up the shaders - Shaders = new RetroShader[preset.Passes.Count]; - for (int i = 0; i < preset.Passes.Count; i++) - { - RetroShaderPreset.ShaderPass pass = preset.Passes[i]; - - //acquire content - string path = Path.Combine(baseDirectory, pass.ShaderPath); - if (!File.Exists(path)) - { - ok = false; - break; - } - string content = ResolveIncludes(File.ReadAllText(path), Path.GetDirectoryName(path)); - - - var shader = new RetroShader(Owner, content, debug); - Shaders[i] = shader; - if (!shader.Available) - { - Errors += string.Format("===================\r\nPass {0}:\r\n{1}",i,shader.Errors); - ok = false; - } - } - - Available = ok; - } - - public void Dispose() - { - if (_isDisposed) return; - foreach (var s in Shaders) - s.Dispose(); - _isDisposed = true; - } - - /// - /// Whether this shader chain is available (it wont be available if some resources failed to load or compile) - /// - public bool Available { get; private set; } - public string Errors { get; private set; } - - public readonly IGL Owner; - public readonly RetroShaderPreset Preset; - public readonly RetroShader[] Shaders; - public readonly RetroShaderPreset.ShaderPass[] Passes; - - private bool _isDisposed; - } - - public class RetroShaderPreset - { - /// - /// Parses an instance from a stream to a CGP file - /// - public RetroShaderPreset(Stream stream) - { - var content = new StreamReader(stream).ReadToEnd(); - Dictionary dict = new Dictionary(); - - //parse the key-value-pair format of the file - content = content.Replace("\r", ""); - foreach (var _line in content.Split('\n')) - { - var line = _line.Trim(); - if (line.StartsWith("#")) continue; //lines that are solely comments - if (line == "") continue; //empty line - int eq = line.IndexOf('='); - var key = line.Substring(0, eq).Trim(); - var value = line.Substring(eq + 1).Trim(); - int quote = value.IndexOf('\"'); - if (quote != -1) - value = value.Substring(quote + 1, value.IndexOf('\"', quote + 1) - (quote + 1)); - else - { - //remove comments from end of value. exclusive from above condition, since comments after quoted strings would be snipped by the quoted string extraction - int hash = value.IndexOf('#'); - if (hash != -1) - value = value.Substring(0, hash); - value = value.Trim(); - } - dict[key.ToLower()] = value; - } - - //process the keys - int nShaders = FetchInt(dict, "shaders", 0); - for (int i = 0; i < nShaders; i++) - { - ShaderPass sp = new ShaderPass(); - sp.Index = i; - Passes.Add(sp); - - sp.InputFilterLinear = FetchBool(dict, "filter_linear" + i, false); //Should this value not be defined, the filtering option is implementation defined. - sp.OuputFloat = FetchBool(dict, "float_framebuffer" + i, false); - sp.FrameCountMod = FetchInt(dict, "frame_count_mod" + i, 1); - sp.ShaderPath = FetchString(dict, "shader" + i, "?"); //todo - change extension to .cg for better compatibility? just change .cg to .glsl transparently at last second? - - //If no scale type is assumed, it is assumed that it is set to "source" with scaleN set to 1.0. - //It is possible to set scale_type_xN and scale_type_yN to specialize the scaling type in either direction. scale_typeN however overrides both of these. - sp.ScaleTypeX = (ScaleType)Enum.Parse(typeof(ScaleType), FetchString(dict, "scale_type_x" + i, "Source"), true); - sp.ScaleTypeY = (ScaleType)Enum.Parse(typeof(ScaleType), FetchString(dict, "scale_type_y" + i, "Source"), true); - ScaleType st = (ScaleType)Enum.Parse(typeof(ScaleType), FetchString(dict, "scale_type" + i, "NotSet"), true); - if (st != ScaleType.NotSet) - sp.ScaleTypeX = sp.ScaleTypeY = st; - - //scaleN controls both scaling type in horizontal and vertical directions. If scaleN is defined, scale_xN and scale_yN have no effect. - sp.Scale.X = FetchFloat(dict, "scale_x" + i, 1); - sp.Scale.Y = FetchFloat(dict, "scale_y" + i, 1); - float scale = FetchFloat(dict, "scale" + i, -999); - if (scale != -999) - sp.Scale.X = sp.Scale.Y = FetchFloat(dict, "scale" + i, 1); - - //TODO - LUTs - } - } - - public List Passes = new List(); - - /// - /// Indicates whether any of the passes contain GLSL filenames (these are invalid now) - /// - public bool ContainsGLSL - { - get - { - foreach (var pass in Passes) - if (Path.GetExtension(pass.ShaderPath).ToLowerInvariant() == ".glsl") - return true; - return false; - } - } - - public enum ScaleType - { - NotSet, Source, Viewport, Absolute - } - - public class ShaderPass - { - public int Index; - public string ShaderPath; - public bool InputFilterLinear; - public bool OuputFloat; - public int FrameCountMod; - public ScaleType ScaleTypeX; - public ScaleType ScaleTypeY; - public Vector2 Scale; - } - - string FetchString(Dictionary dict, string key, string @default) - { - string str; - if (dict.TryGetValue(key, out str)) - return str; - else return @default; - } - - int FetchInt(Dictionary dict, string key, int @default) - { - string str; - if (dict.TryGetValue(key, out str)) - return int.Parse(str); - else return @default; - } - - float FetchFloat(Dictionary dict, string key, float @default) - { - string str; - if (dict.TryGetValue(key, out str)) - return float.Parse(str); - else return @default; - } - - bool FetchBool(Dictionary dict, string key, bool @default) - { - string str; - if (dict.TryGetValue(key, out str)) - return ParseBool(str); - else return @default; - } - - - bool ParseBool(string value) - { - if (value == "1") return true; - if (value == "0") return false; - value = value.ToLower(); - if (value == "true") return true; - if (value == "false") return false; - throw new InvalidOperationException("Unparseable bool in CGP file content"); - } - } - - public class RetroShaderPass : BaseFilter - { - RetroShaderChain RSC; - RetroShaderPreset.ShaderPass SP; - int RSI; - Size OutputSize; - - public override string ToString() - { - return string.Format("RetroShaderPass[#{0}]", RSI); - } - - public RetroShaderPass(RetroShaderChain RSC, int index) - { - this.RSC = RSC; - this.RSI = index; - this.SP = RSC.Passes[index]; - } - - public override void Initialize() - { - DeclareInput(SurfaceDisposition.Texture); - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - Size insize = state.SurfaceFormat.Size; - if (SP.ScaleTypeX == RetroShaderPreset.ScaleType.Absolute) OutputSize.Width = (int)SP.Scale.X; - if (SP.ScaleTypeY == RetroShaderPreset.ScaleType.Absolute) OutputSize.Width = (int)SP.Scale.Y; - if (SP.ScaleTypeX == RetroShaderPreset.ScaleType.Source) OutputSize.Width = (int)(insize.Width * SP.Scale.X); - if (SP.ScaleTypeY == RetroShaderPreset.ScaleType.Source) OutputSize.Height = (int)(insize.Height * SP.Scale.Y); - - var outState = new SurfaceState(); - outState.SurfaceFormat = new SurfaceFormat(OutputSize); - outState.SurfaceDisposition = SurfaceDisposition.RenderTarget; - DeclareOutput(outState); - } - - public override Size PresizeOutput(string channel, Size size) - { - OutputSize = size; - return size; - } - - public override Size PresizeInput(string channel, Size insize) - { - Size outsize = insize; - if (SP.ScaleTypeX == RetroShaderPreset.ScaleType.Absolute) outsize.Width = (int)SP.Scale.X; - if (SP.ScaleTypeY == RetroShaderPreset.ScaleType.Absolute) outsize.Width = (int)SP.Scale.Y; - if (SP.ScaleTypeX == RetroShaderPreset.ScaleType.Source) outsize.Width = (int)(insize.Width * SP.Scale.X); - if (SP.ScaleTypeY == RetroShaderPreset.ScaleType.Source) outsize.Height = (int)(insize.Height * SP.Scale.Y); - return outsize; - } - - public override void Run() - { - var shader = RSC.Shaders[RSI]; - - shader.Bind(); - - //apply all parameters to this shader.. even if it was meant for other shaders. kind of lame. - if(Parameters != null) - foreach (var kvp in Parameters) - { - if (kvp.Value is float) - shader.Pipeline[kvp.Key].Set((float)kvp.Value); - } - - var input = InputTexture; - if (SP.InputFilterLinear) - InputTexture.SetFilterLinear(); - else - InputTexture.SetFilterNearest(); - RSC.Shaders[RSI].Run(input, input.Size, OutputSize, InputTexture.IsUpsideDown); - - //maintain invariant.. i think. - InputTexture.SetFilterNearest(); - } - } - - -} diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Utils.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Utils.cs deleted file mode 100644 index 0eabf4c64b..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Utils.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.Collections.Generic; -using System.IO; -using System.Drawing; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk; -using BizHawk.Client.EmuHawk.FilterManager; - -using BizHawk.Bizware.BizwareGL; -using BizHawk.Bizware.BizwareGL.Drivers.OpenTK; - -using OpenTK; -using OpenTK.Graphics; - -namespace BizHawk.Client.EmuHawk.Filters -{ - public class SourceImage : BaseFilter - { - public SourceImage(Size size) - { - this.Size = size; - } - - Size Size; - - public Texture2d Texture; - - public override void Run() - { - YieldOutput(Texture); - } - - public override void Initialize() - { - DeclareOutput(new SurfaceState(new SurfaceFormat(Size), SurfaceDisposition.Texture)); - } - - public override void SetInputFormat(string channel, SurfaceState format) - { - DeclareOutput(SurfaceDisposition.Texture); - } - } - - /// - /// transforms an input texture to an output render target (by rendering it) - /// - class Render : BaseFilter - { - public override void Initialize() - { - DeclareInput(SurfaceDisposition.Texture); - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - DeclareOutput(new SurfaceState(state.SurfaceFormat, SurfaceDisposition.RenderTarget)); - } - - public override void Run() - { - var renderer = FilterProgram.GuiRenderer; - renderer.Begin(FindOutput().SurfaceFormat.Size); - renderer.SetBlendState(FilterProgram.GL.BlendNoneCopy); - renderer.Draw(InputTexture); - renderer.End(); - } - } - - class Resolve : BaseFilter - { - public override void Initialize() - { - DeclareInput(SurfaceDisposition.RenderTarget); - } - - public override void SetInputFormat(string channel, SurfaceState state) - { - DeclareOutput(new SurfaceState(state.SurfaceFormat, SurfaceDisposition.Texture)); - } - - public override void Run() - { - YieldOutput(FilterProgram.GetRenderTarget().Texture2d); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs deleted file mode 100644 index d0befae66e..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs +++ /dev/null @@ -1,464 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using System.Drawing; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; -using BizHawk.Client.Common.InputAdapterExtensions; -using BizHawk.Bizware.BizwareGL; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// This is an old abstracted rendering class that the OSD system is using to get its work done. - /// We should probably just use a GuiRenderer (it was designed to do that) although wrapping it with - /// more information for OSDRendering could be helpful I suppose - /// - public interface IBlitter - { - IBlitterFont GetFontType(string fontType); - void DrawString(string s, IBlitterFont font, Color color, float x, float y); - SizeF MeasureString(string s, IBlitterFont font); - Rectangle ClipBounds { get; set; } - } - - class UIMessage - { - public string Message; - public DateTime ExpireAt; - } - - class UIDisplay - { - public string Message; - public int X; - public int Y; - public int Anchor; - public Color ForeColor; - public Color BackGround; - } - - public class OSDManager - { - public string FPS { get; set; } - public IBlitterFont MessageFont; - - public void Dispose() - { - - } - - public void Begin(IBlitter blitter) - { - MessageFont = blitter.GetFontType("MessageFont"); - } - - public Color FixedMessagesColor { get { return Color.FromArgb(Global.Config.MessagesColor); } } - public Color FixedAlertMessageColor { get { return Color.FromArgb(Global.Config.AlertMessageColor); } } - - public OSDManager() - { - } - - private float GetX(IBlitter g, int x, int anchor, string message) - { - var size = g.MeasureString(message, MessageFont); - - switch (anchor) - { - default: - case 0: //Top Left - case 2: //Bottom Left - return x; - case 1: //Top Right - case 3: //Bottom Right - return g.ClipBounds.Width - x - size.Width; - } - } - - private float GetY(IBlitter g, int y, int anchor, string message) - { - var size = g.MeasureString(message, MessageFont); - - switch (anchor) - { - default: - case 0: //Top Left - case 1: //Top Right - return y; - case 2: //Bottom Left - case 3: //Bottom Right - return g.ClipBounds.Height - y - size.Height; - } - } - - private string MakeFrameCounter() - { - if (Global.MovieSession.Movie.IsFinished) - { - var sb = new StringBuilder(); - sb - .Append(Global.Emulator.Frame) - .Append('/') - .Append(Global.MovieSession.Movie.FrameCount) - .Append(" (Finished)"); - return sb.ToString(); - } - - if (Global.MovieSession.Movie.IsPlaying) - { - var sb = new StringBuilder(); - sb - .Append(Global.Emulator.Frame) - .Append('/') - .Append(Global.MovieSession.Movie.FrameCount); - - return sb.ToString(); - } - - if (Global.MovieSession.Movie.IsRecording) - { - return Global.Emulator.Frame.ToString(); - } - - return Global.Emulator.Frame.ToString(); - } - - private List messages = new List(5); - private List GUITextList = new List(); - - public void AddMessage(string message) - { - messages.Add(new UIMessage { Message = message, ExpireAt = DateTime.Now + TimeSpan.FromSeconds(2) }); - } - - public void AddGUIText(string message, int x, int y, Color backGround, Color foreColor, int anchor) - { - GUITextList.Add(new UIDisplay - { - Message = message, - X = x, - Y = y, - BackGround = backGround, - ForeColor = foreColor, - Anchor = anchor - }); - } - - public void ClearGUIText() - { - GUITextList.Clear(); - } - - public void DrawMessages(IBlitter g) - { - if (!Global.Config.DisplayMessages) - { - return; - } - - messages.RemoveAll(m => DateTime.Now > m.ExpireAt); - int line = 1; - if (Global.Config.StackOSDMessages) - { - for (int i = messages.Count - 1; i >= 0; i--, line++) - { - float x = GetX(g, Global.Config.DispMessagex, Global.Config.DispMessageanchor, messages[i].Message); - float y = GetY(g, Global.Config.DispMessagey, Global.Config.DispMessageanchor, messages[i].Message); - if (Global.Config.DispMessageanchor < 2) - { - y += ((line - 1) * 18); - } - else - { - y -= ((line - 1) * 18); - } - - //g.DrawString(messages[i].Message, MessageFont, Color.Black, x + 2, y + 2); - g.DrawString(messages[i].Message, MessageFont, FixedMessagesColor, x, y); - } - } - else - { - if (messages.Any()) - { - int i = messages.Count - 1; - - float x = GetX(g, Global.Config.DispMessagex, Global.Config.DispMessageanchor, messages[i].Message); - float y = GetY(g, Global.Config.DispMessagey, Global.Config.DispMessageanchor, messages[i].Message); - if (Global.Config.DispMessageanchor < 2) - { - y += ((line - 1) * 18); - } - else - { - y -= ((line - 1) * 18); - } - - //g.DrawString(messages[i].Message, MessageFont, Color.Black, x + 2, y + 2); - g.DrawString(messages[i].Message, MessageFont, FixedMessagesColor, x, y); - } - } - - foreach (var text in GUITextList) - { - try - { - float posx = GetX(g, text.X, text.Anchor, text.Message); - float posy = GetY(g, text.Y, text.Anchor, text.Message); - - //g.DrawString(text.Message, MessageFont, text.BackGround, posx + 2, posy + 2); - g.DrawString(text.Message, MessageFont, text.ForeColor, posx, posy); - } - catch (Exception) - { - return; - } - } - } - - public string InputStrMovie() - { - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerAdapter); - - return lg.GenerateInputDisplay(); - } - - public string InputStrImmediate() - { - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(Global.AutofireStickyXORAdapter); - - return lg.GenerateInputDisplay(); - } - - public string InputPrevious() - { - if (Global.MovieSession.Movie.IsActive && !Global.MovieSession.Movie.IsFinished) - { - var lg = Global.MovieSession.LogGeneratorInstance(); - var state = Global.MovieSession.Movie.GetInputState(Global.Emulator.Frame - 1); - if (state != null) - { - lg.SetSource(state); - return lg.GenerateInputDisplay(); - } - } - - return ""; - } - - public string InputStrOrAll() - { - var m = (Global.MovieSession.Movie.IsActive && - !Global.MovieSession.Movie.IsFinished && - Global.Emulator.Frame > 0) ? - Global.MovieSession.Movie.GetInputState(Global.Emulator.Frame - 1) : - Global.MovieSession.MovieControllerInstance(); - - var lg = Global.MovieSession.LogGeneratorInstance(); - - lg.SetSource(Global.AutofireStickyXORAdapter.Or(m)); - return lg.GenerateInputDisplay(); - } - - public string InputStrSticky() - { - var stickyOr = new StickyOrAdapter - { - Source = Global.StickyXORAdapter, - SourceStickyOr = Global.AutofireStickyXORAdapter - }; - - return MakeStringFor(stickyOr); - } - - private string MakeStringFor(IController controller) - { - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(controller); - return lg.GenerateInputDisplay(); - } - - public string MakeIntersectImmediatePrevious() - { - if (Global.MovieSession.Movie.IsActive) - { - var m = Global.MovieSession.Movie.IsActive && !Global.MovieSession.Movie.IsFinished ? - Global.MovieSession.Movie.GetInputState(Global.Emulator.Frame - 1) : - Global.MovieSession.MovieControllerInstance(); - - var lg = Global.MovieSession.LogGeneratorInstance(); - lg.SetSource(Global.AutofireStickyXORAdapter.And(m)); - return lg.GenerateInputDisplay(); - } - - return ""; - } - - public string MakeRerecordCount() - { - if (Global.MovieSession.Movie.IsActive) - { - return Global.MovieSession.Movie.Rerecords.ToString(); - } - - return ""; - } - - private void DrawOsdMessage(IBlitter g, string message, Color color, float x, float y) - { - //g.DrawString(message, MessageFont, Color.Black, x + 1, y + 1); - g.DrawString(message, MessageFont, color, x, y); - } - - /// - /// Display all screen info objects like fps, frame counter, lag counter, and input display - /// - public void DrawScreenInfo(IBlitter g) - { - if (Global.Config.DisplayFrameCounter && !Global.Game.IsNullInstance) - { - string message = MakeFrameCounter(); - float x = GetX(g, Global.Config.DispFrameCx, Global.Config.DispFrameanchor, message); - float y = GetY(g, Global.Config.DispFrameCy, Global.Config.DispFrameanchor, message); - - DrawOsdMessage(g, message, Color.FromArgb(Global.Config.MessagesColor), x, y); - - if (GlobalWin.MainForm.IsLagFrame) - { - DrawOsdMessage(g, Global.Emulator.Frame.ToString(), FixedAlertMessageColor, x, y); - } - } - - if (Global.Config.DisplayInput && !Global.Game.IsNullInstance) - { - if ((Global.MovieSession.Movie.IsPlaying && !Global.MovieSession.Movie.IsFinished) - || (Global.MovieSession.Movie.IsFinished && Global.Emulator.Frame == Global.MovieSession.Movie.InputLogLength)) // Account for the last frame of the movie, the movie state is immediately "Finished" here but we still want to show the input - { - var input = InputStrMovie(); - var x = GetX(g, Global.Config.DispInpx, Global.Config.DispInpanchor, input); - var y = GetY(g, Global.Config.DispInpy, Global.Config.DispInpanchor, input); - Color c = Color.FromArgb(Global.Config.MovieInput); - //g.DrawString(input, MessageFont, Color.Black, x + 1, y + 1); - g.DrawString(input, MessageFont, c, x, y); - } - - else // TODO: message config -- allow setting of "previous", "mixed", and "auto" - { - var previousColor = Color.Orange; - Color immediateColor = Color.FromArgb(Global.Config.MessagesColor); - var autoColor = Color.Pink; - var changedColor = Color.PeachPuff; - - //we need some kind of string for calculating position when right-anchoring, of something like that - var bgStr = InputStrOrAll(); - var x = GetX(g, Global.Config.DispInpx, Global.Config.DispInpanchor, bgStr); - var y = GetY(g, Global.Config.DispInpy, Global.Config.DispInpanchor, bgStr); - - //now, we're going to render these repeatedly, with higher-priority things overriding - - //first display previous frame's input. - //note: that's only available in case we're working on a movie - var previousStr = InputPrevious(); - g.DrawString(previousStr, MessageFont, previousColor, x, y); - - //next, draw the immediate input. - //that is, whatever's being held down interactively right this moment even if the game is paused - //this includes things held down due to autohold or autofire - //I know, this is all really confusing - var immediate = InputStrImmediate(); - g.DrawString(immediate, MessageFont, immediateColor, x, y); - - //next draw anything that's pressed because it's sticky. - //this applies to autofire and autohold both. somehow. I dont understand it. - //basically we're tinting whatever's pressed because it's sticky specially - //in order to achieve this we want to avoid drawing anything pink that isnt actually held down right now - //so we make an AND adapter and combine it using immediate & sticky - var autoString = MakeStringFor(Global.StickyXORAdapter.Source.Xor(Global.AutofireStickyXORAdapter).And(Global.AutofireStickyXORAdapter)); - g.DrawString(autoString, MessageFont, autoColor, x, y); - - //recolor everything that's changed from the previous input - var immediateOverlay = MakeIntersectImmediatePrevious(); - g.DrawString(immediateOverlay, MessageFont, changedColor, x, y); - } - } - - if (Global.MovieSession.MultiTrack.IsActive) - { - float x = GetX(g, Global.Config.DispMultix, Global.Config.DispMultianchor, Global.MovieSession.MultiTrack.Status); - float y = GetY(g, Global.Config.DispMultiy, Global.Config.DispMultianchor, Global.MovieSession.MultiTrack.Status); - - DrawOsdMessage(g, Global.MovieSession.MultiTrack.Status, FixedMessagesColor, x, y); - } - - if (Global.Config.DisplayFPS && FPS != null) - { - float x = GetX(g, Global.Config.DispFPSx, Global.Config.DispFPSanchor, FPS); - float y = GetY(g, Global.Config.DispFPSy, Global.Config.DispFPSanchor, FPS); - - DrawOsdMessage(g, FPS, FixedMessagesColor, x, y); - } - - if (Global.Config.DisplayLagCounter && Global.Emulator.CanPollInput()) - { - var counter = Global.Emulator.AsInputPollable().LagCount.ToString(); - var x = GetX(g, Global.Config.DispLagx, Global.Config.DispLaganchor, counter); - var y = GetY(g, Global.Config.DispLagy, Global.Config.DispLaganchor, counter); - - DrawOsdMessage(g, counter, FixedAlertMessageColor, x, y); - } - - if (Global.Config.DisplayRerecordCount) - { - string rerec = MakeRerecordCount(); - float x = GetX(g, Global.Config.DispRecx, Global.Config.DispRecanchor, rerec); - float y = GetY(g, Global.Config.DispRecy, Global.Config.DispRecanchor, rerec); - - DrawOsdMessage(g, rerec, FixedMessagesColor, x, y); - } - - if (Global.ClientControls["Autohold"] || Global.ClientControls["Autofire"]) - { - var disp = new StringBuilder("Held: "); - - foreach (string sticky in Global.StickyXORAdapter.CurrentStickies) - { - disp.Append(sticky).Append(' '); - } - - foreach (string autoSticky in Global.AutofireStickyXORAdapter.CurrentStickies) - { - disp - .Append("Auto-") - .Append(autoSticky) - .Append(' '); - } - - var message = disp.ToString(); - - g.DrawString( - message, - MessageFont, - Color.White, - GetX(g, Global.Config.DispAutoholdx, Global.Config.DispAutoholdanchor, message), - GetY(g, Global.Config.DispAutoholdy, Global.Config.DispAutoholdanchor, message)); - } - - if (Global.MovieSession.Movie.IsActive && Global.Config.DisplaySubtitles) - { - var subList = Global.MovieSession.Movie.Subtitles.GetSubtitles(Global.Emulator.Frame); - - foreach (var sub in subList) - { - DrawOsdMessage(g, sub.Message, Color.FromArgb((int)sub.Color), sub.X, sub.Y); - } - } - } - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/RenderTargetFrugalizer.cs b/BizHawk.Client.EmuHawk/DisplayManager/RenderTargetFrugalizer.cs deleted file mode 100644 index d19e6e755f..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/RenderTargetFrugalizer.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Bizware.BizwareGL; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Recycles a pair of temporary render targets, as long as the dimensions match. - /// When the dimensions dont match, a new one will be allocated - /// - public class RenderTargetFrugalizer : IDisposable - { - public RenderTargetFrugalizer(IGL gl) - { - GL = gl; - ResetList(); - } - - public void Dispose() - { - foreach (var ct in CurrentRenderTargets) - if (ct != null) - ct.Dispose(); - ResetList(); - } - - void ResetList() - { - CurrentRenderTargets = new List(); - CurrentRenderTargets.Add(null); - CurrentRenderTargets.Add(null); - } - - IGL GL; - List CurrentRenderTargets; - - public RenderTarget Get(System.Drawing.Size dimensions) { return Get(dimensions.Width, dimensions.Height); } - public RenderTarget Get(int width, int height) - { - //get the current entry - RenderTarget CurrentRenderTarget = CurrentRenderTargets[0]; - - //check if its rotten and needs recreating - if (CurrentRenderTarget == null || CurrentRenderTarget.Texture2d.IntWidth != width || CurrentRenderTarget.Texture2d.IntHeight != height) - { - //needs recreating. be sure to kill the old one... - if (CurrentRenderTarget != null) - CurrentRenderTarget.Dispose(); - //and make a new one - CurrentRenderTarget = GL.CreateRenderTarget(width, height); - } - else - { - //its good! nothing more to do - } - - //now shuffle the buffers - CurrentRenderTargets[0] = CurrentRenderTargets[1]; - CurrentRenderTargets[1] = CurrentRenderTarget; - - return CurrentRenderTarget; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/SwappableBitmapBufferSet.cs b/BizHawk.Client.EmuHawk/DisplayManager/SwappableBitmapBufferSet.cs deleted file mode 100644 index f2e466f6db..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/SwappableBitmapBufferSet.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using BizHawk.Bizware.BizwareGL; - - -namespace BizHawk.Client.EmuHawk -{ - /// - /// encapsulates thread-safe concept of pending/current BitmapBuffer, reusing buffers where matching - /// sizes are available and keeping them cleaned up when they dont seem like theyll need to be used anymore - /// This isnt in the csproj right now, but I'm keeping it, in case its handy. - /// - class SwappableBitmapBufferSet - { - BitmapBuffer Pending, Current; - Queue ReleasedSurfaces = new Queue(); - - /// - /// retrieves a surface with the specified size, reusing an old buffer if available and clearing if requested - /// - public BitmapBuffer AllocateSurface(int width, int height, bool needsClear = true) - { - for (; ; ) - { - BitmapBuffer trial; - lock (this) - { - if (ReleasedSurfaces.Count == 0) break; - trial = ReleasedSurfaces.Dequeue(); - } - if (trial.Width == width && trial.Height == height) - { - if (needsClear) trial.ClearWithoutAlloc(); - return trial; - } - trial.Dispose(); - } - return new BitmapBuffer(width, height); - } - - /// - /// sets the provided buffer as pending. takes control of the supplied buffer - /// - public void SetPending(BitmapBuffer newPending) - { - lock (this) - { - if (Pending != null) ReleasedSurfaces.Enqueue(Pending); - Pending = newPending; - } - } - - public void ReleaseSurface(BitmapBuffer surface) - { - lock (this) ReleasedSurfaces.Enqueue(surface); - } - - /// - /// returns the current buffer, making the most recent pending buffer (if there is such) as the new current first. - /// - public BitmapBuffer GetCurrent() - { - lock (this) - { - if (Pending != null) - { - if (Current != null) ReleasedSurfaces.Enqueue(Current); - Current = Pending; - Pending = null; - } - } - return Current; - } - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/SwappableDisplaySurfaceSet.cs b/BizHawk.Client.EmuHawk/DisplayManager/SwappableDisplaySurfaceSet.cs deleted file mode 100644 index e3119309fc..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/SwappableDisplaySurfaceSet.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -using BizHawk.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// encapsulates thread-safe concept of pending/current display surfaces, reusing buffers where matching - /// sizes are available and keeping them cleaned up when they dont seem like theyll need to be used anymore - /// - class SwappableDisplaySurfaceSet - { - DisplaySurface Pending, Current; - bool IsPending; - Queue ReleasedSurfaces = new Queue(); - - /// - /// retrieves a surface with the specified size, reusing an old buffer if available and clearing if requested - /// - public DisplaySurface AllocateSurface(int width, int height, bool needsClear = true) - { - for (; ; ) - { - DisplaySurface trial; - lock (this) - { - if (ReleasedSurfaces.Count == 0) break; - trial = ReleasedSurfaces.Dequeue(); - } - if (trial.Width == width && trial.Height == height) - { - if (needsClear) trial.Clear(); - return trial; - } - trial.Dispose(); - } - return new DisplaySurface(width, height); - } - - /// - /// sets the provided buffer as pending. takes control of the supplied buffer - /// - public void SetPending(DisplaySurface newPending) - { - lock (this) - { - if (Pending != null) ReleasedSurfaces.Enqueue(Pending); - Pending = newPending; - IsPending = true; - } - } - - public void ReleaseSurface(DisplaySurface surface) - { - lock (this) ReleasedSurfaces.Enqueue(surface); - } - - /// - /// returns the current buffer, making the most recent pending buffer (if there is such) as the new current first. - /// - public DisplaySurface GetCurrent() - { - lock (this) - { - if (IsPending) - { - if (Current != null) ReleasedSurfaces.Enqueue(Current); - Current = Pending; - Pending = null; - IsPending = false; - } - } - return Current; - } - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/DisplayManager/TextureFrugalizer.cs b/BizHawk.Client.EmuHawk/DisplayManager/TextureFrugalizer.cs deleted file mode 100644 index 607d9780ec..0000000000 --- a/BizHawk.Client.EmuHawk/DisplayManager/TextureFrugalizer.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -using BizHawk.Bizware.BizwareGL; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Recycles a pair of temporary textures (in case double-buffering helps any) to contain a BitmapBuffer's or DisplaySurface's contents, as long as the dimensions match. - /// When the dimensions dont match, a new one will be allocated - /// - public class TextureFrugalizer : IDisposable - { - public TextureFrugalizer(IGL gl) - { - GL = gl; - ResetList(); - } - - public void Dispose() - { - foreach (var ct in CurrentTextures) - if(ct != null) - ct.Dispose(); - ResetList(); - } - - void ResetList() - { - CurrentTextures = new List(); - CurrentTextures.Add(null); - CurrentTextures.Add(null); - } - - IGL GL; - List CurrentTextures; - - public Texture2d Get(DisplaySurface ds) - { - using (var bb = new BitmapBuffer(ds.PeekBitmap(), new BitmapLoadOptions())) - { - return Get(bb); - } - } - public Texture2d Get(BitmapBuffer bb) - { - //get the current entry - Texture2d CurrentTexture = CurrentTextures[0]; - - //TODO - its a bit cruddy here that we dont respect the current texture HasAlpha condition (in fact, theres no such concept) - //we might need to deal with that in the future to fix some bugs. - - //check if its rotten and needs recreating - if (CurrentTexture == null || CurrentTexture.IntWidth != bb.Width || CurrentTexture.IntHeight != bb.Height) - { - //needs recreating. be sure to kill the old one... - if (CurrentTexture != null) - CurrentTexture.Dispose(); - //and make a new one - CurrentTexture = GL.LoadTexture(bb); - } - else - { - //its good! just load in the data - GL.LoadTextureData(CurrentTexture, bb); - } - - //now shuffle the buffers - CurrentTextures[0] = CurrentTextures[1]; - CurrentTextures[1] = CurrentTexture; - - //deterministic state, i guess - CurrentTexture.SetFilterNearest(); - - return CurrentTexture; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs b/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs deleted file mode 100644 index f03313113b..0000000000 --- a/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs +++ /dev/null @@ -1,315 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Common; -using BizHawk.Common.ReflectionExtensions; -using BizHawk.Client.Common; - - -namespace BizHawk.Client.EmuHawk.WinFormExtensions -{ - public static class ControlExtensions - { - public static void PopulateFromEnum(this ComboBox box, object enumVal) - where T : struct, IConvertible - { - if (!typeof(T).IsEnum) - { - throw new ArgumentException("T must be an enumerated type"); - } - - box.Items.Clear(); - box.Items.AddRange( - typeof(T).GetEnumDescriptions() - .ToArray()); - box.SelectedItem = enumVal.GetDescription(); - } - - // extension method to make Control.Invoke easier to use - public static object Invoke(this Control control, Action action) - { - return control.Invoke(action); - } - - // extension method to make Control.BeginInvoke easier to use - public static IAsyncResult BeginInvoke(this Control control, Action action) - { - return control.BeginInvoke(action); - } - - public static void AddColumn(this ListView listView, string columnName, bool enabled, int columnWidth) - { - if (enabled) - { - if (listView.Columns[columnName] == null) - { - var column = new ColumnHeader - { - Name = columnName, - Text = columnName.Replace("Column", ""), - Width = columnWidth, - }; - - listView.Columns.Add(column); - } - } - } - - public static void AddColumn(this ListView listView, ToolDialogSettings.Column column) - { - if (column.Visible) - { - if (listView.Columns[column.Name] == null) - { - var lsstViewColumn = new ColumnHeader - { - Name = column.Name, - Text = column.Name.Replace("Column", ""), - Width = column.Width, - DisplayIndex = column.Index - }; - - listView.Columns.Add(lsstViewColumn); - } - } - } - - public static ToolStripMenuItem GenerateColumnsMenu(this ToolDialogSettings.ColumnList list, Action changeCallback) - { - var menu = new ToolStripMenuItem - { - Name = "GeneratedColumnsSubMenu", - Text = "Columns" - }; - - var dummyList = list; - - foreach (var column in dummyList) - { - var menuItem = new ToolStripMenuItem - { - Name = column.Name, - Text = column.Name.Replace("Column", "") - }; - - menuItem.Click += (o, ev) => - { - dummyList[menuItem.Name].Visible ^= true; - changeCallback(); - }; - - menu.DropDownItems.Add(menuItem); - } - - menu.DropDownOpened += (o, e) => - { - foreach (var column in dummyList) - { - (menu.DropDownItems[column.Name] as ToolStripMenuItem).Checked = column.Visible; - } - }; - - return menu; - } - - public static Point ChildPointToScreen(this Control control, Control child) - { - return control.PointToScreen(new Point(child.Location.X, child.Location.Y)); - } - - #region Enumerable to Enumerable - - /// - /// Converts the outdated IEnumerable Controls property to a IEnumerable like .NET should have done a long time ago - /// - public static IEnumerable Controls(this Control control) - { - return control.Controls - .OfType(); - } - - public static IEnumerable TabPages(this TabControl tabControl) - { - return tabControl.TabPages.Cast(); - } - - public static IEnumerable SelectedIndices(this ListView listView) - { - return listView.SelectedIndices.Cast(); - } - - public static IEnumerable ColumnHeaders(this ListView listView) - { - return listView.Columns.OfType(); - } - - #endregion - } - - public static class FormExtensions - { - /// - /// Handles EmuHawk specific issues before showing a modal dialog - /// - public static DialogResult ShowHawkDialog(this Form form, IWin32Window owner = null, Point position = default(Point)) - { - GlobalWin.Sound.StopSound(); - if (position != default(Point)) - { - form.StartPosition = FormStartPosition.Manual; - form.Location = position; - } - var result = (owner == null ? form.ShowDialog(new Form() { TopMost = true }) : form.ShowDialog(owner)); - GlobalWin.Sound.StartSound(); - return result; - } - - /// - /// Handles EmuHawk specific issues before showing a modal dialog - /// - public static DialogResult ShowHawkDialog(this CommonDialog form) - { - GlobalWin.Sound.StopSound(); - var tempForm = new Form() { TopMost = true }; - var result = form.ShowDialog(tempForm); - tempForm.Dispose(); - GlobalWin.Sound.StartSound(); - return result; - } - } - - public static class ListViewExtensions - { - [StructLayout(LayoutKind.Sequential)] - public struct HDITEM - { - public Mask mask; - public int cxy; - [MarshalAs(UnmanagedType.LPTStr)] - public string pszText; - public IntPtr hbm; - public int cchTextMax; - public Format fmt; - public IntPtr lParam; - // _WIN32_IE >= 0x0300 - public int iImage; - public int iOrder; - // _WIN32_IE >= 0x0500 - public uint type; - public IntPtr pvFilter; - // _WIN32_WINNT >= 0x0600 - public uint state; - - [Flags] - public enum Mask - { - Format = 0x4, // HDI_FORMAT - }; - - [Flags] - public enum Format - { - SortDown = 0x200, // HDF_SORTDOWN - SortUp = 0x400, // HDF_SORTUP - }; - }; - - public const int LVM_FIRST = 0x1000; - public const int LVM_GETHEADER = LVM_FIRST + 31; - - public const int HDM_FIRST = 0x1200; - public const int HDM_GETITEM = HDM_FIRST + 11; - public const int HDM_SETITEM = HDM_FIRST + 12; - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref HDITEM lParam); - - /// - /// Dumps the contents of the ListView into a tab separated list of lines - /// - public static string CopyItemsAsText(this ListView listViewControl) - { - var indexes = listViewControl.SelectedIndices; - if (indexes.Count <= 0) - { - return ""; - } - - var sb = new StringBuilder(); - - // walk over each selected item and subitem within it to generate a string from it - foreach (int index in indexes) - { - foreach (ListViewItem.ListViewSubItem item in listViewControl.Items[index].SubItems) - { - if (!String.IsNullOrWhiteSpace(item.Text)) - { - sb.Append(item.Text).Append('\t'); - } - } - - // remove the last tab - sb.Remove(sb.Length - 1, 1); - - sb.Append("\r\n"); - } - - // remove last newline - sb.Length -= 2; - - - return sb.ToString(); - } - - public static void SetSortIcon(this ListView listViewControl, int columnIndex, SortOrder order) - { - IntPtr columnHeader = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero); - for (int columnNumber = 0; columnNumber <= listViewControl.Columns.Count - 1; columnNumber++) - { - var columnPtr = new IntPtr(columnNumber); - var item = new HDITEM - { - mask = HDITEM.Mask.Format - }; - - if (SendMessage(columnHeader, HDM_GETITEM, columnPtr, ref item) == IntPtr.Zero) - { - throw new Win32Exception(); - } - - if (order != SortOrder.None && columnNumber == columnIndex) - { - switch (order) - { - case SortOrder.Ascending: - item.fmt &= ~HDITEM.Format.SortDown; - item.fmt |= HDITEM.Format.SortUp; - break; - case SortOrder.Descending: - item.fmt &= ~HDITEM.Format.SortUp; - item.fmt |= HDITEM.Format.SortDown; - break; - } - } - else - { - item.fmt &= ~HDITEM.Format.SortDown & ~HDITEM.Format.SortUp; - } - - if (SendMessage(columnHeader, HDM_SETITEM, columnPtr, ref item) == IntPtr.Zero) - { - throw new Win32Exception(); - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/Extensions/CoreExtensions.cs b/BizHawk.Client.EmuHawk/Extensions/CoreExtensions.cs deleted file mode 100644 index 613d465979..0000000000 --- a/BizHawk.Client.EmuHawk/Extensions/CoreExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Drawing; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; - -using BizHawk.Emulation.Cores.Nintendo.GBA; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; -using BizHawk.Emulation.Cores.Sega.Saturn; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Sony.PSP; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk.CoreExtensions -{ - public static class CoreExtensions - { - public static Bitmap Icon(this IEmulator core) - { - var attributes = core.Attributes(); - - if (!attributes.Ported) - { - return Properties.Resources.CorpHawkSmall; - } - - if (core is QuickNES) - { - return Properties.Resources.QuickNes; - } - else if (core is LibsnesCore) - { - return Properties.Resources.bsnes; - } - else if (core is GPGX) - { - return Properties.Resources.genplus; - } - else if (core is PSP) - { - return Properties.Resources.ppsspp; - } - else if (core is Gameboy) - { - return Properties.Resources.gambatte; - } - else if (core is Snes9x) - { - return Properties.Resources.snes9x; - } - else - { - return null; - } - } - - public static string DisplayName(this IEmulator core) - { - var attributes = core.Attributes(); - - var str = (!attributes.Released ? "(Experimental) " : "") + - attributes.CoreName; - - return str; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs b/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs deleted file mode 100644 index 5f9d3d4832..0000000000 --- a/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs +++ /dev/null @@ -1,268 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Windows.Forms; -using System.Linq; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -//todo - add some more options for libretro types - -namespace BizHawk.Client.EmuHawk.ToolExtensions -{ - public static class ToolExtensions - { - public static ToolStripItem[] RecentMenu(this RecentFiles recent, Action loadFileCallback, bool autoload = false, bool romloading = false) - { - var items = new List(); - - if (recent.Empty) - { - var none = new ToolStripMenuItem { Enabled = false, Text = "None" }; - items.Add(none); - } - else - { - foreach (var filename in recent) - { - string caption = filename; - string path = filename; - string physicalPath = filename; - bool crazyStuff = true; - - //sentinel for newer format OpenAdvanced type code - if (romloading) - { - if (filename.StartsWith("*")) - { - var oa = OpenAdvancedSerializer.ParseWithLegacy(filename); - caption = oa.DisplayName; - - crazyStuff = false; - if (oa is OpenAdvanced_OpenRom) - { - crazyStuff = true; - physicalPath = ((oa as OpenAdvanced_OpenRom).Path); - } - } - } - - //TODO - do TSMI and TSDD need disposing? yuck - var item = new ToolStripMenuItem { Text = caption }; - items.Add(item); - - item.Click += (o, ev) => - { - loadFileCallback(path); - }; - - var tsdd = new ToolStripDropDownMenu(); - - if (crazyStuff) - { - //TODO - use standard methods to split filename (hawkfile acquire?) - var hf = new HawkFile(); - hf.Parse(physicalPath); - bool canExplore = true; - if (!File.Exists(hf.FullPathWithoutMember)) - canExplore = false; - - if (canExplore) - { - //make a menuitem to show the last modified timestamp - var timestamp = File.GetLastWriteTime(hf.FullPathWithoutMember); - var tsmiTimestamp = new ToolStripLabel { Text = timestamp.ToString() }; - - tsdd.Items.Add(tsmiTimestamp); - tsdd.Items.Add(new ToolStripSeparator()); - - if (hf.IsArchive) - { - //make a menuitem to let you copy the path - var tsmiCopyCanonicalPath = new ToolStripMenuItem { Text = "&Copy Canonical Path" }; - tsmiCopyCanonicalPath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(physicalPath); }; - tsdd.Items.Add(tsmiCopyCanonicalPath); - - var tsmiCopyArchivePath = new ToolStripMenuItem { Text = "Copy Archive Path" }; - tsmiCopyArchivePath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(hf.FullPathWithoutMember); }; - tsdd.Items.Add(tsmiCopyArchivePath); - - var tsmiOpenArchive = new ToolStripMenuItem { Text = "Open &Archive" }; - tsmiOpenArchive.Click += (o, ev) => { System.Diagnostics.Process.Start(hf.FullPathWithoutMember); }; - tsdd.Items.Add(tsmiOpenArchive); - } - else - { - //make a menuitem to let you copy the path - var tsmiCopyPath = new ToolStripMenuItem { Text = "&Copy Path" }; - tsmiCopyPath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(physicalPath); }; - tsdd.Items.Add(tsmiCopyPath); - } - - tsdd.Items.Add(new ToolStripSeparator()); - - //make a menuitem to let you explore to it - var tsmiExplore = new ToolStripMenuItem { Text = "&Explore" }; - string explorePath = "\"" + hf.FullPathWithoutMember + "\""; - tsmiExplore.Click += (o, ev) => { System.Diagnostics.Process.Start("explorer.exe", "/select, " + explorePath); }; - tsdd.Items.Add(tsmiExplore); - - var tsmiCopyFile = new ToolStripMenuItem { Text = "Copy &File" }; - var lame = new System.Collections.Specialized.StringCollection(); - lame.Add(hf.FullPathWithoutMember); - tsmiCopyFile.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetFileDropList(lame); }; - tsdd.Items.Add(tsmiCopyFile); - - var tsmiTest = new ToolStripMenuItem { Text = "&Shell Context Menu" }; - tsmiTest.Click += (o, ev) => - { - var si = new GongSolutions.Shell.ShellItem(hf.FullPathWithoutMember); - var scm = new GongSolutions.Shell.ShellContextMenu(si); - var tsddi = o as ToolStripDropDownItem; - tsddi.Owner.Update(); - scm.ShowContextMenu(tsddi.Owner, new System.Drawing.Point(0, 0)); - }; - tsdd.Items.Add(tsmiTest); - - tsdd.Items.Add(new ToolStripSeparator()); - } - else - { - //make a menuitem to show the last modified timestamp - var tsmiMissingFile = new ToolStripLabel { Text = "-Missing-" }; - tsdd.Items.Add(tsmiMissingFile); - tsdd.Items.Add(new ToolStripSeparator()); - } - - } //crazystuff - - //in any case, make a menuitem to let you remove the item - var tsmiRemovePath = new ToolStripMenuItem { Text = "&Remove" }; - tsmiRemovePath.Click += (o, ev) => { - recent.Remove(path); - }; - tsdd.Items.Add(tsmiRemovePath); - - ////experiment of popping open a submenu. doesnt work well. - //item.MouseDown += (o, mev) => - //{ - // if (mev.Button != MouseButtons.Right) return; - // //location of the menu containing this item that was just rightclicked - // var pos = item.Owner.Bounds.Location; - // //the offset within that menu of this item - // var tsddi = item as ToolStripDropDownItem; - // pos.Offset(tsddi.Bounds.Location); - // //the offset of the click - // pos.Offset(mev.Location); - // //tsdd.OwnerItem = item; //has interesting promise, but breaks things otherwise - // tsdd.Show(pos); - //}; - - //just add it to the submenu for now. seems to work well enough, even though its a bit odd - item.MouseDown += (o, mev) => - { - if (mev.Button != MouseButtons.Right) return; - if (item.DropDown != null) - item.DropDown = tsdd; - item.ShowDropDown(); - }; - } - } - - items.Add(new ToolStripSeparator()); - - var clearitem = new ToolStripMenuItem { Text = "&Clear", Enabled = !recent.Frozen }; - clearitem.Click += (o, ev) => recent.Clear(); - items.Add(clearitem); - - var freezeitem = new ToolStripMenuItem { Text = recent.Frozen ? "&Unfreeze" : "&Freeze" }; - freezeitem.Click += (o, ev) => recent.Frozen ^= true; - items.Add(freezeitem); - - if (autoload) - { - var auto = new ToolStripMenuItem { Text = "&Autoload", Checked = recent.AutoLoad }; - auto.Click += (o, ev) => recent.ToggleAutoLoad(); - items.Add(auto); - } - - var settingsitem = new ToolStripMenuItem { Text = "&Recent Settings..." }; - settingsitem.Click += (o, ev) => - { - using (var prompt = new InputPrompt - { - TextInputType = InputPrompt.InputType.Unsigned, - Message = "Number of recent files to track", - InitialValue = recent.MAX_RECENT_FILES.ToString() - }) - { - var result = prompt.ShowDialog(); - if (result == DialogResult.OK) - { - int val = int.Parse(prompt.PromptText); - if (val > 0) - recent.MAX_RECENT_FILES = val; - } - } - }; - items.Add(settingsitem); - - return items.ToArray(); - } - - public static void HandleLoadError(this RecentFiles recent, string path, string encodedPath = null) - { - GlobalWin.Sound.StopSound(); - if (recent.Frozen) - { - var result = MessageBox.Show("Could not open " + path, "File not found", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - // ensure topmost, not to have to minimize everything to see and use our modal window, if it somehow got covered - var result = MessageBox.Show(new Form(){TopMost = true},"Could not open " + path + "\nRemove from list?", "File not found", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - if (result == DialogResult.Yes) - { - if (encodedPath != null) - recent.Remove(encodedPath); - else - recent.Remove(path); - } - } - - GlobalWin.Sound.StartSound(); - } - - public static void FreezeAll(this IEnumerable watches) - { - Global.CheatList.AddRange( - watches - .Where(w => !w.IsSeparator) - .Select(w => new Cheat(w, w.Value))); - } - - public static void UnfreezeAll(this IEnumerable watches) - { - Global.CheatList.RemoveRange(watches.Where(watch => !watch.IsSeparator)); - } - - public static IEnumerable MenuItems(this IMemoryDomains domains, Action setCallback, string selected = "", int? maxSize = null) - { - foreach (var domain in domains) - { - var name = domain.Name; - var item = new ToolStripMenuItem - { - Text = name, - Enabled = !(maxSize.HasValue && domain.Size > maxSize.Value), - Checked = name == selected - }; - item.Click += (o, ev) => setCallback(name); - - yield return item; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/ExternalCoreSupport.cs b/BizHawk.Client.EmuHawk/ExternalCoreSupport.cs deleted file mode 100644 index 3177ebb2bd..0000000000 --- a/BizHawk.Client.EmuHawk/ExternalCoreSupport.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Linq; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Collections.Generic; - -using BizHawk; - -namespace BizHawk.Client.EmuHawk -{ - - /// - /// accesses a shared library using LoadLibrary and GetProcAddress - /// - public class Win32LibAccessor : ILibAccessor - { - public Win32LibAccessor(string dllPath) - { - mDllHandle = LoadLibrary(dllPath); - if (mDllHandle == IntPtr.Zero) return; - IsOpen = true; - } - - public bool IsOpen { get; private set; } - - IntPtr mDllHandle; - - IntPtr ILibAccessor.GetProcAddress(string name) - { - if (!IsOpen) throw new InvalidOperationException("dll was not opened, you can't get a symbol from it"); - IntPtr ret = GetProcAddress(mDllHandle, name); - if (ret == IntPtr.Zero) throw new InvalidOperationException("symbol name was not found in dll!"); - return ret; - } - - public void Dispose() - { - if (mDllHandle == IntPtr.Zero) - FreeLibrary(mDllHandle); - mDllHandle = IntPtr.Zero; - IsOpen = false; - } - - ~Win32LibAccessor() - { - Dispose(); - } - - [DllImport("kernel32.dll")] - public static extern IntPtr LoadLibrary(string dllToLoad); - - [DllImport("kernel32.dll")] - public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); - - [DllImport("kernel32.dll")] - public static extern bool FreeLibrary(IntPtr hModule); - } - -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/FileLoader.cs b/BizHawk.Client.EmuHawk/FileLoader.cs deleted file mode 100644 index 3d49dd87a1..0000000000 --- a/BizHawk.Client.EmuHawk/FileLoader.cs +++ /dev/null @@ -1,366 +0,0 @@ -using System; -using System.IO; -using System.Windows.Forms; -using System.Linq; -using System.Collections.Generic; - -using BizHawk.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - partial class MainForm - { - private enum LoadOrdering - { - ROM, - STATE, - WATCH, - CDLFILE, - LUASESSION, - LUASCRIPT, - CHEAT, - MOVIEFILE, - LEGACYMOVIEFILE - } - - public struct FileInformation - { - public string DirectoryName { get; } - public string FileName { get; } - public string ArchiveName { get; } - - public FileInformation(string directory, string file, string archive) - { - DirectoryName = directory; - FileName = file; - ArchiveName = archive; - } - } - - // This is the list from MainForm->RomFilter()'s non-developer build. It needs to be kept up-to-date when new cores are added. - // adelikat: This is annoying and bad. Maybe we could generate RomFilter from this property? - private string[] KnownRomExtensions - { - get - { - if (VersionInfo.DeveloperBuild) - { - return new[] - { - ".NES", ".FDS", ".UNF", ".SMS", ".GG", ".SG", ".GB", ".GBC", ".GBA", ".PCE", ".SGX", ".BIN", ".SMD", ".GEN", ".MD", ".SMC", - ".SFC", ".A26", ".A78", ".LNX", ".COL", ".ROM", ".M3U", ".CUE", ".CCD", ".SGB", ".Z64", ".V64", ".N64", ".WS", ".WSC", ".XML", - ".DSK", ".DO", ".PO", ".PSF", ".MINIPSF", ".NSF", ".EXE", ".PRG", ".D64", ".G64", ".CRT", ".TAP", ".32X", ".MDS", ".TZX", - ".PZX", ".CSW", ".WAV", ".CDT" - }; - } - - return new[] - { - ".NES", ".FDS", ".UNF", ".SMS", ".GG", ".SG", ".GB", ".GBC", ".GBA", ".PCE", ".SGX", ".BIN", ".SMD", ".GEN", ".MD", ".SMC", - ".SFC", ".A26", ".A78", ".LNX", ".COL", ".ROM", ".M3U", ".CUE", ".CCD", ".SGB", ".Z64", ".V64", ".N64", ".WS", ".WSC", ".XML", - ".DSK", ".DO", ".PO", ".PSF", ".MINIPSF", ".NSF", ".PRG", ".D64", ".G64", ".CRT", ".TAP", ".32X", ".MDS", ".TZX", ".PZX", ".CSW", ".WAV" - }; - } - } - - private readonly string[] _nonArchive = { ".ISO", ".CUE", ".CCD" }; - - #region Loaders - - private void _LoadCDL(string filename, string archive = null) - { - if (GlobalWin.Tools.IsAvailable()) - { - CDL cdl = GlobalWin.Tools.Load(); - cdl.LoadFile(filename); - } - } - - private void _LoadCheats(string filename, string archive = null) - { - Global.CheatList.Load(filename, false); - GlobalWin.Tools.Load(); - } - - private void _LoadLegacyMovie(string filename, string archive = null) - { - if (Global.Emulator.IsNull()) - { - OpenRom(); - } - - if (Global.Emulator.IsNull()) - { - return; - } - - // tries to open a legacy movie format by importing it - string errorMsg; - string warningMsg; - var movie = MovieImport.ImportFile(filename, out errorMsg, out warningMsg); - if (!string.IsNullOrEmpty(errorMsg)) - { - MessageBox.Show(errorMsg, "Conversion error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - // fix movie extension to something palatable for these purposes. - // for instance, something which doesnt clobber movies you already may have had. - // i'm evenly torn between this, and a file in %TEMP%, but since we dont really have a way to clean up this tempfile, i choose this: - StartNewMovie(movie, false); - } - - GlobalWin.OSD.AddMessage(warningMsg); - } - - private void _LoadLuaFile(string filename, string archive = null) - { - OpenLuaConsole(); - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LoadLuaFile(filename); - } - } - - private void _LoadLuaSession(string filename, string archive = null) - { - OpenLuaConsole(); - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LoadLuaSession(filename); - } - } - - private void _LoadMovie(string filename, string archive = null) - { - if (Global.Emulator.IsNull()) - { - OpenRom(); - } - - if (Global.Emulator.IsNull()) - { - return; - } - - StartNewMovie(MovieService.Get(filename), false); - } - - private void _LoadRom(string filename, string archive = null) - { - var args = new LoadRomArgs(); - args.OpenAdvanced = new OpenAdvanced_OpenRom { Path = filename }; - LoadRom(filename, args); - } - - private void _LoadState(string filename, string archive = null) - { - LoadState(filename, Path.GetFileName(filename)); - } - - private void _LoadWatch(string filename, string archive = null) - { - GlobalWin.Tools.LoadRamWatch(true); - (GlobalWin.Tools.Get() as RamWatch).LoadWatchFile(new FileInfo(filename), false); - } - - #endregion - - private void ProcessFileList(IEnumerable fileList, ref Dictionary> sortedFiles, string archive = null) - { - foreach (string file in fileList) - { - var ext = Path.GetExtension(file).ToUpper() ?? ""; - FileInformation fileInformation = new FileInformation(Path.GetDirectoryName(file), Path.GetFileName(file), archive); - - switch (ext) - { - case ".LUA": - sortedFiles[LoadOrdering.LUASCRIPT].Add(fileInformation); - break; - case ".LUASES": - sortedFiles[LoadOrdering.LUASESSION].Add(fileInformation); - break; - case ".STATE": - sortedFiles[LoadOrdering.STATE].Add(fileInformation); - break; - case ".CHT": - sortedFiles[LoadOrdering.CHEAT].Add(fileInformation); - break; - case ".WCH": - sortedFiles[LoadOrdering.WATCH].Add(fileInformation); - break; - case ".CDL": - sortedFiles[LoadOrdering.CDLFILE].Add(fileInformation); - break; - default: - if (MovieService.IsValidMovieExtension(ext)) - { - sortedFiles[LoadOrdering.MOVIEFILE].Add(fileInformation); - } - else if (MovieImport.IsValidMovieExtension(ext)) - { - sortedFiles[LoadOrdering.LEGACYMOVIEFILE].Add(fileInformation); - } - else if (KnownRomExtensions.Contains(ext)) - { - if (string.IsNullOrEmpty(archive) || !_nonArchive.Contains(ext)) - { - sortedFiles[LoadOrdering.ROM].Add(fileInformation); - } - } - else - { - /* Because the existing behaviour for archives is to try loading - * ROMs out of them, that is exactly what we are going to continue - * to do at present. Ideally, the archive should be scanned and - * relevant files should be extracted, but see the note below for - * further details. - */ - int offset = 0; - bool executable = false; - var archiveHandler = new SevenZipSharpArchiveHandler(); - - if (string.IsNullOrEmpty(archive) && archiveHandler.CheckSignature(file, out offset, out executable)) - { - sortedFiles[LoadOrdering.ROM].Add(fileInformation); - } - else - { - // adelikat: adding this hack to restore the default behavior that unrecognized files are treated like roms - sortedFiles[LoadOrdering.ROM].Add(fileInformation); - } - - /* - * This is where handling archives would go. - * Right now, that's going to be a HUGE hassle, because of the problem with - * saving things into the archive (no) and with everything requiring filenames - * and not streams (also no), so for the purposes of making drag/drop more robust, - * I am not building this out just yet. - * -- Adam Michaud (Invariel) - - int offset = 0; - bool executable = false; - var archiveHandler = new SevenZipSharpArchiveHandler(); - - // Not going to process nested archives at the moment. - if (String.IsNullOrEmpty (archive) && archiveHandler.CheckSignature(file, out offset, out executable)) - { - List fileNames = new List(); - var openedArchive = archiveHandler.Construct (file); - - foreach (BizHawk.Common.HawkFileArchiveItem item in openedArchive.Scan ()) - fileNames.Add(item.Name); - - ProcessFileList(fileNames.ToArray(), ref sortedFiles, file); - - openedArchive.Dispose(); - } - archiveHandler.Dispose(); - */ - } - break; - } - } - } - - private void _FormDragDrop_internal(object sender, DragEventArgs e) - { - /* - * Refactor, moving the loading of particular files into separate functions that can - * then be used by this code, and loading individual files through the file dialogue. - * - * Step 1: - * Build a dictionary of relevant files from everything that was dragged and dropped. - * This includes peeking into all relevant archives and using their files. - * - * Step 2: - * Perhaps ask the user which of a particular file type they want to use. - * Example: rom1.nes, rom2.smc, rom3.cue are drag-dropped, ask the user which they want to use. - * - * Step 3: - * Load all of the relevant files, in priority order: - * 1) The ROM - * 2) State - * 3) Watch files - * 4) Code Data Logger (CDL) - * 5) LUA sessions - * 6) LUA scripts - * 7) Cheat files - * 8) Movie Playback Files - * - * Bonus: - * Make that order easy to change in the code, heavily suggesting ROM and playback as first and last respectively. - */ - - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - Dictionary> sortedFiles = new Dictionary>(); - - // Initialize the dictionary's lists. - foreach (LoadOrdering value in Enum.GetValues(typeof(LoadOrdering))) - { - sortedFiles.Add(value, new List()); - } - - ProcessFileList(HawkFile.Util_ResolveLinks(filePaths), ref sortedFiles, null); - - // For each of the different types of item, if there are no items of that type, skip them. - // If there is exactly one of that type of item, load it. - // If there is more than one, ask. - - foreach (LoadOrdering value in Enum.GetValues(typeof(LoadOrdering))) - { - switch (sortedFiles[value].Count) - { - case 0: - break; - case 1: - FileInformation fileInformation = sortedFiles[value].First(); - string filename = Path.Combine(new string[] { fileInformation.DirectoryName, fileInformation.FileName }); - - switch (value) - { - case LoadOrdering.ROM: - _LoadRom(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.STATE: - _LoadState(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.WATCH: - _LoadWatch(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.CDLFILE: - _LoadCDL(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.LUASESSION: - _LoadLuaSession(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.LUASCRIPT: - _LoadLuaFile(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.CHEAT: - _LoadCheats(filename, fileInformation.ArchiveName); - break; - case LoadOrdering.MOVIEFILE: - case LoadOrdering.LEGACYMOVIEFILE: - // I don't really like this hack, but for now, we only want to load one movie file. - if (sortedFiles[LoadOrdering.MOVIEFILE].Count + sortedFiles[LoadOrdering.LEGACYMOVIEFILE].Count > 1) - break; - - if (value == LoadOrdering.MOVIEFILE) - _LoadMovie(filename, fileInformation.ArchiveName); - else - _LoadLegacyMovie(filename, fileInformation.ArchiveName); - break; - } - break; - default: - break; - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/GLManager.cs b/BizHawk.Client.EmuHawk/GLManager.cs deleted file mode 100644 index 6ea3476a18..0000000000 --- a/BizHawk.Client.EmuHawk/GLManager.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using BizHawk.Bizware.BizwareGL; - - -namespace BizHawk.Client.EmuHawk -{ - /// - /// This singleton class manages OpenGL contexts, in an effort to minimize context changes. - /// - public class GLManager : IDisposable - { - private GLManager() - { - - } - - public void Dispose() - { - } - - public static GLManager Instance { get; private set; } - - Bizware.BizwareGL.Drivers.OpenTK.IGL_TK MainContext; - - public static void CreateInstance(Bizware.BizwareGL.Drivers.OpenTK.IGL_TK mainContext) - { - if (Instance != null) throw new InvalidOperationException("Attempt to create more than one GLManager"); - Instance = new GLManager(); - Instance.MainContext = mainContext; - } - - public void ReleaseGLContext(object o) - { - ContextRef cr = (ContextRef)o; - cr.gl.Dispose(); - } - - //[System.Runtime.InteropServices.DllImport("opengl32.dll")] - //bool wglShareLists(IntPtr hglrc1, IntPtr hglrc2); - - public ContextRef CreateGLContext(int major_version, int minor_version, bool forward_compatible) - { - var gl = new Bizware.BizwareGL.Drivers.OpenTK.IGL_TK(major_version, minor_version, forward_compatible); - var ret = new ContextRef { gl = gl }; - return ret; - } - - public ContextRef GetContextForGraphicsControl(GraphicsControl gc) - { - return new ContextRef - { - gc = gc, - gl = gc.IGL - }; - } - - /// - /// This might not be a GL implementation. If it isnt GL, then setting it as active context is just NOP - /// - public ContextRef GetContextForIGL(IGL gl) - { - return new ContextRef - { - gl = gl - }; - } - - ContextRef ActiveContext; - - public void Invalidate() - { - ActiveContext = null; - } - - public void Activate(ContextRef cr) - { - bool begun = false; - - //this needs a begin signal to set the swap chain to the next backbuffer - if (cr.gl is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9) - { - cr.gc.Begin(); - begun = true; - } - - if (cr == ActiveContext) - return; - - ActiveContext = cr; - if (cr.gc != null) - { - //TODO - this is checking the current context inside to avoid an extra NOP context change. make this optional or remove it, since we're tracking it here - if(!begun) - cr.gc.Begin(); - } - else if (cr.gl != null) - { - if(cr.gl is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK) - ((BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK)cr.gl).MakeDefaultCurrent(); - } - } - - public void Deactivate() - { - //this is here for future use and tracking purposes.. however.. instead of relying on this, we should just make sure we always activate what we need before we use it - } - - public class ContextRef - { - public IGL gl; - public GraphicsControl gc; - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Global.cs b/BizHawk.Client.EmuHawk/Global.cs deleted file mode 100644 index ad2d44fa78..0000000000 --- a/BizHawk.Client.EmuHawk/Global.cs +++ /dev/null @@ -1,145 +0,0 @@ -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.DiscSystem; - -namespace BizHawk.Client.Common -{ - public static class Global - { - public static IEmulator Emulator; - public static CoreComm CoreComm; - public static Config Config; - public static GameInfo Game; - public static CheatCollection CheatList; - public static FirmwareManager FirmwareManager; - public static Rewinder Rewinder; - - public static MovieSession MovieSession = new MovieSession(); - - /// - /// whether throttling is force-disabled by use of fast forward - /// - public static bool ForceNoThrottle; - - public static Controller NullControls; - public static AutofireController AutofireNullControls; - - //the movie will be spliced inbetween these if it is present - public static CopyControllerAdapter MovieInputSourceAdapter = new CopyControllerAdapter(); - public static CopyControllerAdapter MovieOutputHardpoint = new CopyControllerAdapter(); - public static MultitrackRewiringControllerAdapter MultitrackRewiringAdapter = new MultitrackRewiringControllerAdapter(); - - //dont take my word for it, since the final word is actually in RewireInputChain, but here is a guide... - //user -> Input -> ActiveController -> UDLR -> StickyXORPlayerInputAdapter -> TurboAdapter(TBD) -> Lua(?TBD?) -> .. - //.. -> MultitrackRewiringControllerAdapter -> MovieInputSourceAdapter -> (MovieSession) -> MovieOutputAdapter -> ControllerOutput(1) -> Game - //(1)->Input Display - - //the original source controller, bound to the user, sort of the "input" port for the chain, i think - public static Controller ActiveController; - - //rapid fire version on the user controller, has its own key bindings and is OR'ed against ActiveController - public static AutofireController AutoFireController; - - //the "output" port for the controller chain. - public static CopyControllerAdapter ControllerOutput = new CopyControllerAdapter(); - - public static DiscHopper DiscHopper = new DiscHopper(); - - public static UD_LR_ControllerAdapter UD_LR_ControllerAdapter = new UD_LR_ControllerAdapter(); - - public static AutoFireStickyXorAdapter AutofireStickyXORAdapter = new AutoFireStickyXorAdapter(); - - /// - /// provides an opportunity to mutate the player's input in an autohold style - /// - public static StickyXorAdapter StickyXORAdapter = new StickyXorAdapter(); - - /// - /// Used to AND to another controller, used for Joypad.Set() - /// - public static OverrideAdaptor LuaAndAdaptor = new OverrideAdaptor(); - - /// - /// fire off one-frame logical button clicks here. useful for things like ti-83 virtual pad and reset buttons - /// - public static ClickyVirtualPadController ClickyVirtualPadController = new ClickyVirtualPadController(); - - public static SimpleController MovieOutputController = new SimpleController(); - - public static Controller ClientControls; - - // Input state which has been estine for game controller inputs are coalesce here - // This relies on a client specific implementation! - public static SimpleController ControllerInputCoalescer; - - public static SystemInfo SystemInfo - { - get - { - switch(Global.Emulator.SystemId) - { - default: - case "NULL": - return SystemInfo.Null; - case "NES": - return SystemInfo.Nes; - case "INTV": - return SystemInfo.Intellivision; - case "SG": - return SystemInfo.SG; - case "SMS": - if ((Global.Emulator as SMS).IsGameGear) - { - return SystemInfo.GG; - } - else if ((Global.Emulator as SMS).IsSG1000) - { - return SystemInfo.SG; - } - - return SystemInfo.SMS; - case "PCECD": - return SystemInfo.PCECD; - case "PCE": - return SystemInfo.PCE; - case "SGX": - return SystemInfo.SGX; - case "GEN": - return SystemInfo.Genesis; - case "TI83": - return SystemInfo.TI83; - case "SNES": - return SystemInfo.SNES; - case "GB": - if ((Global.Emulator as Gameboy).IsCGBMode()) - { - return SystemInfo.GBC; - } - - return SystemInfo.GB; - case "A26": - return SystemInfo.Atari2600; - case "A78": - return SystemInfo.Atari7800; - case "C64": - return SystemInfo.C64; - case "Coleco": - return SystemInfo.Coleco; - case "GBA": - return SystemInfo.GBA; - case "N64": - return SystemInfo.N64; - case "SAT": - return SystemInfo.Saturn; - case "DGB": - return SystemInfo.DualGB; - case "WSWAN": - return SystemInfo.WonderSwan; - case "LYNX": - return SystemInfo.Lynx; - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/GlobalWin.cs b/BizHawk.Client.EmuHawk/GlobalWin.cs deleted file mode 100644 index 06a2bbaab5..0000000000 --- a/BizHawk.Client.EmuHawk/GlobalWin.cs +++ /dev/null @@ -1,33 +0,0 @@ -using BizHawk.Bizware.BizwareGL; -using BizHawk.Client.ApiHawk; - -// ReSharper disable StyleCop.SA1401 -namespace BizHawk.Client.EmuHawk -{ - public static class GlobalWin - { - public static MainForm MainForm; - public static ToolManager Tools; - public static BasicApiProvider ApiProvider; - - /// - /// the IGL to be used for rendering - /// - public static IGL GL; - - /// - /// The IGL_TK to be used for specifically opengl operations (accessing textures from opengl-based cores) - /// - public static Bizware.BizwareGL.Drivers.OpenTK.IGL_TK IGL_GL; - - public static Sound Sound; - public static readonly OSDManager OSD = new OSDManager(); - public static DisplayManager DisplayManager; - public static GLManager GLManager; - - public static int ExitCode; - public static Communication.HttpCommunication httpCommunication = new Communication.HttpCommunication(); - public static Communication.SocketServer socketServer = new Communication.SocketServer(); - public static Communication.MemoryMappedFiles memoryMappedFiles = new Communication.MemoryMappedFiles(); - } -} diff --git a/BizHawk.Client.EmuHawk/Input/GamePad.cs b/BizHawk.Client.EmuHawk/Input/GamePad.cs deleted file mode 100644 index 76cc1355cc..0000000000 --- a/BizHawk.Client.EmuHawk/Input/GamePad.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System; -using System.Collections.Generic; -using SlimDX; -using SlimDX.DirectInput; - -namespace BizHawk.Client.EmuHawk -{ - public class GamePad - { - // ********************************** Static interface ********************************** - - private static readonly object _syncObj = new object(); - private static readonly List _devices = new List(); - private static DirectInput _dinput; - - public static void Initialize() - { - lock (_syncObj) - { - Cleanup(); - - _dinput = new DirectInput(); - - foreach (DeviceInstance device in _dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly)) - { - Console.WriteLine("joydevice: {0} `{1}`", device.InstanceGuid, device.ProductName); - - if (device.ProductName.Contains("XBOX 360")) - continue; // Don't input XBOX 360 controllers into here; we'll process them via XInput (there are limitations in some trigger axes when xbox pads go over xinput) - - var joystick = new Joystick(_dinput, device.InstanceGuid); - joystick.SetCooperativeLevel(GlobalWin.MainForm.Handle, CooperativeLevel.Background | CooperativeLevel.Nonexclusive); - foreach (DeviceObjectInstance deviceObject in joystick.GetObjects()) - { - if ((deviceObject.ObjectType & ObjectDeviceType.Axis) != 0) - joystick.GetObjectPropertiesById((int)deviceObject.ObjectType).SetRange(-1000, 1000); - } - joystick.Acquire(); - - GamePad p = new GamePad(device.InstanceName, device.InstanceGuid, joystick, _devices.Count); - _devices.Add(p); - } - } - } - - public static IEnumerable EnumerateDevices() - { - lock (_syncObj) - { - foreach (var device in _devices) - { - yield return device; - } - } - } - - public static void UpdateAll() - { - lock (_syncObj) - { - foreach (var device in _devices) - { - device.Update(); - } - } - } - - public static void Cleanup() - { - lock (_syncObj) - { - foreach (var device in _devices) - { - device.joystick.Dispose(); - } - _devices.Clear(); - - if (_dinput != null) - { - _dinput.Dispose(); - _dinput = null; - } - } - } - - // ********************************** Instance Members ********************************** - - readonly string name; - readonly Guid guid; - readonly Joystick joystick; - JoystickState state = new JoystickState(); - - GamePad(string name, Guid guid, Joystick joystick, int index) - { - this.name = name; - this.guid = guid; - this.joystick = joystick; - PlayerNumber = index + 1; - Update(); - InitializeCallbacks(); - } - - public void Update() - { - try - { - if (joystick.Acquire().IsFailure) - return; - } - catch - { - return; - } - if (joystick.Poll().IsFailure) - return; - - state = joystick.GetCurrentState(); - if (Result.Last.IsFailure) - // do something? - return; - } - - public IEnumerable> GetFloats() - { - var pis = typeof(JoystickState).GetProperties(); - foreach (var pi in pis) - yield return new Tuple(pi.Name, 10.0f * (float)(int)pi.GetValue(state, null)); - } - - /// FOR DEBUGGING ONLY - public JoystickState GetInternalState() - { - return state; - } - - public string Name { get { return name; } } - public Guid Guid { get { return guid; } } - public int PlayerNumber { get; private set; } - - public string ButtonName(int index) - { - return names[index]; - } - public bool Pressed(int index) - { - return actions[index](); - } - public int NumButtons { get; private set; } - - private readonly List names = new List(); - private readonly List> actions = new List>(); - - void AddItem(string _name, Func callback) - { - names.Add(_name); - actions.Add(callback); - NumButtons++; - } - - void InitializeCallbacks() - { - const int dzp = 400; - const int dzn = -400; - - names.Clear(); - actions.Clear(); - NumButtons = 0; - - AddItem("AccelerationX+", () => state.AccelerationX >= dzp); - AddItem("AccelerationX-", () => state.AccelerationX <= dzn); - AddItem("AccelerationY+", () => state.AccelerationY >= dzp); - AddItem("AccelerationY-", () => state.AccelerationY <= dzn); - AddItem("AccelerationZ+", () => state.AccelerationZ >= dzp); - AddItem("AccelerationZ-", () => state.AccelerationZ <= dzn); - AddItem("AngularAccelerationX+", () => state.AngularAccelerationX >= dzp); - AddItem("AngularAccelerationX-", () => state.AngularAccelerationX <= dzn); - AddItem("AngularAccelerationY+", () => state.AngularAccelerationY >= dzp); - AddItem("AngularAccelerationY-", () => state.AngularAccelerationY <= dzn); - AddItem("AngularAccelerationZ+", () => state.AngularAccelerationZ >= dzp); - AddItem("AngularAccelerationZ-", () => state.AngularAccelerationZ <= dzn); - AddItem("AngularVelocityX+", () => state.AngularVelocityX >= dzp); - AddItem("AngularVelocityX-", () => state.AngularVelocityX <= dzn); - AddItem("AngularVelocityY+", () => state.AngularVelocityY >= dzp); - AddItem("AngularVelocityY-", () => state.AngularVelocityY <= dzn); - AddItem("AngularVelocityZ+", () => state.AngularVelocityZ >= dzp); - AddItem("AngularVelocityZ-", () => state.AngularVelocityZ <= dzn); - AddItem("ForceX+", () => state.ForceX >= dzp); - AddItem("ForceX-", () => state.ForceX <= dzn); - AddItem("ForceY+", () => state.ForceY >= dzp); - AddItem("ForceY-", () => state.ForceY <= dzn); - AddItem("ForceZ+", () => state.ForceZ >= dzp); - AddItem("ForceZ-", () => state.ForceZ <= dzn); - AddItem("RotationX+", () => state.RotationX >= dzp); - AddItem("RotationX-", () => state.RotationX <= dzn); - AddItem("RotationY+", () => state.RotationY >= dzp); - AddItem("RotationY-", () => state.RotationY <= dzn); - AddItem("RotationZ+", () => state.RotationZ >= dzp); - AddItem("RotationZ-", () => state.RotationZ <= dzn); - AddItem("TorqueX+", () => state.TorqueX >= dzp); - AddItem("TorqueX-", () => state.TorqueX <= dzn); - AddItem("TorqueY+", () => state.TorqueY >= dzp); - AddItem("TorqueY-", () => state.TorqueY <= dzn); - AddItem("TorqueZ+", () => state.TorqueZ >= dzp); - AddItem("TorqueZ-", () => state.TorqueZ <= dzn); - AddItem("VelocityX+", () => state.VelocityX >= dzp); - AddItem("VelocityX-", () => state.VelocityX <= dzn); - AddItem("VelocityY+", () => state.VelocityY >= dzp); - AddItem("VelocityY-", () => state.VelocityY <= dzn); - AddItem("VelocityZ+", () => state.VelocityZ >= dzp); - AddItem("VelocityZ-", () => state.VelocityZ <= dzn); - AddItem("X+", () => state.X >= dzp); - AddItem("X-", () => state.X <= dzn); - AddItem("Y+", () => state.Y >= dzp); - AddItem("Y-", () => state.Y <= dzn); - AddItem("Z+", () => state.Z >= dzp); - AddItem("Z-", () => state.Z <= dzn); - - // i don't know what the "Slider"s do, so they're omitted for the moment - - for (int i = 0; i < state.GetButtons().Length; i++) - { - int j = i; - AddItem(string.Format("B{0}", i + 1), () => state.IsPressed(j)); - } - - for (int i = 0; i < state.GetPointOfViewControllers().Length; i++) - { - int j = i; - AddItem(string.Format("POV{0}U", i + 1), - () => { int t = state.GetPointOfViewControllers()[j]; return (t >= 0 && t <= 4500) || (t >= 31500 && t < 36000); }); - AddItem(string.Format("POV{0}D", i + 1), - () => { int t = state.GetPointOfViewControllers()[j]; return t >= 13500 && t <= 22500; }); - AddItem(string.Format("POV{0}L", i + 1), - () => { int t = state.GetPointOfViewControllers()[j]; return t >= 22500 && t <= 31500; }); - AddItem(string.Format("POV{0}R", i + 1), - () => { int t = state.GetPointOfViewControllers()[j]; return t >= 4500 && t <= 13500; }); - } - } - - // Note that this does not appear to work at this time. I probably need to have more infos. - public void SetVibration(int left, int right) - { - int[] temp1, temp2; - // my first clue that it doesnt work is that LEFT and RIGHT _ARENT USED_ - // I should just look for C++ examples instead of trying to look for SlimDX examples - - var parameters = new EffectParameters - { - Duration = 0x2710, - Gain = 0x2710, - SamplePeriod = 0, - TriggerButton = 0, - TriggerRepeatInterval = 0x2710, - Flags = EffectFlags.None - }; - parameters.GetAxes(out temp1, out temp2); - parameters.SetAxes(temp1, temp2); - var effect = new Effect(joystick, EffectGuid.ConstantForce); - effect.SetParameters(parameters); - effect.Start(1); - } - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Input/GamePad360.cs b/BizHawk.Client.EmuHawk/Input/GamePad360.cs deleted file mode 100644 index 2d77a44485..0000000000 --- a/BizHawk.Client.EmuHawk/Input/GamePad360.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using SlimDX.XInput; - -#pragma warning disable 169 -#pragma warning disable 414 - -namespace BizHawk.Client.EmuHawk -{ - public class GamePad360 - { - // ********************************** Static interface ********************************** - - private static readonly object _syncObj = new object(); - private static readonly List _devices = new List(); - private static readonly bool _isAvailable; - - [DllImport("kernel32", SetLastError = true, EntryPoint = "GetProcAddress")] - static extern IntPtr GetProcAddressOrdinal(IntPtr hModule, IntPtr procName); - - delegate uint XInputGetStateExProcDelegate(uint dwUserIndex, out XINPUT_STATE state); - - static bool HasGetInputStateEx; - static IntPtr LibraryHandle; - static XInputGetStateExProcDelegate XInputGetStateExProc; - - struct XINPUT_GAMEPAD - { - public ushort wButtons; - public byte bLeftTrigger; - public byte bRightTrigger; - public short sThumbLX; - public short sThumbLY; - public short sThumbRX; - public short sThumbRY; - } - - struct XINPUT_STATE - { - public uint dwPacketNumber; - public XINPUT_GAMEPAD Gamepad; - } - - static GamePad360() - { - try - { - //some users wont even have xinput installed. in order to avoid spurious exceptions and possible instability, check for the library first - HasGetInputStateEx = true; - LibraryHandle = Win32.LoadLibrary("xinput1_3.dll"); - if(LibraryHandle == IntPtr.Zero) - LibraryHandle = Win32.LoadLibrary("xinput1_4.dll"); - if(LibraryHandle == IntPtr.Zero) - { - LibraryHandle = Win32.LoadLibrary("xinput9_1_0.dll"); - HasGetInputStateEx = false; - } - - if (LibraryHandle != IntPtr.Zero) - { - if (HasGetInputStateEx) - { - IntPtr proc = GetProcAddressOrdinal(LibraryHandle, new IntPtr(100)); - XInputGetStateExProc = (XInputGetStateExProcDelegate)Marshal.GetDelegateForFunctionPointer(proc, typeof(XInputGetStateExProcDelegate)); - } - - //don't remove this code. it's important to catch errors on systems with broken xinput installs. - //(probably, checking for the library was adequate, but lets not get rid of this anyway) - var test = new SlimDX.XInput.Controller(UserIndex.One).IsConnected; - _isAvailable = true; - } - } - catch { } - } - - public static void Initialize() - { - lock (_syncObj) - { - _devices.Clear(); - - if (!_isAvailable) - return; - - //now, at this point, slimdx may be using one xinput, and we may be using another - //i'm not sure how slimdx picks its dll to bind to. - //i'm not sure how troublesome this will be - //maybe we should get rid of slimdx for this altogether - - var c1 = new Controller(UserIndex.One); - var c2 = new Controller(UserIndex.Two); - var c3 = new Controller(UserIndex.Three); - var c4 = new Controller(UserIndex.Four); - - if (c1.IsConnected) _devices.Add(new GamePad360(0, c1)); - if (c2.IsConnected) _devices.Add(new GamePad360(1, c2)); - if (c3.IsConnected) _devices.Add(new GamePad360(2, c3)); - if (c4.IsConnected) _devices.Add(new GamePad360(3, c4)); - } - } - - public static IEnumerable EnumerateDevices() - { - lock (_syncObj) - { - foreach (var device in _devices) - { - yield return device; - } - } - } - - public static void UpdateAll() - { - lock (_syncObj) - { - foreach (var device in _devices) - { - device.Update(); - } - } - } - - // ********************************** Instance Members ********************************** - - readonly Controller controller; - uint index0; - XINPUT_STATE state; - - public int PlayerNumber { get { return (int)index0 + 1; } } - - GamePad360(uint index0, Controller c) - { - this.index0 = index0; - controller = c; - InitializeButtons(); - Update(); - } - - public void Update() - { - if (controller.IsConnected == false) - return; - - if (XInputGetStateExProc != null) - { - state = new XINPUT_STATE(); - XInputGetStateExProc(index0, out state); - } - else - { - var slimstate = controller.GetState(); - state.dwPacketNumber = slimstate.PacketNumber; - state.Gamepad.wButtons = (ushort)slimstate.Gamepad.Buttons; - state.Gamepad.sThumbLX = slimstate.Gamepad.LeftThumbX; - state.Gamepad.sThumbLY = slimstate.Gamepad.LeftThumbY; - state.Gamepad.sThumbRX = slimstate.Gamepad.RightThumbX; - state.Gamepad.sThumbRY = slimstate.Gamepad.RightThumbY; - state.Gamepad.bLeftTrigger = slimstate.Gamepad.LeftTrigger; - state.Gamepad.bRightTrigger = slimstate.Gamepad.RightTrigger; - } - } - - public IEnumerable> GetFloats() - { - var g = state.Gamepad; - - //constant for adapting a +/- 32768 range to a +/-10000-based range - const float f = 32768 / 10000.0f; - - //since our whole input framework really only understands whole axes, let's make the triggers look like an axis - float ltrig = g.bLeftTrigger / 255.0f * 2 - 1; - float rtrig = g.bRightTrigger / 255.0f * 2 - 1; - ltrig *= 10000; - rtrig *= 10000; - - yield return new Tuple("LeftThumbX", g.sThumbLX / f); - yield return new Tuple("LeftThumbY", g.sThumbLY / f); - yield return new Tuple("RightThumbX", g.sThumbRX / f); - yield return new Tuple("RightThumbY", g.sThumbRY / f); - yield return new Tuple("LeftTrigger", ltrig); - yield return new Tuple("RightTrigger", rtrig); - yield break; - } - - public int NumButtons { get; private set; } - - private readonly List names = new List(); - private readonly List> actions = new List>(); - - void InitializeButtons() - { - const int dzp = 20000; - const int dzn = -20000; - const int dzt = 40; - - AddItem("A", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.A) != 0); - AddItem("B", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.B) != 0); - AddItem("X", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.X) != 0); - AddItem("Y", () => (state.Gamepad.wButtons & unchecked((ushort)GamepadButtonFlags.Y)) != 0); - AddItem("Guide", () => (state.Gamepad.wButtons & 1024) != 0); - - AddItem("Start", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.Start) != 0); - AddItem("Back", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.Back) != 0); - AddItem("LeftThumb", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.LeftThumb) != 0); - AddItem("RightThumb", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.RightThumb) != 0); - AddItem("LeftShoulder", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.LeftShoulder) != 0); - AddItem("RightShoulder", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.RightShoulder) != 0); - - AddItem("DpadUp", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.DPadUp) != 0); - AddItem("DpadDown", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.DPadDown) != 0); - AddItem("DpadLeft", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.DPadLeft) != 0); - AddItem("DpadRight", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.DPadRight) != 0); - - AddItem("LStickUp", () => state.Gamepad.sThumbLY >= dzp); - AddItem("LStickDown", () => state.Gamepad.sThumbLY <= dzn); - AddItem("LStickLeft", () => state.Gamepad.sThumbLX <= dzn); - AddItem("LStickRight", () => state.Gamepad.sThumbLX >= dzp); - - AddItem("RStickUp", () => state.Gamepad.sThumbRY >= dzp); - AddItem("RStickDown", () => state.Gamepad.sThumbRY <= dzn); - AddItem("RStickLeft", () => state.Gamepad.sThumbRX <= dzn); - AddItem("RStickRight", () => state.Gamepad.sThumbRX >= dzp); - - AddItem("LeftTrigger", () => state.Gamepad.bLeftTrigger > dzt); - AddItem("RightTrigger", () => state.Gamepad.bRightTrigger > dzt); - } - - void AddItem(string name, Func pressed) - { - names.Add(name); - actions.Add(pressed); - NumButtons++; - } - - public string ButtonName(int index) - { - return names[index]; - } - - public bool Pressed(int index) - { - return actions[index](); - } - } -} diff --git a/BizHawk.Client.EmuHawk/Input/IPCKeyInput.cs b/BizHawk.Client.EmuHawk/Input/IPCKeyInput.cs deleted file mode 100644 index 72d5c7866c..0000000000 --- a/BizHawk.Client.EmuHawk/Input/IPCKeyInput.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System; -using System.Threading; -using System.IO.Pipes; -using SlimDX; -using SlimDX.DirectInput; - -//this is not a very safe or pretty protocol, I'm not proud of it - -namespace BizHawk.Client.EmuHawk -{ - public static class IPCKeyInput - { - public static void Initialize() - { - var t = new Thread(IPCThread); - t.IsBackground = true; - t.Start(); - } - - - static List PendingEventList = new List(); - static List EventList = new List(); - - static void IPCThread() - { - string pipeName = string.Format("bizhawk-pid-{0}-IPCKeyInput", System.Diagnostics.Process.GetCurrentProcess().Id); - - - for (; ; ) - { - using (NamedPipeServerStream pipe = new NamedPipeServerStream(pipeName, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, 1024, 1024)) - { - try - { - pipe.WaitForConnection(); - - BinaryReader br = new BinaryReader(pipe); - - for (; ; ) - { - int e = br.ReadInt32(); - bool pressed = (e & 0x80000000) != 0; - lock (PendingEventList) - PendingEventList.Add(new KeyInput.KeyEvent { Key = (Key)(e & 0x7FFFFFFF), Pressed = pressed }); - } - } - catch { } - } - } - } - - public static IEnumerable Update() - { - EventList.Clear(); - - lock (PendingEventList) - { - EventList.AddRange(PendingEventList); - PendingEventList.Clear(); - } - - return EventList; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Input/Input.cs b/BizHawk.Client.EmuHawk/Input/Input.cs deleted file mode 100644 index 0727baeffe..0000000000 --- a/BizHawk.Client.EmuHawk/Input/Input.cs +++ /dev/null @@ -1,544 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using System.Threading; - -using SlimDX.DirectInput; - -using BizHawk.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - //coalesces events back into instantaneous states - public class InputCoalescer : SimpleController - { - public void Receive(Input.InputEvent ie) - { - bool state = ie.EventType == Input.InputEventType.Press; - - string button = ie.LogicalButton.ToString(); - Buttons[button] = state; - - //when a button is released, all modified variants of it are released as well - if (!state) - { - var releases = Buttons.Where(kvp => kvp.Key.Contains("+") && kvp.Key.EndsWith(ie.LogicalButton.Button)).ToArray(); - foreach (var kvp in releases) - Buttons[kvp.Key] = false; - } - } - } - - public class ControllerInputCoalescer : SimpleController - { - public void Receive(Input.InputEvent ie) - { - bool state = ie.EventType == Input.InputEventType.Press; - - string button = ie.LogicalButton.ToString(); - Buttons[button] = state; - - //For controller input, we want Shift+X to register as both Shift and X (for Keyboard controllers) - string[] subgroups = button.Split('+'); - if (subgroups.Length > 0) - { - foreach (string s in subgroups) - { - Buttons[s] = state; - } - } - - //when a button is released, all modified variants of it are released as well - if (!state) - { - var releases = Buttons.Where((kvp) => kvp.Key.Contains("+") && kvp.Key.EndsWith(ie.LogicalButton.Button)).ToArray(); - foreach (var kvp in releases) - Buttons[kvp.Key] = false; - } - } - } - - public class Input - { - [Flags] - public enum InputFocus - { - None = 0, - Mouse = 1, - Keyboard = 2, - Pad = 4 - } - - /// - /// If your form needs this kind of input focus, be sure to say so. - /// Really, this only makes sense for mouse, but I've started building it out for other things - /// Why is this receiving a control, but actually using it as a Form (where the WantingMouseFocus is checked?) - /// Because later we might change it to work off the control, specifically, if a control is supplied (normally actually a Form will be supplied) - /// - public void ControlInputFocus(System.Windows.Forms.Control c, InputFocus types, bool wants) - { - if (types.HasFlag(InputFocus.Mouse) && wants) WantingMouseFocus.Add(c); - if (types.HasFlag(InputFocus.Mouse) && !wants) WantingMouseFocus.Remove(c); - } - - HashSet WantingMouseFocus = new HashSet(); - - [Flags] - public enum ModifierKey - { - // Summary: - // The bitmask to extract modifiers from a key value. - Modifiers = -65536, - // - // Summary: - // No key pressed. - None = 0, - // - // Summary: - // The SHIFT modifier key. - Shift = 65536, - // - // Summary: - // The CTRL modifier key. - Control = 131072, - // - // Summary: - // The ALT modifier key. - Alt = 262144, - } - - public static Input Instance { get; private set; } - readonly Thread UpdateThread; - - private Input() - { - UpdateThread = new Thread(UpdateThreadProc) - { - IsBackground = true, - Priority = ThreadPriority.AboveNormal //why not? this thread shouldn't be very heavy duty, and we want it to be responsive - }; - UpdateThread.Start(); - } - - public static void Initialize() - { - if (PlatformLinkedLibSingleton.RunningOnUnix) - { - OTK_Keyboard.Initialize(); -// OTK_Gamepad.Initialize(); - } - else - { - KeyInput.Initialize(); - IPCKeyInput.Initialize(); - GamePad.Initialize(); - GamePad360.Initialize(); - } - Instance = new Input(); - } - - public static void Cleanup() - { - if (!PlatformLinkedLibSingleton.RunningOnUnix) - { - KeyInput.Cleanup(); - GamePad.Cleanup(); - } - } - - public enum InputEventType - { - Press, Release - } - public struct LogicalButton - { - public LogicalButton(string button, ModifierKey modifiers) - { - Button = button; - Modifiers = modifiers; - } - public readonly string Button; - public readonly ModifierKey Modifiers; - - public bool Alt { get { return ((Modifiers & ModifierKey.Alt) != 0); } } - public bool Control { get { return ((Modifiers & ModifierKey.Control) != 0); } } - public bool Shift { get { return ((Modifiers & ModifierKey.Shift) != 0); } } - - public override string ToString() - { - string ret = ""; - if (Control) ret += "Ctrl+"; - if (Alt) ret += "Alt+"; - if (Shift) ret += "Shift+"; - ret += Button; - return ret; - } - public override bool Equals(object obj) - { - var other = (LogicalButton)obj; - return other == this; - } - public override int GetHashCode() - { - return Button.GetHashCode() ^ Modifiers.GetHashCode(); - } - public static bool operator ==(LogicalButton lhs, LogicalButton rhs) - { - return lhs.Button == rhs.Button && lhs.Modifiers == rhs.Modifiers; - } - public static bool operator !=(LogicalButton lhs, LogicalButton rhs) - { - return !(lhs == rhs); - } - } - public class InputEvent - { - public LogicalButton LogicalButton; - public InputEventType EventType; - public override string ToString() - { - return string.Format("{0}:{1}", EventType.ToString(), LogicalButton.ToString()); - } - } - - private readonly WorkingDictionary ModifierState = new WorkingDictionary(); - private readonly WorkingDictionary LastState = new WorkingDictionary(); - private readonly WorkingDictionary UnpressState = new WorkingDictionary(); - private readonly HashSet IgnoreKeys = new HashSet(new[] { "LeftShift", "RightShift", "LeftControl", "RightControl", "LeftAlt", "RightAlt" }); - private readonly WorkingDictionary FloatValues = new WorkingDictionary(); - private readonly WorkingDictionary FloatDeltas = new WorkingDictionary(); - private bool trackdeltas = false; - - void HandleButton(string button, bool newState) - { - bool isModifier = IgnoreKeys.Contains(button); - if (EnableIgnoreModifiers && isModifier) return; - if (LastState[button] && newState) return; - if (!LastState[button] && !newState) return; - - //apply - //NOTE: this is not quite right. if someone held leftshift+rightshift it would be broken. seems unlikely, though. - if (button == "LeftShift") - { - _Modifiers &= ~ModifierKey.Shift; - if (newState) - _Modifiers |= ModifierKey.Shift; - } - if (button == "RightShift") { _Modifiers &= ~ModifierKey.Shift; if (newState) _Modifiers |= ModifierKey.Shift; } - if (button == "LeftControl") { _Modifiers &= ~ModifierKey.Control; if (newState) _Modifiers |= ModifierKey.Control; } - if (button == "RightControl") { _Modifiers &= ~ModifierKey.Control; if (newState) _Modifiers |= ModifierKey.Control; } - if (button == "LeftAlt") { _Modifiers &= ~ModifierKey.Alt; if (newState) _Modifiers |= ModifierKey.Alt; } - if (button == "RightAlt") { _Modifiers &= ~ModifierKey.Alt; if (newState) _Modifiers |= ModifierKey.Alt; } - - if (UnpressState.ContainsKey(button)) - { - if (newState) return; - Console.WriteLine("Removing Unpress {0} with newState {1}", button, newState); - UnpressState.Remove(button); - LastState[button] = false; - return; - } - - - //dont generate events for things like Ctrl+LeftControl - ModifierKey mods = _Modifiers; - if (button == "LeftShift") mods &= ~ModifierKey.Shift; - if (button == "RightShift") mods &= ~ModifierKey.Shift; - if (button == "LeftControl") mods &= ~ModifierKey.Control; - if (button == "RightControl") mods &= ~ModifierKey.Control; - if (button == "LeftAlt") mods &= ~ModifierKey.Alt; - if (button == "RightAlt") mods &= ~ModifierKey.Alt; - - var ie = new InputEvent - { - EventType = newState ? InputEventType.Press : InputEventType.Release, - LogicalButton = new LogicalButton(button, mods) - }; - LastState[button] = newState; - - //track the pressed events with modifiers that we send so that we can send corresponding unpresses with modifiers - //this is an interesting idea, which we may need later, but not yet. - //for example, you may see this series of events: press:ctrl+c, release:ctrl, release:c - //but you might would rather have press:ctr+c, release:ctrl+c - //this code relates the releases to the original presses. - //UPDATE - this is necessary for the frame advance key, which has a special meaning when it gets stuck down - //so, i am adding it as of 11-sep-2011 - if (newState) - { - ModifierState[button] = ie.LogicalButton; - } - else - { - if (ModifierState[button] != null) - { - LogicalButton alreadyReleased = ie.LogicalButton; - var ieModified = new InputEvent - { - LogicalButton = (LogicalButton)ModifierState[button], - EventType = InputEventType.Release - }; - if (ieModified.LogicalButton != alreadyReleased) - _NewEvents.Add(ieModified); - } - ModifierState[button] = null; - } - - _NewEvents.Add(ie); - } - - ModifierKey _Modifiers; - private readonly List _NewEvents = new List(); - - //do we need this? - public void ClearEvents() - { - lock (this) - { - InputEvents.Clear(); - } - } - - private readonly Queue InputEvents = new Queue(); - public InputEvent DequeueEvent() - { - lock (this) - { - if (InputEvents.Count == 0) return null; - else return InputEvents.Dequeue(); - } - } - void EnqueueEvent(InputEvent ie) - { - lock (this) - { - InputEvents.Enqueue(ie); - } - } - - public List> GetFloats() - { - List> FloatValuesCopy = new List>(); - lock (FloatValues) - { - foreach (var kvp in FloatValues) - FloatValuesCopy.Add(new Tuple(kvp.Key, kvp.Value)); - } - return FloatValuesCopy; - } - - void UpdateThreadProc() - { - while (true) - { - var keyEvents = PlatformLinkedLibSingleton.RunningOnUnix - ? OTK_Keyboard.Update() - : KeyInput.Update().Concat(IPCKeyInput.Update()); - if (PlatformLinkedLibSingleton.RunningOnUnix) - { - //TODO - } - else - { - GamePad.UpdateAll(); - GamePad360.UpdateAll(); - } - - //this block is going to massively modify data structures that the binding method uses, so we have to lock it all - lock (this) - { - _NewEvents.Clear(); - - //analyze keys - foreach (var ke in keyEvents) - HandleButton(ke.Key.ToString(), ke.Pressed); - - lock (FloatValues) - { - //FloatValues.Clear(); - - //analyze xinput - foreach (var pad in GamePad360.EnumerateDevices()) - { - string xname = "X" + pad.PlayerNumber + " "; - for (int b = 0; b < pad.NumButtons; b++) - HandleButton(xname + pad.ButtonName(b), pad.Pressed(b)); - foreach (var sv in pad.GetFloats()) - { - string n = xname + sv.Item1; - float f = sv.Item2; - if (trackdeltas) - FloatDeltas[n] += Math.Abs(f - FloatValues[n]); - FloatValues[n] = f; - } - } - - //analyze joysticks - foreach (var pad in GamePad.EnumerateDevices()) - { - string jname = "J" + pad.PlayerNumber + " "; - for (int b = 0; b < pad.NumButtons; b++) - HandleButton(jname + pad.ButtonName(b), pad.Pressed(b)); - foreach (var sv in pad.GetFloats()) - { - string n = jname + sv.Item1; - float f = sv.Item2; - //if (n == "J5 RotationZ") - // System.Diagnostics.Debugger.Break(); - if (trackdeltas) - FloatDeltas[n] += Math.Abs(f - FloatValues[n]); - FloatValues[n] = f; - } - } - - // analyse moose - // other sorts of mouse api (raw input) could easily be added as a separate listing under a different class - if (WantingMouseFocus.Contains(System.Windows.Forms.Form.ActiveForm)) - { - var P = System.Windows.Forms.Control.MousePosition; - if (trackdeltas) - { - // these are relative to screen coordinates, but that's not terribly important - FloatDeltas["WMouse X"] += Math.Abs(P.X - FloatValues["WMouse X"]) * 50; - FloatDeltas["WMouse Y"] += Math.Abs(P.Y - FloatValues["WMouse Y"]) * 50; - } - // coordinate translation happens later - FloatValues["WMouse X"] = P.X; - FloatValues["WMouse Y"] = P.Y; - - var B = System.Windows.Forms.Control.MouseButtons; - HandleButton("WMouse L", (B & System.Windows.Forms.MouseButtons.Left) != 0); - HandleButton("WMouse C", (B & System.Windows.Forms.MouseButtons.Middle) != 0); - HandleButton("WMouse R", (B & System.Windows.Forms.MouseButtons.Right) != 0); - HandleButton("WMouse 1", (B & System.Windows.Forms.MouseButtons.XButton1) != 0); - HandleButton("WMouse 2", (B & System.Windows.Forms.MouseButtons.XButton2) != 0); - } - else - { - //dont do this: for now, it will interfere with the virtualpad. dont do something similar for the mouse position either - //unpress all buttons - //HandleButton("WMouse L", false); - //HandleButton("WMouse C", false); - //HandleButton("WMouse R", false); - //HandleButton("WMouse 1", false); - //HandleButton("WMouse 2", false); - } - - } - - //WHAT!? WE SHOULD NOT BE SO NAIVELY TOUCHING MAINFORM FROM THE INPUTTHREAD. ITS BUSY RUNNING. - bool swallow = !GlobalWin.MainForm.AllowInput(false); - - foreach (var ie in _NewEvents) - { - //events are swallowed in some cases: - if (ie.LogicalButton.Alt && !GlobalWin.MainForm.AllowInput(true)) - { } - else if (ie.EventType == InputEventType.Press && swallow) - { } - else - EnqueueEvent(ie); - } - } //lock(this) - - //arbitrary selection of polling frequency: - Thread.Sleep(10); - } - } - - public void StartListeningForFloatEvents() - { - lock (FloatValues) - { - FloatDeltas.Clear(); - trackdeltas = true; - } - } - - public string GetNextFloatEvent() - { - lock (FloatValues) - { - foreach (var kvp in FloatDeltas) - { - // need to wiggle the stick a bit - if (kvp.Value >= 20000.0f) - return kvp.Key; - } - } - return null; - } - - public void StopListeningForFloatEvents() - { - lock (FloatValues) - { - trackdeltas = false; - } - } - - public void Update() - { - //TODO - for some reason, we may want to control when the next event processing step happens - //so i will leave this method here for now.. - } - - //returns the next Press event, if available. should be useful - public string GetNextBindEvent() - { - //this whole process is intimately involved with the data structures, which can conflict with the input thread. - lock (this) - { - if (InputEvents.Count == 0) return null; - if (!GlobalWin.MainForm.AllowInput(false)) return null; - - //we only listen to releases for input binding, because we need to distinguish releases of pure modifierkeys from modified keys - //if you just pressed ctrl, wanting to bind ctrl, we'd see: pressed:ctrl, unpressed:ctrl - //if you just pressed ctrl+c, wanting to bind ctrl+c, we'd see: pressed:ctrl, pressed:ctrl+c, unpressed:ctrl+c, unpressed:ctrl - //so its the first unpress we need to listen for - - while (InputEvents.Count != 0) - { - var ie = DequeueEvent(); - - //as a special perk, we'll accept escape immediately - if (ie.EventType == InputEventType.Press && ie.LogicalButton.Button == "Escape") - goto ACCEPT; - - if (ie.EventType == InputEventType.Press) continue; - - ACCEPT: - Console.WriteLine("Bind Event: {0} ", ie); - - foreach (var kvp in LastState) - if (kvp.Value) - { - Console.WriteLine("Unpressing " + kvp.Key); - UnpressState[kvp.Key] = true; - } - - InputEvents.Clear(); - - return ie.LogicalButton.ToString(); - } - - return null; - } - } - - //controls whether modifier keys will be ignored as key press events - //this should be used by hotkey binders, but we may want modifier key events - //to get triggered in the main form - public bool EnableIgnoreModifiers = false; - - //sets a key as unpressed for the binding system - public void BindUnpress(System.Windows.Forms.Keys key) - { - //only validated for Return - string keystr = key.ToString(); - UnpressState[keystr] = true; - LastState[keystr] = true; - } - - } -} diff --git a/BizHawk.Client.EmuHawk/Input/Keyboard.cs b/BizHawk.Client.EmuHawk/Input/Keyboard.cs deleted file mode 100644 index d42f5e6b6a..0000000000 --- a/BizHawk.Client.EmuHawk/Input/Keyboard.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System.Collections.Generic; -using SlimDX; -using SlimDX.DirectInput; - -namespace BizHawk.Client.EmuHawk -{ - public static class KeyInput - { - private static readonly object _syncObj = new object(); - private static readonly List _eventList = new List(); - private static DirectInput _dinput; - private static Keyboard _keyboard; - - public static void Initialize() - { - lock (_syncObj) - { - Cleanup(); - - _dinput = new DirectInput(); - - _keyboard = new Keyboard(_dinput); - _keyboard.SetCooperativeLevel(GlobalWin.MainForm.Handle, CooperativeLevel.Background | CooperativeLevel.Nonexclusive); - _keyboard.Properties.BufferSize = 8; - } - } - - public static void Cleanup() - { - lock (_syncObj) - { - if (_keyboard != null) - { - _keyboard.Dispose(); - _keyboard = null; - } - - if (_dinput != null) - { - _dinput.Dispose(); - _dinput = null; - } - } - } - - public static IEnumerable Update() - { - lock (_syncObj) - { - _eventList.Clear(); - - if (_keyboard == null || _keyboard.Acquire().IsFailure || _keyboard.Poll().IsFailure) - return _eventList; - - for (; ; ) - { - var events = _keyboard.GetBufferedData(); - if (Result.Last.IsFailure || events.Count == 0) - break; - foreach (var e in events) - { - foreach (var k in e.PressedKeys) - _eventList.Add(new KeyEvent { Key = k, Pressed = true }); - foreach (var k in e.ReleasedKeys) - _eventList.Add(new KeyEvent { Key = k, Pressed = false }); - } - } - - return _eventList; - } - } - - public struct KeyEvent - { - public Key Key; - public bool Pressed; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Input/OTK_Gamepad.cs b/BizHawk.Client.EmuHawk/Input/OTK_Gamepad.cs deleted file mode 100644 index e9b5fb575f..0000000000 --- a/BizHawk.Client.EmuHawk/Input/OTK_Gamepad.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.Collections.Generic; -using OpenTK.Input; - -namespace BizHawk.Client.EmuHawk -{ - public class OTK_GamePad - { - //Note: OpenTK has both Gamepad and Joystick classes. An OpenTK Gamepad is a simplified version of Joystick - //with pre-defined features that match an XInput controller. They did this to mimic XNA's controller API. - //We're going to use Joystick directly, because it gives us full access to all possible buttons. - //And it looks like GamePad itself isn't supported on OpenTK OS X. - - public static List Devices; - private const int MAX_JOYSTICKS = 4; //They don't have a way to query this for some reason. 4 is the minimum promised. - - public static void Initialize() - { - Devices = new List(); - - for (int i = 0; i < MAX_JOYSTICKS; i++) - { - JoystickState jss = Joystick.GetState(i); - if (jss.IsConnected) - { - Console.WriteLine(string.Format("joydevice index: {0}", i)); //OpenTK doesn't expose the GUID, even though it stores it internally... - - OTK_GamePad ogp = new OTK_GamePad(i); - Devices.Add(ogp); - } - } - - } - - public static void UpdateAll() - { - foreach (var device in Devices) - device.Update(); - } - - public static void CloseAll() - { - if (Devices != null) - { - Devices.Clear(); - } - } - - // ********************************** Instance Members ********************************** - - readonly Guid _guid; - readonly int _stickIdx; - JoystickState state = new JoystickState(); - - OTK_GamePad(int index) - { - _guid = Guid.NewGuid(); - _stickIdx = index; - Update(); - InitializeCallbacks(); - } - - public void Update() - { - state = Joystick.GetState(_stickIdx); - } - - public IEnumerable> GetFloats() - { - for (int pi = 0; pi < 64; pi++) - yield return new Tuple(pi.ToString(), 10.0f * state.GetAxis(pi)); - } - - /// FOR DEBUGGING ONLY - public JoystickState GetInternalState() - { - return state; - } - - public string Name { get { return "Joystick " + _stickIdx; } } - public Guid Guid { get { return _guid; } } - - - public string ButtonName(int index) - { - return names[index]; - } - public bool Pressed(int index) - { - return actions[index](); - } - public int NumButtons { get; private set; } - - private readonly List names = new List(); - private readonly List> actions = new List>(); - - void AddItem(string _name, Func callback) - { - names.Add(_name); - actions.Add(callback); - NumButtons++; - } - - void InitializeCallbacks() - { - const int dzp = 400; - const int dzn = -400; - - names.Clear(); - actions.Clear(); - NumButtons = 0; - - AddItem("X+", () => state.GetAxis(0) >= dzp); - AddItem("X-", () => state.GetAxis(0) <= dzn); - AddItem("Y+", () => state.GetAxis(1) >= dzp); - AddItem("Y-", () => state.GetAxis(1) <= dzn); - AddItem("Z+", () => state.GetAxis(2) >= dzp); - AddItem("Z-", () => state.GetAxis(2) <= dzn); - - // Enjoy our delicious sliders. They're smaller than regular burgers but cost more. - - int jb = 1; - for (int i = 0; i < 64; i++) - { - AddItem(string.Format("B{0}", jb), () => state.GetButton(i)==ButtonState.Pressed); - jb++; - } - - jb = 1; - foreach (JoystickHat enval in Enum.GetValues(typeof(JoystickHat))) - { - AddItem(string.Format("POV{0}U", jb), () => state.GetHat(enval).IsUp); - AddItem(string.Format("POV{0}D", jb), () => state.GetHat(enval).IsDown); - AddItem(string.Format("POV{0}L", jb), () => state.GetHat(enval).IsLeft); - AddItem(string.Format("POV{0}R", jb), () => state.GetHat(enval).IsRight); - jb++; - } - } - - // Note that this does not appear to work at this time. I probably need to have more infos. - public void SetVibration(int left, int right) - { - //Not supported in OTK Joystick. It is supported for OTK Gamepad, but I have to use Joystick for reasons mentioned above. - } - - } -} - diff --git a/BizHawk.Client.EmuHawk/Input/OTK_Keyboard.cs b/BizHawk.Client.EmuHawk/Input/OTK_Keyboard.cs deleted file mode 100644 index 200c970e6b..0000000000 --- a/BizHawk.Client.EmuHawk/Input/OTK_Keyboard.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.Collections.Generic; -using System.Text; -using OpenTK.Input; - -namespace BizHawk.Client.EmuHawk -{ - public static class OTK_Keyboard - { - private static readonly Dictionary KeyEnumMap = new Dictionary - { - // A-Z - {Key.A, SlimDX.DirectInput.Key.A}, {Key.B, SlimDX.DirectInput.Key.B}, {Key.C, SlimDX.DirectInput.Key.C}, {Key.D, SlimDX.DirectInput.Key.D}, {Key.E, SlimDX.DirectInput.Key.E}, {Key.F, SlimDX.DirectInput.Key.F}, {Key.G, SlimDX.DirectInput.Key.G}, {Key.H, SlimDX.DirectInput.Key.H}, {Key.I, SlimDX.DirectInput.Key.I}, {Key.J, SlimDX.DirectInput.Key.J}, {Key.K, SlimDX.DirectInput.Key.K}, {Key.L, SlimDX.DirectInput.Key.L}, {Key.M, SlimDX.DirectInput.Key.M}, {Key.N, SlimDX.DirectInput.Key.N}, {Key.O, SlimDX.DirectInput.Key.O}, {Key.P, SlimDX.DirectInput.Key.P}, {Key.Q, SlimDX.DirectInput.Key.Q}, {Key.R, SlimDX.DirectInput.Key.R}, {Key.S, SlimDX.DirectInput.Key.S}, {Key.T, SlimDX.DirectInput.Key.T}, {Key.U, SlimDX.DirectInput.Key.U}, {Key.V, SlimDX.DirectInput.Key.V}, {Key.W, SlimDX.DirectInput.Key.W}, {Key.X, SlimDX.DirectInput.Key.X}, {Key.Y, SlimDX.DirectInput.Key.Y}, {Key.Z, SlimDX.DirectInput.Key.Z}, - // 0-9 - {Key.Number1, SlimDX.DirectInput.Key.D1}, {Key.Number2, SlimDX.DirectInput.Key.D2}, {Key.Number3, SlimDX.DirectInput.Key.D3}, {Key.Number4, SlimDX.DirectInput.Key.D4}, {Key.Number5, SlimDX.DirectInput.Key.D5}, {Key.Number6, SlimDX.DirectInput.Key.D6}, {Key.Number7, SlimDX.DirectInput.Key.D7}, {Key.Number8, SlimDX.DirectInput.Key.D8}, {Key.Number9, SlimDX.DirectInput.Key.D9}, {Key.Number0, SlimDX.DirectInput.Key.D0}, - // misc. printables (ASCII order) - {Key.Space, SlimDX.DirectInput.Key.Space}, {Key.Quote, SlimDX.DirectInput.Key.Apostrophe}, {Key.Comma, SlimDX.DirectInput.Key.Comma}, {Key.Minus, SlimDX.DirectInput.Key.Minus}, {Key.Period, SlimDX.DirectInput.Key.Period}, {Key.Slash, SlimDX.DirectInput.Key.Slash}, {Key.Semicolon, SlimDX.DirectInput.Key.Semicolon}, {Key.Plus, SlimDX.DirectInput.Key.Equals}, {Key.BracketLeft, SlimDX.DirectInput.Key.LeftBracket}, {Key.BackSlash, SlimDX.DirectInput.Key.Backslash}, {Key.BracketRight, SlimDX.DirectInput.Key.RightBracket}, {Key.Tilde, SlimDX.DirectInput.Key.Grave}, - // misc. (alphabetically) - {Key.BackSpace, SlimDX.DirectInput.Key.Backspace}, {Key.CapsLock, SlimDX.DirectInput.Key.CapsLock}, {Key.Delete, SlimDX.DirectInput.Key.Delete}, {Key.Down, SlimDX.DirectInput.Key.DownArrow}, {Key.End, SlimDX.DirectInput.Key.End}, {Key.Enter, SlimDX.DirectInput.Key.Return}, {Key.Escape, SlimDX.DirectInput.Key.Escape}, {Key.Home, SlimDX.DirectInput.Key.Home}, {Key.Insert, SlimDX.DirectInput.Key.Insert}, {Key.Left, SlimDX.DirectInput.Key.LeftArrow}, {Key.PageDown, SlimDX.DirectInput.Key.PageDown}, {Key.PageUp, SlimDX.DirectInput.Key.PageUp}, {Key.Pause, SlimDX.DirectInput.Key.Pause}, {Key.Right, SlimDX.DirectInput.Key.RightArrow}, {Key.ScrollLock, SlimDX.DirectInput.Key.ScrollLock}, {Key.Tab, SlimDX.DirectInput.Key.Tab}, {Key.Up, SlimDX.DirectInput.Key.UpArrow}, - // modifier - {Key.WinLeft, SlimDX.DirectInput.Key.LeftWindowsKey}, {Key.WinRight, SlimDX.DirectInput.Key.RightWindowsKey}, {Key.ControlLeft, SlimDX.DirectInput.Key.LeftControl}, {Key.ControlRight, SlimDX.DirectInput.Key.RightControl}, {Key.AltLeft, SlimDX.DirectInput.Key.LeftAlt}, {Key.AltRight, SlimDX.DirectInput.Key.RightAlt}, {Key.ShiftLeft, SlimDX.DirectInput.Key.LeftShift}, {Key.ShiftRight, SlimDX.DirectInput.Key.RightShift}, - - // function - {Key.F1, SlimDX.DirectInput.Key.F1}, {Key.F2, SlimDX.DirectInput.Key.F2}, {Key.F3, SlimDX.DirectInput.Key.F3}, {Key.F4, SlimDX.DirectInput.Key.F4}, {Key.F5, SlimDX.DirectInput.Key.F5}, {Key.F6, SlimDX.DirectInput.Key.F6}, {Key.F7, SlimDX.DirectInput.Key.F7}, {Key.F8, SlimDX.DirectInput.Key.F8}, {Key.F9, SlimDX.DirectInput.Key.F9}, {Key.F10, SlimDX.DirectInput.Key.F10}, {Key.F11, SlimDX.DirectInput.Key.F11}, {Key.F12, SlimDX.DirectInput.Key.F12}, - // keypad (alphabetically) - {Key.Keypad0, SlimDX.DirectInput.Key.NumberPad0}, {Key.Keypad1, SlimDX.DirectInput.Key.NumberPad1}, {Key.Keypad2, SlimDX.DirectInput.Key.NumberPad2}, {Key.Keypad3, SlimDX.DirectInput.Key.NumberPad3}, {Key.Keypad4, SlimDX.DirectInput.Key.NumberPad4}, {Key.Keypad5, SlimDX.DirectInput.Key.NumberPad5}, {Key.Keypad6, SlimDX.DirectInput.Key.NumberPad6}, {Key.Keypad7, SlimDX.DirectInput.Key.NumberPad7}, {Key.Keypad8, SlimDX.DirectInput.Key.NumberPad8}, {Key.Keypad9, SlimDX.DirectInput.Key.NumberPad9}, {Key.KeypadAdd, SlimDX.DirectInput.Key.NumberPadPlus}, {Key.KeypadDecimal, SlimDX.DirectInput.Key.NumberPadPeriod}, {Key.KeypadDivide, SlimDX.DirectInput.Key.NumberPadSlash}, {Key.KeypadEnter, SlimDX.DirectInput.Key.NumberPadEnter}, {Key.KeypadMultiply, SlimDX.DirectInput.Key.NumberPadStar}, {Key.KeypadSubtract, SlimDX.DirectInput.Key.NumberPadMinus} - }; - - private static readonly List _eventList = new List(); - private static KeyboardState _kbState; - - public static void Initialize () - { - _kbState = Keyboard.GetState(); - } - - public static IEnumerable Update () - { - _eventList.Clear(); - var lastState = _kbState; - try - { - _kbState = Keyboard.GetState(); - foreach (KeyValuePair entry in KeyEnumMap) - { - if (lastState.IsKeyUp(entry.Key) && _kbState.IsKeyDown(entry.Key)) - _eventList.Add(new KeyInput.KeyEvent { Key = entry.Value, Pressed = true }); - else if (lastState.IsKeyDown(entry.Key) && _kbState.IsKeyUp(entry.Key)) - _eventList.Add(new KeyInput.KeyEvent { Key = entry.Value, Pressed = false }); - } - } - catch - { - //OpenTK's keyboard class isn't thread safe. - //In rare cases (sometimes it takes up to 10 minutes to occur) it will - //be updating the keyboard state when we call GetState() and choke. - //Until I fix OpenTK, it's fine to just swallow it because input continues working. - if(System.Diagnostics.Debugger.IsAttached) - { - System.Console.WriteLine("OpenTK Keyboard thread is angry."); - } - } - return _eventList; - } - - public static bool IsPressed (Key key) - { - return _kbState.IsKeyDown(key); - } - - public static bool ShiftModifier { - get { - return IsPressed(Key.ShiftLeft) || IsPressed(Key.ShiftRight); - } - } - - public static bool CtrlModifier { - get { - return IsPressed(Key.ControlLeft) || IsPressed(Key.ControlRight); - } - } - - public static bool AltModifier { - get { - return IsPressed(Key.AltLeft) || IsPressed(Key.AltRight); - } - } - - public static Input.ModifierKey GetModifierKeysAsKeys () - { - Input.ModifierKey ret = Input.ModifierKey.None; - if (ShiftModifier) - ret |= Input.ModifierKey.Shift; - if (CtrlModifier) - ret |= Input.ModifierKey.Control; - if (AltModifier) - ret |= Input.ModifierKey.Alt; - return ret; - } - } - - internal static class KeyExtensions - { - public static bool IsModifier (this Key key) - { - if (key == Key.ShiftLeft) - return true; - if (key == Key.ShiftRight) - return true; - if (key == Key.ControlLeft) - return true; - if (key == Key.ControlRight) - return true; - if (key == Key.AltLeft) - return true; - if (key == Key.AltRight) - return true; - return false; - } - } -} diff --git a/BizHawk.Client.EmuHawk/JumpLists.cs b/BizHawk.Client.EmuHawk/JumpLists.cs deleted file mode 100644 index db41963523..0000000000 --- a/BizHawk.Client.EmuHawk/JumpLists.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using System.Reflection; - -namespace BizHawk.Client.EmuHawk -{ - public class JumpLists - { - static readonly Assembly PresentationFramework; - static Type Application; - static Type JumpList; - static Type JumpTask; - - static object _app; - static JumpLists() - { - try - { - PresentationFramework = Assembly.Load("PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); - Application = PresentationFramework.GetType("System.Windows.Application"); - JumpList = PresentationFramework.GetType("System.Windows.Shell.JumpList"); - JumpTask = PresentationFramework.GetType("System.Windows.Shell.JumpTask"); - _app = Activator.CreateInstance(Application); - dynamic jmp = Activator.CreateInstance(JumpList); - jmp.ShowRecentCategory = true; - JumpList.GetMethod("SetJumpList").Invoke(null, new[] { _app, jmp }); - } - catch { } - } - - /// - /// add an item to the W7+ jumplist - /// - /// fully qualified path, can include '|' character for archives - public static void AddRecentItem(string fullpath, string title) - { - //string title; - //if (fullpath.Contains('|')) - // title = fullpath.Split('|')[1]; - //else - // title = Path.GetFileName(fullpath); - try - { - string exepath = Assembly.GetEntryAssembly().Location; - - dynamic ji = Activator.CreateInstance(JumpTask); - - ji.ApplicationPath = exepath; - ji.Arguments = '"' + fullpath + '"'; - ji.Title = title; - // for some reason, this doesn't work - ji.WorkingDirectory = Path.GetDirectoryName(exepath); - - JumpList.GetMethod("AddToRecentCategory", new[] { JumpTask }).Invoke(null, new[] { ji }); - } - catch { } - } - } -} diff --git a/BizHawk.Client.EmuHawk/LogConsole.cs b/BizHawk.Client.EmuHawk/LogConsole.cs deleted file mode 100644 index eb50cf1d1c..0000000000 --- a/BizHawk.Client.EmuHawk/LogConsole.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.Text; -using System.IO; -using System.Runtime.InteropServices; - -using BizHawk.Common; -using BizHawk.Client.Common; - -#pragma warning disable 162 - -//thanks! - http://sharp-developer.net/ru/CodeBank/WinForms/GuiConsole.aspx - -//todo - quit using Console.WriteLine (well, we can leave it hooked up as a backstop) -//use a different method instead, so we can collect unicode data -//also, collect log data independently of whether the log window is open -//we also need to dice it into lines so that we can have a backlog policy - -namespace BizHawk.Client.EmuHawk -{ - static class LogConsole - { - public static bool ConsoleVisible - { - get; - private set; - } - - static LogWindow window; - static LogStream logStream; - static bool NeedToRelease; - - class LogStream : Stream - { - public override bool CanRead { get { return false; } } - public override bool CanSeek { get { return false; } } - public override bool CanWrite { get { return true; } } - - public override void Flush() - { - //TODO - maybe this will help with decoding - } - - public override long Length - { - get { throw new NotImplementedException(); } - } - - public override long Position - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotImplementedException(); - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - //TODO - buffer undecoded characters (this may be important) - //(use decoder = System.Text.Encoding.Unicode.GetDecoder()) - string str = Encoding.ASCII.GetString(buffer, offset, count); - if (Emit != null) - Emit(str); - } - - public Action Emit; - } - - - static string SkipEverythingButProgramInCommandLine(string cmdLine) - { - //skip past the program name. can anyone think of a better way to do this? - //we could use CommandLineToArgvW (commented out below) but then we would just have to re-assemble and potentially re-quote it - int childCmdLine = 0; - int lastSlash = 0; - int lastGood = 0; - bool quote = false; - for (; ; ) - { - char cur = cmdLine[childCmdLine]; - childCmdLine++; - if (childCmdLine == cmdLine.Length) break; - bool thisIsQuote = (cur == '\"'); - if (cur == '\\' || cur == '/') - lastSlash = childCmdLine; - if (quote) - { - if (thisIsQuote) - quote = false; - else lastGood = childCmdLine; - } - else - { - if (cur == ' ' || cur == '\t') - break; - if (thisIsQuote) - quote = true; - lastGood = childCmdLine; - } - } - string remainder = cmdLine.Substring(childCmdLine); - string path = cmdLine.Substring(lastSlash, lastGood - lastSlash); - return path + " " + remainder; - } - - static IntPtr oldOut, conOut; - static bool hasConsole; - static bool attachedConsole; - static bool shouldRedirectStdout; - public static void CreateConsole() - { - //(see desmume for the basis of some of this logic) - - if (hasConsole) - return; - - if (oldOut == IntPtr.Zero) - oldOut = Win32.GetStdHandle( -11 ); //STD_OUTPUT_HANDLE - - Win32.FileType fileType = Win32.GetFileType(oldOut); - - //stdout is already connected to something. keep using it and dont let the console interfere - shouldRedirectStdout = (fileType == Win32.FileType.FileTypeUnknown || fileType == Win32.FileType.FileTypePipe); - - //attach to an existing console - attachedConsole = false; - - //ever since a recent KB, XP-based systems glitch out when attachconsole is called and theres no console to attach to. - if (Environment.OSVersion.Version.Major != 5) - { - if (Win32.AttachConsole(-1)) - { - hasConsole = true; - attachedConsole = true; - } - } - - if (!attachedConsole) - { - Win32.FreeConsole(); - if (Win32.AllocConsole()) - { - //set icons for the console so we can tell them apart from the main window - Win32.SendMessage(Win32.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)0/*ICON_SMALL*/, Properties.Resources.console16x16.GetHicon()); - Win32.SendMessage(Win32.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)1/*ICON_LARGE*/, Properties.Resources.console32x32.GetHicon()); - hasConsole = true; - } - else - System.Windows.Forms.MessageBox.Show(string.Format("Couldn't allocate win32 console: {0}", Marshal.GetLastWin32Error())); - } - - if(hasConsole) - { - IntPtr ptr = Win32.GetCommandLine(); - string commandLine = Marshal.PtrToStringAuto(ptr); - Console.Title = SkipEverythingButProgramInCommandLine(commandLine); - } - - if (shouldRedirectStdout) - { - conOut = Win32.CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, 3, 0, IntPtr.Zero); - - if (!Win32.SetStdHandle(-11, conOut)) - throw new Exception("SetStdHandle() failed"); - } - - //DotNetRewireConout(); - hasConsole = true; - - if (attachedConsole) - { - Console.WriteLine(); - Console.WriteLine("use cmd /c {0} to get more sensible console behaviour", Path.GetFileName(PathManager.GetGlobalBasePathAbsolute())); - } - } - - static void ReleaseConsole() - { - if (!hasConsole) - return; - - if(shouldRedirectStdout) Win32.CloseHandle(conOut); - if(!attachedConsole) Win32.FreeConsole(); - Win32.SetStdHandle(-11, oldOut); - - conOut = IntPtr.Zero; - hasConsole = false; - } - - /// - /// pops the console in front of the main window (where it should probably go after booting up the game). - /// maybe this should be optional, or maybe we can somehow position the console sensibly. - /// sometimes it annoys me, but i really need it on top while debugging or else i will be annoyed. - /// best of all would be to position it beneath the bizhawk main window somehow. - /// - public static void PositionConsole() - { - if (ConsoleVisible == false) return; - if (Global.Config.WIN32_CONSOLE) - { - IntPtr x = Win32.GetConsoleWindow(); - Win32.SetForegroundWindow(x); - } - } - - public static void ShowConsole() - { - if (ConsoleVisible) return; - ConsoleVisible = true; - - if (Global.Config.WIN32_CONSOLE) - { - NeedToRelease = true; - CreateConsole(); - //not sure whether we need to set a buffer size here - //var sout = new StreamWriter(Console.OpenStandardOutput(),Encoding.ASCII,1) { AutoFlush = true }; - //var sout = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }; - //Console.SetOut(sout); - //Console.Title = "BizHawk Message Log"; - //System.Runtime.InteropServices.SafeFi - //new Microsoft.Win32.SafeHandles.SafeFileHandle( - } - else - { - logStream = new LogStream(); - Log.HACK_LOG_STREAM = logStream; - var sout = new StreamWriter(logStream) { AutoFlush = true }; - new StringBuilder(); //not using this right now - Console.SetOut(sout); - window = new LogWindow(); - window.Show(); - logStream.Emit = (str) => { window.Append(str); }; - } - } - - public static void HideConsole() - { - if (ConsoleVisible == false) return; - Console.SetOut(TextWriter.Null); - ConsoleVisible = false; - if (NeedToRelease) - { - ReleaseConsole(); - NeedToRelease = false; - } - else - { - logStream.Close(); - logStream = null; - Log.HACK_LOG_STREAM = null; - window.Close(); - window = null; - } - } - - public static void notifyLogWindowClosing() - { - Console.SetOut(TextWriter.Null); - ConsoleVisible = false; - if(logStream != null) logStream.Close(); - Log.HACK_LOG_STREAM = null; - } - - public static void SaveConfigSettings() - { - if (window != null && window.IsHandleCreated) - window.SaveConfigSettings(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/LogWindow.cs b/BizHawk.Client.EmuHawk/LogWindow.cs deleted file mode 100644 index af5d0d8968..0000000000 --- a/BizHawk.Client.EmuHawk/LogWindow.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Common.ReflectionExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; - -//todo - perks - pause, copy to clipboard, backlog length limiting - -namespace BizHawk.Client.EmuHawk -{ - public partial class LogWindow : Form - { - //TODO: only show add to game db when this is a Rom details dialog - //Let user decide what type (instead of always adding it as a good dump) - private readonly List Lines = new List(); - - public LogWindow() - { - InitializeComponent(); - Closing += (o, e) => - { - Global.Config.ShowLogWindow = false; - GlobalWin.MainForm.NotifyLogWindowClosing(); - LogConsole.notifyLogWindowClosing(); - SaveConfigSettings(); - }; - virtualListView1_ClientSizeChanged(null, null); - } - - public static void ShowReport(string title, string report, IWin32Window parent) - { - using (var dlg = new LogWindow()) - { - var ss = report.Split('\n'); - foreach (var s in ss) - dlg.Lines.Add(s.TrimEnd('\r')); - dlg.virtualListView1.ItemCount = ss.Length; - dlg.Text = title; - dlg.btnClear.Visible = false; - dlg.ShowDialog(parent); - } - } - - public void Append(string str) - { - var ss = str.Split('\n'); - foreach (var s in ss) - { - if (!string.IsNullOrWhiteSpace(s)) - { - Lines.Add(s.TrimEnd('\r')); - virtualListView1.ItemCount++; - } - } - } - - private void btnClear_Click(object sender, EventArgs e) - { - Lines.Clear(); - virtualListView1.ItemCount = 0; - virtualListView1.SelectedIndices.Clear(); - } - - private void btnClose_Click(object sender, EventArgs e) - { - Close(); - } - - private void LogWindow_Load(object sender, EventArgs e) - { - if (Global.Config.LogWindowSaveWindowPosition) - { - if (Global.Config.LogWindowSaveWindowPosition && Global.Config.LogWindowWndx >= 0 && Global.Config.LogWindowWndy >= 0) - Location = new Point(Global.Config.LogWindowWndx, Global.Config.LogWindowWndy); - - if (Global.Config.LogWindowWidth >= 0 && Global.Config.LogWindowHeight >= 0) - { - Size = new Size(Global.Config.LogWindowWidth, Global.Config.LogWindowHeight); - } - } - - HideShowGameDbButton(); - } - - public void SaveConfigSettings() - { - if (Global.Config.LogWindowSaveWindowPosition) - { - Global.Config.LogWindowWndx = Location.X; - Global.Config.LogWindowWndy = Location.Y; - Global.Config.LogWindowWidth = Right - Left; - Global.Config.LogWindowHeight = Bottom - Top; - } - } - - private void virtualListView1_QueryItemText(int item, int subItem, out string text) - { - text = Lines[item]; - } - - private void virtualListView1_ClientSizeChanged(object sender, EventArgs e) - { - virtualListView1.Columns[0].Width = virtualListView1.ClientSize.Width; - } - - private void buttonCopy_Click(object sender, EventArgs e) - { - var sb = new StringBuilder(); - foreach (int i in virtualListView1.SelectedIndices) - sb.AppendLine(Lines[i]); - if (sb.Length > 0) - Clipboard.SetText(sb.ToString(), TextDataFormat.Text); - } - - private void buttonCopyAll_Click(object sender, EventArgs e) - { - var sb = new StringBuilder(); - foreach (var s in Lines) - sb.AppendLine(s); - if (sb.Length > 0) - Clipboard.SetText(sb.ToString(), TextDataFormat.Text); - } - - private void virtualListView1_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.C && e.Control && !e.Alt && !e.Shift) - { - buttonCopy_Click(null, null); - } - } - - private void HideShowGameDbButton() - { - AddToGameDbBtn.Visible = Global.Emulator.CanGenerateGameDBEntries() - && (Global.Game.Status == RomStatus.Unknown || Global.Game.Status == RomStatus.NotInDatabase); - } - - private void AddToGameDbBtn_Click(object sender, EventArgs e) - { - var picker = new RomStatusPicker(); - var result = picker.ShowDialog(); - if (result == DialogResult.OK) - { - var gameDbEntry = Global.Emulator.AsGameDBEntryGenerator().GenerateGameDbEntry(); - var userDb = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb_user.txt"); - Global.Game.Status = gameDbEntry.Status = picker.PickedStatus; - Database.SaveDatabaseEntry(userDb, gameDbEntry); - GlobalWin.MainForm.UpdateDumpIcon(); - HideShowGameDbButton(); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs deleted file mode 100644 index 092908ba95..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ /dev/null @@ -1,4726 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.MainformMenu = new MenuStripEx(); - this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.OpenRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RecentRomSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.OpenAdvancedMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CloseRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.LoadNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); - this.AutoloadLastSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveSlotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PreviousSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NextSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveToCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveRAMSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FlushSaveRAMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.MovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ReadonlyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.RecentMovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); - this.RecordMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayFromBeginningMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ImportMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieWithoutSavingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.AutomaticallyBackupMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FullMovieLoadstatesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndFinishMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndRecordMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndStopMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndPauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AVSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.RecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ConfigAndRecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopAVIMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); - this.CaptureOSDMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SynclessRecordingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotClientClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); - this.ScreenshotCaptureOSDMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.EmulationSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RebootCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.SoftResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HardResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.WindowSizeSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.x1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mzMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SwitchToFullscreenMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.DisplayFPSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayFrameCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayLagCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayRerecordCountMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplaySubtitlesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); - this.DisplayStatusBarMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayMessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayLogWindowMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ControllersMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HotkeysMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SoundMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PathsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FirmwaresMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AutofireMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RewindOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extensionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ClientOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ProfilesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.SpeedSkipSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ClockThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AudioThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VsyncThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator27 = new System.Windows.Forms.ToolStripSeparator(); - this.VsyncEnabledMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); - this.miUnthrottled = new System.Windows.Forms.ToolStripMenuItem(); - this.MinimizeSkippingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NeverSkipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator(); - this.Speed50MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed75MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed100MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed150MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed200MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed400MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.KeyPrioritySubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.BothHkAndControllerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.InputOverHkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HkOverInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CoresSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.NesCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.QuicknesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CoreSNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.Coresnes9xMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CorebsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GbaCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.VbaNextCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MgbaCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SGBCoreSubmenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SgbBsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SgbSameBoyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBCoreSubmenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBGambatteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBGBHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator(); - this.allowGameDBCoreOverridesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.N64VideoPluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setLibretroCoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveConfigAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadConfigFromMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolBoxMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.RamWatchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RamSearchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LuaConsoleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TAStudioMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TraceLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CodeDataLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MacroToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VirtualPadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BasicBotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.CheatsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gameSharkConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); - this.MultiDiskBundlerFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.externalToolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dummyExternalTool = new System.Windows.Forms.ToolStripMenuItem(); - this.batchRunnerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ExperimentalToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AutoHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NewHexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.coreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.quickNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.nesHawkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator34 = new System.Windows.Forms.ToolStripSeparator(); - this.NESPPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESNametableViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESGameGenieCodesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.musicRipperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); - this.NesControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESGraphicSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESSoundChannelsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); - this.FDSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FdsEjectDiskMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSInsertCoinP1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSInsertCoinP2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSServiceSwitchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.barcodeReaderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCESubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PceControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator32 = new System.Windows.Forms.ToolStripSeparator(); - this.PCEBGViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEtileViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PceSoundDebuggerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); - this.PCEAlwaysPerformSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEAlwaysEqualizeVolumesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEArcadeCardRewindEnableMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionExportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionJapanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionKoreaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayNtscToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayPalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerPaddleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerLightPhaserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerSportsPadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSControllerKeyboardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMStoolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.SMSenableBIOSToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSEnableFMChipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSOverclockMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSForceStereoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSDisplayOverscanMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSFix3DGameDisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ShowClippedRegionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HighlightActiveDisplayRegionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); - this.SMSVDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GGGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TI83SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.KeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadTIFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.AutoloadKeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.paletteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AtariSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AtariSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.A7800SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.A7800ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.A7800FilterSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBcoreSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator28 = new System.Windows.Forms.ToolStripSeparator(); - this.GBGPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBPrinterViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBASubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBACoreSelectionSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAmGBAMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAVBANextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAcoresettingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator33 = new System.Windows.Forms.ToolStripSeparator(); - this.GbaGpuViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXDiscControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXHashDiscsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SNESControllerConfigurationMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); - this.SnesGfxDebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ColecoSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ColecoControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator35 = new System.Windows.Forms.ToolStripSeparator(); - this.ColecoSkipBiosMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ColecoUseSGMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.N64PluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); - this.N64CircularAnalogRangeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MupenStyleLagMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64ExpansionSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaturnSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SaturnPreferencesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBsettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBHawkSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBHawksettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GenesisSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.vDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GenesisGameGenieECDC = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); - this.GenesisSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.wonderSwanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AppleSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AppleDisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator31 = new System.Windows.Forms.ToolStripSeparator(); - this.settingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.C64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.C64DisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator36 = new System.Windows.Forms.ToolStripSeparator(); - this.C64SettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.IntvSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.IntVControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pCFXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.virtualBoyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.neoGeoPocketToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.HelpSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.OnlineHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ForumsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FeaturesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AboutMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.zXSpectrumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumCoreEmulationSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumControllerConfigurationMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumAudioSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumNonSyncSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumPokeMemoryMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumMediaMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumTapesSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.zxt1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumDisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.zxt2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ZXSpectrumExportSnapshotMenuItemMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.amstradCPCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.amstradCPCCoreEmulationSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AmstradCPCAudioSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AmstradCPCPokeMemoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AmstradCPCMediaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AmstradCPCTapesSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.cpct1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AmstradCPCDisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.cpcd1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Atari7800HawkCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MainStatusBar = new StatusStripEx(); - this.DumpStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.EmuStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.PlayRecordStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.PauseStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.RebootStatusBarIcon = new System.Windows.Forms.ToolStripStatusLabel(); - this.AVIStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.LedLightStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.SaveSlotsStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot1StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot2StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot3StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot4StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot5StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot6StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot7StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot8StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot9StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot0StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.CheatStatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.KeyPriorityStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.CoreNameStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.ProfileFirstBootLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.LinkConnectStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.UpdateNotification = new System.Windows.Forms.ToolStripStatusLabel(); - this.MainFormContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.OpenRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadLastRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopAVContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterROM = new System.Windows.Forms.ToolStripSeparator(); - this.RecordMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RestartMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadLastMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BackupMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopNoSaveContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewSubtitlesContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AddSubtitleContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewCommentsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieAsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterMovie = new System.Windows.Forms.ToolStripSeparator(); - this.UndoSavestateContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterUndo = new System.Windows.Forms.ToolStripSeparator(); - this.ConfigContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); - this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator30 = new System.Windows.Forms.ToolStripSeparator(); - this.SavestateTypeContextSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateTypeDefaultContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateBinaryContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateTextContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator37 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem66 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem67 = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CloseRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ClearSRAMContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ShowMenuContextMenuSeparator = new System.Windows.Forms.ToolStripSeparator(); - this.ShowMenuContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.timerMouseIdle = new System.Windows.Forms.Timer(this.components); - this.AmstradCPCNonSyncSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MainformMenu.SuspendLayout(); - this.MainStatusBar.SuspendLayout(); - this.MainFormContextMenu.SuspendLayout(); - this.SuspendLayout(); - // - // MainformMenu - // - this.MainformMenu.ClickThrough = true; - this.MainformMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FileSubMenu, - this.EmulationSubMenu, - this.ViewSubMenu, - this.ConfigSubMenu, - this.ToolsSubMenu, - this.NESSubMenu, - this.PCESubMenu, - this.SMSSubMenu, - this.TI83SubMenu, - this.AtariSubMenu, - this.A7800SubMenu, - this.GBSubMenu, - this.GBASubMenu, - this.PSXSubMenu, - this.SNESSubMenu, - this.ColecoSubMenu, - this.N64SubMenu, - this.SaturnSubMenu, - this.DGBSubMenu, - this.DGBHawkSubMenu, - this.GenesisSubMenu, - this.wonderSwanToolStripMenuItem, - this.AppleSubMenu, - this.C64SubMenu, - this.IntvSubMenu, - this.sNESToolStripMenuItem, - this.pCFXToolStripMenuItem, - this.virtualBoyToolStripMenuItem, - this.neoGeoPocketToolStripMenuItem, - this.zXSpectrumToolStripMenuItem, - this.HelpSubMenu, - this.amstradCPCToolStripMenuItem}); - this.MainformMenu.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow; - this.MainformMenu.Location = new System.Drawing.Point(0, 0); - this.MainformMenu.Name = "MainformMenu"; - this.MainformMenu.Size = new System.Drawing.Size(470, 80); - this.MainformMenu.TabIndex = 0; - this.MainformMenu.Text = "menuStrip1"; - this.MainformMenu.MenuActivate += new System.EventHandler(this.MainformMenu_MenuActivate); - this.MainformMenu.MenuDeactivate += new System.EventHandler(this.MainformMenu_MenuDeactivate); - this.MainformMenu.Leave += new System.EventHandler(this.MainformMenu_Leave); - // - // FileSubMenu - // - this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.OpenRomMenuItem, - this.RecentRomSubMenu, - this.OpenAdvancedMenuItem, - this.CloseRomMenuItem, - this.toolStripMenuItem1, - this.SaveStateSubMenu, - this.LoadStateSubMenu, - this.SaveSlotSubMenu, - this.SaveRAMSubMenu, - this.toolStripMenuItem2, - this.MovieSubMenu, - this.AVSubMenu, - this.ScreenshotSubMenu, - this.toolStripSeparator4, - this.ExitMenuItem}); - this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(37, 19); - this.FileSubMenu.Text = "&File"; - this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); - // - // OpenRomMenuItem - // - this.OpenRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.OpenRomMenuItem.Name = "OpenRomMenuItem"; - this.OpenRomMenuItem.Size = new System.Drawing.Size(159, 22); - this.OpenRomMenuItem.Text = "&Open ROM"; - this.OpenRomMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); - // - // RecentRomSubMenu - // - this.RecentRomSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripSeparator3}); - this.RecentRomSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.RecentRomSubMenu.Name = "RecentRomSubMenu"; - this.RecentRomSubMenu.Size = new System.Drawing.Size(159, 22); - this.RecentRomSubMenu.Text = "&Recent ROM"; - this.RecentRomSubMenu.DropDownOpened += new System.EventHandler(this.RecentRomMenuItem_DropDownOpened); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(57, 6); - // - // OpenAdvancedMenuItem - // - this.OpenAdvancedMenuItem.Name = "OpenAdvancedMenuItem"; - this.OpenAdvancedMenuItem.Size = new System.Drawing.Size(159, 22); - this.OpenAdvancedMenuItem.Text = "Open Ad&vanced"; - this.OpenAdvancedMenuItem.Click += new System.EventHandler(this.OpenAdvancedMenuItem_Click); - // - // CloseRomMenuItem - // - this.CloseRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; - this.CloseRomMenuItem.Name = "CloseRomMenuItem"; - this.CloseRomMenuItem.Size = new System.Drawing.Size(159, 22); - this.CloseRomMenuItem.Text = "&Close ROM"; - this.CloseRomMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(156, 6); - // - // SaveStateSubMenu - // - this.SaveStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SaveState1MenuItem, - this.SaveState2MenuItem, - this.SaveState3MenuItem, - this.SaveState4MenuItem, - this.SaveState5MenuItem, - this.SaveState6MenuItem, - this.SaveState7MenuItem, - this.SaveState8MenuItem, - this.SaveState9MenuItem, - this.SaveState0MenuItem, - this.toolStripSeparator6, - this.SaveNamedStateMenuItem}); - this.SaveStateSubMenu.Name = "SaveStateSubMenu"; - this.SaveStateSubMenu.Size = new System.Drawing.Size(159, 22); - this.SaveStateSubMenu.Text = "&Save State"; - this.SaveStateSubMenu.DropDownOpened += new System.EventHandler(this.SaveStateSubMenu_DropDownOpened); - // - // SaveState1MenuItem - // - this.SaveState1MenuItem.Name = "SaveState1MenuItem"; - this.SaveState1MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState1MenuItem.Text = "1"; - this.SaveState1MenuItem.Click += new System.EventHandler(this.Savestate1MenuItem_Click); - // - // SaveState2MenuItem - // - this.SaveState2MenuItem.Name = "SaveState2MenuItem"; - this.SaveState2MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState2MenuItem.Text = "2"; - this.SaveState2MenuItem.Click += new System.EventHandler(this.Savestate2MenuItem_Click); - // - // SaveState3MenuItem - // - this.SaveState3MenuItem.Name = "SaveState3MenuItem"; - this.SaveState3MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState3MenuItem.Text = "3"; - this.SaveState3MenuItem.Click += new System.EventHandler(this.Savestate3MenuItem_Click); - // - // SaveState4MenuItem - // - this.SaveState4MenuItem.Name = "SaveState4MenuItem"; - this.SaveState4MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState4MenuItem.Text = "4"; - this.SaveState4MenuItem.Click += new System.EventHandler(this.Savestate4MenuItem_Click); - // - // SaveState5MenuItem - // - this.SaveState5MenuItem.Name = "SaveState5MenuItem"; - this.SaveState5MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState5MenuItem.Text = "5"; - this.SaveState5MenuItem.Click += new System.EventHandler(this.Savestate5MenuItem_Click); - // - // SaveState6MenuItem - // - this.SaveState6MenuItem.Name = "SaveState6MenuItem"; - this.SaveState6MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState6MenuItem.Text = "6"; - this.SaveState6MenuItem.Click += new System.EventHandler(this.Savestate6MenuItem_Click); - // - // SaveState7MenuItem - // - this.SaveState7MenuItem.Name = "SaveState7MenuItem"; - this.SaveState7MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState7MenuItem.Text = "7"; - this.SaveState7MenuItem.Click += new System.EventHandler(this.Savestate7MenuItem_Click); - // - // SaveState8MenuItem - // - this.SaveState8MenuItem.Name = "SaveState8MenuItem"; - this.SaveState8MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState8MenuItem.Text = "8"; - this.SaveState8MenuItem.Click += new System.EventHandler(this.Savestate8MenuItem_Click); - // - // SaveState9MenuItem - // - this.SaveState9MenuItem.Name = "SaveState9MenuItem"; - this.SaveState9MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState9MenuItem.Text = "9"; - this.SaveState9MenuItem.Click += new System.EventHandler(this.Savestate9MenuItem_Click); - // - // SaveState0MenuItem - // - this.SaveState0MenuItem.Name = "SaveState0MenuItem"; - this.SaveState0MenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveState0MenuItem.Text = "0"; - this.SaveState0MenuItem.Click += new System.EventHandler(this.Savestate0MenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(175, 6); - // - // SaveNamedStateMenuItem - // - this.SaveNamedStateMenuItem.Name = "SaveNamedStateMenuItem"; - this.SaveNamedStateMenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveNamedStateMenuItem.Text = "Save Named State..."; - this.SaveNamedStateMenuItem.Click += new System.EventHandler(this.SaveNamedStateMenuItem_Click); - // - // LoadStateSubMenu - // - this.LoadStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.LoadState1MenuItem, - this.LoadState2MenuItem, - this.LoadState3MenuItem, - this.LoadState4MenuItem, - this.LoadState5MenuItem, - this.LoadState6MenuItem, - this.LoadState7MenuItem, - this.LoadState8MenuItem, - this.LoadState9MenuItem, - this.LoadState0MenuItem, - this.toolStripSeparator7, - this.LoadNamedStateMenuItem, - this.toolStripSeparator21, - this.AutoloadLastSlotMenuItem}); - this.LoadStateSubMenu.Name = "LoadStateSubMenu"; - this.LoadStateSubMenu.Size = new System.Drawing.Size(159, 22); - this.LoadStateSubMenu.Text = "&Load State"; - this.LoadStateSubMenu.DropDownOpened += new System.EventHandler(this.LoadStateSubMenu_DropDownOpened); - // - // LoadState1MenuItem - // - this.LoadState1MenuItem.Name = "LoadState1MenuItem"; - this.LoadState1MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState1MenuItem.Text = "1"; - this.LoadState1MenuItem.Click += new System.EventHandler(this.Loadstate1MenuItem_Click); - // - // LoadState2MenuItem - // - this.LoadState2MenuItem.Name = "LoadState2MenuItem"; - this.LoadState2MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState2MenuItem.Text = "2"; - this.LoadState2MenuItem.Click += new System.EventHandler(this.Loadstate2MenuItem_Click); - // - // LoadState3MenuItem - // - this.LoadState3MenuItem.Name = "LoadState3MenuItem"; - this.LoadState3MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState3MenuItem.Text = "3"; - this.LoadState3MenuItem.Click += new System.EventHandler(this.Loadstate3MenuItem_Click); - // - // LoadState4MenuItem - // - this.LoadState4MenuItem.Name = "LoadState4MenuItem"; - this.LoadState4MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState4MenuItem.Text = "4"; - this.LoadState4MenuItem.Click += new System.EventHandler(this.Loadstate4MenuItem_Click); - // - // LoadState5MenuItem - // - this.LoadState5MenuItem.Name = "LoadState5MenuItem"; - this.LoadState5MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState5MenuItem.Text = "5"; - this.LoadState5MenuItem.Click += new System.EventHandler(this.Loadstate5MenuItem_Click); - // - // LoadState6MenuItem - // - this.LoadState6MenuItem.Name = "LoadState6MenuItem"; - this.LoadState6MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState6MenuItem.Text = "6"; - this.LoadState6MenuItem.Click += new System.EventHandler(this.Loadstate6MenuItem_Click); - // - // LoadState7MenuItem - // - this.LoadState7MenuItem.Name = "LoadState7MenuItem"; - this.LoadState7MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState7MenuItem.Text = "7"; - this.LoadState7MenuItem.Click += new System.EventHandler(this.Loadstate7MenuItem_Click); - // - // LoadState8MenuItem - // - this.LoadState8MenuItem.Name = "LoadState8MenuItem"; - this.LoadState8MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState8MenuItem.Text = "8"; - this.LoadState8MenuItem.Click += new System.EventHandler(this.Loadstate8MenuItem_Click); - // - // LoadState9MenuItem - // - this.LoadState9MenuItem.Name = "LoadState9MenuItem"; - this.LoadState9MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState9MenuItem.Text = "9"; - this.LoadState9MenuItem.Click += new System.EventHandler(this.Loadstate9MenuItem_Click); - // - // LoadState0MenuItem - // - this.LoadState0MenuItem.Name = "LoadState0MenuItem"; - this.LoadState0MenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadState0MenuItem.Text = "0"; - this.LoadState0MenuItem.Click += new System.EventHandler(this.Loadstate0MenuItem_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); - // - // LoadNamedStateMenuItem - // - this.LoadNamedStateMenuItem.Name = "LoadNamedStateMenuItem"; - this.LoadNamedStateMenuItem.Size = new System.Drawing.Size(180, 22); - this.LoadNamedStateMenuItem.Text = "Load Named State..."; - this.LoadNamedStateMenuItem.Click += new System.EventHandler(this.LoadNamedStateMenuItem_Click); - // - // toolStripSeparator21 - // - this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(177, 6); - // - // AutoloadLastSlotMenuItem - // - this.AutoloadLastSlotMenuItem.Name = "AutoloadLastSlotMenuItem"; - this.AutoloadLastSlotMenuItem.Size = new System.Drawing.Size(180, 22); - this.AutoloadLastSlotMenuItem.Text = "Autoload last Slot"; - this.AutoloadLastSlotMenuItem.Click += new System.EventHandler(this.AutoloadLastSlotMenuItem_Click); - // - // SaveSlotSubMenu - // - this.SaveSlotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SelectSlot0MenuItem, - this.SelectSlot1MenuItem, - this.SelectSlot2MenuItem, - this.SelectSlot3MenuItem, - this.SelectSlot4MenuItem, - this.SelectSlot5MenuItem, - this.SelectSlot6MenuItem, - this.SelectSlot7MenuItem, - this.SelectSlot8MenuItem, - this.SelectSlot9MenuItem, - this.PreviousSlotMenuItem, - this.NextSlotMenuItem, - this.toolStripSeparator5, - this.SaveToCurrentSlotMenuItem, - this.LoadCurrentSlotMenuItem}); - this.SaveSlotSubMenu.Name = "SaveSlotSubMenu"; - this.SaveSlotSubMenu.Size = new System.Drawing.Size(159, 22); - this.SaveSlotSubMenu.Text = "Save S&lot"; - this.SaveSlotSubMenu.DropDownOpened += new System.EventHandler(this.SaveSlotSubMenu_DropDownOpened); - // - // SelectSlot0MenuItem - // - this.SelectSlot0MenuItem.Name = "SelectSlot0MenuItem"; - this.SelectSlot0MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot0MenuItem.Text = "Select Slot 0"; - this.SelectSlot0MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot1MenuItem - // - this.SelectSlot1MenuItem.Name = "SelectSlot1MenuItem"; - this.SelectSlot1MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot1MenuItem.Text = "Select Slot 1"; - this.SelectSlot1MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot2MenuItem - // - this.SelectSlot2MenuItem.Name = "SelectSlot2MenuItem"; - this.SelectSlot2MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot2MenuItem.Text = "Select Slot 2"; - this.SelectSlot2MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot3MenuItem - // - this.SelectSlot3MenuItem.Name = "SelectSlot3MenuItem"; - this.SelectSlot3MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot3MenuItem.Text = "Select Slot 3"; - this.SelectSlot3MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot4MenuItem - // - this.SelectSlot4MenuItem.Name = "SelectSlot4MenuItem"; - this.SelectSlot4MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot4MenuItem.Text = "Select Slot 4"; - this.SelectSlot4MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot5MenuItem - // - this.SelectSlot5MenuItem.Name = "SelectSlot5MenuItem"; - this.SelectSlot5MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot5MenuItem.Text = "Select Slot 5"; - this.SelectSlot5MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot6MenuItem - // - this.SelectSlot6MenuItem.Name = "SelectSlot6MenuItem"; - this.SelectSlot6MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot6MenuItem.Text = "Select Slot 6"; - this.SelectSlot6MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot7MenuItem - // - this.SelectSlot7MenuItem.Name = "SelectSlot7MenuItem"; - this.SelectSlot7MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot7MenuItem.Text = "Select Slot 7"; - this.SelectSlot7MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot8MenuItem - // - this.SelectSlot8MenuItem.Name = "SelectSlot8MenuItem"; - this.SelectSlot8MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot8MenuItem.Text = "Select Slot 8"; - this.SelectSlot8MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot9MenuItem - // - this.SelectSlot9MenuItem.Name = "SelectSlot9MenuItem"; - this.SelectSlot9MenuItem.Size = new System.Drawing.Size(178, 22); - this.SelectSlot9MenuItem.Text = "Select Slot 9"; - this.SelectSlot9MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // PreviousSlotMenuItem - // - this.PreviousSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveLeft; - this.PreviousSlotMenuItem.Name = "PreviousSlotMenuItem"; - this.PreviousSlotMenuItem.Size = new System.Drawing.Size(178, 22); - this.PreviousSlotMenuItem.Text = "Previous Slot"; - this.PreviousSlotMenuItem.Click += new System.EventHandler(this.PreviousSlotMenuItem_Click); - // - // NextSlotMenuItem - // - this.NextSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveRight; - this.NextSlotMenuItem.Name = "NextSlotMenuItem"; - this.NextSlotMenuItem.Size = new System.Drawing.Size(178, 22); - this.NextSlotMenuItem.Text = "Next Slot"; - this.NextSlotMenuItem.Click += new System.EventHandler(this.NextSlotMenuItem_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(175, 6); - // - // SaveToCurrentSlotMenuItem - // - this.SaveToCurrentSlotMenuItem.Name = "SaveToCurrentSlotMenuItem"; - this.SaveToCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); - this.SaveToCurrentSlotMenuItem.Text = "Save to Current Slot"; - this.SaveToCurrentSlotMenuItem.Click += new System.EventHandler(this.SaveToCurrentSlotMenuItem_Click); - // - // LoadCurrentSlotMenuItem - // - this.LoadCurrentSlotMenuItem.Name = "LoadCurrentSlotMenuItem"; - this.LoadCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); - this.LoadCurrentSlotMenuItem.Text = "Load Current Slot"; - this.LoadCurrentSlotMenuItem.Click += new System.EventHandler(this.LoadCurrentSlotMenuItem_Click); - // - // SaveRAMSubMenu - // - this.SaveRAMSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FlushSaveRAMMenuItem}); - this.SaveRAMSubMenu.Name = "SaveRAMSubMenu"; - this.SaveRAMSubMenu.Size = new System.Drawing.Size(159, 22); - this.SaveRAMSubMenu.Text = "Save &RAM"; - this.SaveRAMSubMenu.DropDownOpened += new System.EventHandler(this.SaveRAMSubMenu_DropDownOpened); - // - // FlushSaveRAMMenuItem - // - this.FlushSaveRAMMenuItem.Name = "FlushSaveRAMMenuItem"; - this.FlushSaveRAMMenuItem.Size = new System.Drawing.Size(156, 22); - this.FlushSaveRAMMenuItem.Text = "&Flush Save Ram"; - this.FlushSaveRAMMenuItem.Click += new System.EventHandler(this.FlushSaveRAMMenuItem_Click); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(156, 6); - // - // MovieSubMenu - // - this.MovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ReadonlyMenuItem, - this.toolStripSeparator15, - this.RecentMovieSubMenu, - this.RecordMovieMenuItem, - this.PlayMovieMenuItem, - this.StopMovieMenuItem, - this.PlayFromBeginningMenuItem, - this.ImportMoviesMenuItem, - this.SaveMovieMenuItem, - this.SaveMovieAsMenuItem, - this.StopMovieWithoutSavingMenuItem, - this.toolStripSeparator14, - this.AutomaticallyBackupMoviesMenuItem, - this.FullMovieLoadstatesMenuItem, - this.MovieEndSubMenu}); - this.MovieSubMenu.Name = "MovieSubMenu"; - this.MovieSubMenu.Size = new System.Drawing.Size(159, 22); - this.MovieSubMenu.Text = "&Movie"; - this.MovieSubMenu.DropDownOpened += new System.EventHandler(this.MovieSubMenu_DropDownOpened); - // - // ReadonlyMenuItem - // - this.ReadonlyMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ReadOnly; - this.ReadonlyMenuItem.Name = "ReadonlyMenuItem"; - this.ReadonlyMenuItem.Size = new System.Drawing.Size(231, 22); - this.ReadonlyMenuItem.Text = "Read-only"; - this.ReadonlyMenuItem.Click += new System.EventHandler(this.ReadonlyMenuItem_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(228, 6); - // - // RecentMovieSubMenu - // - this.RecentMovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripSeparator16}); - this.RecentMovieSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.RecentMovieSubMenu.Name = "RecentMovieSubMenu"; - this.RecentMovieSubMenu.Size = new System.Drawing.Size(231, 22); - this.RecentMovieSubMenu.Text = "Recent"; - this.RecentMovieSubMenu.DropDownOpened += new System.EventHandler(this.RecentMovieSubMenu_DropDownOpened); - // - // toolStripSeparator16 - // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(57, 6); - // - // RecordMovieMenuItem - // - this.RecordMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordMovieMenuItem.Name = "RecordMovieMenuItem"; - this.RecordMovieMenuItem.Size = new System.Drawing.Size(231, 22); - this.RecordMovieMenuItem.Text = "&Record Movie..."; - this.RecordMovieMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); - // - // PlayMovieMenuItem - // - this.PlayMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.PlayMovieMenuItem.Name = "PlayMovieMenuItem"; - this.PlayMovieMenuItem.Size = new System.Drawing.Size(231, 22); - this.PlayMovieMenuItem.Text = "&Play Movie..."; - this.PlayMovieMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); - // - // StopMovieMenuItem - // - this.StopMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieMenuItem.Name = "StopMovieMenuItem"; - this.StopMovieMenuItem.Size = new System.Drawing.Size(231, 22); - this.StopMovieMenuItem.Text = "Stop Movie"; - this.StopMovieMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); - // - // PlayFromBeginningMenuItem - // - this.PlayFromBeginningMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; - this.PlayFromBeginningMenuItem.Name = "PlayFromBeginningMenuItem"; - this.PlayFromBeginningMenuItem.Size = new System.Drawing.Size(231, 22); - this.PlayFromBeginningMenuItem.Text = "Play from Beginning"; - this.PlayFromBeginningMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); - // - // ImportMoviesMenuItem - // - this.ImportMoviesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Import; - this.ImportMoviesMenuItem.Name = "ImportMoviesMenuItem"; - this.ImportMoviesMenuItem.Size = new System.Drawing.Size(231, 22); - this.ImportMoviesMenuItem.Text = "Import Movies..."; - this.ImportMoviesMenuItem.Click += new System.EventHandler(this.ImportMovieMenuItem_Click); - // - // SaveMovieMenuItem - // - this.SaveMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieMenuItem.Name = "SaveMovieMenuItem"; - this.SaveMovieMenuItem.Size = new System.Drawing.Size(231, 22); - this.SaveMovieMenuItem.Text = "&Save Movie"; - this.SaveMovieMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); - // - // SaveMovieAsMenuItem - // - this.SaveMovieAsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieAsMenuItem.Name = "SaveMovieAsMenuItem"; - this.SaveMovieAsMenuItem.Size = new System.Drawing.Size(231, 22); - this.SaveMovieAsMenuItem.Text = "Save Movie As..."; - this.SaveMovieAsMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); - // - // StopMovieWithoutSavingMenuItem - // - this.StopMovieWithoutSavingMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieWithoutSavingMenuItem.Name = "StopMovieWithoutSavingMenuItem"; - this.StopMovieWithoutSavingMenuItem.Size = new System.Drawing.Size(231, 22); - this.StopMovieWithoutSavingMenuItem.Text = "Stop Movie without Saving"; - this.StopMovieWithoutSavingMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(228, 6); - // - // AutomaticallyBackupMoviesMenuItem - // - this.AutomaticallyBackupMoviesMenuItem.Name = "AutomaticallyBackupMoviesMenuItem"; - this.AutomaticallyBackupMoviesMenuItem.Size = new System.Drawing.Size(231, 22); - this.AutomaticallyBackupMoviesMenuItem.Text = "Automatically Backup Movies"; - this.AutomaticallyBackupMoviesMenuItem.Click += new System.EventHandler(this.AutomaticMovieBackupMenuItem_Click); - // - // FullMovieLoadstatesMenuItem - // - this.FullMovieLoadstatesMenuItem.Name = "FullMovieLoadstatesMenuItem"; - this.FullMovieLoadstatesMenuItem.Size = new System.Drawing.Size(231, 22); - this.FullMovieLoadstatesMenuItem.Text = "Full Movie Loadstates"; - this.FullMovieLoadstatesMenuItem.Click += new System.EventHandler(this.FullMovieLoadstatesMenuItem_Click); - // - // MovieEndSubMenu - // - this.MovieEndSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MovieEndFinishMenuItem, - this.MovieEndRecordMenuItem, - this.MovieEndStopMenuItem, - this.MovieEndPauseMenuItem}); - this.MovieEndSubMenu.Name = "MovieEndSubMenu"; - this.MovieEndSubMenu.Size = new System.Drawing.Size(231, 22); - this.MovieEndSubMenu.Text = "On Movie End"; - this.MovieEndSubMenu.DropDownOpened += new System.EventHandler(this.MovieEndSubMenu_DropDownOpened); - // - // MovieEndFinishMenuItem - // - this.MovieEndFinishMenuItem.Name = "MovieEndFinishMenuItem"; - this.MovieEndFinishMenuItem.Size = new System.Drawing.Size(170, 22); - this.MovieEndFinishMenuItem.Text = "Switch to Finished"; - this.MovieEndFinishMenuItem.Click += new System.EventHandler(this.MovieEndFinishMenuItem_Click); - // - // MovieEndRecordMenuItem - // - this.MovieEndRecordMenuItem.Name = "MovieEndRecordMenuItem"; - this.MovieEndRecordMenuItem.Size = new System.Drawing.Size(170, 22); - this.MovieEndRecordMenuItem.Text = "Switch To Record"; - this.MovieEndRecordMenuItem.Click += new System.EventHandler(this.MovieEndRecordMenuItem_Click); - // - // MovieEndStopMenuItem - // - this.MovieEndStopMenuItem.Name = "MovieEndStopMenuItem"; - this.MovieEndStopMenuItem.Size = new System.Drawing.Size(170, 22); - this.MovieEndStopMenuItem.Text = "Stop"; - this.MovieEndStopMenuItem.Click += new System.EventHandler(this.MovieEndStopMenuItem_Click); - // - // MovieEndPauseMenuItem - // - this.MovieEndPauseMenuItem.Name = "MovieEndPauseMenuItem"; - this.MovieEndPauseMenuItem.Size = new System.Drawing.Size(170, 22); - this.MovieEndPauseMenuItem.Text = "Pause"; - this.MovieEndPauseMenuItem.Click += new System.EventHandler(this.MovieEndPauseMenuItem_Click); - // - // AVSubMenu - // - this.AVSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.RecordAVMenuItem, - this.ConfigAndRecordAVMenuItem, - this.StopAVIMenuItem, - this.toolStripSeparator19, - this.CaptureOSDMenuItem, - this.SynclessRecordingMenuItem}); - this.AVSubMenu.Name = "AVSubMenu"; - this.AVSubMenu.Size = new System.Drawing.Size(159, 22); - this.AVSubMenu.Text = "&AVI/WAV"; - this.AVSubMenu.DropDownOpened += new System.EventHandler(this.AVSubMenu_DropDownOpened); - // - // RecordAVMenuItem - // - this.RecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordAVMenuItem.Name = "RecordAVMenuItem"; - this.RecordAVMenuItem.Size = new System.Drawing.Size(225, 22); - this.RecordAVMenuItem.Text = "&Record AVI/WAV"; - this.RecordAVMenuItem.Click += new System.EventHandler(this.RecordAVMenuItem_Click); - // - // ConfigAndRecordAVMenuItem - // - this.ConfigAndRecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AVI; - this.ConfigAndRecordAVMenuItem.Name = "ConfigAndRecordAVMenuItem"; - this.ConfigAndRecordAVMenuItem.Size = new System.Drawing.Size(225, 22); - this.ConfigAndRecordAVMenuItem.Text = "Config and Record AVI/WAV"; - this.ConfigAndRecordAVMenuItem.Click += new System.EventHandler(this.ConfigAndRecordAVMenuItem_Click); - // - // StopAVIMenuItem - // - this.StopAVIMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopAVIMenuItem.Name = "StopAVIMenuItem"; - this.StopAVIMenuItem.Size = new System.Drawing.Size(225, 22); - this.StopAVIMenuItem.Text = "&Stop AVI/WAV"; - this.StopAVIMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); - // - // toolStripSeparator19 - // - this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(222, 6); - // - // CaptureOSDMenuItem - // - this.CaptureOSDMenuItem.Name = "CaptureOSDMenuItem"; - this.CaptureOSDMenuItem.Size = new System.Drawing.Size(225, 22); - this.CaptureOSDMenuItem.Text = "Capture OSD"; - this.CaptureOSDMenuItem.Click += new System.EventHandler(this.CaptureOSDMenuItem_Click); - // - // SynclessRecordingMenuItem - // - this.SynclessRecordingMenuItem.Name = "SynclessRecordingMenuItem"; - this.SynclessRecordingMenuItem.Size = new System.Drawing.Size(225, 22); - this.SynclessRecordingMenuItem.Text = "S&yncless Recording Tools"; - this.SynclessRecordingMenuItem.Click += new System.EventHandler(this.SynclessRecordingMenuItem_Click); - // - // ScreenshotSubMenu - // - this.ScreenshotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ScreenshotMenuItem, - this.ScreenshotAsMenuItem, - this.ScreenshotClipboardMenuItem, - this.ScreenshotClientClipboardMenuItem, - this.toolStripSeparator20, - this.ScreenshotCaptureOSDMenuItem1}); - this.ScreenshotSubMenu.Name = "ScreenshotSubMenu"; - this.ScreenshotSubMenu.Size = new System.Drawing.Size(159, 22); - this.ScreenshotSubMenu.Text = "Scree&nshot"; - this.ScreenshotSubMenu.DropDownOpening += new System.EventHandler(this.ScreenshotSubMenu_DropDownOpening); - // - // ScreenshotMenuItem - // - this.ScreenshotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; - this.ScreenshotMenuItem.Name = "ScreenshotMenuItem"; - this.ScreenshotMenuItem.Size = new System.Drawing.Size(243, 22); - this.ScreenshotMenuItem.Text = "Screenshot"; - this.ScreenshotMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); - // - // ScreenshotAsMenuItem - // - this.ScreenshotAsMenuItem.Name = "ScreenshotAsMenuItem"; - this.ScreenshotAsMenuItem.Size = new System.Drawing.Size(243, 22); - this.ScreenshotAsMenuItem.Text = "Screenshot As..."; - this.ScreenshotAsMenuItem.Click += new System.EventHandler(this.ScreenshotAsMenuItem_Click); - // - // ScreenshotClipboardMenuItem - // - this.ScreenshotClipboardMenuItem.Name = "ScreenshotClipboardMenuItem"; - this.ScreenshotClipboardMenuItem.Size = new System.Drawing.Size(243, 22); - this.ScreenshotClipboardMenuItem.Text = "Screenshot (raw) -> Clipboard"; - this.ScreenshotClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClipboardMenuItem_Click); - // - // ScreenshotClientClipboardMenuItem - // - this.ScreenshotClientClipboardMenuItem.Name = "ScreenshotClientClipboardMenuItem"; - this.ScreenshotClientClipboardMenuItem.Size = new System.Drawing.Size(243, 22); - this.ScreenshotClientClipboardMenuItem.Text = "Screenshot (client) -> Clipboard"; - this.ScreenshotClientClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClientClipboardMenuItem_Click); - // - // toolStripSeparator20 - // - this.toolStripSeparator20.Name = "toolStripSeparator20"; - this.toolStripSeparator20.Size = new System.Drawing.Size(240, 6); - // - // ScreenshotCaptureOSDMenuItem1 - // - this.ScreenshotCaptureOSDMenuItem1.Name = "ScreenshotCaptureOSDMenuItem1"; - this.ScreenshotCaptureOSDMenuItem1.Size = new System.Drawing.Size(243, 22); - this.ScreenshotCaptureOSDMenuItem1.Text = "Capture OSD"; - this.ScreenshotCaptureOSDMenuItem1.Click += new System.EventHandler(this.ScreenshotCaptureOSDMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(156, 6); - // - // ExitMenuItem - // - this.ExitMenuItem.Name = "ExitMenuItem"; - this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(159, 22); - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); - // - // EmulationSubMenu - // - this.EmulationSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.PauseMenuItem, - this.RebootCoreMenuItem, - this.toolStripSeparator1, - this.SoftResetMenuItem, - this.HardResetMenuItem}); - this.EmulationSubMenu.Name = "EmulationSubMenu"; - this.EmulationSubMenu.Size = new System.Drawing.Size(73, 19); - this.EmulationSubMenu.Text = "&Emulation"; - this.EmulationSubMenu.DropDownOpened += new System.EventHandler(this.EmulationMenuItem_DropDownOpened); - // - // PauseMenuItem - // - this.PauseMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Pause; - this.PauseMenuItem.Name = "PauseMenuItem"; - this.PauseMenuItem.Size = new System.Drawing.Size(140, 22); - this.PauseMenuItem.Text = "&Pause"; - this.PauseMenuItem.Click += new System.EventHandler(this.PauseMenuItem_Click); - // - // RebootCoreMenuItem - // - this.RebootCoreMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; - this.RebootCoreMenuItem.Name = "RebootCoreMenuItem"; - this.RebootCoreMenuItem.Size = new System.Drawing.Size(140, 22); - this.RebootCoreMenuItem.Text = "&Reboot Core"; - this.RebootCoreMenuItem.Click += new System.EventHandler(this.PowerMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(137, 6); - // - // SoftResetMenuItem - // - this.SoftResetMenuItem.Name = "SoftResetMenuItem"; - this.SoftResetMenuItem.Size = new System.Drawing.Size(140, 22); - this.SoftResetMenuItem.Text = "&Soft Reset"; - this.SoftResetMenuItem.Click += new System.EventHandler(this.SoftResetMenuItem_Click); - // - // HardResetMenuItem - // - this.HardResetMenuItem.Name = "HardResetMenuItem"; - this.HardResetMenuItem.Size = new System.Drawing.Size(140, 22); - this.HardResetMenuItem.Text = "&Hard Reset"; - this.HardResetMenuItem.Click += new System.EventHandler(this.HardResetMenuItem_Click); - // - // ViewSubMenu - // - this.ViewSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.WindowSizeSubMenu, - this.SwitchToFullscreenMenuItem, - this.toolStripSeparator2, - this.DisplayFPSMenuItem, - this.DisplayFrameCounterMenuItem, - this.DisplayLagCounterMenuItem, - this.DisplayInputMenuItem, - this.DisplayRerecordCountMenuItem, - this.DisplaySubtitlesMenuItem, - this.toolStripMenuItem4, - this.DisplayStatusBarMenuItem, - this.DisplayMessagesMenuItem, - this.DisplayLogWindowMenuItem}); - this.ViewSubMenu.Name = "ViewSubMenu"; - this.ViewSubMenu.Size = new System.Drawing.Size(44, 19); - this.ViewSubMenu.Text = "&View"; - this.ViewSubMenu.DropDownOpened += new System.EventHandler(this.ViewSubMenu_DropDownOpened); - // - // WindowSizeSubMenu - // - this.WindowSizeSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.x1MenuItem, - this.x2MenuItem, - this.x3MenuItem, - this.x4MenuItem, - this.x5MenuItem, - this.mzMenuItem}); - this.WindowSizeSubMenu.Name = "WindowSizeSubMenu"; - this.WindowSizeSubMenu.Size = new System.Drawing.Size(198, 22); - this.WindowSizeSubMenu.Text = "&Window Size"; - this.WindowSizeSubMenu.DropDownOpened += new System.EventHandler(this.WindowSizeSubMenu_DropDownOpened); - // - // x1MenuItem - // - this.x1MenuItem.Name = "x1MenuItem"; - this.x1MenuItem.Size = new System.Drawing.Size(96, 22); - this.x1MenuItem.Text = "&1x"; - this.x1MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x2MenuItem - // - this.x2MenuItem.Name = "x2MenuItem"; - this.x2MenuItem.Size = new System.Drawing.Size(96, 22); - this.x2MenuItem.Text = "&2x"; - this.x2MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x3MenuItem - // - this.x3MenuItem.Name = "x3MenuItem"; - this.x3MenuItem.Size = new System.Drawing.Size(96, 22); - this.x3MenuItem.Text = "&3x"; - this.x3MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x4MenuItem - // - this.x4MenuItem.Name = "x4MenuItem"; - this.x4MenuItem.Size = new System.Drawing.Size(96, 22); - this.x4MenuItem.Text = "&4x"; - this.x4MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x5MenuItem - // - this.x5MenuItem.Name = "x5MenuItem"; - this.x5MenuItem.Size = new System.Drawing.Size(96, 22); - this.x5MenuItem.Text = "&5x"; - this.x5MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // mzMenuItem - // - this.mzMenuItem.Name = "mzMenuItem"; - this.mzMenuItem.Size = new System.Drawing.Size(96, 22); - this.mzMenuItem.Text = "&Max"; - this.mzMenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // SwitchToFullscreenMenuItem - // - this.SwitchToFullscreenMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Fullscreen; - this.SwitchToFullscreenMenuItem.Name = "SwitchToFullscreenMenuItem"; - this.SwitchToFullscreenMenuItem.Size = new System.Drawing.Size(198, 22); - this.SwitchToFullscreenMenuItem.Text = "Switch to Fullscreen"; - this.SwitchToFullscreenMenuItem.Click += new System.EventHandler(this.SwitchToFullscreenMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(195, 6); - // - // DisplayFPSMenuItem - // - this.DisplayFPSMenuItem.Name = "DisplayFPSMenuItem"; - this.DisplayFPSMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayFPSMenuItem.Text = "Display FPS"; - this.DisplayFPSMenuItem.Click += new System.EventHandler(this.DisplayFpsMenuItem_Click); - // - // DisplayFrameCounterMenuItem - // - this.DisplayFrameCounterMenuItem.Name = "DisplayFrameCounterMenuItem"; - this.DisplayFrameCounterMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayFrameCounterMenuItem.Text = "Display FrameCounter"; - this.DisplayFrameCounterMenuItem.Click += new System.EventHandler(this.DisplayFrameCounterMenuItem_Click); - // - // DisplayLagCounterMenuItem - // - this.DisplayLagCounterMenuItem.Name = "DisplayLagCounterMenuItem"; - this.DisplayLagCounterMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayLagCounterMenuItem.Text = "Display Lag Counter"; - this.DisplayLagCounterMenuItem.Click += new System.EventHandler(this.DisplayLagCounterMenuItem_Click); - // - // DisplayInputMenuItem - // - this.DisplayInputMenuItem.Name = "DisplayInputMenuItem"; - this.DisplayInputMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayInputMenuItem.Text = "Display Input"; - this.DisplayInputMenuItem.Click += new System.EventHandler(this.DisplayInputMenuItem_Click); - // - // DisplayRerecordCountMenuItem - // - this.DisplayRerecordCountMenuItem.Name = "DisplayRerecordCountMenuItem"; - this.DisplayRerecordCountMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayRerecordCountMenuItem.Text = "Display Rerecord Count"; - this.DisplayRerecordCountMenuItem.Click += new System.EventHandler(this.DisplayRerecordsMenuItem_Click); - // - // DisplaySubtitlesMenuItem - // - this.DisplaySubtitlesMenuItem.Name = "DisplaySubtitlesMenuItem"; - this.DisplaySubtitlesMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplaySubtitlesMenuItem.Text = "Display Subtitles"; - this.DisplaySubtitlesMenuItem.Click += new System.EventHandler(this.DisplaySubtitlesMenuItem_Click); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(195, 6); - // - // DisplayStatusBarMenuItem - // - this.DisplayStatusBarMenuItem.Name = "DisplayStatusBarMenuItem"; - this.DisplayStatusBarMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayStatusBarMenuItem.Text = "Display Status Bar"; - this.DisplayStatusBarMenuItem.Click += new System.EventHandler(this.DisplayStatusBarMenuItem_Click); - // - // DisplayMessagesMenuItem - // - this.DisplayMessagesMenuItem.Name = "DisplayMessagesMenuItem"; - this.DisplayMessagesMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayMessagesMenuItem.Text = "Display Messages"; - this.DisplayMessagesMenuItem.Click += new System.EventHandler(this.DisplayMessagesMenuItem_Click); - // - // DisplayLogWindowMenuItem - // - this.DisplayLogWindowMenuItem.Name = "DisplayLogWindowMenuItem"; - this.DisplayLogWindowMenuItem.Size = new System.Drawing.Size(198, 22); - this.DisplayLogWindowMenuItem.Text = "Display Log Window"; - this.DisplayLogWindowMenuItem.Click += new System.EventHandler(this.DisplayLogWindowMenuItem_Click); - // - // ConfigSubMenu - // - this.ConfigSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ControllersMenuItem, - this.HotkeysMenuItem, - this.DisplayConfigMenuItem, - this.SoundMenuItem, - this.PathsMenuItem, - this.FirmwaresMenuItem, - this.MessagesMenuItem, - this.AutofireMenuItem, - this.RewindOptionsMenuItem, - this.extensionsToolStripMenuItem, - this.ClientOptionsMenuItem, - this.ProfilesMenuItem, - this.toolStripSeparator9, - this.SpeedSkipSubMenu, - this.KeyPrioritySubMenu, - this.CoresSubMenu, - this.toolStripSeparator10, - this.SaveConfigMenuItem, - this.SaveConfigAsMenuItem, - this.LoadConfigMenuItem, - this.LoadConfigFromMenuItem}); - this.ConfigSubMenu.Name = "ConfigSubMenu"; - this.ConfigSubMenu.Size = new System.Drawing.Size(55, 19); - this.ConfigSubMenu.Text = "&Config"; - this.ConfigSubMenu.DropDownOpened += new System.EventHandler(this.ConfigSubMenu_DropDownOpened); - // - // ControllersMenuItem - // - this.ControllersMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.ControllersMenuItem.Name = "ControllersMenuItem"; - this.ControllersMenuItem.Size = new System.Drawing.Size(179, 22); - this.ControllersMenuItem.Text = "&Controllers..."; - this.ControllersMenuItem.Click += new System.EventHandler(this.ControllersMenuItem_Click); - // - // HotkeysMenuItem - // - this.HotkeysMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; - this.HotkeysMenuItem.Name = "HotkeysMenuItem"; - this.HotkeysMenuItem.Size = new System.Drawing.Size(179, 22); - this.HotkeysMenuItem.Text = "&Hotkeys..."; - this.HotkeysMenuItem.Click += new System.EventHandler(this.HotkeysMenuItem_Click); - // - // DisplayConfigMenuItem - // - this.DisplayConfigMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("DisplayConfigMenuItem.Image"))); - this.DisplayConfigMenuItem.Name = "DisplayConfigMenuItem"; - this.DisplayConfigMenuItem.Size = new System.Drawing.Size(179, 22); - this.DisplayConfigMenuItem.Text = "Display..."; - this.DisplayConfigMenuItem.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); - // - // SoundMenuItem - // - this.SoundMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.SoundMenuItem.Name = "SoundMenuItem"; - this.SoundMenuItem.Size = new System.Drawing.Size(179, 22); - this.SoundMenuItem.Text = "&Sound..."; - this.SoundMenuItem.Click += new System.EventHandler(this.SoundMenuItem_Click); - // - // PathsMenuItem - // - this.PathsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; - this.PathsMenuItem.Name = "PathsMenuItem"; - this.PathsMenuItem.Size = new System.Drawing.Size(179, 22); - this.PathsMenuItem.Text = "Paths..."; - this.PathsMenuItem.Click += new System.EventHandler(this.PathsMenuItem_Click); - // - // FirmwaresMenuItem - // - this.FirmwaresMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("FirmwaresMenuItem.Image"))); - this.FirmwaresMenuItem.Name = "FirmwaresMenuItem"; - this.FirmwaresMenuItem.Size = new System.Drawing.Size(179, 22); - this.FirmwaresMenuItem.Text = "&Firmwares..."; - this.FirmwaresMenuItem.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); - // - // MessagesMenuItem - // - this.MessagesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; - this.MessagesMenuItem.Name = "MessagesMenuItem"; - this.MessagesMenuItem.Size = new System.Drawing.Size(179, 22); - this.MessagesMenuItem.Text = "&Messages..."; - this.MessagesMenuItem.Click += new System.EventHandler(this.MessagesMenuItem_Click); - // - // AutofireMenuItem - // - this.AutofireMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; - this.AutofireMenuItem.Name = "AutofireMenuItem"; - this.AutofireMenuItem.Size = new System.Drawing.Size(179, 22); - this.AutofireMenuItem.Text = "&Autofire..."; - this.AutofireMenuItem.Click += new System.EventHandler(this.AutofireMenuItem_Click); - // - // RewindOptionsMenuItem - // - this.RewindOptionsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; - this.RewindOptionsMenuItem.Name = "RewindOptionsMenuItem"; - this.RewindOptionsMenuItem.Size = new System.Drawing.Size(179, 22); - this.RewindOptionsMenuItem.Text = "&Rewind && States..."; - this.RewindOptionsMenuItem.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); - // - // extensionsToolStripMenuItem - // - this.extensionsToolStripMenuItem.Name = "extensionsToolStripMenuItem"; - this.extensionsToolStripMenuItem.Size = new System.Drawing.Size(179, 22); - this.extensionsToolStripMenuItem.Text = "File Extensions..."; - this.extensionsToolStripMenuItem.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); - // - // ClientOptionsMenuItem - // - this.ClientOptionsMenuItem.Name = "ClientOptionsMenuItem"; - this.ClientOptionsMenuItem.Size = new System.Drawing.Size(179, 22); - this.ClientOptionsMenuItem.Text = "&Customize..."; - this.ClientOptionsMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); - // - // ProfilesMenuItem - // - this.ProfilesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; - this.ProfilesMenuItem.Name = "ProfilesMenuItem"; - this.ProfilesMenuItem.Size = new System.Drawing.Size(179, 22); - this.ProfilesMenuItem.Text = "&Profiles..."; - this.ProfilesMenuItem.Click += new System.EventHandler(this.ProfilesMenuItem_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(176, 6); - // - // SpeedSkipSubMenu - // - this.SpeedSkipSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ClockThrottleMenuItem, - this.AudioThrottleMenuItem, - this.VsyncThrottleMenuItem, - this.toolStripSeparator27, - this.VsyncEnabledMenuItem, - this.toolStripMenuItem3, - this.miUnthrottled, - this.MinimizeSkippingMenuItem, - this.NeverSkipMenuItem, - this.toolStripMenuItem17, - this.toolStripMenuItem5, - this.Speed50MenuItem, - this.Speed75MenuItem, - this.Speed100MenuItem, - this.Speed150MenuItem, - this.Speed200MenuItem, - this.Speed400MenuItem}); - this.SpeedSkipSubMenu.Name = "SpeedSkipSubMenu"; - this.SpeedSkipSubMenu.Size = new System.Drawing.Size(179, 22); - this.SpeedSkipSubMenu.Text = "Speed/Skip"; - this.SpeedSkipSubMenu.DropDownOpened += new System.EventHandler(this.FrameSkipMenuItem_DropDownOpened); - // - // ClockThrottleMenuItem - // - this.ClockThrottleMenuItem.Name = "ClockThrottleMenuItem"; - this.ClockThrottleMenuItem.Size = new System.Drawing.Size(202, 22); - this.ClockThrottleMenuItem.Text = "Clock Throttle"; - this.ClockThrottleMenuItem.Click += new System.EventHandler(this.ClockThrottleMenuItem_Click); - // - // AudioThrottleMenuItem - // - this.AudioThrottleMenuItem.Name = "AudioThrottleMenuItem"; - this.AudioThrottleMenuItem.Size = new System.Drawing.Size(202, 22); - this.AudioThrottleMenuItem.Text = "Audio Throttle"; - this.AudioThrottleMenuItem.Click += new System.EventHandler(this.AudioThrottleMenuItem_Click); - // - // VsyncThrottleMenuItem - // - this.VsyncThrottleMenuItem.Name = "VsyncThrottleMenuItem"; - this.VsyncThrottleMenuItem.Size = new System.Drawing.Size(202, 22); - this.VsyncThrottleMenuItem.Text = "VSync Throttle"; - this.VsyncThrottleMenuItem.Click += new System.EventHandler(this.VsyncThrottleMenuItem_Click); - // - // toolStripSeparator27 - // - this.toolStripSeparator27.Name = "toolStripSeparator27"; - this.toolStripSeparator27.Size = new System.Drawing.Size(199, 6); - // - // VsyncEnabledMenuItem - // - this.VsyncEnabledMenuItem.Name = "VsyncEnabledMenuItem"; - this.VsyncEnabledMenuItem.Size = new System.Drawing.Size(202, 22); - this.VsyncEnabledMenuItem.Text = "VSync Enabled"; - this.VsyncEnabledMenuItem.Click += new System.EventHandler(this.VsyncEnabledMenuItem_Click); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(199, 6); - // - // miUnthrottled - // - this.miUnthrottled.Name = "miUnthrottled"; - this.miUnthrottled.Size = new System.Drawing.Size(202, 22); - this.miUnthrottled.Text = "Unthrottled"; - this.miUnthrottled.Click += new System.EventHandler(this.UnthrottledMenuItem_Click); - // - // MinimizeSkippingMenuItem - // - this.MinimizeSkippingMenuItem.Name = "MinimizeSkippingMenuItem"; - this.MinimizeSkippingMenuItem.Size = new System.Drawing.Size(202, 22); - this.MinimizeSkippingMenuItem.Text = "Auto-minimize skipping"; - this.MinimizeSkippingMenuItem.Click += new System.EventHandler(this.MinimizeSkippingMenuItem_Click); - // - // NeverSkipMenuItem - // - this.NeverSkipMenuItem.Name = "NeverSkipMenuItem"; - this.NeverSkipMenuItem.Size = new System.Drawing.Size(202, 22); - this.NeverSkipMenuItem.Text = "Skip 0 (never)"; - this.NeverSkipMenuItem.Click += new System.EventHandler(this.NeverSkipMenuItem_Click); - // - // toolStripMenuItem17 - // - this.toolStripMenuItem17.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.Frameskip1MenuItem, - this.Frameskip2MenuItem, - this.Frameskip3MenuItem, - this.Frameskip4MenuItem, - this.Frameskip5MenuItem, - this.Frameskip6MenuItem, - this.Frameskip7MenuItem, - this.Frameskip8MenuItem, - this.Frameskip9MenuItem}); - this.toolStripMenuItem17.Name = "toolStripMenuItem17"; - this.toolStripMenuItem17.Size = new System.Drawing.Size(202, 22); - this.toolStripMenuItem17.Text = "Skip 1..9"; - // - // Frameskip1MenuItem - // - this.Frameskip1MenuItem.Name = "Frameskip1MenuItem"; - this.Frameskip1MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip1MenuItem.Text = "1"; - this.Frameskip1MenuItem.Click += new System.EventHandler(this.Frameskip1MenuItem_Click); - // - // Frameskip2MenuItem - // - this.Frameskip2MenuItem.Name = "Frameskip2MenuItem"; - this.Frameskip2MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip2MenuItem.Text = "2"; - this.Frameskip2MenuItem.Click += new System.EventHandler(this.Frameskip2MenuItem_Click); - // - // Frameskip3MenuItem - // - this.Frameskip3MenuItem.Name = "Frameskip3MenuItem"; - this.Frameskip3MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip3MenuItem.Text = "3"; - this.Frameskip3MenuItem.Click += new System.EventHandler(this.Frameskip3MenuItem_Click); - // - // Frameskip4MenuItem - // - this.Frameskip4MenuItem.Name = "Frameskip4MenuItem"; - this.Frameskip4MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip4MenuItem.Text = "4"; - this.Frameskip4MenuItem.Click += new System.EventHandler(this.Frameskip4MenuItem_Click); - // - // Frameskip5MenuItem - // - this.Frameskip5MenuItem.Name = "Frameskip5MenuItem"; - this.Frameskip5MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip5MenuItem.Text = "5"; - this.Frameskip5MenuItem.Click += new System.EventHandler(this.Frameskip5MenuItem_Click); - // - // Frameskip6MenuItem - // - this.Frameskip6MenuItem.Name = "Frameskip6MenuItem"; - this.Frameskip6MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip6MenuItem.Text = "6"; - this.Frameskip6MenuItem.Click += new System.EventHandler(this.Frameskip6MenuItem_Click); - // - // Frameskip7MenuItem - // - this.Frameskip7MenuItem.Name = "Frameskip7MenuItem"; - this.Frameskip7MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip7MenuItem.Text = "7"; - this.Frameskip7MenuItem.Click += new System.EventHandler(this.Frameskip7MenuItem_Click); - // - // Frameskip8MenuItem - // - this.Frameskip8MenuItem.Name = "Frameskip8MenuItem"; - this.Frameskip8MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip8MenuItem.Text = "8"; - this.Frameskip8MenuItem.Click += new System.EventHandler(this.Frameskip8MenuItem_Click); - // - // Frameskip9MenuItem - // - this.Frameskip9MenuItem.Name = "Frameskip9MenuItem"; - this.Frameskip9MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip9MenuItem.Text = "9"; - this.Frameskip9MenuItem.Click += new System.EventHandler(this.Frameskip9MenuItem_Click); - // - // toolStripMenuItem5 - // - this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(199, 6); - // - // Speed50MenuItem - // - this.Speed50MenuItem.Name = "Speed50MenuItem"; - this.Speed50MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed50MenuItem.Text = "Speed 50%"; - this.Speed50MenuItem.Click += new System.EventHandler(this.Speed50MenuItem_Click); - // - // Speed75MenuItem - // - this.Speed75MenuItem.Name = "Speed75MenuItem"; - this.Speed75MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed75MenuItem.Text = "Speed 75%"; - this.Speed75MenuItem.Click += new System.EventHandler(this.Speed75MenuItem_Click); - // - // Speed100MenuItem - // - this.Speed100MenuItem.Name = "Speed100MenuItem"; - this.Speed100MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed100MenuItem.Text = "Speed 100%"; - this.Speed100MenuItem.Click += new System.EventHandler(this.Speed100MenuItem_Click); - // - // Speed150MenuItem - // - this.Speed150MenuItem.Name = "Speed150MenuItem"; - this.Speed150MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed150MenuItem.Text = "Speed 150%"; - this.Speed150MenuItem.Click += new System.EventHandler(this.Speed150MenuItem_Click); - // - // Speed200MenuItem - // - this.Speed200MenuItem.Name = "Speed200MenuItem"; - this.Speed200MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed200MenuItem.Text = "Speed 200%"; - this.Speed200MenuItem.Click += new System.EventHandler(this.Speed200MenuItem_Click); - // - // Speed400MenuItem - // - this.Speed400MenuItem.Name = "Speed400MenuItem"; - this.Speed400MenuItem.Size = new System.Drawing.Size(202, 22); - this.Speed400MenuItem.Text = "Speed 400%"; - this.Speed400MenuItem.Click += new System.EventHandler(this.Speed400MenuItem_Click); - // - // KeyPrioritySubMenu - // - this.KeyPrioritySubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.BothHkAndControllerMenuItem, - this.InputOverHkMenuItem, - this.HkOverInputMenuItem}); - this.KeyPrioritySubMenu.Name = "KeyPrioritySubMenu"; - this.KeyPrioritySubMenu.Size = new System.Drawing.Size(179, 22); - this.KeyPrioritySubMenu.Text = "Key Priority"; - this.KeyPrioritySubMenu.DropDownOpened += new System.EventHandler(this.KeyPriorityMenuItem_DropDownOpened); - // - // BothHkAndControllerMenuItem - // - this.BothHkAndControllerMenuItem.Name = "BothHkAndControllerMenuItem"; - this.BothHkAndControllerMenuItem.Size = new System.Drawing.Size(229, 22); - this.BothHkAndControllerMenuItem.Text = "Both Hotkeys and Controllers"; - this.BothHkAndControllerMenuItem.Click += new System.EventHandler(this.BothHkAndControllerMenuItem_Click); - // - // InputOverHkMenuItem - // - this.InputOverHkMenuItem.Name = "InputOverHkMenuItem"; - this.InputOverHkMenuItem.Size = new System.Drawing.Size(229, 22); - this.InputOverHkMenuItem.Text = "Input overrides Hotkeys"; - this.InputOverHkMenuItem.Click += new System.EventHandler(this.InputOverHkMenuItem_Click); - // - // HkOverInputMenuItem - // - this.HkOverInputMenuItem.Name = "HkOverInputMenuItem"; - this.HkOverInputMenuItem.Size = new System.Drawing.Size(229, 22); - this.HkOverInputMenuItem.Text = "Hotkeys override Input"; - this.HkOverInputMenuItem.Click += new System.EventHandler(this.HkOverInputMenuItem_Click); - // - // CoresSubMenu - // - this.CoresSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.NesCoreSubMenu, - this.CoreSNESSubMenu, - this.GbaCoreSubMenu, - this.SGBCoreSubmenu, - this.GBCoreSubmenu, - this.GBInSGBMenuItem, - this.toolStripMenuItem16, - this.allowGameDBCoreOverridesToolStripMenuItem, - this.toolStripSeparator8, - this.N64VideoPluginSettingsMenuItem, - this.setLibretroCoreToolStripMenuItem}); - this.CoresSubMenu.Name = "CoresSubMenu"; - this.CoresSubMenu.Size = new System.Drawing.Size(179, 22); - this.CoresSubMenu.Text = "Cores"; - this.CoresSubMenu.DropDownOpened += new System.EventHandler(this.CoresSubMenu_DropDownOpened); - // - // NesCoreSubMenu - // - this.NesCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.QuicknesCoreMenuItem, - this.NesCoreMenuItem}); - this.NesCoreSubMenu.Name = "NesCoreSubMenu"; - this.NesCoreSubMenu.Size = new System.Drawing.Size(239, 22); - this.NesCoreSubMenu.Text = "NES"; - this.NesCoreSubMenu.DropDownOpened += new System.EventHandler(this.NesCoreSubMenu_DropDownOpened); - // - // QuicknesCoreMenuItem - // - this.QuicknesCoreMenuItem.Name = "QuicknesCoreMenuItem"; - this.QuicknesCoreMenuItem.Size = new System.Drawing.Size(126, 22); - this.QuicknesCoreMenuItem.Text = "QuickNES"; - this.QuicknesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); - // - // NesCoreMenuItem - // - this.NesCoreMenuItem.Name = "NesCoreMenuItem"; - this.NesCoreMenuItem.Size = new System.Drawing.Size(126, 22); - this.NesCoreMenuItem.Text = "NesHawk"; - this.NesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); - // - // CoreSNESSubMenu - // - this.CoreSNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.Coresnes9xMenuItem, - this.CorebsnesMenuItem}); - this.CoreSNESSubMenu.Name = "CoreSNESSubMenu"; - this.CoreSNESSubMenu.Size = new System.Drawing.Size(239, 22); - this.CoreSNESSubMenu.Text = "SNES"; - this.CoreSNESSubMenu.DropDownOpened += new System.EventHandler(this.CoreSNESSubMenu_DropDownOpened); - // - // Coresnes9xMenuItem - // - this.Coresnes9xMenuItem.Name = "Coresnes9xMenuItem"; - this.Coresnes9xMenuItem.Size = new System.Drawing.Size(109, 22); - this.Coresnes9xMenuItem.Text = "Snes9x"; - this.Coresnes9xMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); - // - // CorebsnesMenuItem - // - this.CorebsnesMenuItem.Name = "CorebsnesMenuItem"; - this.CorebsnesMenuItem.Size = new System.Drawing.Size(109, 22); - this.CorebsnesMenuItem.Text = "BSNES"; - this.CorebsnesMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); - // - // GbaCoreSubMenu - // - this.GbaCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.VbaNextCoreMenuItem, - this.MgbaCoreMenuItem}); - this.GbaCoreSubMenu.Name = "GbaCoreSubMenu"; - this.GbaCoreSubMenu.Size = new System.Drawing.Size(239, 22); - this.GbaCoreSubMenu.Text = "GBA"; - this.GbaCoreSubMenu.DropDownOpened += new System.EventHandler(this.GbaCoreSubMenu_DropDownOpened); - // - // VbaNextCoreMenuItem - // - this.VbaNextCoreMenuItem.Name = "VbaNextCoreMenuItem"; - this.VbaNextCoreMenuItem.Size = new System.Drawing.Size(125, 22); - this.VbaNextCoreMenuItem.Text = "VBA-Next"; - this.VbaNextCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); - // - // MgbaCoreMenuItem - // - this.MgbaCoreMenuItem.Name = "MgbaCoreMenuItem"; - this.MgbaCoreMenuItem.Size = new System.Drawing.Size(125, 22); - this.MgbaCoreMenuItem.Text = "mGBA"; - this.MgbaCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); - // - // SGBCoreSubmenu - // - this.SGBCoreSubmenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SgbBsnesMenuItem, - this.SgbSameBoyMenuItem}); - this.SGBCoreSubmenu.Name = "SGBCoreSubmenu"; - this.SGBCoreSubmenu.Size = new System.Drawing.Size(239, 22); - this.SGBCoreSubmenu.Text = "SGB"; - this.SGBCoreSubmenu.DropDownOpened += new System.EventHandler(this.SGBCoreSubmenu_DropDownOpened); - // - // SgbBsnesMenuItem - // - this.SgbBsnesMenuItem.Name = "SgbBsnesMenuItem"; - this.SgbBsnesMenuItem.Size = new System.Drawing.Size(123, 22); - this.SgbBsnesMenuItem.Text = "BSNES"; - this.SgbBsnesMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); - // - // SgbSameBoyMenuItem - // - this.SgbSameBoyMenuItem.Name = "SgbSameBoyMenuItem"; - this.SgbSameBoyMenuItem.Size = new System.Drawing.Size(123, 22); - this.SgbSameBoyMenuItem.Text = "SameBoy"; - this.SgbSameBoyMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); - // - // GBCoreSubmenu - // - this.GBCoreSubmenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.GBGambatteMenuItem, - this.GBGBHawkMenuItem}); - this.GBCoreSubmenu.Name = "GBCoreSubmenu"; - this.GBCoreSubmenu.Size = new System.Drawing.Size(239, 22); - this.GBCoreSubmenu.Text = "GB"; - this.GBCoreSubmenu.DropDownOpened += new System.EventHandler(this.GBCoreSubmenu_DropDownOpened); - // - // GBGambatteMenuItem - // - this.GBGambatteMenuItem.Name = "GBGambatteMenuItem"; - this.GBGambatteMenuItem.Size = new System.Drawing.Size(126, 22); - this.GBGambatteMenuItem.Text = "Gambatte"; - this.GBGambatteMenuItem.Click += new System.EventHandler(this.GBCorePick_Click); - // - // GBGBHawkMenuItem - // - this.GBGBHawkMenuItem.Name = "GBGBHawkMenuItem"; - this.GBGBHawkMenuItem.Size = new System.Drawing.Size(126, 22); - this.GBGBHawkMenuItem.Text = "GBHawk"; - this.GBGBHawkMenuItem.Click += new System.EventHandler(this.GBCorePick_Click); - // - // GBInSGBMenuItem - // - this.GBInSGBMenuItem.Name = "GBInSGBMenuItem"; - this.GBInSGBMenuItem.Size = new System.Drawing.Size(239, 22); - this.GBInSGBMenuItem.Text = "GB in SGB"; - this.GBInSGBMenuItem.Click += new System.EventHandler(this.GbInSgbMenuItem_Click); - // - // toolStripMenuItem16 - // - this.toolStripMenuItem16.Name = "toolStripMenuItem16"; - this.toolStripMenuItem16.Size = new System.Drawing.Size(236, 6); - // - // allowGameDBCoreOverridesToolStripMenuItem - // - this.allowGameDBCoreOverridesToolStripMenuItem.Name = "allowGameDBCoreOverridesToolStripMenuItem"; - this.allowGameDBCoreOverridesToolStripMenuItem.Size = new System.Drawing.Size(239, 22); - this.allowGameDBCoreOverridesToolStripMenuItem.Text = "Follow GameDB Core Overrides"; - this.allowGameDBCoreOverridesToolStripMenuItem.Click += new System.EventHandler(this.AllowGameDBCoreOverridesToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(236, 6); - // - // N64VideoPluginSettingsMenuItem - // - this.N64VideoPluginSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.monitor; - this.N64VideoPluginSettingsMenuItem.Name = "N64VideoPluginSettingsMenuItem"; - this.N64VideoPluginSettingsMenuItem.Size = new System.Drawing.Size(239, 22); - this.N64VideoPluginSettingsMenuItem.Text = "N64 Video Plugin Settings"; - this.N64VideoPluginSettingsMenuItem.Click += new System.EventHandler(this.N64VideoPluginSettingsMenuItem_Click); - // - // setLibretroCoreToolStripMenuItem - // - this.setLibretroCoreToolStripMenuItem.Name = "setLibretroCoreToolStripMenuItem"; - this.setLibretroCoreToolStripMenuItem.Size = new System.Drawing.Size(239, 22); - this.setLibretroCoreToolStripMenuItem.Text = "Set Libretro Core"; - this.setLibretroCoreToolStripMenuItem.Click += new System.EventHandler(this.SetLibretroCoreMenuItem_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(176, 6); - // - // SaveConfigMenuItem - // - this.SaveConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; - this.SaveConfigMenuItem.Name = "SaveConfigMenuItem"; - this.SaveConfigMenuItem.Size = new System.Drawing.Size(179, 22); - this.SaveConfigMenuItem.Text = "Save Config"; - this.SaveConfigMenuItem.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); - // - // SaveConfigAsMenuItem - // - this.SaveConfigAsMenuItem.Name = "SaveConfigAsMenuItem"; - this.SaveConfigAsMenuItem.Size = new System.Drawing.Size(179, 22); - this.SaveConfigAsMenuItem.Text = "Save Config As..."; - this.SaveConfigAsMenuItem.Click += new System.EventHandler(this.SaveConfigAsMenuItem_Click); - // - // LoadConfigMenuItem - // - this.LoadConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; - this.LoadConfigMenuItem.Name = "LoadConfigMenuItem"; - this.LoadConfigMenuItem.Size = new System.Drawing.Size(179, 22); - this.LoadConfigMenuItem.Text = "Load Config"; - this.LoadConfigMenuItem.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); - // - // LoadConfigFromMenuItem - // - this.LoadConfigFromMenuItem.Name = "LoadConfigFromMenuItem"; - this.LoadConfigFromMenuItem.Size = new System.Drawing.Size(179, 22); - this.LoadConfigFromMenuItem.Text = "Load Config From..."; - this.LoadConfigFromMenuItem.Click += new System.EventHandler(this.LoadConfigFromMenuItem_Click); - // - // ToolsSubMenu - // - this.ToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolBoxMenuItem, - this.toolStripSeparator12, - this.RamWatchMenuItem, - this.RamSearchMenuItem, - this.LuaConsoleMenuItem, - this.TAStudioMenuItem, - this.HexEditorMenuItem, - this.TraceLoggerMenuItem, - this.DebuggerMenuItem, - this.CodeDataLoggerMenuItem, - this.MacroToolMenuItem, - this.VirtualPadMenuItem, - this.BasicBotMenuItem, - this.toolStripSeparator11, - this.CheatsMenuItem, - this.gameSharkConverterToolStripMenuItem, - this.toolStripSeparator29, - this.MultiDiskBundlerFileMenuItem, - this.externalToolToolStripMenuItem, - this.batchRunnerToolStripMenuItem, - this.ExperimentalToolsSubMenu}); - this.ToolsSubMenu.Name = "ToolsSubMenu"; - this.ToolsSubMenu.Size = new System.Drawing.Size(48, 19); - this.ToolsSubMenu.Text = "&Tools"; - this.ToolsSubMenu.DropDownOpened += new System.EventHandler(this.ToolsSubMenu_DropDownOpened); - // - // ToolBoxMenuItem - // - this.ToolBoxMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ToolBox; - this.ToolBoxMenuItem.Name = "ToolBoxMenuItem"; - this.ToolBoxMenuItem.Size = new System.Drawing.Size(191, 22); - this.ToolBoxMenuItem.Text = "&Tool Box"; - this.ToolBoxMenuItem.Click += new System.EventHandler(this.ToolBoxMenuItem_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(188, 6); - // - // RamWatchMenuItem - // - this.RamWatchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.watch; - this.RamWatchMenuItem.Name = "RamWatchMenuItem"; - this.RamWatchMenuItem.Size = new System.Drawing.Size(191, 22); - this.RamWatchMenuItem.Text = "RAM &Watch"; - this.RamWatchMenuItem.Click += new System.EventHandler(this.RamWatchMenuItem_Click); - // - // RamSearchMenuItem - // - this.RamSearchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.search; - this.RamSearchMenuItem.Name = "RamSearchMenuItem"; - this.RamSearchMenuItem.Size = new System.Drawing.Size(191, 22); - this.RamSearchMenuItem.Text = "RAM &Search"; - this.RamSearchMenuItem.Click += new System.EventHandler(this.RamSearchMenuItem_Click); - // - // LuaConsoleMenuItem - // - this.LuaConsoleMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lua; - this.LuaConsoleMenuItem.Name = "LuaConsoleMenuItem"; - this.LuaConsoleMenuItem.Size = new System.Drawing.Size(191, 22); - this.LuaConsoleMenuItem.Text = "Lua Console"; - this.LuaConsoleMenuItem.Click += new System.EventHandler(this.LuaConsoleMenuItem_Click); - // - // TAStudioMenuItem - // - this.TAStudioMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; - this.TAStudioMenuItem.Name = "TAStudioMenuItem"; - this.TAStudioMenuItem.Size = new System.Drawing.Size(191, 22); - this.TAStudioMenuItem.Text = "&TAStudio"; - this.TAStudioMenuItem.Click += new System.EventHandler(this.TAStudioMenuItem_Click); - // - // HexEditorMenuItem - // - this.HexEditorMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke; - this.HexEditorMenuItem.Name = "HexEditorMenuItem"; - this.HexEditorMenuItem.Size = new System.Drawing.Size(191, 22); - this.HexEditorMenuItem.Text = "&Hex Editor"; - this.HexEditorMenuItem.Click += new System.EventHandler(this.HexEditorMenuItem_Click); - // - // TraceLoggerMenuItem - // - this.TraceLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.pencil; - this.TraceLoggerMenuItem.Name = "TraceLoggerMenuItem"; - this.TraceLoggerMenuItem.Size = new System.Drawing.Size(191, 22); - this.TraceLoggerMenuItem.Text = "Trace &Logger"; - this.TraceLoggerMenuItem.Click += new System.EventHandler(this.TraceLoggerMenuItem_Click); - // - // DebuggerMenuItem - // - this.DebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; - this.DebuggerMenuItem.Name = "DebuggerMenuItem"; - this.DebuggerMenuItem.Size = new System.Drawing.Size(191, 22); - this.DebuggerMenuItem.Text = "&Debugger"; - this.DebuggerMenuItem.Click += new System.EventHandler(this.DebuggerMenuItem_Click); - // - // CodeDataLoggerMenuItem - // - this.CodeDataLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.cdlogger; - this.CodeDataLoggerMenuItem.Name = "CodeDataLoggerMenuItem"; - this.CodeDataLoggerMenuItem.Size = new System.Drawing.Size(191, 22); - this.CodeDataLoggerMenuItem.Text = "Code-Data Logger"; - this.CodeDataLoggerMenuItem.Click += new System.EventHandler(this.CodeDataLoggerMenuItem_Click); - // - // MacroToolMenuItem - // - this.MacroToolMenuItem.Name = "MacroToolMenuItem"; - this.MacroToolMenuItem.Size = new System.Drawing.Size(191, 22); - this.MacroToolMenuItem.Text = "&Macro Tool"; - this.MacroToolMenuItem.Click += new System.EventHandler(this.MacroToolMenuItem_Click); - // - // VirtualPadMenuItem - // - this.VirtualPadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.VirtualPadMenuItem.Name = "VirtualPadMenuItem"; - this.VirtualPadMenuItem.Size = new System.Drawing.Size(191, 22); - this.VirtualPadMenuItem.Text = "Virtual Pad"; - this.VirtualPadMenuItem.Click += new System.EventHandler(this.VirtualPadMenuItem_Click); - // - // BasicBotMenuItem - // - this.BasicBotMenuItem.Name = "BasicBotMenuItem"; - this.BasicBotMenuItem.Size = new System.Drawing.Size(191, 22); - this.BasicBotMenuItem.Text = "Basic Bot"; - this.BasicBotMenuItem.Click += new System.EventHandler(this.BasicBotMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(188, 6); - // - // CheatsMenuItem - // - this.CheatsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; - this.CheatsMenuItem.Name = "CheatsMenuItem"; - this.CheatsMenuItem.Size = new System.Drawing.Size(191, 22); - this.CheatsMenuItem.Text = "Cheats"; - this.CheatsMenuItem.Click += new System.EventHandler(this.CheatsMenuItem_Click); - // - // gameSharkConverterToolStripMenuItem - // - this.gameSharkConverterToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Shark; - this.gameSharkConverterToolStripMenuItem.Name = "gameSharkConverterToolStripMenuItem"; - this.gameSharkConverterToolStripMenuItem.Size = new System.Drawing.Size(191, 22); - this.gameSharkConverterToolStripMenuItem.Text = "Cheat Code Converter"; - this.gameSharkConverterToolStripMenuItem.Click += new System.EventHandler(this.CheatCodeConverterMenuItem_Click); - // - // toolStripSeparator29 - // - this.toolStripSeparator29.Name = "toolStripSeparator29"; - this.toolStripSeparator29.Size = new System.Drawing.Size(188, 6); - // - // MultiDiskBundlerFileMenuItem - // - this.MultiDiskBundlerFileMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveConfig; - this.MultiDiskBundlerFileMenuItem.Name = "MultiDiskBundlerFileMenuItem"; - this.MultiDiskBundlerFileMenuItem.Size = new System.Drawing.Size(191, 22); - this.MultiDiskBundlerFileMenuItem.Text = "Multi-disk Bundler"; - this.MultiDiskBundlerFileMenuItem.Click += new System.EventHandler(this.MultidiskBundlerMenuItem_Click); - // - // externalToolToolStripMenuItem - // - this.externalToolToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.dummyExternalTool}); - this.externalToolToolStripMenuItem.Name = "externalToolToolStripMenuItem"; - this.externalToolToolStripMenuItem.Size = new System.Drawing.Size(191, 22); - this.externalToolToolStripMenuItem.Text = "External Tool"; - this.externalToolToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ExternalToolToolStripMenuItem_DropDownOpening); - // - // dummyExternalTool - // - this.dummyExternalTool.Name = "dummyExternalTool"; - this.dummyExternalTool.Size = new System.Drawing.Size(103, 22); - this.dummyExternalTool.Text = "None"; - // - // batchRunnerToolStripMenuItem - // - this.batchRunnerToolStripMenuItem.Name = "batchRunnerToolStripMenuItem"; - this.batchRunnerToolStripMenuItem.Size = new System.Drawing.Size(191, 22); - this.batchRunnerToolStripMenuItem.Text = "Batch Runner"; - this.batchRunnerToolStripMenuItem.Visible = false; - this.batchRunnerToolStripMenuItem.Click += new System.EventHandler(this.BatchRunnerToolStripMenuItem_Click); - // - // ExperimentalToolsSubMenu - // - this.ExperimentalToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.AutoHawkMenuItem, - this.NewHexEditorMenuItem}); - this.ExperimentalToolsSubMenu.Name = "ExperimentalToolsSubMenu"; - this.ExperimentalToolsSubMenu.Size = new System.Drawing.Size(191, 22); - this.ExperimentalToolsSubMenu.Text = "Experimental Tools"; - this.ExperimentalToolsSubMenu.DropDownOpened += new System.EventHandler(this.ExperimentalToolsSubMenu_DropDownOpened); - // - // AutoHawkMenuItem - // - this.AutoHawkMenuItem.Name = "AutoHawkMenuItem"; - this.AutoHawkMenuItem.Size = new System.Drawing.Size(155, 22); - this.AutoHawkMenuItem.Text = "AutoHawk"; - this.AutoHawkMenuItem.Click += new System.EventHandler(this.AutoHawkMenuItem_Click); - // - // NewHexEditorMenuItem - // - this.NewHexEditorMenuItem.Name = "NewHexEditorMenuItem"; - this.NewHexEditorMenuItem.Size = new System.Drawing.Size(155, 22); - this.NewHexEditorMenuItem.Text = "New Hex Editor"; - this.NewHexEditorMenuItem.Click += new System.EventHandler(this.NewHexEditorMenuItem_Click); - // - // NESSubMenu - // - this.NESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.coreToolStripMenuItem, - this.toolStripSeparator34, - this.NESPPUViewerMenuItem, - this.NESNametableViewerMenuItem, - this.NESGameGenieCodesMenuItem, - this.musicRipperToolStripMenuItem, - this.toolStripSeparator17, - this.NesControllerSettingsMenuItem, - this.NESGraphicSettingsMenuItem, - this.NESSoundChannelsMenuItem, - this.VSSettingsMenuItem, - this.MovieSettingsMenuItem, - this.toolStripSeparator22, - this.FDSControlsMenuItem, - this.VSControlsMenuItem, - this.barcodeReaderToolStripMenuItem}); - this.NESSubMenu.Name = "NESSubMenu"; - this.NESSubMenu.Size = new System.Drawing.Size(40, 19); - this.NESSubMenu.Text = "&NES"; - this.NESSubMenu.DropDownOpened += new System.EventHandler(this.NESSubMenu_DropDownOpened); - // - // coreToolStripMenuItem - // - this.coreToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.quickNESToolStripMenuItem, - this.nesHawkToolStripMenuItem}); - this.coreToolStripMenuItem.Name = "coreToolStripMenuItem"; - this.coreToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.coreToolStripMenuItem.Text = "&Core"; - this.coreToolStripMenuItem.DropDownOpened += new System.EventHandler(this.CoreToolStripMenuItem_DropDownOpened); - // - // quickNESToolStripMenuItem - // - this.quickNESToolStripMenuItem.Name = "quickNESToolStripMenuItem"; - this.quickNESToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.quickNESToolStripMenuItem.Text = "&QuickNes"; - this.quickNESToolStripMenuItem.Click += new System.EventHandler(this.QuickNesToolStripMenuItem_Click); - // - // nesHawkToolStripMenuItem - // - this.nesHawkToolStripMenuItem.Name = "nesHawkToolStripMenuItem"; - this.nesHawkToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.nesHawkToolStripMenuItem.Text = "&NesHawk"; - this.nesHawkToolStripMenuItem.Click += new System.EventHandler(this.NesHawkToolStripMenuItem_Click); - // - // toolStripSeparator34 - // - this.toolStripSeparator34.Name = "toolStripSeparator34"; - this.toolStripSeparator34.Size = new System.Drawing.Size(230, 6); - // - // NESPPUViewerMenuItem - // - this.NESPPUViewerMenuItem.Name = "NESPPUViewerMenuItem"; - this.NESPPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); - this.NESPPUViewerMenuItem.Text = "&PPU Viewer"; - this.NESPPUViewerMenuItem.Click += new System.EventHandler(this.NesPPUViewerMenuItem_Click); - // - // NESNametableViewerMenuItem - // - this.NESNametableViewerMenuItem.Name = "NESNametableViewerMenuItem"; - this.NESNametableViewerMenuItem.Size = new System.Drawing.Size(233, 22); - this.NESNametableViewerMenuItem.Text = "&Nametable Viewer"; - this.NESNametableViewerMenuItem.Click += new System.EventHandler(this.NESNametableViewerMenuItem_Click); - // - // NESGameGenieCodesMenuItem - // - this.NESGameGenieCodesMenuItem.Name = "NESGameGenieCodesMenuItem"; - this.NESGameGenieCodesMenuItem.Size = new System.Drawing.Size(233, 22); - this.NESGameGenieCodesMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.NESGameGenieCodesMenuItem.Click += new System.EventHandler(this.NESGameGenieCodesMenuItem_Click); - // - // musicRipperToolStripMenuItem - // - this.musicRipperToolStripMenuItem.Name = "musicRipperToolStripMenuItem"; - this.musicRipperToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.musicRipperToolStripMenuItem.Text = "Music Ripper"; - this.musicRipperToolStripMenuItem.Click += new System.EventHandler(this.MusicRipperMenuItem_Click); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(230, 6); - // - // NesControllerSettingsMenuItem - // - this.NesControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.NesControllerSettingsMenuItem.Name = "NesControllerSettingsMenuItem"; - this.NesControllerSettingsMenuItem.Size = new System.Drawing.Size(233, 22); - this.NesControllerSettingsMenuItem.Text = "Controller Settings..."; - this.NesControllerSettingsMenuItem.Click += new System.EventHandler(this.NesControllerSettingsMenuItem_Click); - // - // NESGraphicSettingsMenuItem - // - this.NESGraphicSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; - this.NESGraphicSettingsMenuItem.Name = "NESGraphicSettingsMenuItem"; - this.NESGraphicSettingsMenuItem.Size = new System.Drawing.Size(233, 22); - this.NESGraphicSettingsMenuItem.Text = "Graphics Settings..."; - this.NESGraphicSettingsMenuItem.Click += new System.EventHandler(this.NESGraphicSettingsMenuItem_Click); - // - // NESSoundChannelsMenuItem - // - this.NESSoundChannelsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.NESSoundChannelsMenuItem.Name = "NESSoundChannelsMenuItem"; - this.NESSoundChannelsMenuItem.Size = new System.Drawing.Size(233, 22); - this.NESSoundChannelsMenuItem.Text = "Sound Channels..."; - this.NESSoundChannelsMenuItem.Click += new System.EventHandler(this.NESSoundChannelsMenuItem_Click); - // - // VSSettingsMenuItem - // - this.VSSettingsMenuItem.Name = "VSSettingsMenuItem"; - this.VSSettingsMenuItem.Size = new System.Drawing.Size(233, 22); - this.VSSettingsMenuItem.Text = "VS Settings..."; - this.VSSettingsMenuItem.Click += new System.EventHandler(this.VsSettingsMenuItem_Click); - // - // MovieSettingsMenuItem - // - this.MovieSettingsMenuItem.Name = "MovieSettingsMenuItem"; - this.MovieSettingsMenuItem.Size = new System.Drawing.Size(233, 22); - this.MovieSettingsMenuItem.Text = "Advanced Settings..."; - this.MovieSettingsMenuItem.Click += new System.EventHandler(this.MovieSettingsMenuItem_Click); - // - // toolStripSeparator22 - // - this.toolStripSeparator22.Name = "toolStripSeparator22"; - this.toolStripSeparator22.Size = new System.Drawing.Size(230, 6); - // - // FDSControlsMenuItem - // - this.FDSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FdsEjectDiskMenuItem}); - this.FDSControlsMenuItem.Name = "FDSControlsMenuItem"; - this.FDSControlsMenuItem.Size = new System.Drawing.Size(233, 22); - this.FDSControlsMenuItem.Text = "FDS Controls"; - this.FDSControlsMenuItem.DropDownOpened += new System.EventHandler(this.FdsControlsMenuItem_DropDownOpened); - // - // FdsEjectDiskMenuItem - // - this.FdsEjectDiskMenuItem.Name = "FdsEjectDiskMenuItem"; - this.FdsEjectDiskMenuItem.Size = new System.Drawing.Size(124, 22); - this.FdsEjectDiskMenuItem.Text = "&Eject Disk"; - this.FdsEjectDiskMenuItem.Click += new System.EventHandler(this.FdsEjectDiskMenuItem_Click); - // - // VSControlsMenuItem - // - this.VSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.VSInsertCoinP1MenuItem, - this.VSInsertCoinP2MenuItem, - this.VSServiceSwitchMenuItem}); - this.VSControlsMenuItem.Name = "VSControlsMenuItem"; - this.VSControlsMenuItem.Size = new System.Drawing.Size(233, 22); - this.VSControlsMenuItem.Text = "VS Controls"; - // - // VSInsertCoinP1MenuItem - // - this.VSInsertCoinP1MenuItem.Name = "VSInsertCoinP1MenuItem"; - this.VSInsertCoinP1MenuItem.Size = new System.Drawing.Size(149, 22); - this.VSInsertCoinP1MenuItem.Text = "Insert Coin P1"; - this.VSInsertCoinP1MenuItem.Click += new System.EventHandler(this.VsInsertCoinP1MenuItem_Click); - // - // VSInsertCoinP2MenuItem - // - this.VSInsertCoinP2MenuItem.Name = "VSInsertCoinP2MenuItem"; - this.VSInsertCoinP2MenuItem.Size = new System.Drawing.Size(149, 22); - this.VSInsertCoinP2MenuItem.Text = "Insert Coin P2"; - this.VSInsertCoinP2MenuItem.Click += new System.EventHandler(this.VsInsertCoinP2MenuItem_Click); - // - // VSServiceSwitchMenuItem - // - this.VSServiceSwitchMenuItem.Name = "VSServiceSwitchMenuItem"; - this.VSServiceSwitchMenuItem.Size = new System.Drawing.Size(149, 22); - this.VSServiceSwitchMenuItem.Text = "Service Switch"; - this.VSServiceSwitchMenuItem.Click += new System.EventHandler(this.VsServiceSwitchMenuItem_Click); - // - // barcodeReaderToolStripMenuItem - // - this.barcodeReaderToolStripMenuItem.Name = "barcodeReaderToolStripMenuItem"; - this.barcodeReaderToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.barcodeReaderToolStripMenuItem.Text = "Barcode Reader"; - this.barcodeReaderToolStripMenuItem.Click += new System.EventHandler(this.BarcodeReaderMenuItem_Click); - // - // PCESubMenu - // - this.PCESubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.PceControllerSettingsMenuItem, - this.PCEGraphicsSettingsMenuItem, - this.toolStripSeparator32, - this.PCEBGViewerMenuItem, - this.PCEtileViewerToolStripMenuItem, - this.PceSoundDebuggerToolStripMenuItem, - this.toolStripSeparator25, - this.PCEAlwaysPerformSpriteLimitMenuItem, - this.PCEAlwaysEqualizeVolumesMenuItem, - this.PCEArcadeCardRewindEnableMenuItem}); - this.PCESubMenu.Name = "PCESubMenu"; - this.PCESubMenu.Size = new System.Drawing.Size(40, 19); - this.PCESubMenu.Text = "&PCE"; - this.PCESubMenu.DropDownOpened += new System.EventHandler(this.PCESubMenu_DropDownOpened); - // - // PceControllerSettingsMenuItem - // - this.PceControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.PceControllerSettingsMenuItem.Name = "PceControllerSettingsMenuItem"; - this.PceControllerSettingsMenuItem.Size = new System.Drawing.Size(259, 22); - this.PceControllerSettingsMenuItem.Text = "Controller Settings"; - this.PceControllerSettingsMenuItem.Click += new System.EventHandler(this.PceControllerSettingsMenuItem_Click); - // - // PCEGraphicsSettingsMenuItem - // - this.PCEGraphicsSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; - this.PCEGraphicsSettingsMenuItem.Name = "PCEGraphicsSettingsMenuItem"; - this.PCEGraphicsSettingsMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEGraphicsSettingsMenuItem.Text = "Graphics Settings"; - this.PCEGraphicsSettingsMenuItem.Click += new System.EventHandler(this.PceGraphicsSettingsMenuItem_Click); - // - // toolStripSeparator32 - // - this.toolStripSeparator32.Name = "toolStripSeparator32"; - this.toolStripSeparator32.Size = new System.Drawing.Size(256, 6); - // - // PCEBGViewerMenuItem - // - this.PCEBGViewerMenuItem.Name = "PCEBGViewerMenuItem"; - this.PCEBGViewerMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEBGViewerMenuItem.Text = "&BG Viewer"; - this.PCEBGViewerMenuItem.Click += new System.EventHandler(this.PceBgViewerMenuItem_Click); - // - // PCEtileViewerToolStripMenuItem - // - this.PCEtileViewerToolStripMenuItem.Name = "PCEtileViewerToolStripMenuItem"; - this.PCEtileViewerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEtileViewerToolStripMenuItem.Text = "&Tile Viewer"; - this.PCEtileViewerToolStripMenuItem.Click += new System.EventHandler(this.PceTileViewerMenuItem_Click); - // - // PceSoundDebuggerToolStripMenuItem - // - this.PceSoundDebuggerToolStripMenuItem.Name = "PceSoundDebuggerToolStripMenuItem"; - this.PceSoundDebuggerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); - this.PceSoundDebuggerToolStripMenuItem.Text = "&Sound Debugger"; - this.PceSoundDebuggerToolStripMenuItem.Click += new System.EventHandler(this.PceSoundDebuggerMenuItem_Click); - // - // toolStripSeparator25 - // - this.toolStripSeparator25.Name = "toolStripSeparator25"; - this.toolStripSeparator25.Size = new System.Drawing.Size(256, 6); - // - // PCEAlwaysPerformSpriteLimitMenuItem - // - this.PCEAlwaysPerformSpriteLimitMenuItem.Name = "PCEAlwaysPerformSpriteLimitMenuItem"; - this.PCEAlwaysPerformSpriteLimitMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEAlwaysPerformSpriteLimitMenuItem.Text = "Always Perform Sprite Limit"; - this.PCEAlwaysPerformSpriteLimitMenuItem.Click += new System.EventHandler(this.PCEAlwaysPerformSpriteLimitMenuItem_Click); - // - // PCEAlwaysEqualizeVolumesMenuItem - // - this.PCEAlwaysEqualizeVolumesMenuItem.Name = "PCEAlwaysEqualizeVolumesMenuItem"; - this.PCEAlwaysEqualizeVolumesMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEAlwaysEqualizeVolumesMenuItem.Text = "Always Equalize Volumes (PCE-CD)"; - this.PCEAlwaysEqualizeVolumesMenuItem.Click += new System.EventHandler(this.PCEAlwaysEqualizeVolumesMenuItem_Click); - // - // PCEArcadeCardRewindEnableMenuItem - // - this.PCEArcadeCardRewindEnableMenuItem.Name = "PCEArcadeCardRewindEnableMenuItem"; - this.PCEArcadeCardRewindEnableMenuItem.Size = new System.Drawing.Size(259, 22); - this.PCEArcadeCardRewindEnableMenuItem.Text = "Arcade Card Rewind-Enable Hack"; - this.PCEArcadeCardRewindEnableMenuItem.Click += new System.EventHandler(this.PCEArcadeCardRewindEnableMenuItem_Click); - // - // SMSSubMenu - // - this.SMSSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SMSregionToolStripMenuItem, - this.SMSdisplayToolStripMenuItem, - this.SMSControllerToolStripMenuItem, - this.SMStoolStripMenuItem2, - this.SMSenableBIOSToolStripMenuItem, - this.SMSEnableFMChipMenuItem, - this.SMSOverclockMenuItem, - this.SMSForceStereoMenuItem, - this.SMSSpriteLimitMenuItem, - this.SMSDisplayOverscanMenuItem, - this.SMSFix3DGameDisplayToolStripMenuItem, - this.ShowClippedRegionsMenuItem, - this.HighlightActiveDisplayRegionMenuItem, - this.SMSGraphicsSettingsMenuItem, - this.toolStripSeparator24, - this.SMSVDPViewerToolStripMenuItem, - this.GGGameGenieMenuItem}); - this.SMSSubMenu.Name = "SMSSubMenu"; - this.SMSSubMenu.Size = new System.Drawing.Size(42, 19); - this.SMSSubMenu.Text = "&SMS"; - this.SMSSubMenu.DropDownOpened += new System.EventHandler(this.SMSSubMenu_DropDownOpened); - // - // SMSregionToolStripMenuItem - // - this.SMSregionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SMSregionExportToolStripMenuItem, - this.SMSregionJapanToolStripMenuItem, - this.SMSregionKoreaToolStripMenuItem, - this.SMSregionAutoToolStripMenuItem}); - this.SMSregionToolStripMenuItem.Name = "SMSregionToolStripMenuItem"; - this.SMSregionToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSregionToolStripMenuItem.Text = "Region"; - // - // SMSregionExportToolStripMenuItem - // - this.SMSregionExportToolStripMenuItem.Name = "SMSregionExportToolStripMenuItem"; - this.SMSregionExportToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.SMSregionExportToolStripMenuItem.Text = "Export"; - this.SMSregionExportToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionExport_Click); - // - // SMSregionJapanToolStripMenuItem - // - this.SMSregionJapanToolStripMenuItem.Name = "SMSregionJapanToolStripMenuItem"; - this.SMSregionJapanToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.SMSregionJapanToolStripMenuItem.Text = "Japan"; - this.SMSregionJapanToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionJapan_Click); - // - // SMSregionKoreaToolStripMenuItem - // - this.SMSregionKoreaToolStripMenuItem.Name = "SMSregionKoreaToolStripMenuItem"; - this.SMSregionKoreaToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.SMSregionKoreaToolStripMenuItem.Text = "Korea"; - this.SMSregionKoreaToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionKorea_Click); - // - // SMSregionAutoToolStripMenuItem - // - this.SMSregionAutoToolStripMenuItem.Name = "SMSregionAutoToolStripMenuItem"; - this.SMSregionAutoToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.SMSregionAutoToolStripMenuItem.Text = "Auto"; - this.SMSregionAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionAuto_Click); - // - // SMSdisplayToolStripMenuItem - // - this.SMSdisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SMSdisplayNtscToolStripMenuItem, - this.SMSdisplayPalToolStripMenuItem, - this.SMSdisplayAutoToolStripMenuItem}); - this.SMSdisplayToolStripMenuItem.Name = "SMSdisplayToolStripMenuItem"; - this.SMSdisplayToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSdisplayToolStripMenuItem.Text = "Display Type"; - // - // SMSdisplayNtscToolStripMenuItem - // - this.SMSdisplayNtscToolStripMenuItem.Name = "SMSdisplayNtscToolStripMenuItem"; - this.SMSdisplayNtscToolStripMenuItem.Size = new System.Drawing.Size(104, 22); - this.SMSdisplayNtscToolStripMenuItem.Text = "NTSC"; - this.SMSdisplayNtscToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayNTSC_Click); - // - // SMSdisplayPalToolStripMenuItem - // - this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; - this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(104, 22); - this.SMSdisplayPalToolStripMenuItem.Text = "PAL"; - this.SMSdisplayPalToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayPAL_Click); - // - // SMSdisplayAutoToolStripMenuItem - // - this.SMSdisplayAutoToolStripMenuItem.Name = "SMSdisplayAutoToolStripMenuItem"; - this.SMSdisplayAutoToolStripMenuItem.Size = new System.Drawing.Size(104, 22); - this.SMSdisplayAutoToolStripMenuItem.Text = "Auto"; - this.SMSdisplayAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayAuto_Click); - // - // SMSControllerToolStripMenuItem - // - this.SMSControllerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SMSControllerStandardToolStripMenuItem, - this.SMSControllerPaddleToolStripMenuItem, - this.SMSControllerLightPhaserToolStripMenuItem, - this.SMSControllerSportsPadToolStripMenuItem, - this.SMSControllerKeyboardToolStripMenuItem}); - this.SMSControllerToolStripMenuItem.Name = "SMSControllerToolStripMenuItem"; - this.SMSControllerToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSControllerToolStripMenuItem.Text = "&Controller Type"; - // - // SMSControllerStandardToolStripMenuItem - // - this.SMSControllerStandardToolStripMenuItem.Name = "SMSControllerStandardToolStripMenuItem"; - this.SMSControllerStandardToolStripMenuItem.Size = new System.Drawing.Size(139, 22); - this.SMSControllerStandardToolStripMenuItem.Text = "Standard"; - this.SMSControllerStandardToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerStandardToolStripMenuItem_Click); - // - // SMSControllerPaddleToolStripMenuItem - // - this.SMSControllerPaddleToolStripMenuItem.Name = "SMSControllerPaddleToolStripMenuItem"; - this.SMSControllerPaddleToolStripMenuItem.Size = new System.Drawing.Size(139, 22); - this.SMSControllerPaddleToolStripMenuItem.Text = "Paddle"; - this.SMSControllerPaddleToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerPaddleToolStripMenuItem_Click); - // - // SMSControllerLightPhaserToolStripMenuItem - // - this.SMSControllerLightPhaserToolStripMenuItem.Name = "SMSControllerLightPhaserToolStripMenuItem"; - this.SMSControllerLightPhaserToolStripMenuItem.Size = new System.Drawing.Size(139, 22); - this.SMSControllerLightPhaserToolStripMenuItem.Text = "Light Phaser"; - this.SMSControllerLightPhaserToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerLightPhaserToolStripMenuItem_Click); - // - // SMSControllerSportsPadToolStripMenuItem - // - this.SMSControllerSportsPadToolStripMenuItem.Name = "SMSControllerSportsPadToolStripMenuItem"; - this.SMSControllerSportsPadToolStripMenuItem.Size = new System.Drawing.Size(139, 22); - this.SMSControllerSportsPadToolStripMenuItem.Text = "Sports Pad"; - this.SMSControllerSportsPadToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerSportsPadToolStripMenuItem_Click); - // - // SMSControllerKeyboardToolStripMenuItem - // - this.SMSControllerKeyboardToolStripMenuItem.Name = "SMSControllerKeyboardToolStripMenuItem"; - this.SMSControllerKeyboardToolStripMenuItem.Size = new System.Drawing.Size(139, 22); - this.SMSControllerKeyboardToolStripMenuItem.Text = "Keyboard"; - this.SMSControllerKeyboardToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerKeyboardToolStripMenuItem_Click); - // - // SMStoolStripMenuItem2 - // - this.SMStoolStripMenuItem2.Name = "SMStoolStripMenuItem2"; - this.SMStoolStripMenuItem2.Size = new System.Drawing.Size(275, 6); - // - // SMSenableBIOSToolStripMenuItem - // - this.SMSenableBIOSToolStripMenuItem.Name = "SMSenableBIOSToolStripMenuItem"; - this.SMSenableBIOSToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSenableBIOSToolStripMenuItem.Text = "Enable BIOS (Must be Enabled for TAS)"; - this.SMSenableBIOSToolStripMenuItem.Click += new System.EventHandler(this.SmsBiosMenuItem_Click); - // - // SMSEnableFMChipMenuItem - // - this.SMSEnableFMChipMenuItem.Name = "SMSEnableFMChipMenuItem"; - this.SMSEnableFMChipMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSEnableFMChipMenuItem.Text = "&Enable FM Chip"; - this.SMSEnableFMChipMenuItem.Click += new System.EventHandler(this.SmsEnableFmChipMenuItem_Click); - // - // SMSOverclockMenuItem - // - this.SMSOverclockMenuItem.Name = "SMSOverclockMenuItem"; - this.SMSOverclockMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSOverclockMenuItem.Text = "&Overclock when Known Safe"; - this.SMSOverclockMenuItem.Click += new System.EventHandler(this.SMSOverclockMenuItem_Click); - // - // SMSForceStereoMenuItem - // - this.SMSForceStereoMenuItem.Name = "SMSForceStereoMenuItem"; - this.SMSForceStereoMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSForceStereoMenuItem.Text = "&Force Stereo Separation"; - this.SMSForceStereoMenuItem.Click += new System.EventHandler(this.SMSForceStereoMenuItem_Click); - // - // SMSSpriteLimitMenuItem - // - this.SMSSpriteLimitMenuItem.Name = "SMSSpriteLimitMenuItem"; - this.SMSSpriteLimitMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSSpriteLimitMenuItem.Text = "Sprite &Limit"; - this.SMSSpriteLimitMenuItem.Click += new System.EventHandler(this.SMSSpriteLimitMenuItem_Click); - // - // SMSDisplayOverscanMenuItem - // - this.SMSDisplayOverscanMenuItem.Name = "SMSDisplayOverscanMenuItem"; - this.SMSDisplayOverscanMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSDisplayOverscanMenuItem.Text = "Display Overscan"; - this.SMSDisplayOverscanMenuItem.Click += new System.EventHandler(this.SMSDisplayOverscanMenuItem_Click); - // - // SMSFix3DGameDisplayToolStripMenuItem - // - this.SMSFix3DGameDisplayToolStripMenuItem.Name = "SMSFix3DGameDisplayToolStripMenuItem"; - this.SMSFix3DGameDisplayToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSFix3DGameDisplayToolStripMenuItem.Text = "Fix 3D Game Display"; - this.SMSFix3DGameDisplayToolStripMenuItem.Click += new System.EventHandler(this.SMSFix3DDisplayMenuItem_Click); - // - // ShowClippedRegionsMenuItem - // - this.ShowClippedRegionsMenuItem.Name = "ShowClippedRegionsMenuItem"; - this.ShowClippedRegionsMenuItem.Size = new System.Drawing.Size(278, 22); - this.ShowClippedRegionsMenuItem.Text = "&Show Clipped Regions"; - this.ShowClippedRegionsMenuItem.Click += new System.EventHandler(this.ShowClippedRegionsMenuItem_Click); - // - // HighlightActiveDisplayRegionMenuItem - // - this.HighlightActiveDisplayRegionMenuItem.Name = "HighlightActiveDisplayRegionMenuItem"; - this.HighlightActiveDisplayRegionMenuItem.Size = new System.Drawing.Size(278, 22); - this.HighlightActiveDisplayRegionMenuItem.Text = "&Highlight Active Display Region"; - this.HighlightActiveDisplayRegionMenuItem.Click += new System.EventHandler(this.HighlightActiveDisplayRegionMenuItem_Click); - // - // SMSGraphicsSettingsMenuItem - // - this.SMSGraphicsSettingsMenuItem.Name = "SMSGraphicsSettingsMenuItem"; - this.SMSGraphicsSettingsMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSGraphicsSettingsMenuItem.Text = "&Graphics Settings..."; - this.SMSGraphicsSettingsMenuItem.Click += new System.EventHandler(this.SMSGraphicsSettingsMenuItem_Click); - // - // toolStripSeparator24 - // - this.toolStripSeparator24.Name = "toolStripSeparator24"; - this.toolStripSeparator24.Size = new System.Drawing.Size(275, 6); - // - // SMSVDPViewerToolStripMenuItem - // - this.SMSVDPViewerToolStripMenuItem.Name = "SMSVDPViewerToolStripMenuItem"; - this.SMSVDPViewerToolStripMenuItem.Size = new System.Drawing.Size(278, 22); - this.SMSVDPViewerToolStripMenuItem.Text = "&VDP Viewer"; - this.SMSVDPViewerToolStripMenuItem.Click += new System.EventHandler(this.SmsVdpViewerMenuItem_Click); - // - // GGGameGenieMenuItem - // - this.GGGameGenieMenuItem.Name = "GGGameGenieMenuItem"; - this.GGGameGenieMenuItem.Size = new System.Drawing.Size(278, 22); - this.GGGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.GGGameGenieMenuItem.Click += new System.EventHandler(this.GGGameGenieMenuItem_Click); - // - // TI83SubMenu - // - this.TI83SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.KeypadMenuItem, - this.LoadTIFileMenuItem, - this.toolStripSeparator13, - this.AutoloadKeypadMenuItem, - this.paletteToolStripMenuItem}); - this.TI83SubMenu.Name = "TI83SubMenu"; - this.TI83SubMenu.Size = new System.Drawing.Size(41, 19); - this.TI83SubMenu.Text = "TI83"; - this.TI83SubMenu.DropDownOpened += new System.EventHandler(this.TI83SubMenu_DropDownOpened); - // - // KeypadMenuItem - // - this.KeypadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.calculator; - this.KeypadMenuItem.Name = "KeypadMenuItem"; - this.KeypadMenuItem.Size = new System.Drawing.Size(165, 22); - this.KeypadMenuItem.Text = "Keypad"; - this.KeypadMenuItem.Click += new System.EventHandler(this.KeypadMenuItem_Click); - // - // LoadTIFileMenuItem - // - this.LoadTIFileMenuItem.Name = "LoadTIFileMenuItem"; - this.LoadTIFileMenuItem.Size = new System.Drawing.Size(165, 22); - this.LoadTIFileMenuItem.Text = "Load TI-83 File..."; - this.LoadTIFileMenuItem.Click += new System.EventHandler(this.LoadTIFileMenuItem_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(162, 6); - // - // AutoloadKeypadMenuItem - // - this.AutoloadKeypadMenuItem.Checked = true; - this.AutoloadKeypadMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.AutoloadKeypadMenuItem.Name = "AutoloadKeypadMenuItem"; - this.AutoloadKeypadMenuItem.Size = new System.Drawing.Size(165, 22); - this.AutoloadKeypadMenuItem.Text = "Autoload Keypad"; - this.AutoloadKeypadMenuItem.Click += new System.EventHandler(this.AutoloadKeypadMenuItem_Click); - // - // paletteToolStripMenuItem - // - this.paletteToolStripMenuItem.Name = "paletteToolStripMenuItem"; - this.paletteToolStripMenuItem.Size = new System.Drawing.Size(165, 22); - this.paletteToolStripMenuItem.Text = "Palette..."; - this.paletteToolStripMenuItem.Click += new System.EventHandler(this.TI83PaletteMenuItem_Click); - // - // AtariSubMenu - // - this.AtariSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.AtariSettingsToolStripMenuItem}); - this.AtariSubMenu.Name = "AtariSubMenu"; - this.AtariSubMenu.Size = new System.Drawing.Size(44, 19); - this.AtariSubMenu.Text = "&Atari"; - // - // AtariSettingsToolStripMenuItem - // - this.AtariSettingsToolStripMenuItem.Name = "AtariSettingsToolStripMenuItem"; - this.AtariSettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.AtariSettingsToolStripMenuItem.Text = "Settings..."; - this.AtariSettingsToolStripMenuItem.Click += new System.EventHandler(this.AtariSettingsToolStripMenuItem_Click); - // - // A7800SubMenu - // - this.A7800SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.A7800ControllerSettingsMenuItem, - this.A7800FilterSettingsMenuItem}); - this.A7800SubMenu.Name = "A7800SubMenu"; - this.A7800SubMenu.Size = new System.Drawing.Size(51, 19); - this.A7800SubMenu.Text = "&A7800"; - this.A7800SubMenu.DropDownOpened += new System.EventHandler(this.A7800SubMenu_DropDownOpened); - // - // A7800ControllerSettingsMenuItem - // - this.A7800ControllerSettingsMenuItem.Name = "A7800ControllerSettingsMenuItem"; - this.A7800ControllerSettingsMenuItem.Size = new System.Drawing.Size(172, 22); - this.A7800ControllerSettingsMenuItem.Text = "Controller Settings"; - this.A7800ControllerSettingsMenuItem.Click += new System.EventHandler(this.A7800ControllerSettingsToolStripMenuItem_Click); - // - // A7800FilterSettingsMenuItem - // - this.A7800FilterSettingsMenuItem.Name = "A7800FilterSettingsMenuItem"; - this.A7800FilterSettingsMenuItem.Size = new System.Drawing.Size(172, 22); - this.A7800FilterSettingsMenuItem.Text = "Filter Settings"; - this.A7800FilterSettingsMenuItem.Click += new System.EventHandler(this.A7800FilterSettingsToolStripMenuItem_Click); - // - // GBSubMenu - // - this.GBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.GBcoreSettingsToolStripMenuItem, - this.LoadGBInSGBMenuItem, - this.toolStripSeparator28, - this.GBGPUViewerMenuItem, - this.GBGameGenieMenuItem, - this.GBPrinterViewerMenuItem}); - this.GBSubMenu.Name = "GBSubMenu"; - this.GBSubMenu.Size = new System.Drawing.Size(34, 19); - this.GBSubMenu.Text = "&GB"; - this.GBSubMenu.DropDownOpened += new System.EventHandler(this.GBSubMenu_DropDownOpened); - // - // GBcoreSettingsToolStripMenuItem - // - this.GBcoreSettingsToolStripMenuItem.Name = "GBcoreSettingsToolStripMenuItem"; - this.GBcoreSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.GBcoreSettingsToolStripMenuItem.Text = "Settings..."; - this.GBcoreSettingsToolStripMenuItem.Click += new System.EventHandler(this.GBCoreSettingsMenuItem_Click); - // - // LoadGBInSGBMenuItem - // - this.LoadGBInSGBMenuItem.Name = "LoadGBInSGBMenuItem"; - this.LoadGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); - this.LoadGBInSGBMenuItem.Text = "Load GB in SGB"; - this.LoadGBInSGBMenuItem.Click += new System.EventHandler(this.LoadGbInSgbMenuItem_Click); - // - // toolStripSeparator28 - // - this.toolStripSeparator28.Name = "toolStripSeparator28"; - this.toolStripSeparator28.Size = new System.Drawing.Size(230, 6); - // - // GBGPUViewerMenuItem - // - this.GBGPUViewerMenuItem.Name = "GBGPUViewerMenuItem"; - this.GBGPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); - this.GBGPUViewerMenuItem.Text = "GPU Viewer"; - this.GBGPUViewerMenuItem.Click += new System.EventHandler(this.GbGpuViewerMenuItem_Click); - // - // GBGameGenieMenuItem - // - this.GBGameGenieMenuItem.Name = "GBGameGenieMenuItem"; - this.GBGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); - this.GBGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.GBGameGenieMenuItem.Click += new System.EventHandler(this.GBGameGenieMenuItem_Click); - // - // GBPrinterViewerMenuItem - // - this.GBPrinterViewerMenuItem.Name = "GBPrinterViewerMenuItem"; - this.GBPrinterViewerMenuItem.Size = new System.Drawing.Size(233, 22); - this.GBPrinterViewerMenuItem.Text = "&Printer Viewer"; - this.GBPrinterViewerMenuItem.Click += new System.EventHandler(this.GBPrinterViewerMenuItem_Click); - // - // GBASubMenu - // - this.GBASubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.GBACoreSelectionSubMenu, - this.GBAcoresettingsToolStripMenuItem1, - this.toolStripSeparator33, - this.GbaGpuViewerMenuItem}); - this.GBASubMenu.Name = "GBASubMenu"; - this.GBASubMenu.Size = new System.Drawing.Size(42, 19); - this.GBASubMenu.Text = "GBA"; - // - // GBACoreSelectionSubMenu - // - this.GBACoreSelectionSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.GBAmGBAMenuItem, - this.GBAVBANextMenuItem}); - this.GBACoreSelectionSubMenu.Name = "GBACoreSelectionSubMenu"; - this.GBACoreSelectionSubMenu.Size = new System.Drawing.Size(135, 22); - this.GBACoreSelectionSubMenu.Text = "&Core"; - this.GBACoreSelectionSubMenu.DropDownOpened += new System.EventHandler(this.GBACoreSelectionSubMenu_DropDownOpened); - // - // GBAmGBAMenuItem - // - this.GBAmGBAMenuItem.Name = "GBAmGBAMenuItem"; - this.GBAmGBAMenuItem.Size = new System.Drawing.Size(125, 22); - this.GBAmGBAMenuItem.Text = "mGBA"; - this.GBAmGBAMenuItem.Click += new System.EventHandler(this.UsemGBAMenuItem_Click); - // - // GBAVBANextMenuItem - // - this.GBAVBANextMenuItem.Name = "GBAVBANextMenuItem"; - this.GBAVBANextMenuItem.Size = new System.Drawing.Size(125, 22); - this.GBAVBANextMenuItem.Text = "&VBA-Next"; - this.GBAVBANextMenuItem.Click += new System.EventHandler(this.UseVbaNextMenuItem_Click); - // - // GBAcoresettingsToolStripMenuItem1 - // - this.GBAcoresettingsToolStripMenuItem1.Name = "GBAcoresettingsToolStripMenuItem1"; - this.GBAcoresettingsToolStripMenuItem1.Size = new System.Drawing.Size(135, 22); - this.GBAcoresettingsToolStripMenuItem1.Text = "&Settings..."; - this.GBAcoresettingsToolStripMenuItem1.Click += new System.EventHandler(this.GBAcoresettingsToolStripMenuItem1_Click); - // - // toolStripSeparator33 - // - this.toolStripSeparator33.Name = "toolStripSeparator33"; - this.toolStripSeparator33.Size = new System.Drawing.Size(132, 6); - // - // GbaGpuViewerMenuItem - // - this.GbaGpuViewerMenuItem.Name = "GbaGpuViewerMenuItem"; - this.GbaGpuViewerMenuItem.Size = new System.Drawing.Size(135, 22); - this.GbaGpuViewerMenuItem.Text = "GPU Viewer"; - this.GbaGpuViewerMenuItem.Click += new System.EventHandler(this.GbaGpuViewerMenuItem_Click); - // - // PSXSubMenu - // - this.PSXSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.PSXControllerSettingsMenuItem, - this.PSXOptionsMenuItem, - this.PSXDiscControlsMenuItem, - this.PSXHashDiscsToolStripMenuItem}); - this.PSXSubMenu.Name = "PSXSubMenu"; - this.PSXSubMenu.Size = new System.Drawing.Size(39, 19); - this.PSXSubMenu.Text = "PSX"; - this.PSXSubMenu.DropDownOpened += new System.EventHandler(this.PSXSubMenu_DropDownOpened); - // - // PSXControllerSettingsMenuItem - // - this.PSXControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.PSXControllerSettingsMenuItem.Name = "PSXControllerSettingsMenuItem"; - this.PSXControllerSettingsMenuItem.Size = new System.Drawing.Size(234, 22); - this.PSXControllerSettingsMenuItem.Text = "Controller / Memcard Settings"; - this.PSXControllerSettingsMenuItem.Click += new System.EventHandler(this.PSXControllerSettingsMenuItem_Click); - // - // PSXOptionsMenuItem - // - this.PSXOptionsMenuItem.Name = "PSXOptionsMenuItem"; - this.PSXOptionsMenuItem.Size = new System.Drawing.Size(234, 22); - this.PSXOptionsMenuItem.Text = "&Options"; - this.PSXOptionsMenuItem.Click += new System.EventHandler(this.PSXOptionsMenuItem_Click); - // - // PSXDiscControlsMenuItem - // - this.PSXDiscControlsMenuItem.Name = "PSXDiscControlsMenuItem"; - this.PSXDiscControlsMenuItem.Size = new System.Drawing.Size(234, 22); - this.PSXDiscControlsMenuItem.Text = "&Disc Controls"; - this.PSXDiscControlsMenuItem.Click += new System.EventHandler(this.PSXDiscControlsMenuItem_Click); - // - // PSXHashDiscsToolStripMenuItem - // - this.PSXHashDiscsToolStripMenuItem.Name = "PSXHashDiscsToolStripMenuItem"; - this.PSXHashDiscsToolStripMenuItem.Size = new System.Drawing.Size(234, 22); - this.PSXHashDiscsToolStripMenuItem.Text = "&Hash Discs"; - this.PSXHashDiscsToolStripMenuItem.Click += new System.EventHandler(this.PSXHashDiscsToolStripMenuItem_Click); - // - // SNESSubMenu - // - this.SNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SNESControllerConfigurationMenuItem, - this.toolStripSeparator18, - this.SnesGfxDebuggerMenuItem, - this.SnesGBInSGBMenuItem, - this.SnesGameGenieMenuItem, - this.SnesOptionsMenuItem}); - this.SNESSubMenu.Name = "SNESSubMenu"; - this.SNESSubMenu.Size = new System.Drawing.Size(46, 19); - this.SNESSubMenu.Text = "&SNES"; - this.SNESSubMenu.DropDownOpened += new System.EventHandler(this.SNESSubMenu_DropDownOpened); - // - // SNESControllerConfigurationMenuItem - // - this.SNESControllerConfigurationMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.SNESControllerConfigurationMenuItem.Name = "SNESControllerConfigurationMenuItem"; - this.SNESControllerConfigurationMenuItem.Size = new System.Drawing.Size(233, 22); - this.SNESControllerConfigurationMenuItem.Text = "Controller Configuration"; - this.SNESControllerConfigurationMenuItem.Click += new System.EventHandler(this.SNESControllerConfigurationMenuItem_Click); - // - // toolStripSeparator18 - // - this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(230, 6); - // - // SnesGfxDebuggerMenuItem - // - this.SnesGfxDebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; - this.SnesGfxDebuggerMenuItem.Name = "SnesGfxDebuggerMenuItem"; - this.SnesGfxDebuggerMenuItem.Size = new System.Drawing.Size(233, 22); - this.SnesGfxDebuggerMenuItem.Text = "Graphics Debugger"; - this.SnesGfxDebuggerMenuItem.Click += new System.EventHandler(this.SnesGfxDebuggerMenuItem_Click); - // - // SnesGBInSGBMenuItem - // - this.SnesGBInSGBMenuItem.Name = "SnesGBInSGBMenuItem"; - this.SnesGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); - this.SnesGBInSGBMenuItem.Text = "Load GB in SGB"; - this.SnesGBInSGBMenuItem.Click += new System.EventHandler(this.SnesGbInSgbMenuItem_Click); - // - // SnesGameGenieMenuItem - // - this.SnesGameGenieMenuItem.Name = "SnesGameGenieMenuItem"; - this.SnesGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); - this.SnesGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.SnesGameGenieMenuItem.Click += new System.EventHandler(this.SnesGameGenieMenuItem_Click); - // - // SnesOptionsMenuItem - // - this.SnesOptionsMenuItem.Name = "SnesOptionsMenuItem"; - this.SnesOptionsMenuItem.Size = new System.Drawing.Size(233, 22); - this.SnesOptionsMenuItem.Text = "&Options"; - this.SnesOptionsMenuItem.Click += new System.EventHandler(this.SnesOptionsMenuItem_Click); - // - // ColecoSubMenu - // - this.ColecoSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ColecoControllerSettingsMenuItem, - this.toolStripSeparator35, - this.ColecoSkipBiosMenuItem, - this.ColecoUseSGMMenuItem}); - this.ColecoSubMenu.Name = "ColecoSubMenu"; - this.ColecoSubMenu.Size = new System.Drawing.Size(56, 19); - this.ColecoSubMenu.Text = "&Coleco"; - this.ColecoSubMenu.DropDownOpened += new System.EventHandler(this.ColecoSubMenu_DropDownOpened); - // - // ColecoControllerSettingsMenuItem - // - this.ColecoControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.ColecoControllerSettingsMenuItem.Name = "ColecoControllerSettingsMenuItem"; - this.ColecoControllerSettingsMenuItem.Size = new System.Drawing.Size(253, 22); - this.ColecoControllerSettingsMenuItem.Text = "&Controller Settings..."; - this.ColecoControllerSettingsMenuItem.Click += new System.EventHandler(this.ColecoControllerSettingsMenuItem_Click); - // - // toolStripSeparator35 - // - this.toolStripSeparator35.Name = "toolStripSeparator35"; - this.toolStripSeparator35.Size = new System.Drawing.Size(250, 6); - // - // ColecoSkipBiosMenuItem - // - this.ColecoSkipBiosMenuItem.Name = "ColecoSkipBiosMenuItem"; - this.ColecoSkipBiosMenuItem.Size = new System.Drawing.Size(253, 22); - this.ColecoSkipBiosMenuItem.Text = "&Skip BIOS intro (When Applicable)"; - this.ColecoSkipBiosMenuItem.Click += new System.EventHandler(this.ColecoSkipBiosMenuItem_Click); - // - // ColecoUseSGMMenuItem - // - this.ColecoUseSGMMenuItem.Name = "ColecoUseSGMMenuItem"; - this.ColecoUseSGMMenuItem.Size = new System.Drawing.Size(253, 22); - this.ColecoUseSGMMenuItem.Text = "&Use the Super Game Module"; - this.ColecoUseSGMMenuItem.Click += new System.EventHandler(this.ColecoUseSGMMenuItem_Click); - // - // N64SubMenu - // - this.N64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.N64PluginSettingsMenuItem, - this.N64ControllerSettingsMenuItem, - this.toolStripSeparator23, - this.N64CircularAnalogRangeMenuItem, - this.MupenStyleLagMenuItem, - this.N64ExpansionSlotMenuItem}); - this.N64SubMenu.Name = "N64SubMenu"; - this.N64SubMenu.Size = new System.Drawing.Size(40, 19); - this.N64SubMenu.Text = "N64"; - this.N64SubMenu.DropDownOpened += new System.EventHandler(this.N64SubMenu_DropDownOpened); - // - // N64PluginSettingsMenuItem - // - this.N64PluginSettingsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("N64PluginSettingsMenuItem.Image"))); - this.N64PluginSettingsMenuItem.Name = "N64PluginSettingsMenuItem"; - this.N64PluginSettingsMenuItem.Size = new System.Drawing.Size(192, 22); - this.N64PluginSettingsMenuItem.Text = "Plugins"; - this.N64PluginSettingsMenuItem.Click += new System.EventHandler(this.N64PluginSettingsMenuItem_Click); - // - // N64ControllerSettingsMenuItem - // - this.N64ControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.N64ControllerSettingsMenuItem.Name = "N64ControllerSettingsMenuItem"; - this.N64ControllerSettingsMenuItem.Size = new System.Drawing.Size(192, 22); - this.N64ControllerSettingsMenuItem.Text = "Controller Settings..."; - this.N64ControllerSettingsMenuItem.Click += new System.EventHandler(this.N64ControllerSettingsMenuItem_Click); - // - // toolStripSeparator23 - // - this.toolStripSeparator23.Name = "toolStripSeparator23"; - this.toolStripSeparator23.Size = new System.Drawing.Size(189, 6); - // - // N64CircularAnalogRangeMenuItem - // - this.N64CircularAnalogRangeMenuItem.Name = "N64CircularAnalogRangeMenuItem"; - this.N64CircularAnalogRangeMenuItem.Size = new System.Drawing.Size(192, 22); - this.N64CircularAnalogRangeMenuItem.Text = "Circular Analog Range"; - this.N64CircularAnalogRangeMenuItem.Click += new System.EventHandler(this.N64CircularAnalogRangeMenuItem_Click); - // - // MupenStyleLagMenuItem - // - this.MupenStyleLagMenuItem.Name = "MupenStyleLagMenuItem"; - this.MupenStyleLagMenuItem.Size = new System.Drawing.Size(192, 22); - this.MupenStyleLagMenuItem.Text = "&Non-VI Lag Frames"; - this.MupenStyleLagMenuItem.Click += new System.EventHandler(this.MupenStyleLagMenuItem_Click); - // - // N64ExpansionSlotMenuItem - // - this.N64ExpansionSlotMenuItem.Name = "N64ExpansionSlotMenuItem"; - this.N64ExpansionSlotMenuItem.Size = new System.Drawing.Size(192, 22); - this.N64ExpansionSlotMenuItem.Text = "&Use Expansion Slot"; - this.N64ExpansionSlotMenuItem.Click += new System.EventHandler(this.N64ExpansionSlotMenuItem_Click); - // - // SaturnSubMenu - // - this.SaturnSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SaturnPreferencesMenuItem}); - this.SaturnSubMenu.Name = "SaturnSubMenu"; - this.SaturnSubMenu.Size = new System.Drawing.Size(53, 19); - this.SaturnSubMenu.Text = "&Saturn"; - // - // SaturnPreferencesMenuItem - // - this.SaturnPreferencesMenuItem.Name = "SaturnPreferencesMenuItem"; - this.SaturnPreferencesMenuItem.Size = new System.Drawing.Size(144, 22); - this.SaturnPreferencesMenuItem.Text = "Preferences..."; - this.SaturnPreferencesMenuItem.Click += new System.EventHandler(this.SaturnPreferencesMenuItem_Click); - // - // DGBSubMenu - // - this.DGBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.DGBsettingsToolStripMenuItem}); - this.DGBSubMenu.Name = "DGBSubMenu"; - this.DGBSubMenu.Size = new System.Drawing.Size(59, 19); - this.DGBSubMenu.Text = "&GB Link"; - // - // DGBsettingsToolStripMenuItem - // - this.DGBsettingsToolStripMenuItem.Name = "DGBsettingsToolStripMenuItem"; - this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.DGBsettingsToolStripMenuItem.Text = "Settings..."; - this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbSettingsMenuItem_Click); - // - // DGBHawkSubMenu - // - this.DGBHawkSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.DGBHawksettingsToolStripMenuItem}); - this.DGBHawkSubMenu.Name = "DGBHawkSubMenu"; - this.DGBHawkSubMenu.Size = new System.Drawing.Size(59, 19); - this.DGBHawkSubMenu.Text = "&GB Link"; - // - // DGBHawksettingsToolStripMenuItem - // - this.DGBHawksettingsToolStripMenuItem.Name = "DGBHawksettingsToolStripMenuItem"; - this.DGBHawksettingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.DGBHawksettingsToolStripMenuItem.Text = "Settings..."; - this.DGBHawksettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbHawkSettingsMenuItem_Click); - // - // GenesisSubMenu - // - this.GenesisSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.vDPViewerToolStripMenuItem, - this.GenesisGameGenieECDC, - this.toolStripSeparator26, - this.GenesisSettingsToolStripMenuItem}); - this.GenesisSubMenu.Name = "GenesisSubMenu"; - this.GenesisSubMenu.Size = new System.Drawing.Size(59, 19); - this.GenesisSubMenu.Text = "&Genesis"; - // - // vDPViewerToolStripMenuItem - // - this.vDPViewerToolStripMenuItem.Name = "vDPViewerToolStripMenuItem"; - this.vDPViewerToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.vDPViewerToolStripMenuItem.Text = "&VDP Viewer"; - this.vDPViewerToolStripMenuItem.Click += new System.EventHandler(this.GenVdpViewerMenuItem_Click); - // - // GenesisGameGenieECDC - // - this.GenesisGameGenieECDC.Name = "GenesisGameGenieECDC"; - this.GenesisGameGenieECDC.Size = new System.Drawing.Size(233, 22); - this.GenesisGameGenieECDC.Text = "&Game Genie Encoder/Decoder"; - this.GenesisGameGenieECDC.Click += new System.EventHandler(this.GenesisGameGenieEcDc_Click); - // - // toolStripSeparator26 - // - this.toolStripSeparator26.Name = "toolStripSeparator26"; - this.toolStripSeparator26.Size = new System.Drawing.Size(230, 6); - // - // GenesisSettingsToolStripMenuItem - // - this.GenesisSettingsToolStripMenuItem.Name = "GenesisSettingsToolStripMenuItem"; - this.GenesisSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); - this.GenesisSettingsToolStripMenuItem.Text = "&Settings..."; - this.GenesisSettingsToolStripMenuItem.Click += new System.EventHandler(this.GenesisSettingsMenuItem_Click); - // - // wonderSwanToolStripMenuItem - // - this.wonderSwanToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.settingsToolStripMenuItem}); - this.wonderSwanToolStripMenuItem.Name = "wonderSwanToolStripMenuItem"; - this.wonderSwanToolStripMenuItem.Size = new System.Drawing.Size(89, 19); - this.wonderSwanToolStripMenuItem.Text = "&WonderSwan"; - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.settingsToolStripMenuItem.Text = "&Settings..."; - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.WondersawnSettingsMenuItem_Click); - // - // AppleSubMenu - // - this.AppleSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.AppleDisksSubMenu, - this.settingsToolStripMenuItem1}); - this.AppleSubMenu.Name = "AppleSubMenu"; - this.AppleSubMenu.Size = new System.Drawing.Size(50, 19); - this.AppleSubMenu.Text = "Apple"; - this.AppleSubMenu.DropDownOpened += new System.EventHandler(this.AppleSubMenu_DropDownOpened); - // - // AppleDisksSubMenu - // - this.AppleDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripSeparator31}); - this.AppleDisksSubMenu.Name = "AppleDisksSubMenu"; - this.AppleDisksSubMenu.Size = new System.Drawing.Size(125, 22); - this.AppleDisksSubMenu.Text = "Disks"; - this.AppleDisksSubMenu.DropDownOpened += new System.EventHandler(this.AppleDisksSubMenu_DropDownOpened); - // - // toolStripSeparator31 - // - this.toolStripSeparator31.Name = "toolStripSeparator31"; - this.toolStripSeparator31.Size = new System.Drawing.Size(57, 6); - // - // settingsToolStripMenuItem1 - // - this.settingsToolStripMenuItem1.Name = "settingsToolStripMenuItem1"; - this.settingsToolStripMenuItem1.Size = new System.Drawing.Size(125, 22); - this.settingsToolStripMenuItem1.Text = "&Settings..."; - this.settingsToolStripMenuItem1.Click += new System.EventHandler(this.AppleIISettingsMenuItem_Click); - // - // C64SubMenu - // - this.C64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.C64DisksSubMenu, - this.C64SettingsMenuItem}); - this.C64SubMenu.Name = "C64SubMenu"; - this.C64SubMenu.Size = new System.Drawing.Size(39, 19); - this.C64SubMenu.Text = "&C64"; - this.C64SubMenu.DropDownOpened += new System.EventHandler(this.C64SubMenu_DropDownOpened); - // - // C64DisksSubMenu - // - this.C64DisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripSeparator36}); - this.C64DisksSubMenu.Name = "C64DisksSubMenu"; - this.C64DisksSubMenu.Size = new System.Drawing.Size(125, 22); - this.C64DisksSubMenu.Text = "Disks"; - this.C64DisksSubMenu.DropDownOpened += new System.EventHandler(this.C64DisksSubMenu_DropDownOpened); - // - // toolStripSeparator36 - // - this.toolStripSeparator36.Name = "toolStripSeparator36"; - this.toolStripSeparator36.Size = new System.Drawing.Size(57, 6); - // - // C64SettingsMenuItem - // - this.C64SettingsMenuItem.Name = "C64SettingsMenuItem"; - this.C64SettingsMenuItem.Size = new System.Drawing.Size(125, 22); - this.C64SettingsMenuItem.Text = "&Settings..."; - this.C64SettingsMenuItem.Click += new System.EventHandler(this.C64SettingsMenuItem_Click); - // - // IntvSubMenu - // - this.IntvSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.IntVControllerSettingsMenuItem}); - this.IntvSubMenu.Name = "IntvSubMenu"; - this.IntvSubMenu.Size = new System.Drawing.Size(39, 19); - this.IntvSubMenu.Text = "&Intv"; - this.IntvSubMenu.DropDownOpened += new System.EventHandler(this.IntvSubMenu_DropDownOpened); - // - // IntVControllerSettingsMenuItem - // - this.IntVControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.IntVControllerSettingsMenuItem.Name = "IntVControllerSettingsMenuItem"; - this.IntVControllerSettingsMenuItem.Size = new System.Drawing.Size(181, 22); - this.IntVControllerSettingsMenuItem.Text = "Controller Settings..."; - this.IntVControllerSettingsMenuItem.Click += new System.EventHandler(this.IntVControllerSettingsMenuItem_Click); - // - // sNESToolStripMenuItem - // - this.sNESToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.preferencesToolStripMenuItem}); - this.sNESToolStripMenuItem.Name = "sNESToolStripMenuItem"; - this.sNESToolStripMenuItem.Size = new System.Drawing.Size(46, 19); - this.sNESToolStripMenuItem.Text = "&SNES"; - // - // preferencesToolStripMenuItem - // - this.preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; - this.preferencesToolStripMenuItem.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem.Text = "Preferences..."; - this.preferencesToolStripMenuItem.Click += new System.EventHandler(this.preferencesToolStripMenuItem_Click); - // - // pCFXToolStripMenuItem - // - this.pCFXToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.preferencesToolStripMenuItem3}); - this.pCFXToolStripMenuItem.Name = "pCFXToolStripMenuItem"; - this.pCFXToolStripMenuItem.Size = new System.Drawing.Size(52, 19); - this.pCFXToolStripMenuItem.Text = "&PC-FX"; - // - // preferencesToolStripMenuItem3 - // - this.preferencesToolStripMenuItem3.Name = "preferencesToolStripMenuItem3"; - this.preferencesToolStripMenuItem3.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem3.Text = "Preferences..."; - this.preferencesToolStripMenuItem3.Click += new System.EventHandler(this.preferencesToolStripMenuItem3_Click); - // - // virtualBoyToolStripMenuItem - // - this.virtualBoyToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.preferencesToolStripMenuItem1}); - this.virtualBoyToolStripMenuItem.Name = "virtualBoyToolStripMenuItem"; - this.virtualBoyToolStripMenuItem.Size = new System.Drawing.Size(73, 19); - this.virtualBoyToolStripMenuItem.Text = "&VirtualBoy"; - // - // preferencesToolStripMenuItem1 - // - this.preferencesToolStripMenuItem1.Name = "preferencesToolStripMenuItem1"; - this.preferencesToolStripMenuItem1.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem1.Text = "Preferences..."; - this.preferencesToolStripMenuItem1.Click += new System.EventHandler(this.preferencesToolStripMenuItem1_Click); - // - // neoGeoPocketToolStripMenuItem - // - this.neoGeoPocketToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.preferencesToolStripMenuItem2}); - this.neoGeoPocketToolStripMenuItem.Name = "neoGeoPocketToolStripMenuItem"; - this.neoGeoPocketToolStripMenuItem.Size = new System.Drawing.Size(101, 19); - this.neoGeoPocketToolStripMenuItem.Text = "&NeoGeo Pocket"; - // - // preferencesToolStripMenuItem2 - // - this.preferencesToolStripMenuItem2.Name = "preferencesToolStripMenuItem2"; - this.preferencesToolStripMenuItem2.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem2.Text = "Preferences..."; - this.preferencesToolStripMenuItem2.Click += new System.EventHandler(this.preferencesToolStripMenuItem2_Click); - // - // HelpSubMenu - // - this.HelpSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.OnlineHelpMenuItem, - this.ForumsMenuItem, - this.FeaturesMenuItem, - this.AboutMenuItem}); - this.HelpSubMenu.Name = "HelpSubMenu"; - this.HelpSubMenu.Size = new System.Drawing.Size(44, 19); - this.HelpSubMenu.Text = "&Help"; - this.HelpSubMenu.DropDownOpened += new System.EventHandler(this.HelpSubMenu_DropDownOpened); - // - // OnlineHelpMenuItem - // - this.OnlineHelpMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Help; - this.OnlineHelpMenuItem.Name = "OnlineHelpMenuItem"; - this.OnlineHelpMenuItem.Size = new System.Drawing.Size(146, 22); - this.OnlineHelpMenuItem.Text = "&Online Help..."; - this.OnlineHelpMenuItem.Click += new System.EventHandler(this.OnlineHelpMenuItem_Click); - // - // ForumsMenuItem - // - this.ForumsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; - this.ForumsMenuItem.Name = "ForumsMenuItem"; - this.ForumsMenuItem.Size = new System.Drawing.Size(146, 22); - this.ForumsMenuItem.Text = "Forums..."; - this.ForumsMenuItem.Click += new System.EventHandler(this.ForumsMenuItem_Click); - // - // FeaturesMenuItem - // - this.FeaturesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.kitchensink; - this.FeaturesMenuItem.Name = "FeaturesMenuItem"; - this.FeaturesMenuItem.Size = new System.Drawing.Size(146, 22); - this.FeaturesMenuItem.Text = "&Features"; - this.FeaturesMenuItem.Click += new System.EventHandler(this.FeaturesMenuItem_Click); - // - // AboutMenuItem - // - this.AboutMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; - this.AboutMenuItem.Name = "AboutMenuItem"; - this.AboutMenuItem.Size = new System.Drawing.Size(146, 22); - this.AboutMenuItem.Text = "&About"; - this.AboutMenuItem.Click += new System.EventHandler(this.AboutMenuItem_Click); - // - // zXSpectrumToolStripMenuItem - // - this.zXSpectrumToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ZXSpectrumCoreEmulationSettingsMenuItem, - this.ZXSpectrumControllerConfigurationMenuItem, - this.ZXSpectrumAudioSettingsMenuItem, - this.ZXSpectrumNonSyncSettingsMenuItem, - this.ZXSpectrumPokeMemoryMenuItem, - this.ZXSpectrumMediaMenuItem}); - this.zXSpectrumToolStripMenuItem.Name = "zXSpectrumToolStripMenuItem"; - this.zXSpectrumToolStripMenuItem.Size = new System.Drawing.Size(87, 19); - this.zXSpectrumToolStripMenuItem.Text = "ZX Spectrum"; - this.zXSpectrumToolStripMenuItem.DropDownOpened += new System.EventHandler(this.zXSpectrumToolStripMenuItem_DropDownOpened); - // - // ZXSpectrumCoreEmulationSettingsMenuItem - // - this.ZXSpectrumCoreEmulationSettingsMenuItem.Name = "ZXSpectrumCoreEmulationSettingsMenuItem"; - this.ZXSpectrumCoreEmulationSettingsMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumCoreEmulationSettingsMenuItem.Text = "Core Emulation Settings"; - this.ZXSpectrumCoreEmulationSettingsMenuItem.Click += new System.EventHandler(this.ZXSpectrumCoreEmulationSettingsMenuItem_Click); - // - // ZXSpectrumControllerConfigurationMenuItem - // - this.ZXSpectrumControllerConfigurationMenuItem.Name = "ZXSpectrumControllerConfigurationMenuItem"; - this.ZXSpectrumControllerConfigurationMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumControllerConfigurationMenuItem.Text = "Joystick Configuration"; - this.ZXSpectrumControllerConfigurationMenuItem.Click += new System.EventHandler(this.ZXSpectrumControllerConfigurationMenuItem_Click); - // - // ZXSpectrumAudioSettingsMenuItem - // - this.ZXSpectrumAudioSettingsMenuItem.Name = "ZXSpectrumAudioSettingsMenuItem"; - this.ZXSpectrumAudioSettingsMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumAudioSettingsMenuItem.Text = "Audio Settings"; - this.ZXSpectrumAudioSettingsMenuItem.Click += new System.EventHandler(this.ZXSpectrumAudioSettingsMenuItem_Click); - // - // ZXSpectrumNonSyncSettingsMenuItem - // - this.ZXSpectrumNonSyncSettingsMenuItem.Name = "ZXSpectrumNonSyncSettingsMenuItem"; - this.ZXSpectrumNonSyncSettingsMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumNonSyncSettingsMenuItem.Text = "Non-Sync Settings"; - this.ZXSpectrumNonSyncSettingsMenuItem.Click += new System.EventHandler(this.ZXSpectrumNonSyncSettingsMenuItem_Click); - // - // ZXSpectrumPokeMemoryMenuItem - // - this.ZXSpectrumPokeMemoryMenuItem.Name = "ZXSpectrumPokeMemoryMenuItem"; - this.ZXSpectrumPokeMemoryMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumPokeMemoryMenuItem.Text = "POKE Memory"; - this.ZXSpectrumPokeMemoryMenuItem.Click += new System.EventHandler(this.ZXSpectrumPokeMemoryMenuItem_Click); - // - // ZXSpectrumMediaMenuItem - // - this.ZXSpectrumMediaMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ZXSpectrumTapesSubMenu, - this.ZXSpectrumDisksSubMenu, - this.ZXSpectrumExportSnapshotMenuItemMenuItem}); - this.ZXSpectrumMediaMenuItem.Name = "ZXSpectrumMediaMenuItem"; - this.ZXSpectrumMediaMenuItem.Size = new System.Drawing.Size(201, 22); - this.ZXSpectrumMediaMenuItem.Text = "Media"; - this.ZXSpectrumMediaMenuItem.DropDownOpened += new System.EventHandler(this.ZXSpectrumMediaMenuItem_DropDownOpened); - // - // ZXSpectrumTapesSubMenu - // - this.ZXSpectrumTapesSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.zxt1ToolStripMenuItem}); - this.ZXSpectrumTapesSubMenu.Name = "ZXSpectrumTapesSubMenu"; - this.ZXSpectrumTapesSubMenu.Size = new System.Drawing.Size(159, 22); - this.ZXSpectrumTapesSubMenu.Text = "Tapes"; - this.ZXSpectrumTapesSubMenu.DropDownOpened += new System.EventHandler(this.ZXSpectrumTapesSubMenu_DropDownOpened); - // - // zxt1ToolStripMenuItem - // - this.zxt1ToolStripMenuItem.Name = "zxt1ToolStripMenuItem"; - this.zxt1ToolStripMenuItem.Size = new System.Drawing.Size(94, 22); - this.zxt1ToolStripMenuItem.Text = "zxt1"; - // - // ZXSpectrumDisksSubMenu - // - this.ZXSpectrumDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.zxt2ToolStripMenuItem}); - this.ZXSpectrumDisksSubMenu.Name = "ZXSpectrumDisksSubMenu"; - this.ZXSpectrumDisksSubMenu.Size = new System.Drawing.Size(159, 22); - this.ZXSpectrumDisksSubMenu.Text = "Disks"; - this.ZXSpectrumDisksSubMenu.DropDownOpened += new System.EventHandler(this.ZXSpectrumDisksSubMenu_DropDownOpened); - // - // zxt2ToolStripMenuItem - // - this.zxt2ToolStripMenuItem.Name = "zxt2ToolStripMenuItem"; - this.zxt2ToolStripMenuItem.Size = new System.Drawing.Size(94, 22); - this.zxt2ToolStripMenuItem.Text = "zxt2"; - // - // ZXSpectrumExportSnapshotMenuItemMenuItem - // - this.ZXSpectrumExportSnapshotMenuItemMenuItem.Name = "ZXSpectrumExportSnapshotMenuItemMenuItem"; - this.ZXSpectrumExportSnapshotMenuItemMenuItem.Size = new System.Drawing.Size(159, 22); - this.ZXSpectrumExportSnapshotMenuItemMenuItem.Text = "Export Snapshot"; - this.ZXSpectrumExportSnapshotMenuItemMenuItem.Click += new System.EventHandler(this.ZXSpectrumExportSnapshotMenuItemMenuItem_Click); - // - // amstradCPCToolStripMenuItem - // - this.amstradCPCToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.amstradCPCCoreEmulationSettingsToolStripMenuItem, - this.AmstradCPCAudioSettingsToolStripMenuItem, - this.AmstradCPCNonSyncSettingsToolStripMenuItem, - this.AmstradCPCPokeMemoryToolStripMenuItem, - this.AmstradCPCMediaToolStripMenuItem}); - this.amstradCPCToolStripMenuItem.Name = "amstradCPCToolStripMenuItem"; - this.amstradCPCToolStripMenuItem.Size = new System.Drawing.Size(90, 19); - this.amstradCPCToolStripMenuItem.Text = "Amstrad CPC"; - // - // amstradCPCCoreEmulationSettingsToolStripMenuItem - // - this.amstradCPCCoreEmulationSettingsToolStripMenuItem.Name = "amstradCPCCoreEmulationSettingsToolStripMenuItem"; - this.amstradCPCCoreEmulationSettingsToolStripMenuItem.Size = new System.Drawing.Size(201, 22); - this.amstradCPCCoreEmulationSettingsToolStripMenuItem.Text = "Core Emulation Settings"; - this.amstradCPCCoreEmulationSettingsToolStripMenuItem.Click += new System.EventHandler(this.amstradCPCCoreEmulationSettingsToolStripMenuItem_Click); - // - // AmstradCPCAudioSettingsToolStripMenuItem - // - this.AmstradCPCAudioSettingsToolStripMenuItem.Name = "AmstradCPCAudioSettingsToolStripMenuItem"; - this.AmstradCPCAudioSettingsToolStripMenuItem.Size = new System.Drawing.Size(201, 22); - this.AmstradCPCAudioSettingsToolStripMenuItem.Text = "Audio Settings"; - this.AmstradCPCAudioSettingsToolStripMenuItem.Click += new System.EventHandler(this.AmstradCPCAudioSettingsToolStripMenuItem_Click); - // - // AmstradCPCPokeMemoryToolStripMenuItem - // - this.AmstradCPCPokeMemoryToolStripMenuItem.Name = "AmstradCPCPokeMemoryToolStripMenuItem"; - this.AmstradCPCPokeMemoryToolStripMenuItem.Size = new System.Drawing.Size(201, 22); - this.AmstradCPCPokeMemoryToolStripMenuItem.Text = "POKE Memory"; - this.AmstradCPCPokeMemoryToolStripMenuItem.Click += new System.EventHandler(this.AmstradCPCPokeMemoryToolStripMenuItem_Click); - // - // AmstradCPCMediaToolStripMenuItem - // - this.AmstradCPCMediaToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.AmstradCPCTapesSubMenu, - this.AmstradCPCDisksSubMenu}); - this.AmstradCPCMediaToolStripMenuItem.Name = "AmstradCPCMediaToolStripMenuItem"; - this.AmstradCPCMediaToolStripMenuItem.Size = new System.Drawing.Size(201, 22); - this.AmstradCPCMediaToolStripMenuItem.Text = "Media"; - this.AmstradCPCMediaToolStripMenuItem.DropDownOpened += new System.EventHandler(this.AmstradCPCMediaToolStripMenuItem_DropDownOpened); - // - // AmstradCPCTapesSubMenu - // - this.AmstradCPCTapesSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cpct1ToolStripMenuItem}); - this.AmstradCPCTapesSubMenu.Name = "AmstradCPCTapesSubMenu"; - this.AmstradCPCTapesSubMenu.Size = new System.Drawing.Size(105, 22); - this.AmstradCPCTapesSubMenu.Text = "Tapes"; - this.AmstradCPCTapesSubMenu.DropDownOpened += new System.EventHandler(this.AmstradCPCTapesSubMenu_DropDownOpened); - // - // cpct1ToolStripMenuItem - // - this.cpct1ToolStripMenuItem.Name = "cpct1ToolStripMenuItem"; - this.cpct1ToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.cpct1ToolStripMenuItem.Text = "cpct1"; - // - // AmstradCPCDisksSubMenu - // - this.AmstradCPCDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cpcd1ToolStripMenuItem}); - this.AmstradCPCDisksSubMenu.Name = "AmstradCPCDisksSubMenu"; - this.AmstradCPCDisksSubMenu.Size = new System.Drawing.Size(105, 22); - this.AmstradCPCDisksSubMenu.Text = "Disks"; - this.AmstradCPCDisksSubMenu.DropDownOpened += new System.EventHandler(this.AmstradCPCDisksSubMenu_DropDownOpened); - // - // cpcd1ToolStripMenuItem - // - this.cpcd1ToolStripMenuItem.Name = "cpcd1ToolStripMenuItem"; - this.cpcd1ToolStripMenuItem.Size = new System.Drawing.Size(106, 22); - this.cpcd1ToolStripMenuItem.Text = "cpcd1"; - // - // Atari7800HawkCoreMenuItem - // - this.Atari7800HawkCoreMenuItem.Name = "Atari7800HawkCoreMenuItem"; - this.Atari7800HawkCoreMenuItem.Size = new System.Drawing.Size(153, 22); - this.Atari7800HawkCoreMenuItem.Text = "Atari7800Hawk"; - // - // MainStatusBar - // - this.MainStatusBar.ClickThrough = true; - this.MainStatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.DumpStatusButton, - this.EmuStatus, - this.PlayRecordStatusButton, - this.PauseStatusButton, - this.RebootStatusBarIcon, - this.AVIStatusLabel, - this.LedLightStatusLabel, - this.SaveSlotsStatusLabel, - this.Slot1StatusButton, - this.Slot2StatusButton, - this.Slot3StatusButton, - this.Slot4StatusButton, - this.Slot5StatusButton, - this.Slot6StatusButton, - this.Slot7StatusButton, - this.Slot8StatusButton, - this.Slot9StatusButton, - this.Slot0StatusButton, - this.CheatStatusButton, - this.KeyPriorityStatusLabel, - this.CoreNameStatusBarButton, - this.ProfileFirstBootLabel, - this.LinkConnectStatusBarButton, - this.UpdateNotification}); - this.MainStatusBar.Location = new System.Drawing.Point(0, 386); - this.MainStatusBar.Name = "MainStatusBar"; - this.MainStatusBar.ShowItemToolTips = true; - this.MainStatusBar.Size = new System.Drawing.Size(470, 22); - this.MainStatusBar.SizingGrip = false; - this.MainStatusBar.TabIndex = 1; - this.MainStatusBar.Text = "0"; - // - // DumpStatusButton - // - this.DumpStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.DumpStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.DumpStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.DumpStatusButton.Name = "DumpStatusButton"; - this.DumpStatusButton.ShowDropDownArrow = false; - this.DumpStatusButton.Size = new System.Drawing.Size(20, 20); - this.DumpStatusButton.Text = "No ROM loaded"; - this.DumpStatusButton.Click += new System.EventHandler(this.DumpStatusButton_Click); - // - // EmuStatus - // - this.EmuStatus.Name = "EmuStatus"; - this.EmuStatus.Size = new System.Drawing.Size(0, 17); - // - // PlayRecordStatusButton - // - this.PlayRecordStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.PlayRecordStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.PlayRecordStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.PlayRecordStatusButton.Name = "PlayRecordStatusButton"; - this.PlayRecordStatusButton.ShowDropDownArrow = false; - this.PlayRecordStatusButton.Size = new System.Drawing.Size(20, 20); - this.PlayRecordStatusButton.Text = "No movie is active"; - // - // PauseStatusButton - // - this.PauseStatusButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.PauseStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.PauseStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.PauseStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.PauseStatusButton.Name = "PauseStatusButton"; - this.PauseStatusButton.ShowDropDownArrow = false; - this.PauseStatusButton.Size = new System.Drawing.Size(20, 20); - this.PauseStatusButton.Text = "toolStripDropDownButton1"; - this.PauseStatusButton.ToolTipText = "Emulator is paused"; - this.PauseStatusButton.Click += new System.EventHandler(this.PauseMenuItem_Click); - // - // RebootStatusBarIcon - // - this.RebootStatusBarIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.RebootStatusBarIcon.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; - this.RebootStatusBarIcon.Name = "RebootStatusBarIcon"; - this.RebootStatusBarIcon.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.RebootStatusBarIcon.Size = new System.Drawing.Size(16, 17); - this.RebootStatusBarIcon.Text = "Reboot"; - this.RebootStatusBarIcon.ToolTipText = "A reboot of the core is needed for a setting change to take effect"; - this.RebootStatusBarIcon.Click += new System.EventHandler(this.PowerMenuItem_Click); - // - // AVIStatusLabel - // - this.AVIStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.AVIStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.AVIStatusLabel.Name = "AVIStatusLabel"; - this.AVIStatusLabel.Size = new System.Drawing.Size(16, 17); - this.AVIStatusLabel.Text = "AVI Capture"; - // - // LedLightStatusLabel - // - this.LedLightStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LightOff; - this.LedLightStatusLabel.Name = "LedLightStatusLabel"; - this.LedLightStatusLabel.Size = new System.Drawing.Size(16, 17); - this.LedLightStatusLabel.ToolTipText = "Disk Drive LED Light"; - // - // SaveSlotsStatusLabel - // - this.SaveSlotsStatusLabel.BackColor = System.Drawing.SystemColors.Control; - this.SaveSlotsStatusLabel.Name = "SaveSlotsStatusLabel"; - this.SaveSlotsStatusLabel.Size = new System.Drawing.Size(58, 17); - this.SaveSlotsStatusLabel.Text = "Save slots"; - // - // Slot1StatusButton - // - this.Slot1StatusButton.Name = "Slot1StatusButton"; - this.Slot1StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot1StatusButton.Text = "1"; - this.Slot1StatusButton.ToolTipText = "Save slot 1"; - this.Slot1StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot2StatusButton - // - this.Slot2StatusButton.Name = "Slot2StatusButton"; - this.Slot2StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot2StatusButton.Text = "2"; - this.Slot2StatusButton.ToolTipText = "Save slot 2"; - this.Slot2StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot3StatusButton - // - this.Slot3StatusButton.Name = "Slot3StatusButton"; - this.Slot3StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot3StatusButton.Text = "3"; - this.Slot3StatusButton.ToolTipText = "Save slot 3"; - this.Slot3StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot4StatusButton - // - this.Slot4StatusButton.Name = "Slot4StatusButton"; - this.Slot4StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot4StatusButton.Text = "4"; - this.Slot4StatusButton.ToolTipText = "Save slot 4"; - this.Slot4StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot5StatusButton - // - this.Slot5StatusButton.Name = "Slot5StatusButton"; - this.Slot5StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot5StatusButton.Text = "5"; - this.Slot5StatusButton.ToolTipText = "Save slot 5"; - this.Slot5StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot6StatusButton - // - this.Slot6StatusButton.Name = "Slot6StatusButton"; - this.Slot6StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot6StatusButton.Text = "6"; - this.Slot6StatusButton.ToolTipText = "Save slot 6"; - this.Slot6StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot7StatusButton - // - this.Slot7StatusButton.Name = "Slot7StatusButton"; - this.Slot7StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot7StatusButton.Text = "7"; - this.Slot7StatusButton.ToolTipText = "Save slot 7"; - this.Slot7StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot8StatusButton - // - this.Slot8StatusButton.Name = "Slot8StatusButton"; - this.Slot8StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot8StatusButton.Text = "8"; - this.Slot8StatusButton.ToolTipText = "Save slot 8"; - this.Slot8StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot9StatusButton - // - this.Slot9StatusButton.Name = "Slot9StatusButton"; - this.Slot9StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot9StatusButton.Text = "9"; - this.Slot9StatusButton.ToolTipText = "Save slot 9"; - this.Slot9StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot0StatusButton - // - this.Slot0StatusButton.Name = "Slot0StatusButton"; - this.Slot0StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot0StatusButton.Text = "0"; - this.Slot0StatusButton.ToolTipText = "Save slot 0"; - this.Slot0StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // CheatStatusButton - // - this.CheatStatusButton.Name = "CheatStatusButton"; - this.CheatStatusButton.Size = new System.Drawing.Size(0, 17); - this.CheatStatusButton.Click += new System.EventHandler(this.FreezeStatus_Click); - // - // KeyPriorityStatusLabel - // - this.KeyPriorityStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.KeyPriorityStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Both; - this.KeyPriorityStatusLabel.Margin = new System.Windows.Forms.Padding(5, 3, 5, 0); - this.KeyPriorityStatusLabel.Name = "KeyPriorityStatusLabel"; - this.KeyPriorityStatusLabel.Size = new System.Drawing.Size(16, 19); - this.KeyPriorityStatusLabel.Text = "KeyPriority"; - this.KeyPriorityStatusLabel.Click += new System.EventHandler(this.KeyPriorityStatusLabel_Click); - // - // CoreNameStatusBarButton - // - this.CoreNameStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; - this.CoreNameStatusBarButton.Name = "CoreNameStatusBarButton"; - this.CoreNameStatusBarButton.Size = new System.Drawing.Size(71, 17); - this.CoreNameStatusBarButton.Text = "Neshawk"; - // - // ProfileFirstBootLabel - // - this.ProfileFirstBootLabel.AutoToolTip = true; - this.ProfileFirstBootLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ProfileFirstBootLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; - this.ProfileFirstBootLabel.Name = "ProfileFirstBootLabel"; - this.ProfileFirstBootLabel.Size = new System.Drawing.Size(16, 17); - this.ProfileFirstBootLabel.Text = "ProfileFirstBootLabel"; - this.ProfileFirstBootLabel.ToolTipText = "Set up your profile before use"; - this.ProfileFirstBootLabel.Visible = false; - this.ProfileFirstBootLabel.Click += new System.EventHandler(this.ProfileFirstBootLabel_Click); - // - // LinkConnectStatusBarButton - // - this.LinkConnectStatusBarButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.LinkConnectStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.connect_16x16; - this.LinkConnectStatusBarButton.Name = "LinkConnectStatusBarButton"; - this.LinkConnectStatusBarButton.Size = new System.Drawing.Size(16, 17); - this.LinkConnectStatusBarButton.Text = "Link connection is currently enabled"; - this.LinkConnectStatusBarButton.ToolTipText = "Link connection is currently enabled"; - // - // UpdateNotification - // - this.UpdateNotification.IsLink = true; - this.UpdateNotification.LinkColor = System.Drawing.Color.Red; - this.UpdateNotification.Name = "UpdateNotification"; - this.UpdateNotification.Size = new System.Drawing.Size(46, 17); - this.UpdateNotification.Spring = true; - this.UpdateNotification.Text = "New version available!"; - this.UpdateNotification.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.UpdateNotification.Click += new System.EventHandler(this.UpdateNotification_Click); - // - // MainFormContextMenu - // - this.MainFormContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.OpenRomContextMenuItem, - this.LoadLastRomContextMenuItem, - this.StopAVContextMenuItem, - this.ContextSeparator_AfterROM, - this.RecordMovieContextMenuItem, - this.PlayMovieContextMenuItem, - this.RestartMovieContextMenuItem, - this.StopMovieContextMenuItem, - this.LoadLastMovieContextMenuItem, - this.BackupMovieContextMenuItem, - this.StopNoSaveContextMenuItem, - this.ViewSubtitlesContextMenuItem, - this.AddSubtitleContextMenuItem, - this.ViewCommentsContextMenuItem, - this.SaveMovieContextMenuItem, - this.SaveMovieAsContextMenuItem, - this.ContextSeparator_AfterMovie, - this.UndoSavestateContextMenuItem, - this.ContextSeparator_AfterUndo, - this.ConfigContextMenuItem, - this.ScreenshotContextMenuItem, - this.CloseRomContextMenuItem, - this.ClearSRAMContextMenuItem, - this.ShowMenuContextMenuSeparator, - this.ShowMenuContextMenuItem}); - this.MainFormContextMenu.Name = "contextMenuStrip1"; - this.MainFormContextMenu.Size = new System.Drawing.Size(217, 490); - this.MainFormContextMenu.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.MainFormContextMenu_Closing); - this.MainFormContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.MainFormContextMenu_Opening); - // - // OpenRomContextMenuItem - // - this.OpenRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.OpenRomContextMenuItem.Name = "OpenRomContextMenuItem"; - this.OpenRomContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.OpenRomContextMenuItem.Text = "Open Rom"; - this.OpenRomContextMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); - // - // LoadLastRomContextMenuItem - // - this.LoadLastRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.LoadLastRomContextMenuItem.Name = "LoadLastRomContextMenuItem"; - this.LoadLastRomContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.LoadLastRomContextMenuItem.Text = "Load Last ROM"; - this.LoadLastRomContextMenuItem.Click += new System.EventHandler(this.LoadLastRomContextMenuItem_Click); - // - // StopAVContextMenuItem - // - this.StopAVContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopAVContextMenuItem.Name = "StopAVContextMenuItem"; - this.StopAVContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.StopAVContextMenuItem.Text = "Stop AVI/WAV"; - this.StopAVContextMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); - // - // ContextSeparator_AfterROM - // - this.ContextSeparator_AfterROM.Name = "ContextSeparator_AfterROM"; - this.ContextSeparator_AfterROM.Size = new System.Drawing.Size(213, 6); - // - // RecordMovieContextMenuItem - // - this.RecordMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordMovieContextMenuItem.Name = "RecordMovieContextMenuItem"; - this.RecordMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.RecordMovieContextMenuItem.Text = "Record Movie"; - this.RecordMovieContextMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); - // - // PlayMovieContextMenuItem - // - this.PlayMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.PlayMovieContextMenuItem.Name = "PlayMovieContextMenuItem"; - this.PlayMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.PlayMovieContextMenuItem.Text = "Play Movie"; - this.PlayMovieContextMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); - // - // RestartMovieContextMenuItem - // - this.RestartMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; - this.RestartMovieContextMenuItem.Name = "RestartMovieContextMenuItem"; - this.RestartMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.RestartMovieContextMenuItem.Text = "Restart Movie"; - this.RestartMovieContextMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); - // - // StopMovieContextMenuItem - // - this.StopMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieContextMenuItem.Name = "StopMovieContextMenuItem"; - this.StopMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.StopMovieContextMenuItem.Text = "Stop Movie"; - this.StopMovieContextMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); - // - // LoadLastMovieContextMenuItem - // - this.LoadLastMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.LoadLastMovieContextMenuItem.Name = "LoadLastMovieContextMenuItem"; - this.LoadLastMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.LoadLastMovieContextMenuItem.Text = "Load Last Movie"; - this.LoadLastMovieContextMenuItem.Click += new System.EventHandler(this.LoadLastMovieContextMenuItem_Click); - // - // BackupMovieContextMenuItem - // - this.BackupMovieContextMenuItem.Name = "BackupMovieContextMenuItem"; - this.BackupMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.BackupMovieContextMenuItem.Text = "Backup Movie"; - this.BackupMovieContextMenuItem.Click += new System.EventHandler(this.BackupMovieContextMenuItem_Click); - // - // StopNoSaveContextMenuItem - // - this.StopNoSaveContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopNoSaveContextMenuItem.Name = "StopNoSaveContextMenuItem"; - this.StopNoSaveContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.StopNoSaveContextMenuItem.Text = "Stop Movie without Saving"; - this.StopNoSaveContextMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); - // - // ViewSubtitlesContextMenuItem - // - this.ViewSubtitlesContextMenuItem.Name = "ViewSubtitlesContextMenuItem"; - this.ViewSubtitlesContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ViewSubtitlesContextMenuItem.Text = "View Subtitles"; - this.ViewSubtitlesContextMenuItem.Click += new System.EventHandler(this.ViewSubtitlesContextMenuItem_Click); - // - // AddSubtitleContextMenuItem - // - this.AddSubtitleContextMenuItem.Name = "AddSubtitleContextMenuItem"; - this.AddSubtitleContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.AddSubtitleContextMenuItem.Text = "Add Subtitle"; - this.AddSubtitleContextMenuItem.Click += new System.EventHandler(this.AddSubtitleContextMenuItem_Click); - // - // ViewCommentsContextMenuItem - // - this.ViewCommentsContextMenuItem.Name = "ViewCommentsContextMenuItem"; - this.ViewCommentsContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ViewCommentsContextMenuItem.Text = "View Comments"; - this.ViewCommentsContextMenuItem.Click += new System.EventHandler(this.ViewCommentsContextMenuItem_Click); - // - // SaveMovieContextMenuItem - // - this.SaveMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieContextMenuItem.Name = "SaveMovieContextMenuItem"; - this.SaveMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.SaveMovieContextMenuItem.Text = "Save Movie"; - this.SaveMovieContextMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); - // - // SaveMovieAsContextMenuItem - // - this.SaveMovieAsContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieAsContextMenuItem.Name = "SaveMovieAsContextMenuItem"; - this.SaveMovieAsContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.SaveMovieAsContextMenuItem.Text = "Save Movie As..."; - this.SaveMovieAsContextMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); - // - // ContextSeparator_AfterMovie - // - this.ContextSeparator_AfterMovie.Name = "ContextSeparator_AfterMovie"; - this.ContextSeparator_AfterMovie.Size = new System.Drawing.Size(213, 6); - // - // UndoSavestateContextMenuItem - // - this.UndoSavestateContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.undo; - this.UndoSavestateContextMenuItem.Name = "UndoSavestateContextMenuItem"; - this.UndoSavestateContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.UndoSavestateContextMenuItem.Text = "Undo Savestate"; - this.UndoSavestateContextMenuItem.Click += new System.EventHandler(this.UndoSavestateContextMenuItem_Click); - // - // ContextSeparator_AfterUndo - // - this.ContextSeparator_AfterUndo.Name = "ContextSeparator_AfterUndo"; - this.ContextSeparator_AfterUndo.Size = new System.Drawing.Size(213, 6); - // - // ConfigContextMenuItem - // - this.ConfigContextMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem6, - this.toolStripMenuItem7, - this.toolStripMenuItem8, - this.toolStripMenuItem9, - this.toolStripMenuItem10, - this.toolStripMenuItem11, - this.toolStripMenuItem12, - this.toolStripMenuItem13, - this.toolStripMenuItem14, - this.toolStripMenuItem15, - this.customizeToolStripMenuItem, - this.toolStripSeparator30, - this.SavestateTypeContextSubMenu, - this.toolStripSeparator37, - this.toolStripMenuItem66, - this.toolStripMenuItem67}); - this.ConfigContextMenuItem.Name = "ConfigContextMenuItem"; - this.ConfigContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ConfigContextMenuItem.Text = "Config"; - // - // toolStripMenuItem6 - // - this.toolStripMenuItem6.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem6.Text = "&Controllers..."; - this.toolStripMenuItem6.Click += new System.EventHandler(this.ControllersMenuItem_Click); - // - // toolStripMenuItem7 - // - this.toolStripMenuItem7.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; - this.toolStripMenuItem7.Name = "toolStripMenuItem7"; - this.toolStripMenuItem7.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem7.Text = "&Hotkeys..."; - this.toolStripMenuItem7.Click += new System.EventHandler(this.HotkeysMenuItem_Click); - // - // toolStripMenuItem8 - // - this.toolStripMenuItem8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem8.Image"))); - this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem8.Text = "Display..."; - this.toolStripMenuItem8.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); - // - // toolStripMenuItem9 - // - this.toolStripMenuItem9.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.toolStripMenuItem9.Name = "toolStripMenuItem9"; - this.toolStripMenuItem9.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem9.Text = "&Sound..."; - this.toolStripMenuItem9.Click += new System.EventHandler(this.SoundMenuItem_Click); - // - // toolStripMenuItem10 - // - this.toolStripMenuItem10.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; - this.toolStripMenuItem10.Name = "toolStripMenuItem10"; - this.toolStripMenuItem10.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem10.Text = "Paths..."; - this.toolStripMenuItem10.Click += new System.EventHandler(this.PathsMenuItem_Click); - // - // toolStripMenuItem11 - // - this.toolStripMenuItem11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem11.Image"))); - this.toolStripMenuItem11.Name = "toolStripMenuItem11"; - this.toolStripMenuItem11.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem11.Text = "&Firmwares..."; - this.toolStripMenuItem11.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); - // - // toolStripMenuItem12 - // - this.toolStripMenuItem12.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; - this.toolStripMenuItem12.Name = "toolStripMenuItem12"; - this.toolStripMenuItem12.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem12.Text = "&Messages..."; - this.toolStripMenuItem12.Click += new System.EventHandler(this.MessagesMenuItem_Click); - // - // toolStripMenuItem13 - // - this.toolStripMenuItem13.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; - this.toolStripMenuItem13.Name = "toolStripMenuItem13"; - this.toolStripMenuItem13.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem13.Text = "&Autofire..."; - this.toolStripMenuItem13.Click += new System.EventHandler(this.AutofireMenuItem_Click); - // - // toolStripMenuItem14 - // - this.toolStripMenuItem14.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; - this.toolStripMenuItem14.Name = "toolStripMenuItem14"; - this.toolStripMenuItem14.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem14.Text = "&Rewind..."; - this.toolStripMenuItem14.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); - // - // toolStripMenuItem15 - // - this.toolStripMenuItem15.Name = "toolStripMenuItem15"; - this.toolStripMenuItem15.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem15.Text = "File Extensions..."; - this.toolStripMenuItem15.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); - // - // customizeToolStripMenuItem - // - this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; - this.customizeToolStripMenuItem.Size = new System.Drawing.Size(159, 22); - this.customizeToolStripMenuItem.Text = "Customize..."; - this.customizeToolStripMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); - // - // toolStripSeparator30 - // - this.toolStripSeparator30.Name = "toolStripSeparator30"; - this.toolStripSeparator30.Size = new System.Drawing.Size(156, 6); - // - // SavestateTypeContextSubMenu - // - this.SavestateTypeContextSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SavestateTypeDefaultContextMenuItem, - this.SavestateBinaryContextMenuItem, - this.SavestateTextContextMenuItem}); - this.SavestateTypeContextSubMenu.Name = "SavestateTypeContextSubMenu"; - this.SavestateTypeContextSubMenu.Size = new System.Drawing.Size(159, 22); - this.SavestateTypeContextSubMenu.Text = "Savestate Type"; - this.SavestateTypeContextSubMenu.DropDownOpened += new System.EventHandler(this.SavestateTypeContextSubMenu_DropDownOpened); - // - // SavestateTypeDefaultContextMenuItem - // - this.SavestateTypeDefaultContextMenuItem.Name = "SavestateTypeDefaultContextMenuItem"; - this.SavestateTypeDefaultContextMenuItem.Size = new System.Drawing.Size(112, 22); - this.SavestateTypeDefaultContextMenuItem.Text = "&Default"; - // - // SavestateBinaryContextMenuItem - // - this.SavestateBinaryContextMenuItem.Name = "SavestateBinaryContextMenuItem"; - this.SavestateBinaryContextMenuItem.Size = new System.Drawing.Size(112, 22); - this.SavestateBinaryContextMenuItem.Text = "&Binary"; - // - // SavestateTextContextMenuItem - // - this.SavestateTextContextMenuItem.Name = "SavestateTextContextMenuItem"; - this.SavestateTextContextMenuItem.Size = new System.Drawing.Size(112, 22); - this.SavestateTextContextMenuItem.Text = "&Text"; - // - // toolStripSeparator37 - // - this.toolStripSeparator37.Name = "toolStripSeparator37"; - this.toolStripSeparator37.Size = new System.Drawing.Size(156, 6); - // - // toolStripMenuItem66 - // - this.toolStripMenuItem66.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; - this.toolStripMenuItem66.Name = "toolStripMenuItem66"; - this.toolStripMenuItem66.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem66.Text = "Save Config"; - this.toolStripMenuItem66.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); - // - // toolStripMenuItem67 - // - this.toolStripMenuItem67.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; - this.toolStripMenuItem67.Name = "toolStripMenuItem67"; - this.toolStripMenuItem67.Size = new System.Drawing.Size(159, 22); - this.toolStripMenuItem67.Text = "Load Config"; - this.toolStripMenuItem67.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); - // - // ScreenshotContextMenuItem - // - this.ScreenshotContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; - this.ScreenshotContextMenuItem.Name = "ScreenshotContextMenuItem"; - this.ScreenshotContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ScreenshotContextMenuItem.Text = "Screenshot"; - this.ScreenshotContextMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); - // - // CloseRomContextMenuItem - // - this.CloseRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; - this.CloseRomContextMenuItem.Name = "CloseRomContextMenuItem"; - this.CloseRomContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.CloseRomContextMenuItem.Text = "Close ROM"; - this.CloseRomContextMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); - // - // ClearSRAMContextMenuItem - // - this.ClearSRAMContextMenuItem.Name = "ClearSRAMContextMenuItem"; - this.ClearSRAMContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ClearSRAMContextMenuItem.Text = "Close and Clear SRAM"; - this.ClearSRAMContextMenuItem.Click += new System.EventHandler(this.ClearSramContextMenuItem_Click); - // - // ShowMenuContextMenuSeparator - // - this.ShowMenuContextMenuSeparator.Name = "ShowMenuContextMenuSeparator"; - this.ShowMenuContextMenuSeparator.Size = new System.Drawing.Size(213, 6); - // - // ShowMenuContextMenuItem - // - this.ShowMenuContextMenuItem.Name = "ShowMenuContextMenuItem"; - this.ShowMenuContextMenuItem.Size = new System.Drawing.Size(216, 22); - this.ShowMenuContextMenuItem.Text = "Show Menu"; - this.ShowMenuContextMenuItem.Click += new System.EventHandler(this.ShowMenuContextMenuItem_Click); - // - // timerMouseIdle - // - this.timerMouseIdle.Enabled = true; - this.timerMouseIdle.Interval = 2000; - this.timerMouseIdle.Tick += new System.EventHandler(this.TimerMouseIdle_Tick); - // - // AmstradCPCNonSyncSettingsToolStripMenuItem - // - this.AmstradCPCNonSyncSettingsToolStripMenuItem.Name = "AmstradCPCNonSyncSettingsToolStripMenuItem"; - this.AmstradCPCNonSyncSettingsToolStripMenuItem.Size = new System.Drawing.Size(201, 22); - this.AmstradCPCNonSyncSettingsToolStripMenuItem.Text = "Non-Sync Settings"; - this.AmstradCPCNonSyncSettingsToolStripMenuItem.Click += new System.EventHandler(this.AmstradCPCNonSyncSettingsToolStripMenuItem_Click); - // - // MainForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(470, 408); - this.Controls.Add(this.MainStatusBar); - this.Controls.Add(this.MainformMenu); - this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.MainMenuStrip = this.MainformMenu; - this.Name = "MainForm"; - this.Text = "BizHawk"; - this.Activated += new System.EventHandler(this.MainForm_Activated); - this.Deactivate += new System.EventHandler(this.MainForm_Deactivate); - this.Load += new System.EventHandler(this.MainForm_Load); - this.Shown += new System.EventHandler(this.MainForm_Shown); - this.Enter += new System.EventHandler(this.MainForm_Enter); - this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseClick); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseMove); - this.Resize += new System.EventHandler(this.MainForm_Resize); - this.MainformMenu.ResumeLayout(false); - this.MainformMenu.PerformLayout(); - this.MainStatusBar.ResumeLayout(false); - this.MainStatusBar.PerformLayout(); - this.MainFormContextMenu.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ToolStripMenuItem FileSubMenu; - private System.Windows.Forms.ToolStripMenuItem OpenRomMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem ExitMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveStateSubMenu; - private System.Windows.Forms.ToolStripMenuItem SaveState1MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState2MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState3MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState4MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState5MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState6MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState7MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState8MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState9MenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveState0MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadStateSubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem LoadState1MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState2MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState3MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState4MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState5MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState6MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState7MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState8MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState9MenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadState0MenuItem; - private System.Windows.Forms.ToolStripMenuItem EmulationSubMenu; - private System.Windows.Forms.ToolStripMenuItem ViewSubMenu; - private System.Windows.Forms.ToolStripMenuItem ConfigSubMenu; - private System.Windows.Forms.ToolStripMenuItem ToolsSubMenu; - private System.Windows.Forms.ToolStripMenuItem HelpSubMenu; - private System.Windows.Forms.ToolStripMenuItem PauseMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem RebootCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem SoftResetMenuItem; - private System.Windows.Forms.ToolStripMenuItem OnlineHelpMenuItem; - private System.Windows.Forms.ToolStripMenuItem AboutMenuItem; - private System.Windows.Forms.ToolStripMenuItem ControllersMenuItem; - private System.Windows.Forms.ToolStripMenuItem HotkeysMenuItem; - private System.Windows.Forms.ToolStripMenuItem RamWatchMenuItem; - private System.Windows.Forms.ToolStripMenuItem RamSearchMenuItem; - private System.Windows.Forms.ToolStripMenuItem HexEditorMenuItem; - private System.Windows.Forms.ToolStripMenuItem WindowSizeSubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem DisplayFPSMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayFrameCounterMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayInputMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayLagCounterMenuItem; - private System.Windows.Forms.ToolStripMenuItem LuaConsoleMenuItem; - private System.Windows.Forms.ToolStripMenuItem RecentRomSubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem SaveSlotSubMenu; - private System.Windows.Forms.ToolStripMenuItem SelectSlot1MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot2MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot3MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot4MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot5MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot6MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot7MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot8MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot9MenuItem; - private System.Windows.Forms.ToolStripMenuItem SelectSlot0MenuItem; - private System.Windows.Forms.ToolStripMenuItem PreviousSlotMenuItem; - private System.Windows.Forms.ToolStripMenuItem NextSlotMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem SaveToCurrentSlotMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadCurrentSlotMenuItem; - private System.Windows.Forms.ToolStripMenuItem CloseRomMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private System.Windows.Forms.ToolStripMenuItem SaveNamedStateMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private System.Windows.Forms.ToolStripMenuItem LoadNamedStateMenuItem; - private System.Windows.Forms.ToolStripMenuItem x1MenuItem; - private System.Windows.Forms.ToolStripMenuItem x2MenuItem; - private System.Windows.Forms.ToolStripMenuItem x3MenuItem; - private System.Windows.Forms.ToolStripMenuItem x4MenuItem; - private System.Windows.Forms.ToolStripMenuItem x5MenuItem; - private System.Windows.Forms.ToolStripMenuItem mzMenuItem; - private System.Windows.Forms.ToolStripMenuItem MovieSubMenu; - private System.Windows.Forms.ToolStripMenuItem RecentMovieSubMenu; - private System.Windows.Forms.ToolStripMenuItem RecordMovieMenuItem; - private System.Windows.Forms.ToolStripMenuItem PlayMovieMenuItem; - private System.Windows.Forms.ToolStripMenuItem StopMovieMenuItem; - private System.Windows.Forms.ToolStripMenuItem PlayFromBeginningMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private System.Windows.Forms.ToolStripMenuItem SoundMenuItem; - private System.Windows.Forms.ToolStripMenuItem SpeedSkipSubMenu; - private System.Windows.Forms.ToolStripMenuItem VsyncThrottleMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3; - private System.Windows.Forms.ToolStripMenuItem MinimizeSkippingMenuItem; - private System.Windows.Forms.ToolStripMenuItem NeverSkipMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5; - private System.Windows.Forms.ToolStripMenuItem Speed50MenuItem; - private System.Windows.Forms.ToolStripMenuItem Speed75MenuItem; - private System.Windows.Forms.ToolStripMenuItem Speed100MenuItem; - private System.Windows.Forms.ToolStripMenuItem Speed150MenuItem; - private System.Windows.Forms.ToolStripMenuItem Speed200MenuItem; - private System.Windows.Forms.ToolStripMenuItem ClockThrottleMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private System.Windows.Forms.ToolStripMenuItem SaveConfigMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadConfigMenuItem; - private System.Windows.Forms.ToolStripMenuItem NESSubMenu; - private System.Windows.Forms.ToolStripMenuItem NESPPUViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem NESGameGenieCodesMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private System.Windows.Forms.ToolStripMenuItem CheatsMenuItem; - private System.Windows.Forms.ToolStripMenuItem NESNametableViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem ToolBoxMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; - private System.Windows.Forms.ToolStripMenuItem SwitchToFullscreenMenuItem; - private StatusStripEx MainStatusBar; - private System.Windows.Forms.ToolStripStatusLabel EmuStatus; - private System.Windows.Forms.ToolStripMenuItem MessagesMenuItem; - private System.Windows.Forms.ToolStripMenuItem TI83SubMenu; - private System.Windows.Forms.ToolStripMenuItem AutoloadKeypadMenuItem; - private System.Windows.Forms.ToolStripMenuItem KeypadMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private System.Windows.Forms.ToolStripMenuItem PathsMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private System.Windows.Forms.ToolStripMenuItem ReadonlyMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; - private System.Windows.Forms.ToolStripMenuItem DisplayRerecordCountMenuItem; - private System.Windows.Forms.ToolStripMenuItem ScreenshotSubMenu; - private System.Windows.Forms.ToolStripMenuItem ScreenshotMenuItem; - private System.Windows.Forms.ToolStripMenuItem ScreenshotAsMenuItem; - private System.Windows.Forms.ToolStripMenuItem TAStudioMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4; - private System.Windows.Forms.ToolStripMenuItem DisplayStatusBarMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; - private System.Windows.Forms.ToolStripMenuItem NESGraphicSettingsMenuItem; - private System.Windows.Forms.ContextMenuStrip MainFormContextMenu; - private System.Windows.Forms.ToolStripMenuItem OpenRomContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadLastRomContextMenuItem; - private System.Windows.Forms.ToolStripSeparator ContextSeparator_AfterROM; - private System.Windows.Forms.ToolStripMenuItem RecordMovieContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem PlayMovieContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadLastMovieContextMenuItem; - private System.Windows.Forms.ToolStripSeparator ContextSeparator_AfterMovie; - private System.Windows.Forms.ToolStripMenuItem AddSubtitleContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem UndoSavestateContextMenuItem; - private System.Windows.Forms.ToolStripSeparator ContextSeparator_AfterUndo; - private System.Windows.Forms.ToolStripMenuItem CloseRomContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem BackupMovieContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem AutomaticallyBackupMoviesMenuItem; - private System.Windows.Forms.ToolStripMenuItem StopMovieContextMenuItem; - private System.Windows.Forms.ToolStripDropDownButton PauseStatusButton; - private System.Windows.Forms.ToolStripDropDownButton PlayRecordStatusButton; - private System.Windows.Forms.ToolStripDropDownButton DumpStatusButton; - private System.Windows.Forms.ToolStripMenuItem ViewSubtitlesContextMenuItem; - private MenuStripEx MainformMenu; - private System.Windows.Forms.ToolStripMenuItem GBSubMenu; - private System.Windows.Forms.ToolStripStatusLabel SaveSlotsStatusLabel; - private System.Windows.Forms.ToolStripStatusLabel Slot1StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot2StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot3StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot4StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot5StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot6StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot7StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot8StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot9StatusButton; - private System.Windows.Forms.ToolStripStatusLabel Slot0StatusButton; - private System.Windows.Forms.ToolStripMenuItem ViewCommentsContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayLogWindowMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplaySubtitlesMenuItem; - private System.Windows.Forms.ToolStripMenuItem AVSubMenu; - private System.Windows.Forms.ToolStripMenuItem ConfigAndRecordAVMenuItem; - private System.Windows.Forms.ToolStripMenuItem StopAVIMenuItem; - private System.Windows.Forms.ToolStripStatusLabel AVIStatusLabel; - private System.Windows.Forms.ToolStripMenuItem RestartMovieContextMenuItem; - private System.Windows.Forms.ToolStripStatusLabel CheatStatusButton; - private System.Windows.Forms.ToolStripMenuItem AutofireMenuItem; - private System.Windows.Forms.ToolStripMenuItem AutoloadLastSlotMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; - private System.Windows.Forms.ToolStripMenuItem ShowMenuContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem ImportMoviesMenuItem; - private System.Windows.Forms.ToolStripMenuItem ForumsMenuItem; - private System.Windows.Forms.ToolStripMenuItem ScreenshotClipboardMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCESubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; - private System.Windows.Forms.ToolStripMenuItem PCEGraphicsSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCEAlwaysPerformSpriteLimitMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCEAlwaysEqualizeVolumesMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCEArcadeCardRewindEnableMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSSubMenu; - private System.Windows.Forms.ToolStripMenuItem SMSGraphicsSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSEnableFMChipMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSOverclockMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSForceStereoMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSSpriteLimitMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSDisplayOverscanMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCEBGViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem ScreenshotContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem AtariSubMenu; - private System.Windows.Forms.ToolStripMenuItem A7800SubMenu; - private System.Windows.Forms.ToolStripMenuItem NESSoundChannelsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SNESSubMenu; - private System.Windows.Forms.ToolStripMenuItem SnesGfxDebuggerMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; - private System.Windows.Forms.ToolStripMenuItem HardResetMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; - private System.Windows.Forms.ToolStripMenuItem CaptureOSDMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; - private System.Windows.Forms.ToolStripMenuItem ScreenshotCaptureOSDMenuItem1; - private System.Windows.Forms.ToolStripMenuItem LoadGBInSGBMenuItem; - private System.Windows.Forms.ToolStripMenuItem SnesGBInSGBMenuItem; - private System.Windows.Forms.ToolStripStatusLabel RebootStatusBarIcon; - private System.Windows.Forms.ToolStripMenuItem TraceLoggerMenuItem; - private System.Windows.Forms.ToolStripMenuItem ShowClippedRegionsMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator24; - private System.Windows.Forms.ToolStripMenuItem HighlightActiveDisplayRegionMenuItem; - private System.Windows.Forms.ToolStripMenuItem FDSControlsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveMovieMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveMovieContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem VirtualPadMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBGPUViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBPrinterViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem AudioThrottleMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator27; - private System.Windows.Forms.ToolStripMenuItem VsyncEnabledMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator28; - private System.Windows.Forms.ToolStripMenuItem ColecoSubMenu; - private System.Windows.Forms.ToolStripMenuItem ColecoSkipBiosMenuItem; - private System.Windows.Forms.ToolStripMenuItem ColecoUseSGMMenuItem; - private System.Windows.Forms.ToolStripMenuItem ColecoControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripStatusLabel LedLightStatusLabel; - private System.Windows.Forms.ToolStripMenuItem GBASubMenu; - private System.Windows.Forms.ToolStripMenuItem GbaGpuViewerMenuItem; - private System.Windows.Forms.ToolStripMenuItem KeyPrioritySubMenu; - private System.Windows.Forms.ToolStripMenuItem BothHkAndControllerMenuItem; - private System.Windows.Forms.ToolStripMenuItem InputOverHkMenuItem; - private System.Windows.Forms.ToolStripMenuItem HkOverInputMenuItem; - private System.Windows.Forms.ToolStripStatusLabel KeyPriorityStatusLabel; - private System.Windows.Forms.ToolStripMenuItem SnesOptionsMenuItem; - private System.Windows.Forms.ToolStripMenuItem FullMovieLoadstatesMenuItem; - private System.Windows.Forms.ToolStripMenuItem StopNoSaveContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem StopMovieWithoutSavingMenuItem; - private System.Windows.Forms.ToolStripMenuItem SnesGameGenieMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBGameGenieMenuItem; - private System.Windows.Forms.ToolStripMenuItem GGGameGenieMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator29; - private System.Windows.Forms.ToolStripMenuItem N64SubMenu; - private System.Windows.Forms.ToolStripMenuItem N64PluginSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaturnSubMenu; - private System.Windows.Forms.ToolStripMenuItem SaturnPreferencesMenuItem; - private System.Windows.Forms.ToolStripMenuItem ConfigContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem RewindOptionsMenuItem; - private System.Windows.Forms.ToolStripMenuItem FirmwaresMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadTIFileMenuItem; - private System.Windows.Forms.ToolStripMenuItem ClearSRAMContextMenuItem; - private System.Windows.Forms.ToolStripSeparator ShowMenuContextMenuSeparator; - private System.Windows.Forms.ToolStripMenuItem StopAVContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem FdsEjectDiskMenuItem; - private System.Windows.Forms.ToolStripMenuItem DGBSubMenu; - private System.Windows.Forms.ToolStripMenuItem DGBsettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem DGBHawkSubMenu; - private System.Windows.Forms.ToolStripMenuItem DGBHawksettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem GenesisSubMenu; - private System.Windows.Forms.ToolStripMenuItem GenesisSettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AtariSettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem A7800ControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem A7800FilterSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem MovieSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem CoresSubMenu; - private System.Windows.Forms.ToolStripMenuItem GBInSGBMenuItem; - private System.Windows.Forms.ToolStripMenuItem batchRunnerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayConfigMenuItem; - private System.Windows.Forms.ToolStripMenuItem PCEtileViewerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSVDPViewerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem vDPViewerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSFix3DGameDisplayToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator SMStoolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem SMSenableBIOSToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSregionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSregionExportToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSregionJapanToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSregionKoreaToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSregionAutoToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSdisplayToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSdisplayNtscToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSdisplayPalToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSdisplayAutoToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator26; - private System.Windows.Forms.ToolStripMenuItem extensionsToolStripMenuItem; - private System.Windows.Forms.ToolStripStatusLabel CoreNameStatusBarButton; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem9; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem12; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem13; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem14; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator30; - private System.Windows.Forms.ToolStripMenuItem SavestateTypeContextSubMenu; - private System.Windows.Forms.ToolStripMenuItem SavestateTypeDefaultContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem SavestateBinaryContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem SavestateTextContextMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator37; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem66; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem67; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private System.Windows.Forms.ToolStripMenuItem N64VideoPluginSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem ClientOptionsMenuItem; - private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem N64ControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBcoreSettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem NesControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator22; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator23; - private System.Windows.Forms.ToolStripMenuItem N64CircularAnalogRangeMenuItem; - private System.Windows.Forms.ToolStripMenuItem paletteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem wonderSwanToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ProfilesMenuItem; - private System.Windows.Forms.ToolStripMenuItem PceSoundDebuggerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SynclessRecordingMenuItem; - private System.Windows.Forms.ToolStripMenuItem PceControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator32; - private System.Windows.Forms.ToolStripStatusLabel ProfileFirstBootLabel; - private System.Windows.Forms.ToolStripMenuItem MovieEndSubMenu; - private System.Windows.Forms.ToolStripMenuItem MovieEndFinishMenuItem; - private System.Windows.Forms.ToolStripMenuItem MovieEndRecordMenuItem; - private System.Windows.Forms.ToolStripMenuItem MovieEndStopMenuItem; - private System.Windows.Forms.ToolStripMenuItem MovieEndPauseMenuItem; - private System.Windows.Forms.ToolStripMenuItem ScreenshotClientClipboardMenuItem; - private System.Windows.Forms.ToolStripMenuItem MupenStyleLagMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator33; - private System.Windows.Forms.ToolStripMenuItem GBAcoresettingsToolStripMenuItem1; - private System.Windows.Forms.ToolStripStatusLabel LinkConnectStatusBarButton; - private System.Windows.Forms.ToolStripMenuItem N64ExpansionSlotMenuItem; - private System.Windows.Forms.ToolStripMenuItem barcodeReaderToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem FeaturesMenuItem; - private System.Windows.Forms.ToolStripMenuItem DebuggerMenuItem; - private System.Windows.Forms.ToolStripMenuItem PSXSubMenu; - private System.Windows.Forms.ToolStripMenuItem PSXOptionsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveRAMSubMenu; - private System.Windows.Forms.ToolStripMenuItem FlushSaveRAMMenuItem; - private System.Windows.Forms.ToolStripMenuItem PSXDiscControlsMenuItem; - private System.Windows.Forms.ToolStripMenuItem GenesisGameGenieECDC; - private System.Windows.Forms.ToolStripStatusLabel UpdateNotification; - private System.Windows.Forms.ToolStripMenuItem PSXControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem MacroToolMenuItem; - private System.Windows.Forms.ToolStripMenuItem AppleSubMenu; - private System.Windows.Forms.ToolStripMenuItem AppleDisksSubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator31; - private System.Windows.Forms.ToolStripMenuItem MultiDiskBundlerFileMenuItem; - private System.Windows.Forms.ToolStripMenuItem musicRipperToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem coreToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem quickNESToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem nesHawkToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator34; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator35; - private System.Windows.Forms.ToolStripMenuItem GBACoreSelectionSubMenu; - private System.Windows.Forms.ToolStripMenuItem GBAmGBAMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBAVBANextMenuItem; - private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem PSXHashDiscsToolStripMenuItem; - private System.Windows.Forms.Timer timerMouseIdle; - private System.Windows.Forms.ToolStripMenuItem miUnthrottled; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem17; - private System.Windows.Forms.ToolStripMenuItem Frameskip1MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip2MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip3MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip4MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip5MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip6MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip7MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip9MenuItem; - private System.Windows.Forms.ToolStripMenuItem Frameskip8MenuItem; - private System.Windows.Forms.ToolStripMenuItem Speed400MenuItem; - private System.Windows.Forms.ToolStripMenuItem BasicBotMenuItem; - private System.Windows.Forms.ToolStripMenuItem DisplayMessagesMenuItem; - private System.Windows.Forms.ToolStripMenuItem C64SubMenu; - private System.Windows.Forms.ToolStripMenuItem C64SettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem externalToolToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem CodeDataLoggerMenuItem; - private System.Windows.Forms.ToolStripMenuItem setLibretroCoreToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem OpenAdvancedMenuItem; - private System.Windows.Forms.ToolStripMenuItem gameSharkConverterToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem dummyExternalTool; - private System.Windows.Forms.ToolStripMenuItem RecordAVMenuItem; - private System.Windows.Forms.ToolStripMenuItem ExperimentalToolsSubMenu; - private System.Windows.Forms.ToolStripMenuItem AutoHawkMenuItem; - private System.Windows.Forms.ToolStripMenuItem NewHexEditorMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveConfigAsMenuItem; - private System.Windows.Forms.ToolStripMenuItem LoadConfigFromMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveMovieAsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SaveMovieAsContextMenuItem; - private System.Windows.Forms.ToolStripMenuItem VSControlsMenuItem; - private System.Windows.Forms.ToolStripMenuItem VSInsertCoinP1MenuItem; - private System.Windows.Forms.ToolStripMenuItem VSInsertCoinP2MenuItem; - private System.Windows.Forms.ToolStripMenuItem VSServiceSwitchMenuItem; - private System.Windows.Forms.ToolStripMenuItem VSSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem CoreSNESSubMenu; - private System.Windows.Forms.ToolStripMenuItem CorebsnesMenuItem; - private System.Windows.Forms.ToolStripMenuItem Coresnes9xMenuItem; - private System.Windows.Forms.ToolStripMenuItem allowGameDBCoreOverridesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16; - private System.Windows.Forms.ToolStripMenuItem IntvSubMenu; - private System.Windows.Forms.ToolStripMenuItem IntVControllerSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem SNESControllerConfigurationMenuItem; - private System.Windows.Forms.ToolStripMenuItem C64DisksSubMenu; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator36; - private System.Windows.Forms.ToolStripMenuItem sNESToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem virtualBoyToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem neoGeoPocketToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem NesCoreSubMenu; - private System.Windows.Forms.ToolStripMenuItem QuicknesCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem NesCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem GbaCoreSubMenu; - private System.Windows.Forms.ToolStripMenuItem VbaNextCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem MgbaCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem Atari7800HawkCoreMenuItem; - private System.Windows.Forms.ToolStripMenuItem SGBCoreSubmenu; - private System.Windows.Forms.ToolStripMenuItem SgbBsnesMenuItem; - private System.Windows.Forms.ToolStripMenuItem SgbSameBoyMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBCoreSubmenu; - private System.Windows.Forms.ToolStripMenuItem GBGambatteMenuItem; - private System.Windows.Forms.ToolStripMenuItem GBGBHawkMenuItem; - private System.Windows.Forms.ToolStripMenuItem pCFXToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem3; - private System.Windows.Forms.ToolStripMenuItem SMSControllerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSControllerStandardToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSControllerPaddleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSControllerLightPhaserToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSControllerSportsPadToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem SMSControllerKeyboardToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem zXSpectrumToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumControllerConfigurationMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumCoreEmulationSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumNonSyncSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumAudioSettingsMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumPokeMemoryMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumMediaMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumTapesSubMenu; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumDisksSubMenu; - private System.Windows.Forms.ToolStripMenuItem zxt1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem zxt2ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ZXSpectrumExportSnapshotMenuItemMenuItem; - private System.Windows.Forms.ToolStripMenuItem amstradCPCToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem amstradCPCCoreEmulationSettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCAudioSettingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCPokeMemoryToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCMediaToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCTapesSubMenu; - private System.Windows.Forms.ToolStripMenuItem cpct1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCDisksSubMenu; - private System.Windows.Forms.ToolStripMenuItem cpcd1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AmstradCPCNonSyncSettingsToolStripMenuItem; - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs deleted file mode 100644 index e9bce5e5aa..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ /dev/null @@ -1,3350 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Atari.A7800Hawk; -using BizHawk.Emulation.Cores.Calculators; -using BizHawk.Emulation.Cores.ColecoVision; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Nintendo.N64; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; - -using BizHawk.Client.Common; - -using BizHawk.Client.EmuHawk.CustomControls; -using BizHawk.Client.EmuHawk.WinFormExtensions; -using BizHawk.Client.EmuHawk.ToolExtensions; -using BizHawk.Emulation.Cores.Computers.AppleII; -using BizHawk.Client.ApiHawk; -using BizHawk.Emulation.Cores.Computers.Commodore64; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; - -namespace BizHawk.Client.EmuHawk -{ - public partial class MainForm - { - #region File Menu - - private void FileSubMenu_DropDownOpened(object sender, EventArgs e) - { - SaveStateSubMenu.Enabled = - LoadStateSubMenu.Enabled = - SaveSlotSubMenu.Enabled = - Emulator.HasSavestates(); - - OpenRomMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Open ROM"].Bindings; - CloseRomMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Close ROM"].Bindings; - - MovieSubMenu.Enabled = - CloseRomMenuItem.Enabled = - !Emulator.IsNull(); - - var hasSaveRam = Emulator.HasSaveRam(); - bool needBold = hasSaveRam && Emulator.AsSaveRam().SaveRamModified; - - SaveRAMSubMenu.Enabled = hasSaveRam; - if (SaveRAMSubMenu.Font.Bold != needBold) - { - var font = new Font(SaveRAMSubMenu.Font, needBold ? FontStyle.Bold : FontStyle.Regular); - SaveRAMSubMenu.Font = font; - } - - AVSubMenu.Enabled = - ScreenshotSubMenu.Enabled = - Emulator.HasVideoProvider(); - } - - private void RecentRomMenuItem_DropDownOpened(object sender, EventArgs e) - { - RecentRomSubMenu.DropDownItems.Clear(); - RecentRomSubMenu.DropDownItems.AddRange( - Global.Config.RecentRoms.RecentMenu(LoadRomFromRecent, true, true)); - } - - private void SaveStateSubMenu_DropDownOpened(object sender, EventArgs e) - { - SaveState0MenuItem.Font = new Font( - SaveState0MenuItem.Font.FontFamily, - SaveState0MenuItem.Font.Size, - _stateSlots.HasSlot(0) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState1MenuItem.Font = new Font( - SaveState1MenuItem.Font.FontFamily, - SaveState1MenuItem.Font.Size, - _stateSlots.HasSlot(1) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState2MenuItem.Font = new Font( - SaveState2MenuItem.Font.FontFamily, - SaveState2MenuItem.Font.Size, - _stateSlots.HasSlot(2) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState3MenuItem.Font = new Font( - SaveState3MenuItem.Font.FontFamily, - SaveState3MenuItem.Font.Size, - _stateSlots.HasSlot(3) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState4MenuItem.Font = new Font( - SaveState4MenuItem.Font.FontFamily, - SaveState4MenuItem.Font.Size, - _stateSlots.HasSlot(4) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState5MenuItem.Font = new Font( - SaveState5MenuItem.Font.FontFamily, - SaveState5MenuItem.Font.Size, - _stateSlots.HasSlot(5) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState6MenuItem.Font = new Font( - SaveState6MenuItem.Font.FontFamily, - SaveState6MenuItem.Font.Size, - _stateSlots.HasSlot(6) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState7MenuItem.Font = new Font( - SaveState7MenuItem.Font.FontFamily, - SaveState7MenuItem.Font.Size, - _stateSlots.HasSlot(7) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState8MenuItem.Font = new Font( - SaveState8MenuItem.Font.FontFamily, - SaveState8MenuItem.Font.Size, - _stateSlots.HasSlot(8) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState9MenuItem.Font = new Font( - SaveState9MenuItem.Font.FontFamily, - SaveState9MenuItem.Font.Size, - _stateSlots.HasSlot(9) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular); - - SaveState1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 1"].Bindings; - SaveState2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 2"].Bindings; - SaveState3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 3"].Bindings; - SaveState4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 4"].Bindings; - SaveState5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 5"].Bindings; - SaveState6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 6"].Bindings; - SaveState7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 7"].Bindings; - SaveState8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 8"].Bindings; - SaveState9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 9"].Bindings; - SaveState0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 0"].Bindings; - SaveNamedStateMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save Named State"].Bindings; - } - - private void LoadStateSubMenu_DropDownOpened(object sender, EventArgs e) - { - LoadState1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 1"].Bindings; - LoadState2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 2"].Bindings; - LoadState3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 3"].Bindings; - LoadState4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 4"].Bindings; - LoadState5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 5"].Bindings; - LoadState6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 6"].Bindings; - LoadState7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 7"].Bindings; - LoadState8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 8"].Bindings; - LoadState9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 9"].Bindings; - LoadState0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 0"].Bindings; - LoadNamedStateMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load Named State"].Bindings; - - AutoloadLastSlotMenuItem.Checked = Global.Config.AutoLoadLastSaveSlot; - - LoadState1MenuItem.Enabled = _stateSlots.HasSlot(1); - LoadState2MenuItem.Enabled = _stateSlots.HasSlot(2); - LoadState3MenuItem.Enabled = _stateSlots.HasSlot(3); - LoadState4MenuItem.Enabled = _stateSlots.HasSlot(4); - LoadState5MenuItem.Enabled = _stateSlots.HasSlot(5); - LoadState6MenuItem.Enabled = _stateSlots.HasSlot(6); - LoadState7MenuItem.Enabled = _stateSlots.HasSlot(7); - LoadState8MenuItem.Enabled = _stateSlots.HasSlot(8); - LoadState9MenuItem.Enabled = _stateSlots.HasSlot(9); - LoadState0MenuItem.Enabled = _stateSlots.HasSlot(0); - } - - private void SaveSlotSubMenu_DropDownOpened(object sender, EventArgs e) - { - SelectSlot0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 0"].Bindings; - SelectSlot1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 1"].Bindings; - SelectSlot2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 2"].Bindings; - SelectSlot3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 3"].Bindings; - SelectSlot4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 4"].Bindings; - SelectSlot5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 5"].Bindings; - SelectSlot6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 6"].Bindings; - SelectSlot7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 7"].Bindings; - SelectSlot8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 8"].Bindings; - SelectSlot9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 9"].Bindings; - PreviousSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Previous Slot"].Bindings; - NextSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Next Slot"].Bindings; - SaveToCurrentSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Quick Save"].Bindings; - LoadCurrentSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Quick Load"].Bindings; - - SelectSlot0MenuItem.Checked = false; - SelectSlot1MenuItem.Checked = false; - SelectSlot2MenuItem.Checked = false; - SelectSlot3MenuItem.Checked = false; - SelectSlot4MenuItem.Checked = false; - SelectSlot5MenuItem.Checked = false; - SelectSlot6MenuItem.Checked = false; - SelectSlot7MenuItem.Checked = false; - SelectSlot8MenuItem.Checked = false; - SelectSlot9MenuItem.Checked = false; - SelectSlot1MenuItem.Checked = false; - - switch (Global.Config.SaveSlot) - { - case 0: - SelectSlot0MenuItem.Checked = true; - break; - case 1: - SelectSlot1MenuItem.Checked = true; - break; - case 2: - SelectSlot2MenuItem.Checked = true; - break; - case 3: - SelectSlot3MenuItem.Checked = true; - break; - case 4: - SelectSlot4MenuItem.Checked = true; - break; - case 5: - SelectSlot5MenuItem.Checked = true; - break; - case 6: - SelectSlot6MenuItem.Checked = true; - break; - case 7: - SelectSlot7MenuItem.Checked = true; - break; - case 8: - SelectSlot8MenuItem.Checked = true; - break; - case 9: - SelectSlot9MenuItem.Checked = true; - break; - } - } - - private void SaveRAMSubMenu_DropDownOpened(object sender, EventArgs e) - { - FlushSaveRAMMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Flush SaveRAM"].Bindings; - } - - private void MovieSubMenu_DropDownOpened(object sender, EventArgs e) - { - FullMovieLoadstatesMenuItem.Enabled = !Global.MovieSession.MultiTrack.IsActive; - StopMovieWithoutSavingMenuItem.Enabled = Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.Changes; - StopMovieMenuItem.Enabled - = PlayFromBeginningMenuItem.Enabled - = SaveMovieMenuItem.Enabled - = SaveMovieAsMenuItem.Enabled - = Global.MovieSession.Movie.IsActive; - - ReadonlyMenuItem.Checked = Global.MovieSession.ReadOnly; - AutomaticallyBackupMoviesMenuItem.Checked = Global.Config.EnableBackupMovies; - FullMovieLoadstatesMenuItem.Checked = Global.Config.VBAStyleMovieLoadState; - - ReadonlyMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle read-only"].Bindings; - RecordMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record Movie"].Bindings; - PlayMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Play Movie"].Bindings; - StopMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop Movie"].Bindings; - PlayFromBeginningMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Play from beginning"].Bindings; - SaveMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save Movie"].Bindings; - } - - private void RecentMovieSubMenu_DropDownOpened(object sender, EventArgs e) - { - RecentMovieSubMenu.DropDownItems.Clear(); - RecentMovieSubMenu.DropDownItems.AddRange( - Global.Config.RecentMovies.RecentMenu(LoadMoviesFromRecent, true)); - } - - private void MovieEndSubMenu_DropDownOpened(object sender, EventArgs e) - { - MovieEndFinishMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Finish; - MovieEndRecordMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Record; - MovieEndStopMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Stop; - MovieEndPauseMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Pause; - - // Arguably an IControlMainForm property should be set here, but in reality only Tastudio is ever going to interfere with this logic - MovieEndFinishMenuItem.Enabled = - MovieEndRecordMenuItem.Enabled = - MovieEndStopMenuItem.Enabled = - MovieEndPauseMenuItem.Enabled = - !GlobalWin.Tools.Has(); - } - - private void AVSubMenu_DropDownOpened(object sender, EventArgs e) - { - ConfigAndRecordAVMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record A/V"].Bindings; - StopAVIMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop A/V"].Bindings; - CaptureOSDMenuItem.Checked = Global.Config.AVI_CaptureOSD; - - RecordAVMenuItem.Enabled = !string.IsNullOrEmpty(Global.Config.VideoWriter) && _currAviWriter == null; - - if (_currAviWriter == null) - { - ConfigAndRecordAVMenuItem.Enabled = true; - StopAVIMenuItem.Enabled = false; - } - else - { - ConfigAndRecordAVMenuItem.Enabled = false; - StopAVIMenuItem.Enabled = true; - } - } - - private void ScreenshotSubMenu_DropDownOpening(object sender, EventArgs e) - { - ScreenshotCaptureOSDMenuItem1.Checked = Global.Config.Screenshot_CaptureOSD; - ScreenshotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Screenshot"].Bindings; - ScreenshotClipboardMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["ScreenshotToClipboard"].Bindings; - ScreenshotClientClipboardMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Screen Client to Clipboard"].Bindings; - } - - private void OpenRomMenuItem_Click(object sender, EventArgs e) - { - OpenRom(); - } - - private void OpenAdvancedMenuItem_Click(object sender, EventArgs e) - { - var oac = new OpenAdvancedChooser(this); - if (oac.ShowHawkDialog() == DialogResult.Cancel) - { - return; - } - - if (oac.Result == OpenAdvancedChooser.Command.RetroLaunchNoGame) - { - var argsNoGame = new LoadRomArgs - { - OpenAdvanced = new OpenAdvanced_LibretroNoGame(Global.Config.LibretroCore) - }; - LoadRom("", argsNoGame); - return; - } - - var args = new LoadRomArgs(); - - var filter = RomFilter; - - if (oac.Result == OpenAdvancedChooser.Command.RetroLaunchGame) - { - args.OpenAdvanced = new OpenAdvanced_Libretro(); - filter = oac.SuggestedExtensionFilter; - } - else if (oac.Result == OpenAdvancedChooser.Command.ClassicLaunchGame) - { - args.OpenAdvanced = new OpenAdvanced_OpenRom(); - } - else - { - throw new InvalidOperationException("Automatic Alpha Sanitizer"); - } - - /*************************/ - /* CLONE OF CODE FROM OpenRom (mostly) */ - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetRomsPath(Emulator.SystemId), - Filter = filter, - RestoreDirectory = false, - FilterIndex = _lastOpenRomFilter, - Title = "Open Advanced" - }; - - var result = ofd.ShowHawkDialog(); - if (result != DialogResult.OK) - { - return; - } - - var file = new FileInfo(ofd.FileName); - Global.Config.LastRomPath = file.DirectoryName; - _lastOpenRomFilter = ofd.FilterIndex; - /*************************/ - - LoadRom(file.FullName, args); - } - - private void CloseRomMenuItem_Click(object sender, EventArgs e) - { - CloseRom(); - } - - private void Savestate1MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave1"); } - private void Savestate2MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave2"); } - private void Savestate3MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave3"); } - private void Savestate4MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave4"); } - private void Savestate5MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave5"); } - private void Savestate6MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave6"); } - private void Savestate7MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave7"); } - private void Savestate8MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave8"); } - private void Savestate9MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave9"); } - private void Savestate0MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave0"); } - - private void SaveNamedStateMenuItem_Click(object sender, EventArgs e) - { - SaveStateAs(); - } - - private void Loadstate1MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave1"); } - private void Loadstate2MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave2"); } - private void Loadstate3MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave3"); } - private void Loadstate4MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave4"); } - private void Loadstate5MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave5"); } - private void Loadstate6MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave6"); } - private void Loadstate7MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave7"); } - private void Loadstate8MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave8"); } - private void Loadstate9MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave9"); } - private void Loadstate0MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave0"); } - - private void LoadNamedStateMenuItem_Click(object sender, EventArgs e) - { - LoadStateAs(); - } - - private void AutoloadLastSlotMenuItem_Click(object sender, EventArgs e) - { - Global.Config.AutoLoadLastSaveSlot ^= true; - } - - private void SelectSlotMenuItems_Click(object sender, EventArgs e) - { - if (sender == SelectSlot0MenuItem) Global.Config.SaveSlot = 0; - else if (sender == SelectSlot1MenuItem) Global.Config.SaveSlot = 1; - else if (sender == SelectSlot2MenuItem) Global.Config.SaveSlot = 2; - else if (sender == SelectSlot3MenuItem) Global.Config.SaveSlot = 3; - else if (sender == SelectSlot4MenuItem) Global.Config.SaveSlot = 4; - else if (sender == SelectSlot5MenuItem) Global.Config.SaveSlot = 5; - else if (sender == SelectSlot6MenuItem) Global.Config.SaveSlot = 6; - else if (sender == SelectSlot7MenuItem) Global.Config.SaveSlot = 7; - else if (sender == SelectSlot8MenuItem) Global.Config.SaveSlot = 8; - else if (sender == SelectSlot9MenuItem) Global.Config.SaveSlot = 9; - - UpdateStatusSlots(); - SaveSlotSelectedMessage(); - } - - private void PreviousSlotMenuItem_Click(object sender, EventArgs e) - { - PreviousSlot(); - } - - private void NextSlotMenuItem_Click(object sender, EventArgs e) - { - NextSlot(); - } - - private void SaveToCurrentSlotMenuItem_Click(object sender, EventArgs e) - { - SaveQuickSave("QuickSave" + Global.Config.SaveSlot); - } - - private void LoadCurrentSlotMenuItem_Click(object sender, EventArgs e) - { - LoadQuickSave("QuickSave" + Global.Config.SaveSlot); - } - - private void FlushSaveRAMMenuItem_Click(object sender, EventArgs e) - { - FlushSaveRAM(); - } - - private void ReadonlyMenuItem_Click(object sender, EventArgs e) - { - ToggleReadOnly(); - } - - private void RecordMovieMenuItem_Click(object sender, EventArgs e) - { - if (!Emulator.Attributes().Released) - { - var result = MessageBox.Show( - this, - "Thanks for using Bizhawk! The emulation core you have selected " + - "is currently BETA-status. We appreciate your help in testing Bizhawk. " + - "You can record a movie on this core if you'd like to, but expect to " + - "encounter bugs and sync problems. Continue?", "BizHawk", MessageBoxButtons.YesNo); - - if (result != DialogResult.Yes) - { - return; - } - } - else if (Emulator is Snes9x) - { - var box = new MsgBox( - "While the Snes9x core is faster, it is not nearly as accurate as bsnes. \nIt is recommended that you switch to the bsnes core for movie recording\nSwitch to bsnes?", - "Accuracy Warning", - MessageBoxIcon.Warning); - - box.SetButtons( - new[] { "Switch", "Continue" }, - new[] { DialogResult.Yes, DialogResult.Cancel }); - - box.MaximumSize = new Size(475, 350); - box.SetMessageToAutoSize(); - var result = box.ShowDialog(); - - if (result == DialogResult.Yes) - { - Global.Config.SNES_InSnes9x = false; - RebootCore(); - } - else if (result == DialogResult.Cancel) - { - // Do nothing and allow the user to continue to record the movie - } - } - else if (Emulator is QuickNES) // This is unsustainable :( But mixing the logic together is even worse, this needs to be rethought - { - var box = new MsgBox( - "While the QuickNes core is faster, it is not nearly as accurate as NesHawk. \nIt is recommended that you switch to the NesHawk core for movie recording\nSwitch to NesHawk?", - "Accuracy Warning", - MessageBoxIcon.Warning); - - box.SetButtons( - new[] { "Switch", "Continue" }, - new[] { DialogResult.Yes, DialogResult.Cancel }); - - box.MaximumSize = new Size(475, 350); - box.SetMessageToAutoSize(); - var result = box.ShowDialog(); - - if (result == DialogResult.Yes) - { - Global.Config.NES_InQuickNES = false; - RebootCore(); - } - else if (result == DialogResult.Cancel) - { - // Do nothing and allow the user to continue to record the movie - } - } - - new RecordMovie(Emulator).ShowDialog(); - } - - private void PlayMovieMenuItem_Click(object sender, EventArgs e) - { - new PlayMovie().ShowDialog(); - } - - private void StopMovieMenuItem_Click(object sender, EventArgs e) - { - StopMovie(); - } - - private void PlayFromBeginningMenuItem_Click(object sender, EventArgs e) - { - RestartMovie(); - } - - private void ImportMovieMenuItem_Click(object sender, EventArgs e) - { - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetRomsPath(Emulator.SystemId), - Multiselect = true, - Filter = FormatFilter( - "Movie Files", "*.fm2;*.mc2;*.mcm;*.mmv;*.gmv;*.vbm;*.lsmv;*.fcm;*.fmv;*.vmv;*.nmv;*.smv;*.ymv;*.zmv;*.bkm;*.pjm;*.pxm", - "FCEUX", "*.fm2", - "PCEjin/Mednafen", "*.mc2;*.mcm", - "Dega", "*.mmv", - "Gens", "*.gmv", - "Visual Boy Advance", "*.vbm", - "LSNES", "*.lsmv", - "FCEU", "*.fcm", - "Famtasia", "*.fmv", - "VirtuaNES", "*.vmv", - "Nintendulator", "*.nmv", - "Snes9x", "*.smv", - "Yabause", "*.ymv", - "ZSNES", "*.zmv", - "PSXjin", "*.pjm", - "PCSX", "*.pxm", - "BizHawk Bkm", "*.bkm", - "All Files", "*.*"), - RestoreDirectory = false - }; - - var result = ofd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - foreach (var fn in ofd.FileNames) - { - ProcessMovieImport(fn); - } - } - } - - private void SaveMovieMenuItem_Click(object sender, EventArgs e) - { - SaveMovie(); - } - - private void SaveMovieAsMenuItem_Click(object sender, EventArgs e) - { - var filename = Global.MovieSession.Movie.Filename; - if (string.IsNullOrWhiteSpace(filename)) - { - filename = PathManager.FilesystemSafeName(Global.Game); - } - - var file = ToolFormBase.SaveFileDialog( - filename, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null), - "Movie Files", - Global.MovieSession.Movie.PreferredExtension); - - if (file != null) - { - Global.MovieSession.Movie.Filename = file.FullName; - Global.Config.RecentMovies.Add(Global.MovieSession.Movie.Filename); - SaveMovie(); - } - } - - private void StopMovieWithoutSavingMenuItem_Click(object sender, EventArgs e) - { - if (Global.Config.EnableBackupMovies) - { - Global.MovieSession.Movie.SaveBackup(); - } - - StopMovie(saveChanges: false); - } - - private void AutomaticMovieBackupMenuItem_Click(object sender, EventArgs e) - { - Global.Config.EnableBackupMovies ^= true; - } - - private void FullMovieLoadstatesMenuItem_Click(object sender, EventArgs e) - { - Global.Config.VBAStyleMovieLoadState ^= true; - } - - private void MovieEndFinishMenuItem_Click(object sender, EventArgs e) - { - Global.Config.MovieEndAction = MovieEndAction.Finish; - } - - private void MovieEndRecordMenuItem_Click(object sender, EventArgs e) - { - Global.Config.MovieEndAction = MovieEndAction.Record; - } - - private void MovieEndStopMenuItem_Click(object sender, EventArgs e) - { - Global.Config.MovieEndAction = MovieEndAction.Stop; - } - - private void MovieEndPauseMenuItem_Click(object sender, EventArgs e) - { - Global.Config.MovieEndAction = MovieEndAction.Pause; - } - - private void ConfigAndRecordAVMenuItem_Click(object sender, EventArgs e) - { - RecordAv(); - } - - private void RecordAVMenuItem_Click(object sender, EventArgs e) - { - RecordAv(null, null); // force unattended, but allow tradtional setup - } - - private void StopAVMenuItem_Click(object sender, EventArgs e) - { - StopAv(); - } - - private void SynclessRecordingMenuItem_Click(object sender, EventArgs e) - { - new SynclessRecordingTools().Run(); - } - - private void CaptureOSDMenuItem_Click(object sender, EventArgs e) - { - Global.Config.AVI_CaptureOSD ^= true; - } - - private void ScreenshotMenuItem_Click(object sender, EventArgs e) - { - TakeScreenshot(); - } - - private void ScreenshotAsMenuItem_Click(object sender, EventArgs e) - { - var path = string.Format(PathManager.ScreenshotPrefix(Global.Game) + ".{0:yyyy-MM-dd HH.mm.ss}.png", DateTime.Now); - - var sfd = new SaveFileDialog - { - InitialDirectory = Path.GetDirectoryName(path), - FileName = Path.GetFileName(path), - Filter = "PNG File (*.png)|*.png" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - TakeScreenshot(sfd.FileName); - } - } - - private void ScreenshotClipboardMenuItem_Click(object sender, EventArgs e) - { - TakeScreenshotToClipboard(); - } - - private void ScreenshotClientClipboardMenuItem_Click(object sender, EventArgs e) - { - TakeScreenshotClientToClipboard(); - } - - private void ScreenshotCaptureOSDMenuItem_Click(object sender, EventArgs e) - { - Global.Config.Screenshot_CaptureOSD ^= true; - } - - private void ExitMenuItem_Click(object sender, EventArgs e) - { - if (GlobalWin.Tools.AskSave()) - { - Close(); - } - } - - public void CloseEmulator() - { - _exitRequestPending = true; - } - - public void CloseEmulator(int exitCode) - { - _exitRequestPending = true; - _exitCode = exitCode; - } - - #endregion - - #region Emulation Menu - - private void EmulationMenuItem_DropDownOpened(object sender, EventArgs e) - { - PauseMenuItem.Checked = _didMenuPause ? _wasPaused : EmulatorPaused; - - SoftResetMenuItem.Enabled = Emulator.ControllerDefinition.BoolButtons.Contains("Reset") && - (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished); - - HardResetMenuItem.Enabled = Emulator.ControllerDefinition.BoolButtons.Contains("Power") && - (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished); - - PauseMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Pause"].Bindings; - RebootCoreMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Reboot Core"].Bindings; - SoftResetMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Soft Reset"].Bindings; - HardResetMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Hard Reset"].Bindings; - } - - private void PauseMenuItem_Click(object sender, EventArgs e) - { - if (IsTurboSeeking || IsSeeking) - { - PauseOnFrame = null; - } - else if (EmulatorPaused) - { - UnpauseEmulator(); - } - else - { - PauseEmulator(); - } - } - - private void PowerMenuItem_Click(object sender, EventArgs e) - { - RebootCore(); - } - - private void SoftResetMenuItem_Click(object sender, EventArgs e) - { - SoftReset(); - } - - private void HardResetMenuItem_Click(object sender, EventArgs e) - { - HardReset(); - } - - #endregion - - #region View - - private void ViewSubMenu_DropDownOpened(object sender, EventArgs e) - { - DisplayFPSMenuItem.Checked = Global.Config.DisplayFPS; - DisplayFrameCounterMenuItem.Checked = Global.Config.DisplayFrameCounter; - DisplayLagCounterMenuItem.Checked = Global.Config.DisplayLagCounter; - DisplayInputMenuItem.Checked = Global.Config.DisplayInput; - DisplayRerecordCountMenuItem.Checked = Global.Config.DisplayRerecordCount; - DisplaySubtitlesMenuItem.Checked = Global.Config.DisplaySubtitles; - - DisplayFPSMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Display FPS"].Bindings; - DisplayFrameCounterMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Frame Counter"].Bindings; - DisplayLagCounterMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Lag Counter"].Bindings; - DisplayInputMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Input Display"].Bindings; - SwitchToFullscreenMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Full Screen"].Bindings; - - DisplayStatusBarMenuItem.Checked = Global.Config.DispChrome_StatusBarWindowed; - DisplayLogWindowMenuItem.Checked = Global.Config.ShowLogWindow; - - DisplayLagCounterMenuItem.Enabled = Emulator.CanPollInput(); - - DisplayMessagesMenuItem.Checked = Global.Config.DisplayMessages; - } - - private void WindowSizeSubMenu_DropDownOpened(object sender, EventArgs e) - { - x1MenuItem.Checked = - x2MenuItem.Checked = - x3MenuItem.Checked = - x4MenuItem.Checked = - x5MenuItem.Checked = false; - - switch (Global.Config.TargetZoomFactors[Emulator.SystemId]) - { - case 1: - x1MenuItem.Checked = true; - break; - case 2: - x2MenuItem.Checked = true; - break; - case 3: - x3MenuItem.Checked = true; - break; - case 4: - x4MenuItem.Checked = true; - break; - case 5: - x5MenuItem.Checked = true; - break; - case 10: - mzMenuItem.Checked = true; - break; - } - } - - private void WindowSize_Click(object sender, EventArgs e) - { - if (sender == x1MenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 1; - if (sender == x2MenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 2; - if (sender == x3MenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 3; - if (sender == x4MenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 4; - if (sender == x5MenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 5; - if (sender == mzMenuItem) Global.Config.TargetZoomFactors[Emulator.SystemId] = 10; - - FrameBufferResized(); - } - - private void SwitchToFullscreenMenuItem_Click(object sender, EventArgs e) - { - ToggleFullscreen(); - } - - private void DisplayFpsMenuItem_Click(object sender, EventArgs e) - { - ToggleFps(); - } - - private void DisplayFrameCounterMenuItem_Click(object sender, EventArgs e) - { - ToggleFrameCounter(); - } - - private void DisplayLagCounterMenuItem_Click(object sender, EventArgs e) - { - ToggleLagCounter(); - } - - private void DisplayInputMenuItem_Click(object sender, EventArgs e) - { - ToggleInputDisplay(); - } - - private void DisplayRerecordsMenuItem_Click(object sender, EventArgs e) - { - Global.Config.DisplayRerecordCount ^= true; - } - - private void DisplaySubtitlesMenuItem_Click(object sender, EventArgs e) - { - Global.Config.DisplaySubtitles ^= true; - } - - private void DisplayStatusBarMenuItem_Click(object sender, EventArgs e) - { - Global.Config.DispChrome_StatusBarWindowed ^= true; - SetStatusBar(); - } - - private void DisplayMessagesMenuItem_Click(object sender, EventArgs e) - { - Global.Config.DisplayMessages ^= true; - } - - private void DisplayLogWindowMenuItem_Click(object sender, EventArgs e) - { - Global.Config.ShowLogWindow ^= true; - - if (Global.Config.ShowLogWindow) - { - LogConsole.ShowConsole(); - } - else - { - LogConsole.HideConsole(); - } - } - - #endregion - - #region Config - - private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e) - { - ControllersMenuItem.Enabled = Emulator.ControllerDefinition.Any(); - RewindOptionsMenuItem.Enabled = Emulator.HasSavestates(); - } - - private void FrameSkipMenuItem_DropDownOpened(object sender, EventArgs e) - { - MinimizeSkippingMenuItem.Checked = Global.Config.AutoMinimizeSkipping; - ClockThrottleMenuItem.Checked = Global.Config.ClockThrottle; - VsyncThrottleMenuItem.Checked = Global.Config.VSyncThrottle; - NeverSkipMenuItem.Checked = Global.Config.FrameSkip == 0; - Frameskip1MenuItem.Checked = Global.Config.FrameSkip == 1; - Frameskip2MenuItem.Checked = Global.Config.FrameSkip == 2; - Frameskip3MenuItem.Checked = Global.Config.FrameSkip == 3; - Frameskip4MenuItem.Checked = Global.Config.FrameSkip == 4; - Frameskip5MenuItem.Checked = Global.Config.FrameSkip == 5; - Frameskip6MenuItem.Checked = Global.Config.FrameSkip == 6; - Frameskip7MenuItem.Checked = Global.Config.FrameSkip == 7; - Frameskip8MenuItem.Checked = Global.Config.FrameSkip == 8; - Frameskip9MenuItem.Checked = Global.Config.FrameSkip == 9; - MinimizeSkippingMenuItem.Enabled = !NeverSkipMenuItem.Checked; - if (!MinimizeSkippingMenuItem.Enabled) - { - MinimizeSkippingMenuItem.Checked = true; - } - - AudioThrottleMenuItem.Enabled = Global.Config.SoundEnabled; - AudioThrottleMenuItem.Checked = Global.Config.SoundThrottle; - VsyncEnabledMenuItem.Checked = Global.Config.VSync; - - Speed100MenuItem.Checked = Global.Config.SpeedPercent == 100; - Speed100MenuItem.Image = (Global.Config.SpeedPercentAlternate == 100) ? Properties.Resources.FastForward : null; - Speed150MenuItem.Checked = Global.Config.SpeedPercent == 150; - Speed150MenuItem.Image = (Global.Config.SpeedPercentAlternate == 150) ? Properties.Resources.FastForward : null; - Speed400MenuItem.Checked = Global.Config.SpeedPercent == 400; - Speed400MenuItem.Image = (Global.Config.SpeedPercentAlternate == 400) ? Properties.Resources.FastForward : null; - Speed200MenuItem.Checked = Global.Config.SpeedPercent == 200; - Speed200MenuItem.Image = (Global.Config.SpeedPercentAlternate == 200) ? Properties.Resources.FastForward : null; - Speed75MenuItem.Checked = Global.Config.SpeedPercent == 75; - Speed75MenuItem.Image = (Global.Config.SpeedPercentAlternate == 75) ? Properties.Resources.FastForward : null; - Speed50MenuItem.Checked = Global.Config.SpeedPercent == 50; - Speed50MenuItem.Image = (Global.Config.SpeedPercentAlternate == 50) ? Properties.Resources.FastForward : null; - - Speed50MenuItem.Enabled = - Speed75MenuItem.Enabled = - Speed100MenuItem.Enabled = - Speed150MenuItem.Enabled = - Speed200MenuItem.Enabled = - Speed400MenuItem.Enabled = - Global.Config.ClockThrottle; - - miUnthrottled.Checked = _unthrottled; - } - - private void KeyPriorityMenuItem_DropDownOpened(object sender, EventArgs e) - { - switch (Global.Config.Input_Hotkey_OverrideOptions) - { - default: - case 0: - BothHkAndControllerMenuItem.Checked = true; - InputOverHkMenuItem.Checked = false; - HkOverInputMenuItem.Checked = false; - break; - case 1: - BothHkAndControllerMenuItem.Checked = false; - InputOverHkMenuItem.Checked = true; - HkOverInputMenuItem.Checked = false; - break; - case 2: - BothHkAndControllerMenuItem.Checked = false; - InputOverHkMenuItem.Checked = false; - HkOverInputMenuItem.Checked = true; - break; - } - } - - private void CoreToolStripMenuItem_DropDownOpened(object sender, EventArgs e) - { - quickNESToolStripMenuItem.Checked = Global.Config.NES_InQuickNES; - nesHawkToolStripMenuItem.Checked = !Global.Config.NES_InQuickNES; - } - - private void ControllersMenuItem_Click(object sender, EventArgs e) - { - var controller = new ControllerConfig(Emulator.ControllerDefinition); - if (controller.ShowDialog() == DialogResult.OK) - { - InitControls(); - InputManager.SyncControls(); - } - } - - private void HotkeysMenuItem_Click(object sender, EventArgs e) - { - if (new HotkeyConfig().ShowDialog() == DialogResult.OK) - { - InitControls(); - InputManager.SyncControls(); - } - } - - private void FirmwaresMenuItem_Click(object sender, EventArgs e) - { - if (e is RomLoader.RomErrorArgs) - { - var args = (RomLoader.RomErrorArgs)e; - var result = new FirmwaresConfig(true, args.RomPath).ShowDialog(); - args.Retry = result == DialogResult.Retry; - } - else - { - new FirmwaresConfig().ShowDialog(); - } - } - - private void MessagesMenuItem_Click(object sender, EventArgs e) - { - new MessageConfig().ShowDialog(); - } - - private void PathsMenuItem_Click(object sender, EventArgs e) - { - new PathConfig().ShowDialog(); - } - - private void SoundMenuItem_Click(object sender, EventArgs e) - { - if (new SoundConfig().ShowDialog() == DialogResult.OK) - { - RewireSound(); - } - } - - private void AutofireMenuItem_Click(object sender, EventArgs e) - { - new AutofireConfig().ShowDialog(); - } - - private void RewindOptionsMenuItem_Click(object sender, EventArgs e) - { - new RewindConfig().ShowDialog(); - } - - private void FileExtensionsMenuItem_Click(object sender, EventArgs e) - { - new FileExtensionPreferences().ShowDialog(); - } - - private void CustomizeMenuItem_Click(object sender, EventArgs e) - { - new EmuHawkOptions().ShowDialog(); - } - - private void ProfilesMenuItem_Click(object sender, EventArgs e) - { - if (new ProfileConfig().ShowDialog() == DialogResult.OK) - { - GlobalWin.OSD.AddMessage("Profile settings saved"); - - // We hide the FirstBoot items since the user setup a Profile - // Is it a bad thing to do this constantly? - Global.Config.FirstBoot = false; - ProfileFirstBootLabel.Visible = false; - } - else - { - GlobalWin.OSD.AddMessage("Profile config aborted"); - } - } - - private void ClockThrottleMenuItem_Click(object sender, EventArgs e) - { - Global.Config.ClockThrottle ^= true; - if (Global.Config.ClockThrottle) - { - var old = Global.Config.SoundThrottle; - Global.Config.SoundThrottle = false; - if (old) - { - RewireSound(); - } - - old = Global.Config.VSyncThrottle; - Global.Config.VSyncThrottle = false; - if (old) - { - PresentationPanel.Resized = true; - } - } - - ThrottleMessage(); - } - - private void AudioThrottleMenuItem_Click(object sender, EventArgs e) - { - Global.Config.SoundThrottle ^= true; - RewireSound(); - if (Global.Config.SoundThrottle) - { - Global.Config.ClockThrottle = false; - var old = Global.Config.VSyncThrottle; - Global.Config.VSyncThrottle = false; - if (old) - { - PresentationPanel.Resized = true; - } - } - - ThrottleMessage(); - } - - private void VsyncThrottleMenuItem_Click(object sender, EventArgs e) - { - Global.Config.VSyncThrottle ^= true; - PresentationPanel.Resized = true; - if (Global.Config.VSyncThrottle) - { - Global.Config.ClockThrottle = false; - var old = Global.Config.SoundThrottle; - Global.Config.SoundThrottle = false; - if (old) - { - RewireSound(); - } - } - - if (!Global.Config.VSync) - { - Global.Config.VSync = true; - VsyncMessage(); - } - - ThrottleMessage(); - } - - private void VsyncEnabledMenuItem_Click(object sender, EventArgs e) - { - Global.Config.VSync ^= true; - if (!Global.Config.VSyncThrottle) // when vsync throttle is on, vsync is forced to on, so no change to make here - { - PresentationPanel.Resized = true; - } - - VsyncMessage(); - } - - private void UnthrottledMenuItem_Click(object sender, EventArgs e) - { - _unthrottled ^= true; - ThrottleMessage(); - } - - private void MinimizeSkippingMenuItem_Click(object sender, EventArgs e) - { - Global.Config.AutoMinimizeSkipping ^= true; - } - - private void NeverSkipMenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 0; FrameSkipMessage(); } - private void Frameskip1MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 1; FrameSkipMessage(); } - private void Frameskip2MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 2; FrameSkipMessage(); } - private void Frameskip3MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 3; FrameSkipMessage(); } - private void Frameskip4MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 4; FrameSkipMessage(); } - private void Frameskip5MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 5; FrameSkipMessage(); } - private void Frameskip6MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 6; FrameSkipMessage(); } - private void Frameskip7MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 7; FrameSkipMessage(); } - private void Frameskip8MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 8; FrameSkipMessage(); } - private void Frameskip9MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 9; FrameSkipMessage(); } - - private void Speed50MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(50); } - private void Speed75MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(75); } - private void Speed100MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(100); } - private void Speed150MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(150); } - private void Speed200MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(200); } - private void Speed400MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(400); } - - private void BothHkAndControllerMenuItem_Click(object sender, EventArgs e) - { - Global.Config.Input_Hotkey_OverrideOptions = 0; - UpdateKeyPriorityIcon(); - } - - private void InputOverHkMenuItem_Click(object sender, EventArgs e) - { - Global.Config.Input_Hotkey_OverrideOptions = 1; - UpdateKeyPriorityIcon(); - } - - private void HkOverInputMenuItem_Click(object sender, EventArgs e) - { - Global.Config.Input_Hotkey_OverrideOptions = 2; - UpdateKeyPriorityIcon(); - } - - private void CoresSubMenu_DropDownOpened(object sender, EventArgs e) - { - GBInSGBMenuItem.Checked = Global.Config.GB_AsSGB; - - allowGameDBCoreOverridesToolStripMenuItem.Checked = Global.Config.CoreForcingViaGameDB; - } - - private void NesCoreSubMenu_DropDownOpened(object sender, EventArgs e) - { - QuicknesCoreMenuItem.Checked = Global.Config.NES_InQuickNES; - NesCoreMenuItem.Checked = !Global.Config.NES_InQuickNES; - } - - private void NesCorePick_Click(object sender, EventArgs e) - { - Global.Config.NES_InQuickNES ^= true; - - if (Emulator.SystemId == "NES") - { - FlagNeedsReboot(); - } - } - - private void CoreSNESSubMenu_DropDownOpened(object sender, EventArgs e) - { - Coresnes9xMenuItem.Checked = Global.Config.SNES_InSnes9x; - CorebsnesMenuItem.Checked = !Global.Config.SNES_InSnes9x; - } - - private void CoreSnesToggle_Click(object sender, EventArgs e) - { - Global.Config.SNES_InSnes9x ^= true; - - if (Emulator.SystemId == "SNES") - { - FlagNeedsReboot(); - } - } - - private void GbaCoreSubMenu_DropDownOpened(object sender, EventArgs e) - { - VbaNextCoreMenuItem.Checked = !Global.Config.GBA_UsemGBA; - MgbaCoreMenuItem.Checked = Global.Config.GBA_UsemGBA; - } - - private void GbaCorePick_Click(object sender, EventArgs e) - { - Global.Config.GBA_UsemGBA ^= true; - if (Emulator.SystemId == "GBA") - { - FlagNeedsReboot(); - } - } - - private void SGBCoreSubmenu_DropDownOpened(object sender, EventArgs e) - { - SgbBsnesMenuItem.Checked = Global.Config.SGB_UseBsnes; - SgbSameBoyMenuItem.Checked = !Global.Config.SGB_UseBsnes; - } - - private void GBCoreSubmenu_DropDownOpened(object sender, EventArgs e) - { - GBGambatteMenuItem.Checked = !Global.Config.GB_UseGBHawk; - GBGBHawkMenuItem.Checked = Global.Config.GB_UseGBHawk; - } - - private void SgbCorePick_Click(object sender, EventArgs e) - { - Global.Config.SGB_UseBsnes ^= true; - // TODO: only flag if one of these cores - if (!Emulator.IsNull()) - { - FlagNeedsReboot(); - } - } - - private void GBCorePick_Click(object sender, EventArgs e) - { - Global.Config.GB_UseGBHawk ^= true; - // TODO: only flag if one of these cores - if (!Emulator.IsNull()) - { - FlagNeedsReboot(); - } - } - - private void GbInSgbMenuItem_Click(object sender, EventArgs e) - { - Global.Config.GB_AsSGB ^= true; - - if (!Emulator.IsNull()) - { - FlagNeedsReboot(); - } - } - - private void AllowGameDBCoreOverridesToolStripMenuItem_Click(object sender, EventArgs e) - { - Global.Config.CoreForcingViaGameDB ^= true; - } - - private void N64VideoPluginSettingsMenuItem_Click(object sender, EventArgs e) - { - N64PluginSettingsMenuItem_Click(sender, e); - } - - private void SetLibretroCoreMenuItem_Click(object sender, EventArgs e) - { - RunLibretroCoreChooser(); - } - - private void SaveConfigMenuItem_Click(object sender, EventArgs e) - { - SaveConfig(); - GlobalWin.OSD.AddMessage("Saved settings"); - } - - private void SaveConfigAsMenuItem_Click(object sender, EventArgs e) - { - var path = PathManager.DefaultIniPath; - var sfd = new SaveFileDialog - { - InitialDirectory = Path.GetDirectoryName(path), - FileName = Path.GetFileName(path), - Filter = "Config File (*.ini)|*.ini" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - SaveConfig(sfd.FileName); - GlobalWin.OSD.AddMessage("Copied settings"); - } - } - - private void LoadConfigMenuItem_Click(object sender, EventArgs e) - { - Global.Config = ConfigService.Load(PathManager.DefaultIniPath); - Global.Config.ResolveDefaults(); - InitControls(); // rebind hotkeys - GlobalWin.OSD.AddMessage("Config file loaded: " + PathManager.DefaultIniPath); - } - - private void LoadConfigFromMenuItem_Click(object sender, EventArgs e) - { - var path = PathManager.DefaultIniPath; - var ofd = new OpenFileDialog - { - InitialDirectory = Path.GetDirectoryName(path), - FileName = Path.GetFileName(path), - Filter = "Config File (*.ini)|*.ini" - }; - - var result = ofd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - Global.Config = ConfigService.Load(ofd.FileName); - Global.Config.ResolveDefaults(); - InitControls(); // rebind hotkeys - GlobalWin.OSD.AddMessage("Config file loaded: " + ofd.FileName); - } - } - - #endregion - - #region Tools - - private void ToolsSubMenu_DropDownOpened(object sender, EventArgs e) - { - ToolBoxMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["ToolBox"].Bindings; - RamWatchMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["RAM Watch"].Bindings; - RamSearchMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["RAM Search"].Bindings; - HexEditorMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Hex Editor"].Bindings; - LuaConsoleMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Lua Console"].Bindings; - LuaConsoleMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - CheatsMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Cheats"].Bindings; - TAStudioMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["TAStudio"].Bindings; - VirtualPadMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Virtual Pad"].Bindings; - TraceLoggerMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Trace Logger"].Bindings; - TraceLoggerMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - CodeDataLoggerMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - TAStudioMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - CheatsMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - HexEditorMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - RamSearchMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - RamWatchMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - DebuggerMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - batchRunnerToolStripMenuItem.Visible = VersionInfo.DeveloperBuild; - - BasicBotMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - gameSharkConverterToolStripMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - - ExperimentalToolsSubMenu.Visible = VersionInfo.DeveloperBuild; - } - - private void ExternalToolToolStripMenuItem_DropDownOpening(object sender, EventArgs e) - { - externalToolToolStripMenuItem.DropDownItems.Clear(); - - foreach (ToolStripMenuItem item in ExternalToolManager.ToolStripMenu) - { - if (item.Enabled) - { - item.Click += delegate - { - GlobalWin.Tools.Load((string)item.Tag); - }; - } - else - { - item.Image = Properties.Resources.ExclamationRed; - } - - externalToolToolStripMenuItem.DropDownItems.Add(item); - } - - if (externalToolToolStripMenuItem.DropDownItems.Count == 0) - { - externalToolToolStripMenuItem.DropDownItems.Add("None"); - } - } - - private void ExperimentalToolsSubMenu_DropDownOpened(object sender, EventArgs e) - { - AutoHawkMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - NewHexEditorMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - } - - private void ToolBoxMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void RamWatchMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadRamWatch(true); - } - - private void RamSearchMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void LuaConsoleMenuItem_Click(object sender, EventArgs e) - { - OpenLuaConsole(); - } - - private void TAStudioMenuItem_Click(object sender, EventArgs e) - { - if (!Emulator.CanPollInput()) - { - MessageBox.Show("Current core does not support input polling. TAStudio can't be used."); - return; - } - - GlobalWin.Tools.Load(); - } - - private void HexEditorMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void TraceLoggerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void DebuggerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void CodeDataLoggerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void MacroToolMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void VirtualPadMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void BasicBotMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void CheatsMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void CheatCodeConverterMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void MultidiskBundlerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void BatchRunnerToolStripMenuItem_Click(object sender, EventArgs e) - { - new BatchRun().ShowDialog(); - } - - private void AutoHawkMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void NewHexEditorMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - #endregion - - #region NES - - private void QuickNesToolStripMenuItem_Click(object sender, EventArgs e) - { - Global.Config.NES_InQuickNES = true; - FlagNeedsReboot(); - } - - private void NesHawkToolStripMenuItem_Click(object sender, EventArgs e) - { - Global.Config.NES_InQuickNES = false; - FlagNeedsReboot(); - } - - private void NESSubMenu_DropDownOpened(object sender, EventArgs e) - { - var boardName = Emulator.HasBoardInfo() ? Emulator.AsBoardInfo().BoardName : null; - FDSControlsMenuItem.Enabled = boardName == "FDS"; - - VSControlsMenuItem.Enabled = - VSSettingsMenuItem.Enabled = - Emulator is NES && ((NES)Emulator).IsVS; - - NESSoundChannelsMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - MovieSettingsMenuItem.Enabled = Emulator is NES && !Global.MovieSession.Movie.IsActive; - - NesControllerSettingsMenuItem.Enabled = GlobalWin.Tools.IsAvailable() - && !Global.MovieSession.Movie.IsActive; - - barcodeReaderToolStripMenuItem.Enabled = ServiceInjector.IsAvailable(Emulator.ServiceProvider, typeof(BarcodeEntry)); - - musicRipperToolStripMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - } - - private void FdsControlsMenuItem_DropDownOpened(object sender, EventArgs e) - { - var boardName = Emulator.HasBoardInfo() ? Emulator.AsBoardInfo().BoardName : null; - FdsEjectDiskMenuItem.Enabled = boardName == "FDS"; - - while (FDSControlsMenuItem.DropDownItems.Count > 1) - { - FDSControlsMenuItem.DropDownItems.RemoveAt(1); - } - - for (int i = 0; i < 16; i++) - { - var str = "FDS Insert " + i; - if (Emulator.ControllerDefinition.BoolButtons.Contains(str)) - { - FdsInsertDiskMenuAdd("Insert Disk " + i, str, "FDS Disk " + i + " inserted."); - } - } - } - - private void NesPPUViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void NESNametableViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void MusicRipperMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void NESGameGenieCodesMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadGameGenieEc(); - } - - private void NESGraphicSettingsMenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES) - { - new NESGraphicsConfig().ShowDialog(this); - } - else if (Emulator is QuickNES) - { - new QuickNesConfig().ShowDialog(this); - } - } - - private void NESSoundChannelsMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void VsSettingsMenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES && ((NES)Emulator).IsVS) - { - new NesVsSettings().ShowHawkDialog(); - } - } - - private void FdsEjectDiskMenuItem_Click(object sender, EventArgs e) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("FDS Eject"); - GlobalWin.OSD.AddMessage("FDS disk ejected."); - } - } - - private void VsInsertCoinP1MenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES && ((NES)Emulator).IsVS) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("Insert Coin P1"); - GlobalWin.OSD.AddMessage("P1 Coin Inserted"); - } - } - } - - private void VsInsertCoinP2MenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES && ((NES)Emulator).IsVS) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("Insert Coin P2"); - GlobalWin.OSD.AddMessage("P2 Coin Inserted"); - } - } - } - - private void VsServiceSwitchMenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES && ((NES)Emulator).IsVS) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("Service Switch"); - GlobalWin.OSD.AddMessage("Service Switch Pressed"); - } - } - } - - private void NesControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - if (Emulator is NES) - { - new NesControllerSettings().ShowDialog(); - } - else if (Emulator is QuickNES) - { - GenericCoreConfig.DoDialog(this, "QuickNES Controller Settings", true, false); - } - } - - private void MovieSettingsMenuItem_Click(object sender, EventArgs e) - { - using (var dlg = new NESSyncSettingsForm()) - { - dlg.ShowDialog(this); - } - } - - private void BarcodeReaderMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - #endregion - - #region PCE - - private void PCESubMenu_DropDownOpened(object sender, EventArgs e) - { - var s = ((PCEngine)Emulator).GetSettings(); - - PceControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - - PCEAlwaysPerformSpriteLimitMenuItem.Checked = s.SpriteLimit; - PCEAlwaysEqualizeVolumesMenuItem.Checked = s.EqualizeVolume; - PCEArcadeCardRewindEnableMenuItem.Checked = s.ArcadeCardRewindHack; - } - - private void PceControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - using (var dlg = new PCEControllerConfig()) - { - dlg.ShowDialog(); - } - } - - private void PceGraphicsSettingsMenuItem_Click(object sender, EventArgs e) - { - new PCEGraphicsConfig().ShowDialog(); - } - - private void PceBgViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void PceTileViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void PceSoundDebuggerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void PCEAlwaysPerformSpriteLimitMenuItem_Click(object sender, EventArgs e) - { - var s = ((PCEngine)Emulator).GetSettings(); - s.SpriteLimit ^= true; - PutCoreSettings(s); - } - - private void PCEAlwaysEqualizeVolumesMenuItem_Click(object sender, EventArgs e) - { - var s = ((PCEngine)Emulator).GetSettings(); - s.EqualizeVolume ^= true; - PutCoreSettings(s); - } - - private void PCEArcadeCardRewindEnableMenuItem_Click(object sender, EventArgs e) - { - var s = ((PCEngine)Emulator).GetSettings(); - s.ArcadeCardRewindHack ^= true; - PutCoreSettings(s); - } - - #endregion - - #region SMS - - private void SMSSubMenu_DropDownOpened(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - var ss = ((SMS)Emulator).GetSyncSettings(); - SMSregionExportToolStripMenuItem.Checked = ss.ConsoleRegion == "Export"; - SMSregionJapanToolStripMenuItem.Checked = ss.ConsoleRegion == "Japan"; - SMSregionKoreaToolStripMenuItem.Checked = ss.ConsoleRegion == "Korea"; - SMSregionAutoToolStripMenuItem.Checked = ss.ConsoleRegion == "Auto"; - SMSdisplayNtscToolStripMenuItem.Checked = ss.DisplayType == "NTSC"; - SMSdisplayPalToolStripMenuItem.Checked = ss.DisplayType == "PAL"; - SMSdisplayAutoToolStripMenuItem.Checked = ss.DisplayType == "Auto"; - SMSControllerStandardToolStripMenuItem.Checked = ss.ControllerType == "Standard"; - SMSControllerPaddleToolStripMenuItem.Checked = ss.ControllerType == "Paddle"; - SMSControllerLightPhaserToolStripMenuItem.Checked = ss.ControllerType == "Light Phaser"; - SMSControllerSportsPadToolStripMenuItem.Checked = ss.ControllerType == "Sports Pad"; - SMSControllerKeyboardToolStripMenuItem.Checked = ss.ControllerType == "Keyboard"; - SMSenableBIOSToolStripMenuItem.Checked = ss.UseBIOS; - SMSEnableFMChipMenuItem.Checked = ss.EnableFM; - SMSOverclockMenuItem.Checked = ss.AllowOverlock; - SMSForceStereoMenuItem.Checked = s.ForceStereoSeparation; - SMSSpriteLimitMenuItem.Checked = s.SpriteLimit; - SMSDisplayOverscanMenuItem.Checked = s.DisplayOverscan; - SMSFix3DGameDisplayToolStripMenuItem.Checked = s.Fix3D; - ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions; - HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion; - - SMSEnableFMChipMenuItem.Visible = - SMSFix3DGameDisplayToolStripMenuItem.Visible = - SMSenableBIOSToolStripMenuItem.Visible = - Global.Game.System == "SMS"; - - SMSDisplayOverscanMenuItem.Visible = - Global.Game.System == "SMS" || Global.Game.System == "SG"; - - SMSOverclockMenuItem.Visible = - SMSForceStereoMenuItem.Visible = - SMSdisplayToolStripMenuItem.Visible = - Global.Game.System != "GG"; - - ShowClippedRegionsMenuItem.Visible = - HighlightActiveDisplayRegionMenuItem.Visible = - GGGameGenieMenuItem.Visible = - Global.Game.System == "GG"; - - SMSOverclockMenuItem.Visible = - SMSVDPViewerToolStripMenuItem.Visible = - toolStripSeparator24.Visible = - Global.Game.System != "SG"; - } - - private void SMS_RegionExport_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.ConsoleRegion = "Export"; - PutCoreSyncSettings(ss); - } - - private void SMS_RegionJapan_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.ConsoleRegion = "Japan"; - PutCoreSyncSettings(ss); - } - - private void SMS_RegionKorea_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.ConsoleRegion = "Korea"; - PutCoreSyncSettings(ss); - } - - private void SMS_RegionAuto_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.ConsoleRegion = "Auto"; - PutCoreSyncSettings(ss); - } - - private void SMS_DisplayNTSC_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.DisplayType = "NTSC"; - PutCoreSyncSettings(ss); - } - - private void SMS_DisplayPAL_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.DisplayType = "PAL"; - PutCoreSyncSettings(ss); - } - - private void SMS_DisplayAuto_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.DisplayType = "Auto"; - PutCoreSyncSettings(ss); - } - - private void SmsBiosMenuItem_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.UseBIOS ^= true; - PutCoreSyncSettings(ss); - } - - private void SmsEnableFmChipMenuItem_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.EnableFM ^= true; - PutCoreSyncSettings(ss); - } - - private void SMSOverclockMenuItem_Click(object sender, EventArgs e) - { - var ss = ((SMS)Emulator).GetSyncSettings(); - ss.AllowOverlock ^= true; - PutCoreSyncSettings(ss); - } - - private void SMSForceStereoMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.ForceStereoSeparation ^= true; - PutCoreSettings(s); - } - - private void SMSSpriteLimitMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.SpriteLimit ^= true; - PutCoreSettings(s); - } - - private void SMSDisplayOverscanMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.DisplayOverscan ^= true; - PutCoreSettings(s); - } - - private void SMSFix3DDisplayMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.Fix3D ^= true; - PutCoreSettings(s); - } - - private void ShowClippedRegionsMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.ShowClippedRegions ^= true; - PutCoreSettings(s); - } - - private void HighlightActiveDisplayRegionMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSettings(); - s.HighlightActiveDisplayRegion ^= true; - PutCoreSettings(s); - } - - private void SMSGraphicsSettingsMenuItem_Click(object sender, EventArgs e) - { - new SMSGraphicsConfig().ShowDialog(); - } - - private void GGGameGenieMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadGameGenieEc(); - } - - private void SmsVdpViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void SMSControllerStandardToolStripMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSyncSettings(); - s.ControllerType = "Standard"; - PutCoreSyncSettings(s); - } - - private void SMSControllerPaddleToolStripMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSyncSettings(); - s.ControllerType = "Paddle"; - PutCoreSyncSettings(s); - } - - private void SMSControllerLightPhaserToolStripMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSyncSettings(); - s.ControllerType = "Light Phaser"; - PutCoreSyncSettings(s); - } - - private void SMSControllerSportsPadToolStripMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSyncSettings(); - s.ControllerType = "Sports Pad"; - PutCoreSyncSettings(s); - } - - private void SMSControllerKeyboardToolStripMenuItem_Click(object sender, EventArgs e) - { - var s = ((SMS)Emulator).GetSyncSettings(); - s.ControllerType = "Keyboard"; - PutCoreSyncSettings(s); - } - - #endregion - - #region TI83 - - private void TI83SubMenu_DropDownOpened(object sender, EventArgs e) - { - AutoloadKeypadMenuItem.Checked = Global.Config.TI83autoloadKeyPad; - } - - private void KeypadMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void AutoloadKeypadMenuItem_Click(object sender, EventArgs e) - { - Global.Config.TI83autoloadKeyPad ^= true; - } - - private void LoadTIFileMenuItem_Click(object sender, EventArgs e) - { - var ti83 = (TI83)Emulator; - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetRomsPath(Emulator.SystemId), - Filter = "TI-83 Program Files (*.83p,*.8xp)|*.83P;*.8xp|All Files|*.*", - RestoreDirectory = true - }; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - ti83.LinkPort.SendFileToCalc(File.OpenRead(ofd.FileName), true); - } - catch (IOException ex) - { - var message = $"Invalid file format. Reason: {ex.Message} \nForce transfer? This may cause the calculator to crash."; - - if (MessageBox.Show(message, "Upload Failed", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) - { - ti83.LinkPort.SendFileToCalc(File.OpenRead(ofd.FileName), false); - } - } - } - } - - private void TI83PaletteMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage(new TI83PaletteConfig().ShowDialog() == DialogResult.OK - ? "Palette settings saved" - : "Palette config aborted"); - } - - #endregion - - #region Atari - - private void AtariSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Atari 2600 Settings"); - } - - #endregion - - #region Atari7800 - - private void A7800SubMenu_DropDownOpened(object sender, EventArgs e) - { - A7800ControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - A7800FilterSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - } - - private void A7800ControllerSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - new A7800ControllerSettings().ShowDialog(); - } - - private void A7800FilterSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - new A7800FilterSettings().ShowDialog(); - } - - #endregion - - #region GB - - private void GBSubMenu_DropDownOpened(object sender, EventArgs e) - { - LoadGBInSGBMenuItem.Checked = Global.Config.GB_AsSGB; - } - - private void GBCoreSettingsMenuItem_Click(object sender, EventArgs e) - { - if (Global.Emulator is Gameboy) - { - GBPrefs.DoGBPrefsDialog(this); - } - else // sameboy - { - GenericCoreConfig.DoDialog(this, "Gameboy Settings"); - } - } - - private void LoadGbInSgbMenuItem_Click(object sender, EventArgs e) - { - SnesGbInSgbMenuItem_Click(sender, e); - } - - private void GbGpuViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void GBGameGenieMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadGameGenieEc(); - } - - private void GBPrinterViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - #endregion - - #region GBA - - private void GbaGpuViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void UsemGBAMenuItem_Click(object sender, EventArgs e) - { - Global.Config.GBA_UsemGBA = true; - FlagNeedsReboot(); - } - - private void UseVbaNextMenuItem_Click(object sender, EventArgs e) - { - Global.Config.GBA_UsemGBA = false; - FlagNeedsReboot(); - } - - private void GBACoreSelectionSubMenu_DropDownOpened(object sender, EventArgs e) - { - GBAmGBAMenuItem.Checked = Global.Config.GBA_UsemGBA == true; - GBAVBANextMenuItem.Checked = Global.Config.GBA_UsemGBA == false; - } - - private void GbaWithmGBAMenuItem_Click(object sender, EventArgs e) - { - Global.Config.GBA_UsemGBA ^= true; - FlagNeedsReboot(); - } - - #endregion - - #region PSX - - private void PSXSubMenu_DropDownOpened(object sender, EventArgs e) - { - PSXControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - } - - private void PSXControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - new PSXControllerConfigNew().ShowDialog(); - } - - private void PSXOptionsMenuItem_Click(object sender, EventArgs e) - { - var result = PSXOptions.DoSettingsDialog(this); - if (result == DialogResult.OK) - { - FrameBufferResized(); - } - } - - private void PSXDiscControlsMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load().ScrollToPadSchema("Console"); - } - - private void PSXHashDiscsToolStripMenuItem_Click(object sender, EventArgs e) - { - new PSXHashDiscs().ShowDialog(); - } - - #endregion - - #region SNES - - private void SNESSubMenu_DropDownOpened(object sender, EventArgs e) - { - if (((LibsnesCore)Emulator).IsSGB) - { - SnesGBInSGBMenuItem.Visible = true; - SnesGBInSGBMenuItem.Checked = Global.Config.GB_AsSGB; - } - else - { - SnesGBInSGBMenuItem.Visible = false; - } - - SNESControllerConfigurationMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - } - - private void SNESControllerConfigurationMenuItem_Click(object sender, EventArgs e) - { - new SNESControllerSettings().ShowDialog(); - } - - private void SnesGfxDebuggerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void SnesGbInSgbMenuItem_Click(object sender, EventArgs e) - { - Global.Config.GB_AsSGB ^= true; - FlagNeedsReboot(); - } - - private void SnesGameGenieMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadGameGenieEc(); - } - - private void SnesOptionsMenuItem_Click(object sender, EventArgs e) - { - SNESOptions.DoSettingsDialog(this); - } - - #endregion - - #region Coleco - - private void ColecoSubMenu_DropDownOpened(object sender, EventArgs e) - { - var ss = ((ColecoVision)Emulator).GetSyncSettings(); - ColecoSkipBiosMenuItem.Checked = ss.SkipBiosIntro; - ColecoUseSGMMenuItem.Checked = ss.UseSGM; - ColecoControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - } - - private void ColecoSkipBiosMenuItem_Click(object sender, EventArgs e) - { - var ss = ((ColecoVision)Emulator).GetSyncSettings(); - ss.SkipBiosIntro ^= true; - PutCoreSyncSettings(ss); - } - - private void ColecoUseSGMMenuItem_Click(object sender, EventArgs e) - { - var ss = ((ColecoVision)Emulator).GetSyncSettings(); - ss.UseSGM ^= true; - PutCoreSyncSettings(ss); - } - - private void ColecoControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - new ColecoControllerSettings().ShowDialog(); - } - - #endregion - - #region N64 - - private void N64SubMenu_DropDownOpened(object sender, EventArgs e) - { - N64PluginSettingsMenuItem.Enabled = - N64ControllerSettingsMenuItem.Enabled = - N64ExpansionSlotMenuItem.Enabled = - !Global.MovieSession.Movie.IsActive; - - N64CircularAnalogRangeMenuItem.Checked = Global.Config.N64UseCircularAnalogConstraint; - - var s = ((N64)Emulator).GetSettings(); - MupenStyleLagMenuItem.Checked = s.UseMupenStyleLag; - - N64ExpansionSlotMenuItem.Checked = ((N64)Emulator).UsingExpansionSlot; - N64ExpansionSlotMenuItem.Enabled = !((N64)Emulator).IsOverridingUserExpansionSlotSetting; - } - - private void N64PluginSettingsMenuItem_Click(object sender, EventArgs e) - { - if (new N64VideoPluginconfig().ShowDialog() == DialogResult.OK) - { - if (Emulator.IsNull()) - { - GlobalWin.OSD.AddMessage("Plugin settings saved"); - } - else - { - // Do nothing, Reboot is being flagged already if they chaned anything - } - } - else - { - GlobalWin.OSD.AddMessage("Plugin settings aborted"); - } - } - - private void N64ControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - if (new N64ControllersSetup().ShowDialog() == DialogResult.OK) - { - FlagNeedsReboot(); - GlobalWin.OSD.AddMessage("Controller settings saved but a core reboot is required"); - } - else - { - GlobalWin.OSD.AddMessage("Controller settings aborted"); - } - } - - private void N64CircularAnalogRangeMenuItem_Click(object sender, EventArgs e) - { - Global.Config.N64UseCircularAnalogConstraint ^= true; - } - - private void MupenStyleLagMenuItem_Click(object sender, EventArgs e) - { - var n64 = (N64)Emulator; - var s = n64.GetSettings(); - s.UseMupenStyleLag ^= true; - n64.PutSettings(s); - } - - private void N64ExpansionSlotMenuItem_Click(object sender, EventArgs e) - { - var n64 = (N64)Emulator; - var ss = n64.GetSyncSettings(); - ss.DisableExpansionSlot ^= true; - n64.PutSyncSettings(ss); - FlagNeedsReboot(); - } - - #endregion - - #region Saturn - - private void SaturnPreferencesMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Saturn Settings"); - } - - #endregion - - #region DGB - - private void DgbSettingsMenuItem_Click(object sender, EventArgs e) - { - DGBPrefs.DoDGBPrefsDialog(this); - } - - private void DgbHawkSettingsMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Gameboy Settings"); - } - - #endregion - - #region GEN - - private void GenVdpViewerMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void GenesisSettingsMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Genesis Settings"); - } - - private void GenesisGameGenieEcDc_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - #endregion - - #region Wondersawn - - private void WondersawnSettingsMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "WonderSwan Settings"); - } - - #endregion - - #region Apple II - - private void AppleIISettingsMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Apple II Settings"); - } - - private void AppleSubMenu_DropDownOpened(object sender, EventArgs e) - { - if (Emulator is AppleII) - { - AppleDisksSubMenu.Enabled = ((AppleII)Emulator).DiskCount > 1; - } - } - - private void AppleDisksSubMenu_DropDownOpened(object sender, EventArgs e) - { - AppleDisksSubMenu.DropDownItems.Clear(); - - if (Emulator is AppleII) - { - var appleII = (AppleII)Emulator; - for (int i = 0; i < appleII.DiskCount; i++) - { - var menuItem = new ToolStripMenuItem - { - Name = "Disk" + (i + 1), - Text = "Disk" + (i + 1), - Checked = appleII.CurrentDisk == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - appleII.SetDisk(dummy); - }; - - AppleDisksSubMenu.DropDownItems.Add(menuItem); - } - } - } - - #endregion - - #region C64 - - private void C64SubMenu_DropDownOpened(object sender, EventArgs e) - { - if (Emulator is C64) - { - C64DisksSubMenu.Enabled = ((C64)Emulator).DiskCount > 1; - } - } - - private void C64DisksSubMenu_DropDownOpened(object sender, EventArgs e) - { - C64DisksSubMenu.DropDownItems.Clear(); - - if (Emulator is C64) - { - var c64 = (C64)Emulator; - for (int i = 0; i < c64.DiskCount; i++) - { - var menuItem = new ToolStripMenuItem - { - Name = "Disk" + (i + 1), - Text = "Disk" + (i + 1), - Checked = c64.CurrentDisk == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - c64.SetDisk(dummy); - }; - - C64DisksSubMenu.DropDownItems.Add(menuItem); - } - } - } - - private void C64SettingsMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "C64 Settings"); - } - - #endregion - - #region Intv - - private void IntvSubMenu_DropDownOpened(object sender, EventArgs e) - { - IntVControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive; - } - - private void IntVControllerSettingsMenuItem_Click(object sender, EventArgs e) - { - new IntvControllerSettings().ShowDialog(); - } - - #endregion - - #region ZXSpectrum - - private void zXSpectrumToolStripMenuItem_DropDownOpened(object sender, EventArgs e) - { - - } - - - private void preferencesToolStripMenuItem4_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "ZXSpectrum Settings"); - } - - - private void ZXSpectrumControllerConfigurationMenuItem_Click(object sender, EventArgs e) - { - new ZXSpectrumJoystickSettings().ShowDialog(); - } - - private void ZXSpectrumCoreEmulationSettingsMenuItem_Click(object sender, EventArgs e) - { - new ZXSpectrumCoreEmulationSettings().ShowDialog(); - } - - private void ZXSpectrumNonSyncSettingsMenuItem_Click(object sender, EventArgs e) - { - new ZXSpectrumNonSyncSettings().ShowDialog(); - } - - private void ZXSpectrumAudioSettingsMenuItem_Click(object sender, EventArgs e) - { - new ZXSpectrumAudioSettings().ShowDialog(); - } - - private void ZXSpectrumPokeMemoryMenuItem_Click(object sender, EventArgs e) - { - new ZXSpectrumPokeMemory().ShowDialog(); - } - - private void ZXSpectrumMediaMenuItem_DropDownOpened(object sender, EventArgs e) - { - if (Emulator is ZXSpectrum) - { - ZXSpectrumTapesSubMenu.Enabled = ((ZXSpectrum)Emulator)._tapeInfo.Count > 0; - ZXSpectrumDisksSubMenu.Enabled = ((ZXSpectrum)Emulator)._diskInfo.Count > 0; - } - } - - private void ZXSpectrumTapesSubMenu_DropDownOpened(object sender, EventArgs e) - { - ZXSpectrumTapesSubMenu.DropDownItems.Clear(); - - List items = new List(); - - if (Emulator is ZXSpectrum) - { - var speccy = (ZXSpectrum)Emulator; - var currSel = speccy._machine.TapeMediaIndex; - - for (int i = 0; i < speccy._tapeInfo.Count; i++) - { - string name = speccy._tapeInfo[i].Name; - - var menuItem = new ToolStripMenuItem - { - Name = i + "_" + name, - Text = i + ": " + name, - Checked = currSel == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - speccy._machine.TapeMediaIndex = dummy; - }; - - items.Add(menuItem); - } - } - - ZXSpectrumTapesSubMenu.DropDownItems.AddRange(items.ToArray()); - } - - private void ZXSpectrumDisksSubMenu_DropDownOpened(object sender, EventArgs e) - { - ZXSpectrumDisksSubMenu.DropDownItems.Clear(); - - List items = new List(); - - if (Emulator is ZXSpectrum) - { - var speccy = (ZXSpectrum)Emulator; - var currSel = speccy._machine.DiskMediaIndex; - - for (int i = 0; i < speccy._diskInfo.Count; i++) - { - string name = speccy._diskInfo[i].Name; - - var menuItem = new ToolStripMenuItem - { - Name = i + "_" + name, - Text = i + ": " + name, - Checked = currSel == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - speccy._machine.DiskMediaIndex = dummy; - }; - - items.Add(menuItem); - } - } - - ZXSpectrumDisksSubMenu.DropDownItems.AddRange(items.ToArray()); - } - - private void ZXSpectrumExportSnapshotMenuItemMenuItem_Click(object sender, EventArgs e) - { - SaveFileDialog zxSnapExpDialog = new SaveFileDialog(); - zxSnapExpDialog.RestoreDirectory = true; - zxSnapExpDialog.Title = "EXPERIMENTAL - Export 3rd party snapshot formats"; - zxSnapExpDialog.DefaultExt = "szx"; - zxSnapExpDialog.Filter = "ZX-State files (*.szx)|*.szx"; - zxSnapExpDialog.SupportMultiDottedExtensions = true; - - try - { - var res = zxSnapExpDialog.ShowDialog(); - if (res == DialogResult.OK) - { - var speccy = (ZXSpectrum)Emulator; - var snap = speccy.GetSZXSnapshot(); - File.WriteAllBytes(zxSnapExpDialog.FileName, snap); - //File.WriteAllText(zxSnapExpDialog.FileName, snap); - } - } - catch (Exception ex) - { - var ee = ex; - } - } - - #endregion - - #region AmstradCPC - - private void amstradCPCCoreEmulationSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - new AmstradCPCCoreEmulationSettings().ShowDialog(); - } - - private void AmstradCPCAudioSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - new AmstradCPCAudioSettings().ShowDialog(); - } - - private void AmstradCPCPokeMemoryToolStripMenuItem_Click(object sender, EventArgs e) - { - new AmstradCPCPokeMemory().ShowDialog(); - } - - private void AmstradCPCMediaToolStripMenuItem_DropDownOpened(object sender, EventArgs e) - { - if (Emulator is AmstradCPC) - { - AmstradCPCTapesSubMenu.Enabled = ((AmstradCPC)Emulator)._tapeInfo.Count > 0; - AmstradCPCDisksSubMenu.Enabled = ((AmstradCPC)Emulator)._diskInfo.Count > 0; - } - } - - private void AmstradCPCTapesSubMenu_DropDownOpened(object sender, EventArgs e) - { - AmstradCPCTapesSubMenu.DropDownItems.Clear(); - - List items = new List(); - - if (Emulator is AmstradCPC) - { - var ams = (AmstradCPC)Emulator; - var currSel = ams._machine.TapeMediaIndex; - - for (int i = 0; i < ams._tapeInfo.Count; i++) - { - string name = ams._tapeInfo[i].Name; - - var menuItem = new ToolStripMenuItem - { - Name = i + "_" + name, - Text = i + ": " + name, - Checked = currSel == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - ams._machine.TapeMediaIndex = dummy; - }; - - items.Add(menuItem); - } - } - - AmstradCPCTapesSubMenu.DropDownItems.AddRange(items.ToArray()); - } - - private void AmstradCPCDisksSubMenu_DropDownOpened(object sender, EventArgs e) - { - AmstradCPCDisksSubMenu.DropDownItems.Clear(); - - List items = new List(); - - if (Emulator is AmstradCPC) - { - var ams = (AmstradCPC)Emulator; - var currSel = ams._machine.DiskMediaIndex; - - for (int i = 0; i < ams._diskInfo.Count; i++) - { - string name = ams._diskInfo[i].Name; - - var menuItem = new ToolStripMenuItem - { - Name = i + "_" + name, - Text = i + ": " + name, - Checked = currSel == i - }; - - int dummy = i; - menuItem.Click += (o, ev) => - { - ams._machine.DiskMediaIndex = dummy; - }; - - items.Add(menuItem); - } - } - - AmstradCPCDisksSubMenu.DropDownItems.AddRange(items.ToArray()); - } - - private void AmstradCPCNonSyncSettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - new AmstradCPCNonSyncSettings().ShowDialog(); - } - - #endregion - - #region Help - - private void HelpSubMenu_DropDownOpened(object sender, EventArgs e) - { - FeaturesMenuItem.Visible = VersionInfo.DeveloperBuild; - } - - private void OnlineHelpMenuItem_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start("http://tasvideos.org/BizHawk.html"); - } - - private void ForumsMenuItem_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start("http://tasvideos.org/forum/viewforum.php?f=64"); - } - - private void FeaturesMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.Load(); - } - - private void AboutMenuItem_Click(object sender, EventArgs e) - { - if (VersionInfo.DeveloperBuild) - { - new AboutBox().ShowDialog(); - } - else - { - new BizBox().ShowDialog(); - } - } - - #endregion - - #region Context Menu - - private void MainFormContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - _wasPaused = EmulatorPaused; - _didMenuPause = true; - PauseEmulator(); - - OpenRomContextMenuItem.Visible = Emulator.IsNull() || _inFullscreen; - - bool showMenuVisible = _inFullscreen; - if (!MainMenuStrip.Visible) - { - showMenuVisible = true; // need to always be able to restore this as an emergency measure - } - - if (argParser._chromeless) - { - showMenuVisible = true; // I decided this was always possible in chromeless mode, we'll see what they think - } - - ShowMenuContextMenuItem.Visible = - ShowMenuContextMenuSeparator.Visible = - showMenuVisible; - - LoadLastRomContextMenuItem.Visible = Emulator.IsNull(); - - StopAVContextMenuItem.Visible = _currAviWriter != null; - - ContextSeparator_AfterMovie.Visible = - ContextSeparator_AfterUndo.Visible = - ScreenshotContextMenuItem.Visible = - CloseRomContextMenuItem.Visible = - UndoSavestateContextMenuItem.Visible = - !Emulator.IsNull(); - - RecordMovieContextMenuItem.Visible = - PlayMovieContextMenuItem.Visible = - LoadLastMovieContextMenuItem.Visible = - !Emulator.IsNull() && !Global.MovieSession.Movie.IsActive; - - RestartMovieContextMenuItem.Visible = - StopMovieContextMenuItem.Visible = - ViewSubtitlesContextMenuItem.Visible = - ViewCommentsContextMenuItem.Visible = - SaveMovieContextMenuItem.Visible = - SaveMovieAsContextMenuItem.Visible = - Global.MovieSession.Movie.IsActive; - - BackupMovieContextMenuItem.Visible = Global.MovieSession.Movie.IsActive; - - StopNoSaveContextMenuItem.Visible = Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.Changes; - - AddSubtitleContextMenuItem.Visible = !Emulator.IsNull() && Global.MovieSession.Movie.IsActive && !Global.MovieSession.ReadOnly; - - ConfigContextMenuItem.Visible = _inFullscreen; - - ClearSRAMContextMenuItem.Visible = File.Exists(PathManager.SaveRamPath(Global.Game)); - - ContextSeparator_AfterROM.Visible = OpenRomContextMenuItem.Visible || LoadLastRomContextMenuItem.Visible; - - LoadLastRomContextMenuItem.Enabled = !Global.Config.RecentRoms.Empty; - LoadLastMovieContextMenuItem.Enabled = !Global.Config.RecentMovies.Empty; - - if (Global.MovieSession.Movie.IsActive) - { - if (Global.MovieSession.ReadOnly) - { - ViewSubtitlesContextMenuItem.Text = "View Subtitles"; - ViewCommentsContextMenuItem.Text = "View Comments"; - } - else - { - ViewSubtitlesContextMenuItem.Text = "Edit Subtitles"; - ViewCommentsContextMenuItem.Text = "Edit Comments"; - } - } - - var file = new FileInfo( - PathManager.SaveStatePrefix(Global.Game) + - ".QuickSave" + - Global.Config.SaveSlot + - ".State.bak"); - - if (file.Exists) - { - UndoSavestateContextMenuItem.Enabled = true; - if (_stateSlots.IsRedo(Global.Config.SaveSlot)) - { - UndoSavestateContextMenuItem.Text = "Redo Save to slot " + Global.Config.SaveSlot; - UndoSavestateContextMenuItem.Image = Properties.Resources.redo; - } - else - { - UndoSavestateContextMenuItem.Text = "Undo Save to slot " + Global.Config.SaveSlot; - UndoSavestateContextMenuItem.Image = Properties.Resources.undo; - } - } - else - { - UndoSavestateContextMenuItem.Enabled = false; - UndoSavestateContextMenuItem.Text = "Undo Savestate"; - UndoSavestateContextMenuItem.Image = Properties.Resources.undo; - } - - ShowMenuContextMenuItem.Text = MainMenuStrip.Visible ? "Hide Menu" : "Show Menu"; - } - - private void MainFormContextMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e) - { - if (!_wasPaused) - { - UnpauseEmulator(); - } - } - - private void SavestateTypeContextSubMenu_DropDownOpened(object sender, EventArgs e) - { - SavestateTypeDefaultContextMenuItem.Checked = false; - SavestateBinaryContextMenuItem.Checked = false; - SavestateTextContextMenuItem.Checked = false; - switch (Global.Config.SaveStateType) - { - case Config.SaveStateTypeE.Binary: - SavestateBinaryContextMenuItem.Checked = true; - break; - case Config.SaveStateTypeE.Text: - SavestateTextContextMenuItem.Checked = true; - break; - case Config.SaveStateTypeE.Default: - SavestateTypeDefaultContextMenuItem.Checked = true; - break; - } - } - - private void DisplayConfigMenuItem_Click(object sender, EventArgs e) - { - var window = new DisplayConfigLite(); - var result = window.ShowDialog(); - if (result == DialogResult.OK) - { - FrameBufferResized(); - SynchChrome(); - if (window.NeedReset) - { - GlobalWin.OSD.AddMessage("Restart program for changed settings"); - } - } - } - - private void LoadLastRomContextMenuItem_Click(object sender, EventArgs e) - { - LoadRomFromRecent(Global.Config.RecentRoms.MostRecent); - } - - private void LoadLastMovieContextMenuItem_Click(object sender, EventArgs e) - { - LoadMoviesFromRecent(Global.Config.RecentMovies.MostRecent); - } - - private void BackupMovieContextMenuItem_Click(object sender, EventArgs e) - { - Global.MovieSession.Movie.SaveBackup(); - GlobalWin.OSD.AddMessage("Backup movie saved."); - } - - private void ViewSubtitlesContextMenuItem_Click(object sender, EventArgs e) - { - if (Global.MovieSession.Movie.IsActive) - { - var form = new EditSubtitlesForm { ReadOnly = Global.MovieSession.ReadOnly }; - form.GetMovie(Global.MovieSession.Movie); - form.ShowDialog(); - } - } - - private void AddSubtitleContextMenuItem_Click(object sender, EventArgs e) - { - // TODO: rethink this? - var subForm = new SubtitleMaker(); - subForm.DisableFrame(); - - int index = -1; - var sub = new Subtitle(); - for (int i = 0; i < Global.MovieSession.Movie.Subtitles.Count; i++) - { - sub = Global.MovieSession.Movie.Subtitles[i]; - if (Emulator.Frame == sub.Frame) - { - index = i; - break; - } - } - - if (index < 0) - { - sub = new Subtitle { Frame = Emulator.Frame }; - } - - subForm.Sub = sub; - - if (subForm.ShowDialog() == DialogResult.OK) - { - if (index >= 0) - { - Global.MovieSession.Movie.Subtitles.RemoveAt(index); - } - - Global.MovieSession.Movie.Subtitles.Add(subForm.Sub); - } - } - - private void ViewCommentsContextMenuItem_Click(object sender, EventArgs e) - { - if (Global.MovieSession.Movie.IsActive) - { - var form = new EditCommentsForm(); - form.GetMovie(Global.MovieSession.Movie); - form.ShowDialog(); - } - } - - private void UndoSavestateContextMenuItem_Click(object sender, EventArgs e) - { - _stateSlots.SwapBackupSavestate( - PathManager.SaveStatePrefix(Global.Game) + - ".QuickSave" + - Global.Config.SaveSlot + - ".State"); - - GlobalWin.OSD.AddMessage("Save slot " + Global.Config.SaveSlot + " restored."); - } - - private void ClearSramContextMenuItem_Click(object sender, EventArgs e) - { - CloseRom(clearSram: true); - } - - private void ShowMenuContextMenuItem_Click(object sender, EventArgs e) - { - MainMenuStrip.Visible ^= true; - FrameBufferResized(); - } - - #endregion - - #region Status Bar - - private void DumpStatusButton_Click(object sender, EventArgs e) - { - string details = Emulator.CoreComm.RomStatusDetails; - if (!string.IsNullOrEmpty(details)) - { - GlobalWin.Sound.StopSound(); - LogWindow.ShowReport("Dump Status Report", details, this); - GlobalWin.Sound.StartSound(); - } - } - - private void SlotStatusButtons_MouseUp(object sender, MouseEventArgs e) - { - int slot = 0; - if (sender == Slot1StatusButton) slot = 1; - if (sender == Slot2StatusButton) slot = 2; - if (sender == Slot3StatusButton) slot = 3; - if (sender == Slot4StatusButton) slot = 4; - if (sender == Slot5StatusButton) slot = 5; - if (sender == Slot6StatusButton) slot = 6; - if (sender == Slot7StatusButton) slot = 7; - if (sender == Slot8StatusButton) slot = 8; - if (sender == Slot9StatusButton) slot = 9; - if (sender == Slot0StatusButton) slot = 0; - - if (e.Button == MouseButtons.Left) - { - if (_stateSlots.HasSlot(slot)) - { - LoadQuickSave("QuickSave" + slot); - } - } - else if (e.Button == MouseButtons.Right) - { - SaveQuickSave("QuickSave" + slot); - } - } - - private void KeyPriorityStatusLabel_Click(object sender, EventArgs e) - { - switch (Global.Config.Input_Hotkey_OverrideOptions) - { - default: - case 0: - Global.Config.Input_Hotkey_OverrideOptions = 1; - break; - case 1: - Global.Config.Input_Hotkey_OverrideOptions = 2; - break; - case 2: - Global.Config.Input_Hotkey_OverrideOptions = 0; - break; - } - - UpdateKeyPriorityIcon(); - } - - private void FreezeStatus_Click(object sender, EventArgs e) - { - if (CheatStatusButton.Visible) - { - GlobalWin.Tools.Load(); - } - } - - private void ProfileFirstBootLabel_Click(object sender, EventArgs e) - { - // We do not check if the user is actually setting a profile here. - // This is intentional. - var profileForm = new ProfileConfig(); - profileForm.ShowDialog(); - Global.Config.FirstBoot = false; - ProfileFirstBootLabel.Visible = false; - } - - private void UpdateNotification_Click(object sender, EventArgs e) - { - GlobalWin.Sound.StopSound(); - DialogResult result = MessageBox.Show(this, - "Version " + Global.Config.Update_LatestVersion + " is now available. Would you like to open the BizHawk homepage?\r\n\r\nClick \"No\" to hide the update notification for this version.", - "New Version Available", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - GlobalWin.Sound.StartSound(); - - if (result == DialogResult.Yes) - { - System.Threading.ThreadPool.QueueUserWorkItem(s => - { - using (System.Diagnostics.Process.Start(VersionInfo.HomePage)) - { - } - }); - } - else if (result == DialogResult.No) - { - UpdateChecker.IgnoreNewVersion(); - UpdateChecker.BeginCheck(skipCheck: true); // Trigger event to hide new version notification - } - } - - #endregion - - #region Form Events - - private void MainForm_Activated(object sender, EventArgs e) - { - if (!Global.Config.RunInBackground) - { - if (!_wasPaused) - { - UnpauseEmulator(); - } - - _wasPaused = false; - } - } - - private void MainForm_Deactivate(object sender, EventArgs e) - { - if (!Global.Config.RunInBackground) - { - if (EmulatorPaused) - { - _wasPaused = true; - } - - PauseEmulator(); - } - } - - private void TimerMouseIdle_Tick(object sender, EventArgs e) - { - if (_inFullscreen && Global.Config.DispChrome_Fullscreen_AutohideMouse) - { - AutohideCursor(true); - } - } - - private void MainForm_Enter(object sender, EventArgs e) - { - AutohideCursor(false); - } - - public void MainForm_MouseWheel(object sender, MouseEventArgs e) - { - MouseWheelTracker += e.Delta; - } - - public void MainForm_MouseMove(object sender, MouseEventArgs e) - { - AutohideCursor(false); - } - - public void MainForm_MouseClick(object sender, MouseEventArgs e) - { - AutohideCursor(false); - if (Global.Config.ShowContextMenu && e.Button == MouseButtons.Right) - { - MainFormContextMenu.Show( - PointToScreen(new Point(e.X, e.Y + MainformMenu.Height))); - } - } - - private void MainForm_Resize(object sender, EventArgs e) - { - PresentationPanel.Resized = true; - } - - private void MainForm_Shown(object sender, EventArgs e) - { - HandlePlatformMenus(); - } - - protected override void OnClosed(EventArgs e) - { - _windowClosedAndSafeToExitProcess = true; - base.OnClosed(e); - } - - private void MainformMenu_Leave(object sender, EventArgs e) - { - } - - private void MainformMenu_MenuActivate(object sender, EventArgs e) - { - HandlePlatformMenus(); - if (Global.Config.PauseWhenMenuActivated) - { - _wasPaused = EmulatorPaused; - _didMenuPause = true; - PauseEmulator(); - } - } - - private void MainformMenu_MenuDeactivate(object sender, EventArgs e) - { - if (!_wasPaused) - { - UnpauseEmulator(); - } - } - - private static void FormDragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void FormDragDrop(object sender, DragEventArgs e) - { - try - { - FormDragDrop_Internal(sender, e); - } - catch (Exception ex) - { - MessageBox.Show("Exception on drag and drop:\n" + ex); - } - } - - private void FormDragDrop_Internal(object sender, DragEventArgs e) - { - _FormDragDrop_internal(sender, e); -/* - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - var isLua = false; - foreach (var path in filePaths) - { - var extension = Path.GetExtension(path); - if (extension != null && extension.ToUpper() == ".LUA") - { - OpenLuaConsole(); - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LoadLuaFile(path); - } - isLua = true; - } - } - if (isLua) - { - return; - } - - var ext = Path.GetExtension(filePaths[0]) ?? ""; - if (ext.ToUpper() == ".LUASES") - { - OpenLuaConsole(); - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LoadLuaSession(filePaths[0]); - } - } - else if (MovieService.IsValidMovieExtension(ext)) - { - if (Emulator.IsNull()) - { - OpenRom(); - } - - if (Emulator.IsNull()) - { - return; - } - - StartNewMovie(MovieService.Get(filePaths[0]), false); - } - else if (ext.ToUpper() == ".STATE") - { - LoadState(filePaths[0], Path.GetFileName(filePaths[0])); - } - else if (ext.ToUpper() == ".CHT") - { - Global.CheatList.Load(filePaths[0], false); - GlobalWin.Tools.Load(); - } - else if (ext.ToUpper() == ".WCH") - { - GlobalWin.Tools.LoadRamWatch(true); - (GlobalWin.Tools.Get() as RamWatch).LoadWatchFile(new FileInfo(filePaths[0]), false); - } - - else if (ext.ToUpper() == ".CDL" && Emulator is PCEngine) - { - GlobalWin.Tools.Load(); - (GlobalWin.Tools.Get() as CDL).LoadFile(filePaths[0]); - } - - else if (MovieImport.IsValidMovieExtension(Path.GetExtension(filePaths[0]))) - { - if (Emulator.IsNull()) - { - OpenRom(); - } - - if (Emulator.IsNull()) - { - return; - } - - // tries to open a legacy movie format by importing it - string errorMsg; - string warningMsg; - var movie = MovieImport.ImportFile(filePaths[0], out errorMsg, out warningMsg); - if (!string.IsNullOrEmpty(errorMsg)) - { - MessageBox.Show(errorMsg, "Conversion error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - // fix movie extension to something palatable for these purposes. - // for instance, something which doesnt clobber movies you already may have had. - // i'm evenly torn between this, and a file in %TEMP%, but since we dont really have a way to clean up this tempfile, i choose this: - StartNewMovie(movie, false); - } - - GlobalWin.OSD.AddMessage(warningMsg); - } - else - { - var args = new LoadRomArgs(); - args.OpenAdvanced = new OpenAdvanced_OpenRom { Path = filePaths[0] }; - LoadRom(filePaths[0], args); - } - */ - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs b/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs deleted file mode 100644 index bc3bb76302..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs +++ /dev/null @@ -1,707 +0,0 @@ -using System.Linq; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; - -namespace BizHawk.Client.EmuHawk -{ - public partial class MainForm - { - private bool CheckHotkey(string trigger) - { - switch (trigger) - { - default: - return false; - - // General - case "Pause": - TogglePause(); - break; - case "Toggle Throttle": - _unthrottled ^= true; - ThrottleMessage(); - break; - case "Soft Reset": - SoftReset(); - break; - case "Hard Reset": - HardReset(); - break; - case "Quick Load": - LoadQuickSave("QuickSave" + Global.Config.SaveSlot); - break; - case "Quick Save": - SaveQuickSave("QuickSave" + Global.Config.SaveSlot); - break; - case "Clear Autohold": - ClearAutohold(); - break; - case "Screenshot": - TakeScreenshot(); - break; - case "Screen Raw to Clipboard": - // Ctrl+C clash. any tool that has such acc must check this. - // maybe check if mainform has focus instead? - if (GlobalWin.Tools.IsLoaded() && GlobalWin.Tools.Get().ContainsFocus) - { - break; - } - - TakeScreenshotToClipboard(); - break; - case "Screen Client to Clipboard": - TakeScreenshotClientToClipboard(); - break; - case "Full Screen": - ToggleFullscreen(); - break; - case "Open ROM": - OpenRom(); - break; - case "Close ROM": - CloseRom(); - break; - case "Load Last ROM": - LoadRomFromRecent(Global.Config.RecentRoms.MostRecent); - break; - case "Flush SaveRAM": - FlushSaveRAM(); - break; - case "Display FPS": - ToggleFps(); - break; - case "Frame Counter": - ToggleFrameCounter(); - break; - case "Lag Counter": - if (Emulator.CanPollInput()) - { - ToggleLagCounter(); - } - - break; - case "Input Display": - ToggleInputDisplay(); - break; - case "Toggle BG Input": - ToggleBackgroundInput(); - break; - case "Toggle Menu": - MainMenuStrip.Visible ^= true; - break; - case "Volume Up": - VolumeUp(); - break; - case "Volume Down": - VolumeDown(); - break; - case "Toggle Sound": - ToggleSound(); - break; - case "Exit Program": - _exitRequestPending = true; - break; - case "Record A/V": - RecordAv(); - break; - case "Stop A/V": - StopAv(); - break; - case "Larger Window": - IncreaseWindowSize(); - break; - case "Smaller Window": - DecreaseWindowSize(); - break; - case "Increase Speed": - IncreaseSpeed(); - break; - case "Decrease Speed": - DecreaseSpeed(); - break; - case "Reboot Core": - RebootCore(); - break; - case "Toggle Skip Lag Frame": - Global.Config.SkipLagFrame ^= true; - GlobalWin.OSD.AddMessage("Skip Lag Frames toggled " + (Global.Config.SkipLagFrame ? "On" : "Off")); - break; - case "Toggle Key Priority": - ToggleKeyPriority(); - break; - - // Save States - case "Save State 0": - SaveQuickSave("QuickSave0"); - Global.Config.SaveSlot = 0; - UpdateStatusSlots(); - break; - case "Save State 1": - SaveQuickSave("QuickSave1"); - Global.Config.SaveSlot = 1; - UpdateStatusSlots(); - break; - case "Save State 2": - SaveQuickSave("QuickSave2"); - Global.Config.SaveSlot = 2; - UpdateStatusSlots(); - break; - case "Save State 3": - SaveQuickSave("QuickSave3"); - Global.Config.SaveSlot = 3; - UpdateStatusSlots(); - break; - case "Save State 4": - SaveQuickSave("QuickSave4"); - Global.Config.SaveSlot = 4; - UpdateStatusSlots(); - break; - case "Save State 5": - SaveQuickSave("QuickSave5"); - Global.Config.SaveSlot = 5; - UpdateStatusSlots(); - break; - case "Save State 6": - SaveQuickSave("QuickSave6"); - Global.Config.SaveSlot = 6; - UpdateStatusSlots(); - break; - case "Save State 7": - SaveQuickSave("QuickSave7"); - Global.Config.SaveSlot = 7; - UpdateStatusSlots(); - break; - case "Save State 8": - SaveQuickSave("QuickSave8"); - Global.Config.SaveSlot = 8; - UpdateStatusSlots(); - break; - case "Save State 9": - SaveQuickSave("QuickSave9"); - Global.Config.SaveSlot = 9; - UpdateStatusSlots(); - break; - case "Load State 0": - LoadQuickSave("QuickSave0"); - Global.Config.SaveSlot = 0; - UpdateStatusSlots(); - break; - case "Load State 1": - LoadQuickSave("QuickSave1"); - Global.Config.SaveSlot = 1; - UpdateStatusSlots(); - break; - case "Load State 2": - LoadQuickSave("QuickSave2"); - Global.Config.SaveSlot = 2; - UpdateStatusSlots(); - break; - case "Load State 3": - LoadQuickSave("QuickSave3"); - Global.Config.SaveSlot = 3; - UpdateStatusSlots(); - break; - case "Load State 4": - LoadQuickSave("QuickSave4"); - Global.Config.SaveSlot = 4; - UpdateStatusSlots(); - break; - case "Load State 5": - LoadQuickSave("QuickSave5"); - Global.Config.SaveSlot = 5; - UpdateStatusSlots(); - break; - case "Load State 6": - LoadQuickSave("QuickSave6"); - Global.Config.SaveSlot = 6; - UpdateStatusSlots(); - break; - case "Load State 7": - LoadQuickSave("QuickSave7"); - Global.Config.SaveSlot = 7; - UpdateStatusSlots(); - break; - case "Load State 8": - LoadQuickSave("QuickSave8"); - Global.Config.SaveSlot = 8; - UpdateStatusSlots(); - break; - case "Load State 9": - LoadQuickSave("QuickSave9"); - Global.Config.SaveSlot = 9; - UpdateStatusSlots(); - break; - - case "Select State 0": - SelectSlot(0); - break; - case "Select State 1": - SelectSlot(1); - break; - case "Select State 2": - SelectSlot(2); - break; - case "Select State 3": - SelectSlot(3); - break; - case "Select State 4": - SelectSlot(4); - break; - case "Select State 5": - SelectSlot(5); - break; - case "Select State 6": - SelectSlot(6); - break; - case "Select State 7": - SelectSlot(7); - break; - case "Select State 8": - SelectSlot(8); - break; - case "Select State 9": - SelectSlot(9); - break; - case "Save Named State": - SaveStateAs(); - break; - case "Load Named State": - LoadStateAs(); - break; - case "Previous Slot": - PreviousSlot(); - break; - case "Next Slot": - NextSlot(); - break; - - // Movie - case "Toggle read-only": - ToggleReadOnly(); - break; - case "Play Movie": - PlayMovieMenuItem_Click(null, null); - break; - case "Record Movie": - RecordMovieMenuItem_Click(null, null); - break; - case "Stop Movie": - StopMovie(); - break; - case "Play from beginning": - RestartMovie(); - break; - case "Save Movie": - SaveMovie(); - break; - case "Toggle MultiTrack": - Global.MovieSession.ToggleMultitrack(); - break; - case "MT Select All": - Global.MovieSession.MultiTrack.SelectAll(); - break; - case "MT Select None": - Global.MovieSession.MultiTrack.SelectNone(); - break; - case "MT Increment Player": - Global.MovieSession.MultiTrack.Increment(); - break; - case "MT Decrement Player": - Global.MovieSession.MultiTrack.Decrement(); - break; - case "Movie Poke": - ToggleModePokeMode(); - break; - - // Tools - case "RAM Watch": - GlobalWin.Tools.LoadRamWatch(true); - break; - case "RAM Search": - GlobalWin.Tools.Load(); - break; - case "Hex Editor": - GlobalWin.Tools.Load(); - break; - case "Trace Logger": - GlobalWin.Tools.Load(); - break; - case "Lua Console": - OpenLuaConsole(); - break; - case "Cheats": - GlobalWin.Tools.Load(); - break; - case "Toggle All Cheats": - if (Global.CheatList.Any()) - { - string type = " (mixed)"; - if (Global.CheatList.All(c => c.Enabled)) - { - type = " (off)"; - } - else if (Global.CheatList.All(c => !c.Enabled)) - { - type = " (on)"; - } - - Global.CheatList.ToList().ForEach(x => x.Toggle()); - GlobalWin.OSD.AddMessage("Cheats toggled" + type); - } - - break; - case "TAStudio": - GlobalWin.Tools.Load(); - break; - case "ToolBox": - GlobalWin.Tools.Load(); - break; - case "Virtual Pad": - GlobalWin.Tools.Load(); - break; - - // RAM Search - case "Do Search": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.DoSearch(); - } - else - { - return false; - } - - break; - case "New Search": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.NewSearch(); - } - else - { - return false; - } - - break; - case "Previous Compare To": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.NextCompareTo(reverse: true); - } - else - { - return false; - } - - break; - case "Next Compare To": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.NextCompareTo(); - } - else - { - return false; - } - - break; - case "Previous Operator": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.NextOperator(reverse: true); - } - else - { - return false; - } - - break; - case "Next Operator": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.RamSearch.NextOperator(); - } - else - { - return false; - } - - break; - - // TAStudio - case "Add Branch": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AddBranchExternal(); - } - else - { - return false; - } - - break; - case "Delete Branch": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.RemoveBranchExtrenal(); - } - else - { - return false; - } - - break; - case "Show Cursor": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.SetVisibleIndex(); - GlobalWin.Tools.TAStudio.RefreshDialog(); - } - else - { - return false; - } - - break; - case "Toggle Follow Cursor": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.TasPlaybackBox.FollowCursor ^= true; - } - else - { - return false; - } - - break; - case "Toggle Auto-Restore": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.TasPlaybackBox.AutoRestore ^= true; - } - else - { - return false; - } - - break; - case "Toggle Turbo Seek": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.TasPlaybackBox.TurboSeek ^= true; - } - else - { - return false; - } - - break; - case "Clear Frames": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.ClearFramesExternal(); - } - else - { - return false; - } - - break; - case "Insert Frame": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.InsertFrameExternal(); - } - else - { - return false; - } - - break; - case "Delete Frames": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.DeleteFramesExternal(); - } - else - { - return false; - } - - break; - case "Clone Frames": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.CloneFramesExternal(); - } - else - { - return false; - } - - break; - case "Analog Increment": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogIncrementByOne(); - } - else - { - return false; - } - - break; - case "Analog Decrement": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogDecrementByOne(); - } - else - { - return false; - } - - break; - case "Analog Incr. by 10": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogIncrementByTen(); - } - else - { - return false; - } - - break; - case "Analog Decr. by 10": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogDecrementByTen(); - } - else - { - return false; - } - - break; - case "Analog Maximum": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogMax(); - } - else - { - return false; - } - - break; - case "Analog Minimum": - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.AnalogMin(); - } - else - { - return false; - } - - break; - - // SNES - case "Toggle BG 1": - SNES_ToggleBg(1); - break; - case "Toggle BG 2": - SNES_ToggleBg(2); - break; - case "Toggle BG 3": - SNES_ToggleBg(3); - break; - case "Toggle BG 4": - SNES_ToggleBg(4); - break; - case "Toggle OBJ 1": - SNES_ToggleObj(1); - break; - case "Toggle OBJ 2": - SNES_ToggleObj(2); - break; - case "Toggle OBJ 3": - SNES_ToggleObj(3); - break; - case "Toggle OBJ 4": - SNES_ToggleObj(4); - break; - - // GB - case "GB Toggle BG": - if (Emulator is Gameboy) - { - var s = ((Gameboy)Emulator).GetSettings(); - s.DisplayBG ^= true; - ((Gameboy)Emulator).PutSettings(s); - GlobalWin.OSD.AddMessage("BG toggled " + (s.DisplayBG ? "on" : "off")); - } - - break; - case "GB Toggle Obj": - if (Emulator is Gameboy) - { - var s = ((Gameboy)Emulator).GetSettings(); - s.DisplayOBJ ^= true; - ((Gameboy)Emulator).PutSettings(s); - GlobalWin.OSD.AddMessage("OBJ toggled " + (s.DisplayBG ? "on" : "off")); - } - - break; - - // Analog - case "Y Up Small": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(null, Global.Config.Analog_SmallChange); - break; - case "Y Up Large": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(null, Global.Config.Analog_LargeChange); - break; - case "Y Down Small": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(null, -Global.Config.Analog_SmallChange); - break; - case "Y Down Large": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(null, -Global.Config.Analog_LargeChange); - break; - case "X Up Small": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(Global.Config.Analog_SmallChange, null); - break; - case "X Up Large": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(Global.Config.Analog_LargeChange, null); - break; - case "X Down Small": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(-Global.Config.Analog_SmallChange, null); - break; - case "X Down Large": - GlobalWin.Tools.VirtualPad.BumpAnalogValue(-Global.Config.Analog_LargeChange, null); - break; - } - - return true; - } - - // Determines if the value is a hotkey that would be handled outside of the CheckHotkey method - private bool IsInternalHotkey(string trigger) - { - switch (trigger) - { - default: - return false; - case "Autohold": - case "Autofire": - case "Frame Advance": - case "Turbo": - case "Rewind": - case "Fast Forward": - return true; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.Movie.cs b/BizHawk.Client.EmuHawk/MainForm.Movie.cs deleted file mode 100644 index e8838d9d46..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.Movie.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.IO; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; -using BizHawk.Emulation.Cores.Nintendo.SNES; - -namespace BizHawk.Client.EmuHawk -{ - partial class MainForm - { - public void StartNewMovie(string path, bool record) - { - StartNewMovie(MovieService.Get(Global.Config.RecentMovies.MostRecent), false); - } - - public bool StartNewMovie(IMovie movie, bool record) - { - // SuuperW: Check changes. adelikat: this could break bk2 movies - // TODO: Clean up the saving process - if (movie.IsActive && (movie.Changes || !(movie is TasMovie))) - { - movie.Save(); - } - - try - { - var tasmovie = (movie as TasMovie); - if (tasmovie != null) - tasmovie.TasStateManager.MountWriteAccess(); - Global.MovieSession.QueueNewMovie(movie, record, Emulator); - } - catch (MoviePlatformMismatchException ex) - { - MessageBox.Show(new Form(){TopMost = true}, ex.Message, "Movie/Platform Mismatch", MessageBoxButtons.OK, MessageBoxIcon.Error); - return false; - } - - RebootCore(); - - if (Global.MovieSession.PreviousNES_InQuickNES.HasValue) - { - Global.Config.NES_InQuickNES = Global.MovieSession.PreviousNES_InQuickNES.Value; - Global.MovieSession.PreviousNES_InQuickNES = null; - } - - if (Global.MovieSession.PreviousSNES_InSnes9x.HasValue) - { - Global.Config.SNES_InSnes9x = Global.MovieSession.PreviousSNES_InSnes9x.Value; - Global.MovieSession.PreviousSNES_InSnes9x = null; - } - - if (Global.MovieSession.PreviousGBA_UsemGBA.HasValue) - { - Global.Config.GBA_UsemGBA = Global.MovieSession.PreviousGBA_UsemGBA.Value; - Global.MovieSession.PreviousGBA_UsemGBA = null; - } - - Global.Config.RecentMovies.Add(movie.Filename); - - if (Emulator.HasSavestates() && movie.StartsFromSavestate) - { - if (movie.TextSavestate != null) - { - Emulator.AsStatable().LoadStateText(new StringReader(movie.TextSavestate)); - } - else - { - Emulator.AsStatable().LoadStateBinary(new BinaryReader(new MemoryStream(movie.BinarySavestate, false))); - } - - if (movie.SavestateFramebuffer != null && Emulator.HasVideoProvider()) - { - var b1 = movie.SavestateFramebuffer; - var b2 = Emulator.AsVideoProvider().GetVideoBuffer(); - int len = Math.Min(b1.Length, b2.Length); - for (int i = 0; i < len; i++) - { - b2[i] = b1[i]; - } - } - - Emulator.ResetCounters(); - } - else if (Emulator.HasSaveRam() && movie.StartsFromSaveRam) - { - Emulator.AsSaveRam().StoreSaveRam(movie.SaveRam); - } - - Global.MovieSession.RunQueuedMovie(record); - - SetMainformMovieInfo(); - - GlobalWin.Tools.Restart(); - - - if (Global.MovieSession.Movie.Hash != Global.Game.Hash) - { - GlobalWin.OSD.AddMessage("Warning: Movie hash does not match the ROM"); - } - - return true; - } - - public void SetMainformMovieInfo() - { - if (Global.MovieSession.Movie.IsPlaying) - { - PlayRecordStatusButton.Image = Properties.Resources.Play; - PlayRecordStatusButton.ToolTipText = "Movie is in playback mode"; - PlayRecordStatusButton.Visible = true; - } - else if (Global.MovieSession.Movie.IsRecording) - { - PlayRecordStatusButton.Image = Properties.Resources.RecordHS; - PlayRecordStatusButton.ToolTipText = "Movie is in record mode"; - PlayRecordStatusButton.Visible = true; - } - else if (!Global.MovieSession.Movie.IsActive) - { - PlayRecordStatusButton.Image = Properties.Resources.Blank; - PlayRecordStatusButton.ToolTipText = "No movie is active"; - PlayRecordStatusButton.Visible = false; - } - - SetWindowText(); - UpdateStatusSlots(); - } - - public void RestartMovie() - { - if (IsSlave && Master.WantsToControlRestartMovie) - { - Master.RestartMovie(); - } - else - { - if (Global.MovieSession.Movie.IsActive) - { - StartNewMovie(Global.MovieSession.Movie, false); - GlobalWin.OSD.AddMessage("Replaying movie file in read-only mode"); - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs deleted file mode 100644 index 5a5e61c9e6..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ /dev/null @@ -1,4510 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Windows.Forms; - -using BizHawk.Common; -using BizHawk.Common.BufferExtensions; -using BizHawk.Common.IOExtensions; - -using BizHawk.Client.Common; -using BizHawk.Bizware.BizwareGL; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Calculators; -using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; -using BizHawk.Emulation.Cores.Nintendo.GBA; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Nintendo.N64; -using BizHawk.Emulation.Cores.Nintendo.GBHawkLink; - -using BizHawk.Client.EmuHawk.WinFormExtensions; -using BizHawk.Client.EmuHawk.ToolExtensions; -using BizHawk.Client.EmuHawk.CoreExtensions; -using BizHawk.Client.ApiHawk; -using BizHawk.Emulation.Common.Base_Implementations; -using BizHawk.Emulation.Cores.Nintendo.SNES9X; -using BizHawk.Emulation.Cores.Consoles.SNK; -using BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive; -using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; - -namespace BizHawk.Client.EmuHawk -{ - public partial class MainForm : Form - { - #region Constructors and Initialization, and Tear down - - private void MainForm_Load(object sender, EventArgs e) - { - SetWindowText(); - - // Hide Status bar icons and general statusbar prep - MainStatusBar.Padding = new Padding(MainStatusBar.Padding.Left, MainStatusBar.Padding.Top, MainStatusBar.Padding.Left, MainStatusBar.Padding.Bottom); // Workaround to remove extra padding on right - PlayRecordStatusButton.Visible = false; - AVIStatusLabel.Visible = false; - SetPauseStatusbarIcon(); - ToolFormBase.UpdateCheatRelatedTools(null, null); - RebootStatusBarIcon.Visible = false; - UpdateNotification.Visible = false; - _statusBarDiskLightOnImage = Properties.Resources.LightOn; - _statusBarDiskLightOffImage = Properties.Resources.LightOff; - _linkCableOn = Properties.Resources.connect_16x16; - _linkCableOff = Properties.Resources.noconnect_16x16; - UpdateCoreStatusBarButton(); - if (Global.Config.FirstBoot) - { - ProfileFirstBootLabel.Visible = true; - } - - HandleToggleLightAndLink(); - SetStatusBar(); - - // New version notification - UpdateChecker.CheckComplete += (s2, e2) => - { - if (IsDisposed) - { - return; - } - - this.BeginInvoke(() => { UpdateNotification.Visible = UpdateChecker.IsNewVersionAvailable; }); - }; - UpdateChecker.BeginCheck(); // Won't actually check unless enabled by user - } - - static MainForm() - { - // If this isnt here, then our assemblyresolving hacks wont work due to the check for MainForm.INTERIM - // its.. weird. dont ask. - } - - private CoreComm CreateCoreComm() - { - CoreComm ret = new CoreComm(ShowMessageCoreComm, NotifyCoreComm) - { - ReleaseGLContext = o => GlobalWin.GLManager.ReleaseGLContext(o), - RequestGLContext = (major, minor, forward) => GlobalWin.GLManager.CreateGLContext(major, minor, forward), - ActivateGLContext = gl => GlobalWin.GLManager.Activate((GLManager.ContextRef)gl), - DeactivateGLContext = () => GlobalWin.GLManager.Deactivate() - }; - return ret; - } - - public MainForm(string[] args) - { - GlobalWin.MainForm = this; - Global.Rewinder = new Rewinder - { - MessageCallback = GlobalWin.OSD.AddMessage - }; - - Global.ControllerInputCoalescer = new ControllerInputCoalescer(); - Global.FirmwareManager = new FirmwareManager(); - Global.MovieSession = new MovieSession - { - Movie = MovieService.DefaultInstance, - MovieControllerAdapter = MovieService.DefaultInstance.LogGeneratorInstance().MovieControllerAdapter, - MessageCallback = GlobalWin.OSD.AddMessage, - AskYesNoCallback = StateErrorAskUser, - PauseCallback = PauseEmulator, - ModeChangedCallback = SetMainformMovieInfo - }; - - Icon = Properties.Resources.logo; - InitializeComponent(); - Global.Game = GameInfo.NullInstance; - if (Global.Config.ShowLogWindow) - { - LogConsole.ShowConsole(); - DisplayLogWindowMenuItem.Checked = true; - } - - _throttle = new Throttle(); - - Global.CheatList = new CheatCollection(); - Global.CheatList.Changed += ToolFormBase.UpdateCheatRelatedTools; - - UpdateStatusSlots(); - UpdateKeyPriorityIcon(); - - // In order to allow late construction of this database, we hook up a delegate here to dearchive the data and provide it on demand - // we could background thread this later instead if we wanted to be real clever - NES.BootGodDB.GetDatabaseBytes = () => - { - string xmlPath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "NesCarts.xml"); - string x7zPath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "NesCarts.7z"); - bool loadXml = File.Exists(xmlPath); - using (var nesCartFile = new HawkFile(loadXml ? xmlPath : x7zPath)) - { - if (!loadXml) - { - nesCartFile.BindFirst(); - } - - return nesCartFile - .GetStream() - .ReadAllBytes(); - } - }; - - argParser.ParseArguments(args); - - Database.LoadDatabase(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb.txt")); - - // TODO GL - a lot of disorganized wiring-up here - CGC.CGCBinPath = Path.Combine(PathManager.GetDllDirectory(), "cgc.exe"); - PresentationPanel = new PresentationPanel(); - PresentationPanel.GraphicsControl.MainWindow = true; - GlobalWin.DisplayManager = new DisplayManager(PresentationPanel); - Controls.Add(PresentationPanel); - Controls.SetChildIndex(PresentationPanel, 0); - - // TODO GL - move these event handlers somewhere less obnoxious line in the On* overrides - Load += (o, e) => - { - AllowDrop = true; - DragEnter += FormDragEnter; - DragDrop += FormDragDrop; - }; - - Closing += (o, e) => - { - if (GlobalWin.Tools.AskSave()) - { - // zero 03-nov-2015 - close game after other steps. tools might need to unhook themselves from a core. - Global.MovieSession.Movie.Stop(); - GlobalWin.Tools.Close(); - CloseGame(); - - // does this need to be last for any particular reason? do tool dialogs persist settings when closing? - SaveConfig(); - } - else - { - e.Cancel = true; - } - }; - - ResizeBegin += (o, e) => - { - _inResizeLoop = true; - if (GlobalWin.Sound != null) - { - GlobalWin.Sound.StopSound(); - } - }; - - Resize += (o, e) => - { - SetWindowText(); - }; - - ResizeEnd += (o, e) => - { - _inResizeLoop = false; - SetWindowText(); - - if (PresentationPanel != null) - { - PresentationPanel.Resized = true; - } - - if (GlobalWin.Sound != null) - { - GlobalWin.Sound.StartSound(); - } - }; - - Input.Initialize(); - InitControls(); - - var comm = CreateCoreComm(); - CoreFileProvider.SyncCoreCommInputSignals(comm); - Emulator = new NullEmulator(comm, Global.Config.GetCoreSettings()); - Global.ActiveController = new Controller(NullController.Instance.Definition); - Global.AutoFireController = _autofireNullControls; - Global.AutofireStickyXORAdapter.SetOnOffPatternFromConfig(); - try - { - GlobalWin.Sound = new Sound(Handle); - } - catch - { - string message = "Couldn't initialize sound device! Try changing the output method in Sound config."; - if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound) - { - message = "Couldn't initialize DirectSound! Things may go poorly for you. Try changing your sound driver to 44.1khz instead of 48khz in mmsys.cpl."; - } - - MessageBox.Show(message, "Initialization Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - - Global.Config.SoundOutputMethod = Config.ESoundOutputMethod.Dummy; - GlobalWin.Sound = new Sound(Handle); - } - - GlobalWin.Sound.StartSound(); - InputManager.RewireInputChain(); - GlobalWin.Tools = new ToolManager(this); - RewireSound(); - - // Workaround for windows, location is -32000 when minimized, if they close it during this time, that's what gets saved - if (Global.Config.MainWndx == -32000) - { - Global.Config.MainWndx = 0; - } - - if (Global.Config.MainWndy == -32000) - { - Global.Config.MainWndy = 0; - } - - if (Global.Config.MainWndx != -1 && Global.Config.MainWndy != -1 && Global.Config.SaveWindowPosition) - { - Location = new Point(Global.Config.MainWndx, Global.Config.MainWndy); - } - - if (argParser.cmdRom != null) - { - // Commandline should always override auto-load - var ioa = OpenAdvancedSerializer.ParseWithLegacy(argParser.cmdRom); - LoadRom(argParser.cmdRom, new LoadRomArgs { OpenAdvanced = ioa }); - if (Global.Game == null) - { - MessageBox.Show("Failed to load " + argParser.cmdRom + " specified on commandline"); - } - } - else if (Global.Config.RecentRoms.AutoLoad && !Global.Config.RecentRoms.Empty) - { - LoadRomFromRecent(Global.Config.RecentRoms.MostRecent); - } - - if (argParser.cmdMovie != null) - { - _supressSyncSettingsWarning = true; // We dont' want to be nagged if we are attempting to automate - if (Global.Game == null) - { - OpenRom(); - } - - // If user picked a game, then do the commandline logic - if (!Global.Game.IsNullInstance) - { - var movie = MovieService.Get(argParser.cmdMovie); - Global.MovieSession.ReadOnly = true; - - // if user is dumping and didnt supply dump length, make it as long as the loaded movie - if (argParser._autoDumpLength == 0) - { - argParser._autoDumpLength = movie.InputLogLength; - } - - // Copy pasta from drag & drop - if (MovieImport.IsValidMovieExtension(Path.GetExtension(argParser.cmdMovie))) - { - string errorMsg; - string warningMsg; - var imported = MovieImport.ImportFile(argParser.cmdMovie, out errorMsg, out warningMsg); - if (!string.IsNullOrEmpty(errorMsg)) - { - MessageBox.Show(errorMsg, "Conversion error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - // fix movie extension to something palatable for these purposes. - // for instance, something which doesnt clobber movies you already may have had. - // i'm evenly torn between this, and a file in %TEMP%, but since we dont really have a way to clean up this tempfile, i choose this: - StartNewMovie(imported, false); - } - - GlobalWin.OSD.AddMessage(warningMsg); - } - else - { - StartNewMovie(movie, false); - Global.Config.RecentMovies.Add(argParser.cmdMovie); - } - - _supressSyncSettingsWarning = false; - } - } - else if (Global.Config.RecentMovies.AutoLoad && !Global.Config.RecentMovies.Empty) - { - if (Global.Game.IsNullInstance) - { - OpenRom(); - } - - // If user picked a game, then do the autoload logic - if (!Global.Game.IsNullInstance) - { - if (File.Exists(Global.Config.RecentMovies.MostRecent)) - { - StartNewMovie(MovieService.Get(Global.Config.RecentMovies.MostRecent), false); - } - else - { - Global.Config.RecentMovies.HandleLoadError(Global.Config.RecentMovies.MostRecent); - } - } - } - - if (argParser.startFullscreen || Global.Config.StartFullscreen) - { - _needsFullscreenOnLoad = true; - } - - if (!Global.Game.IsNullInstance) - { - if (argParser.cmdLoadState != null) - { - LoadState(argParser.cmdLoadState, Path.GetFileName(argParser.cmdLoadState)); - } - else if (argParser.cmdLoadSlot != null) - { - LoadQuickSave("QuickSave" + argParser.cmdLoadSlot); - } - else if (Global.Config.AutoLoadLastSaveSlot) - { - LoadQuickSave("QuickSave" + Global.Config.SaveSlot); - } - } - - //start Lua Console if requested in the command line arguments - if (argParser.luaConsole) - { - GlobalWin.Tools.Load(); - } - //load Lua Script if requested in the command line arguments - if (argParser.luaScript != null) - { - GlobalWin.Tools.LuaConsole.LoadLuaFile(argParser.luaScript); - } - - GlobalWin.Tools.AutoLoad(); - - if (Global.Config.RecentWatches.AutoLoad) - { - GlobalWin.Tools.LoadRamWatch(!Global.Config.DisplayRamWatch); - } - - if (Global.Config.RecentCheats.AutoLoad) - { - GlobalWin.Tools.Load(); - } - - SetStatusBar(); - - if (Global.Config.StartPaused) - { - PauseEmulator(); - } - - // start dumping, if appropriate - if (argParser.cmdDumpType != null && argParser.cmdDumpName != null) - { - RecordAv(argParser.cmdDumpType, argParser.cmdDumpName); - } - - SetMainformMovieInfo(); - - SynchChrome(); - - PresentationPanel.Control.Paint += (o, e) => - { - // I would like to trigger a repaint here, but this isnt done yet - }; - } - - private readonly bool _supressSyncSettingsWarning; - - public int ProgramRunLoop() - { - CheckMessages(); // can someone leave a note about why this is needed? - LogConsole.PositionConsole(); - - // needs to be done late, after the log console snaps on top - // fullscreen should snap on top even harder! - if (_needsFullscreenOnLoad) - { - _needsFullscreenOnLoad = false; - ToggleFullscreen(); - } - - // incantation required to get the program reliably on top of the console window - // we might want it in ToggleFullscreen later, but here, it needs to happen regardless - BringToFront(); - Activate(); - BringToFront(); - - InitializeFpsData(); - - for (;;) - { - Input.Instance.Update(); - - // handle events and dispatch as a hotkey action, or a hotkey button, or an input button - ProcessInput(); - Global.ClientControls.LatchFromPhysical(_hotkeyCoalescer); - - Global.ActiveController.LatchFromPhysical(Global.ControllerInputCoalescer); - - Global.ActiveController.ApplyAxisConstraints( - (Emulator is N64 && Global.Config.N64UseCircularAnalogConstraint) ? "Natural Circle" : null); - - Global.ActiveController.OR_FromLogical(Global.ClickyVirtualPadController); - Global.AutoFireController.LatchFromPhysical(Global.ControllerInputCoalescer); - - if (Global.ClientControls["Autohold"]) - { - Global.StickyXORAdapter.MassToggleStickyState(Global.ActiveController.PressedButtons); - Global.AutofireStickyXORAdapter.MassToggleStickyState(Global.AutoFireController.PressedButtons); - } - else if (Global.ClientControls["Autofire"]) - { - Global.AutofireStickyXORAdapter.MassToggleStickyState(Global.ActiveController.PressedButtons); - } - - // autohold/autofire must not be affected by the following inputs - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - - if (GlobalWin.Tools.Has() && !SuppressLua) - { - GlobalWin.Tools.LuaConsole.ResumeScripts(false); - } - - StepRunLoop_Core(); - StepRunLoop_Throttle(); - - Render(); - - CheckMessages(); - - if (_exitRequestPending) - { - _exitRequestPending = false; - Close(); - } - - if (_windowClosedAndSafeToExitProcess) - { - break; - } - - if (Global.Config.DispSpeedupFeatures != 0) - { - Thread.Sleep(0); - } - } - - Shutdown(); - return _exitCode; - } - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - // NOTE: this gets called twice sometimes. once by using() in Program.cs and once from winforms internals when the form is closed... - if (GlobalWin.DisplayManager != null) - { - GlobalWin.DisplayManager.Dispose(); - GlobalWin.DisplayManager = null; - } - - if (disposing) - { - components?.Dispose(); - } - - base.Dispose(disposing); - } - - #endregion - - #region Pause - - private bool _emulatorPaused; - public bool EmulatorPaused - { - get - { - return _emulatorPaused; - } - - private set - { - if (_emulatorPaused && !value) // Unpausing - { - InitializeFpsData(); - } - - _emulatorPaused = value; - OnPauseChanged?.Invoke(this, new PauseChangedEventArgs(_emulatorPaused)); - } - } - - public delegate void PauseChangedEventHandler(object sender, PauseChangedEventArgs e); - public event PauseChangedEventHandler OnPauseChanged; - - public class PauseChangedEventArgs : EventArgs - { - public PauseChangedEventArgs(bool paused) - { - Paused = paused; - } - - public bool Paused { get; private set; } - } - - #endregion - - #region Properties - - public string CurrentlyOpenRom { get; private set; } // todo - delete me and use only args instead - public LoadRomArgs CurrentlyOpenRomArgs { get; private set; } - public bool PauseAvi { get; set; } - public bool PressFrameAdvance { get; set; } - public bool HoldFrameAdvance { get; set; } // necessary for tastudio > button - public bool PressRewind { get; set; } // necessary for tastudio < button - public bool FastForward { get; set; } - - // runloop won't exec lua - public bool SuppressLua { get; set; } - - public long MouseWheelTracker { get; private set; } - - private int? _pauseOnFrame; - public int? PauseOnFrame // If set, upon completion of this frame, the client wil pause - { - get - { - return _pauseOnFrame; - } - - set - { - _pauseOnFrame = value; - SetPauseStatusbarIcon(); - - if (value == null) // TODO: make an Event handler instead, but the logic here is that after turbo seeking, tools will want to do a real update when the emulator finally pauses - { - bool skipScripts = !(Global.Config.TurboSeek && !Global.Config.RunLuaDuringTurbo && !SuppressLua); - GlobalWin.Tools.UpdateToolsBefore(skipScripts); - GlobalWin.Tools.UpdateToolsAfter(skipScripts); - } - } - } - - public bool IsSeeking => PauseOnFrame.HasValue; - - private bool IsTurboSeeking => PauseOnFrame.HasValue && Global.Config.TurboSeek; - - public bool IsTurboing => Global.ClientControls["Turbo"] || IsTurboSeeking; - - #endregion - - #region Public Methods - - public void ClearHolds() - { - Global.StickyXORAdapter.ClearStickies(); - Global.AutofireStickyXORAdapter.ClearStickies(); - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.VirtualPad.ClearVirtualPadHolds(); - } - } - - public void FlagNeedsReboot() - { - RebootStatusBarIcon.Visible = true; - GlobalWin.OSD.AddMessage("Core reboot needed for this setting"); - } - - /// - /// Controls whether the app generates input events. should be turned off for most modal dialogs - /// - public bool AllowInput(bool yieldAlt) - { - // the main form gets input - if (ActiveForm == this) - { - return true; - } - - // even more special logic for TAStudio: - // TODO - implement by event filter in TAStudio - var maybeTAStudio = ActiveForm as TAStudio; - if (maybeTAStudio != null) - { - if (yieldAlt) - { - return false; - } - - if (maybeTAStudio.IsInMenuLoop) - { - return false; - } - } - - // modals that need to capture input for binding purposes get input, of course - if (ActiveForm is HotkeyConfig - || ActiveForm is ControllerConfig - || ActiveForm is TAStudio - || ActiveForm is VirtualpadTool) - { - return true; - } - - // if no form is active on this process, then the background input setting applies - if (ActiveForm == null && Global.Config.AcceptBackgroundInput) - { - return true; - } - - return false; - } - - // TODO: make this an actual property, set it when loading a Rom, and pass it dialogs, etc - // This is a quick hack to reduce the dependency on Global.Emulator - private IEmulator Emulator - { - get - { - return Global.Emulator; - } - - set - { - Global.Emulator = value; - _currentVideoProvider = Global.Emulator.AsVideoProviderOrDefault(); - _currentSoundProvider = Global.Emulator.AsSoundProviderOrDefault(); - } - } - - private IVideoProvider _currentVideoProvider = NullVideo.Instance; - - private ISoundProvider _currentSoundProvider = new NullSound(44100 / 60); // Reasonable default until we have a core instance - - protected override void OnActivated(EventArgs e) - { - base.OnActivated(e); - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, true); - } - - protected override void OnDeactivate(EventArgs e) - { - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, false); - base.OnDeactivate(e); - } - - private void ProcessInput() - { - ControllerInputCoalescer conInput = (ControllerInputCoalescer)Global.ControllerInputCoalescer; - - for (;;) - { - // loop through all available events - var ie = Input.Instance.DequeueEvent(); - if (ie == null) - { - break; - } - - // useful debugging: - // Console.WriteLine(ie); - - // TODO - wonder what happens if we pop up something interactive as a response to one of these hotkeys? may need to purge further processing - - // look for hotkey bindings for this key - var triggers = Global.ClientControls.SearchBindings(ie.LogicalButton.ToString()); - if (triggers.Count == 0) - { - // Maybe it is a system alt-key which hasnt been overridden - if (ie.EventType == Input.InputEventType.Press) - { - if (ie.LogicalButton.Alt && ie.LogicalButton.Button.Length == 1) - { - var c = ie.LogicalButton.Button.ToLower()[0]; - if ((c >= 'a' && c <= 'z') || c == ' ') - { - SendAltKeyChar(c); - } - } - - if (ie.LogicalButton.Alt && ie.LogicalButton.Button == "Space") - { - SendPlainAltKey(32); - } - } - - // ordinarily, an alt release with nothing else would move focus to the menubar. but that is sort of useless, and hard to implement exactly right. - } - - // zero 09-sep-2012 - all input is eligible for controller input. not sure why the above was done. - // maybe because it doesnt make sense to me to bind hotkeys and controller inputs to the same keystrokes - - // adelikat 02-dec-2012 - implemented options for how to handle controller vs hotkey conflicts. This is primarily motivated by computer emulation and thus controller being nearly the entire keyboard - bool handled; - switch (Global.Config.Input_Hotkey_OverrideOptions) - { - default: - case 0: // Both allowed - conInput.Receive(ie); - - handled = false; - if (ie.EventType == Input.InputEventType.Press) - { - handled = triggers.Aggregate(handled, (current, trigger) => current | CheckHotkey(trigger)); - } - - // hotkeys which arent handled as actions get coalesced as pollable virtual client buttons - if (!handled) - { - _hotkeyCoalescer.Receive(ie); - } - - break; - case 1: // Input overrides Hokeys - conInput.Receive(ie); - if (!Global.ActiveController.HasBinding(ie.LogicalButton.ToString())) - { - handled = false; - if (ie.EventType == Input.InputEventType.Press) - { - handled = triggers.Aggregate(handled, (current, trigger) => current | CheckHotkey(trigger)); - } - - // hotkeys which arent handled as actions get coalesced as pollable virtual client buttons - if (!handled) - { - _hotkeyCoalescer.Receive(ie); - } - } - - break; - case 2: // Hotkeys override Input - handled = false; - if (ie.EventType == Input.InputEventType.Press) - { - handled = triggers.Aggregate(handled, (current, trigger) => current | CheckHotkey(trigger)); - } - - // hotkeys which arent handled as actions get coalesced as pollable virtual client buttons - if (!handled) - { - _hotkeyCoalescer.Receive(ie); - - // Check for hotkeys that may not be handled through Checkhotkey() method, reject controller input mapped to these - if (!triggers.Any(IsInternalHotkey)) - { - conInput.Receive(ie); - } - } - - break; - } - } // foreach event - - // also handle floats - conInput.AcceptNewFloats(Input.Instance.GetFloats().Select(o => - { - // hackish - if (o.Item1 == "WMouse X") - { - var p = GlobalWin.DisplayManager.UntransformPoint(new Point((int)o.Item2, 0)); - float x = p.X / (float)_currentVideoProvider.BufferWidth; - return new Tuple("WMouse X", (x * 20000) - 10000); - } - - if (o.Item1 == "WMouse Y") - { - var p = GlobalWin.DisplayManager.UntransformPoint(new Point(0, (int)o.Item2)); - float y = p.Y / (float)_currentVideoProvider.BufferHeight; - return new Tuple("WMouse Y", (y * 20000) - 10000); - } - - return o; - })); - } - - public void RebootCore() - { - var ioa = OpenAdvancedSerializer.ParseWithLegacy(_currentlyOpenRomPoopForAdvancedLoaderPleaseRefactorMe); - if (ioa is OpenAdvanced_LibretroNoGame) - { - LoadRom("", CurrentlyOpenRomArgs); - } - else - { - LoadRom(ioa.SimplePath, CurrentlyOpenRomArgs); - } - } - - public void PauseEmulator() - { - EmulatorPaused = true; - SetPauseStatusbarIcon(); - } - - public void UnpauseEmulator() - { - EmulatorPaused = false; - SetPauseStatusbarIcon(); - } - - public void TogglePause() - { - EmulatorPaused ^= true; - SetPauseStatusbarIcon(); - - // TODO: have tastudio set a pause status change callback, or take control over pause - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.UpdateValues(); - } - } - - public byte[] CurrentFrameBuffer(bool captureOSD) - { - using (var bb = captureOSD ? CaptureOSD() : MakeScreenshotImage()) - { - using (var img = bb.ToSysdrawingBitmap()) - { - ImageConverter converter = new ImageConverter(); - return (byte[])converter.ConvertTo(img, typeof(byte[])); - } - } - } - - public void TakeScreenshotToClipboard() - { - using (var bb = Global.Config.Screenshot_CaptureOSD ? CaptureOSD() : MakeScreenshotImage()) - { - using (var img = bb.ToSysdrawingBitmap()) - { - Clipboard.SetImage(img); - } - } - - GlobalWin.OSD.AddMessage("Screenshot (raw) saved to clipboard."); - } - - private void TakeScreenshotClientToClipboard() - { - using (var bb = GlobalWin.DisplayManager.RenderOffscreen(_currentVideoProvider, Global.Config.Screenshot_CaptureOSD)) - { - using (var img = bb.ToSysdrawingBitmap()) - { - Clipboard.SetImage(img); - } - } - - GlobalWin.OSD.AddMessage("Screenshot (client) saved to clipboard."); - } - - public void TakeScreenshot() - { - string fmt = "{0}.{1:yyyy-MM-dd HH.mm.ss}{2}.png"; - string prefix = PathManager.ScreenshotPrefix(Global.Game); - var ts = DateTime.Now; - - string fnameBare = string.Format(fmt, prefix, ts, ""); - string fname = string.Format(fmt, prefix, ts, " (0)"); - - // if the (0) filename exists, do nothing. we'll bump up the number later - // if the bare filename exists, move it to (0) - // otherwise, no related filename exists, and we can proceed with the bare filename - if (File.Exists(fname)) - { - } - else if (File.Exists(fnameBare)) - { - File.Move(fnameBare, fname); - } - else - { - fname = fnameBare; - } - - int seq = 0; - while (File.Exists(fname)) - { - var sequence = $" ({seq++})"; - fname = string.Format(fmt, prefix, ts, sequence); - } - - TakeScreenshot(fname); - } - - public void TakeScreenshot(string path) - { - var fi = new FileInfo(path); - if (fi.Directory != null && !fi.Directory.Exists) - { - fi.Directory.Create(); - } - - using (var bb = Global.Config.Screenshot_CaptureOSD ? CaptureOSD() : MakeScreenshotImage()) - { - using (var img = bb.ToSysdrawingBitmap()) - { - img.Save(fi.FullName, ImageFormat.Png); - } - } - - /* - using (var fs = new FileStream(path + "_test.bmp", FileMode.OpenOrCreate, FileAccess.Write)) - QuickBmpFile.Save(Emulator.VideoProvider(), fs, r.Next(50, 500), r.Next(50, 500)); - */ - GlobalWin.OSD.AddMessage(fi.Name + " saved."); - } - - public void FrameBufferResized() - { - // run this entire thing exactly twice, since the first resize may adjust the menu stacking - for (int i = 0; i < 2; i++) - { - int zoom = Global.Config.TargetZoomFactors[Emulator.SystemId]; - var area = Screen.FromControl(this).WorkingArea; - - int borderWidth = Size.Width - PresentationPanel.Control.Size.Width; - int borderHeight = Size.Height - PresentationPanel.Control.Size.Height; - - // start at target zoom and work way down until we find acceptable zoom - Size lastComputedSize = new Size(1, 1); - for (; zoom >= 1; zoom--) - { - lastComputedSize = GlobalWin.DisplayManager.CalculateClientSize(_currentVideoProvider, zoom); - if (lastComputedSize.Width + borderWidth < area.Width - && lastComputedSize.Height + borderHeight < area.Height) - { - break; - } - } - - Console.WriteLine("Selecting display size " + lastComputedSize); - - // Change size - Size = new Size(lastComputedSize.Width + borderWidth, lastComputedSize.Height + borderHeight); - PerformLayout(); - PresentationPanel.Resized = true; - - // Is window off the screen at this size? - if (!area.Contains(Bounds)) - { - if (Bounds.Right > area.Right) // Window is off the right edge - { - Location = new Point(area.Right - Size.Width, Location.Y); - } - - if (Bounds.Bottom > area.Bottom) // Window is off the bottom edge - { - Location = new Point(Location.X, area.Bottom - Size.Height); - } - } - } - } - - private void SynchChrome() - { - if (_inFullscreen) - { - // TODO - maybe apply a hack tracked during fullscreen here to override it - FormBorderStyle = FormBorderStyle.None; - MainMenuStrip.Visible = Global.Config.DispChrome_MenuFullscreen && !argParser._chromeless; - MainStatusBar.Visible = Global.Config.DispChrome_StatusBarFullscreen && !argParser._chromeless; - } - else - { - MainStatusBar.Visible = Global.Config.DispChrome_StatusBarWindowed && !argParser._chromeless; - MainMenuStrip.Visible = Global.Config.DispChrome_MenuWindowed && !argParser._chromeless; - MaximizeBox = MinimizeBox = Global.Config.DispChrome_CaptionWindowed && !argParser._chromeless; - if (Global.Config.DispChrome_FrameWindowed == 0 || argParser._chromeless) - { - FormBorderStyle = FormBorderStyle.None; - } - else if (Global.Config.DispChrome_FrameWindowed == 1) - { - FormBorderStyle = FormBorderStyle.SizableToolWindow; - } - else if (Global.Config.DispChrome_FrameWindowed == 2) - { - FormBorderStyle = FormBorderStyle.Sizable; - } - } - } - - public void ToggleFullscreen(bool allowSuppress = false) - { - AutohideCursor(false); - - // prohibit this operation if the current controls include LMouse - if (allowSuppress) - { - if (Global.ActiveController.HasBinding("WMouse L")) - { - return; - } - } - - if (!_inFullscreen) - { - SuspendLayout(); -#if WINDOWS - // Work around an AMD driver bug in >= vista: - // It seems windows will activate opengl fullscreen mode when a GL control is occupying the exact space of a screen (0,0 and dimensions=screensize) - // AMD cards manifest a problem under these circumstances, flickering other monitors. - // It isnt clear whether nvidia cards are failing to employ this optimization, or just not flickering. - // (this could be determined with more work; other side affects of the fullscreen mode include: corrupted taskbar, no modal boxes on top of GL control, no screenshots) - // At any rate, we can solve this by adding a 1px black border around the GL control - // Please note: It is important to do this before resizing things, otherwise momentarily a GL control without WS_BORDER will be at the magic dimensions and cause the flakeout - if (Global.Config.DispFullscreenHacks && Global.Config.DispMethod == Config.EDispMethod.OpenGL) - { - //ATTENTION: this causes the statusbar to not work well, since the backcolor is now set to black instead of SystemColors.Control. - //It seems that some statusbar elements composite with the backcolor. - //Maybe we could add another control under the statusbar. with a different backcolor - Padding = new Padding(1); - BackColor = Color.Black; - - // FUTURE WORK: - // re-add this padding back into the display manager (so the image will get cut off a little but, but a few more resolutions will fully fit into the screen) - } -#endif - - _windowedLocation = Location; - - _inFullscreen = true; - SynchChrome(); - WindowState = FormWindowState.Maximized; // be sure to do this after setting the chrome, otherwise it wont work fully - ResumeLayout(); - - PresentationPanel.Resized = true; - } - else - { - SuspendLayout(); - - WindowState = FormWindowState.Normal; - -#if WINDOWS - // do this even if DispFullscreenHacks arent enabled, to restore it in case it changed underneath us or something - Padding = new Padding(0); - // it's important that we set the form color back to this, because the statusbar icons blend onto the mainform, not onto the statusbar-- - // so we need the statusbar and mainform backdrop color to match - BackColor = SystemColors.Control; -#endif - - _inFullscreen = false; - - SynchChrome(); - Location = _windowedLocation; - ResumeLayout(); - - FrameBufferResized(); - } - } - - private void OpenLuaConsole() - { - GlobalWin.Tools.Load(); - } - - public void NotifyLogWindowClosing() - { - DisplayLogWindowMenuItem.Checked = false; - } - - public void ClickSpeedItem(int num) - { - if ((ModifierKeys & Keys.Control) != 0) - { - SetSpeedPercentAlternate(num); - } - else - { - SetSpeedPercent(num); - } - } - - public void Unthrottle() - { - _unthrottled = true; - } - - public void Throttle() - { - _unthrottled = false; - } - - private void ThrottleMessage() - { - string ttype = ":(none)"; - if (Global.Config.SoundThrottle) - { - ttype = ":Sound"; - } - - if (Global.Config.VSyncThrottle) - { - ttype = $":Vsync{(Global.Config.VSync ? "[ena]" : "[dis]")}"; - } - - if (Global.Config.ClockThrottle) - { - ttype = ":Clock"; - } - - string xtype = _unthrottled ? "Unthrottled" : "Throttled"; - string msg = $"{xtype}{ttype} "; - - GlobalWin.OSD.AddMessage(msg); - } - - public void FrameSkipMessage() - { - GlobalWin.OSD.AddMessage("Frameskipping set to " + Global.Config.FrameSkip); - } - - public void UpdateCheatStatus() - { - if (Global.CheatList.ActiveCount > 0) - { - CheatStatusButton.ToolTipText = "Cheats are currently active"; - CheatStatusButton.Image = Properties.Resources.Freeze; - CheatStatusButton.Visible = true; - } - else - { - CheatStatusButton.ToolTipText = ""; - CheatStatusButton.Image = Properties.Resources.Blank; - CheatStatusButton.Visible = false; - } - } - - private LibsnesCore AsSNES => Emulator as LibsnesCore; - - private void SNES_ToggleBg(int layer) - { - if (!(Emulator is LibsnesCore) && !(Emulator is Snes9x)) - { - return; - } - - if (layer < 1 || layer > 4) - { - return; - } - - bool result = false; - if (Emulator is LibsnesCore) - { - var s = ((LibsnesCore)Emulator).GetSettings(); - switch (layer) - { - case 1: - result = s.ShowBG1_0 = s.ShowBG1_1 ^= true; - break; - case 2: - result = s.ShowBG2_0 = s.ShowBG2_1 ^= true; - break; - case 3: - result = s.ShowBG3_0 = s.ShowBG3_1 ^= true; - break; - case 4: - result = s.ShowBG4_0 = s.ShowBG4_1 ^= true; - break; - } - - ((LibsnesCore)Emulator).PutSettings(s); - } - else if (Emulator is Snes9x) - { - var s = ((Snes9x)Emulator).GetSettings(); - switch (layer) - { - case 1: - result = s.ShowBg0 ^= true; - break; - case 2: - result = s.ShowBg1 ^= true; - break; - case 3: - result = s.ShowBg2 ^= true; - break; - case 4: - result = s.ShowBg3 ^= true; - break; - } - - ((Snes9x)Emulator).PutSettings(s); - } - - GlobalWin.OSD.AddMessage($"BG {layer} Layer " + (result ? "On" : "Off")); - } - - private void SNES_ToggleObj(int layer) - { - if (!(Emulator is LibsnesCore) && !(Emulator is Snes9x)) - { - return; - } - - if (layer < 1 || layer > 4) - { - return; - } - - bool result = false; - if (Emulator is LibsnesCore) - { - var s = ((LibsnesCore)Emulator).GetSettings(); - switch (layer) - { - case 1: - result = s.ShowOBJ_0 ^= true; - break; - case 2: - result = s.ShowOBJ_1 ^= true; - break; - case 3: - result = s.ShowOBJ_2 ^= true; - break; - case 4: - result = s.ShowOBJ_3 ^= true; - break; - } - - ((LibsnesCore)Emulator).PutSettings(s); - GlobalWin.OSD.AddMessage($"Obj {layer} Layer " + (result ? "On" : "Off")); - } - else if (Emulator is Snes9x) - { - var s = ((Snes9x)Emulator).GetSettings(); - switch (layer) - { - case 1: - result = s.ShowSprites0 ^= true; - break; - case 2: - result = s.ShowSprites1 ^= true; - break; - case 3: - result = s.ShowSprites2 ^= true; - break; - case 4: - result = s.ShowSprites3 ^= true; - break; - } - - ((Snes9x)Emulator).PutSettings(s); - GlobalWin.OSD.AddMessage($"Sprite {layer} Layer " + (result ? "On" : "Off")); - } - } - - public bool RunLibretroCoreChooser() - { - var ofd = new OpenFileDialog(); - - if (Global.Config.LibretroCore != null) - { - ofd.FileName = Path.GetFileName(Global.Config.LibretroCore); - ofd.InitialDirectory = Path.GetDirectoryName(Global.Config.LibretroCore); - } - else - { - ofd.InitialDirectory = PathManager.GetPathType("Libretro", "Cores"); - if (!Directory.Exists(ofd.InitialDirectory)) - { - Directory.CreateDirectory(ofd.InitialDirectory); - } - } - - ofd.RestoreDirectory = true; - ofd.Filter = "Libretro Cores (*.dll)|*.dll"; - - if (ofd.ShowDialog() == DialogResult.Cancel) - { - return false; - } - - Global.Config.LibretroCore = ofd.FileName; - - return true; - } - - #endregion - - #region Private variables - - private Size _lastVideoSize = new Size(-1, -1), _lastVirtualSize = new Size(-1, -1); - private readonly SaveSlotManager _stateSlots = new SaveSlotManager(); - - // AVI/WAV state - private IVideoWriter _currAviWriter; - - private AutofireController _autofireNullControls; - - // Sound refator TODO: we can enforce async mode here with a property that gets/sets this but does an async check - private ISoundProvider _aviSoundInputAsync; // Note: This sound provider must be in async mode! - - private SimpleSyncSoundProvider _dumpProxy; // an audio proxy used for dumping - private bool _dumpaudiosync; // set true to for experimental AV dumping - private int _avwriterResizew; - private int _avwriterResizeh; - private bool _avwriterpad; - - private bool _windowClosedAndSafeToExitProcess; - private int _exitCode; - private bool _exitRequestPending; - private bool _runloopFrameProgress; - private long _frameAdvanceTimestamp; - private long _frameRewindTimestamp; - private bool _frameRewindWasPaused; - private bool _runloopFrameAdvance; - private bool _lastFastForwardingOrRewinding; - private bool _inResizeLoop; - - private readonly double _fpsUpdatesPerSecond = 4.0; - private readonly double _fpsSmoothing = 8.0; - private double _lastFps; - private int _framesSinceLastFpsUpdate; - private long _timestampLastFpsUpdate; - - private readonly Throttle _throttle; - private bool _unthrottled; - - // For handling automatic pausing when entering the menu - private bool _wasPaused; - private bool _didMenuPause; - - private Cursor _blankCursor; - private bool _cursorHidden; - private bool _inFullscreen; - private Point _windowedLocation; - private bool _needsFullscreenOnLoad; - - private int _lastOpenRomFilter; - - private ArgParser argParser = new ArgParser(); - // Resources - private Bitmap _statusBarDiskLightOnImage; - private Bitmap _statusBarDiskLightOffImage; - private Bitmap _linkCableOn; - private Bitmap _linkCableOff; - - // input state which has been destined for game controller inputs are coalesced here - // public static ControllerInputCoalescer ControllerInputCoalescer = new ControllerInputCoalescer(); - // input state which has been destined for client hotkey consumption are colesced here - private readonly InputCoalescer _hotkeyCoalescer = new InputCoalescer(); - - public PresentationPanel PresentationPanel { get; } - - //countdown for saveram autoflushing - public int AutoFlushSaveRamIn { get; set; } - #endregion - - #region Private methods - - private void SetStatusBar() - { - if (!_inFullscreen) - { - MainStatusBar.Visible = Global.Config.DispChrome_StatusBarWindowed; - PerformLayout(); - FrameBufferResized(); - } - } - - private void SetWindowText() - { - string str = ""; - - if (_inResizeLoop) - { - var size = PresentationPanel.NativeSize; - float ar = (float)size.Width / size.Height; - str += $"({size.Width}x{size.Height})={ar} - "; - } - - // we need to display FPS somewhere, in this case - if (Global.Config.DispSpeedupFeatures == 0) - { - str += $"({_lastFps:0} fps) - "; - } - - if (!string.IsNullOrEmpty(VersionInfo.CustomBuildString)) - { - str += VersionInfo.CustomBuildString + " "; - } - - str += Emulator.IsNull() ? "BizHawk" : Global.SystemInfo.DisplayName; - - if (VersionInfo.DeveloperBuild) - { - str += " (interim)"; - } - - if (!Emulator.IsNull()) - { - str += " - " + Global.Game.Name; - - if (Global.MovieSession.Movie.IsActive) - { - str += " - " + Path.GetFileName(Global.MovieSession.Movie.Filename); - } - } - - if (!Global.Config.DispChrome_CaptionWindowed || argParser._chromeless) - { - str = ""; - } - - Text = str; - } - - private void ClearAutohold() - { - ClearHolds(); - GlobalWin.OSD.AddMessage("Autohold keys cleared"); - } - - private static void UpdateToolsLoadstate() - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.SNESGraphicsDebugger.UpdateToolsLoadstate(); - } - } - - private void UpdateToolsAfter(bool fromLua = false) - { - GlobalWin.Tools.UpdateToolsAfter(fromLua); - HandleToggleLightAndLink(); - } - - public void UpdateDumpIcon() - { - DumpStatusButton.Image = Properties.Resources.Blank; - DumpStatusButton.ToolTipText = ""; - - if (Emulator.IsNull()) - { - return; - } - else if (Global.Game == null) - { - return; - } - - var status = Global.Game.Status; - string annotation; - if (status == RomStatus.BadDump) - { - DumpStatusButton.Image = Properties.Resources.ExclamationRed; - annotation = "Warning: Bad ROM Dump"; - } - else if (status == RomStatus.Overdump) - { - DumpStatusButton.Image = Properties.Resources.ExclamationRed; - annotation = "Warning: Overdump"; - } - else if (status == RomStatus.NotInDatabase) - { - DumpStatusButton.Image = Properties.Resources.RetroQuestion; - annotation = "Warning: Unknown ROM"; - } - else if (status == RomStatus.TranslatedRom) - { - DumpStatusButton.Image = Properties.Resources.Translation; - annotation = "Translated ROM"; - } - else if (status == RomStatus.Homebrew) - { - DumpStatusButton.Image = Properties.Resources.HomeBrew; - annotation = "Homebrew ROM"; - } - else if (Global.Game.Status == RomStatus.Hack) - { - DumpStatusButton.Image = Properties.Resources.Hack; - annotation = "Hacked ROM"; - } - else if (Global.Game.Status == RomStatus.Unknown) - { - DumpStatusButton.Image = Properties.Resources.Hack; - annotation = "Warning: ROM of Unknown Character"; - } - else - { - DumpStatusButton.Image = Properties.Resources.GreenCheck; - annotation = "Verified good dump"; - } - - if (!string.IsNullOrEmpty(Emulator.CoreComm.RomStatusAnnotation)) - { - annotation = Emulator.CoreComm.RomStatusAnnotation; - - if (annotation == "Multi-disk bundler") - { - DumpStatusButton.Image = Properties.Resources.RetroQuestion; - } - } - - DumpStatusButton.ToolTipText = annotation; - } - - private void LoadSaveRam() - { - if (Emulator.HasSaveRam()) - { - try // zero says: this is sort of sketchy... but this is no time for rearchitecting - { - if (Global.Config.AutosaveSaveRAM) - { - var saveram = new FileInfo(PathManager.SaveRamPath(Global.Game)); - var autosave = new FileInfo(PathManager.AutoSaveRamPath(Global.Game)); - if (autosave.Exists && autosave.LastWriteTime > saveram.LastWriteTime) - { - GlobalWin.OSD.AddMessage("AutoSaveRAM is newer than last saved SaveRAM"); - } - } - - byte[] sram; - - // GBA meteor core might not know how big the saveram ought to be, so just send it the whole file - // GBA vba-next core will try to eat anything, regardless of size - if (Emulator is VBANext || Emulator is MGBAHawk || Emulator is NeoGeoPort) - { - sram = File.ReadAllBytes(PathManager.SaveRamPath(Global.Game)); - } - else - { - var oldram = Emulator.AsSaveRam().CloneSaveRam(); - if (oldram == null) - { - // we're eating this one now. The possible negative consequence is that a user could lose - // their saveram and not know why - // MessageBox.Show("Error: tried to load saveram, but core would not accept it?"); - return; - } - - // why do we silently truncate\pad here instead of warning\erroring? - sram = new byte[oldram.Length]; - using (var reader = new BinaryReader( - new FileStream(PathManager.SaveRamPath(Global.Game), FileMode.Open, FileAccess.Read))) - { - reader.Read(sram, 0, sram.Length); - } - } - - Emulator.AsSaveRam().StoreSaveRam(sram); - AutoFlushSaveRamIn = Global.Config.FlushSaveRamFrames; - } - catch (IOException) - { - GlobalWin.OSD.AddMessage("An error occurred while loading Sram"); - } - } - } - - public bool FlushSaveRAM(bool autosave = false) - { - if (Emulator.HasSaveRam()) - { - string path; - if (autosave) - { - path = PathManager.AutoSaveRamPath(Global.Game); - AutoFlushSaveRamIn = Global.Config.FlushSaveRamFrames; - } - else - { - path = PathManager.SaveRamPath(Global.Game); - } - var file = new FileInfo(path); - var newPath = path + ".new"; - var newFile = new FileInfo(newPath); - var backupPath = path + ".bak"; - var backupFile = new FileInfo(backupPath); - if (file.Directory != null && !file.Directory.Exists) - { - try - { - file.Directory.Create(); - } - catch - { - GlobalWin.OSD.AddMessage("Unable to flush SaveRAM to: " + newFile.Directory); - return false; - } - } - - var writer = new BinaryWriter(new FileStream(newPath, FileMode.Create, FileAccess.Write)); - var saveram = Emulator.AsSaveRam().CloneSaveRam(); - - if (saveram != null) - { - writer.Write(saveram, 0, saveram.Length); - } - writer.Close(); - - if (file.Exists) - { - if (Global.Config.BackupSaveram) - { - if (backupFile.Exists) - { - backupFile.Delete(); - } - - file.MoveTo(backupPath); - } - else - { - file.Delete(); - } - } - - newFile.MoveTo(path); - } - - return true; - } - - private void RewireSound() - { - if (_dumpProxy != null) - { - // we're video dumping, so async mode only and use the DumpProxy. - // note that the avi dumper has already rewired the emulator itself in this case. - GlobalWin.Sound.SetInputPin(_dumpProxy); - } - else - { - bool useAsyncMode = _currentSoundProvider.CanProvideAsync && !Global.Config.SoundThrottle; - _currentSoundProvider.SetSyncMode(useAsyncMode ? SyncSoundMode.Async : SyncSoundMode.Sync); - GlobalWin.Sound.SetInputPin(_currentSoundProvider); - } - } - - private void HandlePlatformMenus() - { - var system = ""; - if (!Global.Game.IsNullInstance) - { - system = Emulator.SystemId; - } - - TI83SubMenu.Visible = false; - NESSubMenu.Visible = false; - PCESubMenu.Visible = false; - SMSSubMenu.Visible = false; - GBSubMenu.Visible = false; - GBASubMenu.Visible = false; - AtariSubMenu.Visible = false; - A7800SubMenu.Visible = false; - SNESSubMenu.Visible = false; - PSXSubMenu.Visible = false; - ColecoSubMenu.Visible = false; - N64SubMenu.Visible = false; - SaturnSubMenu.Visible = false; - DGBSubMenu.Visible = false; - DGBHawkSubMenu.Visible = false; - GenesisSubMenu.Visible = false; - wonderSwanToolStripMenuItem.Visible = false; - AppleSubMenu.Visible = false; - C64SubMenu.Visible = false; - IntvSubMenu.Visible = false; - virtualBoyToolStripMenuItem.Visible = false; - sNESToolStripMenuItem.Visible = false; - neoGeoPocketToolStripMenuItem.Visible = false; - pCFXToolStripMenuItem.Visible = false; - zXSpectrumToolStripMenuItem.Visible = false; - amstradCPCToolStripMenuItem.Visible = false; - - switch (system) - { - case "GEN": - GenesisSubMenu.Visible = true; - break; - case "TI83": - TI83SubMenu.Visible = true; - break; - case "NES": - NESSubMenu.Visible = true; - break; - case "PCE": - case "PCECD": - case "SGX": - PCESubMenu.Visible = true; - break; - case "SMS": - SMSSubMenu.Text = "&SMS"; - SMSSubMenu.Visible = true; - break; - case "SG": - SMSSubMenu.Text = "&SG"; - SMSSubMenu.Visible = true; - break; - case "GG": - SMSSubMenu.Text = "&GG"; - SMSSubMenu.Visible = true; - break; - case "GB": - case "GBC": - GBSubMenu.Visible = true; - break; - case "GBA": - GBASubMenu.Visible = true; - break; - case "A26": - AtariSubMenu.Visible = true; - break; - case "A78": - A7800SubMenu.Visible = true; - break; - case "PSX": - PSXSubMenu.Visible = true; - break; - case "SNES": - case "SGB": - if (Emulator is LibsnesCore) - { - SNESSubMenu.Text = ((LibsnesCore)Emulator).IsSGB ? "&SGB" : "&SNES"; - SNESSubMenu.Visible = true; - } - else if (Emulator is Snes9x) - { - sNESToolStripMenuItem.Visible = true; - } - else if (Emulator is Sameboy) - { - GBSubMenu.Visible = true; - } - break; - case "Coleco": - ColecoSubMenu.Visible = true; - break; - case "N64": - N64SubMenu.Visible = true; - break; - case "SAT": - SaturnSubMenu.Visible = true; - break; - case "DGB": - if (Emulator is GBHawkLink) - { - DGBHawkSubMenu.Visible = true; - } - else - { - DGBSubMenu.Visible = true; - } - break; - case "WSWAN": - wonderSwanToolStripMenuItem.Visible = true; - break; - case "AppleII": - AppleSubMenu.Visible = true; - break; - case "C64": - C64SubMenu.Visible = true; - break; - case "INTV": - IntvSubMenu.Visible = true; - break; - case "VB": - virtualBoyToolStripMenuItem.Visible = true; - break; - case "NGP": - neoGeoPocketToolStripMenuItem.Visible = true; - break; - case "PCFX": - pCFXToolStripMenuItem.Visible = true; - break; - case "ZXSpectrum": - zXSpectrumToolStripMenuItem.Visible = true; -#if DEBUG - ZXSpectrumExportSnapshotMenuItemMenuItem.Visible = true; -#else - ZXSpectrumExportSnapshotMenuItemMenuItem.Visible = false; -#endif - break; - case "AmstradCPC": - amstradCPCToolStripMenuItem.Visible = true; - break; - } - } - - private void InitControls() - { - var controls = new Controller( - new ControllerDefinition - { - Name = "Emulator Frontend Controls", - BoolButtons = Global.Config.HotkeyBindings.Select(x => x.DisplayName).ToList() - }); - - foreach (var b in Global.Config.HotkeyBindings) - { - controls.BindMulti(b.DisplayName, b.Bindings); - } - - Global.ClientControls = controls; - _autofireNullControls = new AutofireController(NullController.Instance.Definition, Emulator); - } - - private void LoadMoviesFromRecent(string path) - { - if (File.Exists(path)) - { - var movie = MovieService.Get(path); - Global.MovieSession.ReadOnly = true; - StartNewMovie(movie, false); - } - else - { - Global.Config.RecentMovies.HandleLoadError(path); - } - } - - private void LoadRomFromRecent(string rom) - { - var ioa = OpenAdvancedSerializer.ParseWithLegacy(rom); - - var args = new LoadRomArgs - { - OpenAdvanced = ioa - }; - - // if(ioa is this or that) - for more complex behaviour - string romPath = ioa.SimplePath; - - if (!LoadRom(romPath, args)) - { - Global.Config.RecentRoms.HandleLoadError(romPath, rom); - } - } - - private void SetPauseStatusbarIcon() - { - if (IsTurboSeeking) - { - PauseStatusButton.Image = Properties.Resources.Lightning; - PauseStatusButton.Visible = true; - PauseStatusButton.ToolTipText = "Emulator is turbo seeking to frame " + PauseOnFrame.Value + " click to stop seek"; - } - else if (PauseOnFrame.HasValue) - { - PauseStatusButton.Image = Properties.Resources.YellowRight; - PauseStatusButton.Visible = true; - PauseStatusButton.ToolTipText = "Emulator is playing to frame " + PauseOnFrame.Value + " click to stop seek"; - } - else if (EmulatorPaused) - { - PauseStatusButton.Image = Properties.Resources.Pause; - PauseStatusButton.Visible = true; - PauseStatusButton.ToolTipText = "Emulator Paused"; - } - else - { - PauseStatusButton.Image = Properties.Resources.Blank; - PauseStatusButton.Visible = false; - PauseStatusButton.ToolTipText = ""; - } - } - - private void SyncThrottle() - { - // "unthrottled" = throttle was turned off with "Toggle Throttle" hotkey - // "turbo" = throttle is off due to the "Turbo" hotkey being held - // They are basically the same thing but one is a toggle and the other requires a - // hotkey to be held. There is however slightly different behavior in that turbo - // skips outputting the audio. There's also a third way which is when no throttle - // method is selected, but the clock throttle determines that by itself and - // everything appears normal here. - var rewind = Global.Rewinder.RewindActive && (Global.ClientControls["Rewind"] || PressRewind); - var fastForward = Global.ClientControls["Fast Forward"] || FastForward; - var turbo = IsTurboing; - - int speedPercent = fastForward ? Global.Config.SpeedPercentAlternate : Global.Config.SpeedPercent; - - if (rewind) - { - speedPercent = Math.Max(speedPercent * Global.Config.RewindSpeedMultiplier / Global.Rewinder.RewindFrequency, 5); - } - - Global.DisableSecondaryThrottling = _unthrottled || turbo || fastForward || rewind; - - // realtime throttle is never going to be so exact that using a double here is wrong - _throttle.SetCoreFps(Emulator.VsyncRate()); - _throttle.signal_paused = EmulatorPaused; - _throttle.signal_unthrottle = _unthrottled || turbo; - - // zero 26-mar-2016 - vsync and vsync throttle here both is odd, but see comments elsewhere about triple buffering - _throttle.signal_overrideSecondaryThrottle = (fastForward || rewind) && (Global.Config.SoundThrottle || Global.Config.VSyncThrottle || Global.Config.VSync); - _throttle.SetSpeedPercent(speedPercent); - } - - private void SetSpeedPercentAlternate(int value) - { - Global.Config.SpeedPercentAlternate = value; - SyncThrottle(); - GlobalWin.OSD.AddMessage("Alternate Speed: " + value + "%"); - } - - private void SetSpeedPercent(int value) - { - Global.Config.SpeedPercent = value; - SyncThrottle(); - GlobalWin.OSD.AddMessage("Speed: " + value + "%"); - } - - private void Shutdown() - { - if (_currAviWriter != null) - { - _currAviWriter.CloseFile(); - _currAviWriter = null; - } - } - - private static void CheckMessages() - { - Application.DoEvents(); - if (ActiveForm != null) - { - ScreenSaver.ResetTimerPeriodically(); - } - } - - private void AutohideCursor(bool hide) - { - if (hide && !_cursorHidden) - { - if (_blankCursor == null) - { - var ms = new MemoryStream(Properties.Resources.BlankCursor); - _blankCursor = new Cursor(ms); - } - - PresentationPanel.Control.Cursor = _blankCursor; - _cursorHidden = true; - } - else if (!hide && _cursorHidden) - { - PresentationPanel.Control.Cursor = Cursors.Default; - timerMouseIdle.Stop(); - timerMouseIdle.Start(); - _cursorHidden = false; - } - } - - private BitmapBuffer MakeScreenshotImage() - { - return GlobalWin.DisplayManager.RenderVideoProvider(_currentVideoProvider); - } - - private void SaveSlotSelectedMessage() - { - int slot = Global.Config.SaveSlot; - string emptypart = _stateSlots.HasSlot(slot) ? "" : " (empty)"; - string message = $"Slot {slot}{emptypart} selected."; - GlobalWin.OSD.AddMessage(message); - } - - private void Render() - { - if (Global.Config.DispSpeedupFeatures == 0) - { - return; - } - - var video = _currentVideoProvider; - Size currVideoSize = new Size(video.BufferWidth, video.BufferHeight); - Size currVirtualSize = new Size(video.VirtualWidth, video.VirtualHeight); - - bool resizeFramebuffer = false; - if (currVideoSize != _lastVideoSize || currVirtualSize != _lastVirtualSize) - resizeFramebuffer = true; - - bool isZero = false; - if (currVideoSize.Width == 0 || currVideoSize.Height == 0 || currVirtualSize.Width == 0 || currVirtualSize.Height == 0) - isZero = true; - - //don't resize if the new size is 0 somehow; we'll wait until we have a sensible size - if(isZero) - resizeFramebuffer = false; - - if(resizeFramebuffer) - { - _lastVideoSize = currVideoSize; - _lastVirtualSize = currVirtualSize; - FrameBufferResized(); - } - - //rendering flakes out egregiously if we have a zero size - //can we fix it later not to? - if(isZero) - GlobalWin.DisplayManager.Blank(); - else - GlobalWin.DisplayManager.UpdateSource(video); - } - - // sends a simulation of a plain alt key keystroke - private void SendPlainAltKey(int lparam) - { - var m = new Message { WParam = new IntPtr(0xF100), LParam = new IntPtr(lparam), Msg = 0x0112, HWnd = Handle }; - base.WndProc(ref m); - } - - // sends an alt+mnemonic combination - private void SendAltKeyChar(char c) - { - typeof(ToolStrip).InvokeMember("ProcessMnemonicInternal", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Instance, null, MainformMenu, new object[] { c }); - } - - public static string FormatFilter(params string[] args) - { - var sb = new StringBuilder(); - if (args.Length % 2 != 0) - { - throw new ArgumentException(); - } - - var num = args.Length / 2; - for (int i = 0; i < num; i++) - { - sb.AppendFormat("{0} ({1})|{1}", args[i * 2], args[(i * 2) + 1]); - if (i != num - 1) - { - sb.Append('|'); - } - } - - var str = sb.ToString().Replace("%ARCH%", "*.zip;*.rar;*.7z;*.gz"); - str = str.Replace(";", "; "); - return str; - } - - public static string RomFilter - { - get - { - if (VersionInfo.DeveloperBuild) - { - return FormatFilter( - "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.pce;*.sgx;*.bin;*.smd;*.rom;*.a26;*.a78;*.lnx;*.m3u;*.cue;*.ccd;*.mds;*.exe;*.gb;*.gbc;*.gba;*.gen;*.md;*.32x;*.col;*.int;*.smc;*.sfc;*.prg;*.d64;*.g64;*.crt;*.tap;*.sgb;*.xml;*.z64;*.v64;*.n64;*.ws;*.wsc;*.dsk;*.do;*.po;*.vb;*.ngp;*.ngc;*.psf;*.minipsf;*.nsf;*.tzx;*.pzx;*.csw;*.wav;*.cdt;%ARCH%", - "Music Files", "*.psf;*.minipsf;*.sid;*.nsf", - "Disc Images", "*.cue;*.ccd;*.mds;*.m3u", - "NES", "*.nes;*.fds;*.unf;*.nsf;%ARCH%", - "Super NES", "*.smc;*.sfc;*.xml;%ARCH%", - "Master System", "*.sms;*.gg;*.sg;%ARCH%", - "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;*.mds;%ARCH%", - "TI-83", "*.rom;%ARCH%", - "Archive Files", "%ARCH%", - "Savestate", "*.state", - "Atari 2600", "*.a26;*.bin;%ARCH%", - "Atari 7800", "*.a78;*.bin;%ARCH%", - "Atari Lynx", "*.lnx;%ARCH%", - "Genesis", "*.gen;*.smd;*.bin;*.md;*.32x;*.cue;*.ccd;%ARCH%", - "Gameboy", "*.gb;*.gbc;*.sgb;%ARCH%", - "Gameboy Advance", "*.gba;%ARCH%", - "Colecovision", "*.col;%ARCH%", - "Intellivision", "*.int;*.bin;*.rom;%ARCH%", - "PlayStation", "*.cue;*.ccd;*.mds;*.m3u", - "PSX Executables (experimental)", "*.exe", - "PSF Playstation Sound File", "*.psf;*.minipsf", - "Commodore 64", "*.prg;*.d64;*.g64;*.crt;*.tap;%ARCH%", - "SID Commodore 64 Music File", "*.sid;%ARCH%", - "Nintendo 64", "*.z64;*.v64;*.n64", - "WonderSwan", "*.ws;*.wsc;%ARCH%", - "Apple II", "*.dsk;*.do;*.po;%ARCH%", - "Virtual Boy", "*.vb;%ARCH%", - "Neo Geo Pocket", "*.ngp;*.ngc;%ARCH%", - "Sinclair ZX Spectrum", "*.tzx;*.tap;*.dsk;*.pzx;*.csw;*.wav;%ARCH%", - "Amstrad CPC", "*.cdt;*.dsk;%ARCH%", - "All Files", "*.*"); - } - - return FormatFilter( - "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.gb;*.gbc;*.gba;*.pce;*.sgx;*.bin;*.smd;*.gen;*.md;*.32x;*.smc;*.sfc;*.a26;*.a78;*.lnx;*.col;*.int;*.rom;*.m3u;*.cue;*.ccd;*.mds;*.sgb;*.z64;*.v64;*.n64;*.ws;*.wsc;*.xml;*.dsk;*.do;*.po;*.psf;*.ngp;*.ngc;*.prg;*.d64;*.g64;*.minipsf;*.nsf;*.tzx;*.pzx;*.csw;*.wav;%ARCH%", - "Disc Images", "*.cue;*.ccd;*.mds;*.m3u", - "NES", "*.nes;*.fds;*.unf;*.nsf;%ARCH%", - "Super NES", "*.smc;*.sfc;*.xml;%ARCH%", - "PlayStation", "*.cue;*.ccd;*.mds;*.m3u", - "PSF Playstation Sound File", "*.psf;*.minipsf", - "Nintendo 64", "*.z64;*.v64;*.n64", - "Gameboy", "*.gb;*.gbc;*.sgb;%ARCH%", - "Gameboy Advance", "*.gba;%ARCH%", - "Master System", "*.sms;*.gg;*.sg;%ARCH%", - "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;*.mds;%ARCH%", - "Atari 2600", "*.a26;%ARCH%", - "Atari 7800", "*.a78;%ARCH%", - "Atari Lynx", "*.lnx;%ARCH%", - "Colecovision", "*.col;%ARCH%", - "Intellivision", "*.int;*.bin;*.rom;%ARCH%", - "TI-83", "*.rom;%ARCH%", - "Archive Files", "%ARCH%", - "Savestate", "*.state", - "Genesis", "*.gen;*.md;*.smd;*.32x;*.bin;*.cue;*.ccd;%ARCH%", - "WonderSwan", "*.ws;*.wsc;%ARCH%", - "Apple II", "*.dsk;*.do;*.po;%ARCH%", - "Virtual Boy", "*.vb;%ARCH%", - "Neo Geo Pocket", "*.ngp;*.ngc;%ARCH%", - "Commodore 64", "*.prg;*.d64;*.g64;*.crt;*.tap;%ARCH%", - "Sinclair ZX Spectrum", "*.tzx;*.tap;*.dsk;*.pzx;*.csw;*.wav;%ARCH%", - "All Files", "*.*"); - } - } - - private void OpenRom() - { - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetRomsPath(Emulator.SystemId), - Filter = RomFilter, - RestoreDirectory = false, - FilterIndex = _lastOpenRomFilter - }; - - var result = ofd.ShowHawkDialog(); - if (result != DialogResult.OK) - { - return; - } - - var file = new FileInfo(ofd.FileName); - _lastOpenRomFilter = ofd.FilterIndex; - - var lra = new LoadRomArgs { OpenAdvanced = new OpenAdvanced_OpenRom { Path = file.FullName } }; - LoadRom(file.FullName, lra); - } - - private void CoreSyncSettings(object sender, RomLoader.SettingsLoadArgs e) - { - if (Global.MovieSession.QueuedMovie != null) - { - if (!string.IsNullOrWhiteSpace(Global.MovieSession.QueuedMovie.SyncSettingsJson)) - { - e.Settings = ConfigService.LoadWithType(Global.MovieSession.QueuedMovie.SyncSettingsJson); - } - else - { - e.Settings = Global.Config.GetCoreSyncSettings(e.Core); - - // adelikat: only show this nag if the core actually has sync settings, not all cores do - if (e.Settings != null && !_supressSyncSettingsWarning) - { - MessageBox.Show( - "No sync settings found, using currently configured settings for this core.", - "No sync settings found", - MessageBoxButtons.OK, - MessageBoxIcon.Warning); - } - } - } - else - { - e.Settings = Global.Config.GetCoreSyncSettings(e.Core); - } - } - - private static void CoreSettings(object sender, RomLoader.SettingsLoadArgs e) - { - e.Settings = Global.Config.GetCoreSettings(e.Core); - } - - /// - /// send core settings to emu, setting reboot flag if needed - /// - public void PutCoreSettings(object o) - { - var settable = new SettingsAdapter(Emulator); - if (settable.HasSettings && settable.PutSettings(o)) - { - FlagNeedsReboot(); - } - } - - /// - /// send core sync settings to emu, setting reboot flag if needed - /// - public void PutCoreSyncSettings(object o) - { - var settable = new SettingsAdapter(Emulator); - if (Global.MovieSession.Movie.IsActive) - { - GlobalWin.OSD.AddMessage("Attempt to change sync-relevant settings while recording BLOCKED."); - } - else if (settable.HasSyncSettings && settable.PutSyncSettings(o)) - { - FlagNeedsReboot(); - } - } - - private void SaveConfig(string path = "") - { - if (Global.Config.SaveWindowPosition) - { - if (Global.Config.MainWndx != -32000) // When minimized location is -32000, don't save this into the config file! - { - Global.Config.MainWndx = Location.X; - } - - if (Global.Config.MainWndy != -32000) - { - Global.Config.MainWndy = Location.Y; - } - } - else - { - Global.Config.MainWndx = -1; - Global.Config.MainWndy = -1; - } - - if (Global.Config.ShowLogWindow) - { - LogConsole.SaveConfigSettings(); - } - - if (string.IsNullOrEmpty(path)) - { - path = PathManager.DefaultIniPath; - } - - ConfigService.Save(path, Global.Config); - } - - private static void ToggleFps() - { - Global.Config.DisplayFPS ^= true; - } - - private static void ToggleFrameCounter() - { - Global.Config.DisplayFrameCounter ^= true; - } - - private static void ToggleLagCounter() - { - Global.Config.DisplayLagCounter ^= true; - } - - private static void ToggleInputDisplay() - { - Global.Config.DisplayInput ^= true; - } - - private static void ToggleSound() - { - Global.Config.SoundEnabled ^= true; - GlobalWin.Sound.StopSound(); - GlobalWin.Sound.StartSound(); - } - - private static void VolumeUp() - { - Global.Config.SoundVolume += 10; - if (Global.Config.SoundVolume > 100) - { - Global.Config.SoundVolume = 100; - } - - GlobalWin.OSD.AddMessage("Volume " + Global.Config.SoundVolume); - } - - private static void VolumeDown() - { - Global.Config.SoundVolume -= 10; - if (Global.Config.SoundVolume < 0) - { - Global.Config.SoundVolume = 0; - } - - GlobalWin.OSD.AddMessage("Volume " + Global.Config.SoundVolume); - } - - private void SoftReset() - { - // is it enough to run this for one frame? maybe.. - if (Emulator.ControllerDefinition.BoolButtons.Contains("Reset")) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("Reset"); - GlobalWin.OSD.AddMessage("Reset button pressed."); - } - } - } - - private void HardReset() - { - // is it enough to run this for one frame? maybe.. - if (Emulator.ControllerDefinition.BoolButtons.Contains("Power")) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click("Power"); - GlobalWin.OSD.AddMessage("Power button pressed."); - } - } - } - - private void UpdateStatusSlots() - { - _stateSlots.Update(); - - Slot0StatusButton.ForeColor = _stateSlots.HasSlot(0) ? Global.Config.SaveSlot == 0 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot1StatusButton.ForeColor = _stateSlots.HasSlot(1) ? Global.Config.SaveSlot == 1 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot2StatusButton.ForeColor = _stateSlots.HasSlot(2) ? Global.Config.SaveSlot == 2 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot3StatusButton.ForeColor = _stateSlots.HasSlot(3) ? Global.Config.SaveSlot == 3 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot4StatusButton.ForeColor = _stateSlots.HasSlot(4) ? Global.Config.SaveSlot == 4 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot5StatusButton.ForeColor = _stateSlots.HasSlot(5) ? Global.Config.SaveSlot == 5 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot6StatusButton.ForeColor = _stateSlots.HasSlot(6) ? Global.Config.SaveSlot == 6 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot7StatusButton.ForeColor = _stateSlots.HasSlot(7) ? Global.Config.SaveSlot == 7 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot8StatusButton.ForeColor = _stateSlots.HasSlot(8) ? Global.Config.SaveSlot == 8 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - Slot9StatusButton.ForeColor = _stateSlots.HasSlot(9) ? Global.Config.SaveSlot == 9 ? SystemColors.HighlightText : SystemColors.WindowText : SystemColors.GrayText; - - Slot0StatusButton.BackColor = Global.Config.SaveSlot == 0 ? SystemColors.Highlight : SystemColors.Control; - Slot1StatusButton.BackColor = Global.Config.SaveSlot == 1 ? SystemColors.Highlight : SystemColors.Control; - Slot2StatusButton.BackColor = Global.Config.SaveSlot == 2 ? SystemColors.Highlight : SystemColors.Control; - Slot3StatusButton.BackColor = Global.Config.SaveSlot == 3 ? SystemColors.Highlight : SystemColors.Control; - Slot4StatusButton.BackColor = Global.Config.SaveSlot == 4 ? SystemColors.Highlight : SystemColors.Control; - Slot5StatusButton.BackColor = Global.Config.SaveSlot == 5 ? SystemColors.Highlight : SystemColors.Control; - Slot6StatusButton.BackColor = Global.Config.SaveSlot == 6 ? SystemColors.Highlight : SystemColors.Control; - Slot7StatusButton.BackColor = Global.Config.SaveSlot == 7 ? SystemColors.Highlight : SystemColors.Control; - Slot8StatusButton.BackColor = Global.Config.SaveSlot == 8 ? SystemColors.Highlight : SystemColors.Control; - Slot9StatusButton.BackColor = Global.Config.SaveSlot == 9 ? SystemColors.Highlight : SystemColors.Control; - - SaveSlotsStatusLabel.Visible = - Slot0StatusButton.Visible = - Slot1StatusButton.Visible = - Slot2StatusButton.Visible = - Slot3StatusButton.Visible = - Slot4StatusButton.Visible = - Slot5StatusButton.Visible = - Slot6StatusButton.Visible = - Slot7StatusButton.Visible = - Slot8StatusButton.Visible = - Slot9StatusButton.Visible = - Emulator.HasSavestates(); - } - - public BitmapBuffer CaptureOSD() - { - var bb = GlobalWin.DisplayManager.RenderOffscreen(_currentVideoProvider, true); - bb.DiscardAlpha(); - return bb; - } - - private void IncreaseWindowSize() - { - switch (Global.Config.TargetZoomFactors[Emulator.SystemId]) - { - case 1: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 2; - break; - case 2: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 3; - break; - case 3: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 4; - break; - case 4: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 5; - break; - case 5: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 10; - break; - case 10: - return; - } - - GlobalWin.OSD.AddMessage("Screensize set to " + Global.Config.TargetZoomFactors[Emulator.SystemId] + "x"); - FrameBufferResized(); - } - - private void DecreaseWindowSize() - { - switch (Global.Config.TargetZoomFactors[Emulator.SystemId]) - { - case 1: - return; - case 2: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 1; - break; - case 3: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 2; - break; - case 4: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 3; - break; - case 5: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 4; - break; - case 10: - Global.Config.TargetZoomFactors[Emulator.SystemId] = 5; - return; - } - - GlobalWin.OSD.AddMessage("Screensize set to " + Global.Config.TargetZoomFactors[Emulator.SystemId] + "x"); - FrameBufferResized(); - } - - private void IncreaseSpeed() - { - if (!Global.Config.ClockThrottle) - { - GlobalWin.OSD.AddMessage("Unable to change speed, please switch to clock throttle"); - return; - } - - var oldp = Global.Config.SpeedPercent; - int newp; - - if (oldp < 3) - { - newp = 3; - } - else if (oldp < 6) - { - newp = 6; - } - else if (oldp < 12) - { - newp = 12; - } - else if (oldp < 25) - { - newp = 25; - } - else if (oldp < 50) - { - newp = 50; - } - else if (oldp < 75) - { - newp = 75; - } - else if (oldp < 100) - { - newp = 100; - } - else if (oldp < 150) - { - newp = 150; - } - else if (oldp < 200) - { - newp = 200; - } - else if (oldp < 300) - { - newp = 300; - } - else if (oldp < 400) - { - newp = 400; - } - else if (oldp < 800) - { - newp = 800; - } - else if (oldp < 1600) - { - newp = 1600; - } - else if (oldp < 3200) - { - newp = 3200; - } - else - { - newp = 6400; - } - - SetSpeedPercent(newp); - } - - private void DecreaseSpeed() - { - if (!Global.Config.ClockThrottle) - { - GlobalWin.OSD.AddMessage("Unable to change speed, please switch to clock throttle"); - return; - } - - var oldp = Global.Config.SpeedPercent; - int newp; - - if (oldp > 3200) - { - newp = 3200; - } - else if (oldp > 1600) - { - newp = 1600; - } - else if (oldp > 800) - { - newp = 800; - } - else if (oldp > 400) - { - newp = 400; - } - else if (oldp > 300) - { - newp = 300; - } - else if (oldp > 200) - { - newp = 200; - } - else if (oldp > 150) - { - newp = 150; - } - else if (oldp > 100) - { - newp = 100; - } - else if (oldp > 75) - { - newp = 75; - } - else if (oldp > 50) - { - newp = 50; - } - else if (oldp > 25) - { - newp = 25; - } - else if (oldp > 12) - { - newp = 12; - } - else if (oldp > 6) - { - newp = 6; - } - else if (oldp > 3) - { - newp = 3; - } - else - { - newp = 1; - } - - SetSpeedPercent(newp); - } - - private static void SaveMovie() - { - if (Global.MovieSession.Movie.IsActive) - { - Global.MovieSession.Movie.Save(); - GlobalWin.OSD.AddMessage(Global.MovieSession.Movie.Filename + " saved."); - } - } - - private void HandleToggleLightAndLink() - { - if (MainStatusBar.Visible) - { - var hasDriveLight = Emulator.HasDriveLight() && Emulator.AsDriveLight().DriveLightEnabled; - - if (hasDriveLight) - { - if (!LedLightStatusLabel.Visible) - { - LedLightStatusLabel.Visible = true; - } - - LedLightStatusLabel.Image = Emulator.AsDriveLight().DriveLightOn - ? _statusBarDiskLightOnImage - : _statusBarDiskLightOffImage; - } - else - { - if (LedLightStatusLabel.Visible) - { - LedLightStatusLabel.Visible = false; - } - } - - if (Emulator.UsesLinkCable()) - { - if (!LinkConnectStatusBarButton.Visible) - { - LinkConnectStatusBarButton.Visible = true; - } - - LinkConnectStatusBarButton.Image = Emulator.AsLinkable().LinkConnected - ? _linkCableOn - : _linkCableOff; - } - else - { - if (LinkConnectStatusBarButton.Visible) - { - LinkConnectStatusBarButton.Visible = false; - } - } - } - } - - private void UpdateKeyPriorityIcon() - { - switch (Global.Config.Input_Hotkey_OverrideOptions) - { - default: - case 0: - KeyPriorityStatusLabel.Image = Properties.Resources.Both; - KeyPriorityStatusLabel.ToolTipText = "Key priority: Allow both hotkeys and controller buttons"; - break; - case 1: - KeyPriorityStatusLabel.Image = Properties.Resources.GameController; - KeyPriorityStatusLabel.ToolTipText = "Key priority: Controller buttons will override hotkeys"; - break; - case 2: - KeyPriorityStatusLabel.Image = Properties.Resources.HotKeys; - KeyPriorityStatusLabel.ToolTipText = "Key priority: Hotkeys will override controller buttons"; - break; - } - } - - private static void ToggleModePokeMode() - { - Global.Config.MoviePlaybackPokeMode ^= true; - GlobalWin.OSD.AddMessage(Global.Config.MoviePlaybackPokeMode ? "Movie Poke mode enabled" : "Movie Poke mode disabled"); - } - - private static void ToggleBackgroundInput() - { - Global.Config.AcceptBackgroundInput ^= true; - GlobalWin.OSD.AddMessage(Global.Config.AcceptBackgroundInput - ? "Background Input enabled" - : "Background Input disabled"); - } - - private static void VsyncMessage() - { - GlobalWin.OSD.AddMessage( - "Display Vsync set to " + (Global.Config.VSync ? "on" : "off")); - } - - private static bool StateErrorAskUser(string title, string message) - { - var result = MessageBox.Show( - message, - title, - MessageBoxButtons.YesNo, - MessageBoxIcon.Question); - - return result == DialogResult.Yes; - } - - private void FdsInsertDiskMenuAdd(string name, string button, string msg) - { - FDSControlsMenuItem.DropDownItems.Add(name, null, delegate - { - if (Emulator.ControllerDefinition.BoolButtons.Contains(button)) - { - if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished) - { - Global.ClickyVirtualPadController.Click(button); - GlobalWin.OSD.AddMessage(msg); - } - } - }); - } - - private const int WmDevicechange = 0x0219; - - // Alt key hacks - protected override void WndProc(ref Message m) - { - switch (m.Msg) - { - case WmDevicechange: - GamePad.Initialize(); - GamePad360.Initialize(); - break; - } - - // this is necessary to trap plain alt keypresses so that only our hotkey system gets them - if (m.Msg == 0x0112) // WM_SYSCOMMAND - { - if (m.WParam.ToInt32() == 0xF100) // SC_KEYMENU - { - return; - } - } - - base.WndProc(ref m); - } - - protected override bool ProcessDialogChar(char charCode) - { - // this is necessary to trap alt+char combinations so that only our hotkey system gets them - return (ModifierKeys & Keys.Alt) != 0 || base.ProcessDialogChar(charCode); - } - - private void UpdateCoreStatusBarButton() - { - if (Emulator.IsNull()) - { - CoreNameStatusBarButton.Visible = false; - return; - } - - CoreNameStatusBarButton.Visible = true; - var attributes = Emulator.Attributes(); - - CoreNameStatusBarButton.Text = Emulator.DisplayName(); - CoreNameStatusBarButton.Image = Emulator.Icon(); - CoreNameStatusBarButton.ToolTipText = attributes.Ported ? "(ported) " : ""; - - - if (Emulator.SystemId == "ZXSpectrum") - { - var core = (Emulation.Cores.Computers.SinclairSpectrum.ZXSpectrum)Emulator as Emulation.Cores.Computers.SinclairSpectrum.ZXSpectrum; - CoreNameStatusBarButton.ToolTipText = core.GetMachineType(); - } - - if (Emulator.SystemId == "AmstradCPC") - { - var core = (Emulation.Cores.Computers.AmstradCPC.AmstradCPC)Emulator as Emulation.Cores.Computers.AmstradCPC.AmstradCPC; - CoreNameStatusBarButton.ToolTipText = core.GetMachineType(); - } - } - - private void ToggleKeyPriority() - { - Global.Config.Input_Hotkey_OverrideOptions++; - if (Global.Config.Input_Hotkey_OverrideOptions > 2) - { - Global.Config.Input_Hotkey_OverrideOptions = 0; - } - - UpdateKeyPriorityIcon(); - switch (Global.Config.Input_Hotkey_OverrideOptions) - { - case 0: - GlobalWin.OSD.AddMessage("Key priority set to Both Hotkey and Input"); - break; - case 1: - GlobalWin.OSD.AddMessage("Key priority set to Input over Hotkey"); - break; - case 2: - GlobalWin.OSD.AddMessage("Key priority set to Input"); - break; - } - } - - #endregion - - #region Frame Loop - - private void StepRunLoop_Throttle() - { - SyncThrottle(); - _throttle.signal_frameAdvance = _runloopFrameAdvance; - _throttle.signal_continuousFrameAdvancing = _runloopFrameProgress; - - _throttle.Step(true, -1); - } - - public void FrameAdvance() - { - PressFrameAdvance = true; - StepRunLoop_Core(true); - } - - public void SeekFrameAdvance() - { - PressFrameAdvance = true; - StepRunLoop_Core(true); - PressFrameAdvance = false; - } - - public bool IsLagFrame - { - get - { - if (Emulator.CanPollInput()) - { - return Emulator.AsInputPollable().IsLagFrame; - } - - return false; - } - } - - private void StepRunLoop_Core(bool force = false) - { - var runFrame = false; - _runloopFrameAdvance = false; - var currentTimestamp = Stopwatch.GetTimestamp(); - - double frameAdvanceTimestampDeltaMs = (double)(currentTimestamp - _frameAdvanceTimestamp) / Stopwatch.Frequency * 1000.0; - bool frameProgressTimeElapsed = frameAdvanceTimestampDeltaMs >= Global.Config.FrameProgressDelayMs; - - if (Global.Config.SkipLagFrame && IsLagFrame && frameProgressTimeElapsed && Emulator.Frame > 0) - { - runFrame = true; - } - - if (Global.ClientControls["Frame Advance"] || PressFrameAdvance || HoldFrameAdvance) - { - _runloopFrameAdvance = true; - - // handle the initial trigger of a frame advance - if (_frameAdvanceTimestamp == 0) - { - PauseEmulator(); - runFrame = true; - _frameAdvanceTimestamp = currentTimestamp; - } - else - { - // handle the timed transition from countdown to FrameProgress - if (frameProgressTimeElapsed) - { - runFrame = true; - _runloopFrameProgress = true; - UnpauseEmulator(); - } - } - } - else - { - // handle release of frame advance: do we need to deactivate FrameProgress? - if (_runloopFrameProgress) - { - _runloopFrameProgress = false; - PauseEmulator(); - } - - _frameAdvanceTimestamp = 0; - } - - if (!EmulatorPaused) - { - runFrame = true; - } - - bool returnToRecording; - bool isRewinding = Rewind(ref runFrame, currentTimestamp, out returnToRecording); - - float atten = 0; - - if (runFrame || force) - { - var isFastForwarding = Global.ClientControls["Fast Forward"] || IsTurboing; - var isFastForwardingOrRewinding = isFastForwarding || isRewinding || _unthrottled; - - if (isFastForwardingOrRewinding != _lastFastForwardingOrRewinding) - { - InitializeFpsData(); - } - - _lastFastForwardingOrRewinding = isFastForwardingOrRewinding; - - // client input-related duties - GlobalWin.OSD.ClearGUIText(); - - Global.CheatList.Pulse(); - - // zero 03-may-2014 - moved this before call to UpdateToolsBefore(), since it seems to clear the state which a lua event.framestart is going to want to alter - Global.ClickyVirtualPadController.FrameTick(); - Global.LuaAndAdaptor.FrameTick(); - - if (GlobalWin.Tools.Has() && !SuppressLua) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallFrameBeforeEvent(); - } - - if (IsTurboing) - { - GlobalWin.Tools.FastUpdateBefore(); - } - else - { - GlobalWin.Tools.UpdateToolsBefore(); - } - - _framesSinceLastFpsUpdate++; - - UpdateFpsDisplay(currentTimestamp, isRewinding, isFastForwarding); - - CaptureRewind(isRewinding); - - // Set volume, if enabled - if (Global.Config.SoundEnabledNormal) - { - atten = Global.Config.SoundVolume / 100.0f; - - if (isFastForwardingOrRewinding) - { - if (Global.Config.SoundEnabledRWFF) - { - atten *= Global.Config.SoundVolumeRWFF / 100.0f; - } - else - { - atten = 0; - } - } - - // Mute if using Frame Advance/Frame Progress - if (_runloopFrameAdvance && Global.Config.MuteFrameAdvance) - { - atten = 0; - } - } - - Global.MovieSession.HandleMovieOnFrameLoop(); - - if (Global.Config.AutosaveSaveRAM) - { - if (AutoFlushSaveRamIn-- <= 0) - { - FlushSaveRAM(true); - } - } - // why not skip audio if the user doesnt want sound - bool renderSound = (Global.Config.SoundEnabled && !IsTurboing) || (_currAviWriter?.UsesAudio ?? false); - if (!renderSound) - { - atten = 0; - } - - bool render = !_throttle.skipNextFrame || (_currAviWriter?.UsesVideo ?? false); - Emulator.FrameAdvance(Global.ControllerOutput, render, renderSound); - - Global.MovieSession.HandleMovieAfterFrameLoop(); - - if (returnToRecording) - { - Global.MovieSession.Movie.SwitchToRecord(); - } - - if (isRewinding && !IsRewindSlave && Global.MovieSession.Movie.IsRecording) - { - Global.MovieSession.Movie.Truncate(Global.Emulator.Frame); - } - - Global.CheatList.Pulse(); - - if (IsLagFrame && Global.Config.AutofireLagFrames) - { - Global.AutoFireController.IncrementStarts(); - } - - Global.AutofireStickyXORAdapter.IncrementLoops(IsLagFrame); - - PressFrameAdvance = false; - - if (GlobalWin.Tools.Has() && !SuppressLua) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallFrameAfterEvent(); - } - - if (IsTurboing) - { - GlobalWin.Tools.FastUpdateAfter(SuppressLua); - } - else - { - UpdateToolsAfter(SuppressLua); - } - - if (!PauseAvi) - { - AvFrameAdvance(); - } - - if (GlobalWin.Tools.IsLoaded() && - GlobalWin.Tools.TAStudio.LastPositionFrame == Emulator.Frame) - { - if (PauseOnFrame.HasValue && - PauseOnFrame.Value <= GlobalWin.Tools.TAStudio.LastPositionFrame) - { - TasMovieRecord record = (Global.MovieSession.Movie as TasMovie)[Emulator.Frame]; - if (!record.Lagged.HasValue && IsSeeking) - { - // haven't yet greenzoned the frame, hence it's after editing - // then we want to pause here. taseditor fasion - PauseEmulator(); - } - } - } - - if (IsSeeking && Emulator.Frame == PauseOnFrame.Value) - { - PauseEmulator(); - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.StopSeeking(); - } - PauseOnFrame = null; - } - } - - if (Global.ClientControls["Rewind"] || PressRewind) - { - UpdateToolsAfter(); - } - - GlobalWin.Sound.UpdateSound(atten); - } - - private void UpdateFpsDisplay(long currentTimestamp, bool isRewinding, bool isFastForwarding) - { - double elapsedSeconds = (currentTimestamp - _timestampLastFpsUpdate) / (double)Stopwatch.Frequency; - - if (elapsedSeconds < 1.0 / _fpsUpdatesPerSecond) - { - return; - } - - if (_lastFps == 0) // Initial calculation - { - _lastFps = (_framesSinceLastFpsUpdate - 1) / elapsedSeconds; - } - else - { - _lastFps = (_lastFps + (_framesSinceLastFpsUpdate * _fpsSmoothing)) / (1.0 + (elapsedSeconds * _fpsSmoothing)); - } - - _framesSinceLastFpsUpdate = 0; - _timestampLastFpsUpdate = currentTimestamp; - - var fpsString = $"{_lastFps:0} fps"; - if (isRewinding) - { - fpsString += IsTurboing || isFastForwarding ? - " <<<<" : - " <<"; - } - else if (isFastForwarding) - { - fpsString += IsTurboing ? - " >>>>" : - " >>"; - } - - GlobalWin.OSD.FPS = fpsString; - - // need to refresh window caption in this case - if (Global.Config.DispSpeedupFeatures == 0) - { - SetWindowText(); - } - } - - private void InitializeFpsData() - { - _lastFps = 0; - _timestampLastFpsUpdate = Stopwatch.GetTimestamp(); - _framesSinceLastFpsUpdate = 0; - } - - #endregion - - #region AVI Stuff - - /// - /// start AVI recording, unattended - /// - /// match the short name of an - /// filename to save to - private void RecordAv(string videowritername, string filename) - { - RecordAvBase(videowritername, filename, true); - } - - /// - /// start AV recording, asking user for filename and options - /// - private void RecordAv() - { - RecordAvBase(null, null, false); - } - - /// - /// start AV recording - /// - private void RecordAvBase(string videowritername, string filename, bool unattended) - { - if (_currAviWriter != null) - { - return; - } - - // select IVideoWriter to use - IVideoWriter aw; - - if (string.IsNullOrEmpty(videowritername) && !string.IsNullOrEmpty(Global.Config.VideoWriter)) - { - videowritername = Global.Config.VideoWriter; - } - - _dumpaudiosync = Global.Config.VideoWriterAudioSync; - if (unattended && !string.IsNullOrEmpty(videowritername)) - { - aw = VideoWriterInventory.GetVideoWriter(videowritername); - } - else - { - aw = VideoWriterChooserForm.DoVideoWriterChoserDlg(VideoWriterInventory.GetAllWriters(), this, - out _avwriterResizew, out _avwriterResizeh, out _avwriterpad, ref _dumpaudiosync); - } - - if (aw == null) - { - GlobalWin.OSD.AddMessage( - unattended ? $"Couldn't start video writer \"{videowritername}\"" : "A/V capture canceled."); - - return; - } - - try - { - bool usingAvi = aw is AviWriter; // SO GROSS! - - if (_dumpaudiosync) - { - aw = new VideoStretcher(aw); - } - else - { - aw = new AudioStretcher(aw); - } - - aw.SetMovieParameters(Emulator.VsyncNumerator(), Emulator.VsyncDenominator()); - if (_avwriterResizew > 0 && _avwriterResizeh > 0) - { - aw.SetVideoParameters(_avwriterResizew, _avwriterResizeh); - } - else - { - aw.SetVideoParameters(_currentVideoProvider.BufferWidth, _currentVideoProvider.BufferHeight); - } - - aw.SetAudioParameters(44100, 2, 16); - - // select codec token - // do this before save dialog because ffmpeg won't know what extension it wants until it's been configured - if (unattended && !string.IsNullOrEmpty(filename)) - { - aw.SetDefaultVideoCodecToken(); - } - else - { - // THIS IS REALLY SLOPPY! - // PLEASE REDO ME TO NOT CARE WHICH AVWRITER IS USED! - if (usingAvi && !string.IsNullOrEmpty(Global.Config.AVICodecToken)) - { - aw.SetDefaultVideoCodecToken(); - } - - var token = aw.AcquireVideoCodecToken(this); - if (token == null) - { - GlobalWin.OSD.AddMessage("A/V capture canceled."); - aw.Dispose(); - return; - } - - aw.SetVideoCodecToken(token); - } - - // select file to save to - if (unattended && !string.IsNullOrEmpty(filename)) - { - aw.OpenFile(filename); - } - else - { - string ext = aw.DesiredExtension(); - string pathForOpenFile; - - // handle directories first - if (ext == "") - { - var fbd = new FolderBrowserEx(); - if (fbd.ShowDialog() == DialogResult.Cancel) - { - aw.Dispose(); - return; - } - - pathForOpenFile = fbd.SelectedPath; - } - else - { - var sfd = new SaveFileDialog(); - if (Global.Game != null) - { - sfd.FileName = PathManager.FilesystemSafeName(Global.Game) + "." + ext; // dont use Path.ChangeExtension, it might wreck game names with dots in them - sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.AvPathFragment, null); - } - else - { - sfd.FileName = "NULL"; - sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.AvPathFragment, null); - } - - sfd.Filter = string.Format("{0} (*.{0})|*.{0}|All Files|*.*", ext); - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.Cancel) - { - aw.Dispose(); - return; - } - - pathForOpenFile = sfd.FileName; - } - - aw.OpenFile(pathForOpenFile); - } - - // commit the avi writing last, in case there were any errors earlier - _currAviWriter = aw; - GlobalWin.OSD.AddMessage("A/V capture started"); - AVIStatusLabel.Image = Properties.Resources.AVI; - AVIStatusLabel.ToolTipText = "A/V capture in progress"; - AVIStatusLabel.Visible = true; - } - catch - { - GlobalWin.OSD.AddMessage("A/V capture failed!"); - aw.Dispose(); - throw; - } - - if (_dumpaudiosync) - { - _currentSoundProvider.SetSyncMode(SyncSoundMode.Sync); - } - else - { - if (_currentSoundProvider.CanProvideAsync) - { - _currentSoundProvider.SetSyncMode(SyncSoundMode.Async); - _aviSoundInputAsync = _currentSoundProvider; - } - else - { - _currentSoundProvider.SetSyncMode(SyncSoundMode.Sync); - _aviSoundInputAsync = new SyncToAsyncProvider(_currentSoundProvider); - } - } - - _dumpProxy = new SimpleSyncSoundProvider(); - RewireSound(); - } - - private void AbortAv() - { - if (_currAviWriter == null) - { - _dumpProxy = null; - RewireSound(); - return; - } - - _currAviWriter.Dispose(); - _currAviWriter = null; - GlobalWin.OSD.AddMessage("A/V capture aborted"); - AVIStatusLabel.Image = Properties.Resources.Blank; - AVIStatusLabel.ToolTipText = ""; - AVIStatusLabel.Visible = false; - _aviSoundInputAsync = null; - _dumpProxy = null; // return to normal sound output - RewireSound(); - } - - private void StopAv() - { - if (_currAviWriter == null) - { - _dumpProxy = null; - RewireSound(); - return; - } - - _currAviWriter.CloseFile(); - _currAviWriter.Dispose(); - _currAviWriter = null; - GlobalWin.OSD.AddMessage("A/V capture stopped"); - AVIStatusLabel.Image = Properties.Resources.Blank; - AVIStatusLabel.ToolTipText = ""; - AVIStatusLabel.Visible = false; - _aviSoundInputAsync = null; - _dumpProxy = null; // return to normal sound output - RewireSound(); - } - - private void AvFrameAdvance() - { - if (_currAviWriter != null) - { - // TODO ZERO - this code is pretty jacked. we'll want to frugalize buffers better for speedier dumping, and we might want to rely on the GL layer for padding - try - { - // is this the best time to handle this? or deeper inside? - if (argParser._currAviWriterFrameList != null) - { - if (!argParser._currAviWriterFrameList.Contains(Emulator.Frame)) - { - goto HANDLE_AUTODUMP; - } - } - - IVideoProvider output; - IDisposable disposableOutput = null; - if (_avwriterResizew > 0 && _avwriterResizeh > 0) - { - BitmapBuffer bbin = null; - Bitmap bmpin = null; - try - { - bbin = Global.Config.AVI_CaptureOSD - ? CaptureOSD() - : new BitmapBuffer(_currentVideoProvider.BufferWidth, _currentVideoProvider.BufferHeight, _currentVideoProvider.GetVideoBuffer()); - - bbin.DiscardAlpha(); - - var bmpout = new Bitmap(_avwriterResizew, _avwriterResizeh, PixelFormat.Format32bppArgb); - bmpin = bbin.ToSysdrawingBitmap(); - using (var g = Graphics.FromImage(bmpout)) - { - if (_avwriterpad) - { - g.Clear(Color.FromArgb(_currentVideoProvider.BackgroundColor)); - g.DrawImageUnscaled(bmpin, (bmpout.Width - bmpin.Width) / 2, (bmpout.Height - bmpin.Height) / 2); - } - else - { - g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; - g.DrawImage(bmpin, new Rectangle(0, 0, bmpout.Width, bmpout.Height)); - } - } - - output = new BmpVideoProvider(bmpout, _currentVideoProvider.VsyncNumerator, _currentVideoProvider.VsyncDenominator); - disposableOutput = (IDisposable)output; - } - finally - { - bbin?.Dispose(); - bmpin?.Dispose(); - } - } - else - { - if (Global.Config.AVI_CaptureOSD) - { - output = new BitmapBufferVideoProvider(CaptureOSD()); - disposableOutput = (IDisposable)output; - } - else - { - output = _currentVideoProvider; - } - } - - _currAviWriter.SetFrame(Emulator.Frame); - - short[] samp; - int nsamp; - if (_dumpaudiosync) - { - ((VideoStretcher)_currAviWriter).DumpAV(output, _currentSoundProvider, out samp, out nsamp); - } - else - { - ((AudioStretcher)_currAviWriter).DumpAV(output, _aviSoundInputAsync, out samp, out nsamp); - } - - disposableOutput?.Dispose(); - - _dumpProxy.PutSamples(samp, nsamp); - } - catch (Exception e) - { - MessageBox.Show("Video dumping died:\n\n" + e); - AbortAv(); - } - - HANDLE_AUTODUMP: - if (argParser._autoDumpLength > 0) - { - argParser._autoDumpLength--; - if (argParser._autoDumpLength == 0) // finish - { - StopAv(); - if (argParser._autoCloseOnDump) - { - _exitRequestPending = true; - } - } - } - } - } - - private int? LoadArhiveChooser(HawkFile file) - { - var ac = new ArchiveChooser(file); - if (ac.ShowDialog(this) == DialogResult.OK) - { - return ac.SelectedMemberIndex; - } - - return null; - } - - #endregion - - #region Scheduled for refactor - - private void ShowMessageCoreComm(string message) - { - MessageBox.Show(this, message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - private void ShowLoadError(object sender, RomLoader.RomErrorArgs e) - { - if (e.Type == RomLoader.LoadErrorType.MissingFirmware) - { - var result = MessageBox.Show( - "You are missing the needed firmware files to load this Rom\n\nWould you like to open the firmware manager now and configure your firmwares?", - e.Message, - MessageBoxButtons.YesNo, - MessageBoxIcon.Error); - if (result == DialogResult.Yes) - { - FirmwaresMenuItem_Click(null, e); - if (e.Retry) - { - // Retry loading the ROM here. This leads to recursion, as the original call to LoadRom has not exited yet, - // but unless the user tries and fails to set his firmware a lot of times, nothing should happen. - // Refer to how RomLoader implemented its LoadRom method for a potential fix on this. - LoadRom(e.RomPath, _currentLoadRomArgs); - } - } - } - else - { - string title = "load error"; - if (e.AttemptedCoreLoad != null) - { - title = e.AttemptedCoreLoad + " load error"; - } - - MessageBox.Show(this, e.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - private void NotifyCoreComm(string message) - { - GlobalWin.OSD.AddMessage(message); - } - - private string ChoosePlatformForRom(RomGame rom) - { - var platformChooser = new PlatformChooser - { - RomGame = rom - }; - - platformChooser.ShowDialog(); - return platformChooser.PlatformChoice; - } - - public class LoadRomArgs - { - public bool? Deterministic { get; set; } - public IOpenAdvanced OpenAdvanced { get; set; } - } - - private LoadRomArgs _currentLoadRomArgs; - - public bool LoadRom(string path, LoadRomArgs args) - { - bool ret = _LoadRom(path, args); - if(!ret) return false; - - //what's the meaning of the last rom path when opening an archive? based on the archive file location - if (args.OpenAdvanced is OpenAdvanced_OpenRom) - { - var leftpart = path.Split('|')[0]; - Global.Config.LastRomPath = Path.GetFullPath(Path.GetDirectoryName(leftpart)); - } - - return true; - } - - // Still needs a good bit of refactoring - public bool _LoadRom(string path, LoadRomArgs args) - { - path = HawkFile.Util_ResolveLink(path); - - // default args - if (args == null) - { - args = new LoadRomArgs(); - } - - // if this is the first call to LoadRom (they will come in recursively) then stash the args - bool firstCall = false; - if (_currentLoadRomArgs == null) - { - firstCall = true; - _currentLoadRomArgs = args; - } - else - { - args = _currentLoadRomArgs; - } - - try - { - // movies should require deterministic emulation in ALL cases - // if the core is managing its own DE through SyncSettings a 'deterministic' bool can be passed into the core's constructor - // it is then up to the core itself to override its own local DeterministicEmulation setting - bool deterministic = args.Deterministic ?? Global.MovieSession.QueuedMovie != null; - - if (!GlobalWin.Tools.AskSave()) - { - return false; - } - - bool asLibretro = args.OpenAdvanced is OpenAdvanced_Libretro || args.OpenAdvanced is OpenAdvanced_LibretroNoGame; - - var loader = new RomLoader - { - ChooseArchive = LoadArhiveChooser, - ChoosePlatform = ChoosePlatformForRom, - Deterministic = deterministic, - MessageCallback = GlobalWin.OSD.AddMessage, - AsLibretro = asLibretro - }; - Global.FirmwareManager.RecentlyServed.Clear(); - - loader.OnLoadError += ShowLoadError; - loader.OnLoadSettings += CoreSettings; - loader.OnLoadSyncSettings += CoreSyncSettings; - - // this also happens in CloseGame(). But it needs to happen here since if we're restarting with the same core, - // any settings changes that we made need to make it back to config before we try to instantiate that core with - // the new settings objects - CommitCoreSettingsToConfig(); // adelikat: I Think by reordering things, this isn't necessary anymore - CloseGame(); - - var nextComm = CreateCoreComm(); - - // we need to inform LoadRom which Libretro core to use... - IOpenAdvanced ioa = args.OpenAdvanced; - if (ioa is IOpenAdvancedLibretro) - { - var ioaretro = (IOpenAdvancedLibretro)ioa; - - // prepare a core specification - // if it wasnt already specified, use the current default - if (ioaretro.CorePath == null) - { - ioaretro.CorePath = Global.Config.LibretroCore; - } - - nextComm.LaunchLibretroCore = ioaretro.CorePath; - if (nextComm.LaunchLibretroCore == null) - { - throw new InvalidOperationException("Can't load a file via Libretro until a core is specified"); - } - } - - if (ioa is OpenAdvanced_OpenRom) - { - var ioa_openrom = (OpenAdvanced_OpenRom)ioa; - path = ioa_openrom.Path; - } - - CoreFileProvider.SyncCoreCommInputSignals(nextComm); - var result = loader.LoadRom(path, nextComm); - - // we need to replace the path in the OpenAdvanced with the canonical one the user chose. - // It can't be done until loder.LoadRom happens (for CanonicalFullPath) - // i'm not sure this needs to be more abstractly engineered yet until we have more OpenAdvanced examples - if (ioa is OpenAdvanced_Libretro) - { - var oaretro = ioa as OpenAdvanced_Libretro; - oaretro.token.Path = loader.CanonicalFullPath; - } - - if (ioa is OpenAdvanced_OpenRom) - { - ((OpenAdvanced_OpenRom)ioa).Path = loader.CanonicalFullPath; - } - - if (result) - { - - string loaderName = "*" + OpenAdvancedSerializer.Serialize(ioa); - Emulator = loader.LoadedEmulator; - Global.Game = loader.Game; - CoreFileProvider.SyncCoreCommInputSignals(nextComm); - InputManager.SyncControls(); - - if (ioa is OpenAdvanced_OpenRom) - { - OpenAdvanced_OpenRom ioa_openRom = ioa as OpenAdvanced_OpenRom; - - if (Path.GetExtension(ioa_openRom.Path.Replace("|","")).ToLower() == ".xml") - { - // this is a multi-disk bundler file - // determine the xml assets and create RomStatusDetails for all of them - var xmlGame = XmlGame.Create(new HawkFile(ioa_openRom.Path)); - - StringWriter xSw = new StringWriter(); - - for (int xg = 0; xg < xmlGame.Assets.Count; xg++) - { - var ext = Path.GetExtension(xmlGame.AssetFullPaths[xg]).ToLower(); - - if (ext == ".cue" || ext == ".ccd" || ext == ".toc" || ext == ".mds") - { - xSw.WriteLine(Path.GetFileNameWithoutExtension(xmlGame.Assets[xg].Key)); - xSw.WriteLine("SHA1:N/A"); - xSw.WriteLine("MD5:N/A"); - xSw.WriteLine(); - } - else - { - xSw.WriteLine(xmlGame.Assets[xg].Key); - xSw.WriteLine("SHA1:" + xmlGame.Assets[xg].Value.HashSHA1()); - xSw.WriteLine("MD5:" + xmlGame.Assets[xg].Value.HashMD5()); - xSw.WriteLine(); - } - } - - Emulator.CoreComm.RomStatusDetails = xSw.ToString(); - Emulator.CoreComm.RomStatusAnnotation = "Multi-disk bundler"; - } - } - - if (Emulator is TI83 && Global.Config.TI83autoloadKeyPad) - { - GlobalWin.Tools.Load(); - } - - if (loader.LoadedEmulator is NES) - { - var nes = (NES)loader.LoadedEmulator; - if (!string.IsNullOrWhiteSpace(nes.GameName)) - { - Global.Game.Name = nes.GameName; - } - - Global.Game.Status = nes.RomStatus; - } - else if (loader.LoadedEmulator is QuickNES) - { - var qns = (QuickNES)loader.LoadedEmulator; - if (!string.IsNullOrWhiteSpace(qns.BootGodName)) - { - Global.Game.Name = qns.BootGodName; - } - - if (qns.BootGodStatus.HasValue) - { - Global.Game.Status = qns.BootGodStatus.Value; - } - } - - if (Emulator.CoreComm.RomStatusDetails == null && loader.Rom != null) - { - Emulator.CoreComm.RomStatusDetails = $"{loader.Game.Name}\r\nSHA1:{loader.Rom.RomData.HashSHA1()}\r\nMD5:{loader.Rom.RomData.HashMD5()}\r\n"; - } - else if (Emulator.CoreComm.RomStatusDetails == null && loader.Rom == null) - { - // single disc game - Emulator.CoreComm.RomStatusDetails = $"{loader.Game.Name}\r\nSHA1:N/A\r\nMD5:N/A\r\n"; - } - - if (Emulator.HasBoardInfo()) - { - Console.WriteLine("Core reported BoardID: \"{0}\"", Emulator.AsBoardInfo().BoardName); - } - - // restarts the lua console if a different rom is loaded. - // im not really a fan of how this is done.. - if (Global.Config.RecentRoms.Empty || Global.Config.RecentRoms.MostRecent != loaderName) - { - GlobalWin.Tools.Restart(); - } - - Global.Config.RecentRoms.Add(loaderName); - JumpLists.AddRecentItem(loaderName, ioa.DisplayName); - - // Don't load Save Ram if a movie is being loaded - if (!Global.MovieSession.MovieIsQueued) - { - if (File.Exists(PathManager.SaveRamPath(loader.Game))) - { - LoadSaveRam(); - } - else if (Global.Config.AutosaveSaveRAM && File.Exists(PathManager.AutoSaveRamPath(loader.Game))) - { - GlobalWin.OSD.AddMessage("AutoSaveRAM found, but SaveRAM was not saved"); - } - } - - ApiManager.Restart(Emulator.ServiceProvider); - GlobalWin.Tools.Restart(); - - if (Global.Config.LoadCheatFileByGame) - { - Global.CheatList.SetDefaultFileName(ToolManager.GenerateDefaultCheatFilename()); - if (Global.CheatList.AttemptToLoadCheatFile()) - { - GlobalWin.OSD.AddMessage("Cheats file loaded"); - } - else if (Global.CheatList.Any()) - { - Global.CheatList.Clear(); - } - } - - SetWindowText(); - _currentlyOpenRomPoopForAdvancedLoaderPleaseRefactorMe = loaderName; - CurrentlyOpenRom = loaderName.Replace("*OpenRom*", ""); // POOP - HandlePlatformMenus(); - _stateSlots.Clear(); - UpdateCoreStatusBarButton(); - UpdateDumpIcon(); - SetMainformMovieInfo(); - CurrentlyOpenRomArgs = args; - GlobalWin.DisplayManager.Blank(); - - Global.Rewinder.Initialize(); - - Global.StickyXORAdapter.ClearStickies(); - Global.StickyXORAdapter.ClearStickyFloats(); - Global.AutofireStickyXORAdapter.ClearStickies(); - - RewireSound(); - ToolFormBase.UpdateCheatRelatedTools(null, null); - if (Global.Config.AutoLoadLastSaveSlot && _stateSlots.HasSlot(Global.Config.SaveSlot)) - { - LoadQuickSave("QuickSave" + Global.Config.SaveSlot); - } - - if (Global.FirmwareManager.RecentlyServed.Count > 0) - { - Console.WriteLine("Active Firmwares:"); - foreach (var f in Global.FirmwareManager.RecentlyServed) - { - Console.WriteLine(" {0} : {1}", f.FirmwareId, f.Hash); - } - } - - ClientApi.OnRomLoaded(Emulator); - return true; - } - else - { - // This shows up if there's a problem - // TODO: put all these in a single method or something - - // The ROM has been loaded by a recursive invocation of the LoadROM method. - if (!(Emulator is NullEmulator)) - { - ClientApi.OnRomLoaded(Emulator); - return true; - } - - ClientApi.UpdateEmulatorAndVP(Emulator); - HandlePlatformMenus(); - _stateSlots.Clear(); - UpdateStatusSlots(); - UpdateCoreStatusBarButton(); - UpdateDumpIcon(); - SetMainformMovieInfo(); - SetWindowText(); - return false; - } - } - finally - { - if (firstCall) - { - _currentLoadRomArgs = null; - } - } - } - - private string _currentlyOpenRomPoopForAdvancedLoaderPleaseRefactorMe = ""; - - private void CommitCoreSettingsToConfig() - { - // save settings object - var t = Emulator.GetType(); - var settable = new SettingsAdapter(Emulator); - - if (settable.HasSettings) - { - Global.Config.PutCoreSettings(settable.GetSettings(), t); - } - - if (settable.HasSyncSettings && !Global.MovieSession.Movie.IsActive) - { - // don't trample config with loaded-from-movie settings - Global.Config.PutCoreSyncSettings(settable.GetSyncSettings(), t); - } - } - - // whats the difference between these two methods?? - // its very tricky. rename to be more clear or combine them. - // This gets called whenever a core related thing is changed. - // Like reboot core. - private void CloseGame(bool clearSram = false) - { - GameIsClosing = true; - if (clearSram) - { - var path = PathManager.SaveRamPath(Global.Game); - if (File.Exists(path)) - { - File.Delete(path); - GlobalWin.OSD.AddMessage("SRAM cleared."); - } - } - else if (Emulator.HasSaveRam() && Emulator.AsSaveRam().SaveRamModified) - { - if (!FlushSaveRAM()) - { - var msgRes = MessageBox.Show("Failed flushing the game's Save RAM to your disk.\nClose without flushing Save RAM?", - "Directory IO Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - - if (msgRes != DialogResult.Yes) - { - return; - } - } - } - - StopAv(); - - CommitCoreSettingsToConfig(); - if (Global.MovieSession.Movie.IsActive) // Note: this must be called after CommitCoreSettingsToConfig() - { - StopMovie(); - } - - Global.Rewinder.Uninitialize(); - - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.Get().Restart(); - } - - Global.CheatList.SaveOnClose(); - Emulator.Dispose(); - var coreComm = CreateCoreComm(); - CoreFileProvider.SyncCoreCommInputSignals(coreComm); - Emulator = new NullEmulator(coreComm, Global.Config.GetCoreSettings()); - ClientApi.UpdateEmulatorAndVP(Emulator); - Global.ActiveController = new Controller(NullController.Instance.Definition); - Global.AutoFireController = _autofireNullControls; - RewireSound(); - RebootStatusBarIcon.Visible = false; - GameIsClosing = false; - } - - public bool GameIsClosing { get; private set; } // Lets tools make better decisions when being called by CloseGame - - public void CloseRom(bool clearSram = false) - { - // This gets called after Close Game gets called. - // Tested with NESHawk and SMB3 (U) - if (GlobalWin.Tools.AskSave()) - { - CloseGame(clearSram); - var coreComm = CreateCoreComm(); - CoreFileProvider.SyncCoreCommInputSignals(coreComm); - Emulator = new NullEmulator(coreComm, Global.Config.GetCoreSettings()); - Global.Game = GameInfo.NullInstance; - - GlobalWin.Tools.Restart(); - ApiManager.Restart(Emulator.ServiceProvider); - RewireSound(); - Text = "BizHawk" + (VersionInfo.DeveloperBuild ? " (interim) " : ""); - HandlePlatformMenus(); - _stateSlots.Clear(); - UpdateDumpIcon(); - UpdateCoreStatusBarButton(); - ClearHolds(); - PauseOnFrame = null; - ToolFormBase.UpdateCheatRelatedTools(null, null); - UpdateStatusSlots(); - CurrentlyOpenRom = null; - CurrentlyOpenRomArgs = null; - _currentlyOpenRomPoopForAdvancedLoaderPleaseRefactorMe = ""; - } - } - - private static void ShowConversionError(string errorMsg) - { - MessageBox.Show(errorMsg, "Conversion error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - private static void ProcessMovieImport(string fn) - { - MovieImport.ProcessMovieImport(fn, ShowConversionError, GlobalWin.OSD.AddMessage); - } - - public void EnableRewind(bool enabled) - { - Global.Rewinder.SuspendRewind = !enabled; - GlobalWin.OSD.AddMessage("Rewind " + (enabled ? "enabled" : "suspended")); - } - - public void ClearRewindData() - { - Global.Rewinder.Clear(); - } - - #endregion - - #region Tool Control API - - // TODO: move me - public IControlMainform Master { get; private set; } - - private bool IsSlave => Master != null; - - private bool IsSavestateSlave => IsSlave && Master.WantsToControlSavestates; - - private bool IsRewindSlave => IsSlave && Master.WantsToControlRewind; - - public void RelinquishControl(IControlMainform master) - { - Master = master; - } - - public void TakeBackControl() - { - Master = null; - } - - private int SlotToInt(string slot) - { - return int.Parse(slot.Substring(slot.Length - 1, 1)); - } - - public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool supressOSD = false) // Move to client.common - { - if (!Emulator.HasSavestates()) - { - return; - } - - if (IsSavestateSlave) - { - Master.LoadState(); - return; - } - - // If from lua, disable counting rerecords - bool wasCountingRerecords = Global.MovieSession.Movie.IsCountingRerecords; - - if (fromLua) - { - Global.MovieSession.Movie.IsCountingRerecords = false; - } - - if (SavestateManager.LoadStateFile(path, userFriendlyStateName)) - { - GlobalWin.OSD.ClearGUIText(); - ClientApi.OnStateLoaded(this, userFriendlyStateName); - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallLoadStateEvent(userFriendlyStateName); - } - - SetMainformMovieInfo(); - GlobalWin.Tools.UpdateToolsBefore(fromLua); - UpdateToolsAfter(fromLua); - UpdateToolsLoadstate(); - Global.AutoFireController.ClearStarts(); - - if (!IsRewindSlave && Global.MovieSession.Movie.IsActive) - { - ClearRewindData(); - } - - if (!supressOSD) - { - GlobalWin.OSD.AddMessage("Loaded state: " + userFriendlyStateName); - } - } - else - { - GlobalWin.OSD.AddMessage("Loadstate error!"); - } - - Global.MovieSession.Movie.IsCountingRerecords = wasCountingRerecords; - } - - public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool supressOSD = false) - { - if (!Emulator.HasSavestates()) - { - return; - } - - bool handled; - ClientApi.OnBeforeQuickLoad(this, quickSlotName, out handled); - if (handled) - { - return; - } - - if (IsSavestateSlave) - { - Master.LoadQuickSave(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - if (!File.Exists(path)) - { - GlobalWin.OSD.AddMessage("Unable to load " + quickSlotName + ".State"); - - return; - } - - LoadState(path, quickSlotName, fromLua, supressOSD); - } - - public void SaveState(string path, string userFriendlyStateName, bool fromLua) - { - if (!Emulator.HasSavestates()) - { - return; - } - - if (IsSavestateSlave) - { - Master.SaveState(); - return; - } - - try - { - SavestateManager.SaveStateFile(path, userFriendlyStateName); - - ClientApi.OnStateSaved(this, userFriendlyStateName); - - GlobalWin.OSD.AddMessage("Saved state: " + userFriendlyStateName); - } - catch (IOException) - { - GlobalWin.OSD.AddMessage("Unable to save state " + path); - } - - if (!fromLua) - { - UpdateStatusSlots(); - } - } - - // TODO: should backup logic be stuffed in into Client.Common.SaveStateManager? - public void SaveQuickSave(string quickSlotName) - { - if (!Emulator.HasSavestates()) - { - return; - } - - bool handled; - ClientApi.OnBeforeQuickSave(this, quickSlotName, out handled); - if (handled) - { - return; - } - - if (IsSavestateSlave) - { - Master.SaveQuickSave(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - - var file = new FileInfo(path); - if (file.Directory != null && !file.Directory.Exists) - { - file.Directory.Create(); - } - - // Make backup first - if (Global.Config.BackupSavestates) - { - Util.TryMoveBackupFile(path, path + ".bak"); - } - - SaveState(path, quickSlotName, false); - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName); - } - } - - private void SaveStateAs() - { - if (!Emulator.HasSavestates()) - { - return; - } - - // allow named state export for tastudio, since it's safe, unlike loading one - // todo: make it not save laglog in that case - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.NamedStatePending = true; - } - - if (IsSavestateSlave) - { - Master.SaveStateAs(); - return; - } - - var path = PathManager.GetSaveStatePath(Global.Game); - - var file = new FileInfo(path); - if (file.Directory != null && !file.Directory.Exists) - { - file.Directory.Create(); - } - - var sfd = new SaveFileDialog - { - AddExtension = true, - DefaultExt = "State", - Filter = "Save States (*.State)|*.State|All Files|*.*", - InitialDirectory = path, - FileName = PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave0.State" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - SaveState(sfd.FileName, sfd.FileName, false); - } - - if (GlobalWin.Tools.IsLoaded()) - { - GlobalWin.Tools.TAStudio.NamedStatePending = false; - } - } - - private void LoadStateAs() - { - if (!Emulator.HasSavestates()) - { - return; - } - - if (IsSavestateSlave) - { - Master.LoadStateAs(); - return; - } - - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetSaveStatePath(Global.Game), - Filter = "Save States (*.State)|*.State|All Files|*.*", - RestoreDirectory = true - }; - - var result = ofd.ShowHawkDialog(); - if (result != DialogResult.OK) - { - return; - } - - if (!File.Exists(ofd.FileName)) - { - return; - } - - LoadState(ofd.FileName, Path.GetFileName(ofd.FileName)); - } - - private void SelectSlot(int slot) - { - if (Emulator.HasSavestates()) - { - if (IsSavestateSlave) - { - Master.SelectSlot(slot); - return; - } - - Global.Config.SaveSlot = slot; - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - - private void PreviousSlot() - { - if (Emulator.HasSavestates()) - { - if (IsSavestateSlave) - { - Master.PreviousSlot(); - return; - } - - if (Global.Config.SaveSlot == 0) - { - Global.Config.SaveSlot = 9; // Wrap to end of slot list - } - else if (Global.Config.SaveSlot > 9) - { - Global.Config.SaveSlot = 9; // Meh, just in case - } - else - { - Global.Config.SaveSlot--; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - - private void NextSlot() - { - if (Emulator.HasSavestates()) - { - if (IsSavestateSlave) - { - Master.NextSlot(); - return; - } - - if (Global.Config.SaveSlot >= 9) - { - Global.Config.SaveSlot = 0; // Wrap to beginning of slot list - } - else if (Global.Config.SaveSlot < 0) - { - Global.Config.SaveSlot = 0; // Meh, just in case - } - else - { - Global.Config.SaveSlot++; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - - private void ToggleReadOnly() - { - if (IsSlave && Master.WantsToControlReadOnly) - { - Master.ToggleReadOnly(); - } - else - { - if (Global.MovieSession.Movie.IsActive) - { - Global.MovieSession.ReadOnly ^= true; - GlobalWin.OSD.AddMessage(Global.MovieSession.ReadOnly ? "Movie read-only mode" : "Movie read+write mode"); - } - else - { - GlobalWin.OSD.AddMessage("No movie active"); - } - } - } - - private void StopMovie(bool saveChanges = true) - { - if (IsSlave && Master.WantsToControlStopMovie) - { - Master.StopMovie(!saveChanges); - } - else - { - Global.MovieSession.StopMovie(saveChanges); - SetMainformMovieInfo(); - UpdateStatusSlots(); - } - } - - private void GBAcoresettingsToolStripMenuItem1_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Gameboy Advance Settings"); - } - - private void CaptureRewind(bool suppressCaptureRewind) - { - if (IsRewindSlave) - { - Master.CaptureRewind(); - } - else if (!suppressCaptureRewind && Global.Rewinder.RewindActive) - { - Global.Rewinder.Capture(); - } - } - - private void preferencesToolStripMenuItem1_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "VirtualBoy Settings"); - } - - private void preferencesToolStripMenuItem_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "Snes9x Settings"); - } - - private void preferencesToolStripMenuItem2_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "NeoPop Settings"); - } - - private void preferencesToolStripMenuItem3_Click(object sender, EventArgs e) - { - GenericCoreConfig.DoDialog(this, "PC-FX Settings"); - } - - private bool Rewind(ref bool runFrame, long currentTimestamp, out bool returnToRecording) - { - var isRewinding = false; - - returnToRecording = false; - - if (IsRewindSlave) - { - if (Global.ClientControls["Rewind"] || PressRewind) - { - if (_frameRewindTimestamp == 0) - { - isRewinding = true; - _frameRewindTimestamp = currentTimestamp; - _frameRewindWasPaused = EmulatorPaused; - } - else - { - double timestampDeltaMs = (double)(currentTimestamp - _frameRewindTimestamp) / Stopwatch.Frequency * 1000.0; - isRewinding = timestampDeltaMs >= Global.Config.FrameProgressDelayMs; - - // clear this flag once we get out of the progress stage - if (isRewinding) - { - _frameRewindWasPaused = false; - } - - // if we're freely running, there's no need for reverse frame progress semantics (that may be debateable though) - if (!EmulatorPaused) - { - isRewinding = true; - } - - if (_frameRewindWasPaused) - { - if (IsSeeking) - { - isRewinding = false; - } - } - } - - if (isRewinding) - { - runFrame = Emulator.Frame > 1; // TODO: the master should be deciding this! - Master.Rewind(); - } - } - else - { - _frameRewindTimestamp = 0; - } - - return isRewinding; - } - - if (Global.Rewinder.RewindActive && (Global.ClientControls["Rewind"] || PressRewind)) - { - if (EmulatorPaused) - { - if (_frameRewindTimestamp == 0) - { - isRewinding = true; - _frameRewindTimestamp = currentTimestamp; - } - else - { - double timestampDeltaMs = (double)(currentTimestamp - _frameRewindTimestamp) / Stopwatch.Frequency * 1000.0; - isRewinding = timestampDeltaMs >= Global.Config.FrameProgressDelayMs; - } - } - else - { - isRewinding = true; - } - - if (isRewinding) - { - runFrame = Global.Rewinder.Rewind(1) && Emulator.Frame > 1; - - if (runFrame && Global.MovieSession.Movie.IsRecording) - { - Global.MovieSession.Movie.SwitchToPlay(); - returnToRecording = true; - } - } - } - else - { - _frameRewindTimestamp = 0; - } - - return isRewinding; - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/MainForm.resources b/BizHawk.Client.EmuHawk/MainForm.resources deleted file mode 100644 index 06c24d06c1..0000000000 Binary files a/BizHawk.Client.EmuHawk/MainForm.resources and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/MainForm.resx b/BizHawk.Client.EmuHawk/MainForm.resx deleted file mode 100644 index 35cf70e616..0000000000 --- a/BizHawk.Client.EmuHawk/MainForm.resx +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 - JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA64AAAOuAFqQfVbAAABpElE - QVQ4T52TQUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3 - ad3y1HmkVNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlU - UK1WwSDFmTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQK - vV4Pc1vn+OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK - 4s2bFGfu6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvd - lp1ZEQ6HYRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO - 0zRh2zb6/f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQ - MGrYYwVfAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 - JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABBBAAAQQQG8+46XAAAAcElE - QVQ4T82Q4QoAIQiDffR7804DY+pOov5c8GltwyiRR8YVTLTFOsWK2iA0eAapQkPOznwRGnJ25rX87AmK - /3ruFCvhCR9oclI8PNggJHg7A46w4rf5zY6H8jlAxQQOKMPWBswSIpmloXkEFbeR8QKDpKJKL1M/dQAA - AABJRU5ErkJggg== - - - - - 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 - - - - 126, 17 - - - 233, 13 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 - JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA64AAAOuAFqQfVbAAABpElE - QVQ4T52TQUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3 - ad3y1HmkVNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlU - UK1WwSDFmTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQK - vV4Pc1vn+OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK - 4s2bFGfu6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvd - lp1ZEQ6HYRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO - 0zRh2zb6/f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQ - MGrYYwVfAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 - JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABBBAAAQQQG8+46XAAAAcElE - QVQ4T82Q4QoAIQiDffR7804DY+pOov5c8GltwyiRR8YVTLTFOsWK2iA0eAapQkPOznwRGnJ25rX87AmK - /3ruFCvhCR9oclI8PNggJHg7A46w4rf5zY6H8jlAxQQOKMPWBswSIpmloXkEFbeR8QKDpKJKL1M/dQAA - AABJRU5ErkJggg== - - - - 399, 13 - - - 37 - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/NameStateForm.Designer.cs b/BizHawk.Client.EmuHawk/NameStateForm.Designer.cs deleted file mode 100644 index a5d33a4619..0000000000 --- a/BizHawk.Client.EmuHawk/NameStateForm.Designer.cs +++ /dev/null @@ -1,103 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class NameStateForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.cancelButton = new System.Windows.Forms.Button(); - this.saveButton = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.stateLabelTextBox = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // cancelButton - // - this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.cancelButton.Location = new System.Drawing.Point(199, 51); - this.cancelButton.Name = "cancelButton"; - this.cancelButton.Size = new System.Drawing.Size(75, 23); - this.cancelButton.TabIndex = 0; - this.cancelButton.Text = "Cancel"; - this.cancelButton.UseVisualStyleBackColor = true; - this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); - // - // saveButton - // - this.saveButton.Location = new System.Drawing.Point(118, 51); - this.saveButton.Name = "saveButton"; - this.saveButton.Size = new System.Drawing.Size(75, 23); - this.saveButton.TabIndex = 1; - this.saveButton.Text = "Save"; - this.saveButton.UseVisualStyleBackColor = true; - this.saveButton.Click += new System.EventHandler(this.saveButton_Click); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(181, 13); - this.label1.TabIndex = 2; - this.label1.Text = "Enter a short label for this save state:"; - // - // stateLabelTextBox - // - this.stateLabelTextBox.Location = new System.Drawing.Point(15, 25); - this.stateLabelTextBox.MaxLength = 248; - this.stateLabelTextBox.Name = "stateLabelTextBox"; - this.stateLabelTextBox.Size = new System.Drawing.Size(259, 20); - this.stateLabelTextBox.TabIndex = 3; - // - // NameStateForm - // - this.AcceptButton = this.saveButton; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.cancelButton; - this.ClientSize = new System.Drawing.Size(278, 81); - this.Controls.Add(this.stateLabelTextBox); - this.Controls.Add(this.label1); - this.Controls.Add(this.saveButton); - this.Controls.Add(this.cancelButton); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Name = "NameStateForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Label Save State"; - this.Shown += new System.EventHandler(this.NameStateForm_Shown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button cancelButton; - private System.Windows.Forms.Button saveButton; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox stateLabelTextBox; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/NameStateForm.cs b/BizHawk.Client.EmuHawk/NameStateForm.cs deleted file mode 100644 index ab17e1356f..0000000000 --- a/BizHawk.Client.EmuHawk/NameStateForm.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class NameStateForm : Form - { - public string Result; - public bool OK; - - public NameStateForm() - { - InitializeComponent(); - AcceptButton = saveButton; - CancelButton = cancelButton; - } - - private void cancelButton_Click(object sender, EventArgs e) - { - Close(); - } - - private void saveButton_Click(object sender, EventArgs e) - { - if (stateLabelTextBox.Text.Length != 0) - { - Result = stateLabelTextBox.Text; - OK = true; - Close(); - } - } - - private void NameStateForm_Shown(object sender, EventArgs e) - { - stateLabelTextBox.Focus(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/NameStateForm.resources b/BizHawk.Client.EmuHawk/NameStateForm.resources deleted file mode 100644 index 06c24d06c1..0000000000 Binary files a/BizHawk.Client.EmuHawk/NameStateForm.resources and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/OpenAdvancedChooser.cs b/BizHawk.Client.EmuHawk/OpenAdvancedChooser.cs deleted file mode 100644 index 8e164865d1..0000000000 --- a/BizHawk.Client.EmuHawk/OpenAdvancedChooser.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.Cores; -using BizHawk.Emulation.Cores.Libretro; -using BizHawk.Client.Common; - -//these match strings from OpenAdvance. should we make them constants in there? - -namespace BizHawk.Client.EmuHawk -{ - public partial class OpenAdvancedChooser : Form - { - MainForm mainForm; - - public enum Command - { - RetroLaunchNoGame, RetroLaunchGame, - ClassicLaunchGame - } - - public Command Result; - public string SuggestedExtensionFilter; - - public OpenAdvancedChooser(MainForm mainForm) - { - this.mainForm = mainForm; - - InitializeComponent(); - - RefreshLibretroCore(true); - } - - private void btnOK_Click(object sender, EventArgs e) - { - DialogResult = System.Windows.Forms.DialogResult.OK; - Close(); - } - - private void btnCancel_Click(object sender, EventArgs e) - { - DialogResult = System.Windows.Forms.DialogResult.Cancel; - Close(); - } - - private void btnSetLibretroCore_Click(object sender, EventArgs e) - { - if(mainForm.RunLibretroCoreChooser()) - RefreshLibretroCore(false); - } - - RetroDescription CurrentDescription; - void RefreshLibretroCore(bool bootstrap) - { - txtLibretroCore.Text = ""; - btnLibretroLaunchNoGame.Enabled = false; - btnLibretroLaunchGame.Enabled = false; - - var core = Global.Config.LibretroCore; - if (string.IsNullOrEmpty(core)) - return; - - txtLibretroCore.Text = core; - CurrentDescription = null; - - //scan the current libretro core to see if it can be launched with NoGame,and other stuff - try - { - //OLD COMMENTS: - ////a stub corecomm. to reinforce that this won't touch the frontend at all! - ////LibRetroEmulator should be able to survive having this stub corecomm - //NEW COMMENTS: - //nope, we need to navigate to the dll path. this was a bad idea anyway. so many dlls get loaded, something to resolve them is needed - var coreComm = new BizHawk.Emulation.Common.CoreComm(null, null); - CoreFileProvider.SyncCoreCommInputSignals(coreComm); - using (var retro = new LibretroCore(coreComm, core)) - { - btnLibretroLaunchGame.Enabled = true; - if (retro.Description.SupportsNoGame) - btnLibretroLaunchNoGame.Enabled = true; - - //print descriptive information - var descr = retro.Description; - CurrentDescription = descr; - Console.WriteLine("core name: {0} version {1}", descr.LibraryName, descr.LibraryVersion); - Console.WriteLine("extensions: ", descr.ValidExtensions); - Console.WriteLine("NeedsRomAsPath: {0}", descr.NeedsRomAsPath); - Console.WriteLine("AcceptsArchives: {0}", descr.NeedsArchives); - Console.WriteLine("SupportsNoGame: {0}", descr.SupportsNoGame); - - foreach (var v in descr.Variables.Values) - Console.WriteLine(v); - } - } - catch (Exception ex) - { - if (!bootstrap) - { - MessageBox.Show("Couldn't load the selected Libretro core for analysis. It won't be available.\n\nError:\n\n" + ex.ToString()); - } - } - } - - private void btnLibretroLaunchGame_Click(object sender, EventArgs e) - { - //build a list of extensions suggested for use for this core - StringWriter sw = new StringWriter(); - foreach(var ext in CurrentDescription.ValidExtensions.Split('|')) - sw.Write("*.{0};",ext); - var filter = sw.ToString(); - filter = filter.Substring(0,filter.Length-1); //remove last semicolon - List args = new List(); - args.Add("Rom Files"); - if (!CurrentDescription.NeedsArchives) - filter += ";%ARCH%"; - args.Add(filter); - if (!CurrentDescription.NeedsArchives) - { - args.Add("Archive Files"); - args.Add("%ARCH%"); - } - args.Add("All Files"); - args.Add("*.*"); - filter = MainForm.FormatFilter(args.ToArray()); - SuggestedExtensionFilter = filter; - - Result = Command.RetroLaunchGame; - DialogResult = DialogResult.OK; - Close(); - } - - private void btnClassicLaunchGame_Click(object sender, EventArgs e) - { - Result = Command.ClassicLaunchGame; - DialogResult = DialogResult.OK; - Close(); - } - - private void btnLibretroLaunchNoGame_Click(object sender, EventArgs e) - { - Result = Command.RetroLaunchNoGame; - DialogResult = DialogResult.OK; - Close(); - } - - private void txtLibretroCore_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - if (Path.GetExtension(filePaths[0]).ToUpper() == ".DLL") - { - e.Effect = DragDropEffects.Copy; - return; - } - } - - e.Effect = DragDropEffects.None; - } - - private void txtLibretroCore_DragDrop(object sender, DragEventArgs e) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - Global.Config.LibretroCore = filePaths[0]; - RefreshLibretroCore(false); - } - } -} diff --git a/BizHawk.Client.EmuHawk/PlatformChooser.cs b/BizHawk.Client.EmuHawk/PlatformChooser.cs deleted file mode 100644 index da68589504..0000000000 --- a/BizHawk.Client.EmuHawk/PlatformChooser.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PlatformChooser : Form - { - public RomGame RomGame { get; set; } - public string PlatformChoice { get; set; } - - private RadioButton SelectedRadio - { - get - { - return PlatformsGroupBox.Controls.OfType().FirstOrDefault(x => x.Checked); - } - } - - public PlatformChooser() - { - InitializeComponent(); - AvailableSystems = new SystemLookup().AllSystems.ToList(); - } - - private readonly List AvailableSystems; - - private void PlatformChooser_Load(object sender, EventArgs e) - { - if (RomGame.RomData.Length > 10 * 1024 * 1024) // If 10mb, show in megabytes - { - RomSizeLabel.Text = string.Format("{0:n0}", (RomGame.RomData.Length / 1024 / 1024)) + "mb"; - } - else - { - RomSizeLabel.Text = string.Format("{0:n0}", (RomGame.RomData.Length / 1024)) + "kb"; - } - - ExtensionLabel.Text = RomGame.Extension.ToLower(); - HashBox.Text = RomGame.GameInfo.Hash; - int count = 0; - int spacing = 25; - foreach (var platform in AvailableSystems) - { - var radio = new RadioButton - { - Text = platform.FullName, - Location = UIHelper.Scale(new Point(15, 15 + (count * spacing))), - Size = UIHelper.Scale(new Size(200, 23)) - }; - - PlatformsGroupBox.Controls.Add(radio); - count++; - } - - PlatformsGroupBox.Controls - .OfType() - .First() - .Select(); - } - - private void CancelButton_Click(object sender, EventArgs e) - { - Close(); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - var selectedValue = SelectedRadio != null ? SelectedRadio.Text : ""; - PlatformChoice = AvailableSystems.FirstOrDefault(x => x.FullName == selectedValue).SystemId; - - if (AlwaysCheckbox.Checked) - { - Global.Config.PreferredPlatformsForExtensions[RomGame.Extension.ToLower()] = PlatformChoice; - } - - Close(); - } - - private void label4_Click(object sender, EventArgs e) - { - AlwaysCheckbox.Checked ^= true; - } - } -} diff --git a/BizHawk.Client.EmuHawk/PresentationPanel.cs b/BizHawk.Client.EmuHawk/PresentationPanel.cs deleted file mode 100644 index a20b656ac8..0000000000 --- a/BizHawk.Client.EmuHawk/PresentationPanel.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Drawing; -using sd=System.Drawing; -using sysdrawingfont=System.Drawing.Font; -using sysdrawing2d=System.Drawing.Drawing2D; -using System.IO; -using System.Threading; -using System.Windows.Forms; -#if WINDOWS -using SlimDX; -#endif - -using BizHawk.Client.Common; -using BizHawk.Bizware.BizwareGL; - -using OpenTK.Graphics.OpenGL; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Thinly wraps a BizwareGL.GraphicsControl for EmuHawk's needs - /// - public class PresentationPanel - { - public PresentationPanel() - { - GL = GlobalWin.GL; - - GraphicsControl = new GraphicsControl(GL); - GraphicsControl.Dock = DockStyle.Fill; - GraphicsControl.BackColor = Color.Black; - - //pass through these events to the form. we might need a more scalable solution for mousedown etc. for zapper and whatnot. - //http://stackoverflow.com/questions/547172/pass-through-mouse-events-to-parent-control (HTTRANSPARENT) - GraphicsControl.MouseDoubleClick += (o, e) => HandleFullscreenToggle(o, e); - GraphicsControl.MouseClick += (o, e) => GlobalWin.MainForm.MainForm_MouseClick(o, e); - GraphicsControl.MouseMove += (o, e) => GlobalWin.MainForm.MainForm_MouseMove(o, e); - GraphicsControl.MouseWheel += (o, e) => GlobalWin.MainForm.MainForm_MouseWheel(o, e); - } - - bool IsDisposed = false; - public void Dispose() - { - if (IsDisposed) return; - IsDisposed = true; - GraphicsControl.Dispose(); - } - - //graphics resources - IGL GL; - public GraphicsControl GraphicsControl; - - public Control Control { get { return GraphicsControl; } } - public static implicit operator Control(PresentationPanel self) { return self.GraphicsControl; } - - private void HandleFullscreenToggle(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Left) - { - //allow suppression of the toggle.. but if shift is pressed, always do the toggle - bool allowSuppress = Control.ModifierKeys != Keys.Shift; - if (Global.Config.DispChrome_AllowDoubleClickFullscreen || !allowSuppress) - { - GlobalWin.MainForm.ToggleFullscreen(allowSuppress); - } - } - } - - public bool Resized { get; set; } - - public Size NativeSize { get { return GraphicsControl.ClientSize; } } - } - - - - public interface IBlitterFont { } - -} diff --git a/BizHawk.Client.EmuHawk/Program.cs b/BizHawk.Client.EmuHawk/Program.cs deleted file mode 100644 index 0ed765e047..0000000000 --- a/BizHawk.Client.EmuHawk/Program.cs +++ /dev/null @@ -1,455 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.IO; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows.Forms; -#if WINDOWS -using Microsoft.VisualBasic.ApplicationServices; -#endif - -using BizHawk.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - static class Program - { - static Program() - { - //this needs to be done before the warnings/errors show up - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - var libLoader = EXE_PROJECT.PlatformLinkedLibSingleton.LinkedLibManager; - - //http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips - - //try loading libraries we know we'll need - //something in the winforms, etc. code below will cause .net to popup a missing msvcr100.dll in case that one's missing - //but oddly it lets us proceed and we'll then catch it here - var libExt = EXE_PROJECT.PlatformLinkedLibSingleton.RunningOnUnix ? ".dll.so" : ".dll"; - var d3dx9 = libLoader.LoadPlatformSpecific($"d3dx9_43{libExt}"); - var vc2015 = libLoader.LoadPlatformSpecific($"vcruntime140{libExt}"); - var vc2012 = libLoader.LoadPlatformSpecific($"msvcr120{libExt}"); //TODO - check version? - var vc2010 = libLoader.LoadPlatformSpecific($"msvcr100{libExt}"); //TODO - check version? - var vc2010p = libLoader.LoadPlatformSpecific($"msvcp100{libExt}"); - bool fail = false, warn = false; - warn |= d3dx9 == IntPtr.Zero; - fail |= vc2015 == IntPtr.Zero; - fail |= vc2010 == IntPtr.Zero; - fail |= vc2012 == IntPtr.Zero; - fail |= vc2010p == IntPtr.Zero; - if (fail || warn) - { - var sw = new System.IO.StringWriter(); - sw.WriteLine("[ OK ] .Net 4.6.1 (You couldn't even get here without it)"); - sw.WriteLine("[{0}] Direct3d 9", d3dx9 == IntPtr.Zero ? "FAIL" : " OK "); - sw.WriteLine("[{0}] Visual C++ 2010 SP1 Runtime", (vc2010 == IntPtr.Zero || vc2010p == IntPtr.Zero) ? "FAIL" : " OK "); - sw.WriteLine("[{0}] Visual C++ 2012 Runtime", (vc2012 == IntPtr.Zero) ? "FAIL" : " OK "); - sw.WriteLine("[{0}] Visual C++ 2015 Runtime", (vc2015 == IntPtr.Zero) ? "FAIL" : " OK "); - var str = sw.ToString(); - var box = new BizHawk.Client.EmuHawk.CustomControls.PrereqsAlert(!fail); - box.textBox1.Text = str; - box.ShowDialog(); - if (!fail) { } - else - System.Diagnostics.Process.GetCurrentProcess().Kill(); - } - - libLoader.FreePlatformSpecific(d3dx9); - libLoader.FreePlatformSpecific(vc2015); - libLoader.FreePlatformSpecific(vc2012); - libLoader.FreePlatformSpecific(vc2010); - libLoader.FreePlatformSpecific(vc2010p); - - if (!EXE_PROJECT.PlatformLinkedLibSingleton.RunningOnUnix) - { - // this will look in subdirectory "dll" to load pinvoked stuff - string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll"); - SetDllDirectory(dllDir); - - //in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them - AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); - - //but before we even try doing that, whack the MOTW from everything in that directory (thats a dll) - //otherwise, some people will have crashes at boot-up due to .net security disliking MOTW. - //some people are getting MOTW through a combination of browser used to download bizhawk, and program used to dearchive it - WhackAllMOTW(dllDir); - - //We need to do it here too... otherwise people get exceptions when externaltools we distribute try to startup - } - } - - [STAThread] - static int Main(string[] args) - { - return SubMain(args); - } - - private interface PlatformSpecificMainLoopCrashHandler - { - void TryCatchFinally(string[] args); - } - private class Win32MainLoopCrashHandler : PlatformSpecificMainLoopCrashHandler - { - public void TryCatchFinally(string[] args) - { - try - { - if (Global.Config.SingleInstanceMode) - { - try - { - new SingleInstanceController(args).Run(args); - } - catch (ObjectDisposedException) - { - // Eat it, MainForm disposed itself and Run attempts to dispose of itself. Eventually we would want to figure out a way to prevent that, but in the meantime it is harmless, so just eat the error - } - } - else - { - using (var mf = new MainForm(args)) - { - var title = mf.Text; - mf.Show(); - mf.Text = title; - try - { - GlobalWin.ExitCode = mf.ProgramRunLoop(); - } - catch (Exception e) when (!Debugger.IsAttached && !VersionInfo.DeveloperBuild && Global.MovieSession.Movie.IsActive) - { - var result = MessageBox.Show( - "EmuHawk has thrown a fatal exception and is about to close.\nA movie has been detected. Would you like to try to save?\n(Note: Depending on what caused this error, this may or may not succeed)", - "Fatal error: " + e.GetType().Name, - MessageBoxButtons.YesNo, - MessageBoxIcon.Exclamation - ); - if (result == DialogResult.Yes) - { - Global.MovieSession.Movie.Save(); - } - } - } - } - } - catch (Exception e) when (!Debugger.IsAttached) - { - new ExceptionBox(e).ShowDialog(); - } - finally - { - if (GlobalWin.Sound != null) - { - GlobalWin.Sound.Dispose(); - GlobalWin.Sound = null; - } - GlobalWin.GL.Dispose(); - Input.Cleanup(); - } - } - } - private class UnixMonoMainLoopCrashHandler : PlatformSpecificMainLoopCrashHandler - { - // Identical to the implementation in Win32MainLoopCrashHandler sans the single-instance check. - public void TryCatchFinally(string[] args) - { - try - { - using (var mf = new MainForm(args)) - { - var title = mf.Text; - mf.Show(); - mf.Text = title; - try - { - GlobalWin.ExitCode = mf.ProgramRunLoop(); - } - catch (Exception e) when (!Debugger.IsAttached && !VersionInfo.DeveloperBuild && Global.MovieSession.Movie.IsActive) - { - var result = MessageBox.Show( - "EmuHawk has thrown a fatal exception and is about to close.\nA movie has been detected. Would you like to try to save?\n(Note: Depending on what caused this error, this may or may not succeed)", - "Fatal error: " + e.GetType().Name, - MessageBoxButtons.YesNo, - MessageBoxIcon.Exclamation - ); - if (result == DialogResult.Yes) - { - Global.MovieSession.Movie.Save(); - } - } - } - } - catch (Exception e) when (!Debugger.IsAttached) - { - new ExceptionBox(e).ShowDialog(); - } - finally - { - if (GlobalWin.Sound != null) - { - GlobalWin.Sound.Dispose(); - GlobalWin.Sound = null; - } - GlobalWin.GL.Dispose(); - Input.Cleanup(); - } - } - } - private static PlatformSpecificMainLoopCrashHandler mainLoopCrashHandler = EXE_PROJECT.PlatformLinkedLibSingleton.RunningOnUnix - ? (PlatformSpecificMainLoopCrashHandler) new UnixMonoMainLoopCrashHandler() - : (PlatformSpecificMainLoopCrashHandler) new Win32MainLoopCrashHandler(); - - //NoInlining should keep this code from getting jammed into Main() which would create dependencies on types which havent been setup by the resolver yet... or something like that - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - static int SubMain(string[] args) - { - // this check has to be done VERY early. i stepped through a debug build with wrong .dll versions purposely used, - // and there was a TypeLoadException before the first line of SubMain was reached (some static ColorType init?) - // zero 25-dec-2012 - only do for public builds. its annoying during development - if (!VersionInfo.DeveloperBuild) - { - var thisversion = typeof(Program).Assembly.GetName().Version; - var utilversion = Assembly.Load(new AssemblyName("Bizhawk.Client.Common")).GetName().Version; - var emulversion = Assembly.Load(new AssemblyName("Bizhawk.Emulation.Cores")).GetName().Version; - - if (thisversion != utilversion || thisversion != emulversion) - { - MessageBox.Show("Conflicting revisions found! Don't mix .dll versions!"); - return -1; - } - } - - BizHawk.Common.TempFileManager.Start(); - - HawkFile.ArchiveHandlerFactory = new SevenZipSharpArchiveHandler(); - - ArgParser argParser = new ArgParser(); - argParser.ParseArguments(args); - if (argParser.cmdConfigFile != null) PathManager.SetDefaultIniPath(argParser.cmdConfigFile); - - try - { - Global.Config = ConfigService.Load(PathManager.DefaultIniPath); - } catch (Exception e) { - new ExceptionBox(e).ShowDialog(); - new ExceptionBox("Since your config file is corrupted, we're going to recreate it. Back it up before proceeding if you want to investigate further.").ShowDialog(); - File.Delete(PathManager.DefaultIniPath); - Global.Config = ConfigService.Load(PathManager.DefaultIniPath); - } - - Global.Config.ResolveDefaults(); - - BizHawk.Client.Common.StringLogUtil.DefaultToDisk = Global.Config.MoviesOnDisk; - BizHawk.Client.Common.StringLogUtil.DefaultToAWE = Global.Config.MoviesInAWE; - - // super hacky! this needs to be done first. still not worth the trouble to make this system fully proper - for (int i = 0; i < args.Length; i++) - { - var arg = args[i].ToLower(); - if (arg.StartsWith("--gdi")) - { - Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - } - } - - // create IGL context. we do this whether or not the user has selected OpenGL, so that we can run opengl-based emulator cores - GlobalWin.IGL_GL = new Bizware.BizwareGL.Drivers.OpenTK.IGL_TK(2, 0, false); - - // setup the GL context manager, needed for coping with multiple opengl cores vs opengl display method - GLManager.CreateInstance(GlobalWin.IGL_GL); - GlobalWin.GLManager = GLManager.Instance; - - //now create the "GL" context for the display method. we can reuse the IGL_TK context if opengl display method is chosen - if (EXE_PROJECT.PlatformLinkedLibSingleton.RunningOnUnix) Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - REDO_DISPMETHOD: - if (Global.Config.DispMethod == Config.EDispMethod.GdiPlus) - GlobalWin.GL = new Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus(); - else if (Global.Config.DispMethod == Config.EDispMethod.SlimDX9) - { - try - { - GlobalWin.GL = new Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9(); - } - catch(Exception ex) - { - var e2 = new Exception("Initialization of Direct3d 9 Display Method failed; falling back to GDI+", ex); - new ExceptionBox(e2).ShowDialog(); - - // fallback - Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - goto REDO_DISPMETHOD; - } - } - else - { - GlobalWin.GL = GlobalWin.IGL_GL; - - // check the opengl version and dont even try to boot this crap up if its too old - int version = GlobalWin.IGL_GL.Version; - if (version < 200) - { - // fallback - Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - goto REDO_DISPMETHOD; - } - } - - // try creating a GUI Renderer. If that doesn't succeed. we fallback - try - { - using (GlobalWin.GL.CreateRenderer()) { } - } - catch(Exception ex) - { - var e2 = new Exception("Initialization of Display Method failed; falling back to GDI+", ex); - new ExceptionBox(e2).ShowDialog(); - //fallback - Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - goto REDO_DISPMETHOD; - } - - if (!EXE_PROJECT.PlatformLinkedLibSingleton.RunningOnUnix) - { - //WHY do we have to do this? some intel graphics drivers (ig7icd64.dll 10.18.10.3304 on an unknown chip on win8.1) are calling SetDllDirectory() for the process, which ruins stuff. - //The relevant initialization happened just before in "create IGL context". - //It isn't clear whether we need the earlier SetDllDirectory(), but I think we do. - //note: this is pasted instead of being put in a static method due to this initialization code being sensitive to things like that, and not wanting to cause it to break - //pasting should be safe (not affecting the jit order of things) - string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll"); - SetDllDirectory(dllDir); - } - - // Using a simple conditional to skip the single-instancing step caused crashes on GNU+Linux, even though the single-instancing step wasn't being executed. Something about the way instantiation works in C# means this workaround is possible. - mainLoopCrashHandler.TryCatchFinally(args); - - //cleanup: - //cleanup IGL stuff so we can get better refcounts when exiting process, for debugging - //DOESNT WORK FOR SOME REASON - //GlobalWin.IGL_GL = new Bizware.BizwareGL.Drivers.OpenTK.IGL_TK(); - //GLManager.Instance.Dispose(); - //if (GlobalWin.IGL_GL != GlobalWin.GL) - // GlobalWin.GL.Dispose(); - //((IDisposable)GlobalWin.IGL_GL).Dispose(); - - //return 0 assuming things have gone well, non-zero values could be used as error codes or for scripting purposes - return GlobalWin.ExitCode; - } //SubMain - - //declared here instead of a more usual place to avoid dependencies on the more usual place -#if WINDOWS - [DllImport("kernel32.dll", SetLastError = true)] - static extern uint SetDllDirectory(string lpPathName); - - [DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)] - static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName); - - public static void RemoveMOTW(string path) - { - DeleteFileW(path + ":Zone.Identifier"); - } - - static void WhackAllMOTW(string dllDir) - { - var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); - while (todo.Count > 0) - { - var di = todo.Dequeue(); - foreach (var disub in di.GetDirectories()) todo.Enqueue(disub); - foreach (var fi in di.GetFiles("*.dll")) - RemoveMOTW(fi.FullName); - foreach (var fi in di.GetFiles("*.exe")) - RemoveMOTW(fi.FullName); - } - - } -#endif - - - static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - string requested = args.Name; - - //mutate filename depending on selection of lua core. here's how it works - //1. we build NLua to the output/dll/lua directory. that brings KopiLua with it - //2. We reference it from there, but we tell it not to copy local; that way there's no NLua in the output/dll directory - //3. When NLua assembly attempts to load, it can't find it - //I. if LuaInterface is selected by the user, we switch to requesting that. - // (those DLLs are built into the output/DLL directory) - //II. if NLua is selected by the user, we skip over this part; - // later, we look for NLua or KopiLua assembly names and redirect them to files located in the output/DLL/nlua directory - if (new AssemblyName(requested).Name == "NLua") - { - //this method referencing Global.Config makes assemblies get loaded, which isnt smart from the assembly resolver. - //so.. we're going to resort to something really bad. - //avert your eyes. - bool UseNLua = true; - string configPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "config.ini"); - if (File.Exists(configPath)) - { - var cfg = File.ReadAllLines(configPath); - var usenlua_key = cfg.FirstOrDefault(line=>line.Contains(" \"UseNLua\": ")); - if (usenlua_key != null) - if (usenlua_key.Contains("false")) - UseNLua = false; - } - - if (UseNLua) { } - else requested = "LuaInterface"; - } - - lock (AppDomain.CurrentDomain) - { - var asms = AppDomain.CurrentDomain.GetAssemblies(); - foreach (var asm in asms) - if (asm.FullName == requested) - return asm; - - //load missing assemblies by trying to find them in the dll directory - string dllname = new AssemblyName(requested).Name + ".dll"; - string directory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll"); - string simpleName = new AssemblyName(requested).Name; - if (simpleName == "NLua" || simpleName == "KopiLua") directory = Path.Combine(directory, "nlua"); - string fname = Path.Combine(directory, dllname); - if (!File.Exists(fname)) return null; - - //it is important that we use LoadFile here and not load from a byte array; otherwise mixed (managed/unamanged) assemblies can't load - return Assembly.LoadFile(fname); - } - } - -#if WINDOWS - public class SingleInstanceController : WindowsFormsApplicationBase - { - readonly string[] cmdArgs; - public SingleInstanceController(string[] args) - { - cmdArgs = args; - IsSingleInstance = true; - StartupNextInstance += this_StartupNextInstance; - } - - void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) - { - if (e.CommandLine.Count >= 1) - (MainForm as MainForm).LoadRom(e.CommandLine[0], new MainForm.LoadRomArgs() { OpenAdvanced = new OpenAdvanced_OpenRom() }); - } - - protected override void OnCreateMainForm() - { - MainForm = new MainForm(cmdArgs); - var title = MainForm.Text; - MainForm.Show(); - MainForm.Text = title; - GlobalWin.ExitCode = (MainForm as MainForm).ProgramRunLoop(); - } - } - - -#endif - } -} diff --git a/BizHawk.Client.EmuHawk/Properties/AssemblyInfo.cs b/BizHawk.Client.EmuHawk/Properties/AssemblyInfo.cs deleted file mode 100644 index e317ccb818..0000000000 --- a/BizHawk.Client.EmuHawk/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BizHawk.Client.EmuHawk")] -[assembly: AssemblyDescription("http://tasvideos.org/Bizhawk.html")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("BizHawk")] -[assembly: AssemblyProduct("BizHawk.Client.EmuHawk")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c282f0e2-86cb-4a6b-b83e-ad74f90ebe83")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] -[assembly: AssemblyFileVersion(VersionInfo.Mainversion + "." + SubWCRev.SVN_REV)] diff --git a/BizHawk.Client.EmuHawk/Properties/Resources.Designer.cs b/BizHawk.Client.EmuHawk/Properties/Resources.Designer.cs deleted file mode 100644 index 8cb04e3e15..0000000000 --- a/BizHawk.Client.EmuHawk/Properties/Resources.Designer.cs +++ /dev/null @@ -1,3472 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace BizHawk.Client.EmuHawk.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BizHawk.Client.EmuHawk.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap A78Joystick { - get { - object obj = ResourceManager.GetObject("A78Joystick", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap add { - get { - object obj = ResourceManager.GetObject("add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap AddEdit { - get { - object obj = ResourceManager.GetObject("AddEdit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap addWatch { - get { - object obj = ResourceManager.GetObject("addWatch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap alt_about_image { - get { - object obj = ResourceManager.GetObject("alt_about_image", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap AppleIIKeyboard { - get { - object obj = ResourceManager.GetObject("AppleIIKeyboard", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap atari_controller { - get { - object obj = ResourceManager.GetObject("atari_controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap AudioHS { - get { - object obj = ResourceManager.GetObject("AudioHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap AutoSearch { - get { - object obj = ResourceManager.GetObject("AutoSearch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap AVI { - get { - object obj = ResourceManager.GetObject("AVI", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Back { - get { - object obj = ResourceManager.GetObject("Back", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap BackMore { - get { - object obj = ResourceManager.GetObject("BackMore", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Blank { - get { - object obj = ResourceManager.GetObject("Blank", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] BlankCursor { - get { - object obj = ResourceManager.GetObject("BlankCursor", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap BlueDown { - get { - object obj = ResourceManager.GetObject("BlueDown", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap BlueUp { - get { - object obj = ResourceManager.GetObject("BlueUp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Both { - get { - object obj = ResourceManager.GetObject("Both", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap bsnes { - get { - object obj = ResourceManager.GetObject("bsnes", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Bug { - get { - object obj = ResourceManager.GetObject("Bug", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap C64Joystick { - get { - object obj = ResourceManager.GetObject("C64Joystick", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap C64Keyboard { - get { - object obj = ResourceManager.GetObject("C64Keyboard", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap C64Symbol { - get { - object obj = ResourceManager.GetObject("C64Symbol", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap calculator { - get { - object obj = ResourceManager.GetObject("calculator", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap camera { - get { - object obj = ResourceManager.GetObject("camera", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap cdlogger { - get { - object obj = ResourceManager.GetObject("cdlogger", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap cheat { - get { - object obj = ResourceManager.GetObject("cheat", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon Cheats { - get { - object obj = ResourceManager.GetObject("Cheats", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap checkbox { - get { - object obj = ResourceManager.GetObject("checkbox", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Circle { - get { - object obj = ResourceManager.GetObject("Circle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Close { - get { - object obj = ResourceManager.GetObject("Close", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap colecovisioncontroller { - get { - object obj = ResourceManager.GetObject("colecovisioncontroller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap connect_16x16 { - get { - object obj = ResourceManager.GetObject("connect_16x16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap console16x16 { - get { - object obj = ResourceManager.GetObject("console16x16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap console32x32 { - get { - object obj = ResourceManager.GetObject("console32x32", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap CopyFolderHS { - get { - object obj = ResourceManager.GetObject("CopyFolderHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap corphawk { - get { - object obj = ResourceManager.GetObject("corphawk", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap CorpHawkSmall { - get { - object obj = ResourceManager.GetObject("CorpHawkSmall", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Cross { - get { - object obj = ResourceManager.GetObject("Cross", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap CutHS { - get { - object obj = ResourceManager.GetObject("CutHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Debugger { - get { - object obj = ResourceManager.GetObject("Debugger", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Delete { - get { - object obj = ResourceManager.GetObject("Delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap dual { - get { - object obj = ResourceManager.GetObject("dual", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Duplicate { - get { - object obj = ResourceManager.GetObject("Duplicate", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ENE { - get { - object obj = ResourceManager.GetObject("ENE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Erase { - get { - object obj = ResourceManager.GetObject("Erase", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ESE { - get { - object obj = ResourceManager.GetObject("ESE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ExclamationRed { - get { - object obj = ResourceManager.GetObject("ExclamationRed", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap FastForward { - get { - object obj = ResourceManager.GetObject("FastForward", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap FindHS { - get { - object obj = ResourceManager.GetObject("FindHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Forward { - get { - object obj = ResourceManager.GetObject("Forward", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ForwardMore { - get { - object obj = ResourceManager.GetObject("ForwardMore", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Freeze { - get { - object obj = ResourceManager.GetObject("Freeze", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Fullscreen { - get { - object obj = ResourceManager.GetObject("Fullscreen", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap gambatte { - get { - object obj = ResourceManager.GetObject("gambatte", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GameController { - get { - object obj = ResourceManager.GetObject("GameController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GBA_Controller { - get { - object obj = ResourceManager.GetObject("GBA_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap gba_icon { - get { - object obj = ResourceManager.GetObject("gba_icon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GBController { - get { - object obj = ResourceManager.GetObject("GBController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GENController { - get { - object obj = ResourceManager.GetObject("GENController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GenesisControllerIcon { - get { - object obj = ResourceManager.GetObject("GenesisControllerIcon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap genplus { - get { - object obj = ResourceManager.GetObject("genplus", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap GreenCheck { - get { - object obj = ResourceManager.GetObject("GreenCheck", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Hack { - get { - object obj = ResourceManager.GetObject("Hack", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap HawkInLove { - get { - object obj = ResourceManager.GetObject("HawkInLove", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Help { - get { - object obj = ResourceManager.GetObject("Help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap HomeBrew { - get { - object obj = ResourceManager.GetObject("HomeBrew", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap HotKeys { - get { - object obj = ResourceManager.GetObject("HotKeys", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap icon_anchor { - get { - object obj = ResourceManager.GetObject("icon_anchor", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap icon_anchor_lag { - get { - object obj = ResourceManager.GetObject("icon_anchor_lag", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap icon_marker { - get { - object obj = ResourceManager.GetObject("icon_marker", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Import { - get { - object obj = ResourceManager.GetObject("Import", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap InsertSeparator { - get { - object obj = ResourceManager.GetObject("InsertSeparator", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap IntVController { - get { - object obj = ResourceManager.GetObject("IntVController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap JumpTo { - get { - object obj = ResourceManager.GetObject("JumpTo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap kitchensink { - get { - object obj = ResourceManager.GetObject("kitchensink", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Lightning { - get { - object obj = ResourceManager.GetObject("Lightning", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap LightOff { - get { - object obj = ResourceManager.GetObject("LightOff", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap LightOn { - get { - object obj = ResourceManager.GetObject("LightOn", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap LoadConfig { - get { - object obj = ResourceManager.GetObject("LoadConfig", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon logo { - get { - object obj = ResourceManager.GetObject("logo", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Lua { - get { - object obj = ResourceManager.GetObject("Lua", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Lynx { - get { - object obj = ResourceManager.GetObject("Lynx", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MessageConfig { - get { - object obj = ResourceManager.GetObject("MessageConfig", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap monitor { - get { - object obj = ResourceManager.GetObject("monitor", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveBottom { - get { - object obj = ResourceManager.GetObject("MoveBottom", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveDown { - get { - object obj = ResourceManager.GetObject("MoveDown", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveLeft { - get { - object obj = ResourceManager.GetObject("MoveLeft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveRight { - get { - object obj = ResourceManager.GetObject("MoveRight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveTop { - get { - object obj = ResourceManager.GetObject("MoveTop", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap MoveUp { - get { - object obj = ResourceManager.GetObject("MoveUp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap N64 { - get { - object obj = ResourceManager.GetObject("N64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NE { - get { - object obj = ResourceManager.GetObject("NE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NES_Controller { - get { - object obj = ResourceManager.GetObject("NES_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NESControllerIcon { - get { - object obj = ResourceManager.GetObject("NESControllerIcon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NewFile { - get { - object obj = ResourceManager.GetObject("NewFile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NGPController { - get { - object obj = ResourceManager.GetObject("NGPController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NNE { - get { - object obj = ResourceManager.GetObject("NNE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NNW { - get { - object obj = ResourceManager.GetObject("NNW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap noconnect_16x16 { - get { - object obj = ResourceManager.GetObject("noconnect_16x16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. - /// - internal static System.IO.UnmanagedMemoryStream nothawk { - get { - return ResourceManager.GetStream("nothawk", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap NW { - get { - object obj = ResourceManager.GetObject("NW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenFile { - get { - object obj = ResourceManager.GetObject("OpenFile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Paste { - get { - object obj = ResourceManager.GetObject("Paste", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Pause { - get { - object obj = ResourceManager.GetObject("Pause", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap pcb { - get { - object obj = ResourceManager.GetObject("pcb", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap pcejin1 { - get { - object obj = ResourceManager.GetObject("pcejin1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap PCEngineController { - get { - object obj = ResourceManager.GetObject("PCEngineController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap pencil { - get { - object obj = ResourceManager.GetObject("pencil", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Play { - get { - object obj = ResourceManager.GetObject("Play", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap poke { - get { - object obj = ResourceManager.GetObject("poke", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ppsspp { - get { - object obj = ResourceManager.GetObject("ppsspp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Previous { - get { - object obj = ResourceManager.GetObject("Previous", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap PrintPreviewHS { - get { - object obj = ResourceManager.GetObject("PrintPreviewHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap psx_dualshock { - get { - object obj = ResourceManager.GetObject("psx_dualshock", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap PSX_Original_Controller { - get { - object obj = ResourceManager.GetObject("PSX_Original_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap QuickNes { - get { - object obj = ResourceManager.GetObject("QuickNes", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ReadOnly { - get { - object obj = ResourceManager.GetObject("ReadOnly", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap reboot { - get { - object obj = ResourceManager.GetObject("reboot", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Recent { - get { - object obj = ResourceManager.GetObject("Recent", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RecordHS { - get { - object obj = ResourceManager.GetObject("RecordHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap redo { - get { - object obj = ResourceManager.GetObject("redo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Refresh { - get { - object obj = ResourceManager.GetObject("Refresh", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Refresh1 { - get { - object obj = ResourceManager.GetObject("Refresh1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap restart { - get { - object obj = ResourceManager.GetObject("restart", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RetroQuestion { - get { - object obj = ResourceManager.GetObject("RetroQuestion", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SaturnController { - get { - object obj = ResourceManager.GetObject("SaturnController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Save { - get { - object obj = ResourceManager.GetObject("Save", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SaveAs { - get { - object obj = ResourceManager.GetObject("SaveAs", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SaveConfig { - get { - object obj = ResourceManager.GetObject("SaveConfig", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Scan { - get { - object obj = ResourceManager.GetObject("Scan", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ScrollTo { - get { - object obj = ResourceManager.GetObject("ScrollTo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SE { - get { - object obj = ResourceManager.GetObject("SE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap search { - get { - object obj = ResourceManager.GetObject("search", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Shark { - get { - object obj = ResourceManager.GetObject("Shark", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap sms_icon { - get { - object obj = ResourceManager.GetObject("sms_icon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SMSController { - get { - object obj = ResourceManager.GetObject("SMSController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SNES_Controller { - get { - object obj = ResourceManager.GetObject("SNES_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap snes9x { - get { - object obj = ResourceManager.GetObject("snes9x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SNESControllerIcon { - get { - object obj = ResourceManager.GetObject("SNESControllerIcon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Square { - get { - object obj = ResourceManager.GetObject("Square", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SSE { - get { - object obj = ResourceManager.GetObject("SSE", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SSW { - get { - object obj = ResourceManager.GetObject("SSW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Stop { - get { - object obj = ResourceManager.GetObject("Stop", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap SW { - get { - object obj = ResourceManager.GetObject("SW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TAStudio { - get { - object obj = ResourceManager.GetObject("TAStudio", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap textdoc { - get { - object obj = ResourceManager.GetObject("textdoc", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap thumbsdown { - get { - object obj = ResourceManager.GetObject("thumbsdown", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TI83_Controller { - get { - object obj = ResourceManager.GetObject("TI83_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TI83Calculator { - get { - object obj = ResourceManager.GetObject("TI83Calculator", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ToolBox { - get { - object obj = ResourceManager.GetObject("ToolBox", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Translation { - get { - object obj = ResourceManager.GetObject("Translation", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Triangle { - get { - object obj = ResourceManager.GetObject("Triangle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TruncateFromFile { - get { - object obj = ResourceManager.GetObject("TruncateFromFile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TruncateFromRW { - get { - object obj = ResourceManager.GetObject("TruncateFromRW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_arrow_blue { - get { - object obj = ResourceManager.GetObject("ts_h_arrow_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_arrow_green { - get { - object obj = ResourceManager.GetObject("ts_h_arrow_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_arrow_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_arrow_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_00 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_00", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_00_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_00_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_00_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_00_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_00_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_00_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_01 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_01", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_01_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_01_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_01_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_01_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_01_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_01_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_02 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_02", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_02_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_02_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_02_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_02_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_02_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_02_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_03 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_03", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_03_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_03_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_03_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_03_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_03_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_03_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_04 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_04", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_04_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_04_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_04_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_04_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_04_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_04_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_05 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_05", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_05_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_05_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_05_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_05_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_05_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_05_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_06 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_06", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_06_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_06_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_06_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_06_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_06_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_06_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_07 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_07", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_07_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_07_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_07_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_07_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_07_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_07_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_08 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_08", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_08_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_08_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_08_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_08_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_08_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_08_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_09 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_09", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_09_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_09_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_09_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_09_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_09_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_09_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_10 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_10", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_10_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_10_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_10_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_10_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_10_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_10_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_11 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_11", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_11_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_11_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_11_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_11_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_11_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_11_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_12 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_12", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_12_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_12_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_12_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_12_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_12_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_12_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_13 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_13", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_13_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_13_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_13_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_13_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_13_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_13_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_14 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_14", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_14_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_14_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_14_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_14_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_14_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_14_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_15 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_15", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_15_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_15_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_15_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_15_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_15_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_15_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_16 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_16_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_16_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_16_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_16_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_16_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_16_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_17 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_17", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_17_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_17_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_17_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_17_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_17_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_17_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_18 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_18", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_18_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_18_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_18_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_18_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_18_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_18_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_19 { - get { - object obj = ResourceManager.GetObject("ts_h_piano_19", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_19_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_19_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_19_green { - get { - object obj = ResourceManager.GetObject("ts_h_piano_19_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_h_piano_19_green_blue { - get { - object obj = ResourceManager.GetObject("ts_h_piano_19_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_arrow_blue { - get { - object obj = ResourceManager.GetObject("ts_v_arrow_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_arrow_green { - get { - object obj = ResourceManager.GetObject("ts_v_arrow_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_arrow_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_arrow_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_00 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_00", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_00_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_00_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_00_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_00_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_00_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_00_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_01 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_01", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_01_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_01_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_01_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_01_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_01_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_01_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_02 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_02", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_02_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_02_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_02_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_02_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_02_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_02_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_03 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_03", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_03_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_03_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_03_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_03_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_03_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_03_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_04 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_04", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_04_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_04_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_04_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_04_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_04_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_04_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_05 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_05", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_05_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_05_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_05_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_05_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_05_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_05_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_06 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_06", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_06_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_06_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_06_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_06_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_06_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_06_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_07 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_07", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_07_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_07_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_07_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_07_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_07_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_07_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_08 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_08", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_08_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_08_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_08_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_08_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_08_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_08_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_09 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_09", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_09_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_09_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_09_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_09_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_09_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_09_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_10 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_10", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_10_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_10_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_10_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_10_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_10_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_10_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_11 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_11", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_11_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_11_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_11_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_11_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_11_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_11_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_12 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_12", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_12_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_12_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_12_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_12_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_12_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_12_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_13 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_13", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_13_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_13_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_13_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_13_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_13_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_13_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_14 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_14", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_14_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_14_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_14_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_14_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_14_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_14_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_15 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_15", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_15_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_15_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_15_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_15_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_15_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_15_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_16 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_16_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_16_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_16_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_16_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_16_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_16_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_17 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_17", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_17_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_17_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_17_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_17_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_17_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_17_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_18 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_18", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_18_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_18_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_18_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_18_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_18_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_18_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_19 { - get { - object obj = ResourceManager.GetObject("ts_v_piano_19", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_19_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_19_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_19_green { - get { - object obj = ResourceManager.GetObject("ts_v_piano_19_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ts_v_piano_19_green_blue { - get { - object obj = ResourceManager.GetObject("ts_v_piano_19_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap TurboFastForward { - get { - object obj = ResourceManager.GetObject("TurboFastForward", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap tvIcon { - get { - object obj = ResourceManager.GetObject("tvIcon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap undo { - get { - object obj = ResourceManager.GetObject("undo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Unfreeze { - get { - object obj = ResourceManager.GetObject("Unfreeze", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon user_blue { - get { - object obj = ResourceManager.GetObject("user_blue", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap user_blue_small { - get { - object obj = ResourceManager.GetObject("user_blue_small", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap VBoyController { - get { - object obj = ResourceManager.GetObject("VBoyController", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap WarningHS { - get { - object obj = ResourceManager.GetObject("WarningHS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap watch { - get { - object obj = ResourceManager.GetObject("watch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap whiteTriDown { - get { - object obj = ResourceManager.GetObject("whiteTriDown", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap whiteTriLeft { - get { - object obj = ResourceManager.GetObject("whiteTriLeft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap whiteTriRight { - get { - object obj = ResourceManager.GetObject("whiteTriRight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap whiteTriUp { - get { - object obj = ResourceManager.GetObject("whiteTriUp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap WNW { - get { - object obj = ResourceManager.GetObject("WNW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap WonderSwanColor { - get { - object obj = ResourceManager.GetObject("WonderSwanColor", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap WSW { - get { - object obj = ResourceManager.GetObject("WSW", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap YellowDown { - get { - object obj = ResourceManager.GetObject("YellowDown", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap YellowLeft { - get { - object obj = ResourceManager.GetObject("YellowLeft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap YellowRight { - get { - object obj = ResourceManager.GetObject("YellowRight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap YellowUp { - get { - object obj = ResourceManager.GetObject("YellowUp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ZXSpectrumKeyboards { - get { - object obj = ResourceManager.GetObject("ZXSpectrumKeyboards", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/Properties/Resources.resx b/BizHawk.Client.EmuHawk/Properties/Resources.resx deleted file mode 100644 index 301536707a..0000000000 --- a/BizHawk.Client.EmuHawk/Properties/Resources.resx +++ /dev/null @@ -1,1569 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\images\ControllerImages\GBController.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_03_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_13.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\AudioHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Scan.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_02_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\A78Joystick.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\VBoyController.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\cdlogger.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_00_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\dual.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Play.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\whiteTriRight.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Close.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\MoveDown.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ToolBox.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_14.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\SNES_Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ExclamationRed.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_arrow_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_11_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\WonderSwanColor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\checkbox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_09_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_03_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\calculator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_16_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_13_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\MoveUp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_10_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_09_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\logo.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\MessageConfig.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_01_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Triangle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\MoveLeft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_03_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_17_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_01.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_arrow_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ForwardMore.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_15_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_07_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\camera.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_06_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\RecordHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_19_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_15_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SNESControllerIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_18.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\kitchensink.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_02.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\IntVController.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_19.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_12_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\PSX-Original-Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - - AAEAAAD/////AQAAAAAAAAAEAQAAABZTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtCgAAAAdfYnVmZmVyB19v - cmlnaW4JX3Bvc2l0aW9uB19sZW5ndGgJX2NhcGFjaXR5C19leHBhbmRhYmxlCV93cml0YWJsZQpfZXhw - b3NhYmxlB19pc09wZW4dTWFyc2hhbEJ5UmVmT2JqZWN0K19faWRlbnRpdHkHAAAAAAAAAAACAggICAgB - AQEBCQIAAAAAAAAAeGIAAHhiAAB4YgAAAAEAAQoPAgAAAHhiAAACUklGRnBiAABXQVZFZm10IBAAAAAB - AAEAIlYAACJWAAABAAgAZGF0YYBhAAB/f39/gICAgH9/f39/gICAgH9/f4CAgIB/f39/gICAf39/gIB/ - f39/f39/f3+AgH9/f3+AgIB/f39/gICAf39/gICAgIB/f39/f3+AgICAf39/gICAgH9/f4CAgIB/f39/ - gICAgH9/gICAgH9/f3+AgIB/f39/f4CAgIB/f3+AgIB/f39/gICAf3+AgIB/f39/gICAf39/gICAf39/ - f4CAgH9/f3+AgH9/f4CAgH9/f3+AgIB/f3+AgICAf3+AgH9/f3+AgICAgICAgH9/f39/f3+AgICAf39/ - gICAgH9/f3+AgH9/f3+AgICAf3+AgICAf39/gICAgICAf39/gICAgH9/f4CAgH9/f4CAgH9/f3+AgIB/ - f3+AgICAf39/f39/f3+AgIB/gICAgH9/f4CAgH9/f4CAgIB/f3+AgIB/f3+AgIB/f3+AgICAf39/gICA - gH9/f3+AgIB/f39/f4CAgICAgICAgICAf39/f39/f3+AgICAf39/gICAgH9/f4CAgH9/f4CAgH9/f4CA - gICAf39/f3+AgIB/f3+AgICAf39/gICAf39/f4CAgH9/f4CAgH9/f4CAgIB/f3+AgICAf39/gICAgH9/ - f4CAgH9/f3+AgIB/f39/f4CAgH9/f3+AgIB/f3+AgICAf39/f4CAgICAgIB/f3+AgIB/f39/gIB/f3+A - gIB/f3+AgIB/f39/gICAf3+AgICAf39/f4CAf3+AgICAgICAgIB/f3+AgH9/f3+AgICAgH9/f39/gIB/ - f39/gICAgH9/gICAgH9/gICAf35+f39/f39/gIGBgYCBgYGBgIB/fXp4eH2Bg4OCg4WHh4R/e3p7fH19 - fXx+gYSEgoB/f4GBgYB/f3+Af39+fXx8fn+BgYGBgoODgoB+fX1+fn9/fn6AgYGBgH+AgIGAgICAgICA - gH99fX5/gICAf4CAgYKBgH9/f39/f35+f3+AgICAgICAgIGBgH9/f39+f3+Af39/gICAf4CAgICAgH9/ - f39/gICAgICAgH9/f39/f39/f3+AgH+AgYGAgIGCgH57eHp/g4KAfn+DhYaFgH18fn9/fXl4fYOFhIKB - gYKEhYWFgHNobHqDhIF+gYyVlYt/eHR1en58dnR6hIuKgnx9gIKEhIB+gYODg4F7dXV5fH+Afn+Fh4aF - gn9+gYF/gH16fH9+e3p4eYCFhoaGhIWIhYB9enZ3fH18fn5/goaFg4GAgIODgH9+fHt/fnx7fH1/goOE - hIOCgoJ/fXx6e31+f39/gYKBgoKAfoCAf4CBfn1/gH9/fn1+gIGBgYCBgoGAf399fH1/f4CBgYGCgoKC - g4F+fHp6e3x9f4CBgoODg4OEg4SGhn9vX2FyhZCTkIuIiYeDfnt4dXl8dnF1foiQjYWDh4yRiW5TVGmB - joyCg5Kgo5eBbWRlb3p9dXJ+kZmTh314eoCBgoaCeXR0dHmChYiLiYKBgoSJin5mVl93iYyDfIOYp6SR - emxpb3h7dGhpf5abkIJ8gYuOhnt0dHmAg31zbnF/jJGPiIOFiYiEeWddZneDiIWCiJSalYd3cG90e315 - dHiEjY2FfXp9goaEgH+Ag4aFgHl1dXl8fHp8gomMiYSBgYWGgn15eHyCgnZlYW6BjpCMjJKbnpN9a2Nj - aXB0c3aDk5yaj4WAgYJ+d3Z3eXx/e3V1eH2EiouMi4mHhH15d3h7fn54amBqfouPjo+YpaaWfWlfXmBl - cHqEkpmUioSDiIyHfHFucnh6eXl8hJCZm45pSFFxhIeDhJm1u6WDaF1bXWFrc3uOoJ6LenqNnZiDbWdv - eHhzcHWGnKGFXFNrh5GIfICasq2RcF1ZYGt0c253lKypkXl2hI+Kd2psdHh5fH2DlZ+LZlZnf4uJgHyN - pKmWe2heYWx4eXF1jKetm4J0dnx6bmVqe4mPjYN7gZCbl4ZwX1tqe3xzb3uTqqyZgnZ3fHx0aWVrfI6V - joF8go2QhHRudoGGgXdydoGMjYeCgoWIiYeAcFhSZn2HiIiNn66qlXtqY2JnbG9vdYebo5qLgH5+fnZv - c3x+fHl4fIeTlY2DgIWOjXRNOlB0jpaRkqO2uaN/YlJRXGxyb3WIm6GYh3+FjY+Gd21sbnR5eHZ+j6Gq - l2Q/UHaKiX9/l7W8o31gVVdfbnl2epKknoZydo6emIJrZnF4d3Z5gZOcfFFQbIeVkYiTr72rg19OS1Rk - cGttjK23pYZ3h52dhmVUXGlvdICRmYhnYniJjYqDiaKypodmVVNXYHN7dIGnvbCQcml4iYl4aWpzd3h7 - g5Gio3tQUnGKkIJzfqCypodqW1ljdYJ7dYeir6SGaWJrdXZ1fY2Rhn19f4iYoJJzU0pfeH94cHmavMKr - h2pkbHBsY1tlh6aploF4fYR+cnB7i5OKd21xgJSdlIFvX15udnBrdJCwv7KVeW5uaWBaXGd/nbCrk3xz - dHV2d3qAhoN5dX2JkZSPiIaDb04/UGqAlaSuvL+ri3BdTEVQZ3mCjpuemIyEhoyLgXZxdHNtbHWEmKme - aTxKdZGViH6Vv8unc1BFS15vb2h4nrSwlXVzkquhelRMXW55g5CYhmBXdIuOiYSNr8WxiGJOS1FWXWd0 - kLG+qol7jaOihl9HUGRxfIyTeFNeiKGhloyYuMCca0w+PkpZaXN7msLUwJJ1gZeTc0s4SGN5k6iVYlB1 - n6mYgoGgwrmGVkE+R1lrdnqJq8nKp3lqe4uDaVFQZHN+jZqioYNfYHR9gYOBkq2wmnpfU1FVaIGFhZ21 - sZd2YWJzhId9d3d1d4ORnqaTXzxPdImHeXeWws2re1hJT2N3eW1ylLO4nXJVYYKVkoJ0c3p+f4OLlZJy - UFRtgoyGfYytu6iEZVdWYHB6d3qPo6maeF1edY2Xj4F6eXp8fXyCk5+UcEhDX3Z+hI+jvsq3kGpQRkxa - anR5iqKpmYJ4gZGWi3xzcGtlZ3KEnKyZYUBXfpGUiIKdwL6ZbE1CSl9wdXmMoaeeiHqKpaiPaEtLX3F/ - kZ+KWkxylJaLhI+30rmCVUNCR05cboCctryrjHyOpqB9VUBMZHKAlpRlSnCfrKGPiKLFuoRRQT43PVd9 - m6y1tK6di4yWi2xJOkpsiJyWZjpWmsC7m3+TxMiUVjMvPVJia22Es9bXtId2iZqHWTExUXKImqaMW1uM - raSNfoy1wphdPTtIV2NweIGjydO4iWt5k45sQzJMcIOXr6d4WGyPmYl2d5e+u4ldT05RXGt3fYupw8Kg - cFtvh4dyXl1rdXuJmKSvnmhJWnB9hn55lLO1mnRbUlVqhIh7hJylmn5hW3KRopmBbWdsfpKdl3tSRWaI - joJ1fabPyZhlTEtZa3Nwbn+iuq6IYllykpyNenBzeXd0eYieqpdmQUlrg4V/haLEw6B4XlFSY3NzbHWP - o6GJc3qUpJ6Fa2Nrbmxyf5KjlGBCWXuOlZOYtMizhl5JQUZUZ3J9mLGxoYyAjKCdf15MUWFsdIKarZxs - V2uAiY+QlKy4nnRYSj8/V4SlppaMkJeZm5eJdmNUVmd5jJd1QEuIrqych4+70KptRjw5PE9tgYycr7q0 - oZaXlIFdOjlYdIiVfUxRi7W6poqLtsqkZzwvMD1ZeoyMlKi7vKyblZF9WTk1UXWJelFKea/IxaqSosCy - e0QnJDlUZ294lcHf0qWEhZKSeUwqMlRxh5mYd2GBqrGdh4Sfu6p1RDZAUWBnanaey9a+lXJ4l5p7UTdA - XnSDlaOTbmeInI9/f46tvqBrT05SVFxrd4KbusOwinB5kZFzVE1ecHV5h5uqnnRcaXuGj4yHlqWbg2lU - TlZnfIaGlK61n39rbHeBgnlvbGxwgpaio45kT2WAiIF1eZm4t5ZtU1Jebnx+eYSjtKWAXVVsjJeKeHF4 - hIeAfoeYn4pfQkxofoiJj6jDvpt0XFNWXWlydH2Top6MfH2Pm5N8aWlvcXF0fZKnm2c/T3iQlZGSp722 - kWZMQ0dZbniAlayqloR7hZqeh2ZWXWtwcXiIorGSWk1mfo6VjZGstZhwVktLVnKTno58e4iWmZSSjoV0 - Y19pd4SRg1ZHcJWakoiPtNC7hltKREFMZHqDjp2nqJ+VlpmQd1hKVmp4hI12UFyOq6aWipW1vJhlSEFG - VGVzfYKPo7OyoZWVkoFgQj9WcYeWhllUiLOwmIKGrMasckU6RVdiZmh3mru/rZKFk6adckY5SVxoc4eg - nn94j5mRioWInKSLaFVSVVtmdH+SrLmyl3Nsh5uRdFNKX3F1eoWZsKx+WF5zgIeEgpSrqZFzWUpPYXOA - ipyvr5h5aniLjX1pYWl1enl6hJmxsolSQ1x5hH54irDBrIJfUVNecoKDhpaloopuZHKFjId8dXZ3dHmE - jpejoXxKQGF7fnyAkbPErIVqXFlga3J0fJCkpI90anmMkINzcnt9d3Z6gYuZoZp/WEZYcHuBhZGrvLGU - dmFZXmhvcneDkpiPf3qGlpiLe3BtbXF1eYCNnKCFV0ZgfoqKiJKtvaqDZVdSVWFve4iWnp6RgH6NlY15 - ZFxod3l3eoOTpKyheEdBYXmBhYaSrbmlg2dYVmJ7j49+bWl2iZOaoJySgW5na25yfYqPgGFWbIGGiZCd - tL+qgmBTUVJZa3yHjpCPj46RnqWagmhaXGRnbHmOnY5uZnqKkZKMkKOplXVaTEtWa4GOkZOVlY+Hi5SU - inReW2VsdoeVkHVhb4aMh4SJnraykXBcUU1SYnJ/kaWroYx6gJOYhm9fYW5ycXWBkqaieVNadIaNi4iX - ra2TcVZJTmBzgIqcqKGOe296j5eJc2Jjcn59en6NoKWIXEladYeMjJSnsKKGaldQV2h4gIiapJuIeXeC - jYp8bWlvd3t+gIOLlp6djmtJSWN3gIWKlq23poVsY15eaHZ6fImWlo+EeXqEioeCfHNwc3l+gYaOlJOJ - cFZXaHR+ipSgra2cgmtdVVZidH2Fl6aklYV4dXt/enNycnJ3gYiOkZGNi4yMflo9RmaClZyYobGwmHtj - U1BccYCDg4qUm5WDeXyFi4Z3a2hrdoOKiYmNlZqSc0tBW3yNk5GSoq+jhGlcWF9xgoWDiY6Oi4WBhYiC - d25tc3yBhYaFh4uPkY98Vz9Sc4iUl5Ocr6+UdF1RWXaPj3tmZXmQlZCPk5WPgXFqbHB3f4GEjYxuUldu - gpWkqKuuooVpWU5IVXaQk4qFhYyVlpWTi31wZ2RmaG9+j5qdjm5daXuDiYyRoauZc1tdaG91e36AiZCO - hoGDjpaRgGtjbHh6eXyIlpFwWWR4hY+TlaKsoodrV01NXHaKj5KXl4+Hho2Sjn9tYmNmaXOBjZypnHRa - YnJ+hISIm6ykiW1bVlljdYaTn6GYh3RvgJCOgG9kZ3R9f4CGj5umoX9SQVZve4KJlai1rJBzYVpbZnV9 - gIiUmZOFenyFiIB2c3NxcnqCh4yQkI6MiYV0U0NWcYWUmJair6qUe2RUVGN0fHp7iZqgloR6foiKgHBo - aHF9hoiEhIqRlpOAXUZUdouOiIeWq66YeGJYWmh6gX5/jJyhlH1tbXmHiHxxbXB7iY+Lh4mKhX5+hohz - UUpkgZGUjo6eq6WOdGBYXWx8fnZ6jp+fjXh0gIuKfW5pbXeCiomDg4iNj46GcFBJY36KjY2SpbGmjHBe - WF1qeX57f4uXmo+DgYaIgXNrbnN2fIGCgYOIjI6Rk4hmS1NwhYuIiJapqZV8Z1tdb4eTiXdsdIePioeK - j46Edm9ucHV6foGIlpyJYExdeo+Yl5GYoJiAaFlTXXeTnZF/d4KOi4KChIR/dWxscXiCjZCOkZiPbEtM - Y3yQmJWYoJyLeXFtbHJ8gHlwb3uJi4mPlpWOgHJwc3N0eoKJjX5hV2l+i5OYnaepl3xoXFddaXZ+g4iQ - lZGJh4yRjoBvZmlucnd7g5Ghn4BcWGyAiomFjp+jlH5tYFthcICLkpOPioF4fIqQiHptanN8fn6ChoyU - mI1wUU5lfIiPkZajqp2DbFxVWmx+hYSLmJ+bjHt0eXx5dXNvbXSCjpKRj42HgHx+g3xfSFV2jZWTj5em - qZqBaVpVX3R/eXaClqSfinp8homAcmdjaXiGiYeGi5GUkY2GcVNKYHmCg4WPoq2kkHxuZWVteH14eIWT - lIl6dHyKkIyCd29scnyCg4OGiISBgYaMj4NjTVt1hImIhZOqsaCGbFpZZ3V5c3KDm6SYgXN4iZOMe25m - aHSAgoCBipOUjomJhW5RTGJ5hoyOlKKpoY97a19danl6c3aGlZiOgX+HkpKHeGpiZHB6fYCHkJSSioKA - houJgG1TSl96homKlKm5sZR2Y1xcZG91dnuFkZeRiIyVkoRzZmVqcXZ8gYaLkZWam4xmRktnfYeJh5Oq - saCGb2BbZnqEfXJzgZGVjYeKjIqAcmxvdHuAgHx8g46Wlo1yVFNvho+NhoufpZB0ZmVue4J/eHV9i5WR - gXh+iIuBcGlzgIaEgX+FkZmTc0pFZoaSk46RoaqZfGdgZW51eXh2f4+ZlYd/ho+NfWhhbHl9fn6BiJKa - nJBvT09rgoiEgYyjrJ6Fb2JgaHV+f36Fj5CJf36HkY5+bmhrdX6Bfn6EjpSVj4JrV1pufoWGh5CfpZmD - cGRiaHV/gH2DkpuUgnV0fYeJgnhybm91f4aJjJCQh3x2eX+Fh4FwXVttgIiHhY+ntquPcmBbX2Vqa218 - laimk4ODjZKHdWVfYmhvdn6Jl6Kil4d8en6Ae29dT1l0h4yMjpistqiKcGJeYGRoaWt5kKCil4eDjJaT - hHRnYGBjaG57jZ2jnpSNiYV/d3Bsa2lgW2h9jJWdoqiroo54Z1pWWmFpcHyPoKehl5CKhHpvam1vbm1v - dYGOmJuXkIiDfnhzb21xeH19dW52iJOVko+QlZOGdWdfXmRveH6FkZ6moZGBeHVybm1wdXp+goSFiI2O - ioR+e3p6eHh4eXt+gYSJj4x6ZWV3hoqIhYmVmpB9bmViaHWCh4eJjpKOg36EiYd+cmxtcHN5f4OHio2O - ioSDg4B7dnN1eoCAdGNkfJGYlo+OmJ+UfmldXGJud3p8hpWgn5KHhYmIfGpeX2hxeH2CipWdnJKGfnx7 - dnFub3FsaHKEkJSVlJifmol3a2RiZGtzeX+Ik5qXkIyMi4R3amZpbG90e4OKkJOSj4uIg312b2tudHqA - fXNxgZOZlo6IjJKMfGxiYmhxeX5/hJGhpJeGfHt9eW5mZ295gIKChYySk4+GfHl7e3h1cHB3gIeMjIFy - c4KLiYN+gIyTjH1xbW9zd3p7e4GQnJyPgHp6fHhua3N9goKBgYWMkY+If3l4d3Vxb3J7hYmIhoaKjYyH - gHt5eHFkY3GAiY2NkJiclId7cWtqbXFzdX2JlJaPh4OChIF5dXh4dXR0d3+HjZCQi4aAe3h1cXB1en6B - hIaIjI2Lh4J+fHx0Z2JsfYeKioyUmpeLfnVvbG1wcnJ2gZCXk4mEhYaEfHRzdnp9fHt6fIGHiomIh4eF - f3hycXN4fX+AgoWJioiGg4GBfnl1dXd8gH95d3+Jj4yGgoWJiIB2cG90eXt9fYCHkJKMhH9+f314c3N3 - fYGDg4KDhYeGgn18foCAfHd4fICCgoKDhYWDgH16en2Af319foCCgoGBgoSEg4B/fXl0dHl/goSGh4qL - h4N+eXZ2eHp8fX+Dh4iFgoCBgYB9ent9f4CAgH9/f4B/f3+BgoOEgn59f39+fHx8foCCg4KBgoOBf359 - fH5/f39/gIGCgH9+fn5/f4CAgICBgYGAgIB/fXx7ent9gYWHh4eHhoN/e3d2d3l7fH+EiIqJhoJ/fn19 - e3p6fH+AgH+AgYKCgoCAf4CAf359fX5/f39+f3+BgoODgoKCgH57e3t9fn+AgoOEhISDgX99fHt6eXt+ - gIKDg4OEhYOBf318fHx7e3t8foGDhIWFhYWFg4F+e3l4eHl6fH+ChYiIh4WDgX99enh5e31/f35/goSF - hIKBgH9+fXx8fH5/f39/gIKDgoGAf39/f39+fn5+gICAgIGBgYGAf4CAgICAf35/f4CAgICAgIB/f39/ - f4B/f35/gICBgYGBgIB/fn5+fn5+f4CAgIGCgoCAf35+fn5/f4CAgYGBgYGAgH99fHx9f4CBgoKCgoGA - gH99fHx8fX5/gYKDg4KBgIB/fn19fX1+f4CBgYGBgYCAf35+f4CAf3+Af39/fn1+f4CBg4SDgoF/fn18 - fH1+foCBgoKCgoKCgH9+fn5+fX1/gICAgIB/gIGBgYB/f4CAgH9+fn5/f3+Af4CAgYGAgICAgH9/f3+A - gIB/f35+fn5/gIGBgYKBgYB/fn5+fn59fX6AgYKCgoGBgYB/fn59fn+AgICAf39/gICBgYGBgH9+fn19 - fn+AgIGBgYGAgH9/f39/f3+AgICAgICAgIB/f39+f39/gIGBgYGAf35+fn5+f4CAgICBgYCAf39+f3+A - gICAgICAf39/gICAgH9/f4CAgIB/f39/gICAgIB/fn5/f39/gICAgICAgYGBgH9+fXx8fX5/gYKDg4KC - gYB/fn59fH1+fn+BgoKCgoKBf35+fX19fn5/gIGBgYGAgICAgIB/f39/f35+fn+AgYGCgYGBgYB/fXx8 - fX5/gICBgoKCgYGAf35+fX19fX6AgYGCgoKBgH9+fn5/f3+AgIB/f39/f4CBgYGAf39/f39/f4CAgIB/ - f39/f3+AgICBgYB/f4CAf39/f39/fn5/gIGBgoGBgH9/f35+fn5/gICAgIGBgICAf39/gICAgH9/f4CA - gIB/fn5/f4CAgYGAgICAgICAf39+fn5+f4CBgoGAf35+f3+AgYGBgH9/f39/f39/f39/gIGCgYGAgH9/ - f39/fn19fX6AgYKDgoKBgH9/fn5+fXx8fX+AgYKDg4KBgIB/f359fX19fn+AgoODgoF/f39+fn5+fn5+ - f4CBgYGBgIB/f3+AgIB/fn1+f4CBgYGBgYGBgIB/f359fHx9f4GDhISDgoB/fn18fHx8fX6AgoOEg4OB - f35+fn19fX1+fn+BgoODg4GAf35+fn5+fn9/f3+AgYGBgYCAf39/f39/fn5+fn9/gIGBgIB/gICBgYB/ - fn5+fn5/gICBgYCAgICAgICAf35+f39/f39/gICAgYGBgIB/fn5+fn+AgICAgICAgYGBgYB/fn1+f3+A - gICAgYGAgIB/f35+fn9/gIGBgIB/f3+AgICAf39/f39/f39/f4CAgICBgYCAf35+fn9/gICAgICAgH9/ - f39/f39/gICAgIB/f39/gICAgYCAf39/f39/f39/f3+AgICAgIB/f35/f39/gICBgYGAgH9/f39+fn9/ - gICBgYGBgYB/fn5+fn5/f4CBgYGBgH9+fn9/f39/f4CAgYGAgICAgH9/f35+f3+AgICBgYGAf39/gICA - f35+fn9/f39/gICAgYGBgYGBf359fX1+f3+AgICBgYGBgYCAf39+fn5/f39/fn+AgICBgYGBgH9/f39/ - f39/f39/gICBgYGAf35+f4CAgICAf39/f4B/f39/f3+AgIGBgYB/fn5/f39/f3+AgICAgIGAgIB/f39/ - gIB/f35+f3+AgICAgICAgICAgIB/fn19fn+AgYGCgYGBgH9/f35+fn5/f4CAgYGBgH9/f4CAf39/f3+A - f3+AgICAgICAgICAf39+fn5+f3+AgICAgICAgYCAf39+fn5/gICAgICAf39/f4CAgICAgIB/f39/f39/ - f3+AgICBgYCAgH9/f39/f39/f39/gICAgIB/f3+AgICAf39/f39/f4CAgICAgH9/f3+AgICAgICAf39/ - f39/gICAgIB/f39/f4CAgYCAf39/f4CAgICAgIB/f39/f3+AgICAgICAgH9/f35/f3+AgICAgICAgICA - f35+fn5/gICAgIGBgYGAf39/fn5+f3+AgIGBgICAgICAf39/f35+f3+AgICAgIB/f3+AgICAf39/gICA - gIB/f39+fn5/gICAgICAgYGBgH9/fn19fX5+f4CBgYGCgYGAgH9+fn5+fn+AgICAgIGBgYGAgH9+fn5/ - f4CAgICAgH9/gICAf39/f39/f4CAgICAgIB/f39/f35+f4CAgYGAgICAgH9/f39/f39/f4CAgYGBgICA - gIB/fn5+fn9/gICAgICAgICAgH9/f35+fn5/gIGBgYGAf39/f39/f4CAgICAgH9/f39/f3+AgICAgH9/ - gICAgICAgH9/f39/f39/f39/gICBgYCAgICAf39/f39/f3+AgICAgYGAgICAf39+fn5/f3+AgIGBgICA - gICAf39/f39/f3+AgIGBgIB/f39/f3+AgH9/gICAgIB/f39/f39/gICAgICAgICAgH9/f39/f3+AgICA - gICAgH9/gICAf39/gIB/f39/f39/gICAgIB/f39/f39/f39/f4CAgIGAgH9/f39/f39/gICAgICAgIB/ - f35+fn9/gICAgICAgIB/f39/f39/f3+AgICAf39/f3+AgICAgIB/f3+AgH9/f39/gICAgH9/f4CAgICB - gIB/fn5/f4B/f39/f4CAgICAf39/f39/gICAgIB/f39/gICAf39/gICBgYCAgH9/f39/f39/f4CAgICB - gYCAf39/f39/f39/f39/gIGBgYGAgICAf39/f35+fn5/gICBgYGBgYCAgH9/fn19fX5/gIGCgoKBgYGA - f35+fX19fn+AgYKCgYGAgICAf39+fn5+f3+AgYGBgICAgICAgH9/f39/f3+AgICAgICAgICAgH9/f39/ - gICAgIB/f39/f3+AgIB/f3+AgICAgIB/f39+fn9/f4CAgICAgYGAgH9/fn5/f39/f3+AgIGBgYCAgH9/ - fn5+f3+AgICAgICAgICAgH9/f39/f3+AgICAgICAgICAgH9/f39/f39/f39/gICAgICAf39/f39/f39/ - f4CAgIGBgIB/f35+fn9/gICAgICAgH9/f39/f39/f3+AgH9/gICAf39/f4CAgICAgH9/f39/f39/f4CA - gICAgIB/f39/f4CAgIB/f39/f39/f3+AgICAgIB/f39/f39/f4CAgICAgICAgH9/f39+fn9/gICAgICA - gICAgICAgH9+fn5/f39/f4CBgYGBgYCAf35+fn5/f39/f4CBgYGBgYCAf39+fn5+f39/gICBgYGBgIB/ - f35+f39/f3+AgICAgICAf39/f39/gICAgICAgH9/f4CAgH9/f4CAgIB/f39/gICAgIB/f39/f39/f4CA - gICAgICAf39/f39/f4CAgICAf39/f39/gICAgICAgICAgH9/f39/f39/f4CAgICAgICAgIB/fn5+f39/ - f3+AgIGBgYCAgH9/fn5+fn5/f4CAgIGBgYCAgH9/fn5+f39/gICAgICAgICAgICAgICAf39/f39/f3+A - gIGBgYCAf39/fn5+f3+AgICAgICAgH9/f39/f39/f4CAgICAf39/f4CAgICAgICAgH9/f39/gICAgIB/ - f39/gICAgH9/f39/f3+AgICAgICAgICAgIB/f39/f3+AgICAgICAgH9/fn5+fn9/gICAgICAgICAgH9/ - f35+f3+AgICAgICAf39/f39/f39/gICAgICAf39/f39/f4CAgICAgIB/f39/f3+AgICAgIB/f39/gICA - gICAgICAf39/f39/gICAgICAgH9/f39/f39/f39/gICAgICAgH9/f39/gICAf4CAgICAgICAgH9/f39/ - f3+AgICAgICAgIB/f39/fn9/f3+AgICBgYGAgIB/f39+fn5+f3+AgIGAgICAgIB/f39/f39/f3+AgICA - gICAgICAgICAgH9/fn5+fn+AgICBgYGAgIB/f39/f39/f39/f4CAgICAgICAgH9/f39/f39/f3+AgICA - gICAgH9/gICAgICAgIB/f39/f39/gICAgICAgICAf39/fn5+f39/gICAgYGAgH9/f35+f39/gICAgICA - gH9/f39/f39/gICAgICAgICAf39/f39/f39/f3+AgICAgICAgH9/f39/f39/f4CAgIGBgIB/f39/f39/ - f3+AgICAgIB/f39/f39/f4CAgH9/gICAgICAgICAgICAf39/f3+AgICAgICAgIB/f39/f39/f4CAgICA - gIB/f39/f4CAgIB/f39/f39/f3+AgICAgICAgICAf39/f39/f3+AgICAgICAgIB/f39/f39/f39/f39/ - gICAgICAgH9/f39/f39/f39/f3+AgICAgICAf39/f39/f39/f3+AgICAgICAgICAf4CAgH9/f3+AgIB/ - f39/f3+AgICAf4B/gIB/f39/f39/f3+AgICAgICAgICAgH9/f39/f3+AgICAgICAgH9/f39/f39/f4CA - gICAgICAgICAf39/f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgIB/f39/f3+AgICAgICAf39/ - f39/f3+AgICAgICAgH9/f39/f39/gICAgICAgIB/f3+AgIB/f39/f39/f39/gICAgICAgIB/f39/f39/ - f3+AgICAgICAgIB/f39/f39/f39/gICAgICAgIB/f39/f39/f39/f3+AgICAgH9/f39/f39/f3+AgICA - gH9/f39/gICAgICAf39/gICAgH9/f39/f4CAgICAgICAf39/f39/f4CAgICAgIB/f3+AgICAgICAgICA - gH9/f39/f3+AgICAgICAgH9/f39/f3+AgICAf39/f4CAgICAf39/f39/gICAgH9/f3+AgICAgICAgICA - f39/f39/gIB/f39/gICAgICAgIB/f39/f39/f4CAgICAgICAgICAf39/f39/f3+AgICAgICAgIB/f39/ - f39/f39/gICAgICAgICAf39/f39/f39/gICAgICAgICAgICAf39/f39/f3+AgICAgICAgICAgICAf39/ - fn9/gICAgICAgICAf39/f39/f39/gICAgICAgICAgIB/f39/f39/f3+AgICAgICAgH9/f39/f39/f4CA - gICAgH+Af39/f39/gICAgICAgIB/f3+AgICAgIB/f39/f39/gICAgICAgICAf39/f39/f39/gICAgICA - gIB/f39/f39/f4CAgICAgICAf39/f39/gICAgICAgH9/f39/f39/f4CAgICAgH9/f39/f39/gICAgICA - gICAf39/f39/f4CAf39/gICAgICAgH9/f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgICAgIB/ - f39/f39/f3+AgICAgICAgH9/f39/f39/f3+AgICAgICAgH9/f39/f39/f4CAgICAgICAf39/f39/f3+A - gIB/f39/f4CAgICAgIB/f39/f39/f4CAgICAgH9/f4CAgICAgH9/f39/f4CAgICAgICAgH9/f39/f39/ - gICAgICAf39/f39/f4CAgICAgICAgH9/f39/f3+AgICAgICAgIB/f39/f39/f3+AgICAgICAgH9/f39/ - gICAgICAgH9/f3+AgICAgICAgH9/f39/f39/gICAgICAgICAgH9/f39/f39/gICAgICAgICAgICAf39/ - f39/f39/gICAgICAgH9/f39/f39/f39/f39/f39/f4CAgICAgICAf39/f39/f3+AgICAgICAgIB/f39/ - f3+AgICAgH9/f39/f3+AgICAgICAgH9/f39/f39/f3+AgICAgICAf39/f39/f39/gICAgICAgH9/f39/ - f3+AgICAgICAgICAf39/gICAgICAf39/f39/f3+AgIB/f39/f39/f39/gICAgICAgH9/f39/f3+AgICA - gICAgIB/f39/f39/f4CAgICAgICAgH9/f39/f3+AgICAgICAgICAgIB/f39/f39/f39/gICAgICAgIB/ - f39/f39/f39/gICAgICAgH9/f39/f39/gICAf4B/f39/f4CAgICAgH9/f39/f39/f3+AgICAgICAf39/ - f39/f39/f3+AgICAgICAf3+AgICAf39/f39/f4CAgICAgICAgIB/f39/f39/f4CAgICAgICAgH9/f39/ - f39/f3+AgICAgICAgIB/f39/f39/f39/f39/f4CAgICAgICAgIB/f39/f39/f4CAgICAgICAf39/f39/ - f3+AgICAgICAgIB/f39/f4CAgICAgH9/f39/f4CAgICAgICAf39/f39/f3+AgICAgICAgH9/f39/f39/ - f4CAgICAgICAf39/f39/f39/gICAgICAgH9/f39/f39/gICAgICAgIB/f39/f39/f39/gICAgICAgH9/ - f39/f39/gICAgICAgIB/f39/f3+AgIB/f39/gICAgICAgICAgH9/f39/f39/gICAgICAgIB/f39/f39/ - f4CAgICAgIB/f39/f39/f39/f4CAgICAgICAgH9/f39/f3+AgICAgH9/f4CAgH9/f39/f4CAgICAf39/ - f4CAgICAgH9/f39/f39/f39/gICAgICAf39/f39/f4CAgH9/gICAgH9/f39/gICAgIB/f39/f39/gICA - f3+AgICAgICAf39/f39/f39/f4CAgICAgIB/f39/f39/f39/gICAgICAgIB/f3+AgH9/f39/f4CAgICA - gH9/f39/f4CAgIB/f4B/f39/f39/f4CAgICAgICAf39/f39/f3+AgICAgICAgIB/f39/f39/f4CAgICA - f4CAgIB/f39/f39/f4CAgICAgICAgICAf39/f39/f4CAgICAgICAgIB/f39/f39/f4CAgICAgICAgH9/ - f39/f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAf39/f39/f39/gICAgICAf39/f39/gICAgICA - gH9/gICAgIB/f39/gICAf39/gICAgICAgIB/f4CAgH9/f39/f4CAgICAgH9/f39/f39/f3+AgIB/f39/ - f3+AgICAgICAf39/f3+AgICAf4CAgICAgH9/f39/f39/f39/gICAgIB/f39/f4CAgICAgH9/f39/f4CA - gICAgICAgIB/f39/gICAgICAgICAgIB/f39/f4CAgICAgH9/f39/f39/f4CAgICAgIB/f39/f39/f3+A - f39/gICAgIB/f39/f4CAgICAgICAgH9/f39/f4CAgICAgH+AgICAgICAgIB/f39/f39/f39/gICAgICA - f39/f39/f3+AgICAgIB/f39/f39/f3+AgICAgICAgH9/f39/f39/f4CAgICAgICAgIB/f39/gICAgIB/ - f3+AgIB/f39/f39/f39/f4CAgIB/f39/f3+Af39/f3+AgICAgICAgICAgH9/f3+AgH+AgICAgH9/f39/ - gICAgICAgICAgH9/f39/f39/f39/f4CAgICAf39/f4B/f39/f39/f3+AgICAgICAgICAgH9/f39/f3+A - gICAgICAgICAgIB/f39/f39/f4CAgICAgIB/f39/f39/f4CAgH+AgICAgIB/f4CAf39/gH+Af39/f3+A - gICAf3+AgICAgH9/f39/f39/f39/gICAgICAgICAf39/f39/f39/f4CAgICAgIB/f39/f3+AgH9/f4CA - gIB/f39/gICAgICAf39/f39/f39/f4CAgICAf4CAgICAf4CAgH9/f39/f4CAgICAgICAgICAgH9/f39/ - f39/gICAgICAgH9/f39/f39/gIB/f3+AgICAf3+AgICAgICAgH9/f39/f4CAgICAgH9/f3+AgIB/f4CA - gICAgH9/f4B/f39/f39/f3+AgICAgICAgH9/f39/f39/gICAgICAgH9/f39/gIB/gICAgIB/f4CAgH9/ - f3+AgICAgH9/f39/f39/gH9/f3+AgICAgICAgICAf39/f39/gICAgIB/f39/f39/f39/gICAgICAgH9/ - f39/f4CAgICAgIB/f39/f39/gICAgICAgH9/f39/f39/f4CAgICAgICAgH9/f39/f4CAgICAgICAgIB/ - f39/gICAgICAgH9/f39/gICAgICAf39/f39/f39/f4B/f39/f39/f39/f39/f39/f4CAgH9/f39/f39/ - f39/gICAgICAgICAf39/f3+AgICAgICAgICAgICAgIB/f4CAgICAf39/f39/gICAgICAgICAgH+AgH9/ - f39/f4CAgICAgICAgICAf39/f39/f39/f4CAgICAgICAf39/f39/f39/f3+AgICAgICAgICAgIB/f39/ - f3+AgICAgICAgIB/f3+Af39/f39/f4CAf39/gICAgICAgH9/f39/f39/f3+AgICAgICAgH9/f3+AgH9/ - f39/f4CAgICAf3+AgICAgH9/f39/f39/f3+AgICAgIB/f39/f4CAgICAf39/gICAgIB/f39/f39/f39/ - f39/f4CAgICAf39/f39/f39/f4CAgICAgH9/gICAgIB/f3+AgICAf39/f4B/f3+AgICAgICAgIB/f39/ - f39/gICAgIB/f39/f39/f39/f4CAgICAgIB/f39/f39/f4CAgICAgH+AgICAgICAgH9/f39/gICAf3+A - gICAf39/f3+AgICAf39/f4CAgICAf39/f4CAf39/f4CAgICAf3+AgICAgICAgH9/gICAgICAgIB/f39/ - f4CAgH9/gICAgIB/f39/f4CAgIB/f4CAgICAgH9/gICAgIB/f39/f39/gICAgICAf39/f39/f39/gICA - gICAgH9/f39/f39/f3+AgICAgIB/f39/f3+AgH9/gICAgIB/f3+AgICAgH9/f39/f39/f39/gICAgICA - gH9/f39/f4CAgICAgICAgH9/f39/gICAf3+Af4CAgICAgIB/f4CAgICAgH9/f39/f39/f3+AgICAgIB/ - f39/f39/f39/f3+AgH+AgICAgICAf39/f39/gICAgICAgICAgICAf39/f4CAf39/f39/gICAgICAgH9/ - gIB/f39/f39/f39/gICAgICAgICAf39/f39/gICAgICAf39/gIB/f39/f3+AgICAgICAgH+Af39/f3+A - gICAgICAgIB/f39/f4CAf39/f4CAgH9/f39/f4CAgIB/f39/gICAgH9/f39/f4CAgICAgIB/f4CAgIB/ - f39/f4CAgICAgICAgICAgH9/f39/gICAf39/gICAgICAf39/f39/f39/f39/f4B/f39/f39/f3+AgICA - gH9/f4CAgICAgICAgICAgIB/f39/f4CAgICAf39/f3+Af39/f3+AgICAgH+Af4CAgH9/f39/f39/gICA - gICAf4CAgIB/f39/f4CAgH9/f4CAgICAgH9/f3+Af39/f39/gICAgICAgH+AgICAf4CAf4CAf39/f39/ - gICAgICAgIB/f39/f39/f39/gICAgH9/f4CAgICAf39/f39/gICAgICAgICAgH9/f39/f39/gICAgICA - f39/f39/f39/f4CAgICAgICAgICAgH9/f39/f3+AgICAgIB/f39/f4CAf39/f3+AgICAgH9/f4B/f3+A - gICAgICAgH9/f39/f3+AgH9/gICAgICAf39/f39/f3+AgICAgICAgICAf39/f4CAgH+AgICAf39/f3+A - gH9/f4CAgICAf4CAgH9/f39/gICAgICAgICAf39/f39/f39/f4CAgICAgICAgH9/f39/f4CAgICAgH9/ - f4CAgICAf39/gIB/f39/gICAgICAgICAgH9/f4CAf39/f3+AgICAgICAgIB/f39/f39/f3+AgICAgICA - gICAf39/gICAf39/f4CAgIB/gICAf39/f39/f39/gICAgICAgH+AgH9/f39/gICAgH9/f4CAgIB/f4CA - f39/f3+Af39/f4CAgICAgICAgIB/f3+AgICAf39/f39/gICAgICAf4B/f4B/f39/f4CAgH9/f3+AgIB/ - f39/f39/f4CAgIB/f3+AgICAf3+AgIB/f39/f39/f39/f4CAgICAgICAgH9/f39/gIB/f4CAgIB/f3+A - gICAf3+AgICAf39/f4CAgH9/f4CAf39/gICAgH9/f3+Af39/f3+AgICAf39/f4CAf39/f3+AgICAgICA - f39/f3+Af39/gICAgH9/f4B/f39/f3+AgIB/f3+AgICAgH9/gICAf39/f3+AgICAgICAgH9/f3+Af39/ - f39/gICAf39/gIB/f3+AgIB/f39/f4CAgH9/gICAgIB/f4CAgH9/f39/f39/f39/gICAgICAgICAgH9/ - f39/f39/f4CAgICAgICAgICAf39/f39/f3+AgICAgIB/gICAgH9/f39/f3+AgICAgICAgH9/f39/f39/ - gICAgH9/gICAgH9/f39/gH9/f39/f3+AgICAgICAf4CAf39/gH9/f4B/gICAgICAgICAgH9/f39/f39/ - gICAgIB/f39/gICAgH9/f39/f39/f3+AgICAgICAgIB/f39/f3+Af39/gICAf3+AgICAf39/gIB/f39/ - f4CAgICAgIB/f39/f39/gICAgICAgICAf39/f39/f39/f3+AgICAgICAf39/f3+Af3+AgICAgICAgIB/ - f39/f4CAgH9/f3+AgICAf39/f3+AgIB/f4B/f3+AgH9/gIB/gICAf39/gICAgH9/f4CAgH9/f3+AgIB/ - f39/gICAf4B/f3+AgICAgICAf3+AgICAf39/gICAgIB/gICAf39/f39/gICAgH+AgICAf39/f3+Af3+A - f39/gIB/gICAf3+Af39/f39/f4B/gICAgICAgH+AgH9/f39/gH9/gICAgICAgICAf39/f39/f3+AgICA - gICAgICAf39/f39/f39/gICAgICAgH+AgH9/f39/f4B/f4CAgIB/gICAgIB/f39/f3+AgH9/gICAgIB/ - f3+Af39/f3+AgICAf4CAgICAgH9/gICAf39/f4CAgH9/gIB/f39/f3+AgH9/f3+AgH9/f3+AgICAgICA - gICAf39/gICAf39/f4CAf39/gICAgIB/f3+Af39/f39/gICAgICAgIB/f39/f4CAf39/gICAgH+AgH+A - gH9/f39/gH9/gICAgICAf39/f39/f3+AgICAgICAgICAgH9/f4CAf39/f4CAgH9/f3+AgICAf3+AgIB/ - f39/gICAgH+AgICAf39/gIB/f39/f4CAgIB/f39/f3+Af4CAgH9/f3+AgIB/f4CAgICAgH9/gH9/f39/ - gICAf3+AgIB/f39/f4CAgIB/f4CAgICAgH+AgH9/f39/gICAf39/f4CAgH9/f4CAgH9/gIB/gIB/f4CA - gICAf39/gICAgH9/gIB/f4B/f39/f3+AgICAgH9/f4CAgIB/f39/gICAgH9/f39/f4CAgICAgH+AgH9/ - f39/f3+AgIB/f4CAf4CAgH9/f39/f3+AgH9/f4CAgICAgH+Af3+AgH9/f39/f4CAgH9/gH+AgICAf39/ - f39/gICAgICAgIB/f4CAf4CAf3+AgH+AgICAgICAf3+AgH9/f4CAgICAf39/gH+AgH9/f39/f3+AgICA - gIB/f4B/f4CAf39/f4CAgH9/f4CAgH+AgH9/f39/f4CAgICAgICAgICAf4CAf3+AgH+AgIB/gH9/gICA - gH9/f4CAf3+Af3+Af39/f4CAgH9/f39/gICAgH9/f4CAf3+AgH9/gICAgICAgICAf4CAgICAgH9/f4CA - f4CAgICAgH9/f39/f3+Af3+AgICAgIB/f4B/f39/f39/f3+AgICAgICAgIB/gICAf39/f4CAgIB/f39/ - f3+AgH9/gICAgICAf39/f39/f4CAgH+AgH9/gH9/f4B/gICAgICAgICAf4CAf3+Af39/gICAgIB/f39/ - f3+AgIB/gICAgICAgICAf39/f4CAf39/f39/gICAf3+AgICAgH9/f39/gICAgH9/gICAgH+AgIB/f39/ - f4CAgIB/f4CAgIB/f3+AgICAf39/gICAgH9/gICAf39/gICAgICAgICAgICAgH+AgH9/f39/f4CAgICA - gICAf4CAgH9/f35+f39/f4CAgYGBgYGAf39/gH99eXh6f4OEg4ODhYaFgn98enp7fH5+fX6AgoODgoB/ - f4CAgIB/f35/gIB+fXx9foCBgYCBgYKCgoF/fn1+f39/fn5/gIGBgYB/f4CAgYGAgH9/gIB/fn5+fn+A - gICAgIGBgYGAf35+f39/f39/f4CAgIB/f3+AgICAf3+Af39/f39/f39/gICAgICAgICAgH9/f4CAf39/ - f3+AgICBgYGBgH59fX19fn9/gICBgYGCgYGCg4ODgHZsbnmDiIqGhIWHhYOCgX59gIB9d3JzeX+Cg4OD - hIWGh4WDgH59f4KCeGdhbXyHi4iFi5SXkomAdW5udHh7eHV6hImKiYR/foCChIWEf3x+gYB8dXByeH6E - h4aEhYeIh4WBfXp7e3p5d3d6foGEhYWFhoaGhYJ+e3p8fHt7ent9gIKDg4KCg4SEg4F/fX19fHt7e3x+ - gIKCg4SEg4OCgH99fX19fX1+f39+fYCCg4KAf4CBgYGBgX99foCBgoJ/dmtrdoKJi4qMkZOOhXtybG11 - foKCfnp8gYOEhoeGhIKBf3x6eXx/gYOGhnxnW2Z6houMj5qkopSEdmhfX2ZvdXuCjpeYk4uDfX6AgYB6 - cGdpdIGKjYqIiIqMkI98XEpYcoOMioaPn6Wdj35rYGNvfIN+eHqAgoaJiYmJiYmHgnlxcHZ/hYeDd2Zg - cYSLh4KHmKajkYBzaGRpcHR1c3mJlJKKhIKFiomHhH51b3J5gYiGdmRic4eRj4SDkqCej39wZWRrc3V0 - cnqNmpmSjIaDgoB7d3JucHmCg3x2eIOQmJeOgnt6fntuYWBpeYuUk5COjY6Oh3hraG95gIKAf4GFiIqF - fHZ1e4SKh4B7enyChoR/f4KFiIZ5ZFpkdYOLjo+Wn6GXh3ZnX2Focnp9gY2XmJCEenh+g4SAd25sc3+K - jYmHiIyRkoRgQUdjfY+UkputsaORfmVSUmBwfH98gYmNjpCQkIyFgoJ7bmZncH2JkJSIaFRng4yKhIWa - sKyTfm1cV2BtdHR3hJackoWCi5eViHtyamZqcnuIlY5vVGB9jZGKhJWxt5+Cb11TWGFmaWx5lamklI6T - nJuMempfW2FvgYdyU1d+nqeilZOhq6CKclVCR1xveXl6i6SwqJaDeX2IjYZzXVRdc4ualnhcZIafopB3 - dI2gm4dwWlFfdoWIgHuGnKach3RoanWAhoJ6dXZ+ho2QkpCEbFtic3p6fYOQnqKYinxvaWtwdHd9h5KW - kIZ+d3FsbXmJkYyDfHyBiY6Oi4V+c2FQVmdyfIydsLu0nIV1Z11bXWFreIeUlouCho6RkIuEf3pxaWhw - fY2akW1OVXWMkouGl7O5o4ZsVUhQZXR3dHuSp6aYioWMkIh8cGZeYGx/k6CVb09Ye5KWjoaUsruif2VR - SFBfanB3hp2sp5aMkpyZh3FgVldjdImOa0NViau1qpeasLCVeV9AMkFZbXl7g524vrCdkpCMfWlYTUxc - d4h/Y1t2mK+0qaGnq5qBalA5N0VZbHyHmK+7uaydk4yAbV1TT1JjfY19XmGDorOxoZqlp5J6Z0w4PFFm - d4ONnbCzpZaPjo2GdGRbUU9jg5yegl5fhKKnmoWEmqeZgGdMPkxoeoOGiZaqrpyHfHt/gH52aFxdboad - pY5gTmyNmZmLf46lp5J2WkdHW3eOlIuLnKabhG5haYCTlYdwX2BxjKWtnXdORmiJinhse6XGv5p3YVVa - bXh0a2yBm6GRfXqIl5iPg3ZoY2t8j5iBUzxahZqgmZKftbacfF5FP1BmdHh3gJmsqZqRkpaQgW9fVFZk - epSadkhPgKSto5GYsLKXfWRFNT9VaXmFkaS1s6CSlJiOemZXTVJpg4ltSlR/pLq6qKWyrZB4YkEqMEdh - doKPqMHIuqOVkIVxXU9GSV96g21Za4+tv7qqqrChf2VUPzA2S2Bziqa+ycOwnZOJe2dTQ0JTbYWHa1Zt - mLXAuKinq5x8Y0suJz9ccIOSn7PCv6+dkIZ5aVhIQEdggqKqiWNnjKivoIiHmZ6PdlpAO0pedYiNkKS9 - vaaRhoF9c2JTTVFigJ2igVhdiKu1po+OnqCKcFY9NEZkfI6Yn623rJSAeXh7enRpWExYfKS5qHNKXYqi - oYx3fZinmX5gRkJYdIaOjo+ao56NgH18e3t3bWRjcISbqI9aRWaJmqKXi5SjoI53WUBBV3KIkYqKmqSd - k4+Mhn5zZl1aYnaSpJNgQ12KoqaclaKxqIxyVzswP1t2ipilsbKll5WXj3phUEpQZIKRf1lRd6C5vaic - qK2TdmVKKiI4W4Gfqauxtq+lpJqAYkg9Rlt2hnNLToCuxsewpLG4m3NUMRcePGOFmZ+sv8S7sKSPdWBR - S1BaWT80X5S0x87Hycu1imNCIxYkPFx/k52zzM7Cu6uJaFJHSlhgTjA4bJ+9y8jEyce0k2k7FgwjSGN2 - jKS/0tPGtZ+EaVRIR09TRDVOgae8xsbIy76deFk+LS47Slxtfpq6ztLMvqKCZ1RHP0JSZ3d0ZnGTsby0 - paezqottUzsxOUtdbX6TsczRv6aWinpoVklDSFx7jHtkcZSuu7Wkoqeae2VXQDI8VGp/j5qqvcO4ppaG - c2FTS0hPZICQgmtyj6i1sKCbn5d/aFVAOUdcbH6Pm6u8u6qZj4R5bVtMR1BjfZqmkWtlhKCpoY+MmJuK - cVpIQEthdYWQnK65rpSCg4mFdGBRTVZsiqapfk1UhaeqnIqSqquPc11DND5Xc4udqK2toI2JlZiHbFVK - TV11kp19TFGHscCyko6mqo1wWTokMFV7mqmlo6ionZeZj3pjTUdTaoWLaEJVjLTHwaehr6uLaE0vHSpS - e5afnqe2urGkloNvXlFKT2R6bU1TgKa9x7ituLeVa1M6IiM9Y4WXmaO4wbuzp49zX1BMU2BnWD9NgKm/ - x7yyvcWpe1UxFx89WHOKkp++0cWzqph8Y1BGS1lgTzpRhq3Ax8K8vbicd1c6Jio/Vmh5hpy7z829q5iE - cl9LPTtMaIKHcGN/qL69raOoq5dzUjwwMkJYcYeatMrLtZyPjYd4YUo8PFJ0kZZ4X3afucKwlZWgk3Zh - SjQySWZ7iZGet8W6opCGgn1sUkRETWKCpLOdcWKAnqCUg3+Uo5Z6YU1BSWF3hY6Yq7itkH2AjIl1YldT - V2Z7kKmuh1pki5iShnqHo6eNdmNMRFdwgYyPkaCrn4h8gISAeG1gWmFygpWoqodZV3aGiIeAiaiym39q - VUlTaXyGipGdoZN+e4uVi3ptY2FncHqJnqqVZk1heoaMiIynuquKbVZIS1dlfJSgoJmKfYKVopiDblxW - YnJ9jp6FVExzlJ6Yio+vwqmBY0c0PVhvg5OZm56ZkJKeoI93YVVTXGx/kJFxUmeQp6qbkJ2tpottUToz - QWOIm5uUlJ6hnJyeknthUFBaaHuMhGJVeJ6vsJ2Pn7KhfGRQOjZJZX6Ql5qlrqidnJyPdlpGR1tygHZa - U3egu8Ovm6Com3xiSzc0RV51hpKitLesoZ2Zj35jTEJGVm6HmIhmaJCts6qWj5ygiW5aRDdFX29+k6Gs - t7CYh4uSindeSkhTZXqTpZpyX3ydpJqGgJKimX5pVkVFW3iJioqdtbKXfXmHj4BqX1xeaHR9jJ+rpIRi - W2l6g4GAkqqslX1sW1BXaHuIkJeblIh+f4yRiHxvamxubnKBk5+fiWVXan2ChIOLoq+fhHFgU1dlcXyJ - lqKqoIp4cm9vdHx/fHJvdoGNkpWZnZd/W0hUZGd0h5WmtK+biXlnX2FnbniDjY6Hf32Bio6Jh4aAd3Jx - cXaCjJKWjGtRW3F9goSKoLKsloJxYVpeZ3J9hY2VkoeBg4uNhHt4d3R0dXZ6g42XoZx4S0JZbXyMlKC3 - vaiOe2NNR1Nqf4mMjIiCgo2eppuHd21paWloboGTmY1vV2B5ipOWm6qzpYdtWklAS2iIm56WjIWEi5uj - loFvY2FnaWlvg5qjlHFea32Fi46VpaybfWZZUlVic4SPkY6Lh4mUoaWXfmdbWmBqdoaRg2NhgpyhmIyS - paeRdlxFQVt4gIOHiJCdm42KlJiQf2pZVVxqeoiXm4Nla4aPioiKmKuqjG1dUU1ZbHuKlZialod+iZma - i3ZjXWBpdH6KkIFna4iVj4mGkqaokntpVElVZ3F8iZakqpyEe4eNhHlwa2dnbXR8h5ajo4xmU2N6hIKC - jqOrnId1ZFhZY297iZWaloyAfImVj35ya2docHh+hI6XnJ2MZU5ccXuCiZGepZ6NfWxbV19tfomOl6Kh - koN5c25rbnd7dHN7hY+ampCJiYqJe1k8Ql53i5ebqbi1o453X1FSXWt3fIGNlJWSi4eHh4eGf29laHB6 - goSDho+YlYBiV2V3hYyLjJedlId+cWBbZneGjIuNlZaPhXtycHZ+gHtvaXKDkZaSjIqIgoGJjHhROUxy - ipOSkqC0uKaMbVNKWWx1dXN6jJmYk4+OioeFfXFpanBydnyBhpCdo5NtT1Rqe4eLi5emppeFcVxRWm6D - kZKNiYR/gImRjoN1a2txeH2Ag4WIiouQl45oQkZlfpCZk5ioqpaDdF9QXXyPi3ttcIGNjZCWlYyDenFt - cHV5f4SGiIBqW2Z6jJmbmaKolHJhYGJqd39/fHp/ipCPjY+Pi4F1bG1xcnF3g5KdmXpXV3CCjZKPlqOf - hnBoZGZzf315fIKKjoiBh5KVjoJyZmVvd3uCiYuDcm15goaJi5CanpF7bGVgXWR2iZSVk46GgYKKj4h6 - bmhqcnZ1eomVmZmXhWdXYW95gIOMnaOYjIN2ZV9mcn6Jj4+Kgn19hoyHfnh3dnZ5fH2BiY2MjY+EaVJW - anuIkJKbpKOVhHVkWFppeICEipGTj4uKiod+dXFwbm1xeIOOko+LiIWHjo12UkVbeYmMiY+fqaSWhHBe - WWJ0gH97gY+VkIaBgYKDg352bWxxeYOJiYiJiYiLkIx2VkldeIaJhYmcrKqbh3JfWmVzenl3fo6Yk4Z+ - foOKjYl9bmVmb3uEiIqLjIuHhomKhXhfUF1zf4OGiZiqr6OSfGVbYGhqam14jJuclpGQjomFfnFjXWBo - c4CKkZmblI6NjYqEclNATWl+iImOoLO1ppJ6Z15ham9raHB+jJOUlJmbk4d9dGtkZWpxeH+Fi5CQjpKW - lo1yUUdZbnuFiZCir6iXhnNiXmh0e3t5eoCIjY2RlJGIfXRua2xvdHyChYiOk5aalXlVUWZ2fX58h5qi - mo+GeG1ygYeAc2hpeIGBhZGVj4iDfnl5e3t6eXZ0d4CJkZWLcF5sgoqHf3yJmZmJfHNscX+FgHl1eYOG - gX+GjIqEfnt7fn9+eXd4e4CHj49/aWJxgIiKiIqUmpKBdGxmZm9+iouHh4qIgn6EiYV7cG1xeHx+g4qM - iYeHh4iJgWxXWGx/ioqFjZ6lnIx8bWRmb3d5eX6GjIuJiIuMhn12c3NzdHd9g4aHiYuIgoOIin9pWFxw - f4SGiJOjqJuKfG5kY2txcnJ3hZKVkYyKjY+LgXlwaGVna3J8hI2Xm5eRjYiBenVxbmtjXWR2hpCZnqKm - opaFdWVbWmBmbnaAjZmbmJWSjoqGfnNqZGNla3R9hpCVlpORj4uCe3ZzcXFzc21mbH6MlJaVmJ6ckYR2 - Z15eY2pyeoCLmZ6ZkImEg4F9d3BrbnN3en6EiIyNiYSChISCf3p2d3l7f4OBdmpugIyNiYWLmJqPgnZr - ZmhscHN3f4+dnZSMhoF9eXR0dnZzcnZ8goiMjo2JhIOBe3V1d3h6fH1+goqQjn9wbnmDhoJ8fomPjIV9 - dnFzen5+fH6Fjo+Hf3x8fX6AgH98eHZ4fYCDhoqMh4B6eXl4eX2Af319f4GEh4eGhYN/dm1tdn2BhYeL - kZONhH53cnFzdnh6fYSMjYiEhIWFhIB7eHd1cnN5gYaJioqJhoKAfXp5eHd3eXp9gIWKjIqIhYJ/eXBr - bnh/hIeIio+QjIZ+d3NzdXh6fH6ChIWFh4eHhoSAfHh1dXd5foKEg4SEg4KBgH9+fn59fXx9foCEhoWD - gXt0dHyBgYGAhIuNiYN+e3l5eHd5fH6Bh4iFgoKCgoGAf39/fXl2eHyBg4SGhYSEgoB9ent9fX18e3t9 - gYOFhoeGhIJ/fHp6enl3d3qAhoiIhoiKiYV/enZ2eHh3eX6Bg4eKiYaDgoB+fHp5eXl7fX6BhIWEhYSD - gX9+fXp4eXx+fn6Ag4SFhYODg4KAfnx7e3t6d3h+hIaHhoaHiIWAfXp3dnh5ent+goeLiYWEg4B9enh5 - e35+fn5/gYKDg4SEhIKAfXp5eXp8fn+AgoSFhYSEg4F/f318eXl6fH1+f4CDhoeFhIOBf358e3p7e3x9 - fn+Bg4SDg4OEhYOAfXt6e3x8e32AgoODg4KCgoKCgH59fHx9fn18fYCCgoOCgoKDgn99fHt7fH1+gIGD - g4KBgICAgYB/f3+Af35+fX5/gIGCgoB9fn+BgoKBgIKDgX17ent9f4CAgYOEhIKBgH59fX18fH1+gIGC - goKCgoGAgICAf359fH19fX5/gIKDg4OCgoGBgX9+fXx7fH19fn+BgoOFhYSCgX99fHx8fH19f4CAgIGC - g4ODg4KAfn18fHt8fX+BgoKCgoKBgYB/f359fn59fX5/gIGBgYGBgYGAf39/f39/fn5+f3+AgICAgYGB - gYB/fn1+fn5+f4GBgoKBgH9/fn5/f3+AgICAgYGBgICAgH9/fnx9foCBgYGBgYGAf35+f39+fn9/fn6A - gYKDgoKBgH9/fX18fX1+f4CCg4SEg4KAf318enp8fX+BgoKCgoKBgH9+fX19fn5/gICAgICBgH9/gICA - gIB/fn9/f39/gIGBgICAf39/fn5/f3+AgIGBgICAgH9+fn5+f4CAgYGBgYGAf39/f39/f4CAgIB/f39/ - gICAf39/f39/f4CBgYGAgIB/fX1+f39/gIGBgYGBgYGAgIB/fX19fX5/gICBgoOCgYB/fn5/f359fX6A - gICAgYKDgoGAf35+fn5+fn1+f4CBgYKCg4KBgH99fHx8fX1+gIGDg4OCgoB/fn18fH1+f4CAgICBgYGB - gYCAgIGAf319fX19fn5/gIGDhISDgoF/fn18e3t8fX5/gYKDhISEg4GAf359e3t7fH1/gIKCgoODgoGA - f35+fn59fHx9fn+AgYODg4ODgYB+fXx7fH19fX+AgoODg4OCgYB/fn18fHx9fn+AgYKDgoKDg4KAfn18 - fHx8fX+AgYKCg4KCgYB/f39+fn5+fn9/gICAgYGBgICAgICAf39+fn5+fn5/gIGBgYKCgoF/fn19fX5+ - fn9/gIGBgoKCgYCAgH9+fX19fn5/f4CBgoKDgoKBgH9+fXx8fH1+gIGCg4OEg4KAfn19fX19fn9/gIGB - gYGBgYGBgIB/fn59fn1+fn+AgIGBgYGBgYB/fn5+fX1+fn+AgoKBgYCAf39+fn5/gICAgICAgYGAgH9/ - fn5+fn9/gICAgICAgICAgICAgH9/fn19fX5/gIGBgoKBgYGAgH9+fX19fn5/gIGBgYKCgYB/f39/f39+ - fn5/gICAgICAgICAgICAgICAgH9+fn5+f3+AgIGBgYCAgH9/fn5+f39/f39/gIGBgICAgICAgH9/fn5/ - f39/gIGBgYGAf39/f3+AgICAgH9/f35/f4CAgYGBgH9/fn9/f39/f4CAgIB/f4CAgH9/gICAgICAgH9+ - fn5+fn5/gYKCgoKCgYB/fn18fH19fn6AgoODgoKBgYB/fn59fn59fX5/f4GCgoKCgoGBgH9+fX19fn5+ - f3+AgYKBgYGAgH9/f39/f39/gH9/f39/f4CAgH+AgIB/f3+AgIB/f4CAf39/f39/f3+AgIGBgYGBgH5+ - fX1+fn5/gIGCgoGAgH9+fn5+fn9/gICAgICAgICAgH9/f39/f4CAgICAgICAf39/f3+AgICBgICAf35+ - fn9/f3+AgIGBgYGAgH9/f35+fn5+f3+AgYGBgoGBgH9/fn19fX1+f4CBgoKCgoGAf359fX1+fn9/gIGB - gYGBgYCAf35+fn5+fn9/gICAgYGBgYGAgIB/fn5+fn5/f4CAgYGBgYGAgH9+fn5+fn9/gICAgIGBgYCA - f39/f39/gICAgICAf39/f39/gICAgICAf39/f39/gICAgICAgH9/fn5+f4CAgIGBgYGAgH9+fn5+f3+A - gICAgICAgH9/f4CAf39/gICAf39/f4CAgICAgICAgICAgH9/fn5+fn5/f4CAgYGBgYGBgIB/f359fX1+ - fn+AgYKCgoKBgYB/fn5+fn5+f4CAgIGBgYGBgYB/f39+fn5+f39/f4CAgIGBgIB/f39/f39/f4CAgICA - gICAgH9/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgH9/f35/f3+AgICAgICAgIB/f39+fn5+f3+A - gIGBgoKBgH9+fn19fX5+f4CBgoKCgoGAf35+fX5+fn+AgIGBgYGAgIB/f39/f35/f3+AgICAgICAgIB/ - f39+fn5/f3+AgICBgYCAgIB/f35+fn9/f4CAgICBgYGAgH9/f35+fn5/f4CAgYGBgYGAf39+fn5+f3+A - gICAgICAgH9/f39/f39/f3+AgICAgICAf39/f39/gICAgICAgICAgICAf39/f39/gICAgIB/f39/f39/ - gICAgICAgH9/f35+fn9/gICAgICAgYGBgIB/f39+fn5+f3+AgYGBgYGBgH9+fn5+fn9/f4CAgYGAgH9/ - f39/f3+AgICAgICAf39/f39/gICAgICAf39/f39/f4CAgICAgH9/f39/f39/gICAgICAgIB/f39/f39/ - f39/gICAgIB/f3+AgH9/f39/f3+AgICAgIB/f39/f39/f4CAgICAgICAgH9/f39/f39/gICAgIGAgIB/ - f4CAf39/f39/f3+AgICAgYGAgICAf39+fn5+fn9/gICBgYGBgIB/f39/f35+f39/gICAgICAgICAgH9/ - f39+fn5/gICAgICBgYCAf39+fn9/f4CAgIGAgICAf39/f39/f39/f39/f4CAgYGBgIB/f39+fn5+f4CA - gYGBgICAf39/f39/f3+AgICAgICAgICAgICAgIB/f35+fn9/gICAgYGBgYCAf35+fn5/f3+AgIGBgYCA - gH9/f39/f39/f39/f4CAgICBgYGAf39/fn5+f39/f4CAgICAgYCAgH9/f39/f39/f3+AgICAgYCAgICA - f39/fn5+f39/f4CAgYGBgYCAgH9/f39/f39/f4CAgIGBgYCAgH9/fn5+fn9/gICBgYGBgICAf35+fn5/ - f4CAgICBgYCAgH9/f39/f39/f39/f3+AgICAgICAgICAf39/f39/f39/gICAgYGBgICAgH9+fn5+f39/ - gICAgYGBgICAf39/fn5+f3+AgICAgICAgICAf39/f39/f39/f4CAgICAgICAf39/f39/f39/f4CAgYCA - gICAf39/f39/f3+AgICAgICAgICAgIB/f39/f39/f39/f4CAgICAgICAf39/f39/f3+AgICAgICAf39/ - f39/gICAgICAgH9/f39/f39/gICAgICAgIB/f39/f39/f4CAgICAgICAgH9/f39/f39/gICAgICAgICA - gH9/f39/f35/f4CAgIGBgYGAgH9/fn5+fn9/gICBgYGBgYCAf39+fn5+f3+AgICAgICAgIB/f39/f39/ - f4CAgIB/gICAgICAf4CAgH9/f3+AgH9/f39/f39/f4CAgICAgICAgIB/f35+f39/f3+AgYGBgICAgICA - f39/f39/fn9/gIGBgYGBgIB/f35+f39/gICAgICAgH9/f39/f3+AgICAgICAgH9/f39/f3+AgICAgICA - gH9/gIB/gICAf39/f39/f39/f3+AgICAgICAf39/f39/f3+AgICAgICAgICAgH9/f39/f39/gICAgICA - gH9/f39/f39/f4CAgICAgICAgICAf39/f39/f4CAgICAgICAgIB/f39/f39/f39/gIB/gICAgICAf3+A - gICAgIB/f39/f39/f4CAgICAgIB/f39/fn5+f3+AgICBgYCAgH9/f35+f39/f4CAgYGBgICAgH9/f39+ - f39/f4CAgIGBgICAgH9/f39+fn5/f3+AgIGBgYGAgH9/f35+fn9/f4CAgICAgICAgIB/f39/f39/f39/ - f4CAgICAgICAgIB/f39/f39/f39/f39/gICAgICAgH9/f39/f39/f4CAgICAgICAgH9/f39/gICAgICA - gIB/f39/f4CAgICAgIB/f39/f39/f39/gICAgICAgH9/f4CAgH9/f3+AgIB/f3+AgIGAf39/f39/f39/ - f4CAgICAf39/f39/f39/f4CAgICAgICAgH9/f39/f3+AgICAgICAgIB/gICAgH9/f39/f39/gICAgICA - gH9/f4CAgICAf39/f39/f3+AgICAgICAgIB/f39/f39/f39/f4CAgH9/gICAgICAf39/f39/f39/gICA - gICAgICAgH9/f39/f4CAgICAgIB/f39/f3+AgICAgICAf39/f39/f4CAf4CAgICAgICAf39/f39/f4CA - gICAgICAf39/f39/f39/f3+AgICAgICAgICAf39/f39/f39/f39/gICAgYGBgYCAf39+fn5+fn9/gIGB - gYGBgYCAgH9/fn5+fn5/f4CAgYGBgYGAgH9/f35+fn5/f3+AgIGBgYCAgH9/f39/f39/f39/f4CAgICA - gICAgIB/f39/f39/gICAgICAgICAf39/f39/f3+AgICAgICAgICAgH9/f39/f39/f39/gICAgICAgICA - f39/f39/f3+AgICAgICAgH9/f39/f3+AgICAf39/f4CAgICAgIB/f39/f39/f4CAgICAgICAgIB/f39/ - f39/gICAgICAgIB/f39/f39/gICAgICAgICAf39/f39/f39/f4CAgH9/gICAgH9/f4CAf39/f3+AgICA - gICAgIB/f39/f39/f4CAgICAgICAf39/f39/f3+AgICAgICAgICAgH9/f39/f39/f4CAgICAgICAgICA - f39/f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgIB/f4CAgH9/f39/f39/gICAgICAgH9/f39/ - f39/f39/gICAgICAgICAf39/f3+AgICAgICAgICAgH9/f39/f39/f4CAgICAgICAf39/f39/f39/f4CA - gICAgICAgIB/f39/f39/f3+AgICBgYGBgIB/f35+fn5/f4CAgIGBgYGAgICAf39/fn5+f39/gICAgYGB - gICAf39/f39/f39/gICAgICAgICAgH9/f39/f39/f4CAgICAgICAgH9/f39/f39/f4CAgICAgICAf39/ - f39/f39/f4CAgICAgICAgH9/f39/f39/f3+AgICAgICAgH9/f39/f39/f39/gICAgICAgIB/f39/f3+A - gICAgICAgIB/f39/f39/gICAgICAgIB/f39/f39/gICAgICAgH9/f39/f39/f39/gICAgICAgIB/f39/ - f39/f4CAgICAgICAgH9/f4CAgICAgIB/f39/f4CAgICAgICAgICAf39/f39/f3+AgICAgICAgH9/f39/ - f39/gICAgICAgICAgICAf39/f39/f39/gICAgICAgICAgIB/f39/f39/f4CAgICAgICAf39/f39/f3+A - gIB/f4CAgH9/f39/f39/f39/gICAgICAf39/f39/f39/gICAgICAgH9/f39/f39/gICAgICAgH9/f39/ - f39/gICAgICAgICAf39/f39/f39/gICAgICAgICAgICAf39/f39/f39/gICAgICAgICAgIB/f39/f39/ - f3+AgICAgICAgH9/f39/f39/f3+AgH9/f4CAgICAgH9/f39/f39/gICAgICAgH9/f39/f4CAgICAgICA - f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgICAgIB/f39/f39/gICAgICAgH9/f39/f3+AgIB/ - f39/f39/f3+AgICAgICAgH9/f39/f3+AgICAgICAgICAf39/f39/f39/gICAgICAgICAf39/f39/f39/ - f3+AgICAgICAgH9/f39/f39/f39/gICAgICAgICAf39/f39/f3+AgICAgICAgICAgH9/f39/f39/gICA - gICAgH9/f39/f39/gICAgICAgICAgIB/f39/f39/f4CAgICAgICAf39/f39/f39/f4CAgICAgICAgH9/ - f3+AgICAgH9/f39/f3+AgICAgICAgIB/f39/f3+AgICAgICAgIB/f39/gICAgH9/gIB/f39/gICAgICA - gICAgICAgIB/f39/f39/gICAgICAf39/f39/f4CAgH9/f39/f3+AgICAgICAgIB/f39/f39/gICAgICA - gICAf39/f39/f39/gICAgICAgICAgIB/f39/f39/f4CAgICAgICAf39/f39/f39/gICAgICAgICAf39/ - f39/f39/gICAgICAgICAf39/f39/f3+AgICAgICAgICAf39/f39/f39/f3+AgICAgICAgIB/f39/f39/ - gIB/f4CAgICAgICAgICAgH9/f39/gICAgH9/gICAgH+AgICAgICAf39/f39/f3+AgICAgICAf39/f39/ - f39/f4CAgICAgICAgH9/f39/f3+AgICAgIB/f39/f4CAgICAgH9/f4B/f39/f3+AgICAgICAf3+AgICA - gICAf39/f39/gICAgICAgIB/f39/f39/f4CAgICAgICAf39/f39/f4CAgICAgICAgH9/f39/f39/gICA - gICAgICAgICAgICAf39/f39/f4CAgICAgIB/f39/f39/f3+AgICAgICAgH9/f3+AgICAgICAgH9/f39/ - f39/f39/f3+AgICAgICAgICAf39/f39/f3+AgICAgICAgICAgIB/f39/f39/f4CAgICAgIB/f39/f39/ - f39/f4CAgICAgIB/f39/f4B/f39/f39/f39/f3+AgICAgICAgICAf39/f39/gICAgICAgICAgH9/f39/ - f39/f39/gICAgICAgIB/f39/f39/f3+AgICAgICAgH9/f39/f39/f4CAgICAgICAgIB/f39/f39/f39/ - gICAgICAgICAf39/f39/f39/gICAgICAgICAgICAf39/f39/f39/f4CAgICAgICAgH9/f39/f39/f3+A - gICAgICAgICAgIB/f39/f39/f3+AgIBMSVNUxAAAAElORk9JQ1JECwAAADE5OTQtMDItMDUAAElTQkpu - AAAAUEFSVElBTDpiaXJkLCBjcm93LCBjb21tb24gY3JvdywgY2FsbHM7IFRoZSBIb2xseXdvb2QgU291 - bmQgTGlicmFyeSwgQzE5OTQsIE5ldyBFZGVuIE11bHRpbWVkaWEsIDE4MDA3MzUtRURFTgBJU0ZULgAA - AFNvdW5kIEZvcmdlIDIuMDtTb25pYyBGb3VuZHJ5IFNvdW5kIEZvcmdlIDUuMAAL - - - - ..\images\tastudio\ts_h_piano_02_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_arrow_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_10_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Refresh.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_04_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_18_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Lightning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\monitor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_08_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\restart.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_15_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_11_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\BlueDown.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Previous.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_00_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_17_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\icon_marker.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\reboot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_09_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_arrow_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_17_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\GenesisControllerIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\icon_anchor_lag.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\GameController.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_10.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\watch.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\PCEngineController.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ppsspp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_08_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_19_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_00.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_08_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_14_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Debugger.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\noconnect_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_13_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\gambatte.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_10_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_08_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_12.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_12_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\BlueUp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_16_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_11_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_07.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_18_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\FindHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\whiteTriLeft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_16_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_01_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_11_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_12_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\PrintPreviewHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\undo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_07_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_08_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\whiteTriDown.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\atari_controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_13_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Pause.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\psx_dualshock.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_05.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_04.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_08_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_17_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\console32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\redo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_05.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_14_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_00_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\YellowDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\sms-icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_12.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\user_blue.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_06.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_16_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\CopyFolderHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_09.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_13.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ReadOnly.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_07.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\NES_Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_01_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_14_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\N64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\TruncateFromFile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_02_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\HomeBrew.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_13_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_15_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_09_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\genplus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\RetroQuestion.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\Lynx.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\BlankCursor.cur;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\images\tastudio\ts_v_piano_01_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_07_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_05_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\YellowUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Translation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\search.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_04_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\HotKeys.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_10.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Lua.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_12_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\OpenFile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_19_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_03_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_09_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_08.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Cross.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_13_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_15_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\GreenCheck.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Cheats.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_10_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_06_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Stop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Erase.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_06_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_07_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_00.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\LightOff.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_16_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_05_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_16_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_03_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\AutoSearch.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\snes9x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Unfreeze.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Recent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\gba-icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\YellowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\YellowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_11_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_14_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\TAStudio.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\C64Keyboard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_04_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\C64Joystick.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\MoveRight.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_17.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_15.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ScrollTo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_06.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\GENController.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\console16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_01_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_00_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\QuickNes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\AppleIIKeyboard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_14.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_19_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_04.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_06_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_12_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_09.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Bug.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\pencil.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\FastForward.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Hack.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_02_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_14_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\bsnes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_19_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Both.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\LightOn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Duplicate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\JumpTo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_06_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\LoadConfig.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\poke.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_12_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_07_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_05_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_18_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\TI83Calculator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\thumbsdown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_10_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\WarningHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_15.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_11_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_17_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\colecovisioncontroller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\alt_about_image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\SaturnController.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_02_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\InsertSeparator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_04_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SaveAs.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\SMSController.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tvIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_19_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\TI83_Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_01_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_17.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SaveConfig.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Shark.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_03_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\BackMore.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\pcb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_18_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_04_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_13_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_18_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\AVI.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\corphawk.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\user_blue_small.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_02.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\pcejin1.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_03.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NESControllerIcon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_00_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\connect_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\addWatch.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_05_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\AddEdit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_04_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_18.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Square.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\textdoc.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_19.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_03.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Forward.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Blank.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_10_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\cheat.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_15_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\CorpHawkSmall.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_14_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_arrow_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_18_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_06_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\icon_anchor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\HawkInLove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_00_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_arrow_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_07_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_01.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\TurboFastForward.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Freeze.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NewFile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_09_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\C64Symbol.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_05_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_08.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_05_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_v_piano_17_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\tastudio\ts_h_piano_02_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\CutHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\TruncateFromRW.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\GBA_Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\Help.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\whiteTriUp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ENE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ESE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NNE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NNW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\NW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SSE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SSW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\SW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\WNW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\WSW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\ControllerImages\NGPController.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\config\ControllerImages\ZXSpectrumKeyboards.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\MoveBottom.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\MoveTop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/Resources/MoveBottom.png b/BizHawk.Client.EmuHawk/Resources/MoveBottom.png deleted file mode 100644 index 7befbdd795..0000000000 Binary files a/BizHawk.Client.EmuHawk/Resources/MoveBottom.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/Resources/MoveTop.png b/BizHawk.Client.EmuHawk/Resources/MoveTop.png deleted file mode 100644 index 397032df28..0000000000 Binary files a/BizHawk.Client.EmuHawk/Resources/MoveTop.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/Resources/courier16px_0.png b/BizHawk.Client.EmuHawk/Resources/courier16px_0.png deleted file mode 100644 index c73de1e864..0000000000 Binary files a/BizHawk.Client.EmuHawk/Resources/courier16px_0.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/ScreenSaver.cs b/BizHawk.Client.EmuHawk/ScreenSaver.cs deleted file mode 100644 index d362b4b2c2..0000000000 --- a/BizHawk.Client.EmuHawk/ScreenSaver.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -using BizHawk.Client.Common; -using BizHawk.Common; - -namespace BizHawk.Client.EmuHawk -{ - // Derived from http://www.codeproject.com/KB/cs/ScreenSaverControl.aspx - public static class ScreenSaver - { - private interface PlatformSpecificScreenBlankInterface - { - Int32 Get(); - void Set(Int32 v); - } - private class WinScreenBlankInterface : PlatformSpecificScreenBlankInterface - { - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern bool SystemParametersInfo(int uAction, int uParam, ref int lpvParam, int flags); - public Int32 Get() - { - Int32 value = 0; - SystemParametersInfo(SPI_GETSCREENSAVERTIMEOUT, 0, ref value, 0); - return value; - } - public void Set(Int32 v) - { - int nullVar = 0; - SystemParametersInfo(SPI_SETSCREENSAVERTIMEOUT, v, ref nullVar, SPIF_SENDWININICHANGE); - } - } - private class MiscUnixScreenBlankInterface : PlatformSpecificScreenBlankInterface - { - public Int32 Get() - { - return 0; //TODO implement - } - public void Set(Int32 v) - { - //TODO implement - } - } - private static PlatformSpecificScreenBlankInterface screenBlankInterface = PlatformLinkedLibSingleton.RunningOnUnix - ? (PlatformSpecificScreenBlankInterface) new MiscUnixScreenBlankInterface() - : (PlatformSpecificScreenBlankInterface) new WinScreenBlankInterface(); - - private const int SPI_GETSCREENSAVERTIMEOUT = 14; - private const int SPI_SETSCREENSAVERTIMEOUT = 15; - private const int SPIF_SENDWININICHANGE = 2; - - public static void ResetTimerImmediate() - { - SetScreenSaverTimeout(GetScreenSaverTimeout()); - } - - private static int ctr; - public static void ResetTimerPeriodically() - { - ctr++; - if (ctr == 120) - { - SetScreenSaverTimeout(GetScreenSaverTimeout()); - ctr = 0; - } - } - - // Returns the screen saver timeout setting, in seconds - private static Int32 GetScreenSaverTimeout() - { - return screenBlankInterface.Get(); - } - - // Pass in the number of seconds to set the screen saver timeout value. - private static void SetScreenSaverTimeout(Int32 Value) - { - screenBlankInterface.Set(Value); - } - } -} diff --git a/BizHawk.Client.EmuHawk/Sound/Interfaces/ISoundOutput.cs b/BizHawk.Client.EmuHawk/Sound/Interfaces/ISoundOutput.cs deleted file mode 100644 index f6dce3be8d..0000000000 --- a/BizHawk.Client.EmuHawk/Sound/Interfaces/ISoundOutput.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace BizHawk.Client.EmuHawk -{ - public interface ISoundOutput : IDisposable - { - void StartSound(); - void StopSound(); - void ApplyVolumeSettings(double volume); - int MaxSamplesDeficit { get; } - int CalculateSamplesNeeded(); - void WriteSamples(short[] samples, int sampleCount); - } -} diff --git a/BizHawk.Client.EmuHawk/Sound/Sound.cs b/BizHawk.Client.EmuHawk/Sound/Sound.cs deleted file mode 100644 index 1edaaae699..0000000000 --- a/BizHawk.Client.EmuHawk/Sound/Sound.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Threading; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; -using BizHawk.Common; - -namespace BizHawk.Client.EmuHawk -{ - public class Sound : IDisposable - { - public const int SampleRate = 44100; - public const int BytesPerSample = 2; - public const int ChannelCount = 2; - public const int BlockAlign = BytesPerSample * ChannelCount; - - private bool _disposed; - private bool _unjamSoundThrottle; - - private readonly ISoundOutput _outputDevice; - private readonly SoundOutputProvider _outputProvider = new SoundOutputProvider(); // Buffer for Sync sources - private readonly BufferedAsync _bufferedAsync = new BufferedAsync(); // Buffer for Async sources - private IBufferedSoundProvider _bufferedProvider; // One of the preceding buffers, or null if no source is set - - public Sound(IntPtr mainWindowHandle) - { - if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.OpenAL) - _outputDevice = new OpenALSoundOutput(this); - if (!PlatformLinkedLibSingleton.RunningOnUnix) - { - if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound) - _outputDevice = new DirectSoundSoundOutput(this, mainWindowHandle); - if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.XAudio2) - _outputDevice = new XAudio2SoundOutput(this); - } - if (_outputDevice == null) - _outputDevice = new DummySoundOutput(this); - } - - public void Dispose() - { - if (_disposed) return; - - StopSound(); - - _outputDevice.Dispose(); - - _disposed = true; - } - - public bool IsStarted { get; private set; } - - public void StartSound() - { - if (_disposed) return; - if (!Global.Config.SoundEnabled) return; - if (IsStarted) return; - - _outputDevice.StartSound(); - - _outputProvider.MaxSamplesDeficit = _outputDevice.MaxSamplesDeficit; - - Global.SoundMaxBufferDeficitMs = (int)Math.Ceiling(SamplesToMilliseconds(_outputDevice.MaxSamplesDeficit)); - - IsStarted = true; - } - - public void StopSound() - { - if (!IsStarted) return; - - _outputDevice.StopSound(); - - if (_bufferedProvider != null) _bufferedProvider.DiscardSamples(); - - Global.SoundMaxBufferDeficitMs = 0; - - IsStarted = false; - } - - /// - /// Attaches a new input pin which will run either in sync or async mode depending - /// on its SyncMode property. Once attached, the sync mode must not change unless - /// the pin is re-attached. - /// - public void SetInputPin(ISoundProvider source) - { - if (_bufferedProvider != null) - { - _bufferedProvider.BaseSoundProvider = null; - _bufferedProvider.DiscardSamples(); - _bufferedProvider = null; - } - - if (source == null) return; - - if (source.SyncMode == SyncSoundMode.Sync) - { - _bufferedProvider = _outputProvider; - } - else if (source.SyncMode == SyncSoundMode.Async) - { - _bufferedAsync.RecalculateMagic(Global.Emulator.VsyncRate()); - _bufferedProvider = _bufferedAsync; - } - else throw new InvalidOperationException("Unsupported sync mode."); - - _bufferedProvider.BaseSoundProvider = source; - } - - public bool LogUnderruns { get; set; } - - internal void HandleInitializationOrUnderrun(bool isUnderrun, ref int samplesNeeded) - { - // Fill device buffer with silence but leave enough room for one frame - int samplesPerFrame = (int)Math.Round(SampleRate / (double)Global.Emulator.VsyncRate()); - int silenceSamples = Math.Max(samplesNeeded - samplesPerFrame, 0); - _outputDevice.WriteSamples(new short[silenceSamples * 2], silenceSamples); - samplesNeeded -= silenceSamples; - _unjamSoundThrottle = isUnderrun; - - if (isUnderrun) - { - if (LogUnderruns) Console.WriteLine("Sound underrun detected!"); - _outputProvider.OnVolatility(); - } - } - - public void UpdateSound(float atten) - { - if (!Global.Config.SoundEnabled || !IsStarted || _bufferedProvider == null || _disposed) - { - if (_bufferedProvider != null) _bufferedProvider.DiscardSamples(); - return; - } - - if (atten < 0) atten = 0; - if (atten > 1) atten = 1; - _outputDevice.ApplyVolumeSettings(atten); - - short[] samples; - int samplesNeeded = _outputDevice.CalculateSamplesNeeded(); - int samplesProvided; - - if (atten == 0) - { - samples = new short[samplesNeeded * ChannelCount]; - samplesProvided = samplesNeeded; - - _bufferedProvider.DiscardSamples(); - } - else if (_bufferedProvider == _outputProvider) - { - if (Global.Config.SoundThrottle) - { - _outputProvider.BaseSoundProvider.GetSamplesSync(out samples, out samplesProvided); - - if (Global.DisableSecondaryThrottling && samplesProvided > samplesNeeded) - { - return; - } - - while (samplesProvided > samplesNeeded) - { - Thread.Sleep((samplesProvided - samplesNeeded) / (SampleRate / 1000)); // Let the audio clock control sleep time - samplesNeeded = _outputDevice.CalculateSamplesNeeded(); - if (_unjamSoundThrottle) - { - //may be garbage, but what can we do? - samplesProvided = samplesNeeded; - break; - } - } - _unjamSoundThrottle = false; - } - else - { - if (Global.DisableSecondaryThrottling) // This indicates rewind or fast-forward - { - _outputProvider.OnVolatility(); - } - _outputProvider.GetSamples(samplesNeeded, out samples, out samplesProvided); - } - } - else if (_bufferedProvider == _bufferedAsync) - { - samples = new short[samplesNeeded * ChannelCount]; - - _bufferedAsync.GetSamplesAsync(samples); - - samplesProvided = samplesNeeded; - } - else - { - return; - } - - _outputDevice.WriteSamples(samples, samplesProvided); - } - - public static int MillisecondsToSamples(int milliseconds) - { - return milliseconds * SampleRate / 1000; - } - - public static double SamplesToMilliseconds(int samples) - { - return samples * 1000.0 / SampleRate; - } - } -} diff --git a/BizHawk.Client.EmuHawk/Sound/Utilities/SyncToAsyncProvider.cs b/BizHawk.Client.EmuHawk/Sound/Utilities/SyncToAsyncProvider.cs deleted file mode 100644 index a09c812c7f..0000000000 --- a/BizHawk.Client.EmuHawk/Sound/Utilities/SyncToAsyncProvider.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - public class SyncToAsyncProvider : ISoundProvider - { - private readonly SoundOutputProvider _outputProvider = new SoundOutputProvider(standaloneMode: true); - - public SyncToAsyncProvider(ISoundProvider baseProvider) - { - _outputProvider.BaseSoundProvider = baseProvider; - } - - public void DiscardSamples() - { - _outputProvider.DiscardSamples(); - } - - public bool CanProvideAsync - { - get { return true; } - } - - public SyncSoundMode SyncMode - { - get { return SyncSoundMode.Async; } - } - - public void SetSyncMode(SyncSoundMode mode) - { - if (mode != SyncSoundMode.Async) - { - throw new NotSupportedException("Sync mode is not supported."); - } - } - - public void GetSamplesSync(out short[] samples, out int nsamp) - { - throw new InvalidOperationException("Sync mode is not supported."); - } - - public void GetSamplesAsync(short[] samples) - { - _outputProvider.GetSamples(samples); - } - } -} diff --git a/BizHawk.Client.EmuHawk/Throttle.cs b/BizHawk.Client.EmuHawk/Throttle.cs deleted file mode 100644 index 5eb8fcba22..0000000000 --- a/BizHawk.Client.EmuHawk/Throttle.cs +++ /dev/null @@ -1,387 +0,0 @@ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading; - -using BizHawk.Client.Common; -using BizHawk.Common; - -//this throttle is nitsuja's fine-tuned techniques from desmume - -namespace BizHawk.Client.EmuHawk -{ - public class Throttle - { - int lastSkipRate; - int framesToSkip; - int framesSkipped; - public bool skipNextFrame; - - //if the emulator is paused then we dont need to behave as if unthrottled - public bool signal_paused; - public bool signal_frameAdvance; - public bool signal_unthrottle; - public bool signal_continuousFrameAdvancing; - public bool signal_overrideSecondaryThrottle; - - public void Step(bool allowSleep, int forceFrameSkip) - { - //TODO - figure out what allowSleep is supposed to be used for - //TODO - figure out what forceFrameSkip is supposed to be used for - - bool extraThrottle = false; - - //if we're paused, none of this should happen. just clean out our state and dont skip - //notably, if we're frame-advancing, we should be paused. - if (signal_paused && !signal_continuousFrameAdvancing) - { - //Console.WriteLine("THE THING: {0} {1}", signal_paused ,signal_continuousFrameAdvancing); - skipNextFrame = false; - framesSkipped = 0; - framesToSkip = 0; - - //keep from burning CPU - Thread.Sleep(10); - return; - } - - //heres some ideas for how to begin cleaning this up - ////at this point, its assumed that we're running. - ////this could be a free run, an unthrottled run, or a 'continuous frame advance' (aka continuous) run - ////free run: affected by frameskips and throttles - ////unthrottled run: affected by frameskips only - ////continuous run: affected by frameskips and throttles - ////so continuous and free are the same? - - //bool continuous_run = signal_continuousFrameAdvancing; - //bool unthrottled_run = signal_unthrottle; - //bool free_run = !continuous_run && !unthrottled_run; - - //bool do_throttle, do_skip; - //if (continuous_run || free_run) - // do_throttle = do_skip = true; - //else if (unthrottled_run) - // do_skip = true; - //else throw new InvalidOperationException(); - - int skipRate = (forceFrameSkip < 0) ? Global.Config.FrameSkip : forceFrameSkip; - int ffSkipRate = (forceFrameSkip < 0) ? 3 : forceFrameSkip; - - if (lastSkipRate != skipRate) - { - lastSkipRate = skipRate; - framesToSkip = 0; // otherwise switches to lower frameskip rates will lag behind - } - - if (!skipNextFrame || forceFrameSkip == 0 || (signal_continuousFrameAdvancing && !signal_unthrottle)) - { - framesSkipped = 0; - - if (signal_continuousFrameAdvancing) - { - //dont ever skip frames when continuous frame advancing. it's meant for precision work. - //but we DO need to throttle - if (Global.Config.ClockThrottle) - extraThrottle = true; - } - else - { - if (framesToSkip > 0) - skipNextFrame = true; - } - } - else - { - framesToSkip--; - - skipNextFrame = framesToSkip > 0; - - framesSkipped++; - } - - if (signal_unthrottle) - { - if (framesSkipped < ffSkipRate) - { - skipNextFrame = true; - framesToSkip = 1; - } - if (framesToSkip < 1) - framesToSkip += ffSkipRate; - } - else if ((extraThrottle || signal_paused || Global.Config.ClockThrottle || signal_overrideSecondaryThrottle) && allowSleep) - { - SpeedThrottle(signal_paused); - } - - if (Global.Config.AutoMinimizeSkipping && Global.Config.FrameSkip != 0) - { - if (!signal_continuousFrameAdvancing) - { - AutoFrameSkip_NextFrame(); - if (framesToSkip < 1) - framesToSkip += AutoFrameSkip_GetSkipAmount(0, skipRate); - } - } - else - { - if (framesToSkip < 1) - framesToSkip += skipRate; - } - } - - static ulong GetCurTime() - { - if (tmethod == 1) - return (ulong)Stopwatch.GetTimestamp(); - else - return (ulong)Environment.TickCount; - } - - private interface PlatformSpecificSysTimer - { - uint TimeBeginPeriod(uint ms); - } - private class WinSysTimer : PlatformSpecificSysTimer - { - [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")] - private static extern uint timeBeginPeriod(uint uMilliseconds); - public uint TimeBeginPeriod(uint ms) - { - return timeBeginPeriod(ms); - } - } - private class UnixMonoSysTimer : PlatformSpecificSysTimer - { - [DllImport("winmm.dll.so", EntryPoint = "timeBeginPeriod")] - private static extern uint timeBeginPeriod(uint uMilliseconds); - public uint TimeBeginPeriod(uint ms) - { - return timeBeginPeriod(ms); - } - } - static PlatformSpecificSysTimer sysTimer = PlatformLinkedLibSingleton.RunningOnUnix ? (PlatformSpecificSysTimer) new UnixMonoSysTimer() : (PlatformSpecificSysTimer) new WinSysTimer(); - static uint TimeBeginPeriod(uint ms) - { - return sysTimer.TimeBeginPeriod(ms); - } - - static readonly int tmethod; - static readonly ulong afsfreq; - static readonly ulong tfreq; - - static Throttle() - { - TimeBeginPeriod(1); - if (Stopwatch.IsHighResolution) - { - afsfreq = (ulong)Stopwatch.Frequency; - tmethod = 1; - } - else - { - afsfreq = 1000; - tmethod = 0; - } - Console.WriteLine("throttle method: {0}; resolution: {1}", tmethod, afsfreq); - tfreq = afsfreq * 65536; - } - - public void SetCoreFps(double desired_fps) - { - core_desiredfps = (ulong)(65536 * desired_fps); - int target_pct = pct; - pct = -1; - SetSpeedPercent(target_pct); - } - - int pct = -1; - public void SetSpeedPercent(int percent) - { - //Console.WriteLine("throttle set percent " + percent); - if (pct == percent) return; - pct = percent; - float fraction = percent / 100.0f; - desiredfps = (ulong)(core_desiredfps * fraction); - //Console.WriteLine("throttle set desiredfps " + desiredfps); - desiredspf = 65536.0f / desiredfps; - AutoFrameSkip_IgnorePreviousDelay(); - } - - ulong core_desiredfps; - ulong desiredfps; - float desiredspf; - - ulong ltime; - ulong beginticks, endticks, preThrottleEndticks; - float fSkipFrames; - float fSkipFramesError; - int lastSkip; - float lastError; - float integral; - - public void AutoFrameSkip_IgnorePreviousDelay() - { - beginticks = GetCurTime(); - - // this seems to be a stable way of allowing the skip frames to - // quickly adjust to a faster environment (e.g. after a loadstate) - // without causing oscillation or a sudden change in skip rate - fSkipFrames *= 0.5f; - } - - void AutoFrameSkip_BeforeThrottle() - { - preThrottleEndticks = GetCurTime(); - } - - void AutoFrameSkip_NextFrame() - { - endticks = GetCurTime(); - - // calculate time since last frame - ulong diffticks = Math.Max(endticks - beginticks, 1); - float diff = (float)diffticks / afsfreq; - - // calculate time since last frame not including throttle sleep time - if (preThrottleEndticks == 0) // if we didn't throttle, use the non-throttle time - preThrottleEndticks = endticks; - ulong diffticksUnthrottled = preThrottleEndticks - beginticks; - float diffUnthrottled = (float)diffticksUnthrottled / afsfreq; - - - float error = diffUnthrottled - desiredspf; - - - // reset way-out-of-range values - if (diff > 1) - diff = 1; - if (error > 1 || error < -1) - error = 0; - if (diffUnthrottled > 1) - diffUnthrottled = desiredspf; - - float derivative = (error - lastError) / diff; - lastError = error; - - integral = integral + (error * diff); - integral *= 0.99f; // since our integral isn't reliable, reduce it to 0 over time. - - // "PID controller" constants - // this stuff is probably being done all wrong, but these seem to work ok - const float Kp = 40.0f; - const float Ki = 0.55f; - const float Kd = 0.04f; - - float errorTerm = error * Kp; - float derivativeTerm = derivative * Kd; - float integralTerm = integral * Ki; - float adjustment = errorTerm + derivativeTerm + integralTerm; - - // apply the output adjustment - fSkipFrames += adjustment; - - // if we're running too slowly, prevent the throttle from kicking in - if (adjustment > 0 && fSkipFrames > 0) - ltime -= tfreq / desiredfps; - - preThrottleEndticks = 0; - beginticks = GetCurTime(); - } - - int AutoFrameSkip_GetSkipAmount(int min, int max) - { - int rv = (int)fSkipFrames; - fSkipFramesError += fSkipFrames - rv; - - // resolve accumulated fractional error - // where doing so doesn't push us out of range - while (fSkipFramesError >= 1.0f && rv <= lastSkip && rv < max) - { - fSkipFramesError -= 1.0f; - rv++; - } - while (fSkipFramesError <= -1.0f && rv >= lastSkip && rv > min) - { - fSkipFramesError += 1.0f; - rv--; - } - - // restrict skip amount to requested range - if (rv < min) - rv = min; - if (rv > max) - rv = max; - - // limit maximum error accumulation (it's mainly only for fractional components) - if (fSkipFramesError >= 4.0f) - fSkipFramesError = 4.0f; - if (fSkipFramesError <= -4.0f) - fSkipFramesError = -4.0f; - - // limit ongoing skipframes to requested range + 1 on each side - if (fSkipFrames < min - 1) - fSkipFrames = (float)min - 1; - if (fSkipFrames > max + 1) - fSkipFrames = (float)max + 1; - - // printf("%d", rv); - - lastSkip = rv; - return rv; - } - - void SpeedThrottle(bool paused) - { - AutoFrameSkip_BeforeThrottle(); - - ulong timePerFrame = tfreq / desiredfps; - - while (true) - { - if (signal_unthrottle) - return; - - ulong ttime = GetCurTime(); - ulong elapsedTime = ttime - ltime; - - if (elapsedTime >= timePerFrame) - { - int maxMissedFrames = (int)Math.Ceiling((Global.SoundMaxBufferDeficitMs / 1000.0) / ((double)timePerFrame / afsfreq)); - if (maxMissedFrames < 3) - maxMissedFrames = 3; - - if (elapsedTime > timePerFrame * (ulong)(1 + maxMissedFrames)) - ltime = ttime; - else - ltime += timePerFrame; - - return; - } - - int sleepTime = (int)((timePerFrame - elapsedTime) * 1000 / afsfreq); - if (sleepTime >= 2 || paused) - { -#if WINDOWS - // Assuming a timer period of 1 ms (i.e. TimeBeginPeriod(1)): The actual sleep time - // on Windows XP is generally within a half millisecond either way of the requested - // time. The actual sleep time on Windows 8 is generally between the requested time - // and up to a millisecond over. So we'll subtract 1 ms from the time to avoid - // sleeping longer than desired. - sleepTime -= 1; -#else - // The actual sleep time on OS X with Mono is generally between the request time - // and up to 25% over. So we'll scale the sleep time back to account for that. - sleepTime = sleepTime * 4 / 5; -#endif - - Thread.Sleep(Math.Max(sleepTime, 1)); - } - else if (sleepTime > 0) // spin for <1 millisecond waits - { - Thread.Yield(); // limit to other threads on the same CPU core for other short waits - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/ToolAttribute.cs b/BizHawk.Client.EmuHawk/ToolAttribute.cs deleted file mode 100644 index 721fa0cf48..0000000000 --- a/BizHawk.Client.EmuHawk/ToolAttribute.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BizHawk.Client.EmuHawk -{ - [AttributeUsage(AttributeTargets.Class)] - public class ToolAttribute : Attribute - { - public ToolAttribute(bool released, string[] supportedSystems, string[] unsupportedCores = null) - { - Released = released; - SupportedSystems = supportedSystems; - UnsupportedCores = unsupportedCores; - } - - public bool Released { get; private set; } - - public IEnumerable SupportedSystems { get; private set; } - - public IEnumerable UnsupportedCores { get; private set; } - } -} diff --git a/BizHawk.Client.EmuHawk/UIHelper.cs b/BizHawk.Client.EmuHawk/UIHelper.cs deleted file mode 100644 index 27fffa4448..0000000000 --- a/BizHawk.Client.EmuHawk/UIHelper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; - -namespace BizHawk.Client.Common -{ - public static class UIHelper - { - private static readonly AutoScaleMode _autoScaleMode = AutoScaleMode.Font; - private static readonly SizeF _autoScaleBaseSize = new SizeF(6F, 13F); - private static readonly SizeF _autoScaleCurrentSize = GetCurrentAutoScaleSize(_autoScaleMode); - - private static SizeF GetCurrentAutoScaleSize(AutoScaleMode autoScaleMode) - { - using (Form form = new Form()) - { - form.AutoScaleMode = autoScaleMode; - return form.CurrentAutoScaleDimensions; - } - } - - public static AutoScaleMode AutoScaleMode - { - get { return _autoScaleMode; } - } - - public static SizeF AutoScaleBaseSize - { - get { return _autoScaleBaseSize; } - } - - public static float AutoScaleFactorX - { - get { return _autoScaleCurrentSize.Width / _autoScaleBaseSize.Width; } - } - - public static float AutoScaleFactorY - { - get { return _autoScaleCurrentSize.Height / _autoScaleBaseSize.Height; } - } - - public static int ScaleX(int size) - { - return (int)Math.Round(size * AutoScaleFactorX); - } - - public static int ScaleY(int size) - { - return (int)Math.Round(size * AutoScaleFactorY); - } - - public static Point Scale(Point p) - { - return new Point(ScaleX(p.X), ScaleY(p.Y)); - } - - public static Size Scale(Size s) - { - return new Size(ScaleX(s.Width), ScaleY(s.Height)); - } - } -} diff --git a/BizHawk.Client.EmuHawk/UpdateChecker.cs b/BizHawk.Client.EmuHawk/UpdateChecker.cs deleted file mode 100644 index 2b114ee4b8..0000000000 --- a/BizHawk.Client.EmuHawk/UpdateChecker.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Threading; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public static class UpdateChecker - { - private static readonly string _latestVersionInfoURL = "http://tasvideos.org/SystemBizHawkReleaseManager.html"; - private static readonly TimeSpan _minimumCheckDuration = TimeSpan.FromHours(8); - - private static bool AutoCheckEnabled - { - get { return Global.Config.Update_AutoCheckEnabled; } - set { Global.Config.Update_AutoCheckEnabled = value; } - } - - private static DateTime? LastCheckTimeUTC - { - get { return Global.Config.Update_LastCheckTimeUTC; } - set { Global.Config.Update_LastCheckTimeUTC = value; } - } - - private static string LatestVersion - { - get { return Global.Config.Update_LatestVersion; } - set { Global.Config.Update_LatestVersion = value; } - } - - private static string IgnoreVersion - { - get { return Global.Config.Update_IgnoreVersion; } - set { Global.Config.Update_IgnoreVersion = value; } - } - - public static void BeginCheck(bool skipCheck = false) - { - if (skipCheck || String.IsNullOrEmpty(_latestVersionInfoURL) || !AutoCheckEnabled || LastCheckTimeUTC > DateTime.UtcNow - _minimumCheckDuration) - { - OnCheckComplete(); - return; - } - - ThreadPool.QueueUserWorkItem((s) => CheckInternal()); - } - - public static bool IsNewVersionAvailable - { - get - { - return AutoCheckEnabled && - LatestVersion != IgnoreVersion && - ParseVersion(VersionInfo.Mainversion) != 0 && // Avoid notifying if current version string is invalid - ParseVersion(LatestVersion) > ParseVersion(VersionInfo.Mainversion); - } - } - - public static void IgnoreNewVersion() - { - IgnoreVersion = LatestVersion; - } - - public static void ResetHistory() - { - LastCheckTimeUTC = null; - LatestVersion = ""; - IgnoreVersion = ""; - } - - private static void CheckInternal() - { - try - { - string latestVersionInfo = WebUtility.HtmlDecode(DownloadURLAsString(_latestVersionInfoURL)); - - LatestVersion = GetVersionNumberFromVersionInfo(latestVersionInfo); - } - catch - { - // Ignore errors, and fall through to set the last check time to avoid requesting too frequently from the web server - } - - LastCheckTimeUTC = DateTime.UtcNow; - - OnCheckComplete(); - } - - private static string DownloadURLAsString(string url) - { - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); - request.KeepAlive = false; - using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) - using (StreamReader responseStream = new StreamReader(response.GetResponseStream())) - { - return responseStream.ReadToEnd(); - } - } - - private static string GetVersionNumberFromVersionInfo(string info) - { - string versionNumber = GetTextFromTag(info, "VersionNumber"); - return (versionNumber != null && ParseVersion(versionNumber) != 0) ? versionNumber : ""; - } - - private static string GetTextFromTag(string info, string tagName) - { - string openTag = "[" + tagName + "]"; - string closeTag = "[/" + tagName + "]"; - int start = info.IndexOf(openTag, StringComparison.OrdinalIgnoreCase); - if (start == -1) return null; - start += openTag.Length; - int end = info.IndexOf(closeTag, start, StringComparison.OrdinalIgnoreCase); - if (end == -1) return null; - return info.Substring(start, end - start).Trim(); - } - - // Major version goes in the first 16 bits, and so on, up to 4 parts - private static ulong ParseVersion(string str) - { - string[] split = str.Split('.'); - if (split.Length > 4) return 0; - ulong version = 0; - for (int i = 0; i < split.Length; i++) - { - ushort versionPart; - if (!UInt16.TryParse(split[i], out versionPart)) return 0; - version |= (ulong)versionPart << (48 - (i * 16)); - } - return version; - } - - private static void OnCheckComplete() - { - CheckComplete?.Invoke(null, EventArgs.Empty); - } - - public static event EventHandler CheckComplete; - } -} diff --git a/BizHawk.Client.EmuHawk/Watch.cs b/BizHawk.Client.EmuHawk/Watch.cs deleted file mode 100644 index 789632b08e..0000000000 --- a/BizHawk.Client.EmuHawk/Watch.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - //Data structure for a watch item in the RAM Watch Dialog - public enum atype { BYTE, WORD, DWORD, SEPARATOR }; //TODO: more custom types too like 12.4 and 24.12 fixed point - public enum asigned { SIGNED, UNSIGNED, HEX }; - public class Watch - { - public Watch() - { - address = 0; - value = 0; - type = atype.BYTE; - signed = asigned.UNSIGNED; - bigendian = true; - notes = ""; - } - public Watch(int Address, int Value, atype Type, asigned Signed, bool BigEndian, string Notes) - { - address = Address; - value = Value; - type = Type; - signed = Signed; - bigendian = BigEndian; - notes = Notes; - } - public int address { get; set; } - public int value { get; set; } //Current value - public atype type { get; set; } //Address type (byte, word, dword, etc - public asigned signed { get; set; } //Signed/Unsigned? - public bool bigendian { get; set; } - public string notes { get; set; } //User notes - - public bool SetTypeByChar(char c) //b = byte, w = word, d = dword - { - switch (c) - { - case 'b': - type = atype.BYTE; - return true; - case 'w': - type = atype.WORD; - return true; - case 'd': - type = atype.DWORD; - return true; - case 'S': - type = atype.SEPARATOR; - return true; - default: - return false; - } - } - - public char GetTypeByChar() - { - switch (type) - { - case atype.BYTE: - return 'b'; - case atype.WORD: - return 'w'; - case atype.DWORD: - return 'd'; - case atype.SEPARATOR: - return 'S'; - default: - return 'b'; //Just in case - } - } - - public bool SetSignedByChar(char c) //s = signed, u = unsigned, h = hex - { - switch (c) - { - case 's': - signed = asigned.SIGNED; - return true; - case 'u': - signed = asigned.UNSIGNED; - return true; - case 'h': - signed = asigned.HEX; - return true; - default: - return false; - } - } - - public char GetSignedByChar() - { - switch (signed) - { - case asigned.SIGNED: - return 's'; - case asigned.UNSIGNED: - return 'u'; - case asigned.HEX: - return 'h'; - default: - return 's'; //Just in case - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/app.config b/BizHawk.Client.EmuHawk/app.config deleted file mode 100644 index d405098352..0000000000 --- a/BizHawk.Client.EmuHawk/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/BizHawk.Client.EmuHawk/config/A7800/A7800ControllerSettings.resx b/BizHawk.Client.EmuHawk/config/A7800/A7800ControllerSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/A7800/A7800ControllerSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - cP/Gb3D/oF9e/hMKCmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4QECynZmX7xnBx/sdwcf/HcHH/tG1t/h8REYMAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAx - MIzFc3T+xm9w/sdwcf7HcHH+vHR0/jAcHJkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ4OAYVSUtfIcnP/yXZ3/st5ef/LeHn/xoB//kQq - KrEAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAJxYWGrNvb/7Nfn//0oeI/tSNjf/UjI3/1ZOS/mE+PtQAAAAXAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAAARAAAALQAAADUAAAARAAAAAAAAAAAAAAAAQyYmUM6Ghv/Wj5D/3J2e/uCl - pf/fpKT/4KOi/qRycPkHBARlAAAABQAAAAAAAAAAAAAAAAAAAAAAAAADAQAAJh8REYBYNTXMhVJR8XxM - TO8gEhKeAAAAEAAAAAAAAAAAbUVEe9aPkP7doKD+5rKz/uu9vv7rvLz+6rKx/tqfnf5iNzfnCAQEcwAA - ACoAAAAbAAAAIQIBATorGBiQhFNT67Z3dv68fn3+wYSD/siKiP6aZmX2AQAAKQAAAAAAAAAAd05Ni9eT - lP/jq6z/7cLC/vXS0v/zz9D/8b69/uyxrv+samr/l15d+2tDQ+NkPz7bdkxL451nZve+gYD/yY2M/tWg - n//jtrT/46+t/uOmpP+mdHPwBQMDFAAAAAAAAAAAdkpJh9iUlf7Hl5f+tJeX/uzOzv7lyMj+57y6/vS6 - t/7HhoX+xYaE/saJh/7MkpD+0ZmY/tejov7mt7X+7cXD/vDFxP7vvLr+8Le0/u2zsf5PMzOMDQcHAQAA - AAAAAAAAYTg4X9OOj/9aUlL/YGJi/nh2dv+skJD/qo2M/vnAvf/dn53/4KKg/+Cnp/7vxsT/u8PM/sHI - 0P/1xsT/9sG+/ve+u//3vrv/87q3/ntVVLkkFhYIAAAAAAAAAAAAAAAAVC8wD6BkZOWjhIT/jo6O/n1+ - fv+eenv/xpGR/vi/vP/wtbL/mZPP/0Z2+v69nrr/gd/x/nfD2v/2vLr/9Lq3/vG2tP/lq6j/elJRrjQg - IAoAAAAAAAAAAAAAAAAAAAAAAAAAAGc7OyeOWVnGv4eH/r2Fhf7YlZb+1Y6P/uinpv74v7z+3ay3/seo - w/7srZ/+7LGv/qmyjv63qI7+5Kel/r2GhPZ1S0p1QCcmAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAd0pKOpReXtKxb3D/yXl6/sx5ev/ws7D/6q6s/+Ked/7npFb/2ZiP/ny7gP+OjW/9h1dWr2I7 - OiMAAAAAAAAAAAAAAAAAAAAAAAAAALSCggSqcXIbo2dnN61xcVS/h4eIzp2c2cKWle2OY2OGbz4+Y4xN - Tr6zaWn84Jyb/9aXlv7Ji4r/p25t9INTUqZlPDw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJg - YASjcnMorH9/a6h7e4yabm6Df1NTU3VKSgwAAAAAAAAAAAAAAABgNDQgcj8/bntHR4ZnPDxTVTExDQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////APx//wD4P/8A8D//AOA//wDgH/8A4B//AMAf - /wDAH8EAwA8AAMAAAADAAAAAwAAAAMAAAQDAAAMA4AAHAPgAHwAAAH8AAcH/AP///wD///8A////ACgA - AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQc - HA5LKSlUNBwcSAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsO - DgV/SkqHm1hY+X5HR90tGRkuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB4SEhCr2Zm7sZwcf+oYWL5UC8vUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACnl9fnMRwcf/IcXL/tmxs/mI8PGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAa0NCGbRsbdbMenv/zn5//8R9ff9ySkmCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA - AAkAAAAAAAAAAItYWDvFfn/y2ZWW/92fn//anJv/jWFgvwAAAB0AAAAAAAAAAAAAAAIzHBwiYjs7a3pM - S6pqQkKjLBoaMwAAAACeZ2dZ05KS/em0tP/vxMT/77u6/8CHhfpmPDyvRysqYlExMV1ySEiGnWdn07qB - gPzLkI//w4iG/HJLS3YAAAAAomloXsyRkf/DoKD/48bG/+jAv//hpKL/vX17/7h/fPu/iYj7z5qZ/+Gw - rv/rvLr/77q3/9ScmuR9U1I+AAAAAJZbWz2ndnbxdG9v/4yCgv+4lJP/77Wy/86erP+6nsH/tsXR/8PH - 0P/4wsD/9b26/+Cppu2peXdiAAAAAQAAAABYKCgHn2lqe6eCguSsgoL90pKS//Cxrv/TrcP/s5y+/8i3 - s/+quab/26mh/82UktSgbm1TBAAAAwAAAACud3cEvYGBC7N6ehyyfHtyt39+3bNub9vLgYH05qak/+Kg - g//OlH39jZR04Zd0aYmDT1EiAAAAAAAAAAAAAAAAr3t7D7aCgki5h4Z8uImJgah+fUltPz8ajU1ORq1s - bI6vdHOgm2RkaYxJUiZgCygCAAAAAAAAAAAAAAAAAAAAAGo9PQF9UVEHcEdHCTodHQIAAAAAAAAAAAAA - AAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AADh/wAAwf8AAMH/ - AACB/wAAgfkAAIDAAACAAAAAgAAAAIAAAACAAQAAAAcAAAAPAAAOfwAA//8AAA== - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.cs b/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.cs deleted file mode 100644 index d833f96787..0000000000 --- a/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Atari.A7800Hawk; - -namespace BizHawk.Client.EmuHawk -{ - public partial class A7800FilterSettings : Form - { - private A7800Hawk.A7800SyncSettings _syncSettings; - - public A7800FilterSettings() - { - InitializeComponent(); - } - - private void A7800FilterSettings_Load(object sender, EventArgs e) - { - _syncSettings = ((A7800Hawk)Global.Emulator).GetSyncSettings().Clone(); - - var possibleFilters = A7800Hawk.ValidFilterTypes.Select(t => t.Key); - - foreach (var val in possibleFilters) - { - Port1ComboBox.Items.Add(val); - } - - Port1ComboBox.SelectedItem = _syncSettings.Filter; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = _syncSettings.Filter != Port1ComboBox.SelectedItem.ToString(); - - if (changed) - { - _syncSettings.Filter = Port1ComboBox.SelectedItem.ToString(); - - GlobalWin.MainForm.PutCoreSyncSettings(_syncSettings); - } - - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Filter settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.resx b/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.resx deleted file mode 100644 index 91f294b89b..0000000000 --- a/BizHawk.Client.EmuHawk/config/A7800/A7800FilterSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXjU1h6NnZv/Fc3T/x3Bx/8dw - cf/HcHH/x3Bx/8dwcf/HcHH/w3Jz/6ZoZ/9ZMzPTAQAAPQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyFxccektK0b12 - dv/HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xXR0/69wb/9jOjneBwMDSQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABNKSlNlmBf9sh3d//HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xnd3/7Z4d/9sQUDnDgcHVQAA - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABkOjqKsXFw/8lyc//HcXL/yHJz/8l0df/JdXb/yXV2/8l1dv/JdHX/ynt7/7+B - f/94SknvFgsLZQAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACILCxB7TUzDwXd3/8lyc//KdXb/y3h5/8x7fP/NfX7/zX5+/819 - fv/NfH3/zoOC/8iJiP+GVVX3Hg8QegAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMiIi+SXl3oynp7/8t4ef/NfX7/z4GC/9GE - hf/Sh4j/04iJ/9KIiP/Rhof/04uK/8+RkP+XY2L9KxcXlwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABwAA - AA0AAAAPAAAACwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUvL1enbW37zn5+/85/ - gP/Rhob/1IuM/9aPkP/XkpP/2JOU/9iTlP/XkZH/15OT/9eZl/+rdHP/QSUlvAAAADwAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACQAA - ABgAAAAvAgEBSwcDA2EFAgJoAAAAWAAAADYAAAARAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGU8 - O4W5eXn/0IKD/9KIif/Wj5D/2ZWW/9ubm//dnp//3qCg/92foP/cnZ3/3Jyc/9+in//CiYf/Zj8/4wYC - AnAAAAAbAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AA4AAAAnCQQEUCISEoQ+IiKzVzEx1mU6OuZiOTnmRigo0hgNDZsAAABMAAAAEAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABnVJSK/HhIP/04eI/9aQkf/amJn/3qCh/+Gmp//jq6v/5Kyt/+OsrP/iqan/4aal/+ap - p//Umpj/nmxr/C8ZGboAAABXAAAAGAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAIAAAAOAQAALRkNDWY+IiKpZDo63YZRUfigZGP/sHBv/7V0c/+xcnH/oWZm/2k+PvEfEBCcAAAAMQAA - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.cs b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.cs deleted file mode 100644 index 1cd8a83fec..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AmstradCPCAudioSettings : Form - { - private AmstradCPC.AmstradCPCSettings _settings; - - public AmstradCPCAudioSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _settings = ((AmstradCPC)Global.Emulator).GetSettings().Clone(); - - // AY panning config - var panTypes = Enum.GetNames(typeof(AY38912.AYPanConfig)); - foreach (var val in panTypes) - { - panTypecomboBox1.Items.Add(val); - } - panTypecomboBox1.SelectedItem = _settings.AYPanConfig.ToString(); - - // tape volume - tapeVolumetrackBar.Value = _settings.TapeVolume; - - // ay volume - ayVolumetrackBar.Value = _settings.AYVolume; - - - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _settings.AYPanConfig.ToString() != panTypecomboBox1.SelectedItem.ToString() - || _settings.TapeVolume != tapeVolumetrackBar.Value - || _settings.AYVolume != ayVolumetrackBar.Value; - - if (changed) - { - _settings.AYPanConfig = (AY38912.AYPanConfig)Enum.Parse(typeof(AY38912.AYPanConfig), panTypecomboBox1.SelectedItem.ToString()); - - _settings.TapeVolume = tapeVolumetrackBar.Value; - _settings.AYVolume = ayVolumetrackBar.Value; - - GlobalWin.MainForm.PutCoreSettings(_settings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Misc settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.resx b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCAudioSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.cs b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.cs deleted file mode 100644 index 9d6c7405c7..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; -using System.Text; -using static BizHawk.Emulation.Cores.Computers.AmstradCPC.AmstradCPC; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AmstradCPCCoreEmulationSettings : Form - { - private AmstradCPC.AmstradCPCSyncSettings _syncSettings; - - public AmstradCPCCoreEmulationSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _syncSettings = ((AmstradCPC)Global.Emulator).GetSyncSettings().Clone(); - - // machine selection - var machineTypes = Enum.GetNames(typeof(MachineType)); - foreach (var val in machineTypes) - { - MachineSelectionComboBox.Items.Add(val); - } - MachineSelectionComboBox.SelectedItem = _syncSettings.MachineType.ToString(); - UpdateMachineNotes((MachineType)Enum.Parse(typeof(MachineType), MachineSelectionComboBox.SelectedItem.ToString())); - - // border selecton - var borderTypes = Enum.GetNames(typeof(AmstradCPC.BorderType)); - foreach (var val in borderTypes) - { - borderTypecomboBox1.Items.Add(val); - } - borderTypecomboBox1.SelectedItem = _syncSettings.BorderType.ToString(); - UpdateBorderNotes((AmstradCPC.BorderType)Enum.Parse(typeof(AmstradCPC.BorderType), borderTypecomboBox1.SelectedItem.ToString())); - - // deterministic emulation - determEmucheckBox1.Checked = _syncSettings.DeterministicEmulation; - - // autoload tape - autoLoadcheckBox1.Checked = _syncSettings.AutoStartStopTape; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _syncSettings.MachineType.ToString() != MachineSelectionComboBox.SelectedItem.ToString() - || _syncSettings.BorderType.ToString() != borderTypecomboBox1.SelectedItem.ToString() - || _syncSettings.DeterministicEmulation != determEmucheckBox1.Checked - || _syncSettings.AutoStartStopTape != autoLoadcheckBox1.Checked; - - if (changed) - { - _syncSettings.MachineType = (MachineType)Enum.Parse(typeof(MachineType), MachineSelectionComboBox.SelectedItem.ToString()); - _syncSettings.BorderType = (AmstradCPC.BorderType)Enum.Parse(typeof(AmstradCPC.BorderType), borderTypecomboBox1.SelectedItem.ToString()); - _syncSettings.DeterministicEmulation = determEmucheckBox1.Checked; - _syncSettings.AutoStartStopTape = autoLoadcheckBox1.Checked; - - GlobalWin.MainForm.PutCoreSyncSettings(_syncSettings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Core emulator settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - - private void MachineSelectionComboBox_SelectionChangeCommitted(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateMachineNotes((MachineType)Enum.Parse(typeof(MachineType), cb.SelectedItem.ToString())); - } - - private void UpdateMachineNotes(MachineType type) - { - textBoxMachineNotes.Text = CPCMachineMetaData.GetMetaString(type); - } - - private void borderTypecomboBox1_SelectedIndexChanged(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateBorderNotes((AmstradCPC.BorderType)Enum.Parse(typeof(AmstradCPC.BorderType), cb.SelectedItem.ToString())); - } - - private void UpdateBorderNotes(AmstradCPC.BorderType type) - { - switch (type) - { - case AmstradCPC.BorderType.Uniform: - lblBorderInfo.Text = "Attempts to equalise the border areas"; - break; - case AmstradCPC.BorderType.Uncropped: - lblBorderInfo.Text = "Pretty much the signal the gate array is generating (looks pants)"; - break; - - case AmstradCPC.BorderType.Widescreen: - lblBorderInfo.Text = "Top and bottom border removed so that the result is *almost* 16:9"; - break; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.resx b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCCoreEmulationSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAoIJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAACYXODs4BCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - KTNDQ0M7OAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALllbYmJZQBcAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYWNwcHBwWy8mAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFLanBwcHBwYz0eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABpqcHBwcHBwZVkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl11w - cHBwcHBwcGcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIXdwcHBwcHBwcGkSAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPXBwcHBwcHBwd2wYAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAACXbnBwdXB5dXl0eW4hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAid3R5eXl5eXl5q6wzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9eXV5 - i7CxsbGxsblLKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndYuwsbm8uby5vMFnHgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJt3q7G3vMHB1cLBwdWuEgAAAAAAAAAAAAAAAAAA - AAAAAAAeEhMSCiUAAAAAAAAAAEexsbm/1dXZ2dnZ1da5ZgwAAAAAAAAAAAAAAAAAAAAjEjNZaW5qXRMl - AAAAAAAAADW5s7/V2N7i4uLi3dzZrQQPAAAAAAAAAAAAAAAAHxhZbm5uaWltd6ASAAAAAAAAAEmzvMLZ - 3uP29/fw4uTkuUAWCy0AAAAAAAAAAB4YYXd3gG13vbm5vb8zAAAAAAAAAE6xwdXd4/b6+/r38OTl1Vlc - OAMIFAweFBQSM2mtrYB3vdXT0NXExNU1AAAAAAAAAE65wtXe8Pr7/Pz79+fn1WphZ25pXV1mbHetrXd3 - tdXT4vXw49nZ3NYgAAAAAAAAAEu3wdje9vv7/Pz79+fn34B3d2xtoHeud66uudXT4vD39/Dj49zk5G0A - AAAAAAAAAD2xwcwoH0/L/Pukyenp5K27u7m5uczM0Nve4vb3+vr56OPl5eXl1igAAAAAAAAAADWxwQgB - BQYNmveZK/Dp6cG/wcTV2eP3+vr6+/r6+ejm5ufn5+nkIgAAAAAAAAAAAJmruR4sjC2WLFCdDd3p6dXW - 1tXI3vn67pCO9Ojp6efo5+fm59wiAAAAAAAAAAAAAABLsZ0FmC0qKgHMRcjp6dzc1Y2KiO3RlfKTj+np - 5ubm5eXk1SIAAAAAAAAAAAAAAACdab/Lp5aWnEfV1cHm6ebk6pGSiabZ8fOU0uXl5eTk3NyuRQAAAAAA - AAAAAAAAAAAAn0ux0KFTaMHBv7nC6efp3Ovv7OTm3OPl3Nzc3NfW1U6fAAAAAAAAAAAAAAAAAAAAAABF - Wa25t7yxs7Gw5+fn5Obk18XG3NyBfHvD1cSgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAFUzarGwsHl5sefn - 39zEgoZ/hL19fnqirj2jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATj09ZXV0cLzn3NXChYeDub+1pbQ9 - VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0rXj+rpInTBDcHCz5NW/ucG5u7GAM1QAAAAAAAAAAAAAAAAA - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.cs b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.cs deleted file mode 100644 index 63dc150f70..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AmstradCPCNonSyncSettings : Form - { - private AmstradCPC.AmstradCPCSettings _settings; - - public AmstradCPCNonSyncSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _settings = ((AmstradCPC)Global.Emulator).GetSettings().Clone(); - - - - // OSD Message Verbosity - var osdTypes = Enum.GetNames(typeof(AmstradCPC.OSDVerbosity)); - foreach (var val in osdTypes) - { - osdMessageVerbositycomboBox1.Items.Add(val); - } - osdMessageVerbositycomboBox1.SelectedItem = _settings.OSDMessageVerbosity.ToString(); - UpdateOSDNotes((AmstradCPC.OSDVerbosity)Enum.Parse(typeof(AmstradCPC.OSDVerbosity), osdMessageVerbositycomboBox1.SelectedItem.ToString())); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _settings.OSDMessageVerbosity.ToString() != osdMessageVerbositycomboBox1.SelectedItem.ToString(); - - if (changed) - { - _settings.OSDMessageVerbosity = (AmstradCPC.OSDVerbosity)Enum.Parse(typeof(AmstradCPC.OSDVerbosity), osdMessageVerbositycomboBox1.SelectedItem.ToString()); - - GlobalWin.MainForm.PutCoreSettings(_settings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Misc settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - - private void UpdateOSDNotes(AmstradCPC.OSDVerbosity type) - { - switch (type) - { - case AmstradCPC.OSDVerbosity.Full: - lblOSDVerbinfo.Text = "Show all OSD messages"; - break; - case AmstradCPC.OSDVerbosity.Medium: - lblOSDVerbinfo.Text = "Only show machine/device generated messages"; - break; - case AmstradCPC.OSDVerbosity.None: - lblOSDVerbinfo.Text = "No core-driven OSD messages"; - break; - } - } - - private void OSDComboBox_SelectionChangeCommitted(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateOSDNotes((AmstradCPC.OSDVerbosity)Enum.Parse(typeof(AmstradCPC.OSDVerbosity), cb.SelectedItem.ToString())); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.resx b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCNonSyncSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.cs b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.cs deleted file mode 100644 index ba99cd60c5..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.AmstradCPC; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AmstradCPCPokeMemory : Form - { - private AmstradCPC.AmstradCPCSettings _settings; - - public AmstradCPCPokeMemory() - { - InitializeComponent(); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - var ams = (AmstradCPC)Global.Emulator; - var addr = (ushort)numericUpDownAddress.Value; - var val = (byte)numericUpDownByte.Value; - - ams.PokeMemory(addr, val); - - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("POKE memory aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.resx b/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/AmstradCPC/AmstradCPCPokeMemory.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AutofireConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/AutofireConfig.Designer.cs deleted file mode 100644 index 8b07aca2ed..0000000000 --- a/BizHawk.Client.EmuHawk/config/AutofireConfig.Designer.cs +++ /dev/null @@ -1,192 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class AutofireConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AutofireConfig)); - this.Ok = new System.Windows.Forms.Button(); - this.Cancel = new System.Windows.Forms.Button(); - this.OnNumeric = new System.Windows.Forms.NumericUpDown(); - this.OffNumeric = new System.Windows.Forms.NumericUpDown(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.LagFrameCheck = new System.Windows.Forms.CheckBox(); - ((System.ComponentModel.ISupportInitialize)(this.OnNumeric)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.OffNumeric)).BeginInit(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // Ok - // - this.Ok.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Ok.Location = new System.Drawing.Point(108, 140); - this.Ok.Name = "Ok"; - this.Ok.Size = new System.Drawing.Size(75, 23); - this.Ok.TabIndex = 5; - this.Ok.Text = "&OK"; - this.Ok.UseVisualStyleBackColor = true; - this.Ok.Click += new System.EventHandler(this.Ok_Click); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(189, 140); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 23); - this.Cancel.TabIndex = 7; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - this.Cancel.Click += new System.EventHandler(this.Cancel_Click); - // - // OnNumeric - // - this.OnNumeric.Location = new System.Drawing.Point(10, 32); - this.OnNumeric.Maximum = new decimal(new int[] { - 512, - 0, - 0, - 0}); - this.OnNumeric.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.OnNumeric.Name = "OnNumeric"; - this.OnNumeric.Size = new System.Drawing.Size(74, 20); - this.OnNumeric.TabIndex = 2; - this.OnNumeric.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - // - // OffNumeric - // - this.OffNumeric.Location = new System.Drawing.Point(101, 32); - this.OffNumeric.Maximum = new decimal(new int[] { - 512, - 0, - 0, - 0}); - this.OffNumeric.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.OffNumeric.Name = "OffNumeric"; - this.OffNumeric.Size = new System.Drawing.Size(74, 20); - this.OffNumeric.TabIndex = 3; - this.OffNumeric.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(10, 16); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(21, 13); - this.label1.TabIndex = 4; - this.label1.Text = "On"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(101, 16); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(21, 13); - this.label2.TabIndex = 5; - this.label2.Text = "Off"; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.OnNumeric); - this.groupBox1.Controls.Add(this.OffNumeric); - this.groupBox1.Location = new System.Drawing.Point(13, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(184, 70); - this.groupBox1.TabIndex = 6; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Autofire Pattern"; - // - // LagFrameCheck - // - this.LagFrameCheck.AutoSize = true; - this.LagFrameCheck.Location = new System.Drawing.Point(13, 100); - this.LagFrameCheck.Name = "LagFrameCheck"; - this.LagFrameCheck.Size = new System.Drawing.Size(164, 17); - this.LagFrameCheck.TabIndex = 8; - this.LagFrameCheck.Text = "Take lag frames into account"; - this.LagFrameCheck.UseVisualStyleBackColor = true; - // - // AutofireConfig - // - this.AcceptButton = this.Ok; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(276, 175); - this.Controls.Add(this.LagFrameCheck); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.Cancel); - this.Controls.Add(this.Ok); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(512, 512); - this.MinimumSize = new System.Drawing.Size(218, 179); - this.Name = "AutofireConfig"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Autofire Configuration"; - this.Load += new System.EventHandler(this.AutofireConfig_Load); - ((System.ComponentModel.ISupportInitialize)(this.OnNumeric)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.OffNumeric)).EndInit(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button Ok; - private System.Windows.Forms.Button Cancel; - private System.Windows.Forms.NumericUpDown OffNumeric; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.GroupBox groupBox1; - public System.Windows.Forms.NumericUpDown OnNumeric; - private System.Windows.Forms.CheckBox LagFrameCheck; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/AutofireConfig.cs b/BizHawk.Client.EmuHawk/config/AutofireConfig.cs deleted file mode 100644 index 7d23c15ead..0000000000 --- a/BizHawk.Client.EmuHawk/config/AutofireConfig.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AutofireConfig : Form - { - public AutofireConfig() - { - InitializeComponent(); - } - - private void AutofireConfig_Load(object sender, EventArgs e) - { - if (Global.Config.AutofireOn < OnNumeric.Minimum) - { - OnNumeric.Value = OnNumeric.Minimum; - } - else if (Global.Config.AutofireOn > OnNumeric.Maximum) - { - OnNumeric.Value = OnNumeric.Maximum; - } - else - { - OnNumeric.Value = Global.Config.AutofireOn; - } - - if (Global.Config.AutofireOff < OffNumeric.Minimum) - { - OffNumeric.Value = OffNumeric.Minimum; - } - else if (Global.Config.AutofireOff > OffNumeric.Maximum) - { - OffNumeric.Value = OffNumeric.Maximum; - } - else - { - OffNumeric.Value = Global.Config.AutofireOff; - } - - LagFrameCheck.Checked = Global.Config.AutofireLagFrames; - } - - private void Ok_Click(object sender, EventArgs e) - { - Global.AutoFireController.On = Global.Config.AutofireOn = (int)OnNumeric.Value; - Global.AutoFireController.Off = Global.Config.AutofireOff = (int)OffNumeric.Value; - Global.Config.AutofireLagFrames = LagFrameCheck.Checked; - Global.AutofireStickyXORAdapter.SetOnOffPatternFromConfig(); - - GlobalWin.OSD.AddMessage("Autofire settings saved"); - Close(); - } - - private void Cancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Autofire config aborted"); - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/AutofireConfig.resx b/BizHawk.Client.EmuHawk/config/AutofireConfig.resx deleted file mode 100644 index c238781912..0000000000 --- a/BizHawk.Client.EmuHawk/config/AutofireConfig.resx +++ /dev/null @@ -1,659 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAQAQEAAAAAAIAAoQgAARgAAADAwAAAAACAAqCUAAG5CAAAgIAAAAAAgAKgQAAAWaAAAEBAAAAAA - IABoBAAAvngAACgAAABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq4 - 7ykKue88Cr3wAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAKte4hCsHxtQrZ9nQKwPEKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArA8UYK1/bhCtD0nAqy7hsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsbyagrW - 9vYKw/HACrXuNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAql6ggKzPOSCtX2/wq88N0Kt+9YCrjvBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrPuFwrR9bgK0PX/Crnv8Aq474AKuO8QAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKvPAvCtX21grL - 8/8KuO/7CrjvqQq47yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAArC8VEK1vbtCsTy/wq37/8KuO/LCrjvQQq47wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJf+ICCsjzeArW9vkKv/D/Crjv/wq47+UKuO9nCrjvCAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqs7AwKzvSgCtT1/wq7 - 8P8KuO//Crjv9Qq4748KuO8WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAACrfvHgrS9cQKz/T/Crjv/wq47/8KuO/9Crjvtwq47y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKvvA7CtX24ArI8/8Kt+//Crjv/wq47/8KuO/WCrjvTgq4 - 7wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArE8l4K1/byCsLx/wq3 - 7/8KuO//Crjv/wq47+wKuO92CrjvDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKnOgFCsrzhwrW9v0KvfD/Crjv/wq47/8KuO//Crjv+Qq4758KuO8dAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqw7RIKz/SuCtL1/wq67/8KuO//Crjv/wq47/8KuO//Crjvwwq4 - 7zkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrrvKArU9c8KzPT/Crjv/wq4 - 7/8KuO//Crjv/wq47/8KuO/gCrjvXQq47wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKwPFHCtb25wrG8v8Kt+//Crjv/wq47/8KuO//Crjv/wq47/IKuO+FCrjvEQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACBnLAQrH8mwK1/b3CsDx/wq37/8KuO//Crjv/wq47/8KuO//Crjv+wq4 - 760KuO8nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKp+sJCsz0lQrV9v4Ku/D/Crjv/wq4 - 7/8KuO//Crjv/wq47/8KuO//Crjvzwq470UKtu4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0 - 7hkK0fW6CtD0/wq57/8KuO//Crjv/wq47/8Kue//Crnv/wq67/8Kuu/oCrvwbAq98AkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACrzwMgrV9dkKyvP/Crjv/wq67/8Ku/D/Cr3w/wq+8P8Jv/D/Cr/w/wm/ - 8fYJwPGVCcDxGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw/FUCtj27grH8v8JvvD/CcDx/wnC - 8f8Jw/H/CcTy/wnE8v8JxPL/CcTx/gnE8boJxPIxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACo/mAwrN - 9HsJ2/f6Ccjz/wnF8v8Jx/L/Ccny/wnK8/8JyvP/Ccrz/wnJ8/8JyPL/Ccjy2QnI8lMJyPIDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAJuO8NCdf2ownc9/8JzPP/Cczz/wnO8/8JzvT/Cc/0/wnP9P8JzvT/Cc3z/wnM - 8/8Jy/PuCcrzewnJ8w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnK8yEJ3vfHCd33/wjR9P8I0vT/CNP1/wjT - 9f8I0/X/CNP1/wjS9P8I0fT/CM/0/wnN8/oJy/OjCcrzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNX1Pgjk - +OUI3ff/CNb1/wjX9v8I2Pb/CNj2/wjX9v8I1vX/CNX1/wjT9f8I0fT/Cc70/wnM88cJy/M9CcPzAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAeE4gEI3PeQCOP4/wjb9v8I3Pb/CNz3/wjc9/8I2/b/CNr2/wjZ9v8I1/X/CNX1/wjS - 9P8Iz/T/Cczz4gnK82EJx/IGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNz3aAjf9/8H3/f/B+D3/wfg+P8H4Pf/B+D3/wfe - 9/8I3ff/CNv2/wjY9v8I1fX/CNL0/wjP9P8Jy/PzCcjyignF8hMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+D3AQfg95EH4fj/B+L4/wfk - +P8H5Pj/B+T4/wfj+P8H4vj/B+D3/wfe9/8I3Pb/CNn2/wjV9f8I0vT/Cc7z/wnJ8/wJxvKxCcLxKgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB972BQfh - +FgH4vjqB+T4/wfm+f8H5/n/B+j5/wfo+f8H5/n/B+b5/wfk+P8H4fj/B973/wjb9v8I2Pb/CNT1/wjQ - 9P8JzPP/Ccfy/wnC8dIJv/E8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAI2fYGCN33PAff96AH4vjwB+X4/wfn+f8H6fn/B+r6/wfr+v8H6/r/B+r6/wfp+f8H5vn/B+T4/wfh - +P8H3vf/CNr2/wjW9f8I0vT/Cc7z/wnJ8v8Jw/H/CcHxvArA8Q4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAjS9AUI1vU3CNr2nwjd9+0H4Pj/B+T4/wfn+f8H6vr/B+z6/wbt+v8G7vv/Bu76/wbt - +v8H6/r/B+n5/wfm+f8H4/j/B+D3/wjc9/8I2Pb/CNT1/wjP9P8JyvP/Cc70/wnU9dsKw/EbAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACcrzBQjO9DcI0vSZCNb16Qja9v8H3vf/B+L4/wfm+f8H6fn/B+z6/wbu - +v8G8Pv/BvH7/wbx+/8G7/v/Bu76/wfr+v8H6Pn/B+X4/wfh+P8I3ff/CNn2/wjV9f8I1fX/Cd33/wnj - +f0J1vaSCarsBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJv/EFCcTyNwnJ85kJzvTpCNL0/wjX9f8I2/b/B9/3/wfj - +P8H5/n/B+r6/wbt+v8G8Pv/BvL7/wbz/P8G8/z/BvH7/wbv+/8H7Pr/B+n5/wfm+f8H4vj/B973/wjc - 9/8I4vj/Cef5/gnh+NwJ0/V3CcHxEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq17gIKuu8xCb7wmAnD8uoJyfL/Cc7z/wjT - 9f8I1/b/CNz3/wfg9/8H5Pj/B+f5/wfr+v8G7vr/BvD7/wbz+/8G9Pz/BvT8/wby+/8G8Pv/Bu36/wfq - +v8H5vn/B+T4/wfm+f8I6/r/COf54wjb94cJzfMmCZvoAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKt+9dCrnv5Aq+ - 8P8Jw/H/Ccny/wnO9P8I0vX/CNf2/wjb9v8H3/f/B+P4/wfn+f8H6vr/Bu36/wbw+/8G8vv/BvT8/wbz - /P8G8vv/Bu/7/wft+v8H6vr/B+v6/wft+/8I6/rqCOP4lQjY9S4Iv/ACAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAK3/gWCsXy0Qq57/8KvfD/CcPx/wnI8v8JzfP/CNL0/wjW9f8I2/b/B9/3/wfi+P8H5vn/B+n5/wfs - +v8G7/v/BvH7/wby+/8G8vv/BvD7/wbu+/8H7vv/B/D7/wfu+/AH6PmjB+D3OQjQ9AQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACs70GQra99cKyvP/Cr3w/wnB8f8Jx/L/Cczz/wjR9P8I1fX/CNn2/wjd - 9/8H4fj/B+X4/wfo+f8H6vr/Bu36/wbu+/8G7/v/Bu/7/wbw+/8H8fv/B/D79Afs+q8H5/lEB933BwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmI5AIKxvJ/Ctn3+grR9f8JwfH/Ccby/wnL - 8/8I0PT/CNT1/wjY9v8I3Pf/B9/3/wfj+P8H5vn/B+j5/wfq+v8H7Pr/B+z6/wfu+v8H8fv+B+76wgfq - +VAH5PgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq3sDArA - 8YEK1/b0Ctf2/wnG8v8JyfL/Cc7z/wjS9P8I1vX/CNr2/wjd9/8H4Pf/B+P4/wfl+f8H5/n/B+j5/wfp - +f8H7fr/B+r6uQfo+RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAKqOsGCr/waQrW9uoK2/f/Ccvz/wnL8/8I0PT/CNT1/wjX9f8I2vb/CN33/wfg - 9/8H4vj/B+T4/wfl+f8H5vn/B+f58wfm+UYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqY6AIKv/BRCtT13Qnf+P8Jz/T/Cc3z/wjR - 9P8I1PX/CNf2/wja9v8I3ff/B9/3/wfg+P8H4fj/B+L4/wfi+NkH4vgaAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm/ - 8DwJ0/XNCeD4/wnT9f8JzfP/CNH0/wjU9f8I1/X/CNn2/wjb9v8I3Pf/CN33/wfe9/8I3ffdCN33HgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACb7wKQnQ9LkJ4fj+Cdb1/wnN8/8I0PT/CNP1/wjV9f8I1/X/CNj2/wjZ - 9v8I2vb/CNn2+AjZ9lUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJvfAbCc70ogng+PsJ2fb/Cc3z/wjP - 9P8I0fT/CNP1/wjU9f8I1fX/CNX1/wjV9f8I1PW5CNL1DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm7 - 7w8Jy/OKCd339gnb9/8JzPP/Cczz/wnO9P8Iz/T/CND0/wjR9P8I0fT/CND0+AjP9FkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACbbuCAnH8nEJ2vfuCd33/wnL8/8JyfP/Ccvz/wnM8/8JzPP/Cczz/wnL - 8/8JyvPACcjyEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJrOwDCcPyWQnW9uIK3ff/Ccrz/wnF - 8v8JxvL/Ccfy/wnG8v8JxvL/CcXy+gnD8WEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKvvBDCtH10wrd9/8JyfP/CcDx/wnB8f8JwfH/CcHx/wnA8f8JvvDHCrzwFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq57zAKy/PACtz3/wrK8/8Ku/D/Crzw/wq78P8Ku/D/Crrv+wq5 - 72kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrPuIArG8qoK2vf9Csvz/wq4 - 7/8KuO//Crjv/wq47/8KuO/NCrjvGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKr+0TCsPxkwrZ9vgKz/T/Crnv/wq47/8KuO//Crjv/Qq473IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqs7AoKv/F6Ctb28QrU9f8Ku/D/Crjv/wq47/8KuO/SCrjvHwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqXrBAq88GEK0/XnCtf2/wq+ - 8P8Kt+//Crjv/wq473kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKieUBCrnvSgrP9NgK2ff/CsHx/wq37/8KuO/ZCrjvJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKt+82Csvzxwrb9/8KxfL/Crfv/wq474EAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq07iQKyPOyCtr3/grJ - 8/8KuO/eCrfvKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAACrHtFwrE8psK2ff6Cs70/wq674sKlOcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKre0NCsHxgwrX9vYK1vbjCtD0LwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqn6wYKvfBqCtP17QrY - 9pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAACqPqAgq5704Ku/B9CrfvBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrDtAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////+P/////////4f/////////w//////////h/////////+B/////////8D/////////4H///////// - wH/////////AP////////+Af////////8A/////////4A/////////wB/////////AD////////+AH// - //////8AH////////4AP////////gAf////////AAf///////+AA////////8AB////////4AD////// - //gAD////////AAH///////+AAP///////8AAP///////wAAf///////gAA///////8AAB///////gAA - D//////4AAAH/////+AAAAf/////gAAAB/////4AAAAP////+AAAAB/////4AAAAf/////AAAAH///// - 8AAAB//////wAAAf//////gAAH///////AAA///////+AAD///////+AAP///////8AA////////4AB/ - ///////wAH////////gAP////////AA/////////AB////////+AH////////8AP////////4A////// - ///wB/////////gH/////////AP/////////A/////////+B/////////8D/////////4P/////////w - //////////h//////////v////////////8oAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrjvAQq47wgKuO8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrHtAgq7 - 8F4KzPRFCuH4AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAq98CsK0/W5Cs/0bAqm6wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyfNJCtL14wrB8ZQKs+4XAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICMIBCs30bgrP9PcKu/C5CrfvLwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq7tCQrR - 9ZYKyvP/Crjv2Aq471EKuO8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAq98BkK0vW8CsXy/wq37+0KuO95CrjvDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKxfIyCtL12grA8f8Kt+/6CrjvoQq47x4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsvzVArR9e8KvPD/Crjv/wq4 - 78UKuO87AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYrkAwrP - 9HwKzfT7Crnv/wq47/8KuO/hCrjvXwq47wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAq27g4K0fWkCsjz/wq47/8KuO//Crjv8wq474gKuO8SAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwPEhCtL1yArD8f8Kt+//Crjv/wq47/wKuO+vCrjvKAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsfyPgrS9eIKvvD/Crjv/wq4 - 7/8KuO//Crjv0Qq470gKuO8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArM - 9GIK0PT0Crvw/wq47/8KuO//Crjv/wq47+kKuO9uCrjvCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAqi6gYK0PSLCszz/Qq47/8KuO//Crjv/wq47/8KuO/4Crjvlwq47xkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKu/ATCtL1sQrG8v8KuO//Crjv/wq57/8Kuu//Crvv/gq8 - 8L0KvfAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsPxKgrT9dIKw/H/Crzw/wm/ - 8P8JwPH/CcHx/wnB8f8JwvHbCcPxVQnD8gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArM - 9EoK1vbqCcfy/wnF8v8JyPL/Ccny/wnJ8/8JyPL/Ccjy7wnI8n0JyPIOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAdg3AEJ1/ZxCdn2+AnN8/8JzvT/CM/0/wjQ9P8Iz/T/Cc70/wnM8/oJy/OmCcrzIQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq37xsKzfSjCtT1/ArA8f8KuO//Crjv/wq47+gKuO82AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKsO0QCsrziwrU9fYKwvH/Crfv/wq4 - 7/8KuO+cCrjvBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqfrCArH - 8nIK1PXuCsby/wq47/8KuO/sCrjvPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAqR5gMKw/JZCtT14wrK8/8Kue//CrjvpAq47wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsDxQwrS9dQKzfT/Crrv7wq370QAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq88DAK0PTBCtD0/wq9 - 8KwKrOwJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAKt+8gCs70rArU9fEK0fVMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACrLuEwrL85cK0fWiCrXuBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqx7QwKuO8zCrnvBgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4//////AAD/h/////8AAP/D - /////wAA/+H/////AAD/4P////8AAP/wP////wAA//gf////AAD//A////8AAP/+B////wAA//4B//// - AAD//wD///8AAP//gH///wAA///AH///AAD//+AP//8AAP//4Af//wAA///wA///AAD///gA//8AAP// - /AB//wAA///8AD//AAD///4AD/8AAP///wAH/wAA////AAP/AAD///8AAf8AAP///AAA/wAA///wAAD/ - AAD//8AAAP8AAP//AAAB/wAA//4AAAf/AAD//gAAH/8AAP/+AAB//wAA//8AAf//AAD//4AD//8AAP// - wAP//wAA///gA///AAD///AB//8AAP//+AD//wAA///+AP//AAD///8Af/8AAP///4B//wAA////wD// - AAD////gP/8AAP////Af/wAA/////B//AAD////+D/8AAP////8P/wAA/////4f/AAD/////x/8AAP// - /////wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAq57w4KwPEbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAACrXuDwrN9HgKz/Q/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsz0LgrO9LkKv/FkCq7tBgAAAAAAAAAAAAAAAAAA - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ColecoVision/ColecoControllerSettings.resx b/BizHawk.Client.EmuHawk/config/ColecoVision/ColecoControllerSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ColecoVision/ColecoControllerSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ControllerConfig.cs b/BizHawk.Client.EmuHawk/config/ControllerConfig.cs deleted file mode 100644 index 303f054169..0000000000 --- a/BizHawk.Client.EmuHawk/config/ControllerConfig.cs +++ /dev/null @@ -1,491 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ControllerConfig : Form - { - private const int MaxPlayers = 12; - private static readonly Dictionary ControllerImages = new Dictionary(); - private readonly ControllerDefinition _theDefinition; - - static ControllerConfig() - { - ControllerImages.Add("NES Controller", Properties.Resources.NES_Controller); - ControllerImages.Add("SNES Controller", Properties.Resources.SNES_Controller); - ControllerImages.Add("Nintento 64 Controller", Properties.Resources.N64); - ControllerImages.Add("Gameboy Controller", Properties.Resources.GBController); - ControllerImages.Add("Gameboy Controller H", Properties.Resources.GBController); - ControllerImages.Add("Gameboy Controller + Tilt", Properties.Resources.GBController); - ControllerImages.Add("GBA Controller", Properties.Resources.GBA_Controller); - ControllerImages.Add("Dual Gameboy Controller", Properties.Resources.GBController); - - ControllerImages.Add("SMS Controller", Properties.Resources.SMSController); - ControllerImages.Add("GPGX Genesis Controller", Properties.Resources.GENController); - ControllerImages.Add("Saturn Controller", Properties.Resources.SaturnController); - - ControllerImages.Add("Intellivision Controller", Properties.Resources.IntVController); - ControllerImages.Add("ColecoVision Basic Controller", Properties.Resources.colecovisioncontroller); - ControllerImages.Add("Atari 2600 Basic Controller", Properties.Resources.atari_controller); - ControllerImages.Add("Atari 7800 ProLine Joystick Controller", Properties.Resources.A78Joystick); - - ControllerImages.Add("PC Engine Controller", Properties.Resources.PCEngineController); - ControllerImages.Add("Commodore 64 Controller", Properties.Resources.C64Joystick); - ControllerImages.Add("TI83 Controller", Properties.Resources.TI83_Controller); - - ControllerImages.Add("WonderSwan Controller", Properties.Resources.WonderSwanColor); - ControllerImages.Add("Lynx Controller", Properties.Resources.Lynx); - ControllerImages.Add("PSX Gamepad Controller", Properties.Resources.PSX_Original_Controller); - ControllerImages.Add("PSX DualShock Controller", Properties.Resources.psx_dualshock); - ControllerImages.Add("Apple IIe Keyboard", Properties.Resources.AppleIIKeyboard); - ControllerImages.Add("VirtualBoy Controller", Properties.Resources.VBoyController); - ControllerImages.Add("NeoGeo Portable Controller", Properties.Resources.NGPController); - - } - - protected override void OnActivated(EventArgs e) - { - base.OnActivated(e); - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, true); - } - - protected override void OnDeactivate(EventArgs e) - { - base.OnDeactivate(e); - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, false); - } - - private ControllerConfig() - { - InitializeComponent(); - Closing += (o, e) => - { - buttonOK.Focus(); // A very dirty hack to avoid https://code.google.com/p/bizhawk/issues/detail?id=161 - }; - } - - private delegate Control PanelCreator(Dictionary settings, List buttons, Size size); - - private Control CreateNormalPanel(Dictionary settings, List buttons, Size size) - { - var cp = new ControllerConfigPanel { Dock = DockStyle.Fill, AutoScroll = true, Tooltip = toolTip1 }; - cp.LoadSettings(settings, checkBoxAutoTab.Checked, buttons, size.Width, size.Height); - return cp; - } - - private static Control CreateAnalogPanel(Dictionary settings, List buttons, Size size) - { - return new AnalogBindPanel(settings, buttons) { Dock = DockStyle.Fill, AutoScroll = true }; - } - - private static void LoadToPanel(Control dest, string controllerName, IList controllerButtons, Dictionary categoryLabels, IDictionary> settingsblock, T defaultvalue, PanelCreator createpanel) - { - Dictionary settings; - if (!settingsblock.TryGetValue(controllerName, out settings)) - { - settings = new Dictionary(); - settingsblock[controllerName] = settings; - } - - // check to make sure that the settings object has all of the appropriate boolbuttons - foreach (var button in controllerButtons) - { - if (!settings.Keys.Contains(button)) - { - settings[button] = defaultvalue; - } - } - - if (controllerButtons.Count == 0) - { - return; - } - - // split the list of all settings into buckets by player number - var buckets = new List[MaxPlayers + 1]; - var categoryBuckets = new WorkingDictionary>(); - for (var i = 0; i < buckets.Length; i++) - { - buckets[i] = new List(); - } - - // by iterating through only the controller's active buttons, we're silently - // discarding anything that's not on the controller right now. due to the way - // saving works, those entries will still be preserved in the config file, tho - foreach (var button in controllerButtons) - { - int i; - for (i = MaxPlayers; i > 0; i--) - { - if (button.StartsWith("P" + i)) - { - break; - } - } - - if (i > MaxPlayers) // couldn't find - { - i = 0; - } - - if (categoryLabels.ContainsKey(button)) - { - categoryBuckets[categoryLabels[button]].Add(button); - } - else - { - buckets[i].Add(button); - } - } - - if (buckets[0].Count == controllerButtons.Count) - { - // everything went into bucket 0, so make no tabs at all - dest.Controls.Add(createpanel(settings, controllerButtons.ToList(), dest.Size)); - } - else - { - // create multiple player tabs - var tt = new TabControl { Dock = DockStyle.Fill }; - dest.Controls.Add(tt); - int pageidx = 0; - for (int i = 1; i <= MaxPlayers; i++) - { - if (buckets[i].Count > 0) - { - string tabname = Global.Emulator.SystemId == "WSWAN" ? i == 1 ? "Normal" : "Rotated" : "Player " + i; // hack - tt.TabPages.Add(tabname); - tt.TabPages[pageidx].Controls.Add(createpanel(settings, buckets[i], tt.Size)); - pageidx++; - } - } - - foreach (var cat in categoryBuckets) - { - string tabname = cat.Key; - tt.TabPages.Add(tabname); - tt.TabPages[pageidx].Controls.Add(createpanel(settings, cat.Value, tt.Size)); - - // zxhawk hack - it uses multiple categoryLabels - if (Global.Emulator.SystemId == "ZXSpectrum" || Global.Emulator.SystemId == "AmstradCPC") - pageidx++; - - } - - if (buckets[0].Count > 0) - { - // ZXHawk needs to skip this bit - if (Global.Emulator.SystemId == "ZXSpectrum" || Global.Emulator.SystemId == "AmstradCPC") - return; - - string tabname = (Global.Emulator.SystemId == "C64") ? "Keyboard" : "Console"; // hack - tt.TabPages.Add(tabname); - tt.TabPages[pageidx].Controls.Add(createpanel(settings, buckets[0], tt.Size)); - } - } - } - - public ControllerConfig(ControllerDefinition def) - : this() - { - _theDefinition = def; - SuspendLayout(); - LoadPanels(Global.Config); - - rbUDLRAllow.Checked = Global.Config.AllowUD_LR; - rbUDLRForbid.Checked = Global.Config.ForbidUD_LR; - rbUDLRPriority.Checked = !Global.Config.AllowUD_LR && !Global.Config.ForbidUD_LR; - checkBoxAutoTab.Checked = Global.Config.InputConfigAutoTab; - - SetControllerPicture(def.Name); - - var analog = tabControl1.TabPages[0]; - - ResumeLayout(); - } - - private void LoadPanels( - IDictionary> normal, - IDictionary> autofire, - IDictionary> analog) - { - LoadToPanel(NormalControlsTab, _theDefinition.Name, _theDefinition.BoolButtons, _theDefinition.CategoryLabels, normal, "", CreateNormalPanel); - LoadToPanel(AutofireControlsTab, _theDefinition.Name, _theDefinition.BoolButtons, _theDefinition.CategoryLabels, autofire, "", CreateNormalPanel); - LoadToPanel(AnalogControlsTab, _theDefinition.Name, _theDefinition.FloatControls, _theDefinition.CategoryLabels, analog, new Config.AnalogBind("", 1.0f, 0.1f), CreateAnalogPanel); - - if (AnalogControlsTab.Controls.Count == 0) - { - tabControl1.TabPages.Remove(AnalogControlsTab); - } - } - - private void LoadPanels(ControlDefaults cd) - { - LoadPanels(cd.AllTrollers, cd.AllTrollersAutoFire, cd.AllTrollersAnalog); - } - - private void LoadPanels(Config c) - { - LoadPanels(c.AllTrollers, c.AllTrollersAutoFire, c.AllTrollersAnalog); - } - - private void SetControllerPicture(string controlName) - { - Bitmap bmp; - if (!ControllerImages.TryGetValue(controlName, out bmp)) - { - bmp = Properties.Resources.Help; - } - - pictureBox1.Image = bmp; - pictureBox1.Size = bmp.Size; - tableLayoutPanel1.ColumnStyles[1].Width = bmp.Width; - - // Uberhack - if (controlName == "Commodore 64 Controller") - { - var pictureBox2 = new PictureBox - { - Image = Properties.Resources.C64Keyboard, - Size = Properties.Resources.C64Keyboard.Size - }; - tableLayoutPanel1.ColumnStyles[1].Width = Properties.Resources.C64Keyboard.Width; - pictureBox1.Height /= 2; - pictureBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - pictureBox1.Dock = DockStyle.Top; - pictureBox2.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + pictureBox1.Size.Height + 10); - tableLayoutPanel1.Controls.Add(pictureBox2, 1, 0); - - pictureBox2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - } - - if (controlName == "ZXSpectrum Controller") - { - pictureBox1.Image = Properties.Resources.ZXSpectrumKeyboards; - pictureBox1.Size = Properties.Resources.ZXSpectrumKeyboards.Size; - tableLayoutPanel1.ColumnStyles[1].Width = Properties.Resources.ZXSpectrumKeyboards.Width; - } - - if (controlName == "AmstradCPC Controller") - { - /* - pictureBox1.Image = Properties.Resources.ZXSpectrumKeyboards; - pictureBox1.Size = Properties.Resources.ZXSpectrumKeyboards.Size; - tableLayoutPanel1.ColumnStyles[1].Width = Properties.Resources.ZXSpectrumKeyboards.Width; - */ - } - } - - // lazy methods, but they're not called often and actually - // tracking all of the ControllerConfigPanels wouldn't be simpler - private static void SetAutoTab(Control c, bool value) - { - if (c is ControllerConfigPanel) - { - (c as ControllerConfigPanel).SetAutoTab(value); - } - else if (c is AnalogBindPanel) - { - // TODO - } - else if (c.HasChildren) - { - foreach (Control cc in c.Controls) - { - SetAutoTab(cc, value); - } - } - } - - private void Save() - { - ActOnControlCollection(NormalControlsTab, c => c.Save(Global.Config.AllTrollers[_theDefinition.Name])); - ActOnControlCollection(AutofireControlsTab, c => c.Save(Global.Config.AllTrollersAutoFire[_theDefinition.Name])); - ActOnControlCollection(AnalogControlsTab, c => c.Save(Global.Config.AllTrollersAnalog[_theDefinition.Name])); - } - - private void SaveToDefaults(ControlDefaults cd) - { - ActOnControlCollection(NormalControlsTab, c => c.Save(cd.AllTrollers[_theDefinition.Name])); - ActOnControlCollection(AutofireControlsTab, c => c.Save(cd.AllTrollersAutoFire[_theDefinition.Name])); - ActOnControlCollection(AnalogControlsTab, c => c.Save(cd.AllTrollersAnalog[_theDefinition.Name])); - } - - private static void ActOnControlCollection(Control c, Action proc) - where T : Control - { - if (c is T) - { - proc(c as T); - } - else if (c.HasChildren) - { - foreach (Control cc in c.Controls) - { - ActOnControlCollection(cc, proc); - } - } - } - - private void CheckBoxAutoTab_CheckedChanged(object sender, EventArgs e) - { - SetAutoTab(this, checkBoxAutoTab.Checked); - } - - private void ButtonOk_Click(object sender, EventArgs e) - { - Global.Config.AllowUD_LR = rbUDLRAllow.Checked; - Global.Config.ForbidUD_LR = rbUDLRForbid.Checked; - Global.Config.InputConfigAutoTab = checkBoxAutoTab.Checked; - - Save(); - - GlobalWin.OSD.AddMessage("Controller settings saved"); - DialogResult = DialogResult.OK; - Close(); - } - - private void ButtonCancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Controller config aborted"); - Close(); - } - - private void NewControllerConfig_Load(object sender, EventArgs e) - { - Text = _theDefinition.Name + " Configuration"; - } - - private static TabControl GetTabControl(IEnumerable controls) - { - if (controls != null) - { - return controls - .OfType() - .Select(c => c) - .FirstOrDefault(); - } - - return null; - } - - private void ButtonLoadDefaults_Click(object sender, EventArgs e) - { - tabControl1.SuspendLayout(); - - var wasTabbedMain = tabControl1.SelectedTab.Name; - var tb1 = GetTabControl(NormalControlsTab.Controls); - var tb2 = GetTabControl(AutofireControlsTab.Controls); - var tb3 = GetTabControl(AnalogControlsTab.Controls); - int? wasTabbedPage1 = null; - int? wasTabbedPage2 = null; - int? wasTabbedPage3 = null; - - if (tb1 != null && tb1.SelectedTab != null) { wasTabbedPage1 = tb1.SelectedIndex; } - if (tb2 != null && tb2.SelectedTab != null) { wasTabbedPage2 = tb2.SelectedIndex; } - if (tb3 != null && tb3.SelectedTab != null) { wasTabbedPage3 = tb3.SelectedIndex; } - - NormalControlsTab.Controls.Clear(); - AutofireControlsTab.Controls.Clear(); - AnalogControlsTab.Controls.Clear(); - - // load panels directly from the default config. - // this means that the changes are NOT committed. so "Cancel" works right and you - // still have to hit OK at the end. - var cd = ConfigService.Load(Config.ControlDefaultPath); - LoadPanels(cd); - - tabControl1.SelectTab(wasTabbedMain); - - if (wasTabbedPage1.HasValue) - { - var newTb1 = GetTabControl(NormalControlsTab.Controls); - if (newTb1 != null) - { - newTb1.SelectTab(wasTabbedPage1.Value); - } - } - - if (wasTabbedPage2.HasValue) - { - var newTb2 = GetTabControl(AutofireControlsTab.Controls); - if (newTb2 != null) - { - newTb2.SelectTab(wasTabbedPage2.Value); - } - } - - if (wasTabbedPage3.HasValue) - { - var newTb3 = GetTabControl(AnalogControlsTab.Controls); - if (newTb3 != null) - { - newTb3.SelectTab(wasTabbedPage3.Value); - } - } - - tabControl1.ResumeLayout(); - } - - private void ButtonSaveDefaults_Click(object sender, EventArgs e) - { - // this doesn't work anymore, as it stomps out any defaults for buttons that aren't currently active on the console - // there are various ways to fix it, each with its own semantic problems - var result = MessageBox.Show(this, "OK to overwrite defaults for current control scheme?", "Save Defaults", MessageBoxButtons.YesNo); - if (result == DialogResult.Yes) - { - var cd = ConfigService.Load(Config.ControlDefaultPath); - cd.AllTrollers[_theDefinition.Name] = new Dictionary(); - cd.AllTrollersAutoFire[_theDefinition.Name] = new Dictionary(); - cd.AllTrollersAnalog[_theDefinition.Name] = new Dictionary(); - - SaveToDefaults(cd); - - ConfigService.Save(Config.ControlDefaultPath, cd); - } - } - - private void ClearWidgetAndChildren(Control c) - { - if (c is InputCompositeWidget) - { - (c as InputCompositeWidget).Clear(); - } - - if (c is InputWidget) - { - (c as InputWidget).ClearAll(); - } - - if (c is AnalogBindControl) - { - (c as AnalogBindControl).Unbind_Click(null, null); - } - - if (c.Controls().Any()) - { - foreach (Control child in c.Controls()) - { - ClearWidgetAndChildren(child); - } - } - } - - private void ClearBtn_Click(object sender, EventArgs e) - { - foreach (var c in this.Controls()) - { - ClearWidgetAndChildren(c); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ControllerConfig.resx b/BizHawk.Client.EmuHawk/config/ControllerConfig.resx deleted file mode 100644 index 47c65361ff..0000000000 --- a/BizHawk.Client.EmuHawk/config/ControllerConfig.resx +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 172, 17 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindControl.cs b/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindControl.cs deleted file mode 100644 index 19de6e3bb8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindControl.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class AnalogBindControl : UserControl - { - private AnalogBindControl() - { - InitializeComponent(); - } - - public AnalogBindControl(string buttonName, Config.AnalogBind bind) - : this() - { - _bind = bind; - ButtonName = buttonName; - labelButtonName.Text = buttonName; - trackBarSensitivity.Value = (int)(bind.Mult * 10.0f); - trackBarDeadzone.Value = (int)(bind.Deadzone * 20.0f); - TrackBarSensitivity_ValueChanged(null, null); - TrackBarDeadzone_ValueChanged(null, null); - textBox1.Text = bind.Value; - } - - public string ButtonName { get; private set; } - public Config.AnalogBind Bind => _bind; - - private Config.AnalogBind _bind; - private bool _listening; - - private void Timer1_Tick(object sender, EventArgs e) - { - string bindval = Input.Instance.GetNextFloatEvent(); - if (bindval != null) - { - timer1.Stop(); - _listening = false; - _bind.Value = bindval; - textBox1.Text = Bind.Value; - buttonBind.Text = "Bind!"; - Input.Instance.StopListeningForFloatEvents(); - } - } - - private void ButtonBind_Click(object sender, EventArgs e) - { - if (_listening) - { - timer1.Stop(); - _listening = false; - buttonBind.Text = "Bind!"; - Input.Instance.StopListeningForFloatEvents(); - } - else - { - Input.Instance.StartListeningForFloatEvents(); - _listening = true; - buttonBind.Text = "Cancel!"; - timer1.Start(); - } - } - - private void TrackBarSensitivity_ValueChanged(object sender, EventArgs e) - { - _bind.Mult = trackBarSensitivity.Value / 10.0f; - labelSensitivity.Text = $"Sensitivity: {(Bind.Mult * 100)}" + "%"; - } - - private void TrackBarDeadzone_ValueChanged(object sender, EventArgs e) - { - _bind.Deadzone = trackBarDeadzone.Value / 20.0f; - labelDeadzone.Text = $"Deadzone: {(Bind.Deadzone * 100)}" + "%"; - } - - private void ButtonFlip_Click(object sender, EventArgs e) - { - trackBarSensitivity.Value *= -1; - } - - public void Unbind_Click(object sender, EventArgs e) - { - _bind.Value = ""; - textBox1.Text = ""; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindPanel.cs b/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindPanel.cs deleted file mode 100644 index b00f38adc7..0000000000 --- a/BizHawk.Client.EmuHawk/config/ControllerConfig/AnalogBindPanel.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; -using System.Windows.Forms; -using System.Drawing; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public class AnalogBindPanel : UserControl - { - private readonly Dictionary _realConfigObject; - - public AnalogBindPanel(Dictionary realConfigObject, List realConfigButtons = null) - { - _realConfigObject = realConfigObject; - LoadSettings(realConfigButtons ?? (IEnumerable)realConfigObject.Keys); - } - - private void LoadSettings(IEnumerable buttonList) - { - SuspendLayout(); - int x = 4; - int y = 4; - foreach (string buttonName in buttonList) - { - var ctrl = new AnalogBindControl(buttonName, _realConfigObject[buttonName]) - { - Location = new Point(x, y) - }; - - y += ctrl.Height + 4; - Controls.Add(ctrl); - } - - ResumeLayout(); - } - - /// - /// save to config - /// - /// if non-null, save to possibly different config object than originally initialized from - public void Save(Dictionary saveConfigObject = null) - { - var saveto = saveConfigObject ?? _realConfigObject; - foreach (Control c in Controls) - { - var abc = (AnalogBindControl)c; - saveto[abc.ButtonName] = abc.Bind; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/C64Joystick.png b/BizHawk.Client.EmuHawk/config/ControllerImages/C64Joystick.png deleted file mode 100644 index d5ce8bde37..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/C64Joystick.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/GBA_Controller.png b/BizHawk.Client.EmuHawk/config/ControllerImages/GBA_Controller.png deleted file mode 100644 index 9eee422dc5..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/GBA_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/IntVController.png b/BizHawk.Client.EmuHawk/config/ControllerImages/IntVController.png deleted file mode 100644 index 0a6fe8b09f..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/IntVController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/N64.png b/BizHawk.Client.EmuHawk/config/ControllerImages/N64.png deleted file mode 100644 index d4403059a9..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/N64.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/NES_Controller.png b/BizHawk.Client.EmuHawk/config/ControllerImages/NES_Controller.png deleted file mode 100644 index da59820a7d..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/NES_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/PSX-Original-Controller.png b/BizHawk.Client.EmuHawk/config/ControllerImages/PSX-Original-Controller.png deleted file mode 100644 index 6dd8398dae..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/PSX-Original-Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/SMSController.png b/BizHawk.Client.EmuHawk/config/ControllerImages/SMSController.png deleted file mode 100644 index 7ebf0fe021..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/SMSController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/WonderSwanColor.png b/BizHawk.Client.EmuHawk/config/ControllerImages/WonderSwanColor.png deleted file mode 100644 index e6ef63cd48..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/WonderSwanColor.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/ZXSpectrumKeyboards.png b/BizHawk.Client.EmuHawk/config/ControllerImages/ZXSpectrumKeyboards.png deleted file mode 100644 index 1af85ebea9..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/ZXSpectrumKeyboards.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/ControllerImages/psx_dualshock.png b/BizHawk.Client.EmuHawk/config/ControllerImages/psx_dualshock.png deleted file mode 100644 index 3ca47a305a..0000000000 Binary files a/BizHawk.Client.EmuHawk/config/ControllerImages/psx_dualshock.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/DisplayConfig.Designer.cs deleted file mode 100644 index 183b8f4ceb..0000000000 --- a/BizHawk.Client.EmuHawk/config/DisplayConfig.Designer.cs +++ /dev/null @@ -1,278 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class DisplayConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.button3 = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.listView2 = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); - this.button2 = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.panel3 = new System.Windows.Forms.Panel(); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.label2 = new System.Windows.Forms.Label(); - this.panel4 = new System.Windows.Forms.Panel(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); - this.tableLayoutPanel1.SuspendLayout(); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.panel3.SuspendLayout(); - this.panel4.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.Controls.Add(this.button3, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.panel2, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.panel3, 0, 0); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 2; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(557, 433); - this.tableLayoutPanel1.TabIndex = 1; - // - // button3 - // - this.button3.Location = new System.Drawing.Point(3, 407); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(75, 23); - this.button3.TabIndex = 4; - this.button3.Text = "Defaults"; - this.button3.UseVisualStyleBackColor = true; - // - // panel1 - // - this.panel1.Controls.Add(this.listView2); - this.panel1.Controls.Add(this.label1); - this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(330, 3); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(224, 398); - this.panel1.TabIndex = 7; - // - // listView2 - // - this.listView2.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4}); - this.listView2.Dock = System.Windows.Forms.DockStyle.Fill; - this.listView2.Location = new System.Drawing.Point(0, 13); - this.listView2.Name = "listView2"; - this.listView2.Size = new System.Drawing.Size(224, 385); - this.listView2.TabIndex = 5; - this.listView2.UseCompatibleStateImageBehavior = false; - this.listView2.View = System.Windows.Forms.View.Details; - // - // columnHeader4 - // - this.columnHeader4.Text = ""; - this.columnHeader4.Width = 101; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Dock = System.Windows.Forms.DockStyle.Top; - this.label1.Location = new System.Drawing.Point(0, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 13); - this.label1.TabIndex = 6; - this.label1.Text = "Library"; - // - // panel2 - // - this.panel2.AutoSize = true; - this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel2.Controls.Add(this.button2); - this.panel2.Controls.Add(this.button1); - this.panel2.Location = new System.Drawing.Point(327, 404); - this.panel2.Margin = new System.Windows.Forms.Padding(0); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(230, 29); - this.panel2.TabIndex = 8; - // - // button2 - // - this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button2.Location = new System.Drawing.Point(155, 3); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); - this.button2.TabIndex = 3; - this.button2.Text = "Cancel"; - this.button2.UseVisualStyleBackColor = true; - // - // button1 - // - this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(74, 3); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 2; - this.button1.Text = "OK"; - this.button1.UseVisualStyleBackColor = true; - // - // panel3 - // - this.panel3.Controls.Add(this.listView1); - this.panel3.Controls.Add(this.label2); - this.panel3.Controls.Add(this.panel4); - this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel3.Location = new System.Drawing.Point(3, 3); - this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(321, 398); - this.panel3.TabIndex = 9; - // - // listView1 - // - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3}); - this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.listView1.Location = new System.Drawing.Point(0, 13); - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(321, 285); - this.listView1.TabIndex = 9; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "Input"; - this.columnHeader1.Width = 75; - // - // columnHeader2 - // - this.columnHeader2.Text = "Output"; - this.columnHeader2.Width = 85; - // - // columnHeader3 - // - this.columnHeader3.Text = "Description"; - this.columnHeader3.Width = 88; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Dock = System.Windows.Forms.DockStyle.Top; - this.label2.Location = new System.Drawing.Point(0, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(172, 13); - this.label2.TabIndex = 7; - this.label2.Text = "Current Layers/Filters Configuration"; - // - // panel4 - // - this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.panel4.Controls.Add(this.groupBox1); - this.panel4.Dock = System.Windows.Forms.DockStyle.Bottom; - this.panel4.Location = new System.Drawing.Point(0, 298); - this.panel4.Name = "panel4"; - this.panel4.Size = new System.Drawing.Size(321, 100); - this.panel4.TabIndex = 4; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.checkBox1); - this.groupBox1.Location = new System.Drawing.Point(7, 3); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(200, 90); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Final Presentation:"; - // - // checkBox1 - // - this.checkBox1.AutoSize = true; - this.checkBox1.Location = new System.Drawing.Point(6, 19); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(85, 17); - this.checkBox1.TabIndex = 0; - this.checkBox1.Text = "Bilinear Filter"; - this.checkBox1.UseVisualStyleBackColor = true; - // - // DisplayConfig - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(557, 433); - this.Controls.Add(this.tableLayoutPanel1); - this.Name = "DisplayConfig"; - this.Text = "Display Configuration"; - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); - this.panel4.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.ListView listView2; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Button button2; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.ListView listView1; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.CheckBox checkBox1; - - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfig.cs b/BizHawk.Client.EmuHawk/config/DisplayConfig.cs deleted file mode 100644 index 4bed57539a..0000000000 --- a/BizHawk.Client.EmuHawk/config/DisplayConfig.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class DisplayConfig : Form - { - public DisplayConfig() - { - InitializeComponent(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs deleted file mode 100644 index 4e22222325..0000000000 --- a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs +++ /dev/null @@ -1,1013 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class DisplayConfigLite - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DisplayConfigLite)); - this.btnCancel = new System.Windows.Forms.Button(); - this.btnOk = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.lblScanlines = new System.Windows.Forms.Label(); - this.lblUserFilterName = new System.Windows.Forms.Label(); - this.btnSelectUserFilter = new System.Windows.Forms.Button(); - this.rbUser = new System.Windows.Forms.RadioButton(); - this.rbNone = new System.Windows.Forms.RadioButton(); - this.rbScanlines = new System.Windows.Forms.RadioButton(); - this.rbHq2x = new System.Windows.Forms.RadioButton(); - this.checkLetterbox = new System.Windows.Forms.CheckBox(); - this.checkPadInteger = new System.Windows.Forms.CheckBox(); - this.grpFinalFilter = new System.Windows.Forms.GroupBox(); - this.rbFinalFilterBicubic = new System.Windows.Forms.RadioButton(); - this.rbFinalFilterNone = new System.Windows.Forms.RadioButton(); - this.rbFinalFilterBilinear = new System.Windows.Forms.RadioButton(); - this.rbUseRaw = new System.Windows.Forms.RadioButton(); - this.rbUseSystem = new System.Windows.Forms.RadioButton(); - this.grpARSelection = new System.Windows.Forms.GroupBox(); - this.txtCustomARY = new System.Windows.Forms.TextBox(); - this.label12 = new System.Windows.Forms.Label(); - this.txtCustomARX = new System.Windows.Forms.TextBox(); - this.rbUseCustomRatio = new System.Windows.Forms.RadioButton(); - this.label4 = new System.Windows.Forms.Label(); - this.txtCustomARHeight = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtCustomARWidth = new System.Windows.Forms.TextBox(); - this.rbUseCustom = new System.Windows.Forms.RadioButton(); - this.label2 = new System.Windows.Forms.Label(); - this.checkSnowyNullEmulator = new System.Windows.Forms.CheckBox(); - this.rbOpenGL = new System.Windows.Forms.RadioButton(); - this.label5 = new System.Windows.Forms.Label(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tpAR = new System.Windows.Forms.TabPage(); - this.cbAutoPrescale = new System.Windows.Forms.CheckBox(); - this.label11 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.nudPrescale = new System.Windows.Forms.NumericUpDown(); - this.tpDispMethod = new System.Windows.Forms.TabPage(); - this.label6 = new System.Windows.Forms.Label(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.label13 = new System.Windows.Forms.Label(); - this.cbAlternateVsync = new System.Windows.Forms.CheckBox(); - this.label8 = new System.Windows.Forms.Label(); - this.rbD3D9 = new System.Windows.Forms.RadioButton(); - this.label7 = new System.Windows.Forms.Label(); - this.rbGDIPlus = new System.Windows.Forms.RadioButton(); - this.tpMisc = new System.Windows.Forms.TabPage(); - this.groupBox5 = new System.Windows.Forms.GroupBox(); - this.rbDisplayAbsoluteZero = new System.Windows.Forms.RadioButton(); - this.rbDisplayMinimal = new System.Windows.Forms.RadioButton(); - this.rbDisplayFull = new System.Windows.Forms.RadioButton(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.cbAllowDoubleclickFullscreen = new System.Windows.Forms.CheckBox(); - this.groupBox4 = new System.Windows.Forms.GroupBox(); - this.cbFSAutohideMouse = new System.Windows.Forms.CheckBox(); - this.label1 = new System.Windows.Forms.Label(); - this.cbFullscreenHacks = new System.Windows.Forms.CheckBox(); - this.cbStatusBarFullscreen = new System.Windows.Forms.CheckBox(); - this.cbMenuFullscreen = new System.Windows.Forms.CheckBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.lblFrameTypeWindowed = new System.Windows.Forms.Label(); - this.cbStatusBarWindowed = new System.Windows.Forms.CheckBox(); - this.label9 = new System.Windows.Forms.Label(); - this.cbMenuWindowed = new System.Windows.Forms.CheckBox(); - this.cbCaptionWindowed = new System.Windows.Forms.CheckBox(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.tbScanlineIntensity = new BizHawk.Client.EmuHawk.TransparentTrackBar(); - this.trackbarFrameSizeWindowed = new BizHawk.Client.EmuHawk.TransparentTrackBar(); - this.btnDefaults = new System.Windows.Forms.Button(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.groupBox1.SuspendLayout(); - this.grpFinalFilter.SuspendLayout(); - this.grpARSelection.SuspendLayout(); - this.tabControl1.SuspendLayout(); - this.tpAR.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPrescale)).BeginInit(); - this.tpDispMethod.SuspendLayout(); - this.groupBox3.SuspendLayout(); - this.tpMisc.SuspendLayout(); - this.groupBox5.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.groupBox4.SuspendLayout(); - this.groupBox2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbScanlineIntensity)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackbarFrameSizeWindowed)).BeginInit(); - this.SuspendLayout(); - // - // btnCancel - // - this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(473, 339); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 5; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - // - // btnOk - // - this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnOk.Location = new System.Drawing.Point(392, 339); - this.btnOk.Name = "btnOk"; - this.btnOk.Size = new System.Drawing.Size(75, 23); - this.btnOk.TabIndex = 4; - this.btnOk.Text = "OK"; - this.btnOk.UseVisualStyleBackColor = true; - this.btnOk.Click += new System.EventHandler(this.btnOk_Click); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.lblScanlines); - this.groupBox1.Controls.Add(this.lblUserFilterName); - this.groupBox1.Controls.Add(this.btnSelectUserFilter); - this.groupBox1.Controls.Add(this.rbUser); - this.groupBox1.Controls.Add(this.tbScanlineIntensity); - this.groupBox1.Controls.Add(this.rbNone); - this.groupBox1.Controls.Add(this.rbScanlines); - this.groupBox1.Controls.Add(this.rbHq2x); - this.groupBox1.Location = new System.Drawing.Point(6, 33); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(193, 132); - this.groupBox1.TabIndex = 7; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Scaling Filter"; - // - // lblScanlines - // - this.lblScanlines.AutoSize = true; - this.lblScanlines.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblScanlines.Location = new System.Drawing.Point(104, 39); - this.lblScanlines.Name = "lblScanlines"; - this.lblScanlines.Size = new System.Drawing.Size(15, 13); - this.lblScanlines.TabIndex = 11; - this.lblScanlines.Text = "%"; - // - // lblUserFilterName - // - this.lblUserFilterName.Location = new System.Drawing.Point(6, 114); - this.lblUserFilterName.Name = "lblUserFilterName"; - this.lblUserFilterName.Size = new System.Drawing.Size(161, 15); - this.lblUserFilterName.TabIndex = 10; - this.lblUserFilterName.Text = "Will contain user filter name"; - // - // btnSelectUserFilter - // - this.btnSelectUserFilter.Location = new System.Drawing.Point(83, 88); - this.btnSelectUserFilter.Name = "btnSelectUserFilter"; - this.btnSelectUserFilter.Size = new System.Drawing.Size(75, 23); - this.btnSelectUserFilter.TabIndex = 5; - this.btnSelectUserFilter.Text = "Select"; - this.btnSelectUserFilter.UseVisualStyleBackColor = true; - this.btnSelectUserFilter.Click += new System.EventHandler(this.btnSelectUserFilter_Click); - // - // rbUser - // - this.rbUser.AutoSize = true; - this.rbUser.Location = new System.Drawing.Point(6, 88); - this.rbUser.Name = "rbUser"; - this.rbUser.Size = new System.Drawing.Size(47, 17); - this.rbUser.TabIndex = 4; - this.rbUser.TabStop = true; - this.rbUser.Text = "User"; - this.rbUser.UseVisualStyleBackColor = true; - // - // rbNone - // - this.rbNone.AutoSize = true; - this.rbNone.Location = new System.Drawing.Point(6, 19); - this.rbNone.Name = "rbNone"; - this.rbNone.Size = new System.Drawing.Size(51, 17); - this.rbNone.TabIndex = 2; - this.rbNone.TabStop = true; - this.rbNone.Text = "None"; - this.rbNone.UseVisualStyleBackColor = true; - // - // rbScanlines - // - this.rbScanlines.AutoSize = true; - this.rbScanlines.Location = new System.Drawing.Point(6, 65); - this.rbScanlines.Name = "rbScanlines"; - this.rbScanlines.Size = new System.Drawing.Size(71, 17); - this.rbScanlines.TabIndex = 1; - this.rbScanlines.TabStop = true; - this.rbScanlines.Text = "Scanlines"; - this.rbScanlines.UseVisualStyleBackColor = true; - // - // rbHq2x - // - this.rbHq2x.AutoSize = true; - this.rbHq2x.Location = new System.Drawing.Point(6, 42); - this.rbHq2x.Name = "rbHq2x"; - this.rbHq2x.Size = new System.Drawing.Size(50, 17); - this.rbHq2x.TabIndex = 0; - this.rbHq2x.TabStop = true; - this.rbHq2x.Text = "Hq2x"; - this.rbHq2x.UseVisualStyleBackColor = true; - // - // checkLetterbox - // - this.checkLetterbox.AutoSize = true; - this.checkLetterbox.Location = new System.Drawing.Point(209, 12); - this.checkLetterbox.Name = "checkLetterbox"; - this.checkLetterbox.Size = new System.Drawing.Size(173, 17); - this.checkLetterbox.TabIndex = 8; - this.checkLetterbox.Text = "Maintain aspect ratio (letterbox)"; - this.checkLetterbox.UseVisualStyleBackColor = true; - this.checkLetterbox.CheckedChanged += new System.EventHandler(this.checkLetterbox_CheckedChanged); - // - // checkPadInteger - // - this.checkPadInteger.AutoSize = true; - this.checkPadInteger.Location = new System.Drawing.Point(218, 171); - this.checkPadInteger.Name = "checkPadInteger"; - this.checkPadInteger.Size = new System.Drawing.Size(250, 17); - this.checkPadInteger.TabIndex = 9; - this.checkPadInteger.Text = "Expand pixels by integers only (e.g. no 1.3333x)"; - this.checkPadInteger.UseVisualStyleBackColor = true; - this.checkPadInteger.CheckedChanged += new System.EventHandler(this.checkPadInteger_CheckedChanged); - // - // grpFinalFilter - // - this.grpFinalFilter.Controls.Add(this.rbFinalFilterBicubic); - this.grpFinalFilter.Controls.Add(this.rbFinalFilterNone); - this.grpFinalFilter.Controls.Add(this.rbFinalFilterBilinear); - this.grpFinalFilter.Location = new System.Drawing.Point(6, 194); - this.grpFinalFilter.Name = "grpFinalFilter"; - this.grpFinalFilter.Size = new System.Drawing.Size(187, 90); - this.grpFinalFilter.TabIndex = 8; - this.grpFinalFilter.TabStop = false; - this.grpFinalFilter.Text = "Final Filter"; - // - // rbFinalFilterBicubic - // - this.rbFinalFilterBicubic.AutoSize = true; - this.rbFinalFilterBicubic.Location = new System.Drawing.Point(6, 64); - this.rbFinalFilterBicubic.Name = "rbFinalFilterBicubic"; - this.rbFinalFilterBicubic.Size = new System.Drawing.Size(142, 17); - this.rbFinalFilterBicubic.TabIndex = 3; - this.rbFinalFilterBicubic.TabStop = true; - this.rbFinalFilterBicubic.Text = "Bicubic (shader. buggy?)"; - this.rbFinalFilterBicubic.UseVisualStyleBackColor = true; - // - // rbFinalFilterNone - // - this.rbFinalFilterNone.AutoSize = true; - this.rbFinalFilterNone.Location = new System.Drawing.Point(6, 18); - this.rbFinalFilterNone.Name = "rbFinalFilterNone"; - this.rbFinalFilterNone.Size = new System.Drawing.Size(51, 17); - this.rbFinalFilterNone.TabIndex = 2; - this.rbFinalFilterNone.TabStop = true; - this.rbFinalFilterNone.Text = "None"; - this.rbFinalFilterNone.UseVisualStyleBackColor = true; - // - // rbFinalFilterBilinear - // - this.rbFinalFilterBilinear.AutoSize = true; - this.rbFinalFilterBilinear.Location = new System.Drawing.Point(6, 41); - this.rbFinalFilterBilinear.Name = "rbFinalFilterBilinear"; - this.rbFinalFilterBilinear.Size = new System.Drawing.Size(59, 17); - this.rbFinalFilterBilinear.TabIndex = 0; - this.rbFinalFilterBilinear.TabStop = true; - this.rbFinalFilterBilinear.Text = "Bilinear"; - this.rbFinalFilterBilinear.UseVisualStyleBackColor = true; - // - // rbUseRaw - // - this.rbUseRaw.AutoSize = true; - this.rbUseRaw.Location = new System.Drawing.Point(6, 19); - this.rbUseRaw.Name = "rbUseRaw"; - this.rbUseRaw.Size = new System.Drawing.Size(240, 17); - this.rbUseRaw.TabIndex = 11; - this.rbUseRaw.TabStop = true; - this.rbUseRaw.Text = "Use 1:1 pixel size (for crispness or debugging)"; - this.rbUseRaw.UseVisualStyleBackColor = true; - this.rbUseRaw.CheckedChanged += new System.EventHandler(this.rbUseRaw_CheckedChanged); - // - // rbUseSystem - // - this.rbUseSystem.AutoSize = true; - this.rbUseSystem.Location = new System.Drawing.Point(16, 58); - this.rbUseSystem.Name = "rbUseSystem"; - this.rbUseSystem.Size = new System.Drawing.Size(167, 17); - this.rbUseSystem.TabIndex = 12; - this.rbUseSystem.TabStop = true; - this.rbUseSystem.Text = "Use system\'s recommendation"; - this.rbUseSystem.UseVisualStyleBackColor = true; - this.rbUseSystem.CheckedChanged += new System.EventHandler(this.rbUseSystem_CheckedChanged); - // - // grpARSelection - // - this.grpARSelection.Controls.Add(this.txtCustomARY); - this.grpARSelection.Controls.Add(this.label12); - this.grpARSelection.Controls.Add(this.txtCustomARX); - this.grpARSelection.Controls.Add(this.rbUseCustomRatio); - this.grpARSelection.Controls.Add(this.label4); - this.grpARSelection.Controls.Add(this.txtCustomARHeight); - this.grpARSelection.Controls.Add(this.label3); - this.grpARSelection.Controls.Add(this.txtCustomARWidth); - this.grpARSelection.Controls.Add(this.rbUseCustom); - this.grpARSelection.Controls.Add(this.rbUseRaw); - this.grpARSelection.Controls.Add(this.rbUseSystem); - this.grpARSelection.Location = new System.Drawing.Point(218, 35); - this.grpARSelection.Name = "grpARSelection"; - this.grpARSelection.Size = new System.Drawing.Size(302, 130); - this.grpARSelection.TabIndex = 13; - this.grpARSelection.TabStop = false; - this.grpARSelection.Text = "Aspect Ratio Selection"; - // - // txtCustomARY - // - this.txtCustomARY.Location = new System.Drawing.Point(220, 102); - this.txtCustomARY.Name = "txtCustomARY"; - this.txtCustomARY.Size = new System.Drawing.Size(72, 20); - this.txtCustomARY.TabIndex = 19; - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(202, 107); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(10, 13); - this.label12.TabIndex = 17; - this.label12.Text = ":"; - // - // txtCustomARX - // - this.txtCustomARX.Location = new System.Drawing.Point(124, 102); - this.txtCustomARX.Name = "txtCustomARX"; - this.txtCustomARX.Size = new System.Drawing.Size(72, 20); - this.txtCustomARX.TabIndex = 18; - // - // rbUseCustomRatio - // - this.rbUseCustomRatio.AutoSize = true; - this.rbUseCustomRatio.Location = new System.Drawing.Point(16, 103); - this.rbUseCustomRatio.Name = "rbUseCustomRatio"; - this.rbUseCustomRatio.Size = new System.Drawing.Size(102, 17); - this.rbUseCustomRatio.TabIndex = 16; - this.rbUseCustomRatio.TabStop = true; - this.rbUseCustomRatio.Text = "Use custom AR:"; - this.rbUseCustomRatio.UseVisualStyleBackColor = true; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(13, 41); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(257, 13); - this.label4.TabIndex = 12; - this.label4.Text = "Allow pixel distortion (e.g. 2x1 pixels, for better AR fit):"; - // - // txtCustomARHeight - // - this.txtCustomARHeight.Location = new System.Drawing.Point(220, 79); - this.txtCustomARHeight.Name = "txtCustomARHeight"; - this.txtCustomARHeight.Size = new System.Drawing.Size(72, 20); - this.txtCustomARHeight.TabIndex = 15; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(202, 84); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(12, 13); - this.label3.TabIndex = 12; - this.label3.Text = "x"; - // - // txtCustomARWidth - // - this.txtCustomARWidth.Location = new System.Drawing.Point(124, 79); - this.txtCustomARWidth.Name = "txtCustomARWidth"; - this.txtCustomARWidth.Size = new System.Drawing.Size(72, 20); - this.txtCustomARWidth.TabIndex = 14; - // - // rbUseCustom - // - this.rbUseCustom.AutoSize = true; - this.rbUseCustom.Location = new System.Drawing.Point(16, 80); - this.rbUseCustom.Name = "rbUseCustom"; - this.rbUseCustom.Size = new System.Drawing.Size(105, 17); - this.rbUseCustom.TabIndex = 13; - this.rbUseCustom.TabStop = true; - this.rbUseCustom.Text = "Use custom size:"; - this.rbUseCustom.UseVisualStyleBackColor = true; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(6, 128); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(398, 27); - this.label2.TabIndex = 17; - this.label2.Text = "Some people think the white noise is a great idea, and some people don\'t. Disabli" + - "ng this displays black instead."; - // - // checkSnowyNullEmulator - // - this.checkSnowyNullEmulator.AutoSize = true; - this.checkSnowyNullEmulator.Location = new System.Drawing.Point(6, 108); - this.checkSnowyNullEmulator.Name = "checkSnowyNullEmulator"; - this.checkSnowyNullEmulator.Size = new System.Drawing.Size(159, 17); - this.checkSnowyNullEmulator.TabIndex = 16; - this.checkSnowyNullEmulator.Text = "Enable Snowy Null Emulator"; - this.checkSnowyNullEmulator.UseVisualStyleBackColor = true; - // - // rbOpenGL - // - this.rbOpenGL.AutoSize = true; - this.rbOpenGL.Checked = true; - this.rbOpenGL.Location = new System.Drawing.Point(6, 103); - this.rbOpenGL.Name = "rbOpenGL"; - this.rbOpenGL.Size = new System.Drawing.Size(65, 17); - this.rbOpenGL.TabIndex = 3; - this.rbOpenGL.TabStop = true; - this.rbOpenGL.Text = "OpenGL"; - this.rbOpenGL.UseVisualStyleBackColor = true; - // - // label5 - // - this.label5.Location = new System.Drawing.Point(21, 123); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(359, 47); - this.label5.TabIndex = 16; - this.label5.Text = " • May malfunction on some systems.\r\n • May have increased performance for OpenGL" + - "-based emulation cores.\r\n • May have reduced performance on some systems.\r\n"; - // - // tabControl1 - // - this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tpAR); - this.tabControl1.Controls.Add(this.tpDispMethod); - this.tabControl1.Controls.Add(this.tpMisc); - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Location = new System.Drawing.Point(12, 12); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(536, 317); - this.tabControl1.TabIndex = 17; - // - // tpAR - // - this.tpAR.Controls.Add(this.btnDefaults); - this.tpAR.Controls.Add(this.cbAutoPrescale); - this.tpAR.Controls.Add(this.label11); - this.tpAR.Controls.Add(this.groupBox1); - this.tpAR.Controls.Add(this.label10); - this.tpAR.Controls.Add(this.checkLetterbox); - this.tpAR.Controls.Add(this.nudPrescale); - this.tpAR.Controls.Add(this.checkPadInteger); - this.tpAR.Controls.Add(this.grpARSelection); - this.tpAR.Controls.Add(this.grpFinalFilter); - this.tpAR.Location = new System.Drawing.Point(4, 22); - this.tpAR.Name = "tpAR"; - this.tpAR.Padding = new System.Windows.Forms.Padding(3); - this.tpAR.Size = new System.Drawing.Size(528, 291); - this.tpAR.TabIndex = 0; - this.tpAR.Text = "Scaling & Filtering"; - this.tpAR.UseVisualStyleBackColor = true; - // - // cbAutoPrescale - // - this.cbAutoPrescale.AutoSize = true; - this.cbAutoPrescale.Location = new System.Drawing.Point(6, 171); - this.cbAutoPrescale.Name = "cbAutoPrescale"; - this.cbAutoPrescale.Size = new System.Drawing.Size(92, 17); - this.cbAutoPrescale.TabIndex = 17; - this.cbAutoPrescale.Text = "Auto Prescale"; - this.cbAutoPrescale.UseVisualStyleBackColor = true; - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(140, 11); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(14, 13); - this.label11.TabIndex = 16; - this.label11.Text = "X"; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(7, 11); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(76, 13); - this.label10.TabIndex = 15; - this.label10.Text = "User Prescale:"; - // - // nudPrescale - // - this.nudPrescale.Location = new System.Drawing.Point(93, 7); - this.nudPrescale.Maximum = new decimal(new int[] { - 16, - 0, - 0, - 0}); - this.nudPrescale.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.nudPrescale.Name = "nudPrescale"; - this.nudPrescale.Size = new System.Drawing.Size(45, 20); - this.nudPrescale.TabIndex = 14; - this.nudPrescale.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - // - // tpDispMethod - // - this.tpDispMethod.Controls.Add(this.label6); - this.tpDispMethod.Controls.Add(this.groupBox3); - this.tpDispMethod.Location = new System.Drawing.Point(4, 22); - this.tpDispMethod.Name = "tpDispMethod"; - this.tpDispMethod.Size = new System.Drawing.Size(528, 291); - this.tpDispMethod.TabIndex = 2; - this.tpDispMethod.Text = "Display Method"; - this.tpDispMethod.UseVisualStyleBackColor = true; - // - // label6 - // - this.label6.Location = new System.Drawing.Point(3, 258); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(359, 23); - this.label6.TabIndex = 18; - this.label6.Text = "Changes require restart of program to take effect.\r\n"; - // - // groupBox3 - // - this.groupBox3.Controls.Add(this.label13); - this.groupBox3.Controls.Add(this.cbAlternateVsync); - this.groupBox3.Controls.Add(this.label8); - this.groupBox3.Controls.Add(this.rbD3D9); - this.groupBox3.Controls.Add(this.label7); - this.groupBox3.Controls.Add(this.rbGDIPlus); - this.groupBox3.Controls.Add(this.label5); - this.groupBox3.Controls.Add(this.rbOpenGL); - this.groupBox3.Location = new System.Drawing.Point(6, 5); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(415, 241); - this.groupBox3.TabIndex = 16; - this.groupBox3.TabStop = false; - // - // label13 - // - this.label13.Location = new System.Drawing.Point(45, 60); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(359, 43); - this.label13.TabIndex = 22; - this.label13.Text = resources.GetString("label13.Text"); - this.label13.Click += new System.EventHandler(this.label13_Click); - this.label13.DoubleClick += new System.EventHandler(this.label13_Click); - // - // cbAlternateVsync - // - this.cbAlternateVsync.AutoSize = true; - this.cbAlternateVsync.Location = new System.Drawing.Point(28, 60); - this.cbAlternateVsync.Name = "cbAlternateVsync"; - this.cbAlternateVsync.Size = new System.Drawing.Size(15, 14); - this.cbAlternateVsync.TabIndex = 21; - this.cbAlternateVsync.UseVisualStyleBackColor = true; - // - // label8 - // - this.label8.Location = new System.Drawing.Point(21, 30); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(359, 27); - this.label8.TabIndex = 20; - this.label8.Text = " • Best compatibility\r\n • May have trouble with OpenGL-based cores (N64)\r\n" + - ""; - // - // rbD3D9 - // - this.rbD3D9.AutoSize = true; - this.rbD3D9.Checked = true; - this.rbD3D9.Location = new System.Drawing.Point(6, 10); - this.rbD3D9.Name = "rbD3D9"; - this.rbD3D9.Size = new System.Drawing.Size(73, 17); - this.rbD3D9.TabIndex = 19; - this.rbD3D9.TabStop = true; - this.rbD3D9.Text = "Direct3D9"; - this.rbD3D9.UseVisualStyleBackColor = true; - // - // label7 - // - this.label7.Location = new System.Drawing.Point(21, 191); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(359, 47); - this.label7.TabIndex = 18; - this.label7.Text = " • Slow; Mainly for compatibility purposes\r\n • Missing many features\r\n • Works be" + - "tter over Remote Desktop, etc.\r\n"; - // - // rbGDIPlus - // - this.rbGDIPlus.AutoSize = true; - this.rbGDIPlus.Checked = true; - this.rbGDIPlus.Location = new System.Drawing.Point(6, 171); - this.rbGDIPlus.Name = "rbGDIPlus"; - this.rbGDIPlus.Size = new System.Drawing.Size(50, 17); - this.rbGDIPlus.TabIndex = 17; - this.rbGDIPlus.TabStop = true; - this.rbGDIPlus.Text = "GDI+"; - this.rbGDIPlus.UseVisualStyleBackColor = true; - // - // tpMisc - // - this.tpMisc.Controls.Add(this.groupBox5); - this.tpMisc.Controls.Add(this.label2); - this.tpMisc.Controls.Add(this.checkSnowyNullEmulator); - this.tpMisc.Location = new System.Drawing.Point(4, 22); - this.tpMisc.Name = "tpMisc"; - this.tpMisc.Size = new System.Drawing.Size(528, 291); - this.tpMisc.TabIndex = 3; - this.tpMisc.Text = "Misc"; - this.tpMisc.UseVisualStyleBackColor = true; - // - // groupBox5 - // - this.groupBox5.Controls.Add(this.rbDisplayAbsoluteZero); - this.groupBox5.Controls.Add(this.rbDisplayMinimal); - this.groupBox5.Controls.Add(this.rbDisplayFull); - this.groupBox5.Location = new System.Drawing.Point(6, 6); - this.groupBox5.Name = "groupBox5"; - this.groupBox5.Size = new System.Drawing.Size(371, 96); - this.groupBox5.TabIndex = 20; - this.groupBox5.TabStop = false; - this.groupBox5.Text = "Display Features (for speeding up replays)"; - // - // rbDisplayAbsoluteZero - // - this.rbDisplayAbsoluteZero.AutoSize = true; - this.rbDisplayAbsoluteZero.Location = new System.Drawing.Point(7, 66); - this.rbDisplayAbsoluteZero.Name = "rbDisplayAbsoluteZero"; - this.rbDisplayAbsoluteZero.Size = new System.Drawing.Size(174, 17); - this.rbDisplayAbsoluteZero.TabIndex = 2; - this.rbDisplayAbsoluteZero.TabStop = true; - this.rbDisplayAbsoluteZero.Text = "Absolute Zero - Display Nothing"; - this.rbDisplayAbsoluteZero.UseVisualStyleBackColor = true; - // - // rbDisplayMinimal - // - this.rbDisplayMinimal.AutoSize = true; - this.rbDisplayMinimal.Enabled = false; - this.rbDisplayMinimal.Location = new System.Drawing.Point(7, 43); - this.rbDisplayMinimal.Name = "rbDisplayMinimal"; - this.rbDisplayMinimal.Size = new System.Drawing.Size(185, 17); - this.rbDisplayMinimal.TabIndex = 1; - this.rbDisplayMinimal.TabStop = true; - this.rbDisplayMinimal.Text = "Minimal - Display HUD Only (TBD)"; - this.rbDisplayMinimal.UseVisualStyleBackColor = true; - // - // rbDisplayFull - // - this.rbDisplayFull.AutoSize = true; - this.rbDisplayFull.Location = new System.Drawing.Point(7, 20); - this.rbDisplayFull.Name = "rbDisplayFull"; - this.rbDisplayFull.Size = new System.Drawing.Size(137, 17); - this.rbDisplayFull.TabIndex = 0; - this.rbDisplayFull.TabStop = true; - this.rbDisplayFull.Text = "Full - Display Everything"; - this.rbDisplayFull.UseVisualStyleBackColor = true; - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.cbAllowDoubleclickFullscreen); - this.tabPage1.Controls.Add(this.groupBox4); - this.tabPage1.Controls.Add(this.groupBox2); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(528, 291); - this.tabPage1.TabIndex = 4; - this.tabPage1.Text = "Window"; - this.tabPage1.UseVisualStyleBackColor = true; - // - // cbAllowDoubleclickFullscreen - // - this.cbAllowDoubleclickFullscreen.AutoSize = true; - this.cbAllowDoubleclickFullscreen.Location = new System.Drawing.Point(12, 223); - this.cbAllowDoubleclickFullscreen.Name = "cbAllowDoubleclickFullscreen"; - this.cbAllowDoubleclickFullscreen.Size = new System.Drawing.Size(471, 17); - this.cbAllowDoubleclickFullscreen.TabIndex = 27; - this.cbAllowDoubleclickFullscreen.Text = "Allow Double-Click Fullscreen (hold shift to force fullscreen to toggle in case u" + - "sing zapper, etc.)"; - this.cbAllowDoubleclickFullscreen.UseVisualStyleBackColor = true; - // - // groupBox4 - // - this.groupBox4.Controls.Add(this.cbFSAutohideMouse); - this.groupBox4.Controls.Add(this.label1); - this.groupBox4.Controls.Add(this.cbFullscreenHacks); - this.groupBox4.Controls.Add(this.cbStatusBarFullscreen); - this.groupBox4.Controls.Add(this.cbMenuFullscreen); - this.groupBox4.Location = new System.Drawing.Point(143, 6); - this.groupBox4.Name = "groupBox4"; - this.groupBox4.Size = new System.Drawing.Size(266, 211); - this.groupBox4.TabIndex = 27; - this.groupBox4.TabStop = false; - this.groupBox4.Text = "Fullscreen"; - // - // cbFSAutohideMouse - // - this.cbFSAutohideMouse.AutoSize = true; - this.cbFSAutohideMouse.Location = new System.Drawing.Point(87, 19); - this.cbFSAutohideMouse.Name = "cbFSAutohideMouse"; - this.cbFSAutohideMouse.Size = new System.Drawing.Size(141, 17); - this.cbFSAutohideMouse.TabIndex = 28; - this.cbFSAutohideMouse.Text = "Auto-Hide Mouse Cursor"; - this.cbFSAutohideMouse.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.Location = new System.Drawing.Point(7, 88); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(240, 115); - this.label1.TabIndex = 27; - this.label1.Text = resources.GetString("label1.Text"); - // - // cbFullscreenHacks - // - this.cbFullscreenHacks.AutoSize = true; - this.cbFullscreenHacks.Location = new System.Drawing.Point(6, 65); - this.cbFullscreenHacks.Name = "cbFullscreenHacks"; - this.cbFullscreenHacks.Size = new System.Drawing.Size(191, 17); - this.cbFullscreenHacks.TabIndex = 26; - this.cbFullscreenHacks.Text = "Enable Windows Fullscreen Hacks"; - this.cbFullscreenHacks.UseVisualStyleBackColor = true; - // - // cbStatusBarFullscreen - // - this.cbStatusBarFullscreen.AutoSize = true; - this.cbStatusBarFullscreen.Location = new System.Drawing.Point(6, 19); - this.cbStatusBarFullscreen.Name = "cbStatusBarFullscreen"; - this.cbStatusBarFullscreen.Size = new System.Drawing.Size(75, 17); - this.cbStatusBarFullscreen.TabIndex = 23; - this.cbStatusBarFullscreen.Text = "Status Bar"; - this.cbStatusBarFullscreen.UseVisualStyleBackColor = true; - // - // cbMenuFullscreen - // - this.cbMenuFullscreen.AutoSize = true; - this.cbMenuFullscreen.Location = new System.Drawing.Point(6, 42); - this.cbMenuFullscreen.Name = "cbMenuFullscreen"; - this.cbMenuFullscreen.Size = new System.Drawing.Size(53, 17); - this.cbMenuFullscreen.TabIndex = 25; - this.cbMenuFullscreen.Text = "Menu"; - this.cbMenuFullscreen.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.lblFrameTypeWindowed); - this.groupBox2.Controls.Add(this.cbStatusBarWindowed); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.cbMenuWindowed); - this.groupBox2.Controls.Add(this.trackbarFrameSizeWindowed); - this.groupBox2.Controls.Add(this.cbCaptionWindowed); - this.groupBox2.Location = new System.Drawing.Point(6, 6); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(131, 211); - this.groupBox2.TabIndex = 26; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Windowed"; - // - // lblFrameTypeWindowed - // - this.lblFrameTypeWindowed.AutoSize = true; - this.lblFrameTypeWindowed.Location = new System.Drawing.Point(51, 17); - this.lblFrameTypeWindowed.Name = "lblFrameTypeWindowed"; - this.lblFrameTypeWindowed.Size = new System.Drawing.Size(62, 13); - this.lblFrameTypeWindowed.TabIndex = 26; - this.lblFrameTypeWindowed.Text = "(frame type)"; - // - // cbStatusBarWindowed - // - this.cbStatusBarWindowed.AutoSize = true; - this.cbStatusBarWindowed.Location = new System.Drawing.Point(9, 81); - this.cbStatusBarWindowed.Name = "cbStatusBarWindowed"; - this.cbStatusBarWindowed.Size = new System.Drawing.Size(75, 17); - this.cbStatusBarWindowed.TabIndex = 23; - this.cbStatusBarWindowed.Text = "Status Bar"; - this.cbStatusBarWindowed.UseVisualStyleBackColor = true; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(6, 17); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(39, 13); - this.label9.TabIndex = 22; - this.label9.Text = "Frame:"; - // - // cbMenuWindowed - // - this.cbMenuWindowed.AutoSize = true; - this.cbMenuWindowed.Location = new System.Drawing.Point(9, 127); - this.cbMenuWindowed.Name = "cbMenuWindowed"; - this.cbMenuWindowed.Size = new System.Drawing.Size(53, 17); - this.cbMenuWindowed.TabIndex = 25; - this.cbMenuWindowed.Text = "Menu"; - this.cbMenuWindowed.UseVisualStyleBackColor = true; - // - // cbCaptionWindowed - // - this.cbCaptionWindowed.AutoSize = true; - this.cbCaptionWindowed.Location = new System.Drawing.Point(9, 104); - this.cbCaptionWindowed.Name = "cbCaptionWindowed"; - this.cbCaptionWindowed.Size = new System.Drawing.Size(62, 17); - this.cbCaptionWindowed.TabIndex = 24; - this.cbCaptionWindowed.Text = "Caption"; - this.cbCaptionWindowed.UseVisualStyleBackColor = true; - // - // linkLabel1 - // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(12, 404); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(79, 13); - this.linkLabel1.TabIndex = 18; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "Documentation"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // tbScanlineIntensity - // - this.tbScanlineIntensity.LargeChange = 32; - this.tbScanlineIntensity.Location = new System.Drawing.Point(83, 55); - this.tbScanlineIntensity.Maximum = 256; - this.tbScanlineIntensity.Name = "tbScanlineIntensity"; - this.tbScanlineIntensity.Size = new System.Drawing.Size(70, 42); - this.tbScanlineIntensity.TabIndex = 3; - this.tbScanlineIntensity.TickFrequency = 32; - this.tbScanlineIntensity.TickStyle = System.Windows.Forms.TickStyle.TopLeft; - this.tbScanlineIntensity.Scroll += new System.EventHandler(this.tbScanlineIntensity_Scroll); - this.tbScanlineIntensity.ValueChanged += new System.EventHandler(this.tbScanlineIntensity_Scroll); - // - // trackbarFrameSizeWindowed - // - this.trackbarFrameSizeWindowed.LargeChange = 1; - this.trackbarFrameSizeWindowed.Location = new System.Drawing.Point(6, 33); - this.trackbarFrameSizeWindowed.Maximum = 2; - this.trackbarFrameSizeWindowed.Name = "trackbarFrameSizeWindowed"; - this.trackbarFrameSizeWindowed.Size = new System.Drawing.Size(99, 42); - this.trackbarFrameSizeWindowed.TabIndex = 21; - this.trackbarFrameSizeWindowed.Value = 1; - this.trackbarFrameSizeWindowed.ValueChanged += new System.EventHandler(this.trackbarFrameSizeWindowed_ValueChanged); - // - // btnDefaults - // - this.btnDefaults.Location = new System.Drawing.Point(447, 262); - this.btnDefaults.Name = "btnDefaults"; - this.btnDefaults.Size = new System.Drawing.Size(75, 23); - this.btnDefaults.TabIndex = 18; - this.btnDefaults.Text = "Defaults"; - this.toolTip1.SetToolTip(this.btnDefaults, "Unless I forgot to update the button\'s code when I changed a default"); - this.btnDefaults.UseVisualStyleBackColor = true; - this.btnDefaults.Click += new System.EventHandler(this.btnDefaults_Click); - // - // DisplayConfigLite - // - this.AcceptButton = this.btnOk; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(564, 374); - this.Controls.Add(this.linkLabel1); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Name = "DisplayConfigLite"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Display Configuration"; - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.grpFinalFilter.ResumeLayout(false); - this.grpFinalFilter.PerformLayout(); - this.grpARSelection.ResumeLayout(false); - this.grpARSelection.PerformLayout(); - this.tabControl1.ResumeLayout(false); - this.tpAR.ResumeLayout(false); - this.tpAR.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPrescale)).EndInit(); - this.tpDispMethod.ResumeLayout(false); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); - this.tpMisc.ResumeLayout(false); - this.tpMisc.PerformLayout(); - this.groupBox5.ResumeLayout(false); - this.groupBox5.PerformLayout(); - this.tabPage1.ResumeLayout(false); - this.tabPage1.PerformLayout(); - this.groupBox4.ResumeLayout(false); - this.groupBox4.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbScanlineIntensity)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackbarFrameSizeWindowed)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.Button btnOk; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.RadioButton rbNone; - private System.Windows.Forms.RadioButton rbScanlines; - private System.Windows.Forms.RadioButton rbHq2x; - private BizHawk.Client.EmuHawk.TransparentTrackBar tbScanlineIntensity; - private System.Windows.Forms.CheckBox checkLetterbox; - private System.Windows.Forms.CheckBox checkPadInteger; - private System.Windows.Forms.GroupBox grpFinalFilter; - private System.Windows.Forms.RadioButton rbFinalFilterBicubic; - private System.Windows.Forms.RadioButton rbFinalFilterNone; - private System.Windows.Forms.RadioButton rbFinalFilterBilinear; - private System.Windows.Forms.Button btnSelectUserFilter; - private System.Windows.Forms.RadioButton rbUser; - private System.Windows.Forms.Label lblUserFilterName; - private System.Windows.Forms.RadioButton rbUseRaw; - private System.Windows.Forms.RadioButton rbUseSystem; - private System.Windows.Forms.GroupBox grpARSelection; - private System.Windows.Forms.CheckBox checkSnowyNullEmulator; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label lblScanlines; - private System.Windows.Forms.TextBox txtCustomARHeight; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtCustomARWidth; - private System.Windows.Forms.RadioButton rbUseCustom; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.RadioButton rbOpenGL; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tpAR; - private System.Windows.Forms.TabPage tpDispMethod; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.RadioButton rbGDIPlus; - private System.Windows.Forms.TabPage tpMisc; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.RadioButton rbD3D9; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.CheckBox cbStatusBarWindowed; - private System.Windows.Forms.Label label9; - private BizHawk.Client.EmuHawk.TransparentTrackBar trackbarFrameSizeWindowed; - private System.Windows.Forms.CheckBox cbMenuWindowed; - private System.Windows.Forms.CheckBox cbCaptionWindowed; - private System.Windows.Forms.GroupBox groupBox4; - private System.Windows.Forms.CheckBox cbStatusBarFullscreen; - private System.Windows.Forms.CheckBox cbMenuFullscreen; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label lblFrameTypeWindowed; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.NumericUpDown nudPrescale; - private System.Windows.Forms.CheckBox cbFSAutohideMouse; - private System.Windows.Forms.GroupBox groupBox5; - private System.Windows.Forms.RadioButton rbDisplayAbsoluteZero; - private System.Windows.Forms.RadioButton rbDisplayMinimal; - private System.Windows.Forms.RadioButton rbDisplayFull; - private System.Windows.Forms.CheckBox cbAllowDoubleclickFullscreen; - private System.Windows.Forms.LinkLabel linkLabel1; - private System.Windows.Forms.RadioButton rbUseCustomRatio; - private System.Windows.Forms.TextBox txtCustomARY; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.TextBox txtCustomARX; - private System.Windows.Forms.CheckBox cbAutoPrescale; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.CheckBox cbAlternateVsync; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.CheckBox cbFullscreenHacks; - private System.Windows.Forms.Button btnDefaults; - private System.Windows.Forms.ToolTip toolTip1; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs deleted file mode 100644 index 1c5179f74f..0000000000 --- a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs +++ /dev/null @@ -1,302 +0,0 @@ -using System; -using System.IO; -using System.Windows.Forms; -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class DisplayConfigLite : Form - { - public bool NeedReset; - - string PathSelection; - - public DisplayConfigLite() - { - InitializeComponent(); - - rbNone.Checked = Global.Config.TargetDisplayFilter == 0; - rbHq2x.Checked = Global.Config.TargetDisplayFilter == 1; - rbScanlines.Checked = Global.Config.TargetDisplayFilter == 2; - rbUser.Checked = Global.Config.TargetDisplayFilter == 3; - - PathSelection = Global.Config.DispUserFilterPath ?? ""; - RefreshState(); - - rbFinalFilterNone.Checked = Global.Config.DispFinalFilter == 0; - rbFinalFilterBilinear.Checked = Global.Config.DispFinalFilter == 1; - rbFinalFilterBicubic.Checked = Global.Config.DispFinalFilter == 2; - - tbScanlineIntensity.Value = Global.Config.TargetScanlineFilterIntensity; - checkLetterbox.Checked = Global.Config.DispFixAspectRatio; - checkPadInteger.Checked = Global.Config.DispFixScaleInteger; - cbFullscreenHacks.Checked = Global.Config.DispFullscreenHacks; - cbAutoPrescale.Checked = Global.Config.DispAutoPrescale; - - cbAlternateVsync.Checked = Global.Config.DispAlternateVsync; - - if (Global.Config.DispSpeedupFeatures == 2) rbDisplayFull.Checked = true; - if (Global.Config.DispSpeedupFeatures == 1) rbDisplayMinimal.Checked = true; - if (Global.Config.DispSpeedupFeatures == 0) rbDisplayAbsoluteZero.Checked = true; - - rbOpenGL.Checked = Global.Config.DispMethod == Config.EDispMethod.OpenGL; - rbGDIPlus.Checked = Global.Config.DispMethod == Config.EDispMethod.GdiPlus; - rbD3D9.Checked = Global.Config.DispMethod == Config.EDispMethod.SlimDX9; - - cbStatusBarWindowed.Checked = Global.Config.DispChrome_StatusBarWindowed; - cbCaptionWindowed.Checked = Global.Config.DispChrome_CaptionWindowed; - cbMenuWindowed.Checked = Global.Config.DispChrome_MenuWindowed; - cbStatusBarFullscreen.Checked = Global.Config.DispChrome_StatusBarFullscreen; - cbMenuFullscreen.Checked = Global.Config.DispChrome_MenuFullscreen; - trackbarFrameSizeWindowed.Value = Global.Config.DispChrome_FrameWindowed; - cbFSAutohideMouse.Checked = Global.Config.DispChrome_Fullscreen_AutohideMouse; - SyncTrackbar(); - - cbAllowDoubleclickFullscreen.Checked = Global.Config.DispChrome_AllowDoubleClickFullscreen; - - nudPrescale.Value = Global.Config.DispPrescale; - - // null emulator config hack - { - NullEmulator.NullEmulatorSettings s; - if (Global.Emulator is NullEmulator) - s = (Global.Emulator as dynamic).GetSettings(); - else - s = (NullEmulator.NullEmulatorSettings)Global.Config.GetCoreSettings(); - checkSnowyNullEmulator.Checked = s.SnowyDisplay; - } - - if (Global.Config.DispManagerAR == Config.EDispManagerAR.None) - rbUseRaw.Checked = true; - else if (Global.Config.DispManagerAR == Config.EDispManagerAR.System) - rbUseSystem.Checked = true; - else if (Global.Config.DispManagerAR == Config.EDispManagerAR.Custom) - rbUseCustom.Checked = true; - else if (Global.Config.DispManagerAR == Config.EDispManagerAR.CustomRatio) - rbUseCustomRatio.Checked = true; - - if(Global.Config.DispCustomUserARWidth != -1) - txtCustomARWidth.Text = Global.Config.DispCustomUserARWidth.ToString(); - if (Global.Config.DispCustomUserARHeight != -1) - txtCustomARHeight.Text = Global.Config.DispCustomUserARHeight.ToString(); - if (Global.Config.DispCustomUserARX != -1) - txtCustomARX.Text = Global.Config.DispCustomUserARX.ToString(); - if (Global.Config.DispCustomUserARY != -1) - txtCustomARY.Text = Global.Config.DispCustomUserARY.ToString(); - - RefreshAspectRatioOptions(); - } - - private void btnOk_Click(object sender, EventArgs e) - { - if (rbNone.Checked) - Global.Config.TargetDisplayFilter = 0; - if (rbHq2x.Checked) - Global.Config.TargetDisplayFilter = 1; - if (rbScanlines.Checked) - Global.Config.TargetDisplayFilter = 2; - if (rbUser.Checked) - Global.Config.TargetDisplayFilter = 3; - - if (rbFinalFilterNone.Checked) - Global.Config.DispFinalFilter = 0; - if (rbFinalFilterBilinear.Checked) - Global.Config.DispFinalFilter = 1; - if (rbFinalFilterBicubic.Checked) - Global.Config.DispFinalFilter = 2; - - Global.Config.DispPrescale = (int)nudPrescale.Value; - - Global.Config.TargetScanlineFilterIntensity = tbScanlineIntensity.Value; - Global.Config.DispFixAspectRatio = checkLetterbox.Checked; - Global.Config.DispFixScaleInteger = checkPadInteger.Checked; - Global.Config.DispFullscreenHacks = cbFullscreenHacks.Checked; - Global.Config.DispAutoPrescale = cbAutoPrescale.Checked; - - Global.Config.DispAlternateVsync = cbAlternateVsync.Checked; - - Global.Config.DispChrome_StatusBarWindowed = cbStatusBarWindowed.Checked; - Global.Config.DispChrome_CaptionWindowed = cbCaptionWindowed.Checked; - Global.Config.DispChrome_MenuWindowed = cbMenuWindowed.Checked; - Global.Config.DispChrome_StatusBarFullscreen = cbStatusBarFullscreen.Checked; - Global.Config.DispChrome_MenuFullscreen = cbMenuFullscreen.Checked; - Global.Config.DispChrome_FrameWindowed = trackbarFrameSizeWindowed.Value; - Global.Config.DispChrome_Fullscreen_AutohideMouse = cbFSAutohideMouse.Checked; - Global.Config.DispChrome_AllowDoubleClickFullscreen = cbAllowDoubleclickFullscreen.Checked; - - if (rbDisplayFull.Checked) Global.Config.DispSpeedupFeatures = 2; - if (rbDisplayMinimal.Checked) Global.Config.DispSpeedupFeatures = 1; - if (rbDisplayAbsoluteZero.Checked) Global.Config.DispSpeedupFeatures = 0; - - // HACK:: null emulator's settings don't persist to config normally - { - NullEmulator.NullEmulatorSettings s; - if (Global.Emulator is NullEmulator) - s = (Global.Emulator as dynamic).GetSettings(); - else - s = (NullEmulator.NullEmulatorSettings)Global.Config.GetCoreSettings(); - s.SnowyDisplay = checkSnowyNullEmulator.Checked; - - Global.Config.PutCoreSettings(s); - if (Global.Emulator is NullEmulator) - (Global.Emulator as dynamic).PutSettings(s); - } - - if (rbUseRaw.Checked) - Global.Config.DispManagerAR = Config.EDispManagerAR.None; - else if (rbUseSystem.Checked) - Global.Config.DispManagerAR = Config.EDispManagerAR.System; - else if (rbUseCustom.Checked) - Global.Config.DispManagerAR = Config.EDispManagerAR.Custom; - else if (rbUseCustomRatio.Checked) - Global.Config.DispManagerAR = Config.EDispManagerAR.CustomRatio; - - if (txtCustomARWidth.Text != "") - int.TryParse(txtCustomARWidth.Text, out Global.Config.DispCustomUserARWidth); - else Global.Config.DispCustomUserARWidth = -1; - if (txtCustomARHeight.Text != "") - int.TryParse(txtCustomARHeight.Text, out Global.Config.DispCustomUserARHeight); - else Global.Config.DispCustomUserARHeight = -1; - if (txtCustomARX.Text != "") - float.TryParse(txtCustomARX.Text, out Global.Config.DispCustomUserARX); - else Global.Config.DispCustomUserARX = -1; - if (txtCustomARY.Text != "") - float.TryParse(txtCustomARY.Text, out Global.Config.DispCustomUserARY); - else Global.Config.DispCustomUserARY = -1; - - var oldDisplayMethod = Global.Config.DispMethod; - if(rbOpenGL.Checked) - Global.Config.DispMethod = Config.EDispMethod.OpenGL; - if(rbGDIPlus.Checked) - Global.Config.DispMethod = Config.EDispMethod.GdiPlus; - if(rbD3D9.Checked) - Global.Config.DispMethod = Config.EDispMethod.SlimDX9; - - if (oldDisplayMethod != Global.Config.DispMethod) - NeedReset = true; - - Global.Config.DispUserFilterPath = PathSelection; - GlobalWin.DisplayManager.RefreshUserShader(); - - DialogResult = DialogResult.OK; - Close(); - } - - void RefreshState() - { - lblUserFilterName.Text = Path.GetFileNameWithoutExtension(PathSelection); - } - - private void btnSelectUserFilter_Click(object sender, EventArgs e) - { - var ofd = new OpenFileDialog(); - ofd.Filter = ".CGP (*.cgp)|*.cgp"; - ofd.FileName = PathSelection; - if (ofd.ShowDialog() == DialogResult.OK) - { - rbUser.Checked = true; - var choice = Path.GetFullPath(ofd.FileName); - - //test the preset - using (var stream = File.OpenRead(choice)) - { - var cgp = new BizHawk.Client.EmuHawk.Filters.RetroShaderPreset(stream); - if (cgp.ContainsGLSL) - { - MessageBox.Show("Specified CGP contains references to .glsl files. This is illegal. Use .cg"); - return; - } - - //try compiling it - bool ok = false; - string errors = ""; - try - { - var filter = new BizHawk.Client.EmuHawk.Filters.RetroShaderChain(GlobalWin.GL, cgp, Path.GetDirectoryName(choice)); - ok = filter.Available; - errors = filter.Errors; - } - catch {} - if (!ok) - { - new ExceptionBox(errors).ShowDialog(); - return; - } - } - - PathSelection = choice; - RefreshState(); - } - } - - private void checkLetterbox_CheckedChanged(object sender, EventArgs e) - { - RefreshAspectRatioOptions(); - } - private void checkPadInteger_CheckedChanged(object sender, EventArgs e) - { - RefreshAspectRatioOptions(); - } - - private void rbUseRaw_CheckedChanged(object sender, EventArgs e) - { - RefreshAspectRatioOptions(); - } - - private void rbUseSystem_CheckedChanged(object sender, EventArgs e) - { - RefreshAspectRatioOptions(); - } - - void RefreshAspectRatioOptions() - { - grpARSelection.Enabled = checkLetterbox.Checked; - checkPadInteger.Enabled = checkLetterbox.Checked; - } - - public void tbScanlineIntensity_Scroll(object sender, EventArgs e) - { - Global.Config.TargetScanlineFilterIntensity = tbScanlineIntensity.Value; - int scanlines = Global.Config.TargetScanlineFilterIntensity; - float percentage = (float) scanlines / 256 * 100; - lblScanlines.Text = String.Format("{0:F2}", percentage) + "%"; - } - - private void trackbarFrameSizeWindowed_ValueChanged(object sender, EventArgs e) - { - SyncTrackbar(); - } - - void SyncTrackbar() - { - if (trackbarFrameSizeWindowed.Value == 0) - lblFrameTypeWindowed.Text = "None"; - if (trackbarFrameSizeWindowed.Value == 1) - lblFrameTypeWindowed.Text = "Thin"; - if (trackbarFrameSizeWindowed.Value == 2) - lblFrameTypeWindowed.Text = "Thick"; - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("http://tasvideos.org/Bizhawk/DisplayConfig.html"); - } - - private void label13_Click(object sender, EventArgs e) - { - cbAlternateVsync.Checked ^= true; - } - - private void btnDefaults_Click(object sender, EventArgs e) - { - nudPrescale.Value = 1; - rbNone.Checked = true; - cbAutoPrescale.Checked = true; - rbFinalFilterBilinear.Checked = true; - checkLetterbox.Checked = true; - rbUseSystem.Checked = true; - } - - } -} diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.resx b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.resx deleted file mode 100644 index 60237ce856..0000000000 --- a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - Alternate VSync Method: Some GPUs have problems VSyncing. It seems to manifest on full-screen windows. There will be hiccups when throttling to VSync. Use this to try and solve it (busy loop; burns major CPU) - - - For Windows operating systems >= Vista, with some video cards, the monitors may flicker when going 'windowed fullscreen' while the system disobeys us and goes actual fullscreen instead. This hack prevents that, but may increase frame latency (since in Microsoft's new and disimproved operating systems, windowed mode things may have higher latency) - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/FileExtensionPreferences.cs b/BizHawk.Client.EmuHawk/config/FileExtensionPreferences.cs deleted file mode 100644 index 086811bdcb..0000000000 --- a/BizHawk.Client.EmuHawk/config/FileExtensionPreferences.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class FileExtensionPreferences : Form - { - public FileExtensionPreferences() - { - InitializeComponent(); - } - - private void FileExtensionPreferences_Load(object sender, EventArgs e) - { - int spacing = UIHelper.ScaleY(30); - int count = 0; - foreach (var kvp in Global.Config.PreferredPlatformsForExtensions) - { - var picker = new FileExtensionPreferencesPicker - { - FileExtension = kvp.Key, - OriginalPreference = kvp.Value, - Location = new Point(UIHelper.ScaleX(15), UIHelper.ScaleY(15) + (spacing * count)) - }; - - count++; - PrefPanel.Controls.Add(picker); - } - } - - private void OkBtn_Click(object sender, EventArgs e) - { - foreach (var picker in PrefPanel.Controls.OfType()) - { - Global.Config.PreferredPlatformsForExtensions[picker.FileExtension] = picker.CurrentlySelectedSystemId; - } - - GlobalWin.OSD.AddMessage("Rom Extension Preferences changed"); - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Rom Extension Preferences cancelled"); - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs b/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs deleted file mode 100644 index d7a062cc1e..0000000000 --- a/BizHawk.Client.EmuHawk/config/FirmwaresConfig.cs +++ /dev/null @@ -1,725 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -// notes: eventually, we intend to have a "firmware acquisition interface" exposed to the emulator cores. -// it will be implemented by emuhawk, and use firmware keys to fetch the firmware content. -// however, for now, the cores are using strings from the config class. so we have the `configMember` which is -// used by reflection to set the configuration for firmwares which were found - -// TODO - we may eventually need to add a progress dialog for this. we should have one for other reasons. -// I started making one in Bizhawk.Util as QuickProgressPopup but ran out of time - -// IDEA: show current path in tooltip (esp. for custom resolved) -// IDEA: prepop set customization to dir of current custom - -// TODO - display some kind if [!] if you have a user-specified file which is known but defined as incompatible by the firmware DB -namespace BizHawk.Client.EmuHawk -{ - public partial class FirmwaresConfig : Form - { - // friendlier names than the system Ids - // Redundant with SystemLookup? Not so fast. That datadrives things. This is one step abstracted. Don't be such a smart guy. Keep this redundant list up to date. - private static readonly Dictionary SystemGroupNames = new Dictionary - { - { "NES", "NES" }, - { "SNES", "SNES" }, - { "PCECD", "PCE-CD" }, - { "SAT", "Saturn" }, - { "A78", "Atari 7800" }, - { "Coleco", "Colecovision" }, - { "GBA", "GBA" }, - { "TI83", "TI-83" }, - { "INTV", "Intellivision" }, - { "C64", "C64" }, - { "GEN", "Genesis" }, - { "SMS", "Sega Master System" }, - { "PSX", "PlayStation" }, - { "Lynx", "Lynx" }, - { "AppleII", "Apple II" }, - { "O2", "Odyssey 2" }, - { "GB", "Game Boy" }, - { "GBC", "Game Boy Color" }, - { "PCFX", "PC-FX" }, - { "32X", "32X" }, - { "ZXSpectrum", "ZX Spectrum" }, - { "AmstradCPC", "Amstrad CPC" } - }; - - public string TargetSystem = null; - - private CheckBox cbAllowImport; - - private const int idUnsure = 0; - private const int idMissing = 1; - private const int idOk = 2; - - private Font fixedFont, boldFont, boldFixedFont; - - private class ListViewSorter : IComparer - { - public FirmwaresConfig dialog; - public int column; - public int sign; - public ListViewSorter(FirmwaresConfig dialog, int column) - { - this.dialog = dialog; - this.column = column; - } - public int Compare(object a, object b) - { - var lva = (ListViewItem)a; - var lvb = (ListViewItem)b; - return sign * string.Compare(lva.SubItems[column].Text, lvb.SubItems[column].Text); - } - } - - private string currSelectorDir; - private readonly ListViewSorter listviewSorter; - - public FirmwaresConfig(bool retryLoadRom = false, string reloadRomPath = null) - { - InitializeComponent(); - - // prep imagelist for listview with 3 item states for {idUnsure, idMissing, idOk} - imageList1.Images.AddRange(new[] { Properties.Resources.RetroQuestion, Properties.Resources.ExclamationRed, Properties.Resources.GreenCheck }); - - listviewSorter = new ListViewSorter(this, -1); - - if (retryLoadRom) - { - toolStripSeparator1.Visible = true; - tbbCloseReload.Visible = true; - tbbCloseReload.Enabled = true; - - - if (string.IsNullOrWhiteSpace(reloadRomPath)) - { - tbbCloseReload.ToolTipText = "Close Firmware Manager and reload ROM"; - } - else - { - tbbCloseReload.ToolTipText = "Close Firmware Manager and reload " + reloadRomPath; - } - - } - } - - // makes sure that the specified SystemId is selected in the list (and that all the firmwares for it are visible) - private void WarpToSystemId(string sysid) - { - bool selectedFirst = false; - foreach (ListViewItem lvi in lvFirmwares.Items) - { - if (lvi.SubItems[1].Text == sysid) - { - if(!selectedFirst) lvi.Selected = true; - lvi.EnsureVisible(); - selectedFirst = true; - } - } - } - - private void FirmwaresConfig_Load(object sender, EventArgs e) - { - // we'll use this font for displaying the hash, so they dont look all jagged in a long list - fixedFont = new Font(new FontFamily("Courier New"), 8); - boldFont = new Font(lvFirmwares.Font, FontStyle.Bold); - boldFixedFont = new Font(fixedFont, FontStyle.Bold); - - // populate listview from firmware DB - var groups = new Dictionary(); - foreach (var fr in FirmwareDatabase.FirmwareRecords) - { - var lvi = new ListViewItem(); - lvi.Tag = fr; - lvi.UseItemStyleForSubItems = false; - lvi.ImageIndex = idUnsure; - lvi.ToolTipText = null; - lvi.SubItems.Add(fr.SystemId); - lvi.SubItems.Add(fr.FirmwareId); - lvi.SubItems.Add(fr.Descr); - lvi.SubItems.Add(""); // resolved with - lvi.SubItems.Add(""); // location - lvi.SubItems.Add(""); // size - lvi.SubItems.Add(""); // hash - lvi.SubItems[6].Font = fixedFont; // would be used for hash and size - lvi.SubItems[7].Font = fixedFont; // would be used for hash and size - lvFirmwares.Items.Add(lvi); - - // build the groups in the listview as we go: - if (!groups.ContainsKey(fr.SystemId)) - { - string name; - if (!SystemGroupNames.TryGetValue(fr.SystemId, out name)) - name = "FIX ME (FirmwaresConfig.cs)"; - lvFirmwares.Groups.Add(fr.SystemId, name); - var lvg = lvFirmwares.Groups[lvFirmwares.Groups.Count - 1]; - groups[fr.SystemId] = lvg; - } - lvi.Group = groups[fr.SystemId]; - } - - // now that we have some items in the listview, we can size some columns to sensible widths - lvFirmwares.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent); - lvFirmwares.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent); - lvFirmwares.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.ColumnContent); - - if (TargetSystem != null) - { - WarpToSystemId(TargetSystem); - } - - RefreshBasePath(); - - cbAllowImport = new CheckBox(); - cbAllowImport.Text = "Allow Importing of Unknown Files"; - cbAllowImport.BackColor = Color.Transparent; - cbAllowImport.CheckAlign = ContentAlignment.MiddleLeft; - cbAllowImport.TextAlign = ContentAlignment.MiddleLeft; - cbAllowImport.Font = new Font("Segeo UI", 9, FontStyle.Regular, GraphicsUnit.Point, 1, false); - cbAllowImport.Checked = false; - ToolStripControlHost host = new ToolStripControlHost(cbAllowImport); - toolStrip1.Items.Add(host); - } - - - private void tbbClose_Click(object sender, EventArgs e) - { - this.Close(); - DialogResult = DialogResult.Cancel; - } - - private void tbbCloseReload_Click(object sender, EventArgs e) - { - this.Close(); - DialogResult = DialogResult.Retry; - } - - private void FirmwaresConfig_FormClosed(object sender, FormClosedEventArgs e) - { - fixedFont.Dispose(); - boldFont.Dispose(); - boldFixedFont.Dispose(); - } - - private void tbbGroup_Click(object sender, EventArgs e) - { - // toggle the grouping state - lvFirmwares.ShowGroups = !lvFirmwares.ShowGroups; - } - - private void lvFirmwares_ColumnClick(object sender, ColumnClickEventArgs e) - { - if (listviewSorter.column != e.Column) - { - listviewSorter.column = e.Column; - listviewSorter.sign = 1; - } - else listviewSorter.sign *= -1; - lvFirmwares.ListViewItemSorter = listviewSorter; - lvFirmwares.SetSortIcon(e.Column, listviewSorter.sign == 1 ? SortOrder.Descending : SortOrder.Ascending); - lvFirmwares.Sort(); - } - - private void tbbScan_Click(object sender, EventArgs e) - { - // user-initiated scan - DoScan(); - } - - private FirmwareManager Manager => Global.FirmwareManager; - - private void DoScan() - { - lvFirmwares.BeginUpdate(); - Manager.DoScanAndResolve(); - - // for each type of firmware, try resolving and record the result - foreach (ListViewItem lvi in lvFirmwares.Items) - { - var fr = lvi.Tag as FirmwareDatabase.FirmwareRecord; - var ri = Manager.Resolve(fr, true); - for(int i=4;i<=7;i++) - lvi.SubItems[i].Text = ""; - - if (ri == null) - { - lvi.ImageIndex = idMissing; - lvi.ToolTipText = "No file bound for this firmware!"; - } - else - { - // lazy substring extraction. really should do a better job - var basePath = PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null) + Path.DirectorySeparatorChar; - - var path = ri.FilePath.Replace(basePath, ""); - - // bolden the item if the user has specified a path for it - bool bolden = ri.UserSpecified; - - // set columns based on whether it was a known file - if (ri.KnownFirmwareFile == null) - { - lvi.ImageIndex = idUnsure; - lvi.ToolTipText = "You've bound a custom choice here. Hope you know what you're doing."; - lvi.SubItems[4].Text = "-custom-"; - } - else - { - lvi.ImageIndex = idOk; - lvi.ToolTipText = "Good! This file has been bound to some kind of a decent choice"; - lvi.SubItems[4].Text = ri.KnownFirmwareFile.Description; - } - - // bolden the item if necessary - if (bolden) - { - foreach (ListViewItem.ListViewSubItem lvsi in lvi.SubItems) lvsi.Font = boldFont; - lvi.SubItems[6].Font = boldFixedFont; - } - else - { - foreach (ListViewItem.ListViewSubItem lvsi in lvi.SubItems) lvsi.Font = lvFirmwares.Font; - lvi.SubItems[6].Font = fixedFont; - } - - // if the user specified a file but its missing, mark it as such - if (ri.Missing) - { - lvi.ImageIndex = idMissing; - lvi.ToolTipText = "The file that's specified is missing!"; - } - - // if the user specified a known firmware file but its for some other firmware, it was probably a mistake. mark it as suspicious - if (ri.KnownMismatching) - { - lvi.ImageIndex = idUnsure; - lvi.ToolTipText = "You've manually specified a firmware file, and we're sure it's wrong. Hope you know what you're doing."; - } - - - lvi.SubItems[5].Text = path; - - lvi.SubItems[6].Text = ri.Size.ToString(); - - if (ri.Hash != null) lvi.SubItems[7].Text = "sha1:" + ri.Hash; - else lvi.SubItems[7].Text = ""; - } - } - - lvFirmwares.EndUpdate(); - } - - private void tbbOrganize_Click(object sender, EventArgs e) - { - if (MessageBox.Show(this, "This is going to move/rename every automatically-selected firmware file under your configured firmwares directory to match our recommended organizational scheme (which is not super great right now). Proceed?", "Firmwares Organization Confirm", MessageBoxButtons.OKCancel) == DialogResult.Cancel) - { - return; - } - - Manager.DoScanAndResolve(); - - foreach (var fr in FirmwareDatabase.FirmwareRecords) - { - var ri = Manager.Resolve(fr); - if (ri == null) continue; - if (ri.KnownFirmwareFile == null) continue; - if (ri.UserSpecified) continue; - - string fpTarget = PathManager.StandardFirmwareName(ri.KnownFirmwareFile.RecommendedName); - string fpSource = ri.FilePath; - - try - { - File.Move(fpSource, fpTarget); - } - catch - { - // sometimes moves fail. especially in newer versions of windows with explorers more fragile than your great-grandma. - // I am embarassed that I know that. about windows, not your great-grandma. - } - } - - DoScan(); - } - - private void tbbOpenFolder_Click(object sender, EventArgs e) - { - var frmWares = PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null); - System.Diagnostics.Process.Start(frmWares); - } - - private void lvFirmwares_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.C && e.Control && !e.Alt && !e.Shift) - { - PerformListCopy(); - } - } - - void PerformListCopy() - { - var str = lvFirmwares.CopyItemsAsText(); - if (str.Length > 0) Clipboard.SetDataObject(str); - } - - private void lvFirmwares_MouseClick(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right && lvFirmwares.GetItemAt(e.X, e.Y) != null) - lvFirmwaresContextMenuStrip.Show(lvFirmwares, e.Location); - } - - private void tsmiSetCustomization_Click(object sender, EventArgs e) - { - using (var ofd = new OpenFileDialog()) - { - ofd.InitialDirectory = currSelectorDir; - ofd.RestoreDirectory = true; - string frmwarePath = PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null); - - if (ofd.ShowDialog() == DialogResult.OK) - { - // remember the location we selected this firmware from, maybe there are others - currSelectorDir = Path.GetDirectoryName(ofd.FileName); - - try - { - using (var hf = new HawkFile(ofd.FileName)) - { - // for each selected item, set the user choice (even though multiple selection for this operation is no longer allowed) - foreach (ListViewItem lvi in lvFirmwares.SelectedItems) - { - var fr = lvi.Tag as FirmwareDatabase.FirmwareRecord; - string filePath = ofd.FileName; - - // if the selected file is an archive, allow the user to pick the inside file - // to always be copied to the global firmwares directory - if (hf.IsArchive) - { - var ac = new ArchiveChooser(new HawkFile(filePath)); - int memIdx = -1; - - if (ac.ShowDialog(this) == DialogResult.OK) - { - memIdx = ac.SelectedMemberIndex; - } - else - { - return; - } - - var insideFile = hf.BindArchiveMember(memIdx); - var fileData = insideFile.ReadAllBytes(); - - // write to file in the firmwares folder - File.WriteAllBytes(Path.Combine(frmwarePath, insideFile.Name), fileData); - filePath = Path.Combine(frmwarePath, insideFile.Name); - } - else - { - // selected file is not an archive - // check whether this file is currently outside of the global firmware directory - if (currSelectorDir != frmwarePath) - { - var askMoveResult = MessageBox.Show(this, "The selected custom firmware does not reside in the root of the global firmware directory.\nDo you want to copy it there?", "Import Custom Firmware", MessageBoxButtons.YesNo); - if (askMoveResult == DialogResult.Yes) - { - try - { - FileInfo fi = new FileInfo(filePath); - filePath = Path.Combine(frmwarePath, fi.Name); - File.Copy(ofd.FileName, filePath); - } - catch (Exception ex) - { - MessageBox.Show(this, "There was an issue copying the file. The customization has NOT been set.\n\n" + ex.StackTrace); - continue; - } - } - } - } - - Global.Config.FirmwareUserSpecifications[fr.ConfigKey] = filePath; - } - } - } - catch (Exception ex) - { - MessageBox.Show(this, "There was an issue during the process. The customization has NOT been set.\n\n" + ex.StackTrace); - return; - } - - DoScan(); - } - } - } - - private void tsmiClearCustomization_Click(object sender, EventArgs e) - { - // for each selected item, clear the user choice - foreach (ListViewItem lvi in lvFirmwares.SelectedItems) - { - var fr = lvi.Tag as FirmwareDatabase.FirmwareRecord; - Global.Config.FirmwareUserSpecifications.Remove(fr.ConfigKey); - } - - DoScan(); - } - - private void tsmiInfo_Click(object sender, EventArgs e) - { - var lvi = lvFirmwares.SelectedItems[0]; - var fr = (FirmwareDatabase.FirmwareRecord)lvi.Tag; - - // get all options for this firmware (in order) - var options = - from fo in FirmwareDatabase.FirmwareOptions - where fo.SystemId == fr.SystemId && fo.FirmwareId == fr.FirmwareId - select fo; - - FirmwaresConfigInfo fciDialog = new FirmwaresConfigInfo - { - lblFirmware = - { - Text = $"{fr.SystemId} : {fr.FirmwareId} ({fr.Descr})" - } - }; - - foreach (var o in options) - { - ListViewItem olvi = new ListViewItem(); - olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); - olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); - olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); - olvi.SubItems.Add(new ListViewItem.ListViewSubItem()); - var ff = FirmwareDatabase.FirmwareFilesByHash[o.Hash]; - if (o.Status == FirmwareDatabase.FirmwareOptionStatus.Ideal) - { - olvi.ImageIndex = FirmwaresConfigInfo.idIdeal; - olvi.ToolTipText = FirmwaresConfigInfo.ttIdeal; - } - if (o.Status == FirmwareDatabase.FirmwareOptionStatus.Acceptable) - { - olvi.ImageIndex = FirmwaresConfigInfo.idAcceptable; - olvi.ToolTipText = FirmwaresConfigInfo.ttAcceptable; - } - if (o.Status == FirmwareDatabase.FirmwareOptionStatus.Unacceptable) - { - olvi.ImageIndex = FirmwaresConfigInfo.idUnacceptable; - olvi.ToolTipText = FirmwaresConfigInfo.ttUnacceptable; - } - if (o.Status == FirmwareDatabase.FirmwareOptionStatus.Bad) - { - olvi.ImageIndex = FirmwaresConfigInfo.idBad; - olvi.ToolTipText = FirmwaresConfigInfo.ttBad; - } - olvi.SubItems[0].Text = ff.Size.ToString(); - olvi.SubItems[0].Font = this.Font; // why doesnt this work? - olvi.SubItems[1].Text = "sha1:" + o.Hash; - olvi.SubItems[1].Font = fixedFont; - olvi.SubItems[2].Text = ff.RecommendedName; - olvi.SubItems[2].Font = this.Font; // why doesnt this work? - olvi.SubItems[3].Text = ff.Description; - olvi.SubItems[3].Font = this.Font; // why doesnt this work? - olvi.SubItems[4].Text = ff.Info; - olvi.SubItems[4].Font = this.Font; // why doesnt this work? - fciDialog.lvOptions.Items.Add(olvi); - } - - fciDialog.lvOptions.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent); - fciDialog.lvOptions.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent); - fciDialog.lvOptions.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent); - fciDialog.lvOptions.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.ColumnContent); - - fciDialog.ShowDialog(this); - } - - private void lvFirmwaresContextMenuStrip_Opening(object sender, CancelEventArgs e) - { - // hide menu items that arent appropriate for multi-select - tsmiSetCustomization.Visible = lvFirmwares.SelectedItems.Count == 1; - tsmiInfo.Visible = lvFirmwares.SelectedItems.Count == 1; - } - - private void tsmiCopy_Click(object sender, EventArgs e) - { - PerformListCopy(); - } - - private void linkBasePath_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - if (Owner is PathConfig) - { - MessageBox.Show("C-C-C-Combo Breaker!", "Nice try, but"); - return; - } - - new PathConfig().ShowDialog(this); - RefreshBasePath(); - } - - private void RefreshBasePath() - { - string oldBasePath = currSelectorDir; - linkBasePath.Text = currSelectorDir = PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null); - if (oldBasePath != currSelectorDir) - { - DoScan(); - } - } - - private void tbbImport_Click(object sender, EventArgs e) - { - using (var ofd = new OpenFileDialog()) - { - ofd.Multiselect = true; - if (ofd.ShowDialog() != DialogResult.OK) - { - return; - } - - RunImportJob(ofd.FileNames); - } - } - - private bool RunImportJobSingle(string basepath, string f, ref string errors) - { - try - { - var fi = new FileInfo(f); - if (!fi.Exists) - { - return false; - } - - string target = Path.Combine(basepath, fi.Name); - if (new FileInfo(target).Exists) - { - // compare the files, if theyre the same. dont do anything - if (File.ReadAllBytes(target).SequenceEqual(File.ReadAllBytes(f))) - { - return false; - } - - // hmm theyre different. import but rename it - string dir = Path.GetDirectoryName(target); - string ext = Path.GetExtension(target); - string name = Path.GetFileNameWithoutExtension(target); - name += " (variant)"; - target = Path.Combine(dir, name) + ext; - } - - Directory.CreateDirectory(Path.GetDirectoryName(target)); - fi.CopyTo(target, false); - return true; - } - catch - { - if (errors != "") - { - errors += "\n"; - } - - errors += f; - return false; - } - } - - private void RunImportJob(IEnumerable files) - { - bool didSomething = false; - var basepath = PathManager.MakeAbsolutePath(Global.Config.PathEntries.FirmwaresPathFragment, null); - string errors = ""; - foreach(var f in files) - { - using (var hf = new HawkFile(f)) - { - if (hf.IsArchive) - { - // blech. the worst extraction code in the universe. - string extractpath = Path.GetTempFileName() + ".dir"; - DirectoryInfo di = Directory.CreateDirectory(extractpath); - - try - { - foreach (var ai in hf.ArchiveItems) - { - hf.BindArchiveMember(ai); - var stream = hf.GetStream(); - var ms = new MemoryStream(); - Util.CopyStream(hf.GetStream(), ms, stream.Length); - string outfile = ai.Name; - string myname = Path.GetFileName(outfile); - outfile = Path.Combine(extractpath, myname); - File.WriteAllBytes(outfile, ms.ToArray()); - hf.Unbind(); - - if (cbAllowImport.Checked || Manager.CanFileBeImported(outfile)) - { - didSomething |= RunImportJobSingle(basepath, outfile, ref errors); - } - } - } - finally - { - di.Delete(true); - } - } - else - { - if (cbAllowImport.Checked || Manager.CanFileBeImported(hf.CanonicalFullPath)) - { - didSomething |= RunImportJobSingle(basepath, f, ref errors); - } - } - } - } - - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, "Error importing these files"); - } - - if (didSomething) - { - DoScan(); - } - } - - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - if (keyData == Keys.Escape) - { - Close(); - return true; - } - - return base.ProcessCmdKey(ref msg, keyData); - } - - private void lvFirmwares_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void lvFirmwares_DragDrop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); - RunImportJob(files); - } - } - } // class FirmwaresConfig -} diff --git a/BizHawk.Client.EmuHawk/config/FirmwaresConfig.resx b/BizHawk.Client.EmuHawk/config/FirmwaresConfig.resx deleted file mode 100644 index 18c3d121ad..0000000000 --- a/BizHawk.Client.EmuHawk/config/FirmwaresConfig.resx +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 313, 17 - - - 122, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - 221, 17 - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.cs b/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.cs deleted file mode 100644 index b47bb2d969..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.Nintendo.Gameboy; - -namespace BizHawk.Client.EmuHawk -{ - public partial class CGBColorChooserForm : Form - { - private CGBColorChooserForm() - { - InitializeComponent(); - bmpView1.ChangeBitmapSize(new Size(256, 128)); - } - - private GBColors.ColorType _type; - - private void LoadType(Gameboy.GambatteSettings s) - { - _type = s.CGBColors; - switch (_type) - { - case GBColors.ColorType.gambatte: - radioButton1.Checked = true; - break; - case GBColors.ColorType.vivid: - radioButton2.Checked = true; - break; - case GBColors.ColorType.vbavivid: - radioButton3.Checked = true; - break; - case GBColors.ColorType.vbagbnew: - radioButton4.Checked = true; - break; - case GBColors.ColorType.vbabgbold: - radioButton5.Checked = true; - break; - case GBColors.ColorType.gba: - radioButton6.Checked = true; - break; - } - } - - private unsafe void RefreshType() - { - var lockdata = bmpView1.BMP.LockBits(new Rectangle(0, 0, 256, 128), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - int[] lut = GBColors.GetLut(_type); - - int* dest = (int*)lockdata.Scan0; - - for (int j = 0; j < 128; j++) - { - for (int i = 0; i < 256; i++) - { - int r = i % 32; - int g = j % 32; - int b = (i / 32 * 4) + (j / 32); - int color = lut[r | g << 5 | b << 10]; - *dest++ = color; - } - - dest -= 256; - dest += lockdata.Stride / sizeof(int); - } - - bmpView1.BMP.UnlockBits(lockdata); - bmpView1.Refresh(); - } - - private void RadioButton1_CheckedChanged(object sender, EventArgs e) - { - if (sender == radioButton1) - { - _type = GBColors.ColorType.gambatte; - } - - if (sender == radioButton2) - { - _type = GBColors.ColorType.vivid; - } - - if (sender == radioButton3) - { - _type = GBColors.ColorType.vbavivid; - } - - if (sender == radioButton4) - { - _type = GBColors.ColorType.vbagbnew; - } - - if (sender == radioButton5) - { - _type = GBColors.ColorType.vbabgbold; - } - - if (sender == radioButton6) - { - _type = GBColors.ColorType.gba; - } - - var radioButton = sender as RadioButton; - if (radioButton != null && radioButton.Checked) - { - RefreshType(); - } - } - - public static void DoCGBColorChoserFormDialog(IWin32Window parent, Gameboy.GambatteSettings s) - { - using (var dlg = new CGBColorChooserForm()) - { - dlg.LoadType(s); - var result = dlg.ShowDialog(parent); - if (result == DialogResult.OK) - { - s.CGBColors = dlg._type; - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.resx b/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.resx deleted file mode 100644 index f6a0374127..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/CGBColorChooserForm.resx +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAQAICAAAAEAIACoEAAARgAAACAgAAABAAgAqAgAAO4QAAAQEAAAAQAgAGgEAACWGQAAEBAAAAEA - CABoBQAA/h0AACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB7e3tAfHx8v3d3d/9tbW3/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lp - af9paWn/aWlp/2lpaf9oaGj/ZmZm/3BwcP+EhIT/jo6Ov4+Pj0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAHt7e0B6enq/fX19/4GBgf+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4KCgv+BgYH/fn5+/3x8 - fP98fHz/fn5+/4GBgf+CgoL/goKC/3x8fP9ycnL/dXV1/4WFhf+MjIzPiIiIcISEhDB/f38QAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAd3d3QHl5eb+JiYn/qKio/7i4uP+3t7f/t7e3/7e3t/+3t7f/tra2/7Gx - sf+oqKj/o6Oj/6SkpP+pqan/s7Oz/7a2tv+0tLT/paWl/4iIiP9+fn7/h4eH/4mJie+FhYXPgoKCj4SE - hDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4+Pj/+7u7v/0dHR/8/Pz//Pz8//0NDQ/9HR - 0f/Q0ND/ycnJ/729vf+3t7f/uLi4/729vv/IyMr/zs7P/83Nzv+9vb3/np6e/46Ojv+NjY3/ioqK/4KC - gv9+fn6/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6uv/Ozs7/ysrK/8rK - yv/Ozs7/0NDQ/9DQ0P/Kysr/vb29/7e3t/+3t7f/urq8/8LCx//IyM3/zMzO/8TExf+ysrL/o6Oj/5iY - mP+MjIz/fn5+/3Z2dr93d3dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3QHZ2dr+JiYn/ra2t/7e3 - t/+lpaX/p6en/7y8vP/Jycn/zs7O/8zMzP/Dw8L/urq9/7Kyu/+oqLz/nZ3C/6Cgxf+xscf/ubnD/7i4 - vP+vr7D/oKCh/5OTlP+JiYr/hYWFz4aGhnCKioowj4+PEAAAAAAAAAAAAAAAAAAAAAB3d3dAdXV1v4CA - gP+VlZX/ioqK/2BgYP9mZmb/mpqa/7u7u//Jycn/z8/O/8zMzP/AwMj/qqrE/4iIv/9ZWbn/Vla3/39/ - uP+cnLn/rq66/7GxtP+kpKf/n5+i/6Skpf+hoaHvkpKSz4uLi4+KioowAAAAAAAAAAAAAAAAAAAAAHNz - c0B0dHS/dHR0/3R0dP9gYGD/NjY2/zs7O/9wcHD/m5ub/7y8vP/Ozs7/0NDQ/8PDzv+mpsn/eHjD/zg4 - u/8xMbf/ZGS1/4SEtf+Rkbf/lJS1/4yMrf+UlK7/ra22/62trv+Wlpb/ioqKv4uLi0AAAAAAAAAAAAAA - AAAAAAAAb29vQHBwcL9jY2P/S0tL/zY2Nv8mJib/KCgo/zw8PP9nZ2f/qKio/8rKyv/Pz87/wsLO/6am - yv94eMj/ODjJ/zAwxf9hYb7/cXG4/19fsv9YWLH/WVmz/3Jyt/+jo73/sLCy/5eXmP+Kioq/i4uLQAAA - AAAAAAAAAAAAAAAAAABvb29AcHBwv2VlZf9QUFD/PDw8/ygoKP8pKSn/Pz8//2pqav+pqan/ysrK/87O - zv/Gxs//sLDM/42NzP9cXND/VFTN/3d3w/90dLv/S0u0/zo6tf9AQL3/YWHC/5+fwv+xsbX/l5eZ/4qK - ir+Li4tAAAAAAAAAAAAAAAAAAAAAAHNzc0B1dXW/enp6/4WFhf9wcHD/PDw8/z8/P/94eHj/o6Oj/7+/ - v//Ozs7/0NDQ/83N0P/Gxs//uLjP/6Sk0f+ens3/paXD/42Nvv9VVb3/OzvB/0BAzP9hYc7/n5/H/7Gx - tf+Xl5n/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4eL+Hh4f/pqam/5ubm/9nZ2f/ampq/6Oj - o//ExMT/zMzM/9DQ0P/Q0ND/0dHR/9HR0f/OztH/ysrS/8bGzv/Cwsf/p6fE/3Z2xf9fX8r/YmLT/3t7 - 0/+oqMj/srK1/5iYmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4yMjP+0tLT/vb29/6io - qP+pqan/v7+//8zMzP/Pz8//0NDQ/9DQ0P/R0dH/0dHR/9DQ0f/OztH/zc3Q/8zMzf/Bwcz/r6/N/6am - z/+oqNP/r6/Q/7u7x/+0tLX/mJiZ/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6 - uv/Nzc3/yMjI/8fHx//Ly8v/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/8zM - zv/Kys7/ycnP/8nJz//IyMz/xMTG/7W1tf+ZmZn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4 - eL+Ojo7/uLi4/8zMzP/IyMj/xsbG/8fHx//IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI - yP/IyMj/yMjI/8fHyP/Hx8n/x8fJ/8bGyP/ExMT/tbW1/5mZmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAA - AAB3d3dAdnZ2v4aGhv+jo6P/r6+v/6qqqv+nqKj/pqio/6WpqP+lqaj/pamo/6WpqP+lqaj/pamo/6Wp - qP+lqaj/pamo/6WpqP+mqaj/pqio/6eoqP+oqKj/rKys/7Kysv+rq6v/lZWV/4qKir+Li4tAAAAAAAAA - AAAAAAAAAAAAAHNzc0B0dHS/dnZ2/3t7e/94eXn/b3Bw/2lsbP9nbm3/ZW9t/2Vvbf9lb23/ZW9t/2Vv - bf9lb23/ZW9t/2Vvbf9lb23/ZW9t/2Zvbf9obmz/am1s/2xtbP94eHj/j4+P/5eXl/+Pj4//ioqKv4uL - i0AAAAAAAAAAAAAAAAAAAAAAb29vQHFxcb9sbGz/Y2Nj/11eXv9bXV3/UWNf/0FtY/84c2b/NnNm/zZz - Zv82c2b/NnNm/zZzZv82c2b/NnNm/zZzZv82c2b/O3Bl/0RrYv9OZV//Vl5c/2VkZf95eHn/hYWF/4mJ - if+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XV9e/2xzcf9eioD/NKWM/x2z - kv8atJP/GLWT/xi1k/8YtZP/GLWT/xi1k/8YtZP/GLWT/xi1k/8krZD/PZ6J/1OOgf9oe3f/cXBx/25u - bv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX1//dH17/2Se - kf8swaD/DdSp/wnWqv8H16r/B9eq/wfXqv8H16r/B9eq/wfXqv8H16r/B9eq/xfNpv83uZ3/VaOS/3GK - hf93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xf - Xv90fXv/Y5+R/yjDof8J1qr/BNir/wLZq/8C2av/Atmr/wLZq/8C2av/Atmr/wLZq/8C2av/E8+m/zS6 - nf9To5L/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbGxsv2Vl - Zf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDbrP8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yMjL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtr - a0BsbGy/ZWVl/1dXV/9cX17/dH17/2Kfkv8mw6L/Bteq/wLZq/8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/xHQp/8zu53/UqSS/3CKhP93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAA - AAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfXv90fXv/Yp+S/ybDov8G16r/Atmr/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/EdCn/zO7nf9SpJL/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAA - AAAAAAAAAAAAAAAAAABra2tAbGxsv2VlZf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/ANus/wDbrP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yM - jL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX17/dH17/2Ofkf8ow6H/Cdaq/wTY - q/8C2qv/Atqr/wLaq/8C2qv/Atqr/wLaq/8C2qv/Atqr/xPPpv80up3/U6OS/3CKhP93d3f/aWlp/2xs - bP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfX/90fXv/ZJ6R/yzB - oP8N1Kn/Cdaq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/F82m/ze5nf9Vo5L/cYqE/3d3 - d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XWBf/210 - cv9fi4H/NaaN/x60k/8btpT/GbeU/xm3lP8Zt5T/GbeU/xm3lP8Zt5T/GbeU/xm3lP8lr5H/Pp+K/1SP - gv9pfHj/cnFx/25ubv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAG9vb0BxcXG/bGxs/2Rk - ZP9fYGD/XWBg/1RmYv9EcGb/O3Zp/zl2af85d2n/OXdp/zl3af85d2n/OXdp/zl3af85d2n/OXdp/z5z - aP9HbWX/UWdi/1lhX/9nZ2f/enp6/4WFhf+JiYn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAc3NzQHV1 - db9xcXH/aGho/2BgYP9XWFj/UVRU/09WVf9NV1X/TVdV/01XVf9NV1X/TVdV/01XVf9NV1X/TVdV/01X - Vf9NV1X/TldV/1BWVP9SVVT/VFVU/2FhYf95eXn/hoaG74iIiM+Li4uPioqKMAAAAAAAAAAAAAAAAAAA - AAB3d3dAeXl5v3R0dP9oaGj/YGBg/1paWv9XWFj/VlhY/1VZWP9VWVj/VVlY/1VZWP9VWVj/VVlY/1VZ - WP9VWVj/VVlY/1VZWP9WWVj/VlhY/1dYWP9YWFj/X19f/2xsbP91dXXPfX19cIqKijCPj48QAAAAAAAA - AAAAAAAAAAAAAHt7e0B8fHy/dXV1/2hoaP9gYGD/XFxc/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1pa - Wv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9eXl7/ZmZm/2lpab9ra2tAAAAAAAAA - AAAAAAAA8AAAP/AAAD/wAAAP8AAAD/AAAA/wAAAP8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAD/AAAA8oAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zMz - M/82Njb/ODg4/z57bv87fW//OH9v/zd/cP9DQ0P/SEhI/01NTf9MX1v/T15b/1FRUf9XV1f/VFlY/1dY - WP9TXFr/UF5b/1RcWv9YWln/Wlpa/1ldXP9aXFz/XFxc/11eXv9KYVz/TGBc/11lY/9UbWf/XWhm/1Jt - aP9HdWv/RnZs/1dzbf9Zcm3/THpw/0t8cf9gYGD/YGJi/2JiYv9hZGP/YWVk/2FmZP9kZGT/ZmZm/2Nq - af9ibmv/aGho/2pqav9pbGv/bGxs/25ubv9jcm//ZHNv/29xcf9tcnH/bnNy/2R6dv9ofHf/aHx4/2h/ - ev9sf3v/b357/3BwcP9ycnL/cXd2/3R0dP92dnb/cnl3/3N8ev90fHr/eHh4/3p6ev95fHv/en18/3x8 - fP9+fn7/NoBw/zuFdf88hHT/Q4Bz/0CCdP9Whnz/Uol9/2qAfP9sgHz/Skq5/0tLvP9PT77/UVG//1pa - uP9jY7T/Z2e1/2pqtv9mZrn/YWG+/2Rkv/9vb7n/bW28/3FxvP99fbj/SkrD/05Owv9RUcf/UlLI/25u - wf9pacr/dXXD/3l5xP9wcMr/cXHO/3p6yf87m4b/PpiE/zych/8crY7/HqyN/x2vj/8ero//K6SK/yym - i/8mqIv/IKuN/yepjP8hrY7/OLKX/zS2mf84spj/M7ud/zW6nf8wvp//Lr+g/1Sdjf9Ymov/WJqM/1if - kP9piIL/aoiB/2qMhf9To5H/V6CQ/1Kkkv8ewp//D8yj/wvOpP8OzaT/DM6k/w7OpP8Yx6H/EM2j/xbN - pv8Wzqb/Gcyl/wbXqv8P0qj/CNaq/wPZq/8E2Kv/Btiq/wDarP8R0aj/gICA/4KCgv+DhIT/hISE/4aG - hv+IiIj/ioqK/4yMjP+Ojo7/j4+Q/5CQkP+SkpL/lJSU/5aWl/+YmJj/mpqa/5ubnf+cnJ3/np6i/5yc - pP+Tk6//n5+p/4qKsf+Kirf/gYG5/5WVv/+amrr/nqKh/6Ghof+jpKT/pKSk/6ampv+lpan/pqau/6mp - qf+rq67/ra2t/6KisP+lpbL/qamz/66usv+mprn/pKS+/7CwsP+1tbX/srK4/7e3uv+xsb7/t7e+/7i4 - uP+9vb7/hobA/4ODxv+KisD/h4fP/5aWw/+amsH/nJzD/5iYxv+QkM3/mprM/6Kixf+oqMT/o6PJ/6Wl - y/+goM7/qqrN/7KywP+zs8X/u7vA/76+wf+6usX/vb3H/7e3yf+wsM3/u7vL/7+/yv++vs3/oKDQ/7Gx - 0P+/wMD/wMHB/8TExf/Bwcr/wMDN/8bGzf/Jycn/y8vN/83Nzf/BwdD/ycnQ/83N0P/Q0ND/AAAA/wBM - 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 - qv8K1qr/Ctaq/0mvmf9/fn//YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UFBQ/4CNiv8J1qr/ANus/wDb - rP8A26z/ANus/wDbrP9EsZn/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAbGxs/1BQUP+AjYr/Cdaq/wDb - rP8A26z/ANus/wDbrP8A26z/RLGZ/39+fv9iYmL/jIyM/wAAAAAAAAAAAAAAAGxsbP9QUFD/gI2K/wnW - qv8A26z/ANus/wDbrP8A26z/ANus/0Sxmf9/fn7/YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UVFR/4GN - iv8S0qj/Cteq/wrXqv8K16r/Cteq/wrXqv9Jr5n/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAc3Nz/2Vl - Zf9RUlL/SldU/0lXVP9JV1T/SVdU/0lXVP9JV1T/TlRT/1NTU/+Pj4//i4uL/wAAAAAAAAAAAAAAAHx8 - fP9iYmL/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9bW1v/ampq/wAAAAAAAAAAwAcAAMAD - AADAAwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAMAACgA - AAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAcHBz/IyMj/yQkJP8lJSX/TU5O/09P - T/9KUU//RVNQ/0ZTUP9OVFP/SVdU/0pXVP9QUFD/UVFR/1FSUv9TU1P/Wlpa/1tbW/9iYmL/Y2Nj/2Vl - Zf9mZmb/aWlp/2pqav9sbGz/bm5u/3Nzc/90dHT/dnZ2/3h4eP95eXn/fHx8/39+fv8YGK//Nzes/0ND - uv94eL7/GBjS/zo6wv9CQtr/Sa+Z/0Sxmf8J1qr/Ctaq/wDbrP8S0qj/gYGB/4ODg/+AjYr/gY2K/4uL - i/+MjIz/jo6O/4+Pj/+QkJD/lpaW/4CAsv+goKX/rKys/62trf+2trb/t7e3/7i4uP+5ubn/u7u7/7i4 - vf+6ur//mJjH/5iYyf++vsP/vr7E/8PDw//Gxsb/x8fH/8PDzP/Nzc3/zs7P/8/Pz//GxtP/ysrS/8vL - 0//Q0ND/0dHR/9LS0f/T09P//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VVUfFhYWFhYWFxYVNVVVVVVV - HlRTU009P1NLLjIvVVVVVR1RSFFSPjxKTD03G1VVVVUcNgE6UVNDIThBOT4yVVVVGQIAA0hSRCUkIiNF - MlVVVR07A0BRUlJOQiYnRjJVVVUdUkhRUlJSUlJPUEcyVVVVHktISEhISEhISElHMlVVVRoTBAgHBwcH - BwYFNDJVVVUYDTEtKysrKysoIBIzVVVVGAwwKiwsLCwsKSASM1VVVRgMMCosLCwsLCkgEjNVVVUYDDAq - LCwsLCwpIBIzVVVVGA0xLSsrKysrKCASM1VVVRoUDgsKCgoKCgkPNTJVVVUfEhAQEBAQEBAQERdVVcAH - AADAAwAAwAMAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAD - AAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.cs b/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.cs deleted file mode 100644 index b1a42261eb..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.cs +++ /dev/null @@ -1,382 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; -using System.IO; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ColorChooserForm : Form - { - private ColorChooserForm() - { - InitializeComponent(); - } - - private readonly Color[] _colors = new Color[12]; - - // gambatte's default dmg colors - private static readonly int[] DefaultCGBColors = - { - 0x00ffffff, 0x00aaaaaa, 0x00555555, 0x00000000, - 0x00ffffff, 0x00aaaaaa, 0x00555555, 0x00000000, - 0x00ffffff, 0x00aaaaaa, 0x00555555, 0x00000000 - }; - - // bsnes's default dmg colors with slight tweaking - private static readonly int[] DefaultDMGColors = - { - 10798341, 8956165, 1922333, 337157, - 10798341, 8956165, 1922333, 337157, - 10798341, 8956165, 1922333, 337157 - }; - - private void RefreshAllBackdrops() - { - panel1.BackColor = _colors[0]; - panel2.BackColor = _colors[1]; - panel3.BackColor = _colors[2]; - panel4.BackColor = _colors[3]; - panel5.BackColor = _colors[4]; - panel6.BackColor = _colors[5]; - panel7.BackColor = _colors[6]; - panel8.BackColor = _colors[7]; - panel9.BackColor = _colors[8]; - panel10.BackColor = _colors[9]; - panel11.BackColor = _colors[10]; - panel12.BackColor = _colors[11]; - } - - private Color Betweencolor(Color left, Color right, double pos) - { - int r = (int)(right.R * pos + left.R * (1.0 - pos) + 0.5); - int g = (int)(right.G * pos + left.G * (1.0 - pos) + 0.5); - int b = (int)(right.B * pos + left.B * (1.0 - pos) + 0.5); - int a = (int)(right.A * pos + left.A * (1.0 - pos) + 0.5); - - return Color.FromArgb(a, r, g, b); - } - - private void InterpolateColors(int firstindex, int lastindex) - { - for (int i = firstindex + 1; i < lastindex; i++) - { - double pos = (i - firstindex) / (double)(lastindex - firstindex); - _colors[i] = Betweencolor(_colors[firstindex], _colors[lastindex], pos); - } - - RefreshAllBackdrops(); - } - - private void Button3_Click(object sender, EventArgs e) - { - InterpolateColors(0, 3); - } - - private void Button4_Click(object sender, EventArgs e) - { - InterpolateColors(4, 7); - } - - private void Button5_Click(object sender, EventArgs e) - { - InterpolateColors(8, 11); - } - - private void Panel12_DoubleClick(object sender, EventArgs e) - { - Panel psender = (Panel)sender; - - int i; - if (psender == panel1) - i = 0; - else if (psender == panel2) - i = 1; - else if (psender == panel3) - i = 2; - else if (psender == panel4) - i = 3; - else if (psender == panel5) - i = 4; - else if (psender == panel6) - i = 5; - else if (psender == panel7) - i = 6; - else if (psender == panel8) - i = 7; - else if (psender == panel9) - i = 8; - else if (psender == panel10) - i = 9; - else if (psender == panel11) - i = 10; - else if (psender == panel12) - i = 11; - else - return; // i = -1; - - using (var dlg = new ColorDialog()) - { - dlg.AllowFullOpen = true; - dlg.AnyColor = true; - dlg.Color = _colors[i]; - - // custom colors are ints, not Color structs? - // and they don't work right unless the alpha bits are set to 0 - // and the rgb order is switched - int[] customs = new int[12]; - for (int j = 0; j < customs.Length; j++) - { - customs[j] = _colors[j].R | _colors[j].G << 8 | _colors[j].B << 16; - } - - dlg.CustomColors = customs; - dlg.FullOpen = true; - - var result = dlg.ShowDialog(this); - - if (result == DialogResult.OK) - { - if (_colors[i] != dlg.Color) - { - _colors[i] = dlg.Color; - psender.BackColor = _colors[i]; - } - } - } - } - - // ini keys for gambatte palette file - private static readonly string[] Paletteinikeys = - { - "Background0", - "Background1", - "Background2", - "Background3", - "Sprite%2010", - "Sprite%2011", - "Sprite%2012", - "Sprite%2013", - "Sprite%2020", - "Sprite%2021", - "Sprite%2022", - "Sprite%2023" - }; - - /// - /// load gambatte-style .pal file - /// - /// null on failure - public static int[] LoadPalFile(TextReader f) - { - var lines = new Dictionary(); - - string line; - while ((line = f.ReadLine()) != null) - { - int i = line.IndexOf('='); - if (i < 0) - { - continue; - } - - try - { - lines.Add(line.Substring(0, i), int.Parse(line.Substring(i + 1))); - } - catch (FormatException) - { - } - } - - int[] ret = new int[12]; - try - { - for (int i = 0; i < 12; i++) - { - ret[i] = lines[Paletteinikeys[i]]; - } - } - catch (KeyNotFoundException) - { - return null; - } - - return ret; - } - - // save gambatte-style palette file - private static void SavePalFile(TextWriter f, int[] colors) - { - f.WriteLine("[General]"); - for (int i = 0; i < 12; i++) - { - f.WriteLine($"{Paletteinikeys[i]}={colors[i]}"); - } - } - - private void SetAllColors(int[] colors) - { - // fix alpha to 255 in created color objects, else problems - for (int i = 0; i < _colors.Length; i++) - { - _colors[i] = Color.FromArgb(255, Color.FromArgb(colors[i])); - } - - RefreshAllBackdrops(); - } - - private static void DoColorChooserFormDialog(IWin32Window parent, Gameboy.GambatteSettings s, bool fromemu) - { - using (var dlg = new ColorChooserForm()) - { - var gb = Global.Emulator as Gameboy; - if (fromemu) - { - s = gb.GetSettings(); - } - - dlg.SetAllColors(s.GBPalette); - - var result = dlg.ShowDialog(parent); - if (result == DialogResult.OK) - { - int[] colorints = new int[12]; - for (int i = 0; i < 12; i++) - { - colorints[i] = dlg._colors[i].ToArgb(); - } - - s.GBPalette = colorints; - if (fromemu) - { - gb.PutSettings(s); - } - } - } - } - - public static void DoColorChooserFormDialog(IWin32Window parent, Gameboy.GambatteSettings s) - { - DoColorChooserFormDialog(parent, s, false); - } - - private void LoadColorFile(string filename, bool alert) - { - try - { - using (var f = new StreamReader(filename)) - { - int[] newcolors = LoadPalFile(f); - if (newcolors == null) - { - throw new Exception(); - } - - SetAllColors(newcolors); - } - } - catch - { - if (alert) - { - MessageBox.Show(this, "Error loading .pal file!"); - } - } - } - - private void SaveColorFile(string filename) - { - try - { - using (var f = new StreamWriter(filename)) - { - int[] savecolors = new int[12]; - for (int i = 0; i < 12; i++) - { - // clear alpha because gambatte color files don't usually contain it - savecolors[i] = _colors[i].ToArgb() & 0xffffff; - } - - SavePalFile(f, savecolors); - } - } - catch - { - MessageBox.Show(this, "Error saving .pal file!"); - } - } - - private void Button6_Click(object sender, EventArgs e) - { - using (var ofd = new OpenFileDialog()) - { - ofd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries["GB", "Palettes"].Path, "GB"); - ofd.Filter = "Gambatte Palettes (*.pal)|*.pal|All Files|*.*"; - ofd.RestoreDirectory = true; - - var result = ofd.ShowDialog(this); - if (result == DialogResult.OK) - { - LoadColorFile(ofd.FileName, true); - } - } - } - - private void ColorChooserForm_DragDrop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - - if (files.Length > 1) - { - return; - } - - LoadColorFile(files[0], true); - } - } - - private void ColorChooserForm_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) - ? DragDropEffects.Move - : DragDropEffects.None; - } - - private void Button7_Click(object sender, EventArgs e) - { - using (var sfd = new SaveFileDialog()) - { - sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries["GB", "Palettes"].Path, "GB"); - sfd.FileName = Global.Game.Name + ".pal"; - - sfd.Filter = "Gambatte Palettes (*.pal)|*.pal|All Files|*.*"; - sfd.RestoreDirectory = true; - var result = sfd.ShowDialog(this); - if (result == DialogResult.OK) - { - SaveColorFile(sfd.FileName); - } - } - } - - private void Ok_Click(object sender, EventArgs e) - { - } - - private void DefaultButton_Click(object sender, EventArgs e) - { - SetAllColors(DefaultDMGColors); - } - - private void DefaultButtonCGB_Click(object sender, EventArgs e) - { - SetAllColors(DefaultCGBColors); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.resx b/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.resx deleted file mode 100644 index f6a0374127..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/ColorChooserForm.resx +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAQAICAAAAEAIACoEAAARgAAACAgAAABAAgAqAgAAO4QAAAQEAAAAQAgAGgEAACWGQAAEBAAAAEA - CABoBQAA/h0AACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB7e3tAfHx8v3d3d/9tbW3/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lp - af9paWn/aWlp/2lpaf9oaGj/ZmZm/3BwcP+EhIT/jo6Ov4+Pj0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAHt7e0B6enq/fX19/4GBgf+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4KCgv+BgYH/fn5+/3x8 - fP98fHz/fn5+/4GBgf+CgoL/goKC/3x8fP9ycnL/dXV1/4WFhf+MjIzPiIiIcISEhDB/f38QAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAd3d3QHl5eb+JiYn/qKio/7i4uP+3t7f/t7e3/7e3t/+3t7f/tra2/7Gx - sf+oqKj/o6Oj/6SkpP+pqan/s7Oz/7a2tv+0tLT/paWl/4iIiP9+fn7/h4eH/4mJie+FhYXPgoKCj4SE - hDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4+Pj/+7u7v/0dHR/8/Pz//Pz8//0NDQ/9HR - 0f/Q0ND/ycnJ/729vf+3t7f/uLi4/729vv/IyMr/zs7P/83Nzv+9vb3/np6e/46Ojv+NjY3/ioqK/4KC - gv9+fn6/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6uv/Ozs7/ysrK/8rK - yv/Ozs7/0NDQ/9DQ0P/Kysr/vb29/7e3t/+3t7f/urq8/8LCx//IyM3/zMzO/8TExf+ysrL/o6Oj/5iY - mP+MjIz/fn5+/3Z2dr93d3dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3QHZ2dr+JiYn/ra2t/7e3 - t/+lpaX/p6en/7y8vP/Jycn/zs7O/8zMzP/Dw8L/urq9/7Kyu/+oqLz/nZ3C/6Cgxf+xscf/ubnD/7i4 - vP+vr7D/oKCh/5OTlP+JiYr/hYWFz4aGhnCKioowj4+PEAAAAAAAAAAAAAAAAAAAAAB3d3dAdXV1v4CA - gP+VlZX/ioqK/2BgYP9mZmb/mpqa/7u7u//Jycn/z8/O/8zMzP/AwMj/qqrE/4iIv/9ZWbn/Vla3/39/ - uP+cnLn/rq66/7GxtP+kpKf/n5+i/6Skpf+hoaHvkpKSz4uLi4+KioowAAAAAAAAAAAAAAAAAAAAAHNz - c0B0dHS/dHR0/3R0dP9gYGD/NjY2/zs7O/9wcHD/m5ub/7y8vP/Ozs7/0NDQ/8PDzv+mpsn/eHjD/zg4 - u/8xMbf/ZGS1/4SEtf+Rkbf/lJS1/4yMrf+UlK7/ra22/62trv+Wlpb/ioqKv4uLi0AAAAAAAAAAAAAA - AAAAAAAAb29vQHBwcL9jY2P/S0tL/zY2Nv8mJib/KCgo/zw8PP9nZ2f/qKio/8rKyv/Pz87/wsLO/6am - yv94eMj/ODjJ/zAwxf9hYb7/cXG4/19fsv9YWLH/WVmz/3Jyt/+jo73/sLCy/5eXmP+Kioq/i4uLQAAA - AAAAAAAAAAAAAAAAAABvb29AcHBwv2VlZf9QUFD/PDw8/ygoKP8pKSn/Pz8//2pqav+pqan/ysrK/87O - zv/Gxs//sLDM/42NzP9cXND/VFTN/3d3w/90dLv/S0u0/zo6tf9AQL3/YWHC/5+fwv+xsbX/l5eZ/4qK - ir+Li4tAAAAAAAAAAAAAAAAAAAAAAHNzc0B1dXW/enp6/4WFhf9wcHD/PDw8/z8/P/94eHj/o6Oj/7+/ - v//Ozs7/0NDQ/83N0P/Gxs//uLjP/6Sk0f+ens3/paXD/42Nvv9VVb3/OzvB/0BAzP9hYc7/n5/H/7Gx - tf+Xl5n/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4eL+Hh4f/pqam/5ubm/9nZ2f/ampq/6Oj - o//ExMT/zMzM/9DQ0P/Q0ND/0dHR/9HR0f/OztH/ysrS/8bGzv/Cwsf/p6fE/3Z2xf9fX8r/YmLT/3t7 - 0/+oqMj/srK1/5iYmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4yMjP+0tLT/vb29/6io - qP+pqan/v7+//8zMzP/Pz8//0NDQ/9DQ0P/R0dH/0dHR/9DQ0f/OztH/zc3Q/8zMzf/Bwcz/r6/N/6am - z/+oqNP/r6/Q/7u7x/+0tLX/mJiZ/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6 - uv/Nzc3/yMjI/8fHx//Ly8v/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/8zM - zv/Kys7/ycnP/8nJz//IyMz/xMTG/7W1tf+ZmZn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4 - eL+Ojo7/uLi4/8zMzP/IyMj/xsbG/8fHx//IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI - yP/IyMj/yMjI/8fHyP/Hx8n/x8fJ/8bGyP/ExMT/tbW1/5mZmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAA - AAB3d3dAdnZ2v4aGhv+jo6P/r6+v/6qqqv+nqKj/pqio/6WpqP+lqaj/pamo/6WpqP+lqaj/pamo/6Wp - qP+lqaj/pamo/6WpqP+mqaj/pqio/6eoqP+oqKj/rKys/7Kysv+rq6v/lZWV/4qKir+Li4tAAAAAAAAA - AAAAAAAAAAAAAHNzc0B0dHS/dnZ2/3t7e/94eXn/b3Bw/2lsbP9nbm3/ZW9t/2Vvbf9lb23/ZW9t/2Vv - bf9lb23/ZW9t/2Vvbf9lb23/ZW9t/2Zvbf9obmz/am1s/2xtbP94eHj/j4+P/5eXl/+Pj4//ioqKv4uL - i0AAAAAAAAAAAAAAAAAAAAAAb29vQHFxcb9sbGz/Y2Nj/11eXv9bXV3/UWNf/0FtY/84c2b/NnNm/zZz - Zv82c2b/NnNm/zZzZv82c2b/NnNm/zZzZv82c2b/O3Bl/0RrYv9OZV//Vl5c/2VkZf95eHn/hYWF/4mJ - if+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XV9e/2xzcf9eioD/NKWM/x2z - kv8atJP/GLWT/xi1k/8YtZP/GLWT/xi1k/8YtZP/GLWT/xi1k/8krZD/PZ6J/1OOgf9oe3f/cXBx/25u - bv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX1//dH17/2Se - kf8swaD/DdSp/wnWqv8H16r/B9eq/wfXqv8H16r/B9eq/wfXqv8H16r/B9eq/xfNpv83uZ3/VaOS/3GK - hf93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xf - Xv90fXv/Y5+R/yjDof8J1qr/BNir/wLZq/8C2av/Atmr/wLZq/8C2av/Atmr/wLZq/8C2av/E8+m/zS6 - nf9To5L/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbGxsv2Vl - Zf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDbrP8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yMjL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtr - a0BsbGy/ZWVl/1dXV/9cX17/dH17/2Kfkv8mw6L/Bteq/wLZq/8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/xHQp/8zu53/UqSS/3CKhP93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAA - AAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfXv90fXv/Yp+S/ybDov8G16r/Atmr/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/EdCn/zO7nf9SpJL/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAA - AAAAAAAAAAAAAAAAAABra2tAbGxsv2VlZf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/ANus/wDbrP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yM - jL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX17/dH17/2Ofkf8ow6H/Cdaq/wTY - q/8C2qv/Atqr/wLaq/8C2qv/Atqr/wLaq/8C2qv/Atqr/xPPpv80up3/U6OS/3CKhP93d3f/aWlp/2xs - bP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfX/90fXv/ZJ6R/yzB - oP8N1Kn/Cdaq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/F82m/ze5nf9Vo5L/cYqE/3d3 - d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XWBf/210 - cv9fi4H/NaaN/x60k/8btpT/GbeU/xm3lP8Zt5T/GbeU/xm3lP8Zt5T/GbeU/xm3lP8lr5H/Pp+K/1SP - gv9pfHj/cnFx/25ubv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAG9vb0BxcXG/bGxs/2Rk - ZP9fYGD/XWBg/1RmYv9EcGb/O3Zp/zl2af85d2n/OXdp/zl3af85d2n/OXdp/zl3af85d2n/OXdp/z5z - aP9HbWX/UWdi/1lhX/9nZ2f/enp6/4WFhf+JiYn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAc3NzQHV1 - db9xcXH/aGho/2BgYP9XWFj/UVRU/09WVf9NV1X/TVdV/01XVf9NV1X/TVdV/01XVf9NV1X/TVdV/01X - Vf9NV1X/TldV/1BWVP9SVVT/VFVU/2FhYf95eXn/hoaG74iIiM+Li4uPioqKMAAAAAAAAAAAAAAAAAAA - AAB3d3dAeXl5v3R0dP9oaGj/YGBg/1paWv9XWFj/VlhY/1VZWP9VWVj/VVlY/1VZWP9VWVj/VVlY/1VZ - WP9VWVj/VVlY/1VZWP9WWVj/VlhY/1dYWP9YWFj/X19f/2xsbP91dXXPfX19cIqKijCPj48QAAAAAAAA - AAAAAAAAAAAAAHt7e0B8fHy/dXV1/2hoaP9gYGD/XFxc/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1pa - Wv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9eXl7/ZmZm/2lpab9ra2tAAAAAAAAA - AAAAAAAA8AAAP/AAAD/wAAAP8AAAD/AAAA/wAAAP8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAD/AAAA8oAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zMz - M/82Njb/ODg4/z57bv87fW//OH9v/zd/cP9DQ0P/SEhI/01NTf9MX1v/T15b/1FRUf9XV1f/VFlY/1dY - WP9TXFr/UF5b/1RcWv9YWln/Wlpa/1ldXP9aXFz/XFxc/11eXv9KYVz/TGBc/11lY/9UbWf/XWhm/1Jt - aP9HdWv/RnZs/1dzbf9Zcm3/THpw/0t8cf9gYGD/YGJi/2JiYv9hZGP/YWVk/2FmZP9kZGT/ZmZm/2Nq - af9ibmv/aGho/2pqav9pbGv/bGxs/25ubv9jcm//ZHNv/29xcf9tcnH/bnNy/2R6dv9ofHf/aHx4/2h/ - ev9sf3v/b357/3BwcP9ycnL/cXd2/3R0dP92dnb/cnl3/3N8ev90fHr/eHh4/3p6ev95fHv/en18/3x8 - fP9+fn7/NoBw/zuFdf88hHT/Q4Bz/0CCdP9Whnz/Uol9/2qAfP9sgHz/Skq5/0tLvP9PT77/UVG//1pa - uP9jY7T/Z2e1/2pqtv9mZrn/YWG+/2Rkv/9vb7n/bW28/3FxvP99fbj/SkrD/05Owv9RUcf/UlLI/25u - wf9pacr/dXXD/3l5xP9wcMr/cXHO/3p6yf87m4b/PpiE/zych/8crY7/HqyN/x2vj/8ero//K6SK/yym - i/8mqIv/IKuN/yepjP8hrY7/OLKX/zS2mf84spj/M7ud/zW6nf8wvp//Lr+g/1Sdjf9Ymov/WJqM/1if - kP9piIL/aoiB/2qMhf9To5H/V6CQ/1Kkkv8ewp//D8yj/wvOpP8OzaT/DM6k/w7OpP8Yx6H/EM2j/xbN - pv8Wzqb/Gcyl/wbXqv8P0qj/CNaq/wPZq/8E2Kv/Btiq/wDarP8R0aj/gICA/4KCgv+DhIT/hISE/4aG - hv+IiIj/ioqK/4yMjP+Ojo7/j4+Q/5CQkP+SkpL/lJSU/5aWl/+YmJj/mpqa/5ubnf+cnJ3/np6i/5yc - pP+Tk6//n5+p/4qKsf+Kirf/gYG5/5WVv/+amrr/nqKh/6Ghof+jpKT/pKSk/6ampv+lpan/pqau/6mp - qf+rq67/ra2t/6KisP+lpbL/qamz/66usv+mprn/pKS+/7CwsP+1tbX/srK4/7e3uv+xsb7/t7e+/7i4 - uP+9vb7/hobA/4ODxv+KisD/h4fP/5aWw/+amsH/nJzD/5iYxv+QkM3/mprM/6Kixf+oqMT/o6PJ/6Wl - y/+goM7/qqrN/7KywP+zs8X/u7vA/76+wf+6usX/vb3H/7e3yf+wsM3/u7vL/7+/yv++vs3/oKDQ/7Gx - 0P+/wMD/wMHB/8TExf/Bwcr/wMDN/8bGzf/Jycn/y8vN/83Nzf/BwdD/ycnQ/83N0P/Q0ND/AAAA/wBM - TExJSURDQ0NDQ0FBQUFBOUFCQ0A0RKOoqaelo6QAAExMTE2ipqmpqaqqqaimpKWnqKmno0lJo6enpqOl - pQAASUlJoqq+xs3Nzc3NxMC+vb/FxsazqqWnqKalo6KiAABISEmirs30+Pj4+PTz087O0PL0886+r6qo - paJNTaOoAEhISKOvzfP09Pj6/vjy09DS6e716M2+r6qmoqKlp6kASEhITaq/xL7BzvT6+PTn0cza2+DR - z8W/r6qpqKipqABERERJpKmlQ0SvzfT5+Org12Nj1bzLyLW1tLOvq6ipAENDQ0NBNBkJCjOvzvj97+Ft - Wlhfurm5uLbHwbCsqagAQEBBNDAQCAEDDUnB9Pn24nBpZmBkXlxdZbzIsqyoqQBBQUE0MBgJAgMNS8T0 - +fvs3W9rbGNbV1pq2ce0rKmoAEREQ0RJSDANDUOx0/j+/fvx8N7c1WBnaW7ZybOsqakARERITaiwq0lM - s9P4+v7+/fz77+vf1m5v2N/Js6yoqABISEmircTNwcHT+Pr+/v7+/vr59+7k4/Dk5sqzrKmpAEhISKKu - zfPz8/T5+P36+vr6/vr59/f1+/bozb6tqKgASEhJoq7G1PPy8vP08/Pz8/Pz8/Py8+ry6NTNs6ypqQBI - SERMp7G/v769vb29vb29vb29vb29vr7BxMCwqqioAENDRERMTaJKRz9VVVVVVVVVPVU+Pz9GSqSsrqyq - qakAQEBAQDMxLS4jJVJQUE9PT09PT1BRJCMvN0mlqKioqAA0NDQzLSYqNVNzfHV2dHZ0dnR2fXhyVDo4 - QUmjqKmpADMzMzEsGSo7h3+VlJSbk5uTm5OUj4CFiUJAQU2nqakAMzMzMSwZKz6Ig6GfnZ2dnZ2dnZyZ - go6LRTRBTaepqQAzMzMwKBcrPY2Em5+goKCgoKCgn5iBjotFNEBNp6mpADMzMzEsGSs9jYSbnaCgoKCg - oKCemIGOi0U0QU2nqakAMzMzMCgYKz2NhJudnaCgoKCgoJ+YgY6LRTRATaepqQAzMzMxLBkrPYiDm52g - oKCgoKCgnpiBjotFNEFNp6mpADMzMzAoGCtViIShn52dnZ2dnZ2cmYKMi0U0QE2nqakAMzMzMSwZKzyH - f5WUk5GRkZGRkZaPgIWJRTRDoqepqQA0NDQzLScqNlNzfHV3dnZ2dnZ2fXlyVDs5QUijp6ipAEFBQUAz - LCccHSEFB05OTk5OTk4GBCAfHjJEoqaoqakAQ0NDQTQwJhcTDBsaGhoaGhoaGhoLDBMWLEOipqioqABJ - SUlIQTEoFRQQDw8PDw8PDw8PDw8QEBUoNEiipqmpAElJSUhBMCYYFBQUFBQUFBQUFBQUFBQUFSYtM0FM - p6jwAAA/8AAAP/AAAA/wAAAP8AAAD/AAAA/wAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAP8AAADygAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 - fP9paWn/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2ZmZv+Pj4//AAAAAAAAAAAAAAAAAAAAAAAA - AAB5eXn/09PT/9LS0v/S0tL/z8/P/7e3t/+5ubn/0tLS/83Nzf+BgYH/i4uL/4ODg/8AAAAAAAAAAAAA - AAAAAAAAeHh4/9DQ0P/Gxsb/0NDQ/9HR0f+4uLj/tra2/8PDzP/Ozs//t7e3/5aWlv90dHT/AAAAAAAA - AAAAAAAAAAAAAHZ2dv+QkJD/IyMj/6ysrP/Q0ND/0tLR/5iYx/8YGK//gICy/7i4vf+goKX/uLi4/4uL - i/8AAAAAAAAAAAAAAABubm7/JCQk/xwcHP8lJSX/xsbG/9HR0f+YmMn/GBjS/3h4vv83N6z/Q0O6/76+ - w/+Li4v/AAAAAAAAAAAAAAAAeHh4/62trf8lJSX/u7u7/9DQ0P/R0dH/0dHR/8bG0/+6ur//OjrC/0JC - 2v++vsT/i4uL/wAAAAAAAAAAAAAAAHh4eP/R0dH/xsbG/9DQ0P/R0dH/0dHR/9HR0f/R0dH/0dHR/8rK - 0v/Ly9P/w8PD/4uLi/8AAAAAAAAAAAAAAAB5eXn/zc3N/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xsbG/8bG - xv/Gxsb/x8fH/8PDw/+Li4v/AAAAAAAAAAAAAAAAc3Nz/2NjY/9NTk7/RlNQ/0VTUP9FU1D/RVNQ/0VT - UP9FU1D/SlFP/09PT/+Ojo7/i4uL/wAAAAAAAAAAAAAAAGxsbP9RUVH/gY2K/xLSqP8K1qr/Ctaq/wrW - qv8K1qr/Ctaq/0mvmf9/fn//YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UFBQ/4CNiv8J1qr/ANus/wDb - rP8A26z/ANus/wDbrP9EsZn/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAbGxs/1BQUP+AjYr/Cdaq/wDb - rP8A26z/ANus/wDbrP8A26z/RLGZ/39+fv9iYmL/jIyM/wAAAAAAAAAAAAAAAGxsbP9QUFD/gI2K/wnW - qv8A26z/ANus/wDbrP8A26z/ANus/0Sxmf9/fn7/YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UVFR/4GN - iv8S0qj/Cteq/wrXqv8K16r/Cteq/wrXqv9Jr5n/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAc3Nz/2Vl - Zf9RUlL/SldU/0lXVP9JV1T/SVdU/0lXVP9JV1T/TlRT/1NTU/+Pj4//i4uL/wAAAAAAAAAAAAAAAHx8 - fP9iYmL/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9bW1v/ampq/wAAAAAAAAAAwAcAAMAD - AADAAwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAMAACgA - AAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAcHBz/IyMj/yQkJP8lJSX/TU5O/09P - T/9KUU//RVNQ/0ZTUP9OVFP/SVdU/0pXVP9QUFD/UVFR/1FSUv9TU1P/Wlpa/1tbW/9iYmL/Y2Nj/2Vl - Zf9mZmb/aWlp/2pqav9sbGz/bm5u/3Nzc/90dHT/dnZ2/3h4eP95eXn/fHx8/39+fv8YGK//Nzes/0ND - uv94eL7/GBjS/zo6wv9CQtr/Sa+Z/0Sxmf8J1qr/Ctaq/wDbrP8S0qj/gYGB/4ODg/+AjYr/gY2K/4uL - i/+MjIz/jo6O/4+Pj/+QkJD/lpaW/4CAsv+goKX/rKys/62trf+2trb/t7e3/7i4uP+5ubn/u7u7/7i4 - vf+6ur//mJjH/5iYyf++vsP/vr7E/8PDw//Gxsb/x8fH/8PDzP/Nzc3/zs7P/8/Pz//GxtP/ysrS/8vL - 0//Q0ND/0dHR/9LS0f/T09P//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VVUfFhYWFhYWFxYVNVVVVVVV - HlRTU009P1NLLjIvVVVVVR1RSFFSPjxKTD03G1VVVVUcNgE6UVNDIThBOT4yVVVVGQIAA0hSRCUkIiNF - MlVVVR07A0BRUlJOQiYnRjJVVVUdUkhRUlJSUlJPUEcyVVVVHktISEhISEhISElHMlVVVRoTBAgHBwcH - BwYFNDJVVVUYDTEtKysrKysoIBIzVVVVGAwwKiwsLCwsKSASM1VVVRgMMCosLCwsLCkgEjNVVVUYDDAq - LCwsLCwpIBIzVVVVGA0xLSsrKysrKCASM1VVVRoUDgsKCgoKCgkPNTJVVVUfEhAQEBAQEBAQERdVVcAH - AADAAwAAwAMAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAD - AAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.cs b/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.cs deleted file mode 100644 index a63639f7cc..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class DGBPrefs : Form - { - private DGBPrefs() - { - InitializeComponent(); - } - - private void PutSettings(GambatteLink.GambatteLinkSettings s, GambatteLink.GambatteLinkSyncSettings ss) - { - gbPrefControl1.PutSettings(s.L, ss.L); - gbPrefControl2.PutSettings(s.R, ss.R); - } - - private void GetSettings(out GambatteLink.GambatteLinkSettings s, out GambatteLink.GambatteLinkSyncSettings ss) - { - Gameboy.GambatteSettings sl; - Gameboy.GambatteSyncSettings ssl; - Gameboy.GambatteSettings sr; - Gameboy.GambatteSyncSettings ssr; - gbPrefControl1.GetSettings(out sl, out ssl); - gbPrefControl2.GetSettings(out sr, out ssr); - - s = new GambatteLink.GambatteLinkSettings(sl, sr); - ss = new GambatteLink.GambatteLinkSyncSettings(ssl, ssr); - } - - private bool SyncSettingsChanged => gbPrefControl1.SyncSettingsChanged || gbPrefControl2.SyncSettingsChanged; - - public static void DoDGBPrefsDialog(IWin32Window owner) - { - var gambatte = (GambatteLink)Global.Emulator; - var s = gambatte.GetSettings(); - var ss = gambatte.GetSyncSettings(); - - using (var dlg = new DGBPrefs()) - { - dlg.PutSettings(s, ss); - - var emu = (GambatteLink)Global.Emulator; - dlg.gbPrefControl1.ColorGameBoy = emu.IsCGBMode(false); - dlg.gbPrefControl2.ColorGameBoy = emu.IsCGBMode(true); - - if (dlg.ShowDialog(owner) == DialogResult.OK) - { - dlg.GetSettings(out s, out ss); - gambatte.PutSettings(s); - if (dlg.SyncSettingsChanged) - { - GlobalWin.MainForm.PutCoreSyncSettings(ss); - } - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.resx b/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.resx deleted file mode 100644 index d794d13b51..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/DGBPrefs.resx +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAYAMDAAAAEAIACoJQAAZgAAADAwAAABAAgAqA4AAA4mAAAgIAAAAQAgAKgQAAC2NAAAICAAAAEA - CACoCAAAXkUAABAQAAABACAAaAQAAAZOAAAQEAAAAQAIAGgFAABuUgAAKAAAADAAAABgAAAAAQAgAAAA - AAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACAgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CA - gP+AgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/4CA - gP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACAgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CA - gP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACAgID/gICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CAgP+AgID/gICA/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACAgID/gICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/4CA - gP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDg4P/iYmJ/46O - jv+UlJT/mZmZ/56env+kpKT/qamp/6+vr/+0tLT/ubm5/7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAACDg4P/iYmJ/46Ojv+UlJT/mZmZ/56env+kpKT/qamp/6+v - r/+0tLT/ubm5/7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAA - AACFhYX/ioqK/5CQkP+VlZX/mpqa/6CgoP+lpaX/q6ur/7CwsP+1tbX/u7u7/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAACFhYX/ioqK/5CQkP+VlZX/mpqa/6Cg - oP+lpaX/q6ur/7CwsP+1tbX/u7u7/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/wAAAACGhob/jIyM/zAwMP8wMDD/QEBA/zAwMP8wMDD/QEBA/zAwMP8wMDD/QEBA/zAw - MP8wMDD/QEBA/zAwMP8wMDD/QEBA/zAwMP8wMDD/QEBA/zAwMP/AwMD/wMDA/wAAAACGhob/jIyM//8+ - I///PiP//z4j//8+I///PiP//z4j//8+I///PiP//z4j//8+I///PiP//z4j//8+I///PiP//z4j//8+ - I///PiP//z4j//8+I//AwMD/wMDA/wAAAACIiIj/jY2N/0BAQP9AQED/QEBA/0BAQP9AQED/QEBA/0BA - QP9AQED/QEBA/0BAQP9AQED/QEBA/0BAQP9AQED/QEBA/0BAQP9AQED/QEBA/0BAQP/AwMD/wMDA/wAA - AACIiIj/jY2N//9BKf//QSn//0Ep//9BKf//QSn//0Ep//9BKf//QSn//0Ep//9BKf//QSn//0Ep//9B - Kf//QSn//0Ep//9BKf//QSn//0Ep//9BKf/AwMD/wMDA/wAAAACJiYn/j4+P//9FLv//RS7//0Uu//9F - Lv//RS7//0Uu//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9F - Lv/AwMD/wMDA/wAAAACJiYn/j4+P//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9F - Lv//RS7//0Uu//9FLv//RS7//0Uu//9FLv//RS7//0Uu//9FLv/AwMD/wMDA/wAAAACLi4v/kJCQ//9I - M///SDP//0gz//9IM///SDP//0gz//9IM///SDP//0gz//9IM///SDP//0gz//9IM///SDP//0gz//9I - M///SDP//0gz//9IM//AwMD/wMDA/wAAAACLi4v/kJCQ//9IM///SDP//0gz//9IM///SDP//0gz//9I - M///SDP//0gz//9IM///SDP//0gz//9IM///SDP//0gz//9IM///SDP//0gz//9IM//AwMD/wMDA/wAA - AACMjIz/kpKS//9MOP//TDj//0w4//9MOP//TDj//0w4//9MOP//TDj//0w4//9MOP//TDj//0w4//9M - OP//TDj//0w4//9MOP//TDj//0w4//9MOP/AwMD/wMDA/wAAAACMjIz/kpKS//9MOP//TDj//0w4//9M - OP//TDj//0w4//9MOP//TDj//0w4//9MOP//TDj//0w4//9MOP//TDj//0w4//9MOP//TDj//0w4//9M - OP/AwMD/wMDA/wAAAACOjo7/k5OT//9QPv//UD7//1A+//9QPv//UD7//1A+//9QPv//UD7//1A+//9Q - Pv//UD7//1A+//9QPv//UD7//1A+//9QPv//UD7//1A+//9QPv/AwMD/wMDA/wAAAACOjo7/k5OT//9Q - Pv//UD7//1A+//9QPv//UD7//1A+//9QPv//UD7//1A+//9QPv//UD7//1A+//9QPv//UD7//1A+//9Q - Pv//UD7//1A+//9QPv/AwMD/wMDA/wAAAACPj4//lZWV//9TQ///U0P//1ND//9TQ///U0P//1ND//9T - Q///U0P//1ND//9TQ///U0P//1ND//9TQ///U0P//1ND//9TQ///U0P//1ND//9TQ//AwMD/wMDA/wAA - AACPj4//lZWV//9TQ///U0P//1ND//9TQ///U0P//1ND//9TQ///U0P//1ND//9TQ///U0P//1ND//9T - Q///U0P//1ND//9TQ///U0P//1ND//9TQ//AwMD/wMDA/wAAAACRkZH/lpaW//9XSP//V0j//1dI//9X - SP//V0j//1dI//9XSP//V0j//1dI//9XSP//V0j//1dI//9XSP//V0j//1dI//9XSP//V0j//1dI//9X - SP/AwMD/wMDA/wAAAACRkZH/lpaW//9XSP//V0j//1dI//9XSP//V0j//1dI//9XSP//V0j//1dI//9X - SP//V0j//1dI//9XSP//V0j//1dI//9XSP//V0j//1dI//9XSP/AwMD/wMDA/wAAAACSkpL/mJiY//9a - Tf//Wk3//1pN//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9a - Tf//Wk3//1pN//9aTf/AwMD/wMDA/wAAAACSkpL/mJiY//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9a - Tf//Wk3//1pN//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9aTf//Wk3//1pN//9aTf/AwMD/wMDA/wAA - AACUlJT/mZmZ//9eUv//XlL//15S//9eUv//XlL//15S//9eUv//XlL//15S//9eUv//XlL//15S//9e - Uv//XlL//15S//9eUv//XlL//15S//9eUv/AwMD/wMDA/wAAAACUlJT/mZmZ//9eUv//XlL//15S//9e - Uv//XlL//15S//9eUv//XlL//15S//9eUv//XlL//15S//9eUv//XlL//15S//9eUv//XlL//15S//9e - Uv/AwMD/wMDA/wAAAACVlZX/mpqa//9hV///YVf//2FX//9hV///YVf//2FX//9hV///YVf//2FX//9h - V///YVf//2FX//9hV///YVf//2FX//9hV///YVf//2FX//9hV//AwMD/wMDA/wAAAACVlZX/mpqa//9h - V///YVf//2FX//9hV///YVf//2FX//9hV///YVf//2FX//9hV///YVf//2FX//9hV///YVf//2FX//9h - V///YVf//2FX//9hV//AwMD/wMDA/wAAAACXl5f/nJyc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9l - XP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP/AwMD/wMDA/wAA - AACXl5f/nJyc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP//ZVz//2Vc//9l - XP//ZVz//2Vc//9lXP//ZVz//2Vc//9lXP/AwMD/wMDA/wAAAACYmJj/nZ2d//9oYv//aGL//2hi//9o - Yv//aGL//2hi//9oYv//aGL//2hi//9oYv//aGL//2hi//9oYv//aGL//2hi//9oYv//aGL//2hi//9o - Yv/AwMD/wMDA/wAAAACYmJj/nZ2d//9oYv//aGL//2hi//9oYv//aGL//2hi//9oYv//aGL//2hi//9o - Yv//aGL//2hi//9oYv//aGL//2hi//9oYv//aGL//2hi//9oYv/AwMD/wMDA/wAAAACZmZn/n5+f//9s - Z///bGf//2xn//9sZ///bGf//2xn//9sZ///bGf//2xn//9sZ///bGf//2xn//9sZ///bGf//2xn//9s - Z///bGf//2xn//9sZ//AwMD/wMDA/wAAAACZmZn/n5+f//9sZ///bGf//2xn//9sZ///bGf//2xn//9s - Z///bGf//2xn//9sZ///bGf//2xn//9sZ///bGf//2xn//9sZ///bGf//2xn//9sZ//AwMD/wMDA/wAA - AACbm5v/oKCg//9vbP//b2z//29s//9vbP//b2z//29s//9vbP//b2z//29s//9vbP//b2z//29s//9v - bP//b2z//29s//9vbP//b2z//29s//9vbP/AwMD/wMDA/wAAAACbm5v/oKCg//9vbP//b2z//29s//9v - bP//b2z//29s//9vbP//b2z//29s//9vbP//b2z//29s//9vbP//b2z//29s//9vbP//b2z//29s//9v - bP/AwMD/wMDA/wAAAACcnJz/oqKi/6enp/+tra3/srKy/7e3t/+9vb3/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAACcnJz/oqKi/6en - p/+tra3/srKy/7e3t/+9vb3/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAACenp7/o6Oj/6mpqf+urq7/s7Oz/7m5uf++vr7/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAA - AACenp7/o6Oj/6mpqf+urq7/s7Oz/7m5uf++vr7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP4AP/4APwAA/gA//gA/AAD/wf//wf8AAP/B - ///B/wAA/8H//8H/AACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAA - AACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAA - AIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAP///////wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AACgAAAAwAAAAYAAAAAEACAAAAAAAABIAAAAAAAAAAAAAAAAAAAAA - AAAAAAD/MDAw/0BAQP//PiP//0Ep//9FLv//SDP//0w4//9QPv//U0P//1dI//9aTf//XlL//2FX//9l - XP//aGL//2xn//9vbP+AgID/g4OD/4WFhf+Ghob/iIiI/4mJif+Kior/i4uL/4yMjP+NjY3/jo6O/4+P - j/+QkJD/kZGR/5KSkv+Tk5P/lJSU/5WVlf+Wlpb/l5eX/5iYmP+ZmZn/mpqa/5ubm/+cnJz/nZ2d/56e - nv+fn5//oKCg/6Kiov+jo6P/pKSk/6Wlpf+np6f/qamp/6urq/+tra3/rq6u/6+vr/+wsLD/srKy/7Oz - s/+0tLT/tbW1/7e3t/+5ubn/u7u7/729vf++vr7/v7+//8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEhISEhISEhIS - AAAAAAAAAAAAAAAAABISEhISEhISEhISAAAAAAAAAAAAAAAAABISEhISEhISEhISAAAAAAAAAAAAAAAA - ABISEhISEhISEhISAAAAAAAAAAAAAAAAAAAAABISEhISAAAAAAAAAAAAAAAAAAAAAAAAABISEhISAAAA - AAAAAAAAAAAAAAAAAAAAABISEhISAAAAAAAAAAAAAAAAAAAAAAAAABISEhISAAAAAAAAAAAAAAAAAAAA - AAAAABISEhISAAAAAAAAAAAAAAAAAAAAAAAAABISEhISAAAAAAAAAAAAABMXHCInLDE0ODw/Q0RERERE - REREREREABMXHCInLDE0ODw/Q0REREREREREREREABQYHiMoLjI1OT1AREREREREREREREREABQYHiMo - LjI1OT1AREREREREREREREREABUaAQECAQECAQECAQECAQECAQECAUREABUaAwMDAwMDAwMDAwMDAwMD - AwMDA0REABYbAgICAgICAgICAgICAgICAgICAkREABYbBAQEBAQEBAQEBAQEBAQEBAQEBEREABcdBQUF - BQUFBQUFBQUFBQUFBQUFBUREABcdBQUFBQUFBQUFBQUFBQUFBQUFBUREABkeBgYGBgYGBgYGBgYGBgYG - BgYGBkREABkeBgYGBgYGBgYGBgYGBgYGBgYGBkREABogBwcHBwcHBwcHBwcHBwcHBwcHB0REABogBwcH - BwcHBwcHBwcHBwcHBwcHB0REABwhCAgICAgICAgICAgICAgICAgICEREABwhCAgICAgICAgICAgICAgI - CAgICEREAB0jCQkJCQkJCQkJCQkJCQkJCQkJCUREAB0jCQkJCQkJCQkJCQkJCQkJCQkJCUREAB8kCgoK - CgoKCgoKCgoKCgoKCgoKCkREAB8kCgoKCgoKCgoKCgoKCgoKCgoKCkREACAmCwsLCwsLCwsLCwsLCwsL - CwsLC0REACAmCwsLCwsLCwsLCwsLCwsLCwsLC0REACInDAwMDAwMDAwMDAwMDAwMDAwMDEREACInDAwM - DAwMDAwMDAwMDAwMDAwMDEREACMoDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDUREACMoDQ0NDQ0NDQ0NDQ0NDQ0N - DQ0NDUREACUqDg4ODg4ODg4ODg4ODg4ODg4ODkREACUqDg4ODg4ODg4ODg4ODg4ODg4ODkREACYrDw8P - Dw8PDw8PDw8PDw8PDw8PD0REACYrDw8PDw8PDw8PDw8PDw8PDw8PD0REACctEBAQEBAQEBAQEBAQEBAQ - EBAQEEREACctEBAQEBAQEBAQEBAQEBAQEBAQEEREACkuEREREREREREREREREREREREREUREACkuERER - EREREREREREREREREREREUREACovMzY6PkFEREREREREREREREREREREACovMzY6PkFERERERERERERE - REREREREACwwNDc7P0JEREREREREREREREREREREACwwNDc7P0JEREREREREREREREREREREAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA/gA//gA/AAD+AD/+AD8AAP/B///B/wAA/8H//8H/AAD/wf//wf8AAIAAAIAAAAAAgAAAgAAA - AACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAA - AIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAAAACAAACAAAAAAIAAAIAAAAAAgAAAgAAA - AACAAACAAAAAAIAAAIAAAAAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAAKAAAACAA - AABAAAAAAQAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/QICA - gP+AgID/gICA/4CAgP+AgID/gICA/4CAgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - f0CAgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38Qf39/QH9/f3CAgID/gICA/4CAgP9/f39Af39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/EH9/f0B/f39wgICA/4CAgP+AgID/f39/QH9/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAf39/QICAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/f0CAgID/gICA/4CAgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACEhIQwhoaGv46Ojr+Wlpa/np6ev6ampr+srKzPqamp/6+vr/+wsLD/wMDAv8DAwL/AwMC/wMDAv8DA - wL/AwMC/hISEMIaGhr+Ojo6/lpaWv56enr+mpqa/rKysz6mpqf+vr6//sLCw/8DAwL/AwMC/wMDAv8DA - wL/AwMC/wMDAv4ODg0CJiYn/eHh4/4GBgf+EhIT/jo6O/5CQkP+ampr/nJyc/5+fn/+cnJz/n5+f/5yc - nP+fn5//paWl/8DAwP+Dg4NAiYmJ/6x8df+ygnv/uIiB/76Oh//ElI3/ypqT/8+fmP/Pn5j/z5+Y/8+f - mP/Pn5j/z5+Y/8unov/AwMD/h4eHQIuLi/88PDz/Pz8//zw8PP8/Pz//PDw8/z8/P/88PDz/Pz8//zw8 - PP8/Pz//PDw8/z8/P/9dXV3/wMDA/4eHh0CLi4v//0An//9AJ///QCf//0An//9AJ///QCf//0An//9A - J///QCf//0An//9AJ///QCf/72BN/8DAwP+Hh4dAjY2N//9FL///RS///0Uv//9FL///RS///0Uv//9F - L///RS///0Uv//9FL///RS///0Uv/+9kU//AwMD/h4eHQI2Njf//RS///0Uv//9FL///RS///0Uv//9F - L///RS///0Uv//9FL///RS///0Uv//9FL//vZFP/wMDA/4uLi0CQkJD//0s2//9LNv//Szb//0s2//9L - Nv//Szb//0s2//9LNv//Szb//0s2//9LNv//Szb/72hZ/8DAwP+Li4tAkJCQ//9LNv//Szb//0s2//9L - Nv//Szb//0s2//9LNv//Szb//0s2//9LNv//Szb//0s2/+9oWf/AwMD/j4+PQJKSkv//UD///1A///9Q - P///UD///1A///9QP///UD///1A///9QP///UD///1A///9QP//vbF//wMDA/4+Pj0CSkpL//1A///9Q - P///UD///1A///9QP///UD///1A///9QP///UD///1A///9QP///UD//72xf/8DAwP+Pj49AlJSU//9W - Rv//Vkb//1ZG//9WRv//Vkb//1ZG//9WRv//Vkb//1ZG//9WRv//Vkb//1ZG/+9wZf/AwMD/j4+PQJSU - lP//Vkb//1ZG//9WRv//Vkb//1ZG//9WRv//Vkb//1ZG//9WRv//Vkb//1ZG//9WRv/vcGX/wMDA/5OT - k0CWlpb//1tO//9bTv//W07//1tO//9bTv//W07//1tO//9bTv//W07//1tO//9bTv//W07/73Rq/8DA - wP+Tk5NAlpaW//9bTv//W07//1tO//9bTv//W07//1tO//9bTv//W07//1tO//9bTv//W07//1tO/+90 - av/AwMD/k5OTQJiYmP//YFX//2BV//9gVf//YFX//2BV//9gVf//YFX//2BV//9gVf//YFX//2BV//9g - Vf/veHD/wMDA/5OTk0CYmJj//2BV//9gVf//YFX//2BV//9gVf//YFX//2BV//9gVf//YFX//2BV//9g - Vf//YFX/73hw/8DAwP+Xl5dAm5ub//9lXf//ZV3//2Vd//9lXf//ZV3//2Vd//9lXf//ZV3//2Vd//9l - Xf//ZV3//2Vd/+98dv/AwMD/l5eXQJubm///ZV3//2Vd//9lXf//ZV3//2Vd//9lXf//ZV3//2Vd//9l - Xf//ZV3//2Vd//9lXf/vfHb/wMDA/5eXl0CdnZ3//2tl//9rZf//a2X//2tl//9rZf//a2X//2tl//9r - Zf//a2X//2tl//9rZf//a2X/74B8/8DAwP+Xl5dAnZ2d//9rZf//a2X//2tl//9rZf//a2X//2tl//9r - Zf//a2X//2tl//9rZf//a2X//2tl/++AfP/AwMD/m5ubQJ+fn//pfXv/6399/+2Bf//vg4D/74OB/++D - gf/vg4H/74OB/++Dgf/vg4H/74OB/++Dgf/jkpD/wMDA/5ubm0Cfn5//6X17/+t/ff/tgX//74OA/++D - gf/vg4H/74OB/++Dgf/vg4H/74OB/++Dgf/vg4H/45KQ/8DAwP+bm5tAoaGh/6mpqf+xsbH/ubm5/7+/ - v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/m5ubQKGhof+pqan/sbGx/7m5 - uf+/v7//wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// - //////////////////////////////gP+A/+P/4//j/+P4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAA - gACAAIAAgACAAIAAgACAAIAAgACAAIAAgAD//////////////////////////////////////////ygA - AAAgAAAAQAAAAAEACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Ozs7/z4+Pv9nZ2f/cXFx/3l5 - ef98fHz//0An//9GMP//Szb/tnZt/7t6cf//UUD//1ZG//9bT//qa1r//2BV//9mXv/qb2D//2tl/+py - ZP/qdmr/6nlv/+p9dP/BgHf/xoV8/+qAef/qhH//gICA/4ODg/+EhIT/hYWF/4aGhv+Hh4f/iYmJ/4qK - iv+Li4v/jIyM/42Njf+Ojo7/j4+P/5CQkP+SkpL/k5OT/5SUlP+VlZX/lpaW/5eXl/+YmJj/mZmZ/5ub - m/+cnJz/nZ2d/5+fn/+goKD/oaGh/6Wlpf+np6f/qqqq/6urq/+xsbH/urq6/7+/v//Li4L/0JCH/9WV - jP/cnJv/4oKA/+WFg//qh4T/6IiG/+qKiP/Oo53/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAcHBwcHBwcHAAAAAAAAAAAHBwcHBwcHBwAAAAAAAAAABwcHBwcHBwcAAAAAAAAAAAcHBwcHBwcHAAA - AAAAAAAAAAAcHBwcAAAAAAAAAAAAAAAAHBwcHAAAAAAAAB0hKS82OTo4OjtJSUlJSUkdISkvNjk6ODo7 - SUlJSUlJHyIEBQYeICgpLCksKSw2SR8iCgsYGT9AQUFBQUFBSEkhJAECAQIBAgECAQIBAgNJISQHBwcH - BwcHBwcHBwcPSSMmCAgICAgICAgICAgIEkkjJggICAgICAgICAgICBJJJSgJCQkJCQkJCQkJCQkUSSUo - CQkJCQkJCQkJCQkJFEknKgwMDAwMDAwMDAwMDBVJJyoMDAwMDAwMDAwMDAwVSSksDQ0NDQ0NDQ0NDQ0N - FkkpLA0NDQ0NDQ0NDQ0NDRZJKy4ODg4ODg4ODg4ODg4XSSsuDg4ODg4ODg4ODg4OF0ktMBAQEBAQEBAQ - EBAQEBpJLTAQEBAQEBAQEBAQEBAaSS8yERERERERERERERERG0kvMhERERERERERERERERtJMTMTExMT - ExMTExMTExNFSTEzExMTExMTExMTExMTRUkyNUNERkdHR0dHR0dHR0JJMjVDREZHR0dHR0dHR0dCSTQ3 - Ojw9PklJSUlJSUlJSUk0Nzo8PT5JSUlJSUlJSUlJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// - ////////////////////////+A/4D/4//j/+P/4/gACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA - gACAAIAAgACAAIAAgACAAIAAgACAAP//////////////////////////////////////////KAAAABAA - AAAgAAAAAQAgAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA - gP+AgID/gICA/4CAgP8AAAAAAAAAAAAAAAAAAAAAgICA/4CAgP+AgID/gICA/wAAAAAAAAAAAAAAAAAA - AAAAAAAAgICA/4CAgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/gICA/wAAAAAAAAAAAAAAAIaG - hv8wMDD/MDAw/zAwMP8wMDD/MDAw/zAwMP/AwMD/hoaG//8+I///PiP//z4j//8+I///PiP//z4j/8DA - wP+Li4v//0gz//9IM///SDP//0gz//9IM///SDP/wMDA/4uLi///SDP//0gz//9IM///SDP//0gz//9I - M//AwMD/j4+P//9TQ///U0P//1ND//9TQ///U0P//1ND/8DAwP+Pj4///1ND//9TQ///U0P//1ND//9T - Q///U0P/wMDA/5SUlP//XlL//15S//9eUv//XlL//15S//9eUv/AwMD/lJSU//9eUv//XlL//15S//9e - Uv//XlL//15S/8DAwP+YmJj//2hi//9oYv//aGL//2hi//9oYv//aGL/wMDA/5iYmP//aGL//2hi//9o - Yv//aGL//2hi//9oYv/AwMD/nJyc/62trf+9vb3/wMDA/8DAwP/AwMD/wMDA/8DAwP+cnJz/ra2t/729 - vf/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAAw8MAAOfn - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAAKAAAABAAAAAgAAAAAQAIAAAA - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAP9ZWVn/Xl5e/2RkZP9nZ2f//0gz/9xcS///U0P//15S/+Fh - UP/mZ1b/6mpZ//9oYv+AgID/hoaG/4mJif+Ojo7/kpKS/5SUlP+VlZX/lpaW/5ubm/+fn5//oqKi/6Sk - pP/JmZj/1ZiR/9Wclv/Vn5v/zqOe/9Ojov/Vo6H/1aWk/8e3t//AwMD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0NAAAAAA0NDQ0AAA4SGBQTIiIiDhIYFBMi - IiIPAQIDBAQEFw8GCQoLCwsdEAUFBQUFBRoQBQUFBQUFGhEHBwcHBwcbEQcHBwcHBxsUCAgICAgIHBQI - CAgICAgcFQwMDAwMDB8VDAwMDAwMHxYZHiAgICAhFhkeICAgICEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA//8AAMPD - AADn5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA//8AAA== - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs b/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs deleted file mode 100644 index e58489feb8..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GBPrefs : Form - { - private GBPrefs() - { - InitializeComponent(); - } - - public static void DoGBPrefsDialog(IWin32Window owner) - { - var gb = (Gameboy)Global.Emulator; - var s = gb.GetSettings(); - var ss = gb.GetSyncSettings(); - - using (var dlg = new GBPrefs()) - { - dlg.gbPrefControl1.PutSettings(s, ss); - dlg.gbPrefControl1.ColorGameBoy = gb.IsCGBMode(); - if (dlg.ShowDialog(owner) == DialogResult.OK) - { - dlg.gbPrefControl1.GetSettings(out s, out ss); - gb.PutSettings(s); - if (dlg.gbPrefControl1.SyncSettingsChanged) - { - GlobalWin.MainForm.PutCoreSyncSettings(ss); - } - } - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/GB/GBPrefs.resx b/BizHawk.Client.EmuHawk/config/GB/GBPrefs.resx deleted file mode 100644 index f6a0374127..0000000000 --- a/BizHawk.Client.EmuHawk/config/GB/GBPrefs.resx +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAQAICAAAAEAIACoEAAARgAAACAgAAABAAgAqAgAAO4QAAAQEAAAAQAgAGgEAACWGQAAEBAAAAEA - CABoBQAA/h0AACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB7e3tAfHx8v3d3d/9tbW3/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lp - af9paWn/aWlp/2lpaf9oaGj/ZmZm/3BwcP+EhIT/jo6Ov4+Pj0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAHt7e0B6enq/fX19/4GBgf+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4KCgv+BgYH/fn5+/3x8 - fP98fHz/fn5+/4GBgf+CgoL/goKC/3x8fP9ycnL/dXV1/4WFhf+MjIzPiIiIcISEhDB/f38QAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAd3d3QHl5eb+JiYn/qKio/7i4uP+3t7f/t7e3/7e3t/+3t7f/tra2/7Gx - sf+oqKj/o6Oj/6SkpP+pqan/s7Oz/7a2tv+0tLT/paWl/4iIiP9+fn7/h4eH/4mJie+FhYXPgoKCj4SE - hDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4+Pj/+7u7v/0dHR/8/Pz//Pz8//0NDQ/9HR - 0f/Q0ND/ycnJ/729vf+3t7f/uLi4/729vv/IyMr/zs7P/83Nzv+9vb3/np6e/46Ojv+NjY3/ioqK/4KC - gv9+fn6/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6uv/Ozs7/ysrK/8rK - yv/Ozs7/0NDQ/9DQ0P/Kysr/vb29/7e3t/+3t7f/urq8/8LCx//IyM3/zMzO/8TExf+ysrL/o6Oj/5iY - mP+MjIz/fn5+/3Z2dr93d3dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3QHZ2dr+JiYn/ra2t/7e3 - t/+lpaX/p6en/7y8vP/Jycn/zs7O/8zMzP/Dw8L/urq9/7Kyu/+oqLz/nZ3C/6Cgxf+xscf/ubnD/7i4 - vP+vr7D/oKCh/5OTlP+JiYr/hYWFz4aGhnCKioowj4+PEAAAAAAAAAAAAAAAAAAAAAB3d3dAdXV1v4CA - gP+VlZX/ioqK/2BgYP9mZmb/mpqa/7u7u//Jycn/z8/O/8zMzP/AwMj/qqrE/4iIv/9ZWbn/Vla3/39/ - uP+cnLn/rq66/7GxtP+kpKf/n5+i/6Skpf+hoaHvkpKSz4uLi4+KioowAAAAAAAAAAAAAAAAAAAAAHNz - c0B0dHS/dHR0/3R0dP9gYGD/NjY2/zs7O/9wcHD/m5ub/7y8vP/Ozs7/0NDQ/8PDzv+mpsn/eHjD/zg4 - u/8xMbf/ZGS1/4SEtf+Rkbf/lJS1/4yMrf+UlK7/ra22/62trv+Wlpb/ioqKv4uLi0AAAAAAAAAAAAAA - AAAAAAAAb29vQHBwcL9jY2P/S0tL/zY2Nv8mJib/KCgo/zw8PP9nZ2f/qKio/8rKyv/Pz87/wsLO/6am - yv94eMj/ODjJ/zAwxf9hYb7/cXG4/19fsv9YWLH/WVmz/3Jyt/+jo73/sLCy/5eXmP+Kioq/i4uLQAAA - AAAAAAAAAAAAAAAAAABvb29AcHBwv2VlZf9QUFD/PDw8/ygoKP8pKSn/Pz8//2pqav+pqan/ysrK/87O - zv/Gxs//sLDM/42NzP9cXND/VFTN/3d3w/90dLv/S0u0/zo6tf9AQL3/YWHC/5+fwv+xsbX/l5eZ/4qK - ir+Li4tAAAAAAAAAAAAAAAAAAAAAAHNzc0B1dXW/enp6/4WFhf9wcHD/PDw8/z8/P/94eHj/o6Oj/7+/ - v//Ozs7/0NDQ/83N0P/Gxs//uLjP/6Sk0f+ens3/paXD/42Nvv9VVb3/OzvB/0BAzP9hYc7/n5/H/7Gx - tf+Xl5n/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4eL+Hh4f/pqam/5ubm/9nZ2f/ampq/6Oj - o//ExMT/zMzM/9DQ0P/Q0ND/0dHR/9HR0f/OztH/ysrS/8bGzv/Cwsf/p6fE/3Z2xf9fX8r/YmLT/3t7 - 0/+oqMj/srK1/5iYmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4yMjP+0tLT/vb29/6io - qP+pqan/v7+//8zMzP/Pz8//0NDQ/9DQ0P/R0dH/0dHR/9DQ0f/OztH/zc3Q/8zMzf/Bwcz/r6/N/6am - z/+oqNP/r6/Q/7u7x/+0tLX/mJiZ/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6 - uv/Nzc3/yMjI/8fHx//Ly8v/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/8zM - zv/Kys7/ycnP/8nJz//IyMz/xMTG/7W1tf+ZmZn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4 - eL+Ojo7/uLi4/8zMzP/IyMj/xsbG/8fHx//IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI - yP/IyMj/yMjI/8fHyP/Hx8n/x8fJ/8bGyP/ExMT/tbW1/5mZmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAA - AAB3d3dAdnZ2v4aGhv+jo6P/r6+v/6qqqv+nqKj/pqio/6WpqP+lqaj/pamo/6WpqP+lqaj/pamo/6Wp - qP+lqaj/pamo/6WpqP+mqaj/pqio/6eoqP+oqKj/rKys/7Kysv+rq6v/lZWV/4qKir+Li4tAAAAAAAAA - AAAAAAAAAAAAAHNzc0B0dHS/dnZ2/3t7e/94eXn/b3Bw/2lsbP9nbm3/ZW9t/2Vvbf9lb23/ZW9t/2Vv - bf9lb23/ZW9t/2Vvbf9lb23/ZW9t/2Zvbf9obmz/am1s/2xtbP94eHj/j4+P/5eXl/+Pj4//ioqKv4uL - i0AAAAAAAAAAAAAAAAAAAAAAb29vQHFxcb9sbGz/Y2Nj/11eXv9bXV3/UWNf/0FtY/84c2b/NnNm/zZz - Zv82c2b/NnNm/zZzZv82c2b/NnNm/zZzZv82c2b/O3Bl/0RrYv9OZV//Vl5c/2VkZf95eHn/hYWF/4mJ - if+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XV9e/2xzcf9eioD/NKWM/x2z - kv8atJP/GLWT/xi1k/8YtZP/GLWT/xi1k/8YtZP/GLWT/xi1k/8krZD/PZ6J/1OOgf9oe3f/cXBx/25u - bv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX1//dH17/2Se - kf8swaD/DdSp/wnWqv8H16r/B9eq/wfXqv8H16r/B9eq/wfXqv8H16r/B9eq/xfNpv83uZ3/VaOS/3GK - hf93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xf - Xv90fXv/Y5+R/yjDof8J1qr/BNir/wLZq/8C2av/Atmr/wLZq/8C2av/Atmr/wLZq/8C2av/E8+m/zS6 - nf9To5L/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbGxsv2Vl - Zf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDbrP8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yMjL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtr - a0BsbGy/ZWVl/1dXV/9cX17/dH17/2Kfkv8mw6L/Bteq/wLZq/8A26z/ANus/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/xHQp/8zu53/UqSS/3CKhP93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAA - AAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfXv90fXv/Yp+S/ybDov8G16r/Atmr/wDbrP8A26z/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/EdCn/zO7nf9SpJL/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAA - AAAAAAAAAAAAAAAAAABra2tAbGxsv2VlZf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDb - rP8A26z/ANus/wDbrP8A26z/ANus/wDbrP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yM - jL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX17/dH17/2Ofkf8ow6H/Cdaq/wTY - q/8C2qv/Atqr/wLaq/8C2qv/Atqr/wLaq/8C2qv/Atqr/xPPpv80up3/U6OS/3CKhP93d3f/aWlp/2xs - bP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfX/90fXv/ZJ6R/yzB - oP8N1Kn/Cdaq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/F82m/ze5nf9Vo5L/cYqE/3d3 - d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XWBf/210 - cv9fi4H/NaaN/x60k/8btpT/GbeU/xm3lP8Zt5T/GbeU/xm3lP8Zt5T/GbeU/xm3lP8lr5H/Pp+K/1SP - gv9pfHj/cnFx/25ubv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAG9vb0BxcXG/bGxs/2Rk - ZP9fYGD/XWBg/1RmYv9EcGb/O3Zp/zl2af85d2n/OXdp/zl3af85d2n/OXdp/zl3af85d2n/OXdp/z5z - aP9HbWX/UWdi/1lhX/9nZ2f/enp6/4WFhf+JiYn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAc3NzQHV1 - db9xcXH/aGho/2BgYP9XWFj/UVRU/09WVf9NV1X/TVdV/01XVf9NV1X/TVdV/01XVf9NV1X/TVdV/01X - Vf9NV1X/TldV/1BWVP9SVVT/VFVU/2FhYf95eXn/hoaG74iIiM+Li4uPioqKMAAAAAAAAAAAAAAAAAAA - AAB3d3dAeXl5v3R0dP9oaGj/YGBg/1paWv9XWFj/VlhY/1VZWP9VWVj/VVlY/1VZWP9VWVj/VVlY/1VZ - WP9VWVj/VVlY/1VZWP9WWVj/VlhY/1dYWP9YWFj/X19f/2xsbP91dXXPfX19cIqKijCPj48QAAAAAAAA - AAAAAAAAAAAAAHt7e0B8fHy/dXV1/2hoaP9gYGD/XFxc/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1pa - Wv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9eXl7/ZmZm/2lpab9ra2tAAAAAAAAA - AAAAAAAA8AAAP/AAAD/wAAAP8AAAD/AAAA/wAAAP8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA - AAPwAAAD8AAAD/AAAA8oAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zMz - M/82Njb/ODg4/z57bv87fW//OH9v/zd/cP9DQ0P/SEhI/01NTf9MX1v/T15b/1FRUf9XV1f/VFlY/1dY - WP9TXFr/UF5b/1RcWv9YWln/Wlpa/1ldXP9aXFz/XFxc/11eXv9KYVz/TGBc/11lY/9UbWf/XWhm/1Jt - aP9HdWv/RnZs/1dzbf9Zcm3/THpw/0t8cf9gYGD/YGJi/2JiYv9hZGP/YWVk/2FmZP9kZGT/ZmZm/2Nq - af9ibmv/aGho/2pqav9pbGv/bGxs/25ubv9jcm//ZHNv/29xcf9tcnH/bnNy/2R6dv9ofHf/aHx4/2h/ - ev9sf3v/b357/3BwcP9ycnL/cXd2/3R0dP92dnb/cnl3/3N8ev90fHr/eHh4/3p6ev95fHv/en18/3x8 - fP9+fn7/NoBw/zuFdf88hHT/Q4Bz/0CCdP9Whnz/Uol9/2qAfP9sgHz/Skq5/0tLvP9PT77/UVG//1pa - uP9jY7T/Z2e1/2pqtv9mZrn/YWG+/2Rkv/9vb7n/bW28/3FxvP99fbj/SkrD/05Owv9RUcf/UlLI/25u - wf9pacr/dXXD/3l5xP9wcMr/cXHO/3p6yf87m4b/PpiE/zych/8crY7/HqyN/x2vj/8ero//K6SK/yym - i/8mqIv/IKuN/yepjP8hrY7/OLKX/zS2mf84spj/M7ud/zW6nf8wvp//Lr+g/1Sdjf9Ymov/WJqM/1if - kP9piIL/aoiB/2qMhf9To5H/V6CQ/1Kkkv8ewp//D8yj/wvOpP8OzaT/DM6k/w7OpP8Yx6H/EM2j/xbN - pv8Wzqb/Gcyl/wbXqv8P0qj/CNaq/wPZq/8E2Kv/Btiq/wDarP8R0aj/gICA/4KCgv+DhIT/hISE/4aG - hv+IiIj/ioqK/4yMjP+Ojo7/j4+Q/5CQkP+SkpL/lJSU/5aWl/+YmJj/mpqa/5ubnf+cnJ3/np6i/5yc - pP+Tk6//n5+p/4qKsf+Kirf/gYG5/5WVv/+amrr/nqKh/6Ghof+jpKT/pKSk/6ampv+lpan/pqau/6mp - qf+rq67/ra2t/6KisP+lpbL/qamz/66usv+mprn/pKS+/7CwsP+1tbX/srK4/7e3uv+xsb7/t7e+/7i4 - uP+9vb7/hobA/4ODxv+KisD/h4fP/5aWw/+amsH/nJzD/5iYxv+QkM3/mprM/6Kixf+oqMT/o6PJ/6Wl - y/+goM7/qqrN/7KywP+zs8X/u7vA/76+wf+6usX/vb3H/7e3yf+wsM3/u7vL/7+/yv++vs3/oKDQ/7Gx - 0P+/wMD/wMHB/8TExf/Bwcr/wMDN/8bGzf/Jycn/y8vN/83Nzf/BwdD/ycnQ/83N0P/Q0ND/AAAA/wBM - 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 - qv8K1qr/Ctaq/0mvmf9/fn//YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UFBQ/4CNiv8J1qr/ANus/wDb - rP8A26z/ANus/wDbrP9EsZn/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAbGxs/1BQUP+AjYr/Cdaq/wDb - rP8A26z/ANus/wDbrP8A26z/RLGZ/39+fv9iYmL/jIyM/wAAAAAAAAAAAAAAAGxsbP9QUFD/gI2K/wnW - qv8A26z/ANus/wDbrP8A26z/ANus/0Sxmf9/fn7/YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UVFR/4GN - iv8S0qj/Cteq/wrXqv8K16r/Cteq/wrXqv9Jr5n/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAc3Nz/2Vl - Zf9RUlL/SldU/0lXVP9JV1T/SVdU/0lXVP9JV1T/TlRT/1NTU/+Pj4//i4uL/wAAAAAAAAAAAAAAAHx8 - fP9iYmL/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9bW1v/ampq/wAAAAAAAAAAwAcAAMAD - AADAAwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAMAACgA - AAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAcHBz/IyMj/yQkJP8lJSX/TU5O/09P - T/9KUU//RVNQ/0ZTUP9OVFP/SVdU/0pXVP9QUFD/UVFR/1FSUv9TU1P/Wlpa/1tbW/9iYmL/Y2Nj/2Vl - Zf9mZmb/aWlp/2pqav9sbGz/bm5u/3Nzc/90dHT/dnZ2/3h4eP95eXn/fHx8/39+fv8YGK//Nzes/0ND - uv94eL7/GBjS/zo6wv9CQtr/Sa+Z/0Sxmf8J1qr/Ctaq/wDbrP8S0qj/gYGB/4ODg/+AjYr/gY2K/4uL - i/+MjIz/jo6O/4+Pj/+QkJD/lpaW/4CAsv+goKX/rKys/62trf+2trb/t7e3/7i4uP+5ubn/u7u7/7i4 - vf+6ur//mJjH/5iYyf++vsP/vr7E/8PDw//Gxsb/x8fH/8PDzP/Nzc3/zs7P/8/Pz//GxtP/ysrS/8vL - 0//Q0ND/0dHR/9LS0f/T09P//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VVUfFhYWFhYWFxYVNVVVVVVV - HlRTU009P1NLLjIvVVVVVR1RSFFSPjxKTD03G1VVVVUcNgE6UVNDIThBOT4yVVVVGQIAA0hSRCUkIiNF - MlVVVR07A0BRUlJOQiYnRjJVVVUdUkhRUlJSUlJPUEcyVVVVHktISEhISEhISElHMlVVVRoTBAgHBwcH - BwYFNDJVVVUYDTEtKysrKysoIBIzVVVVGAwwKiwsLCwsKSASM1VVVRgMMCosLCwsLCkgEjNVVVUYDDAq - LCwsLCwpIBIzVVVVGA0xLSsrKysrKCASM1VVVRoUDgsKCgoKCgkPNTJVVVUfEhAQEBAQEBAQERdVVcAH - AADAAwAAwAMAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAD - AAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GenericCoreConfig.cs b/BizHawk.Client.EmuHawk/config/GenericCoreConfig.cs deleted file mode 100644 index f5891e284a..0000000000 --- a/BizHawk.Client.EmuHawk/config/GenericCoreConfig.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Reflection; -using System.ComponentModel; -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GenericCoreConfig : Form - { - private object _s; - private object _ss; - private bool _syncsettingschanged; - bool settingschanged = false; - - private GenericCoreConfig(bool ignoresettings, bool ignoresyncsettings) - { - InitializeComponent(); - - var settable = new SettingsAdapter(Global.Emulator); - - if (settable.HasSettings && !ignoresettings) - { - _s = settable.GetSettings(); - } - - if (settable.HasSyncSettings && !ignoresyncsettings) - { - _ss = settable.GetSyncSettings(); - } - - if (_s != null) - { - propertyGrid1.SelectedObject = _s; - ChangeDescriptionHeight(propertyGrid1); - } - else - { - tabControl1.TabPages.Remove(tabPage1); - } - - if (_ss != null) - { - propertyGrid2.SelectedObject = _ss; - ChangeDescriptionHeight(propertyGrid2); - } - else - { - tabControl1.TabPages.Remove(tabPage2); - } - - if (Global.MovieSession.Movie.IsActive) - { - propertyGrid2.Enabled = false; // disable changes to sync setting when movie, so as not to confuse user - } - } - - private GenericCoreConfig() - : this(false, false) - { - } - - private static void ChangeDescriptionHeight(PropertyGrid grid) - { - if (grid == null) - throw new ArgumentNullException("grid"); - - int maxlen = 0; - string desc = ""; - - foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(grid.SelectedObject)) - { - if (property.Description.Length > maxlen) - { - maxlen = property.Description.Length; - desc = property.Description; - } - } - - foreach (Control control in grid.Controls) - { - if (control.GetType().Name == "DocComment") - { - FieldInfo field = control.GetType().GetField("userSized", BindingFlags.Instance | BindingFlags.NonPublic); - field.SetValue(control, true); - int height = (int)System.Drawing.Graphics.FromHwnd(control.Handle).MeasureString(desc, control.Font, grid.Width).Height; - control.Height = Math.Max(20, height) + 16; // magic for now - return; - } - } - } - - private void OkBtn_Click(object sender, EventArgs e) - { - if (_s != null && settingschanged) - { - GlobalWin.MainForm.PutCoreSettings(_s); - } - - if (_ss != null && _syncsettingschanged) - { - GlobalWin.MainForm.PutCoreSyncSettings(_ss); - } - - DialogResult = DialogResult.OK; - Close(); - } - - public static void DoDialog(IWin32Window owner, string title) - { - using (var dlg = new GenericCoreConfig { Text = title }) - { - dlg.ShowDialog(owner); - } - } - - public static void DoDialog(IWin32Window owner, string title, bool hidesettings, bool hidesyncsettings) - { - using (var dlg = new GenericCoreConfig(hidesettings, hidesyncsettings) { Text = title }) - { - dlg.ShowDialog(owner); - } - } - - private void PropertyGrid2_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) - { - _syncsettingschanged = true; - } - - private void GenericCoreConfig_Load(object sender, EventArgs e) - { - } - - private void DefaultsBtn_Click(object sender, EventArgs e) - { - // the new config objects guarantee that the default constructor gives a default-settings object - if (_s != null) - { - _s = Activator.CreateInstance(_s.GetType()); - propertyGrid1.SelectedObject = _s; - } - - if (_ss != null) - { - _ss = Activator.CreateInstance(_ss.GetType()); - propertyGrid2.SelectedObject = _ss; - _syncsettingschanged = true; - } - } - - private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) - { - settingschanged = true; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs b/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs deleted file mode 100644 index 70e35459eb..0000000000 --- a/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs +++ /dev/null @@ -1,629 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class EmuHawkOptions - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.OkBtn = new System.Windows.Forms.Button(); - this.CancelBtn = new System.Windows.Forms.Button(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.StartPausedCheckbox = new System.Windows.Forms.CheckBox(); - this.label14 = new System.Windows.Forms.Label(); - this.StartFullScreenCheckbox = new System.Windows.Forms.CheckBox(); - this.label3 = new System.Windows.Forms.Label(); - this.SingleInstanceModeCheckbox = new System.Windows.Forms.CheckBox(); - this.NeverAskSaveCheckbox = new System.Windows.Forms.CheckBox(); - this.label2 = new System.Windows.Forms.Label(); - this.AcceptBackgroundInputCheckbox = new System.Windows.Forms.CheckBox(); - this.label1 = new System.Windows.Forms.Label(); - this.RunInBackgroundCheckbox = new System.Windows.Forms.CheckBox(); - this.SaveWindowPositionCheckbox = new System.Windows.Forms.CheckBox(); - this.EnableContextMenuCheckbox = new System.Windows.Forms.CheckBox(); - this.PauseWhenMenuActivatedCheckbox = new System.Windows.Forms.CheckBox(); - this.tabPage3 = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.AutosaveSRAMtextBox = new System.Windows.Forms.NumericUpDown(); - this.AutosaveSRAMradioButton1 = new System.Windows.Forms.RadioButton(); - this.label8 = new System.Windows.Forms.Label(); - this.AutosaveSRAMradioButton2 = new System.Windows.Forms.RadioButton(); - this.AutosaveSRAMradioButton3 = new System.Windows.Forms.RadioButton(); - this.AutosaveSRAMCheckbox = new System.Windows.Forms.CheckBox(); - this.panel1 = new System.Windows.Forms.Panel(); - this.label7 = new System.Windows.Forms.Label(); - this.LuaInterfaceRadio = new System.Windows.Forms.RadioButton(); - this.NLuaRadio = new System.Windows.Forms.RadioButton(); - this.label6 = new System.Windows.Forms.Label(); - this.cbMoviesInAWE = new System.Windows.Forms.CheckBox(); - this.label5 = new System.Windows.Forms.Label(); - this.cbMoviesOnDisk = new System.Windows.Forms.CheckBox(); - this.LuaDuringTurboCheckbox = new System.Windows.Forms.CheckBox(); - this.label12 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.FrameAdvSkipLagCheckbox = new System.Windows.Forms.CheckBox(); - this.BackupSRamCheckbox = new System.Windows.Forms.CheckBox(); - this.label4 = new System.Windows.Forms.Label(); - this.LogWindowAsConsoleCheckbox = new System.Windows.Forms.CheckBox(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.label9 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.tabControl1.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.tabPage3.SuspendLayout(); - this.groupBox2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.AutosaveSRAMtextBox)).BeginInit(); - this.panel1.SuspendLayout(); - this.SuspendLayout(); - // - // OkBtn - // - this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OkBtn.Location = new System.Drawing.Point(280, 425); - this.OkBtn.Name = "OkBtn"; - this.OkBtn.Size = new System.Drawing.Size(60, 23); - this.OkBtn.TabIndex = 0; - this.OkBtn.Text = "&OK"; - this.OkBtn.UseVisualStyleBackColor = true; - this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click); - // - // CancelBtn - // - this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(346, 425); - this.CancelBtn.Name = "CancelBtn"; - this.CancelBtn.Size = new System.Drawing.Size(60, 23); - this.CancelBtn.TabIndex = 1; - this.CancelBtn.Text = "&Cancel"; - this.CancelBtn.UseVisualStyleBackColor = true; - this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); - // - // tabControl1 - // - this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Controls.Add(this.tabPage3); - this.tabControl1.Location = new System.Drawing.Point(12, 12); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(394, 402); - this.tabControl1.TabIndex = 2; - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.groupBox1); - this.tabPage1.Controls.Add(this.NeverAskSaveCheckbox); - this.tabPage1.Controls.Add(this.label2); - this.tabPage1.Controls.Add(this.AcceptBackgroundInputCheckbox); - this.tabPage1.Controls.Add(this.label1); - this.tabPage1.Controls.Add(this.RunInBackgroundCheckbox); - this.tabPage1.Controls.Add(this.SaveWindowPositionCheckbox); - this.tabPage1.Controls.Add(this.EnableContextMenuCheckbox); - this.tabPage1.Controls.Add(this.PauseWhenMenuActivatedCheckbox); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(386, 376); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "General"; - this.tabPage1.UseVisualStyleBackColor = true; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.StartPausedCheckbox); - this.groupBox1.Controls.Add(this.label14); - this.groupBox1.Controls.Add(this.StartFullScreenCheckbox); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.SingleInstanceModeCheckbox); - this.groupBox1.Location = new System.Drawing.Point(6, 182); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(369, 140); - this.groupBox1.TabIndex = 13; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Startup Options"; - // - // StartPausedCheckbox - // - this.StartPausedCheckbox.AutoSize = true; - this.StartPausedCheckbox.Location = new System.Drawing.Point(6, 19); - this.StartPausedCheckbox.Name = "StartPausedCheckbox"; - this.StartPausedCheckbox.Size = new System.Drawing.Size(86, 17); - this.StartPausedCheckbox.TabIndex = 2; - this.StartPausedCheckbox.Text = "Start paused"; - this.StartPausedCheckbox.UseVisualStyleBackColor = true; - // - // label14 - // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(26, 99); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(306, 13); - this.label14.TabIndex = 12; - this.label14.Text = "Note: Requires closing and reopening EmuHawk to take effect."; - // - // StartFullScreenCheckbox - // - this.StartFullScreenCheckbox.AutoSize = true; - this.StartFullScreenCheckbox.Location = new System.Drawing.Point(6, 42); - this.StartFullScreenCheckbox.Name = "StartFullScreenCheckbox"; - this.StartFullScreenCheckbox.Size = new System.Drawing.Size(110, 17); - this.StartFullScreenCheckbox.TabIndex = 3; - this.StartFullScreenCheckbox.Text = "Start in Fullscreen"; - this.StartFullScreenCheckbox.UseVisualStyleBackColor = true; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(26, 85); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(275, 13); - this.label3.TabIndex = 11; - this.label3.Text = "Enable to force only one instance of EmuHawk at a time."; - // - // SingleInstanceModeCheckbox - // - this.SingleInstanceModeCheckbox.AutoSize = true; - this.SingleInstanceModeCheckbox.Location = new System.Drawing.Point(6, 65); - this.SingleInstanceModeCheckbox.Name = "SingleInstanceModeCheckbox"; - this.SingleInstanceModeCheckbox.Size = new System.Drawing.Size(127, 17); - this.SingleInstanceModeCheckbox.TabIndex = 10; - this.SingleInstanceModeCheckbox.Text = "Single instance mode"; - this.SingleInstanceModeCheckbox.UseVisualStyleBackColor = true; - // - // NeverAskSaveCheckbox - // - this.NeverAskSaveCheckbox.AutoSize = true; - this.NeverAskSaveCheckbox.Location = new System.Drawing.Point(6, 72); - this.NeverAskSaveCheckbox.Name = "NeverAskSaveCheckbox"; - this.NeverAskSaveCheckbox.Size = new System.Drawing.Size(184, 17); - this.NeverAskSaveCheckbox.TabIndex = 5; - this.NeverAskSaveCheckbox.Text = "Never be asked to save changes"; - this.NeverAskSaveCheckbox.UseVisualStyleBackColor = true; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(26, 155); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(349, 13); - this.label2.TabIndex = 9; - this.label2.Text = "When this is set, the client will receive user input even when focus is lost"; - // - // AcceptBackgroundInputCheckbox - // - this.AcceptBackgroundInputCheckbox.AutoSize = true; - this.AcceptBackgroundInputCheckbox.Location = new System.Drawing.Point(6, 135); - this.AcceptBackgroundInputCheckbox.Name = "AcceptBackgroundInputCheckbox"; - this.AcceptBackgroundInputCheckbox.Size = new System.Drawing.Size(146, 17); - this.AcceptBackgroundInputCheckbox.TabIndex = 8; - this.AcceptBackgroundInputCheckbox.Text = "Accept background input"; - this.AcceptBackgroundInputCheckbox.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(26, 115); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(315, 13); - this.label1.TabIndex = 7; - this.label1.Text = "When this is set, the client will continue to run when it loses focus"; - // - // RunInBackgroundCheckbox - // - this.RunInBackgroundCheckbox.AutoSize = true; - this.RunInBackgroundCheckbox.Location = new System.Drawing.Point(6, 95); - this.RunInBackgroundCheckbox.Name = "RunInBackgroundCheckbox"; - this.RunInBackgroundCheckbox.Size = new System.Drawing.Size(117, 17); - this.RunInBackgroundCheckbox.TabIndex = 6; - this.RunInBackgroundCheckbox.Text = "Run in background"; - this.RunInBackgroundCheckbox.UseVisualStyleBackColor = true; - // - // SaveWindowPositionCheckbox - // - this.SaveWindowPositionCheckbox.AutoSize = true; - this.SaveWindowPositionCheckbox.Location = new System.Drawing.Point(6, 49); - this.SaveWindowPositionCheckbox.Name = "SaveWindowPositionCheckbox"; - this.SaveWindowPositionCheckbox.Size = new System.Drawing.Size(133, 17); - this.SaveWindowPositionCheckbox.TabIndex = 4; - this.SaveWindowPositionCheckbox.Text = "Save Window Position"; - this.SaveWindowPositionCheckbox.UseVisualStyleBackColor = true; - // - // EnableContextMenuCheckbox - // - this.EnableContextMenuCheckbox.AutoSize = true; - this.EnableContextMenuCheckbox.Location = new System.Drawing.Point(6, 26); - this.EnableContextMenuCheckbox.Name = "EnableContextMenuCheckbox"; - this.EnableContextMenuCheckbox.Size = new System.Drawing.Size(128, 17); - this.EnableContextMenuCheckbox.TabIndex = 1; - this.EnableContextMenuCheckbox.Text = "Enable Context Menu"; - this.EnableContextMenuCheckbox.UseVisualStyleBackColor = true; - // - // PauseWhenMenuActivatedCheckbox - // - this.PauseWhenMenuActivatedCheckbox.AutoSize = true; - this.PauseWhenMenuActivatedCheckbox.Location = new System.Drawing.Point(6, 3); - this.PauseWhenMenuActivatedCheckbox.Name = "PauseWhenMenuActivatedCheckbox"; - this.PauseWhenMenuActivatedCheckbox.Size = new System.Drawing.Size(161, 17); - this.PauseWhenMenuActivatedCheckbox.TabIndex = 0; - this.PauseWhenMenuActivatedCheckbox.Text = "Pause when menu activated"; - this.PauseWhenMenuActivatedCheckbox.UseVisualStyleBackColor = true; - // - // tabPage3 - // - this.tabPage3.Controls.Add(this.groupBox2); - this.tabPage3.Controls.Add(this.AutosaveSRAMCheckbox); - this.tabPage3.Controls.Add(this.panel1); - this.tabPage3.Controls.Add(this.label6); - this.tabPage3.Controls.Add(this.cbMoviesInAWE); - this.tabPage3.Controls.Add(this.label5); - this.tabPage3.Controls.Add(this.cbMoviesOnDisk); - this.tabPage3.Controls.Add(this.LuaDuringTurboCheckbox); - this.tabPage3.Controls.Add(this.label12); - this.tabPage3.Controls.Add(this.label13); - this.tabPage3.Controls.Add(this.FrameAdvSkipLagCheckbox); - this.tabPage3.Controls.Add(this.BackupSRamCheckbox); - this.tabPage3.Controls.Add(this.label4); - this.tabPage3.Controls.Add(this.LogWindowAsConsoleCheckbox); - this.tabPage3.Location = new System.Drawing.Point(4, 22); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.Size = new System.Drawing.Size(386, 376); - this.tabPage3.TabIndex = 2; - this.tabPage3.Text = "Advanced"; - this.tabPage3.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label10); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.AutosaveSRAMtextBox); - this.groupBox2.Controls.Add(this.AutosaveSRAMradioButton1); - this.groupBox2.Controls.Add(this.label8); - this.groupBox2.Controls.Add(this.AutosaveSRAMradioButton2); - this.groupBox2.Controls.Add(this.AutosaveSRAMradioButton3); - this.groupBox2.Location = new System.Drawing.Point(27, 59); - this.groupBox2.Margin = new System.Windows.Forms.Padding(0); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(265, 60); - this.groupBox2.TabIndex = 27; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "AutoSaveRAM"; - // - // AutosaveSRAMtextBox - // - this.AutosaveSRAMtextBox.Location = new System.Drawing.Point(151, 33); - this.AutosaveSRAMtextBox.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.AutosaveSRAMtextBox.Name = "AutosaveSRAMtextBox"; - this.AutosaveSRAMtextBox.Size = new System.Drawing.Size(50, 20); - this.AutosaveSRAMtextBox.TabIndex = 27; - // - // AutosaveSRAMradioButton1 - // - this.AutosaveSRAMradioButton1.AutoSize = true; - this.AutosaveSRAMradioButton1.Location = new System.Drawing.Point(48, 33); - this.AutosaveSRAMradioButton1.Name = "AutosaveSRAMradioButton1"; - this.AutosaveSRAMradioButton1.Size = new System.Drawing.Size(36, 17); - this.AutosaveSRAMradioButton1.TabIndex = 22; - this.AutosaveSRAMradioButton1.TabStop = true; - this.AutosaveSRAMradioButton1.Text = "5s"; - this.AutosaveSRAMradioButton1.UseVisualStyleBackColor = true; - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(202, 35); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(12, 13); - this.label8.TabIndex = 26; - this.label8.Text = "s"; - // - // AutosaveSRAMradioButton2 - // - this.AutosaveSRAMradioButton2.AutoSize = true; - this.AutosaveSRAMradioButton2.Location = new System.Drawing.Point(90, 34); - this.AutosaveSRAMradioButton2.Name = "AutosaveSRAMradioButton2"; - this.AutosaveSRAMradioButton2.Size = new System.Drawing.Size(39, 17); - this.AutosaveSRAMradioButton2.TabIndex = 23; - this.AutosaveSRAMradioButton2.TabStop = true; - this.AutosaveSRAMradioButton2.Text = "5m"; - this.AutosaveSRAMradioButton2.UseVisualStyleBackColor = true; - // - // AutosaveSRAMradioButton3 - // - this.AutosaveSRAMradioButton3.AutoSize = true; - this.AutosaveSRAMradioButton3.Location = new System.Drawing.Point(131, 35); - this.AutosaveSRAMradioButton3.Name = "AutosaveSRAMradioButton3"; - this.AutosaveSRAMradioButton3.Size = new System.Drawing.Size(14, 13); - this.AutosaveSRAMradioButton3.TabIndex = 24; - this.AutosaveSRAMradioButton3.TabStop = true; - this.AutosaveSRAMradioButton3.UseVisualStyleBackColor = true; - this.AutosaveSRAMradioButton3.CheckedChanged += new System.EventHandler(this.AutosaveSRAMradioButton3_CheckedChanged); - // - // AutosaveSRAMCheckbox - // - this.AutosaveSRAMCheckbox.AutoSize = true; - this.AutosaveSRAMCheckbox.Location = new System.Drawing.Point(6, 62); - this.AutosaveSRAMCheckbox.Name = "AutosaveSRAMCheckbox"; - this.AutosaveSRAMCheckbox.Size = new System.Drawing.Size(15, 14); - this.AutosaveSRAMCheckbox.TabIndex = 21; - this.AutosaveSRAMCheckbox.UseVisualStyleBackColor = true; - this.AutosaveSRAMCheckbox.CheckedChanged += new System.EventHandler(this.AutosaveSRAMCheckbox_CheckedChanged); - // - // panel1 - // - this.panel1.Controls.Add(this.label7); - this.panel1.Controls.Add(this.LuaInterfaceRadio); - this.panel1.Controls.Add(this.NLuaRadio); - this.panel1.Location = new System.Drawing.Point(6, 312); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(377, 61); - this.panel1.TabIndex = 20; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(3, 1); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(50, 13); - this.label7.TabIndex = 2; - this.label7.Text = "Lua Core"; - // - // LuaInterfaceRadio - // - this.LuaInterfaceRadio.AutoSize = true; - this.LuaInterfaceRadio.Location = new System.Drawing.Point(4, 36); - this.LuaInterfaceRadio.Name = "LuaInterfaceRadio"; - this.LuaInterfaceRadio.Size = new System.Drawing.Size(338, 17); - this.LuaInterfaceRadio.TabIndex = 1; - this.LuaInterfaceRadio.TabStop = true; - this.LuaInterfaceRadio.Text = "Lua+LuaInterface - Faster but memory leaks, use at your own risk!"; - this.LuaInterfaceRadio.UseVisualStyleBackColor = true; - // - // NLuaRadio - // - this.NLuaRadio.AutoSize = true; - this.NLuaRadio.Location = new System.Drawing.Point(4, 17); - this.NLuaRadio.Name = "NLuaRadio"; - this.NLuaRadio.Size = new System.Drawing.Size(194, 17); - this.NLuaRadio.TabIndex = 0; - this.NLuaRadio.TabStop = true; - this.NLuaRadio.Text = "NLua+KopiLua - Reliable but slower"; - this.NLuaRadio.UseVisualStyleBackColor = true; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(27, 270); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(296, 39); - this.label6.TabIndex = 19; - this.label6.Text = "Will reduce many Out Of Memory crashes during long movies.\r\nThis is experimental;" + - " it may require admin permissions.\r\nYou must restart the program after changing " + - "this."; - // - // cbMoviesInAWE - // - this.cbMoviesInAWE.AutoSize = true; - this.cbMoviesInAWE.Location = new System.Drawing.Point(6, 250); - this.cbMoviesInAWE.Name = "cbMoviesInAWE"; - this.cbMoviesInAWE.Size = new System.Drawing.Size(262, 17); - this.cbMoviesInAWE.TabIndex = 18; - this.cbMoviesInAWE.Text = "Store movie working data in extended > 1GB Ram"; - this.cbMoviesInAWE.UseVisualStyleBackColor = true; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(27, 221); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(299, 26); - this.label5.TabIndex = 17; - this.label5.Text = "Will prevent many Out Of Memory crashes during long movies.\r\nYou must restart the" + - " program after changing this."; - // - // cbMoviesOnDisk - // - this.cbMoviesOnDisk.AutoSize = true; - this.cbMoviesOnDisk.Location = new System.Drawing.Point(6, 201); - this.cbMoviesOnDisk.Name = "cbMoviesOnDisk"; - this.cbMoviesOnDisk.Size = new System.Drawing.Size(259, 17); - this.cbMoviesOnDisk.TabIndex = 16; - this.cbMoviesOnDisk.Text = "Store movie working data on disk instead of RAM"; - this.cbMoviesOnDisk.UseVisualStyleBackColor = true; - // - // LuaDuringTurboCheckbox - // - this.LuaDuringTurboCheckbox.AutoSize = true; - this.LuaDuringTurboCheckbox.Location = new System.Drawing.Point(6, 178); - this.LuaDuringTurboCheckbox.Name = "LuaDuringTurboCheckbox"; - this.LuaDuringTurboCheckbox.Size = new System.Drawing.Size(166, 17); - this.LuaDuringTurboCheckbox.TabIndex = 15; - this.LuaDuringTurboCheckbox.Text = "Run lua scripts when turboing"; - this.LuaDuringTurboCheckbox.UseVisualStyleBackColor = true; - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(24, 162); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(231, 13); - this.label12.TabIndex = 14; - this.label12.Text = "frames in which no input was polled (lag frames)"; - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(24, 149); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(268, 13); - this.label13.TabIndex = 13; - this.label13.Text = "When enabled, the frame advance button will skip over"; - // - // FrameAdvSkipLagCheckbox - // - this.FrameAdvSkipLagCheckbox.AutoSize = true; - this.FrameAdvSkipLagCheckbox.Location = new System.Drawing.Point(6, 129); - this.FrameAdvSkipLagCheckbox.Name = "FrameAdvSkipLagCheckbox"; - this.FrameAdvSkipLagCheckbox.Size = new System.Drawing.Size(241, 17); - this.FrameAdvSkipLagCheckbox.TabIndex = 12; - this.FrameAdvSkipLagCheckbox.Text = "Frame advance button skips non-input frames"; - this.FrameAdvSkipLagCheckbox.UseVisualStyleBackColor = true; - // - // BackupSRamCheckbox - // - this.BackupSRamCheckbox.AutoSize = true; - this.BackupSRamCheckbox.Location = new System.Drawing.Point(6, 39); - this.BackupSRamCheckbox.Name = "BackupSRamCheckbox"; - this.BackupSRamCheckbox.Size = new System.Drawing.Size(203, 17); - this.BackupSRamCheckbox.TabIndex = 9; - this.BackupSRamCheckbox.Text = "Backup SaveRAM to .SaveRAM.bak"; - this.BackupSRamCheckbox.UseVisualStyleBackColor = true; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(24, 23); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(234, 13); - this.label4.TabIndex = 2; - this.label4.Text = "If off, the log window will be a dialog box instead"; - // - // LogWindowAsConsoleCheckbox - // - this.LogWindowAsConsoleCheckbox.AutoSize = true; - this.LogWindowAsConsoleCheckbox.Location = new System.Drawing.Point(6, 3); - this.LogWindowAsConsoleCheckbox.Name = "LogWindowAsConsoleCheckbox"; - this.LogWindowAsConsoleCheckbox.Size = new System.Drawing.Size(233, 17); - this.LogWindowAsConsoleCheckbox.TabIndex = 1; - this.LogWindowAsConsoleCheckbox.Text = "Create the log window as a console window"; - this.LogWindowAsConsoleCheckbox.UseVisualStyleBackColor = true; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(6, 16); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(225, 13); - this.label9.TabIndex = 28; - this.label9.Text = "Save SaveRAM to .AutoSaveRAM.SaveRAM"; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(9, 34); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(33, 13); - this.label10.TabIndex = 29; - this.label10.Text = "every"; - // - // EmuHawkOptions - // - this.AcceptButton = this.OkBtn; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(418, 455); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.CancelBtn); - this.Controls.Add(this.OkBtn); - this.Name = "EmuHawkOptions"; - this.ShowIcon = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Customization Options"; - this.Load += new System.EventHandler(this.GuiOptions_Load); - this.tabControl1.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.tabPage1.PerformLayout(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.tabPage3.ResumeLayout(false); - this.tabPage3.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.AutosaveSRAMtextBox)).EndInit(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button OkBtn; - private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.CheckBox StartPausedCheckbox; - private System.Windows.Forms.CheckBox PauseWhenMenuActivatedCheckbox; - private System.Windows.Forms.CheckBox EnableContextMenuCheckbox; - private System.Windows.Forms.CheckBox SaveWindowPositionCheckbox; - private System.Windows.Forms.CheckBox RunInBackgroundCheckbox; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.CheckBox AcceptBackgroundInputCheckbox; - private System.Windows.Forms.CheckBox NeverAskSaveCheckbox; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.CheckBox SingleInstanceModeCheckbox; - private System.Windows.Forms.TabPage tabPage3; - private System.Windows.Forms.CheckBox LogWindowAsConsoleCheckbox; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.CheckBox BackupSRamCheckbox; - private System.Windows.Forms.CheckBox FrameAdvSkipLagCheckbox; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.CheckBox StartFullScreenCheckbox; - private System.Windows.Forms.CheckBox LuaDuringTurboCheckbox; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.CheckBox cbMoviesOnDisk; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.CheckBox cbMoviesInAWE; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.RadioButton LuaInterfaceRadio; - private System.Windows.Forms.RadioButton NLuaRadio; - private System.Windows.Forms.CheckBox AutosaveSRAMCheckbox; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.RadioButton AutosaveSRAMradioButton3; - private System.Windows.Forms.RadioButton AutosaveSRAMradioButton2; - private System.Windows.Forms.RadioButton AutosaveSRAMradioButton1; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.NumericUpDown AutosaveSRAMtextBox; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label9; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GuiOptions.cs b/BizHawk.Client.EmuHawk/config/GuiOptions.cs deleted file mode 100644 index d5106c9d24..0000000000 --- a/BizHawk.Client.EmuHawk/config/GuiOptions.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class EmuHawkOptions : Form - { - public int AutosaveSaveRAMSeconds { - get { - if (AutosaveSRAMradioButton1.Checked) - return 5; - if (AutosaveSRAMradioButton2.Checked) - return 5 * 60; - return (int)AutosaveSRAMtextBox.Value; - } - set { - switch (value) - { - case 5: - AutosaveSRAMradioButton1.Checked = true; - AutosaveSRAMtextBox.Enabled = false; - break; - case 5 * 60: - AutosaveSRAMradioButton2.Checked = true; - AutosaveSRAMtextBox.Enabled = false; - break; - default: - AutosaveSRAMradioButton3.Checked = true; - AutosaveSRAMtextBox.Enabled = true; - break; - } - AutosaveSRAMtextBox.Value = value; - } - } - - public EmuHawkOptions() - { - InitializeComponent(); - } - - private void GuiOptions_Load(object sender, EventArgs e) - { - StartFullScreenCheckbox.Checked = Global.Config.StartFullscreen; - StartPausedCheckbox.Checked = Global.Config.StartPaused; - PauseWhenMenuActivatedCheckbox.Checked = Global.Config.PauseWhenMenuActivated; - EnableContextMenuCheckbox.Checked = Global.Config.ShowContextMenu; - SaveWindowPositionCheckbox.Checked = Global.Config.SaveWindowPosition; - RunInBackgroundCheckbox.Checked = Global.Config.RunInBackground; - AcceptBackgroundInputCheckbox.Checked = Global.Config.AcceptBackgroundInput; - NeverAskSaveCheckbox.Checked = Global.Config.SupressAskSave; - SingleInstanceModeCheckbox.Checked = Global.Config.SingleInstanceMode; - - BackupSRamCheckbox.Checked = Global.Config.BackupSaveram; - AutosaveSRAMCheckbox.Checked = Global.Config.AutosaveSaveRAM; - groupBox2.Enabled = AutosaveSRAMCheckbox.Checked; - AutosaveSaveRAMSeconds = Global.Config.FlushSaveRamFrames / 60; - FrameAdvSkipLagCheckbox.Checked = Global.Config.SkipLagFrame; - LogWindowAsConsoleCheckbox.Checked = Global.Config.WIN32_CONSOLE; - LuaDuringTurboCheckbox.Checked = Global.Config.RunLuaDuringTurbo; - cbMoviesOnDisk.Checked = Global.Config.MoviesOnDisk; - cbMoviesInAWE.Checked = Global.Config.MoviesInAWE; - - NLuaRadio.Checked = Global.Config.UseNLua; - LuaInterfaceRadio.Checked = !Global.Config.UseNLua; - - if (LogConsole.ConsoleVisible) - { - LogWindowAsConsoleCheckbox.Enabled = false; - toolTip1.SetToolTip( - LogWindowAsConsoleCheckbox, - "This can not be changed while the log window is open. I know, it's annoying."); - } - } - - private void OkBtn_Click(object sender, EventArgs e) - { - Global.Config.StartFullscreen = StartFullScreenCheckbox.Checked; - Global.Config.StartPaused = StartPausedCheckbox.Checked; - Global.Config.PauseWhenMenuActivated = PauseWhenMenuActivatedCheckbox.Checked; - Global.Config.ShowContextMenu = EnableContextMenuCheckbox.Checked; - Global.Config.SaveWindowPosition = SaveWindowPositionCheckbox.Checked; - Global.Config.RunInBackground = RunInBackgroundCheckbox.Checked; - Global.Config.AcceptBackgroundInput = AcceptBackgroundInputCheckbox.Checked; - Global.Config.SupressAskSave = NeverAskSaveCheckbox.Checked; - Global.Config.SingleInstanceMode = SingleInstanceModeCheckbox.Checked; - - Global.Config.BackupSaveram = BackupSRamCheckbox.Checked; - Global.Config.AutosaveSaveRAM = AutosaveSRAMCheckbox.Checked; - Global.Config.FlushSaveRamFrames = AutosaveSaveRAMSeconds * 60; - if (GlobalWin.MainForm.AutoFlushSaveRamIn > Global.Config.FlushSaveRamFrames) - GlobalWin.MainForm.AutoFlushSaveRamIn = Global.Config.FlushSaveRamFrames; - Global.Config.SkipLagFrame = FrameAdvSkipLagCheckbox.Checked; - Global.Config.WIN32_CONSOLE = LogWindowAsConsoleCheckbox.Checked; - Global.Config.RunLuaDuringTurbo = LuaDuringTurboCheckbox.Checked; - Global.Config.MoviesOnDisk = cbMoviesOnDisk.Checked; - Global.Config.MoviesInAWE = cbMoviesInAWE.Checked; - - bool changedLua = Global.Config.UseNLua != NLuaRadio.Checked; - Global.Config.UseNLua = NLuaRadio.Checked; - - Close(); - DialogResult = DialogResult.OK; - GlobalWin.OSD.AddMessage("Custom configurations saved."); - if(changedLua) GlobalWin.OSD.AddMessage("Restart emulator for Lua change to take effect"); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - Close(); - DialogResult = DialogResult.Cancel; - GlobalWin.OSD.AddMessage("Customizing aborted."); - } - - private void AutosaveSRAMCheckbox_CheckedChanged(object sender, EventArgs e) - { - groupBox2.Enabled = AutosaveSRAMCheckbox.Checked; - } - - private void AutosaveSRAMradioButton3_CheckedChanged(object sender, EventArgs e) - { - AutosaveSRAMtextBox.Enabled = AutosaveSRAMradioButton3.Checked; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs b/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs deleted file mode 100644 index 24adc44d21..0000000000 --- a/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs +++ /dev/null @@ -1,259 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class HotkeyConfig : Form - { - public HotkeyConfig() - { - InitializeComponent(); - - Closing += (o, e) => - { - IDB_SAVE.Focus(); // A very dirty hack to avoid https://code.google.com/p/bizhawk/issues/detail?id=161 - }; - - tabPage1.Focus(); - } - - protected override void OnActivated(EventArgs e) - { - base.OnActivated(e); - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, true); - } - - protected override void OnDeactivate(EventArgs e) - { - base.OnDeactivate(e); - Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, false); - } - - private void NewHotkeyWindow_Load(object sender, EventArgs e) - { - var source = new AutoCompleteStringCollection(); - source.AddRange(Global.Config.HotkeyBindings.Select(x => x.DisplayName).ToArray()); - - SearchBox.AutoCompleteCustomSource = source; - SearchBox.AutoCompleteSource = AutoCompleteSource.CustomSource; - - AutoTabCheckBox.Checked = Global.Config.HotkeyConfigAutoTab; - DoTabs(); - DoFocus(); - } - - private void IDB_CANCEL_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Hotkey config aborted"); - Close(); - } - - private void IDB_SAVE_Click(object sender, EventArgs e) - { - Save(); - GlobalWin.OSD.AddMessage("Hotkey settings saved"); - DialogResult = DialogResult.OK; - Close(); - } - - private void AutoTabCheckBox_CheckedChanged(object sender, EventArgs e) - { - SetAutoTab(); - } - - private void Save() - { - Global.Config.HotkeyConfigAutoTab = AutoTabCheckBox.Checked; - - foreach (var w in InputWidgets) - { - var b = Global.Config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == w.WidgetName); - b.Bindings = w.Bindings; - } - } - - private IEnumerable InputWidgets - { - get - { - var widgets = new List(); - for (var x = 0; x < HotkeyTabControl.TabPages.Count; x++) - { - for (var y = 0; y < HotkeyTabControl.TabPages[x].Controls.Count; y++) - { - if (HotkeyTabControl.TabPages[x].Controls[y] is InputCompositeWidget) - { - widgets.Add(HotkeyTabControl.TabPages[x].Controls[y] as InputCompositeWidget); - } - } - } - return widgets; - } - } - - private void DoTabs() - { - HotkeyTabControl.TabPages.Clear(); - - // Buckets - var tabs = Global.Config.HotkeyBindings.Select(x => x.TabGroup).Distinct().ToList(); - - foreach (var tab in tabs) - { - var _y = UIHelper.ScaleY(14); - var _x = UIHelper.ScaleX(6); - - var tb = new TabPage {Name = tab, Text = tab}; - - var bindings = Global.Config.HotkeyBindings.Where(x => x.TabGroup == tab).OrderBy(x => x.Ordinal).ThenBy(x => x.DisplayName).ToList(); - - int iwOffsetX = UIHelper.ScaleX(110); - int iwOffsetY = UIHelper.ScaleY(-4); - int iwWidth = UIHelper.ScaleX(120); - foreach (var b in bindings) - { - var l = new Label - { - Text = b.DisplayName, - Location = new Point(_x, _y), - Size = new Size(iwOffsetX - UIHelper.ScaleX(2), UIHelper.ScaleY(15)), - }; - - var w = new InputCompositeWidget - { - Location = new Point(_x + iwOffsetX, _y + iwOffsetY), - AutoTab = AutoTabCheckBox.Checked, - Width = iwWidth, - WidgetName = b.DisplayName, - }; - - w.SetupTooltip(toolTip1, b.ToolTip); - toolTip1.SetToolTip(l, b.ToolTip); - - w.Bindings = b.Bindings; - - tb.Controls.Add(l); - tb.Controls.Add(w); - - _y += UIHelper.ScaleY(24); - if (_y > HotkeyTabControl.Height - UIHelper.ScaleY(35)) - { - _x += iwOffsetX + iwWidth + UIHelper.ScaleX(10); - _y = UIHelper.ScaleY(14); - } - } - - if (tab == "TAStudio") - { - tb.Controls.Add(new Label - { - Text = "Save States hotkeys operate with branches when TAStudio is engaged.", - Location = new Point(_x, _y), - Size = new Size(iwWidth + iwOffsetX, HotkeyTabControl.Height - _y), - }); - } - - HotkeyTabControl.TabPages.Add(tb); - } - } - - private void Defaults() - { - foreach (var w in InputWidgets) - { - var b = Global.Config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == w.WidgetName); - if (b != null) - { - w.Bindings = b.DefaultBinding; - } - } - } - - private void ClearAll(bool currentTabOnly) - { - if (currentTabOnly) - { - foreach (var w in InputWidgets) - { - w.Clear(); - } - } - else - { - foreach (var w in HotkeyTabControl.SelectedTab.Controls.OfType()) - { - w.Clear(); - } - } - } - - private void SetAutoTab() - { - foreach (var w in InputWidgets) - { - w.AutoTab = AutoTabCheckBox.Checked; - } - } - - private void HotkeyTabControl_SelectedIndexChanged(object sender, EventArgs e) - { - DoFocus(); - } - - private void DoFocus() - { - if (HotkeyTabControl.SelectedTab != null) - { - foreach (var c in HotkeyTabControl.SelectedTab.Controls.OfType()) - { - c.Focus(); - return; - } - } - } - - private void SearchBox_KeyDown(object sender, KeyEventArgs e) - { - // Tab or Enter - if (!e.Control && !e.Alt && !e.Shift && - (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)) - { - var b = Global.Config.HotkeyBindings.FirstOrDefault(x => string.Compare(x.DisplayName, SearchBox.Text, true) == 0); - - // Found - if (b != null) - { - var w = InputWidgets.FirstOrDefault(x => x.WidgetName == b.DisplayName); - if (w != null) - { - HotkeyTabControl.SelectTab((TabPage)w.Parent); - Input.Instance.BindUnpress(e.KeyCode); - w.Focus(); - } - } - - e.Handled = true; - } - } - - private void ClearAllToolStripMenuItem_Click(object sender, EventArgs e) - { - ClearAll(true); - } - - private void ClearCurrentTabToolStripMenuItem_Click(object sender, EventArgs e) - { - ClearAll(false); - } - - private void RestoreDefaultsToolStripMenuItem_Click(object sender, EventArgs e) - { - Defaults(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/HotkeyConfig.resx b/BizHawk.Client.EmuHawk/config/HotkeyConfig.resx deleted file mode 100644 index 62c9bc5870..0000000000 --- a/BizHawk.Client.EmuHawk/config/HotkeyConfig.resx +++ /dev/null @@ -1,875 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 114, 17 - - - - - AAABAAsAMDAQAAAABABoBgAAtgAAACAgEAAAAAQA6AIAAB4HAAAQEBAAAAAEACgBAAAGCgAAMDAAAAAA - CACoDgAALgsAACAgAAAAAAgAqAgAANYZAAAQEAAAAAAIAGgFAAB+IgAAQEAAAAAAIAAoQgAA5icAADAw - AAAAACAAqCUAAA5qAAAgIAAAAAAgAKgQAAC2jwAAGBgAAAAAIACICQAAXqAAABAQAAAAACAAaAQAAOap - AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHd3d3d3gIk5uTm5 - OAh3d3d3d4AAAAAAd3eHeHd3c5t5d5iXmTd3h3h3h3cAAAAAeIeIh4iIeXiIiIiIh5iIeIeIeHcAAAAA - d4+IiIiIiYiIiIiIiJuIiI+IiIcAAAAAePiPj/j4ibj4/4/4+JiPj4+Pj4cAAAAAeI+PiPj4iYj4j4j4 - iJiPj4+PiIcAAAAAePiI+IiPiYiIiPiPiLeIiIiI+IcAAAAAf4eId/iIiYiHeIiIiJiId3j4iIcAAAAA - eIhneIiIibiId4iIiJuHeHeIiPcAAAAAf4h3d4iIiYiHeIiIiJiHeHeIiIcAAAAAf3h3eHh4i4h3d4eI - iLiHd3eHiIgAAAAAf4d3d4eIiYh3d3h3iJh3d3h4eIcAAAAAf4h4eIeIibiHh4h4iJiIh4eHiPcAAAAA - h4+PiIiIg5l5uXmJuZuZuPj4+HgAAAAAAHd3d4eHeHuXm5uTl7l7mXd4dwAAAAAAAAAAeHh4h4eIeXiI - iHiHibAAAAAAAAAAAAAIeIiIiIiIm4iIiIiIh5AAAAAAAAAAAAAIePj4+P+IeYj4/4/495AAAAAAAAAA - AAAIiIj4+I+Pm4+PiPiPiJAAAAAAAAAAAAAIf4iIiIj4iYiHiI+I85AAAAAAAAAAAAAIiIh3d4iIefh3 - iIiIiJAAAAAAAAAAAAAIiIh3d3iIuYh3eIiIiJAAAAAAAAAAAAAIiId3Z3iIifh3iIiIiJAAAAAAAAAA - AAAIiId3d3iIk/d3d4iIi5AAAAAAAAAAAAAIiId4eHd4ifd3eHd3iJAAAAAAAAAAAAAIj3h3h4ePiYiH - h4eIibAAAAAAAAAAAAAAeI+Pj4+IebmHd3d5iYAAAAAAAAAAAAAAB3d3d3d3AIm5m5m5uAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA+ABAAgAfAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAA - AAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAP - AADwAAAAAA8AAPwAAAAAPwAA/8AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+A - AAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP/AAAAH/wAA/+ADAA// - AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP// - AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH - d3d3d5OXk5N3d3d3cAAAB4iIiImIiIiImIiIiHAAAIiPiPiDj4/4+Jj4+I94AACIiPj4+Yj4j4i4j4+I - iAAAiIiHiIuIeIiIn3eIj4gAAIiHeIiJiHeIiJh4eIiIAACIh3eIh4d4iIi4d3h4iAAAiId4d4mId3eI - mHd4eIgAAAf4iIj3uYt3uTh4iIiAAAAAAHeHd3eZmJibmYAAAAAAAACIiIiIi4iIiPewAAAAAAAAeI+P - +ImPj/j3cAAAAAAAAIiIiI+J+IiI+JAAAAAAAACIh4eIiYd4iIiwAAAAAAAAf4d3eIuHeIiIkAAAAAAA - AIiHd3iJh3h4iIAAAAAAAACIh3h3+Yh4d4eQAAAAAAAAB4iIiIebeYm5AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// - ////////4AAAB+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPgAAAH/AAAf/wAAH/8AAB//AAAf/wA - AH/8AAB//AAAf/wAAH/+AAD//////////////////////////////////////ygAAAAQAAAAIAAAAAEA - BAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA - wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIh7iI - iAAIiIeIiJiIgAiIiIiIiIiACHeHh4iYeIAIiIe3eLeIgAAHiHmJh4AAAAiI94+IAAAACHeHh4gAAAAI - h3eIeAAAAACI8ImLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAAwAAgAEAAIAB - AACAAQAAgAEAAOAHAADgDwAA4A8AAOAPAADxDwAA//8AAP//AAD//wAAKAAAADAAAABgAAAAAQAIAAAA - AAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAABsaGUAb2toAHBsaQBybmwAdXFuAHZzcAB5dXIAenZ0AH14 - dgB+enkAf3x5AIB7egCBfXoAgn58AISAfgAqW7oAPGa5AHp8gwB3f48AK2HMADtt1gA8btcAMGnbADxv - 2AA8cNgAEljhABFY5wAcXuUAElrrABNb7AABUPYABFP0AABR+AALWfgAFV73ABxg6AAYYPcAHWP3ABxk - 9wAYYfgAJmPgACdk4QAhYuQAKWXhACFn9gAkaPMAI2n3AClr8gAobfkALnH4ADl18gA6d/QAOnjzADR1 - +ABVecAAU3jEAFV+zwBHdNMAQnXZAEd32gBMfN8ATn/hAG+KvwBdgsUAX4bUAGOGygBmicwAb47NAGaN - 2wBvk9UAaZDeAHqX1gB0mNsAeJveAFGC5ABUhecAV4fqAFqL7QBGgfYATon5AFaI8ABTiPYAWIryAFKJ - +ABtlOIAcZfmAHqe4AB1m+kAeZ/tAGCQ8QBxm/EAfKDjAH+j5gBzofYAeqLyAH2l+ACDgYIAhoKAAIiE - ggCKhoQAi4iFAIyJhgCOiogAj4yJAIyLjACOjIwAkIuJAJCMigCRjowAk5COAJSQjgCWkpAAmJORAJiU - kgCalpQAm5iWAJyYlgCQlJ4AlZacAJmYmQCempgAn5yaAJybngCgm5oAoJyaAKKdnACkn50ApKCeAImS - qQCTm6kAhJS3AIibuwCjn6AAoqKiAKaioACnpKIAoqCkAKWlpQCoo6EAqKSiAKqlpACqqKYArKimAKOm - qwClpqkAoqWsAKmpqgCtqqgArqyqAKiprQCwrKoAsa6tALKwrgC1sa8ArrC0ALSxsAC1tLUAuLSyALm1 - tAC8ubcAvbq5AL+8uwC/vbwAwL27AMG+vQDDwb8AgJ3bAJChxACaq8oAmKjMAIOh3wCcrdAAn7HUAKGy - 0QCltdQAp7jXAKO12ACqu9oAqLndAK6/3QCHpeMAjKnnAIGl6QCGqu4AkK3rAJSx7wCDqfIAlbP0AJK0 - 9ACsveEAscHgALLD5wC2x+YAqMT3AKzG9QDDwcAAxMLAAMbEwwDGxcQAycbFAMvIxwDFxcgAzMrJAM7M - ygDPzcwA0M7NANLQzwDNztIAzM/XANLR0ADU0tEA1tTTANPT1QDW1dQA2NbUANnY1gDa2dgA3NrZAN7c - 2wDe3dwA4t/eAOLg3gDP2e4A4+LhAOTi4gDm5OMA6OblAOzq6gDw7u4A8/PyAPTz8gAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5iYmJiYmJiYmJhlgBbLSUoKCUoKCUoJVIAlmFh - YmJiYmJiYmKOAAAAAAAAAAAAbw5zc3Nzc3JzcnJvChQhLBkYFhYWFhYWFyEaEnNzc3Nzc3Fxb28ObwAA - AAAAAAAAB42NjY2NjY2Nh4d/gSE7lpaWlpaWjpGHh0AhP42NjY2NjY2Nh39/BwAAAAAAAAAADpjG1tjY - 2NjW2NakgyFExtbX19fY2NjWyoQhQ8bW2NjY2NTW1qaNCgAAAAAAAAAAYqTa2tra19rX2traqCFI19ra - 2tfa2tra2qkhRtra2trX19vX2tqfDgAAAAAAAAAAY8na2tra2tva2traqR+n2tra29va2tra2q4hSdra - 2tra29va2trGYgAAAAAAAAAAY87YzM7Yzs7Y2NjYrB+r2M6kydjY2NjY2K4hStjMpMnW2NjY2NjJYgAA - AAAAAAAAZ9bJb23MDn/JyczMrCG1zHNiBYfJycnMzLAhV8xzBwcOpMnJycnMYwAAAAAAAAAAZ9qkjgEF - ApikpKTJsSG2xqScDmempqakxrIhXMZvbaQObaSmpqbWZgAAAAAAAAAAb96fmAVtB5yfn5+fsiG5oX8E - Do6fn5+fn7IhXaBnY59mYZ+fn5/XbQAAAAAAAAAAb+OOjg4EY5aXjo6aviG6mmEJc4eOjo6OmL8ht5hm - DnMEbY6OjpfbbQAAAAAAAAAAcuWNf20Kc39/f3+NwCG8lnkOB3F/f39/jcEhuI5tCQlmf39/f3/kbQAA - AAAAAAAAYubOjY2Hh4eHh43W3yFS0Y6NjYeHjX+Nxl4hwtCJh4eHh4eHjc7kDgAAAAAAAAAAf23Y2tra - 2trSzM7MZxAhMTMzMzMzMzMzMiEhLjIxM7za2tra2tZtfwAAAAAAAAAAAAB6enlmBGJycm9ycm04KRwc - GiEhJCQkKywsKykpHiERdnp6enoAAAAAAAAAAAAAAAAAAAAAYo2HjYeHh4eHiXp7OCFCkZGRkZGHjoeH - gisoAAAAAAAAAAAAAAAAAAAAAAAAAACWc5jJ0tbWztbO0syYOiGcytbW1tbW1tHMnDkhAAAAAAAAAAAA - AAAAAAAAAAAAAACOh8nX2tfa2tra2trOPCHG2trZ2dnZ2tra1kEhAAAAAAAAAAAAAAAAAAAAAAAAAACY - h8za2tra2tra2trYPSHW2tra2tra2tra2kUhAAAAAAAAAAAAAAAAAAAAAAAAAACYjtbY1oehpH/Y2NjW - Ph/W1od6eszY2NjY2EchAAAAAAAAAAAAAAAAAAAAAAAAAACamNLMoQJtcgGhzMzOSx/WyQZ5jcbMzMzM - zlUhAAAAAAAAAAAAAAAAAAAAAAAAAACanNamhwoKCgd6xqbJSyHYoQZjcqHGpsamyVYhAAAAAAAAAAAA - AAAAAAAAAAAAAACcodafY20HBG0On5/GTR/YmgVyepyfn5+fpFghAAAAAAAAAAAAAAAAAAAAAAAAAACc - xtaOB29iBXoEjZakTSHajQUHDo2Wl5aXn1khAAAAAAAAAAAAAAAAAAAAAAAAAACaxth/c39zc39zf3+g - WiHah3Nycn9/f39/ml8hAAAAAAAAAAAAAAAAAAAAAAAAAAChmOaYc3l5eXlzf3/buyHCn3pzf3N5eXl/ - 1k8jAAAAAAAAAAAAAAAAAAAAAAAAAAAADsbj4eHh4eHh2+PYEx4iUlFRUVFSTVFRNiFgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAHNmZ2dnZ2dnZ2dnAABPKCUoKCUlKCgoLmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAPgAQAIAHwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAA - AAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAP - AAD8AAAAAD8AAP/AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+A - AAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/wAAAB/8AAP/gAwAP/wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAG5q - ZwB2cnAAeHRyAHt3dAB9eXcAf3t4AIF9ewCCfnwAhIB+AEJqugAOWe8AEVrtAAVT8AAAUfcABFT2AAlW - 8gAIVvQAClj1AA9d9wAAUfgAC1n4ABNd9AAVYPgAI2LjACdk4QAnZeQAKGTiACBi6QAiZOwAJGbuACdp - 8AApa/MAJGv5AC5w9QAxc/cAOXbzADl29QBFcc0ATHbMAFR4wQBQeMwARnXTAEd11ABUfdMAZoG4AGSA - vAB9krgAVYDcAGqJxQBihMoAbozIAGGI2wBOhPMAT4b2AFGG9QBWifIAWY33AGaN4QBpkeUAa5n2AIaC - gACIhIIAioaEAIyHhQCMiIUAjoqIAJCMigCSjowAl5ORAJiUkgCalpQAm5iWAJyZlwCempkAn5yaAKCc - mgChnpwApaGgAKakogClpKcAqKOiAKikogCppqQArKemAKqopQCsqKcArqqoALCsqgCxrq0AsrCuAKmu - twCysbEAtbKxALa1tQC4tLIAuLW0ALq4twC8ubcAubi4AL26uQC+vLsAvLy8AMC9uwDAvbwAwsC+AIeh - 1ACKptsAjqfbAI+o3ACVqdIAkardAJ+y2wCrtssAu77HALK8zwCgs9wAs77RALC+2ACEp+8An7XlAL7B - ygC1wNMAtsDUAL7I3QDCwcAAxcLBAMbEwgDFxMQAycbFAMrIxgDBxc4AzMnIAM7MywDPzcwA0M7MANLQ - zwDEx9EA09HQANTS0ADW1NMA2NbVANvY1wDa2dkA3NrZAN7c2wDf3t0A7OvqAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEFBQUFBPz4uEBsbGxsY - GBAoP0FBQUE/PwgAAAAAAABNWWBgYGBgTxgzYGZgZmBgLwtVYGBgYGBTRwAAAAAAWVmOjo6Ojo6FHW6O - jo6Ojo5xEIeOjo6Ojo5VWQAAAABaZo6OjpGOjo0dcI6OkZGRjnoTjY6OkY6OjmJaAAAAAGCAhUmAS4yM - hx10YERPhYuLehONR0RPjYuMZmAAAAAAYIVmBQRLaGaBIXRmRz5pZmZ1E4E+YgZgZmaBYAAAAABgjVlE - A1NZWWghdEcIT1lZWXMTaQhLBFNZWYdgAAAAAGCOT0k/TU1NgCF4TT9ETU1NdROARD9ETU1TjV4AAAAA - AEuOhYWFgICMCiE7NDQ0NDojFjwwa4eFhY1JAAAAAAAAAAAARD9HR0dHLiYmDxgmKikpKScMMgAAAAAA - AAAAAAAAAABNWWiAgYCAaE8PW4CAgICAZjE4AAAAAAAAAAAAAAAAAE2Ajo6Ojo6OgA+LjpGOjo6OajUA - AAAAAAAAAAAAAAAAT4WOaYdgjo6JD42AYICOjo5vNQAAAAAAAAAAAAAAAABPjYUIRwFmhYMPjURNZoWF - hW81AAAAAAAAAAAAAAAAAFWNYAgECElmeQ+FPj9ZZmZgbzUAAAAAAAAAAAAAAAAAVY5LQQhHP1NmD4U/ - CUlTU1NvNQAAAAAAAAAAAAAAAABPk1NLTUlLTZEPfE1LS0tJU3c5AAAAAAAAAAAAAAAAAABJaWiAaICA - TykXJCQkJCQkEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD/////////////////////////////////////4AAAB+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA - AAPgAAAH/AAAf/wAAH/8AAB//AAAf/wAAH/8AAB//AAAf/wAAH/+AAD///////////////////////// - /////////////ygAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAgX17ADtu - 1wB4ibEAfo6xAGGFzwBujM4Ad5PMAGWK1gBpj9wAc5PXAHqX0wB2ltkAe5veAF+K4gBVhekAYIriAGaP - 5ABvleMAapbvAHOc7wBvmvAAdJ71AHeg9QB5ovcAjouIAJKOjACXkpAAmJWSAJ2YlwCempgAop+dAKah - nwCBkrsApqOhAKilowCqp6UAr6uqAK+sqwCwrKsAsa6tALKwrgC0sK4Arq2xALOxsQC0sbAAt7W0ALi0 - swC5trUAuri2ALy5twC+u7oAv728AMC+vACMnMIAgZrPAImeyQCbqMYApa3BAK61wwClscoAqrXOAK+4 - ygC1uMIAtLzQALO/2ACjtuAAxcLBAMbEwwDJxsUAycjIAMzKyQDPzcwA0c/OAMXK0wDV09IA1tTSANzZ - 2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS0+FBMTFT0tLS0AAAAk - RUVFBjxGRjsIRUVDJAAALUNDTA1AMkxKEi5GTCYAADIeGS4MOhouPwkcHC4tAAA0Mi0tNwoDIQsPAy4y - NAAAAAAcJic2Agc4OAVCAAAAAAAAJ0xGTRBJRk1BAAAAAAAAADIfAS4QJyRDPQAAAAAAAAA1HRwdECsb - HzkAAAAAAAAAAEZGSQAXFhYXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//AAD//wAA//8AAMADAACAAQAAgAEAAIABAACAAQAA4AcAAOAPAADgDwAA4A8AAPEP - AAD//wAA//8AAP//AAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUfgDAFH4AwBR - +AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1pZgxsaGVKbGhle2xo - ZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlfmxoZVtuaWUWAEv/AQBR - +C0AUfh1AFH4lgBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiYAFH4ggBR - +EEAUPwHcGphFmxoZVtsaGV+bGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxo - ZYBsaGV7bGhlSm1pZgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1p - ZhRsaGWWb2to8Xh0cv98eHX/fHh1/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3p1 - c/9xbWv4bGlmtxxY0HkAUfnaAFD5/gBP+f8AT/r/AE/6/wBP+v8AT/r/AE/6/wBP+v8AT/r/AFD6/wBQ - +v8AUPr/AFD6/wBQ+f8AUfnrDFTllmZnbblybmr4enZz/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3x4 - df98eHX/fHh1/3x4df98eHX/eHRx/29raPFsaGWWbWlmFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAG1pZgFsaGV6cm5r+4+Lif+fm5n/oJya/6Cbmf+fmpn/n5qZ/56amP+emZf/npmX/52Z - l/+dmJf/nZiX/52Ylv+cl5b/k46L/2Jviv4LVOX7AFH5/yRl5f9OedD/UnvO/1F6zv9Res3/UXnN/1B5 - zf9Qec3/UHnM/1B4zP9QeMz/T3jL/053y/8wadz/BFP2/wNR8f5Qa6L/l5KO/6Cbmv+gnJr/oJuZ/5+a - mf+fmpn/npqY/56Zl/+emZf/nZmX/52Yl/+dmJb/nZiW/5uWlf+Mh4X/cW1r/GxoZXltaWcBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGUVbWlmzYmFg/+qpaT/qaSj/6ijov+ppKP/qKSj/6ij - ov+noqH/p6Kh/6ahoP+moZ//paCf/6Sgnv+jnp3/op2c/6Sem/9Rd8T/AE/5/yFk6P+PnbX/q6qn/6uq - p/+rqqf/q6mn/6qppv+pqKX/qail/6inpP+npqP/p6aj/6alov+ko6D/l56n/ztx1/8AUPn/NGvc/6Ki - p/+ppKP/qaSj/6mko/+opKP/qKOi/6eiof+noqH/pqGg/6ahn/+loJ//pJ+e/6OenP+inpz/op2c/4WB - f/9taWbLbGllFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlK3BsaeialpT/sKyr/7Wx - sP/DwL//ycbF/8nGxf/JxsX/ycbE/8jFxP/IxcT/yMXE/8jEw//IxMP/xMHA/7Swr/+mo6P/Q3PV/wBO - +/9Tftb/tLOx/729vP/Ixsb/ycjI/8nIyP/JyMf/yMfH/8jHx//Ix8f/yMbG/8fGxv/GxcX/vby8/6+t - q/9ujML/A1P2/yBk6P+hpLD/ura0/8bDwv/JxsX/ycbF/8nGxf/JxsT/yMXE/8jFxP/IxcT/yMTD/8fE - w//Avbz/r6uq/6mko/+UkI7/b2to6GxoZSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxo - ZTVxbWrsn5ya/7u3tv/S0M7/3dva/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c - 2//X1NP/trS1/0R01/8ATvv/XITX/8nGw//b2dj/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c - 2//e3Nv/3tzb/93b2v/Lycb/eJPG/wVU9f8gZOn/r7S//9jV0//e3Nv/3tzb/97c2//e3Nv/3tzb/97c - 2//e3Nv/3tzb/97c2//e3Nv/3dva/9DOzP+zr67/mZWT/3BsaexsaGU1AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABsaGU1cW1q66Ognv/IxcT/3NrZ/93b2v/d29r/3dva/93b2v/d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3tzb/8fGx/9Hd9r/AE36/2GJ3P/Z1dH/3tzb/93b2v/d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3NnV/4Kcz/8FVPX/Imbr/77Dz//f3Nr/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/c2tn/w8C+/52Zl/9wbGrrbGhlNQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2dkNXFtauunpKL/zsvK/93b2v/d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2//My8z/Snrd/wBN+v9kjN//3NnU/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93a1/+HotT/BVT1/yNo - 7P/Cx9P/39za/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/8nG - xf+hnZz/cW1q62xoZTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVxbWvrrKmn/9HP - zv/c2dj/3NrZ/93b2v/c2tn/3NnY/9za2f/e29r/3drZ/9zZ2P/c2dj/3NnY/9zZ2P/d2tn/zs3O/0x8 - 4P8ATfr/Z4/i/93Z1f/c2tj/3drZ/9vY1//b2Nf/3drZ/9za2P/c2dj/3NnY/9zZ2P/c2dj/3NnY/9zZ - 2P/d2db/iqTX/wZU9v8lae7/w8nU/93a2P/c2tn/29jX/9rY1//c2tn/3dvZ/9za2P/c2dj/3NnY/9zZ - 2P/c2dj/3NnY/9vZ2P/Mysn/paKg/3FtautsaGQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABrZ2Q1cm5r67Ctq//V0tH/1tTS/8XDwf+loqD/wb68/9fV0//Gw8H/pKGf/727uf/V09L/1dLR/9XS - 0f/V0tH/1tPR/87Nzv9Of+P/AE36/2qS5f/b19P/0tDO/7Ctq/+XlJH/mZaT/7GvrP/Rzsz/1dPR/9XS - 0f/V0tH/1dLR/9XS0f/V0tH/2dXR/42n2v8GVfb/Jmrv/8PJ1P/X1dL/v727/5qWlP+XlJH/oJ2b/7m2 - tP/Rz83/1dPR/9XS0f/V0tH/1dLR/9XS0f/V09H/z83M/6qnpf9xbWrra2dkNQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAa2dkNXJua+u1srD/2NXU/87My/+7ubf/dXFu/5WRj//DwcD/m5mX/3Bs - af+urKr/zcvK/8zJyP/Mycj/zMnI/83Lyf/Ozc7/UYLl/wBM+f9tlej/2NXQ/8jGxP+UkY//iYaE/4WC - f/9zb23/qqem/83Lyv/Mycj/zMnI/8zJyP/Mycj/y8nI/9PPzP+Pqt3/BlX2/ydr8P/DyNT/z83L/6Si - oP9va2j/iISC/4F9e/90cW7/n5ya/8rIx//Mysn/zMnI/8zJyP/Lycj/zcvK/9LQz/+uq6n/cm5r62tn - ZDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVybmzruba1/9rY1//HxMP/wL28/4eE - gf9wbGn/enZ0/3Jua/98eHX/u7m3/8TCwf/EwcD/xMHA/8TBwP/Gw8H/zs3O/1OE6P8ATPn/cJjr/9XS - zf/DwL//v727/766uf+joJ7/b2to/5iVk//Gw8L/xMHA/8TBwP/EwcD/xMHA/8TBwP/Oysf/kq3g/wdW - 9/8obfL/wsfT/8jEwv+gnZv/dXFu/7GurP+7ubf/h4OB/3ZycP+2s7L/xcLB/8TBwP/EwcD/xMHA/8fE - w//V09H/s7Cu/3Jua+trZ2Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrZ2Q1c29s6767 - uf/d29r/wL27/726uP+YlJL/cm5r/5KOjP9zb2z/jYmH/7u4t/+8urj/vLm4/7y5uP+8ubf/vru5/87N - zv9Wh+r/AEz5/3Sc7v/Tz8v/vLm3/62qqP+IhIL/c29s/3l1c/+opaP/vbq4/7y5uP+8ubj/vLm4/7y5 - uP+8ubf/ycbC/5aw4/8HVvf/Km7z/8LH0//Avbr/m5iW/3Rwbf+sqaf/v7y6/5mWlP9wbWr/pKGf/726 - uf+8ubj/vLm4/7y5t//Avbv/2NbU/7e1s/9ybmvra2dkNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAa2dkNXNvbOvDwL7/4d7d/7m1s/+0sa//paGf/3Zyb/+IhIL/dHBt/5uYlf+1srD/tLGv/7Sx - r/+0sa//tLCu/7azsf/Ozc7/WYnt/wBM+f93n/L/0c3I/7GurP+Ig4H/cW1q/4+Mif+opKL/tLGv/7Sx - r/+0sa//tLGv/7Sxr/+0sa//s7Cu/8TAvP+ZtOb/B1b4/ytw9f/Cx9P/uLSx/5eTkf9zb23/pqKg/7Wx - r/+Niof/cW1q/6Kenf+1sa//tLGv/7Sxr/+0sK7/ubWz/9vZ1/+8ubf/cm9s62tnZDUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVzb2zrx8XD/+Ti4P+xraz/rKem/6ijov98eHb/bmto/3Zy - b/+jn57/rKin/6ynpv+sp6b/rKem/6ynpv+uqqj/zs3O/1uM8P8ATPn/eqL1/87Jxf+opKP/gn58/3Nv - bf+QjIr/kY6M/6Whn/+sqKf/rKem/6ynpv+sp6b/rKem/6unpv+/urf/nLfp/whX+P8scfb/wcbS/7Cr - qf+Sjoz/cGxp/4yIhv+NiIf/c29s/356eP+no6L/rKin/6ynpv+sp6b/q6em/7GtrP/e29v/wL68/3Nv - bOtrZ2Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmMzdHBt68zKyf/o5ub/rain/6Oe - nf+kn57/i4eF/3Zyb/+FgX7/op2c/6Sfnv+kn57/pJ+e/6Sfnv+kn57/p6Kh/9DP0P9dj/L/AEv4/3yk - 9//OycX/o56d/5eSkf99eXb/dnJv/3t2dP+ZlZP/pZ+e/6Sfnv+kn57/pJ+e/6Sfnv+jnp3/vbi0/6G7 - 7f8IV/j/LXL4/8PI1f+po6H/k46M/3h0cv94dHH/eXVy/4N/ff+blpX/pJ+e/6Sfnv+kn57/pJ+e/6Oe - nf+tqKf/4+Df/8XCwf9zb2zra2dkMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2dkH3Bs - ad/CwL//+Pf2/8G9vP+gm5n/npmX/5yXlf+ZlJL/m5aU/56Zl/+emZf/npmX/56Zl/+emZf/n5qY/7Ov - rf/n5eT/bJr3/wBM+P9bkPr/29ze/6yno/+gmpf/nZiU/5uVkv+clpP/n5mW/6Cal/+gmpf/oJqX/6Ca - l/+gmpf/paCd/9PQzP+Hrvb/AFH4/z19+v/e4ur/t7Kt/6Calv+clpP/m5WS/5qVk/+dmJb/npmX/56Z - l/+emZf/npmX/56Zl/+gm5n/wLy7//Dv7v+8urj/b2to32tnZB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAG1pZgprZ2SokY6M/+zs6//19PT/1NHQ/8fEw//HxMP/x8XD/8fEw//HxMP/x8TD/8fE - wv/HxML/x8TC/87Lyf/q6ej/8/Hu/3mWzP8BUPH/D176/4av+v++yN//rbPE/6qwwf+qsMH/qrDB/6qv - wP+qr8D/qq/A/6mvwP+pr8D/qrDB/7nB1f+du/P/Jmz5/wBO+P9JgvH/w9f6/7XG5/+Vpcb/maXA/7G1 - wf/Gw8H/yMXD/8fEw//HxMP/x8TC/8fEwv/HxML/0tDP//Hw8P/m5eT/j4uJ/2tnZKhtaWYKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlO21qZ9qQjYv/w8LB/9LR0f/S0dD/0tHQ/9LR - 0P/S0dH/0tHQ/9HQz//JyMb/xcTC/8XEwv/GxMP/xsTC/6KfnP9tb3T/KVy//wFR9/8GVfr/GGL6/xpj - +P8aYvj/GmL4/xpi+P8bY/f/GmP3/xpi+P8aYvj/GmL4/xpi+P8ZYvn/Clj5/wBQ+f8AUPn/B1X2/xJe - +f8TX/r/EV34/xNe+P8wdPn/iq/2/8zQ1//S0M//0dDP/9HQz//R0M//0c/P/9HPzv/Bv73/j4yJ/21p - ZtptaGU7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9raAFsaGU+a2dkqG9s - adt1cW7kdXFv43Vxb+N1cW7mdHBt+3h0cf+KhoT/k46N/5OPjf+Tjoz/k46M/5KNi/+Oiof/kIuI/4aJ - lP9KdMj/Gl3n/wtW8P8KVfH/Clbx/wlV8P8CUfT/AFD4/wBQ+P8HVPT/Clby/wpW8v8KVvL/C1bx/w9Z - 7/8RWu7/EVru/xFZ7v8QWO7/EFju/xBY7v8MV/D/AVD3/wVT9v86ZLj7cnFx5nVxbuN1cW7jdXFu43Vx - buN0cG7kb2to22tnZKdtaGU7bmpnAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAG1pZgpqZmMZaGRhHGhkYRxnY2AZa2dkVG5qZ+6MiIb/paCf/6ahoP+loJ//paCe/6Sf - nv+jn53/o56d/6Oenf+jnpv/n5uc/5KVo/+Djqv/fYyt/36Nrf9zhq7/G1zd/wBQ+v8kZeb/dY6+/4OV - t/+Bk7f/gZO2/4GTtf+NmK7/kJqs/5CZq/+PmKv/j5iq/46Xqv+Ol6n/g5Ku/0Z10P8EU/X/A1Hz7SJX - xU9yZlEZaGRhHGhkYRxoZGEcaGRhHGtmYxltaWYKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxoZXB4dHH/pqGg/62o - p/+tqaj/sa2s/7Swr/+0sK//tLCu/7Ovrf+zr63/s66t/7KurP+yrqz/sKuo/6umo/+oop3/k5in/xNb - 7P8HVfX/eJLE/7Cuq/+ysK//tbSy/7a1s/+2tbP/tbSz/7Szsv+0s7L/s7Kx/7Kysf+ysbD/rays/6mo - pv+Yn6v/Jmbj/wBQ+f4AUfltAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABrZ2R/gX16/6+rqv+4tLP/zcrJ/9jW1f/Z19b/2dfW/9nX1v/Z19b/2dfW/9nX1v/Z19b/2dfW/9nW - 1f/S0M//vLe1/4iVtf8MV/L/Elvx/5+ovP/DwsD/1dPS/9nX1v/Z2Nf/2dfX/9nX1//Z19f/2dfW/9nX - 1v/Z19b/2dfW/9fV1P/Jx8f/ra6x/0J12f8AUPn/AFH4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAa2dkf4SAfv+2srH/zcrI/97b2v/d29r/3dva/93b2v/d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3tzb/9jU0f+QoMH/C1fy/xNc8f+ttMb/2tjV/97c2//d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3tva/8PExf9GeNv/AE/5/wBR+IAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZH+Fgn//vLm4/9TS0f/d29r/3dva/93b - 2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d2tf/mqrL/wxX8v8UXPL/tr7P/97b - 2f/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2v/Pz9D/Snzf/wBP - +f8AUfiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrZ2R/h4OB/8K/ - vv/W09L/3dva/93b2v/b2dj/2NbV/9vZ1//d29r/2dfW/9nX1v/d29r/3dva/93b2v/d29r/3drY/56u - z/8MWPP/FF3z/7vC1P/e29n/29nY/9jW1f/Y1tX/2NbV/9nX1v/c2tn/3dva/93b2v/d29r/3dva/93b - 2v/e29r/0dHS/01+4v8AT/n/AFH4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAa2Zjf4mGg//HxcT/1tTT/9nX1f/a2Nb/wL68/5CNiv+uq6n/0tDO/5uYlv+YlZL/0c7N/9nX - 1v/Z19X/2dfV/9vX1P+hsdL/DVj0/xVe9P+9xdf/3NnW/8LAvv+Sj4z/jYqH/4yJhv+cmZf/09HP/9nX - 1v/Z19X/2dfV/9nX1f/Z19X/2tfV/9HR0v9PgOT/AE/5/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmY3+Lh4X/zsvK/9XS0f/Rz87/0dDO/6GenP9qZmP/iISC/7u4 - t/92cm//cW1q/7e1s//S0M//0M7N/9DOzf/U0c7/o7PV/w1Z9P8WX/T/wMfZ/9XS0P+xr63/cm5r/42K - h/+dmpj/p6Sj/8zKyf/Rz87/0M7N/9DOzf/Qzs3/0M7N/9HPzv/Q0NH/UYPn/wBP+f8AUfiAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmN/jYmH/9TR0P/T0c//yMbF/8XC - wf+LiIb/c29s/3x4df+fnJr/dHBt/3NvbP+fnJr/ycbF/8jFxP/HxcT/zsrH/6W21/8OWfX/F2D1/8LK - 2//Nysj/q6mn/3Rxbv+gnZv/t7W0/767uv/HxcT/yMXE/8jFxP/IxcT/yMXE/8jFxP/IxsT/zs7P/1SG - 6f8AT/n/AFH4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAamZjf4+L - if/Z19X/0s/O/8G+vf+4tbP/enZz/4eEgf99enf/gn98/3p2dP+BfXv/iYaD/767uf/Avrz/wL28/8jE - wf+ouNr/Dlr1/xhh9v/Fzd7/xsPA/6ajof9xbWr/dnJv/3l1cv+WkpD/v7y7/8C+vP/Avbz/wL28/8C9 - vP/Avbz/wb68/83Nzv9WiOz/AE/4/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGpmY3+RjYv/393c/9HOzf+6trX/paKg/3NvbP+Vko//g399/25qZ/+Hg4H/joqI/3h0 - cf+wrKr/uba0/7i1s//Cvrv/qrrc/w9a9v8ZYff/yM/g/7+8uP+hnZv/c29s/5SRj/+no6H/rqqo/7i1 - s/+5tbP/ubWz/7m1s/+5tbP/uLWz/7m2tP/My8z/WYvv/wBP+P8AUfiAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmN/k4+N/+Xj4v/Qzcv/sq6t/5KOjP9wbGr/npuZ/4uH - hf9qZmP/joqI/5iUk/9xbWv/nZmX/7GtrP+wrKv/vLe0/6293/8PW/b/GmL4/8rS4/+4tLH/m5eV/3Bs - av+AfHr/iYWD/5WRj/+vq6n/sa2r/7Gsq/+xrKv/sayr/7Csq/+xraz/y8rL/1yO8f8AT/j/AFH4gAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaWVif5WSj//r6un/zsvK/6ij - ov+Tjo3/hoKA/6Oenf+YlJL/hH99/5mVk/+gm5r/hoJ//5iUkv+ppKP/p6Kh/7axrv+vwOH/EFz3/xtj - +f/O1Ob/sq2q/5yYlv+FgX7/gn58/4J9e/+OiYf/pqGg/6ijov+oo6L/qKOi/6ijov+oo6L/qaSi/8rJ - yv9gkfT/AE/4/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpm - Y36Oioj/8O/u/9bT0v+jnp3/n5qZ/6Cbmf+gm5r/oJua/6Cbmf+gm5r/oJua/6Cbmf+gm5n/oJua/5+a - mf+8t7X/xNDp/xVf+P8VYPn/xtTv/7izsP+fmpn/oJuZ/6Cbmf+gm5n/oJuZ/6Cbmv+gm5r/oJua/6Cb - mv+gm5r/oJuZ/6ahn//T1Nf/VYz3/wBP+P8AUfh7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABrZ2Reend0+d/f3f/19fT/xMHA/6mko/+noqD/p6Kg/6eioP+noqD/p6Kg/6ei - oP+noqD/p6Kg/6eioP+0sK//4uDe/9/l8f8na/D/AVL5/3yn+v/Y2Nv/trGs/6uloP+rpaD/q6Wg/6ul - oP+rpaD/q6Wg/6uloP+rpaD/q6Wg/66oo//Lx8X/uczx/x9o+P8AUPj2AFH4VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlHG1pZsWXlJL/4+Pi//Hx8P/n5eX/5eTj/+Xk - 4//l5OP/5ePj/+Xj4//k4+L/5OPi/+Tj4v/k4+L/7Ovq/+7t7P+1s7L/PGSy/ABQ9v0PW/n/WpD6/3Ka - 7f9sk+b/bJPm/2yT5v9sk+b/bJPm/2uT5v9rk+b/a5Pm/2uT5v9vluj/bJn1/yhu+f8AUfj/AFH4wgBR - +BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGU7bWlmyn56 - ePyVk5H/m5mX/5uYlv+bmJb/m5iX/5uYlv+bmJb/mpiW/5qYlv+al5X/mpeV/5qWlf+JhoP/cW1p6lxk - eYoDUvSeAFD49ABP+P8ATvn/AE/5/wBP+f8AT/n/AE/5/wBP+f8AT/n/AE/5/wBP+f8AT/n/AE/5/wBO - +P8AUPj8AFH4ygBR+DsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGxoZSNrZ2NnaWVigGllYoBpZWJ/aWVif2llYn9pZWJ/aWVif2llYn9pZWJ/aWVif2ll - Yn9pZWKAamZjd2xoZT56bFYGAFD8DQBR+FIAUfiKAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR - +JkAUfiZAFH4mQBR+JkAUfiUAFH4bgBR+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFH4AgBR+AMAUfgDAFH4AwBR - +AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAUfgDAFH4AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////8AD/////AAAAAAAAD/4AAAAAAAAH/AA - AAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAA - AA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AA - AAAAAAAP+AAAAAAAAB/4AAAAAAAAH/4AAAAAAAB///AAAAAAP///8AAAAAA////wAAAAAD////AAAAAA - P///8AAAAAA////wAAAAAD////AAAAAAP///8AAAAAA////wAAAAAD////AAAAAAP///8AAAAAA////w - AAAAAD////AAAAAAP///8AAAAAA////wAAAAAD////gAAAAAf////AAAAAD///////+AA/////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////KAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAbGhlBGllYg1nY2AOZ2NgDmdjYA5nY2AOZ2NgDmdjYA5nY2AOZ2NgDmll - Yg1saGUEAAAAAABR+AQAUfgVAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgYAFH4BwAA - AABsaGUEaWViDWdjYA5nY2AOZ2NgDmdjYA5nY2AOZ2NgDmdjYA5nY2AOaWViDWxoZQQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGUibWlmlHJta8xzb2zPc29sz3NvbM9zb2zPc29sz3Nv - bM9zb2zPc29sz3FtaspuaWSMNl2uOgBQ+o8AT/rSAE/62gBP+toAT/raAE/62gBP+toAT/raAE/62gBP - +toAT/rWAFD6oyNZxkpuaWSMcW1qynNvbM9zb2zPc29sz3NvbM9zb2zPc29sz3NvbM9zb2zPcm1rzG1p - ZpRsaGUiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxoZRBuamewg399/5eTkf+ZlJL/mJOR/5eT - kf+XkpD/l5KQ/5aSkP+WkZD/lpGP/5SPjf98e3/8H1nM6wRU9/0vauD/P3HY/z5w1/8+cNf/PnDX/z1v - 1v89b9b/PW/W/z1v1f8zatr/Clbz/hJW3fJ2e4r9l5KQ/5mUkv+Yk5H/l5OR/5eSkP+XkpD/lpKQ/5aR - kP+WkY//lI+N/4F9e/9uamewbGhlDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmYz97d3TzpqGg/6un - pv+uqaj/r6qp/66qqP+tqaf/rain/6ynpv+rp6b/qaWj/6ahnf+Ajq3/CVXw/0F02/+jp67/rq6s/6+u - rv+urq3/ra2s/62sq/+srKv/q6uq/6qpqP+io6X/Vn7K/wRU9f9siMH/rqik/66qqP+vqqn/rqqo/62p - p/+tqKf/rKem/6unpv+ppKP/paCf/5+amP95dXLya2dkPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpm - Y1qFgX/9s6+u/8fDwv/V0tH/1tTT/9bT0v/W09L/1tPS/9bT0v/V09L/1NHQ/8S/vP99kb3/BVP1/26O - z//IxcH/1NPS/9bU1P/W1NP/1tTT/9bU0//W1NP/1dTT/9TT0v/IxcL/gZfB/wdW9P9kiM7/yMTA/9XS - 0f/W1NP/1tPS/9bT0v/W09L/1tPS/9XT0v/U0dD/w8C//6unpv+Cfnv9a2djWgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGpmY12IhIH9wr69/9vZ2P/e3Nv/3dva/93b2v/d3Nv/3dzb/93c2//d3Nv/3tzb/9zZ - 1v+Knsr/BFP1/3mX2P/d2tb/3tzb/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2//e29j/kKbQ/wdW - 8/9uk9n/3drW/97c2//d29r/3dva/93b2//d3Nv/3dzb/93c2//e3Nv/29nY/7y4t/+EgH79amZjXQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmY12Kh4T9ysfG/93b2v/e3Nv/3tzb/93b2v/e3Nv/3tzb/93b - 2v/d29r/3dva/97b2P+RpdH/BVP1/36d3v/g3Nj/3tzb/97c2//e3Nv/3dva/93b2v/d29r/3dva/93b - 2v/g3Nn/l63W/whW9P9zmN7/39zY/97c2//e3Nv/3tzb/93b2v/d29r/3dva/93b2v/d29r/3drZ/8TB - wP+Hg4H9amZjXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGllYl2Nioj9zszL/9jW1f/Lycf/z8zL/9nX - 1f/Mycj/zcrJ/9nW1f/Y1tX/2dbV/9vX1P+UqdX/BVT2/4Gg4f/d2dT/zMrI/7y5uP/EwcD/1tPS/9nW - 1f/Y1tX/2NbV/9jW1f/c2NT/mq/Y/wlX9f91muD/3NjU/8zJyP+8ubj/wb+9/9HPzf/Z19X/2NbV/9jW - 1f/Z1tX/2dbV/8nGxf+Kh4T9amZjXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGllYl2RjYv909DP/8/N - y/+al5T/ko+N/7+9u/+IhIL/op+d/87My//Ny8r/zcvK/9LPy/+WrNj/BlT2/4Sj4//U0cz/pKGf/4qG - hP+AfHr/pqSi/87My//Ny8r/zcvK/83Lyv/Szsv/m7Ha/wpY9v93m+L/1NDM/5yZl/98eXb/h4OB/4mG - g/+9u7n/zszL/83Lyv/Ny8r/z83L/83Kyf+Niof9aWViXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGll - Yl2UkI7919XT/8fEw/+npKL/dHBt/357eP90cG7/r6yq/8TBwP/DwL//wsC+/8nGwv+Zrtr/BlX3/4em - 5v/MyMT/vbq5/66qqf9/fHn/kI2K/8PBv//DwL//w8C//8LAvv/IxMH/nbLb/wtZ9v94neP/y8fD/5OQ - jv+PjIn/ure2/4OAff+TkI3/w8C//8PAv//CwL7/xsPC/9HPzf+QjYv9aWViXQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGhkYV2XlJH93NnY/726uP+vq6r/fnp3/4eDgf9/fHn/s7Cu/7i1s/+4tbP/uLWz/8G9 - uf+csd3/B1b3/4qp6f/Fwbz/n5uZ/3l1c/+GgoD/qqel/7m1tP+4tbP/uLWz/7i1s/+/u7f/n7Td/wta - 9/96nuX/w7+6/4+Lif+MiYb/uba0/4yIhv+Gg4D/t7Sy/7i1s/+4tbP/vbq4/9bT0v+UkI79aWViXQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhkYV2al5X94N7d/7Ovrv+sqKb/hYF//3Ftav+Lh4X/ramo/62p - qP+tqaj/rain/7izsP+ftOD/CFb4/42s7P+8t7P/i4aE/3l1c/+VkZD/pKCf/66pqP+tqaj/ramo/62p - p/+1sK3/obbf/w1b+P97oOb/urWx/4mFg/9/e3n/lJCP/3h0cf+RjYv/rqmo/62pqP+tqaf/s6+u/9rX - 1v+Xk5H9aGRhXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjYFicmZf95+bl/66qqP+inZz/k46M/396 - eP+WkY//o56c/6KdnP+inZz/oZyb/7Suq/+mu+b/CFf5/46u8P+6tK//mZSS/4N+fP9/enj/lZCO/6Oe - nP+inZz/op2c/6Kdm/+wqqb/pbrk/wxb+f+Bpez/trCs/5CLiP9/enj/gHx5/4yHhf+fmpn/op2c/6Kd - nP+hnJv/rqmo/+Hf3v+ZlZP9aGRhWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjYDmIhYPv6ejo/9bT - 0/+xraz/r6qp/6+qqf+vq6n/r6qp/6+rqf+vqqn/sq6s/9jV0v+/zev/DVnz/1CK+v/Cydf/rqys/6mm - p/+ppqb/qaan/6mmp/+ppqf/qaam/6uoqf/Aw8r/b5z1/wVV9/+auvb/yszS/6Giqv+mpKb/r6qn/7Cr - qf+vq6n/r6qo/6+qqP+xrav/1NHQ/+Ph4P+Gg4HvZ2NgOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtm - YwpuamebmpeV/c7NzP/Qz87/zs3M/8/Ozf/Qzs3/z87M/8rIx//IxsT/ysjH/8zKyf+VlJb/MV+5/wVV - 9/8ucfr/Pnjy/zt28P88du//PXfu/z127v87de//O3Xv/zx38P8zdPj/CFb6/wFQ+P8obPf/Nnb6/y1t - 8f89eO//iqzt/8vN0//Pzcv/zs3L/87My//Pzs3/zMrJ/5iVk/1uameba2dkCgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABrZ2QWa2djd3RwbbJ5dnO3eXZztnh0cc95dXP+j4uJ/5mVk/+YlJL/mJOS/5aR - j/+TjYr/i4yU/1V4w/8pY97/H1/j/yBf4/8SWOf/AE74/wdU9P8eYef/IWHm/yBh5f8kY+P/LWff/y1n - 3/8qZd//KWXf/yll3/8WXOr/BlX2/z5nuut5dXO5eXZzt3l1c7d5dXO3c29ssmtnZHZrZ2QWAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFMSANGQT0EAAAAAWtnZH2FgX7/qKOi/6ml - o/+qpqX/q6al/6qlpP+ppaP/qaSi/6ijof+hoKP/mpuj/5qaoP9Rd8P/A1P2/12Dzf+epK7/oKWv/6Cl - sP+ipq3/pqeq/6Wnqf+kpqn/pKWo/6Gipf+LmK3/J2bj/wBP+NcIT+IggjQAAkdCPgRHQj4EU09LAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5q - aJyXk5H/trKx/8jFw//Rz83/0s/O/9LPzv/Rz87/0c/O/9HOzf/Rzs3/y8jG/7Wwrv9JddP/EFry/52n - vf/IxsP/0dDO/9LRz//S0M//0tDP/9LQz//R0M//0c/O/8zLyv+5uLX/VH7Q/wBQ+fAAUfgvAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAG9saZyem5n/ysfG/93b2v/e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/8/N - zP9Kedr/Elvy/7K6zP/e29n/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//W09H/YYjW/wBQ - +PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyjoJ7/0tDP/93b2v/d29r/3dva/93b2v/d29r/3dva/93b - 2v/d29r/3tza/9fV1P9PfuD/E1zz/7vD1f/f3Nr/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b - 2v/c2db/aI7d/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyppqT/1dLR/9rY1//T0M//p6Si/7+8 - u//Avbv/pqOh/9PQz//a2Nf/2tjW/9bU0/9SgeL/FF30/73F2P/V0tD/qaak/56bmP+in53/zMrI/9vY - 1//a19b/2tfW/9rX1v/a19T/apHg/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyuq6r/1dPS/9DO - zf+7uLf/cm9s/5OQjv+XlJL/cW1q/7i1tP/Qzs3/z83M/9DOzf9UhOX/FV71/77G2P/Gw8H/f3x5/5aT - kP+opqT/xcPC/8/NzP/Pzcz/z83M/8/NzP/T0M3/bZTj/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFt - apy0sa//1tPS/8bDwv+in53/eXZz/4SAfv+Cf3z/eHRy/5+bmf/FwsH/xMHA/8rIx/9Xhuj/F2D2/77G - 2P+9ubf/fnp3/4qHhP+dmpj/v7y7/8TBwP/EwcD/xMHA/8TBwP/Mycb/cJfl/wBQ+PEAUfgwAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAHFtapy6t7X/1tTS/7q3tf+MiIb/iIWC/4B8ev94dHH/i4eF/4iEgv+4tbP/ura0/8bD - wv9Zier/GGH3/7/G2P+0sK3/fHh2/42Jh/+empj/trOx/7q3tf+6t7X/ure1/7m2tP/Gwr//c5ro/wBQ - +PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFtapzAvbv/19TT/6yop/9+enf/lJCO/4aCgP98eHX/mZST/315 - dv+opKP/r6qp/8C9vP9ci+3/GWL5/7/G2P+rpqP/e3d1/4B8ev+Lh4X/qKSj/6+rqv+vq6r/r6uq/66q - qf+/urf/dp3r/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZzDwb//2dfW/6Oenf+WkY//n5qY/5uW - lf+Yk5H/oJua/5aRkP+hnJv/o56c/8C8uv9jkfH/GWL6/8HJ3f+nop//lpGP/5KOjP+Uj47/oZya/6Sf - nv+kn53/pJ+d/6KdnP+8t7T/eKDw/wBQ+PAAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZIWurKr/8O/u/7y4 - t/+ppaP/qaSi/6mko/+ppKP/qaSi/6mko/+opKL/sa2r/+Lf3P+Ape//B1b4/5e18v/Bvbz/qqWi/6qk - ov+qpKL/qaSh/6mkof+ppKH/qKOg/6+qp//GytX/SYP3/wBP+NwAUfggAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGll - YjR8eXbcwb++/9va2v/U09L/1NPS/9TT0v/U0tH/1NLR/9TS0f/U0dD/2dfW/9DOy/93g572CFLo7hlj - +v9Sh/T/UoPp/1CB6P9Qgej/UIHo/1CB6P9Qgej/UIHo/1SF7P89e/f/BlX4/ABQ+IkAUfgDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABqZmNCcW1qsX57eM+BfnzPgX58z4F+fM+BfnvPgX57z4F+e8+BfnvPgH16z3Vx - b8FsZ2NqDlTkSABP+LAATvjYAE752gBO+doATvnaAE752gBO+doATvnaAE752gBO+doATvjQAFD4ggBR - +BIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NgCF5aVw5cV1QOXFdUDlxXVA5cWFQOXFhUDlxY - VA5cWFUOXVlVD2VgXQtwamQBAAAAAABR+AkAUfgaAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgdAFH4HQBR - +B0AUfgTAFH4AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAPgA - QAIAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH - AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAPAA - AAAADwAA/AAAAAA/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/ - AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/AAD/gAAAA/8AAP+AAAAD/wAA/8AAAAf/AAD/4AEAD/8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpZWIhbGhlR21p - ZkltaWZJbWlmSW1pZkltaWZJbGhkPlZifxIATvwyAE38VQBN/FcATfxWAE38VgBN/FcATfxWAE79Okpf - jxZsZ2M+bWlmSW1pZkltaWZJbWlmSW1pZkltaWZHamZjIQAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlL3x4 - ds6MiIb6jYmH+o2IhvqMiIX6jIeF+oyHhfqHgn/zPWOwxQ9Z8ectaOH9Lmjf/C5o3/wuZ978LWfe/Cxn - 3v0SW+7tM2C+zYiEgvOOiYf6jYiG+oyIhfqMh4X6jIeF+oqFg/p7dnTObGhlLgAAAAAAAAAAAAAAAAAA - AABybmx7m5eV/7WxsP+7t7b/ura1/7m1tP+5tbT/t7Ox/6Wjp/8uZtv/Y4fP/7S1t/+3uLv/tre6/7W2 - uf+0tbn/srK0/3CMw/8lZOP/oqWx/7u3tf+6t7b/ura0/7m1tP+4tLP/sKyr/5WRj/9ybmt7AAAAAAAA - AAAAAAAAAAAAAHZyb42uqqn/2NbV/93b2v/d29r/3dva/93b2v/d29n/w8TL/y5q5f+Opdb/3tvX/93b - 2v/d29r/3dva/93b2v/e29j/na7Q/ydo6P+7wtH/3tvZ/93b2v/d29r/3dva/93b2v/X1NP/qaWj/3Vx - bo0AAAAAAAAAAAAAAAAAAAAAd3Nxjbi1s//c2tj/29nY/9za2f/b2Nf/3NrZ/93b2f/MztT/Mm7p/5at - 3v/e29f/19XU/9vZ2P/c2tn/3NrZ/9/c2f+mt9n/K2vs/8PJ2f/b2Nb/2NXU/9za2f/c2tn/3NrZ/9za - 2f+zsK//dnJvjQAAAAAAAAAAAAAAAAAAAAB5dnONvru6/8fFw/+loqD/tbKw/6mmpP/Qzsz/0c7N/8fJ - z/81cez/lq3f/7+7tv+ZlpP/q6im/9DOzP/Qzs3/09DM/6S12P8tbu//vMPS/6Shnf+Wk5H/qqim/87M - y//Qzs3/0tDO/7i2tP94dHGNAAAAAAAAAAAAAAAAAAAAAHt4dY3DwL7/wL28/4eDgf99eXf/nZqY/8G+ - vf/Avbv/v8HH/zl07/+VrN3/uray/5GOi/+RjYv/v7y7/8C9vP/Dv7v/obLU/zBx8f+zusn/kY2J/6ek - ov+JhoP/sq+t/8G+vP/EwsD/vbu5/3p2dI0AAAAAAAAAAAAAAAAAAAAAfnp3jcjFw/+3tLL/kIyK/3p2 - dP+koJ7/sK2r/7Crqf+4ub//PHjz/5Wr3P+emZT/f3t5/6Ccm/+wrKv/sKyq/7Ktqv+fr9D/M3T0/6ux - wP+JhIH/lJGO/4SAfv+moqH/sKyr/7azsf/DwL7/fHl2jQAAAAAAAAAAAAAAAAAAAAB8eXaEzszL/7i0 - s/+cl5X/kIyK/6Oenf+loJ//pqGf/8DAxv9BfPf/jKjj/6ulnv+Ri4b/mpSQ/6ehnf+noZ3/raah/5qu - 2P82d/j/tbrH/5eRjP+PiYX/mJSR/6Wgnv+kn57/t7Ox/8nGxf97d3SEAAAAAAAAAAAAAAAAAAAAAG1p - ZkSloqDpysjH/8G+vf/Bv77/wb69/7+8uv/Bvr3/xsPC/0xzwv8ucPT/YYvk/12F2v9fhtn/XYTZ/1yE - 2f9gieD/NHT2/xhh+P9fj/H/VIDc/4Kf2P+9vsL/wL27/8C9vP/IxsT/op+d6W1pZkQAAAAAAAAAAAAA - AAAAAAAAYl5bA21pZkR/fHl9hYJ/gH57eMqUkI7/oZ2b/6Ccmv+cl5X/kJCW/2J+vf9Gcs7/PW3S/wtV - 8P8pZ+T/R3bV/0d11P9OeM//UHnN/013zf9Idc//IGPp/0Frw8iGgn1/hYF/gH57eH1taWZDY15bAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPTkEfHh1sKqmpf/Bvrz/xsPC/8bDwf/GwsH/x8K//8O+ - uv+WnrP/IWLn/5Wkw//GxMH/x8XE/8fFw//HxcL/xsTB/8C9uf9kh8z/AFD5rgBM/gQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw4MwWDf3y2wL28/93b2v/f3dz/393c/9/d - 3P/e3Nv/4N3a/6q20f8nZur/uMHU/+He3P/g3t3/393c/97c2//e3Nv/39zY/4Ke1/8CUva2AE37BQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTAsBYaDgLbIxcT/29nX/8G+ - vf/HxcP/vLq4/9XT0f/d2tf/sLzX/ypq7f+9xdn/w8C9/7Kvrv/Jx8X/29nY/9rY1//e2tb/h6Pd/wJS - 97YATPoFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKCQFioeEtsvJ - x//Jx8b/iYaD/5GNi/9/e3n/t7Wz/9DNyv+suNP/LW3w/7jA1P+XlJD/lJGP/7u4t//Ny8r/zMrJ/9DN - yf+Ho93/A1P3tgBM+gUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUg - HAWPi4m2z8zL/7Kvrf+FgX//fnt4/4F9ev+cmZf/v7u4/6izzv8wcPT/s7vP/4+Lh/+Lh4X/r6yq/726 - uP+8ubf/wb25/4ej3f8EVPi2AEv5BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAHRgTBZOQjbbSz87/oJua/4+KiP+JhYP/kY2L/5GNi/+tqKX/pK/K/zNz9/+wt8r/j4qH/4eD - gP+fm5n/rKim/6ynpv+yrKj/iaTd/wVV+bYASvkFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAOCAMDiYaEqtfV1P+2s7H/qqWk/6qmpP+qpqT/qaWj/7Ktqv++xtj/MHH1/5yx - 3P+opaX/oZ6f/6Ogov+koaP/pKGi/7GusP9ymur/AFL5pwBK+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxbWpOoZ+d4ry6ufu4trX6uLa1+ri2tPq4tbT6u7m3+qin - qOwpX83EImn58T127P06c+n8OnPp/Dpz6fw6c+n8O3Xv/RVf+OMAT/hMAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5ZVgJlYV4tb2xpSXJua0lybmtJcm5rSXJu - a0lxbWpJamRfNi5YshIAS/k/AEv6VwBM+1YAS/tWAEv7VgBL+1cAS/pVAE34LwBU+AIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////////////////////////////////4AAAB8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA - AAPAAAADwAAAA8AAAAP4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/4AAA//AAAf/wAAH////////////// - //////////////////8oAAAAGAAAADAAAAABACAAAAAAAGAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI13TAgtW - 8AgNV/AIDVfwCAtW8QgaWt4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH15 - dwF5dHKbhoKA7oeDgO+GgoDvhoJ/74SAf+1UapuqEFnu3h5g6PMeYOfzHV/n8x1f5/MPWO7kTWmlsIWB - ge2Hg4DvhoKA74aCf++FgX7ueHRxm4B7eQEAAAAAAAAAAH15diOVkY/9vbm4/8G+vf/Bvbz/wLy7/7i0 - s/9DctP/h5zF/8HAwP/BwMD/wL+//7++vv+Tobr/NW3e/7y5t//Cvr3/wb28/8C8u/+5tbT/kIyK/YB8 - eSMAAAAAAAAAAIB8eSumoqD+3dva/9za2f7c2tn+3dva/9za2f5KeuD+rLrY/9za2f7d29r/3NrZ/tza - 2f69xNP+OXPo/9za2f7c2tn+3dva/9za2f7c2tn+oZ6c/4SAfSsAAAAAAAAAAISAfiuvrKr+wsC+/8K/ - vv6wrav+0tDP/9PRz/5OgOX+rLrZ/6ypp/6vrKr/0tDP/tLQz/69xNP+PHbr/8TBwP6fnJr+vLm3/9LQ - z/7S0M/+qqem/4mFgysAAAAAAAAAAIiEgiu4tbP/trOx/3p2dP+UkY//vbq4/7+8uv9ShOn/p7XT/6Kf - nf+QjIr/vbq4/726uP+1vMv/P3nu/6mmpP+loZ//iYaD/726uP+9urj/s7Cu/42JhysAAAAAAAAAAIeE - gSrBvr3+qKSj/4F9e/6cmJb+qKOi/6ynpv5XiO7+o7DP/4mEgv6UkI7/p6Oi/qejov6vtsT+Qnzx/56a - mP6FgX/+jYiG/6ejov6opKP+vLm3/42KhyoAAAAAAAAAAJGNiw2enJrnzcvK/8PAv//DwL//vLm3/8fF - w/9jhcr/UYbw/3KOy/9wjMr/cIzK/3GNyv9aiuv/M3P2/3KT2P+GnMr/w8C//8PAvv/Lycj/nJmX55aS - kAwAAAAAAAAAAAAAAACVkpAfjYqHXoSBfoKIhIL+n5uZ/5+amf6emZj+cIe5/1x9wv4ZXOX/SXjV/mCD - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/INTV/IntvControllerSettings.resx b/BizHawk.Client.EmuHawk/config/INTV/IntvControllerSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/INTV/IntvControllerSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAoIJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAACYXODs4BCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - KTNDQ0M7OAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALllbYmJZQBcAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYWNwcHBwWy8mAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFLanBwcHBwYz0eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABpqcHBwcHBwZVkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl11w - cHBwcHBwcGcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIXdwcHBwcHBwcGkSAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPXBwcHBwcHBwd2wYAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAACXbnBwdXB5dXl0eW4hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAid3R5eXl5eXl5q6wzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9eXV5 - i7CxsbGxsblLKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndYuwsbm8uby5vMFnHgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJt3q7G3vMHB1cLBwdWuEgAAAAAAAAAAAAAAAAAA - AAAAAAAeEhMSCiUAAAAAAAAAAEexsbm/1dXZ2dnZ1da5ZgwAAAAAAAAAAAAAAAAAAAAjEjNZaW5qXRMl - AAAAAAAAADW5s7/V2N7i4uLi3dzZrQQPAAAAAAAAAAAAAAAAHxhZbm5uaWltd6ASAAAAAAAAAEmzvMLZ - 3uP29/fw4uTkuUAWCy0AAAAAAAAAAB4YYXd3gG13vbm5vb8zAAAAAAAAAE6xwdXd4/b6+/r38OTl1Vlc - OAMIFAweFBQSM2mtrYB3vdXT0NXExNU1AAAAAAAAAE65wtXe8Pr7/Pz79+fn1WphZ25pXV1mbHetrXd3 - tdXT4vXw49nZ3NYgAAAAAAAAAEu3wdje9vv7/Pz79+fn34B3d2xtoHeud66uudXT4vD39/Dj49zk5G0A - AAAAAAAAAD2xwcwoH0/L/Pukyenp5K27u7m5uczM0Nve4vb3+vr56OPl5eXl1igAAAAAAAAAADWxwQgB - BQYNmveZK/Dp6cG/wcTV2eP3+vr6+/r6+ejm5ufn5+nkIgAAAAAAAAAAAJmruR4sjC2WLFCdDd3p6dXW - 1tXI3vn67pCO9Ojp6efo5+fm59wiAAAAAAAAAAAAAABLsZ0FmC0qKgHMRcjp6dzc1Y2KiO3RlfKTj+np - 5ubm5eXk1SIAAAAAAAAAAAAAAACdab/Lp5aWnEfV1cHm6ebk6pGSiabZ8fOU0uXl5eTk3NyuRQAAAAAA - AAAAAAAAAAAAn0ux0KFTaMHBv7nC6efp3Ovv7OTm3OPl3Nzc3NfW1U6fAAAAAAAAAAAAAAAAAAAAAABF - Wa25t7yxs7Gw5+fn5Obk18XG3NyBfHvD1cSgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAFUzarGwsHl5sefn - 39zEgoZ/hL19fnqirj2jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATj09ZXV0cLzn3NXChYeDub+1pbQ9 - VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0rXj+rpInTBDcHCz5NW/ucG5u7GAM1QAAAAAAAAAAAAAAAAA - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXjU1h6NnZv/Fc3T/x3Bx/8dw - cf/HcHH/x3Bx/8dwcf/HcHH/w3Jz/6ZoZ/9ZMzPTAQAAPQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyFxccektK0b12 - dv/HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xXR0/69wb/9jOjneBwMDSQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABNKSlNlmBf9sh3d//HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xnd3/7Z4d/9sQUDnDgcHVQAA - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABkOjqKsXFw/8lyc//HcXL/yHJz/8l0df/JdXb/yXV2/8l1dv/JdHX/ynt7/7+B - f/94SknvFgsLZQAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACILCxB7TUzDwXd3/8lyc//KdXb/y3h5/8x7fP/NfX7/zX5+/819 - fv/NfH3/zoOC/8iJiP+GVVX3Hg8QegAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMiIi+SXl3oynp7/8t4ef/NfX7/z4GC/9GE - hf/Sh4j/04iJ/9KIiP/Rhof/04uK/8+RkP+XY2L9KxcXlwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABwAA - AA0AAAAPAAAACwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUvL1enbW37zn5+/85/ - gP/Rhob/1IuM/9aPkP/XkpP/2JOU/9iTlP/XkZH/15OT/9eZl/+rdHP/QSUlvAAAADwAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACQAA - ABgAAAAvAgEBSwcDA2EFAgJoAAAAWAAAADYAAAARAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGU8 - O4W5eXn/0IKD/9KIif/Wj5D/2ZWW/9ubm//dnp//3qCg/92foP/cnZ3/3Jyc/9+in//CiYf/Zj8/4wYC - AnAAAAAbAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AA4AAAAnCQQEUCISEoQ+IiKzVzEx1mU6OuZiOTnmRigo0hgNDZsAAABMAAAAEAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABnVJSK/HhIP/04eI/9aQkf/amJn/3qCh/+Gmp//jq6v/5Kyt/+OsrP/iqan/4aal/+ap - p//Umpj/nmxr/C8ZGboAAABXAAAAGAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAIAAAAOAQAALRkNDWY+IiKpZDo63YZRUfigZGP/sHBv/7V0c/+xcnH/oWZm/2k+PvEfEBCcAAAAMQAA - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/InputCompositeWidget.resx b/BizHawk.Client.EmuHawk/config/InputCompositeWidget.resx deleted file mode 100644 index 1f731cd00e..0000000000 --- a/BizHawk.Client.EmuHawk/config/InputCompositeWidget.resx +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - iVBORw0KGgoAAAANSUhEUgAAAAkAAAAGCAYAAAARx7TFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAAWdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjA76PVpAAAA - HUlEQVQYV2MgBfzHg1EAQQUwQFABDBBUgAUwMAAAQwwP8VwP41AAAAAASUVORK5CYII= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/MessageConfig.cs b/BizHawk.Client.EmuHawk/config/MessageConfig.cs deleted file mode 100644 index f6a4f2db00..0000000000 --- a/BizHawk.Client.EmuHawk/config/MessageConfig.cs +++ /dev/null @@ -1,631 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; - -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class MessageConfig : Form - { - private int _dispFpSx = Global.Config.DispFPSx; - private int _dispFpSy = Global.Config.DispFPSy; - private int _dispFrameCx = Global.Config.DispFrameCx; - private int _dispFrameCy = Global.Config.DispFrameCy; - private int _dispLagx = Global.Config.DispLagx; - private int _dispLagy = Global.Config.DispLagy; - private int _dispInpx = Global.Config.DispInpx; - private int _dispInpy = Global.Config.DispInpy; - private int _dispWatchesx = Global.Config.DispRamWatchx; - private int _dispWatchesy = Global.Config.DispRamWatchy; - private int _lastInputColor = Global.Config.LastInputColor; - private int _dispRecx = Global.Config.DispRecx; - private int _dispRecy = Global.Config.DispRecy; - private int _dispMultix = Global.Config.DispMultix; - private int _dispMultiy = Global.Config.DispMultiy; - private int _dispMessagex = Global.Config.DispMessagex; - private int _dispMessagey = Global.Config.DispMessagey; - private int _dispAutoholdx = Global.Config.DispAutoholdx; - private int _dispAutoholdy = Global.Config.DispAutoholdy; - - private int _messageColor = Global.Config.MessagesColor; - private int _alertColor = Global.Config.AlertMessageColor; - private int _movieInput = Global.Config.MovieInput; - - private int _dispFpSanchor = Global.Config.DispFPSanchor; - private int _dispFrameanchor = Global.Config.DispFrameanchor; - private int _dispLaganchor = Global.Config.DispLaganchor; - private int _dispInputanchor = Global.Config.DispInpanchor; - private int _dispWatchesanchor = Global.Config.DispWatchesanchor; - private int _dispRecanchor = Global.Config.DispRecanchor; - private int _dispMultiAnchor = Global.Config.DispMultianchor; - private int _dispMessageAnchor = Global.Config.DispMessageanchor; - private int _dispAutoholdAnchor = Global.Config.DispAutoholdanchor; - - private readonly Brush _brush = Brushes.Black; - private int _px; - private int _py; - private bool _mousedown; - - public MessageConfig() - { - InitializeComponent(); - } - - private void MessageConfig_Load(object sender, EventArgs e) - { - SetMaxXy(); - MessageColorDialog.Color = Color.FromArgb(_messageColor); - AlertColorDialog.Color = Color.FromArgb(_alertColor); - LInputColorDialog.Color = Color.FromArgb(_lastInputColor); - MovieInputColorDialog.Color = Color.FromArgb(_movieInput); - SetColorBox(); - SetPositionInfo(); - StackMessagesCheckbox.Checked = Global.Config.StackOSDMessages; - } - - private void SetMaxXy() - { - var video = Global.Emulator.AsVideoProvider(); // TODO: this is objectively wrong, these are core agnostic settings, why is the current core used here? Also this will crash on a core without a video provider - XNumeric.Maximum = video.BufferWidth - 12; - YNumeric.Maximum = video.BufferHeight - 12; - PositionPanel.Size = new Size(video.BufferWidth + 2, video.BufferHeight + 2); - - PositionGroupBox.Size = new Size( - Math.Max(video.BufferWidth, UIHelper.ScaleX(128)) + UIHelper.ScaleX(44), - video.BufferHeight + UIHelper.ScaleY(52)); - } - - private void SetColorBox() - { - _messageColor = MessageColorDialog.Color.ToArgb(); - ColorPanel.BackColor = MessageColorDialog.Color; - ColorText.Text = $"{_messageColor:X8}"; - - _alertColor = AlertColorDialog.Color.ToArgb(); - AlertColorPanel.BackColor = AlertColorDialog.Color; - AlertColorText.Text = $"{_alertColor:X8}"; - - _lastInputColor = LInputColorDialog.Color.ToArgb(); - LInputColorPanel.BackColor = LInputColorDialog.Color; - LInputText.Text = $"{_lastInputColor:X8}"; - - _movieInput = MovieInputColorDialog.Color.ToArgb(); - MovieInputColor.BackColor = MovieInputColorDialog.Color; - MovieInputText.Text = $"{_movieInput:X8}"; - } - - private void SetAnchorRadio(int anchor) - { - switch (anchor) - { - default: - case 0: - TL.Checked = true; - break; - case 1: - TR.Checked = true; - break; - case 2: - BL.Checked = true; - break; - case 3: - BR.Checked = true; - break; - } - } - - private void SetPositionInfo() - { - if (FPSRadio.Checked) - { - XNumeric.Value = _dispFpSx; - YNumeric.Value = _dispFpSy; - _px = _dispFpSx; - _py = _dispFpSy; - SetAnchorRadio(_dispFpSanchor); - } - else if (FrameCounterRadio.Checked) - { - XNumeric.Value = _dispFrameCx; - YNumeric.Value = _dispFrameCy; - _px = _dispFrameCx; - _py = _dispFrameCy; - SetAnchorRadio(_dispFrameanchor); - } - else if (LagCounterRadio.Checked) - { - XNumeric.Value = _dispLagx; - YNumeric.Value = _dispLagy; - _px = _dispLagx; - _py = _dispLagy; - SetAnchorRadio(_dispLaganchor); - } - else if (InputDisplayRadio.Checked) - { - XNumeric.Value = _dispInpx; - XNumeric.Value = _dispInpy; - _px = _dispInpx; - _py = _dispInpy; - SetAnchorRadio(_dispInputanchor); - } - else if (WatchesRadio.Checked) - { - XNumeric.Value = _dispWatchesx; - XNumeric.Value = _dispWatchesy; - _px = _dispWatchesx; - _py = _dispWatchesy; - SetAnchorRadio(_dispWatchesanchor); - } - else if (MessagesRadio.Checked) - { - XNumeric.Value = _dispMessagex; - YNumeric.Value = _dispMessagey; - _px = _dispMessagex; - _py = _dispMessagey; - SetAnchorRadio(_dispMessageAnchor); - } - else if (RerecordsRadio.Checked) - { - XNumeric.Value = _dispRecx; - YNumeric.Value = _dispRecy; - _px = _dispRecx; - _py = _dispRecy; - SetAnchorRadio(_dispRecanchor); - } - else if (MultitrackRadio.Checked) - { - XNumeric.Value = _dispMultix; - YNumeric.Value = _dispMultiy; - _px = _dispMultix; - _py = _dispMultiy; - SetAnchorRadio(_dispMultiAnchor); - } - else if (AutoholdRadio.Checked) - { - XNumeric.Value = _dispAutoholdx; - YNumeric.Value = _dispAutoholdy; - _px = _dispAutoholdx; - _py = _dispAutoholdy; - SetAnchorRadio(_dispAutoholdAnchor); - } - - PositionPanel.Refresh(); - XNumeric.Refresh(); - YNumeric.Refresh(); - SetPositionLabels(); - } - - private void SaveSettings() - { - Global.Config.DispFPSx = _dispFpSx; - Global.Config.DispFPSy = _dispFpSy; - Global.Config.DispFrameCx = _dispFrameCx; - Global.Config.DispFrameCy = _dispFrameCy; - Global.Config.DispLagx = _dispLagx; - Global.Config.DispLagy = _dispLagy; - Global.Config.DispInpx = _dispInpx; - Global.Config.DispInpy = _dispInpy; - Global.Config.DispRamWatchx = _dispWatchesx; - Global.Config.DispRamWatchy = _dispWatchesy; - Global.Config.DispRecx = _dispRecx; - Global.Config.DispRecy = _dispRecy; - Global.Config.DispMultix = _dispMultix; - Global.Config.DispMultiy = _dispMultiy; - Global.Config.DispMessagex = _dispMessagex; - Global.Config.DispMessagey = _dispMessagey; - Global.Config.DispAutoholdx = _dispAutoholdx; - Global.Config.DispAutoholdy = _dispAutoholdy; - - Global.Config.MessagesColor = _messageColor; - Global.Config.AlertMessageColor = _alertColor; - Global.Config.LastInputColor = _lastInputColor; - Global.Config.MovieInput = _movieInput; - Global.Config.DispFPSanchor = _dispFpSanchor; - Global.Config.DispFrameanchor = _dispFrameanchor; - Global.Config.DispLaganchor = _dispLaganchor; - Global.Config.DispInpanchor = _dispInputanchor; - Global.Config.DispRecanchor = _dispRecanchor; - Global.Config.DispMultianchor = _dispMultiAnchor; - Global.Config.DispMessageanchor = _dispMessageAnchor; - Global.Config.DispAutoholdanchor = _dispAutoholdAnchor; - - Global.Config.StackOSDMessages = StackMessagesCheckbox.Checked; - } - - private void Ok_Click(object sender, EventArgs e) - { - SaveSettings(); - GlobalWin.OSD.AddMessage("Message settings saved"); - Close(); - } - - private void MessageTypeRadio_CheckedChanged(object sender, EventArgs e) - { - SetPositionInfo(); - } - - private void XNumericChange() - { - _px = (int)XNumeric.Value; - SetPositionLabels(); - PositionPanel.Refresh(); - } - - private void YNumericChange() - { - _py = (int)YNumeric.Value; - SetPositionLabels(); - PositionPanel.Refresh(); - } - - private void Cancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Message config aborted"); - Close(); - } - - private void PositionPanel_MouseEnter(object sender, EventArgs e) - { - Cursor = Cursors.Hand; - } - - private void PositionPanel_MouseLeave(object sender, EventArgs e) - { - Cursor = Cursors.Default; - } - - private void PositionPanel_Paint(object sender, PaintEventArgs e) - { - int x = 0; - int y = 0; - - if (TL.Checked) - { - x = _px; - y = _py; - } - else if (TR.Checked) - { - x = (int)XNumeric.Maximum - _px; - y = _py; - } - else if (BL.Checked) - { - x = _px; - y = (int)YNumeric.Maximum - _py; - } - else if (BR.Checked) - { - x = (int)XNumeric.Maximum - _px; - y = (int)YNumeric.Maximum - _py; - } - - var p = new Pen(_brush); - e.Graphics.DrawLine(p, new Point(x, y), new Point(x + 8, y + 8)); - e.Graphics.DrawLine(p, new Point(x + 8, y), new Point(x, y + 8)); - e.Graphics.DrawRectangle(p, new Rectangle(x, y, 8, 8)); - } - - private void PositionPanel_MouseDown(object sender, MouseEventArgs e) - { - Cursor = Cursors.Arrow; - _mousedown = true; - SetNewPosition(e.X, e.Y); - } - - private void PositionPanel_MouseUp(object sender, MouseEventArgs e) - { - Cursor = Cursors.Hand; - _mousedown = false; - } - - private void SetNewPosition(int mx, int my) - { - if (mx < 0) mx = 0; - if (my < 0) my = 0; - if (mx > XNumeric.Maximum) mx = (int)XNumeric.Maximum; - if (my > YNumeric.Maximum) my = (int)YNumeric.Maximum; - - if (TL.Checked) - { - // Do nothing - } - else if (TR.Checked) - { - mx = (int)XNumeric.Maximum - mx; - } - else if (BL.Checked) - { - my = (int)YNumeric.Maximum - my; - } - else if (BR.Checked) - { - mx = (int)XNumeric.Maximum - mx; - my = (int)YNumeric.Maximum - my; - } - - XNumeric.Value = mx; - YNumeric.Value = my; - _px = mx; - _py = my; - - PositionPanel.Refresh(); - SetPositionLabels(); - } - - private void PositionPanel_MouseMove(object sender, MouseEventArgs e) - { - if (_mousedown) - { - SetNewPosition(e.X, e.Y); - } - } - - private void SetPositionLabels() - { - if (FPSRadio.Checked) - { - _dispFpSx = _px; - _dispFpSy = _py; - } - else if (FrameCounterRadio.Checked) - { - _dispFrameCx = _px; - _dispFrameCy = _py; - } - else if (LagCounterRadio.Checked) - { - _dispLagx = _px; - _dispLagy = _py; - } - else if (InputDisplayRadio.Checked) - { - _dispInpx = _px; - _dispInpy = _py; - } - else if (WatchesRadio.Checked) - { - _dispWatchesx = _px; - _dispWatchesy = _py; - } - else if (RerecordsRadio.Checked) - { - _dispRecx = _px; - _dispRecy = _py; - } - else if (MultitrackRadio.Checked) - { - _dispMultix = _px; - _dispMultiy = _py; - } - else if (MessagesRadio.Checked) - { - _dispMessagex = _px; - _dispMessagey = _py; - } - else if (AutoholdRadio.Checked) - { - _dispAutoholdx = _px; - _dispAutoholdy = _py; - } - - FpsPosLabel.Text = _dispFpSx + ", " + _dispFpSy; - FCLabel.Text = _dispFrameCx + ", " + _dispFrameCy; - LagLabel.Text = _dispLagx + ", " + _dispLagy; - InpLabel.Text = _dispInpx + ", " + _dispInpy; - WatchesLabel.Text = _dispWatchesx + ", " + _dispWatchesy; - RerecLabel.Text = _dispRecx + ", " + _dispRecy; - MultitrackLabel.Text = _dispMultix + ", " + _dispMultiy; - MessLabel.Text = _dispMessagex + ", " + _dispMessagey; - AutoholdLabel.Text = _dispAutoholdx + ", " + _dispAutoholdy; - } - - private void ResetDefaultsButton_Click(object sender, EventArgs e) - { - Global.Config.DispFPSx = Config.DefaultMessageOptions.DispFPSx; - Global.Config.DispFPSy = Config.DefaultMessageOptions.DispFPSy; - Global.Config.DispFrameCx = Config.DefaultMessageOptions.DispFrameCx; - Global.Config.DispFrameCy = Config.DefaultMessageOptions.DispFrameCy; - Global.Config.DispLagx = Config.DefaultMessageOptions.DispLagx; - Global.Config.DispLagy = Config.DefaultMessageOptions.DispLagy; - Global.Config.DispInpx = Config.DefaultMessageOptions.DispInpx; - Global.Config.DispInpy = Config.DefaultMessageOptions.DispInpy; - Global.Config.DispRecx = Config.DefaultMessageOptions.DispRecx; - Global.Config.DispRecy = Config.DefaultMessageOptions.DispRecy; - Global.Config.DispMultix = Config.DefaultMessageOptions.DispMultix; - Global.Config.DispMultiy = Config.DefaultMessageOptions.DispMultiy; - Global.Config.DispMessagex = Config.DefaultMessageOptions.DispMessagex; - Global.Config.DispMessagey = Config.DefaultMessageOptions.DispMessagey; - Global.Config.DispAutoholdx = Config.DefaultMessageOptions.DispAutoholdx; - Global.Config.DispAutoholdy = Config.DefaultMessageOptions.DispAutoholdy; - - Global.Config.DispFPSanchor = Config.DefaultMessageOptions.DispFPSanchor; - Global.Config.DispFrameanchor = Config.DefaultMessageOptions.DispFrameanchor; - Global.Config.DispLaganchor = Config.DefaultMessageOptions.DispLaganchor; - Global.Config.DispInpanchor = Config.DefaultMessageOptions.DispInpanchor; - Global.Config.DispRecanchor = Config.DefaultMessageOptions.DispRecanchor; - Global.Config.DispMultianchor = Config.DefaultMessageOptions.DispMultianchor; - Global.Config.DispMessageanchor = Config.DefaultMessageOptions.DispMessageanchor; - Global.Config.DispAutoholdanchor = Config.DefaultMessageOptions.DispAutoholdanchor; - - Global.Config.MessagesColor = Config.DefaultMessageOptions.MessagesColor; - Global.Config.AlertMessageColor = Config.DefaultMessageOptions.AlertMessageColor; - Global.Config.LastInputColor = Config.DefaultMessageOptions.LastInputColor; - Global.Config.MovieInput = Config.DefaultMessageOptions.MovieInput; - - _dispFpSx = Global.Config.DispFPSx; - _dispFpSy = Global.Config.DispFPSy; - _dispFrameCx = Global.Config.DispFrameCx; - _dispFrameCy = Global.Config.DispFrameCy; - _dispLagx = Global.Config.DispLagx; - _dispLagy = Global.Config.DispLagy; - _dispInpx = Global.Config.DispInpx; - _dispInpy = Global.Config.DispInpy; - _dispRecx = Global.Config.DispRecx; - _dispRecy = Global.Config.DispRecy; - _dispMultix = Global.Config.DispMultix; - _dispMultiy = Global.Config.DispMultiy; - _dispMessagex = Global.Config.DispMessagex; - _dispMessagey = Global.Config.DispMessagey; - _dispAutoholdx = Global.Config.DispAutoholdx; - _dispAutoholdy = Global.Config.DispAutoholdy; - - _dispFpSanchor = Global.Config.DispFPSanchor; - _dispFrameanchor = Global.Config.DispFrameanchor; - _dispLaganchor = Global.Config.DispLaganchor; - _dispInputanchor = Global.Config.DispInpanchor; - _dispRecanchor = Global.Config.DispRecanchor; - _dispMultiAnchor = Global.Config.DispMultianchor; - _dispMessageAnchor = Global.Config.DispMessageanchor; - _dispAutoholdAnchor = Global.Config.DispAutoholdanchor; - - _messageColor = Global.Config.MessagesColor; - _alertColor = Global.Config.AlertMessageColor; - _lastInputColor = Global.Config.LastInputColor; - _movieInput = Global.Config.MovieInput; - - MessageColorDialog.Color = Color.FromArgb(_messageColor); - AlertColorDialog.Color = Color.FromArgb(_alertColor); - LInputColorDialog.Color = Color.FromArgb(_lastInputColor); - MovieInputColorDialog.Color = Color.FromArgb(_movieInput); - - SetMaxXy(); - SetColorBox(); - SetPositionInfo(); - - StackMessagesCheckbox.Checked = Global.Config.StackOSDMessages = true; - } - - private void SetAnchorValue(int value) - { - if (FPSRadio.Checked) - { - _dispFpSanchor = value; - } - else if (FrameCounterRadio.Checked) - { - _dispFrameanchor = value; - } - else if (LagCounterRadio.Checked) - { - _dispLaganchor = value; - } - else if (InputDisplayRadio.Checked) - { - _dispInputanchor = value; - } - else if (WatchesRadio.Checked) - { - _dispWatchesanchor = value; - } - else if (MessagesRadio.Checked) - { - _dispMessageAnchor = value; - } - else if (RerecordsRadio.Checked) - { - _dispRecanchor = value; - } - else if (MultitrackRadio.Checked) - { - _dispMultiAnchor = value; - } - else if (AutoholdRadio.Checked) - { - _dispAutoholdAnchor = value; - } - } - - private void TL_CheckedChanged(object sender, EventArgs e) - { - if (TL.Checked) - { - SetAnchorValue(0); - } - - PositionPanel.Refresh(); - } - - private void TR_CheckedChanged(object sender, EventArgs e) - { - if (TR.Checked) - { - SetAnchorValue(1); - } - - PositionPanel.Refresh(); - } - - private void BL_CheckedChanged(object sender, EventArgs e) - { - if (BL.Checked) - { - SetAnchorValue(2); - } - PositionPanel.Refresh(); - } - - private void BR_CheckedChanged(object sender, EventArgs e) - { - if (BR.Checked) - { - SetAnchorValue(3); - } - PositionPanel.Refresh(); - } - - private void XNumeric_Click(object sender, EventArgs e) - { - XNumericChange(); - } - - private void YNumeric_Click(object sender, EventArgs e) - { - YNumericChange(); - } - - private void ColorPanel_Click(object sender, EventArgs e) - { - if (MessageColorDialog.ShowDialog() == DialogResult.OK) - { - SetColorBox(); - } - } - - private void AlertColorPanel_Click(object sender, EventArgs e) - { - if (AlertColorDialog.ShowDialog() == DialogResult.OK) - { - SetColorBox(); - } - } - - private void LInputColorPanel_Click(object sender, EventArgs e) - { - if (LInputColorDialog.ShowDialog() == DialogResult.OK) - { - SetColorBox(); - } - } - - private void MovieInputColor_Click(object sender, EventArgs e) - { - if (MovieInputColorDialog.ShowDialog() == DialogResult.OK) - { - SetColorBox(); - } - } - - private void XNumeric_KeyUp(object sender, KeyEventArgs e) - { - XNumericChange(); - } - - private void YNumeric_KeyUp(object sender, KeyEventArgs e) - { - YNumericChange(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/N64/N64ControllerSettingControl.cs b/BizHawk.Client.EmuHawk/config/N64/N64ControllerSettingControl.cs deleted file mode 100644 index 191acadc1b..0000000000 --- a/BizHawk.Client.EmuHawk/config/N64/N64ControllerSettingControl.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Common.ReflectionExtensions; - -using BizHawk.Emulation.Cores.Nintendo.N64; - -namespace BizHawk.Client.EmuHawk -{ - public partial class N64ControllerSettingControl : UserControl - { - private int _controllerNumber = 1; - - public N64ControllerSettingControl() - { - InitializeComponent(); - - ControllerNameLabel.Text = "Controller " + ControllerNumber; - } - - public int ControllerNumber - { - get - { - return _controllerNumber; - } - - set - { - _controllerNumber = value; - Refresh(); - } - } - - public bool IsConnected - { - get - { - return EnabledCheckbox.Checked; - } - - set - { - EnabledCheckbox.Checked = value; - if (PakTypeDropdown != null) // Null check for designer - { - PakTypeDropdown.Enabled = value; - } - - Refresh(); - } - } - - public N64SyncSettings.N64ControllerSettings.N64ControllerPakType PakType - { - get - { - if (PakTypeDropdown.SelectedItem != null) // Null check for designer - { - return PakTypeDropdown.SelectedItem - .ToString() - .GetEnumFromDescription(); - } - - return N64SyncSettings.N64ControllerSettings.N64ControllerPakType.NO_PAK; - } - - set - { - if (PakTypeDropdown.Items.Count > 0) // Null check for designer - { - var toSelect = PakTypeDropdown.Items - .OfType() - .FirstOrDefault(item => item.ToString() == value.GetDescription()); - PakTypeDropdown.SelectedItem = toSelect; - - Refresh(); - } - } - } - - public override void Refresh() - { - ControllerNameLabel.Text = "Controller " + ControllerNumber; - base.Refresh(); - } - - private void EnabledCheckbox_CheckedChanged(object sender, EventArgs e) - { - PakTypeDropdown.Enabled = EnabledCheckbox.Checked; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.cs b/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.cs deleted file mode 100644 index 2d8b5e2dec..0000000000 --- a/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.Nintendo.N64; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class N64ControllersSetup : Form - { - private List ControllerSettingControls - { - get - { - return Controls - .OfType() - .OrderBy(n => n.ControllerNumber) - .ToList(); - } - } - - public N64ControllersSetup() - { - InitializeComponent(); - } - - private void N64ControllersSetup_Load(object sender, EventArgs e) - { - var n64Settings = ((N64)Global.Emulator).GetSyncSettings(); - - ControllerSettingControls - .ForEach(c => - { - c.IsConnected = n64Settings.Controllers[c.ControllerNumber - 1].IsConnected; - c.PakType = n64Settings.Controllers[c.ControllerNumber - 1].PakType; - c.Refresh(); - }); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - var n64 = (N64)Global.Emulator; - var n64Settings = n64.GetSyncSettings(); - - ControllerSettingControls - .ForEach(c => - { - n64Settings.Controllers[c.ControllerNumber - 1].IsConnected = c.IsConnected; - n64Settings.Controllers[c.ControllerNumber - 1].PakType = c.PakType; - }); - - n64.PutSyncSettings(n64Settings); - - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.resx b/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.resx deleted file mode 100644 index 91f294b89b..0000000000 --- a/BizHawk.Client.EmuHawk/config/N64/N64ControllersSetup.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/N64/N64VideoPluginconfig.resx b/BizHawk.Client.EmuHawk/config/N64/N64VideoPluginconfig.resx deleted file mode 100644 index cddb4546e3..0000000000 --- a/BizHawk.Client.EmuHawk/config/N64/N64VideoPluginconfig.resx +++ /dev/null @@ -1,1275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 17, 17 - - - Enable/Disable Anisotropic Filtering for Mipmapping (0=no filtering, 2-16=quality). -This is uneffective if Mipmapping is 0. -If the given value is to high to be supported by your graphic card, the value will be - the highest value your graphic card can support. Better result with Trilinear filtering - - - - Enable/Disable Anisotropic Filtering for Mipmapping (0=no filtering, 2-16=quality). -This is uneffective if Mipmapping is 0. -If the given value is to high to be supported by your graphic card, the value will be - the highest value your graphic card can support. Better result with Trilinear filtering - - - 36 - - - - - AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABILAAASCwAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmQWqqqoSu7u7Hr64uCu/u7s8t7S0Tqqf - n2CPiIp0eXV1em1ra3ppZGR1bWdnXnNzc0WIiIgthISEG5mZmQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAjS0tIR3d3dHs3NzS7V1dU92NjYTtjV1WLW1NR31tbWidbT - 053V0tKx0tLSwtLNzdHPzMzhzMfH7snGxvfCvr7/rqur/5eTk/+Dfn//c29v/25qav9zcHD/fHp6+42M - jO+dnJzepKSkyKioqLKioqKWmJiYfI+Pj2KQkJBHioqKMoCAgBxiYmINAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADDw8Mixby8OcbDw0jKyMhcz8/PcNTU1IPd1taW29vbqt3d3b3d3d3M3d3d3N3d - 3ere3t703d7e/eDg4P/g39//393d/9/d3f/f3d3/39zc/93b2//c29r/29fX/9nV1f/W0tP/0s/P/8XB - wf+uq6r/lZGR/397e/9xbm7/bmtr/3Vycv+DgYH/lJKS/6Sjo/+sra3/ra2t/6eoqP+fn5//mpqa/5mZ - mf+ZmZn/lpaW85aWluSTk5POlZWVupmZmaCUlJSFj4+Pa46Ojk+Li4s3ZmZmCgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqG8LAwOXPy8v/0M7O/9XS - 0//Z1tb/3Nvb/+Hh4P/l5eX/6Ojo/+rq6v/r6+v/7Ozs/+zs7P/r6+v/6urq/+fn5//i4eH/3dvb/9fV - 1f/Py8v/xMLC/7y4uP+xra7/pqGj/5yXl/+SjI7/hX+A/3dycv9uZ2n/Z2Ji/2VeYP9mYWL/bGho/3Zy - c/+Df4H/kZCQ/5uamv+enp7/nZ2d/5mZmf+Xl5f/l5mZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZ - mf+ZmZn/mZmZ/5mZmf+UlJTWjIyMNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADBvr5SzsvK/9DMzf/Rz8//1NHR/9bU1P/V1NT/1NLT/9HP0P/Mysr/xMLD/7y6 - uv+0sbL/rKio/6Sfn/+blpf/k4+P/4yHiP+Ff4H/fnl6/3t1dv94cnP/dXBx/3Rub/90bm//dG5v/3Rv - b/92cXL/eXN0/3t1dv98d3j/fnh5/395ev9/eXr/f3l6/396e/+Benv/g3x9/4aAgf+Ig4T/i4aG/42I - if+QjI3/ko+Q/5SRkv+WlJT/mZWW/5mXl/+amZn/mpmZ/5uamv+bmpr/mpub/5qamv+VlZXfY2NjEgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKmpiuloKKymZKSvpiS - lMmUkpLUkYyN34+Ki+uNh4jyioWG+IqEhf6LhYf/i4WG/4uFhv+Lhof/jIeI/4+Iif+Qiov/kouN/5ON - j/+VjpD/lpGS/5eRkv+YkpP/mJOU/5qTlP+ak5T/mpSV/5qUlf+alJX/mpSU/5qUlP+ak5T/mpOU/5qT - lP+ak5T/mJOU/5iSk/+YkpP/l5GT/5eRkv+Wj5H/lo+Q/5WOkP+VjY//lI2P/5OMjv+Ti43/kouN/5KK - i/+Riov/kYqL/5CKiv+Pior/lpWV/5qamv+QkJBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARmZmYKh4eHEYB2dhqGgIAmh4KHMZmI - jDyOg4dIi4KFVouDg2WNhIZ0ioKCgYR9gI+EfH6ehH1+rId8fbuAeHjFgHZ50X52d9x8dnfofHR2+X12 - d/97dHX/e3N0/3pyc/94cXL/eHBx/3dvcP92bm//dW1v/3Rrbf9zam3/cmlr/3Joa/9waGr/cGdp/29m - aP9uZWf/bmRn/21jZv9sY2X/bGJl/2thZP9qYWP/amBi/2lfYv9oX2H/aF9h/2ZdX/9uZmn/lJSU/5WV - lbUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAACIAAACFVEVQ9TRkYoYVdZiWVcXvxoX2H/aWBi/2lgYv9qYWP/amJk/2tj - Zf9sY2X/bWRm/21lZ/9uZmj/cGdp/3Boav9xamv/c2ps/3Nsbf91bm//dm9w/3dwcf94cXL/eXN0/3p0 - df98dXf/fXd4/354ef+Benr/gnt8/4N8ff+TkZH/lpaW4GZmZgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjouLVqunqfuuq6v/r6yt/7Gur/+zsLL/tbO0/7e1tf+6trf/u7i6/727vP+/vb3/wb+//8PB - wv/Ew8P/x8XF/8jIyP/Kycr/y8vL/87Mzv/Pz8//0dHR/9PT0//V1dT/1tbW/9fX2f/Z2tr/39/f/8PD - xP+RkZHyenp6GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6u3tn+3w8P/t8PD/7fDw/+3w - 8P/t8PD/7fDw/+3v8P/s7+//7O/v/+zt7f/r7O3/6uzs/+rs7P/p6+v/6erq/+fq6v/m6ej/5efn/+Tm - 5v/i5eX/4eTk/+Hi4v/f4OH/3eDf/9zd3f/d4OD/xcjI/5OTk/Z7e3sfAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACwq6s6sLCw/bKysv+wr6//rq2u/62srP+rqan/qaio/6empv+mpaX/paOk/6Oh - of+hoKD/oJ+f/5+dnv+enJz/nZub/5uamv+al5f/mZaW/5eVlf+WlJT/lZOT/5SSkv+TkZH/k5CR/5GP - j/+Uk5P/lpaW4GZmZgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZmZhSEgIDvh4SE/4eE - hP+HhIT/h4SE/4eEhP+HhIT/h4SE/4eEhP+HhIT/h4SE/4eEhP+HhIT/h4SE/4eEhP+IhIT/iISE/4iF - hf+IhYX/iIWF/4iFhf+IhYX/iIWF/4iFhf+IhYX/h4SE/5KRkf+VlZWpAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAARkZGC4aFheOKh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+KiIj/lpaW/5GRkWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bGwhh4SE9oqH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/iYaG/46Li/+Xl5f2gICAIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB8fEiKh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Jhob/kpGR/5aWlsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgoCAcoqH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+VlZX/lZWVfwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFhISdioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qHh/+Kh4f/ioeH/4qH - h/+Khof/joqK/5mZmf+Pj487AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeC - g8SLh4j/i4eI/4uHiP+Lh4j/i4eI/4yHiP+Mh4j/jIeI/4yHiP+Mh4j/jIiI/4yIiP+MiIj/jIiI/4yI - iP+MiIj/jIiI/4yIif+MiIn/jIiJ/4yIif+MiIn/jIiJ/4uHiP+SkJD/mZmZ4WZmZgoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUMjIWG5I+Jiv+PiYr/j4mK/4+Jiv+PiYr/j4qK/4+K - iv+Pior/j4qK/4+Kiv+Pior/j4qL/4+Ki/+Piov/j4qL/5CKi/+Qiov/kIqL/5CKi/+Qiov/kIqL/5CK - i/+Qiov/kIqK/5WUlf+ZmZmlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB5 - eSiOiYr7kYyN/5GMjv+RjI7/kYyO/5GMjv+RjI7/kYyO/5KMjv+SjI7/koyO/5KNjv+SjY//ko2P/5KN - j/+TjY//k4+P/5OOkP+TjpD/lI6Q/5SOkP+UkJD/lJCR/5SQkf+VkZL/nJyc/4uLi08AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAg7OzsNWlpaEUZGRhZSSkofV1FRKWZmVzJfW1s7ZmZmQV5b - W0lfWVlWZmZmZI6OjnFVVVUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIWJRZeSk/+WkpP/lpKT/5aSk/+WkpP/lpKS/5aR - kv+WkZL/lpGS/5WRkv+UkJH/k46Q/5ONj/+SjY7/kYyO/5GMjf+Pior/jomJ/4uHh/+Khob/ioaG/4mE - hf+HgYP/hX+B/4R/gP+DgYH+b2trmGJeXohnZGKXaGRkpGhlZLBrZ2e6aGRkv2lmZshoZmbSaWZm3Gpm - ZuRqZmbra2dn72tmZvRqZmb6bmpq/29ra/9taWn/aGRk/3x5ef/CwsL/19fX/319fTEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABDMzMwpEREQPKysrEjExMRVAQEAgR0dHK1VVVTZVVVU/WVVVQlRQ - TUZwbGygg36A/397e/99enn/fXp6/3x4eP96dnb/d3Rz/3Zycv91cXH/dXFx/3NwcP9ybm//cW5t/3Bt - bP9wbWz/cGxs/29sa/9vbGv/bmtq/21qaf9uamr/bmpq/25qav9taWn/bWlp/2xoaP9uamr/b2tr/25q - a/9uamr/bmpq/25pav9taWn/bWlp/2xoaP9saGj/a2dn/2pmZv9qZmb/aWVl/2hkZP9nZGT/ZmJi/2lm - Zv+SkZH+2dnZ/+/v7//i4uL/hISEUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABBcXFws8PDwRHBwcEjMzMxQwMDAgOjo6LEBAQDhEQEBAQkJCQkNA - QEhIRkZYSkVFaEpISHVMSEh/TEpKgExKSolQUFCZT01NqFBPT7VVUFC9Uk9PvlRQUMhVU1PUVlNT31hV - VehZVVXtWldX7ltXV/VcWVj7X11c/2BdXf9hXl7/YV5e/2BdXf9gXVz/YV5d/2FdXf9hXl3/YV5d/2Fe - Xf9hXl3/YV5d/2FeXf9hXl3/YF1c/2FdXf9gXVz/YF1c/2BdXP9fXFv/X1tb/15cW/9eW1r/Xlta/15b - Wv9dWlr/XVlZ/1xZWf9cWVn/W1hY/1tYWP9cWVn/XFlZ/1xZWf9cWVn/XFpa/11aWv9dW1v/X1xd/2Be - Xv9hX1//YmFh/2RiYv9lY2T/Z2Vl/2hmZv9samr/rays/ujo6P/q6ur/5+fn/+bm5v+ampp3AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXCzMzMxQwMDAgPTc3LkE9PTtCQkJCQkJCQkFB - QUdFQkJZRkZGakZERnhIREaASERGgEdFRYlHRkaaSEZIq0hHSLhJRki9R0dHvkdGRshIRUfVSUdH4UlH - R+tIRkbtSEZG7klGR/VIRkb8S0lJ/0tJSf9LSUn/S0hJ/0pISP9KSEj/SkhI/0pHSP9KSEj/SkdH/0pH - SP9JR0f/SkdH/0lHR/9KSEj/SkhI/0tJSf9LSkn/S0pK/0xKSv9NS0v/TUtL/09MTf9QTk7/UlBQ/1RS - Uf9VU1P/V1VV/1hWVv9aWFf/XVta/19eXf9iYGD/ZGNj/2ZlZf9paGj/bGpq/25tbf9ycXD/dXR0/3h3 - d/97enr/gH5+/4OCgv+GhYX/iYiI/4yLjP+Qj4//k5OT/5eWlv+ampr/np2e/6Ggof+lpKX/pqan/6mp - qf+srK3/rq6v/7Cwsf+0tLX/trW3/7i4uv+6urv/u7u8/7y7vf+9vb7/vr2//7++wf/BwcL/v7/B/7y8 - vfvr6+v/5+fn/+bm5v/m5ub/6+vr/6ampp0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIQUZD - Q6FEREThRkJC7kRBQvVEP0H9RkJE/0VCQ/9EQUL/Q0FC/0NAQf9DQEH/QkBB/0JAQf9CQEH/QkBB/0JA - Qf9CQEH/QkBB/0NBQf9EQkP/RkRF/0dERf9IRkf/SkhI/0pJSf9LS0v/TkxM/1FQUP9UUlL/V1VV/1lZ - Wf9dXFz/YF9f/2NiYv9mZWb/amlp/29vb/9zcnL/d3Z2/3x7e/+Bf4D/hYSE/4mIif+Ojo7/lJOT/5eX - l/+dnJz/o6Gh/6enpv+trK3/sLCw/7W0tP+4uLj/vby9/8LCwf/HxcX/ysrK/8/Pz//R0dH/1NTT/9bV - 1f/Z2dn/29ra/93c3P/g4N//4uHh/+Hh4f/h4OD/4ODg/9/f3//f39//393d/93d3f/d3d3/29ra/9nX - 1//W1dX/1NTT/9HQ0P/Qz8//zszN/8zKy//JyMj/x8XF/8TCw//Bvr//v728/7y7u/+7uLj/uLa2/7a0 - tP+0sbL/sa+v/7Ctrf+urKz/ramq/6moqP+joaH+sLCw8+jo6P/n5+f/5+fn/+fn5//t7e3/srKywQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAF5c3MofX19Zl5cXshUU1P/WFZX/1pZWf9dXF3/YWBh/2VkZf9paGn/bm1t/3Jx - cf92dXb/e3t7/4CAgP+FhIX/ioqK/5CQkP+WlZX/nJuc/6CgoP+np6f/rKys/7Kysv+2trb/urq6/7++ - vv/Dw8P/yMjI/83Nzf/Q0ND/09PT/9XV1f/X19f/2tra/93d3f/g4OD/5OTk/+Xl5f/l5eT/5uXl/+bl - 5f/m5uX/5+bm/+jn5//q6Of/6Ofn/+fm5v/m4+X/5eTk/+Ti4f/i4eH/4eDf/+Hf3//f3Nz/3dvb/9rZ - 1//Z1tb/1tTU/9TR0f/S0ND/0M/O/87Ny//Mysn/ysjI/8jFxf/Fw8P/xMHB/8K/vv/Bvb3/vry7/726 - uv+7uLf/ure2/7e1tf+2tLP/tbGy/7Ovr/+zr67/sa6t/7CtrP+vrKz/rauq/62pqv+sqaj/rKem/6um - pv+ppqX/qaWl/6ikpP+npKP/p6Kj/6ajov+loaD/AAAA/6Shn/+koKD/pKCf/6Ofn/+hn57/oJ6e/56c - m/+lo6Py4uPj/ejo6P/n5+f/5+fn/+zs7P/ExMTgVVVVCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcXFxK6KfoOmtrK3/t7a2/7y8 - vP++vr7/w8LC/8XExP/Hx8X/yMjI/8rKyf/Ly8v/zs7O/9DQ0P/T09P/1dTU/9XV1P/W1dX/19bV/9fW - 1v/X1tb/2dfX/9rZ1//b2df/2tnX/9rX1//Z19b/19bV/9fV1P/W1dT/1tTT/9XS0//V0tH/0tHQ/9HQ - z//Qzs3/z8zN/87Lyv/Mysn/y8rJ/8vJyP/Kxsf/ycXF/8fEw//Fw8P/xcLC/8TBwP/DwcD/w8HA/8K+ - vv/Cvr3/wb69/7+8vP+/vLv/vry7/767u/++urr/vbq6/724t/+7uLf/u7e3/7q3tv+6trb/uLa1/7i1 - tP+3tbT/uLS0/7e1tP+3tLP/trSz/7azsv+1sbL/tbGw/7SxsP+0sK//s7Cv/7Gvrv+zr6//sa6u/7Gu - rf+wra3/r62s/6+trf+vraz/r62s/66srP+urKz/raus/6ysq/+tq6z/rKur/6ysrP+sq6z/q6us/6ur - q/+pqav/qaur/6ipq/+oqav/qKmr/6akpP+hn57/oJ6d/6CdnfXa2tr76urq/+jo6P/o6Oj/7Ozs/9LS - 0vdwcHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACEhIQbqKWl3a2pqv+ppqb/qKal/6elpP+mpKP/pqOj/6ajov+mo6P/pqSj/6ak - pP+npKT/qKWk/6impf+rp6b/rKio/62pqv+vrKv/sK2s/7Gvrv+0sK//tbGy/7azs/+4tbT/u7a2/7y4 - t/++urn/vru7/8G8vP/Cvb3/wr69/8PBwP/DwcD/w8HA/8PBwP/DwcD/w8HA/8PBwP/DwcD/w8HA/8O/ - wP/Dv8D/wr++/8K/vv/Dvr//w7++/8K/vv/Cv77/wr6+/8K+vf/Bvr3/wb29/8G9vP+/vr3/wb29/7+9 - vP+/vb3/v728/7+9vf++vb3/vr28/769vf++vL3/vr29/76+vf++vb3/vb69/729vf+8vb3/vb29/7y9 - vf+8vb3/u7y9/7u8vP+4urz/t7q6/7a3uP+1tbb/tLS0/7SztP+ysrL/r66t/6ypqv+rpqX/qKGi/6eg - nv+mnpz/pJyZ/5+Ukf+cjYr/mImE/5eEf/+VgXz/lX55/5J6c/+Mcmv/iWxk/4VmXf+BYFb/kIeF/6Sj - o/+hnp7/m5mY99LS0vjs7Oz/6Ojo/+jo6P/r6+v/4ODg/4KCgj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQOZmJiynZqZ/52a - mf+dmpr/nZqa/52amv+dmpr/npub/5+dnP+gnp7/oaCf/6WhoP+mo6L/p6Sk/6mmpf+rqKf/rauq/6+s - q/+xrq3/s7Cw/7Wxsv+3tLT/uLW2/7u4t/+8urr/vry7/8G9vP/Cvr7/w7/A/8TCwf/Fw8P/x8TE/8fF - xf/Ix8X/yMfH/8jIx//IyMj/ycjJ/8rJyv/Kysr/ysrK/8rKy//Jysv/ycrK/8rLy//Ky8v/ycvL/8jK - yv/Iysr/x8nJ/8XIyP/Excb/w8TE/8HCwv/BwcH/vb29/7u4uP+4trX/trOy/7SurP+xqqr/r6al/6qg - nf+nmZf/o5SQ/6GPjP+fi4f/nYaC/5eAe/+TeHP/jnFs/4trZf+KZ2D/iWRc/4VeV/+AWFD/fFJI/3dL - Qv91Rz3/dUQ6/3RCOP9xPjT/bTgv/2s1Kf9pMSb/aC8j/2gtIf9oLCD/Zigd/2QnG/9jJBn/YiQY/2Ij - F/9iIhf/YiIW/2IiFv9iIhX/YiEV/1waEP9cSEL/pqeo/6Genv+ZmZn6x8fH9e3t7f/q6ur/6urq/+vr - 6//n5+f/k5OTYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiWloaenJv/npyb/56cm/+fnZz/n56d/6Cenv+hn5//o6Gg/6Wj - o/+mpqX/qain/6urq/+tra3/rq6v/7Cwsf+ztLT/tba3/7e4uP+6u7z/u72+/73Av/++wcL/wMLD/8DC - w//BwsL/wcLD/8LCw//CwsP/wsLC/76+vv+8urr/ura1/7ezsf+2r63/tK2r/7Gopv+toaD/p5iX/6OT - j/+hjYr/n4mF/5uEgf+Xfnn/k3Zy/4xuaP+JZ2L/h2Jc/4RgWf+AWlL/fFNM/3lMRf90RT//c0I5/3E/ - Nv9uOzP/ajYu/2cyKf9lLiX/ZCoi/2MoIP9iJx7/YCUb/18iGv9dIBj/XR4W/10dFf9dHBX/XRwV/1wb - FP9dGxP/XBoT/1waE/9cGxP/XRsT/10cE/9dHRP/Xh4V/18eFf9fHxX/Xx8V/2AfFv9hIBb/YSEX/2Ii - F/9jIxj/YyMY/2MjGP9kJBn/ZCQZ/2UlGf9lJhr/ZSYa/2UmGv9lJxr/ZSca/2YoGv9mKBv/ZSMX/1E3 - L/+goaP/o5+f/5qVlf28u7v07e3t/+rq6v/q6ur/6urq/+3t7f+goKCJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5SUWJ6c - m/+enJv/np2d/5qbm/+Xl5b/l5WU/5iUkv+blJP/mJGP/5SNjP+SiIb/j4OB/5GBff+Sf3v/lX96/5J7 - df+Lc27/h2xm/4VnYP+FZFv/hWFY/4dfVv+BWVH/elFI/3ZKQP90RTz/dEE4/3Q/Nf9yPTT/bTcv/2gx - KP9mLiX/ZCoh/2EnHv9hJR3/YCQb/14hGv9cHhf/WxwW/1oaFP9aGRP/WhkT/1oYE/9aFxL/WRcS/1kX - Ev9aFhL/WhcS/1oXEv9aGBL/WxgS/1sZE/9bGhP/XBoT/1waE/9cGxT/XRwV/10dFf9eHhb/Xh4W/14f - Fv9eHxf/Xx8X/2AfF/9gIBj/YCEY/2EhGf9hIRn/YiIZ/2IiGf9iIhn/YiIZ/2IjGf9iIxr/YyMa/2Mj - Gv9jIxr/YyQa/2MkGv9jJBr/ZCUa/2QlGv9kJRr/ZCUa/2QlG/9lJhv/ZSYb/2UnG/9lJxv/ZScb/2Yo - Gv9mKBv/Zigb/2YoG/9nKBv/Zigb/2YoG/9oJxr/Ui0k/5aWl/+koaD/m5iY/rCur/Ps7Oz/6+vr/+vr - 6//r6+v/8PDw/7GxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPioowm5mY/KCiof95XFX/Xy0i/14tI/9dKSD/Xice/2Uq - Hv9mKBz/ZSYb/2MjGf9iIRf/YR8W/2IfFP9lHxX/ZyAV/2YeFf9lHhT/ZR0T/2UcE/9lHBL/ZRsS/2Uc - Ev9lHBP/YxwT/2McE/9jHBP/YxwU/2McFP9jHRT/Yh4W/2IeFv9iHhf/YR4X/18eFv9eHhb/Xh4W/18f - F/9fHxf/Xx8X/18fF/9fHxf/Xx8X/18fF/9fHxf/Xx8Y/18fF/9fHxf/XyAY/18gGP9fHxf/XyAX/2Ag - GP9gIBj/YCAY/2AgGP9gIBj/YCAY/2AgGP9gIRn/YCEZ/2AhGf9hIRn/YSEZ/2EhGf9hIRn/YiIZ/2Ii - Gf9iIhn/YiIZ/2IjGf9jIxr/ZCMa/2QjGv9kIxr/ZCQa/2QkGv9kJBr/ZCUa/2QlGv9lJhv/ZSYb/2Um - G/9lJhv/ZSYb/2YnG/9mJxv/Zigb/2YoG/9nKBv/Zygb/2coG/9nKBv/Zygb/2coG/9oKRv/aCkb/2sp - Gv9QJhv/iIiI/6ajo/+fnJv/qKam9Obm5v7s7Oz/6+vr/+vr6//x8fH/wMDA0AAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBg - YBCbmprlo6Wm/21PSP9ZFg7/Xh0T/14dFP9eHRP/YiAV/2UhFv9nIRb/ZyIX/2cjGP9nIhf/ZyIX/2Yi - F/9nIxj/aCMY/2okGf9qJBn/aiQZ/2okGf9pIxj/aSMY/2okGf9pIxj/aCIY/2ciGP9mIhj/ZiEY/2ci - Gf9nIRn/ZiEZ/2UhGf9lIRn/ZSEZ/2IgGP9gHxf/YCAY/2AgF/9fHxf/Xx8X/18fF/9gIBj/YCAY/2Ag - GP9gIBj/YCAY/2AgGP9gIBj/YCAY/2AgGP9gIBj/YCAY/2AgGP9hIRj/YCAY/2AgGP9hIRn/YSEZ/2Eh - Gf9hIRn/YSEZ/2EhGP9iIhn/YiIY/2IiGf9iIhn/YiIZ/2MjGv9kIxr/ZCMa/2QjGv9kJBr/ZCQa/2Uk - G/9lJRr/ZSUa/2UmG/9lJhv/ZSYb/2YmG/9mJxv/Zicb/2YnG/9mKBv/Zygb/2coG/9oKRv/aCkc/2gp - HP9oKRz/aCkc/2gqG/9oKhv/aCob/2gqG/9oKhv/aysc/1UkFv96dnX/qKam/5+dnf+gnp714ODg++3t - 7f/s7Oz/7Ozs//Hx8f/Pz8/tXl5eEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuYl8KlpKX/d2Vg/1gaEf9gIBb/XyAW/18g - Fv9gIBb/ZiMX/2cjGP9oJBj/aCQY/2ckGP9oJBj/aCQY/2cjGP9nIxj/ZyMY/2gjGP9pJBj/aiUZ/2sl - GP9qJBj/aiQY/2okGP9qJBn/aiQY/2kjGf9oIxn/ZyIZ/2giGf9pIxn/ZyIZ/2ciGf9nIhn/ZyIZ/2Uh - Gf9jIBj/YSAY/18fF/9fIBj/YCAY/2AgGP9gIBj/YSAY/2EgGP9hIRj/YSEY/2EhGP9hIRj/YSEY/2Eh - GP9hIRj/YSEY/2EhGP9hIRj/YiIZ/2EiGf9iIhn/YiIZ/2IiGf9iIhn/YiIZ/2IiGf9iIhn/YyMa/2Mj - Gv9jIxr/ZCMa/2QkGv9lJBr/ZSQa/2UlGv9lJhr/ZiYb/2YmG/9mJhv/Zicb/2cnG/9nJxv/Zigb/2Yo - G/9nKBv/Zygb/2gpG/9nKRz/aCkc/2gpHP9oKRz/aCoc/2gqG/9pKxz/aSsc/2krHP9pKxz/aSsc/2kr - HP9rLBz/WiIV/21jYP+pqKj/oZ6d/5yamffW1tb58PDw/+zs7P/t7e3/8PDw/93d3f19fX0vAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAm5iYl6Sho/+GfHv/Vx4U/2AhFv9fIRb/XyEW/18hFv9kIxf/aCUY/2glGP9pJRj/aSYY/2gl - GP9oJRj/aCUY/2gkGP9oJBj/ZyQY/2cjGP9oIxj/aSQZ/2olGP9rJBj/aiQY/2skGP9rJRj/ayUY/2sl - GP9qJBn/aiQZ/2kkGf9qJBn/aSQZ/2gjGf9nIxn/aCMZ/2cjGf9lIRn/YCAX/2AgF/9iIBj/YyEY/2Mh - GP9jIRj/YyEY/2MhGP9jIRj/ZCEZ/2MiGf9jIRn/YyIZ/2MiGf9iIhn/YiIZ/2EiGf9iIhn/YiIZ/2Ii - Gf9iIhr/YyMa/2MjGv9jIxr/YiIZ/2MjGv9jIxr/ZCMa/2QkGv9lJBr/ZSUa/2UlGv9lJhr/ZiYb/2cm - G/9mJxv/Zycb/2coG/9oKBv/aCgb/2goG/9nKBv/aCkc/2gpHP9oKRz/aSod/2kqHf9pKhz/aSsc/2kr - HP9pLBz/aiwc/2osHP9qLBz/aiwc/2stHP9rLB3/ay0c/2stHP9jJRb/YFFL/6enqP+hnp3/mZaZ+szM - y/bx8fH/7e3t/+3t7f/v7+//6Ojo/4iIiE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZlpoZ+f/5OQkP9aKBz/YSAU/2Ei - Fv9hIhb/YCIW/2EiFv9oJRj/aSYY/2knGP9pJxj/aScY/2kmGP9pJhj/aCYY/2gmGP9oJRj/aCUY/2gl - GP9nJBj/aCQY/2olGP9rJRj/ayUY/2slGP9rJRj/bSYZ/2wlGP9sJRn/ayUZ/2slGf9rJRn/ayUZ/2ol - Gf9pJBr/aiUa/2slGv9oIxn/YyEY/2MhGP9jIhj/ZCIY/2QhGf9kIRn/ZCMZ/2QjGf9lIhn/ZSIZ/2Uj - Gf9lIhn/ZSIZ/2QjGf9kIxn/ZCMZ/2MjGf9jIxn/YyMZ/2MjGf9jIxn/ZCQZ/2QkGf9jIxn/YyMY/2Qk - Gf9kJRn/ZSUa/2UmG/9mJhv/ZiYb/2cnG/9nJxv/aCcb/2goG/9oKBv/aSgb/2kpHP9pKRz/aiod/2oq - Hf9pKxz/aSsc/2orHP9qLBz/aiwc/2osHP9rLRz/aywd/2stHf9rLh3/ay0d/2suHf9rLh3/bC4d/2wt - Hf9sLh3/bC4d/2kpGP9ZQjn/o6Sm/6Genv+YlpX9wL6+9fLy8v/t7e3/7+/v//Dw8P/w8PD/paWldwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAJiUlD6hnp3/nZ2e/2E2K/9iHhP/YyMW/2MjFv9jIhb/YiEW/2YkF/9rJhj/aiYY/2sn - GP9sJxn/bCcZ/2wmGP9rJhj/ayYY/2smGP9rJhj/aiYY/2olGP9qJRj/aSUY/2smGP9rJhj/ayYY/2wm - GP9tJhj/bicZ/24mGf9uJhn/biYZ/20mGf9tJhn/bSYZ/20mGv9sJhr/bCYa/2wmGv9sJhr/ZyMZ/2Qj - GP9lIxn/ZiMZ/2YjGf9mIxn/ZyQZ/2ckGf9nJBn/ZyQZ/2YkGf9mJBn/ZiQZ/2YkGf9mJBn/ZiQZ/2Uk - Gf9lJBn/ZSQZ/2YlGf9lJRn/ZiUa/2UlGf9kJBn/ZCQZ/2UlGv9mJhr/Zicb/2cnG/9nKBv/aCgb/2go - G/9pKRz/aSkc/2kpHP9qKh3/aiod/2oqHP9rKxz/aysc/2ssHP9rLRz/ay0d/2wtHf9sLR7/bC0e/2wt - Hv9sLR3/bC4d/2wvHf9tLh7/bC4d/20vHf9tLx7/bS8e/20vHv9tLx7/bi0b/1Y3LP+bnJ7/o6Cf/5uY - mP61tLP08fHx/+/v7//v7+//7+/v//T09P+qqqqcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISEG5yZmfCjpKX/a0o//2Ie - Ev9kIxb/ZCMW/2QjFv9kIxb/ZCMW/2snGP9tJxn/bSgZ/20oGf9uKBn/bigZ/20oGf9tJxn/bScZ/20n - Gf9tJhj/bCYY/2wmGf9sJhj/bCYY/20nGf9sJhn/bScZ/20nGf9uJxn/byga/3AoGf9wKBn/bygZ/3Ao - Gv9vKBr/byga/24nGv9uJxr/bica/28oG/9vKBv/ayYa/2ckGf9oJBn/aSQa/2klGv9pJRr/aiYa/2om - Gv9qJhr/aSUa/2klGv9oJRr/aCUa/2clGf9nJRn/ZyUZ/2clGf9nJRn/ZyUa/2clGv9oJhr/aCYa/2Yl - Gf9nJRn/aCYa/2gmGv9oJxv/aScb/2koG/9pKBv/aSkb/2oqHP9qKhz/aioc/2srHf9sKx3/aysc/2ws - Hf9sLB3/bS0e/20tHv9sLh7/bS4e/20vHv9tLx7/bS8e/20vHv9tMB7/bTAe/24wHv9tMB7/bjAe/24w - Hv9uMB7/bjAe/20xHv9vMR3/VjAh/5GRkf+lo6L/n5ub/6qpqPTr6+v+8fHx//Dw8P/w8PD/9vb2/7u7 - u8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABVVVUDnJqa0Kamp/90Xlj/Xh0R/2YmF/9mJRf/ZSQX/2UkF/9kIxb/aCYY/24q - Gf9uKhn/byoZ/28qGf9vKhr/byoa/28qGv9vKhr/bika/24pGv9uKBn/bigZ/24oGf9uKBn/bikZ/28p - Gv9vKRr/byka/28pGv9vKRr/byka/3EqGv9yKhr/cioa/3MqGv9zKhv/cioa/3IrG/9xKhv/cCob/3Aq - G/9xKxz/cCoc/2wmGv9qJhr/ayYa/2wmGv9sJxr/ayYa/2smGv9rJhr/aiYa/2omGv9qJhr/aiYa/2km - Gv9pJhn/aCYa/2gmGv9oJxr/aSca/2knGv9pJxv/aCca/2gmGv9oJhr/aSca/2knG/9qKBv/aygc/2sp - G/9rKhz/ayoc/2srHP9sKx3/bCwd/2wtHf9tLR7/bS0e/24tHv9uLR7/bi4e/24vHv9uMB7/bjAe/24w - Hv9uMB7/bjAe/24wHv9vMR//bzEf/28xH/9vMR//bzEf/24yH/9tMh//bTIf/3AzH/9ZKxv/g4GA/6el - pf+fnZz/oqGh9uXn5vzy8vL/8fHx//Hx8f/29vb/zc3N31VVVQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcm5mopqWl/4F2 - cv9aHhL/ZSQW/2gnF/9oJxf/aCYX/2cmF/9nJhf/byoZ/3ArGv9wLBr/cSwa/3EsGv9xLBr/cSwa/3Er - Gv9wKxr/cSsa/3ArGv9wKhr/cCoa/3AqGv9wKhr/cSsa/3ErGv9xKxr/cSsa/3ErGv9xKxr/cSsa/3Mq - Gv9zKxr/cysa/3QrG/91Kxr/dSwb/3UtHP91LRz/dCwc/3QtHP9zLR3/dC4d/3IrHP9uKBv/bica/28o - G/9vKBv/bygb/24oG/9uKBr/bSga/20nGv9sJxr/ayca/2snGv9qJxn/aycZ/2snGv9rKBr/bCga/2so - Gv9rKBr/aCYZ/2knGv9qJxr/aiga/2spG/9rKRv/bCoc/2wrHP9tLBz/biwc/20tHP9tLR3/bS0d/24u - Hv9uLh7/by8e/28vHv9vLx7/bzAf/28xH/9vMR//bzEf/28xH/9wMh//cDIf/3AyH/9wMh//cDIf/3Az - H/9vMx//bjQf/24zH/9vNB//cTQf/18rGf94cW3/qKen/6Genf+dm5r43Nzc+fX19f/x8fH/8fHx//X1 - 9f/Z2dn2c3NzHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuZmXqko6L/kIqJ/1slF/9kIxT/ZSQW/2knGP9qJxj/aScX/2gm - F/9sKBj/ci0a/3IsGv9yLRr/cy0b/3MtG/9zLRv/cywb/3MsG/9zLBv/cywa/3IrGv9yKxr/cisa/3Es - Gv9yKxr/cy0b/3MtG/9zLBv/cywb/3MsG/9zLRv/cy0b/3UtG/91LRv/dS0b/3YuG/92Lhz/dS4c/3cv - HP94MB3/eDAd/3gwHf93MB7/eDAe/3gwHv9zLBz/cCob/3ErG/9xKxv/cSsb/3AqG/9vKhv/bykb/24p - Gv9uKBr/bSga/2woGv9sKBr/bCka/2wpGv9tKRv/bSob/20qG/9rKBr/ayca/2woGv9sKRr/bCob/20r - G/9sLBz/bSwc/24tHP9vLR3/by0d/28tHf9vLh7/by8e/28wH/9vMB//cDEf/3ExH/9xMR//cDIf/3Ay - H/9wMh//cTMf/3EzH/9xMx//cTMf/3E0H/9xNB//cDUf/280H/9wNB//bzQf/3A1H/9xNR//ZSwY/2lc - V/+pqKj/oZ6e/5qZmfrS0tL39vb2//Ly8v/y8vL/9fX1/+rq6v+IiIg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJiVTaOg - oP+bm5z/YDEk/2YhE/9mJBb/ZiQW/2snF/9tKRj/aygX/2snF/9yLRr/dC4a/3QvG/91Lxv/dTAb/3Uw - G/91MBz/dS8c/3UvHP90Lhz/dC4b/3QuG/90Lhv/cy4b/3MtG/90Lhv/djAc/3YwHP92Lxz/di8c/3Yw - HP92MBz/djAc/3cwHP94MBz/eTAc/3gwHf93MB7/dzAe/3gxHv95Mh7/ejIe/3szH/98Mx//fTQf/301 - IP96Mh7/dC0c/3MsHP9zLBz/cywc/3IrG/9xLBv/cSsb/3AqGv9vKhr/byka/28pGv9vKhr/byoa/28q - G/9vKxv/cCwb/24qG/9rKBn/bCka/20qG/9tKhv/bisb/28sHP9vLRz/by0d/28uHf9wLx3/cC8d/3Ew - Hv9xMB//cTEf/3AyH/9xMh//cTMf/3IzH/9yMx//cjMf/3E0H/9yNR//cjUf/3I1H/9yNR//cjUf/3E1 - H/9wNh//cTYf/3A2H/9wNh//cDYf/3E2H/9sLxr/Y09F/6WmqP+hnp7/mJaW/cTExPb39/f/8vLy//Ly - 8v/09PT/8fHx/5iYmGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQiYknoJyb+KSlpv9oQzf/ZiES/2gmFv9nJhb/ZyUW/2so - F/9vKxj/bSkX/3ArGP93MBv/dzAb/3cxG/93MRz/dzEc/3cxHP94MRz/eDEc/3gwHP93MBz/dzAc/3cw - HP93MBz/dzAc/3YwHP93MBz/ejId/3oxHf96Mh3/ejId/3oyHf95Mh3/eTId/3ozHf97Mh3/ezMd/3o0 - H/96NB//ezUf/3s1H/97NR//fDYf/382IP+ANiD/gTcg/4M5Iv+CNyH/ezIe/3YvHP91Lhz/dC0c/3Qt - G/9zLBv/cisa/3EsGv9xKxr/cCsa/3ArGv9wKxr/cSsa/3ErG/9xLBv/cSwb/20oGf9uKRr/bioa/24q - G/9vKxv/bywb/3AsHP9xLR3/cS4d/3EvHf9xMB3/cTEd/3IxHv9zMh7/cjIe/3EzH/9yMx//czQg/3M0 - IP9zNCD/cjUf/3I1H/9zNSD/czYg/3Q2IP9zNiD/cTcg/3I3IP9yNyD/cjcg/3E3IP9yNyD/cjcg/3E0 - HP9aQTT/oKGj/6Ofnv+bmJj+uLe39Pb29//09PT/9PT0//T09P/39/f/pKSkiQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlm - Zgqgm5vdp6ip/3VaT/9mIRH/aycX/2onFv9pJxb/aSYW/20pF/9xLBn/cCsY/3YwG/97Mhz/ezIc/3s0 - Hf97Mx3/ezQd/3w0Hv97Mx3/ezMd/3szHf97Mx3/ezId/3syHf97Mh3/ejId/3oyHf97Mx3/fTYe/301 - Hv99NR7/fTUe/301Hv99NR7/fTYf/302H/9/OB//fTcg/384IP9/OCD/fzgg/4A5If+AOSH/gTgh/4M5 - If+DOiL/hDsi/4Y8I/+IPiP/hTsi/381IP96Mh3/eTAc/3YuG/91LRv/dC0a/3MsGv9yLBr/cisa/3Ir - Gv9yKxr/cisa/3IsGv9zLBv/byoZ/20pGf9vKhr/cCsa/3EsG/9wLBv/cC0b/3EuG/9yLxz/cy8c/3Mw - Hf9yMR3/czEd/3MyHv90Mh//czMf/3IzH/9zNCD/czQg/3Q1IP9zNiD/dDcg/3Q3IP90NyD/dDcg/3Q3 - IP9yNyH/czch/3M4IP9zOCD/cjgg/3I4IP9zOCD/dDce/1w4KP+Wlpj/pKGg/56bm/+urKz28vLy/vX1 - 9f/19fX/9fX1//r6+v+5ubmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+bm7ioqKn/gXFr/2YiEv9tKRf/bSgX/2wo - F/9sKBf/aycX/24qF/9yLRn/dC4a/300Hf99NR3/fTYe/302Hv9/Nx7/fzce/382Hv9/Nx7/fzYe/382 - Hv99Nh7/fTUe/301Hv99NR7/fTUe/3w1Hv9/Nx//gTkg/4A3H/+BNx//gTgg/4E4IP+BOCD/gTkg/4E6 - If+BOiH/gjsi/4I7Iv+CPCL/gzwi/4M8Iv+DPCL/hD0j/4U+I/+GPiP/hz4j/4g/I/+KQST/ikEk/4Y8 - Iv+CNh//gDUe/3syHf94MBv/di0a/3QtGv90LRr/dC0a/3QsGv90LRr/dC0a/3QtGv9zLBr/bigY/28q - Gf9wKxr/cSwa/3EsGv9yLRv/ci4c/3MvHP9yMBz/czEd/3QyHv90Mh7/dDIe/3QzHv91Mx//dTQf/3Q1 - IP90NSD/dDUg/3U2IP90NyD/dDcg/3U4IP91OCD/dDgg/3M4IP9zOCD/czkg/3M5IP9zOSD/czkg/3M5 - IP92OR//WjIf/4uKiv+mpKT/n52c/6Sjo/fr6+v89/f3//X19f/19fX/+/v7/8bGxs8AAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAnpqai6impv+Oh4T/ZikX/28qF/9uKhf/bioX/20pF/9tKRf/bCcX/28rGP91Lxr/fDQc/4M4 - Hv+BNx7/gTce/4E4H/+BOB//gTgf/4E5H/+BOB//gTgf/4E4H/+BNx//gTcf/4E4H/+ANx//gDge/4A3 - H/+DOiD/hDwh/4Q7IP+DOyD/hDsh/4Q7If+EPCH/gz4j/4Q/I/+FPyP/hkAj/4Y/I/+GQCT/h0Ek/4dB - JP+HQSX/iEIl/4lDJf+JQyX/ikIl/4xCJf+MQyb/j0Ul/4xAI/+FOiD/gzcf/4M2H/+ANR3/fDIc/3kw - G/92Lhr/di0Z/3YuGv92Lhr/di4a/3YuGv9wKhj/bykY/3AqGf9xKxn/cisa/3ItGv9zLhv/dC4c/3Qw - HP90MRz/dDId/3UyHf91Mh7/dDMe/3U0H/92NR//dTYf/3U3H/91NiD/dTcf/3U3IP91OCD/dTgg/3Y5 - IP91OSD/dDog/3Q6IP90OiD/dDog/3Q6IP90OiD/czog/3Q7IP9hMhv/fnp3/6impv+hnp3/npyc+OLi - 4vr5+fn/9vb2//b29v/7+/v/2NjY7F5eXhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdmJhepqSk/5qZmf9nMiD/cSsW/3As - F/9wLBf/bysX/28rF/9vKhf/bSkX/3IsGP96Mhv/hTsf/4U6H/+EOh//hDof/4Q7IP+EOyD/hDwg/4U7 - IP+FOyD/hTsg/4U7IP+FOyD/hDog/4Q6H/+EOiD/gzof/4Q5H/+HPyL/hz8h/4c/If+HPyH/hz8i/4hA - I/+HQST/h0Il/4hDJv+JQyb/iUMl/4lDJv+KRCb/i0Qm/4tEJv+LRSb/i0Um/4xGJ/+MRif/jkcn/49G - J/+QRyb/kkgm/5JHJv+KPiH/hDce/4Q4Hv+ENx7/gzce/4E1Hf99Mxz/ezEb/3kwGv94Lxr/eTAa/3Qr - Gf9vKRj/cCsY/3ArGP9xLBn/ciwa/3MtGv9zLhr/dC8b/3UwHP91Mhz/dDIc/3UyHf91Mx3/dTUe/3Y2 - Hv92Nh7/dTcf/3U3H/91OB//dTgg/3U4IP91OCD/djkg/3U6IP90OiD/dDog/3Q6IP91OyH/dTsh/3M7 - IP9yPCD/dD0h/2UyGf9yaGP/qaeo/6Genv+bmZj71dXV+Pr7+//29vb/9/f3//r6+v/l5eX9goKCLwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAJOTkzSioJ/9o6Wn/2tBMf9yKhT/ci0Y/3EsGP9xLBf/cCwX/3AsF/9wLBf/bysX/3Mt - GP+COB7/ikAh/4g9IP+HPiD/hz8h/4g/If+IPyL/iEAi/4g/Iv+IPyL/iD8i/4g/Iv+IPyH/hz8h/4c+ - If+HPiH/hz0h/4c9If+JQyT/iUMj/4lCI/+KQiP/i0Ik/4pEJf+KRSb/i0Yn/4tHKP+MRyf/jEcn/45I - J/+OSCf/jkgo/49JKP+PSij/kEoo/5BKKf+RSij/kUso/5JLKP+SSif/k0on/5VLJ/+RRiT/hzsf/4Q3 - Hf+EOB7/hDcd/4Q3Hv+DNx7/gjYd/4A1Hf99Mxz/eTAa/3ApF/9wKRf/cCsY/3EsGf9yLBn/cy0Z/3Mu - Gf90Lxv/dDAb/3UxG/91Mhz/dTIc/3YzHf92NB3/dTYe/3Y2Hv91Nx7/dTgf/3Y5H/92OR//djog/3Y6 - IP92OiD/djoh/3U7If91OyH/dTsh/3U7If90PCH/czwh/3M8If90PSH/bTYb/2hYT/+nqKn/oZ+f/5iX - lv3Kysr3/Pz8//f39//39/f/+vr6//Ly8v+Ojo5PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeXl5E6Ofnumqq63/dFVH/3Ip - FP90Lxn/dC4Y/3QuGP9zLRj/cy0Y/3ItGP9yLBf/cSsX/3gwGv+JQCH/jUMj/4tBIf+JQSH/ikIi/4pC - I/+KQiP/ikIj/4pCI/+KQiP/ikIj/4pCI/+KQiP/ikIj/4pCI/+KQSP/iUEi/4pCI/+MRyX/jEYl/4xG - Jf+ORiX/jEcm/45JJ/+PSij/jksq/49MKv+QTCn/kUsp/5FMKv+STCr/kk0q/5JNK/+STSv/k04r/5RO - K/+UTyr/k04q/5ROKf+UTCn/lE0n/5dOKP+XTCf/j0Eh/4c5Hv+GOR7/hTke/4U4Hv+FOB7/hTke/4U5 - Hv+EOR7/fDMc/3YuGf9zLBj/cisX/3EsF/9xLBn/cy4Z/3QvGf90MBr/dDEb/3YyG/91Mhz/djQd/3Y1 - Hf91NR3/djYe/3Y3Hv92OB//djkf/3Y5H/92OiD/djsg/3c7If92OyH/dTwh/3U8If92PSH/dT0h/3Q+ - If90PiH/dT8h/3Q+If9yORz/Y0w9/6Slpv+jn5//m5mY/ry7u/b7+/v/9/f3//n5+f/5+fn/+fn5/6am - pnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABo6Cfx6ytrv+Aa2P/cSoU/3cxGv93MBr/djEa/3UwGf91MBn/dC8Z/3Qu - GP9zLRj/ciwX/4E4Hf+PRST/kEYk/4xDI/+LQiP/jUMj/45EI/+ORCP/jEQj/45EI/+MRCP/jkQk/4xE - JP+MQyT/jEMj/4xDI/+MQyP/jEMj/4xEJP+QSif/kEkm/5FKJ/+QSyj/kEwp/5FOK/+RTyv/kVEs/5JR - Lf+UUCv/k08r/5RQLP+UUSz/lFEt/5RSLf+VUi3/llIt/5dSLf+WUiz/llEr/5ZQKv+WTyn/lk8o/5dP - KP+bUSj/lUkl/4s9H/+HOR3/iDoe/4c6Hv+GOR7/hjke/4U6Hv+EOR7/gTcd/4A3Hf99NRz/eTEb/3Uv - Gv9zLhn/cy4Z/3QvGf91MRr/djIb/3YyG/91Mxz/djQd/3Y1Hf92Nh3/dzcf/3Y4H/92OR//dzof/3Y7 - H/93PCD/dzwg/3c8IP91PSH/dj0h/3Y9If91PiH/dT8h/3U/If91PyH/dT8h/3U9H/9fQi//nJ2f/6Oh - oP+enJv/sbCw9vf39/76+vr/+fn5//n5+f/+/v7/srKynAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoJ+crKus/46C - fv9vLhf/eTIa/3gyGv93MRr/dzEa/3YxGv92MRn/djAZ/3UvGf90Lhj/djAZ/4tBIf+SSSX/k0kl/49G - JP+PRiT/kEcl/5BHJf+QRyX/kEcl/5BHJf+QRyX/kEcl/5BGJf+QRyX/j0Yl/5BGJf+PRiX/j0Uk/5BI - Jv+UTin/k00n/5JOKf+TTyv/k1Es/5RTLv+UVS//lVYw/5VWL/+WVC7/llQu/5dVL/+XVS//l1Uv/5dW - L/+ZVy//mVYv/5lWLv+aVS3/mVQs/5lSKv+ZUir/l1Ep/5hRKP+cUyn/m1Io/5JFI/+JOx7/iTwe/4k8 - Hv+IOx7/iDse/4g7Hv+DNx3/gjcd/4I4Hf+DOh7/gzof/4A5Hv97Nh7/dzIb/3UxGv90MRr/dTIb/3Yz - G/92NRz/djUd/3Y2Hf92Nx3/dzge/3Y5H/92OR//dzsf/3c8IP93PCD/dj0h/3Y9If93PSH/dz4h/3U/ - If91QCH/dkAh/3ZAIf91QCH/dkAg/187Jf+TkpP/paOj/5+dnf+mpaT38PDw/fv7+//6+vr/+vr6//// - ///Dw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCenm6rqKj/m5eW/3A2H/97Mxr/ejQb/3kzGv96Mxr/eTIa/3kx - Gv94MRn/dzAZ/3gwGf91LRj/gDcc/5NJJf+VSyb/lU0n/5JJJf+RSSX/kkol/5NKJv+TSib/kkom/5JK - Jv+SSib/kkom/5JKJv+SSib/kkom/5FJJv+RSSb/kUgl/5NNJ/+WUir/lFAq/5VSK/+WVC3/llcv/5dZ - Mf+XWjL/mFsz/5lbMv+ZWTD/mlkw/5pZMP+aWTD/mlow/5taMP+bWzD/m1ow/5xZL/+bWC3/mlYs/5pV - K/+aVCr/mlMp/5tSKP+cVCn/nlYq/5hOJv+MPyD/ijwe/4o9H/+KPR//ij4f/4c6Hv+EOB3/gzke/4Q6 - Hv+EOx7/hDwf/4Q9IP+EPSD/gjwg/3w6H/94Nh3/dzMb/3UzG/91NBz/djYd/3Y3Hf93OB7/djkf/3c6 - H/93Ox//dzwg/3c9IP93PSH/dz4h/3c+If93PyH/dkAh/3ZAIf92QCH/dkEh/3RCIf93QyH/Yjke/4aE - g/+opqb/oZ6e/6Cdnfjo6Oj7/v7+//r6+v/6+vr//////9XV1d9VVVUJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJycQ6mn - pv+kpaf/dEMu/340Gf98Nhv/fDUb/3w1G/98NBv/ezQa/3ozGv96Mhn/eTEZ/3gwGf93MBj/jEEh/5dN - J/+XTij/mlEq/5VMJ/+UTCf/lU0n/5ZNJ/+VTSf/lU0n/5VNJ/+VTSf/lEwn/5VNJ/+UTCf/lEwn/5RM - J/+UTCf/lEwn/5ZQKv+XVi3/l1Qs/5lXLf+ZWTD/mVwy/5peNP+bXzX/nGA3/5xgNv+cXjP/nV4z/5xe - M/+dXjP/nV4z/55eM/+eXjP/nV0x/55cMP+dWi7/nFks/5xYLP+cViv/nFUq/51TKf+cVCn/n1Yq/59W - Kv+TRyP/iz4f/4w9H/+MPyD/ij4f/4Y6Hf+GOh7/hTse/4U8Hv+GPR//hj0f/4U+IP+FPiD/hUAh/4RB - If+DPyH/fzwg/3k5Hv93Nh3/dTcc/3c4Hf92Oh3/djoe/3c7H/93PSD/eD4g/3c+IP92PyD/d0Ag/3dA - If92QCH/dkAh/3dBIv92QiL/dUIh/3dDIv9nORz/fXZw/6inqP+hn57/nJqZ+9za2vn/////+/v7//v7 - +///////4eHh9nh4eCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZkepqSj86ytsP95VEL/fjQX/4A5HP9/OBz/fzcb/303 - G/99Nhv/fDUb/3s0G/98Mxv/ezMb/3owGf+BNRz/l0wn/5pPKP+cUiv/nVMr/5hPKP+YTyn/mE8q/5hQ - Kf+YUCn/mlAq/5hQKf+YUCn/mE8p/5dPKf+XTyn/l08o/5dPKP+XTyj/lEwn/5ZRKv+bWy//m1ku/5tc - MP+cXzP/nWI2/55jN/+eZDj/nmU4/59lOP+eYzb/n2M2/59jNf+fYzX/n2I1/59iNf+fYTT/n2Ay/59f - MP+fXC//nlst/55bLP+eWSz/nlcr/51WKv+dVSn/n1cq/6NZK/+bUSf/kEIh/40+IP+PQCD/iT4f/4g8 - H/+IPR//hz0f/4c+H/+HPh//hz8g/4ZAIP+HQCD/hUEh/4ZBIf+HQyL/hkQj/4NDI/99PyH/eTsf/3Y6 - Hf92Oh3/dzse/3c9H/94PiD/dz4g/3c/IP94QCH/d0Ah/3dAIf93QSL/d0Ei/3ZDIv92QyL/d0Mi/206 - HP9wY1v/qair/6Ofn/+al5f9zc3N9//////7+/v/+/v7//7+/v/x8fH/ioqKPwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZm - ZgWlpKTVr7K0/4BoXP98Mxf/gjoc/4E5HP+BORz/gTkc/4A4HP+ANxz/gDYb/4A2G/+ANRv/fjQb/3wy - Gv+NQSH/nFIp/5tSKf+eViz/oFYs/5tRKf+bUir/m1Mr/5tTK/+bUyv/mlMq/5pTKv+aUyr/mlMq/5tT - K/+bUir/m1Iq/5pTKv+XUCn/lEsm/5pWLf+dXzH/nV4x/55hNP+fZTf/oGg5/6JoO/+iaTv/o2o8/6Nq - O/+jaDn/o2g5/6NoOf+jZzn/o2Y3/6JlNv+hZDX/oWIz/6FhMf+hXzD/oF4v/6BdLv+fWy3/n1ks/59Y - K/+fWCr/n1Yq/6NaK/+hWCv/lUok/5BBIP+NQSD/iT8g/4o/IP+KPyD/iD8g/4lAIP+JQCH/iEIh/4hC - If+IQiH/h0Mi/4dDIv+HQyL/iEUj/4hGI/+GRiT/gkQj/3xAIv94PSD/dzwf/3g9H/94PyD/dz8g/3hA - If94QCH/d0Ei/3dCIv93QyL/dkMi/3dDIv93QyL/cj4d/2tXSf+lpqj/o6Cf/5uZmf7Av7/2//////v7 - +//8/Pz//v7+//r6+v+ioqJjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKikoq2wsLH/jH54/3k1Gf+FPB7/hDse/4M6 - Hv+DOh7/gzkd/4Q3Hf+DNxz/gjYc/4I1HP+BNhz/gDUb/4I3Hf+aTij/nVUr/51VK/+jWi//oVku/5xU - K/+cViv/nFYs/5xWK/+cViv/nVYr/51WK/+cVSv/nFUr/5xVK/+cVSv/nFUr/5tTK/+XTyn/l04o/51b - MP+gZDT/n2M0/6JoOP+kazv/pWw9/6VtPv+lbj7/pnA//6ZuPv+lbDz/pWw8/6VsO/+lazr/pWs6/6Ro - N/+kZzb/pGU0/6RjM/+jYTH/o2Aw/6FeL/+hXC3/oFst/6BaLP+gWSv/oFkr/6NaK/+lXCz/nFIo/5JF - Iv+MQCD/jEEh/4xBIf+KQiH/ikIh/4tCIf+JQyH/iUMi/4pDIv+IRCL/iEUj/4hFI/+IRSP/iEUj/4hG - I/+IRyT/iEcl/4ZIJf+BRST/ekAh/3g/IP93QCD/eEEg/3hBIf93QiH/eEIi/3dDIv93QyL/d0Mi/3dD - Iv92Qh//Yko4/6Khpf+joKD/npub/7Oysvf8/Pz+/v7+//z8/P/8/Pz//////6urq4kAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAApaGjgLCur/+alJH/eDsg/4g9H/+FPR//hjwe/4Y7Hv+GOh7/hjoe/4Q5Hf+EOB3/hDgd/4M3 - HP+CNxz/gDYb/49DIv+gVyz/n1ks/6FZLv+nYjL/o14w/55YLP+fWi3/n1ot/59ZLf+fWi7/n1kt/59Z - Lf+fWS3/n1gt/59YLf+fWS7/nFUs/5lSKv+ZUir/mFEq/6BgMv+kaDf/pGk3/6VtO/+mcD7/p3E//6hy - QP+oc0H/qHRB/6hyP/+nbz3/p28+/6duPv+nbjz/pm07/6ZqOP+laDb/pWY0/6VlM/+lYzL/pGEw/6Nf - L/+jXi7/oV0t/6FcLf+gWy3/oVos/6NaK/+lXy3/oVss/5RKJf+MQCH/jUMi/4xDIv+MQyL/jUQj/4tE - I/+LRCP/i0Qj/4pFI/+JRiP/ikYj/4lGI/+KRyT/ikck/4hHJP+IRyT/iUgk/4lKJf+ISyb/hEkl/31F - I/95QSH/d0Eg/3dCIf94QiL/d0Mi/3dDIv94RCP/eEQj/3hEIf9jRCz/mZmb/6Wjo/+gnZ3/qain9/T0 - 9P3+/v7//Pz8//z8/P//////v7+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6BTr62s/6Wlpf95RCv/iT0e/4g/ - IP+JPiD/iD4g/4g9H/+HPR//hzwf/4Y8Hv+FOx7/hToe/4Q5Hv+EOB3/hTkd/5tSKP+hXC//oVsu/6Zh - Mv+raTf/pGAx/6BcLv+gXS//oF4v/6BdL/+gXS//oF0v/6BdL/+gXS//oFwv/6BdL/+dVy3/nFQs/5xU - LP+bVCv/m1Qr/6NjNf+mbDn/p247/6pzQP+rdEH/q3ZC/6t3Q/+rd0T/q3dE/6t2Qv+qc0D/qnNA/6hz - P/+ocj7/p287/6dsOf+majf/pmg1/6ZmNP+mZDL/pWIw/6RhMP+jXy//o14u/6NdLf+jXS3/o1wt/6Nc - LP+lXi3/pWEu/5xWK/+PRSP/jUQi/5BGJP+PRiT/jkYj/45GI/+ORiT/i0ck/4tHJP+LRyT/i0gk/4tI - Jf+LSCX/iUgl/4lIJf+KSSX/iEol/4hKJf+JSyb/ikwm/4dLJ/+BSCX/ekQi/3dDIv93QyL/d0Qj/3hE - I/94RCP/ekYj/2I+I/+PjI3/pqWk/6Gfnv+in6D56+vr+//////+/v7//v7+///////Nzc3QAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAJqamiurqan6rrCz/35UPv+JPRz/iUIh/4pBIf+KQCH/ikAh/4k/IP+IPiD/iD4g/4c9 - H/+HPR//hzwf/4c7Hv+GOR7/j0Mj/6NcL/+jXjH/pWAy/6lpN/+tbzz/o2Iy/6FfMP+jYDH/o2Ax/6Ng - Mf+jYDH/oWAw/6NgMf+hXzD/oWAx/55aLv+dWC3/nVgt/51XLP+dViz/nVUs/6VnN/+qcj3/q3Q//613 - Qv+seUT/rXlF/656Rv+uekb/rnpG/614Q/+sdkH/q3ZB/6t1Qf+qcz//qHE8/6huOv+oazj/p2o1/6do - NP+nZjL/pmQx/6ViMP+kYTD/pGAv/6RfLv+jXi3/o14t/6NeLf+kXi3/qWcz/6NhMv+TTCb/j0Yi/5BI - JP+PSCT/kEgk/49IJP+OSST/jkkl/45JJf+MSiX/jEol/4xKJf+LSiX/ikol/4tKJf+JSyb/iUsm/4lL - Jv+JSyb/iUwm/4pNJv+ITSf/g0sm/3tGJP93QyP/d0Qj/3lFJP96RyT/aT0g/4N9e/+pp6f/o5+f/52a - mvvf3975//////7+/v/+/v7//////97e3u1jY2MSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdnZ2DaqqquGztbj/hGhX/4c8 - HP+KQiL/i0Ii/4xCIv+LQSH/i0Eh/4pBIf+KQCH/ikAg/4o/IP+KPyD/ij4g/4k9H/+JPB//nFMr/6Vh - M/+lYTP/qWc3/65yPv+udD7/pGIz/6RhMv+kYjP/pGIz/6RiM/+lYjP/pGIz/6RiM/+kYjP/nlwv/55b - Lv+eWy7/nlou/55aLv+eWC7/nlgu/6ZqOv+sdkD/rXhC/697Rf+wfEb/r31H/699SP+vfUj/r31I/656 - Rf+ueEP/rnhC/6x2Qf+rdUD/qnI9/6lvOv+obTj/qGs2/6hpNf+nZzP/p2Uy/6ZkMf+lYjD/pWEw/6Rg - L/+kYC7/pF8t/6RfLf+lYi//qWg0/6dnNP+aViz/kEck/5BJJP+RSiX/kEol/49KJf+QSyX/j0sm/49M - Jv+PTCb/j0wm/41MJv+NTCb/jUwm/4tMJv+KTCb/ikwm/4pMJv+ITSb/iE0m/4hOJv+KTyb/iU8n/4VN - J/99RyX/eEUk/3hGJP9sPR7/eW9m/6moqf+joKD/m5iX/dHR0fj//////v7+//7+/v//////6+vr/YKC - gi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAq6qqvba2uP+OfXP/hT0d/4xEI/+MQyP/jUQj/41DIv+NQiL/jEEi/4xB - If+LQSH/ikAh/4tAIf+LPyH/iz8g/4k8H/+TRiX/pV0x/6VkNf+oaDf/rHA9/7B8Rf+udkD/pGMz/6Vk - NP+lZDT/pWM0/6ZkNf+lYzT/pWM0/6RjNP+gXTH/n1ww/59cL/+fXC//n1wv/59cL/+eWy7/nlou/6ds - Ov+ueUP/sHtG/7J+R/+wgEj/sIBJ/7KASv+wfkn/sH5J/697Rv+ueUT/rnhD/6x3Qf+sdT//q3E9/6lv - Ov+objn/qGs2/6hpNf+nZzT/p2Uy/6ZkMf+mYzH/pWIw/6RhMP+kYDD/o18u/6NfLv+nZTL/qWc0/6hq - Nv+eXjH/kkwn/5FJJf+QSyb/kUwm/5FMJv+QTCb/kE0m/5BNJv+PTSb/jk0m/45NJv+OTSb/i00m/4tN - Jv+LTSb/i00m/4lOJv+JTib/iU4m/4lOJv+JTib/i08n/4pPJ/+FTif/f0om/3JBHv9vYFP/qKir/6Og - oP+cmpr+wsHB9//////////////////////6+vr/lJSUTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsp6eRtrW2/5eR - jf+BQCH/kEYj/45FI/+ORSP/j0Uj/49DI/+NQyP/jUIj/4xBI/+LQSP/i0Ei/4xAIv+MPyH/iz8h/4w/ - If+eUy3/pmQ1/6hpOP+sbzz/r3pE/7WESv+tcz7/pWM1/6ZmNv+lZjb/pmY2/6ZlNv+mZTX/pWQ1/6Be - Mf+gXjH/oF0x/59dMf+gXTD/oF0w/6BdMP+fXC//n1sv/6luPP+vfEX/sH5H/7KBSf+zgUv/s4FL/7KA - Sv+ygEr/soBJ/698Rv+ueUT/rnhC/613Qf+sdT//q3E8/6lvO/+obTj/qGs2/6dpNf+nZzT/p2U0/6Zk - M/+mZDL/pWIy/6RhMf+jYDD/o18w/6ViMf+mZjT/pmY0/6hpNv+kZTX/llMr/5BKJv+STCf/kk0n/5FO - J/+RTif/kE4n/49OJ/+PTif/j04n/45OJ/+NTif/jU4n/41OJ/+LTSf/ik4n/4lOJ/+JTif/ik8n/4pP - Jv+JTif/iU8n/4pPJ/+KUCj/hEsj/25VQv+kpaf/pKGg/56cnP+2tbT3/////v////////////////7+ - /v+pqal2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqqmO1s7P/pKSk/35GKv+RRiP/j0Yk/49GJf+PRST/kEUk/5BE - JP+PRCT/j0Mk/41DJP+NQiP/jEIj/41CI/+NQSP/jEAi/5ZKKP+kXjP/qWo5/6xuPP+wekT/tINL/7aG - Tf+rbTv/pmU2/6ZnN/+mZzf/pmc3/6ZnN/+lZTb/oV8y/6FgMv+hXzL/oV4y/6FfMv+gXjH/oF4x/6Be - Mf+fXTD/oF0w/6pwPv+wfkf/soFJ/7OCS/+0g0z/tINM/7OBS/+zgUv/soBK/698R/+uekT/rnlC/6x3 - Qf+sdD//q3E8/6lvO/+obTj/qGs3/6dpNv+nZzX/pmY0/6ZlNP+mZDP/pWMy/6RiMf+jYTD/o2Ew/6Zl - NP+mZjT/pmY0/6doNf+laDb/m1ow/5JNKP+STif/kk8o/5JPKP+RTyj/kE8o/5BPKP+QTyj/jk8o/45P - KP+OTyj/jk8o/41PKP+LTyj/ik8n/4pPJ/+KTyf/ik8n/4pPJ/+KTyf/iU8n/4lPJ/+NTyX/cU81/52e - of+lo6P/oJ6e/6uqqvj4+Pj9/////////////////////7m5uZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqObSx - sv+vsrT/flI6/5FEIv+QRyb/kEcm/49HJf+QRyb/kUcm/5BGJv+QRSX/kEUl/5BFJf+PRCX/j0Ql/5BD - JP+QQiT/kkYm/51VLv+nZzj/rHA+/694Q/+1g0v/t4hQ/7eGTf+najr/p2g5/6dpOf+naTn/p2k5/6Vm - OP+jYjX/o2M1/6FhNf+hYTT/oWA0/6FgM/+hYDP/oV8y/6FfMv+gXjH/oV4y/6txP/+ygUn/s4NK/7SE - Tf+1hU7/tIRN/7ODTP+zgkz/s4FK/698Rv+uekT/rXhC/6x2QP+sdD7/qnI8/6lxO/+obTn/p2s3/6dp - N/+naDb/p2Y1/6ZlNP+mZTT/pWMy/6RiMf+kYTD/pGQz/6VmNf+lZzX/pWc1/6VnNf+maTf/n2I0/5RS - K/+STij/klAp/5FQKf+SUCn/kVAp/49QKf+PUCn/j1Ap/49QKf+OUCj/jVEo/4tRKP+LUCj/i1Ao/4tQ - KP+LUCj/i1Ao/4pQKP+JUCj/ilAo/45QJ/9zSSv/lpWV/6akpP+jn5//o6Ki+e7u7vv///////////// - ////////xsbGwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJAXsK2s7Le6vP+DY1D/jEMh/5FJJ/+RSSf/kUkn/5FJ - J/+SSSf/k0gn/5JHJ/+SRyf/kUYn/5FGJv+RRib/kEUm/5FEJf+RRib/mk8r/6NfNP+scD//r3hE/7WC - Sv+5iFD/vI5V/7WCSf+najn/qGw7/6hrOv+obDv/pmc5/6NjN/+kZDf/o2M2/6NjNv+jYjb/oWI1/6Fh - Nf+hYDX/oWA0/6FgNP+hXzP/oWAz/6x0Qf+zg0r/tIRN/7WFTv+2hk//tYVO/7SDTf+0g03/s4JK/7B9 - Rv+vekP/rnlC/613Qf+sdD//q3E9/6lvO/+obTn/p2s3/6dqN/+maDb/pmc1/6ZmNP+lZTP/pGQz/6Ni - Mv+jYzP/pWc2/6VnNv+lZzb/pWc2/6VnNv+kaDb/omY2/5dYLv+RUCn/klEq/5JRKv+RUir/kVIq/5BR - Kv+QUSr/j1Eq/45RKv+NUSr/jVEq/41RKf+NUCr/jVAp/4tQKP+LUCj/ilAp/4tQKP+KUCj/jlEo/3dH - Jf+Lh4b/qKan/6ShoP+dm5z74eHh+v/////////////////////Y2NjgVVVVCQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAK0r6/Mu7y+/414bP+JQyH/kUoo/5JKKP+TSij/kkso/5JKKP+TSij/lEko/5NJKP+TSCj/kkco/5JH - KP+RRyf/kUcn/5FGJ/+YTiv/nlYw/6lsPf+vekX/tH9K/7mIUf+8jVT/wJNZ/695RP+mazr/qG08/6hu - Pf+lZzr/pGQ4/6RlOf+kZDj/pGQ4/6RkOP+kZDf/o2M3/6NiNv+jYjb/oWI2/6FhNf+hYTT/oWE1/6x1 - Qv+0hUz/tYVO/7eIUP+3h1D/toVP/7WETv+0hE3/s4JK/7B9Rv+ue0P/rXlC/613Qf+sdT//rHM9/6px - PP+objn/p2w4/6dqN/+naDb/pmc2/6ZmNf+lZTT/pGQ0/6RjM/+kZTb/pGc3/6RnNv+kaDb/pGg2/6Ro - Nv+kaDb/o2g3/5teMv+TUiv/k1Iq/5JTLP+SUiv/kVIr/5BTK/+PUyv/j1Ir/49SK/+PUSv/jlIr/45R - K/+NUSv/jVEr/41RK/+NUSv/i1Eq/41RKf+OUin/f0gj/4Z7df+pqKn/pKGi/5yamP3T09P4//////// - /////////////+Tk5PZ4eHggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCsrKK8vL3/mY6I/4ZEJP+TSyj/kksp/5NL - Kf+USyn/k0sp/5NLKv+USyr/lUoq/5RKKv+USir/lEoq/5NJKf+TSSn/kkgo/5dOK/+cUy3/pWM4/694 - RP+0f0v/uYlR/7yOV//Ak1r/wJNZ/6txQP+obj3/qnA//6VoO/+lZzr/pWc6/6VmOv+lZjn/pGU5/6Rl - Of+kZTn/pGU5/6NkOP+hYzf/oWM3/6NiNv+hYjX/oWE1/612Q/+1hk7/tohQ/7eLUf+3iFD/t4ZQ/7aE - T/+1hE3/s4FJ/698Rv+vekP/rnlC/613Qf+tdT//q3M9/6pxPP+obTv/p2w5/6drOP+maTf/pmg3/6Vn - Nv+kZjX/o2U0/6NlNP+kaDj/pGg4/6RoN/+kaDf/pGg3/6NoN/+kaDb/o2k3/51kNf+UVi7/klIs/5NU - Lf+SUyz/kVMs/5BTLP+QUyz/kFMs/5BTLP+PUyv/jlIr/45SK/+OUiv/jlIr/41RK/+OUiv/jlIr/45S - K/+FSiP/emtg/6mprP+koaL/nZua/sXFxPf/////////////////////9fX1/4qKij8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAArqurdLu6uv+mo6H/hEks/5RMKf+STSv/kkwq/5RNKv+UTSv/lEwr/5VMK/+WTCv/l0wr/5ZM - K/+WSyv/lksr/5VLK/+VSir/l04r/51WL/+gWzP/rXJC/7N+Sv+3h1H/vI9X/76SW//DmmD/uopT/6hu - Pv+qcEH/pWk9/6VpPP+laTz/pGg7/6RoO/+lZzr/pWc6/6RmOf+kZjn/pGY5/6RlOf+jZDj/o2Q4/6Nk - OP+hYzb/oWM2/613RP+3iFD/t4tR/7mMUv+3i1H/t4hQ/7aGT/+0hEz/sIBI/698Rf+ve0T/rnpD/614 - Qf+tdT//q3M9/6pwPP+obTv/p2w6/6drOf+majj/pmk3/6VnNv+kZzb/pGY1/6RpOP+lajr/pWo5/6Rp - OP+kaTj/o2g3/6RpOP+jaDf/pGk4/59nOP+WWzL/klQt/5JVLv+SVS3/klQt/5JVLv+RVC3/kFQt/5BU - Lf+PUyz/j1Ms/5BULP+QUyz/j1Ms/49TLP+PUyv/j1Ms/4tOJv95YlD/pqeq/6Shov+gnZ3/uLa29/// - //7////////////////8/Pz/oqKiYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACuqqpIuri3/7CztP+DVDn/lEwo/5RO - K/+TTiv/lE4r/5ZOK/+WTSz/lk0s/5ZNLP+XTi3/mE4t/5dNLP+XTSz/l00s/5dNLP+XTiz/n1Yx/6BY - M/+naD3/snxI/7eGUP+8jlf/vpVb/8GXXv/EnGL/s31J/6twQP+naz7/pmo9/6ZqPf+maj3/pWo9/6Vq - PP+laTz/pWg7/6VoO/+kaDv/pGg7/6RnOv+jZjn/o2Y5/6NlOP+jZTj/oWM3/613RP+3i1H/uo1T/7qN - U/+3i1H/t4hQ/7aGTv+zgkr/r3xH/698Rf+wfEX/r3pD/654Qv+tdT//q3M9/6pwPP+pbjv/qG07/6ds - Ov+nazn/pmo4/6RoN/+kZzb/pGg2/6VqO/+lajr/pGo6/6RpOf+kaTn/pGk5/6NpOP+jaTj/omk4/6Bp - Of+ZYDX/k1Yu/5NVLv+TVi7/klYu/5FWLv+RVS7/kVUu/5FVLv+RVC3/kVUu/5BULf+QVC3/j1Qt/49V - Lf+OVS3/j1Ip/3JVP/+io6b/paOi/6Gfn/+sq6r4+fn5/f////////////////////+vr6+JAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKigoCO3tLT1ury//4NiTP+STCf/lE8r/5VPLP+VTy3/lU8t/5dPLv+XTy7/l1Au/5dQ - Lv+ZUC7/mlAu/5pQLv+ZTy7/mE8u/5hOLv+eVjL/oFs0/6ViOf+tdET/toVP/7yNV/++k1z/wZde/8Sc - Y//Bll3/q3ND/6dtP/+obT//qG0//6dtP/+nbD//pmw+/6ZrPf+maj3/pmo9/6ZpPP+laTz/pGk8/6Ro - O/+kZzr/pGc6/6RnOf+jZjn/oWQ4/6x2RP+5jFL/u45U/7qNVP+5jFL/t4hQ/7WETP+wgEj/rntG/698 - Rv+wfEX/sHtE/655Qv+tdj//q3M+/6pwPf+pbzv/qW47/6htO/+nazn/pmo4/6VpOP+kaDb/pWs6/6Vr - PP+kajz/pGo7/6RqO/+jaTr/omk5/6JpOf+iaTj/omk4/6JqOf+cZDf/lFkx/5NXL/+TVy//k1cv/5NX - L/+TVy//klcu/5FWLv+QVy7/kFcu/49XLv+PVi7/j1Yu/49WLv+RViz/eFM1/5qbnf+npaX/o6Cg/6Sj - o/nv7+/8/////////////////////7+/v7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUlJB7ezs9nBwsT/i3Nl/49J - Jv+UUS7/lVEu/5ZRLv+WUS7/llIu/5dRL/+ZUS//mlEw/5lRL/+aUTD/mlEw/5tQMP+bUDD/m1Av/55W - Mv+hXTX/pmM6/6lqQP+0gU3/vI1W/8CTXP/Bll7/wplg/8agZP+1hFD/p20//6hvQf+obkL/qG5B/6ht - QP+nbED/p21A/6dsP/+nbD//p2s+/6ZqPf+maz3/pWo9/6VqPf+laTz/pWg8/6VoO/+kZzr/o2U4/6x1 - RP+6jlP/u5BW/7qOVP+5jFP/t4hQ/7ODS/+wfUf/rnpF/698Rf+wfUb/sHtD/655Qv+tdkD/rHQ//6py - Pf+qcDz/qW47/6htO/+nbDr/pms6/6VqOf+lazn/pW09/6VtPf+kbDz/pGs8/6NrPP+iajv/omo6/6Jq - Ov+iajn/omk5/6BqOf+dZzn/ll0z/5RXMP+UWDD/lFkw/5JZMP+SWTD/kVgv/5FYL/+RWC//kVgv/5FY - L/+RVy7/kFcu/5NYL/96Ti3/k5GP/6impv+lo6L/oZ2d++Li4vr/////////////////////0NDQ0AAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAtrOzssLCxP+XioH/iUgn/5VSLv+UUi//llIv/5dSMP+XUzD/mVMw/5pS - Mf+bUjH/m1Mx/5tTMf+bUzH/nFMx/51SMf+cUTH/nlYz/6NeN/+mZTz/p2g+/652SP+7ilX/vpNc/8KX - YP/DmWH/xJ5j/8OaYv+rdUb/qG9D/6pvQ/+ocEP/qm9C/6puQv+nbkL/p21C/6dtQf+nbUD/p2w//6ds - P/+mbD//pmw+/6ZrPv+maj3/pmo9/6ZqPf+laTz/pGY6/6x0Q/+7j1X/vJFY/7uPVf+5ilL/toZO/7KC - Sv+vfEf/rXlE/698Rv+wfUb/sHtD/655Qv+tdkH/rXQ//6tzPv+qcj3/qW88/6luO/+obTv/p2w6/6Vq - Of+lbj3/pnA//6VuPv+kbT3/pG09/6NsPP+iazv/oms7/6JrO/+gajr/oGo6/59qOf+eaTr/mGA2/5Va - Mf+TWzL/k1oy/5NaMf+TWjH/k1ox/5NZMP+SWTD/kVkw/5FZMP+RWTD/klow/4JQK/+LhH//qaip/6Wj - o/+cm5r909PT+f/////////////////////g4ODtY2NjEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2srKFwsHB/6Wf - nP+FTC3/l1Mv/5ZTMP+WUzH/mVMx/5lUMf+ZVDH/mVQx/5tUMv+cUzL/nFMy/5xTM/+cVTP/nFUz/5xT - M/+eWDX/pF85/6dmPf+oa0H/qm5D/7aEUv++klz/wZdf/8OZYf/Em2P/x6Fn/7mKV/+ob0P/q3FF/6tx - RP+rcUT/q3BD/6tvQ/+qb0P/qG9D/6hvQv+obkL/qG5B/6dtQP+nbUD/pm1A/6ZsP/+naz7/pms+/6Zr - Pf+maz3/pWc7/6xzQ/+8kFf/vZJZ/7uOVf+3iFD/tIRM/7KASP+vfEf/rXhE/698Rf+yfkb/sHtD/654 - Qv+tdkH/rXVA/6x0P/+rcz7/qnI9/6hvPP+nbTz/pmw6/6ZtO/+ncUD/pXBA/6VuP/+kbj7/o2w+/6Jt - Pf+iaz3/oms8/6BrPP+gazv/n2o6/59qOv+eazv/mWM4/5VcMv+VWzL/lVwy/5NcMv+TWzL/k1sy/5Jb - Mv+RWzH/kVox/5JbMv+TWzL/h1Iq/4R3bf+rq6v/paOj/56cm/7GxsX4/////////////////////+3t - 7f2FhYUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALSxsVjBvr7/s7Oz/4RTN/+ZUy//l1Qx/5dVMf+XVTH/mlUy/5pV - Mv+aVjP/nFc0/5xXNP+dVjT/nlU1/55WNf+eVjX/nlY1/59YNv+kYTv/qGc+/6ttQv+rb0T/sHlM/72Q - W//Bl1//w5lg/8ScZP/Gn2b/w5pi/696S/+qc0X/q3VG/6t0Rv+rdEb/q3NE/6pzRP+qcUT/qnFD/6hy - Q/+ocEP/qm9C/6hvQv+nbUH/p21B/6dtQP+nbUD/p2w//6dsPv+mbD7/pWg8/6txQ/+8j1f/vpVa/7qN - U/+3h0//tINL/7CASP+ve0b/rXhE/696RP+wfUX/sHpE/694Qv+td0H/rXVA/6x0P/+rcz7/q3E+/6hx - Pf+nbjz/pm07/6dxP/+mckL/pnFB/6VwQP+kbj//o28//6NtPv+ibT3/om09/6BrPf+gazz/n2o8/55p - O/+eaTv/m2Y6/5ZeNf+UXDP/lFw0/5RcNP+UXDT/lFw0/5NbM/+TXDP/k1wz/5NcM/+PViz/f2xc/6qp - rf+lo6P/oJ6e/7m4uPj/////////////////////+vr6/5mZmVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqKioL7u6 - uvy9wML/hmFJ/5ZRLf+XVTH/mVUy/5lWM/+aVzT/mlc0/5xXNf+cVzX/nFg1/51YNf+eVzX/n1c1/6BX - Nv+gWDb/oFg3/6ViPP+paUH/q25D/6xyRv+udkn/uYdW/8GYYP/CmWH/xpxl/8afZ//EnGP/vI9a/6t1 - R/+rd0j/q3ZI/6t2R/+rdkf/q3VG/6t0Rf+qdEX/qnRF/6pzRP+qcUP/qnFD/6pwQ/+ob0P/qG5C/6hu - Qf+obkH/qG1A/6dsP/+nbD//pmo9/6pwQv+7jlb/vpVa/7mKUv+2hk7/s4JK/7B+SP+ve0b/rXhD/655 - Q/+wfEb/sHtF/695Q/+td0H/rXZB/611QP+tdED/q3M//6pwPv+obzz/p28+/6hzQv+nckL/pnFC/6Zx - Qf+lcEH/o28//6JvP/+ibj7/om4+/6BuPv+gbT3/n2s9/55rPP+eazz/m2g7/5ZgN/+VXTX/lV41/5Ve - Nf+VXTX/lF01/5NeNf+TXjX/k141/5JbMP97Ykz/paap/6Wko/+hoKD/rays+Pn5+f3///////////// - ///+/v7/qampdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48QvLq65cTHyf+OcmH/k08r/5dWM/+ZVzT/mlc0/5pX - NP+aWDX/m1g1/51ZNf+dWjb/nlo2/55bNv+fWzf/n1s3/6BaOP+hWjj/pmM9/6lqQv+scUb/rXRI/693 - Sv+zflD/vpNe/8KZYf/GnWf/xp9o/8OaYv/CmWD/s39Q/612Sf+teEn/rXhJ/6x3SP+sdkj/rHZH/6x1 - Rv+rdUb/q3VG/6t0Rf+qc0T/q3RE/6pzQ/+ockP/qHJD/6hwQ/+ocEL/qm5B/6puQf+qbkH/p2s+/6pv - QP+5jFT/vpNZ/7mJUf+1hU3/s4JK/7B9R/+ve0b/rXdD/653Q/+wfEb/snxG/7B5Q/+ueEL/rXdB/652 - Qf+tdUH/rHNA/6twP/+ocT3/qnNB/6p0RP+oc0P/p3ND/6VyQv+lckL/pHFB/6NwQP+jcED/om8//6Bv - P/+gbj7/n209/55sPP+ebDz/nGs8/5hiOf+WXjX/lWA2/5VgNv+VYDb/lGA2/5VgNf+VYDb/mF8z/31c - Qf+fn6L/p6Wl/6Shov+lo6P67+/v/P/////+/v7//v7+//////+0tLSdAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAC7ubnCyMjK/5eHfP+QTiz/mlc0/5lXNP+aWDX/m1k1/5xaNv+cWjb/nVs3/55bOP+fWzj/oFw5/6Bc - Of+hXTr/oV06/6FdOv+mZD7/qWtD/61ySf+udUr/sHhL/7N+T/+6ilj/wpli/8agaP/Gn2j/wppi/8GY - X/+9kFv/rnlK/695Sv+ueUr/rnlK/654Sv+td0n/rXdI/613SP+td0j/rHZH/6x1Rv+sdUX/rHVF/6t0 - RP+qc0T/qnND/6pzQ/+qcUP/qnBC/6hwQ/+ocUH/qG5A/6puQf+2h1H/vZFY/7mIUP+1hEz/s4JK/7B9 - R/+ve0b/rndD/612Qv+ve0X/snxG/7B6RP+ueEL/rnhC/613Qf+sdUH/q3RB/6pzQP+oc0D/q3ZE/6t1 - RP+odEP/pnND/6ZzQ/+mc0L/pXJC/6RxQf+jckD/onFA/6JxQf+gb0D/oG8//59uPv+ebT3/nWw+/5lm - O/+WYTf/lmE3/5hiOP+WYTf/lWE3/5ViOP+YYjb/f1k5/5qZmf+npqb/paOj/6KeoPvk4+P7//////7+ - /v/+/v7//////8XFxcEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALu4uJfJyMn/pJ2Y/4pPL/+bWDX/mlk1/5pa - Nv+bWjb/nVs3/51bOP+dXDn/nVw5/59dOf+gXTr/oV46/6FeOv+jXzv/o186/6ZkP/+rbEX/rnNK/7B2 - TP+yek3/tH9R/7eGVf/Ak2D/xp9o/8agaf/DnGT/wZhf/8KYX/+1hFL/r3pL/7B7TP+vekv/r3pK/695 - Sv+veUr/rnhJ/654Sf+ueEj/rXdI/612R/+tdkb/rXZG/6x1Rf+sdUX/rHVF/6t0RP+rc0T/q3NE/6px - Q/+qc0P/qnBB/6hvQf+0g0//vI9W/7eIT/+1hEz/s4JK/7B9SP+ve0b/rnhE/611Qv+ueUT/sn1H/7B7 - Rf+veUP/rnhC/613Qv+sdUL/rHVB/6t0QP+rdkP/q3dG/6p2Rf+odUT/qHVE/6d0Q/+mc0P/pXND/6Rz - Qv+kc0L/o3JC/6NxQv+icUL/onBB/6BvQP+fbkD/nm5A/5tqPf+YYzn/mGI4/5ZjOf+WYzn/lmM5/5pl - Of+GWzX/kI6K/6moqf+mpKT/nZub/NPT0/n//////v7+//7+/v//////19fX4FVVVQkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAu7u7acfFxf+ysLD/hVU3/5taNf+aWjb/m1o3/5xbOP+cWzn/nVw5/55dOf+fXTr/n146/6Be - O/+hXzv/o2A8/6NgPP+kYDz/p2VA/6ttRv+udUz/sHdN/7N7T/+1f1L/t4ZW/7uLWv/AlGL/xp9o/8Se - Z//CmWH/wZdf/72RW/+ye03/s3tN/7J7Tf+we0z/sHtL/7J6S/+wekv/r3lK/695Sf+veUn/r3hJ/694 - SP+ud0f/rXZG/612Rv+tdkb/rXZG/611Rf+sdET/rHRE/6x0RP+rc0P/q3ND/6hvQv+yfkz/u45T/7eH - T/+1hEz/s4FK/7J+SP+ve0b/rnhE/6x1Qv+td0T/snxG/7J8Rv+wekX/r3lD/653Q/+ud0P/rHVC/6x1 - Qf+seEb/q3dH/6t3Rv+rd0b/qHVE/6h1RP+ndUT/pnVD/6V0Q/+lc0P/pXND/6RyQ/+kckP/onFC/6Bw - Qv+gb0H/n29B/5xsQP+YZTr/mGQ6/5hkOv+ZZTr/mmY6/4xdM/+MhHz/qamr/6akpP+enJz+x8bG+P// - ///+/v7//v7+///////j4+P2eHh4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbU+xcTD/76/wv+FX0b/mlkz/5pb - N/+bXDn/nFw5/51cOf+eXTr/n147/59eO/+gXzv/oV88/6FgPf+jYT7/o2E+/6RhPv+mZkH/rG5H/693 - Tf+yeU//tH1R/7aCVP+5h1f/uolZ/7mIWP/DmmX/xp1o/8OaZP/Bl1//wpdg/7aFVP+zfE3/sn1O/7J9 - Tv+wfE3/sHtM/7B7S/+we0v/r3pK/696Sv+vekr/r3lK/695Sf+veEj/rndH/653R/+ud0f/rnZG/651 - Rf+tdUX/rXVF/611Rf+tdUX/rHRE/6pwQv+wekn/uopS/7eIT/+1g0z/s4FK/7J9R/+wfEb/rnlE/612 - RP+tdUP/sHtG/7J9R/+we0X/sHlE/694RP+ud0P/rXZC/614RP+teUj/rHhH/6x4R/+rd0b/qndF/6h3 - Rf+od0X/p3ZE/6Z1RP+mdUT/pnRF/6VzRP+jc0T/onJD/6JyQ/+gcUL/n3FC/51vQf+aaT3/mWU7/5lm - O/+aZzz/k2A2/4R2av+rq6z/pqSk/6Gfn/+6ubn4//////7+/v/+/v7///////T09P+Kioo/AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKqqqhvBv7/wyMnM/4ttW/+XVzL/ml05/5pdOf+cXTr/nl46/55eO/+fXzz/n2A9/6Bg - Pf+iYT7/o2E//6NiP/+kYz//pWI//6dnQ/+sb0n/sHhO/7J7UP+0flH/toNV/7qIV/+6iFn/toRV/7yO - Xf/Em2b/xJxn/8KYYv/ClWD/vZBd/7J+T/+zfk//sn5P/7J9T/+yfU3/sn1N/7J9Tf+wfEz/r3tL/697 - S/+vekr/r3pK/695Sf+ueUn/rnlJ/694SP+veEj/rndH/653R/+vd0b/r3dG/652Rf+tdUX/rXVF/6tx - Q/+veUj/t4dQ/7eHUP+1g0z/soBJ/7J+SP+wfEf/r3lG/653Rf+sdUP/r3lF/7J9R/+yfEf/sHpG/7B5 - Rf+ueUT/rnhD/656R/+uekn/rXlI/615SP+seEf/q3lH/6p4Rv+od0X/qHdG/6h2Rv+odUb/pnVG/6V1 - Rv+kdEX/pHNF/6NzRP+ickP/onJD/59xQ/+baz//mmc9/5toPv+ZZDn/hW9b/6eoqv+mpKT/pKGi/66t - rfj39/f+/v7+//z8/P/+/v7/+vr6/6Ojo2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVA8DAwNDNztD/lYJ1/5JU - Mf+bXTr/nF46/5xeO/+cXzz/nl89/6BgPf+gYT7/omE//6NiP/+jYj//pGRA/6RkQf+lZEH/p2hE/6xw - Sv+veVD/s3xS/7R/Uv+2hFX/u4lZ/7qHWf+3hlb/t4dY/76SYf/Em2b/xJpm/8KVYv/ClWH/toVV/7N/ - UP+0f1D/tIBR/7N/UP+zfk7/s35O/7N9Tv+yfU3/sH1M/7B8S/+we0v/sHtL/696Sv+vekr/r3pK/696 - Sf+veUn/r3hI/654SP+veEf/r3hH/693Rv+udkb/rnZG/610Rf+udkb/toRP/7eHUP+1g0z/s4FK/7N+ - SP+wfEf/r3lG/653Rf+tdUP/rnVD/7B8R/+yfUf/sHxH/697Rv+vekX/rnpG/7B8S/+ve0r/rntK/617 - Sf+se0j/q3lH/6t5R/+qeEf/qnhI/6p3SP+nd0j/pndH/6Z2R/+ldUb/pXVG/6V1Rv+kdEX/pHRE/6Jz - RP+dbUH/nGk//51pPP+CZ07/o6Sm/6alpP+lo6P/pqWk+u7u7vz//////Pz8//z8/P//////q6uriQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAwr+/p87Oz/+kmZL/jVMy/5teOv+bXjv/nF48/55fPf+eYT7/n2E+/6Bh - Pv+iYj//pGRA/6RkQf+lZUP/pmZC/6ZmQ/+naUX/rHFL/7B6UP+zfVL/tIBU/7eEVv+7iVv/uYZY/7mG - V/+3h1j/uYha/8KXZP/Gm2b/w5lk/8OXYv+9j1z/tIBS/7WCUv+1gFH/tIBR/7V/UP+1gFD/tH5P/7N+ - T/+zfk3/sn5N/7N9Tf+zfEz/snxM/7B7S/+we0v/sHtL/7B7S/+wekr/r3lJ/695SP+veUj/r3lI/654 - SP+ud0f/r3dH/651Rv+udkb/tYJN/7mHUP+1g0z/tIFK/7N+SP+yfEj/sHpH/694Rv+udkT/rXRD/694 - Rf+zfkj/sn1H/7B8R/+ve0b/sH1J/7J+TP+wfUv/rnxL/658Sv+te0n/rXtJ/6x6Sf+seUn/q3lK/6h4 - Sf+oeEn/qHhJ/6d3SP+nd0j/p3ZI/6Z2R/+mdkf/pXVG/6R0Rf+fcET/n20//4hmRv+enZ//qKan/6ak - pP+in6D84+Pj+//////8/Pz//Pz8//////++vr6xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+vrx6zsvN/7Ou - rP+JVzn/nF46/5tePP+cYD3/nWE+/59hPv+fYj//oGNA/6BkQf+iZEL/pGVD/6VmRP+mZ0T/pmdE/6hq - Rv+sdEz/sntR/7J9VP+1gFX/t4ZX/7qJWv+3hVj/uYdY/7qJWv+5h1j/vItc/8OZZf/EmmX/w5hk/8KX - Yv+3hlb/toNT/7aDU/+1glL/toJS/7aAUf+1gFD/tH9Q/7R/T/+0f07/tH5O/7N9Tf+zfUz/sn1M/7J8 - TP+yfEz/snxM/7J7S/+ye0v/sntK/7B6Sf+wekn/sHpJ/695Sf+veEj/r3hI/693R/+vdkf/tH5L/7eG - T/+1hE3/tIFK/7R+Sf+yfEn/sHtI/7B5Rv+ud0X/rXVE/651RP+yekf/s35I/7J9R/+wfEf/s39M/7J/ - Tf+wfkz/sH5M/699S/+vfUv/rnxK/657S/+tekr/q3pK/6t6Sv+rekr/qnlJ/6p5Sf+oeEn/qHhJ/6h4 - Sf+nd0n/pndH/6R2R/+kdEX/i2Q//5eUk/+pqKj/pqWk/56dnPzU1NT5//////z8/P/8/Pz//////8zM - zNEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMC5uU3Mysr/v7/C/4lgRf+cXjn/m189/5xhPf+dYT7/nmI//59j - QP+iZEL/o2RC/6NlQ/+kZkP/pWdE/6VoRP+maEX/p2tG/6x0Tf+wfFL/s39U/7WCVv+5hlj/uolb/7aE - WP+6h1n/uolb/7qJWv+5hlf/vY5f/8SaZf/EmmX/w5lk/72QXf+3g1T/t4RU/7eEU/+3hFP/t4NT/7aC - Uv+1gFH/tYBQ/7V/T/+1f0//tX9P/7R/Tv+0fk3/tH1M/7N9TP+zfUz/s3xM/7N8TP+zfEv/snxL/7J8 - S/+ye0r/sHpK/7B6Sv+vekn/r3lJ/694SP+vd0f/snxK/7eFT/+2hE3/tIFL/7R+Sv+zfUr/sHtI/7B6 - R/+veEb/rnVF/65yRP+wd0b/s31I/7N+SP+zf0r/tIJO/7SCTv+zgU3/sn9M/7J/TP+wfkz/sH1M/658 - TP+se0v/rHtL/6x7S/+se0v/q3pK/6t6Sv+rekr/q3pK/6l6Sv+nekn/pnlJ/6h5Sf+YbUH/k4yG/6mp - q/+npaX/n52d/sfHx/n/////+/v7//v7+///////3d3d7V5eXhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt7GxJ8fF - xfjKzc//jGxY/5ldOP+bYT3/nWE+/55iP/+eY0D/n2RB/6BlQ/+iZkP/o2dE/6RnRP+maEX/pmlG/6dp - Rv+oa0j/rXVO/7B9U/+zf1X/tINY/7mIWv+6iFv/t4RY/7qHWv+6iVv/u4pb/7qJWf+5hlj/wJJi/8Sa - Zv/EmmX/wphj/7qHVv+5hFX/uYRV/7eFVP+2hFT/t4RT/7aDUv+1g1L/tYJR/7aAUP+1gFD/tIBP/7SA - Tv+1f07/tX9O/7V/Tv+0fk3/tH1M/7R9TP+zfUz/s31M/7J8TP+ye0v/sntL/7J7S/+we0v/sHpK/7B6 - Sv+veUj/sHtK/7aETv+2hU7/tIFN/7R+S/+zfUr/sntI/7J6R/+weUb/rndF/650Rf+udET/sHpH/7N/ - Sf+0g07/tYNP/7WDT/+0gk7/s4FN/7OBTf+yf0z/r4BM/659Tf+ufU3/rn1M/659TP+tfEz/rXxM/618 - TP+se0v/q3tL/6p8S/+pe0r/qn1K/55yQv+NgXb/q6ms/6elpf+joKD/urm5+fz8/P/7+/v/+/v7//// - ///q6ur9hYWFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZkKxsXF3dDT1f+Tfm//lFo2/5tiPf+cYz//nWNA/55j - Qf+fZEL/oGZD/6JnRP+iZ0T/o2hF/6RpRv+lakf/pmpH/6htSf+td0//sH1V/7OAVv+1hFn/uYhb/7eG - Wv+2hFj/uYdc/7qKXP+7ilv/u4pb/7qHWP+6h1r/wpVk/8abZv/Gm2b/vY9c/7mFVf+3hlb/t4ZV/7eG - Vf+3hVX/toRT/7aEU/+2hFP/toNS/7aDUv+1g1H/tIJQ/7WAT/+1gE//tYBP/7V/Tv+1fk3/tX5N/7R+ - TP+0fkz/tH5M/7R9TP+zfEz/s3xM/7N8TP+zfEz/s3xM/7J7Sv+wekr/sHpK/7WCTv+3hE//tYJO/7R/ - TP+zfUr/snxJ/7J7SP+weUf/r3dG/691Rf+uckT/r3ZF/7N9Sv+3hVH/t4VQ/7WDT/+1g0//tIJO/7OC - Tv+ygk3/sIFO/6+ATv+vfk7/r35O/69+Tv+ufU3/r31N/659Tf+sfU3/rH1M/6t/Tf+rfUz/p3hG/49+ - av+oqa3/p6Wl/6Sjov+wrq/59/f3/vz8/P/7+/v//Pz8//b29v+ZmZlQAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADGxsa31NTW/5+Ti/+PWDX/nGI+/5tjP/+cZEH/nmVC/59mQv+gZkP/o2dE/6NoRf+kaEX/pWlH/6Zq - R/+ma0j/qG1J/6x3UP+wflb/soFW/7WEWf+5iV3/toVa/7aEWf+5iFz/uopd/7uLXP+7ilz/u4lb/7qG - Wf+8iV3/w5hl/8abZ//DmGT/u4hY/7qHV/+5h1b/uYZW/7mGVv+5hlX/t4VU/7eFVP+2hFP/t4RS/7aD - Uv+1g1H/tYNR/7WCUP+1glD/tYJQ/7V/Tv+1f07/tYBO/7R/Tf+0f03/tX5N/7V+Tf+0fUz/tH1N/7R9 - TP+0fUz/s3xM/7J7S/+ye0v/snpL/7V/Tf+3hE//tYNO/7V/TP+1f0z/s31K/7J7SP+yeUf/sHhH/693 - Rv+udUX/rXRE/7B6Sv+2g1H/uYdS/7eFUf+1hFD/tIRQ/7ODT/+ygk//soFQ/7KBUP+ygVD/soFQ/7CA - T/+wgE//r4FP/62BT/+tgE7/rYBO/62ATv+tfUr/jXdd/6anqv+npaX/pqSk/6impvru7u79/Pz8//r6 - +v/7+/v/+/v7/6qqqngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbExIvU0tT/r6mm/4lYOf+dYz7/nGNA/5xk - Qf+eZkL/nmZD/59mQ/+iaET/o2lG/6RpRv+makf/pmtI/6drSP+obkr/rHhR/7B/Vv+zglj/tYVa/7mJ - Xf+1g1n/toVa/7mJXP+7i17/vIte/7yLXf+7il3/u4hb/7qFWf++jF//xJpm/8acaP++kF7/u4hY/7qI - WP+6h1b/uodW/7uIV/+6h1b/uYZV/7mFVP+5hVP/uYRS/7eEU/+3hFL/toNR/7aDUf+2g1H/tYBP/7WA - T/+1gk//tIBO/7SATv+0f07/tX5O/7V/Tv+1fk3/tX5O/7V+Tf+1fUz/tH1M/7R9TP+zfEz/s3pM/7R+ - Tf+3hE//toNO/7aATf+1fkv/s31K/7N8Sf+zekn/snlI/7B4Rv+udkX/rnVF/652R/+ye0z/toVS/7eH - U/+2hlH/tYVR/7SFUf+0g1H/tINS/7SCUv+zg1L/s4JR/7KBUP+wglH/sINQ/6+CUP+vglD/roFP/7KC - Tf+WeFf/oaGk/6empv+npaX/o6Ki++Li4vv+/v7/+vr6//r6+v/+/v7/tLS0nQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAw8DAXdLQ0P++vr7/h11B/51jPv+cY0D/nWVC/51lQv+eZkP/n2hE/6BpRf+iaUb/ompG/6Rs - R/+lbUn/pm1J/6dvS/+teFH/sX9X/7SCWP+1hlv/t4hd/7SCWP+3hlr/uYld/7uLXv+8i1//vIte/7uL - Xf+8iVz/u4da/7qFWf/AkWH/x5xo/8OYZf+8iln/vIpZ/7yJWP+8iVj/u4hX/7uIV/+6h1b/uodW/7qG - Vf+6hlT/uYVU/7eEU/+5hVP/t4RS/7eEUv+3g1H/t4NR/7aDUP+2glD/tYJP/7WAT/+1gE//tYBP/7WA - T/+1gE//tX9P/7V/Tf+1f03/tX5N/7V9Tv+1fU3/tHxM/7R9Tf+3g0//toRP/7aCTf+1f0z/tH5L/7N9 - Sv+ze0r/snpJ/7J5R/+vd0b/r3hH/651R/+udUj/snxO/7aFU/+3iFT/t4ZT/7aGUv+1hVP/tYRT/7WE - U/+1hFP/tINS/7OEUv+yhFL/soRS/7KEUv+wg1H/tIVQ/5h1T/+dnJv/qKio/6impv+fnZ381NTU+v// - ///6+vr/+vr6///////ExMTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6uro0zszM/c3M0P+KaFH/m2A7/5xk - Qf+dZUL/nWVC/55mQ/+faET/oGhF/6JpRf+iakb/pGxI/6VtSf+mbUr/p29L/6x5Uv+xf1f/soJZ/7SG - W/+1hlv/s4JY/7aFWv+5iV3/u4te/7uNX/+8i1//vIte/7uKXv+8iFz/u4da/7uGWf/ClGT/xpxo/8CQ - X/+9jVr/vYta/72KWP+8iVj/vIhX/7yJWP+8iFf/vIdW/7uHVf+6hlX/uoZV/7qFVP+6hlT/uYVT/7mE - Uv+5hFL/t4RR/7eEUP+3hFH/toNQ/7aCUf+2glD/toJR/7aCUP+2glD/tYBP/7WATv+1gE7/tX9P/7Z+ - T/+2fk7/tX1O/7V9Tf+3gk//t4RP/7aCTv+2gE3/tX9M/7N9S/+0fEv/s3pJ/7J5SP+yeUj/snlJ/7B3 - Sf+uc0f/r3VJ/7N9T/+3hlX/uYhV/7eHVP+3hlT/toVV/7aFVP+1hVT/tIVU/7SGVP+zhVP/s4VT/7OF - U/+1hlP/pHxO/5eUkP+rqav/qKam/6Genv7IyMj5/v7+//n5+f/6+vr//v7+/9PT0+FmZmYKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKGhoRPNzMzp1NbY/5F6aP+WXDj/m2RB/5xkQf+dZUL/nmdD/59nRP+gaEX/omlF/6Nr - R/+ka0j/pGxJ/6ZtSv+nb0v/q3lS/69/V/+xgln/tIZb/7SEWf+zgFj/toVa/7eJXP+7i17/u4tf/7yL - X/+8i17/u4te/7yJXP+8iFv/u4ZZ/7uHW//EmWf/w5dk/8CPXf++jlv/vY1a/72LWf+8ilj/vIpY/7yK - WP+8iVj/vIhX/7uHVv+7h1X/u4dV/7uHVP+7h1T/uoVT/7qFU/+5hVP/uYVS/7eEUf+5hFL/t4NR/7mE - Uf+3g1H/t4NR/7eDUf+3g1D/toJQ/7aCT/+1glD/toBQ/7V/T/+2f0//t39P/7Z+T/+2gFD/t4VQ/7aD - Tv+2gk7/tX9N/7R+TP+0fEv/tHxK/7N6Sf+ze0n/s3pK/7J4Sv+wd0n/r3NH/692Sv+zfVD/t4ZV/7qJ - V/+6iFf/uYdW/7eHVv+1iFX/tYdV/7WHVf+1h1X/tYdV/7aIVf+qfk3/l42D/6urrP+npqb/o6Gh/7q6 - uvn7+/v/+fn5//n5+f/8/Pz/39/f93R0dCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcvIyMbZ2tv/no6E/5FZ - N/+bZED/m2RB/51lQv+eZkP/n2dE/6BoRf+iakb/o2tH/6RrSP+kbEn/pW1K/6ZwS/+reVP/roBX/7GC - Wf+0hlv/soBY/7KAV/+1hVr/t4hc/7qKXv+7i1//vI1f/7yLX/+8i17/u4pd/7yIW/+8iFv/uoZZ/7yK - XP/EmGb/wpFg/8GQXv/Aj1z/vo5a/72NWv+8i1n/vY1Z/7yLWf+9ilj/vIlX/7uJV/+7iVb/u4hV/7uH - VP+7h1T/u4ZU/7uGVP+6hlP/uoZT/7mFU/+5hFL/uYRS/7mEU/+5hFL/uYRS/7mEUv+3g1H/t4NR/7eD - Uv+2g1H/toJR/7aCUf+2gFD/toBP/7Z+T/+3f0//uYVR/7eET/+2gk7/toBN/7V+Tf+0fUz/tHxL/7V8 - Sv+0fEv/s3pL/7N5S/+yeEr/sHdK/691SP+vdkr/s3xP/7eFVf+7ilj/uYpX/7eJV/+3iVf/t4lX/7eJ - V/+2iFb/t4lW/7SFUP+Vhnb/qqmt/6impv+mpKT/sa6v+fT09P76+vr/+fn5//v7+//w8PD/h4eHQAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAy8fJnNrZ2v+tpaD/jFg5/5xkQP+bZEH/nWVC/55mQ/+fZ0T/n2hE/6Bp - Rv+jakf/o2tI/6RsSf+kbUr/pnBL/6p5U/+tflf/sYJY/7OEW/+vflf/soBX/7SEWv+3iFz/uope/7uL - X/+7jV//vYtf/7yLXv+7il3/vIlc/7yIW/+7h1r/uoVY/76MXv/Ck2L/wpBg/8GQXv/Aj1z/vo5b/76M - Wv+9jVr/vo1a/72NWf+8i1j/vIpY/7yJV/+7ilb/vIpW/7yJVf+8iFb/u4dV/7uHVP+7h1T/u4dU/7uF - VP+6hVT/uoVU/7qFVP+6hVT/uoVT/7qFUv+6hVL/uYRT/7mEU/+5hFL/t4NS/7eDUv+2g1H/t4FR/7eA - UP+3f1D/uYNR/7mFUP+3g0//t4BO/7Z/Tf+1fk3/tH1L/7V9S/+1fUz/tHtM/7N6S/+zeUv/snlL/7J4 - Sv+wdEj/r3VJ/7N7Tv+2hFX/uYpY/7qNWP+6jFj/uYpX/7mKV/+5ilf/uYhT/5mDa/+nqKz/qKam/6el - pf+ppqf67e3t/fr6+v/5+fn/+vr6//X19f+dnZ1lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMxcVu19bX/727 - u/+IW0D/nGNA/5tkQv+cZUL/nGZC/51nRP+fZ0T/oGlF/6BqRv+ia0f/pGxJ/6RsSf+mcEv/qnlT/619 - V/+vgVj/soJZ/658Vf+xgVf/s4Na/7aGXP+5iV3/uYxe/7uLX/+8i1//u4te/7uKXf+7iVz/vIhb/7uI - Wv+7h1n/vIdY/72KXP/BkGD/w5Jg/8GRXv/Aj1z/wI9b/8CMWv++jFr/vo1a/72NWf+9i1n/vYtZ/72L - WP+9ilf/vIpX/7yJV/+8iFf/u4hW/7uIVf+7iFX/u4dV/7uHVv+7hlT/u4ZU/7uGVf+7hlX/u4ZU/7uG - U/+6hVT/uoVU/7qFU/+6hVP/uYRT/7mEU/+5hFL/t4NS/7eBUf+3f1D/uYNS/7mGUf+3hE//t4JO/7eA - Tv+1f03/tX9M/7V+TP+1fk3/tHxM/7N7TP+zekv/snpL/7J5S/+yeEr/sHZJ/691Sf+yeU3/tYJT/7qK - WP+7jlr/vI5a/7uNWf+9jVf/mn9h/6SlqP+op6f/qKam/6Ojo/vg4uL8+/v7//f39//39/f/+/v7/6qq - qooAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbCwkPW1NT/ysvO/4dkTP+bYD7/m2NC/5xkQv+cZUP/nWZE/51n - RP+faUX/oGpG/6JrR/+ja0j/pGxJ/6VxS/+peVL/rH1W/6+BWP+vf1f/rXtU/69/Vv+zg1n/tYVb/7eI - XP+5il3/uYxe/7uLXv+7i17/u4pd/7qJW/+7iFv/u4da/7uHWf+8h1n/u4VW/7uEV//DkmD/wpJf/8KR - Xv/Bj1v/wI5a/8COWv++jlr/vo5a/76NWv++jVr/votY/76LWP++ilj/vYlY/72KWP+8iVf/vIlX/7uJ - V/+7iFf/vIdX/7yIVv+7iFb/u4dX/7uGVv+7hlX/vIdU/7uGVf+7hlX/u4ZU/7uGVf+6hVT/uoVT/7qF - U/+5hFP/uYRT/7eDUv+3gVH/uYFS/7qGUv+5hVH/uYNP/7eATv+3gE7/tn9N/7Z/Tf+1fk3/tX1O/7R8 - Tf+ze0z/s3tM/7N6S/+zeUv/snlL/7J2Sv+wdEn/sHhL/7V/Uv+6iVj/vI9b/8GQW/+jglv/oaCh/6uo - qP+opqb/oZ6f/dPU0/r8/Pz/9/f3//f39//8/Pz/urq6sQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7u7HtLP - z/PW2dv/jHBf/5ZcO/+aYkH/m2NC/5xkQ/+cZkT/nWdE/55nRf+faUb/oGtG/6JrR/+ka0j/pW9L/6l5 - Uv+sfFb/roBX/619Vf+se1T/rn5W/7GCWP+0hVr/todc/7mJXP+5il3/uote/7uKXv+7il3/uolc/7qI - W/+7iFr/vIdZ/7yHWP+8iFn/tnpP/7uEV//Dk2H/wpJg/8KRXv/Cj1v/wY9b/8CPW//Ajlr/wI5a/8CO - Wv++jln/vo1Z/76NWf++i1j/vopY/72KWP+9ilj/vYpY/7yJWP+8iFf/vIhX/7yIV/+8iFf/vIhX/7yI - Vv+8iFb/vIdW/7yIV/+8h1b/vIdW/7yHVf+7hlX/u4ZU/7qFVP+6hVT/uoVT/7mEU/+3g1L/t4NS/7qF - U/+6hlL/uYNQ/7mBT/+3gE7/t4JO/7eATv+2fk3/tX1O/7Z+T/+1fU7/tHxN/7R7TP+ze0z/tHpL/7N5 - S/+yeEr/snZK/7B3Sv+zfE//vIdX/6eBV/+empn/q6mr/6inp/+ioaD+yMjI+fv8/P/39/f/9/f3//z8 - /P/IyMjRAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZkF0NDQ1Nzd4P+XhHn/kVg3/5piQf+bY0L/m2NC/5xl - Q/+dZkT/nmZF/59oRf+gaUb/ompH/6JrR/+kb0r/p3hS/6p8VP+tflf/q3pT/6t6U/+tfVb/sYFX/7SE - Wv+1h1v/t4hc/7eJXP+6il3/uopd/7qKXP+6iVv/uohb/7uIWv+8h1n/u4dY/7yIWf+6gVT/s3RL/7yH - WP/Dk2D/wpNe/8KRXf/CkFz/wZBb/8CPW//Ajlr/wI5a/8COWv/Ajln/wIxZ/8CMWf/AjFn/vYtY/72L - WP+9ilj/vYlY/72KV/+9iVj/vIlY/72JWP+9iVj/vYlX/7yJWP+8iFf/vYlX/7yIV/+8iFf/vIhW/7yH - Vv+8h1b/vIdV/7uGVf+7hlX/uoVU/7qFU/+6hVT/uYRT/7qEU/+6hlP/uoRR/7mDUP+5gU//uYNP/7eC - T/+3f0//t39Q/7Z+T/+2fk//tX1O/7V9Tv+0fE3/s3tM/7R7TP+0ekz/tHlL/7J3Sv+0dkr/p3BH/5yS - i/+rq63/qKen/6Wjo/+6urr5+fn5//b29v/29vb/+vr6/9jY2O5eXl4TAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADQzc2t393f/6edlv+JVTf/mmJB/5piQf+bY0L/m2NC/5xlRP+dZkX/nmdF/59nRv+iaUb/ompG/6Nw - Sv+nd1H/qXpT/6t8Vf+pd1H/qnpT/6x8Vf+vf1b/soNZ/7SFWv+2h1v/tohb/7mJXP+6iVz/uopc/7qI - W/+6iFr/uYhZ/7yHWf+7hlj/u4ZY/7yHV/+1eEz/tHZL/72HWP/Ek2D/w5Je/8ORXf/CkVz/wY9b/8GP - W//Bj1v/wI9a/8CPWf/Ajln/wYxa/8CMWf++jVj/vo1Z/72LWf+9ilj/vYpY/72KWP+9ilj/vYpY/72K - V/+9iVf/vYlY/72JWP+9iVj/vYlY/72JWP+9iVj/vIlX/72IV/+9iFb/vIhW/7yHVv+7hlX/u4ZV/7qF - Vf+6hVT/uoVU/7qEVP+7hlT/uoZS/7mEUf+6g1D/uoRQ/7mDT/+5gFD/uYBR/7mAUf+3f1D/tn5P/7Z+ - T/+1fU7/tX1N/7V8Tf+1fE3/tXtM/7V7Tf+tckX/lod7/6ysrv+pp6f/p6Wl/7Gwr/ny8vL+9/f3//b2 - 9v/6+vr/5eXl/YKCgjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3Ly4Dc3Nz/urWz/4ZWOv+aYED/mWFB/5pi - Qf+bY0L/nGRD/51lRP+dZkX/n2dF/6BnRv+gaEb/o25K/6Z3UP+peVP/qnpT/6d2UP+peFL/q3tU/659 - Vf+xgVf/soRZ/7SGWf+2h1r/t4hb/7eIW/+5iVv/uohb/7mIWv+3h1n/u4ZY/7uGWP+6hVf/vIdX/7d9 - UP+0dUr/tXZL/72GV//Ek1//w5Je/8KSXf/CkVz/wY9b/8GPW//Bj1r/wY9a/8GOWv/Bjlr/wIxZ/76N - Wf/Ajlj/vo1Y/76LWP++i1j/votY/76LWP+9ilj/votX/76KWP++ilf/vopX/76KWP+9ilj/vopY/72J - WP+9iVj/vYlY/72JV/+9iFf/vYhX/72IV/+8h1b/u4ZV/7uGVf+7hlX/uoVU/7qFVP+7hlX/u4dU/7qF - Uv+6hVD/uoVR/7qDUP+6gVH/uoFS/7mAUf+5gFH/t39Q/7d/UP+2fk//tn5P/7Z+T/+1fU7/tn1O/7R4 - R/+bhHD/qqyv/6mnp/+opqb/qqmp++rq6v35+fn/9vb2//f39//x8fH/jo6OUQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAysrKUtrZ2f/Jycr/hV5E/5lePP+YYED/mWFB/5piQf+bY0L/nGRD/51lRP+eZkX/nmdG/59o - Rv+ibkr/pXZP/6d4Uf+neFH/pnRP/6d3Uf+qeVL/rHxU/6+AVf+xglf/s4RY/7WGWf+2h1r/t4da/7eI - Wv+5iFr/uYdZ/7eHWf+5hlj/uoVY/7qFV/+7h1f/uoJU/7V2S/+1dkv/tXZL/72GV//Dk1//wpJd/8OR - Xf/DkVz/wpBc/8KPW//Bj1r/wo9b/8GPWv/Bjlr/wI5Z/8COWf/Ajln/wIxZ/8CMWf/AjFn/votY/76L - WP++i1f/votX/76LV/++i1f/votX/76LWP++i1j/votX/76LWP+9ilj/vYpY/76JV/++iVf/volX/72I - V/+9iFb/vIdW/7yHVv+8h1b/u4ZV/7uGVf+7hlX/vIhV/7uGU/+6hlH/u4ZR/7qEUf+7glL/uoFS/7qB - Uv+6gVL/uYBR/7mAUf+5gFH/t39Q/7Z+T/+2fk//uHxL/5l7Yf+nqa3/qaen/6inp/+jo6P839/f/Pn5 - +f/19fX/9fX1//b29v+mpqZ5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEvr4r1tPT+tbZ2/+Kalb/lVs5/5hf - P/+YYED/mWFB/5piQf+bY0L/nGRD/51lQ/+dZUX/nmZF/6BtSf+jdE3/pndQ/6R0Tv+lck7/pXVQ/6l4 - Uf+relP/rX5V/6+BVv+yglj/s4RY/7WGWf+2h1n/toda/7mHWf+2hlj/t4ZY/7mGV/+6hFf/uYRW/7qF - Vv+7hlb/tXhM/7R2S/+1dkv/tXVK/7yFVv/Dk17/wpJe/8ORXf/DkVz/w49b/8KPW//Cj1v/wo9b/8GP - Wv/Ajln/wI5Z/8CMWf/AjFn/wIxZ/8CMWf/AjFn/wIxZ/8CMWP/AjFj/votX/76LV//AjFj/wIxX/76L - V/++i1f/votX/76LWP+9ilf/vopY/76JWP++iVf/volX/72IV/+9iFf/vYhX/72IV/+8h1b/vIdW/7yH - Vf+7hlX/vIhW/7yIVP+7iFL/u4ZR/7uEUf+7hFP/u4JT/7uBU/+6gVL/uoFS/7mAUf+5gFH/uYBR/7mA - Uf+6f07/pH1a/6Wlp/+pqKf/qaen/6KgoP3S09P6+fn6//X19f/19fX/+fn5/7Kysp4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKqqqgzT0tLh3+Di/5R9bv+ITSz/kVc2/5RaOP+WXDr/mF08/5tgPv+cY0D/nWRC/51k - Q/+fZkT/oG1I/6NzTP+ldU7/o3JL/6RyTP+ldE7/p3dP/6p5Uf+sfFP/rn5V/6+BVv+yg1b/s4RW/7SF - WP+1hlj/toZY/7aGWP+3hlf/toVW/7eEVv+5hFX/uYRV/7uGVv+2fE//tHVK/7V2S/+2dkv/tnVL/7uC - Vf/Dkl7/w5Ne/8OSXf/DkFz/w5Bc/8KPW//Dj1v/wY9a/8GPWv/Bj1r/wI5Z/8CMWf/AjFn/wIxZ/8CM - Wf/AjFn/wIxY/8CMWP/AjFj/wIxY/8CMWP/AjFj/votX/76LV/++i1f/wItY/76LV/++i1j/vopY/76K - V/++ilj/volX/76JVv++iVf/vYhX/72IV/+8h1f/vIdW/7yHVv+8h1b/vIdW/72JVv+9ilT/u4dS/7qF - Uv+8hFP/vINU/7uEVP+7glP/uoFS/7uBU/+6gVL/uoFS/7yBUP+leFH/oZ+d/6urq/+pqKj/o6Ki/sfG - xvr5+fn/9fX1//X19f/6+vr/xMTEwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANLS0rzd3d3/v7u5/5eE - ev+ZgXL/lXlm/4ttWf+OalP/jWVL/4deQ/+NXUH/j10//45aOv+VYz//nGtD/5xpQ/+eaEP/omxF/6Rw - SP+ldEr/qnhO/6x8Uf+ufVL/sH9U/7KCVv+zg1b/tIRX/7WFV/+2hVf/toVW/7aFVv+2hFb/toNV/7eD - Vf+3g1X/uoVW/7mBUv+zdEr/tXZL/7V2S/+2dkv/tXVK/7qAUv/DkVz/xJNe/8ORXP/DkVz/w5Bc/8OQ - XP/CkFv/wY9a/8GPWv/Bjlr/wY5a/8GOWv/AjFn/wIxZ/8CMWf/AjFj/wIxY/8CMWP/AjFj/wIxY/8CM - WP/AjFj/wIxY/8CMWP++i1f/wIxY/8CLWP++i1j/votX/76KV//Ailf/volX/76JV/++iVj/vohX/72I - V/+9iFf/vYhX/7yHVv+8h1b/vIdW/72IVv+9ilX/vIhT/7uGUv+7hVT/vIVV/7yDVP+7hFT/u4RT/7uC - U/+6gVL/vIJS/697T/+fmJL/q6ut/6moqP+mpaX/u7q6+ff39//19fX/9fX1//n5+f/R0dHhZmZmCgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA0tDQktrZ1//d3d3/4uTm/+Dh4//b3eD/2tvd/9XW2P/Nzs//yMfI/8O/ - vv+4s7H/samk/6+imf+llov/n41//5+Idf+XfWj/k3Vf/5l3W/+WclT/lnBO/551T/+fc0z/oXNL/6h4 - Tf+re03/rnxO/7SAUP+1gFH/tYJR/7eDU/+3hFT/uYNT/7mBVP+7hVX/uoVU/7N3Sv+0dUr/tXZL/7Z2 - S/+2eEv/tXVK/7p9T//CjVv/xJNe/8SRXf/EkV3/w5Fc/8KQW//CkFv/wo9b/8GOWv/Bjlr/wY5a/8GO - Wv/Bjlr/wIxZ/8CMWP/AjFj/wIxY/8CMWP/AjFj/wIxY/8CMWP/AjFj/wIxY/8CMWP/AjFj/wIxY/8CL - WP/Ailj/wIpX/8CKV//Ailf/wIpX/8CKV/++iVf/volX/72IVv+9iFb/vYhX/72IVv+8h1b/vIdW/7yH - Vv++i1b/vIhU/7uGU/+7hlT/vIZV/7yFVf+8g1T/vINU/7uCU/+8g1T/s3xM/52Rhv+srK7/qaio/6em - pv+xsbH67+/v/vX19f/09PT/9/f3/9vb2/d0dHQhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPz89a29nZ/9va - 2v/b2tr/29ra/9va2v/c2tr/3Nvb/93c3P/f3d3/393f/+Hg4P/g4OH/4ODi/+Dg4v/g4OL/3N3g/9fa - 3P/W19v/0NDS/8jIyf/FxMP/v7u5/7Svq/+0qqP/r6SY/6WWiP+nlIH/p494/5yDav+hgmP/pYFf/6B5 - VP+keFL/q3tQ/6h3Sv+ue0v/r3NG/61tQf+xb0P/tXJF/7Z0Rv+3dEb/t3VH/7t7TP/Ci1j/x5Ne/8eT - Xv/Ekl3/wpFb/8OQW//Cj1v/wo9a/8GOWv/Bjlr/wY5a/8GOWv/Bjln/wIxY/8CMWP/AjFj/wIxY/8CM - WP/AjFj/wIxY/8CMWP/AjFj/wIxY/8CMWP/Bi1j/wItY/8CLWP/Ai1f/wYtY/8CKV//Ailf/wIpX/8CK - V/++iVb/volW/76JVv+9iFb/vYhW/72IVv+9iFb/vIdX/72IVf++i1b/vYpU/7uHU/+7hlT/vIZV/72F - Vf+9hVX/vYVU/7yDVP+6f07/n4t5/6usr/+pqKj/qKen/6qqqvvp6en99fX1//T09P/29vb/6+vr/5mZ - mUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqqgbQ0NBc1NLSgdbT05fW09Ot1tXVw9bU1NbX1tbm2NfX9NnY - 2P7b2dn/29nZ/9rZ2f/a2dn/2tnZ/9rX1//a19f/2dfZ/9rZ2f/a19n/2tra/9va2v/b2tv/3Nvc/9vc - 3f/a2tz/2trc/9fZ3P/U1dj/0dPW/8/Q1P/IyMr/wsLC/8K+vf+4tbH/saqk/7Sonv+tnZD/oo5//6iN - eP+khG3/nXpg/6Z7XP+ld1P/onBK/6t0S/+zf1L/t4dV/72LVv/BjFb/wItU/8KOVf/EjVb/w41W/8ON - V//Ej1j/w49Z/8KNWP/CjVj/wo1Z/8GMWP/BjFj/wIxY/8GMWP/BjFj/wYxY/8GLWP/BjFj/wYtY/8GL - WP/Bi1j/wYtY/8GLWP/Bi1j/wIpX/8CKV//Bilj/wIpX/8CKV//Ailf/volW/76JVv++iVb/vYhV/72I - Vv+9iFb/vYhW/72JVv+9ilX/vYpV/72IVP+8h1T/vYZV/72FVf+9hVX/vYVV/72BUP+fhGz/qquu/6mo - qP+pqKj/paWl+9/f3/z39/f/9PT0//X19f/x8fH/oKCgZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAmZmZBcPDwxG5ubkhxsbGMdDMzEbQ0NBc0NDQc9PT04zW09Oh1NPTuNbS - 0s3V09Pe1tTU7tbT0/rX1tb/19bW/9fV1f/W1dX/1dXV/9XU1P/V0tP/1NLT/9TS0//U0dH/09PT/9XS - 0//U0tT/1NLT/9TU1f/V1Nb/09TW/9PS1v/R1Nf/z9HV/8rN0P/Jy8//x8jK/76/wf+8urv/u7a0/7Cp - pf+wqKD/s6ea/6mci/+pl4L/r5h9/6iNcP+pi2j/sY1n/6yGXf+vhVn/tohY/7WGVP+3hVH/vYhS/72I - Uf++h1H/wopT/8OKVP/CilT/w4tV/8SMV//Di1f/wotX/8KLWP/Ci1j/wYtY/8GLV//Ailf/wIpX/8GL - WP/Ailf/wIpX/8CKV//Ailf/volW/76JVv++iVb/volW/76JVv++iVb/vYhW/76KV/++ilX/vopV/76K - Vf+9iFT/vYZV/72GVf++hVX/v4VS/6SCYf+mqKr/qaio/6moqP+ioqL90tLS+/f39//y8vL/8vLy//b2 - 9v+np6eLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIuLiwvMzMwZzMzMKMzMzDzNyclR0tLSZtHN - z3/QzMyX0M3NrdHNzcPPzs7Vz87O5s/OzvTQz8/+0tDQ/9LQ0P/Rz8//0c/P/9DOzv/Qzs7/z8zN/87M - zf/Oy8v/zMrK/8zKyv/Mysr/zMvL/8zKy//Ly8z/zcvM/83Lzv/Jysz/ycnM/8jJzP/Excr/wcPG/8HC - xf+9vL//trW3/7e0s/+0r6z/rKWf/6+lmf+un5H/pZSC/6uVfv+sk3f/pYhp/62KZv+xiWL/rINZ/7SF - WP+3h1b/tYNS/7uGUv++iFP/vYZR/7+IUv/DilP/w4pU/8KKVP/Di1X/w4tW/8GKVv/Bilb/wYpX/76J - Vv++iVb/volW/76JVv+9iFX/vYhW/8CLV/+9iVT/vYlU/76KVf+9iVX/vodV/76GVf/Bh1P/p31Y/6Wj - o/+rqan/q6io/6Siov7Gxsb69vb2//Ly8v/y8vL/9/f3/729vbMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmQWqqqoSt7e3IMHB - wTHGxsZHyMXFXMzMzHPMysqLzMjJoczKyrjMzMzNy8nK3snHx+3JyMj6zMrK/8vKyv/Lycn/ysnJ/8rI - yP/JyMj/ycbH/8jHx//HxcX/x8TE/8XExP/Ew8P/xMLC/8TDw//Fw8P/w8PD/8PCw//Ew8X/wsLE/8HB - xP/BwsT/wMHE/7u9wP+5u77/uLq8/7O0tf+vrq7/s6+s/6ymov+nn5f/rqGV/6eYiP+jkH3/rZV7/6mN - cP+miGf/sYxn/66GX/+ug1j/t4dY/7aFVf+3hFH/vYdS/76HUf++hlH/v4dR/8GIUv/BiFL/wIhT/8OM - Vf/AilP/volT/8CLVf/AilX/vohU/8GIVP+ygVT/pJ+c/6ysrP+rqan/p6am/7y8vPr19fX/8vLy//Ly - 8v/39/f/x8fH0nh4eBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLi4sLo6OjGbm5uSi/u7s8wMDAUcTExGfFxcV/xsTEl8bDxK3ExMTCxMLC1cLBwebCwcH0w8LC/sTD - w//EwsL/w8LC/8LBwf/CwcH/wb+//8G+vv+/vr7/v729/769vf+9vLz/vLy8/7y7u/+8urr/vLu7/7u7 - u/+7urv/u7q8/7u6vP+4urz/uLi8/7e4vP+2trv/srS4/7Kztv+wsrT/q6us/6unp/+sp6T/pZ6Z/6ac - kv+qnZD/opKB/6aQev+sk3j/pYhq/6qHZf+xi2T/rYRa/7OHWP+3h1b/tYRR/7mFUP+9iFH/voZQ/7Z9 - Sv+imI7/rK2u/6upqf+op6f/s7Gx+u/v7/709PT/8vLy//f39//W1tbvgICAKgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACZmZkFqqqqEq+vryCzs7Myvba2Rr+6uly8vLxzv729i767u6K+vr64vrm5zbu6 - ut67ubntu7q6+b28vP+8u7v/vLq6/7u6uv+7uLj/uri4/7q3t/+4t7f/t7a2/7e2tv+3tbX/trW1/7a0 - tP+1tLT/tbOz/7SztP+0s7P/tLGz/7Oxs/+0tLX/srO1/7Cytf+wsrT/r7K1/66vtP+rrbD/rK2w/6mp - rP+lpKT/qKWj/6ehnf+gmJH/p5yP/6eYif+gjnv/qpB3/62lnv+rq6z/q6mp/6moqP+rq6v76Ojo/fT0 - 9P/y8vL/9fX1/+Pj4/2amppOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHR0C6OZmRmzrKwou7u7PLezs1G3tbVnube3f7i2 - tpe3tLStt7S0wri1tda1tLTmtLOz9LSzs/62tbX/tbS0/7W0tP+0s7P/s7Oz/7Oxsv+zsLD/srCw/7Gv - r/+wr6//sK+v/7Curv+vrq7/r62t/66trf+ura3/rq2t/66trv+tra7/rqyt/62ur/+trbD/rK2w/6us - r/+rrbD/q6ur/6upqf+rqan/q6mp/6Wlpfze3t789fX1//Hx8f/19fX/8fHx/5mZmXYAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZmZmBaqqqhKqqqohraioMrCs - rEexr69csa+vc7KwsIuwsLCisLCwuLSvr8yxr6/erqys7a6trPqxr6//sK+u/7Curv+vra3/rq2t/66t - rf+urKz/rq2s/66srP+trKv/rayr/6yrq/+sq6v/rKur/6ypqv+sqar/rKmq/6ypqv+sqar/pKKi/dLS - 0vv39/f/9/f3/+jo6P+ysrK5b29vNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqq - qgyZmZkZoqKiKaqqqjyqqqpRrKmpaKupqYCsq6uXraqqrqyrq8KsqqrWq6qq5qqpqfSrqqr+rKur/6yr - q/+sq6v/rKmq/6ypqv+sqar/rKmq/6ypqv+npaX/ysrK/+3t7f+4uLi/eXl5SgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGZmZgWGhoYTqqqqIa+vrzOppaVHqampXKmnp3SrpaeLq6eno6mpqbipqKjNqaan36up - qeympKTThISEUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAXR0dAuqiooYm5ubKaCgoDuopaVSq6ioZJSUlEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////+AAH////////////////wAAAAAP/////////////AAAAAAAAB///////// - ///gAAAAAAAAP///////////4AAAAAAAAB///////////+AAAAAAAAAf///////////+AAAAAAAAH/// - ////////////AAAAAA////////////////gAAAAP///////////////8AAAAD////////////////AAA - AA////////////////wAAAAf///////////////8AAAAH////////////////AAAAB////////////// - //wAAAA////////////////8AAAAP////////////////AAAAD////////////////wAAAA///////// - ///////4AAAAf///////////////+AAAAH8AAf////////////gAAAAAAAH//////////8AAAAAAAAAB - ///////gAAAAAAAAAAAAAf///gAAAAAAAAAAAAAAAAH///gAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAA - AAAAAP//gAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAP//wAAAAAAA - AAAAAAAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAB//+AA - AAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAA - f//gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAP//wAAAAAAAAAAAA - AAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAP//wAAAAAAAAAAAAAAAAAD//+AAAAAAA - AAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//gA - AAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAA - D//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAP//wAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAA - AAAAAA///gAAAAAAAAAAAAAAAAAP//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//gAAAAAA - AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8A - AAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAP//wAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAA - A///gAAAAAAAAAAAAAAAAAP//4AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAA - AAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAA - AAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAA///g - AAAAAAAAAAAAAAAAAP//4AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAA - AP//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAA - AAAAAAB///AAAAAAAAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAB///gAAAAA - AAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAP//8 - AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAA - AB///AAAAAAAAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAB///gAAAAAAAAAA - AAAAAAAf//4AAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAP//8AAAAA - AAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAAAD/// - //+AAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAH/////////AAAAAAAAAAAB///////////AAAAAAAA - AAf////////////gAAAAAAAH//////////////gAAAAAB////////////////gAAAB////////////// - ////wAB///////////////////8A//////////////////////////////////////////////////// - //////////////////////////////////8= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/NES/NESGraphicsConfig.cs b/BizHawk.Client.EmuHawk/config/NES/NESGraphicsConfig.cs deleted file mode 100644 index f8c41e16ee..0000000000 --- a/BizHawk.Client.EmuHawk/config/NES/NESGraphicsConfig.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; - -using BizHawk.Common; -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Nintendo.NES; - -namespace BizHawk.Client.EmuHawk -{ - public partial class NESGraphicsConfig : Form - { - // TODO: - // Allow selection of palette file from archive - // Hotkeys for BG & Sprite display toggle - // NTSC filter settings? Hue, Tint (This should probably be a client thing, not a nes specific thing?) - private NES _nes; - private NES.NESSettings _settings; - private Bitmap _bmp; - - public NESGraphicsConfig() - { - InitializeComponent(); - } - - private void NESGraphicsConfig_Load(object sender, EventArgs e) - { - _nes = (NES)Global.Emulator; - _settings = _nes.GetSettings(); - LoadStuff(); - } - - private void LoadStuff() - { - NTSC_FirstLineNumeric.Value = _settings.NTSC_TopLine; - NTSC_LastLineNumeric.Value = _settings.NTSC_BottomLine; - PAL_FirstLineNumeric.Value = _settings.PAL_TopLine; - PAL_LastLineNumeric.Value = _settings.PAL_BottomLine; - AllowMoreSprites.Checked = _settings.AllowMoreThanEightSprites; - ClipLeftAndRightCheckBox.Checked = _settings.ClipLeftAndRight; - DispSprites.Checked = _settings.DispSprites; - DispBackground.Checked = _settings.DispBackground; - BGColorDialog.Color = Color.FromArgb(unchecked(_settings.BackgroundColor | (int)0xFF000000)); - checkUseBackdropColor.Checked = (_settings.BackgroundColor & 0xFF000000) != 0; - SetColorBox(); - SetPaletteImage(); - } - - private void BrowsePalette_Click(object sender, EventArgs e) - { - OpenFileDialog ofd = new OpenFileDialog - { - InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries["NES", "Palettes"].Path, "NES"), - Filter = "Palette Files (.pal)|*.PAL|All Files (*.*)|*.*", - RestoreDirectory = true - }; - - var result = ofd.ShowDialog(); - if (result != DialogResult.OK) - { - return; - } - - PalettePath.Text = ofd.FileName; - AutoLoadPalette.Checked = true; - SetPaletteImage(); - } - - private void SetPaletteImage() - { - var pal = ResolvePalette(false); - - int w = pictureBoxPalette.Size.Width; - int h = pictureBoxPalette.Size.Height; - - _bmp = new Bitmap(w, h); - for (int j = 0; j < h; j++) - { - int cy = j * 4 / h; - for (int i = 0; i < w; i++) - { - int cx = i * 16 / w; - int cindex = (cy * 16) + cx; - Color col = Color.FromArgb(0xff, pal[cindex, 0], pal[cindex, 1], pal[cindex, 2]); - _bmp.SetPixel(i, j, col); - } - } - - pictureBoxPalette.Image = _bmp; - } - - private byte[,] ResolvePalette(bool showmsg = false) - { - if (AutoLoadPalette.Checked) // checkbox checked: try to load palette from file - { - if (PalettePath.Text.Length > 0) - { - var palette = new HawkFile(PalettePath.Text); - - if (palette.Exists) - { - var data = Palettes.Load_FCEUX_Palette(HawkFile.ReadAllBytes(palette.Name)); - if (showmsg) - { - GlobalWin.OSD.AddMessage("Palette file loaded: " + palette.Name); - } - - return data; - } - else - { - return _settings.Palette; - } - } - else // no filename: interpret this as "reset to default" - { - if (showmsg) - { - GlobalWin.OSD.AddMessage("Standard Palette set"); - } - - return (byte[,])Palettes.QuickNESPalette.Clone(); - } - } - else // checkbox unchecked: we're reusing whatever palette was set - { - return _settings.Palette; - } - } - - private void Ok_Click(object sender, EventArgs e) - { - _settings.Palette = ResolvePalette(true); - - _settings.NTSC_TopLine = (int)NTSC_FirstLineNumeric.Value; - _settings.NTSC_BottomLine = (int)NTSC_LastLineNumeric.Value; - _settings.PAL_TopLine = (int)PAL_FirstLineNumeric.Value; - _settings.PAL_BottomLine = (int)PAL_LastLineNumeric.Value; - _settings.AllowMoreThanEightSprites = AllowMoreSprites.Checked; - _settings.ClipLeftAndRight = ClipLeftAndRightCheckBox.Checked; - _settings.DispSprites = DispSprites.Checked; - _settings.DispBackground = DispBackground.Checked; - _settings.BackgroundColor = BGColorDialog.Color.ToArgb(); - if (!checkUseBackdropColor.Checked) - { - _settings.BackgroundColor &= 0x00FFFFFF; - } - - _nes.PutSettings(_settings); - Close(); - } - - private void SetColorBox() - { - int color = BGColorDialog.Color.ToArgb(); - BackGroundColorNumber.Text = $"{color:X8}".Substring(2, 6); - BackgroundColorPanel.BackColor = BGColorDialog.Color; - } - - private void ChangeBGColor_Click(object sender, EventArgs e) - { - ChangeBG(); - } - - private void ChangeBG() - { - if (BGColorDialog.ShowDialog() == DialogResult.OK) - { - SetColorBox(); - } - } - - private void BtnAreaStandard_Click(object sender, EventArgs e) - { - NTSC_FirstLineNumeric.Value = 8; - NTSC_LastLineNumeric.Value = 231; - } - - private void BtnAreaFull_Click(object sender, EventArgs e) - { - NTSC_FirstLineNumeric.Value = 0; - NTSC_LastLineNumeric.Value = 239; - } - - private void BackgroundColorPanel_DoubleClick(object sender, EventArgs e) - { - ChangeBG(); - } - - private void RestoreDefaultsButton_Click(object sender, EventArgs e) - { - _settings = new NES.NESSettings(); - LoadStuff(); - } - - private void AutoLoadPalette_Click(object sender, EventArgs e) - { - SetPaletteImage(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/NES/NesControllerSettings.resx b/BizHawk.Client.EmuHawk/config/NES/NesControllerSettings.resx deleted file mode 100644 index 91f294b89b..0000000000 --- a/BizHawk.Client.EmuHawk/config/NES/NesControllerSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/NES/QuickNesConfig.resx b/BizHawk.Client.EmuHawk/config/NES/QuickNesConfig.resx deleted file mode 100644 index 6951226048..0000000000 --- a/BizHawk.Client.EmuHawk/config/NES/QuickNesConfig.resx +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - l/8wVp7/Mlac/zRXm/82WJr/O12e/0JmqP9Ga7D/Rm21/0Jqtf87Y6//N12o/zRaoP81WJzvOVydzz5e - no8/X58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1OfQClV - ob8rVaD/LVaf/zJXnv85W5z/Q2Kf/09tqP9Uc6//VHW0/1Bztv9KbrX/Qmix/ztgqf80WJ//LlGS/yxN - jM8yVJNwP1+fMD9fnxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvX7QwMGCyjy1bqM8qU5vvL1OX/zpbmv9HZaH/VXKt/1l4s/9UdbT/TG+y/0Nnrv88YqnvOFylzzJV - mr8qTIq/J0eDjyVKhDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAC9frxAvX7QwKE+YcCJGiM8oSov/NVaW/0Bgn/9IaKj/SWqr/0Flqf85X6b/Mlih/y1U - ns8yVp9wM1ebQCtLi0AlSoQwH09/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfP39AHT19vyVFhf8zU5T/PF2f/0Jjpf9AY6f/OF2k/zBX - oP8pUZr/JU2YvydPl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/wP///8D///8AD///AA///AAA//wAAP/wAAAD8AAAA/AAAADwAAAA8AAAAPAAAAD8AAAD/AA - AA/wAAA/8AAAP/DAP//wwD//8MA///DAP//wAA//8AAP//wAAP/8AAD//AAA//wAAP/8AAD//AAA//wA - A//8AAP//wA///8AP/8oAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIC - Bf8CBAX/BAUG/wMFCf8FCA7/BgoT/wkNEv8IDhj/DRES/wsQGv8QExn/FB0c/xYiE/8YIRT/FiUd/xsm - Hv8KEyX/ChQq/w4ZKv8UHCP/EBss/w4ZMv8SHTL/Ex84/xcgI/8aIyf/Gioj/xklKv8aKS7/FiQ0/xkl - Mv8cLDL/EyI6/xslOf8WKT//HCw7/x0zNf8bMDv/Ii4v/ykzJf8uOiL/JjMt/yg0Kv8iKjP/ISo7/yQ1 - Nf8sOTf/IjA6/yg1Pv8gPDj/Kzw8/zBDKP8oQjP/Kkk1/zZKM/8zUzf/OVM2/xQlQ/8YJUL/FSlF/xot - Q/8TJUj/FSlM/xorS/8cMEL/HDNJ/xUrU/8aLlL/FCta/xYtWf8YL1n/HDNU/xoyW/8hL0T/IjRF/yg5 - Q/8hNkj/IzpL/ys/Sf8wPkr/ITRU/yQ8Uv8rOlb/IDVa/yM6Wv8oOlv/GTRh/x04Yf8XNGr/GDRq/xk3 - bf8ePHL/ITpj/yk9Zf8jPW3/KT5p/yA+dP8tQEX/K0tC/ypBSP8wRkj/NVdB/zpTR/87XEX/PVpI/y5D - Uv8sQ1z/NUNU/zNBWf8wTV7/OUxe/zlSV/87WVn/P2BY/ytGY/8vSWf/JEFs/ypCbv8zS2L/NU1t/zxX - Zv85U2z/JkFz/ytEc/8iQnz/I0R9/ydGfv8pR33/Kkh8/zBKev85VXX/O1p0/ztZff9AX1r/QFRr/0Jf - av9BX3P/RF54/0Vlbf9DZHD/Q2F8/0doef8fQ4L/IkSF/ydIhP8qSYH/KEmG/y1Mh/8jRor/JUmK/ylK - if8qTIn/LE2J/yhMjf8sTo3/LVCO/zVQh/8zVov/OFSM/zVYjf87X4j/J0yQ/ylOkv8sTpD/KU+V/ydP - mP8rUJH/LVGR/y5Ukv8pUJT/LlOU/yhRmv8sUpn/LlSa/ylSnP8sU5z/LVWc/zNUkv83VpL/MFOU/zJU - lf81Vpb/NVqV/zpYlP8xVZj/NVea/zBXnP83WZv/NlyY/zFYn/80Wpz/OVqb/zxcmf84W5z/O1yd/z1e - nv8+Y4v/PWKS/zxjnf8sVqH/LVmn/y1aqP8tXKv/L16u/zBXpv8yWaH/NVqh/zVcpf85XqH/OV6l/zJb - rf84Xqj/MF+x/zResP8/YaL/OWGn/zxgpv83YKz/OWCp/zxiqP87Y67/PGOt/z1lrv8wYLH/N2Gw/0Rj - hP9FaIT/SGuD/0NljP9Gaor/SWuL/0FmlP9FaZP/SWyQ/0FhoP9EZKH/Q2Sl/0lopv9CZaj/RWer/0Jm - rf9Fa6//SGio/05tqf9Ka6z/Tm6s/1Fxr/9BZ7D/QWiy/0Rrsv9HbLP/SGyw/0xvs/9OcLD/AAAA/wAA - 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 - Lv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZNGH/FShK/w8PAP8rQDb/LUlN/xEo - Q/8eLjH/FBwa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABctV/8aIwD/CBkH/yA7 - bP8kPGr/HjRd/zJHb/8nOFr/CRIn/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARJU7/GjFK/y5Q - jf81Vpb/MVWZ/y5Vn/85Yq//Q2as/zpWjv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDdw/y9X - oP8vVJz/KUyQ/z9lqf9GcLr/OWGv/zhepf8+X5//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBg - sv8uVp//QmCb/2SAt/9bfLv/R2uz/zdbo/8nSIT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAHj5+/zpbnP9FZqn/NFqj/yZOmP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8f8AAOB/ - AADAHwAAgAMAAIABAACAAQAAwAMAAMAHAADIfwAAyH8AAMA/AADgDwAA4A8AAOAPAADgHwAA8H8AACgA - AAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQEC/wICAv8BAgX/BQUH/w8P - AP8DBQr/CBkH/xQcGv8aIwD/IyAA/wkSJ/8NGC//ERsr/xMcK/8OHT//Hi4x/xMiOv8SIT3/EyI+/xUh - PP8gLC7/JS8s/ypTI/8rQDb/PWA5/0FZPf8RKEP/Hi5C/xovR/8TJkv/ESVO/xUoSv8UKE3/GjFK/xMr - Vv8WLFT/Fy1X/xgtUP8eNF3/IDVN/yo9S/80Pkr/JTpT/yc4Wv8lPl//LTla/xk0Yf8bNmj/GDdw/x4+ - fv8kPGr/IDts/yI7c/8tSU3/NEdU/zZMYP8yR2//Mk9t/zZTbv8nSH3/RWBu/0lqaP9KY3T/TGN6/ydI - hP8uTID/LlCN/zpahP8xUYr/OlaO/ylMkP8lTZn/Jk6Y/ytQlf8sU5n/KFGf/y5Vn/8vVJz/Llaf/zVW - lv8zWJX/MVWZ/zBXnf86W5z/Pl+f/yxVov8vV6D/NFqj/zdbo/84XqX/MVqu/z9lqf85Ya//OWKv/zBg - sv87ZrT/S26D/09zj/9QdIb/UXeJ/0Jgm/9McZv/VHmd/0Vmqf9DZqz/R2uz/0Zwuv9bfLv/ZIC3//// - //8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/bm5ubgAAAG5ubm5ubm5ubm5u - biFFQhIAAW5ubm5ubm5ubktMVko1FAAGAG5ubm5ublNIPGJnQC4ABAAAAABubm5gUWRhRD8qAAIAAAAA - AG5uW2ZjOy0rFgABAAAAAABubm46Pj04HQ0DAAAAAABubm5uDxcZGiMTDgAAAABubm5ubiQRbgocHgxu - bm5ubm5ubm4wJm43KSgVbm5ubm5ubm5uLyAFGDYbEAhubm5ubm5ubm4lCQc0Myc5LAtubm5ubm5uHyJD - UFJNXmlGbm5ubm5ubjFXTkdca11aVW5ubm5ubm5fT2VtbGpZQW5ubm5ubm5ubjJUaFhJbm5ubm5ubvH/ - AADgfwAAwB8AAIADAACAAQAAgAEAAMADAADABwAAyH8AAMh/AADAPwAA4A8AAOAPAADgDwAA4B8AAPB/ - AAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs deleted file mode 100644 index c78a658baa..0000000000 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class PCEControllerConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PCEControllerConfig)); - this.CancelBtn = new System.Windows.Forms.Button(); - this.OkBtn = new System.Windows.Forms.Button(); - this.ControllerPropertyGrid = new System.Windows.Forms.PropertyGrid(); - this.SuspendLayout(); - // - // CancelBtn - // - this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(235, 203); - this.CancelBtn.Name = "CancelBtn"; - this.CancelBtn.Size = new System.Drawing.Size(60, 23); - this.CancelBtn.TabIndex = 3; - this.CancelBtn.Text = "&Cancel"; - this.CancelBtn.UseVisualStyleBackColor = true; - this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); - // - // OkBtn - // - this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OkBtn.Location = new System.Drawing.Point(169, 203); - this.OkBtn.Name = "OkBtn"; - this.OkBtn.Size = new System.Drawing.Size(60, 23); - this.OkBtn.TabIndex = 2; - this.OkBtn.Text = "&OK"; - this.OkBtn.UseVisualStyleBackColor = true; - this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click); - // - // ControllerPropertyGrid - // - this.ControllerPropertyGrid.Location = new System.Drawing.Point(12, 12); - this.ControllerPropertyGrid.Name = "ControllerPropertyGrid"; - this.ControllerPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.Alphabetical; - this.ControllerPropertyGrid.Size = new System.Drawing.Size(283, 181); - this.ControllerPropertyGrid.TabIndex = 4; - this.ControllerPropertyGrid.ToolbarVisible = false; - // - // PCEControllerConfig - // - this.AcceptButton = this.OkBtn; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(307, 238); - this.Controls.Add(this.ControllerPropertyGrid); - this.Controls.Add(this.CancelBtn); - this.Controls.Add(this.OkBtn); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PCEControllerConfig"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Controller Settings"; - this.Load += new System.EventHandler(this.PCEControllerConfig_Load); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.Button OkBtn; - private System.Windows.Forms.PropertyGrid ControllerPropertyGrid; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs deleted file mode 100644 index c67095376c..0000000000 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PCEControllerConfig : Form - { - private PCEngine.PCESyncSettings _controllerSettings; - - public PCEControllerConfig() - { - InitializeComponent(); - } - - private void PCEControllerConfig_Load(object sender, EventArgs e) - { - var pceSettings = ((PCEngine)Global.Emulator).GetSyncSettings(); - _controllerSettings = pceSettings; // Assumes only controller data is in sync settings! If there are ever more sync settings, this dialog should just become a general sync settings dialog (or both settings/sync settings) - ControllerPropertyGrid.SelectedObject = _controllerSettings; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - GlobalWin.MainForm.PutCoreSyncSettings(_controllerSettings); - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.resx b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.resx deleted file mode 100644 index 91f294b89b..0000000000 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.Designer.cs deleted file mode 100644 index 7f8e659c38..0000000000 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.Designer.cs +++ /dev/null @@ -1,284 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class PCEGraphicsConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.OK = new System.Windows.Forms.Button(); - this.Cancel = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.DispBG2 = new System.Windows.Forms.CheckBox(); - this.DispOBJ2 = new System.Windows.Forms.CheckBox(); - this.DispBG1 = new System.Windows.Forms.CheckBox(); - this.DispOBJ1 = new System.Windows.Forms.CheckBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label5 = new System.Windows.Forms.Label(); - this.btnAreaFull = new System.Windows.Forms.Button(); - this.btnAreaStandard = new System.Windows.Forms.Button(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.NTSC_LastLineNumeric = new System.Windows.Forms.NumericUpDown(); - this.NTSC_FirstLineNumeric = new System.Windows.Forms.NumericUpDown(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.NTSC_LastLineNumeric)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).BeginInit(); - this.SuspendLayout(); - // - // OK - // - this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.OK.Location = new System.Drawing.Point(205, 279); - this.OK.Name = "OK"; - this.OK.Size = new System.Drawing.Size(75, 23); - this.OK.TabIndex = 4; - this.OK.Text = "&OK"; - this.OK.UseVisualStyleBackColor = true; - this.OK.Click += new System.EventHandler(this.Ok_Click); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(286, 279); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 23); - this.Cancel.TabIndex = 5; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.DispBG2); - this.groupBox1.Controls.Add(this.DispOBJ2); - this.groupBox1.Controls.Add(this.DispBG1); - this.groupBox1.Controls.Add(this.DispOBJ1); - this.groupBox1.Location = new System.Drawing.Point(9, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(352, 73); - this.groupBox1.TabIndex = 2; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Background and Sprites"; - // - // DispBG2 - // - this.DispBG2.AutoSize = true; - this.DispBG2.Checked = true; - this.DispBG2.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispBG2.Location = new System.Drawing.Point(108, 43); - this.DispBG2.Name = "DispBG2"; - this.DispBG2.Size = new System.Drawing.Size(84, 17); - this.DispBG2.TabIndex = 3; - this.DispBG2.Text = "Display BG2"; - this.DispBG2.UseVisualStyleBackColor = true; - // - // DispOBJ2 - // - this.DispOBJ2.AutoSize = true; - this.DispOBJ2.Checked = true; - this.DispOBJ2.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispOBJ2.Location = new System.Drawing.Point(108, 21); - this.DispOBJ2.Name = "DispOBJ2"; - this.DispOBJ2.Size = new System.Drawing.Size(89, 17); - this.DispOBJ2.TabIndex = 2; - this.DispOBJ2.Text = "Display OBJ2"; - this.DispOBJ2.UseVisualStyleBackColor = true; - // - // DispBG1 - // - this.DispBG1.AutoSize = true; - this.DispBG1.Checked = true; - this.DispBG1.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispBG1.Location = new System.Drawing.Point(9, 43); - this.DispBG1.Name = "DispBG1"; - this.DispBG1.Size = new System.Drawing.Size(84, 17); - this.DispBG1.TabIndex = 1; - this.DispBG1.Text = "Display BG1"; - this.DispBG1.UseVisualStyleBackColor = true; - // - // DispOBJ1 - // - this.DispOBJ1.AutoSize = true; - this.DispOBJ1.Checked = true; - this.DispOBJ1.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispOBJ1.Location = new System.Drawing.Point(9, 21); - this.DispOBJ1.Name = "DispOBJ1"; - this.DispOBJ1.Size = new System.Drawing.Size(89, 17); - this.DispOBJ1.TabIndex = 0; - this.DispOBJ1.Text = "Display OBJ1"; - this.DispOBJ1.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.label5); - this.groupBox2.Controls.Add(this.btnAreaFull); - this.groupBox2.Controls.Add(this.btnAreaStandard); - this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Controls.Add(this.NTSC_LastLineNumeric); - this.groupBox2.Controls.Add(this.NTSC_FirstLineNumeric); - this.groupBox2.Location = new System.Drawing.Point(9, 100); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(352, 150); - this.groupBox2.TabIndex = 6; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Drawing Area"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(62, 22); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(36, 13); - this.label5.TabIndex = 41; - this.label5.Text = "NTSC"; - // - // btnAreaFull - // - this.btnAreaFull.Location = new System.Drawing.Point(6, 115); - this.btnAreaFull.Name = "btnAreaFull"; - this.btnAreaFull.Size = new System.Drawing.Size(100, 23); - this.btnAreaFull.TabIndex = 40; - this.btnAreaFull.Text = "Full [0,262]"; - this.btnAreaFull.UseVisualStyleBackColor = true; - this.btnAreaFull.Click += new System.EventHandler(this.BtnAreaFull_Click); - // - // btnAreaStandard - // - this.btnAreaStandard.Location = new System.Drawing.Point(6, 92); - this.btnAreaStandard.Name = "btnAreaStandard"; - this.btnAreaStandard.Size = new System.Drawing.Size(100, 23); - this.btnAreaStandard.TabIndex = 35; - this.btnAreaStandard.Text = "Standard [18,252]"; - this.btnAreaStandard.UseVisualStyleBackColor = true; - this.btnAreaStandard.Click += new System.EventHandler(this.BtnAreaStandard_Click); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(4, 69); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(49, 13); - this.label4.TabIndex = 24; - this.label4.Text = "Last line:"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(5, 43); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(48, 13); - this.label3.TabIndex = 23; - this.label3.Text = "First line:"; - // - // NTSC_LastLineNumeric - // - this.NTSC_LastLineNumeric.Location = new System.Drawing.Point(59, 67); - this.NTSC_LastLineNumeric.Maximum = new decimal(new int[] { - 262, - 0, - 0, - 0}); - this.NTSC_LastLineNumeric.Minimum = new decimal(new int[] { - 128, - 0, - 0, - 0}); - this.NTSC_LastLineNumeric.Name = "NTSC_LastLineNumeric"; - this.NTSC_LastLineNumeric.Size = new System.Drawing.Size(47, 20); - this.NTSC_LastLineNumeric.TabIndex = 28; - this.NTSC_LastLineNumeric.Value = new decimal(new int[] { - 128, - 0, - 0, - 0}); - // - // NTSC_FirstLineNumeric - // - this.NTSC_FirstLineNumeric.Location = new System.Drawing.Point(59, 41); - this.NTSC_FirstLineNumeric.Maximum = new decimal(new int[] { - 127, - 0, - 0, - 0}); - this.NTSC_FirstLineNumeric.Name = "NTSC_FirstLineNumeric"; - this.NTSC_FirstLineNumeric.Size = new System.Drawing.Size(47, 20); - this.NTSC_FirstLineNumeric.TabIndex = 21; - // - // PCEGraphicsConfig - // - this.AcceptButton = this.OK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(373, 311); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.Cancel); - this.Controls.Add(this.OK); - this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(389, 433); - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(389, 166); - this.Name = "PCEGraphicsConfig"; - this.ShowIcon = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "PC Engine Graphics Settings"; - this.Load += new System.EventHandler(this.PCEGraphicsConfig_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.NTSC_LastLineNumeric)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button OK; - private System.Windows.Forms.Button Cancel; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.CheckBox DispBG2; - private System.Windows.Forms.CheckBox DispOBJ2; - private System.Windows.Forms.CheckBox DispBG1; - private System.Windows.Forms.CheckBox DispOBJ1; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Button btnAreaFull; - private System.Windows.Forms.Button btnAreaStandard; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.NumericUpDown NTSC_LastLineNumeric; - private System.Windows.Forms.NumericUpDown NTSC_FirstLineNumeric; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.cs deleted file mode 100644 index fd08ec4724..0000000000 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEGraphicsConfig.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.PCEngine; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PCEGraphicsConfig : Form - { - public PCEGraphicsConfig() - { - InitializeComponent(); - } - - private void PCEGraphicsConfig_Load(object sender, EventArgs e) - { - PCEngine.PCESettings s = ((PCEngine)Global.Emulator).GetSettings(); - - DispOBJ1.Checked = s.ShowOBJ1; - DispBG1.Checked = s.ShowBG1; - DispOBJ2.Checked = s.ShowOBJ2; - DispBG2.Checked = s.ShowBG2; - NTSC_FirstLineNumeric.Value = s.Top_Line; - NTSC_LastLineNumeric.Value = s.Bottom_Line; - } - - private void Ok_Click(object sender, EventArgs e) - { - var pce = (PCEngine)Global.Emulator; - PCEngine.PCESettings s = pce.GetSettings(); - s.ShowOBJ1 = DispOBJ1.Checked; - s.ShowBG1 = DispBG1.Checked; - s.ShowOBJ2 = DispOBJ2.Checked; - s.ShowBG2 = DispBG2.Checked; - s.Top_Line = (int)NTSC_FirstLineNumeric.Value; - s.Bottom_Line = (int)NTSC_LastLineNumeric.Value; - pce.PutSettings(s); - Close(); - } - - private void BtnAreaStandard_Click(object sender, EventArgs e) - { - NTSC_FirstLineNumeric.Value = 18; - NTSC_LastLineNumeric.Value = 252; - } - - private void BtnAreaFull_Click(object sender, EventArgs e) - { - NTSC_FirstLineNumeric.Value = 0; - NTSC_LastLineNumeric.Value = 262; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.Designer.cs b/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.Designer.cs deleted file mode 100644 index cc22a8f3d1..0000000000 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.Designer.cs +++ /dev/null @@ -1,481 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class PSXControllerConfigNew - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PSXControllerConfigNew)); - this.cbMultitap_1 = new System.Windows.Forms.CheckBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.lbl_p_1_4 = new System.Windows.Forms.Label(); - this.lbl_p_1_3 = new System.Windows.Forms.Label(); - this.lbl_p_1_2 = new System.Windows.Forms.Label(); - this.lbl_p_1_1 = new System.Windows.Forms.Label(); - this.lbl_1_4 = new System.Windows.Forms.Label(); - this.lbl_1_3 = new System.Windows.Forms.Label(); - this.lbl_1_2 = new System.Windows.Forms.Label(); - this.lbl_1_1 = new System.Windows.Forms.Label(); - this.combo_1_4 = new System.Windows.Forms.ComboBox(); - this.combo_1_3 = new System.Windows.Forms.ComboBox(); - this.combo_1_2 = new System.Windows.Forms.ComboBox(); - this.combo_1_1 = new System.Windows.Forms.ComboBox(); - this.cbMemcard_1 = new System.Windows.Forms.CheckBox(); - this.btnOK = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.lbl_p_2_4 = new System.Windows.Forms.Label(); - this.lbl_p_2_3 = new System.Windows.Forms.Label(); - this.lbl_p_2_2 = new System.Windows.Forms.Label(); - this.lbl_p_2_1 = new System.Windows.Forms.Label(); - this.lbl_2_4 = new System.Windows.Forms.Label(); - this.lbl_2_3 = new System.Windows.Forms.Label(); - this.lbl_2_2 = new System.Windows.Forms.Label(); - this.lbl_2_1 = new System.Windows.Forms.Label(); - this.combo_2_4 = new System.Windows.Forms.ComboBox(); - this.combo_2_3 = new System.Windows.Forms.ComboBox(); - this.combo_2_2 = new System.Windows.Forms.ComboBox(); - this.combo_2_1 = new System.Windows.Forms.ComboBox(); - this.cbMemcard_2 = new System.Windows.Forms.CheckBox(); - this.cbMultitap_2 = new System.Windows.Forms.CheckBox(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // cbMultitap_1 - // - this.cbMultitap_1.AutoSize = true; - this.cbMultitap_1.Location = new System.Drawing.Point(18, 43); - this.cbMultitap_1.Name = "cbMultitap_1"; - this.cbMultitap_1.Size = new System.Drawing.Size(63, 17); - this.cbMultitap_1.TabIndex = 0; - this.cbMultitap_1.Text = "Multitap"; - this.cbMultitap_1.UseVisualStyleBackColor = true; - this.cbMultitap_1.CheckedChanged += new System.EventHandler(this.Cb_Changed); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.lbl_p_1_4); - this.groupBox1.Controls.Add(this.lbl_p_1_3); - this.groupBox1.Controls.Add(this.lbl_p_1_2); - this.groupBox1.Controls.Add(this.lbl_p_1_1); - this.groupBox1.Controls.Add(this.lbl_1_4); - this.groupBox1.Controls.Add(this.lbl_1_3); - this.groupBox1.Controls.Add(this.lbl_1_2); - this.groupBox1.Controls.Add(this.lbl_1_1); - this.groupBox1.Controls.Add(this.combo_1_4); - this.groupBox1.Controls.Add(this.combo_1_3); - this.groupBox1.Controls.Add(this.combo_1_2); - this.groupBox1.Controls.Add(this.combo_1_1); - this.groupBox1.Controls.Add(this.cbMemcard_1); - this.groupBox1.Controls.Add(this.cbMultitap_1); - this.groupBox1.Location = new System.Drawing.Point(12, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(273, 136); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Port 1"; - // - // lbl_p_1_4 - // - this.lbl_p_1_4.AutoSize = true; - this.lbl_p_1_4.Location = new System.Drawing.Point(241, 105); - this.lbl_p_1_4.Name = "lbl_p_1_4"; - this.lbl_p_1_4.Size = new System.Drawing.Size(20, 13); - this.lbl_p_1_4.TabIndex = 12; - this.lbl_p_1_4.Text = "P1"; - this.lbl_p_1_4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_1_3 - // - this.lbl_p_1_3.AutoSize = true; - this.lbl_p_1_3.Location = new System.Drawing.Point(241, 78); - this.lbl_p_1_3.Name = "lbl_p_1_3"; - this.lbl_p_1_3.Size = new System.Drawing.Size(20, 13); - this.lbl_p_1_3.TabIndex = 11; - this.lbl_p_1_3.Text = "P1"; - this.lbl_p_1_3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_1_2 - // - this.lbl_p_1_2.AutoSize = true; - this.lbl_p_1_2.Location = new System.Drawing.Point(241, 50); - this.lbl_p_1_2.Name = "lbl_p_1_2"; - this.lbl_p_1_2.Size = new System.Drawing.Size(20, 13); - this.lbl_p_1_2.TabIndex = 10; - this.lbl_p_1_2.Text = "P1"; - this.lbl_p_1_2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_1_1 - // - this.lbl_p_1_1.AutoSize = true; - this.lbl_p_1_1.Location = new System.Drawing.Point(241, 24); - this.lbl_p_1_1.Name = "lbl_p_1_1"; - this.lbl_p_1_1.Size = new System.Drawing.Size(20, 13); - this.lbl_p_1_1.TabIndex = 9; - this.lbl_p_1_1.Text = "P1"; - this.lbl_p_1_1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_1_4 - // - this.lbl_1_4.AutoSize = true; - this.lbl_1_4.Location = new System.Drawing.Point(94, 105); - this.lbl_1_4.Name = "lbl_1_4"; - this.lbl_1_4.Size = new System.Drawing.Size(15, 13); - this.lbl_1_4.TabIndex = 8; - this.lbl_1_4.Text = "D"; - this.lbl_1_4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_1_3 - // - this.lbl_1_3.AutoSize = true; - this.lbl_1_3.Location = new System.Drawing.Point(94, 78); - this.lbl_1_3.Name = "lbl_1_3"; - this.lbl_1_3.Size = new System.Drawing.Size(14, 13); - this.lbl_1_3.TabIndex = 7; - this.lbl_1_3.Text = "C"; - this.lbl_1_3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_1_2 - // - this.lbl_1_2.AutoSize = true; - this.lbl_1_2.Location = new System.Drawing.Point(94, 51); - this.lbl_1_2.Name = "lbl_1_2"; - this.lbl_1_2.Size = new System.Drawing.Size(14, 13); - this.lbl_1_2.TabIndex = 6; - this.lbl_1_2.Text = "B"; - this.lbl_1_2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_1_1 - // - this.lbl_1_1.AutoSize = true; - this.lbl_1_1.Location = new System.Drawing.Point(94, 24); - this.lbl_1_1.Name = "lbl_1_1"; - this.lbl_1_1.Size = new System.Drawing.Size(14, 13); - this.lbl_1_1.TabIndex = 2; - this.lbl_1_1.Text = "A"; - this.lbl_1_1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // combo_1_4 - // - this.combo_1_4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_1_4.FormattingEnabled = true; - this.combo_1_4.Location = new System.Drawing.Point(114, 102); - this.combo_1_4.Name = "combo_1_4"; - this.combo_1_4.Size = new System.Drawing.Size(121, 21); - this.combo_1_4.TabIndex = 5; - this.combo_1_4.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_1_3 - // - this.combo_1_3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_1_3.FormattingEnabled = true; - this.combo_1_3.Location = new System.Drawing.Point(114, 75); - this.combo_1_3.Name = "combo_1_3"; - this.combo_1_3.Size = new System.Drawing.Size(121, 21); - this.combo_1_3.TabIndex = 4; - this.combo_1_3.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_1_2 - // - this.combo_1_2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_1_2.FormattingEnabled = true; - this.combo_1_2.Location = new System.Drawing.Point(114, 48); - this.combo_1_2.Name = "combo_1_2"; - this.combo_1_2.Size = new System.Drawing.Size(121, 21); - this.combo_1_2.TabIndex = 3; - this.combo_1_2.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_1_1 - // - this.combo_1_1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_1_1.FormattingEnabled = true; - this.combo_1_1.Location = new System.Drawing.Point(114, 21); - this.combo_1_1.Name = "combo_1_1"; - this.combo_1_1.Size = new System.Drawing.Size(121, 21); - this.combo_1_1.TabIndex = 2; - this.combo_1_1.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // cbMemcard_1 - // - this.cbMemcard_1.AutoSize = true; - this.cbMemcard_1.Location = new System.Drawing.Point(18, 21); - this.cbMemcard_1.Name = "cbMemcard_1"; - this.cbMemcard_1.Size = new System.Drawing.Size(70, 17); - this.cbMemcard_1.TabIndex = 1; - this.cbMemcard_1.Text = "Memcard"; - this.cbMemcard_1.UseVisualStyleBackColor = true; - this.cbMemcard_1.CheckedChanged += new System.EventHandler(this.Cb_Changed); - // - // btnOK - // - this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.btnOK.Location = new System.Drawing.Point(408, 163); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 2; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.BtnOk_Click); - // - // btnCancel - // - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(489, 163); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 3; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.lbl_p_2_4); - this.groupBox2.Controls.Add(this.lbl_p_2_3); - this.groupBox2.Controls.Add(this.lbl_p_2_2); - this.groupBox2.Controls.Add(this.lbl_p_2_1); - this.groupBox2.Controls.Add(this.lbl_2_4); - this.groupBox2.Controls.Add(this.lbl_2_3); - this.groupBox2.Controls.Add(this.lbl_2_2); - this.groupBox2.Controls.Add(this.lbl_2_1); - this.groupBox2.Controls.Add(this.combo_2_4); - this.groupBox2.Controls.Add(this.combo_2_3); - this.groupBox2.Controls.Add(this.combo_2_2); - this.groupBox2.Controls.Add(this.combo_2_1); - this.groupBox2.Controls.Add(this.cbMemcard_2); - this.groupBox2.Controls.Add(this.cbMultitap_2); - this.groupBox2.Location = new System.Drawing.Point(291, 12); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(273, 136); - this.groupBox2.TabIndex = 13; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Port 2"; - // - // lbl_p_2_4 - // - this.lbl_p_2_4.AutoSize = true; - this.lbl_p_2_4.Location = new System.Drawing.Point(241, 105); - this.lbl_p_2_4.Name = "lbl_p_2_4"; - this.lbl_p_2_4.Size = new System.Drawing.Size(20, 13); - this.lbl_p_2_4.TabIndex = 12; - this.lbl_p_2_4.Text = "P1"; - this.lbl_p_2_4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_2_3 - // - this.lbl_p_2_3.AutoSize = true; - this.lbl_p_2_3.Location = new System.Drawing.Point(241, 78); - this.lbl_p_2_3.Name = "lbl_p_2_3"; - this.lbl_p_2_3.Size = new System.Drawing.Size(20, 13); - this.lbl_p_2_3.TabIndex = 11; - this.lbl_p_2_3.Text = "P1"; - this.lbl_p_2_3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_2_2 - // - this.lbl_p_2_2.AutoSize = true; - this.lbl_p_2_2.Location = new System.Drawing.Point(241, 50); - this.lbl_p_2_2.Name = "lbl_p_2_2"; - this.lbl_p_2_2.Size = new System.Drawing.Size(20, 13); - this.lbl_p_2_2.TabIndex = 10; - this.lbl_p_2_2.Text = "P1"; - this.lbl_p_2_2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_p_2_1 - // - this.lbl_p_2_1.AutoSize = true; - this.lbl_p_2_1.Location = new System.Drawing.Point(241, 24); - this.lbl_p_2_1.Name = "lbl_p_2_1"; - this.lbl_p_2_1.Size = new System.Drawing.Size(20, 13); - this.lbl_p_2_1.TabIndex = 9; - this.lbl_p_2_1.Text = "P1"; - this.lbl_p_2_1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_2_4 - // - this.lbl_2_4.AutoSize = true; - this.lbl_2_4.Location = new System.Drawing.Point(94, 105); - this.lbl_2_4.Name = "lbl_2_4"; - this.lbl_2_4.Size = new System.Drawing.Size(15, 13); - this.lbl_2_4.TabIndex = 8; - this.lbl_2_4.Text = "D"; - this.lbl_2_4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_2_3 - // - this.lbl_2_3.AutoSize = true; - this.lbl_2_3.Location = new System.Drawing.Point(94, 78); - this.lbl_2_3.Name = "lbl_2_3"; - this.lbl_2_3.Size = new System.Drawing.Size(14, 13); - this.lbl_2_3.TabIndex = 7; - this.lbl_2_3.Text = "C"; - this.lbl_2_3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_2_2 - // - this.lbl_2_2.AutoSize = true; - this.lbl_2_2.Location = new System.Drawing.Point(94, 51); - this.lbl_2_2.Name = "lbl_2_2"; - this.lbl_2_2.Size = new System.Drawing.Size(14, 13); - this.lbl_2_2.TabIndex = 6; - this.lbl_2_2.Text = "B"; - this.lbl_2_2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // lbl_2_1 - // - this.lbl_2_1.AutoSize = true; - this.lbl_2_1.Location = new System.Drawing.Point(94, 24); - this.lbl_2_1.Name = "lbl_2_1"; - this.lbl_2_1.Size = new System.Drawing.Size(14, 13); - this.lbl_2_1.TabIndex = 2; - this.lbl_2_1.Text = "A"; - this.lbl_2_1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // combo_2_4 - // - this.combo_2_4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_2_4.FormattingEnabled = true; - this.combo_2_4.Location = new System.Drawing.Point(114, 102); - this.combo_2_4.Name = "combo_2_4"; - this.combo_2_4.Size = new System.Drawing.Size(121, 21); - this.combo_2_4.TabIndex = 5; - this.combo_2_4.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_2_3 - // - this.combo_2_3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_2_3.FormattingEnabled = true; - this.combo_2_3.Location = new System.Drawing.Point(114, 75); - this.combo_2_3.Name = "combo_2_3"; - this.combo_2_3.Size = new System.Drawing.Size(121, 21); - this.combo_2_3.TabIndex = 4; - this.combo_2_3.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_2_2 - // - this.combo_2_2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_2_2.FormattingEnabled = true; - this.combo_2_2.Location = new System.Drawing.Point(114, 48); - this.combo_2_2.Name = "combo_2_2"; - this.combo_2_2.Size = new System.Drawing.Size(121, 21); - this.combo_2_2.TabIndex = 3; - this.combo_2_2.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // combo_2_1 - // - this.combo_2_1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.combo_2_1.FormattingEnabled = true; - this.combo_2_1.Location = new System.Drawing.Point(114, 21); - this.combo_2_1.Name = "combo_2_1"; - this.combo_2_1.Size = new System.Drawing.Size(121, 21); - this.combo_2_1.TabIndex = 2; - this.combo_2_1.SelectedIndexChanged += new System.EventHandler(this.Combo_SelectedIndexChanged); - // - // cbMemcard_2 - // - this.cbMemcard_2.AutoSize = true; - this.cbMemcard_2.Location = new System.Drawing.Point(18, 21); - this.cbMemcard_2.Name = "cbMemcard_2"; - this.cbMemcard_2.Size = new System.Drawing.Size(70, 17); - this.cbMemcard_2.TabIndex = 1; - this.cbMemcard_2.Text = "Memcard"; - this.cbMemcard_2.UseVisualStyleBackColor = true; - this.cbMemcard_2.CheckedChanged += new System.EventHandler(this.Cb_Changed); - // - // cbMultitap_2 - // - this.cbMultitap_2.AutoSize = true; - this.cbMultitap_2.Location = new System.Drawing.Point(18, 43); - this.cbMultitap_2.Name = "cbMultitap_2"; - this.cbMultitap_2.Size = new System.Drawing.Size(63, 17); - this.cbMultitap_2.TabIndex = 0; - this.cbMultitap_2.Text = "Multitap"; - this.cbMultitap_2.UseVisualStyleBackColor = true; - this.cbMultitap_2.CheckedChanged += new System.EventHandler(this.Cb_Changed); - // - // PSXControllerConfigNew - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(586, 201); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.groupBox1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PSXControllerConfigNew"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Controller / Memcard Configuration"; - this.Load += new System.EventHandler(this.PSXControllerConfigNew_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.CheckBox cbMultitap_1; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label lbl_p_1_4; - private System.Windows.Forms.Label lbl_p_1_3; - private System.Windows.Forms.Label lbl_p_1_2; - private System.Windows.Forms.Label lbl_p_1_1; - private System.Windows.Forms.Label lbl_1_4; - private System.Windows.Forms.Label lbl_1_3; - private System.Windows.Forms.Label lbl_1_2; - private System.Windows.Forms.Label lbl_1_1; - private System.Windows.Forms.ComboBox combo_1_4; - private System.Windows.Forms.ComboBox combo_1_3; - private System.Windows.Forms.ComboBox combo_1_2; - private System.Windows.Forms.ComboBox combo_1_1; - private System.Windows.Forms.CheckBox cbMemcard_1; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label lbl_p_2_4; - private System.Windows.Forms.Label lbl_p_2_3; - private System.Windows.Forms.Label lbl_p_2_2; - private System.Windows.Forms.Label lbl_p_2_1; - private System.Windows.Forms.Label lbl_2_4; - private System.Windows.Forms.Label lbl_2_3; - private System.Windows.Forms.Label lbl_2_2; - private System.Windows.Forms.Label lbl_2_1; - private System.Windows.Forms.ComboBox combo_2_4; - private System.Windows.Forms.ComboBox combo_2_3; - private System.Windows.Forms.ComboBox combo_2_2; - private System.Windows.Forms.ComboBox combo_2_1; - private System.Windows.Forms.CheckBox cbMemcard_2; - private System.Windows.Forms.CheckBox cbMultitap_2; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.cs b/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.cs deleted file mode 100644 index a90dfaa146..0000000000 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Emulation.Cores.Sony.PSX; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PSXControllerConfigNew : Form - { - public PSXControllerConfigNew() - { - InitializeComponent(); - } - - private void PSXControllerConfigNew_Load(object sender, EventArgs e) - { - // populate combo boxes - foreach (var combo in new[] { combo_1_1, combo_1_2, combo_1_3, combo_1_4, combo_2_1, combo_2_2, combo_2_3, combo_2_4 }) - { - combo.Items.Add("-Nothing-"); - combo.Items.Add("Gamepad"); - combo.Items.Add("Dual Shock"); - combo.Items.Add("Dual Analog"); - combo.Items.Add("neGcon"); - combo.SelectedIndex = 0; - } - - var psxSettings = ((Octoshock)Global.Emulator).GetSyncSettings(); - GuiFromUserConfig(psxSettings.FIOConfig); - - RefreshLabels(); - } - - private void GuiFromUserConfig(OctoshockFIOConfigUser user) - { - cbMemcard_1.Checked = user.Memcards[0]; - cbMemcard_2.Checked = user.Memcards[1]; - cbMultitap_1.Checked = user.Multitaps[0]; - cbMultitap_2.Checked = user.Multitaps[1]; - - var combos = new[] { combo_1_1, combo_1_2, combo_1_3, combo_1_4, combo_2_1, combo_2_2, combo_2_3, combo_2_4 }; - for (int i = 0; i < 8; i++) - { - var combo = combos[i]; - if (user.Devices8[i] == OctoshockDll.ePeripheralType.None) combo.SelectedIndex = 0; - if (user.Devices8[i] == OctoshockDll.ePeripheralType.Pad) combo.SelectedIndex = 1; - if (user.Devices8[i] == OctoshockDll.ePeripheralType.DualShock) combo.SelectedIndex = 2; - if (user.Devices8[i] == OctoshockDll.ePeripheralType.DualAnalog) combo.SelectedIndex = 3; - if (user.Devices8[i] == OctoshockDll.ePeripheralType.NegCon) combo.SelectedIndex = 4; - } - } - - private OctoshockFIOConfigUser UserConfigFromGui() - { - var uc = new OctoshockFIOConfigUser - { - Memcards = { [0] = cbMemcard_1.Checked, [1] = cbMemcard_2.Checked }, - Multitaps = { [0] = cbMultitap_1.Checked, [1] = cbMultitap_2.Checked } - }; - - var combos = new[] { combo_1_1, combo_1_2, combo_1_3, combo_1_4, combo_2_1, combo_2_2, combo_2_3, combo_2_4 }; - for (int i = 0; i < 8; i++) - { - var combo = combos[i]; - if (combo.SelectedIndex == 0) uc.Devices8[i] = OctoshockDll.ePeripheralType.None; - if (combo.SelectedIndex == 1) uc.Devices8[i] = OctoshockDll.ePeripheralType.Pad; - if (combo.SelectedIndex == 2) uc.Devices8[i] = OctoshockDll.ePeripheralType.DualShock; - if (combo.SelectedIndex == 3) uc.Devices8[i] = OctoshockDll.ePeripheralType.DualAnalog; - if (combo.SelectedIndex == 4) uc.Devices8[i] = OctoshockDll.ePeripheralType.NegCon; - } - - return uc; - } - - private void RefreshLabels() - { - var uc = UserConfigFromGui(); - - bool b1 = uc.Multitaps[0]; - lbl_1_1.Visible = b1; - lbl_1_2.Visible = b1; - lbl_1_3.Visible = b1; - lbl_1_4.Visible = b1; - combo_1_2.Enabled = b1; - combo_1_3.Enabled = b1; - combo_1_4.Enabled = b1; - lbl_p_1_2.Visible = b1; - lbl_p_1_3.Visible = b1; - lbl_p_1_4.Visible = b1; - - bool b2 = uc.Multitaps[1]; - lbl_2_1.Visible = b2; - lbl_2_2.Visible = b2; - lbl_2_3.Visible = b2; - lbl_2_4.Visible = b2; - combo_2_2.Enabled = b2; - combo_2_3.Enabled = b2; - combo_2_4.Enabled = b2; - lbl_p_2_2.Visible = b2; - lbl_p_2_3.Visible = b2; - lbl_p_2_4.Visible = b2; - - var lc = uc.ToLogical(); - - var pLabels = new[] { lbl_p_1_1, lbl_p_1_2, lbl_p_1_3, lbl_p_1_4, lbl_p_2_1, lbl_p_2_2, lbl_p_2_3, lbl_p_2_4 }; - for (int i = 0; i < 8; i++) - { - var lbl = pLabels[i]; - if (lc.PlayerAssignments[i] == -1) - { - lbl.Visible = false; - } - else - { - lbl.Text = "P" + lc.PlayerAssignments[i]; - lbl.Visible = true; - } - } - } - - private void Cb_Changed(object sender, EventArgs e) - { - RefreshLabels(); - } - - private void Combo_SelectedIndexChanged(object sender, EventArgs e) - { - RefreshLabels(); - } - - private void BtnOk_Click(object sender, EventArgs e) - { - var psxSettings = ((Octoshock)Global.Emulator).GetSyncSettings(); - - psxSettings.FIOConfig = UserConfigFromGui(); - GlobalWin.MainForm.PutCoreSyncSettings(psxSettings); - - DialogResult = DialogResult.OK; - - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.resx b/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.resx deleted file mode 100644 index 91f294b89b..0000000000 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXControllerConfigNew.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXHashDiscs.cs b/BizHawk.Client.EmuHawk/config/PSX/PSXHashDiscs.cs deleted file mode 100644 index 82f31693da..0000000000 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXHashDiscs.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.DiscSystem; -using BizHawk.Emulation.Cores.Sony.PSX; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PSXHashDiscs : Form - { - public PSXHashDiscs() - { - InitializeComponent(); - } - - private void BtnHash_Click(object sender, EventArgs e) - { - txtHashes.Text = ""; - btnHash.Enabled = false; - try - { - var psx = (Octoshock)Global.Emulator; - foreach (var disc in psx.Discs) - { - DiscHasher hasher = new DiscHasher(disc); - uint hash = hasher.Calculate_PSX_RedumpHash(); - txtHashes.Text += $"{hash:X8} {disc.Name}\r\n"; - } - } - finally - { - btnHash.Enabled = true; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/PathConfig.cs b/BizHawk.Client.EmuHawk/config/PathConfig.cs deleted file mode 100644 index 6c7ef17e6b..0000000000 --- a/BizHawk.Client.EmuHawk/config/PathConfig.cs +++ /dev/null @@ -1,327 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PathConfig : Form - { - // All path text boxes should do some kind of error checking - // Config path under base, config will default to %exe% - private void LockDownCores() - { - if (VersionInfo.DeveloperBuild) - { - return; - } - - string[] coresToHide = { }; - - foreach (var core in coresToHide) - { - PathTabControl.TabPages.Remove( - PathTabControl.TabPages().FirstOrDefault(tp => tp.Name == core) ?? new TabPage()); - } - } - - private static AutoCompleteStringCollection AutoCompleteOptions => new AutoCompleteStringCollection - { - "%recent%", - "%exe%", - "%rom%", - ".\\", - "..\\", - }; - - public PathConfig() - { - InitializeComponent(); - } - - private void LoadSettings() - { - RecentForROMs.Checked = Global.Config.UseRecentForROMs; - - DoTabs(Global.Config.PathEntries.ToList()); - SetDefaultFocusedTab(); - DoRomToggle(); - } - - private void SetDefaultFocusedTab() - { - var tab = FindTabByName(Global.Game.System); - if (tab != null) - { - PathTabControl.SelectTab(tab); - } - } - - private TabPage FindTabByName(string name) - { - var global = PathTabControl.TabPages - .OfType() - .First(tp => tp.Name.ToUpper().Contains("GLOBAL")); - - return PathTabControl.TabPages - .OfType() - .FirstOrDefault(tp => tp.Name.ToUpper().StartsWith(name.ToUpper())) - ?? global; - } - - private void DoTabs(List pathCollection) - { - PathTabControl.Visible = false; - PathTabControl.TabPages.Clear(); - - // Separate by system - var systems = Global.Config.PathEntries - .Select(s => s.SystemDisplayName) - .Distinct() - .ToList(); - systems.Sort(); - - // Hacky way to put global first - var global = systems.FirstOrDefault(s => s == "Global"); - systems.Remove(global); - systems.Insert(0, global); - - var tabPages = new List(systems.Count); - - int x = UIHelper.ScaleX(6); - int textboxWidth = UIHelper.ScaleX(70); - int padding = UIHelper.ScaleX(5); - int buttonWidth = UIHelper.ScaleX(26); - int buttonHeight = UIHelper.ScaleY(23); - int buttonOffsetY = -1; // To align the top with the textbox I guess? Always 1 pixel regardless of scaling. - int widgetOffset = UIHelper.ScaleX(85); - int rowHeight = UIHelper.ScaleY(30); - - foreach (var systemDisplayName in systems) - { - var systemId = Global.Config.PathEntries.First(p => p.SystemDisplayName == systemDisplayName).System; - var t = new TabPage - { - Text = systemDisplayName, - Name = systemId, - Width = UIHelper.ScaleX(200), // Initial Left/Width of child controls are based on this size. - AutoScroll = true - }; - var paths = pathCollection - .Where(p => p.System == systemId) - .OrderBy(p => p.Ordinal) - .ThenBy(p => p.Type) - .ToList(); - - var y = UIHelper.ScaleY(14); - foreach (var path in paths) - { - var box = new TextBox - { - Text = path.Path, - Location = new Point(x, y), - Width = textboxWidth, - Name = path.Type, - Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right, - MinimumSize = new Size(UIHelper.ScaleX(26), UIHelper.ScaleY(23)), - AutoCompleteMode = AutoCompleteMode.SuggestAppend, - AutoCompleteCustomSource = AutoCompleteOptions, - AutoCompleteSource = AutoCompleteSource.CustomSource, - }; - - var btn = new Button - { - Text = "", - Image = Properties.Resources.OpenFile, - Location = new Point(widgetOffset, y + buttonOffsetY), - Size = new Size(buttonWidth, buttonHeight), - Name = path.Type, - Anchor = AnchorStyles.Top | AnchorStyles.Right, - }; - - var tempBox = box; - var tempPath = path.Type; - var tempSystem = path.System; - btn.Click += delegate - { - BrowseFolder(tempBox, tempPath, tempSystem); - }; - - int infoPadding = UIHelper.ScaleX(0); - if (t.Name.Contains("Global") && path.Type == "Firmware") - { - infoPadding = UIHelper.ScaleX(26); - - var firmwareButton = new Button - { - Name = "Global", - Text = "", - Image = Properties.Resources.Help, - Location = new Point(UIHelper.ScaleX(115), y + buttonOffsetY), - Size = new Size(buttonWidth, buttonHeight), - Anchor = AnchorStyles.Top | AnchorStyles.Right - }; - - firmwareButton.Click += delegate - { - if (Owner is FirmwaresConfig) - { - MessageBox.Show("C-C-C-Combo Breaker!", "Nice try, but"); - return; - } - - var f = new FirmwaresConfig { TargetSystem = "Global" }; - f.ShowDialog(this); - }; - - t.Controls.Add(firmwareButton); - } - - var label = new Label - { - Text = path.Type, - Location = new Point(widgetOffset + buttonWidth + padding + infoPadding, y + UIHelper.ScaleY(4)), - Size = new Size(UIHelper.ScaleX(100), UIHelper.ScaleY(15)), - Name = path.Type, - Anchor = AnchorStyles.Top | AnchorStyles.Right, - }; - - t.Controls.Add(label); - t.Controls.Add(btn); - t.Controls.Add(box); - - y += rowHeight; - } - - var sys = systemDisplayName; - if (systemDisplayName == "PCE") // Hack - { - sys = "PCECD"; - } - - tabPages.Add(t); - } - - PathTabControl.TabPages.AddRange(tabPages.ToArray()); - PathTabControl.Visible = true; - } - - private static void BrowseFolder(TextBox box, string name, string system) - { - // Ugly hack, we don't want to pass in the system in for system base and global paths - if (name == "Base" || system == "Global" || system == "Global_NULL") - { - system = null; - } - - var f = new FolderBrowserEx - { - Description = "Set the directory for " + name, - SelectedPath = PathManager.MakeAbsolutePath(box.Text, system) - }; - var result = f.ShowDialog(); - if (result == DialogResult.OK) - { - box.Text = PathManager.TryMakeRelative(f.SelectedPath, system); - } - } - - private void SaveSettings() - { - Global.Config.UseRecentForROMs = RecentForROMs.Checked; - - foreach (var t in AllPathBoxes) - { - var pathEntry = Global.Config.PathEntries.First(p => p.System == t.Parent.Name && p.Type == t.Name); - pathEntry.Path = t.Text; - } - } - - private void DoRomToggle() - { - AllPathControls - .Where(c => c.Name == "ROM") - .ToList() - .ForEach(control => control.Enabled = !RecentForROMs.Checked); - } - - private IEnumerable AllPathBoxes - { - get - { - var allPathBoxes = new List(); - foreach (TabPage tp in PathTabControl.TabPages) - { - allPathBoxes.AddRange(tp.Controls.OfType()); - } - - return allPathBoxes; - } - } - - private IEnumerable AllPathControls - { - get - { - var allPathControls = new List(); - foreach (TabPage tp in PathTabControl.TabPages) - { - allPathControls.AddRange(tp.Controls()); - } - - return allPathControls; - } - } - - #region Events - - private void NewPathConfig_Load(object sender, EventArgs e) - { - LoadSettings(); - LockDownCores(); - } - - private void RecentForRoms_CheckedChanged(object sender, EventArgs e) - { - DoRomToggle(); - } - - private void SpecialCommandsBtn_Click(object sender, EventArgs e) - { - new PathInfo().Show(); - } - - private void SaveBtn_Click(object sender, EventArgs e) - { - SaveSettings(); - } - - private void DefaultsBtn_Click(object sender, EventArgs e) - { - DoTabs(PathEntryCollection.DefaultValues); - SetDefaultFocusedTab(); - } - - private void Ok_Click(object sender, EventArgs e) - { - SaveSettings(); - - PathManager.RefreshTempPath(); - - GlobalWin.OSD.AddMessage("Path settings saved"); - Close(); - } - - private void Cancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Path config aborted"); - Close(); - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/config/ProfileConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/ProfileConfig.Designer.cs deleted file mode 100644 index e7ba5635f5..0000000000 --- a/BizHawk.Client.EmuHawk/config/ProfileConfig.Designer.cs +++ /dev/null @@ -1,267 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class ProfileConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProfileConfig)); - this.OkBtn = new System.Windows.Forms.Button(); - this.CancelBtn = new System.Windows.Forms.Button(); - this.ProfileSelectComboBox = new System.Windows.Forms.ComboBox(); - this.SaveScreenshotStatesCheckBox = new System.Windows.Forms.CheckBox(); - this.SaveLargeScreenshotStatesCheckBox = new System.Windows.Forms.CheckBox(); - this.AllowUDLRCheckBox = new System.Windows.Forms.CheckBox(); - this.ProfileDialogHelpTexBox = new System.Windows.Forms.RichTextBox(); - this.ProfileOptionsLabel = new System.Windows.Forms.Label(); - this.CustomProfileOptionsLabel = new System.Windows.Forms.Label(); - this.N64CoreSettingsLabel = new System.Windows.Forms.Label(); - this.N64CoreTypeComboBox = new System.Windows.Forms.ComboBox(); - this.N64CoreTypeLabel = new System.Windows.Forms.Label(); - this.OtherOptions = new System.Windows.Forms.Label(); - this.AutoCheckForUpdates = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // OkBtn - // - this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OkBtn.Location = new System.Drawing.Point(290, 302); - this.OkBtn.Name = "OkBtn"; - this.OkBtn.Size = new System.Drawing.Size(60, 23); - this.OkBtn.TabIndex = 0; - this.OkBtn.Text = "&OK"; - this.OkBtn.UseVisualStyleBackColor = true; - this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click); - // - // CancelBtn - // - this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(356, 302); - this.CancelBtn.Name = "CancelBtn"; - this.CancelBtn.Size = new System.Drawing.Size(60, 23); - this.CancelBtn.TabIndex = 1; - this.CancelBtn.Text = "&Cancel"; - this.CancelBtn.UseVisualStyleBackColor = true; - this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); - // - // ProfileSelectComboBox - // - this.ProfileSelectComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.ProfileSelectComboBox.FormattingEnabled = true; - this.ProfileSelectComboBox.Items.AddRange(new object[] { - "Casual Gaming", - "Tool-assisted Speedruns", - "N64 Tool-assisted Speedruns", - "Longplays", - "Custom Profile"}); - this.ProfileSelectComboBox.Location = new System.Drawing.Point(12, 27); - this.ProfileSelectComboBox.Name = "ProfileSelectComboBox"; - this.ProfileSelectComboBox.Size = new System.Drawing.Size(156, 21); - this.ProfileSelectComboBox.TabIndex = 4; - // - // SaveScreenshotStatesCheckBox - // - this.SaveScreenshotStatesCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.SaveScreenshotStatesCheckBox.AutoSize = true; - this.SaveScreenshotStatesCheckBox.Location = new System.Drawing.Point(12, 88); - this.SaveScreenshotStatesCheckBox.Name = "SaveScreenshotStatesCheckBox"; - this.SaveScreenshotStatesCheckBox.Size = new System.Drawing.Size(166, 17); - this.SaveScreenshotStatesCheckBox.TabIndex = 6; - this.SaveScreenshotStatesCheckBox.Text = "Save Screenshot With States"; - this.SaveScreenshotStatesCheckBox.UseVisualStyleBackColor = true; - this.SaveScreenshotStatesCheckBox.Visible = false; - this.SaveScreenshotStatesCheckBox.MouseHover += new System.EventHandler(this.SaveScreenshotStatesCheckBox_MouseHover); - // - // SaveLargeScreenshotStatesCheckBox - // - this.SaveLargeScreenshotStatesCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.SaveLargeScreenshotStatesCheckBox.AutoSize = true; - this.SaveLargeScreenshotStatesCheckBox.Location = new System.Drawing.Point(12, 111); - this.SaveLargeScreenshotStatesCheckBox.Name = "SaveLargeScreenshotStatesCheckBox"; - this.SaveLargeScreenshotStatesCheckBox.Size = new System.Drawing.Size(196, 17); - this.SaveLargeScreenshotStatesCheckBox.TabIndex = 7; - this.SaveLargeScreenshotStatesCheckBox.Text = "Save Large Screenshot With States"; - this.SaveLargeScreenshotStatesCheckBox.UseVisualStyleBackColor = true; - this.SaveLargeScreenshotStatesCheckBox.Visible = false; - this.SaveLargeScreenshotStatesCheckBox.MouseHover += new System.EventHandler(this.SaveLargeScreenshotStatesCheckBox_MouseHover); - // - // AllowUDLRCheckBox - // - this.AllowUDLRCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AllowUDLRCheckBox.AutoSize = true; - this.AllowUDLRCheckBox.Location = new System.Drawing.Point(12, 134); - this.AllowUDLRCheckBox.Name = "AllowUDLRCheckBox"; - this.AllowUDLRCheckBox.Size = new System.Drawing.Size(111, 17); - this.AllowUDLRCheckBox.TabIndex = 8; - this.AllowUDLRCheckBox.Text = "Allow U+D or L+R"; - this.AllowUDLRCheckBox.UseVisualStyleBackColor = true; - this.AllowUDLRCheckBox.Visible = false; - this.AllowUDLRCheckBox.MouseHover += new System.EventHandler(this.AllowUDLRCheckBox_MouseHover); - // - // ProfileDialogHelpTexBox - // - this.ProfileDialogHelpTexBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.ProfileDialogHelpTexBox.Location = new System.Drawing.Point(218, 12); - this.ProfileDialogHelpTexBox.Name = "ProfileDialogHelpTexBox"; - this.ProfileDialogHelpTexBox.ReadOnly = true; - this.ProfileDialogHelpTexBox.Size = new System.Drawing.Size(198, 200); - this.ProfileDialogHelpTexBox.TabIndex = 2; - this.ProfileDialogHelpTexBox.Text = resources.GetString("ProfileDialogHelpTexBox.Text"); - // - // ProfileOptionsLabel - // - this.ProfileOptionsLabel.AutoSize = true; - this.ProfileOptionsLabel.Location = new System.Drawing.Point(9, 9); - this.ProfileOptionsLabel.Name = "ProfileOptionsLabel"; - this.ProfileOptionsLabel.Size = new System.Drawing.Size(75, 13); - this.ProfileOptionsLabel.TabIndex = 3; - this.ProfileOptionsLabel.Text = "Profile Options"; - // - // CustomProfileOptionsLabel - // - this.CustomProfileOptionsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.CustomProfileOptionsLabel.AutoSize = true; - this.CustomProfileOptionsLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.CustomProfileOptionsLabel.Location = new System.Drawing.Point(9, 70); - this.CustomProfileOptionsLabel.Name = "CustomProfileOptionsLabel"; - this.CustomProfileOptionsLabel.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.CustomProfileOptionsLabel.Size = new System.Drawing.Size(113, 13); - this.CustomProfileOptionsLabel.TabIndex = 5; - this.CustomProfileOptionsLabel.Text = "Custom Profile Options"; - this.CustomProfileOptionsLabel.Visible = false; - // - // N64CoreSettingsLabel - // - this.N64CoreSettingsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.N64CoreSettingsLabel.AutoSize = true; - this.N64CoreSettingsLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.N64CoreSettingsLabel.Location = new System.Drawing.Point(9, 173); - this.N64CoreSettingsLabel.Name = "N64CoreSettingsLabel"; - this.N64CoreSettingsLabel.Size = new System.Drawing.Size(93, 13); - this.N64CoreSettingsLabel.TabIndex = 9; - this.N64CoreSettingsLabel.Text = "N64 Core Settings"; - this.N64CoreSettingsLabel.Visible = false; - // - // N64CoreTypeComboBox - // - this.N64CoreTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.N64CoreTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.N64CoreTypeComboBox.FormattingEnabled = true; - this.N64CoreTypeComboBox.Items.AddRange(new object[] { - "Pure Interpreter", - "Interpreter", - "Dynarec"}); - this.N64CoreTypeComboBox.Location = new System.Drawing.Point(79, 191); - this.N64CoreTypeComboBox.Name = "N64CoreTypeComboBox"; - this.N64CoreTypeComboBox.Size = new System.Drawing.Size(99, 21); - this.N64CoreTypeComboBox.TabIndex = 11; - this.N64CoreTypeComboBox.Visible = false; - // - // N64CoreTypeLabel - // - this.N64CoreTypeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.N64CoreTypeLabel.AutoSize = true; - this.N64CoreTypeLabel.Location = new System.Drawing.Point(9, 194); - this.N64CoreTypeLabel.Name = "N64CoreTypeLabel"; - this.N64CoreTypeLabel.Size = new System.Drawing.Size(56, 13); - this.N64CoreTypeLabel.TabIndex = 10; - this.N64CoreTypeLabel.Text = "Core Type"; - this.N64CoreTypeLabel.Visible = false; - // - // OtherOptions - // - this.OtherOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.OtherOptions.AutoSize = true; - this.OtherOptions.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.OtherOptions.Location = new System.Drawing.Point(9, 261); - this.OtherOptions.Name = "OtherOptions"; - this.OtherOptions.Size = new System.Drawing.Size(72, 13); - this.OtherOptions.TabIndex = 12; - this.OtherOptions.Text = "Other Options"; - // - // AutoCheckForUpdates - // - this.AutoCheckForUpdates.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AutoCheckForUpdates.AutoSize = true; - this.AutoCheckForUpdates.Location = new System.Drawing.Point(12, 279); - this.AutoCheckForUpdates.Name = "AutoCheckForUpdates"; - this.AutoCheckForUpdates.Size = new System.Drawing.Size(345, 17); - this.AutoCheckForUpdates.TabIndex = 13; - this.AutoCheckForUpdates.Text = "Automatically check for and notify me of newer versions of BizHawk"; - this.AutoCheckForUpdates.UseVisualStyleBackColor = true; - // - // ProfileConfig - // - this.AcceptButton = this.OkBtn; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(428, 337); - this.Controls.Add(this.AutoCheckForUpdates); - this.Controls.Add(this.OtherOptions); - this.Controls.Add(this.N64CoreTypeLabel); - this.Controls.Add(this.N64CoreTypeComboBox); - this.Controls.Add(this.N64CoreSettingsLabel); - this.Controls.Add(this.CustomProfileOptionsLabel); - this.Controls.Add(this.ProfileOptionsLabel); - this.Controls.Add(this.ProfileDialogHelpTexBox); - this.Controls.Add(this.AllowUDLRCheckBox); - this.Controls.Add(this.SaveLargeScreenshotStatesCheckBox); - this.Controls.Add(this.SaveScreenshotStatesCheckBox); - this.Controls.Add(this.ProfileSelectComboBox); - this.Controls.Add(this.CancelBtn); - this.Controls.Add(this.OkBtn); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(315, 280); - this.Name = "ProfileConfig"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Profile Config"; - this.Load += new System.EventHandler(this.ProfileConfig_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button OkBtn; - private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.ComboBox ProfileSelectComboBox; - private System.Windows.Forms.CheckBox SaveScreenshotStatesCheckBox; - private System.Windows.Forms.CheckBox SaveLargeScreenshotStatesCheckBox; - private System.Windows.Forms.CheckBox AllowUDLRCheckBox; - private System.Windows.Forms.RichTextBox ProfileDialogHelpTexBox; - private System.Windows.Forms.Label ProfileOptionsLabel; - private System.Windows.Forms.Label CustomProfileOptionsLabel; - private System.Windows.Forms.Label N64CoreSettingsLabel; - private System.Windows.Forms.ComboBox N64CoreTypeComboBox; - private System.Windows.Forms.Label N64CoreTypeLabel; - private System.Windows.Forms.Label OtherOptions; - private System.Windows.Forms.CheckBox AutoCheckForUpdates; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ProfileConfig.cs b/BizHawk.Client.EmuHawk/config/ProfileConfig.cs deleted file mode 100644 index ddbf3b8fc7..0000000000 --- a/BizHawk.Client.EmuHawk/config/ProfileConfig.cs +++ /dev/null @@ -1,401 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Common; - -using BizHawk.Emulation.Cores.Nintendo.N64; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Sega.Saturn; -using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Cores.ColecoVision; -using BizHawk.Emulation.Cores.Atari.Atari2600; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ProfileConfig : Form - { - public ProfileConfig() - { - InitializeComponent(); - } - - private void ProfileConfig_Load(object sender, EventArgs e) - { - if (!VersionInfo.DeveloperBuild) - { - ProfileSelectComboBox.Items.Remove("Custom Profile"); - } - - switch (Global.Config.SelectedProfile) - { - default: - case Config.ClientProfile.Custom: // For now - case Config.ClientProfile.Casual: - ProfileSelectComboBox.SelectedItem = "Casual Gaming"; - break; - case Config.ClientProfile.Longplay: - ProfileSelectComboBox.SelectedItem = "Longplays"; - break; - case Config.ClientProfile.Tas: - ProfileSelectComboBox.SelectedItem = "Tool-assisted Speedruns"; - break; - case Config.ClientProfile.N64Tas: - ProfileSelectComboBox.SelectedItem = "N64 Tool-assisted Speedruns"; - break; - } - - AutoCheckForUpdates.Checked = Global.Config.Update_AutoCheckEnabled; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - switch (ProfileSelectComboBox.SelectedItem.ToString()) - { - default: - case "Custom Profile": // For now - case "Casual Gaming": - Global.Config.SelectedProfile = Config.ClientProfile.Casual; - break; - case "Longplays": - Global.Config.SelectedProfile = Config.ClientProfile.Longplay; - break; - case "Tool-assisted Speedruns": - Global.Config.SelectedProfile = Config.ClientProfile.Tas; - break; - case "N64 Tool-assisted Speedruns": - Global.Config.SelectedProfile = Config.ClientProfile.N64Tas; - break; - } - - if (Global.Config.SelectedProfile == Config.ClientProfile.Casual) - { - DisplayProfileSettingBoxes(false); - Global.Config.NoLowResLargeScreenshotWithStates = false; - Global.Config.SaveScreenshotWithStates = false; - Global.Config.AllowUD_LR = false; - Global.Config.BackupSavestates = false; - - Global.Config.SaveStateCompressionLevelNormal = 0; - Global.Config.RewindEnabledLarge = false; - Global.Config.RewindEnabledMedium = false; - Global.Config.RewindEnabledSmall = true; - Global.Config.SkipLagFrame = false; - - // N64 - var n64Settings = GetSyncSettings(); - n64Settings.Rsp = N64SyncSettings.RspType.Rsp_Hle; - //n64Settings.Core = N64SyncSettings.CoreType.Dynarec; - n64Settings.Core = N64SyncSettings.CoreType.Interpret; - Global.Config.N64UseCircularAnalogConstraint = true; - PutSyncSettings(n64Settings); - - // SNES - Global.Config.SNES_InSnes9x = true; - - // Genesis - var genesisSettings = GetSyncSettings(); - genesisSettings.Region = LibGPGX.Region.Autodetect; - PutSyncSettings(genesisSettings); - - // SMS - var smsSettings = GetSyncSettings(); - smsSettings.UseBIOS = true; - PutSyncSettings(smsSettings); - - // Coleco - var colecoSettings = GetSyncSettings(); - colecoSettings.SkipBiosIntro = false; - PutSyncSettings(colecoSettings); - - // A2600 - var a2600Settings = GetSyncSettings(); - a2600Settings.FastScBios = true; - a2600Settings.LeftDifficulty = false; - a2600Settings.RightDifficulty = false; - PutSyncSettings(a2600Settings); - - // NES - Global.Config.NES_InQuickNES = true; - } - else if (Global.Config.SelectedProfile == Config.ClientProfile.Longplay) - { - DisplayProfileSettingBoxes(false); - Global.Config.NoLowResLargeScreenshotWithStates = false; - Global.Config.SaveScreenshotWithStates = false; - Global.Config.AllowUD_LR = false; - Global.Config.BackupSavestates = false; - Global.Config.SkipLagFrame = false; - Global.Config.SaveStateCompressionLevelNormal = 5; - - Global.Config.RewindEnabledLarge = false; - Global.Config.RewindEnabledMedium = false; - Global.Config.RewindEnabledSmall = true; - - // N64 - var n64Settings = GetSyncSettings(); - n64Settings.Core = N64SyncSettings.CoreType.Pure_Interpret; - Global.Config.N64UseCircularAnalogConstraint = true; - PutSyncSettings(n64Settings); - - // SNES - Global.Config.SNES_InSnes9x = false; - - // Genesis - var genesisSettings = GetSyncSettings(); - genesisSettings.Region = LibGPGX.Region.Autodetect; - PutSyncSettings(genesisSettings); - - // SMS - var smsSettings = GetSyncSettings(); - smsSettings.UseBIOS = true; - PutSyncSettings(smsSettings); - - // Coleco - var colecoSettings = GetSyncSettings(); - colecoSettings.SkipBiosIntro = false; - PutSyncSettings(colecoSettings); - - // A2600 - var a2600Settings = GetSyncSettings(); - a2600Settings.FastScBios = false; - a2600Settings.LeftDifficulty = true; - a2600Settings.RightDifficulty = true; - PutSyncSettings(a2600Settings); - - // NES - Global.Config.NES_InQuickNES = true; - } - else if (Global.Config.SelectedProfile == Config.ClientProfile.Tas) - { - DisplayProfileSettingBoxes(false); - - // General - Global.Config.NoLowResLargeScreenshotWithStates = false; - Global.Config.SaveScreenshotWithStates = true; - Global.Config.AllowUD_LR = true; - Global.Config.BackupSavestates = true; - Global.Config.SkipLagFrame = false; - Global.Config.SaveStateCompressionLevelNormal = 5; - - // Rewind - Global.Config.RewindEnabledLarge = false; - Global.Config.RewindEnabledMedium = false; - Global.Config.RewindEnabledSmall = false; - - // N64 - var n64Settings = GetSyncSettings(); - n64Settings.Core = N64SyncSettings.CoreType.Pure_Interpret; - Global.Config.N64UseCircularAnalogConstraint = false; - PutSyncSettings(n64Settings); - - // SNES - Global.Config.SNES_InSnes9x = false; - - // Genesis - var genesisSettings = GetSyncSettings(); - genesisSettings.Region = LibGPGX.Region.Autodetect; - PutSyncSettings(genesisSettings); - - // SMS - var smsSettings = GetSyncSettings(); - smsSettings.UseBIOS = true; - PutSyncSettings(smsSettings); - - // Coleco - var colecoSettings = GetSyncSettings(); - colecoSettings.SkipBiosIntro = true; - PutSyncSettings(colecoSettings); - - // A2600 - var a2600Settings = GetSyncSettings(); - a2600Settings.FastScBios = false; - a2600Settings.LeftDifficulty = true; - a2600Settings.RightDifficulty = true; - PutSyncSettings(a2600Settings); - - // NES - Global.Config.NES_InQuickNES = true; - } - else if (Global.Config.SelectedProfile == Config.ClientProfile.N64Tas) - { - DisplayProfileSettingBoxes(false); - - // General - Global.Config.NoLowResLargeScreenshotWithStates = false; - Global.Config.SaveScreenshotWithStates = true; - Global.Config.AllowUD_LR = true; - Global.Config.BackupSavestates = false; - Global.Config.SkipLagFrame = true; - Global.Config.SaveStateCompressionLevelNormal = 0; - - // Rewind - Global.Config.RewindEnabledLarge = false; - Global.Config.RewindEnabledMedium = false; - Global.Config.RewindEnabledSmall = false; - - // N64 - var n64Settings = GetSyncSettings(); - n64Settings.Rsp = N64SyncSettings.RspType.Rsp_Hle; - n64Settings.Core = N64SyncSettings.CoreType.Pure_Interpret; - Global.Config.N64UseCircularAnalogConstraint = false; - PutSyncSettings(n64Settings); - - // SNES - Global.Config.SNES_InSnes9x = false; - - // Genesis - var genesisSettings = GetSyncSettings(); - genesisSettings.Region = LibGPGX.Region.Autodetect; - PutSyncSettings(genesisSettings); - - // SMS - var smsSettings = GetSyncSettings(); - smsSettings.UseBIOS = true; - PutSyncSettings(smsSettings); - - // Coleco - var colecoSettings = GetSyncSettings(); - colecoSettings.SkipBiosIntro = true; - PutSyncSettings(colecoSettings); - - // A2600 - var a2600Settings = GetSyncSettings(); - a2600Settings.FastScBios = false; - a2600Settings.LeftDifficulty = true; - a2600Settings.RightDifficulty = true; - PutSyncSettings(a2600Settings); - - // NES - Global.Config.NES_InQuickNES = true; - } - else if (Global.Config.SelectedProfile == Config.ClientProfile.Custom) - { - // Disabled for now - ////DisplayProfileSettingBoxes(true); - } - - bool oldUpdateAutoCheckEnabled = Global.Config.Update_AutoCheckEnabled; - Global.Config.Update_AutoCheckEnabled = AutoCheckForUpdates.Checked; - if (Global.Config.Update_AutoCheckEnabled != oldUpdateAutoCheckEnabled) - { - if (!Global.Config.Update_AutoCheckEnabled) - { - UpdateChecker.ResetHistory(); - } - - UpdateChecker.BeginCheck(); // Call even if auto checking is disabled to trigger event (it won't actually check) - } - - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - - private void DisplayProfileSettingBoxes(bool cProfile) - { - if (cProfile) - { - ProfileDialogHelpTexBox.Location = new Point(217, 12); - ProfileDialogHelpTexBox.Size = new Size(165, 126); - SaveScreenshotStatesCheckBox.Visible = true; - SaveLargeScreenshotStatesCheckBox.Visible = true; - AllowUDLRCheckBox.Visible = true; - CustomProfileOptionsLabel.Visible = true; - } - else - { - ProfileDialogHelpTexBox.Location = new Point(184, 12); - ProfileDialogHelpTexBox.Size = new Size(198, 126); - ProfileDialogHelpTexBox.Text = "Options: \r\nCasual Gaming - All about performance! \r\n\nTool-Assisted Speedruns - Maximum Accuracy! \r\n\nLongplays - Stability is the key!"; - SaveScreenshotStatesCheckBox.Visible = false; - SaveLargeScreenshotStatesCheckBox.Visible = false; - AllowUDLRCheckBox.Visible = false; - CustomProfileOptionsLabel.Visible = false; - } - } - - private void SaveScreenshotStatesCheckBox_MouseHover(object sender, EventArgs e) - { - ProfileDialogHelpTexBox.Text = "Save Screenshot with Savestates: \r\n * Required for TASing \r\n * Not Recommended for \r\n Longplays or Casual Gaming"; - } - - private void SaveLargeScreenshotStatesCheckBox_MouseHover(object sender, EventArgs e) - { - ProfileDialogHelpTexBox.Text = "Save Large Screenshot With States: \r\n * Required for TASing \r\n * Not Recommended for \r\n Longplays or Casual Gaming"; - } - - private void AllowUDLRCheckBox_MouseHover(object sender, EventArgs e) - { - ProfileDialogHelpTexBox.Text = "All Up+Down or Left+Right: \r\n * Useful for TASing \r\n * Unchecked for Casual Gaming \r\n * Unknown for longplays"; - } - - private static TSetting GetSyncSettings() - where TSetting : class, new() - where TEmulator : IEmulator - { - // should we complain if we get a successful object from the config file, but it is the wrong type? - object fromcore = null; - var settable = new SettingsAdapter(Global.Emulator); - if (settable.HasSyncSettings) - { - fromcore = settable.GetSyncSettings(); - } - - return fromcore as TSetting - ?? Global.Config.GetCoreSyncSettings() as TSetting - ?? new TSetting(); // guaranteed to give sensible defaults - } - - private static TSetting GetSettings() - where TSetting : class, new() - where TEmulator : IEmulator - { - // should we complain if we get a successful object from the config file, but it is the wrong type? - object fromcore = null; - var settable = new SettingsAdapter(Global.Emulator); - if (settable.HasSettings) - { - fromcore = settable.GetSettings(); - } - - return fromcore as TSetting - ?? Global.Config.GetCoreSettings() as TSetting - ?? new TSetting(); // guaranteed to give sensible defaults - } - - private static void PutSettings(object o) - where TEmulator : IEmulator - { - if (Global.Emulator is TEmulator) - { - var settable = new SettingsAdapter(Global.Emulator); - settable.PutSettings(o); - } - else - { - Global.Config.PutCoreSettings(o); - } - } - - private static void PutSyncSettings(object o) - where TEmulator : IEmulator - { - if (Global.Emulator is TEmulator) - { - GlobalWin.MainForm.PutCoreSyncSettings(o); - } - else - { - Global.Config.PutCoreSyncSettings(o); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ProfileConfig.resx b/BizHawk.Client.EmuHawk/config/ProfileConfig.resx deleted file mode 100644 index 267590c5f2..0000000000 --- a/BizHawk.Client.EmuHawk/config/ProfileConfig.resx +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Options: -Casual Gaming - All about performance! - -Tool-Assisted Speedruns - Maximum Accuracy! - -N64 Tool-assisted Speedruns - Identical to Tool -Assisted Speedruns but with additional N64 specific settings. - -Longplays - Stability is the key! - - - - - AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAA - AAC3hVm02LiO/9a2jf/VtIv/1LSK/9Oyif/Ssoj/0bCI/9Cwh//Pr4f/z66G/86uhv/NrIb/zauF/8yr - hf/LqoX/yqqE/8qphP/JqIP/yKeD/8ing//HpoL/x6aC/8algv/GpYH/xaSB/8SjgP/Do4D/xKOC/8Sk - gv/FpYP/jV1Fw7mGWbTVtIT/3L6N/9e3hf/Usn//0bB8/9Gve//PrHn/zqt4/86qd//MqXf/zKh2/8un - df/KpnX/yaV0/8ikc//Io3P/x6Jy/8aicv/FoHH/xaBw/8SfcP/Dnm//w51u/8Kcbv/CnG7/wZtt/8Kc - b//DnnL/yaZ7/8Kedf+NXUbDuoda1NOwef/Pq3L/yaFl/8SbXf/Clln/wJVX/76TVv+9kVX/vI9T/7uO - Uv+5jFH/uIpQ/7eJT/+2h07/tIZN/7OETP+yg0v/sYFK/6+ASf+uf0j/rX5H/6x9R/+re0b/qnpF/6l5 - Rf+peET/qXhE/6t6SP+wg1L/toxe/45eRt+7iFu00q54/9Crcf/Hn2H/w5hY/8CVVf+/klP/vZFS/7yP - Uf+7jVD/uYtO/7iKTf+2iEz/tYZL/7SFSv+zg0n/sYJI/7CAR/+vf0b/rn1F/6x8RP+rekP/qnlC/6l4 - Qf+odkD/p3U//6Z0QP+mcz//p3VA/6x9Sv+yh1j/j19Gw7yKW7TXtoT/2bmE/9Cscv/JoWP/xZpb/8GW - V/+/k1T/vZFS/7yPUf+7jVD/uYtO/7iKTf+2iEz/tYZL/7SFSv+zg0n/sYJI/7CAR/+vf0b/rn1F/6x8 - RP+rekP/qnlC/6l4Qv+odkH/qHdB/6l4RP+tfkr/uI1d/72Vav+PX0fDvYtctNy+kP/hxpX/17aA/8+p - bv/IoWP/xZtc/8KXWf/BlVf/v5RV/76SVf+9kFT/u45S/7qNUf+4i1D/t4lP/7aITv+1hk3/s4VM/7KD - S/+xgkr/sIBJ/65/SP+tfUf/rHxG/6x8Rv+sfEf/rn5K/7SIV//EnnD/xqR7/5BgR8O/jFx4votc/Nm5 - j//p1Kr/4sma/9q8if/TsHr/zKZr/8eeYv/DmVz/wJZY/76TVv+9kFT/u45S/7qNUf+4i1D/t4lP/7aI - Tv+1hk3/s4VM/7OETP+yg0v/soNM/7GDTf+yhVD/tYpW/7uSYf/Fn3H/0rOI/+DIof+9mnn/kWFHkMCN - XQC/jlwqvotbscecb//bu5H/59Gm/+HGl//Yuob/0a52/8qjaf/Fm1//wJVY/72RVP+8jlH/uYtO/7iK - Tf+2iEz/tYZL/7SGS/+0hUv/tIZN/7SHT/+2ilT/uo5a/76WZP/FoHH/z6+C/9m+lf/dxZ//upd2/5Rk - SMWSYkgPwY5dAMCNXQDNo14BvotbOLyJW7zFmW7/2bqQ/+fRp//hxpj/2bqH/9Ctd//Jomn/w5pe/7+T - V/+8j1L/uYtO/7iKTf+3iU3/uIpQ/7qOVf++k13/wZpm/8eicf/NrH3/1beL/93Dmv/exZ//wp99/5dn - SvmWZkmDmWhGBJNiSADCj14AwY5dAL+MXAC+i1wAy6JdAbyJWjW6iFqrwJRo/9W2i//n0Kf/4ceZ/9m6 - if/QrXf/x6Fn/8GWW/+9j1P/uo1R/7yQVf/Al1//x6Ju/9Cufv/XuY3/3sOa/9/Gn//Rso3/to5t/5tq - S+uaaUuHmWlJF6l4QQGVZEkAlGNIAMOQXgDCj14AwI5dAL+MXAC9i1wAvIlbAMmgXAG6iFoquIZZn7eE - WPnTsIf/5s6l/+DGmf/Wt4X/yqVt/8KYXP/AlFn/xJxk/8+tev/avpL/4smh/9GyjP+4kW3/oG9O8Z9u - Ta6dbU1Unm1LC6x8RAGYaEsAl2ZKAJZlSQCVZEkAxJFfAMOQXgDCj14AwI1dAL+MXAC9ilwAvIlbALqH - WgDInlsBuIZZHbaEWJO1glf0z6yD/+HHnP/XuIb/yqVt/8efZ//QrXr/3sOX/8mlfv+mdVH5pXNQqKNy - T06mdE0IsYJIAZ5tTQCca0wAm2pMAJlpSwCYZ0sAl2ZKAJZlSQDGkl8AxJFfAMOQXgDBjl0AwI1dAL6M - XAC9ilsAu4lbALqHWgC4hlkAxpxZAbeFWBS0g1eIzKZ8/+HHm//TsX3/zqt1/9m7jP/UtIv/qXhSwah4 - UBi2iEwBo3JQAKJxTwCgb04An25OAJ1sTQCca0wAmmpMAJloSwCYZ0oAlmZKAMeTYADFkl8AxJFfAMKP - XgDBjl0AwI1dAL6LXAC8ilsAu4hbALmHWgC4hVkAtoRYAMWaWAK1g1e/2buP/9e4hf/SsHz/3cKU/72S - av+relJFqHZSAKZ1UQCkc1AAo3JQAKFwTwCgb04Anm1NAJ1sTQCca0wAmmlMAJloSwCYZ0oAyJRgAMaT - YADFkl8AxJFeAMKPXgDBjl0Av4xcAL6LXAC8iVsAu4haALmHWgC3hVkAxpxZAraEV7/au4//2LmG/9Ox - fP/dwZP/xqB3/6x7U2m7jVABp3ZSAKZ0UQCkc1AAo3FPAKFwTwCgb04Anm1NAJ1sTQCbakwAmmlLAJlo - SwDJlWEAx5RgAMaTYADFkl8Aw5BeAMKPXgDAjV0Av4xcAL2LXAC8iVsAuohaAMmgXAG4hllvzql+/+PK - nv/VtX//0a11/9m7iv/cwJf/rXxU6ax6Ux6pd1IAp3VRAKV0UQCkc1AAonFPAKFwTwCfbk4Anm1NAJxr - TQCbakwAmmlLAMqWYQDIlWEAx5RgAMaTYADEkV8Aw5BeAMKPXgDAjV0Av4xcAL2KWwC8iVsAu4laRbmI - Wfzhx5z/3cCN/9Cscv/LpWr/07B6/+DGmf/OrYT/rHtTvLyPUQGod1IAp3VRAKV0UACkclAAonFPAKBv - TgCfbk4Anm1NAJxrTACbakwAy5diAMqWYQDIlWEAx5RgAMaSXwDEkV8Aw5BeAMGOXQDAjV0AvotcAMGR - XAi8ilvi3b+U/+LHl//Vs3r/y6Rl/8mgYP/Mpmv/2LiF/+bOpP/CmXH/rHpTTal4UwCodlIApnVRAKVz - UACjclAAonBPAKBvTgCfbk4AnWxNAJxrTADMmGIAypdiAMmWYQDIlWAAx5NgAMWSXwDEkV8Awo9eAMGO - XQC/jV0Av4xcYtGrfv/o0KP/27yF/9CrbP/KoV//x55b/8mhYf/RrXX/38OV/9m7lP+tfFSxvZFSAal4 - UgCodlIApnVRAKRzUACjck8AoXBPAKBvTgCebU0AnWxNAM2ZYwDLmGIAypdiAMmWYQDIlGAAxpNgAMWS - XwDEkF4Awo9eANOrYwHAjVy34MSY/+PIlv/Xs3f/zqdk/8mhXf/In1z/yJ9d/82na//Zuof/5s6l/699 - VPSxgFQEqnlTAKl3UgCndlEApnRRAKRzUACjcU8AoXBPAKBuTgCebU0AzZpjAMyZYwDLmGIAypdhAMmV - YQDHlGAAxpNgAMWSXwDDkF4Ax5dgBMGPXfTp0qf/4MKM/9SvcP/OpWH/y6Jd/8mgXP/Jn13/y6Rk/9W0 - ff/lzaH/uoxj/659VCeselQAqnhTAKl3UgCndVEApXRRAKRyUACicU8AoXBPAJ9uTgDOm2MAzZpjAMyZ - YgDLl2IAypZhAMiVYQDHlGAAxpNfAMSRXwDEkl4jyZtr/+nSpf/dvYT/1K5s/8+mYv/No17/y6Jd/8mh - Xf/Lo2P/07F4/+PJnP/Bl23/sH5VQq17VACrelMAqnhTAKh3UgCndVEApXRQAKNyUACicU8AoG9OAM+b - ZADOmmMAzZljAMyYYgDLl2IAyZZhAMiVYQDHlGAAxpJfAMWTXzXOonH/6dGi/928gP/Urmr/0Khi/86l - YP/No17/y6Ne/8ykY//UsXf/4sia/8Wccv+xgFVPrnxVAK17VACreVMAqXhTAKh2UgCmdVEApXNQAKNy - UACicE8A0JxkAM+bZADOmmMAzZljAMyYYgDKl2IAyZZhAMiVYADHk2AAxpRgPNCkdP/p0qP/3r6C/9aw - a//RqmP/0Kdh/86lYP/NpF//zqdk/9Wzef/jypz/xZ1y/7KBVkywflUArnxVAKx7VACreVMAqXhSAKh2 - UgCmdVEApHNQAKNyTwDRnWQA0JxkAM+bZADOmmMAzZljAMuYYgDKl2IAyZZhAMiUYADHlWAmzJ9t/+vV - qP/gwoj/2LRw/9SsZf/RqWL/0Kdh/8+mYv/RqWj/2Lh+/+XNof/Clmr/s4JXNrF/VgCvfVUArnxUAKx6 - VACqeVMAqXdSAKd2UQCmdFEApHNQANGeZQDRnWQA0JxkAM+bYwDNmmMAzJliAMuYYgDKlmEAyZVhAMyc - YwTHlWDx69Wq/+XJlP/buXr/1rFr/9SsZf/RqmP/0all/9SvcP/dvoj/6NKn/7aFWPy2hVcRsoBWALF/ - VgCvfVUArXtUAKx6VACqeFMAqHdSAKd1UQCldFEA0p5lANGdZQDQnWQAz5xkAM6bYwDNmmMAzJliAMuX - YgDKlmEAyJVhAMiVYJbdvY//6tOj/+LEi//buHj/17Ju/9Wvav/VsG7/2rh9/+PImP/ix53/uIVZyMmg - XAGzgVcAsoBWALB+VgCvfVUArXtUAKt6UwCqeFMAqHdSAKd1UQDTn2UA0p5lANGdZQDQnGQAz5tkAM6a - YwDNmWMAzJhiAMuXYgDJlmEAyZdiI8iWYfblyZz/6dKi/+THkP/fv4P/3Lt+/96+gv/ix5L/6tSp/9Gr - gP+5h1lotoRYALWCWACzgVcAsX9WALB+VQCufFUArXtUAKt5UwCpeFIAqHZSANOfZgDTn2UA0p5lANGd - ZQDQnGQAz5tkAM6aYwDNmWMAzJhiAMqXYgDJlmEAyZZgU8iVYfbgwZP/7Ner/+nRof/nzpz/6NCh/+zW - q//WtYn/vIlazb6PXAS4hVkAtoRYALSCWACzgVcAsX9WALB+VQCufFUArHtUAKt5UwCpd1IA1KBmANOf - ZgDSnmUA0p5lANGdZADQnGQAz5tkAM6aYwDNmWMAy5hiAMqXYQDduGwByZZhMseUYL/PonD/2reK/96/ - kv/Ztoj/zKBy/7+MXLa9i1sWuohaALmGWgC3hVkAtoNYALSCVwCygFcAsX9WAK99VQCufFQArHpUAKp5 - UwDUoGYA1KBmANOfZgDSnmUA0Z5lANCdZADQnGQAzptjAM2aYwDMmWIAy5hiAMqWYQDJlWEA3LZrAceV - YTLGkl9+xJFenMOQXn7Bj1071K1lAb2LXAC8iVsAuohaALmGWQC3hVkAtYNYALSCVwCygFYAsX5WAK99 - VQCte1QArHpUAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// - /wD///8A////AP///wDZs2kB////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// - /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAB8AAAA/wA - AA//AAB//8AD///wD///8Af//+AH///gA///wAP//8AB//+AAf//gAH//4AB//+AAf//gAH//4AB//+A - Af//wAH//8AD///gA///4Af///gP////f/8= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/RewindConfig.cs b/BizHawk.Client.EmuHawk/config/RewindConfig.cs deleted file mode 100644 index d99daf5456..0000000000 --- a/BizHawk.Client.EmuHawk/config/RewindConfig.cs +++ /dev/null @@ -1,392 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Drawing; - -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class RewindConfig : Form - { - private long _stateSize; - private int _mediumStateSize; - private int _largeStateSize; - private int _stateSizeCategory = 1; // 1 = small, 2 = med, 3 = larg //TODO: enum - - public RewindConfig() - { - InitializeComponent(); - } - - private void RewindConfig_Load(object sender, EventArgs e) - { - if (Global.Rewinder.HasBuffer) - { - FullnessLabel.Text = $"{Global.Rewinder.FullnessRatio * 100:0.00}" + "%"; - RewindFramesUsedLabel.Text = Global.Rewinder.Count.ToString(); - } - else - { - FullnessLabel.Text = "N/A"; - RewindFramesUsedLabel.Text = "N/A"; - } - - RewindSpeedNumeric.Value = Global.Config.RewindSpeedMultiplier; - DiskBufferCheckbox.Checked = Global.Config.Rewind_OnDisk; - RewindIsThreadedCheckbox.Checked = Global.Config.Rewind_IsThreaded; - _stateSize = Global.Emulator.AsStatable().SaveStateBinary().Length; - BufferSizeUpDown.Value = Math.Max(Global.Config.Rewind_BufferSize, BufferSizeUpDown.Minimum); - - _mediumStateSize = Global.Config.Rewind_MediumStateSize; - _largeStateSize = Global.Config.Rewind_LargeStateSize; - - UseDeltaCompression.Checked = Global.Config.Rewind_UseDelta; - - SmallSavestateNumeric.Value = Global.Config.RewindFrequencySmall; - MediumSavestateNumeric.Value = Global.Config.RewindFrequencyMedium; - LargeSavestateNumeric.Value = Global.Config.RewindFrequencyLarge; - - SmallStateEnabledBox.Checked = Global.Config.RewindEnabledSmall; - MediumStateEnabledBox.Checked = Global.Config.RewindEnabledMedium; - LargeStateEnabledBox.Checked = Global.Config.RewindEnabledLarge; - - SetSmallEnabled(); - SetMediumEnabled(); - SetLargeEnabled(); - - SetStateSize(); - - var mediumStateSizeKb = Global.Config.Rewind_MediumStateSize / 1024; - var largeStateSizeKb = Global.Config.Rewind_LargeStateSize / 1024; - - MediumStateTrackbar.Value = mediumStateSizeKb; - MediumStateUpDown.Value = mediumStateSizeKb; - LargeStateTrackbar.Value = largeStateSizeKb; - LargeStateUpDown.Value = largeStateSizeKb; - - nudCompression.Value = Global.Config.SaveStateCompressionLevelNormal; - - rbStatesDefault.Checked = Global.Config.SaveStateType == Config.SaveStateTypeE.Default; - rbStatesBinary.Checked = Global.Config.SaveStateType == Config.SaveStateTypeE.Binary; - rbStatesText.Checked = Global.Config.SaveStateType == Config.SaveStateTypeE.Text; - - BackupSavestatesCheckbox.Checked = Global.Config.BackupSavestates; - ScreenshotInStatesCheckbox.Checked = Global.Config.SaveScreenshotWithStates; - LowResLargeScreenshotsCheckbox.Checked = !Global.Config.NoLowResLargeScreenshotWithStates; - BigScreenshotNumeric.Value = Global.Config.BigScreenshotSize / 1024; - - ScreenshotInStatesCheckbox_CheckedChanged(null, null); - } - - private void ScreenshotInStatesCheckbox_CheckedChanged(object sender, EventArgs e) - { - LowResLargeScreenshotsCheckbox.Enabled = - BigScreenshotNumeric.Enabled = - KbLabel.Enabled = - ScreenshotInStatesCheckbox.Checked; - } - - private string FormatKB(long n) - { - double num = n / 1024.0; - - if (num >= 1024) - { - num /= 1024.0; - return $"{num:0.00}" + " MB"; - } - - return $"{num:0.00}" + " KB"; - } - - private void SetStateSize() - { - double num = _stateSize / 1024.0; - - StateSizeLabel.Text = FormatKB(_stateSize); - - SmallLabel1.Text = $"Small savestates (less than {_mediumStateSize / 1024}KB)"; - MediumLabel1.Text = $"Medium savestates ({_mediumStateSize / 1024} - {_largeStateSize / 1024}KB)"; - LargeLabel1.Text = $"Large savestates ({_largeStateSize / 1024}KB or more)"; - - if (_stateSize >= _largeStateSize) - { - _stateSizeCategory = 3; - SmallLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - MediumLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - LargeLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Italic); - } - else if (_stateSize >= _mediumStateSize) - { - _stateSizeCategory = 2; - SmallLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - MediumLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Italic); - LargeLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - } - else - { - _stateSizeCategory = 1; - SmallLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Italic); - MediumLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - LargeLabel1.Font = new Font(SmallLabel1.Font, FontStyle.Regular); - } - - CalculateEstimates(); - } - - private void Cancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Rewind config aborted"); - Close(); - } - - private bool TriggerRewindSettingsReload { get; set; } - - private void PutRewindSetting(ref T setting, T value) where T : IEquatable - { - if (setting.Equals(value)) - { - return; - } - - setting = value; - TriggerRewindSettingsReload = true; - } - - private void Ok_Click(object sender, EventArgs e) - { - // These settings are used by DoRewindSettings, which we'll only call if anything actually changed (i.e. preserve rewind history if possible) - PutRewindSetting(ref Global.Config.RewindEnabledSmall, SmallStateEnabledBox.Checked); - PutRewindSetting(ref Global.Config.RewindEnabledMedium, MediumStateEnabledBox.Checked); - PutRewindSetting(ref Global.Config.RewindEnabledLarge, LargeStateEnabledBox.Checked); - PutRewindSetting(ref Global.Config.RewindFrequencySmall, (int)SmallSavestateNumeric.Value); - PutRewindSetting(ref Global.Config.RewindFrequencyMedium, (int)MediumSavestateNumeric.Value); - PutRewindSetting(ref Global.Config.RewindFrequencyLarge, (int)LargeSavestateNumeric.Value); - PutRewindSetting(ref Global.Config.Rewind_OnDisk, DiskBufferCheckbox.Checked); - PutRewindSetting(ref Global.Config.Rewind_UseDelta, UseDeltaCompression.Checked); - PutRewindSetting(ref Global.Config.Rewind_IsThreaded, RewindIsThreadedCheckbox.Checked); - PutRewindSetting(ref Global.Config.Rewind_BufferSize, (int)BufferSizeUpDown.Value); - PutRewindSetting(ref Global.Config.Rewind_MediumStateSize, (int)MediumStateUpDown.Value * 1024); - PutRewindSetting(ref Global.Config.Rewind_LargeStateSize, (int)LargeStateUpDown.Value * 1024); - if (TriggerRewindSettingsReload) - { - Global.Rewinder.Initialize(); - } - - // These settings are not used by DoRewindSettings - Global.Config.RewindSpeedMultiplier = (int)RewindSpeedNumeric.Value; - Global.Config.SaveStateCompressionLevelNormal = (int)nudCompression.Value; - if (rbStatesDefault.Checked) Global.Config.SaveStateType = Config.SaveStateTypeE.Default; - if (rbStatesBinary.Checked) Global.Config.SaveStateType = Config.SaveStateTypeE.Binary; - if (rbStatesText.Checked) Global.Config.SaveStateType = Config.SaveStateTypeE.Text; - Global.Config.BackupSavestates = BackupSavestatesCheckbox.Checked; - Global.Config.SaveScreenshotWithStates = ScreenshotInStatesCheckbox.Checked; - Global.Config.NoLowResLargeScreenshotWithStates = !LowResLargeScreenshotsCheckbox.Checked; - Global.Config.BigScreenshotSize = (int)BigScreenshotNumeric.Value * 1024; - - GlobalWin.OSD.AddMessage("Rewind and State settings saved"); - Close(); - } - - private void SetSmallEnabled() - { - SmallLabel1.Enabled = SmallLabel2.Enabled - = SmallSavestateNumeric.Enabled = SmallLabel3.Enabled - = SmallStateEnabledBox.Checked; - } - - private void SetMediumEnabled() - { - MediumLabel1.Enabled = MediumLabel2.Enabled - = MediumSavestateNumeric.Enabled = MediumLabel3.Enabled - = MediumStateEnabledBox.Checked; - } - - private void SetLargeEnabled() - { - LargeLabel1.Enabled = LargeLabel2.Enabled - = LargeSavestateNumeric.Enabled = LargeLabel3.Enabled - = LargeStateEnabledBox.Checked; - } - - private void SmallStateEnabledBox_CheckStateChanged(object sender, EventArgs e) - { - SetSmallEnabled(); - } - - private void MediumStateEnabledBox_CheckStateChanged(object sender, EventArgs e) - { - SetMediumEnabled(); - } - - private void LargeStateEnabledBox_CheckStateChanged(object sender, EventArgs e) - { - SetLargeEnabled(); - } - - private void LargeLabel1_Click(object sender, EventArgs e) - { - LargeStateEnabledBox.Checked ^= true; - } - - private void MediumLabel1_Click(object sender, EventArgs e) - { - MediumStateEnabledBox.Checked ^= true; - } - - private void SmallLabel1_Click(object sender, EventArgs e) - { - SmallStateEnabledBox.Checked ^= true; - } - - private void MediumStateTrackbar_ValueChanged(object sender, EventArgs e) - { - MediumStateUpDown.Value = ((TrackBar)sender).Value; - if (MediumStateUpDown.Value > LargeStateUpDown.Value) - { - LargeStateUpDown.Value = MediumStateUpDown.Value; - LargeStateTrackbar.Value = (int)MediumStateUpDown.Value; - } - - _mediumStateSize = MediumStateTrackbar.Value * 1024; - _largeStateSize = LargeStateTrackbar.Value * 1024; - SetStateSize(); - } - - private void MediumStateUpDown_ValueChanged(object sender, EventArgs e) - { - MediumStateTrackbar.Value = (int)((NumericUpDown)sender).Value; - if (MediumStateUpDown.Value > LargeStateUpDown.Value) - { - LargeStateUpDown.Value = MediumStateUpDown.Value; - LargeStateTrackbar.Value = (int)MediumStateUpDown.Value; - } - - _mediumStateSize = MediumStateTrackbar.Value * 1024; - _largeStateSize = LargeStateTrackbar.Value * 1024; - SetStateSize(); - } - - private void LargeStateTrackbar_ValueChanged(object sender, EventArgs e) - { - if (LargeStateTrackbar.Value < MediumStateTrackbar.Value) - { - LargeStateTrackbar.Value = MediumStateTrackbar.Value; - LargeStateUpDown.Value = MediumStateTrackbar.Value; - } - else - { - LargeStateUpDown.Value = ((TrackBar)sender).Value; - } - - _mediumStateSize = MediumStateTrackbar.Value * 1024; - _largeStateSize = LargeStateTrackbar.Value * 1024; - SetStateSize(); - } - - private void LargeStateUpDown_ValueChanged(object sender, EventArgs e) - { - if (LargeStateUpDown.Value < MediumStateUpDown.Value) - { - LargeStateTrackbar.Value = MediumStateTrackbar.Value; - LargeStateUpDown.Value = MediumStateTrackbar.Value; - } - else - { - LargeStateTrackbar.Value = (int)((NumericUpDown)sender).Value; - } - - _mediumStateSize = MediumStateTrackbar.Value * 1024; - _largeStateSize = LargeStateTrackbar.Value * 1024; - SetStateSize(); - } - - private void CalculateEstimates() - { - long avgStateSize; - - if (UseDeltaCompression.Checked || _stateSize == 0) - { - if (Global.Rewinder.Count > 0) - { - avgStateSize = Global.Rewinder.Size / Global.Rewinder.Count; - } - else - { - avgStateSize = _stateSize; - } - } - else - { - avgStateSize = _stateSize; - } - - var bufferSize = (long)BufferSizeUpDown.Value; - bufferSize *= 1024 * 1024; - var estFrames = bufferSize / avgStateSize; - - long estFrequency = 0; - switch (_stateSizeCategory) - { - case 1: - estFrequency = (long)SmallSavestateNumeric.Value; - break; - case 2: - estFrequency = (long)MediumSavestateNumeric.Value; - break; - case 3: - estFrequency = (long)LargeSavestateNumeric.Value; - break; - } - - long estTotalFrames = estFrames * estFrequency; - double minutes = estTotalFrames / 60 / 60; - - AverageStoredStateSizeLabel.Text = FormatKB(avgStateSize); - ApproxFramesLabel.Text = $"{estFrames:n0}" + " frames"; - EstTimeLabel.Text = $"{minutes:n}" + " minutes"; - } - - private void BufferSizeUpDown_ValueChanged(object sender, EventArgs e) - { - CalculateEstimates(); - } - - private void UseDeltaCompression_CheckedChanged(object sender, EventArgs e) - { - CalculateEstimates(); - } - - private void SmallSavestateNumeric_ValueChanged(object sender, EventArgs e) - { - CalculateEstimates(); - } - - private void MediumSavestateNumeric_ValueChanged(object sender, EventArgs e) - { - CalculateEstimates(); - } - - private void LargeSavestateNumeric_ValueChanged(object sender, EventArgs e) - { - CalculateEstimates(); - } - - private void NudCompression_ValueChanged(object sender, EventArgs e) - { - trackBarCompression.Value = (int)((NumericUpDown)sender).Value; - } - - private void TrackBarCompression_ValueChanged(object sender, EventArgs e) - { - // TODO - make a UserControl which is trackbar and NUD combined - nudCompression.Value = ((TrackBar)sender).Value; - } - - private void BtnResetCompression_Click(object sender, EventArgs e) - { - nudCompression.Value = Config.DefaultSaveStateCompressionLevelNormal; - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/RewindConfig.resx b/BizHawk.Client.EmuHawk/config/RewindConfig.resx deleted file mode 100644 index e4f2985df5..0000000000 --- a/BizHawk.Client.EmuHawk/config/RewindConfig.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA - AAD///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AcvJxP+WSST/////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AcvJxP+dTij/nU0l/////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AcvJxP+gUCr/0nVH/6tUKf+iTyf/mksl/5JH - I/+SRyP/kkcj/5JHI/9+Qib/////Af///wH///8B////AcvJxP+iVjH/4YZY//aPW//phlX/2XtN/8hw - RP+3ZTv/qlsz/6pbM/+qWzP/g0Yn/////wH///8B////Af///wHilW7/+8Ch//+zjP//nm3/9o9b/+mG - Vf/Ze03/yHBE/8hwRP/DbUL/w21C/4tJKf////8B////Af///wH///8B3dHH/+icdv/7wKH//7OL//+z - jf/4qH//7qF6/+GYdP/hmHT/4Zh0/9eIYf+STCv/////Af///wH///8B////Af///wHc08r/6Jx2//u/ - oP/OZzP/55Rs/+aOYv/lh1j/5YdY/+WHWP/lh1j/zHJD/////wH///8B////Af///wH///8B////AdzT - yv/nmnP/0nA+/////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B3NPK/+eac/////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA - //8AAP//AAD//w== - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.Designer.cs deleted file mode 100644 index 290f0f56ad..0000000000 --- a/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.Designer.cs +++ /dev/null @@ -1,128 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class SMSGraphicsConfig - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.OK = new System.Windows.Forms.Button(); - this.Cancel = new System.Windows.Forms.Button(); - this.DispOBJ = new System.Windows.Forms.CheckBox(); - this.DispBG = new System.Windows.Forms.CheckBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // OK - // - this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OK.Location = new System.Drawing.Point(62, 96); - this.OK.Name = "OK"; - this.OK.Size = new System.Drawing.Size(75, 25); - this.OK.TabIndex = 0; - this.OK.Text = "&OK"; - this.OK.UseVisualStyleBackColor = true; - this.OK.Click += new System.EventHandler(this.Ok_Click); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(143, 96); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 25); - this.Cancel.TabIndex = 1; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - // - // DispOBJ - // - this.DispOBJ.AutoSize = true; - this.DispOBJ.Checked = true; - this.DispOBJ.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispOBJ.Location = new System.Drawing.Point(6, 20); - this.DispOBJ.Name = "DispOBJ"; - this.DispOBJ.Size = new System.Drawing.Size(83, 18); - this.DispOBJ.TabIndex = 2; - this.DispOBJ.Text = "Display OBJ"; - this.DispOBJ.UseVisualStyleBackColor = true; - // - // DispBG - // - this.DispBG.AutoSize = true; - this.DispBG.Checked = true; - this.DispBG.CheckState = System.Windows.Forms.CheckState.Checked; - this.DispBG.Location = new System.Drawing.Point(6, 43); - this.DispBG.Name = "DispBG"; - this.DispBG.Size = new System.Drawing.Size(78, 18); - this.DispBG.TabIndex = 3; - this.DispBG.Text = "Display BG"; - this.DispBG.UseVisualStyleBackColor = true; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.DispOBJ); - this.groupBox1.Controls.Add(this.DispBG); - this.groupBox1.Location = new System.Drawing.Point(12, 13); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(200, 69); - this.groupBox1.TabIndex = 4; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Background and Sprites"; - // - // SMSGraphicsConfig - // - this.AcceptButton = this.OK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(230, 134); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.Cancel); - this.Controls.Add(this.OK); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SMSGraphicsConfig"; - this.ShowIcon = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "SMS Graphics Settings"; - this.Load += new System.EventHandler(this.SMSGraphicsConfig_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button OK; - private System.Windows.Forms.Button Cancel; - private System.Windows.Forms.CheckBox DispOBJ; - private System.Windows.Forms.CheckBox DispBG; - private System.Windows.Forms.GroupBox groupBox1; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.cs b/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.cs deleted file mode 100644 index 06b7c70414..0000000000 --- a/BizHawk.Client.EmuHawk/config/SMS/SMSGraphicsConfig.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Sega.MasterSystem; - -namespace BizHawk.Client.EmuHawk -{ - public partial class SMSGraphicsConfig : Form - { - public SMSGraphicsConfig() - { - InitializeComponent(); - } - - private void SMSGraphicsConfig_Load(object sender, EventArgs e) - { - var s = ((SMS)Global.Emulator).GetSettings(); - DispOBJ.Checked = s.DispOBJ; - DispBG.Checked = s.DispBG; - } - - private void Ok_Click(object sender, EventArgs e) - { - var s = ((SMS)Global.Emulator).GetSettings(); - s.DispOBJ = DispOBJ.Checked; - s.DispBG = DispBG.Checked; - GlobalWin.MainForm.PutCoreSettings(s); - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/SNES/SNESControllerConfig.resx b/BizHawk.Client.EmuHawk/config/SNES/SNESControllerConfig.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/SNES/SNESControllerConfig.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs b/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs deleted file mode 100644 index f9617c753f..0000000000 --- a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Windows.Forms; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class SNESOptions : Form - { - private SNESOptions() - { - InitializeComponent(); - } - - private bool _suppressDoubleSize; - private bool _userDoubleSizeOption; - - public static void DoSettingsDialog(IWin32Window owner) - { - var s = ((LibsnesCore)Global.Emulator).GetSettings(); - var ss = ((LibsnesCore)Global.Emulator).GetSyncSettings(); - var dlg = new SNESOptions - { - AlwaysDoubleSize = s.AlwaysDoubleSize, - CropSGBFrame = s.CropSGBFrame, - ShowObj1 = s.ShowOBJ_0, - ShowObj2 = s.ShowOBJ_1, - ShowObj3 = s.ShowOBJ_2, - ShowObj4 = s.ShowOBJ_3, - ShowBg1 = s.ShowBG1_0, - ShowBg2 = s.ShowBG2_0, - ShowBg3 = s.ShowBG3_0, - ShowBg4 = s.ShowBG4_0 - }; - - var result = dlg.ShowDialog(owner); - if (result == DialogResult.OK) - { - s.AlwaysDoubleSize = dlg.AlwaysDoubleSize; - s.CropSGBFrame = dlg.CropSGBFrame; - s.ShowOBJ_0 = dlg.ShowObj1; - s.ShowOBJ_1 = dlg.ShowObj2; - s.ShowOBJ_2 = dlg.ShowObj3; - s.ShowOBJ_3 = dlg.ShowObj4; - s.ShowBG1_0 = s.ShowBG1_1 = dlg.ShowBg1; - s.ShowBG2_0 = s.ShowBG2_1 = dlg.ShowBg2; - s.ShowBG3_0 = s.ShowBG3_1 = dlg.ShowBg3; - s.ShowBG4_0 = s.ShowBG4_1 = dlg.ShowBg4; - - GlobalWin.MainForm.PutCoreSettings(s); - GlobalWin.MainForm.PutCoreSyncSettings(ss); - } - } - - private bool AlwaysDoubleSize - { - get - { - return _userDoubleSizeOption; - } - - set - { - _userDoubleSizeOption = value; - RefreshDoubleSizeOption(); - } - } - - private bool CropSGBFrame - { - get { return cbCropSGBFrame.Checked; } - set { cbCropSGBFrame.Checked = value; } - } - - private bool ShowObj1 { get { return Obj1Checkbox.Checked; } set { Obj1Checkbox.Checked = value; } } - private bool ShowObj2 { get { return Obj2Checkbox.Checked; } set { Obj2Checkbox.Checked = value; } } - private bool ShowObj3 { get { return Obj3Checkbox.Checked; } set { Obj3Checkbox.Checked = value; } } - private bool ShowObj4 { get { return Obj4Checkbox.Checked; } set { Obj4Checkbox.Checked = value; } } - - private bool ShowBg1 { get { return Bg1Checkbox.Checked; } set { Bg1Checkbox.Checked = value; } } - private bool ShowBg2 { get { return Bg2Checkbox.Checked; } set { Bg2Checkbox.Checked = value; } } - private bool ShowBg3 { get { return Bg3Checkbox.Checked; } set { Bg3Checkbox.Checked = value; } } - private bool ShowBg4 { get { return Bg4Checkbox.Checked; } set { Bg4Checkbox.Checked = value; } } - - private void RefreshDoubleSizeOption() - { - _suppressDoubleSize = true; - cbDoubleSize.Checked = !cbDoubleSize.Enabled || _userDoubleSizeOption; - _suppressDoubleSize = false; - } - - private void CbDoubleSize_CheckedChanged(object sender, EventArgs e) - { - if (_suppressDoubleSize) - { - return; - } - - _userDoubleSizeOption = cbDoubleSize.Checked; - } - - private void BtnOk_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - Close(); - } - - private void BtnCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - - } -} diff --git a/BizHawk.Client.EmuHawk/config/SoundConfig.cs b/BizHawk.Client.EmuHawk/config/SoundConfig.cs deleted file mode 100644 index 782ae648aa..0000000000 --- a/BizHawk.Client.EmuHawk/config/SoundConfig.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class SoundConfig : Form - { - private bool _programmaticallyChangingValue; - - public SoundConfig() - { - InitializeComponent(); - } - - private void SoundConfig_Load(object sender, EventArgs e) - { - _programmaticallyChangingValue = true; - - cbEnableMaster.Checked = Global.Config.SoundEnabled; - cbEnableNormal.Checked = Global.Config.SoundEnabledNormal; - cbEnableRWFF.Checked = Global.Config.SoundEnabledRWFF; - cbMuteFrameAdvance.Checked = Global.Config.MuteFrameAdvance; -#if !WINDOWS - rbOutputMethodDirectSound.Enabled = false; - rbOutputMethodXAudio2.Enabled = false; -#endif - rbOutputMethodDirectSound.Checked = Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound; - rbOutputMethodXAudio2.Checked = Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.XAudio2; - rbOutputMethodOpenAL.Checked = Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.OpenAL; - BufferSizeNumeric.Value = Global.Config.SoundBufferSizeMs; - tbNormal.Value = Global.Config.SoundVolume; - nudNormal.Value = Global.Config.SoundVolume; - tbRWFF.Value = Global.Config.SoundVolumeRWFF; - nudRWFF.Value = Global.Config.SoundVolumeRWFF; - UpdateSoundDialog(); - - _programmaticallyChangingValue = false; - } - - private void Ok_Click(object sender, EventArgs e) - { - if (rbOutputMethodDirectSound.Checked && (int)BufferSizeNumeric.Value < 60) - { - MessageBox.Show("Buffer size must be at least 60 milliseconds for DirectSound.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - var oldOutputMethod = Global.Config.SoundOutputMethod; - var oldDevice = Global.Config.SoundDevice; - Global.Config.SoundEnabled = cbEnableMaster.Checked; - Global.Config.SoundEnabledNormal = cbEnableNormal.Checked; - Global.Config.SoundEnabledRWFF = cbEnableRWFF.Checked; - Global.Config.MuteFrameAdvance = cbMuteFrameAdvance.Checked; - if (rbOutputMethodDirectSound.Checked) Global.Config.SoundOutputMethod = Config.ESoundOutputMethod.DirectSound; - if (rbOutputMethodXAudio2.Checked) Global.Config.SoundOutputMethod = Config.ESoundOutputMethod.XAudio2; - if (rbOutputMethodOpenAL.Checked) Global.Config.SoundOutputMethod = Config.ESoundOutputMethod.OpenAL; - Global.Config.SoundBufferSizeMs = (int)BufferSizeNumeric.Value; - Global.Config.SoundVolume = tbNormal.Value; - Global.Config.SoundVolumeRWFF = tbRWFF.Value; - Global.Config.SoundDevice = (string)listBoxSoundDevices.SelectedItem ?? ""; - GlobalWin.Sound.StopSound(); - if (Global.Config.SoundOutputMethod != oldOutputMethod - || Global.Config.SoundDevice != oldDevice) - { - GlobalWin.Sound.Dispose(); - GlobalWin.Sound = new Sound(GlobalWin.MainForm.Handle); - } - - GlobalWin.Sound.StartSound(); - GlobalWin.OSD.AddMessage("Sound settings saved"); - DialogResult = DialogResult.OK; - } - - private void Cancel_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Sound config aborted"); - Close(); - } - - private void PopulateDeviceList() - { - IEnumerable deviceNames = Enumerable.Empty(); -#if WINDOWS - if (rbOutputMethodDirectSound.Checked) deviceNames = DirectSoundSoundOutput.GetDeviceNames(); - if (rbOutputMethodXAudio2.Checked) deviceNames = XAudio2SoundOutput.GetDeviceNames(); -#endif - if (rbOutputMethodOpenAL.Checked) deviceNames = OpenALSoundOutput.GetDeviceNames(); - listBoxSoundDevices.Items.Clear(); - listBoxSoundDevices.Items.Add(""); - listBoxSoundDevices.SelectedIndex = 0; - foreach (var name in deviceNames) - { - listBoxSoundDevices.Items.Add(name); - if (name == Global.Config.SoundDevice) - { - listBoxSoundDevices.SelectedItem = name; - } - } - } - - private void OutputMethodRadioButtons_CheckedChanged(object sender, EventArgs e) - { - if (!((RadioButton)sender).Checked) - { - return; - } - - PopulateDeviceList(); - } - - private void TrackBar1_Scroll(object sender, EventArgs e) - { - nudNormal.Value = tbNormal.Value; - } - - private void TbRwff_Scroll(object sender, EventArgs e) - { - nudRWFF.Value = tbRWFF.Value; - } - - private void SoundVolNumeric_ValueChanged(object sender, EventArgs e) - { - tbNormal.Value = (int)nudNormal.Value; - - // If the user is changing the volume, automatically turn on/off sound accordingly - if (!_programmaticallyChangingValue) - { - cbEnableNormal.Checked = tbNormal.Value != 0; - } - } - - private void UpdateSoundDialog() - { - cbEnableRWFF.Enabled = cbEnableNormal.Checked; - grpSoundVol.Enabled = cbEnableMaster.Checked; - } - - private void UpdateSoundDialog(object sender, EventArgs e) - { - UpdateSoundDialog(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/TI83/TI83PaletteConfig.resx b/BizHawk.Client.EmuHawk/config/TI83/TI83PaletteConfig.resx deleted file mode 100644 index cda693680c..0000000000 --- a/BizHawk.Client.EmuHawk/config/TI83/TI83PaletteConfig.resx +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - DwDgAA8A4AAPAPAAHwA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.cs b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.cs deleted file mode 100644 index 0eb6e977cc..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ZXSpectrumAudioSettings : Form - { - private ZXSpectrum.ZXSpectrumSettings _settings; - - public ZXSpectrumAudioSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _settings = ((ZXSpectrum)Global.Emulator).GetSettings().Clone(); - - // AY panning config - var panTypes = Enum.GetNames(typeof(AY38912.AYPanConfig)); - foreach (var val in panTypes) - { - panTypecomboBox1.Items.Add(val); - } - panTypecomboBox1.SelectedItem = _settings.AYPanConfig.ToString(); - - // tape volume - tapeVolumetrackBar.Value = _settings.TapeVolume; - - // ear volume - earVolumetrackBar.Value = _settings.EarVolume; - - // ay volume - ayVolumetrackBar.Value = _settings.AYVolume; - - - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _settings.AYPanConfig.ToString() != panTypecomboBox1.SelectedItem.ToString() - || _settings.TapeVolume != tapeVolumetrackBar.Value - || _settings.EarVolume != earVolumetrackBar.Value - || _settings.AYVolume != ayVolumetrackBar.Value; - - if (changed) - { - _settings.AYPanConfig = (AY38912.AYPanConfig)Enum.Parse(typeof(AY38912.AYPanConfig), panTypecomboBox1.SelectedItem.ToString()); - - _settings.TapeVolume = tapeVolumetrackBar.Value; - _settings.EarVolume = earVolumetrackBar.Value; - _settings.AYVolume = ayVolumetrackBar.Value; - - GlobalWin.MainForm.PutCoreSettings(_settings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Misc settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.resx b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumAudioSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.cs b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.cs deleted file mode 100644 index 2888cf7231..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ZXSpectrumCoreEmulationSettings : Form - { - private ZXSpectrum.ZXSpectrumSyncSettings _syncSettings; - - public ZXSpectrumCoreEmulationSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _syncSettings = ((ZXSpectrum)Global.Emulator).GetSyncSettings().Clone(); - - // machine selection - var machineTypes = Enum.GetNames(typeof(MachineType)); - foreach (var val in machineTypes) - { - MachineSelectionComboBox.Items.Add(val); - } - MachineSelectionComboBox.SelectedItem = _syncSettings.MachineType.ToString(); - UpdateMachineNotes((MachineType)Enum.Parse(typeof(MachineType), MachineSelectionComboBox.SelectedItem.ToString())); - - // border selecton - var borderTypes = Enum.GetNames(typeof(ZXSpectrum.BorderType)); - foreach (var val in borderTypes) - { - borderTypecomboBox1.Items.Add(val); - } - borderTypecomboBox1.SelectedItem = _syncSettings.BorderType.ToString(); - UpdateBorderNotes((ZXSpectrum.BorderType)Enum.Parse(typeof(ZXSpectrum.BorderType), borderTypecomboBox1.SelectedItem.ToString())); - - // deterministic emulation - determEmucheckBox1.Checked = _syncSettings.DeterministicEmulation; - - // autoload tape - autoLoadcheckBox1.Checked = _syncSettings.AutoLoadTape; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _syncSettings.MachineType.ToString() != MachineSelectionComboBox.SelectedItem.ToString() - || _syncSettings.BorderType.ToString() != borderTypecomboBox1.SelectedItem.ToString() - || _syncSettings.DeterministicEmulation != determEmucheckBox1.Checked - || _syncSettings.AutoLoadTape != autoLoadcheckBox1.Checked; - - if (changed) - { - _syncSettings.MachineType = (MachineType)Enum.Parse(typeof(MachineType), MachineSelectionComboBox.SelectedItem.ToString()); - _syncSettings.BorderType = (ZXSpectrum.BorderType)Enum.Parse(typeof(ZXSpectrum.BorderType), borderTypecomboBox1.SelectedItem.ToString()); - _syncSettings.DeterministicEmulation = determEmucheckBox1.Checked; - _syncSettings.AutoLoadTape = autoLoadcheckBox1.Checked; - - GlobalWin.MainForm.PutCoreSyncSettings(_syncSettings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Core emulator settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - - private void MachineSelectionComboBox_SelectionChangeCommitted(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateMachineNotes((MachineType)Enum.Parse(typeof(MachineType), cb.SelectedItem.ToString())); - } - - private void UpdateMachineNotes(MachineType type) - { - textBoxCoreDetails.Text = ZXMachineMetaData.GetMetaString(type); - } - - private void borderTypecomboBox1_SelectedIndexChanged(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateBorderNotes((ZXSpectrum.BorderType)Enum.Parse(typeof(ZXSpectrum.BorderType), cb.SelectedItem.ToString())); - } - - private void UpdateBorderNotes(ZXSpectrum.BorderType type) - { - switch (type) - { - case ZXSpectrum.BorderType.Full: - lblBorderInfo.Text = "Original border sizes"; - break; - case ZXSpectrum.BorderType.Medium: - lblBorderInfo.Text = "All borders 24px"; - break; - case ZXSpectrum.BorderType.None: - lblBorderInfo.Text = "No border at all"; - break; - case ZXSpectrum.BorderType.Small: - lblBorderInfo.Text = "All borders 10px"; - break; - case ZXSpectrum.BorderType.Widescreen: - lblBorderInfo.Text = "No top and bottom border (almost 16:9)"; - break; - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.resx b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumCoreEmulationSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXjU1h6NnZv/Fc3T/x3Bx/8dw - cf/HcHH/x3Bx/8dwcf/HcHH/w3Jz/6ZoZ/9ZMzPTAQAAPQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyFxccektK0b12 - dv/HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xXR0/69wb/9jOjneBwMDSQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABNKSlNlmBf9sh3d//HcHH/x3Bx/8dwcf/HcHH/x3Bx/8dwcf/HcHH/xnd3/7Z4d/9sQUDnDgcHVQAA - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABkOjqKsXFw/8lyc//HcXL/yHJz/8l0df/JdXb/yXV2/8l1dv/JdHX/ynt7/7+B - f/94SknvFgsLZQAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACILCxB7TUzDwXd3/8lyc//KdXb/y3h5/8x7fP/NfX7/zX5+/819 - fv/NfH3/zoOC/8iJiP+GVVX3Hg8QegAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMiIi+SXl3oynp7/8t4ef/NfX7/z4GC/9GE - hf/Sh4j/04iJ/9KIiP/Rhof/04uK/8+RkP+XY2L9KxcXlwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABwAA - AA0AAAAPAAAACwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUvL1enbW37zn5+/85/ - gP/Rhob/1IuM/9aPkP/XkpP/2JOU/9iTlP/XkZH/15OT/9eZl/+rdHP/QSUlvAAAADwAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACQAA - ABgAAAAvAgEBSwcDA2EFAgJoAAAAWAAAADYAAAARAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGU8 - O4W5eXn/0IKD/9KIif/Wj5D/2ZWW/9ubm//dnp//3qCg/92foP/cnZ3/3Jyc/9+in//CiYf/Zj8/4wYC - AnAAAAAbAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AA4AAAAnCQQEUCISEoQ+IiKzVzEx1mU6OuZiOTnmRigo0hgNDZsAAABMAAAAEAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABnVJSK/HhIP/04eI/9aQkf/amJn/3qCh/+Gmp//jq6v/5Kyt/+OsrP/iqan/4aal/+ap - p//Umpj/nmxr/C8ZGboAAABXAAAAGAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAIAAAAOAQAALRkNDWY+IiKpZDo63YZRUfigZGP/sHBv/7V0c/+xcnH/oWZm/2k+PvEfEBCcAAAAMQAA - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.cs b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.cs deleted file mode 100644 index fc151c843c..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ZXSpectrumJoystickSettings : Form - { - private ZXSpectrum.ZXSpectrumSyncSettings _syncSettings; - - public ZXSpectrumJoystickSettings() - { - InitializeComponent(); - } - - private string[] possibleControllers; - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _syncSettings = ((ZXSpectrum)Global.Emulator).GetSyncSettings().Clone(); - - possibleControllers = Enum.GetNames(typeof(JoystickType)); - - foreach (var val in possibleControllers) - { - Port1ComboBox.Items.Add(val); - Port2ComboBox.Items.Add(val); - Port3ComboBox.Items.Add(val); - } - - Port1ComboBox.SelectedItem = _syncSettings.JoystickType1.ToString(); - Port2ComboBox.SelectedItem = _syncSettings.JoystickType2.ToString(); - Port3ComboBox.SelectedItem = _syncSettings.JoystickType3.ToString(); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _syncSettings.JoystickType1.ToString() != Port1ComboBox.SelectedItem.ToString() - || _syncSettings.JoystickType2.ToString() != Port2ComboBox.SelectedItem.ToString() - || _syncSettings.JoystickType3.ToString() != Port3ComboBox.SelectedItem.ToString(); - - if (changed) - { - // enforce unique joystick selection - - bool selectionValid = true; - - var j1 = Port1ComboBox.SelectedItem.ToString(); - if (j1 != possibleControllers.First()) - { - if (j1 == Port2ComboBox.SelectedItem.ToString()) - { - Port2ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - if (j1 == Port3ComboBox.SelectedItem.ToString()) - { - Port3ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - } - - var j2 = Port2ComboBox.SelectedItem.ToString(); - if (j2 != possibleControllers.First()) - { - if (j2 == Port1ComboBox.SelectedItem.ToString()) - { - Port1ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - if (j2 == Port3ComboBox.SelectedItem.ToString()) - { - Port3ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - } - - var j3 = Port3ComboBox.SelectedItem.ToString(); - if (j3 != possibleControllers.First()) - { - if (j3 == Port1ComboBox.SelectedItem.ToString()) - { - Port1ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - if (j3 == Port2ComboBox.SelectedItem.ToString()) - { - Port2ComboBox.SelectedItem = possibleControllers.First(); - selectionValid = false; - } - } - - if (selectionValid) - { - _syncSettings.JoystickType1 = (JoystickType)Enum.Parse(typeof(JoystickType), Port1ComboBox.SelectedItem.ToString()); - _syncSettings.JoystickType2 = (JoystickType)Enum.Parse(typeof(JoystickType), Port2ComboBox.SelectedItem.ToString()); - _syncSettings.JoystickType3 = (JoystickType)Enum.Parse(typeof(JoystickType), Port3ComboBox.SelectedItem.ToString()); - - GlobalWin.MainForm.PutCoreSyncSettings(_syncSettings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - MessageBox.Show("Invalid joystick configuration. \nDuplicates have automatically been changed to NULL.\n\nPlease review the configuration"); - } - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Joystick settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.resx b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.resx deleted file mode 100644 index c45473925d..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumJoystickSettings.resx +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ZXHawk is set up to allow 3 different unique joysticks to be attached at one time. - -This is because the Kempston joystick had to be attached via a Kempton interface plugged into the single expansion port. The Sinclair and Cursor joysticks effectively mapped to different key presses on the keyboard. - - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.cs b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.cs deleted file mode 100644 index 8ba83a082b..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ZXSpectrumNonSyncSettings : Form - { - private ZXSpectrum.ZXSpectrumSettings _settings; - private int bgColor; - - public ZXSpectrumNonSyncSettings() - { - InitializeComponent(); - } - - private void IntvControllerSettings_Load(object sender, EventArgs e) - { - _settings = ((ZXSpectrum)Global.Emulator).GetSettings().Clone(); - - bgColor = _settings.BackgroundColor; - - SetBtnColor(); - - checkBoxShowCoreBrdColor.Checked = _settings.UseCoreBorderForBackground; - - // OSD Message Verbosity - var osdTypes = Enum.GetNames(typeof(ZXSpectrum.OSDVerbosity)); - foreach (var val in osdTypes) - { - osdMessageVerbositycomboBox1.Items.Add(val); - } - osdMessageVerbositycomboBox1.SelectedItem = _settings.OSDMessageVerbosity.ToString(); - UpdateOSDNotes((ZXSpectrum.OSDVerbosity)Enum.Parse(typeof(ZXSpectrum.OSDVerbosity), osdMessageVerbositycomboBox1.SelectedItem.ToString())); - } - - private void SetBtnColor() - { - var c = System.Drawing.Color.FromArgb(bgColor); - buttonChooseBGColor.ForeColor = c; - buttonChooseBGColor.BackColor = c; - } - - private void OkBtn_Click(object sender, EventArgs e) - { - bool changed = - _settings.OSDMessageVerbosity.ToString() != osdMessageVerbositycomboBox1.SelectedItem.ToString() || - _settings.BackgroundColor != bgColor || - _settings.UseCoreBorderForBackground != checkBoxShowCoreBrdColor.Checked; - - if (changed) - { - _settings.OSDMessageVerbosity = (ZXSpectrum.OSDVerbosity)Enum.Parse(typeof(ZXSpectrum.OSDVerbosity), osdMessageVerbositycomboBox1.SelectedItem.ToString()); - _settings.BackgroundColor = bgColor; - _settings.UseCoreBorderForBackground = checkBoxShowCoreBrdColor.Checked; - - GlobalWin.MainForm.PutCoreSettings(_settings); - - DialogResult = DialogResult.OK; - Close(); - } - else - { - DialogResult = DialogResult.OK; - Close(); - } - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("Misc settings aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - - private void UpdateOSDNotes(ZXSpectrum.OSDVerbosity type) - { - switch (type) - { - case ZXSpectrum.OSDVerbosity.Full: - lblOSDVerbinfo.Text = "Show all OSD messages"; - break; - case ZXSpectrum.OSDVerbosity.Medium: - lblOSDVerbinfo.Text = "Only show machine/device generated messages"; - break; - case ZXSpectrum.OSDVerbosity.None: - lblOSDVerbinfo.Text = "No core-driven OSD messages"; - break; - } - } - - private void OSDComboBox_SelectionChangeCommitted(object sender, EventArgs e) - { - ComboBox cb = sender as ComboBox; - UpdateOSDNotes((ZXSpectrum.OSDVerbosity)Enum.Parse(typeof(ZXSpectrum.OSDVerbosity), cb.SelectedItem.ToString())); - } - - private void buttonChooseBGColor_Click(object sender, EventArgs e) - { - var currColor = _settings.BackgroundColor; - System.Drawing.Color c = System.Drawing.Color.FromArgb(currColor); - ColorDialog cd = new ColorDialog(); - - System.Drawing.Color[] colors = new System.Drawing.Color[] - { - System.Drawing.Color.FromArgb(0x00, 0x00, 0x00), - System.Drawing.Color.FromArgb(0x00, 0x00, 0xD7), - System.Drawing.Color.FromArgb(0xD7, 0x00, 0xD7), - System.Drawing.Color.FromArgb(0x00, 0xD7, 0x00), - System.Drawing.Color.FromArgb(0x00, 0xD7, 0xD7), - System.Drawing.Color.FromArgb(0xD7, 0xD7, 0x00), - System.Drawing.Color.FromArgb(0xD7, 0xD7, 0xD7), - System.Drawing.Color.FromArgb(0x00, 0x00, 0xFF), - System.Drawing.Color.FromArgb(0x00, 0x00, 0x00), - System.Drawing.Color.FromArgb(0x00, 0x00, 0xFF), - System.Drawing.Color.FromArgb(0xFF, 0x00, 0x00), - System.Drawing.Color.FromArgb(0xFF, 0x00, 0xFF), - System.Drawing.Color.FromArgb(0x00, 0xFF, 0x00), - System.Drawing.Color.FromArgb(0x00, 0xFF, 0xFF), - System.Drawing.Color.FromArgb(0xFF, 0xFF, 0x00), - System.Drawing.Color.FromArgb(0xFF, 0xFF, 0xFF), - }; - - cd.CustomColors = new int[] - { - System.Drawing.ColorTranslator.ToOle(colors[0]), - System.Drawing.ColorTranslator.ToOle(colors[1]), - System.Drawing.ColorTranslator.ToOle(colors[2]), - System.Drawing.ColorTranslator.ToOle(colors[3]), - System.Drawing.ColorTranslator.ToOle(colors[4]), - System.Drawing.ColorTranslator.ToOle(colors[5]), - System.Drawing.ColorTranslator.ToOle(colors[6]), - System.Drawing.ColorTranslator.ToOle(colors[7]), - System.Drawing.ColorTranslator.ToOle(colors[8]), - System.Drawing.ColorTranslator.ToOle(colors[9]), - System.Drawing.ColorTranslator.ToOle(colors[10]), - System.Drawing.ColorTranslator.ToOle(colors[11]), - System.Drawing.ColorTranslator.ToOle(colors[12]), - System.Drawing.ColorTranslator.ToOle(colors[13]), - System.Drawing.ColorTranslator.ToOle(colors[14]), - System.Drawing.ColorTranslator.ToOle(colors[15]), - }; - - cd.Color = c; - - if (cd.ShowDialog() == DialogResult.OK) - { - var color = cd.Color; - var col = color.ToArgb(); - bgColor = col; - - SetBtnColor(); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.resx b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumNonSyncSettings.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.cs b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.cs deleted file mode 100644 index de0c799f24..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Emulation.Cores.Computers.SinclairSpectrum; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class ZXSpectrumPokeMemory : Form - { - private ZXSpectrum.ZXSpectrumSettings _settings; - - public ZXSpectrumPokeMemory() - { - InitializeComponent(); - } - - private void OkBtn_Click(object sender, EventArgs e) - { - var speccy = (ZXSpectrum)Global.Emulator; - var addr = (ushort)numericUpDownAddress.Value; - var val = (byte)numericUpDownByte.Value; - - speccy.PokeMemory(addr, val); - - DialogResult = DialogResult.OK; - Close(); - } - - private void CancelBtn_Click(object sender, EventArgs e) - { - GlobalWin.OSD.AddMessage("POKE memory aborted"); - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.resx b/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.resx deleted file mode 100644 index ca821b54f8..0000000000 --- a/BizHawk.Client.EmuHawk/config/ZXSpectrum/ZXSpectrumPokeMemory.resx +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA - BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ - AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm - AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA - AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA - AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw - AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA - AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ - AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA - AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE - AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3 - dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH - x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI - cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI - h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA - AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH - eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA - AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC - AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ - AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA - AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA - AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA - AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI - h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA - yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA - AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB - /AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA////////////////////////// - //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA - d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI - yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH - d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/ - /wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP// - /wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA - AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI - iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA - AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP// - AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8 - PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF - RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU - VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP - UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ - WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s - awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr - agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4 - dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf - TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5 - +gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC - ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh - oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP - kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj - jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk - owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1 - swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr - 9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme - VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A - H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP//// - AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA - AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/ - AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE - AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc - XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55 - eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg - YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51 - dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz - dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz - dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM - 5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO - jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A - gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud - iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc - mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer - qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv - rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2 - tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV - 3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa - mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc - tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA - AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882 - AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP - z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb - orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR - l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH - ///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA - AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA - AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2 - dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15 - eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+ - fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek - VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P - jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK - iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ - mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi - oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8 - ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf - 8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA - AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy - NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA - PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM - mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ - hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv - YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// - /wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA - BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA - AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw - cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K - igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS - kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay - sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS - 0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA - AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb - Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5 - AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA - AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS - U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP - T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY - V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw - cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4 - uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA - AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6 - ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8 - vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA - ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT - kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck - pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6 - OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk - ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br - auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0 - c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg - n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA - AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA - vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg - nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO - zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv - rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH - RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF - RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+ - vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB - vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX - V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i - pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/ - vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv - L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z - sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9 - uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e - nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6 - t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV - lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6 - u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC - gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej - hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y - sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T - k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn - JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC - QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK - StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/ - QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+ - PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L - S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ - SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ - Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2 - NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km - Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af//// - AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA - B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA - AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA - AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB// - AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA - AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q - av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw - cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1 - dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4 - ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+ - Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA - AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA - AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc - HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A - f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z - sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui - of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP - z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB - v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8 - vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ - x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O - Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK - yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz - dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc - 9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI - zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw - t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il - o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX - V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc - XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6 - OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD - ///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4 - D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA - ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv - 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 - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/images/AVI.png b/BizHawk.Client.EmuHawk/images/AVI.png deleted file mode 100644 index 47f3216425..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/AVI.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/AddEdit.png b/BizHawk.Client.EmuHawk/images/AddEdit.png deleted file mode 100644 index 73c6ebf990..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/AddEdit.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/AtariControllerIcon.png b/BizHawk.Client.EmuHawk/images/AtariControllerIcon.png deleted file mode 100644 index 2d2444e123..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/AtariControllerIcon.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/AudioHS.png b/BizHawk.Client.EmuHawk/images/AudioHS.png deleted file mode 100644 index 614cc0da98..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/AudioHS.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Back.png b/BizHawk.Client.EmuHawk/images/Back.png deleted file mode 100644 index 74c21f21c3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Back.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/BackMore.png b/BizHawk.Client.EmuHawk/images/BackMore.png deleted file mode 100644 index f399933f9b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/BackMore.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Blank.png b/BizHawk.Client.EmuHawk/images/Blank.png deleted file mode 100644 index ab2a9ccc02..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Blank.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Both.png b/BizHawk.Client.EmuHawk/images/Both.png deleted file mode 100644 index a949badfe7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Both.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Bug.png b/BizHawk.Client.EmuHawk/images/Bug.png deleted file mode 100644 index 9b7265b3e9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Bug.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/C64Symbol.png b/BizHawk.Client.EmuHawk/images/C64Symbol.png deleted file mode 100644 index cf51f73786..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/C64Symbol.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Close.png b/BizHawk.Client.EmuHawk/images/Close.png deleted file mode 100644 index 7182e539dd..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Close.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/A78Joystick.png b/BizHawk.Client.EmuHawk/images/ControllerImages/A78Joystick.png deleted file mode 100644 index 1c1dad9150..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/A78Joystick.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/AppleIIKeyboard.png b/BizHawk.Client.EmuHawk/images/ControllerImages/AppleIIKeyboard.png deleted file mode 100644 index 519910281d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/AppleIIKeyboard.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/C64Joystick.png b/BizHawk.Client.EmuHawk/images/ControllerImages/C64Joystick.png deleted file mode 100644 index d5ce8bde37..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/C64Joystick.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/C64Keyboard.png b/BizHawk.Client.EmuHawk/images/ControllerImages/C64Keyboard.png deleted file mode 100644 index 2c87e91ce0..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/C64Keyboard.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/GBA_Controller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/GBA_Controller.png deleted file mode 100644 index 9eee422dc5..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/GBA_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/GBController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/GBController.png deleted file mode 100644 index 2bbbd380b5..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/GBController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/GENController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/GENController.png deleted file mode 100644 index 898b8cac19..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/GENController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/IntVController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/IntVController.png deleted file mode 100644 index 0a6fe8b09f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/IntVController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/Lynx.png b/BizHawk.Client.EmuHawk/images/ControllerImages/Lynx.png deleted file mode 100644 index ab135c6d7d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/Lynx.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/N64.png b/BizHawk.Client.EmuHawk/images/ControllerImages/N64.png deleted file mode 100644 index d4403059a9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/N64.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/NES_Controller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/NES_Controller.png deleted file mode 100644 index da59820a7d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/NES_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/PCEngineController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/PCEngineController.png deleted file mode 100644 index d2637c411e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/PCEngineController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/PSX-Original-Controller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/PSX-Original-Controller.png deleted file mode 100644 index 6dd8398dae..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/PSX-Original-Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/SMSController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/SMSController.png deleted file mode 100644 index 7ebf0fe021..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/SMSController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/SNES_Controller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/SNES_Controller.png deleted file mode 100644 index 86e997787f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/SNES_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/SaturnController.jpg b/BizHawk.Client.EmuHawk/images/ControllerImages/SaturnController.jpg deleted file mode 100644 index 7888841362..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/SaturnController.jpg and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/TI83Calculator.png b/BizHawk.Client.EmuHawk/images/ControllerImages/TI83Calculator.png deleted file mode 100644 index 3036917333..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/TI83Calculator.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/TI83_Controller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/TI83_Controller.png deleted file mode 100644 index 51e57f97a1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/TI83_Controller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/VBoyController.png b/BizHawk.Client.EmuHawk/images/ControllerImages/VBoyController.png deleted file mode 100644 index 59bef68ff7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/VBoyController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/WonderSwanColor.png b/BizHawk.Client.EmuHawk/images/ControllerImages/WonderSwanColor.png deleted file mode 100644 index e6ef63cd48..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/WonderSwanColor.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/colecovisioncontroller.png b/BizHawk.Client.EmuHawk/images/ControllerImages/colecovisioncontroller.png deleted file mode 100644 index e865a07b86..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/colecovisioncontroller.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ControllerImages/psx_dualshock.png b/BizHawk.Client.EmuHawk/images/ControllerImages/psx_dualshock.png deleted file mode 100644 index 3ca47a305a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ControllerImages/psx_dualshock.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/CorpHawkSmall.png b/BizHawk.Client.EmuHawk/images/CorpHawkSmall.png deleted file mode 100644 index c17d8dc028..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/CorpHawkSmall.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Cross.png b/BizHawk.Client.EmuHawk/images/Cross.png deleted file mode 100644 index 28a9c09f8d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Cross.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/CutHS.png b/BizHawk.Client.EmuHawk/images/CutHS.png deleted file mode 100644 index 449f92f08c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/CutHS.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Delete.png b/BizHawk.Client.EmuHawk/images/Delete.png deleted file mode 100644 index 16f24e0de8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Delete.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ENE.png b/BizHawk.Client.EmuHawk/images/ENE.png deleted file mode 100644 index 48ea5e0e5a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ENE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ESE.png b/BizHawk.Client.EmuHawk/images/ESE.png deleted file mode 100644 index 8bc8c0cc18..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ESE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Erase.png b/BizHawk.Client.EmuHawk/images/Erase.png deleted file mode 100644 index 6b716c3dc0..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Erase.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ExclamationRed.png b/BizHawk.Client.EmuHawk/images/ExclamationRed.png deleted file mode 100644 index e1e238ad30..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ExclamationRed.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Freeze.png b/BizHawk.Client.EmuHawk/images/Freeze.png deleted file mode 100644 index 8707356101..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Freeze.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Fullscreen.png b/BizHawk.Client.EmuHawk/images/Fullscreen.png deleted file mode 100644 index d57607a351..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Fullscreen.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/GameController.png b/BizHawk.Client.EmuHawk/images/GameController.png deleted file mode 100644 index 268da4cbe6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/GameController.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Hack.png b/BizHawk.Client.EmuHawk/images/Hack.png deleted file mode 100644 index cc95ab4e30..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Hack.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/HawkInLove.png b/BizHawk.Client.EmuHawk/images/HawkInLove.png deleted file mode 100644 index e29af04f0e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/HawkInLove.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/HomeBrew.png b/BizHawk.Client.EmuHawk/images/HomeBrew.png deleted file mode 100644 index f14d7d4cda..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/HomeBrew.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/HotKeys.png b/BizHawk.Client.EmuHawk/images/HotKeys.png deleted file mode 100644 index 56967c36bf..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/HotKeys.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/JumpTo.png b/BizHawk.Client.EmuHawk/images/JumpTo.png deleted file mode 100644 index 733adba85c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/JumpTo.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/LightOff.png b/BizHawk.Client.EmuHawk/images/LightOff.png deleted file mode 100644 index 82ef6b0df2..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/LightOff.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/LightOn.png b/BizHawk.Client.EmuHawk/images/LightOn.png deleted file mode 100644 index 3390074dea..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/LightOn.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/LoadConfig.png b/BizHawk.Client.EmuHawk/images/LoadConfig.png deleted file mode 100644 index 329988cfff..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/LoadConfig.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Lua.png b/BizHawk.Client.EmuHawk/images/Lua.png deleted file mode 100644 index 34e6f4d65b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Lua.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/NE.png b/BizHawk.Client.EmuHawk/images/NE.png deleted file mode 100644 index 982a3b242d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/NE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/NNE.png b/BizHawk.Client.EmuHawk/images/NNE.png deleted file mode 100644 index ea2dc3655e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/NNE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/NNW.png b/BizHawk.Client.EmuHawk/images/NNW.png deleted file mode 100644 index f8788da18e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/NNW.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/NW.png b/BizHawk.Client.EmuHawk/images/NW.png deleted file mode 100644 index e732d7233f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/NW.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/NewFile.png b/BizHawk.Client.EmuHawk/images/NewFile.png deleted file mode 100644 index ee8faf24a8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/NewFile.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Pause.png b/BizHawk.Client.EmuHawk/images/Pause.png deleted file mode 100644 index 302f04ba75..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Pause.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Play.png b/BizHawk.Client.EmuHawk/images/Play.png deleted file mode 100644 index 8773c25147..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Play.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Previous.png b/BizHawk.Client.EmuHawk/images/Previous.png deleted file mode 100644 index 1789227599..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Previous.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/QuickNes.png b/BizHawk.Client.EmuHawk/images/QuickNes.png deleted file mode 100644 index 5792558e8a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/QuickNes.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Recent.png b/BizHawk.Client.EmuHawk/images/Recent.png deleted file mode 100644 index bf4416d175..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Recent.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/RecordHS.png b/BizHawk.Client.EmuHawk/images/RecordHS.png deleted file mode 100644 index a75db7757e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/RecordHS.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Refresh.png b/BizHawk.Client.EmuHawk/images/Refresh.png deleted file mode 100644 index 5d9a1a7766..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Refresh.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/RetroQuestion.png b/BizHawk.Client.EmuHawk/images/RetroQuestion.png deleted file mode 100644 index 8eb1682b39..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/RetroQuestion.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/SE.png b/BizHawk.Client.EmuHawk/images/SE.png deleted file mode 100644 index d0ac5e9075..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/SE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/SSE.png b/BizHawk.Client.EmuHawk/images/SSE.png deleted file mode 100644 index b31f29ddea..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/SSE.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/SSW.png b/BizHawk.Client.EmuHawk/images/SSW.png deleted file mode 100644 index 4f7bd90358..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/SSW.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/SW.png b/BizHawk.Client.EmuHawk/images/SW.png deleted file mode 100644 index e242a310be..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/SW.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Save.png b/BizHawk.Client.EmuHawk/images/Save.png deleted file mode 100644 index b0ce1f9f55..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Save.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Scan.png b/BizHawk.Client.EmuHawk/images/Scan.png deleted file mode 100644 index 7bb7d4092e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Scan.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ScrollTo.png b/BizHawk.Client.EmuHawk/images/ScrollTo.png deleted file mode 100644 index 4429e339c5..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ScrollTo.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Shark.png b/BizHawk.Client.EmuHawk/images/Shark.png deleted file mode 100644 index e6ff5fb55b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Shark.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Stop.png b/BizHawk.Client.EmuHawk/images/Stop.png deleted file mode 100644 index a62d26f71b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Stop.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/TAStudio.png b/BizHawk.Client.EmuHawk/images/TAStudio.png deleted file mode 100644 index 65cd18bbe6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/TAStudio.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ToolBox.png b/BizHawk.Client.EmuHawk/images/ToolBox.png deleted file mode 100644 index aed1f9c643..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ToolBox.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Translation.png b/BizHawk.Client.EmuHawk/images/Translation.png deleted file mode 100644 index 2ddedbb605..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Translation.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Triangle.png b/BizHawk.Client.EmuHawk/images/Triangle.png deleted file mode 100644 index 39562995ec..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Triangle.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/TruncateFromFile.png b/BizHawk.Client.EmuHawk/images/TruncateFromFile.png deleted file mode 100644 index af595112ad..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/TruncateFromFile.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/TruncateFromRW.png b/BizHawk.Client.EmuHawk/images/TruncateFromRW.png deleted file mode 100644 index 1a33ab58c1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/TruncateFromRW.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/TurboFastForward.png b/BizHawk.Client.EmuHawk/images/TurboFastForward.png deleted file mode 100644 index 01006b0bbf..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/TurboFastForward.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/Unfreeze.png b/BizHawk.Client.EmuHawk/images/Unfreeze.png deleted file mode 100644 index ac0d6da1d3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/Unfreeze.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/YellowLeft.png b/BizHawk.Client.EmuHawk/images/YellowLeft.png deleted file mode 100644 index 517ab4c4e6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/YellowLeft.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/alt_about_image.png b/BizHawk.Client.EmuHawk/images/alt_about_image.png deleted file mode 100644 index 4cfc93c4be..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/alt_about_image.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/camera.png b/BizHawk.Client.EmuHawk/images/camera.png deleted file mode 100644 index 21b72b07fa..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/camera.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/cheat.png b/BizHawk.Client.EmuHawk/images/cheat.png deleted file mode 100644 index 83449e7c91..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/cheat.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/console16x16.png b/BizHawk.Client.EmuHawk/images/console16x16.png deleted file mode 100644 index dd358db49a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/console16x16.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/console32x32.png b/BizHawk.Client.EmuHawk/images/console32x32.png deleted file mode 100644 index edc0c4f3da..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/console32x32.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/corphawk.jpg b/BizHawk.Client.EmuHawk/images/corphawk.jpg deleted file mode 100644 index 5c65d2d271..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/corphawk.jpg and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/dual.png b/BizHawk.Client.EmuHawk/images/dual.png deleted file mode 100644 index 37fd7b0806..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/dual.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/gambatte.png b/BizHawk.Client.EmuHawk/images/gambatte.png deleted file mode 100644 index 7a3de1551d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/gambatte.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/kitchensink.png b/BizHawk.Client.EmuHawk/images/kitchensink.png deleted file mode 100644 index b5453eb3f2..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/kitchensink.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/monitor.png b/BizHawk.Client.EmuHawk/images/monitor.png deleted file mode 100644 index 93bf3ec5e1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/monitor.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/pcb.png b/BizHawk.Client.EmuHawk/images/pcb.png deleted file mode 100644 index f24421c2a4..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/pcb.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/ppsspp.png b/BizHawk.Client.EmuHawk/images/ppsspp.png deleted file mode 100644 index 4eca06dcae..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/ppsspp.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/reboot.png b/BizHawk.Client.EmuHawk/images/reboot.png deleted file mode 100644 index f7ef40ae9b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/reboot.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/redo.png b/BizHawk.Client.EmuHawk/images/redo.png deleted file mode 100644 index 90dd179418..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/redo.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/search.png b/BizHawk.Client.EmuHawk/images/search.png deleted file mode 100644 index 4c3145b541..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/search.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/sms-icon.png b/BizHawk.Client.EmuHawk/images/sms-icon.png deleted file mode 100644 index cd629ac554..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/sms-icon.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/snes9x.png b/BizHawk.Client.EmuHawk/images/snes9x.png deleted file mode 100644 index 61683a0761..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/snes9x.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor.png b/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor.png deleted file mode 100644 index e0151ac14d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor_lag.png b/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor_lag.png deleted file mode 100644 index a1f32b6139..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/icon_anchor_lag.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/icon_marker.png b/BizHawk.Client.EmuHawk/images/tastudio/icon_marker.png deleted file mode 100644 index 8ddcb829ab..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/icon_marker.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_blue.png deleted file mode 100644 index 589f92884a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green.png deleted file mode 100644 index c747468ed9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green_blue.png deleted file mode 100644 index 0c0c46ae91..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_arrow_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00.png deleted file mode 100644 index 955582c9de..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_blue.png deleted file mode 100644 index e85c941c84..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green.png deleted file mode 100644 index 89aae3e5e6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green_blue.png deleted file mode 100644 index 84e413b9d7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_00_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01.png deleted file mode 100644 index fb4b0e1119..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_blue.png deleted file mode 100644 index 2145f7af09..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green.png deleted file mode 100644 index cf802a03cd..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green_blue.png deleted file mode 100644 index c434f4ae7c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_01_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_blue.png deleted file mode 100644 index 8fdcafbab9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green.png deleted file mode 100644 index 68fd227ff1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green_blue.png deleted file mode 100644 index 884b7093ab..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_02_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03.png deleted file mode 100644 index 78b6f479f6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_blue.png deleted file mode 100644 index 11b14ec654..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green.png deleted file mode 100644 index fce606eb7c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green_blue.png deleted file mode 100644 index 0853d47f2e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_03_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04.png deleted file mode 100644 index 6ff4fd87ac..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_blue.png deleted file mode 100644 index eb53fdf764..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green.png deleted file mode 100644 index d5f0bcfa42..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green_blue.png deleted file mode 100644 index 96cfc7424e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_04_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05.png deleted file mode 100644 index 3c629b1cc3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_blue.png deleted file mode 100644 index 93c0829e8c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green.png deleted file mode 100644 index 8b88bb7499..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green_blue.png deleted file mode 100644 index 3f166c65e3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_05_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06.png deleted file mode 100644 index cf24acacb8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06_blue.png deleted file mode 100644 index 19d4b10924..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_06_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07.png deleted file mode 100644 index a4152a6964..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_blue.png deleted file mode 100644 index de5107eb59..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green.png deleted file mode 100644 index 553ebba2de..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green_blue.png deleted file mode 100644 index 77249f8fc8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_07_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08.png deleted file mode 100644 index 98d790ad3a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_blue.png deleted file mode 100644 index a7ee4658e3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_green_blue.png deleted file mode 100644 index fc7a5e854b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_08_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09.png deleted file mode 100644 index be54ece2d3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_blue.png deleted file mode 100644 index d6e8a68f5c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_green_blue.png deleted file mode 100644 index b89bdba916..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_09_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10.png deleted file mode 100644 index 708b07e0c7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_blue.png deleted file mode 100644 index bf717ba16e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green.png deleted file mode 100644 index cc8adf1632..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green_blue.png deleted file mode 100644 index a2d31643f6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_10_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11.png deleted file mode 100644 index bc2639c51f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_blue.png deleted file mode 100644 index 4359a6d2d7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green.png deleted file mode 100644 index 6a10ced43a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green_blue.png deleted file mode 100644 index a14ae500a3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_11_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12.png deleted file mode 100644 index 3252ece944..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_blue.png deleted file mode 100644 index 475de85df8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_green.png deleted file mode 100644 index 616354d4c6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_12_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13.png deleted file mode 100644 index 490aeef557..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13_blue.png deleted file mode 100644 index fa43a9b3c8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_13_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14.png deleted file mode 100644 index 53621e56f1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_blue.png deleted file mode 100644 index 047303d1a7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_green.png deleted file mode 100644 index 647dd9f69e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_14_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15.png deleted file mode 100644 index 5525b5527b..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15_blue.png deleted file mode 100644 index ec64b938a3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_15_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16.png deleted file mode 100644 index 88e85232d6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_blue.png deleted file mode 100644 index 5f33a16a97..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_green.png deleted file mode 100644 index e32c587ee3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_16_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17.png deleted file mode 100644 index c1f81606fd..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_blue.png deleted file mode 100644 index a6b1546b2c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_green.png deleted file mode 100644 index a8d7bcc6d5..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_17_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18.png deleted file mode 100644 index efc1b510d8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_blue.png deleted file mode 100644 index a422f4dabc..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_green.png deleted file mode 100644 index b480d86417..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_18_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19.png deleted file mode 100644 index 57efe196f0..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_blue.png deleted file mode 100644 index d1f33ae98e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_green.png deleted file mode 100644 index 69ae57d3ba..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_h_piano_19_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_blue.png deleted file mode 100644 index 9f67151ad7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green.png deleted file mode 100644 index e79cee8272..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green_blue.png deleted file mode 100644 index 995c7f34cc..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_arrow_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00.png deleted file mode 100644 index f482e29c53..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_blue.png deleted file mode 100644 index d097b961c0..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green.png deleted file mode 100644 index 3bea8a7152..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green_blue.png deleted file mode 100644 index d8c6772442..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_00_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01.png deleted file mode 100644 index e432d151a7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_blue.png deleted file mode 100644 index 68e699d2cc..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green.png deleted file mode 100644 index fda832b129..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green_blue.png deleted file mode 100644 index 055b5e34ae..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_01_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_blue.png deleted file mode 100644 index d4c5ae0b78..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green.png deleted file mode 100644 index 4669b60ea6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green_blue.png deleted file mode 100644 index 3eab16a930..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_02_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03.png deleted file mode 100644 index cb0d3c7d28..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_blue.png deleted file mode 100644 index cf6c18d8f3..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green.png deleted file mode 100644 index 857f100a8a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green_blue.png deleted file mode 100644 index 6b66fec26e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_03_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04.png deleted file mode 100644 index 54dd1fe623..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_blue.png deleted file mode 100644 index aa9cb05d93..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green.png deleted file mode 100644 index d63b74ed6a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green_blue.png deleted file mode 100644 index bf32affa9f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_04_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05.png deleted file mode 100644 index 82210096a8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_blue.png deleted file mode 100644 index 34e2f0ca60..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green.png deleted file mode 100644 index 50e1d6a5a4..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green_blue.png deleted file mode 100644 index 6105439cdd..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_05_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06.png deleted file mode 100644 index a9eb98e28a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_blue.png deleted file mode 100644 index b2c4d2d636..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green.png deleted file mode 100644 index 69f767c496..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green_blue.png deleted file mode 100644 index 9409c4eb32..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_06_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_blue.png deleted file mode 100644 index 36cbb17fd8..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green.png deleted file mode 100644 index 3676cc07ab..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green_blue.png deleted file mode 100644 index c138d609b2..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_07_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08.png deleted file mode 100644 index 6beb021447..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_blue.png deleted file mode 100644 index 731344cb9e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green.png deleted file mode 100644 index 77653b1b0c..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green_blue.png deleted file mode 100644 index e23bb30670..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_08_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09.png deleted file mode 100644 index dd1ee94e33..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_blue.png deleted file mode 100644 index 48d3d10a33..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green.png deleted file mode 100644 index 9951af20be..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green_blue.png deleted file mode 100644 index b232aefd36..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_09_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10.png deleted file mode 100644 index d963edf154..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_blue.png deleted file mode 100644 index 2672096255..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green.png deleted file mode 100644 index 1ad36f7523..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green_blue.png deleted file mode 100644 index ae1a149968..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_10_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11.png deleted file mode 100644 index b8561b14b4..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_blue.png deleted file mode 100644 index 775fbb53e7..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green.png deleted file mode 100644 index 2317ef4866..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green_blue.png deleted file mode 100644 index 285e3d08c9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_11_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_blue.png deleted file mode 100644 index e9e033aa71..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green.png deleted file mode 100644 index b46277ceb4..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green_blue.png deleted file mode 100644 index f165c1ba36..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_12_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13.png deleted file mode 100644 index 99a7ef48ac..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_blue.png deleted file mode 100644 index 103941a3b6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green.png deleted file mode 100644 index 990ae51102..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green_blue.png deleted file mode 100644 index 6a3d1731b2..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_13_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14.png deleted file mode 100644 index d0ff5c07c0..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_blue.png deleted file mode 100644 index 7e7998a1ea..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green.png deleted file mode 100644 index 22257c3838..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green_blue.png deleted file mode 100644 index 4f47fbdc30..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_14_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15.png deleted file mode 100644 index b2b020f0a9..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_blue.png deleted file mode 100644 index 7584278120..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green.png deleted file mode 100644 index 3a758eabac..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green_blue.png deleted file mode 100644 index 5639415d18..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_15_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16.png deleted file mode 100644 index 3388cbb364..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_blue.png deleted file mode 100644 index f4feefad6e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green.png deleted file mode 100644 index aa5f82770f..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green_blue.png deleted file mode 100644 index 0fcd7276ab..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_16_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17.png deleted file mode 100644 index ceb01571a5..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_blue.png deleted file mode 100644 index d9c446a8de..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green.png deleted file mode 100644 index 9e52809109..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green_blue.png deleted file mode 100644 index 8d6681c4f6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_17_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18.png deleted file mode 100644 index 0c0505f543..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_blue.png deleted file mode 100644 index 651bfdf1dc..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green.png deleted file mode 100644 index e95eed2e50..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green_blue.png deleted file mode 100644 index 0e2d5a0eec..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_18_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19.png deleted file mode 100644 index 3e8314449a..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_blue.png deleted file mode 100644 index 5ed0b077e2..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green.png deleted file mode 100644 index bacc7ac208..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green_blue.png b/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green_blue.png deleted file mode 100644 index 9dcdbf2519..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tastudio/ts_v_piano_19_green_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/textdoc.png b/BizHawk.Client.EmuHawk/images/textdoc.png deleted file mode 100644 index 5a31e768c6..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/textdoc.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/thumbsdown.png b/BizHawk.Client.EmuHawk/images/thumbsdown.png deleted file mode 100644 index 2fe368c3d4..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/thumbsdown.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/tvIcon.png b/BizHawk.Client.EmuHawk/images/tvIcon.png deleted file mode 100644 index 4dd7a8732d..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/tvIcon.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/undo.png b/BizHawk.Client.EmuHawk/images/undo.png deleted file mode 100644 index 085e769122..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/undo.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/user_blue.png b/BizHawk.Client.EmuHawk/images/user_blue.png deleted file mode 100644 index 0c76dd066e..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/user_blue.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/whiteTriDown.png b/BizHawk.Client.EmuHawk/images/whiteTriDown.png deleted file mode 100644 index de77507e87..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/whiteTriDown.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/whiteTriLeft.png b/BizHawk.Client.EmuHawk/images/whiteTriLeft.png deleted file mode 100644 index 0334f5a1d1..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/whiteTriLeft.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/whiteTriRight.png b/BizHawk.Client.EmuHawk/images/whiteTriRight.png deleted file mode 100644 index 7d24215e62..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/whiteTriRight.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/images/whiteTriUp.png b/BizHawk.Client.EmuHawk/images/whiteTriUp.png deleted file mode 100644 index c813f49628..0000000000 Binary files a/BizHawk.Client.EmuHawk/images/whiteTriUp.png and /dev/null differ diff --git a/BizHawk.Client.EmuHawk/movie/EditCommentsForm.resx b/BizHawk.Client.EmuHawk/movie/EditCommentsForm.resx deleted file mode 100644 index e059d9a791..0000000000 --- a/BizHawk.Client.EmuHawk/movie/EditCommentsForm.resx +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - - - AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////AP64aABQUFAAwNjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAMDAAMDAwAAAAAAAAAAAAMCAgMDAwMDAwAAAAMDAAADAgICAwMDAwMDAwMCAgMAAAMCAwMD - AwMDAwMDAgIDAAMEBAQDAgMDAwMDAwICAgMDBAQEAwICAwQDAwQDAgIDAAMDAwICAgMCAgIDAwMDAAAA - AwICAgMCAgIDAgMAAAAAAAAAAwMEBAQEBAQCAwAAAAAAAwMEBAQDAwMDAwMAAAAAAwQEAwMEBAMEBAQC - AwAAAAMEBAMDBAMEBAQEAgMAAAAAAwMDBAQDBAMDAwIDAAAAAAMCAgICAgICAgMEBAMAAAAAAwICAgIC - AwMEBAQDAAAAAAADAwMDAwAAAwMDAJH/AAAAcwAAAAEAAIABAAAAAAAAAAAAAIABAADABwAA8AMAAOAD - AADAAQAAwAEAAOABAADgAAAA8AAAAPgxAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.cs b/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.cs deleted file mode 100644 index 730b271e0c..0000000000 --- a/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using System.Globalization; - -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class EditSubtitlesForm : Form - { - public bool ReadOnly { get; set; } - private IMovie _selectedMovie; - - public EditSubtitlesForm() - { - InitializeComponent(); - } - - private void EditSubtitlesForm_Load(object sender, EventArgs e) - { - if (ReadOnly) - { - // Set all columns to read only - for (int i = 0; i < SubGrid.Columns.Count; i++) - { - SubGrid.Columns[i].ReadOnly = true; - } - - Text = "View Subtitles"; - } - - if (SubGrid.Rows.Count > 8) - { - var x = Height + ((SubGrid.Rows.Count - 8) * 21); - Height = x < 600 ? x : 600; - } - } - - private void Cancel_Click(object sender, EventArgs e) - { - Close(); - } - - private void ShowError(int row, int column) - { - var c = SubGrid.Rows[row].Cells[column]; - var error = "Unable to parse value: " + c.Value; - var caption = "Parse Error Row " + row + " Column " + column; - MessageBox.Show(error, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - private void Ok_Click(object sender, EventArgs e) - { - if (!ReadOnly) - { - _selectedMovie.Subtitles.Clear(); - for (int i = 0; i < SubGrid.Rows.Count - 1; i++) - { - var s = new Subtitle(); - - var c = SubGrid.Rows[i].Cells[0]; - try { s.Frame = int.Parse(c.Value.ToString()); } - catch { ShowError(i, 0); return; } - c = SubGrid.Rows[i].Cells[1]; - try { s.X = int.Parse(c.Value.ToString()); } - catch { ShowError(i, 1); return; } - c = SubGrid.Rows[i].Cells[2]; - try { s.Y = int.Parse(c.Value.ToString()); } - catch { ShowError(i, 2); return; } - c = SubGrid.Rows[i].Cells[3]; - try { s.Duration = int.Parse(c.Value.ToString()); } - catch { ShowError(i, 3); return; } - c = SubGrid.Rows[i].Cells[4]; - try { s.Color = uint.Parse(c.Value.ToString(), NumberStyles.HexNumber); } - catch { ShowError(i, 4); return; } - try { c = SubGrid.Rows[i].Cells[5]; } - catch { ShowError(i, 5); return; } - s.Message = c.Value.ToString(); - _selectedMovie.Subtitles.Add(s); - } - _selectedMovie.Save(); - } - Close(); - } - - public void GetMovie(IMovie m) - { - _selectedMovie = m; - var subs = new SubtitleList(); - subs.AddRange(m.Subtitles); - - for (int x = 0; x < subs.Count; x++) - { - var s = subs[x]; - SubGrid.Rows.Add(); - var c = SubGrid.Rows[x].Cells[0]; - c.Value = s.Frame; - c = SubGrid.Rows[x].Cells[1]; - c.Value = s.X; - c = SubGrid.Rows[x].Cells[2]; - c.Value = s.Y; - c = SubGrid.Rows[x].Cells[3]; - c.Value = s.Duration; - c = SubGrid.Rows[x].Cells[4]; - c.Value = string.Format("{0:X8}", s.Color); - c.Style.BackColor = Color.FromArgb((int)s.Color); - c = SubGrid.Rows[x].Cells[5]; - c.Value = s.Message; - } - } - - private void ChangeRow(Subtitle s, int index) - { - if (index >= SubGrid.Rows.Count) - { - return; - } - - var c = SubGrid.Rows[index].Cells[0]; - c.Value = s.Frame; - c = SubGrid.Rows[index].Cells[1]; - c.Value = s.X; - c = SubGrid.Rows[index].Cells[2]; - c.Value = s.Y; - c = SubGrid.Rows[index].Cells[3]; - c.Value = s.Duration; - c = SubGrid.Rows[index].Cells[4]; - c.Value = string.Format("{0:X8}", s.Color); - c.Style.BackColor = Color.FromArgb((int)s.Color); - c = SubGrid.Rows[index].Cells[5]; - c.Value = s.Message; - } - - private Subtitle GetRow(int index) - { - if (index >= SubGrid.Rows.Count) return new Subtitle(); - - var s = new Subtitle(); - var c = SubGrid.Rows[index].Cells[0]; - - // Empty catch because it should default to subtitle default value - try { s.Frame = int.Parse(c.Value.ToString()); } - catch { } - c = SubGrid.Rows[index].Cells[1]; - try { s.X = int.Parse(c.Value.ToString()); } - catch { } - c = SubGrid.Rows[index].Cells[2]; - try { s.Y = int.Parse(c.Value.ToString()); } - catch { } - c = SubGrid.Rows[index].Cells[3]; - try { s.Duration = int.Parse(c.Value.ToString()); } - catch { } - c = SubGrid.Rows[index].Cells[4]; - try { s.Color = uint.Parse(c.Value.ToString()); } - catch { } - c = SubGrid.Rows[index].Cells[5]; - try { s.Message = c.Value.ToString(); } - catch { } - _selectedMovie.Subtitles.Add(s); - - return s; - } - - private void SubGrid_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (ReadOnly) - { - return; - } - - var c = SubGrid.SelectedRows; - if (c.Count == 0) - { - return; - } - - var s = new SubtitleMaker {Sub = GetRow(c[0].Index)}; - if (s.ShowDialog() == DialogResult.OK) - { - ChangeRow(s.Sub, SubGrid.SelectedRows[0].Index); - } - } - - private void Export_Click(object sender, EventArgs e) - { - // Get file to save as - var form = new SaveFileDialog - { - AddExtension = true, - Filter = "SubRip Files (*.srt)|*.srt|All files (*.*)|*.*" - }; - - var result = form.ShowDialog(); - var fileName = form.FileName; - - form.Dispose(); - - if (result != DialogResult.OK) - { - return; - } - - // Fetch fps - var system = _selectedMovie.HeaderEntries[HeaderKeys.PLATFORM]; - var pal = _selectedMovie.HeaderEntries.ContainsKey(HeaderKeys.PAL) - && _selectedMovie.HeaderEntries[HeaderKeys.PAL] == "1"; - var pfr = new PlatformFrameRates(); - double fps = 1; - - try - { - fps = pfr[system, pal]; - } - catch - { - MessageBox.Show( - "Could not determine movie fps, export failed.", - "Error", - MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return; - } - - // Create string and write to file - var str = _selectedMovie.Subtitles.ToSubRip(fps); - File.WriteAllText(fileName, str); - - // Display success - MessageBox.Show( - string.Format("Subtitles succesfully exported to {0}.", fileName), - "Success"); - } - - private void SubGrid_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) - { - e.Row.Cells["Frame"].Value = 0; - e.Row.Cells["X"].Value = 0; - e.Row.Cells["Y"].Value = 0; - e.Row.Cells["Length"].Value = 0; - e.Row.Cells["DispColor"].Value = "FFFFFFFF"; - } - - private void ConcatMultilines_CheckedChanged(object sender, EventArgs e) - { - _selectedMovie.Subtitles.ConcatMultilines = ConcatMultilines.Checked; - } - - private void AddColorTag_CheckedChanged(object sender, EventArgs e) - { - _selectedMovie.Subtitles.AddColorTag = AddColorTag.Checked; - } - } -} diff --git a/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.resx b/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.resx deleted file mode 100644 index 20eaabb2a2..0000000000 --- a/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.resx +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - True - - - True - - - True - - - True - - - - - AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////AP64aABQUFAAwNjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAMDAAMDAwAAAAAAAAAAAAMCAgMDAwMDAwAAAAMDAAADAgICAwMDAwMDAwMCAgMAAAMCAwMD - AwMDAwMDAgIDAAMEBAQDAgMDAwMDAwICAgMDBAQEAwICAwQDAwQDAgIDAAMDAwICAgMCAgIDAwMDAAAA - AwICAgMCAgIDAgMAAAAAAAAAAwMEBAQEBAQCAwAAAAAAAwMEBAQDAwMDAwMAAAAAAwQEAwMEBAMEBAQC - AwAAAAMEBAMDBAMEBAQEAgMAAAAAAwMDBAQDBAMDAwIDAAAAAAMCAgICAgICAgMEBAMAAAAAAwICAgIC - AwMEBAQDAAAAAAADAwMDAwAAAwMDAJH/AAAAcwAAAAEAAIABAAAAAAAAAAAAAIABAADABwAA8AMAAOAD - AADAAQAAwAEAAOABAADgAAAA8AAAAPgxAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/MovieDetails.cs b/BizHawk.Client.EmuHawk/movie/MovieDetails.cs deleted file mode 100644 index eb374e51c8..0000000000 --- a/BizHawk.Client.EmuHawk/movie/MovieDetails.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Drawing; - -namespace BizHawk.Client.EmuHawk -{ - /// - /// Used for the sorting of the movie details in PlayMovie.cs - /// - public class MovieDetails - { - public string Keys { get; set; } - public string Values { get; set; } - public Color BackgroundColor { get; set; } - - public MovieDetails() - { - Keys = ""; - Values = ""; - BackgroundColor = Color.White; - } - } -} diff --git a/BizHawk.Client.EmuHawk/movie/PlayMovie.Designer.cs b/BizHawk.Client.EmuHawk/movie/PlayMovie.Designer.cs deleted file mode 100644 index 8afcc7d618..0000000000 --- a/BizHawk.Client.EmuHawk/movie/PlayMovie.Designer.cs +++ /dev/null @@ -1,408 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class PlayMovie - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlayMovie)); - this.Cancel = new System.Windows.Forms.Button(); - this.OK = new System.Windows.Forms.Button(); - this.BrowseMovies = new System.Windows.Forms.Button(); - this.DetailsView = new System.Windows.Forms.ListView(); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.SubtitlesBtn = new System.Windows.Forms.Button(); - this.CommentsBtn = new System.Windows.Forms.Button(); - this.MovieCount = new System.Windows.Forms.Label(); - this.ReadOnlyCheckBox = new System.Windows.Forms.CheckBox(); - this.IncludeSubDirectories = new System.Windows.Forms.CheckBox(); - this.Scan = new System.Windows.Forms.Button(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.MatchHashCheckBox = new System.Windows.Forms.CheckBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopOnFrameCheckbox = new System.Windows.Forms.CheckBox(); - this.StopOnFrameTextBox = new BizHawk.Client.EmuHawk.WatchValueBox(); - this.MovieView = new BizHawk.Client.EmuHawk.VirtualListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.LastFrameCheckbox = new System.Windows.Forms.CheckBox(); - this.TurboCheckbox = new System.Windows.Forms.CheckBox(); - this.groupBox1.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(687, 363); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 23); - this.Cancel.TabIndex = 55; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - this.Cancel.Click += new System.EventHandler(this.Cancel_Click); - // - // OK - // - this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OK.Location = new System.Drawing.Point(606, 363); - this.OK.Name = "OK"; - this.OK.Size = new System.Drawing.Size(75, 23); - this.OK.TabIndex = 50; - this.OK.Text = "&OK"; - this.toolTip1.SetToolTip(this.OK, "Load selected movie"); - this.OK.UseVisualStyleBackColor = true; - this.OK.Click += new System.EventHandler(this.Ok_Click); - // - // BrowseMovies - // - this.BrowseMovies.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.BrowseMovies.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.BrowseMovies.Location = new System.Drawing.Point(12, 364); - this.BrowseMovies.Name = "BrowseMovies"; - this.BrowseMovies.Size = new System.Drawing.Size(31, 23); - this.BrowseMovies.TabIndex = 25; - this.toolTip1.SetToolTip(this.BrowseMovies, "Browse for additional movie files"); - this.BrowseMovies.UseVisualStyleBackColor = true; - this.BrowseMovies.Click += new System.EventHandler(this.BrowseMovies_Click); - // - // DetailsView - // - this.DetailsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.DetailsView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader5, - this.columnHeader6}); - this.DetailsView.FullRowSelect = true; - this.DetailsView.GridLines = true; - this.DetailsView.HideSelection = false; - this.DetailsView.Location = new System.Drawing.Point(15, 19); - this.DetailsView.Name = "DetailsView"; - this.DetailsView.Size = new System.Drawing.Size(228, 261); - this.DetailsView.TabIndex = 10; - this.toolTip1.SetToolTip(this.DetailsView, "Contains the header information for the selected movie"); - this.DetailsView.UseCompatibleStateImageBehavior = false; - this.DetailsView.View = System.Windows.Forms.View.Details; - this.DetailsView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.DetailsView_ColumnClick); - // - // columnHeader5 - // - this.columnHeader5.Text = "Header"; - this.columnHeader5.Width = 102; - // - // columnHeader6 - // - this.columnHeader6.Text = "Value"; - this.columnHeader6.Width = 121; - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox1.Controls.Add(this.SubtitlesBtn); - this.groupBox1.Controls.Add(this.CommentsBtn); - this.groupBox1.Controls.Add(this.DetailsView); - this.groupBox1.Location = new System.Drawing.Point(503, 28); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(259, 322); - this.groupBox1.TabIndex = 6; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Details"; - // - // SubtitlesBtn - // - this.SubtitlesBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitlesBtn.Enabled = false; - this.SubtitlesBtn.Location = new System.Drawing.Point(125, 286); - this.SubtitlesBtn.Name = "SubtitlesBtn"; - this.SubtitlesBtn.Size = new System.Drawing.Size(75, 23); - this.SubtitlesBtn.TabIndex = 20; - this.SubtitlesBtn.Text = "Subtitles"; - this.SubtitlesBtn.UseVisualStyleBackColor = true; - this.SubtitlesBtn.Click += new System.EventHandler(this.SubtitlesBtn_Click); - // - // CommentsBtn - // - this.CommentsBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.CommentsBtn.Enabled = false; - this.CommentsBtn.Location = new System.Drawing.Point(15, 286); - this.CommentsBtn.Name = "CommentsBtn"; - this.CommentsBtn.Size = new System.Drawing.Size(75, 23); - this.CommentsBtn.TabIndex = 15; - this.CommentsBtn.Text = "Comments"; - this.CommentsBtn.UseVisualStyleBackColor = true; - this.CommentsBtn.Click += new System.EventHandler(this.CommentsBtn_Click); - // - // MovieCount - // - this.MovieCount.AutoSize = true; - this.MovieCount.Location = new System.Drawing.Point(12, 9); - this.MovieCount.Name = "MovieCount"; - this.MovieCount.Size = new System.Drawing.Size(31, 13); - this.MovieCount.TabIndex = 7; - this.MovieCount.Text = " "; - // - // ReadOnlyCheckBox - // - this.ReadOnlyCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.ReadOnlyCheckBox.AutoSize = true; - this.ReadOnlyCheckBox.Checked = true; - this.ReadOnlyCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.ReadOnlyCheckBox.Location = new System.Drawing.Point(405, 367); - this.ReadOnlyCheckBox.Name = "ReadOnlyCheckBox"; - this.ReadOnlyCheckBox.Size = new System.Drawing.Size(74, 17); - this.ReadOnlyCheckBox.TabIndex = 45; - this.ReadOnlyCheckBox.Text = "Read only"; - this.ReadOnlyCheckBox.UseVisualStyleBackColor = true; - // - // IncludeSubDirectories - // - this.IncludeSubDirectories.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.IncludeSubDirectories.AutoSize = true; - this.IncludeSubDirectories.Location = new System.Drawing.Point(94, 375); - this.IncludeSubDirectories.Name = "IncludeSubDirectories"; - this.IncludeSubDirectories.Size = new System.Drawing.Size(131, 17); - this.IncludeSubDirectories.TabIndex = 35; - this.IncludeSubDirectories.Text = "Include Subdirectories"; - this.IncludeSubDirectories.UseVisualStyleBackColor = true; - this.IncludeSubDirectories.CheckedChanged += new System.EventHandler(this.IncludeSubDirectories_CheckedChanged); - // - // Scan - // - this.Scan.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.Scan.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Scan; - this.Scan.Location = new System.Drawing.Point(49, 364); - this.Scan.Name = "Scan"; - this.Scan.Size = new System.Drawing.Size(27, 23); - this.Scan.TabIndex = 30; - this.toolTip1.SetToolTip(this.Scan, "Rescan Movie folder for movie files"); - this.Scan.UseVisualStyleBackColor = true; - this.Scan.Click += new System.EventHandler(this.Scan_Click); - // - // MatchHashCheckBox - // - this.MatchHashCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.MatchHashCheckBox.AutoSize = true; - this.MatchHashCheckBox.Location = new System.Drawing.Point(94, 357); - this.MatchHashCheckBox.Name = "MatchHashCheckBox"; - this.MatchHashCheckBox.Size = new System.Drawing.Size(147, 17); - this.MatchHashCheckBox.TabIndex = 56; - this.MatchHashCheckBox.Text = "Match current game hash"; - this.MatchHashCheckBox.UseVisualStyleBackColor = true; - this.MatchHashCheckBox.CheckedChanged += new System.EventHandler(this.MatchHashCheckBox_CheckedChanged); - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.editToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(93, 26); - // - // editToolStripMenuItem - // - this.editToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CutHS; - this.editToolStripMenuItem.Name = "editToolStripMenuItem"; - this.editToolStripMenuItem.Size = new System.Drawing.Size(92, 22); - this.editToolStripMenuItem.Text = "&Edit"; - this.editToolStripMenuItem.Click += new System.EventHandler(this.EditMenuItem_Click); - // - // StopOnFrameCheckbox - // - this.StopOnFrameCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.StopOnFrameCheckbox.AutoSize = true; - this.StopOnFrameCheckbox.Location = new System.Drawing.Point(244, 357); - this.StopOnFrameCheckbox.Name = "StopOnFrameCheckbox"; - this.StopOnFrameCheckbox.Size = new System.Drawing.Size(95, 17); - this.StopOnFrameCheckbox.TabIndex = 57; - this.StopOnFrameCheckbox.Text = "Stop on frame:"; - this.StopOnFrameCheckbox.UseVisualStyleBackColor = true; - this.StopOnFrameCheckbox.CheckedChanged += new System.EventHandler(this.StopOnFrameCheckbox_CheckedChanged); - // - // StopOnFrameTextBox - // - this.StopOnFrameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.StopOnFrameTextBox.ByteSize = BizHawk.Client.Common.WatchSize.DWord; - this.StopOnFrameTextBox.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.StopOnFrameTextBox.Location = new System.Drawing.Point(340, 355); - this.StopOnFrameTextBox.MaxLength = 10; - this.StopOnFrameTextBox.Name = "StopOnFrameTextBox"; - this.StopOnFrameTextBox.Nullable = true; - this.StopOnFrameTextBox.Size = new System.Drawing.Size(54, 20); - this.StopOnFrameTextBox.TabIndex = 58; - this.StopOnFrameTextBox.Type = BizHawk.Client.Common.DisplayType.Unsigned; - this.StopOnFrameTextBox.TextChanged += new System.EventHandler(this.StopOnFrameTextBox_TextChanged_1); - // - // MovieView - // - this.MovieView.AllowDrop = true; - this.MovieView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MovieView.BlazingFast = false; - this.MovieView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3, - this.columnHeader4}); - this.MovieView.ContextMenuStrip = this.contextMenuStrip1; - this.MovieView.FullRowSelect = true; - this.MovieView.GridLines = true; - this.MovieView.HideSelection = false; - this.MovieView.ItemCount = 0; - this.MovieView.Location = new System.Drawing.Point(12, 28); - this.MovieView.MultiSelect = false; - this.MovieView.Name = "MovieView"; - this.MovieView.SelectAllInProgress = false; - this.MovieView.selectedItem = -1; - this.MovieView.Size = new System.Drawing.Size(480, 322); - this.MovieView.TabIndex = 5; - this.MovieView.UseCompatibleStateImageBehavior = false; - this.MovieView.UseCustomBackground = true; - this.MovieView.View = System.Windows.Forms.View.Details; - this.MovieView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.MovieView_ColumnClick); - this.MovieView.SelectedIndexChanged += new System.EventHandler(this.MovieView_SelectedIndexChanged); - this.MovieView.DragDrop += new System.Windows.Forms.DragEventHandler(this.MovieView_DragDrop); - this.MovieView.DragEnter += new System.Windows.Forms.DragEventHandler(this.MovieView_DragEnter); - this.MovieView.DoubleClick += new System.EventHandler(this.MovieView_DoubleClick); - this.MovieView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MovieView_KeyDown); - // - // columnHeader1 - // - this.columnHeader1.Text = "File"; - this.columnHeader1.Width = 221; - // - // columnHeader2 - // - this.columnHeader2.Text = "SysID"; - this.columnHeader2.Width = 43; - // - // columnHeader3 - // - this.columnHeader3.Text = "Game"; - this.columnHeader3.Width = 129; - // - // columnHeader4 - // - this.columnHeader4.Text = "Length (est.)"; - this.columnHeader4.Width = 82; - // - // LastFrameCheckbox - // - this.LastFrameCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.LastFrameCheckbox.AutoSize = true; - this.LastFrameCheckbox.Location = new System.Drawing.Point(244, 376); - this.LastFrameCheckbox.Name = "LastFrameCheckbox"; - this.LastFrameCheckbox.Size = new System.Drawing.Size(75, 17); - this.LastFrameCheckbox.TabIndex = 59; - this.LastFrameCheckbox.Text = "Last frame"; - this.LastFrameCheckbox.UseVisualStyleBackColor = true; - this.LastFrameCheckbox.CheckedChanged += new System.EventHandler(this.LastFrameCheckbox_CheckedChanged); - // - // TurboCheckbox - // - this.TurboCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.TurboCheckbox.AutoSize = true; - this.TurboCheckbox.Location = new System.Drawing.Point(340, 376); - this.TurboCheckbox.Name = "TurboCheckbox"; - this.TurboCheckbox.Size = new System.Drawing.Size(54, 17); - this.TurboCheckbox.TabIndex = 60; - this.TurboCheckbox.Text = "Turbo"; - this.TurboCheckbox.UseVisualStyleBackColor = true; - // - // PlayMovie - // - this.AcceptButton = this.OK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(774, 398); - this.Controls.Add(this.TurboCheckbox); - this.Controls.Add(this.LastFrameCheckbox); - this.Controls.Add(this.StopOnFrameTextBox); - this.Controls.Add(this.StopOnFrameCheckbox); - this.Controls.Add(this.MatchHashCheckBox); - this.Controls.Add(this.Scan); - this.Controls.Add(this.IncludeSubDirectories); - this.Controls.Add(this.ReadOnlyCheckBox); - this.Controls.Add(this.MovieCount); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.MovieView); - this.Controls.Add(this.BrowseMovies); - this.Controls.Add(this.OK); - this.Controls.Add(this.Cancel); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(547, 228); - this.Name = "PlayMovie"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Play Movie"; - this.Load += new System.EventHandler(this.PlayMovie_Load); - this.groupBox1.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button Cancel; - private System.Windows.Forms.Button OK; - private System.Windows.Forms.Button BrowseMovies; - private VirtualListView MovieView; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ListView DetailsView; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader6; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button SubtitlesBtn; - private System.Windows.Forms.Button CommentsBtn; - private System.Windows.Forms.Label MovieCount; - private System.Windows.Forms.CheckBox ReadOnlyCheckBox; - private System.Windows.Forms.CheckBox IncludeSubDirectories; - private System.Windows.Forms.Button Scan; - private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.CheckBox MatchHashCheckBox; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; - private System.Windows.Forms.CheckBox StopOnFrameCheckbox; - private WatchValueBox StopOnFrameTextBox; - private System.Windows.Forms.CheckBox LastFrameCheckbox; - private System.Windows.Forms.CheckBox TurboCheckbox; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/PlayMovie.cs b/BizHawk.Client.EmuHawk/movie/PlayMovie.cs deleted file mode 100644 index 62f072f5e9..0000000000 --- a/BizHawk.Client.EmuHawk/movie/PlayMovie.cs +++ /dev/null @@ -1,734 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Common; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class PlayMovie : Form - { - private readonly PlatformFrameRates PlatformFrameRates = new PlatformFrameRates(); - - private List _movieList = new List(); - private bool _sortReverse; - private string _sortedCol; - - private bool _sortDetailsReverse; - private string _sortedDetailsCol; - - public PlayMovie() - { - InitializeComponent(); - MovieView.QueryItemText += MovieView_QueryItemText; - MovieView.VirtualMode = true; - _sortReverse = false; - _sortedCol = ""; - - _sortDetailsReverse = false; - _sortedDetailsCol = ""; - } - - private void PlayMovie_Load(object sender, EventArgs e) - { - IncludeSubDirectories.Checked = Global.Config.PlayMovie_IncludeSubdir; - MatchHashCheckBox.Checked = Global.Config.PlayMovie_MatchHash; - ScanFiles(); - PreHighlightMovie(); - TurboCheckbox.Checked = Global.Config.TurboSeek; - } - - private void MovieView_QueryItemText(int index, int column, out string text) - { - text = ""; - if (column == 0) // File - { - text = Path.GetFileName(_movieList[index].Filename); - } - - if (column == 1) // System - { - text = _movieList[index].SystemID; - } - - if (column == 2) // Game - { - text = _movieList[index].GameName; - } - - if (column == 3) // Time - { - text = PlatformFrameRates.MovieTime(_movieList[index]).ToString(@"hh\:mm\:ss\.fff"); - } - } - - private void Run() - { - var indices = MovieView.SelectedIndices; - if (indices.Count > 0) // Import file if necessary - { - GlobalWin.MainForm.StartNewMovie(_movieList[MovieView.SelectedIndices[0]], false); - } - } - - private int? AddMovieToList(string filename, bool force) - { - using (var file = new HawkFile(filename)) - { - if (!file.Exists) - { - return null; - } - - var movie = PreLoadMovieFile(file, force); - if (movie == null) - { - return null; - } - - int? index; - lock (_movieList) - { - // need to check IsDuplicateOf within the lock - index = IsDuplicateOf(filename); - if (index.HasValue) - { - return index; - } - - _movieList.Add(movie); - index = _movieList.Count - 1; - } - - _sortReverse = false; - _sortedCol = ""; - - return index; - } - } - - private int? IsDuplicateOf(string filename) - { - for (var i = 0; i < _movieList.Count; i++) - { - if (_movieList[i].Filename == filename) - { - return i; - } - } - - return null; - } - - private IMovie PreLoadMovieFile(HawkFile hf, bool force) - { - var movie = MovieService.Get(hf.CanonicalFullPath); - - try - { - movie.PreLoadHeaderAndLength(hf); - - // Don't do this from browse - if (movie.Hash == Global.Game.Hash || - Global.Config.PlayMovie_MatchHash == false || force) - { - return movie; - } - } - catch (Exception ex) - { - // TODO: inform the user that a movie failed to parse in some way - Console.WriteLine(ex.Message); - } - - return null; - } - - private void UpdateList() - { - MovieView.Refresh(); - MovieCount.Text = _movieList.Count + " movie" - + (_movieList.Count != 1 ? "s" : ""); - } - - private void PreHighlightMovie() - { - if (Global.Game == null) - { - return; - } - - var indices = new List(); - - // Pull out matching names - for (var i = 0; i < _movieList.Count; i++) - { - if (PathManager.FilesystemSafeName(Global.Game) == _movieList[i].GameName) - { - indices.Add(i); - } - } - - if (indices.Count == 0) - { - return; - } - - if (indices.Count == 1) - { - HighlightMovie(indices[0]); - return; - } - - // Prefer tas files - var tas = new List(); - for (var i = 0; i < indices.Count; i++) - { - foreach (var ext in MovieService.MovieExtensions) - { - if (Path.GetExtension(_movieList[indices[i]].Filename).ToUpper() == "." + ext) - { - tas.Add(i); - } - } - } - - if (tas.Count == 1) - { - HighlightMovie(tas[0]); - return; - } - - if (tas.Count > 1) - { - indices = new List(tas); - } - - // Final tie breaker - Last used file - var file = new FileInfo(_movieList[indices[0]].Filename); - var time = file.LastAccessTime; - var mostRecent = indices.First(); - for (var i = 1; i < indices.Count; i++) - { - file = new FileInfo(_movieList[indices[0]].Filename); - if (file.LastAccessTime > time) - { - time = file.LastAccessTime; - mostRecent = indices[i]; - } - } - - HighlightMovie(mostRecent); - } - - private void HighlightMovie(int index) - { - MovieView.SelectedIndices.Clear(); - MovieView.setSelection(index); - MovieView.SelectItem(index, true); - } - - private void ScanFiles() - { - _movieList.Clear(); - MovieView.ItemCount = 0; - MovieView.Update(); - - var directory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null); - if (!Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - var dpTodo = new Queue(); - var fpTodo = new List(); - dpTodo.Enqueue(directory); - Dictionary ordinals = new Dictionary(); - - while (dpTodo.Count > 0) - { - string dp = dpTodo.Dequeue(); - - // enqueue subdirectories if appropriate - if (Global.Config.PlayMovie_IncludeSubdir) - { - foreach (var subdir in Directory.GetDirectories(dp)) - { - dpTodo.Enqueue(subdir); - } - } - - // add movies - fpTodo.AddRange(Directory.GetFiles(dp, "*." + MovieService.DefaultExtension)); - fpTodo.AddRange(Directory.GetFiles(dp, "*." + TasMovie.Extension)); - } - - // in parallel, scan each movie - Parallel.For(0, fpTodo.Count, i => - { - var file = fpTodo[i]; - lock (ordinals) - { - ordinals[file] = i; - } - - AddMovieToList(file, force: false); - }); - - // sort by the ordinal key to maintain relatively stable results when rescanning - _movieList.Sort((a, b) => ordinals[a.Filename].CompareTo(ordinals[b.Filename])); - - RefreshMovieList(); - } - - #region Events - - #region Movie List - - void RefreshMovieList() - { - MovieView.ItemCount = _movieList.Count; - UpdateList(); - } - - private void MovieView_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void MovieView_DragDrop(object sender, DragEventArgs e) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - - filePaths - .Where(path => MovieService.MovieExtensions.Contains(Path.GetExtension(path).Replace(".", ""))) - .ToList() - .ForEach(path => AddMovieToList(path, force: true)); - - RefreshMovieList(); - } - - private void MovieView_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control && e.KeyCode == Keys.C) - { - var indexes = MovieView.SelectedIndices; - if (indexes.Count > 0) - { - var copyStr = new StringBuilder(); - foreach (int index in indexes) - { - copyStr - .Append(_movieList[index].Filename).Append('\t') - .Append(_movieList[index].SystemID).Append('\t') - .Append(_movieList[index].GameName).Append('\t') - .Append(PlatformFrameRates.MovieTime(_movieList[index]).ToString(@"hh\:mm\:ss\.fff")) - .AppendLine(); - - Clipboard.SetDataObject(copyStr.ToString()); - } - } - } - } - - private void MovieView_DoubleClick(object sender, EventArgs e) - { - Run(); - Close(); - } - - private void MovieView_ColumnClick(object sender, ColumnClickEventArgs e) - { - var columnName = MovieView.Columns[e.Column].Text; - if (_sortedCol != columnName) - { - _sortReverse = false; - } - - switch (columnName) - { - case "File": - if (_sortReverse) - { - _movieList = _movieList - .OrderByDescending(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.GameName) - .ThenBy(x => x.FrameCount) - .ToList(); - } - else - { - _movieList = _movieList - .OrderBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.GameName) - .ThenBy(x => x.FrameCount) - .ToList(); - } - break; - case "SysID": - if (_sortReverse) - { - _movieList = _movieList - .OrderByDescending(x => x.SystemID) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.GameName) - .ThenBy(x => x.FrameCount) - .ToList(); - } - else - { - _movieList = _movieList - .OrderBy(x => x.SystemID) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.GameName) - .ThenBy(x => x.FrameCount) - .ToList(); - } - break; - case "Game": - if (_sortReverse) - { - _movieList = _movieList - .OrderByDescending(x => x.GameName) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.FrameCount) - .ToList(); - } - else - { - _movieList = _movieList - .OrderBy(x => x.GameName) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.FrameCount) - .ToList(); - } - break; - case "Length (est.)": - if (_sortReverse) - { - _movieList = _movieList - .OrderByDescending(x => x.FrameCount) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.FrameCount) - .ToList(); - } - else - { - _movieList = _movieList - .OrderBy(x => x.FrameCount) - .ThenBy(x => Path.GetFileName(x.Filename)) - .ThenBy(x => x.SystemID) - .ThenBy(x => x.GameName) - .ToList(); - } - break; - } - - _sortedCol = columnName; - _sortReverse = !_sortReverse; - MovieView.Refresh(); - } - - private void MovieView_SelectedIndexChanged(object sender, EventArgs e) - { - toolTip1.SetToolTip(DetailsView, ""); - DetailsView.Items.Clear(); - if (MovieView.SelectedIndices.Count < 1) - { - OK.Enabled = false; - return; - } - - OK.Enabled = true; - - var firstIndex = MovieView.SelectedIndices[0]; - MovieView.ensureVisible(firstIndex); - - foreach (var kvp in _movieList[firstIndex].HeaderEntries) - { - var item = new ListViewItem(kvp.Key); - item.SubItems.Add(kvp.Value); - - bool add = true; - - switch (kvp.Key) - { - case HeaderKeys.SHA1: - if (kvp.Value != Global.Game.Hash) - { - item.BackColor = Color.Pink; - toolTip1.SetToolTip(DetailsView, "Current SHA1: " + Global.Game.Hash); - } - break; - case HeaderKeys.EMULATIONVERSION: - if (kvp.Value != VersionInfo.GetEmuVersion()) - { - item.BackColor = Color.Yellow; - } - break; - case HeaderKeys.PLATFORM: - // feos: previously it was compared against Global.Game.System, but when the movie is created - // its platform is copied from Global.Emulator.SystemId, see PopulateWithDefaultHeaderValues() - // the problem is that for GameGear and SG100, those mismatch, resulting in false positive here - // I have a patch to make GG and SG appear as platforms in movie header (issue #1246) - // but even with it, for all the old movies, this false positive would have to be worked around anyway - // TODO: actually check header flags like "IsGGMode" and "IsSegaCDMode" (those are never parsed by bizhawk) - if (kvp.Value != Global.Emulator.SystemId) - { - item.BackColor = Color.Pink; - } - break; - } - - if(add) - DetailsView.Items.Add(item); - } - - var FpsItem = new ListViewItem("Fps"); - FpsItem.SubItems.Add(string.Format("{0:0.#######}", Fps(_movieList[firstIndex]))); - DetailsView.Items.Add(FpsItem); - - var FramesItem = new ListViewItem("Frames"); - FramesItem.SubItems.Add(_movieList[firstIndex].FrameCount.ToString()); - DetailsView.Items.Add(FramesItem); - CommentsBtn.Enabled = _movieList[firstIndex].Comments.Any(); - SubtitlesBtn.Enabled = _movieList[firstIndex].Subtitles.Any(); - } - - public double Fps(IMovie movie) - { - var system = movie.HeaderEntries[HeaderKeys.PLATFORM]; - var pal = movie.HeaderEntries.ContainsKey(HeaderKeys.PAL) && - movie.HeaderEntries[HeaderKeys.PAL] == "1"; - - return new PlatformFrameRates()[system, pal]; - - } - - private void EditMenuItem_Click(object sender, EventArgs e) - { - MovieView.SelectedIndices - .Cast() - .Select(index => _movieList[index]) - .ToList() - .ForEach(movie => System.Diagnostics.Process.Start(movie.Filename)); - } - - #endregion - - #region Details - - private void DetailsView_ColumnClick(object sender, ColumnClickEventArgs e) - { - var detailsList = new List(); - for (var i = 0; i < DetailsView.Items.Count; i++) - { - detailsList.Add(new MovieDetails - { - Keys = DetailsView.Items[i].Text, - Values = DetailsView.Items[i].SubItems[1].Text, - BackgroundColor = DetailsView.Items[i].BackColor - }); - } - - var columnName = DetailsView.Columns[e.Column].Text; - if (_sortedDetailsCol != columnName) - { - _sortDetailsReverse = false; - } - - switch (columnName) - { - // Header, Value - case "Header": - if (_sortDetailsReverse) - { - detailsList = detailsList - .OrderByDescending(x => x.Keys) - .ThenBy(x => x.Values).ToList(); - } - else - { - detailsList = detailsList - .OrderBy(x => x.Keys) - .ThenBy(x => x.Values).ToList(); - } - - break; - case "Value": - if (_sortDetailsReverse) - { - detailsList = detailsList - .OrderByDescending(x => x.Values) - .ThenBy(x => x.Keys).ToList(); - } - else - { - detailsList = detailsList - .OrderBy(x => x.Values) - .ThenBy(x => x.Keys).ToList(); - } - - break; - } - - DetailsView.Items.Clear(); - foreach (var detail in detailsList) - { - var item = new ListViewItem { Text = detail.Keys, BackColor = detail.BackgroundColor }; - item.SubItems.Add(detail.Values); - DetailsView.Items.Add(item); - } - - _sortedDetailsCol = columnName; - _sortDetailsReverse = !_sortDetailsReverse; - } - - private void CommentsBtn_Click(object sender, EventArgs e) - { - var indices = MovieView.SelectedIndices; - if (indices.Count > 0) - { - var form = new EditCommentsForm(); - form.GetMovie(_movieList[MovieView.SelectedIndices[0]]); - form.Show(); - } - } - - private void SubtitlesBtn_Click(object sender, EventArgs e) - { - var indices = MovieView.SelectedIndices; - if (indices.Count > 0) - { - var s = new EditSubtitlesForm { ReadOnly = true }; - s.GetMovie(_movieList[MovieView.SelectedIndices[0]]); - s.Show(); - } - } - - #endregion - - #region Misc Widgets - - private void BrowseMovies_Click(object sender, EventArgs e) - { - var ofd = new OpenFileDialog - { - Filter = "Movie Files (*." + MovieService.DefaultExtension + ")|*." + MovieService.DefaultExtension + - "|TAS project Files (*." + TasMovie.Extension + ")|*." + TasMovie.Extension + - "|All Files|*.*", - InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null) - }; - - var result = ofd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - var file = new FileInfo(ofd.FileName); - if (!file.Exists) - { - return; - } - - int? index = AddMovieToList(ofd.FileName, true); - RefreshMovieList(); - if (index.HasValue) - { - MovieView.SelectedIndices.Clear(); - MovieView.setSelection(index.Value); - MovieView.SelectItem(index.Value, true); - } - } - } - - private void Scan_Click(object sender, EventArgs e) - { - ScanFiles(); - PreHighlightMovie(); - } - - private void IncludeSubDirectories_CheckedChanged(object sender, EventArgs e) - { - Global.Config.PlayMovie_IncludeSubdir = IncludeSubDirectories.Checked; - ScanFiles(); - PreHighlightMovie(); - } - - private void MatchHashCheckBox_CheckedChanged(object sender, EventArgs e) - { - Global.Config.PlayMovie_MatchHash = MatchHashCheckBox.Checked; - ScanFiles(); - PreHighlightMovie(); - } - - private void Ok_Click(object sender, EventArgs e) - { - Global.Config.TurboSeek = TurboCheckbox.Checked; - Run(); - Global.MovieSession.ReadOnly = ReadOnlyCheckBox.Checked; - - if (StopOnFrameCheckbox.Checked && - (StopOnFrameTextBox.ToRawInt().HasValue || LastFrameCheckbox.Checked)) - { - if (LastFrameCheckbox.Checked) - { - GlobalWin.MainForm.PauseOnFrame = Global.MovieSession.Movie.InputLogLength; - } - else - { - GlobalWin.MainForm.PauseOnFrame = StopOnFrameTextBox.ToRawInt(); - } - } - - Close(); - } - - private void Cancel_Click(object sender, EventArgs e) - { - Close(); - } - - #endregion - - private bool _programmaticallyChangingStopFrameCheckbox = false; - private void StopOnFrameCheckbox_CheckedChanged(object sender, EventArgs e) - { - if (!_programmaticallyChangingStopFrameCheckbox) - { - StopOnFrameTextBox.Focus(); - } - } - - private void StopOnFrameTextBox_TextChanged_1(object sender, EventArgs e) - { - _programmaticallyChangingStopFrameCheckbox = true; - StopOnFrameCheckbox.Checked = !string.IsNullOrWhiteSpace(StopOnFrameTextBox.Text); - _programmaticallyChangingStopFrameCheckbox = false; - } - - private void LastFrameCheckbox_CheckedChanged(object sender, EventArgs e) - { - if (LastFrameCheckbox.Checked == true) - { - _programmaticallyChangingStopFrameCheckbox = true; - StopOnFrameCheckbox.Checked = true; - _programmaticallyChangingStopFrameCheckbox = false; - } - - StopOnFrameTextBox.Enabled = !LastFrameCheckbox.Checked; - } - - #endregion - } -} diff --git a/BizHawk.Client.EmuHawk/movie/PlayMovie.resx b/BizHawk.Client.EmuHawk/movie/PlayMovie.resx deleted file mode 100644 index b726d762b7..0000000000 --- a/BizHawk.Client.EmuHawk/movie/PlayMovie.resx +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 114, 17 - - - - - AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////AP64aABQUFAAwNjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAMDAAMDAwAAAAAAAAAAAAMCAgMDAwMDAwAAAAMDAAADAgICAwMDAwMDAwMCAgMAAAMCAwMD - AwMDAwMDAgIDAAMEBAQDAgMDAwMDAwICAgMDBAQEAwICAwQDAwQDAgIDAAMDAwICAgMCAgIDAwMDAAAA - AwICAgMCAgIDAgMAAAAAAAAAAwMEBAQEBAQCAwAAAAAAAwMEBAQDAwMDAwMAAAAAAwQEAwMEBAMEBAQC - AwAAAAMEBAMDBAMEBAQEAgMAAAAAAwMDBAQDBAMDAwIDAAAAAAMCAgICAgICAgMEBAMAAAAAAwICAgIC - AwMEBAQDAAAAAAADAwMDAwAAAwMDAJH/AAAAcwAAAAEAAIABAAAAAAAAAAAAAIABAADABwAA8AMAAOAD - AADAAQAAwAEAAOABAADgAAAA8AAAAPgxAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.Designer.cs b/BizHawk.Client.EmuHawk/movie/RecordMovie.Designer.cs deleted file mode 100644 index 9bad7a0962..0000000000 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.Designer.cs +++ /dev/null @@ -1,211 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class RecordMovie - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RecordMovie)); - this.Cancel = new System.Windows.Forms.Button(); - this.OK = new System.Windows.Forms.Button(); - this.BrowseBtn = new System.Windows.Forms.Button(); - this.RecordBox = new System.Windows.Forms.TextBox(); - this.StartFromCombo = new System.Windows.Forms.ComboBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.DefaultAuthorCheckBox = new System.Windows.Forms.CheckBox(); - this.AuthorBox = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(391, 139); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 23); - this.Cancel.TabIndex = 1; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - this.Cancel.Click += new System.EventHandler(this.Cancel_Click); - // - // OK - // - this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OK.Location = new System.Drawing.Point(310, 139); - this.OK.Name = "OK"; - this.OK.Size = new System.Drawing.Size(75, 23); - this.OK.TabIndex = 0; - this.OK.Text = "&OK"; - this.OK.UseVisualStyleBackColor = true; - this.OK.Click += new System.EventHandler(this.Ok_Click); - // - // BrowseBtn - // - this.BrowseBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BrowseBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.BrowseBtn.Location = new System.Drawing.Point(423, 13); - this.BrowseBtn.Name = "BrowseBtn"; - this.BrowseBtn.Size = new System.Drawing.Size(25, 23); - this.BrowseBtn.TabIndex = 1; - this.BrowseBtn.UseVisualStyleBackColor = true; - this.BrowseBtn.Click += new System.EventHandler(this.BrowseBtn_Click); - // - // RecordBox - // - this.RecordBox.AllowDrop = true; - this.RecordBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.RecordBox.Location = new System.Drawing.Point(83, 13); - this.RecordBox.Name = "RecordBox"; - this.RecordBox.Size = new System.Drawing.Size(334, 20); - this.RecordBox.TabIndex = 0; - this.RecordBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.RecordBox_DragDrop); - this.RecordBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.RecordBox_DragEnter); - // - // StartFromCombo - // - this.StartFromCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.StartFromCombo.FormattingEnabled = true; - this.StartFromCombo.Items.AddRange(new object[] { - "Power-On", - "Now", - "SaveRam"}); - this.StartFromCombo.Location = new System.Drawing.Point(83, 65); - this.StartFromCombo.MaxDropDownItems = 32; - this.StartFromCombo.Name = "StartFromCombo"; - this.StartFromCombo.Size = new System.Drawing.Size(152, 21); - this.StartFromCombo.TabIndex = 3; - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox1.Controls.Add(this.DefaultAuthorCheckBox); - this.groupBox1.Controls.Add(this.AuthorBox); - this.groupBox1.Controls.Add(this.StartFromCombo); - this.groupBox1.Controls.Add(this.BrowseBtn); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.RecordBox); - this.groupBox1.Location = new System.Drawing.Point(12, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(454, 112); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - // - // DefaultAuthorCheckBox - // - this.DefaultAuthorCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.DefaultAuthorCheckBox.AutoSize = true; - this.DefaultAuthorCheckBox.Location = new System.Drawing.Point(327, 64); - this.DefaultAuthorCheckBox.Name = "DefaultAuthorCheckBox"; - this.DefaultAuthorCheckBox.Size = new System.Drawing.Size(121, 17); - this.DefaultAuthorCheckBox.TabIndex = 6; - this.DefaultAuthorCheckBox.Text = "Make default author"; - this.DefaultAuthorCheckBox.UseVisualStyleBackColor = true; - // - // AuthorBox - // - this.AuthorBox.AllowDrop = true; - this.AuthorBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.AuthorBox.Location = new System.Drawing.Point(83, 39); - this.AuthorBox.Name = "AuthorBox"; - this.AuthorBox.Size = new System.Drawing.Size(365, 20); - this.AuthorBox.TabIndex = 2; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(36, 41); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(41, 13); - this.label3.TabIndex = 2; - this.label3.Text = "Author:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(6, 68); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(71, 13); - this.label2.TabIndex = 5; - this.label2.Text = "Record From:"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(51, 16); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(26, 13); - this.label1.TabIndex = 4; - this.label1.Text = "File:"; - // - // RecordMovie - // - this.AcceptButton = this.OK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(478, 163); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.OK); - this.Controls.Add(this.Cancel); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(1440, 201); - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(425, 201); - this.Name = "RecordMovie"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Record Movie"; - this.Load += new System.EventHandler(this.RecordMovie_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button Cancel; - private System.Windows.Forms.Button OK; - private System.Windows.Forms.Button BrowseBtn; - private System.Windows.Forms.TextBox RecordBox; - private System.Windows.Forms.ComboBox StartFromCombo; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox AuthorBox; - private System.Windows.Forms.CheckBox DefaultAuthorCheckBox; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs deleted file mode 100644 index 52ff80339b..0000000000 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using System.IO; -using System.Windows.Forms; -using System.Linq; - -using BizHawk.Common.ReflectionExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; -using BizHawk.Client.Common.MovieConversionExtensions; - -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - // TODO - Allow relative paths in record textbox - public partial class RecordMovie : Form - { - private IEmulator Emulator; - - public RecordMovie(IEmulator core) - { - InitializeComponent(); - - Emulator = core; - - if (!Emulator.HasSavestates()) - { - StartFromCombo.Items.Remove( - StartFromCombo.Items - .OfType() - .First(i => i.ToString() - .ToLower() == "now")); - } - - if (!Emulator.HasSaveRam()) - { - StartFromCombo.Items.Remove( - StartFromCombo.Items - .OfType() - .First(i => i.ToString() - .ToLower() == "saveram")); - } - } - - private string MakePath() - { - var path = RecordBox.Text; - - if (!string.IsNullOrWhiteSpace(path)) - { - if (path.LastIndexOf(Path.DirectorySeparatorChar) == -1) - { - if (path[0] != Path.DirectorySeparatorChar) - { - path = path.Insert(0, Path.DirectorySeparatorChar.ToString()); - } - - path = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null) + path; - - if (!MovieService.MovieExtensions.Contains(Path.GetExtension(path))) - { - // If no valid movie extension, add movie extension - path += "." + MovieService.DefaultExtension; - } - } - } - - return path; - } - - private void Ok_Click(object sender, EventArgs e) - { - var path = MakePath(); - if (!string.IsNullOrWhiteSpace(path)) - { - var test = new FileInfo(path); - if (test.Exists) - { - var result = MessageBox.Show(path + " already exists, overwrite?", "Confirm overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); - if (result == DialogResult.Cancel) - { - return; - } - } - - var movieToRecord = MovieService.Get(path); - - var fileInfo = new FileInfo(path); - if (!fileInfo.Exists) - { - Directory.CreateDirectory(fileInfo.DirectoryName); - } - - if (StartFromCombo.SelectedItem.ToString() == "Now" && Emulator.HasSavestates()) - { - var core = Emulator.AsStatable(); - - movieToRecord.StartsFromSavestate = true; - movieToRecord.StartsFromSaveRam = false; - - if (core.BinarySaveStatesPreferred) - { - movieToRecord.BinarySavestate = (byte[])core.SaveStateBinary().Clone(); - } - else - { - using (var sw = new StringWriter()) - { - core.SaveStateText(sw); - movieToRecord.TextSavestate = sw.ToString(); - } - } - - // TODO: do we want to support optionally not saving this? - if (true) - { - // hack: some IMovies eat the framebuffer, so don't bother with them - movieToRecord.SavestateFramebuffer = new int[0]; - if (movieToRecord.SavestateFramebuffer != null && Emulator.HasVideoProvider()) - { - movieToRecord.SavestateFramebuffer = (int[])Emulator.AsVideoProvider().GetVideoBuffer().Clone(); - } - } - } - else if (StartFromCombo.SelectedItem.ToString() == "SaveRam" && Emulator.HasSaveRam()) - { - var core = Emulator.AsSaveRam(); - movieToRecord.StartsFromSavestate = false; - movieToRecord.StartsFromSaveRam = true; - movieToRecord.SaveRam = core.CloneSaveRam(); - } - - movieToRecord.PopulateWithDefaultHeaderValues(AuthorBox.Text); - movieToRecord.Save(); - GlobalWin.MainForm.StartNewMovie(movieToRecord, true); - - Global.Config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked; - if (DefaultAuthorCheckBox.Checked) - { - Global.Config.DefaultAuthor = AuthorBox.Text; - } - - Close(); - } - else - { - MessageBox.Show("Please select a movie to record", "File selection error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - private void Cancel_Click(object sender, EventArgs e) - { - Close(); - } - - private void BrowseBtn_Click(object sender, EventArgs e) - { - string movieFolderPath = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null); - - // Create movie folder if it doesn't already exist - try - { - if (!Directory.Exists(movieFolderPath)) - { - Directory.CreateDirectory(movieFolderPath); - } - } - catch (Exception movieDirException) - { - if (movieDirException is IOException || - movieDirException is UnauthorizedAccessException || - movieDirException is PathTooLongException) - { - //TO DO : Pass error to user? - } - else throw; - } - - var sfd = new SaveFileDialog - { - InitialDirectory = movieFolderPath, - DefaultExt = "." + Global.MovieSession.Movie.PreferredExtension, - FileName = RecordBox.Text, - OverwritePrompt = false, - Filter = "Movie Files (*." + Global.MovieSession.Movie.PreferredExtension + ")|*." + Global.MovieSession.Movie.PreferredExtension + "|All Files|*.*" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK - && !string.IsNullOrWhiteSpace(sfd.FileName)) - { - RecordBox.Text = sfd.FileName; - } - } - - private void RecordMovie_Load(object sender, EventArgs e) - { - RecordBox.Text = PathManager.FilesystemSafeName(Global.Game); - StartFromCombo.SelectedIndex = 0; - DefaultAuthorCheckBox.Checked = Global.Config.UseDefaultAuthor; - if (Global.Config.UseDefaultAuthor) - { - AuthorBox.Text = Global.Config.DefaultAuthor; - } - } - - private void RecordBox_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void RecordBox_DragDrop(object sender, DragEventArgs e) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - RecordBox.Text = filePaths[0]; - } - } -} diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.resx b/BizHawk.Client.EmuHawk/movie/RecordMovie.resx deleted file mode 100644 index fb80888459..0000000000 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.resx +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////AP64aABQUFAAwNjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAMDAAMDAwAAAAAAAAAAAAMCAgMDAwMDAwAAAAMDAAADAgICAwMDAwMDAwMCAgMAAAMCAwMD - AwMDAwMDAgIDAAMEBAQDAgMDAwMDAwICAgMDBAQEAwICAwQDAwQDAgIDAAMDAwICAgMCAgIDAwMDAAAA - AwICAgMCAgIDAgMAAAAAAAAAAwMEBAQEBAQCAwAAAAAAAwMEBAQDAwMDAwMAAAAAAwQEAwMEBAMEBAQC - AwAAAAMEBAMDBAMEBAQEAgMAAAAAAwMDBAQDBAMDAwIDAAAAAAMCAgICAgICAgMEBAMAAAAAAwICAgIC - AwMEBAQDAAAAAAADAwMDAwAAAwMDAJH/AAAAcwAAAAEAAIABAAAAAAAAAAAAAIABAADABwAA8AMAAOAD - AADAAQAAwAEAAOABAADgAAAA8AAAAPgxAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/movie/SubtitleMaker.resx b/BizHawk.Client.EmuHawk/movie/SubtitleMaker.resx deleted file mode 100644 index 38cae3797b..0000000000 --- a/BizHawk.Client.EmuHawk/movie/SubtitleMaker.resx +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////AP64aABQUFAAwNjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAMDAAMDAwAAAAAAAAAAAAMCAgMDAwMDAwAAAAMDAAADAgICAwMDAwMDAwMCAgMAAAMCAwMD - AwMDAwMDAgIDAAMEBAQDAgMDAwMDAwICAgMDBAQEAwICAwQDAwQDAgIDAAMDAwICAgMCAgIDAwMDAAAA - AwICAgMCAgIDAgMAAAAAAAAAAwMEBAQEBAQCAwAAAAAAAwMEBAQDAwMDAwMAAAAAAwQEAwMEBAMEBAQC - AwAAAAMEBAMDBAMEBAQEAgMAAAAAAwMDBAQDBAMDAwIDAAAAAAMCAgICAgICAgMEBAMAAAAAAwICAgIC - AwMEBAQDAAAAAAADAwMDAwAAAwMDAJH/AAAAcwAAAAEAAIABAAAAAAAAAAAAAIABAADABwAA8AMAAOAD - AADAAQAAwAEAAOABAADgAAAA8AAAAPgxAAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/AutoHawk.Designer.cs b/BizHawk.Client.EmuHawk/tools/AutoHawk.Designer.cs deleted file mode 100644 index 5054e0208c..0000000000 --- a/BizHawk.Client.EmuHawk/tools/AutoHawk.Designer.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace BizHawk.Client.EmuHawk -{ - partial class AutoHawk - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.AutoMenu = new System.Windows.Forms.MenuStrip(); - this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AutoMenu.SuspendLayout(); - this.SuspendLayout(); - // - // AutoMenu - // - this.AutoMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FileSubMenu}); - this.AutoMenu.Location = new System.Drawing.Point(0, 0); - this.AutoMenu.Name = "AutoMenu"; - this.AutoMenu.Size = new System.Drawing.Size(508, 24); - this.AutoMenu.TabIndex = 2; - this.AutoMenu.Text = "menuStrip1"; - // - // FileSubMenu - // - this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ExitMenuItem}); - this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(37, 20); - this.FileSubMenu.Text = "&File"; - // - // ExitMenuItem - // - this.ExitMenuItem.Name = "ExitMenuItem"; - this.ExitMenuItem.Size = new System.Drawing.Size(152, 22); - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); - // - // AutoHawk - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(508, 444); - this.Controls.Add(this.AutoMenu); - this.MainMenuStrip = this.AutoMenu; - this.Name = "AutoHawk"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "AutoHawk"; - this.Load += new System.EventHandler(this.AutoHawk_Load); - this.AutoMenu.ResumeLayout(false); - this.AutoMenu.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.MenuStrip AutoMenu; - private System.Windows.Forms.ToolStripMenuItem FileSubMenu; - private System.Windows.Forms.ToolStripMenuItem ExitMenuItem; - } -} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/AutoHawk.cs b/BizHawk.Client.EmuHawk/tools/AutoHawk.cs deleted file mode 100644 index c1674db0ee..0000000000 --- a/BizHawk.Client.EmuHawk/tools/AutoHawk.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - [Tool(released: false, supportedSystems: null)] - public partial class AutoHawk : Form, IToolFormAutoConfig - { - public AutoHawk() - { - InitializeComponent(); - } - - private void AutoHawk_Load(object sender, EventArgs e) - { - - } - - [RequiredService] - public IMemoryDomains MemoryDomains { get; set; } - - [RequiredService] - public IStatable StatableCore { get; set; } - - [ConfigPersist] - public ConfigVariables Config { get; set; } - - public class ConfigVariables - { - // anything that needs to be saved in config.ini should go here - } - - #region IToolForm Implementation - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - // TODO: per frame stuff goes here - } - - public void FastUpdate() - { - // TODO: when the user is turboing this will be called, slow things like updating graphics should be avoided, but critical operations must still be done here - } - - public void Restart() - { - // When the user changes to a new ROM, closes a ROM, starts a movie, etc, this will be called - } - - public bool UpdateBefore { get { return true; } } - - public bool AskSaveChanges() - { - return true; - } - - #endregion - - private void ExitMenuItem_Click(object sender, EventArgs e) - { - Close(); - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/AutoHawk.resx b/BizHawk.Client.EmuHawk/tools/AutoHawk.resx deleted file mode 100644 index 435c368278..0000000000 --- a/BizHawk.Client.EmuHawk/tools/AutoHawk.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs deleted file mode 100644 index 2c6392854c..0000000000 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs +++ /dev/null @@ -1,1334 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using BizHawk.Client.EmuHawk.ToolExtensions; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BasicBot : ToolFormBase , IToolFormAutoConfig - { - private const string DialogTitle = "Basic Bot"; - - private string _currentFileName = ""; - - private string CurrentFileName - { - get { return _currentFileName; } - set - { - _currentFileName = value; - - if (!string.IsNullOrWhiteSpace(_currentFileName)) - { - Text = DialogTitle + " - " + Path.GetFileNameWithoutExtension(_currentFileName); - } - else - { - Text = DialogTitle; - } - } - - } - - private bool _isBotting = false; - private long _attempts = 1; - private long _frames = 0; - private int _targetFrame = 0; - private bool _oldCountingSetting = false; - private BotAttempt _currentBotAttempt = null; - private BotAttempt _bestBotAttempt = null; - private BotAttempt _comparisonBotAttempt = null; - private bool _replayMode = false; - private int _startFrame = 0; - private string _lastRom = ""; - - private bool _dontUpdateValues = false; - - private MemoryDomain _currentDomain; - private bool _bigEndian; - private int _dataSize; - - private Dictionary _cachedControlProbabilities; - private ILogEntryGenerator _logGenerator; - - #region Services and Settings - - [RequiredService] - private IEmulator Emulator { get; set; } - - // Unused, due to the use of MainForm to loadstate, but this needs to be kept here in order to establish an IStatable dependency - [RequiredService] - private IStatable StatableCore { get; set; } - - [RequiredService] - private IMemoryDomains MemoryDomains { get; set; } - - [ConfigPersist] - public BasicBotSettings Settings { get; set; } - - public class BasicBotSettings - { - public BasicBotSettings() - { - RecentBotFiles = new RecentFiles(); - TurboWhenBotting = true; - } - - public RecentFiles RecentBotFiles { get; set; } - public bool TurboWhenBotting { get; set; } - } - - #endregion - - #region Initialize - - public BasicBot() - { - InitializeComponent(); - Text = DialogTitle; - Settings = new BasicBotSettings(); - - _comparisonBotAttempt = new BotAttempt(); - } - - private void BasicBot_Load(object sender, EventArgs e) - { - - } - - #endregion - - #region UI Bindings - - private Dictionary ControlProbabilities - { - get - { - return ControlProbabilityPanel.Controls - .OfType() - .ToDictionary(tkey => tkey.ButtonName, tvalue => tvalue.Probability); - } - } - - private string SelectedSlot - { - get - { - char num = StartFromSlotBox.SelectedItem - .ToString() - .Last(); - - return "QuickSave" + num; - } - } - - private long Attempts - { - get { return _attempts; } - set - { - _attempts = value; - AttemptsLabel.Text = _attempts.ToString(); - } - } - - private long Frames - { - get { return _frames; } - set - { - _frames = value; - FramesLabel.Text = _frames.ToString(); - } - } - - private int FrameLength - { - get { return (int)FrameLengthNumeric.Value; } - set { FrameLengthNumeric.Value = value; } - } - - public int MaximizeAddress - { - get - { - int? addr = MaximizeAddressBox.ToRawInt(); - if (addr.HasValue) - { - return addr.Value; - } - - return 0; - } - - set - { - MaximizeAddressBox.SetFromRawInt(value); - } - } - - public int MaximizeValue - { - get - { - int? addr = MaximizeAddressBox.ToRawInt(); - if (addr.HasValue) - { - return GetRamvalue(addr.Value); - } - - return 0; - } - } - - public int TieBreaker1Address - { - get - { - int? addr = TieBreaker1Box.ToRawInt(); - if (addr.HasValue) - { - return addr.Value; - } - - return 0; - } - - set - { - TieBreaker1Box.SetFromRawInt(value); - } - } - - public int TieBreaker1Value - { - get - { - int? addr = TieBreaker1Box.ToRawInt(); - if (addr.HasValue) - { - return GetRamvalue(addr.Value); - } - - return 0; - } - } - - public int TieBreaker2Address - { - get - { - int? addr = TieBreaker2Box.ToRawInt(); - if (addr.HasValue) - { - return addr.Value; - } - - return 0; - } - - set - { - TieBreaker2Box.SetFromRawInt(value); - } - } - - public int TieBreaker2Value - { - get - { - int? addr = TieBreaker2Box.ToRawInt(); - if (addr.HasValue) - { - return GetRamvalue(addr.Value); - } - - return 0; - } - } - - public int TieBreaker3Address - { - get - { - int? addr = TieBreaker3Box.ToRawInt(); - if (addr.HasValue) - { - return addr.Value; - } - - return 0; - } - - set - { - TieBreaker3Box.SetFromRawInt(value); - } - } - - public int TieBreaker3Value - { - get - { - int? addr = TieBreaker3Box.ToRawInt(); - if (addr.HasValue) - { - return GetRamvalue(addr.Value); - } - - return 0; - } - } - - public byte MainComparisonType - { - get - { - return (byte)MainOperator.SelectedIndex; - } - set - { - if (value < 5) MainOperator.SelectedIndex = value; - else MainOperator.SelectedIndex = 0; - } - } - - public byte Tie1ComparisonType - { - get - { - return (byte)Tiebreak1Operator.SelectedIndex; - } - set - { - if (value < 5) Tiebreak1Operator.SelectedIndex = value; - else Tiebreak1Operator.SelectedIndex = 0; - } - } - - public byte Tie2ComparisonType - { - get - { - return (byte)Tiebreak2Operator.SelectedIndex; - } - set - { - if (value < 5) Tiebreak2Operator.SelectedIndex = value; - else Tiebreak2Operator.SelectedIndex = 0; - } - } - - public byte Tie3ComparisonType - { - get - { - return (byte)Tiebreak3Operator.SelectedIndex; - } - set - { - if (value < 5) Tiebreak3Operator.SelectedIndex = value; - else Tiebreak3Operator.SelectedIndex = 0; - } - } - - public string FromSlot - { - get - { - return StartFromSlotBox.SelectedItem != null - ? StartFromSlotBox.SelectedItem.ToString() - : ""; - } - - set - { - var item = StartFromSlotBox.Items. - OfType() - .FirstOrDefault(o => o.ToString() == value); - - if (item != null) - { - StartFromSlotBox.SelectedItem = item; - } - else - { - StartFromSlotBox.SelectedItem = null; - } - } - } - - #endregion - - #region IToolForm Implementation - - public bool UpdateBefore { get { return true; } } - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - Update(fast: false); - } - - public void FastUpdate() - { - Update(fast: true); - } - - public void Restart() - { - if (_currentDomain == null || - MemoryDomains.Contains(_currentDomain)) - { - _currentDomain = MemoryDomains.MainMemory; - _bigEndian = _currentDomain.EndianType == MemoryDomain.Endian.Big; - _dataSize = 1; - } - - if (_isBotting) - { - StopBot(); - } - else if (_replayMode) - { - FinishReplay(); - } - - - if (_lastRom != GlobalWin.MainForm.CurrentlyOpenRom) - { - _lastRom = GlobalWin.MainForm.CurrentlyOpenRom; - SetupControlsAndProperties(); - } - } - - public bool AskSaveChanges() - { - return true; - } - - #endregion - - #region Control Events - - #region FileMenu - - private void FileSubMenu_DropDownOpened(object sender, EventArgs e) - { - SaveMenuItem.Enabled = !string.IsNullOrWhiteSpace(CurrentFileName); - } - - private void RecentSubMenu_DropDownOpened(object sender, EventArgs e) - { - RecentSubMenu.DropDownItems.Clear(); - RecentSubMenu.DropDownItems.AddRange( - Settings.RecentBotFiles.RecentMenu(LoadFileFromRecent, true)); - } - - private void NewMenuItem_Click(object sender, EventArgs e) - { - CurrentFileName = ""; - _bestBotAttempt = null; - - ControlProbabilityPanel.Controls - .OfType() - .ToList() - .ForEach(cp => cp.Probability = 0); - - FrameLength = 0; - MaximizeAddress = 0; - TieBreaker1Address = 0; - TieBreaker2Address = 0; - TieBreaker3Address = 0; - StartFromSlotBox.SelectedIndex = 0; - MainOperator.SelectedIndex = 0; - Tiebreak1Operator.SelectedIndex = 0; - Tiebreak2Operator.SelectedIndex = 0; - Tiebreak3Operator.SelectedIndex = 0; - MainBestRadio.Checked = true; - MainValueNumeric.Value = 0; - TieBreak1Numeric.Value = 0; - TieBreak2Numeric.Value = 0; - TieBreak3Numeric.Value = 0; - TieBreak1BestRadio.Checked = true; - TieBreak2BestRadio.Checked = true; - TieBreak3BestRadio.Checked = true; - - UpdateBestAttempt(); - UpdateComparisonBotAttempt(); - } - - private void OpenMenuItem_Click(object sender, EventArgs e) - { - var file = OpenFileDialog( - CurrentFileName, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.ToolsPathFragment, null), - "Bot files", - "bot" - ); - - if (file != null) - { - LoadBotFile(file.FullName); - } - } - - private void SaveMenuItem_Click(object sender, EventArgs e) - { - if (!string.IsNullOrWhiteSpace(CurrentFileName)) - { - SaveBotFile(CurrentFileName); - } - } - - private void SaveAsMenuItem_Click(object sender, EventArgs e) - { - var file = SaveFileDialog( - CurrentFileName, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.ToolsPathFragment, null), - "Bot files", - "bot" - ); - - if (file != null) - { - SaveBotFile(file.FullName); - _currentFileName = file.FullName; - } - } - - private void ExitMenuItem_Click(object sender, EventArgs e) - { - Close(); - } - - #endregion - - #region Options Menu - - private void OptionsSubMenu_DropDownOpened(object sender, EventArgs e) - { - TurboWhileBottingMenuItem.Checked = Settings.TurboWhenBotting; - BigEndianMenuItem.Checked = _bigEndian; - } - - private void MemoryDomainsMenuItem_DropDownOpened(object sender, EventArgs e) - { - MemoryDomainsMenuItem.DropDownItems.Clear(); - MemoryDomainsMenuItem.DropDownItems.AddRange( - MemoryDomains.MenuItems(SetMemoryDomain, _currentDomain.Name) - .ToArray()); - } - - private void BigEndianMenuItem_Click(object sender, EventArgs e) - { - _bigEndian ^= true; - } - - private void DataSizeMenuItem_DropDownOpened(object sender, EventArgs e) - { - _1ByteMenuItem.Checked = _dataSize == 1; - _2ByteMenuItem.Checked = _dataSize == 2; - _4ByteMenuItem.Checked = _dataSize == 4; - } - - private void _1ByteMenuItem_Click(object sender, EventArgs e) - { - _dataSize = 1; - } - - private void _2ByteMenuItem_Click(object sender, EventArgs e) - { - _dataSize = 2; - } - - private void _4ByteMenuItem_Click(object sender, EventArgs e) - { - _dataSize = 4; - } - - private void TurboWhileBottingMenuItem_Click(object sender, EventArgs e) - { - Settings.TurboWhenBotting ^= true; - } - - #endregion - - private void RunBtn_Click(object sender, EventArgs e) - { - StartBot(); - } - - private void StopBtn_Click(object sender, EventArgs e) - { - StopBot(); - } - - private void ClearBestButton_Click(object sender, EventArgs e) - { - _bestBotAttempt = null; - Attempts = 0; - Frames = 0; - UpdateBestAttempt(); - UpdateComparisonBotAttempt(); - } - - private void PlayBestButton_Click(object sender, EventArgs e) - { - StopBot(); - _replayMode = true; - _dontUpdateValues = true; - GlobalWin.MainForm.LoadQuickSave(SelectedSlot, false, true); // Triggers an UpdateValues call - _dontUpdateValues = false; - _startFrame = Emulator.Frame; - SetNormalSpeed(); - UpdateBotStatusIcon(); - MessageLabel.Text = "Replaying"; - GlobalWin.MainForm.UnpauseEmulator(); - } - - private void FrameLengthNumeric_ValueChanged(object sender, EventArgs e) - { - AssessRunButtonStatus(); - } - - private void ClearStatsContextMenuItem_Click(object sender, EventArgs e) - { - Attempts = 0; - Frames = 0; - } - - #endregion - - #region Classes - - private class BotAttempt - { - public BotAttempt() - { - Log = new List(); - } - - public long Attempt { get; set; } - public int Maximize { get; set; } - public int TieBreak1 { get; set; } - public int TieBreak2 { get; set; } - public int TieBreak3 { get; set; } - public byte ComparisonTypeMain { get; set; } - public byte ComparisonTypeTie1 { get; set; } - public byte ComparisonTypeTie2 { get; set; } - public byte ComparisonTypeTie3 { get; set; } - - public List Log { get; set; } - } - - private class BotData - { - public BotData() - { - MainCompareToBest = true; - TieBreaker1CompareToBest = true; - TieBreaker2CompareToBest = true; - TieBreaker3CompareToBest = true; - } - - public BotAttempt Best { get; set; } - public Dictionary ControlProbabilities { get; set; } - public int Maximize { get; set; } - public int TieBreaker1 { get; set; } - public int TieBreaker2 { get; set; } - public int TieBreaker3 { get; set; } - public byte ComparisonTypeMain { get; set; } - public byte ComparisonTypeTie1 { get; set; } - public byte ComparisonTypeTie2 { get; set; } - public byte ComparisonTypeTie3 { get; set; } - public bool MainCompareToBest { get; set; } - public bool TieBreaker1CompareToBest { get; set; } - public bool TieBreaker2CompareToBest { get; set; } - public bool TieBreaker3CompareToBest { get; set; } - public int MainCompareToValue { get; set; } - public int TieBreaker1CompareToValue { get; set; } - public int TieBreaker2CompareToValue { get; set; } - public int TieBreaker3CompareToValue { get; set; } - public int FrameLength { get; set; } - public string FromSlot { get; set; } - public long Attempts { get; set; } - public long Frames { get; set; } - - public string MemoryDomain { get; set; } - public bool BigEndian { get; set; } - public int DataSize { get; set; } - } - - #endregion - - #region File Handling - - private void LoadFileFromRecent(string path) - { - var result = LoadBotFile(path); - if (!result) - { - Settings.RecentBotFiles.HandleLoadError(path); - } - } - - private bool LoadBotFile(string path) - { - var file = new FileInfo(path); - if (!file.Exists) - { - return false; - } - - var json = File.ReadAllText(path); - var botData = (BotData)ConfigService.LoadWithType(json); - - _bestBotAttempt = botData.Best; - - var probabilityControls = ControlProbabilityPanel.Controls - .OfType() - .ToList(); - - foreach (var kvp in botData.ControlProbabilities) - { - var control = probabilityControls.Single(c => c.ButtonName == kvp.Key); - control.Probability = kvp.Value; - } - - MaximizeAddress = botData.Maximize; - TieBreaker1Address = botData.TieBreaker1; - TieBreaker2Address = botData.TieBreaker2; - TieBreaker3Address = botData.TieBreaker3; - try - { - MainComparisonType = botData.ComparisonTypeMain; - Tie1ComparisonType = botData.ComparisonTypeTie1; - Tie2ComparisonType = botData.ComparisonTypeTie2; - Tie3ComparisonType = botData.ComparisonTypeTie3; - - MainBestRadio.Checked = botData.MainCompareToBest; - TieBreak1BestRadio.Checked = botData.TieBreaker1CompareToBest; - TieBreak2BestRadio.Checked = botData.TieBreaker2CompareToBest; - TieBreak3BestRadio.Checked = botData.TieBreaker3CompareToBest; - MainValueRadio.Checked = !botData.MainCompareToBest; - TieBreak1ValueRadio.Checked = !botData.TieBreaker1CompareToBest; - TieBreak2ValueRadio.Checked = !botData.TieBreaker2CompareToBest; - TieBreak3ValueRadio.Checked = !botData.TieBreaker3CompareToBest; - - MainValueNumeric.Value = botData.MainCompareToValue; - TieBreak1Numeric.Value = botData.TieBreaker1CompareToValue; - TieBreak2Numeric.Value = botData.TieBreaker2CompareToValue; - TieBreak3Numeric.Value = botData.TieBreaker3CompareToValue; - } - catch - { - MainComparisonType = 0; - Tie1ComparisonType = 0; - Tie2ComparisonType = 0; - Tie3ComparisonType = 0; - - MainBestRadio.Checked = true; - TieBreak1BestRadio.Checked = true; - TieBreak2BestRadio.Checked = true; - TieBreak3BestRadio.Checked = true; - MainBestRadio.Checked = false; - TieBreak1BestRadio.Checked = false; - TieBreak2BestRadio.Checked = false; - TieBreak3BestRadio.Checked = false; - - MainValueNumeric.Value = 0; - TieBreak1Numeric.Value = 0; - TieBreak2Numeric.Value = 0; - TieBreak3Numeric.Value = 0; - } - FrameLength = botData.FrameLength; - FromSlot = botData.FromSlot; - Attempts = botData.Attempts; - Frames = botData.Frames; - - _currentDomain = !string.IsNullOrWhiteSpace(botData.MemoryDomain) - ? MemoryDomains[botData.MemoryDomain] - : MemoryDomains.MainMemory; - - _bigEndian = botData.BigEndian; - _dataSize = botData.DataSize > 0 ? botData.DataSize : 1; - - UpdateBestAttempt(); - UpdateComparisonBotAttempt(); - - if (_bestBotAttempt != null) - { - PlayBestButton.Enabled = true; - } - - CurrentFileName = path; - Settings.RecentBotFiles.Add(CurrentFileName); - MessageLabel.Text = Path.GetFileNameWithoutExtension(path) + " loaded"; - - AssessRunButtonStatus(); - return true; - } - - private void SaveBotFile(string path) - { - var data = new BotData - { - Best = _bestBotAttempt, - ControlProbabilities = ControlProbabilities, - Maximize = MaximizeAddress, - TieBreaker1 = TieBreaker1Address, - TieBreaker2 = TieBreaker2Address, - TieBreaker3 = TieBreaker3Address, - ComparisonTypeMain = MainComparisonType, - ComparisonTypeTie1 = Tie1ComparisonType, - ComparisonTypeTie2 = Tie2ComparisonType, - ComparisonTypeTie3 = Tie3ComparisonType, - MainCompareToBest = MainBestRadio.Checked, - TieBreaker1CompareToBest = TieBreak1BestRadio.Checked, - TieBreaker2CompareToBest = TieBreak2BestRadio.Checked, - TieBreaker3CompareToBest = TieBreak3BestRadio.Checked, - MainCompareToValue = (int)MainValueNumeric.Value, - TieBreaker1CompareToValue = (int)TieBreak1Numeric.Value, - TieBreaker2CompareToValue = (int)TieBreak2Numeric.Value, - TieBreaker3CompareToValue = (int)TieBreak3Numeric.Value, - FromSlot = FromSlot, - FrameLength = FrameLength, - Attempts = Attempts, - Frames = Frames, - MemoryDomain = _currentDomain.Name, - BigEndian = _bigEndian, - DataSize = _dataSize - }; - - var json = ConfigService.SaveWithType(data); - - File.WriteAllText(path, json); - CurrentFileName = path; - Settings.RecentBotFiles.Add(CurrentFileName); - MessageLabel.Text = Path.GetFileName(CurrentFileName) + " saved"; - } - - #endregion - - private void SetupControlsAndProperties() - { - MaximizeAddressBox.SetHexProperties(_currentDomain.Size); - TieBreaker1Box.SetHexProperties(_currentDomain.Size); - TieBreaker2Box.SetHexProperties(_currentDomain.Size); - TieBreaker3Box.SetHexProperties(_currentDomain.Size); - - StartFromSlotBox.SelectedIndex = 0; - - int starty = 0; - int accumulatedy = 0; - int lineHeight = 30; - int marginLeft = 15; - int count = 0; - - ControlProbabilityPanel.Controls.Clear(); - - foreach (var button in Emulator.ControllerDefinition.BoolButtons) - { - var control = new BotControlsRow - { - ButtonName = button, - Probability = 0.0, - Location = new Point(marginLeft, starty + accumulatedy), - TabIndex = count + 1, - ProbabilityChangedCallback = AssessRunButtonStatus - }; - - ControlProbabilityPanel.Controls.Add(control); - accumulatedy += lineHeight; - count++; - } - - if (Settings.RecentBotFiles.AutoLoad) - { - LoadFileFromRecent(Settings.RecentBotFiles.MostRecent); - } - - UpdateBotStatusIcon(); - } - - private void SetMemoryDomain(string name) - { - _currentDomain = MemoryDomains[name]; - _bigEndian = MemoryDomains[name].EndianType == MemoryDomain.Endian.Big; - - MaximizeAddressBox.SetHexProperties(_currentDomain.Size); - TieBreaker1Box.SetHexProperties(_currentDomain.Size); - TieBreaker2Box.SetHexProperties(_currentDomain.Size); - TieBreaker3Box.SetHexProperties(_currentDomain.Size); - } - - private int GetRamvalue(int addr) - { - int val; - switch (_dataSize) - { - default: - case 1: - val = _currentDomain.PeekByte(addr); - break; - case 2: - val = _currentDomain.PeekUshort(addr, _bigEndian); - break; - case 4: - val = (int)_currentDomain.PeekUint(addr, _bigEndian); - break; - } - - return val; - } - - private void Update(bool fast) - { - if (_dontUpdateValues) - { - return; - } - - if (_replayMode) - { - int index = Emulator.Frame - _startFrame; - - if (index < _bestBotAttempt.Log.Count) - { - var logEntry = _bestBotAttempt.Log[index]; - var lg = Global.MovieSession.MovieControllerInstance(); - lg.SetControllersAsMnemonic(logEntry); - - foreach (var button in lg.Definition.BoolButtons) - { - // TODO: make an input adapter specifically for the bot? - Global.LuaAndAdaptor.SetButton(button, lg.IsPressed(button)); - } - } - else - { - FinishReplay(); - } - } - else if (_isBotting) - { - if (Emulator.Frame >= _targetFrame) - { - Attempts++; - Frames += FrameLength; - - _currentBotAttempt.Maximize = MaximizeValue; - _currentBotAttempt.TieBreak1 = TieBreaker1Value; - _currentBotAttempt.TieBreak2 = TieBreaker2Value; - _currentBotAttempt.TieBreak3 = TieBreaker3Value; - PlayBestButton.Enabled = true; - - if (_bestBotAttempt == null || IsBetter(_bestBotAttempt, _currentBotAttempt)) - { - _bestBotAttempt = _currentBotAttempt; - UpdateBestAttempt(); - } - - _currentBotAttempt = new BotAttempt { Attempt = Attempts }; - GlobalWin.MainForm.LoadQuickSave(SelectedSlot, false, true); - } - - PressButtons(); - } - } - - private void FinishReplay() - { - GlobalWin.MainForm.PauseEmulator(); - _startFrame = 0; - _replayMode = false; - UpdateBotStatusIcon(); - MessageLabel.Text = "Replay stopped"; - } - - private bool IsBetter(BotAttempt comparison, BotAttempt current) - { - if (!TestValue(MainComparisonType, current.Maximize, comparison.Maximize)) - { - return false; - } - else if (current.Maximize == comparison.Maximize) - { - if (!TestValue(Tie1ComparisonType, current.TieBreak1, comparison.TieBreak1)) - { - return false; - } - else if (current.TieBreak1 == comparison.TieBreak1) - { - if (!TestValue(Tie2ComparisonType, current.TieBreak2, comparison.TieBreak2)) - { - return false; - } - else if (current.TieBreak2 == comparison.TieBreak2) - { - if (!TestValue(Tie3ComparisonType, current.TieBreak3, current.TieBreak3)) - { - return false; - } - } - } - } - - return true; - } - - private bool TestValue(byte operation, int currentValue, int bestValue) - { - switch (operation) - { - case 0: - return currentValue > bestValue; - case 1: - return currentValue >= bestValue; - case 2: - return currentValue == bestValue; - case 3: - return currentValue <= bestValue; - case 4: - return currentValue < bestValue; - } - return false; - } - - private void UpdateBestAttempt() - { - if (_bestBotAttempt != null) - { - ClearBestButton.Enabled = true; - BestAttemptNumberLabel.Text = _bestBotAttempt.Attempt.ToString(); - BestMaximizeBox.Text = _bestBotAttempt.Maximize.ToString(); - BestTieBreak1Box.Text = _bestBotAttempt.TieBreak1.ToString(); - BestTieBreak2Box.Text = _bestBotAttempt.TieBreak2.ToString(); - BestTieBreak3Box.Text = _bestBotAttempt.TieBreak3.ToString(); - - var sb = new StringBuilder(); - foreach (var logEntry in _bestBotAttempt.Log) - { - sb.AppendLine(logEntry); - } - BestAttemptLogLabel.Text = sb.ToString(); - PlayBestButton.Enabled = true; - } - else - { - ClearBestButton.Enabled = false; - BestAttemptNumberLabel.Text = ""; - BestMaximizeBox.Text = ""; - BestTieBreak1Box.Text = ""; - BestTieBreak2Box.Text = ""; - BestTieBreak3Box.Text = ""; - BestAttemptLogLabel.Text = ""; - PlayBestButton.Enabled = false; - } - } - - private void PressButtons() - { - var rand = new Random((int)DateTime.Now.Ticks); - - var buttonLog = new Dictionary(); - - foreach (var button in Emulator.ControllerDefinition.BoolButtons) - { - double probability = _cachedControlProbabilities[button]; - bool pressed = !(rand.Next(100) < probability); - - buttonLog.Add(button, pressed); - Global.ClickyVirtualPadController.SetBool(button, pressed); - } - - _currentBotAttempt.Log.Add(_logGenerator.GenerateLogEntry()); - } - - private void StartBot() - { - if (!CanStart()) - { - MessageBox.Show("Unable to run with current settings"); - return; - } - - _isBotting = true; - ControlsBox.Enabled = false; - StartFromSlotBox.Enabled = false; - RunBtn.Visible = false; - StopBtn.Visible = true; - GoalGroupBox.Enabled = false; - _currentBotAttempt = new BotAttempt { Attempt = Attempts }; - - if (Global.MovieSession.Movie.IsRecording) - { - _oldCountingSetting = Global.MovieSession.Movie.IsCountingRerecords; - Global.MovieSession.Movie.IsCountingRerecords = false; - } - - _dontUpdateValues = true; - GlobalWin.MainForm.LoadQuickSave(SelectedSlot, false, true); // Triggers an UpdateValues call - _dontUpdateValues = false; - - _targetFrame = Emulator.Frame + (int)FrameLengthNumeric.Value; - - GlobalWin.MainForm.UnpauseEmulator(); - if (Settings.TurboWhenBotting) - { - SetMaxSpeed(); - } - - UpdateBotStatusIcon(); - MessageLabel.Text = "Running..."; - _cachedControlProbabilities = ControlProbabilities; - _logGenerator = Global.MovieSession.LogGeneratorInstance(); - _logGenerator.SetSource(Global.ClickyVirtualPadController); - } - - private bool CanStart() - { - if (!ControlProbabilities.Any(cp => cp.Value > 0)) - { - return false; - } - - if (!MaximizeAddressBox.ToRawInt().HasValue) - { - return false; - } - - if (FrameLengthNumeric.Value == 0) - { - return false; - } - - return true; - } - - private void StopBot() - { - RunBtn.Visible = true; - StopBtn.Visible = false; - _isBotting = false; - _targetFrame = 0; - ControlsBox.Enabled = true; - StartFromSlotBox.Enabled = true; - _targetFrame = 0; - _currentBotAttempt = null; - GoalGroupBox.Enabled = true; - - if (Global.MovieSession.Movie.IsRecording) - { - Global.MovieSession.Movie.IsCountingRerecords = _oldCountingSetting; - } - - GlobalWin.MainForm.PauseEmulator(); - SetNormalSpeed(); - UpdateBotStatusIcon(); - MessageLabel.Text = "Bot stopped"; - } - - private void UpdateBotStatusIcon() - { - if (_replayMode) - { - BotStatusButton.Image = Properties.Resources.Play; - BotStatusButton.ToolTipText = "Replaying best result"; - } - else if (_isBotting) - { - BotStatusButton.Image = Properties.Resources.RecordHS; - BotStatusButton.ToolTipText = "Botting in progress"; - } - else - { - BotStatusButton.Image = Properties.Resources.Pause; - BotStatusButton.ToolTipText = "Bot is currently not running"; - } - } - - private void SetMaxSpeed() - { - GlobalWin.MainForm.Unthrottle(); - } - - private void SetNormalSpeed() - { - GlobalWin.MainForm.Throttle(); - } - - private void AssessRunButtonStatus() - { - RunBtn.Enabled = - FrameLength > 0 - && !string.IsNullOrWhiteSpace(MaximizeAddressBox.Text) - && ControlProbabilities.Any(kvp => kvp.Value > 0); - } - - /// - /// Updates comparison bot attempt with current best bot attempt values for values where the "best" radio button is selected - /// - private void UpdateComparisonBotAttempt() - { - if(_bestBotAttempt == null) - { - if (MainBestRadio.Checked) - { - _comparisonBotAttempt.Maximize = 0; - } - - if (TieBreak1BestRadio.Checked) - { - _comparisonBotAttempt.TieBreak1 = 0; - } - - if (TieBreak2BestRadio.Checked) - { - _comparisonBotAttempt.TieBreak2= 0; - } - - if (TieBreak3BestRadio.Checked) - { - _comparisonBotAttempt.TieBreak3 = 0; - } - } - else - { - if (MainBestRadio.Checked && _bestBotAttempt.Maximize != _comparisonBotAttempt.Maximize) - { - _comparisonBotAttempt.Maximize = _bestBotAttempt.Maximize; - } - - if (TieBreak1BestRadio.Checked && _bestBotAttempt.TieBreak1 != _comparisonBotAttempt.TieBreak1) - { - _comparisonBotAttempt.TieBreak1 = _bestBotAttempt.TieBreak1; - } - - if (TieBreak2BestRadio.Checked && _bestBotAttempt.TieBreak2 != _comparisonBotAttempt.TieBreak2) - { - _comparisonBotAttempt.TieBreak2 = _bestBotAttempt.TieBreak2; - } - - if (TieBreak3BestRadio.Checked && _bestBotAttempt.TieBreak3 != _comparisonBotAttempt.TieBreak3) - { - _comparisonBotAttempt.TieBreak3 = _bestBotAttempt.TieBreak3; - } - } - } - - private void MainBestRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.MainValueNumeric.Enabled = false; - _comparisonBotAttempt.Maximize = _bestBotAttempt == null ? 0 : _bestBotAttempt.Maximize; - } - } - - private void Tiebreak1BestRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak1Numeric.Enabled = false; - _comparisonBotAttempt.TieBreak1 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak1; - } - } - - private void Tiebreak2BestRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak2Numeric.Enabled = false; - _comparisonBotAttempt.TieBreak2 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak2; - } - } - - private void Tiebreak3BestRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak3Numeric.Enabled = false; - _comparisonBotAttempt.TieBreak3 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak3; - } - } - - private void MainValueRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.MainValueNumeric.Enabled = true; - _comparisonBotAttempt.Maximize = (int)this.MainValueNumeric.Value; - } - } - - private void TieBreak1ValueRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak1Numeric.Enabled = true; - _comparisonBotAttempt.TieBreak1 = (int)this.TieBreak1Numeric.Value; - } - } - - private void TieBreak2ValueRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak2Numeric.Enabled = true; - _comparisonBotAttempt.TieBreak2 = (int)this.TieBreak2Numeric.Value; - } - } - - private void TieBreak3ValueRadio_CheckedChanged(object sender, EventArgs e) - { - RadioButton radioButton = (RadioButton)sender; - if (radioButton.Checked) - { - this.TieBreak3Numeric.Enabled = true; - _comparisonBotAttempt.TieBreak3 = (int)this.TieBreak3Numeric.Value; - } - } - - private void MainValueNumeric_ValueChanged(object sender, EventArgs e) - { - NumericUpDown numericUpDown = (NumericUpDown)sender; - this._comparisonBotAttempt.Maximize = (int)numericUpDown.Value; - } - - private void TieBreak1Numeric_ValueChanged(object sender, EventArgs e) - { - NumericUpDown numericUpDown = (NumericUpDown)sender; - this._comparisonBotAttempt.TieBreak1 = (int)numericUpDown.Value; - } - - private void TieBreak2Numeric_ValueChanged(object sender, EventArgs e) - { - NumericUpDown numericUpDown = (NumericUpDown)sender; - this._comparisonBotAttempt.TieBreak2 = (int)numericUpDown.Value; - } - - private void TieBreak3Numeric_ValueChanged(object sender, EventArgs e) - { - NumericUpDown numericUpDown = (NumericUpDown)sender; - this._comparisonBotAttempt.TieBreak3 = (int)numericUpDown.Value; - } - - } -} diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.resx b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.resx deleted file mode 100644 index f3d211e882..0000000000 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.resx +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 119, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - 248, 17 - - - - AAABAAEAMDAAAAEAGACoHAAAFgAAACgAAAAwAAAAYAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70AAAAA - AAAkHO0AAAAXD70XD70kHO0kHO0kHO0kHO0kHO0kHO0kHO0XD70XD70kHO0kHO0kHO0kHO0kHO0kHO0k - HO0XD70XD70AAAAkHO0AAAAAAAAXD70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3t8oAAAAAAAB3t8oAAABfqsBf - qsB3t8p3t8p3t8p3t8p3t8pfqsBfqsAAAAAAAABfqsBfqsB3t8p3t8p3t8p3t8p3t8pfqsBfqsAAAAB3 - t8oAAAAAAAB3t8oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABfqsB3t8p3t8pfqsAAAABfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsAAAAAAAABfqsB3t8p3 - t8p3t8p3t8p3t8p3t8p3t8pfqsAAAABfqsB3t8p3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAABfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3 - t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABfqsB3t8p3t8pfqsBfqsB3t8p3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3t8p3t8pfqsAAAAAAAABfqsB3t8p3t8oAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfqsB3t8pfqsAA - AAAAAABfqsB3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfqsBfqsBfqsBfqsAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAABfqsB3t8p3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3t8p3t8p3t8p3t8oAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70X - D70kHO0kHO0XD70AAAAsLCx/f38sLCwsLCwsLCwsLCwsLCwsLCwAAAAXD70kHO0kHO0XD70XD70AAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAXD70kHO0kHO0kHO0kHO0AAAB/f39/f39/f38sLCwkHO0sLCwkHO0s - LCwAAAAkHO0kHO0kHO0kHO0XD70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYIScYIScYIScYIScYIScYIScYIScAAAAXD70kHO0kHO0kHO0A - AAAsLCx/f38sLCwsLCwsLCwsLCwsLCwsLCwAAAAkHO0kHO0kHO0XD70AAAAYIScYIScYIScYIScYIScY - IScYIScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYIScYIScYIScYIScY - IScYIScAAAAAAAAAAAAXD70kHO0XD70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70kHO0X - D70AAAAAAAAAAAAYIScYIScYIScYIScYIScYIScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3t8p3 - t8p3t8p3t8oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAABfqsB3t8p3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAkHO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70XD70AAAAAAAAAAABfqsB3t8p3t8p3t8p3t8p3t8p3 - t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsAAAAAAAAAAAAAXD70X - D70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkHO0kHO0AAAAA - AABfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3 - t8p3t8p3t8p3t8pfqsAAAAAAAAAXD70kHO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAXD70kHO0XD70AAAAAAABfqsBfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3 - t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsBfqsAAAAAAAAAXD70kHO0XD70AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkHO0kHO0AAAB3t8oAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAB3t8oAAAAkHO0kHO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70k - HO0kHO0AAABfqsAAAABfqsBfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8p3 - t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsBfqsAAAABfqsAAAAAkHO0kHO0XD70AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAkHO0kHO0XD70AAAAAAAAAAABfqsB3t8p3t8p3t8p3t8p3t8p3t8p3 - t8p3t8pfqsBfqsBfqsBfqsBfqsBfqsB3t8p3t8p3t8p3t8p3t8p3t8p3t8p3t8pfqsAAAAAAAAAAAAAX - D70kHO0kHO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXD70kHO0AAABfqsB3t8pf - qsAAAAAAAAB3t8p3t8p3t8p3t8p3t8p3t8pfqsAAAAAAAAAAAAAAAAAAAAAAAABfqsB3t8p3t8p3t8p3 - t8p3t8p3t8oAAAAAAABfqsB3t8pfqsAAAAAkHO0XD70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABfqsB3t8p3t8p3t8pfqsAAAABfqsB3t8p3t8p3t8p3t8pfqsBfqsAAAABfqsB3 - t8p3t8pfqsAAAABfqsBfqsB3t8p3t8p3t8p3t8pfqsAAAABfqsB3t8p3t8p3t8pfqsAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfqsB3t8p3t8pfqsAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfqsB3t8p3t8p3t8p3t8pfqsAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYIScQGzAVAIgVAIgQGzAYIScYIScYIScYIScQGzAV - AIgVAIgQGzAYIScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYIScVAIgk - HO0kHO0VAIgYIScYIScYIScYIScVAIgkHO0kHO0VAIgYIScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAYIScVAIgkHO1EOu8VAIgYIScYIScYIScYIScVAIgkHO1EOu8VAIgYIScA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYIScQGzAVAIgVAIgQGzAYIScY - IScYIScYIScQGzAVAIgVAIgQGzAYIScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScYIScAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAkHO0kHO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEOu9EOu8AAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/AAAAAP8AAP8AAAAA/wAA/wAAAAD/AAD/AAAAAP8AAP8AAAAA/wAA/4AAAAH/ - AAD//AAAP/8AAP/+AAB//wAA//8AAP//AAD//4AB//8AAP//4Af//wAA///gB///AAD//+AH//8AAP// - 8A///wAA///4H///AAD///gf//8AAP//+B///wAA//gAAB//AAD/+AAAH/8AAP4AAAAAfwAA/AAAAAA/ - AAD8AAAAAD8AAP4HCBDgfwAA/x/4H/j/AAD/GAAAGP8AAP4QAAAIfwAA/gAAAAB/AAD8AAAAAD8AAPwA - AAAAPwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD/AAAAAP8AAP//+B///wAA///4H/// - AAD///AP//8AAP//gAH//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP// - AAD//wAA//+AAf//AAD///w///8AAP///D///wAA///+f///AAA= - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.cs deleted file mode 100644 index adf6737a05..0000000000 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BotControlsRow : UserControl - { - private bool _programmaticallyChangingValues; - - public BotControlsRow() - { - InitializeComponent(); - } - - public Action ProbabilityChangedCallback { get; set; } - - public string ButtonName - { - get { return ButtonNameLabel.Text; } - set { ButtonNameLabel.Text = value; } - } - - public double Probability - { - get { return (double)ProbabilityUpDown.Value; } - set { ProbabilityUpDown.Value = (decimal)value; } - } - - private void ProbabilityUpDown_ValueChanged(object sender, EventArgs e) - { - if (!_programmaticallyChangingValues) - { - _programmaticallyChangingValues = true; - ProbabilitySlider.Value = (int)ProbabilityUpDown.Value; - ChangedCallback(); - _programmaticallyChangingValues = false; - } - } - - private void ProbabilitySlider_ValueChanged(object sender, EventArgs e) - { - if (!_programmaticallyChangingValues) - { - _programmaticallyChangingValues = true; - ProbabilityUpDown.Value = ProbabilitySlider.Value; - ChangedCallback(); - _programmaticallyChangingValues = false; - } - } - - private void ChangedCallback() - { - if (ProbabilityChangedCallback != null) - { - ProbabilityChangedCallback(); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/BatchRun.cs b/BizHawk.Client.EmuHawk/tools/BatchRun.cs deleted file mode 100644 index 4dbda880bf..0000000000 --- a/BizHawk.Client.EmuHawk/tools/BatchRun.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.Threading; -using System.IO; - -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BatchRun : Form - { - Thread thread = null; - List MostRecentResults = null; - - public BatchRun() - { - InitializeComponent(); - } - - private void listBox1_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - e.Effect = DragDropEffects.Link; - else - e.Effect = DragDropEffects.None; - } - - private void SetCount() - { - label2.Text = string.Format("Number of files: {0}", listBox1.Items.Count); - } - - private void listBox1_DragDrop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); - listBox1.Items.AddRange(files); - SetCount(); - } - } - - private void buttonClear_Click(object sender, EventArgs e) - { - listBox1.Items.Clear(); - SetCount(); - } - - private void buttonGo_Click(object sender, EventArgs e) - { - if (thread != null) - { - MessageBox.Show("Old one still running!"); - } - else - { - if (listBox1.Items.Count == 0) - { - MessageBox.Show("No files!"); - } - else - { - label3.Text = "Status: Running..."; - int nframes = (int)numericUpDownFrames.Value; - List files = new List(listBox1.Items.Count); - foreach (string s in listBox1.Items) - files.Add(s); - thread = new Thread(ThreadProc); - thread.Start(new Tuple>(nframes, files)); - } - } - } - - void ProgressUpdate(int curr, int max) - { - progressBar1.Maximum = max; - progressBar1.Value = curr; - } - - void ThreadProc(object o) - { - try - { - var pp = (Tuple>)o; - BatchRunner br = new BatchRunner(pp.Item2, pp.Item1); - br.OnProgress += br_OnProgress; - var results = br.Run(); - this.Invoke(() => { label3.Text = "Status: Finished!"; MostRecentResults = results; }); - } - catch (Exception e) - { - MessageBox.Show(e.ToString(), "The Whole Thing Died!"); - this.Invoke(() => label3.Text = "Deaded!"); - } - this.Invoke(() => thread = null); - } - - void br_OnProgress(object sender, BatchRunner.ProgressEventArgs e) - { - this.Invoke(() => ProgressUpdate(e.Completed, e.Total)); - e.ShouldCancel = false; - } - - private void BatchRun_FormClosing(object sender, FormClosingEventArgs e) - { - if (thread != null) - { - MessageBox.Show("Can't close while task is running!"); - e.Cancel = true; - } - } - - private void buttonDump_Click(object sender, EventArgs e) - { - if (MostRecentResults != null) - { - using (var sfd = new SaveFileDialog()) - { - var result = sfd.ShowDialog(this); - if (result == DialogResult.OK) - { - using (TextWriter tw = new StreamWriter(sfd.FileName)) - { - foreach (var r in MostRecentResults) - r.DumpToTW(tw); - } - } - } - } - else - { - MessageBox.Show("No results to save!"); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/BatchRunner.cs b/BizHawk.Client.EmuHawk/tools/BatchRunner.cs deleted file mode 100644 index 7e25ff3e1e..0000000000 --- a/BizHawk.Client.EmuHawk/tools/BatchRunner.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using BizHawk.Common; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; - - - -namespace BizHawk.Client.EmuHawk -{ - public class BatchRunner - { - public class ProgressEventArgs - { - public int Completed { get; private set; } - public int Total { get; private set; } - public bool ShouldCancel { get; set; } - public ProgressEventArgs(int Completed, int Total) - { - this.Completed = Completed; - this.Total = Total; - } - } - public delegate void ProgressEventHandler(object sender, ProgressEventArgs e); - public event ProgressEventHandler OnProgress; - - List files; - RomLoader ldr; - CoreComm Comm; - int numframes = 0; - int multiindex = 0; - bool multihasnext = false; - - List Results = new List(); - Result current; - - public class Result - { - public string Filename; // name of file - public string Fullname; // filename + subfilename - public GameInfo GI; - - public Type CoreType; // actual type of the core that was returned - public enum EStatus - { - ExceptOnLoad, // exception thrown on load - ErrorOnLoad, // error method thrown on load - FalseOnLoad, // romloader returned false with no other information - ExceptOnAdv, // exception thrown on frame advance - Success, // load fully complete - }; - public EStatus Status; // what happened - public List Messages = new List(); - - public int Frames; // number of frames successfully run - public int LaggedFrames; // number of those that were lagged - - public string BoardName; // iemulator's board name return (could be null!) - - public void DumpToTW(System.IO.TextWriter tw) - { - tw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}", Filename, Fullname, CoreType, Status, Frames, LaggedFrames, GI.Hash, BoardName); - } - } - - public BatchRunner(IEnumerable files, int numframes) - { - this.files = new List(files); - this.numframes = numframes; - - ldr = new RomLoader(); - ldr.OnLoadError += OnLoadError; - ldr.ChooseArchive = ChooseArchive; - Comm = new CoreComm(CommMessage, CommMessage); - CoreFileProvider.SyncCoreCommInputSignals(Comm); - } - - void OnLoadError(object sender, RomLoader.RomErrorArgs e) - { - current.Status = Result.EStatus.ErrorOnLoad; - current.Messages.Add(string.Format("OnLoadError: {0}, {1}, {2}", e.AttemptedCoreLoad, e.Message, e.Type.ToString())); - } - - void CommMessage(string msg) - { - current.Messages.Add(string.Format("CommMessage: {0}", msg)); - } - - int? ChooseArchive(HawkFile hf) - { - int ret = multiindex; - multiindex++; - multihasnext = multiindex < hf.ArchiveItems.Count; - return ret; - } - - public List Run() - { - Results.Clear(); - current = null; - RunInternal(); - return new List(Results); - } - - void RunInternal() - { - for (int i = 0; i < files.Count; i++) - { - string f = files[i]; - multihasnext = false; - multiindex = 0; - do - { - LoadOne(f); - } while (multihasnext); - if (OnProgress != null) - { - var e = new ProgressEventArgs(i + 1, files.Count); - OnProgress(this, e); - if (e.ShouldCancel) - return; - } - } - } - - - void LoadOne(string f) - { - current = new Result { Filename = f }; - bool result = false; - try - { - result = ldr.LoadRom(f, Comm); - } - catch (Exception e) - { - current.Status = Result.EStatus.ExceptOnLoad; - current.Messages.Add(e.ToString()); - Results.Add(current); - current = null; - return; - } - current.Fullname = ldr.CanonicalFullPath; - if (current.Status == Result.EStatus.ErrorOnLoad) - { - Results.Add(current); - current = null; - return; - } - if (result == false) - { - current.Status = Result.EStatus.FalseOnLoad; - Results.Add(current); - current = null; - return; - } - - using (IEmulator emu = ldr.LoadedEmulator) - { - current.GI = ldr.Game; - current.CoreType = emu.GetType(); - var controller = new Controller(emu.ControllerDefinition); - current.BoardName = emu.HasBoardInfo() ? emu.AsBoardInfo().BoardName : null; - // hack - if (emu is Emulation.Cores.Nintendo.GBA.VBANext) - { - current.BoardName = (emu as Emulation.Cores.Nintendo.GBA.VBANext).GameCode; - } - - current.Frames = 0; - current.LaggedFrames = 0; - - for (int i = 0; i < numframes; i++) - { - try - { - int nsamp; - short[] samp; - emu.FrameAdvance(controller, true, true); - - // some cores really really really like it if you drain their audio every frame - if (emu.HasSoundProvider()) - { - emu.AsSoundProvider().GetSamplesSync(out samp, out nsamp); - } - - current.Frames++; - if (emu.CanPollInput() && emu.AsInputPollable().IsLagFrame) - current.LaggedFrames++; - } - catch (Exception e) - { - current.Messages.Add(e.ToString()); - current.Status = Result.EStatus.ExceptOnAdv; - Results.Add(current); - current = null; - return; - } - } - } - current.Status = Result.EStatus.Success; - Results.Add(current); - current = null; - return; - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/CDL.cs b/BizHawk.Client.EmuHawk/tools/CDL.cs deleted file mode 100644 index 54f8f560da..0000000000 --- a/BizHawk.Client.EmuHawk/tools/CDL.cs +++ /dev/null @@ -1,598 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; - -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.ToolExtensions; - -//TODO - select which memorydomains go out to the CDL file. will this cause a problem when re-importing it? - //perhaps missing domains shouldnt fail a check -//OR - just add a contextmenu option to the listview item that selects it for export. -//TODO - add a contextmenu option which warps to the hexeditor with the provided domain selected for visualizing on the hex editor. -//TODO - consider setting colors for columns in CDL -//TODO - option to print domain name in caption instead of 0x01 etc. -//TODO - context menu should have copy option too - -namespace BizHawk.Client.EmuHawk -{ - public partial class CDL : ToolFormBase, IToolFormAutoConfig - { - private RecentFiles _recent_fld = new RecentFiles(); - - [ConfigPersist] - private RecentFiles _recent - { - get - { return _recent_fld; } - set - { - _recent_fld = value; - } - } - - void SetCurrentFilename(string fname) - { - _currentFilename = fname; - if (_currentFilename == null) - Text = "Code Data Logger"; - else Text = string.Format("Code Data Logger - {0}", fname); - } - - [RequiredService] - private IMemoryDomains MemoryDomains { get; set; } - - [RequiredService] - private ICodeDataLogger CodeDataLogger { get; set; } - - private string _currentFilename = null; - private CodeDataLog _cdl; - - public CDL() - { - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.OptimizedDoubleBuffer, true); - InitializeComponent(); - - tsbViewStyle.SelectedIndex = 0; - } - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - UpdateDisplay(false); - } - - public void FastUpdate() - { - // Do nothing - } - - public void Restart() - { - //don't try to recover the current CDL! - //even though it seems like it might be nice, it might get mixed up between games. even if we use CheckCDL. Switching games with the same memory map will be bad. - _cdl = null; - SetCurrentFilename(null); - SetLoggingActiveCheck(false); - UpdateDisplay(true); - } - - void SetLoggingActiveCheck(bool value) - { - tsbLoggingActive.Checked = value; - } - - string[][] listContents = new string[0][]; - - private void UpdateDisplay(bool force) - { - if (!tsbViewUpdate.Checked && !force) - return; - - - if (_cdl == null) - { - lvCDL.BeginUpdate(); - lvCDL.Items.Clear(); - lvCDL.EndUpdate(); - return; - } - - lvCDL.BeginUpdate(); - - listContents = new string[_cdl.Count][]; - - int idx = 0; - foreach (var kvp in _cdl) - { - int[] totals = new int[8]; - int total = 0; - unsafe - { - int* map = stackalloc int[256]; - for (int i = 0; i < 256; i++) - map[i] = 0; - - fixed (byte* data = kvp.Value) - { - byte* src = data; - byte* end = data + kvp.Value.Length; - while (src < end) - { - byte s = *src++; - map[s]++; - } - } - - for (int i = 0; i < 256; i++) - { - if(i!=0) total += map[i]; - if ((i & 0x01) != 0) totals[0] += map[i]; - if ((i & 0x02) != 0) totals[1] += map[i]; - if ((i & 0x04) != 0) totals[2] += map[i]; - if ((i & 0x08) != 0) totals[3] += map[i]; - if ((i & 0x10) != 0) totals[4] += map[i]; - if ((i & 0x20) != 0) totals[5] += map[i]; - if ((i & 0x40) != 0) totals[6] += map[i]; - if ((i & 0x80) != 0) totals[7] += map[i]; - } - } - - var bm = _cdl.GetBlockMap(); - long addr = bm[kvp.Key]; - - var lvi = listContents[idx++] = new string[13]; - lvi[0] = string.Format("{0:X8}", addr); - lvi[1] = kvp.Key; - lvi[2] = string.Format("{0:0.00}%", total / (float)kvp.Value.Length * 100f); - if (tsbViewStyle.SelectedIndex == 2) - lvi[3] = string.Format("{0:0.00}", total / 1024.0f); - else - lvi[3] = string.Format("{0}", total); - if (tsbViewStyle.SelectedIndex == 2) - { - int n = (int)(kvp.Value.Length / 1024.0f); - float ncheck = kvp.Value.Length / 1024.0f; - lvi[4] = string.Format("of {0}{1} KBytes", n == ncheck ? "" : "~", n); - } - else - lvi[4] = string.Format("of {0} Bytes", kvp.Value.Length); - for (int i = 0; i < 8; i++) - { - if (tsbViewStyle.SelectedIndex == 0) - lvi[5 + i] = string.Format("{0:0.00}%", totals[i] / (float)kvp.Value.Length * 100f); - if (tsbViewStyle.SelectedIndex == 1) - lvi[5 + i] = string.Format("{0}", totals[i]); - if (tsbViewStyle.SelectedIndex == 2) - lvi[5 + i] = string.Format("{0:0.00}", totals[i] / 1024.0f); - } - - } - lvCDL.VirtualListSize = _cdl.Count; - lvCDL.EndUpdate(); - } - - public bool AskSaveChanges() - { - //nothing to fear: - if (_cdl == null) - return true; - - //try auto-saving if appropriate - if (Global.Config.CDLAutoSave) - { - if (_currentFilename != null) - { - RunSave(); - ShutdownCDL(); - return true; - } - } - - //TODO - I dont like this system. It's hard to figure out how to use it. It should be done in multiple passes. - var result = MessageBox.Show("Save changes to CDL session?", "CDL Auto Save", MessageBoxButtons.YesNo, MessageBoxIcon.Question); - if (result == DialogResult.No) - { - ShutdownCDL(); - return true; - } - - if (string.IsNullOrWhiteSpace(_currentFilename)) - { - if (RunSaveAs()) - { - ShutdownCDL(); - return true; - } - else - { - ShutdownCDL(); - return false; - } - } - else - { - RunSave(); - ShutdownCDL(); - return true; - } - - return true; - } - - public bool UpdateBefore - { - get { return false; } - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - } - - bool autoloading = false; - public void LoadFile(string path) - { - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) - { - var newCDL = new CodeDataLog(); - newCDL.Load(fs); - - //have the core create a CodeDataLog to check mapping information against - var testCDL = new CodeDataLog(); - CodeDataLogger.NewCDL(testCDL); - if (!newCDL.Check(testCDL)) - { - if(!autoloading) - MessageBox.Show(this, "CDL file does not match emulator's current memory map!"); - return; - } - - //ok, it's all good: - _cdl = newCDL; - CodeDataLogger.SetCDL(null); - if (tsbLoggingActive.Checked || Global.Config.CDLAutoStart) - { - tsbLoggingActive.Checked = true; - CodeDataLogger.SetCDL(_cdl); - } - - SetCurrentFilename(path); - } - - UpdateDisplay(true); - } - - private void FileSubMenu_DropDownOpened(object sender, EventArgs e) - { - SaveMenuItem.Enabled = _currentFilename != null; - SaveAsMenuItem.Enabled = - AppendMenuItem.Enabled = - ClearMenuItem.Enabled = - DisassembleMenuItem.Enabled = - _cdl != null; - - miAutoSave.Checked = Global.Config.CDLAutoSave; - miAutoStart.Checked = Global.Config.CDLAutoStart; - miAutoResume.Checked = Global.Config.CDLAutoResume; - } - - private void RecentSubMenu_DropDownOpened(object sender, EventArgs e) - { - RecentSubMenu.DropDownItems.Clear(); - RecentSubMenu.DropDownItems.AddRange(_recent.RecentMenu(LoadFile, true)); - } - - void NewFileLogic() - { - _cdl = new CodeDataLog(); - CodeDataLogger.NewCDL(_cdl); - - if (tsbLoggingActive.Checked || Global.Config.CDLAutoStart) - CodeDataLogger.SetCDL(_cdl); - else CodeDataLogger.SetCDL(null); - - SetCurrentFilename(null); - - UpdateDisplay(true); - } - - private void NewMenuItem_Click(object sender, EventArgs e) - { - //take care not to clobber an existing CDL - if (_cdl != null) - { - var result = MessageBox.Show(this, "OK to create new CDL?", "Query", MessageBoxButtons.YesNo); - if (result != DialogResult.Yes) - return; - } - - NewFileLogic(); - } - - private void OpenMenuItem_Click(object sender, EventArgs e) - { - var file = OpenFileDialog( - _currentFilename, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.LogPathFragment, null), - "Code Data Logger Files", - "cdl"); - - if (file == null) - return; - - //take care not to clobber an existing CDL - if (_cdl != null) - { - var result = MessageBox.Show(this, "OK to load new CDL?", "Query", MessageBoxButtons.YesNo); - if (result != DialogResult.Yes) - return; - } - - LoadFile(file.FullName); - } - - void RunSave() - { - _recent.Add(_currentFilename); - using (var fs = new FileStream(_currentFilename, FileMode.Create, FileAccess.Write)) - { - _cdl.Save(fs); - } - } - - private void SaveMenuItem_Click(object sender, EventArgs e) - { - if (_cdl == null) - { - MessageBox.Show(this, "Cannot save with no CDL loaded!", "Alert"); - return; - } - - if (string.IsNullOrWhiteSpace(_currentFilename)) - { - RunSaveAs(); - return; - } - - RunSave(); - } - - /// - /// returns false if the operation was canceled - /// - bool RunSaveAs() - { - var file = SaveFileDialog( - _currentFilename, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.LogPathFragment, null), - "Code Data Logger Files", - "cdl"); - - if (file == null) - return false; - - SetCurrentFilename(file.FullName); - RunSave(); - return true; - } - - private void SaveAsMenuItem_Click(object sender, EventArgs e) - { - RunSaveAs(); - } - - private void AppendMenuItem_Click(object sender, EventArgs e) - { - if (_cdl == null) - { - MessageBox.Show(this, "Cannot append with no CDL loaded!", "Alert"); - } - else - { - var file = ToolFormBase.OpenFileDialog( - _currentFilename, - PathManager.MakeAbsolutePath(Global.Config.PathEntries.LogPathFragment, null), - "Code Data Logger Files", - "cdl"); - - if (file != null) - { - using (var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) - { - var newCDL = new CodeDataLog(); - newCDL.Load(fs); - if (!_cdl.Check(newCDL)) - { - MessageBox.Show(this, "CDL file does not match emulator's current memory map!"); - return; - } - _cdl.LogicalOrFrom(newCDL); - UpdateDisplay(true); - } - } - } - } - - private void ClearMenuItem_Click(object sender, EventArgs e) - { - if (_cdl == null) - { - MessageBox.Show(this, "Cannot clear with no CDL loaded!", "Alert"); - } - else - { - var result = MessageBox.Show(this, "OK to clear CDL?", "Query", MessageBoxButtons.YesNo); - if (result == DialogResult.Yes) - { - _cdl.ClearData(); - UpdateDisplay(true); - } - } - } - - private void DisassembleMenuItem_Click(object sender, EventArgs e) - { - if (_cdl == null) - { - MessageBox.Show(this, "Cannot disassemble with no CDL loaded!", "Alert"); - return; - } - - var sfd = new SaveFileDialog(); - var result = sfd.ShowDialog(this); - if (result == DialogResult.OK) - { - using (var fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.Write)) - { - CodeDataLogger.DisassembleCDL(fs, _cdl); - } - } - } - - private void ExitMenuItem_Click(object sender, EventArgs e) - { - ShutdownCDL(); - Close(); - } - - void ShutdownCDL() - { - _cdl = null; - CodeDataLogger.SetCDL(null); - } - - protected override void OnClosing(System.ComponentModel.CancelEventArgs e) - { - if (!AskSaveChanges()) - e.Cancel = true; - base.OnClosing(e); - } - - protected override void OnShown(EventArgs e) - { - if (Global.Config.CDLAutoStart) - { - if (_cdl == null) - NewFileLogic(); - } - base.OnShown(e); - } - - protected override void OnClosed(EventArgs e) - { - //deactivate logger - if (CodeDataLogger != null) //just in case... - CodeDataLogger.SetCDL(null); - } - - private void CDL_Load(object sender, EventArgs e) - { - if (Global.Config.CDLAutoResume) - { - try - { - autoloading = true; - var autoresume_file = PathManager.FilesystemSafeName(Global.Game) + ".cdl"; - var autoresume_dir = PathManager.MakeAbsolutePath(Global.Config.PathEntries.LogPathFragment, null); - var autoresume_path = Path.Combine(autoresume_dir, autoresume_file); - if (File.Exists(autoresume_path)) - LoadFile(autoresume_path); - } - finally - { - autoloading = false; - } - } - - if (_recent_fld.AutoLoad && !_recent_fld.Empty) - { - if (File.Exists(_recent.MostRecent)) - { - try - { - autoloading = true; - LoadFile(_recent.MostRecent); - } - finally - { - autoloading = false; - } - SetCurrentFilename(_recent.MostRecent); - } - } - } - - private void CDL_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void CDL_DragDrop(object sender, DragEventArgs e) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - if (Path.GetExtension(filePaths[0]) == ".cdl") - { - LoadFile(filePaths[0]); - } - } - - - - private void tsbViewStyle_SelectedIndexChanged(object sender, EventArgs e) - { - UpdateDisplay(true); - } - - private void tsbLoggingActive_CheckedChanged(object sender, EventArgs e) - { - if (tsbLoggingActive.Checked && _cdl == null) - { - //implicitly create a new file - NewFileLogic(); - } - - if (_cdl != null && tsbLoggingActive.Checked) - CodeDataLogger.SetCDL(_cdl); - else - CodeDataLogger.SetCDL(null); - } - - private void lvCDL_QueryItemText(int item, int subItem, out string text) - { - text = listContents[item][subItem]; - } - - private void tsbExportText_Click(object sender, EventArgs e) - { - StringWriter sw = new StringWriter(); - foreach(var line in listContents) - { - foreach (var entry in line) - sw.Write("{0} |", entry); - sw.WriteLine(); - } - Clipboard.SetText(sw.ToString()); - } - - private void miAutoSave_Click(object sender, EventArgs e) - { - Global.Config.CDLAutoSave ^= true; - } - - private void miAutoStart_Click(object sender, EventArgs e) - { - Global.Config.CDLAutoStart ^= true; - } - - private void miAutoResume_Click(object sender, EventArgs e) - { - Global.Config.CDLAutoResume ^= true; - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/CDL.resx b/BizHawk.Client.EmuHawk/tools/CDL.resx deleted file mode 100644 index acb5948fc4..0000000000 --- a/BizHawk.Client.EmuHawk/tools/CDL.resx +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 126, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAACMWwCMWwCMWwCMWwCMWwCMWwCMWwCMWwCMWwCMWwCMWwCMWwAAAAAAAAAAAACMWxApOoZ - jN1ApOoCMWyj0/Wj0/Wj0/Wj0/Wj0/Wj0/Wj0/Wj0/UCMWwAAAACMWxApOpApOoCMWxApOoZjN0CMWyj - 0/UuKfAuKfCj0/XLPAPLPANApOpApOoCMWwCMWwZjN0CMWwQUHwCMWxApOoCMWxApOouKfCj0/Wj0/XL - PAOj0/XLPAOj0/UCMWwCMWxApOoCMWwQUHwCMWxApOoCMWyj0/UuKfCj0/Wj0/XLPAOj0/XLPAOj0/UC - MWwCMWxApOoCMWwQUHwCMWxApOoCMWyj0/UuKfCj0/Wj0/XLPAOj0/XLPAOj0/UCMWwCMWxApOoCMWwQ - UHwCMWwZjN0CMWyj0/UuKfAuKfCj0/XLPAPLPANApOpApOoCMWwCMWxApOoCMWwQUHwCMWwZjN0CMWyj - 0/Wj0/Wj0/VApOpApOpApOpApOpApOoCMWwCMWwZjN1ApOoCMWxApOpApOoCMWyj0/Wj0/Wj0/UCMWwC - MWyj0/Wj0/Wj0/UCMWwAAAACMWxApOpApOoZjN0CMWxApOpApOqj0/UCMWyj0/Wj0/Wj0/Wj0/UCMWwA - AAAAAAAAAAACMWwCMWwCMWwCMWwCMWwCMWwCMWyj0/VApOqj0/UCMWwCMWwAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAACMWyj0/VApOqj0/UOOwMOOwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAOOwMjpQUCMWyj0/UOOwMhhwkjpQUOOwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOwMhhwkjpQUC - MWwOOwMjpQUhhwkOOwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMLAQOOwMOOwMAAAAOOwMhhwkjpQUO - OwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOwMjpQUOOwMAAADAAwAAgAEAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAwAMAAP+BAAD/AAAA/wAAAP8QAAD/8QAA - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs deleted file mode 100644 index fd178f17bc..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs +++ /dev/null @@ -1,741 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Emulation.Common; -using BizHawk.Client.Common; -using BizHawk.Client.EmuHawk.ToolExtensions; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class Cheats : ToolFormBase, IToolForm - { - private const string NameColumn = "NamesColumn"; - private const string AddressColumn = "AddressColumn"; - private const string ValueColumn = "ValueColumn"; - private const string CompareColumn = "CompareColumn"; - private const string OnColumn = "OnColumn"; - private const string DomainColumn = "DomainColumn"; - private const string SizeColumn = "SizeColumn"; - private const string EndianColumn = "EndianColumn"; - private const string TypeColumn = "DisplayTypeColumn"; - private const string ComparisonTypeColumn = "ComparisonTypeColumn"; - - private int _defaultWidth; - private int _defaultHeight; - private string _sortedColumn; - private bool _sortReverse; - - public Cheats() - { - InitializeComponent(); - Settings = new CheatsSettings(); - - Closing += (o, e) => - { - SaveConfigSettings(); - }; - - CheatListView.QueryItemText += CheatListView_QueryItemText; - CheatListView.QueryItemBkColor += CheatListView_QueryItemBkColor; - CheatListView.VirtualMode = true; - - _sortedColumn = ""; - _sortReverse = false; - } - - [RequiredService] - private IMemoryDomains Core { get; set; } - - [ConfigPersist] - public CheatsSettings Settings { get; set; } - - public bool UpdateBefore => false; - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - // Do nothing - } - - public void FastUpdate() - { - // Do nothing - } - - public void Restart() - { - CheatEditor.MemoryDomains = Core; - CheatEditor.Restart(); - } - - /// - /// Tools that want to refresh the cheats list should call this, not UpdateValues - /// - public void UpdateDialog() - { - CheatListView.ItemCount = Global.CheatList.Count; - TotalLabel.Text = Global.CheatList.CheatCount - + (Global.CheatList.CheatCount == 1 ? " cheat " : " cheats ") - + Global.CheatList.ActiveCount + " active"; - } - - private void LoadFileFromRecent(string path) - { - var askResult = !Global.CheatList.Changes || AskSaveChanges(); - if (askResult) - { - var loadResult = Global.CheatList.Load(path, append: false); - if (!loadResult) - { - Global.Config.RecentCheats.HandleLoadError(path); - } - else - { - Global.Config.RecentCheats.Add(path); - UpdateDialog(); - UpdateMessageLabel(); - } - } - } - - private void UpdateMessageLabel(bool saved = false) - { - MessageLabel.Text = saved - ? Path.GetFileName(Global.CheatList.CurrentFileName) + " saved." - : Path.GetFileName(Global.CheatList.CurrentFileName) + (Global.CheatList.Changes ? " *" : ""); - } - - public bool AskSaveChanges() - { - return true; - } - - private void LoadFile(FileSystemInfo file, bool append) - { - if (file != null) - { - var result = true; - if (Global.CheatList.Changes) - { - result = AskSaveChanges(); - } - - if (result) - { - Global.CheatList.Load(file.FullName, append); - UpdateDialog(); - UpdateMessageLabel(); - Global.Config.RecentCheats.Add(Global.CheatList.CurrentFileName); - } - } - } - - private static bool SaveAs() - { - var file = SaveFileDialog( - Global.CheatList.CurrentFileName, - PathManager.GetCheatsPath(Global.Game), - "Cheat Files", - "cht"); - - return file != null && Global.CheatList.SaveFile(file.FullName); - } - - private void Cheats_Load(object sender, EventArgs e) - { - TopMost = Settings.TopMost; - CheatEditor.MemoryDomains = Core; - LoadConfigSettings(); - ToggleGameGenieButton(); - CheatEditor.SetAddEvent(AddCheat); - CheatEditor.SetEditEvent(EditCheat); - UpdateDialog(); - - CheatsMenu.Items.Add(Settings.Columns.GenerateColumnsMenu(ColumnToggleCallback)); - } - - private void ColumnToggleCallback() - { - SaveColumnInfo(CheatListView, Settings.Columns); - LoadColumnInfo(CheatListView, Settings.Columns); - } - - private void ToggleGameGenieButton() - { - GameGenieToolbarSeparator.Visible = - LoadGameGenieToolbarItem.Visible = - GlobalWin.Tools.IsAvailable(); - } - - private void AddCheat() - { - Global.CheatList.Add(CheatEditor.GetCheat()); - UpdateDialog(); - UpdateMessageLabel(); - } - - private void EditCheat() - { - var newCheat = CheatEditor.GetCheat(); - - if (!newCheat.IsSeparator) // If a separator comes from the cheat editor something must have been invalid - { - Global.CheatList.Exchange(CheatEditor.OriginalCheat, newCheat); - UpdateDialog(); - UpdateMessageLabel(); - } - } - - private void SaveConfigSettings() - { - SaveColumnInfo(CheatListView, Settings.Columns); - - if (WindowState == FormWindowState.Normal) - { - Settings.Wndx = Location.X; - Settings.Wndy = Location.Y; - Settings.Width = Right - Left; - Settings.Height = Bottom - Top; - } - } - - private void LoadConfigSettings() - { - _defaultWidth = Size.Width; - _defaultHeight = Size.Height; - - if (Settings.UseWindowPosition && IsOnScreen(Settings.TopLeft)) - { - Location = Settings.WindowPosition; - } - - if (Settings.UseWindowSize) - { - Size = Settings.WindowSize; - } - - LoadColumnInfo(CheatListView, Settings.Columns); - } - - private void CheatListView_QueryItemText(int index, int column, out string text) - { - text = ""; - if (index >= Global.CheatList.Count || Global.CheatList[index].IsSeparator) - { - return; - } - - var columnName = CheatListView.Columns[column].Name; - - switch (columnName) - { - case NameColumn: - text = Global.CheatList[index].Name; - break; - case AddressColumn: - text = Global.CheatList[index].AddressStr; - break; - case ValueColumn: - text = Global.CheatList[index].ValueStr; - break; - case CompareColumn: - text = Global.CheatList[index].CompareStr; - break; - case OnColumn: - text = Global.CheatList[index].Enabled ? "*" : ""; - break; - case DomainColumn: - text = Global.CheatList[index].Domain.Name; - break; - case SizeColumn: - text = Global.CheatList[index].Size.ToString(); - break; - case EndianColumn: - text = (Global.CheatList[index].BigEndian ?? false) ? "Big" : "Little"; - break; - case TypeColumn: - text = Watch.DisplayTypeToString(Global.CheatList[index].Type); - break; - case ComparisonTypeColumn: - switch (Global.CheatList[index].ComparisonType) - { - case Cheat.CompareType.None: - text = ""; - break; - case Cheat.CompareType.Equal: - text = "="; - break; - case Cheat.CompareType.GreaterThan: - text = ">"; - break; - case Cheat.CompareType.GreaterThanOrEqual: - text = ">="; - break; - case Cheat.CompareType.LessThan: - text = "<"; - break; - case Cheat.CompareType.LessThanOrEqual: - text = "<="; - break; - case Cheat.CompareType.NotEqual: - text = "!="; - break; - default: - text = ""; - break; - } - - break; - } - } - - private void CheatListView_QueryItemBkColor(int index, int column, ref Color color) - { - if (index < Global.CheatList.Count) - { - if (Global.CheatList[index].IsSeparator) - { - color = BackColor; - } - else if (Global.CheatList[index].Enabled) - { - color = Color.LightCyan; - } - } - } - - private IEnumerable SelectedIndices => CheatListView.SelectedIndices.Cast(); - - private IEnumerable SelectedItems - { - get { return SelectedIndices.Select(index => Global.CheatList[index]); } - } - - private IEnumerable SelectedCheats - { - get { return SelectedItems.Where(x => !x.IsSeparator); } - } - - private void DoSelectedIndexChange() - { - if (!CheatListView.SelectAllInProgress) - { - if (SelectedCheats.Any()) - { - var cheat = SelectedCheats.First(); - CheatEditor.SetCheat(cheat); - CheatGroupBox.Text = "Editing Cheat " + cheat.Name + " - " + cheat.AddressStr; - } - else - { - CheatEditor.ClearForm(); - CheatGroupBox.Text = "New Cheat"; - } - } - } - - private void StartNewList() - { - var result = !Global.CheatList.Changes || AskSaveChanges(); - if (result) - { - Global.CheatList.NewList(ToolManager.GenerateDefaultCheatFilename()); - UpdateDialog(); - UpdateMessageLabel(); - ToggleGameGenieButton(); - } - } - - private void NewList() - { - var result = !Global.CheatList.Changes || AskSaveChanges(); - if (result) - { - StartNewList(); - } - } - - #region Events - - #region File - - private void FileSubMenu_DropDownOpened(object sender, EventArgs e) - { - SaveMenuItem.Enabled = Global.CheatList.Changes; - } - - private void RecentSubMenu_DropDownOpened(object sender, EventArgs e) - { - RecentSubMenu.DropDownItems.Clear(); - RecentSubMenu.DropDownItems.AddRange( - Global.Config.RecentCheats.RecentMenu(LoadFileFromRecent)); - } - - private void NewMenuItem_Click(object sender, EventArgs e) - { - NewList(); - } - - private void OpenMenuItem_Click(object sender, EventArgs e) - { - var file = OpenFileDialog( - Global.CheatList.CurrentFileName, - PathManager.GetCheatsPath(Global.Game), - "Cheat Files", - "cht"); - - LoadFile(file, append: sender == AppendMenuItem); - } - - private void SaveMenuItem_Click(object sender, EventArgs e) - { - if (Global.CheatList.Changes) - { - if (Global.CheatList.Save()) - { - UpdateMessageLabel(saved: true); - } - } - else - { - SaveAsMenuItem_Click(sender, e); - } - } - - private void SaveAsMenuItem_Click(object sender, EventArgs e) - { - if (SaveAs()) - { - UpdateMessageLabel(saved: true); - } - } - - private void ExitMenuItem_Click(object sender, EventArgs e) - { - Close(); - } - - #endregion - - #region Cheats - - private void CheatsSubMenu_DropDownOpened(object sender, EventArgs e) - { - RemoveCheatMenuItem.Enabled = - MoveUpMenuItem.Enabled = - MoveDownMenuItem.Enabled = - ToggleMenuItem.Enabled = - SelectedIndices.Any(); - - DisableAllCheatsMenuItem.Enabled = Global.CheatList.ActiveCount > 0; - - GameGenieSeparator.Visible = - OpenGameGenieEncoderDecoderMenuItem.Visible = - GlobalWin.Tools.IsAvailable(); - } - - private void RemoveCheatMenuItem_Click(object sender, EventArgs e) - { - var items = SelectedItems.ToList(); - if (items.Any()) - { - foreach (var item in items) - { - Global.CheatList.Remove(item); - } - - CheatListView.SelectedIndices.Clear(); - UpdateDialog(); - } - } - - private void InsertSeparatorMenuItem_Click(object sender, EventArgs e) - { - if (SelectedIndices.Any()) - { - Global.CheatList.Insert(SelectedIndices.Max(), Cheat.Separator); - } - else - { - Global.CheatList.Add(Cheat.Separator); - } - - UpdateDialog(); - UpdateMessageLabel(); - } - - private void MoveUpMenuItem_Click(object sender, EventArgs e) - { - var indices = SelectedIndices.ToList(); - if (indices.Count == 0 || indices[0] == 0) - { - return; - } - - foreach (var index in indices) - { - var cheat = Global.CheatList[index]; - Global.CheatList.Remove(cheat); - Global.CheatList.Insert(index - 1, cheat); - } - - var newindices = indices.Select(t => t - 1).ToList(); - - CheatListView.SelectedIndices.Clear(); - foreach (var newi in newindices) - { - CheatListView.SelectItem(newi, true); - } - - UpdateMessageLabel(); - UpdateDialog(); - } - - private void MoveDownMenuItem_Click(object sender, EventArgs e) - { - var indices = SelectedIndices.ToList(); - if (indices.Count == 0 || indices.Last() == Global.CheatList.Count - 1) - { - return; - } - - for (var i = indices.Count - 1; i >= 0; i--) - { - var cheat = Global.CheatList[indices[i]]; - Global.CheatList.Remove(cheat); - Global.CheatList.Insert(indices[i] + 1, cheat); - } - - UpdateMessageLabel(); - - var newindices = indices.Select(t => t + 1).ToList(); - - CheatListView.SelectedIndices.Clear(); - foreach (var newi in newindices) - { - CheatListView.SelectItem(newi, true); - } - - UpdateDialog(); - } - - private void SelectAllMenuItem_Click(object sender, EventArgs e) - { - CheatListView.SelectAll(); - } - - private void ToggleMenuItem_Click(object sender, EventArgs e) - { - SelectedCheats.ToList().ForEach(x => x.Toggle()); - CheatListView.Refresh(); - } - - private void DisableAllCheatsMenuItem_Click(object sender, EventArgs e) - { - Global.CheatList.DisableAll(); - } - - private void OpenGameGenieEncoderDecoderMenuItem_Click(object sender, EventArgs e) - { - GlobalWin.Tools.LoadGameGenieEc(); - } - - #endregion - - #region Options - - private void OptionsSubMenu_DropDownOpened(object sender, EventArgs e) - { - AlwaysLoadCheatsMenuItem.Checked = Global.Config.LoadCheatFileByGame; - AutoSaveCheatsMenuItem.Checked = Global.Config.CheatsAutoSaveOnClose; - DisableCheatsOnLoadMenuItem.Checked = Global.Config.DisableCheatsOnLoad; - AutoloadMenuItem.Checked = Global.Config.RecentCheats.AutoLoad; - SaveWindowPositionMenuItem.Checked = Settings.SaveWindowPosition; - AlwaysOnTopMenuItem.Checked = Settings.TopMost; - FloatingWindowMenuItem.Checked = Settings.FloatingWindow; - } - - private void AlwaysLoadCheatsMenuItem_Click(object sender, EventArgs e) - { - Global.Config.LoadCheatFileByGame ^= true; - } - - private void AutoSaveCheatsMenuItem_Click(object sender, EventArgs e) - { - Global.Config.CheatsAutoSaveOnClose ^= true; - } - - private void CheatsOnOffLoadMenuItem_Click(object sender, EventArgs e) - { - Global.Config.DisableCheatsOnLoad ^= true; - } - - private void AutoloadMenuItem_Click(object sender, EventArgs e) - { - Global.Config.RecentCheats.AutoLoad ^= true; - } - - private void SaveWindowPositionMenuItem_Click(object sender, EventArgs e) - { - Settings.SaveWindowPosition ^= true; - } - - private void AlwaysOnTopMenuItem_Click(object sender, EventArgs e) - { - Settings.TopMost ^= true; - } - - private void FloatingWindowMenuItem_Click(object sender, EventArgs e) - { - Settings.FloatingWindow ^= true; - RefreshFloatingWindowControl(Settings.FloatingWindow); - } - - private void RestoreDefaultsMenuItem_Click(object sender, EventArgs e) - { - Size = new Size(_defaultWidth, _defaultHeight); - Settings = new CheatsSettings(); - - CheatsMenu.Items.Remove( - CheatsMenu.Items - .OfType() - .First(x => x.Name == "GeneratedColumnsSubMenu")); - - CheatsMenu.Items.Add(Settings.Columns.GenerateColumnsMenu(ColumnToggleCallback)); - - Global.Config.DisableCheatsOnLoad = false; - Global.Config.LoadCheatFileByGame = true; - Global.Config.CheatsAutoSaveOnClose = true; - - RefreshFloatingWindowControl(Settings.FloatingWindow); - LoadColumnInfo(CheatListView, Settings.Columns); - } - - #endregion - - #region ListView and Dialog Events - - private void CheatListView_Click(object sender, EventArgs e) - { - } - - private void CheatListView_DoubleClick(object sender, EventArgs e) - { - ToggleMenuItem_Click(sender, e); - } - - private void CheatListView_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Delete && !e.Control && !e.Alt && !e.Shift) - { - RemoveCheatMenuItem_Click(sender, e); - } - else if (e.KeyCode == Keys.A && e.Control && !e.Alt && !e.Shift) - { - SelectAllMenuItem_Click(null, null); - } - } - - private void CheatListView_SelectedIndexChanged(object sender, EventArgs e) - { - DoSelectedIndexChange(); - } - - private void CheatListView_ColumnClick(object sender, ColumnClickEventArgs e) - { - var column = CheatListView.Columns[e.Column]; - if (column.Name != _sortedColumn) - { - _sortReverse = false; - } - - Global.CheatList.Sort(column.Name, _sortReverse); - - _sortedColumn = column.Name; - _sortReverse ^= true; - UpdateDialog(); - } - - private void NewCheatForm_DragDrop(object sender, DragEventArgs e) - { - var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); - if (Path.GetExtension(filePaths[0]) == ".cht") - { - LoadFile(new FileInfo(filePaths[0]), append: false); - UpdateDialog(); - UpdateMessageLabel(); - } - } - - private void NewCheatForm_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void CheatsContextMenu_Opening(object sender, CancelEventArgs e) - { - ToggleContextMenuItem.Enabled = - RemoveContextMenuItem.Enabled = - SelectedCheats.Any(); - - DisableAllContextMenuItem.Enabled = Global.CheatList.ActiveCount > 0; - } - - private void ViewInHexEditorContextMenuItem_Click(object sender, EventArgs e) - { - var selected = SelectedCheats.ToList(); - if (selected.Any()) - { - GlobalWin.Tools.Load(); - - if (selected.Select(x => x.Domain).Distinct().Count() > 1) - { - ViewInHexEditor(selected[0].Domain, new List { selected.First().Address ?? 0 }, selected.First().Size); - } - else - { - ViewInHexEditor(selected.First().Domain, selected.Select(x => x.Address ?? 0), selected.First().Size); - } - } - } - - protected override void OnShown(EventArgs e) - { - RefreshFloatingWindowControl(Settings.FloatingWindow); - base.OnShown(e); - } - - #endregion - - #endregion - - public class CheatsSettings : ToolDialogSettings - { - public CheatsSettings() - { - Columns = new ColumnList - { - new Column { Name = NameColumn, Visible = true, Index = 0, Width = 128 }, - new Column { Name = AddressColumn, Visible = true, Index = 1, Width = 60 }, - new Column { Name = ValueColumn, Visible = true, Index = 2, Width = 59 }, - new Column { Name = CompareColumn, Visible = true, Index = 3, Width = 59 }, - new Column { Name = ComparisonTypeColumn, Visible = true, Index = 4, Width = 60 }, - new Column { Name = OnColumn, Visible = false, Index = 5, Width = 28 }, - new Column { Name = DomainColumn, Visible = true, Index = 6, Width = 55 }, - new Column { Name = SizeColumn, Visible = true, Index = 7, Width = 55 }, - new Column { Name = EndianColumn, Visible = false, Index = 8, Width = 55 }, - new Column { Name = TypeColumn, Visible = false, Index = 9, Width = 55 } - }; - } - - public ColumnList Columns { get; set; } - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.resx b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.resx deleted file mode 100644 index 1631505e05..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.resx +++ /dev/null @@ -1,767 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 339, 17 - - - 17, 17 - - - 234, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAERSURBVDhPrZDbSgJRGIXnpewd6jXsjSQvIrwoI0RQMChU - 0iiDPCGiE3ZCRkvR8VzTeBhnyR5/ccaZNnPhB4t9sdf6Ln5hb8QeathNJFVFKF5C8DqL4ksDVHWGDf7j - LHyPg6NjviSaFqlu5yQYR+KpupaIkrMknCxT3Y7v/NYYb0ITK1c3BarbWWhLQ7IR0cTKReyZ6lZ0XYei - ztHpK4bAc+h1FgQijzSxMptrGIxVSO0xX3AaStFki7bUMVFmaMm/eJMGfIH/MkGzLep0AXn4h/r3CJV3 - mS9gn2bY4UY/UzQ7E9TqfeTFtnuB+XAfzSHKr11kSl/uBebDiZ89ZCst3OUkdwL28sIVsE83ock+EIQV - 2Mz2wxeg6/UAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJHSURBVDhPxZBdSNNhFMb/F110ZZEVhVBgeeHNICiiuggp - olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdNKMwr7kApFItTUkWZqVhSVYmao5Nevvy7UoYR3HXh4 - 4XCe33nOKyy3lAY7l9RWMo0O/raWXxEyo5spVYTNvOGyfIRPfW+ptOkXqaPl6T83hcRmExSdgzAz3NVm - YWyoYla/B+1M9JtxWLPpaH22JORIjI6gKAMB0jyEimIdo4OlbuaprwVMOOMovammpDADc34qppwUrmnl - 5Kni3aFlFg2j3y1z5mnRTJccnNIltQhwq0jFry+mOXNtpWZWDx1Z1NhV3C3JwGFOw25SYjVe5oYhiUKd - HKMmwQUrMWUw/CF3NnZvvYKqUh1TvUroS3fXe7HXkwidMngTS2t5KLbregSzMY2f3Wr4qKW6LJvGR1rX - 0MLor8OhKYTJBn/GHvvxrliCTBrsOqXIoOBHh5K+hmSq7FqmexTQHuUytkaKxuNMNgYyVneA4Qd7GKjc - hjLaRzxH7gIU6JIZaEvgtk1D8wsxSWecCDgNzWFMvwxm/PkhRmr3Mli1nW9lvjRdWc0Jf+/5jzRmyWmv - S+GOLQu6U6BFjPvqKOP1AYw88WOoZif9DgmfLVtxaj1RSLdwNvrkPCA3M54KqxrnvRia9MKcGrUrqFOt - 5H7qKsqT1mGO9+Lqhc2ELdw+U/r0i+gVZ8hMiCDx3DHORwZyKnQ/hw/uYt9uCTskPvh6e7Fp41rWr/Fg - g6eHO+A/lyD8ARfG3mk9fv1YAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIySURBVDhPrZLfS5NRGMfff6H7boIuuq2pMZyL1eAt11CW - DcOKsB9vpFmaLtNExco0av6CbIVLJ61Wk3BSkT/AFCkRZSpZmrmiJQ41xSaCwdfznL15XEUX0Reem5f3 - 8znnec4j/Zc8fxYGla91CS3eRTx0z6OpMYS7jmnU1X6B/VYA18snUVoyjsKCt8jLHcH5c36ouCQR2NUJ - 1Nas4G9ZXlmFKbULh1Kf8lJxSfI+WeCCyopv6q+/h+DQ/DJ2WV5Ao1FgPegRAveDOS4oLfmq/h6dn/DH - 4AJizD4UXJrCAUuzEDgbZrjgou2DiohshIcnQtgme5GTPYbkJKcQ1N8OckHW2REVi+RXuM8fxGaDG4oy - ALPZIQQ11Z+5QDk1oKJ/hjv7P2FTfCMOH3mFxMQ6IbhROYWOdrCnBI4dfwPr0V4+bRoY9UzXppMjcDdS - rC8hy3YhuFI2gTYf2A4Aza4f7N2/o/zaLB8qDYx6zszwr8P7k1thNFYIweXCMXgeAfedq2xxwjClZUeV - Jd2GtDNFETiJwfs8MBjKhMCWN8pgoLoqzE8miH1GjE7G4PsZjE7OQsm9ij2mFg7rdrug1xcJAa2l4w7W - r00Cgk/n38S7wBwC04u4UGxHrMHF4CbEJtyDLj5fCDIzhljfSxzeavRgyw4Zj9t64GvvQ0d3P3pfD2Kv - 2QqNvgFxDN6urYdWmyMElJMnevh60obRktA701PRtGlg1DOdSkXwzrisaMG/RZLWAE60OMW5fNhvAAAA - AElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - AAABAAUAQEAAAAAAIAAoQgAAVgAAADAwAAAAACAAqCUAAH5CAAAgIAAAAAAgAKgQAAAmaAAAGBgAAAAA - IACICQAAzngAABAQAAAAACAAaAQAAFaCAAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpb - MQEaXzNcGWc2mxlrOasZazmoGWg3lhlgM04AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAcVS85G10y/xlpOP8ZbTn/GW06/xlqOP8aXTL+G1gwGwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJVTGR+QUEEikFFfIopOdyCB - SIoggEiUIH5HmR99RpYfekSPHnRBfh9qPGcdVzFRHFAtZBtfNP8abDr/GXA8/xlwO/8ZbDn/GmAz/xtT - LkgdVjFRHmg7Zx5zQH4eeUSPH3xGliB+R5kgf0iUIIBIiiKKT3cikFFfIJFRQSCWVBkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIptXGCCWVGYeklGrHpBP5SGY - Vf4np2D/Lrht/zK/c/8yvnL/Mr1y/zK5cP8ws2v/LKdj/ymVV/8jeUb/H1cy/x1JKv8bYjX/G3M//xt4 - Qf8adj//GW87/xphNP8dRin/H1cy/yN5Rv8plVf/LKdj/zCza/8yuXD/Mr1y/zK+cv8yv3P/Lrht/yen - YP8hmFX+HpBP5R+SUasgl1VmIp1ZGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdj05FHY5OtCOe - WvsqsWf/L8Fy/zXQff863of/PumQ/0Dwlf9B8JX/QvGW/0Lzl/9C85f/Qe+U/z7ljf851YH/Lq9m/yNu - P/8eTSz/G2g5/x18RP8eg0j/HYBG/xt1QP8bYTX/Hkor/yNuP/8ur2b/OdWB/z7ljf9B75T/QvOX/0Lz - l/9C8Zb/QfCV/0Dwlf8+6ZD/Ot6H/zXQff8vwXL/KrFn/yOeWvsdjk60HpFQRQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2P - TjIbiUrDIppX/yu1av8zzHr/OduF/z3njf9A75P/QvaZ/0T6nP9E+pz/Q/mb/0P4mv9D+Jr/Q/ib/0P5 - m/9C9pj/POmN/zLEc/8leEb/H1Ev8BxuPP8ghkv/I5FS/yKPUP8ef0b/G2I2/yBVMdYleEb/MsRz/zzp - jf9C9pj/Q/mb/0P4m/9D+Jr/Q/ia/0P5m/9E+pz/RPqc/0L2mf9A75P/PeeN/znbhf8zzHr/K7Vq/yKa - V/8biUrDHpFQMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAHY9OAhqGSHwdj076KbBm/zTMev8634j/P+yR/0Hylv9C9pn/Q/mb/0T7nf9E/J3/RPuc/0P4 - mv9C95n/QfaX/0DzlP8/8pP/O+eK/zLRev8zw3P/J3tJ/yBnO7IddUH/I5NT/yihXf8on1z/IotP/x1n - Ov8hajySJ3tJ/zPDc/8y0Xr/O+eK/z/yk/9A85T/QfaX/0L3mf9D+Jr/RPuc/0T8nf9E+53/Q/mb/0L2 - mf9B8pb/P+yR/zrfiP80zHr/KbBm/x2PTvobh0l8HpJQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAHpJRBhqFR6ogllP/Lr5w/zjahP896Y//QfOX/0P3mf9D+Zv/RPuc/0T7 - nP9E+pz/RPqb/0T6m/9D+Zr/QveY/0DzlP877I3/M9V8/zDMdv8214D/NcZ4/yd6Sf8jgkpuIYNK/yqm - Yf8wt23/LbBo/yWYV/8edUL/In5ITyd6Sf81xnj/NteA/zDMdv8z1Xz/O+yN/0DzlP9C95j/Q/ma/0T6 - m/9E+pv/RPqc/0T7nP9E+5z/Q/mb/0P3mf9B85f/PemP/zjahP8uvnD/IJZT/xqFR6oflVIGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZlVAhuISakinFj/McZ2/zvhif8/7ZL/QvSX/0P4 - mv9D+Jr/Q/ma/0P5m/9D+Jr/QvaY/0L1l/9C95n/QfaX/z/zk/8654n/L811/zHOd/822ID/OuGI/zfG - ef8nfUrdJpVVQSaVVv8xu3D/Nsh4/zK+cv8ool7/IIFJ/ySNUCInfUrdN8Z5/zrhiP822ID/Mc53/y/N - df8654n/P/OT/0H2l/9C95n/QvWX/0L2mP9D+Jr/Q/mb/0P5mv9D+Jr/Q/ia/0L0l/8/7ZL/O+GJ/zHG - dv8inFj/G4lKqSKbVwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6QT3slpF7/NdF+/z7q - kP9B8pb/QfKV/0H0lv9C9Zf/QfSW/0H0lv9B85X/QPGT/z/vkf8+75D/Pe+Q/zztjv80137/MM12/zPT - fP833IP/O+SK/z7njv82wHX/KY1ThyeYWEAqpGD/NcV3/zfMfP81x3j/LKtk/x+FSv8ki1AgJ4lRhzbA - df8+547/O+SK/zfcg/8z03z/MM12/zTXfv887Y7/Pe+Q/z7vkP8/75H/QPGT/0Hzlf9B9Jb/QfSW/0L1 - l/9B9Jb/QfKV/0Hylv8+6pD/NdF+/yWkXv8ekVB7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWk - XSwlo135ONmE/0Hylv9C9pn/QvWY/0DxlP8/7pH/P+6R/z/tkP8/7ZD/Pu2P/z3rjf897I7/PO2O/zbe - gv8wzHX/MtF6/zbZgP8534b/POaL/z/tkf8+54//MrFs/SyiYCopmFo/Lq9o/zbKev83zn3/Nsl6/y2x - af8ehUr/I4pPICiXWSoysWz9PueP/z/tkf885ov/Od+G/zbZgP8y0Xr/MMx1/zbegv887Y7/PeyO/z3r - jf8+7Y//P+2Q/z/tkP8/7pH/P+6R/0DxlP9C9Zj/QvaZ/0Hylv842YT/JaNd+SamXywAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAlpF64N9WB/0L0mP9D+Zv/Q/eZ/0H0lv9B8pT/P+6R/z/tkP8/7I//PuyP/z3r - jf876Yv/OeOG/zHPeP8vy3X/M9J7/zfbgv8644n/PemO/0Dvk/9B8pb/PeCK/y+pZr4AAAAALKNhPzG5 - b/83zHz/ONB+/zbLe/8utGv/IIhM/yKLTyAAAAAAL6dlvj3giv9B8pb/QO+T/z3pjv8644n/N9uC/zPS - e/8vy3X/Mc94/znjhv876Yv/PeuN/z7sj/8/7I//P+2Q/z/ukf9B8pT/QfSW/0P3mf9D+Zv/QvSY/zfV - gf8lpF64AAAAAAAAAAAAAAAAAAAAAAAAAAAnqmIxLrxv/kDvlP9D+Zv/Q/mb/0P3mf9C9Jf/QfOV/0Dv - kv8/7ZD/PuyP/zzqjP865Ij/MtJ6/y/Jc/8xznf/NNR8/zfbgv875In/PuyQ/0DxlP9C9pj/QvOX/znQ - f/8yuW9IAAAAAC6tZz8yvnL/Nsx8/zfPfv82y3z/LrVr/yGMT/8ii08gAAAAADG0bEg50H//QvOX/0L2 - mP9A8ZT/PuyQ/zvkif8324L/NNR8/zHOd/8vyXP/MtJ6/zrkiP886oz/PuyP/z/tkP9A75L/QfOV/0L0 - l/9D95n/Q/mb/0P5m/9A75T/Lrxv/iitZDEAAAAAAAAAAAAAAAAAAAAAJqhhkTjYg/9D+Jr/Q/mb/0P3 - mf9C9pj/QvWX/0Hzlv9A8ZT/P+6R/zzoi/811n3/MMx2/zLPeP8003z/Nth//zjdg/864oj/PeuP/0Dy - lf9C9pj/Q/ia/0Duk/80xXfEAAAAAAAAAAAwtm0/M8J1/zfNfP83z37/Nct7/y60a/8ijlD/IYtPIAAA - AAAAAAAANMV3xEDuk/9D+Jr/QvaY/0Dylf8964//OuKI/zjdg/822H//NNN8/zLPeP8wzHb/NdZ9/zzo - i/8/7pH/QPGU/0Hzlv9C9Zf/QvaY/0P3mf9D+Zv/Q/ia/zjYg/8nqmKRAAAAAAAAAAAAAAAAAAAAAC27 - bt5A8JT/RPqb/0L3mf9C9pj/QvWX/0L1l/9C9Jb/Pu2Q/zbagf8yznj/M9J6/zXWfv822oH/ON2E/zrh - hv875In/POiM/0Dwk/9C9pn/QveZ/0L0mP874Ij7N9J/NgAAAAAAAAAAMbxxPzTFdv83zn3/N899/zXL - ev8us2r/Io1Q/yCJTiAAAAAAAAAAADbRfjY74Ij7QvSY/0L3mf9C9pn/QPCT/zzojP875In/OuGG/zjd - hP822oH/NdZ+/zPSev8yznj/NtqB/z7tkP9C9Jb/QvWX/0L1l/9C9pj/QveZ/0T6m/9A8JT/Lbtu3gAA - AAAAAAAAAAAAAC/BcyA21ID+Q/ea/0T6m/9C9pj/QvWX/0H0lv896o7/NtqB/zPSe/811X7/Nth//zfc - gv8534X/OuKH/zvliv8854v/PemN/z7tkP9B9Jb/Q/eZ/0Hylf896I7/N9eCjAAAAAAAAAAAAAAAADK/ - cz81x3j/N899/zfPff81yXn/LbFn/yCJTf8fhksgAAAAAAAAAAAAAAAAN9eCjD3ojv9B8pX/Q/eZ/0H0 - lv8+7ZD/PemN/zzni/875Yr/OuKH/znfhf833IL/Nth//zXVfv8z0nv/NtqB/z3qjv9B9Jb/QvWX/0L2 - mP9E+pv/Q/ea/zbUgP4xxnYgAAAAAAAAAAAtum1RONiD/0P3mf9D+Zv/QfOW/zvliv8113//NNV+/zbZ - gf843YT/OuGH/zrih/8744j/POaK/z3ojP896Y3/PuuO/z7skP9B85X/Q/ia/0L0l/89543/N9iCxTre - hwYAAAAAAAAAAAAAAAAyv3M/NcZ4/zfMfP82zHv/NMR2/yyrZP8egUj/HoFIIAAAAAAAAAAAAAAAADnd - hgY32ILFPeeN/0L0l/9D+Jr/QfOV/z7skP8+647/PemN/z3ojP885or/O+OI/zrih/864Yf/ON2E/zbZ - gf801X7/Ndd//zvliv9B85b/Q/mb/0P3mf842IP/Lr1vUQAAAAAAAAAALr9xMTXSfd8+7JD/PemO/znh - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlUPEGRUD4djUw/yZFQP/2ZWD/9rWg//c2EQ/4Ft - Ef+RfBP/n4cU/6mPFf+wlRb/tJkW/7abF/+4nRf/uZ4X/7qdF/+6nhf/u58X/76iGP++ohj/tZoX/6KK - Ff+SexP/gWwR/3FeD/9nVg//YlIP/19PD/9eTg//Xk4P/15OD+peTg93Xk4PCQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoWA8BZ1cPZmVVD+xnVg//a1oP/3Ri - D/+CbhH/lH0T/6eNFP+9oRj/0LEa/9q6G//fvxz/4cAc/+LBHP/jwRz/48Ic/+TDHP/mxB3/58Ud/+rI - Hf/uzB7/7swe/+zKHf/kwx3/3b0c/9GyGv+6nRf/nIQU/4JuEf9xXg//Z1YP/2JSD/9gUA//X08P/15O - D+FeTg9TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqWQ8dZ1cPvmlY - D/9vXQ//emYQ/4t1Ev+fhxT/tJkX/8aoGf/VtRv/5cMc/+7MHf/xzx7/89Ee//TRHv/00R7/89Ee//PQ - Hv/z0R//9NEf//XSH//20x//+NQf//jUH//31B//99Qe//bTHv/10h7/8c8e/+bFHf/QsRr/sJUW/494 - Ev92Yw//alkP/2NTD/9gUA//Xk4P/15ODqpeTg4RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABsXA9FaFgP7G9eD/9+ahD/lX4T/6+VFv/BpBj/z7AZ/9u7G//mxR3/7csd//LPHf/00R7/9dEe//XR - Hv/10R7/9dEe//bSHf/00B//8tAf//PQHv/z0B7/8s8f//bSHv/30x3/9tMe//bTHv/51R7/+9Yf//vX - H//51h//9tMf/+7MHv/YuBv/s5cW/453Ev91YxD/aFcP/2JSD/9eTg//Xk4O315ODjEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABuXQ9hbVwP+n1pEP+XfxL/tZoW/9CwGv/hwBz/58Ud/+vJHf/vzR3/8s8e//LP - Hv/yzx7/89Ad/+3MIP/RwCX/trgq/6GyLP+TrS//iKov/4KpLv+GrCz/hqss/4KoL/+Lqi7/l60t/6ax - LP+8uij/1sMl//XSH//61h7/+9cf//vXH//71x//99Qe/+zLHv/Ssxr/qY8V/4VwEf9vXA//Y1IP/15O - D/9eTg7zXk4OSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvXg9ocF8P/YhzEf+tkxX/za4Z/+PBHP/uzB7/89Ee//XR - Hv/z0B7/8s8e//LPHv/uzB//y8An/6W1Lv+Lry//irEu/4qxLv+Msi7/jbMv/4yzL/+Lsi7/irAu/4mv - Lf+Iry3/h64t/4atLf+GrC3/hqwt/4WrLP+IqS//p7Mr/9LDJ//51h//+9cf//vXH//51R//9NEe/+TC - HP/CpBj/l34T/3VhEP9kUw//Xk4P/15NDvheTg5LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYQ9TcV8P/Ix2Ef+4nRf/2rob/+3L - Hv/00R7/9tMf//XSHv/z0B7/8M0e/+rKIP+/vyv/mboy/5e/Mf+ZwTL/mMAy/5i/Mf+awTL/ncUy/5/J - M/+gyTP/nsgz/5zFMv+bwzH/msIx/5nBMf+XvjH/k7ow/4+2Lv+Msy3/ibAt/4etLf+FrC3/j6su/8S+ - KP/31CD/+9cf//rWH//31B7/7sse/9GyGv+jiRT/emYQ/2VUD/9eTg//Xk0O9l5ODjsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6Zw8scmAP9I95 - Ev+/ohj/4sEc//LPHv/20x//9tMe//PQHv/uzB3/58Uc/8O8KP+bvDP/m8My/6DJM/+kzjT/qNI1/6rU - Nf+s1jb/sdw3/7bhOf+55Tr/u+c6/7vmOv+65Tn/ueU5/7nlOf+45Dj/tuI4/7LdNv+r1jX/pM4z/5zF - Mf+Uuy//jbQt/4mwLf+GrSz/kKwu/9PEJv/71x7/+tYf//jUH//vzR7/2Lgb/6mPFf97ZxH/ZVQP/19P - D/9eTg/nX08OGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACJdBEGd2QP0pJ7Ev/Dphj/5cMc//TRHv/41R//99Qe//LPHv/pyB3/2Lse/6a3L/+awjL/n8cz/6XP - NP+t1zb/tOA4/7rmOf++6jv/wu47/8byPf/I9D3/yvY9/8v2Pf/L9j3/y/c9/8v3Pf/L9z7/y/c9/8r2 - Pf/I9D3/xPA8/7/rOv+45Dj/rtk1/6LLMv+XvzD/j7Yu/4ivLf+Fqy3/rLUs//TSIP/41R7/9dMe/+/N - Hv/ZuRz/p44V/3llEP9lVA//YFAP/19PDrhgUA8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAiXQRe5aAE//Dphj/48Mc//PQHv/41B//+NQf//TRHv/pxxz/zbcg/527 - Mf+cxDP/osw0/6vVNf+14Dj/vuo7/8XxPP/J9D7/y/Y+/8z3Pv/N+D7/zfk+/835Pf/N+j3/zfs9/877 - Pf/O/D3/zvw9/877Pf/O+z7/zfo+/835Pv/L9z3/yfU9/8TwO/+86Dn/sdw2/6PNMv+XvzD/jrUu/4iv - Lf+Xri3/6cwh//XSHv/00B7/7swe/9W2G/+giBT/dWIQ/2VUD/9gUA//YFAPXAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIQTFZmCE/LCpRj/4MAc//DOHv/30x7/9tMe//LQ - Hv/pyB3/zbcg/5y+Mv+gyDP/p9E0/7LdN/+96Dr/xfE9/8r2Pv/M+D7/zfk//835Pv/N+j7/zvs9/8v2 - P/++4U7/tM5e/7DGZ/+rvmv/q75r/7DHZv+10Vz/wOVM/835Pf/P/T3/z/w+/876Pv/N+T3/yvY9/8Tw - PP+75zn/r9o2/6HKM/+VvTD/jLIu/5OvLf/nyiH/9NEe//TRHv/tyx7/za4a/5R9E/9wXQ//Y1MP/2BQ - D+BhUQ8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCIE4K6nhf/3Lwb/+3L - Hf/10h7/9tMe//LQHv/pxxz/0LUd/5++Mv+jzTP/rNc1/7jjOf/C7zz/yvU+/834Pv/O+T//zvo+/877 - Pv/N+T7/uNVb/6Swff+Zmpb/m5ud/52dnf+enp7/np6e/56env+dnZ3/nJyc/5mZm/+YmpP/pbN3/7vZ - Vf/P/D7/z/w+/877Pv/N+T7/yvY9/8PwO/+55Tn/qtU1/5vDMv+Pti//mbAt/+3MH//00R7/9NEe/+jH - Hf+7nhf/hW8R/2lYD/9hUQ//YVEPYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOY - FQSqkBTm07Qa/+nIHf/z0R7/9tMe//PQHv/qyR3/2Lga/6S5L/+m0DT/sNs3/7zoOv/F8Tz/y/c+/835 - P//O+j7/zvs9/8/8Pf+61l7/o6eU/6SjpP+oqKj/ra2t/7CwsP+ysrL/s7Oz/7Ozs/+ysrL/sLCw/66u - rv+rq6v/pqam/6Kiov+dnZ7/n6WJ/7vbVf/O/D3/zvo+/836Pv/M+T3/yfU8/7/rOv+w2zb/n8gy/5G5 - L/+vtiv/8s8e//TRHv/xzh7/2bkb/6SLFf93Yw//ZVQP/2FRD8oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC2mxZCxqgY/+TDHP/xzh7/9tMe//XTHv/uzB3/3bwb/7KsJP+n0TT/st03/77q - O//H8z3/zPc+/835Pv/N+T3/zfo9/8n0Qf+vvIX/rKyt/7W1tf+7u7v/wcHB/8bGxv/Kysr/y8vL/8zM - zP/MzMz/y8vL/8jIyP/FxcX/wcHB/7y8vP+1tbX/ra2t/6ampv+enp7/qbpz/8n0Pv/N+D3/zfk+/835 - Pv/L9z3/xO87/7TfNv+hyzP/krkw/9K+I//tyx3/7csd/+jGHf/GqBn/j3kT/21bD/9jUw/+ZFQPIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwKQXh9u6G//uzB3/9dIe//bUHv/z0B7/5sUc/8ep - GP+kxDP/st03/77qOv/H9D3/zPg+/834Pv/M+D3/yvc8/8TuQv+zu5v/u7u7/8XFxf/Nzc3/1dXV/9vb - 2//e3t7/4ODg/+Hh4f/h4eH/4ODg/9/f3//d3d3/2tra/9bW1v/R0dH/y8vL/8PDw/+4uLj/rq6u/6Wl - pf+kr4L/wOs9/8r2Pf/M+T7/zfo+/8z4Pf/F8Tv/s982/6DKM/+jty//5cMc/+fFHP/qyR3/374c/6+U - Fv98aBD/Z1YP/2ZVD2cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyuGLzmxRz/89Ae//fU - Hv/21B//7s0d/9m5Gv+spCH/sNs3/7voOf/G8jz/zPg+/835Pv/L+D3/x/Q7/8DtOf+6xZj/xsbG/9LS - 0v/b29v/4+Pj/+np6f/s7Oz/7Ozs/+7u7v/u7u7/7e3t/+zs7P/r6+v/6enp/+fn5//k5OT/4ODg/97e - 3v/Z2dn/zMzM/8HBwf+1tbX/qqqq/6W1d/+86Dj/yfQ8/835Pf/N+j7/zPg9/8LwOv+v2zX/nMUy/9S8 - Iv/mxBz/6sgc/+rIHf/Orxn/lH0T/3BeD/9pWA+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADVthrh7csd//XRHv/31B7/9dIf/+nIHf/Jqxj/pbUr/7biOP/C7jv/y/Y+/8z5Pv/M+D3/xvM7/7zp - OP+30Wr/z8/P/9ra2v/k5OT/6+vr/8XFxf8RERP/QUFC//T09P/19fX/9fX1//T09P/09PT/8/Pz//Hx - 8f/w8PD/7Ozs/+vr6/8+Pj//ERES/7i4uP/S0tL/xsbG/7m5uf+urq//qspQ/8DsO//L9z3/zfk+/835 - Pv/K9jz/vOg4/6jTM/+8vSr/58Uc/+rIHf/tyx3/4b8d/7CWFv9/bBH/bVwPwgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADauhoB3Lsa9O3MHf/00R7/9tQe//TRHv/jwhz/u58V/6XFMv+65Tn/xfI8/8z4 - Pf/M+T3/yvY8/7/sOv+v2zX/ydC3/97e3v/n5+f/7u7u//Pz8/9ubm7/AQMG/wABA//V1dX/+Pj4//j4 - +P/4+Pj/+Pj4//f39//29vb/9PT0//Ly8v/IyMj/AQID/wECBf9xcXH/3t7e/9XV1f/Kysr/vb29/665 - jf+45Dn/x/M9/835Pv/N+T7/zPg9/8TxO/+z3jb/sMQv/+rIHP/tyx3/7swd/+nHHf/FqBj/kHkS/3Ng - D9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3b0bA9++G/rsyx3/89Ae//fUH//z0B7/3bwb/7GX - Fv+lzzb/uuY5/8bzPP/L+D3/y/c9/8XxO/+55Tj/qc5D/97e3//o6Oj/7+/v//T09P/39/f/T09Q/wMI - Dv8BAwf/wsLC//r6+v/6+vr/+vr6//r6+v/5+fn/+Pj4//f39//29vb/qamp/wIFCf8DBw3/YmJi/+jo - 6P/g4OD/19fX/8vLy/+8vbr/sNo5/8XwPP/M+D3/zfk9/8z4Pf/J9Tz/ueY3/6rLNf/qxxz/7s0e/+/N - Hf/ryR3/z7Aa/5yEE/95ZQ/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLBGwHjwhzy7csd//PQ - Hv/31B//8s8e/9i4Gv+pkRb/rNc0/7voOP/H9Dv/y/c8/8n2Pf/B7Tr/s983/6/OW//m5uf/7e3t//Pz - 8//39/f/+vr6/0ZIS/8RGyj/ChEb/8DAwP/7+/v/+/v7//v7+//7+/v/+vr6//j4+P/4+Pj/9/f3/6Gh - of8LEx7/ERsp/2FiZP/u7u7/6Ojo/+Hh4f/X19f/zMzO/6/VRP/D7jv/zPc+/835Pv/M+T3/yvc7/77r - OP+y1zT/58Qc/+7NHf/vzR3/7Moe/9S0Gv+jixT/fWkP1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA5sUc3e7NHf/z0B7/99Qf//HPHv/Vthr/p48U/6/bNv++6zn/yPU7/8v3PP/I9Dz/vus6/6/b - Nv+sy1n/7Ovs//Hx8f/19fX/+Pj4//r6+v9ITFL/His8/xIcKv/BwcL/+/v7//v7+//7+/v/+vr6//n5 - +f/4+Pj/+Pj4//j4+P+goKD/GCMy/xwpOf9kZmn/8/Pz/+/v7//p6en/4eHh/9fW2f+t00P/wu08/8z3 - Pv/N+T7/zfk+/8v4PP/E8Tr/uN03/+fFG//vzR3/8M4d/+3KHv/Wthr/qI8U/4RvEL0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrJHbbwzh3/9NEe//fUH//xzx7/1bYa/6aME/+w2Dj/w/A6/8r3 - PP/L9z3/x/M8/73pOf+t2DX/n8M9/+3t7v/z8/P/9vb2//j4+P/7+/r/S1FY/zJBUv8eKjn/wcHC//v7 - +//6+vr/+vr6//r6+v/5+fn/+fn5//j4+P/4+Pj/oKCi/yQyQf8xQFH/ZWhs//f39//09PT/8PDw/+np - 6f/b3Nb/qdI1/8LuPP/M9z7/zfk+/835Pv/M+Tz/yfY7/7/cOP/pxxv/8c8e//HPHv/tyx7/1rYa/6uR - Ff+PehKXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuzB1/8s8e//TRHv/31B//8s8e/9i4 - Gv+pkBP/r8ky/8j1Ov/L+Tz/y/g8/8fzPP+86Tn/rNc1/5nBL//W3sH/8/Pz//b29v/5+fn/+/v7/1Vb - ZP9ygI//Sldk/8DBwv/7+/v/+/v7//v7+//7+/v/+vr6//r6+v/5+fn/+fn5/6OlqP9NW2r/c4KQ/2pt - cf/6+vr/+Pj4//T09P/w8PD/ydem/6zXNf/E7z3/zPc+/836Pv/N+j7/zfo9/8z6PP/J2DL/7csd//TR - Hv/z0B7/7csd/9W1Gv+skhX/nYYTXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8c8dOPPQ - Hv/00R7/99Qf//PQHv/buxv/rpUU/6WtKP/M+Tv/zPo9/8z5PP/I9Tz/v+s6/67ZNf+ZwjD/psFi//T0 - 9P/29vb/+Pj4//n5+f9obnX/yM3T/4CHjv/Fxsb//Pz8//z8/P/8/Pz//Pz8//v7+//7+/v/+/v7//v7 - +/+ztbj/hIyV/8rP1P9ydXj/+/v7//r6+v/4+Pj/8/Py/6PETv+w2zf/xvE9/8z4Pv/N+j7/zfo+/877 - Pf/P/Tz/z8cp//LPHv/31B//9dIe/+vKHf/Rshn/q5EU/KmPFBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAPLPHgH00B7c9NEe//fUH//00R7/378b/7ecFv+YiBj/yfY+/8/8Pf/N+j3/y/c9/8Pv - O/+y3Tf/ncYx/461Lf/H1qX/9/f3//j4+P/6+vr/iIyR/8bLz/98goj/4uLj//39/f/9/f3//f39//39 - /f/9/f3//Pz8//z8/P/8/Pz/3N3e/3h/h//Lz9L/jZCU//39/f/8/Pz/+/v7/73Qjf+bwzD/t+E4/8j0 - Pf/N+D7/zfo+/836Pv/O/D3/yPA9/9m6HP/10h7/+dUf//XSHv/oxh3/y60Y/6ySFL8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA888edfTQHv/31R//9tMe/+bFHP/CpRf/n4gT/67A - MP/P/j3/zvs9/835Pv/I9Dz/ueU4/6TOM/+Tuy//jLEw/9Peuf/6+vr/+/v7/9/f4P9WW2L/eHyC//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f91eH3/WV5m/+Dh4v/9/f3//f39/8jX - pP+OtS3/o80z/7zoOv/K9j3/zfk+/876Pv/N+j3/z/09/7zCLP/kwxz/99Qf//nVH//z0R7/4cAb/8Kl - F/+1mhVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPQHg700B7r+dUf//nV - H//vzR3/0bEZ/6mQFP+Yhxf/x/A8/8/9Pf/N+j3/zPg9/8PvO/+y3jb/nsYy/4+2Lv+KsC7/wtOY//r7 - +v/8/Pz//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+vv4/7fNhv+KsSz/lr4v/67YNf/D7zz/zPg+/836Pv/O+j7/zvw9/8PnOv/Bphn/7swd//nW - H//61h7/7swd/9a2Gv+6nhbWwKMWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA9dIeaPjUHv/61h//9dIe/+HAG/+8oRb/n4cT/6OhI//P/D3/zvw9/835Pv/L9z3/wu47/67a - Nf+awjH/j7Yu/4qxLP+du1T/2+XF//39/f/+/v7///////////////////////////////////////// - ///////////////////9/fz/1OC4/5e4Sf+KsSz/kbgu/6PMMv+65jn/yfU9/835Pv/O+j7/zvo+/8v4 - Pv+voyD/2Lga//XTHv/61h//99Me/+XDG//Iqhj/vqIWSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbTHgL20x7A+dUe//jVHv/uzB3/1rYa/7GXFf+dhBL/q7Ys/9D+ - Pf/N+j3/zfk+/8v2Pf/A7Dr/rdk1/53GMf+Tui//jbMt/4mwK/+aulH/xdad/+nu3P/9/f3///////// - /////////////////////////Pz7/+Xs1f/A05X/lrdI/4mwLP+Msi3/krku/6DJMv+14Df/xvI8/8z4 - Pv/N+j7/zvo+/836Pv+srSf/xKcX/+vJHf/51R//+tYf//HOHv/Wthn/v6MWowAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA99QeHvjUHur61h7/99Qe/+vK - Hf/QsRj/rJMU/5uEEv+suS7/z/09/837Pf/N+T7/yvY9/8HtOv+z3zf/ptA0/5rDMf+SuS7/jLMt/4qx - LP+Iryv/jbE4/5+9Wf+sxW//s8t6/7PMef+rxW3/nr1V/46yNf+KsSv/jLMt/461Lv+RuC7/mL8w/6XP - M/+44zj/xvI8/834Pv/N+T7/zfo+/8z6Pv+rsCn/uJwV/929G//00R7/+dYf//bTHv/jwhv/xqgX2cyt - GA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD51R4++9ce9/vXH//41R7/7cwd/9OzGf+vlRT/m4MS/6WqKP/L9z3/zvs9/835Pv/L9z3/xvI8/73p - Of+y3jf/qNI0/57GMf+WvS//kbgu/4+2Lf+OtS3/jrQt/461Lf+Pty3/kbgu/5K5Lv+Uuy//lr4v/5nB - MP+exzH/ptAz/7LeNv/A7Dr/yvY9/835Pv/N+j7/zvs+/8jyPf+opiT/tJgU/9OzGf/tyx7/99Qf//bT - Hv/oxhz/zK4Y7M2uGCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrWHkz82B74/Ngf//rWHv/yzx3/2roa/7ebFf+ehhL/m5Ad/77f - Of/P/D3/zfo+/8z4Pv/K9j3/xvI7/8HtO/+75zn/s943/63XNf+o0jT/pc8z/6TNM/+kzjP/ps8z/6fS - M/+q1TT/rdk1/7HdNv+14jf/vOg5/8PvPP/J9T3/zPg+/836Pv/O+z7/z/w+/7vYN/+klRv/tZoV/8+w - Gf/nxhz/9NIe//bTHv/syR3/0bIZ78+wGDcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+9ceRvzYH/L82R//+9ge//XS - Hf/kwxz/xKYX/6WNE/+YghP/pq0o/8TtPP/O/D3/zfo+/8z4Pf/M+D3/y/c9/8n1Pf/H8z3/xfE8/8Tw - PP/D7zz/w+88/8TwPP/F8Tz/x/M8/8j0Pf/K9j3/y/c9/8z4Pf/N+T7/zfo+/877Pv/P/T7/wuc8/6an - Jv+ljBP/uZ0V/9GyGf/mxBz/89Ae//bTHv/wzR3/3Lsa5ta2GTIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD71x4t/Nge2/3ZHv/82B7/+dUe/+7LHP/VtRn/tpsV/6OKE/+ZhRX/pqwn/7zeOf/O/D7/zvs+/836 - Pf/N+T3/zfk+/835Pv/N+D7/zfk+/835Pv/N+T7/zfk+/835Pv/O+j7/zvs+/877Pv/O/D7/z/09/877 - Pv+72Tf/paYm/5+IE/+vlRT/xacX/9y7Gv/ryR3/89Ee//fUH//z0B7/5sQbyuPBGx4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvXHg761x6g/Nge/vzZHv/82B7/9tMe/+jGHP/TtBn/vqEW/62T - FP+jixL/oZUc/663K/+61jf/xe89/877Pf/O+z3/zvs9/877Pf/O+z3/zvw9/8/8Pf/Q/j3/0P49/9D9 - Pv/F7T7/uNI0/6uxKf+fkBr/powS/7abFP/KrBj/3b0b/+vKHf/00h7/99Qf//jUHv/10R787Mkci+zJ - HAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvXHkb82B7X/dke//zZ - Hv/71x7/9tMd/+7LHf/jwhz/17cZ/8utF//ApBb/tZkU/6qQFP+ilBz/paIi/6qtJf+psiz/rbgr/624 - K/+qsiv/qqwl/6OfIf+fjhr/o4oT/62SE/+6nhX/y60Y/92+HP/syx7/9dIe//nVHv/61x//+9cf//rW - Hv/30x7J89AdNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA+9ceBfzYHmb82B7f/dke//zYHv/72B7/+dYe//jUHf/00B3/78wd/+fGHP/cuxr/0rMY/8qr - F//CpRb/vKEW/7qfFf+6nxb/vqIW/8OmF//Jqxf/0LEY/9m5Gv/lwxz/780e//fUHv/61x///Nkf//3Z - H//92h///Nge//rWHtP41R5W99MeAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/NgeBPvYHlb82B69/Nge/PvYHv/82B7//Nge//zZ - Hv/71x7/+dYe//fUHv/20h7/9NAe//HOHv/vzR7/784e//HPHv/00R7/9tMe//jUHv/61h//+9gf//3Z - H//92h///tof//3aH//92R75/NkesfvXHkj61h4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrX - Hh361h5v+tYeu/vXHvX82R///tof//3aH//92h///dkf//3ZH//92R///dkf//3ZH//92R///dkf//3a - H//92h///tof//3ZHv/92R7//dke8PzYHrL82B5m/NgeFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - UBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAejk42Ho5O5i68b/863Yf+QO+U/kP2 - mv9E+Zz+Rfud/0X6nf5F+pz+RPmb/kP3mf8/8ZL+ON+E/jPQev830n/+K4pT/iJ7RpsllFX+L7Jq/iyr - ZP8ih0z+InVDhCuKU/830n/+M9B6/jjghP8/8ZL+Q/eZ/0T5m/5F+pz+Rfqd/0X7nf5E+Zz+Q/aa/0Dv - lP463Yf+Lrxv/x6OTuYekE82AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCVUy0gllTuMsd3/z7n - jv9C8Zb/RPea/0T4m/9E+Jv/RPea/0P1mP9C9Zj/QfWX/z7ukP801X3/Ms95/zjchP872YX/K4xU2yaT - VXAtrWf/N8h5/zK9cf8llFT/JIlOWSuMVNs72YX/ONyE/zLPef801X3/Pu6Q/0H1l/9C9Zj/Q/WY/0T3 - mv9E+Jv/RPib/0T3mv9C8Zb/PueO/zLHd/8hllTuIZdULQAAAAAAAAAAAAAAAAAAAAAAAAAAJqReCCOc - WNU31YL+QfCV/kL0mP9B8ZX+QfGV/kHwlP9B8JP+P+6R/z7tkP497Y/+N96E/jLPef821n/+OuCH/j7p - kP881oT+LJtcgimZWm8zvHH+OM19/jXGeP8mmlj+I4dNVyqVWYI81oT+PumQ/jrgh/821n/+Ms95/zfe - hP497Y/+Pu2Q/z/ukf5B8JP+QfCU/0Hxlf5B8ZX+QvSY/0Hwlf431YL+I5xY1SenYAgAAAAAAAAAAAAA - AAAAAAAAJ6hheDfUgf9D9pr+RPea/kL0l/9B75P+P+2R/j/skP8/7JD+PeqN/zrjh/4y0Hn+M895/jjb - g/885Iv+P+2S/kLwlf84xnr5MKxoIi2lYm81xXf+OM9//jbIev8on1z+IohNVyufXiI4xnr5QvCV/j/t - kv885Iv+ONuD/zPPef4y0Hn+OuOH/z3qjf4/7JD+P+yQ/z/tkf5B75P+QvSX/0T3mv5D9pr+N9SB/yip - YncAAAAAAAAAAAAAAAAqsGcJLbds5kLyl/9E+Zz/RPea/0P0l/9B8ZX/QO2R/z/rj/875Ij/NNN7/zHL - dv800nz/ONuD/z3njP9A8JT/Q/aZ/0LulP80vnOlAAAAADCyam82x3n/OM9//zbIev8po1//IYlOVwAA - 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 - L/+KsS7+iK0u/7G5K/7x0SL++tYg//XSH/7fvx3+qY8W/3NhEP5hUQ7+X08O2GBQDg4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLdRECfmoQtqSLFP/buxz/89Ef//jVIP/00R//6Mcd/8S6 - Jv+dvzP/ock0/6rTNv+13zn/veg7/8LtPP/G8j3/yfU+/8v2Pv/L9z7/y/c+/8z4Pv/M9z//y/c+/8n1 - Pv/F8D3/vuk7/7HbN/+iyzP/lbww/4qxLv+Qri7/2ccm//fUH//z0B//4cEd/6iOFv9yYBD/YlIP/2BQ - DqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVfhNTp44V/ti6HP/xzx/+99Qf/vTS - H//pxx7+urgo/53ENP6mzzX+s904/sDrPP/I8z7+y/c//s34P//N+T/+zvo+/sz4P//H70X+w+hK/sPp - Sv/I8UT+zfo+/s78Pv/N+j7+zPg+/sn1Pv/B7Dv+s903/6LKM/6TujD+i7Av/8vBJ/700R/+8s8f/929 - Hf6dhRT+blwP/2JSDvxhUQ49AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKeOFAOljBXP07Ub/u3L - Hv/20x/+89Ef/ujGHf+9tyf+ock0/6zWNv675jv+x/I+/sz4P//N+T/+zvs//sr1Qv+20WL+prJ//p2g - lP+cnJv+nZ2d/p2dnf+bnJr+nKCR/qe0e/+41F3+zfhB/s78P//N+T7+yfU9/7/qO/6v2Tf+m8Mz/460 - L/7Qwib+9NEf//HPH/7PsBv+inQS/2dXDv5hUQ65AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCW - FTzEpxn+6Mcd//TRH//10h//6ske/8i0IP+kyjT/stw4/8HsPP/K9T7/zfk//876P//N+j//udJp/6ap - nv+rq6v/sbGx/7a2tv+4uLj/uLi4/7e3t/+0tLT/sLCw/6qqqv+jo6T/oKOU/7fTYP/N+T//zfo//8z5 - Pv/G8j3/t+I5/6HKM/+WtzD/5cki//PQH//pxx7/tJkY/3dkEP9jUw/8Y1MPJgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAL6iF4zfvxz+8s8f/vbTH//wzh/+2Lkb/qm+L/+03Tj+wu49/8v2Pv7M+D/+zPk+/snz - Qv+1wY3+uLe4/sPDw//Ly8v+0tLS/tbW1v/X19f+19fX/tbW1v/S0tL+zc3N/sbGxv+9vb3+sbGx/qWl - pf+runr+xvFA/8z4Pv7N+T7+yvY+/7vmOf6iyzT+sLos/+jHHf7qyB3+2bkc/5eAFP5rWg/+ZVUPdAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAM+xGsbsyx7+9tMf/vXTH//nxh3+uagf/rHbOP/A6zv+y/Y+/835 - P/7K9z7+xPA7/rzJlf/IyMj+1tbW/uHh4f/o6Oj+6urq/uzs7P/s7Oz+6+vr/unp6f/m5ub+4uLi/t3d - 3f/Y2Nj+zMzM/ry8vP+urq7+qbl5/8HtO/7M+D7+zfk//8r2Pf634zj+n8Y0/9vAIP7oxh3+6cge/7+j - Gf59aRD+aVkPrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANu7G+vyzx//9tQf//PRH//Zuhv/q7Io/7rl - Ov/I8z3/zfk//8v3Pf/B7Dr/udVo/9PT1P/i4uL/6+vr/42Njv8PDxH/zMzM//X19f/19fX/9fX1//Pz - 8//y8vL/7u7u/8TExP8ODxH/hoaG/9LS0v/Dw8P/tLS0/6/OU//G8j3/zfk//835Pv/F8Tz/rtk2/8XA - KP/pyB7/7cse/9y8Hf+agxT/cmAP1AAAAAAAAAAAAAAAAAAAAAAAAAAA27sbAuDAHPrxzh7+9tMf/vHO - H//Mrxn+prsu/r3oOv/J9j3+zPg+/8byPP603zf+ydSt/uXl5f/u7u7+9fX1/kVGR/8CBAj+l5eX/vn5 - +f/5+fn++fn5/vj4+P/29vb+9PT0/oiIiP8CBAj+TU1O/uLi4v/W1tb+x8fH/7PCiv6/6jz+zPc+/835 - Pv7K9j7+uuY5/7zHLv7syh7+7swe/+bFHv6xlxb+fGgP5QAAAAAAAAAAAAAAAAAAAAAAAAAA4MAcAeTD - Hffwzh7/9tQf/+/MHv/Dpxj/qMMu/77qOf/K9j3/yvY+/8DsO/+r1Tb/3eDU/+7u7v/09PT/+fn5/zg7 - QP8OFyP/kJGS//v7+//7+/v/+/v7//r6+v/4+Pj/9/f3/3p7ff8OGCT/TE5S/+zs7P/j4+P/19fX/8LI - sP+65Tn/y/Y+/835Pv/L+D3/we06/77QL//syh7/780e/+nHHv+8oRj/g28Q4gAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOjHHeHxzx7+99Mf/u3LHv++ohf+q8Uw/sHuOv/K9z3+yPU9/7zoOv6mzzT+4uXZ/vLy - 8v/39/f++vr6/j5FTv8fLDz+kpSX/vv7+//7+/v++vr6/vn5+f/4+Pj++Pj4/nx/gv8gLj/+UVZc/vPz - 8//t7e3+5OTk/83Tuv644jn+yvY+/835Pv7M+D7+xvM7/8TWMf7syh7+8M4e/+rIHv7BpRj+jHcRyQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3LHrTyzx7+99Qf/u7MHv+/oxf+rL4t/sf0O//L+D3+yPQ9/7vm - Ov6kzTP+0dy0/vPz8//39/f++vr6/ktTXf9LW2z+lJeb/vv7+//6+vr++vr6/vr6+v/5+fn++fn5/oCE - if9MXG3+XGJq/vj4+P/09PT+7u7u/8fXnv654zr+y/Y+/835Pv7N+j7+y/g9/83VL/7vzR7+8tAf/+rI - Hv7BpRj+mYMTnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHPHnPz0B//99Qf//DNHv/EqBj/pqkl/8v5 - Pf/M+T3/yfU9/73oOv+kzTT/qcRj//T09P/39/f/+fn5/3B3f/+7wcj/nJ6h//z8/P/8/Pz/+/v7//v7 - +//7+/v/+/v7/5GVm/+6wcj/en6D//v7+//5+fn/9PTz/6rLVf+95zv/zPc//836P//N+j//zvw9/9bL - KP/10h//9dIf/+jHHv+/oxj/po0UWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPQHyDz0B/59tQf/vLP - H//OsBr+n4sW/sfyPf/O/D7+zPg+/8LtO/6p0jX+krkv/sjXpP/39/j++vr6/oyRl/+tsrf+ubu+/v39 - /f/9/f3+/f39/v39/f/8/Pz+/Pz8/ra5vP+rsLX+kpaa/vz8/P/7+/v+wdST/6LLM/7C7Tz+zfg//835 - Pv7O+z7+yO08/+DBHf741B/+9tMf/+PCHf65nRfwspgVEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADz0B6q99Qf/vbTH//cvBv+qpEV/qy2Kv/P/T7+zfo+/8j0Pf624Dj+nMQy/o60Mf/K2ab++/v7/ufn - 6P+qrLD++fn6/v7+/v/+/v7+/v7+/v7+/v/+/v7+/f39/vr6+v+qrK/+6enq/vz9/P/D1Zj+kbgw/67X - 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 - mf9D9Zn/PuaO/yuXWf8eXjX7IIZL/x+CSP8eWTP0K5dZ/z7mjv9D9Zn/Q/WZ/0P1mf9B7pT/OdqF/y++ - cf4jnFm+HpBPPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByKSgEdjU2KLLZr/Tzii/9C85j/RPmc/0X7 - nf9E+Zz/QvaY/zzqjf8213//L6Bg/yF5RccqpWD/KJ1b/yFyQbcvoGD/Ntd//zzqjf9C9pj/RPmc/0X7 - nf9E+Zz/QvOY/zzii/8stmv9Ho5Oih2MTAEAAAAAAAAAAAAAAAAAAAAAIZZUiTPIeP9A7ZP/Q/WY/0P2 - mf9D9Zj/QfKV/0DylP8434X/NNN8/zvhif8wpWTYKJpZoDbFeP8wtWz/I4lOkDCkY9g74Yn/NNN8/zjf - hf9A8pT/QfKV/0P1mP9D9pn/Q/WY/0Dtk/8zyHj/IZdViQAAAAAAAAAAAAAAACeoYTk20n/9Q/aa/0Lz - l/9A7pL/QO2R/z7rjv8644f/M9J7/zfagv896I3/QOqR/zGsaHkuqmWfOM19/zO/c/8iiU6PLqVjeUDq - kf896I3/N9qC/zPSe/8644f/PuuO/0Dtkf9A7pL/QvOX/0P2mv820n/9KKpjOQAAAAAAAAAALrpur0P2 - mv9E95r/QvSX/0Dvk/885Yr/NdR9/zPQev8424P/PuuQ/0P1mf893onwM71yEjK6cJ84zn7/M8B0/yKN - UI8tqmUSPd6J8EP1mf8+65D/ONuD/zPQev811H3/POWK/0Dvk/9C9Jf/RPea/0P2mv8uu2+vAAAAAC26 - bgg73Yj2RPib/0P1mP8/65D/ONuD/zXVfv853IT/O+OJ/z7ojf9D9Jj/QvGW/zrahW8AAAAANMJ1nzjP - fv8yvnL/IYpPjwAAAAA52YRvQvGW/0P0mP8+6I3/O+OJ/znchP811X7/ONuD/z/rkP9D9Zj/RPib/zvd - iPYvvnEILbltIDzji/dA7pL/Od+G/znehf885Yv/PeaM/z7pjf8/64//QvKV/0Lyl/8524WrOduFAQAA - AAA0wXWfNsl6/y+yaf8efkaPAAAAADnZhAE524WrQvKX/0Lylf8/64//PumN/z3mjP885Yv/Od6F/znf - hv9A7pL/POOL9y++cSAAAAAAMs14Jjjbg6Q+6Y/5QPCU/0Lylv9B8JT/P+uQ/z/rkP884or9N9WBlDjS - fgUAAAAAAAAAAC2nYp8qpmH/IYhN/x1xPI8AAAAAAAAAADjQfAU31YCUPOKK/T/rkP8/65D/QfCU/0Ly - lv9A8JT/PumP+Tjbg6QzznkmAAAAAAAAAAAAAAAAM856ATndhhY63IZkOt2HnTvgibc414KxONN/hTvC - cCsAAAAAWGgiB15PEDhWUhljRGQpzEFhJv8/XCT/Qlkhw1dQE2FeTg41WGAdBgAAAAA7vm0rONJ/hTjX - grE74Im3Ot2HnTrchmQ63oYWNdN9AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABTgTYEXWEbVWFTELJkVA/1Z1cP/21cD/9xXxD/cV8Q/21cD/9rWQ//ZVUP/2FRD/9fTw/zXk8PrVpb - GU5QeTMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZ1cPWGdXD91xYA//h3IS/6iQFv/BpRn/yqwa/82vGv/QsRv/0rMb/9e4HP/KrRr/sZYX/4x2 - Ev9uXA//YlIP/2BQD9dfTw9PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAbFsPEWtaD7F8aBD/noYU/8CkGf/cvBz/7swe//TQH//00R//9NEf//PRH//00R//99Mf//fT - H//41B//89Af/9m6HP+ljBX/dWIQ/2NTD/9fTw6mX08ODAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAHFfDxp2ZBDWpIsV/9a3G//syh7/8M0e//HOH//VxSX/tbwp/5y0Lv+OsDD/iK8v/4et - Lv+NrS7/nLIs/7e7Kf/cySX/+tcg//bTH//Vthv/lH0T/2dWD/9fTw7NX04OEgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB3ZA8LemcQ0LqeGP/syh7/9dIf/+/NHv/PxCf/psIx/6DINP+iyzT/qNE2/67Y - OP+t1jf/q9Q2/6nSNf+hyTP/lr4x/4yzLv+Zsi3/1scm//nVH//pyB7/qI4W/2pYD/9fTw7GX08OBgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl0EZW/oxj/8c4f//fTH//kxR//r70t/6PLNP+y3Dj/wOs8/8bx - Pv/K9j7/zPg+/8z5Pv/N+T7/zPk+/8r2Pv/E7zz/td84/5/IMv+OtS//sboq//PRIP/qyR7/po0W/2lY - D/9hUQ6FAAAAAAAAAAAAAAAAAAAAAAAAAAChiRQlvaEY++3LHv/10h//5cUe/6vBL/+s1Tf/v+o8/8r2 - P//N+T//yPBG/7bPZf+ru3r/prGE/6axhP+ru3j/t9Fi/8rzRf/N+j7/xvI9/7TeOP+awjL/qbkr//LQ - H//lxB7/knsT/2RUD/dhUQ8aAAAAAAAAAAAAAAAAAAAAALecF4rkxB3/9dIf/+rJHv+2vCn/s904/8Xx - Pf/M+D//zPk//7rPdP+vsKv/uLi4/76+vv/AwMD/vr6+/7i4uP+vr6//paag/7TMav/M+D//zPg+/8Dr - O/+iyzT/wsAo//DNHv/LrRr/d2QQ/2NTD3oAAAAAAAAAAAAAAAAAAAAA07Ua0PPQH//z0R//zbMd/7HZ - N//G8j3/zPg//8j0PP++zpD/y8vL/9zc3P/k5OT/5+fn/+fn5//k5OT/39/f/9fX1//IyMj/s7Oz/66/ - ef/H8z3/zfk+/8LuO/+kyTP/4cMe/+fGHv+kixX/alkPwAAAAAAAAAAAAAAAAAAAAADjwh309dMf/+3L - Hv+0sST/v+o7/8z4P//H8zz/vNlk/9vb3P/s7Oz/UVJT/4ODhP/39/f/9vb2//T09P/x8fH/fH19/09P - UP/T09P/vLy9/7XVVf/L9z7/zPg+/7fiOP/QxCX/7cse/9CyG/99aRDmAAAAAAAAAAAAAAAA3b0bAefG - Hfr10h//5sUd/6y0Jv/B7Tv/y/c+/73pOv/I2Jr/7u7u//f39/8qLzX/Y2Zp//r6+v/6+vr/+fn5//f3 - 9/9WWVz/Njo//+jo6P/W1tb/u86C/8jzPv/N+T7/w+87/8zMKf/vzR7/378d/454EewAAAAAAAAAAAAA - AAAAAAAA7Moe5PXSH//jwx3/rLQm/8XyO//J9T3/t+E4/8nanf/09PT/+fn5/zlDT/9tc3r/+/v7//r6 - +v/5+fn/+Pj4/2Bmbv9GTlj/8/Pz/+np6f/D1or/x/I+/835P//J9jz/0tEq//DOHv/hwR3/moMT1AAA - AAAAAAAAAAAAAAAAAADxzh6t9tMf/+bFHf+sqCH/y/g9/8r2Pf+24Tj/rMlh//X19f/5+fn/foaP/5Sa - n//7+/v/+/v7//r6+v/6+vr/ipGY/4eNlP/6+vr/9PT0/7PUWf/J9D7/zfo//837Pv/ezif/9dIf/9+/ - HP+ojxWdAAAAAAAAAAAAAAAAAAAAAPPQH1X10h//7Moe/62VF//F7Dv/zfk+/77pOv+awTH/yNei//r6 - +v+hpKn/tbi7//39/f/9/f3//f39//39/f+ytbj/pais//39/f/E1pf/rdc2/8v3Pv/N+j7/yes6/+rJ - Hv/30x//1rcb/7KYFkUAAAAAAAAAAAAAAAAAAAAA89AfA/bTH9T20x//xqkY/6moI//O/D7/yvY+/7Hb - N/+RuTD/uc+F//X37//+/v7//v7+//7+/v/+/v7//v7+//7+/v/z9uz/tc19/5a9MP++6Tv/zfk//836 - P//DuyT/9tMf//HOHv/GqRjHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tMfOPnVH/nqyB3/s5kV/7G9 - K//O+z7/yPQ9/7DbN/+ZwTH/kbY3/7DJdf/K26T/1+S6/9fkuf/K26H/sMlx/5C2Nf+YvzD/teA4/8v3 - Pv/N+j//uL0q/+DAHP/51R//3Lwb9capGCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+tYfYPrX - H/3ryR3/t5wW/6uuJf/K9D3/y/c+/8DsO/+x2zf/o8sz/5vDMf+awjH/nMUx/6DJM/+m0DT/sdw3/8Lu - PP/N+T7/yfI9/7OyJf/PsRr/89Ef/+fFHfvPsBlSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA+9cfWfzYH/b00R7/y64Z/6aWGf+1xy7/yfM9/835Pv/K9j7/yfU+/8j0Pv/J9T7/y/Y+/8z5 - Pv/O+z7/yfM9/7bFLf+xnRr/1bYa//DOH//wzR7x3b0bTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA+9cfK/zYH8f71x//68kd/8+xGf+6ohn/uLMk/7jEK/+70jH/vdk1/73Z - Nf+80jH/tsEr/7OuIv+8oxn/2bob/+/NHv/41B//9tIfvu7LHSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+9cfAfzYH1L82B/E+9cf/vnVHv/z0R7/6MYd/929 - G//Wtxv/1rgb/96+HP/nxR3/89Ef//vXH//92R/9/NgfvvrWH0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61h8j+tcfbvzY - H6f92R/T/dkf7v3ZH/r92R/6/dkf7f3ZH9D92R+k/NgfafzYHx4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA//w///wAAD/wAAAPwAAAA8AAAAOAAAABgAAAAQAEIAAABCAAgAwwAcAg - BAP/AAD//gAAf/gAAB/wAAAP4AAAB+AAAAfAAAADwAAAA8AAAAPAAAADgAAAA8AAAAPAAAADwAAAA8AA - AAfgAAAH8AAAD/gAAB/8AAA//gAA///AA/8oAAAAGAAAADAAAAABACAAAAAAAGAJAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFmc5AhppOxEZZTgYGF00ERxYMScZaDfXGWk41RtZ - MR8YWzMRGWQ4GBppOxEXaDoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4VIESKb - V3QpsGbCMcN18jjRf/43zn7+MLNq/h9dNfgcdkH/G3M+/h9cNfcws2r+N85+/zjRf/4xw3XyKbBmwiKc - WHQbiUoRAAAAAAAAAAAAAAAAAAAAAAAAAAAci0xOKrJo7Dvji/5C9Zj+RPqc/kP4mv4+75H+N9mB/iV6 - R90ll1b+I45R/iV5R9E32YH+Pu+R/kP4mv5E+pz+QvWY/jvji/4qs2jsHY1NTgAAAAAAAAAAAAAAACGZ - VUMyyHf6QO+T/0H0lv9B85X+P/GT/znkiP80137+Ot2G/ymUV48zv3L/LKtk/iaLUYM63Yb+NNd+/znk - iP8/8ZL+QfOV/0H0lv9A75P+Msh3+iGbV0MAAAAAHodNAjLJeNdD95r+QfKV/z7sj/8644f+M9R8/zfb - gv8/7pH+O9iF5y+uaEA2ynr/LrRr/iWUVTQ72ITnP+6R/zfbgv8z1Hv+OuOH/z7sj/9B8pX+Q/ea/zLJ - edcil1cCK7drNkDwlP5C9pj+PuuP/jfbgf422H/+OuGG/j7tkP5B9Jf+OdiDZzK9cTc2zXz+LrNq/iGM - Tys41oJnQfSX/j7tkP464Yb+Nth//jfbgf4+64/+QvaY/kDwlP4tum42Lr9wPj3qj/E644n+OuOJ/z3o - jf896Y3+PuyQ/0Hylf853YWhAAAAADC4bjc0xHb/KJ9c/ht2QSsAAAAAOdyFoUHylf8+7JD+PemN/z3o - jf8644n+OuOJ/z3qj/Evw3M+AAAAADHMdhk64Yh/POaM0j7qj/k744r8Od2G2TfMeGtDp1kCSl4mAjh5 - P0csg0f/JW45/jJfKjtMWR8BRKFUAjjKdms53YXZO+OK/D7qj/k85ozSOuKIfzHNeBkAAAAAAAAAAAAA - AAAAAAAAAAAAADO7bwdBs2IKTY5CDFpkH2RhUw+1ZVUP7WtZD/5sWg/+aFcP/mVUD/5gTw7rXk4Pslhe - HF9LiUAJQLBhCjS+cAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtMDQNnVg5ublwP7Il0 - Ev+xlxb+zrAa/9W2Gv/YuBv/27sb/ty8G//Epxn+nIQU/3JfEP9hUQ/oXk4OZ1RGDQEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAaVkODnRiD7mfhxT+zrAa/+bEHP/wzh7+3Mci/8bBJv+8vib/vb4m/sjB - Jf/gyiL++NUf/+jGHf+rkRb+b1wP/15ODrFaSg0LAAAAAAAAAAAAAAAAAAAAAAAAAABqWQ4GfmoQwsqs - Gf/xzh7+7cwe/8fFKP+kwzH+nMUy/6PNNP+kzjT/ocoz/p3GMv+Tui/+lrMs/8bCJv/10x/+0rMa/3tn - Ef9eTg65WEkNAwAAAAAAAAAAAAAAAAAAAACQehKC0rMa/vbTHv7gxR/+qMIv/q7ZN/7B7Dv+yPQ9/sv3 - Pf7I8UL+yfJC/sz4Pf7H8zz+tuI4/pzFMf6htyz+6s0g/ta2G/53ZBD+YFAOdgAAAAAAAAAAAAAAAJ6H - Ew/Jqxjy89Ae/+PFHv+syTH+vOc6/8v3Pv/I8En+tMZ6/6qtnv+pqan/qKin/qaqmf+yxHT+yPBG/8j0 - PP+x3Df+pb0t/+/OH/+9oBj+aFcP7F5ODgkAAAAAAAAAAMWoF1Ttyx3+8c4e/rq+J/6/6zv+y/g9/sXp - U/7Cxbj+1tbW/t/f3/7h4eH+3t7e/tTU1P7ExMT+rbGh/r/kS/7M+D3+t+I3/sTBJv7lxBz+j3gT/mdW - DkgAAAAAAAAAANu6Gnr00R7+4sIc/7HOMf/K9j3+we06/87Ys//s7Oz+OTk7/9TU1P/39/f/9fX1/szM - zP85OTv+09PT/7fClf/H8z3+yvY8/7rRMP/syh3+w6YY/3ZjD24AAAAAAAAAAOXDHHb00R7+17ga/7PY - M//K9jz+s943/+fp4//39/f+KDA7/8bGyP/6+vr/+fn5/rm6u/8yOkP+7Ozs/9LVyf/B7Tv+zPk9/8Lh - NP/uzB3+07Qa/4dyEGoAAAAAAAAAAO7MHUr10h7+2Lga/rnVMf7K9zz+r9o2/tjiv/74+Pj+b3mD/snL - zP77+/v++vr6/sHDxf52f4j++Pj4/tTgtP7C7jv+zfo9/s/lM/7z0B7+1LUa/pqDEz4AAAAAAAAAAN+/ - Gwj10h7o5MMc/66xJP/O+z3+ueU4/6DBTf/t8eT+srW5/+vs7P/9/f3//f39/urr7P+0trr+7vLj/6jL - Sv/I9D3+zvs9/9XOJ//30x7+y60Y4KKKEwQAAAAAAAAAAAAAAAD20x5n9dEe/7ugFv+81TL+y/c9/67Y - Nf+YvD7+xtic/+zx3//7/Pr/+/z5/uvx3f/E15j+l7s7/7XgOP/N+T3+wdYx/+jHHf/syh3+w6YXWwAA - AAAAAAAAAAAAAAAAAAAAAAAA+tYeofDOHf65oBf+uMwv/sv3Pf675zn+ptA0/pjAMP6WvjL+mcAz/pzF - Mf6n0TT+veg5/sz5Pf68zS7+0LMa/vPQHv7TtBmWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6McbA/zY - HpD31B39z7AY/7CpIP+81TL+yvQ9/8r3Pf/J9j3/yvc9/sz5Pf/K9T3+vdQx/7asH//Wtxr+8tAe/ebE - G4bHqhcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD71x1D/Ngey/TRHf7iwRr+z7Ma/8O1 - IP+9uCP/vrgj/sGzH//Lrxr+5cQc//fUHv761h7G9dIdPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrXHTj61x6J/Ngew/zYHun71x76+9ge+vzYHuj92R7B/NkehvzY - HjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AA/AOAABwDAAAMAgAABAAAAAAAAAAAAAEIAAIAA - AQDwAA8A8AAPAOAABwDAAAMAwAADAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwDgAAcA4AAHAPgA - HwD+AH8AKAAAABAAAAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZn - OSEdfUdSIX1IZB5nO1wbZDfDG2Q2vh5mOlwhfUhkHn1HUhZpOiEAAAAAAAAAAAAAAAAAAAAAF3M+Iiqx - Z7484Yr+Q/aa/0Hylv8zvXH/IoFJ8CF7RuozvXH/QfKW/0P2mv884Yr+KrFnvhh4QSIAAAAAF2k7DjPJ - eeFB8ZX/QfGU/zvmi/843YT/N8d51DG2bc8qol/HNsV41DjdhP875ov/QfGU/0Hxlf8zyXnhGnRCDi67 - cGtD95r/PuqP/zjbgv853oX/QfKW/zjOflw1xnjPKqZhxzPBdVxB8pb/Od6F/zjbgv8+6o//Q/ea/zDA - c2syyHdPPOSL5j7pjv8/64//P+qQ/jvdh5EAAAAAMLZszyKKTscAAAAAO9yGkT/qkP4/64//PumO/zzk - i+YzzHlPAAAAACKGUAYwunBAPsVzWkmeUEJZaiRsYlUSplphHPJWWxnwX1EQpVdlIWlHmU5APcRyWjG7 - cUAji1MGAAAAAAAAAAAAAAAAPjUIBG1cD4KNeBP2vqIZ/929HP/hwR3/5cQd/9q7HP+ylxf/d2QQ9WBQ - Dn05LwgDAAAAAAAAAAAAAAAAPzUIAodyEbDXtxv/5sog/8PHKv+nwzD/nMMz/5rAMv+ivS7/v8Eo/+bJ - IP+jihX/YlEOqTctCAEAAAAAAAAAAJuEE23lxB3/28gj/6/SNf/C7jz/xOpK/7rXX/+7117/w+pI/7rl - Of+jxDH/3ski/6GJFf9hUQ5lAAAAAAAAAADYuRvW6Mge/7jZNv/J9T7/xNiE/8rKyf/T09P/zs7O/729 - u/+4zXX/yPQ9/7PQMv/hwR3/emcRzgAAAAAAAAAA7cse+82+If/G8Tz/wuNd/+vr6/9YWl3/+Pj4//X1 - 9f9WWFr/09PT/8HjVf/F8Tz/3soj/6+UFvQAAAAAAAAAAPLPH+TIuSD/yfU9/7nZXP/39/f/bnV+//v7 - +//5+fn/bnV9//Ly8v/B5Fj/zPk+/+XQJP/BpRjcAAAAAAAAAAD00R+K1bcb/8LiNv+13zj/w9aU/9LU - 1P/+/v7//f39/9LU1P/D15D/wew8/8rmN//yzx//wqYYgwAAAAAAAAAAtZsWDvbTH9XCrx3/w+Q3/7Xf - OP+lykb/ttFw/7fTcP+my0T/t+E5/8XlOP/XwCD/48Ic0JR+EgsAAAAAAAAAAAAAAADNsBkW+tYfuda5 - G//Cwyf/wtoz/8LlOP/D5jj/wdky/8XFJ//bvRz/8c4etLecFhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADvzR1F+tYeo/XSHt7ryh3568od+fXSHtz82B+h8M4dQgAAAAAAAAAAAAAAAAAAAADgBwAAgAEAAAAA - AAAAAAAAAkAAAIABAADAAwAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADwDwAA - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs b/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs deleted file mode 100644 index 17428ebc77..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs +++ /dev/null @@ -1,355 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Common.NumberExtensions; -using BizHawk.Emulation.Common; -using BizHawk.Client.EmuHawk.WinFormExtensions; - -namespace BizHawk.Client.EmuHawk -{ - public partial class BreakpointControl : UserControl - { - public IDebuggable Core { get; set; } - public IMemoryCallbackSystem MCS { get; set; } - public GenericDebugger ParentDebugger { get; set; } - public IMemoryDomains MemoryDomains { get; set; } - - private readonly BreakpointList _breakpoints = new BreakpointList(); - - public BreakpointControl() - { - InitializeComponent(); - BreakpointView.QueryItemText += BreakPointView_QueryItemText; - BreakpointView.QueryItemBkColor += BreakPointView_QueryItemBkColor; - BreakpointView.VirtualMode = true; - _breakpoints.Callback = BreakpointCallback; - } - - private void BreakpointControl_Load(object sender, EventArgs e) - { - UpdateStatsLabel(); - } - - private void BreakPointView_QueryItemText(int index, int column, out string text) - { - text = ""; - switch (column) - { - case 0: - text = $"{_breakpoints[index].Address:X}"; - break; - case 1: - text = $"{_breakpoints[index].AddressMask:X}"; - break; - case 2: - text = _breakpoints[index].Type.ToString(); - break; - case 3: - text = _breakpoints[index].Name; - break; - } - } - - private void BreakPointView_QueryItemBkColor(int index, int column, ref Color color) - { - color = _breakpoints[index].ReadOnly ? SystemColors.Control - : _breakpoints[index].Active ? Color.LightCyan - : Color.White; - } - - private void BreakpointCallback() - { - GlobalWin.MainForm.PauseEmulator(); - UpdateValues(); - GlobalWin.OSD.AddMessage("Breakpoint hit"); - } - - private void SeekCallback() - { - BreakpointCallback(); - - var seekBreakpoint = _breakpoints.FirstOrDefault(x => x.Name.StartsWith(SeekName)); - - if (seekBreakpoint != null) - { - _breakpoints.Remove(seekBreakpoint); - UpdateValues(); - } - - ParentDebugger.DisableCancelSeekBtn(); - } - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - if (Enabled) - { - CheckForNewBreakpoints(); - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateStatsLabel(); - } - } - - // Did any breakpoints get added from other sources such as lua? - private void CheckForNewBreakpoints() - { - if (MCS != null) - { - foreach (var callback in MCS) - { - if (!_breakpoints.Any(b => - b.Type == callback.Type && - b.Address == callback.Address && - b.AddressMask == callback.AddressMask && - b.Name == callback.Name && - b.Callback == callback.Callback)) - { - _breakpoints.Add(new Breakpoint(Core, callback)); - } - } - } - } - - public void GenerateUI() - { - if (MCS != null) - { - foreach (var callback in MCS) - { - _breakpoints.Add(new Breakpoint(Core, callback)); - } - - BreakpointView.ItemCount = _breakpoints.Count; - BreakpointView.Refresh(); - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - else - { - Enabled = false; - ParentDebugger.DisableBreakpointBox(); - } - } - - public void Shutdown() - { - _breakpoints.Clear(); - UpdateStatsLabel(); - } - - public void AddBreakpoint(uint address, uint mask, MemoryCallbackType type) - { - _breakpoints.Add(Core, MemoryDomains.SystemBus.Name, address, mask, type); - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - - private void AddBreakpointButton_Click(object sender, EventArgs e) - { - var b = CreateAddBreakpointDialog(BreakpointOperation.Add); - - if (b.ShowHawkDialog() == DialogResult.OK) - { - _breakpoints.Add(Core, MemoryDomains.SystemBus.Name, b.Address, b.AddressMask, b.BreakType); - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - - private const string SeekName = "Seek to PC 0x"; - - public void AddSeekBreakpoint(uint pcVal, int pcBitSize) - { - var name = SeekName + pcVal.ToHexString(pcBitSize / 4); - _breakpoints.Add(new Breakpoint(name, true, Core, MemoryDomains.SystemBus.Name, SeekCallback, pcVal, 0xFFFFFFFF, MemoryCallbackType.Execute)); - } - - public void RemoveCurrentSeek() - { - var seekBreakpoint = _breakpoints.FirstOrDefault(x => x.Name.StartsWith(SeekName)); - - if (seekBreakpoint != null) - { - _breakpoints.Remove(seekBreakpoint); - UpdateValues(); - } - } - - private IEnumerable SelectedIndices => BreakpointView.SelectedIndices.Cast(); - - private IEnumerable SelectedItems - { - get { return SelectedIndices.Select(index => _breakpoints[index]); } - } - - private IEnumerable EditableItems - { - get { return SelectedItems.Where(item => !item.ReadOnly); } - } - - private void RemoveBreakpointButton_Click(object sender, EventArgs e) - { - if (EditableItems.Any()) - { - var items = EditableItems.ToList(); - if (items.Any()) - { - foreach (var item in items) - { - _breakpoints.Remove(item); - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - } - } - - private void UpdateBreakpointRemoveButton() - { - ToggleButton.Enabled = - RemoveBreakpointButton.Enabled = - EditableItems.Any(); - - DuplicateBreakpointButton.Enabled = - EditBreakpointButton.Enabled = - EditableItems.Count() == 1; - } - - private void BreakpointView_SelectedIndexChanged(object sender, EventArgs e) - { - UpdateBreakpointRemoveButton(); - } - - private void BreakpointView_ItemActivate(object sender, EventArgs e) - { - if (EditableItems.Any()) - { - var items = EditableItems.ToList(); - if (items.Any()) - { - foreach (var item in items) - { - item.Active ^= true; - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - } - } - - private void BreakpointView_KeyDown(object sender, KeyEventArgs e) - { - if (!e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.Delete) // Delete - { - RemoveBreakpointButton_Click(null, null); - } - } - - private void UpdateStatsLabel() - { - BreakpointStatsLabel.Text = $"{_breakpoints.Count} Total / {_breakpoints.Count(b => b.Active)} Active"; - } - - private void ToggleButton_Click(object sender, EventArgs e) - { - foreach (var item in SelectedItems) - { - item.Active ^= true; - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateStatsLabel(); - } - - private void DuplicateBreakpointButton_Click(object sender, EventArgs e) - { - var breakpoint = SelectedItems.FirstOrDefault(); - - if (breakpoint != null && !breakpoint.ReadOnly) - { - var b = CreateAddBreakpointDialog(BreakpointOperation.Duplicate, breakpoint.Type, breakpoint.Address, breakpoint.AddressMask); - - if (b.ShowHawkDialog() == DialogResult.OK) - { - _breakpoints.Add(new Breakpoint(Core, MemoryDomains.SystemBus.Name, breakpoint.Callback, b.Address, b.AddressMask, b.BreakType, breakpoint.Active)); - } - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - - private void EditBreakpointButton_Click(object sender, EventArgs e) - { - var breakpoint = SelectedItems.FirstOrDefault(); - - if (breakpoint != null && !breakpoint.ReadOnly) - { - var b = CreateAddBreakpointDialog(BreakpointOperation.Edit, breakpoint.Type, breakpoint.Address, breakpoint.AddressMask); - - if (b.ShowHawkDialog() == DialogResult.OK) - { - breakpoint.Type = b.BreakType; - breakpoint.Address = b.Address; - breakpoint.AddressMask = b.AddressMask; - breakpoint.ResetCallback(); - } - } - - BreakpointView.ItemCount = _breakpoints.Count; - UpdateBreakpointRemoveButton(); - UpdateStatsLabel(); - } - - private AddBreakpointDialog CreateAddBreakpointDialog(BreakpointOperation op, MemoryCallbackType? type = null, uint? address = null, uint? mask = null) - { - var operation = (AddBreakpointDialog.BreakpointOperation)op; - - var b = new AddBreakpointDialog(operation) - { - MaxAddressSize = MemoryDomains.SystemBus.Size - 1 - }; - - if (type != null) - { - b.BreakType = (MemoryCallbackType)type; - } - - if (address != null) - { - b.Address = (uint)address; - } - - if (mask != null) - { - b.AddressMask = (uint)mask; - } - - if (!MCS.ExecuteCallbacksAvailable) - { - b.DisableExecuteOption(); - } - - return b; - } - - private enum BreakpointOperation - { - Add, Edit, Duplicate - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs deleted file mode 100644 index 133341652f..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs +++ /dev/null @@ -1,224 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GenericDebugger - { - private readonly List _disassemblyLines = new List(); - private int _pcRegisterSize = 4; - private uint _currentDisassemblerAddress; - - private class DisasmOp - { - public DisasmOp(uint address, int size, string mnemonic) - { - Address = address; - Size = size; - Mnemonic = mnemonic; - } - - public uint Address { get; } - public int Size { get; } - public string Mnemonic { get; } - } - - private long BusMaxValue => MemoryDomains.SystemBus.Size; - - private void UpdatePC() - { - if (CanDisassemble) - { - _currentDisassemblerAddress = (uint)PCRegister.Value; - } - } - - private void UpdateDisassembler() - { - if (CanDisassemble) - { - DisassemblerView.BlazingFast = true; - Disassemble(); - SetDisassemblerItemCount(); - DisassemblerView.BlazingFast = false; - } - } - - private void Disassemble() - { - int lineCount = DisassemblerView.NumberOfVisibleRows; - - _disassemblyLines.Clear(); - uint a = _currentDisassemblerAddress; - for (int i = 0; i <= lineCount; ++i) - { - int advance; - string line = Disassembler.Disassemble(MemoryDomains.SystemBus, a, out advance); - _disassemblyLines.Add(new DisasmOp(a, advance, line)); - a += (uint)advance; - if (a > BusMaxValue) - { - break; - } - } - } - - private void DisassemblerView_QueryItemText(int index, int column, out string text) - { - text = ""; - - if (index < _disassemblyLines.Count) - { - if (column == 0) - { - text = string.Format("{0:X" + _pcRegisterSize + "}", _disassemblyLines[index].Address); - } - else if (column == 1) - { - text = _disassemblyLines[index].Mnemonic; - } - } - } - - private void DisassemblerView_QueryItemBkColor(int index, int column, ref Color color) - { - if (_disassemblyLines.Any() && index < _disassemblyLines.Count) - { - if (_disassemblyLines[index].Address == _currentDisassemblerAddress) - { - color = Color.LightCyan; - } - } - } - - private void DecrementCurrentAddress() - { - uint newaddress = _currentDisassemblerAddress; - while (true) - { - int bytestoadvance; - Disassembler.Disassemble(MemoryDomains.SystemBus, newaddress, out bytestoadvance); - if (newaddress + bytestoadvance == _currentDisassemblerAddress) - { - break; - } - - newaddress--; - - if (newaddress < 0) - { - newaddress = 0; - break; - } - - // Just in case - if (_currentDisassemblerAddress - newaddress > 5) - { - newaddress = _currentDisassemblerAddress - 1; - break; - } - } - - _currentDisassemblerAddress = newaddress; - } - - private void IncrementCurrentAddress() - { - _currentDisassemblerAddress += (uint)_disassemblyLines.First().Size; - if (_currentDisassemblerAddress >= BusMaxValue) - { - _currentDisassemblerAddress = (uint)(BusMaxValue - 1); - } - } - - private void DisassemblerView_Scroll(object sender, ScrollEventArgs e) - { - if (e.Type == ScrollEventType.SmallIncrement) - { - IncrementCurrentAddress(); - Disassemble(); - DisassemblerView.Refresh(); - } - - if (e.Type == ScrollEventType.SmallDecrement) - { - DecrementCurrentAddress(); - Disassemble(); - DisassemblerView.Refresh(); - } - } - - private void SetDisassemblerItemCount() - { - DisassemblerView.ItemCount = DisassemblerView.NumberOfVisibleRows + 1; - } - - private void DisassemblerView_SizeChanged(object sender, EventArgs e) - { - SetDisassemblerItemCount(); - if (CanDisassemble) - { - Disassemble(); - } - } - - private void DisassemblerView_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.C) // Ctrl + C - { - CopySelectedDisassembler(); - } - } - - private void CopySelectedDisassembler() - { - var indices = DisassemblerView.SelectedIndices; - - if (indices.Count > 0) - { - var blob = new StringBuilder(); - foreach (int index in indices) - { - if (blob.Length != 0) - { - blob.AppendLine(); - } - - blob.Append(string.Format("{0:X" + _pcRegisterSize + "}", _disassemblyLines[index].Address)) - .Append(" ") - .Append(_disassemblyLines[index].Mnemonic); - } - - Clipboard.SetDataObject(blob.ToString()); - } - } - - private void OnPauseChanged(object sender, MainForm.PauseChangedEventArgs e) - { - if (e.Paused) - { - FullUpdate(); - } - } - - private void DisassemblerContextMenu_Opening(object sender, EventArgs e) - { - AddBreakpointContextMenuItem.Enabled = DisassemblerView.SelectedIndices.Count > 0; - } - - private void AddBreakpointContextMenuItem_Click(object sender, EventArgs e) - { - var indices = DisassemblerView.SelectedIndices; - - if (indices.Count > 0) - { - var line = _disassemblyLines[indices[0]]; - BreakPointControl1.AddBreakpoint(line.Address, 0xFFFFFFFF, Emulation.Common.MemoryCallbackType.Execute); - } - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs deleted file mode 100644 index c7f95fbc04..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GenericDebugger : IControlMainform - { - public bool WantsToControlSavestates { get { return false; } } - - public void SaveState() { } - public void LoadState() { } - public void SaveStateAs() { } - public void LoadStateAs() { } - public void SaveQuickSave(int slot) { } - public void LoadQuickSave(int slot) { } - public void SelectSlot(int slot) { } - public void PreviousSlot() { } - public void NextSlot() { } - - public bool WantsToControlReadOnly { get { return false; } } - public void ToggleReadOnly() { } - - public bool WantsToControlStopMovie { get { return false; } } - public void StopMovie(bool supressSave) { } - - // TODO: We probably want to do this - public bool WantsToControlRewind { get { return false; } } - public void CaptureRewind() { } - public bool Rewind() { return false; } - - public bool WantsToControlRestartMovie { get { return false; } } - public void RestartMovie() { } - - // TODO: We want to prevent movies and probably other things - } -} diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IToolForm.cs b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IToolForm.cs deleted file mode 100644 index ff1d792881..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IToolForm.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Client.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class GenericDebugger : IToolForm - { - [RequiredService] - private IDebuggable Debuggable { get; set; } - - [OptionalService] - private IDisassemblable Disassembler { get; set; } - - [RequiredService] - private IMemoryDomains MemoryDomains { get; set; } - - private IMemoryCallbackSystem MemoryCallbacks { get { return Debuggable.MemoryCallbacks; } } - - - private RegisterValue PCRegister - { - get { return Debuggable.GetCpuFlagsAndRegisters()[Disassembler.PCRegisterName]; } - } - - #region Implementation checking - - // TODO: be cachey with checks that depend on catching exceptions - private bool CanUseMemoryCallbacks - { - get - { - if (Debuggable != null) - { - try - { - var result = Debuggable.MemoryCallbacks.HasReads; - return true; - } - catch (NotImplementedException) - { - return false; - } - } - - return false; - } - } - - private bool CanDisassemble - { - get - { - if (Disassembler == null) - { - return false; - } - - try - { - var pc = (uint)PCRegister.Value; - return true; - } - catch (NotImplementedException) - { - return false; - } - - } - } - - private bool CanSetCpu - { - get - { - try - { - Disassembler.Cpu = Disassembler.Cpu; - return true; - } - catch (NotImplementedException) - { - return false; - } - } - } - - private bool CanStepInto - { - get - { - try - { - return Debuggable.CanStep(StepType.Into); - } - catch (NotImplementedException) - { - return false; - } - } - } - - private bool CanStepOver - { - get - { - try - { - return Debuggable.CanStep(StepType.Over); - } - catch (NotImplementedException) - { - return false; - } - } - } - - private bool CanStepOut - { - get - { - try - { - return Debuggable.CanStep(StepType.Out); - } - catch (NotImplementedException) - { - return false; - } - } - } - - #endregion - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - // Nothing to do - } - - private void FullUpdate() - { - RegisterPanel.UpdateValues(); - UpdatePC(); - UpdateDisassembler(); - BreakPointControl1.UpdateValues(); - } - - public void FastUpdate() - { - // Nothing to do - } - - public void Restart() - { - DisengageDebugger(); - EngageDebugger(); - } - - public bool AskSaveChanges() - { - // TODO - return true; - } - - public bool UpdateBefore - { - get { return false; } - } - } -} diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.resx b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.resx deleted file mode 100644 index ba660d4792..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.resx +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 229, 17 - - - 132, 17 - - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpWMf/m5ub/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUgo/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJBI/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpWMf8AAAAAAAAAAAAAAAAyOSD/eWId/3hjHf95Yx3/eWId/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARU4t/wAAAAB5ZR//eWUg/4fJpv+Bx5//ecKV/yt8 - Ov94ZB//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlFKP8AAAAAeWch/5zSuP+Z0rX/kc6u/zyN - U/95w5b/emYi/wAAAAAAAAAASk4x/wAAAAAAAAAAAAAAAAAAAAAyPiP/emgk/67cxv+038v/rtvH/1in - c/+Rzq//gcef/3poJP8yOSD/PU4t/wAAAAAAAAAAAAAAAAAAAABFTjH/OUUo/3tqJ//C59X/zOvb/3/B - kv+u28b/mdK2/4fJpv96ayf/AAAAAAAAAAAAAAAAAAAAAFNWOP9TVjj/AAAAAAAAAAB7bSr/zOrb/9vz - 5//M69v/tN/L/53SuP98bSr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr9zH/yJq - Lv/M69v/wubV/67cxv97byz/AAAAAAAAAAA9Ti3/SlYx/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvz - 5/+v28f/fHAt/3xwLf98cC3/8vLy/zI5IP85QSj/AAAAAAAAAAAAAAAAAAAAAEpWMf9KTjH/RU4t/z1I - KP98cC3/fHAt//Pz8/85RSj/8/Pz/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAPUgt/wAAAAAAAAAAAAAAAEVOMf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEpOMf8AAAAAAAAAAAAAAABTVjj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABOVjj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA+f8AAP3/AAD9/wAA3B8AAOgPAADoDQAA4AMAAMAPAAAwHwAA8DMAAPAPAAAAfwAA938AAPd/ - AAD3/////////w== - - - \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/RegisterBoxControl.cs b/BizHawk.Client.EmuHawk/tools/Debugger/RegisterBoxControl.cs deleted file mode 100644 index 9f6d273e8f..0000000000 --- a/BizHawk.Client.EmuHawk/tools/Debugger/RegisterBoxControl.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - -using BizHawk.Client.Common; -using BizHawk.Common.NumberExtensions; -using BizHawk.Emulation.Common; - -namespace BizHawk.Client.EmuHawk -{ - public partial class RegisterBoxControl : UserControl - { - public IDebuggable Core { get; set; } - public GenericDebugger ParentDebugger { get; set; } - - private bool _supressChangeEvents = false; - private bool _canGetCpuRegisters = false; - private bool _canSetCpuRegisters = false; - - public RegisterBoxControl() - { - InitializeComponent(); - AutoScroll = true; - } - - private void RegisterBoxControl_Load(object sender, EventArgs e) - { - } - - public void NewUpdate(ToolFormUpdateType type) { } - - public void UpdateValues() - { - if (this.Enabled) - { - var registers = Core.GetCpuFlagsAndRegisters(); - _supressChangeEvents = true; - - foreach (var register in registers) - { - if (Controls.OfType().Any(p => p.Name == "FlagPanel")) - { - Controls - .OfType() - .First(p => p.Name == "FlagPanel") - .Controls - .OfType() - .ToList() - .ForEach(checkbox => - { - if (checkbox.Name == register.Key) - { - checkbox.Checked = register.Value.Value == 1; - } - }); - } - - if (_canSetCpuRegisters) - { - Controls - .OfType() - .ToList() - .ForEach(textbox => - { - if (textbox.Name == register.Key) - { - textbox.Text = register.Value.Value.ToHexString(register.Value.BitSize / 4); - } - }); - } - else - { - Controls - .OfType