Super Mario World: Implement New Game (#1045)
This commit is contained in:
		
							parent
							
								
									885c8d3fcc
								
							
						
					
					
						commit
						13edfa60be
					
				| 
						 | 
				
			
			@ -132,7 +132,7 @@ components: Iterable[Component] = (
 | 
			
		|||
    Component('Text Client', 'CommonClient', 'ArchipelagoTextClient'),
 | 
			
		||||
    # SNI
 | 
			
		||||
    Component('SNI Client', 'SNIClient',
 | 
			
		||||
              file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3')),
 | 
			
		||||
              file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3', '.apsmw')),
 | 
			
		||||
    Component('LttP Adjuster', 'LttPAdjuster'),
 | 
			
		||||
    # Factorio
 | 
			
		||||
    Component('Factorio Client', 'FactorioClient'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								Patch.py
								
								
								
								
							
							
						
						
									
										1
									
								
								Patch.py
								
								
								
								
							| 
						 | 
				
			
			@ -171,6 +171,7 @@ GAME_SM = "Super Metroid"
 | 
			
		|||
GAME_SOE = "Secret of Evermore"
 | 
			
		||||
GAME_SMZ3 = "SMZ3"
 | 
			
		||||
GAME_DKC3 = "Donkey Kong Country 3"
 | 
			
		||||
GAME_SMW = "Super Mario World"
 | 
			
		||||
supported_games = {"A Link to the Past", "Super Metroid", "Secret of Evermore", "SMZ3", "Donkey Kong Country 3"}
 | 
			
		||||
 | 
			
		||||
preferred_endings = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ Currently, the following games are supported:
 | 
			
		|||
* Starcraft 2: Wings of Liberty
 | 
			
		||||
* Donkey Kong Country 3
 | 
			
		||||
* Dark Souls 3
 | 
			
		||||
* Super Mario World
 | 
			
		||||
 | 
			
		||||
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
 | 
			
		||||
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								SNIClient.py
								
								
								
								
							
							
						
						
									
										12
									
								
								SNIClient.py
								
								
								
								
							| 
						 | 
				
			
			@ -30,7 +30,7 @@ from worlds.sm.Rom import ROM_PLAYER_LIMIT as SM_ROM_PLAYER_LIMIT
 | 
			
		|||
from worlds.smz3.Rom import ROM_PLAYER_LIMIT as SMZ3_ROM_PLAYER_LIMIT
 | 
			
		||||
import Utils
 | 
			
		||||
from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
 | 
			
		||||
from Patch import GAME_ALTTP, GAME_SM, GAME_SMZ3, GAME_DKC3
 | 
			
		||||
from Patch import GAME_ALTTP, GAME_SM, GAME_SMZ3, GAME_DKC3, GAME_SMW
 | 
			
		||||
 | 
			
		||||
snes_logger = logging.getLogger("SNES")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -236,6 +236,10 @@ async def deathlink_kill_player(ctx: Context):
 | 
			
		|||
            snes_buffered_write(ctx, WRAM_START + 0x0A50, bytes([255])) # deal 255 of damage at next opportunity
 | 
			
		||||
            if not ctx.death_link_allow_survive:
 | 
			
		||||
                snes_buffered_write(ctx, WRAM_START + 0x09D6, bytes([0, 0]))  # set current reserve to 0
 | 
			
		||||
        elif ctx.game == GAME_SMW:
 | 
			
		||||
            from worlds.smw.Client import deathlink_kill_player as smw_deathlink_kill_player
 | 
			
		||||
            await smw_deathlink_kill_player(ctx)
 | 
			
		||||
 | 
			
		||||
        await snes_flush_writes(ctx)
 | 
			
		||||
        await asyncio.sleep(1)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1041,6 +1045,9 @@ async def game_watcher(ctx: Context):
 | 
			
		|||
 | 
			
		||||
            from worlds.dkc3.Client import dkc3_rom_init
 | 
			
		||||
            init_handled = await dkc3_rom_init(ctx)
 | 
			
		||||
            if not init_handled:
 | 
			
		||||
                from worlds.smw.Client import smw_rom_init
 | 
			
		||||
                init_handled = await smw_rom_init(ctx)
 | 
			
		||||
            if not init_handled:
 | 
			
		||||
                game_name = await snes_read(ctx, SM_ROMNAME_START, 5)
 | 
			
		||||
                if game_name is None:
 | 
			
		||||
| 
						 | 
				
			
			@ -1299,6 +1306,9 @@ async def game_watcher(ctx: Context):
 | 
			
		|||
        elif ctx.game == GAME_DKC3:
 | 
			
		||||
            from worlds.dkc3.Client import dkc3_game_watcher
 | 
			
		||||
            await dkc3_game_watcher(ctx)
 | 
			
		||||
        elif ctx.game == GAME_SMW:
 | 
			
		||||
            from worlds.smw.Client import smw_game_watcher
 | 
			
		||||
            await smw_game_watcher(ctx)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def run_game(romfile):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								Utils.py
								
								
								
								
							
							
						
						
									
										5
									
								
								Utils.py
								
								
								
								
							| 
						 | 
				
			
			@ -288,6 +288,11 @@ def get_default_options() -> OptionsType:
 | 
			
		|||
            "sni": "SNI",
 | 
			
		||||
            "rom_start": True,
 | 
			
		||||
        },
 | 
			
		||||
        "smw_options": {
 | 
			
		||||
            "rom_file": "Super Mario World (USA).sfc",
 | 
			
		||||
            "sni": "SNI",
 | 
			
		||||
            "rom_start": True,
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return options
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,3 +138,12 @@ dkc3_options:
 | 
			
		|||
  # True for operating system default program
 | 
			
		||||
  # Alternatively, a path to a program to open the .sfc file with
 | 
			
		||||
  rom_start: true
 | 
			
		||||
smw_options:
 | 
			
		||||
  # File name of the SMW US rom
 | 
			
		||||
  rom_file: "Super Mario World (USA).sfc"
 | 
			
		||||
  # Set this to your SNI folder location if you want the MultiClient to attempt an auto start, does nothing if not found
 | 
			
		||||
  sni: "SNI"
 | 
			
		||||
  # Set this to false to never autostart a rom (such as after patching)
 | 
			
		||||
  # True for operating system default program
 | 
			
		||||
  # Alternatively, a path to a program to open the .sfc file with
 | 
			
		||||
  rom_start: true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,7 @@ Name: "core";             Description: "Core Files"; Types: full hosting playing
 | 
			
		|||
Name: "generator";        Description: "Generator"; Types: full hosting
 | 
			
		||||
Name: "generator/sm";     Description: "Super Metroid ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "generator/dkc3";   Description: "Donkey Kong Country 3 ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "generator/smw";    Description: "Super Mario World ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "generator/soe";    Description: "Secret of Evermore ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "generator/lttp";   Description: "A Link to the Past ROM Setup and Enemizer"; Types: full hosting; ExtraDiskSpaceRequired: 5191680
 | 
			
		||||
Name: "generator/oot";    Description: "Ocarina of Time ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 100663296; Flags: disablenouninstallwarning
 | 
			
		||||
| 
						 | 
				
			
			@ -64,6 +65,7 @@ Name: "client/sni";       Description: "SNI Client"; Types: full playing
 | 
			
		|||
Name: "client/sni/lttp";  Description: "SNI Client - A Link to the Past Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "client/sni/sm";    Description: "SNI Client - Super Metroid Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "client/sni/dkc3";  Description: "SNI Client - Donkey Kong Country 3 Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "client/sni/smw";   Description: "SNI Client - Super Mario World Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
 | 
			
		||||
Name: "client/factorio";  Description: "Factorio"; Types: full playing
 | 
			
		||||
Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDiskSpaceRequired: 226894278
 | 
			
		||||
Name: "client/oot";       Description: "Ocarina of Time"; Types: full playing
 | 
			
		||||
| 
						 | 
				
			
			@ -79,6 +81,7 @@ NAME: "{app}"; Flags: setntfscompression; Permissions: everyone-modify users-mod
 | 
			
		|||
Source: "{code:GetROMPath}"; DestDir: "{app}"; DestName: "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"; Flags: external; Components: client/sni/lttp or generator/lttp
 | 
			
		||||
Source: "{code:GetSMROMPath}"; DestDir: "{app}"; DestName: "Super Metroid (JU).sfc"; Flags: external; Components: client/sni/sm or generator/sm
 | 
			
		||||
Source: "{code:GetDKC3ROMPath}"; DestDir: "{app}"; DestName: "Donkey Kong Country 3 - Dixie Kong's Double Trouble! (USA) (En,Fr).sfc"; Flags: external; Components: client/sni/dkc3 or generator/dkc3
 | 
			
		||||
Source: "{code:GetSMWROMPath}"; DestDir: "{app}"; DestName: "Super Mario World (USA).sfc"; Flags: external; Components: client/sni/smw or generator/smw
 | 
			
		||||
Source: "{code:GetSoEROMPath}"; DestDir: "{app}"; DestName: "Secret of Evermore (USA).sfc"; Flags: external; Components: generator/soe
 | 
			
		||||
Source: "{code:GetOoTROMPath}"; DestDir: "{app}"; DestName: "The Legend of Zelda - Ocarina of Time.z64"; Flags: external; Components: client/oot or generator/oot
 | 
			
		||||
Source: "{#source_path}\*"; Excludes: "*.sfc, *.log, data\sprites\alttpr, SNI, EnemizerCLI, Archipelago*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
 | 
			
		||||
| 
						 | 
				
			
			@ -151,6 +154,11 @@ Root: HKCR; Subkey: "{#MyAppName}dkc3patch";                     ValueData: "Arc
 | 
			
		|||
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\DefaultIcon";         ValueData: "{app}\ArchipelagoSNIClient.exe,0";                           ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\shell\open\command";  ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1""";                  ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
 | 
			
		||||
Root: HKCR; Subkey: ".apsmw";                                    ValueData: "{#MyAppName}smwpatch";        Flags: uninsdeletevalue; ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}smwpatch";                     ValueData: "Archipelago Super Mario World Patch"; Flags: uninsdeletekey;   ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}smwpatch\DefaultIcon";         ValueData: "{app}\ArchipelagoSNIClient.exe,0";                           ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}smwpatch\shell\open\command";  ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1""";                  ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
 | 
			
		||||
Root: HKCR; Subkey: ".apsmz3";                                 ValueData: "{#MyAppName}smz3patch";        Flags: uninsdeletevalue; ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}smz3patch";                     ValueData: "Archipelago SMZ3 Patch"; Flags: uninsdeletekey;   ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
Root: HKCR; Subkey: "{#MyAppName}smz3patch\DefaultIcon";         ValueData: "{app}\ArchipelagoSNIClient.exe,0";                           ValueType: string;  ValueName: ""; Components: client/sni
 | 
			
		||||
| 
						 | 
				
			
			@ -217,6 +225,9 @@ var SMRomFilePage: TInputFileWizardPage;
 | 
			
		|||
var dkc3rom: string;
 | 
			
		||||
var DKC3RomFilePage: TInputFileWizardPage;
 | 
			
		||||
 | 
			
		||||
var smwrom: string;
 | 
			
		||||
var SMWRomFilePage: TInputFileWizardPage;
 | 
			
		||||
 | 
			
		||||
var soerom: string;
 | 
			
		||||
var SoERomFilePage: TInputFileWizardPage;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -308,6 +319,8 @@ begin
 | 
			
		|||
    Result := not (SMROMFilePage.Values[0] = '')
 | 
			
		||||
  else if (assigned(DKC3ROMFilePage)) and (CurPageID = DKC3ROMFilePage.ID) then
 | 
			
		||||
    Result := not (DKC3ROMFilePage.Values[0] = '')
 | 
			
		||||
  else if (assigned(SMWROMFilePage)) and (CurPageID = SMWROMFilePage.ID) then
 | 
			
		||||
    Result := not (SMWROMFilePage.Values[0] = '')
 | 
			
		||||
  else if (assigned(SoEROMFilePage)) and (CurPageID = SoEROMFilePage.ID) then
 | 
			
		||||
    Result := not (SoEROMFilePage.Values[0] = '')
 | 
			
		||||
  else if (assigned(OoTROMFilePage)) and (CurPageID = OoTROMFilePage.ID) then
 | 
			
		||||
| 
						 | 
				
			
			@ -364,6 +377,22 @@ begin
 | 
			
		|||
    Result := '';
 | 
			
		||||
 end;
 | 
			
		||||
 | 
			
		||||
function GetSMWROMPath(Param: string): string;
 | 
			
		||||
begin
 | 
			
		||||
  if Length(smwrom) > 0 then
 | 
			
		||||
    Result := smwrom
 | 
			
		||||
  else if Assigned(SMWRomFilePage) then
 | 
			
		||||
    begin
 | 
			
		||||
      R := CompareStr(GetSNESMD5OfFile(SMWROMFilePage.Values[0]), 'cdd3c8c37322978ca8669b34bc89c804')
 | 
			
		||||
      if R <> 0 then
 | 
			
		||||
        MsgBox('Super Mario World ROM validation failed. Very likely wrong file.', mbInformation, MB_OK);
 | 
			
		||||
 | 
			
		||||
      Result := SMWROMFilePage.Values[0]
 | 
			
		||||
    end
 | 
			
		||||
  else
 | 
			
		||||
    Result := '';
 | 
			
		||||
 end;
 | 
			
		||||
 | 
			
		||||
function GetSoEROMPath(Param: string): string;
 | 
			
		||||
begin
 | 
			
		||||
  if Length(soerom) > 0 then
 | 
			
		||||
| 
						 | 
				
			
			@ -412,6 +441,10 @@ begin
 | 
			
		|||
  if Length(dkc3rom) = 0 then
 | 
			
		||||
    DKC3RomFilePage:= AddRomPage('Donkey Kong Country 3 - Dixie Kong''s Double Trouble! (USA) (En,Fr).sfc');
 | 
			
		||||
 | 
			
		||||
  smwrom := CheckRom('Super Mario World (USA).sfc', 'cdd3c8c37322978ca8669b34bc89c804');
 | 
			
		||||
  if Length(smwrom) = 0 then
 | 
			
		||||
    SMWRomFilePage:= AddRomPage('Super Mario World (USA).sfc');
 | 
			
		||||
 | 
			
		||||
  soerom := CheckRom('Secret of Evermore (USA).sfc', '6e9c94511d04fac6e0a1e582c170be3a');
 | 
			
		||||
  if Length(soerom) = 0 then
 | 
			
		||||
    SoEROMFilePage:= AddRomPage('Secret of Evermore (USA).sfc');
 | 
			
		||||
| 
						 | 
				
			
			@ -427,6 +460,8 @@ begin
 | 
			
		|||
    Result := not (WizardIsComponentSelected('client/sni/sm') or WizardIsComponentSelected('generator/sm'));
 | 
			
		||||
  if (assigned(DKC3ROMFilePage)) and (PageID = DKC3ROMFilePage.ID) then
 | 
			
		||||
    Result := not (WizardIsComponentSelected('client/sni/dkc3') or WizardIsComponentSelected('generator/dkc3'));
 | 
			
		||||
  if (assigned(SMWROMFilePage)) and (PageID = SMWROMFilePage.ID) then
 | 
			
		||||
    Result := not (WizardIsComponentSelected('client/sni/smw') or WizardIsComponentSelected('generator/smw'));
 | 
			
		||||
  if (assigned(SoEROMFilePage)) and (PageID = SoEROMFilePage.ID) then
 | 
			
		||||
    Result := not (WizardIsComponentSelected('generator/soe'));
 | 
			
		||||
  if (assigned(OoTROMFilePage)) and (PageID = OoTROMFilePage.ID) then
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,202 @@
 | 
			
		|||
 | 
			
		||||
mario_palettes = [
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x39, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0xB6, 0x30, 0xDF, 0x35, 0xFF, 0x03], # Mario
 | 
			
		||||
    [0x3F, 0x4F, 0x1D, 0x58, 0x40, 0x11, 0xE0, 0x3F, 0x07, 0x3C, 0xAE, 0x7C, 0xB3, 0x7D, 0x00, 0x2F, 0x5F, 0x16, 0xFF, 0x03], # Luigi
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x03, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x16, 0x02, 0xDF, 0x35, 0xFF, 0x03], # Wario
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x12, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x0D, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Waluigi
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x00, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x00, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Geno
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x16, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Princess
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0xE0, 0x00, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x80, 0x00, 0xDF, 0x35, 0xFF, 0x03], # Dark
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0xFF, 0x01, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x5F, 0x01, 0xDF, 0x35, 0xFF, 0x03], # Sponge
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fire_mario_palettes = [
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x17, 0x00, 0x1F, 0x00, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Mario
 | 
			
		||||
    [0x1F, 0x3B, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x40, 0x11, 0xE0, 0x01, 0xE0, 0x02, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Luigi
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x16, 0x02, 0x1F, 0x03, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Wario
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x0D, 0x58, 0x12, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Waluigi
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x00, 0x58, 0x00, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Geno
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x16, 0x58, 0x1F, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Princess
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Dark
 | 
			
		||||
    [0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x5F, 0x01, 0xFF, 0x01, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Sponge
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ow_mario_palettes = [
 | 
			
		||||
    [0x16, 0x00, 0x1F, 0x00], # Mario
 | 
			
		||||
    [0x80, 0x02, 0xE0, 0x03], # Luigi
 | 
			
		||||
    [0x16, 0x02, 0x1F, 0x03], # Wario
 | 
			
		||||
    [0x0D, 0x58, 0x12, 0x7C], # Waluigi
 | 
			
		||||
    [0x00, 0x58, 0x00, 0x7C], # Geno
 | 
			
		||||
    [0x16, 0x58, 0x1F, 0x7C], # Princess
 | 
			
		||||
    [0x80, 0x00, 0xE0, 0x00], # Dark
 | 
			
		||||
    [0x5F, 0x01, 0xFF, 0x01], # Sponge
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
level_music_address_data = [
 | 
			
		||||
    0x284DB,
 | 
			
		||||
    0x284DC,
 | 
			
		||||
    0x284DD,
 | 
			
		||||
    0x284DE,
 | 
			
		||||
    0x284DF,
 | 
			
		||||
    0x284E0,
 | 
			
		||||
    0x284E1,
 | 
			
		||||
    0x284E2,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
level_music_value_data = [
 | 
			
		||||
    0x02,
 | 
			
		||||
    0x06,
 | 
			
		||||
    0x01,
 | 
			
		||||
    0x08,
 | 
			
		||||
    0x07,
 | 
			
		||||
    0x03,
 | 
			
		||||
    0x05,
 | 
			
		||||
    0x12,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ow_music_address_data = [
 | 
			
		||||
    [0x25BC8, 0x20D8A],
 | 
			
		||||
    [0x25BC9, 0x20D8B],
 | 
			
		||||
    [0x25BCA, 0x20D8C],
 | 
			
		||||
    [0x25BCB, 0x20D8D],
 | 
			
		||||
    [0x25BCC, 0x20D8E],
 | 
			
		||||
    [0x25BCD, 0x20D8F],
 | 
			
		||||
    [0x25BCE, 0x20D90],
 | 
			
		||||
    [0x16C7]
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ow_music_value_data = [
 | 
			
		||||
    0x02,
 | 
			
		||||
    0x03,
 | 
			
		||||
    0x04,
 | 
			
		||||
    0x06,
 | 
			
		||||
    0x07,
 | 
			
		||||
    0x09,
 | 
			
		||||
    0x05,
 | 
			
		||||
    0x01,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
valid_foreground_palettes = {
 | 
			
		||||
    0x00: [0x00, 0x01, 0x03, 0x04, 0x05, 0x07], # Normal 1
 | 
			
		||||
    0x01: [0x03, 0x04, 0x05, 0x07],             # Castle 1
 | 
			
		||||
    0x02: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 1
 | 
			
		||||
    0x03: [0x02, 0x03, 0x04, 0x05, 0x07],       # Underground 1
 | 
			
		||||
    0x04: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Switch Palace 1
 | 
			
		||||
    0x05: [0x04, 0x05],                         # Ghost House 1
 | 
			
		||||
    0x06: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 2
 | 
			
		||||
    0x07: [0x00, 0x01, 0x03, 0x04, 0x05, 0x07], # Normal 2
 | 
			
		||||
    0x08: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 3
 | 
			
		||||
    0x09: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Underground 2
 | 
			
		||||
    0x0A: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Switch Palace 2
 | 
			
		||||
    0x0B: [0x03, 0x04, 0x05, 0x07],             # Castle 2
 | 
			
		||||
    #0x0C: [],                                  # Cloud/Forest
 | 
			
		||||
    0x0D: [0x04, 0x05],                         # Ghost House 2
 | 
			
		||||
    0x0E: [0x02, 0x03, 0x04, 0x05, 0x07],       # Underground 3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
valid_background_palettes = {
 | 
			
		||||
    0x06861B: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Ghost House Exit
 | 
			
		||||
    0xFFD900: [0x01],                                           # P. Hills
 | 
			
		||||
    0xFFDAB9: [0x04],                                           # Water
 | 
			
		||||
    0xFFDC71: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Hills & Clouds
 | 
			
		||||
    0xFFDD44: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Clouds
 | 
			
		||||
    0xFFDE54: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Small Hills
 | 
			
		||||
    0xFFDF59: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Mountains & Clouds
 | 
			
		||||
    0xFFE103: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Castle Pillars
 | 
			
		||||
    0xFFE472: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Big Hills
 | 
			
		||||
    0xFFE674: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Bonus
 | 
			
		||||
    0xFFE684: [0x01, 0x03, 0x05, 0x06],                         # Stars
 | 
			
		||||
    0xFFE7C0: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07],       # Mountains
 | 
			
		||||
    0xFFE8EE: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Empty/Layer 2
 | 
			
		||||
    0xFFE8FE: [0x01, 0x06],                                     # Cave
 | 
			
		||||
    0xFFEC82: [0x00, 0x02, 0x03, 0x05, 0x06, 0x07],             # Bushes
 | 
			
		||||
    0xFFEF80: [0x01, 0x03, 0x05, 0x06],                         # Ghost House
 | 
			
		||||
    0xFFF175: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06],             # Ghost Ship
 | 
			
		||||
    0xFFF45A: [0x01, 0x03, 0x06],                               # Castle
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
valid_background_colors = {
 | 
			
		||||
    0x06861B: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Ghost House Exit
 | 
			
		||||
    0xFFD900: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # P. Hills
 | 
			
		||||
    0xFFDAB9: [0x02, 0x03, 0x05],                               # Water
 | 
			
		||||
    0xFFDC71: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Hills & Clouds
 | 
			
		||||
    0xFFDD44: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Clouds
 | 
			
		||||
    0xFFDE54: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Small Hills
 | 
			
		||||
    0xFFDF59: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Mountains & Clouds
 | 
			
		||||
    0xFFE103: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Castle Pillars
 | 
			
		||||
    0xFFE472: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Big Hills
 | 
			
		||||
    0xFFE674: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Bonus
 | 
			
		||||
    0xFFE684: [0x02, 0x03, 0x04, 0x05],                         # Stars
 | 
			
		||||
    0xFFE7C0: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Mountains
 | 
			
		||||
    0xFFE8EE: [0x03, 0x05],                                     # Empty/Layer 2
 | 
			
		||||
    0xFFE8FE: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Cave
 | 
			
		||||
    0xFFEC82: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Bushes
 | 
			
		||||
    0xFFEF80: [0x03, 0x04],                                     # Ghost House
 | 
			
		||||
    0xFFF175: [0x02, 0x03, 0x04, 0x05],                         # Ghost Ship
 | 
			
		||||
    0xFFF45A: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Castle
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def generate_shuffled_level_music(world, player):
 | 
			
		||||
    shuffled_level_music = level_music_value_data.copy()
 | 
			
		||||
 | 
			
		||||
    if world.music_shuffle[player] == "consistent":
 | 
			
		||||
        world.random.shuffle(shuffled_level_music)
 | 
			
		||||
    elif world.music_shuffle[player] == "singularity":
 | 
			
		||||
        single_song = world.random.choice(shuffled_level_music)
 | 
			
		||||
        shuffled_level_music = [single_song for i in range(len(shuffled_level_music))]
 | 
			
		||||
 | 
			
		||||
    return shuffled_level_music
 | 
			
		||||
 | 
			
		||||
def generate_shuffled_ow_music(world, player):
 | 
			
		||||
    shuffled_ow_music = ow_music_value_data.copy()
 | 
			
		||||
 | 
			
		||||
    if world.music_shuffle[player] == "consistent" or world.music_shuffle[player] == "full":
 | 
			
		||||
        world.random.shuffle(shuffled_ow_music)
 | 
			
		||||
    elif world.music_shuffle[player] == "singularity":
 | 
			
		||||
        single_song = world.random.choice(shuffled_ow_music)
 | 
			
		||||
        shuffled_ow_music = [single_song for i in range(len(shuffled_ow_music))]
 | 
			
		||||
 | 
			
		||||
    return shuffled_ow_music
 | 
			
		||||
 | 
			
		||||
def generate_shuffled_header_data(rom, world, player):
 | 
			
		||||
    if world.music_shuffle[player] != "full" and not world.foreground_palette_shuffle[player] and not world.background_palette_shuffle[player]:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    for level_id in range(0, 0x200):
 | 
			
		||||
        layer1_ptr_list = list(rom.read_bytes(0x2E000 + level_id * 3, 3))
 | 
			
		||||
        layer1_ptr = (layer1_ptr_list[2] << 16 | layer1_ptr_list[1] << 8 | layer1_ptr_list[0])
 | 
			
		||||
 | 
			
		||||
        if layer1_ptr == 0x68000:
 | 
			
		||||
            # Unused Levels
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        if layer1_ptr >= 0x70000:
 | 
			
		||||
            layer1_ptr -= 0x8000
 | 
			
		||||
 | 
			
		||||
        layer1_ptr -= 0x38000
 | 
			
		||||
 | 
			
		||||
        level_header = list(rom.read_bytes(layer1_ptr, 5))
 | 
			
		||||
 | 
			
		||||
        tileset = level_header[4] & 0x0F
 | 
			
		||||
 | 
			
		||||
        if world.music_shuffle[player] == "full":
 | 
			
		||||
            level_header[2] &= 0x8F
 | 
			
		||||
            level_header[2] |= (world.random.randint(0, 7) << 5)
 | 
			
		||||
 | 
			
		||||
        if (world.foreground_palette_shuffle[player] and tileset in valid_foreground_palettes):
 | 
			
		||||
            level_header[3] &= 0xF8
 | 
			
		||||
            level_header[3] |= world.random.choice(valid_foreground_palettes[tileset])
 | 
			
		||||
 | 
			
		||||
        if world.background_palette_shuffle[player]:
 | 
			
		||||
            layer2_ptr_list = list(rom.read_bytes(0x2E600 + level_id * 3, 3))
 | 
			
		||||
            layer2_ptr = (layer2_ptr_list[2] << 16 | layer2_ptr_list[1] << 8 | layer2_ptr_list[0])
 | 
			
		||||
 | 
			
		||||
            if layer2_ptr in valid_background_palettes:
 | 
			
		||||
                level_header[0] &= 0x1F
 | 
			
		||||
                level_header[0] |= (world.random.choice(valid_background_palettes[layer2_ptr]) << 5)
 | 
			
		||||
 | 
			
		||||
            if layer2_ptr in valid_background_colors:
 | 
			
		||||
                level_header[1] &= 0x1F
 | 
			
		||||
                level_header[1] |= (world.random.choice(valid_background_colors[layer2_ptr]) << 5)
 | 
			
		||||
 | 
			
		||||
        rom.write_bytes(layer1_ptr, bytes(level_header))
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,455 @@
 | 
			
		|||
import logging
 | 
			
		||||
import asyncio
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
from NetUtils import ClientStatus, color
 | 
			
		||||
from worlds import AutoWorldRegister
 | 
			
		||||
from SNIClient import Context, snes_buffered_write, snes_flush_writes, snes_read
 | 
			
		||||
from .Names.TextBox import generate_received_text
 | 
			
		||||
from Patch import GAME_SMW
 | 
			
		||||
 | 
			
		||||
snes_logger = logging.getLogger("SNES")
 | 
			
		||||
 | 
			
		||||
ROM_START = 0x000000
 | 
			
		||||
WRAM_START = 0xF50000
 | 
			
		||||
WRAM_SIZE = 0x20000
 | 
			
		||||
SRAM_START = 0xE00000
 | 
			
		||||
 | 
			
		||||
SAVEDATA_START = WRAM_START + 0xF000
 | 
			
		||||
SAVEDATA_SIZE = 0x500
 | 
			
		||||
 | 
			
		||||
SMW_ROMHASH_START = 0x7FC0
 | 
			
		||||
ROMHASH_SIZE = 0x15
 | 
			
		||||
 | 
			
		||||
SMW_PROGRESS_DATA     = WRAM_START + 0x1F02
 | 
			
		||||
SMW_DRAGON_COINS_DATA = WRAM_START + 0x1F2F
 | 
			
		||||
SMW_PATH_DATA         = WRAM_START + 0x1EA2
 | 
			
		||||
SMW_EVENT_ROM_DATA    = ROM_START + 0x2D608
 | 
			
		||||
SMW_ACTIVE_LEVEL_DATA = ROM_START + 0x37F70
 | 
			
		||||
 | 
			
		||||
SMW_GOAL_DATA                = ROM_START + 0x01BFA0
 | 
			
		||||
SMW_REQUIRED_BOSSES_DATA     = ROM_START + 0x01BFA1
 | 
			
		||||
SMW_REQUIRED_EGGS_DATA       = ROM_START + 0x01BFA2
 | 
			
		||||
SMW_SEND_MSG_DATA            = ROM_START + 0x01BFA3
 | 
			
		||||
SMW_RECEIVE_MSG_DATA         = ROM_START + 0x01BFA4
 | 
			
		||||
SMW_DEATH_LINK_ACTIVE_ADDR   = ROM_START + 0x01BFA5
 | 
			
		||||
SMW_DRAGON_COINS_ACTIVE_ADDR = ROM_START + 0x01BFA6
 | 
			
		||||
SMW_SWAMP_DONUT_GH_ADDR      = ROM_START + 0x01BFA7
 | 
			
		||||
 | 
			
		||||
SMW_GAME_STATE_ADDR    = WRAM_START + 0x100
 | 
			
		||||
SMW_MARIO_STATE_ADDR   = WRAM_START + 0x71
 | 
			
		||||
SMW_BOSS_STATE_ADDR    = WRAM_START + 0xD9B
 | 
			
		||||
SMW_ACTIVE_BOSS_ADDR   = WRAM_START + 0x13FC
 | 
			
		||||
SMW_CURRENT_LEVEL_ADDR = WRAM_START + 0x13BF
 | 
			
		||||
SMW_MESSAGE_BOX_ADDR   = WRAM_START + 0x1426
 | 
			
		||||
SMW_BONUS_STAR_ADDR    = WRAM_START + 0xF48
 | 
			
		||||
SMW_EGG_COUNT_ADDR     = WRAM_START + 0x1F24
 | 
			
		||||
SMW_BOSS_COUNT_ADDR    = WRAM_START + 0x1F26
 | 
			
		||||
SMW_NUM_EVENTS_ADDR    = WRAM_START + 0x1F2E
 | 
			
		||||
SMW_SFX_ADDR           = WRAM_START + 0x1DFC
 | 
			
		||||
SMW_PAUSE_ADDR         = WRAM_START + 0x13D4
 | 
			
		||||
SMW_MESSAGE_QUEUE_ADDR = WRAM_START + 0xC391
 | 
			
		||||
 | 
			
		||||
SMW_RECV_PROGRESS_ADDR = WRAM_START + 0x1F2B
 | 
			
		||||
 | 
			
		||||
SMW_GOAL_LEVELS          = [0x28, 0x31, 0x32]
 | 
			
		||||
SMW_INVALID_MARIO_STATES = [0x05, 0x06, 0x0A, 0x0C, 0x0D]
 | 
			
		||||
SMW_BAD_TEXT_BOX_LEVELS  = [0x26, 0x02, 0x4B]
 | 
			
		||||
SMW_BOSS_STATES          = [0x80, 0xC0, 0xC1]
 | 
			
		||||
SMW_UNCOLLECTABLE_LEVELS = [0x25, 0x07, 0x0B, 0x40, 0x0E, 0x1F, 0x20, 0x1B, 0x1A, 0x35, 0x34, 0x31, 0x32]
 | 
			
		||||
 | 
			
		||||
async def deathlink_kill_player(ctx: Context):
 | 
			
		||||
    if ctx.game == GAME_SMW:
 | 
			
		||||
        game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
 | 
			
		||||
        if game_state[0] != 0x14:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
 | 
			
		||||
        if mario_state[0] != 0x00:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
 | 
			
		||||
        if message_box[0] != 0x00:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        pause_state = await snes_read(ctx, SMW_PAUSE_ADDR, 0x1)
 | 
			
		||||
        if pause_state[0] != 0x00:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x9D, bytes([0x30])) # Freeze Gameplay
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x1DFB, bytes([0x09])) # Death Music
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x0DDA, bytes([0xFF])) # Flush Music Buffer
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x1407, bytes([0x00])) # Flush Cape Fly Phase
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x140D, bytes([0x00])) # Flush Spin Jump Flag
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x188A, bytes([0x00])) # Flush Empty Byte because the game does it
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x7D, bytes([0x90])) # Mario Y Speed
 | 
			
		||||
        snes_buffered_write(ctx, WRAM_START + 0x1496, bytes([0x30])) # Death Timer
 | 
			
		||||
        snes_buffered_write(ctx, SMW_MARIO_STATE_ADDR, bytes([0x09])) # Mario State -> Dead
 | 
			
		||||
 | 
			
		||||
        await snes_flush_writes(ctx)
 | 
			
		||||
 | 
			
		||||
        from SNIClient import DeathState
 | 
			
		||||
        ctx.death_state = DeathState.dead
 | 
			
		||||
        ctx.last_death_link = time.time()
 | 
			
		||||
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def smw_rom_init(ctx: Context):
 | 
			
		||||
    if not ctx.rom:
 | 
			
		||||
        ctx.finished_game = False
 | 
			
		||||
        ctx.death_link_allow_survive = False
 | 
			
		||||
        game_hash = await snes_read(ctx, SMW_ROMHASH_START, ROMHASH_SIZE)
 | 
			
		||||
        if game_hash is None or game_hash == bytes([0] * ROMHASH_SIZE) or game_hash[:3] != b"SMW":
 | 
			
		||||
            return False
 | 
			
		||||
        else:
 | 
			
		||||
            ctx.game = GAME_SMW
 | 
			
		||||
            ctx.items_handling = 0b111  # remote items
 | 
			
		||||
 | 
			
		||||
        ctx.rom = game_hash
 | 
			
		||||
 | 
			
		||||
        receive_option = await snes_read(ctx, SMW_RECEIVE_MSG_DATA, 0x1)
 | 
			
		||||
        send_option = await snes_read(ctx, SMW_SEND_MSG_DATA, 0x1)
 | 
			
		||||
 | 
			
		||||
        ctx.receive_option = receive_option[0]
 | 
			
		||||
        ctx.send_option = send_option[0]
 | 
			
		||||
 | 
			
		||||
        ctx.message_queue = []
 | 
			
		||||
 | 
			
		||||
        ctx.allow_collect = True
 | 
			
		||||
 | 
			
		||||
        death_link = await snes_read(ctx, SMW_DEATH_LINK_ACTIVE_ADDR, 1)
 | 
			
		||||
        if death_link:
 | 
			
		||||
            await ctx.update_death_link(bool(death_link[0] & 0b1))
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def add_message_to_queue(ctx: Context, new_message):
 | 
			
		||||
 | 
			
		||||
    if not hasattr(ctx, "message_queue"):
 | 
			
		||||
        ctx.message_queue = []
 | 
			
		||||
 | 
			
		||||
    ctx.message_queue.append(new_message)
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def handle_message_queue(ctx: Context):
 | 
			
		||||
 | 
			
		||||
    game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
 | 
			
		||||
    if game_state[0] != 0x14:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
 | 
			
		||||
    if mario_state[0] != 0x00:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
 | 
			
		||||
    if message_box[0] != 0x00:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    pause_state = await snes_read(ctx, SMW_PAUSE_ADDR, 0x1)
 | 
			
		||||
    if pause_state[0] != 0x00:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
 | 
			
		||||
    if current_level[0] in SMW_BAD_TEXT_BOX_LEVELS:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    boss_state = await snes_read(ctx, SMW_BOSS_STATE_ADDR, 0x1)
 | 
			
		||||
    if boss_state[0] in SMW_BOSS_STATES:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    active_boss = await snes_read(ctx, SMW_ACTIVE_BOSS_ADDR, 0x1)
 | 
			
		||||
    if active_boss[0] != 0x00:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if not hasattr(ctx, "message_queue") or len(ctx.message_queue) == 0:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    next_message = ctx.message_queue.pop(0)
 | 
			
		||||
 | 
			
		||||
    snes_buffered_write(ctx, SMW_MESSAGE_QUEUE_ADDR, bytes(next_message))
 | 
			
		||||
    snes_buffered_write(ctx, SMW_MESSAGE_BOX_ADDR, bytes([0x03]))
 | 
			
		||||
    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x22]))
 | 
			
		||||
 | 
			
		||||
    await snes_flush_writes(ctx)
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def smw_game_watcher(ctx: Context):
 | 
			
		||||
    if ctx.game == GAME_SMW:
 | 
			
		||||
        # SMW_TODO: Handle Deathlink
 | 
			
		||||
        game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
 | 
			
		||||
        mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
 | 
			
		||||
        if game_state is None:
 | 
			
		||||
            # We're not properly connected
 | 
			
		||||
            return
 | 
			
		||||
        elif game_state[0] >= 0x18:
 | 
			
		||||
            if not ctx.finished_game:
 | 
			
		||||
                current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
 | 
			
		||||
 | 
			
		||||
                if current_level[0] in SMW_GOAL_LEVELS:
 | 
			
		||||
                    await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}])
 | 
			
		||||
                    ctx.finished_game = True
 | 
			
		||||
            return
 | 
			
		||||
        elif game_state[0] < 0x0B:
 | 
			
		||||
            # We haven't loaded a save file
 | 
			
		||||
            ctx.message_queue = []
 | 
			
		||||
            return
 | 
			
		||||
        elif mario_state[0] in SMW_INVALID_MARIO_STATES:
 | 
			
		||||
            # Mario can't come to the phone right now
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        if "DeathLink" in ctx.tags and game_state[0] == 0x14 and ctx.last_death_link + 1 < time.time():
 | 
			
		||||
            currently_dead = mario_state[0] == 0x09
 | 
			
		||||
            await ctx.handle_deathlink_state(currently_dead)
 | 
			
		||||
 | 
			
		||||
        # Check for Egg Hunt ending
 | 
			
		||||
        goal = await snes_read(ctx, SMW_GOAL_DATA, 0x1)
 | 
			
		||||
        if game_state[0] == 0x14 and goal[0] == 1:
 | 
			
		||||
            current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
 | 
			
		||||
            message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
 | 
			
		||||
            egg_count = await snes_read(ctx, SMW_EGG_COUNT_ADDR, 0x1)
 | 
			
		||||
            required_egg_count = await snes_read(ctx, SMW_REQUIRED_EGGS_DATA, 0x1)
 | 
			
		||||
 | 
			
		||||
            if current_level[0] == 0x28 and message_box[0] == 0x01 and egg_count[0] >= required_egg_count[0]:
 | 
			
		||||
                snes_buffered_write(ctx, WRAM_START + 0x13C6, bytes([0x08]))
 | 
			
		||||
                snes_buffered_write(ctx, WRAM_START + 0x13CE, bytes([0x01]))
 | 
			
		||||
                snes_buffered_write(ctx, WRAM_START + 0x1DE9, bytes([0x01]))
 | 
			
		||||
                snes_buffered_write(ctx, SMW_GAME_STATE_ADDR, bytes([0x18]))
 | 
			
		||||
 | 
			
		||||
                await snes_flush_writes(ctx)
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        egg_count     = await snes_read(ctx, SMW_EGG_COUNT_ADDR, 0x1)
 | 
			
		||||
        boss_count    = await snes_read(ctx, SMW_BOSS_COUNT_ADDR, 0x1)
 | 
			
		||||
        display_count = await snes_read(ctx, SMW_BONUS_STAR_ADDR, 0x1)
 | 
			
		||||
 | 
			
		||||
        if goal[0] == 0 and boss_count[0] > display_count[0]:
 | 
			
		||||
            snes_buffered_write(ctx, SMW_BONUS_STAR_ADDR, bytes([boss_count[0]]))
 | 
			
		||||
            await snes_flush_writes(ctx)
 | 
			
		||||
        elif goal[0] == 1 and egg_count[0] > display_count[0]:
 | 
			
		||||
            snes_buffered_write(ctx, SMW_BONUS_STAR_ADDR, bytes([egg_count[0]]))
 | 
			
		||||
            await snes_flush_writes(ctx)
 | 
			
		||||
 | 
			
		||||
        await handle_message_queue(ctx)
 | 
			
		||||
 | 
			
		||||
        new_checks = []
 | 
			
		||||
        event_data = await snes_read(ctx, SMW_EVENT_ROM_DATA, 0x60)
 | 
			
		||||
        progress_data = bytearray(await snes_read(ctx, SMW_PROGRESS_DATA, 0x0F))
 | 
			
		||||
        dragon_coins_data = bytearray(await snes_read(ctx, SMW_DRAGON_COINS_DATA, 0x0C))
 | 
			
		||||
        dragon_coins_active = await snes_read(ctx, SMW_DRAGON_COINS_ACTIVE_ADDR, 0x1)
 | 
			
		||||
        from worlds.smw.Rom import item_rom_data, ability_rom_data
 | 
			
		||||
        from worlds.smw.Levels import location_id_to_level_id, level_info_dict
 | 
			
		||||
        for loc_name, level_data in location_id_to_level_id.items():
 | 
			
		||||
            loc_id = AutoWorldRegister.world_types[ctx.game].location_name_to_id[loc_name]
 | 
			
		||||
            if loc_id not in ctx.locations_checked:
 | 
			
		||||
 | 
			
		||||
                event_id = event_data[level_data[0]]
 | 
			
		||||
 | 
			
		||||
                if level_data[1] == 2:
 | 
			
		||||
                    # Dragon Coins Check
 | 
			
		||||
                    if not dragon_coins_active or dragon_coins_active[0] == 0:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    progress_byte = (level_data[0] // 8)
 | 
			
		||||
                    progress_bit  = 7 - (level_data[0] % 8)
 | 
			
		||||
 | 
			
		||||
                    data = dragon_coins_data[progress_byte]
 | 
			
		||||
                    masked_data = data & (1 << progress_bit)
 | 
			
		||||
                    bit_set = (masked_data != 0)
 | 
			
		||||
 | 
			
		||||
                    if bit_set:
 | 
			
		||||
                        # SMW_TODO: Handle non-included checks
 | 
			
		||||
                        new_checks.append(loc_id)
 | 
			
		||||
                else:
 | 
			
		||||
                    event_id_value = event_id + level_data[1]
 | 
			
		||||
 | 
			
		||||
                    progress_byte = (event_id_value // 8)
 | 
			
		||||
                    progress_bit  = 7 - (event_id_value % 8)
 | 
			
		||||
 | 
			
		||||
                    data = progress_data[progress_byte]
 | 
			
		||||
                    masked_data = data & (1 << progress_bit)
 | 
			
		||||
                    bit_set = (masked_data != 0)
 | 
			
		||||
 | 
			
		||||
                    if bit_set:
 | 
			
		||||
                        # SMW_TODO: Handle non-included checks
 | 
			
		||||
                        new_checks.append(loc_id)
 | 
			
		||||
 | 
			
		||||
        verify_game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
 | 
			
		||||
        if verify_game_state is None or verify_game_state[0] < 0x0B or verify_game_state[0] > 0x29:
 | 
			
		||||
            # We have somehow exited the save file (or worse)
 | 
			
		||||
            print("Exit Save File")
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        rom = await snes_read(ctx, SMW_ROMHASH_START, ROMHASH_SIZE)
 | 
			
		||||
        if rom != ctx.rom:
 | 
			
		||||
            ctx.rom = None
 | 
			
		||||
            print("Exit ROM")
 | 
			
		||||
            # We have somehow loaded a different ROM
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        for new_check_id in new_checks:
 | 
			
		||||
            ctx.locations_checked.add(new_check_id)
 | 
			
		||||
            location = ctx.location_names[new_check_id]
 | 
			
		||||
            snes_logger.info(
 | 
			
		||||
                f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})')
 | 
			
		||||
            await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}])
 | 
			
		||||
 | 
			
		||||
        if game_state[0] != 0x14:
 | 
			
		||||
            # Don't receive items or collect locations outside of in-level mode
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        recv_count = await snes_read(ctx, SMW_RECV_PROGRESS_ADDR, 1)
 | 
			
		||||
        recv_index = recv_count[0]
 | 
			
		||||
 | 
			
		||||
        if recv_index < len(ctx.items_received):
 | 
			
		||||
            item = ctx.items_received[recv_index]
 | 
			
		||||
            recv_index += 1
 | 
			
		||||
            logging.info('Received %s from %s (%s) (%d/%d in list)' % (
 | 
			
		||||
                color(ctx.item_names[item.item], 'red', 'bold'),
 | 
			
		||||
                color(ctx.player_names[item.player], 'yellow'),
 | 
			
		||||
                ctx.location_names[item.location], recv_index, len(ctx.items_received)))
 | 
			
		||||
 | 
			
		||||
            if ctx.receive_option == 1 or (ctx.receive_option == 2 and ((item.flags & 1) != 0)):
 | 
			
		||||
                if item.item != 0xBC0012:
 | 
			
		||||
                    # Don't send messages for Boss Tokens
 | 
			
		||||
                    item_name = ctx.item_names[item.item]
 | 
			
		||||
                    player_name = ctx.player_names[item.player]
 | 
			
		||||
 | 
			
		||||
                    receive_message = generate_received_text(item_name, player_name)
 | 
			
		||||
                    add_message_to_queue(ctx, receive_message)
 | 
			
		||||
 | 
			
		||||
            snes_buffered_write(ctx, SMW_RECV_PROGRESS_ADDR, bytes([recv_index]))
 | 
			
		||||
            if item.item in item_rom_data:
 | 
			
		||||
                item_count = await snes_read(ctx, WRAM_START + item_rom_data[item.item][0], 0x1)
 | 
			
		||||
                increment = item_rom_data[item.item][1]
 | 
			
		||||
 | 
			
		||||
                new_item_count = item_count[0]
 | 
			
		||||
                if increment > 1:
 | 
			
		||||
                    new_item_count = increment
 | 
			
		||||
                else:
 | 
			
		||||
                    new_item_count += increment
 | 
			
		||||
 | 
			
		||||
                if verify_game_state[0] == 0x14 and len(item_rom_data[item.item]) > 2:
 | 
			
		||||
                    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([item_rom_data[item.item][2]]))
 | 
			
		||||
 | 
			
		||||
                snes_buffered_write(ctx, WRAM_START + item_rom_data[item.item][0], bytes([new_item_count]))
 | 
			
		||||
            elif item.item in ability_rom_data:
 | 
			
		||||
                # Handle Upgrades
 | 
			
		||||
                for rom_data in ability_rom_data[item.item]:
 | 
			
		||||
                    data = await snes_read(ctx, WRAM_START + rom_data[0], 1)
 | 
			
		||||
                    masked_data = data[0] | (1 << rom_data[1])
 | 
			
		||||
                    snes_buffered_write(ctx, WRAM_START + rom_data[0], bytes([masked_data]))
 | 
			
		||||
                    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E])) # SMW_TODO: Custom sounds for each
 | 
			
		||||
            elif item.item == 0xBC000A:
 | 
			
		||||
                # Handle Progressive Powerup
 | 
			
		||||
                data = await snes_read(ctx, WRAM_START + 0x1F2D, 1)
 | 
			
		||||
                mushroom_data = data[0] & (1 << 0)
 | 
			
		||||
                fire_flower_data = data[0] & (1 << 1)
 | 
			
		||||
                cape_data = data[0] & (1 << 2)
 | 
			
		||||
                if mushroom_data == 0:
 | 
			
		||||
                    masked_data = data[0] | (1 << 0)
 | 
			
		||||
                    snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
 | 
			
		||||
                    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E]))
 | 
			
		||||
                elif fire_flower_data == 0:
 | 
			
		||||
                    masked_data = data[0] | (1 << 1)
 | 
			
		||||
                    snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
 | 
			
		||||
                    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E]))
 | 
			
		||||
                elif cape_data == 0:
 | 
			
		||||
                    masked_data = data[0] | (1 << 2)
 | 
			
		||||
                    snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
 | 
			
		||||
                    snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x41]))
 | 
			
		||||
                else:
 | 
			
		||||
                    # Extra Powerup?
 | 
			
		||||
                    pass
 | 
			
		||||
            elif item.item == 0xBC0015:
 | 
			
		||||
                # Handle Literature Trap
 | 
			
		||||
                from .Names.LiteratureTrap import lit_trap_text_list
 | 
			
		||||
                import random
 | 
			
		||||
                rand_trap = random.choice(lit_trap_text_list)
 | 
			
		||||
 | 
			
		||||
                for message in rand_trap:
 | 
			
		||||
                    add_message_to_queue(ctx, message)
 | 
			
		||||
 | 
			
		||||
            await snes_flush_writes(ctx)
 | 
			
		||||
 | 
			
		||||
        # Handle Collected Locations
 | 
			
		||||
        new_events = 0
 | 
			
		||||
        path_data = bytearray(await snes_read(ctx, SMW_PATH_DATA, 0x60))
 | 
			
		||||
        donut_gh_swapped = await snes_read(ctx, SMW_SWAMP_DONUT_GH_ADDR, 0x1)
 | 
			
		||||
        new_dragon_coin = False
 | 
			
		||||
        for loc_id in ctx.checked_locations:
 | 
			
		||||
            if loc_id not in ctx.locations_checked:
 | 
			
		||||
                ctx.locations_checked.add(loc_id)
 | 
			
		||||
                loc_name = ctx.location_names[loc_id]
 | 
			
		||||
 | 
			
		||||
                if loc_name not in location_id_to_level_id:
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                level_data = location_id_to_level_id[loc_name]
 | 
			
		||||
 | 
			
		||||
                if level_data[1] == 2:
 | 
			
		||||
                    # Dragon Coins Check
 | 
			
		||||
 | 
			
		||||
                    progress_byte = (level_data[0] // 8)
 | 
			
		||||
                    progress_bit  = 7 - (level_data[0] % 8)
 | 
			
		||||
 | 
			
		||||
                    data = dragon_coins_data[progress_byte]
 | 
			
		||||
                    new_data = data | (1 << progress_bit)
 | 
			
		||||
                    dragon_coins_data[progress_byte] = new_data
 | 
			
		||||
 | 
			
		||||
                    new_dragon_coin = True
 | 
			
		||||
                else:
 | 
			
		||||
                    if level_data[0] in SMW_UNCOLLECTABLE_LEVELS:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    event_id = event_data[level_data[0]]
 | 
			
		||||
                    event_id_value = event_id + level_data[1]
 | 
			
		||||
 | 
			
		||||
                    progress_byte = (event_id_value // 8)
 | 
			
		||||
                    progress_bit  = 7 - (event_id_value % 8)
 | 
			
		||||
 | 
			
		||||
                    data = progress_data[progress_byte]
 | 
			
		||||
                    masked_data = data & (1 << progress_bit)
 | 
			
		||||
                    bit_set = (masked_data != 0)
 | 
			
		||||
 | 
			
		||||
                    if bit_set:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    new_events += 1
 | 
			
		||||
                    new_data = data | (1 << progress_bit)
 | 
			
		||||
                    progress_data[progress_byte] = new_data
 | 
			
		||||
 | 
			
		||||
                    tile_id = await snes_read(ctx, SMW_ACTIVE_LEVEL_DATA + level_data[0], 0x1)
 | 
			
		||||
 | 
			
		||||
                    level_info = level_info_dict[tile_id[0]]
 | 
			
		||||
 | 
			
		||||
                    path = level_info.exit1Path if level_data[1] == 0 else level_info.exit2Path
 | 
			
		||||
 | 
			
		||||
                    if donut_gh_swapped[0] != 0 and tile_id[0] == 0x04:
 | 
			
		||||
                        # Handle Swapped Donut GH Exits
 | 
			
		||||
                        path = level_info.exit2Path if level_data[1] == 0 else level_info.exit1Path
 | 
			
		||||
 | 
			
		||||
                    if not path:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    this_end_path = path_data[tile_id[0]]
 | 
			
		||||
                    new_data = this_end_path | path.thisEndDirection
 | 
			
		||||
                    path_data[tile_id[0]] = new_data
 | 
			
		||||
 | 
			
		||||
                    other_end_path = path_data[path.otherLevelID]
 | 
			
		||||
                    new_data = other_end_path | path.otherEndDirection
 | 
			
		||||
                    path_data[path.otherLevelID] = new_data
 | 
			
		||||
 | 
			
		||||
        if new_dragon_coin:
 | 
			
		||||
            snes_buffered_write(ctx, SMW_DRAGON_COINS_DATA, bytes(dragon_coins_data))
 | 
			
		||||
        if new_events > 0:
 | 
			
		||||
            snes_buffered_write(ctx, SMW_PROGRESS_DATA, bytes(progress_data))
 | 
			
		||||
            snes_buffered_write(ctx, SMW_PATH_DATA, bytes(path_data))
 | 
			
		||||
            old_events = await snes_read(ctx, SMW_NUM_EVENTS_ADDR, 0x1)
 | 
			
		||||
            snes_buffered_write(ctx, SMW_NUM_EVENTS_ADDR, bytes([old_events[0] + new_events]))
 | 
			
		||||
 | 
			
		||||
        await snes_flush_writes(ctx)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
import typing
 | 
			
		||||
 | 
			
		||||
from BaseClasses import Item, ItemClassification
 | 
			
		||||
from .Names import ItemName
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ItemData(typing.NamedTuple):
 | 
			
		||||
    code: typing.Optional[int]
 | 
			
		||||
    progression: bool
 | 
			
		||||
    trap: bool = False
 | 
			
		||||
    quantity: int = 1
 | 
			
		||||
    event: bool = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWItem(Item):
 | 
			
		||||
    game: str = "Super Mario World"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Separate tables for each type of item.
 | 
			
		||||
junk_table = {
 | 
			
		||||
    ItemName.one_up_mushroom: ItemData(0xBC0001, False),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
collectable_table = {
 | 
			
		||||
    ItemName.yoshi_egg:       ItemData(0xBC0002, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
upgrade_table = {
 | 
			
		||||
    ItemName.mario_run:           ItemData(0xBC0003, True),
 | 
			
		||||
    ItemName.mario_carry:         ItemData(0xBC0004, True),
 | 
			
		||||
    ItemName.mario_swim:          ItemData(0xBC0005, True),
 | 
			
		||||
    ItemName.mario_spin_jump:     ItemData(0xBC0006, True),
 | 
			
		||||
    ItemName.mario_climb:         ItemData(0xBC0007, True),
 | 
			
		||||
    ItemName.yoshi_activate:      ItemData(0xBC0008, True),
 | 
			
		||||
    ItemName.p_switch:            ItemData(0xBC0009, True),
 | 
			
		||||
    ItemName.progressive_powerup: ItemData(0xBC000A, True),
 | 
			
		||||
    ItemName.p_balloon:           ItemData(0xBC000B, True),
 | 
			
		||||
    ItemName.super_star_active:   ItemData(0xBC000D, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
switch_palace_table = {
 | 
			
		||||
    ItemName.yellow_switch_palace: ItemData(0xBC000E, True),
 | 
			
		||||
    ItemName.green_switch_palace:  ItemData(0xBC000F, True),
 | 
			
		||||
    ItemName.red_switch_palace:    ItemData(0xBC0010, True),
 | 
			
		||||
    ItemName.blue_switch_palace:   ItemData(0xBC0011, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trap_table = {
 | 
			
		||||
    ItemName.ice_trap:        ItemData(0xBC0013, False, True),
 | 
			
		||||
    ItemName.stun_trap:       ItemData(0xBC0014, False, True),
 | 
			
		||||
    ItemName.literature_trap: ItemData(0xBC0015, False, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
event_table = {
 | 
			
		||||
    ItemName.victory:   ItemData(0xBC0000, True),
 | 
			
		||||
    ItemName.koopaling: ItemData(0xBC0012, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Complete item table.
 | 
			
		||||
item_table = {
 | 
			
		||||
    **junk_table,
 | 
			
		||||
    **collectable_table,
 | 
			
		||||
    **upgrade_table,
 | 
			
		||||
    **switch_palace_table,
 | 
			
		||||
    **trap_table,
 | 
			
		||||
    **event_table,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,579 @@
 | 
			
		|||
 | 
			
		||||
from .Names import LocationName
 | 
			
		||||
 | 
			
		||||
class SMWPath():
 | 
			
		||||
    thisEndDirection: int
 | 
			
		||||
    otherLevelID: int
 | 
			
		||||
    otherEndDirection: int
 | 
			
		||||
 | 
			
		||||
    def __init__(self, thisEndDirection: int, otherLevelID: int, otherEndDirection: int):
 | 
			
		||||
        self.thisEndDirection  = thisEndDirection
 | 
			
		||||
        self.otherLevelID      = otherLevelID
 | 
			
		||||
        self.otherEndDirection = otherEndDirection
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWLevel():
 | 
			
		||||
    levelName: str
 | 
			
		||||
    levelIDAddress: int
 | 
			
		||||
    #eventIDAddress: int
 | 
			
		||||
    eventIDValue: int
 | 
			
		||||
    #progressByte: int
 | 
			
		||||
    #progressBit: int
 | 
			
		||||
    exit1Path: SMWPath
 | 
			
		||||
    exit2Path: SMWPath
 | 
			
		||||
 | 
			
		||||
    def __init__(self, levelName: str, levelIDAddress: int, eventIDValue: int, exit1Path: SMWPath = None, exit2Path: SMWPath = None):
 | 
			
		||||
        self.levelName      = levelName
 | 
			
		||||
        self.levelIDAddress = levelIDAddress
 | 
			
		||||
        #self.eventIDAddress = eventIDAddress # Inferred from: LevelIDValue (Dict Key): $2D608 + LevelIDValue
 | 
			
		||||
        self.eventIDValue   = eventIDValue
 | 
			
		||||
        #self.progressByte   = progressByte # Inferred from EventIDValue: (ID / 8) + $1F02
 | 
			
		||||
        #self.progressBit    = progressBit  # Inferred from EventIDValue: 1 << (7 - (ID % 8))
 | 
			
		||||
        self.exit1Path   = exit1Path
 | 
			
		||||
        self.exit2Path   = exit2Path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
level_info_dict = {
 | 
			
		||||
    0x28: SMWLevel(LocationName.yoshis_house, 0x37A76, 0x00),
 | 
			
		||||
    0x29: SMWLevel(LocationName.yoshis_island_1_region, 0x37A83, 0x01, SMWPath(0x08, 0x14, 0x04)),
 | 
			
		||||
    0x14: SMWLevel(LocationName.yellow_switch_palace, 0x37812, 0x02),
 | 
			
		||||
    0x2A: SMWLevel(LocationName.yoshis_island_2_region, 0x37A89, 0x03, SMWPath(0x08, 0x27, 0x04)),
 | 
			
		||||
    0x27: SMWLevel(LocationName.yoshis_island_3_region, 0x37A69, 0x04, SMWPath(0x01, 0x26, 0x04)),
 | 
			
		||||
    0x26: SMWLevel(LocationName.yoshis_island_4_region, 0x37A4B, 0x05, SMWPath(0x08, 0x25, 0x01)),
 | 
			
		||||
    0x25: SMWLevel(LocationName.yoshis_island_castle_region, 0x37A29, 0x06, SMWPath(0x08, 0x15, 0x04)),
 | 
			
		||||
 | 
			
		||||
    0x15: SMWLevel(LocationName.donut_plains_1_region, 0x37815, 0x07, SMWPath(0x02, 0x09, 0x04), SMWPath(0x08, 0x0A, 0x04)),
 | 
			
		||||
    0x09: SMWLevel(LocationName.donut_plains_2_region, 0x376D3, 0x09, SMWPath(0x08, 0x04, 0x02), SMWPath(0x02, 0x08, 0x01)),
 | 
			
		||||
    0x0A: SMWLevel(LocationName.donut_secret_1_region, 0x376E5, 0x10, SMWPath(0x08, 0x04, 0x04), SMWPath(0x01, 0x13, 0x08)),
 | 
			
		||||
    0x08: SMWLevel(LocationName.green_switch_palace, 0x376D1, 0x28),
 | 
			
		||||
    0x04: SMWLevel(LocationName.donut_ghost_house_region, 0x376A5, 0x0B, SMWPath(0x08, 0x03, 0x04), SMWPath(0x01, 0x05, 0x02)),
 | 
			
		||||
    0x13: SMWLevel(LocationName.donut_secret_house_region, 0x37807, 0x12, SMWPath(0x01, 0x2F, 0x04), SMWPath(0x04, 0x16, 0x08)), # SMW_TODO: Check this wrt pipe behavior
 | 
			
		||||
    0x05: SMWLevel(LocationName.donut_plains_3_region, 0x376A9, 0x0D, SMWPath(0x01, 0x06, 0x08)),
 | 
			
		||||
    0x06: SMWLevel(LocationName.donut_plains_4_region, 0x376CB, 0x0E, SMWPath(0x01, 0x07, 0x02)),
 | 
			
		||||
    0x2F: SMWLevel(LocationName.donut_secret_2_region, 0x37B10, 0x14, SMWPath(0x01, 0x05, 0x04)),
 | 
			
		||||
    0x07: SMWLevel(LocationName.donut_plains_castle_region, 0x376CD, 0x0F, SMWPath(0x08, 0x3E, 0x04)),
 | 
			
		||||
    0x03: SMWLevel(LocationName.donut_plains_top_secret, 0x37685, 0xFF),
 | 
			
		||||
    0x16: SMWLevel(LocationName.donut_plains_star_road, 0x37827, 0xFF),
 | 
			
		||||
 | 
			
		||||
    0x3E: SMWLevel(LocationName.vanilla_dome_1_region, 0x37C25, 0x15, SMWPath(0x01, 0x3C, 0x04), SMWPath(0x02, 0x2D, 0x04)),
 | 
			
		||||
    0x3C: SMWLevel(LocationName.vanilla_dome_2_region, 0x37C08, 0x17, SMWPath(0x08, 0x2B, 0x04), SMWPath(0x01, 0x3F, 0x08)),
 | 
			
		||||
    0x2D: SMWLevel(LocationName.vanilla_secret_1_region, 0x37AE3, 0x1D, SMWPath(0x08, 0x01, 0x02), SMWPath(0x02, 0x2C, 0x01)),
 | 
			
		||||
    0x2B: SMWLevel(LocationName.vanilla_ghost_house_region, 0x37AC8, 0x19, SMWPath(0x01, 0x2E, 0x08)),
 | 
			
		||||
    0x2E: SMWLevel(LocationName.vanilla_dome_3_region, 0x37AEC, 0x1A, SMWPath(0x04, 0x3D, 0x08)),
 | 
			
		||||
    0x3D: SMWLevel(LocationName.vanilla_dome_4_region, 0x37C0C, 0x1B, SMWPath(0x04, 0x40, 0x08)),
 | 
			
		||||
    0x3F: SMWLevel(LocationName.red_switch_palace, 0x37C2A, 0x29),
 | 
			
		||||
    0x01: SMWLevel(LocationName.vanilla_secret_2_region, 0x3763C, 0x1F, SMWPath(0x01, 0x02, 0x02)),
 | 
			
		||||
    0x02: SMWLevel(LocationName.vanilla_secret_3_region, 0x3763E, 0x20, SMWPath(0x01, 0x0B, 0x02)),
 | 
			
		||||
    0x0B: SMWLevel(LocationName.vanilla_fortress_region, 0x37730, 0x21, SMWPath(0x01, 0x0C, 0x02)),
 | 
			
		||||
    0x40: SMWLevel(LocationName.vanilla_dome_castle_region, 0x37C2C, 0x1C, SMWPath(0x04, 0x0F, 0x02)),
 | 
			
		||||
    0x2C: SMWLevel(LocationName.vanilla_dome_star_road, 0x37AE0, 0xFF),
 | 
			
		||||
 | 
			
		||||
    0x0C: SMWLevel(LocationName.butter_bridge_1_region, 0x37734, 0x22, SMWPath(0x01, 0x0D, 0x02)),
 | 
			
		||||
    0x0D: SMWLevel(LocationName.butter_bridge_2_region, 0x37736, 0x23, SMWPath(0x01, 0x0E, 0x02)),
 | 
			
		||||
    0x0F: SMWLevel(LocationName.cheese_bridge_region, 0x37754, 0x25, SMWPath(0x01, 0x10, 0x02), SMWPath(0x04, 0x11, 0x08)),
 | 
			
		||||
    0x11: SMWLevel(LocationName.soda_lake_region, 0x37784, 0x60, SMWPath(0x04, 0x12, 0x04)),
 | 
			
		||||
    0x10: SMWLevel(LocationName.cookie_mountain_region, 0x37757, 0x27, SMWPath(0x04, 0x0E, 0x04)),
 | 
			
		||||
    0x0E: SMWLevel(LocationName.twin_bridges_castle_region, 0x3773A, 0x24, SMWPath(0x01, 0x42, 0x08)),
 | 
			
		||||
    0x12: SMWLevel(LocationName.twin_bridges_star_road, 0x377F0, 0xFF),
 | 
			
		||||
 | 
			
		||||
    0x42: SMWLevel(LocationName.forest_of_illusion_1_region, 0x37C78, 0x2A, SMWPath(0x01, 0x44, 0x08), SMWPath(0x02, 0x41, 0x01)),
 | 
			
		||||
    0x44: SMWLevel(LocationName.forest_of_illusion_2_region, 0x37CAA, 0x2C, SMWPath(0x04, 0x47, 0x08), SMWPath(0x01, 0x45, 0x02)),
 | 
			
		||||
    0x47: SMWLevel(LocationName.forest_of_illusion_3_region, 0x37CC8, 0x2E, SMWPath(0x02, 0x41, 0x04), SMWPath(0x04, 0x20, 0x01)),
 | 
			
		||||
    0x43: SMWLevel(LocationName.forest_of_illusion_4_region, 0x37CA4, 0x32, SMWPath(0x01, 0x44, 0x02), SMWPath(0x04, 0x46, 0x08)),
 | 
			
		||||
    0x41: SMWLevel(LocationName.forest_ghost_house_region, 0x37C76, 0x30, SMWPath(0x01, 0x42, 0x02), SMWPath(0x02, 0x43, 0x08)),
 | 
			
		||||
    0x46: SMWLevel(LocationName.forest_secret_region, 0x37CC4, 0x34, SMWPath(0x04, 0x1F, 0x01)),
 | 
			
		||||
    0x45: SMWLevel(LocationName.blue_switch_palace, 0x37CAC, 0x37),
 | 
			
		||||
    0x1F: SMWLevel(LocationName.forest_fortress_region, 0x37906, 0x35, SMWPath(0x02, 0x1E, 0x01)),
 | 
			
		||||
    0x20: SMWLevel(LocationName.forest_castle_region, 0x37928, 0x61, SMWPath(0x04, 0x22, 0x08)),
 | 
			
		||||
    0x1E: SMWLevel(LocationName.forest_star_road, 0x37904, 0x36),
 | 
			
		||||
 | 
			
		||||
    0x22: SMWLevel(LocationName.chocolate_island_1_region, 0x37968, 0x62, SMWPath(0x02, 0x21, 0x01)),
 | 
			
		||||
    0x24: SMWLevel(LocationName.chocolate_island_2_region, 0x379B5, 0x46, SMWPath(0x02, 0x23, 0x01), SMWPath(0x04, 0x3B, 0x01)),
 | 
			
		||||
    0x23: SMWLevel(LocationName.chocolate_island_3_region, 0x379B3, 0x48, SMWPath(0x04, 0x23, 0x08), SMWPath(0x02, 0x1B, 0x01)),
 | 
			
		||||
    0x1D: SMWLevel(LocationName.chocolate_island_4_region, 0x378DF, 0x4B, SMWPath(0x02, 0x1C, 0x01)),
 | 
			
		||||
    0x1C: SMWLevel(LocationName.chocolate_island_5_region, 0x378DC, 0x4C, SMWPath(0x08, 0x1A, 0x04)),
 | 
			
		||||
    0x21: SMWLevel(LocationName.chocolate_ghost_house_region, 0x37965, 0x63, SMWPath(0x04, 0x24, 0x08)),
 | 
			
		||||
    0x1B: SMWLevel(LocationName.chocolate_fortress_region, 0x378BF, 0x4A, SMWPath(0x04, 0x1D, 0x08)),
 | 
			
		||||
    0x3B: SMWLevel(LocationName.chocolate_secret_region, 0x37B97, 0x4F, SMWPath(0x02, 0x1A, 0x02)),
 | 
			
		||||
    0x1A: SMWLevel(LocationName.chocolate_castle_region, 0x378BC, 0x4D, SMWPath(0x08, 0x18, 0x02)),
 | 
			
		||||
 | 
			
		||||
    0x18: SMWLevel(LocationName.sunken_ghost_ship_region, 0x3787E, 0x4E, SMWPath(0x08, 0x3A, 0x01)),
 | 
			
		||||
    0x3A: SMWLevel(LocationName.valley_of_bowser_1_region, 0x37B7B, 0x38, SMWPath(0x02, 0x39, 0x01)),
 | 
			
		||||
    0x39: SMWLevel(LocationName.valley_of_bowser_2_region, 0x37B79, 0x39, SMWPath(0x02, 0x38, 0x01), SMWPath(0x08, 0x35, 0x04)),
 | 
			
		||||
    0x37: SMWLevel(LocationName.valley_of_bowser_3_region, 0x37B74, 0x3D, SMWPath(0x08, 0x33, 0x04)),
 | 
			
		||||
    0x33: SMWLevel(LocationName.valley_of_bowser_4_region, 0x37B54, 0x3E, SMWPath(0x01, 0x34, 0x02), SMWPath(0x08, 0x30, 0x04)),
 | 
			
		||||
    0x38: SMWLevel(LocationName.valley_ghost_house_region, 0x37B77, 0x3B, SMWPath(0x02, 0x37, 0x01), SMWPath(0x08, 0x34, 0x04)),
 | 
			
		||||
    0x35: SMWLevel(LocationName.valley_fortress_region, 0x37B59, 0x41, SMWPath(0x08, 0x32, 0x04)),
 | 
			
		||||
    0x34: SMWLevel(LocationName.valley_castle_region, 0x37B57, 0x40, SMWPath(0x08, 0x31, 0x04)),
 | 
			
		||||
    0x31: SMWLevel(LocationName.front_door, 0x37B37, 0x45),
 | 
			
		||||
    0x81: SMWLevel(LocationName.front_door, 0x37B37, 0x45), # Fake Extra Front Door
 | 
			
		||||
    0x32: SMWLevel(LocationName.back_door, 0x37B39, 0x42),
 | 
			
		||||
    0x82: SMWLevel(LocationName.back_door, 0x37B39, 0x42), # Fake Extra Back Door
 | 
			
		||||
    0x30: SMWLevel(LocationName.valley_star_road, 0x37B34, 0x44),
 | 
			
		||||
 | 
			
		||||
    0x5B: SMWLevel(LocationName.star_road_donut, 0x37DD3, 0x50),
 | 
			
		||||
    0x58: SMWLevel(LocationName.star_road_1_region, 0x37DA4, 0x51, None, SMWPath(0x02, 0x53, 0x04)),
 | 
			
		||||
    0x53: SMWLevel(LocationName.star_road_vanilla, 0x37D82, 0x53),
 | 
			
		||||
    0x54: SMWLevel(LocationName.star_road_2_region, 0x37D85, 0x54, None, SMWPath(0x08, 0x52, 0x02)),
 | 
			
		||||
    0x52: SMWLevel(LocationName.star_road_twin_bridges, 0x37D67, 0x56),
 | 
			
		||||
    0x56: SMWLevel(LocationName.star_road_3_region, 0x37D89, 0x57, None, SMWPath(0x01, 0x57, 0x02)),
 | 
			
		||||
    0x57: SMWLevel(LocationName.star_road_forest, 0x37D8C, 0x59),
 | 
			
		||||
    0x59: SMWLevel(LocationName.star_road_4_region, 0x37DAA, 0x5A, None, SMWPath(0x04, 0x5C, 0x08)),
 | 
			
		||||
    0x5C: SMWLevel(LocationName.star_road_valley, 0x37DDC, 0x5C),
 | 
			
		||||
    0x5A: SMWLevel(LocationName.star_road_5_region, 0x37DB7, 0x5D, SMWPath(0x02, 0x5B, 0x01), SMWPath(0x08, 0x55, 0x04)),
 | 
			
		||||
    0x55: SMWLevel(LocationName.star_road_special, 0x37D87, 0x5F),
 | 
			
		||||
 | 
			
		||||
    0x4D: SMWLevel(LocationName.special_star_road, 0x37D31, 0x64),
 | 
			
		||||
    0x4E: SMWLevel(LocationName.special_zone_1_region, 0x37D33, 0x65, SMWPath(0x01, 0x4F, 0x02)),
 | 
			
		||||
    0x4F: SMWLevel(LocationName.special_zone_2_region, 0x37D36, 0x66, SMWPath(0x01, 0x50, 0x02)),
 | 
			
		||||
    0x50: SMWLevel(LocationName.special_zone_3_region, 0x37D39, 0x67, SMWPath(0x01, 0x51, 0x02)),
 | 
			
		||||
    0x51: SMWLevel(LocationName.special_zone_4_region, 0x37D3C, 0x68, SMWPath(0x01, 0x4C, 0x01)),
 | 
			
		||||
    0x4C: SMWLevel(LocationName.special_zone_5_region, 0x37D1C, 0x69, SMWPath(0x02, 0x4B, 0x01)),
 | 
			
		||||
    0x4B: SMWLevel(LocationName.special_zone_6_region, 0x37D19, 0x6A, SMWPath(0x02, 0x4A, 0x01)),
 | 
			
		||||
    0x4A: SMWLevel(LocationName.special_zone_7_region, 0x37D16, 0x6B, SMWPath(0x02, 0x49, 0x01)),
 | 
			
		||||
    0x49: SMWLevel(LocationName.special_zone_8_region, 0x37D13, 0x6C, SMWPath(0x02, 0x48, 0x01)),
 | 
			
		||||
    0x48: SMWLevel(LocationName.special_complete, 0x37D11, 0x6D),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
full_level_list = [
 | 
			
		||||
    0x28, 0x29, 0x14, 0x2A, 0x27, 0x26, 0x25,
 | 
			
		||||
    0x15, 0x09, 0x0A, 0x08, 0x04, 0x13, 0x05, 0x06, 0x2F, 0x07, 0x03, 0x16,
 | 
			
		||||
    0x3E, 0x3C, 0x2D, 0x2B, 0x2E, 0x3D, 0x3F, 0x01, 0x02, 0x0B, 0x40, 0x2C,
 | 
			
		||||
    0x0C, 0x0D, 0x0F, 0x11, 0x10, 0x0E, 0x12,
 | 
			
		||||
    0x42, 0x44, 0x47, 0x43, 0x41, 0x46, 0x45, 0x1F, 0x20, 0x1E,
 | 
			
		||||
    0x22, 0x24, 0x23, 0x1D, 0x1C, 0x21, 0x1B, 0x3B, 0x1A,
 | 
			
		||||
    0x18, 0x3A, 0x39, 0x37, 0x33, 0x38, 0x35, 0x34, 0x31, 0x32, 0x30,
 | 
			
		||||
    0x5B, 0x58, 0x53, 0x54, 0x52, 0x56, 0x57, 0x59, 0x5C, 0x5A, 0x55,
 | 
			
		||||
    0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x4C, 0x4B, 0x4A, 0x49, 0x48,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
submap_level_list = [
 | 
			
		||||
    0x28, 0x29, 0x2A, 0x27, 0x26, 0x25,
 | 
			
		||||
    0x2F,
 | 
			
		||||
    0x3E, 0x3C, 0x2D, 0x2B, 0x2E, 0x3D, 0x3F, 0x40, 0x2C,
 | 
			
		||||
    0x42, 0x44, 0x47, 0x43, 0x41, 0x46, 0x45,
 | 
			
		||||
    0x3B,
 | 
			
		||||
    0x3A, 0x39, 0x37, 0x33, 0x38, 0x35, 0x34, 0x31, 0x32, 0x30,
 | 
			
		||||
    0x5B, 0x58, 0x53, 0x54, 0x52, 0x56, 0x57, 0x59, 0x5C, 0x5A, 0x55,
 | 
			
		||||
    0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x4C, 0x4B, 0x4A, 0x49, 0x48,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
easy_castle_fortress_levels = [
 | 
			
		||||
    0x07,
 | 
			
		||||
    0x40,
 | 
			
		||||
    0x1F,
 | 
			
		||||
    0x20,
 | 
			
		||||
    0x1B,
 | 
			
		||||
    0x34,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
hard_castle_fortress_levels = [
 | 
			
		||||
    0x25,
 | 
			
		||||
    0x0B,
 | 
			
		||||
    0x0E,
 | 
			
		||||
    0x1A,
 | 
			
		||||
    0x35,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
easy_single_levels = [
 | 
			
		||||
    0x29,
 | 
			
		||||
    0x2A,
 | 
			
		||||
    0x27,
 | 
			
		||||
    0x26,
 | 
			
		||||
    0x05,
 | 
			
		||||
    0x06,
 | 
			
		||||
    0x2F,
 | 
			
		||||
    0x2E,
 | 
			
		||||
    0x3D,
 | 
			
		||||
    0x01,
 | 
			
		||||
    0x0C,
 | 
			
		||||
    0x0D,
 | 
			
		||||
    0x46,
 | 
			
		||||
    0x1D,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
hard_single_levels = [
 | 
			
		||||
    0x2B,
 | 
			
		||||
    0x02,
 | 
			
		||||
    0x11,
 | 
			
		||||
    0x10,
 | 
			
		||||
    0x22,
 | 
			
		||||
    0x1C,
 | 
			
		||||
    0x21,
 | 
			
		||||
    0x3B,
 | 
			
		||||
    0x3A,
 | 
			
		||||
    0x37,
 | 
			
		||||
    0x4E,
 | 
			
		||||
    0x4F,
 | 
			
		||||
    0x50,
 | 
			
		||||
    0x51,
 | 
			
		||||
    0x4C,
 | 
			
		||||
    0x4B,
 | 
			
		||||
    0x4A,
 | 
			
		||||
    0x49,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
easy_double_levels = [
 | 
			
		||||
    0x15,
 | 
			
		||||
    0x09,
 | 
			
		||||
    0x0F,
 | 
			
		||||
    0x42,
 | 
			
		||||
    0x43,
 | 
			
		||||
    0x24,
 | 
			
		||||
    0x38,
 | 
			
		||||
    0x58,
 | 
			
		||||
    0x54,
 | 
			
		||||
    0x56,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
hard_double_levels = [
 | 
			
		||||
    0x0A,
 | 
			
		||||
    0x04,
 | 
			
		||||
    0x13,
 | 
			
		||||
    0x3E,
 | 
			
		||||
    0x3C,
 | 
			
		||||
    0x2D,
 | 
			
		||||
    0x44,
 | 
			
		||||
    0x47,
 | 
			
		||||
    0x41,
 | 
			
		||||
    0x23,
 | 
			
		||||
    0x33,
 | 
			
		||||
    0x39,
 | 
			
		||||
    0x59,
 | 
			
		||||
    0x5A,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
switch_palace_levels = [
 | 
			
		||||
    0x14,
 | 
			
		||||
    0x08,
 | 
			
		||||
    0x3F,
 | 
			
		||||
    0x45,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
location_id_to_level_id = {
 | 
			
		||||
    LocationName.yoshis_island_1_exit_1:  [0x29, 0],
 | 
			
		||||
    LocationName.yoshis_island_1_dragon:  [0x29, 2],
 | 
			
		||||
    LocationName.yoshis_island_2_exit_1:  [0x2A, 0],
 | 
			
		||||
    LocationName.yoshis_island_2_dragon:  [0x2A, 2],
 | 
			
		||||
    LocationName.yoshis_island_3_exit_1:  [0x27, 0],
 | 
			
		||||
    LocationName.yoshis_island_3_dragon:  [0x27, 2],
 | 
			
		||||
    LocationName.yoshis_island_4_exit_1:  [0x26, 0],
 | 
			
		||||
    LocationName.yoshis_island_4_dragon:  [0x26, 2],
 | 
			
		||||
    LocationName.yoshis_island_castle:    [0x25, 0],
 | 
			
		||||
    LocationName.yoshis_island_koopaling: [0x25, 0],
 | 
			
		||||
    LocationName.yellow_switch_palace:    [0x14, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.donut_plains_1_exit_1:     [0x15, 0],
 | 
			
		||||
    LocationName.donut_plains_1_exit_2:     [0x15, 1],
 | 
			
		||||
    LocationName.donut_plains_1_dragon:     [0x15, 2],
 | 
			
		||||
    LocationName.donut_plains_2_exit_1:     [0x09, 0],
 | 
			
		||||
    LocationName.donut_plains_2_exit_2:     [0x09, 1],
 | 
			
		||||
    LocationName.donut_plains_2_dragon:     [0x09, 2],
 | 
			
		||||
    LocationName.donut_plains_3_exit_1:     [0x05, 0],
 | 
			
		||||
    LocationName.donut_plains_3_dragon:     [0x05, 2],
 | 
			
		||||
    LocationName.donut_plains_4_exit_1:     [0x06, 0],
 | 
			
		||||
    LocationName.donut_plains_4_dragon:     [0x06, 2],
 | 
			
		||||
    LocationName.donut_secret_1_exit_1:     [0x0A, 0],
 | 
			
		||||
    LocationName.donut_secret_1_exit_2:     [0x0A, 1],
 | 
			
		||||
    LocationName.donut_secret_1_dragon:     [0x0A, 2],
 | 
			
		||||
    LocationName.donut_secret_2_exit_1:     [0x2F, 0],
 | 
			
		||||
    LocationName.donut_secret_2_dragon:     [0x2F, 2],
 | 
			
		||||
    LocationName.donut_ghost_house_exit_1:  [0x04, 0],
 | 
			
		||||
    LocationName.donut_ghost_house_exit_2:  [0x04, 1],
 | 
			
		||||
    LocationName.donut_secret_house_exit_1: [0x13, 0],
 | 
			
		||||
    LocationName.donut_secret_house_exit_2: [0x13, 1],
 | 
			
		||||
    LocationName.donut_plains_castle:       [0x07, 0],
 | 
			
		||||
    LocationName.donut_plains_koopaling:    [0x07, 0],
 | 
			
		||||
    LocationName.green_switch_palace:       [0x08, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.vanilla_dome_1_exit_1:      [0x3E, 0],
 | 
			
		||||
    LocationName.vanilla_dome_1_exit_2:      [0x3E, 1],
 | 
			
		||||
    LocationName.vanilla_dome_1_dragon:      [0x3E, 2],
 | 
			
		||||
    LocationName.vanilla_dome_2_exit_1:      [0x3C, 0],
 | 
			
		||||
    LocationName.vanilla_dome_2_exit_2:      [0x3C, 1],
 | 
			
		||||
    LocationName.vanilla_dome_2_dragon:      [0x3C, 2],
 | 
			
		||||
    LocationName.vanilla_dome_3_exit_1:      [0x2E, 0],
 | 
			
		||||
    LocationName.vanilla_dome_3_dragon:      [0x2E, 2],
 | 
			
		||||
    LocationName.vanilla_dome_4_exit_1:      [0x3D, 0],
 | 
			
		||||
    LocationName.vanilla_dome_4_dragon:      [0x3D, 2],
 | 
			
		||||
    LocationName.vanilla_secret_1_exit_1:    [0x2D, 0],
 | 
			
		||||
    LocationName.vanilla_secret_1_exit_2:    [0x2D, 1],
 | 
			
		||||
    LocationName.vanilla_secret_1_dragon:    [0x2D, 2],
 | 
			
		||||
    LocationName.vanilla_secret_2_exit_1:    [0x01, 0],
 | 
			
		||||
    LocationName.vanilla_secret_2_dragon:    [0x01, 2],
 | 
			
		||||
    LocationName.vanilla_secret_3_exit_1:    [0x02, 0],
 | 
			
		||||
    LocationName.vanilla_secret_3_dragon:    [0x02, 2],
 | 
			
		||||
    LocationName.vanilla_ghost_house_exit_1: [0x2B, 0],
 | 
			
		||||
    LocationName.vanilla_ghost_house_dragon: [0x2B, 2],
 | 
			
		||||
    LocationName.vanilla_fortress:           [0x0B, 0],
 | 
			
		||||
    LocationName.vanilla_reznor:             [0x0B, 0],
 | 
			
		||||
    LocationName.vanilla_dome_castle:        [0x40, 0],
 | 
			
		||||
    LocationName.vanilla_dome_koopaling:     [0x40, 0],
 | 
			
		||||
    LocationName.red_switch_palace:          [0x3F, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.butter_bridge_1_exit_1: [0x0C, 0],
 | 
			
		||||
    LocationName.butter_bridge_1_dragon: [0x0C, 2],
 | 
			
		||||
    LocationName.butter_bridge_2_exit_1: [0x0D, 0],
 | 
			
		||||
    LocationName.butter_bridge_2_dragon: [0x0D, 2],
 | 
			
		||||
    LocationName.cheese_bridge_exit_1:   [0x0F, 0],
 | 
			
		||||
    LocationName.cheese_bridge_exit_2:   [0x0F, 1],
 | 
			
		||||
    LocationName.cheese_bridge_dragon:   [0x0F, 2],
 | 
			
		||||
    LocationName.cookie_mountain_exit_1: [0x10, 0],
 | 
			
		||||
    LocationName.cookie_mountain_dragon: [0x10, 2],
 | 
			
		||||
    LocationName.soda_lake_exit_1:       [0x11, 0],
 | 
			
		||||
    LocationName.soda_lake_dragon:       [0x11, 2],
 | 
			
		||||
    LocationName.twin_bridges_castle:    [0x0E, 0],
 | 
			
		||||
    LocationName.twin_bridges_koopaling: [0x0E, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.forest_of_illusion_1_exit_1: [0x42, 0],
 | 
			
		||||
    LocationName.forest_of_illusion_1_exit_2: [0x42, 1],
 | 
			
		||||
    LocationName.forest_of_illusion_2_exit_1: [0x44, 0],
 | 
			
		||||
    LocationName.forest_of_illusion_2_exit_2: [0x44, 1],
 | 
			
		||||
    LocationName.forest_of_illusion_2_dragon: [0x44, 2],
 | 
			
		||||
    LocationName.forest_of_illusion_3_exit_1: [0x47, 0],
 | 
			
		||||
    LocationName.forest_of_illusion_3_exit_2: [0x47, 1],
 | 
			
		||||
    LocationName.forest_of_illusion_3_dragon: [0x47, 2],
 | 
			
		||||
    LocationName.forest_of_illusion_4_exit_1: [0x43, 0],
 | 
			
		||||
    LocationName.forest_of_illusion_4_exit_2: [0x43, 1],
 | 
			
		||||
    LocationName.forest_of_illusion_4_dragon: [0x43, 2],
 | 
			
		||||
    LocationName.forest_ghost_house_exit_1:   [0x41, 0],
 | 
			
		||||
    LocationName.forest_ghost_house_exit_2:   [0x41, 1],
 | 
			
		||||
    LocationName.forest_ghost_house_dragon:   [0x41, 2],
 | 
			
		||||
    LocationName.forest_secret_exit_1:        [0x46, 0],
 | 
			
		||||
    LocationName.forest_secret_dragon:        [0x46, 2],
 | 
			
		||||
    LocationName.forest_fortress:             [0x1F, 0],
 | 
			
		||||
    LocationName.forest_reznor:               [0x1F, 0],
 | 
			
		||||
    LocationName.forest_castle:               [0x20, 0],
 | 
			
		||||
    LocationName.forest_koopaling:            [0x20, 0],
 | 
			
		||||
    LocationName.forest_castle_dragon:        [0x20, 2],
 | 
			
		||||
    LocationName.blue_switch_palace:          [0x45, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.chocolate_island_1_exit_1:    [0x22, 0],
 | 
			
		||||
    LocationName.chocolate_island_1_dragon:    [0x22, 2],
 | 
			
		||||
    LocationName.chocolate_island_2_exit_1:    [0x24, 0],
 | 
			
		||||
    LocationName.chocolate_island_2_exit_2:    [0x24, 1],
 | 
			
		||||
    LocationName.chocolate_island_2_dragon:    [0x24, 2],
 | 
			
		||||
    LocationName.chocolate_island_3_exit_1:    [0x23, 0],
 | 
			
		||||
    LocationName.chocolate_island_3_exit_2:    [0x23, 1],
 | 
			
		||||
    LocationName.chocolate_island_3_dragon:    [0x23, 2],
 | 
			
		||||
    LocationName.chocolate_island_4_exit_1:    [0x1D, 0],
 | 
			
		||||
    LocationName.chocolate_island_4_dragon:    [0x1D, 2],
 | 
			
		||||
    LocationName.chocolate_island_5_exit_1:    [0x1C, 0],
 | 
			
		||||
    LocationName.chocolate_island_5_dragon:    [0x1C, 2],
 | 
			
		||||
    LocationName.chocolate_ghost_house_exit_1: [0x21, 0],
 | 
			
		||||
    LocationName.chocolate_secret_exit_1:      [0x3B, 0],
 | 
			
		||||
    LocationName.chocolate_fortress:           [0x1B, 0],
 | 
			
		||||
    LocationName.chocolate_reznor:             [0x1B, 0],
 | 
			
		||||
    LocationName.chocolate_castle:             [0x1A, 0],
 | 
			
		||||
    LocationName.chocolate_koopaling:          [0x1A, 0],
 | 
			
		||||
 | 
			
		||||
    LocationName.sunken_ghost_ship:        [0x18, 0],
 | 
			
		||||
    LocationName.sunken_ghost_ship_dragon: [0x18, 2],
 | 
			
		||||
 | 
			
		||||
    LocationName.valley_of_bowser_1_exit_1: [0x3A, 0],
 | 
			
		||||
    LocationName.valley_of_bowser_1_dragon: [0x3A, 2],
 | 
			
		||||
    LocationName.valley_of_bowser_2_exit_1: [0x39, 0],
 | 
			
		||||
    LocationName.valley_of_bowser_2_exit_2: [0x39, 1],
 | 
			
		||||
    LocationName.valley_of_bowser_2_dragon: [0x39, 2],
 | 
			
		||||
    LocationName.valley_of_bowser_3_exit_1: [0x37, 0],
 | 
			
		||||
    LocationName.valley_of_bowser_3_dragon: [0x37, 2],
 | 
			
		||||
    LocationName.valley_of_bowser_4_exit_1: [0x33, 0],
 | 
			
		||||
    LocationName.valley_of_bowser_4_exit_2: [0x33, 1],
 | 
			
		||||
    LocationName.valley_ghost_house_exit_1: [0x38, 0],
 | 
			
		||||
    LocationName.valley_ghost_house_exit_2: [0x38, 1],
 | 
			
		||||
    LocationName.valley_ghost_house_dragon: [0x38, 2],
 | 
			
		||||
    LocationName.valley_fortress:           [0x35, 0],
 | 
			
		||||
    LocationName.valley_reznor:             [0x35, 0],
 | 
			
		||||
    LocationName.valley_castle:             [0x34, 0],
 | 
			
		||||
    LocationName.valley_koopaling:          [0x34, 0],
 | 
			
		||||
    LocationName.valley_castle_dragon:      [0x34, 2],
 | 
			
		||||
 | 
			
		||||
    LocationName.star_road_1_exit_1: [0x58, 0],
 | 
			
		||||
    LocationName.star_road_1_exit_2: [0x58, 1],
 | 
			
		||||
    LocationName.star_road_1_dragon: [0x58, 2],
 | 
			
		||||
    LocationName.star_road_2_exit_1: [0x54, 0],
 | 
			
		||||
    LocationName.star_road_2_exit_2: [0x54, 1],
 | 
			
		||||
    LocationName.star_road_3_exit_1: [0x56, 0],
 | 
			
		||||
    LocationName.star_road_3_exit_2: [0x56, 1],
 | 
			
		||||
    LocationName.star_road_4_exit_1: [0x59, 0],
 | 
			
		||||
    LocationName.star_road_4_exit_2: [0x59, 1],
 | 
			
		||||
    LocationName.star_road_5_exit_1: [0x5A, 0],
 | 
			
		||||
    LocationName.star_road_5_exit_2: [0x5A, 1],
 | 
			
		||||
 | 
			
		||||
    LocationName.special_zone_1_exit_1: [0x4E, 0],
 | 
			
		||||
    LocationName.special_zone_1_dragon: [0x4E, 2],
 | 
			
		||||
    LocationName.special_zone_2_exit_1: [0x4F, 0],
 | 
			
		||||
    LocationName.special_zone_2_dragon: [0x4F, 2],
 | 
			
		||||
    LocationName.special_zone_3_exit_1: [0x50, 0],
 | 
			
		||||
    LocationName.special_zone_3_dragon: [0x50, 2],
 | 
			
		||||
    LocationName.special_zone_4_exit_1: [0x51, 0],
 | 
			
		||||
    LocationName.special_zone_4_dragon: [0x51, 2],
 | 
			
		||||
    LocationName.special_zone_5_exit_1: [0x4C, 0],
 | 
			
		||||
    LocationName.special_zone_5_dragon: [0x4C, 2],
 | 
			
		||||
    LocationName.special_zone_6_exit_1: [0x4B, 0],
 | 
			
		||||
    LocationName.special_zone_6_dragon: [0x4B, 2],
 | 
			
		||||
    LocationName.special_zone_7_exit_1: [0x4A, 0],
 | 
			
		||||
    LocationName.special_zone_7_dragon: [0x4A, 2],
 | 
			
		||||
    LocationName.special_zone_8_exit_1: [0x49, 0],
 | 
			
		||||
    LocationName.special_zone_8_dragon: [0x49, 2],
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def generate_level_list(world, player):
 | 
			
		||||
 | 
			
		||||
    if not world.level_shuffle[player]:
 | 
			
		||||
        out_level_list = full_level_list.copy()
 | 
			
		||||
        out_level_list[0x00] = 0x03
 | 
			
		||||
        out_level_list[0x11] = 0x28
 | 
			
		||||
 | 
			
		||||
        if world.bowser_castle_doors[player] == "fast":
 | 
			
		||||
            out_level_list[0x41] = 0x82
 | 
			
		||||
            out_level_list[0x42] = 0x32
 | 
			
		||||
        elif world.bowser_castle_doors[player] == "slow":
 | 
			
		||||
            out_level_list[0x41] = 0x31
 | 
			
		||||
            out_level_list[0x42] = 0x81
 | 
			
		||||
 | 
			
		||||
        return out_level_list
 | 
			
		||||
 | 
			
		||||
    shuffled_level_list = []
 | 
			
		||||
    easy_castle_fortress_levels_copy = easy_castle_fortress_levels.copy()
 | 
			
		||||
    world.random.shuffle(easy_castle_fortress_levels_copy)
 | 
			
		||||
    hard_castle_fortress_levels_copy = hard_castle_fortress_levels.copy()
 | 
			
		||||
    world.random.shuffle(hard_castle_fortress_levels_copy)
 | 
			
		||||
    easy_single_levels_copy = easy_single_levels.copy()
 | 
			
		||||
    world.random.shuffle(easy_single_levels_copy)
 | 
			
		||||
    hard_single_levels_copy = hard_single_levels.copy()
 | 
			
		||||
    world.random.shuffle(hard_single_levels_copy)
 | 
			
		||||
    easy_double_levels_copy = easy_double_levels.copy()
 | 
			
		||||
    world.random.shuffle(easy_double_levels_copy)
 | 
			
		||||
    hard_double_levels_copy = hard_double_levels.copy()
 | 
			
		||||
    world.random.shuffle(hard_double_levels_copy)
 | 
			
		||||
    switch_palace_levels_copy = switch_palace_levels.copy()
 | 
			
		||||
    world.random.shuffle(switch_palace_levels_copy)
 | 
			
		||||
 | 
			
		||||
    # Yoshi's Island
 | 
			
		||||
    shuffled_level_list.append(0x03)
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x14)
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_castle_fortress_levels_copy.pop(0))
 | 
			
		||||
 | 
			
		||||
    # Donut Plains
 | 
			
		||||
    shuffled_level_list.append(easy_double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x08)
 | 
			
		||||
    shuffled_level_list.append(easy_double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(easy_castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x28)
 | 
			
		||||
    shuffled_level_list.append(0x16)
 | 
			
		||||
 | 
			
		||||
    single_levels_copy = (easy_single_levels_copy.copy() + hard_single_levels_copy.copy())
 | 
			
		||||
    world.random.shuffle(single_levels_copy)
 | 
			
		||||
 | 
			
		||||
    castle_fortress_levels_copy = (easy_castle_fortress_levels_copy.copy() + hard_castle_fortress_levels_copy.copy())
 | 
			
		||||
    world.random.shuffle(castle_fortress_levels_copy)
 | 
			
		||||
 | 
			
		||||
    double_levels_copy = (easy_double_levels_copy.copy() + hard_double_levels_copy.copy())
 | 
			
		||||
    world.random.shuffle(double_levels_copy)
 | 
			
		||||
 | 
			
		||||
    # Vanilla Dome
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x3F)
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x2C)
 | 
			
		||||
 | 
			
		||||
    # Twin Bridges
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x12)
 | 
			
		||||
 | 
			
		||||
    # Forest of Illusion
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x45)
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x1E)
 | 
			
		||||
 | 
			
		||||
    # Chocolate Island
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
 | 
			
		||||
    # Valley of Bowser
 | 
			
		||||
    shuffled_level_list.append(0x18)
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
 | 
			
		||||
 | 
			
		||||
    # Front/Back Door
 | 
			
		||||
    if world.bowser_castle_doors[player] == "fast":
 | 
			
		||||
        shuffled_level_list.append(0x82)
 | 
			
		||||
        shuffled_level_list.append(0x32)
 | 
			
		||||
    elif world.bowser_castle_doors[player] == "slow":
 | 
			
		||||
        shuffled_level_list.append(0x31)
 | 
			
		||||
        shuffled_level_list.append(0x81)
 | 
			
		||||
    else:
 | 
			
		||||
        shuffled_level_list.append(0x31)
 | 
			
		||||
        shuffled_level_list.append(0x32)
 | 
			
		||||
 | 
			
		||||
    shuffled_level_list.append(0x30)
 | 
			
		||||
 | 
			
		||||
    # Star Road
 | 
			
		||||
    shuffled_level_list.append(0x5B)
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x53)
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x52)
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x57)
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x5C)
 | 
			
		||||
    shuffled_level_list.append(double_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x55)
 | 
			
		||||
 | 
			
		||||
    # Special Zone
 | 
			
		||||
    shuffled_level_list.append(0x4D)
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(single_levels_copy.pop(0))
 | 
			
		||||
    shuffled_level_list.append(0x48)
 | 
			
		||||
 | 
			
		||||
    return shuffled_level_list
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,233 @@
 | 
			
		|||
import typing
 | 
			
		||||
 | 
			
		||||
from BaseClasses import Location
 | 
			
		||||
from .Names import LocationName
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWLocation(Location):
 | 
			
		||||
    game: str = "Super Mario World"
 | 
			
		||||
 | 
			
		||||
    def __init__(self, player: int, name: str = '', address: int = None, parent=None, prog_byte: int = None, prog_bit: int = None):
 | 
			
		||||
        super().__init__(player, name, address, parent)
 | 
			
		||||
        self.progress_byte = prog_byte
 | 
			
		||||
        self.progress_bit  = prog_bit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
level_location_table = {
 | 
			
		||||
    LocationName.yoshis_island_1_exit_1:  0xBC0000,
 | 
			
		||||
    LocationName.yoshis_island_2_exit_1:  0xBC0001,
 | 
			
		||||
    LocationName.yoshis_island_3_exit_1:  0xBC0002,
 | 
			
		||||
    LocationName.yoshis_island_4_exit_1:  0xBC0003,
 | 
			
		||||
    LocationName.yoshis_island_castle:    0xBC0004,
 | 
			
		||||
    LocationName.yoshis_island_koopaling: 0xBC00A0,
 | 
			
		||||
 | 
			
		||||
    LocationName.yellow_switch_palace: 0xBC0005,
 | 
			
		||||
 | 
			
		||||
    LocationName.donut_plains_1_exit_1:     0xBC0006,
 | 
			
		||||
    LocationName.donut_plains_1_exit_2:     0xBC0007,
 | 
			
		||||
    LocationName.donut_plains_2_exit_1:     0xBC0008,
 | 
			
		||||
    LocationName.donut_plains_2_exit_2:     0xBC0009,
 | 
			
		||||
    LocationName.donut_plains_3_exit_1:     0xBC000A,
 | 
			
		||||
    LocationName.donut_plains_4_exit_1:     0xBC000B,
 | 
			
		||||
    LocationName.donut_secret_1_exit_1:     0xBC000C,
 | 
			
		||||
    LocationName.donut_secret_1_exit_2:     0xBC000D,
 | 
			
		||||
    LocationName.donut_secret_2_exit_1:     0xBC0063,
 | 
			
		||||
    LocationName.donut_ghost_house_exit_1:  0xBC000E,
 | 
			
		||||
    LocationName.donut_ghost_house_exit_2:  0xBC000F,
 | 
			
		||||
    LocationName.donut_secret_house_exit_1: 0xBC0010,
 | 
			
		||||
    LocationName.donut_secret_house_exit_2: 0xBC0011,
 | 
			
		||||
    LocationName.donut_plains_castle:       0xBC0012,
 | 
			
		||||
    LocationName.donut_plains_koopaling:    0xBC00A1,
 | 
			
		||||
 | 
			
		||||
    LocationName.green_switch_palace: 0xBC0013,
 | 
			
		||||
 | 
			
		||||
    LocationName.vanilla_dome_1_exit_1:      0xBC0014,
 | 
			
		||||
    LocationName.vanilla_dome_1_exit_2:      0xBC0015,
 | 
			
		||||
    LocationName.vanilla_dome_2_exit_1:      0xBC0016,
 | 
			
		||||
    LocationName.vanilla_dome_2_exit_2:      0xBC0017,
 | 
			
		||||
    LocationName.vanilla_dome_3_exit_1:      0xBC0018,
 | 
			
		||||
    LocationName.vanilla_dome_4_exit_1:      0xBC0019,
 | 
			
		||||
    LocationName.vanilla_secret_1_exit_1:    0xBC001A,
 | 
			
		||||
    LocationName.vanilla_secret_1_exit_2:    0xBC001B,
 | 
			
		||||
    LocationName.vanilla_secret_2_exit_1:    0xBC001C,
 | 
			
		||||
    LocationName.vanilla_secret_3_exit_1:    0xBC001D,
 | 
			
		||||
    LocationName.vanilla_ghost_house_exit_1: 0xBC001E,
 | 
			
		||||
    LocationName.vanilla_fortress:           0xBC0020,
 | 
			
		||||
    LocationName.vanilla_reznor:             0xBC00B0,
 | 
			
		||||
    LocationName.vanilla_dome_castle:        0xBC0021,
 | 
			
		||||
    LocationName.vanilla_dome_koopaling:     0xBC00A2,
 | 
			
		||||
 | 
			
		||||
    LocationName.red_switch_palace: 0xBC0022,
 | 
			
		||||
 | 
			
		||||
    LocationName.butter_bridge_1_exit_1: 0xBC0023,
 | 
			
		||||
    LocationName.butter_bridge_2_exit_1: 0xBC0024,
 | 
			
		||||
    LocationName.cheese_bridge_exit_1:   0xBC0025,
 | 
			
		||||
    LocationName.cheese_bridge_exit_2:   0xBC0026,
 | 
			
		||||
    LocationName.cookie_mountain_exit_1: 0xBC0027,
 | 
			
		||||
    LocationName.soda_lake_exit_1:       0xBC0028,
 | 
			
		||||
    LocationName.twin_bridges_castle:    0xBC0029,
 | 
			
		||||
    LocationName.twin_bridges_koopaling: 0xBC00A3,
 | 
			
		||||
 | 
			
		||||
    LocationName.forest_of_illusion_1_exit_1: 0xBC002A,
 | 
			
		||||
    LocationName.forest_of_illusion_1_exit_2: 0xBC002B,
 | 
			
		||||
    LocationName.forest_of_illusion_2_exit_1: 0xBC002C,
 | 
			
		||||
    LocationName.forest_of_illusion_2_exit_2: 0xBC002D,
 | 
			
		||||
    LocationName.forest_of_illusion_3_exit_1: 0xBC002E,
 | 
			
		||||
    LocationName.forest_of_illusion_3_exit_2: 0xBC002F,
 | 
			
		||||
    LocationName.forest_of_illusion_4_exit_1: 0xBC0030,
 | 
			
		||||
    LocationName.forest_of_illusion_4_exit_2: 0xBC0031,
 | 
			
		||||
    LocationName.forest_ghost_house_exit_1:   0xBC0032,
 | 
			
		||||
    LocationName.forest_ghost_house_exit_2:   0xBC0033,
 | 
			
		||||
    LocationName.forest_secret_exit_1:        0xBC0034,
 | 
			
		||||
    LocationName.forest_fortress:             0xBC0035,
 | 
			
		||||
    LocationName.forest_reznor:               0xBC00B1,
 | 
			
		||||
    LocationName.forest_castle:               0xBC0036,
 | 
			
		||||
    LocationName.forest_koopaling:            0xBC00A4,
 | 
			
		||||
 | 
			
		||||
    LocationName.blue_switch_palace:      0xBC0037,
 | 
			
		||||
 | 
			
		||||
    LocationName.chocolate_island_1_exit_1:    0xBC0038,
 | 
			
		||||
    LocationName.chocolate_island_2_exit_1:    0xBC0039,
 | 
			
		||||
    LocationName.chocolate_island_2_exit_2:    0xBC003A,
 | 
			
		||||
    LocationName.chocolate_island_3_exit_1:    0xBC003B,
 | 
			
		||||
    LocationName.chocolate_island_3_exit_2:    0xBC003C,
 | 
			
		||||
    LocationName.chocolate_island_4_exit_1:    0xBC003D,
 | 
			
		||||
    LocationName.chocolate_island_5_exit_1:    0xBC003E,
 | 
			
		||||
    LocationName.chocolate_ghost_house_exit_1: 0xBC003F,
 | 
			
		||||
    LocationName.chocolate_secret_exit_1:      0xBC0041,
 | 
			
		||||
    LocationName.chocolate_fortress:           0xBC0042,
 | 
			
		||||
    LocationName.chocolate_reznor:             0xBC00B2,
 | 
			
		||||
    LocationName.chocolate_castle:             0xBC0043,
 | 
			
		||||
    LocationName.chocolate_koopaling:          0xBC00A5,
 | 
			
		||||
 | 
			
		||||
    LocationName.sunken_ghost_ship:    0xBC0044,
 | 
			
		||||
 | 
			
		||||
    LocationName.valley_of_bowser_1_exit_1: 0xBC0045,
 | 
			
		||||
    LocationName.valley_of_bowser_2_exit_1: 0xBC0046,
 | 
			
		||||
    LocationName.valley_of_bowser_2_exit_2: 0xBC0047,
 | 
			
		||||
    LocationName.valley_of_bowser_3_exit_1: 0xBC0048,
 | 
			
		||||
    LocationName.valley_of_bowser_4_exit_1: 0xBC0049,
 | 
			
		||||
    LocationName.valley_of_bowser_4_exit_2: 0xBC004A,
 | 
			
		||||
    LocationName.valley_ghost_house_exit_1: 0xBC004B,
 | 
			
		||||
    LocationName.valley_ghost_house_exit_2: 0xBC004C,
 | 
			
		||||
    LocationName.valley_fortress:           0xBC004E,
 | 
			
		||||
    LocationName.valley_reznor:             0xBC00B3,
 | 
			
		||||
    LocationName.valley_castle:             0xBC004F,
 | 
			
		||||
    LocationName.valley_koopaling:          0xBC00A6,
 | 
			
		||||
 | 
			
		||||
    LocationName.star_road_1_exit_1: 0xBC0051,
 | 
			
		||||
    LocationName.star_road_1_exit_2: 0xBC0052,
 | 
			
		||||
    LocationName.star_road_2_exit_1: 0xBC0053,
 | 
			
		||||
    LocationName.star_road_2_exit_2: 0xBC0054,
 | 
			
		||||
    LocationName.star_road_3_exit_1: 0xBC0055,
 | 
			
		||||
    LocationName.star_road_3_exit_2: 0xBC0056,
 | 
			
		||||
    LocationName.star_road_4_exit_1: 0xBC0057,
 | 
			
		||||
    LocationName.star_road_4_exit_2: 0xBC0058,
 | 
			
		||||
    LocationName.star_road_5_exit_1: 0xBC0059,
 | 
			
		||||
    LocationName.star_road_5_exit_2: 0xBC005A,
 | 
			
		||||
 | 
			
		||||
    LocationName.special_zone_1_exit_1: 0xBC005B,
 | 
			
		||||
    LocationName.special_zone_2_exit_1: 0xBC005C,
 | 
			
		||||
    LocationName.special_zone_3_exit_1: 0xBC005D,
 | 
			
		||||
    LocationName.special_zone_4_exit_1: 0xBC005E,
 | 
			
		||||
    LocationName.special_zone_5_exit_1: 0xBC005F,
 | 
			
		||||
    LocationName.special_zone_6_exit_1: 0xBC0060,
 | 
			
		||||
    LocationName.special_zone_7_exit_1: 0xBC0061,
 | 
			
		||||
    LocationName.special_zone_8_exit_1: 0xBC0062,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dragon_coin_location_table = {
 | 
			
		||||
    LocationName.yoshis_island_1_dragon: 0xBC0100,
 | 
			
		||||
    LocationName.yoshis_island_2_dragon: 0xBC0101,
 | 
			
		||||
    LocationName.yoshis_island_3_dragon: 0xBC0102,
 | 
			
		||||
    LocationName.yoshis_island_4_dragon: 0xBC0103,
 | 
			
		||||
 | 
			
		||||
    LocationName.donut_plains_1_dragon: 0xBC0106,
 | 
			
		||||
    LocationName.donut_plains_2_dragon: 0xBC0108,
 | 
			
		||||
    LocationName.donut_plains_3_dragon: 0xBC010A,
 | 
			
		||||
    LocationName.donut_plains_4_dragon: 0xBC010B,
 | 
			
		||||
    LocationName.donut_secret_1_dragon: 0xBC010C,
 | 
			
		||||
    LocationName.donut_secret_2_dragon: 0xBC010D,
 | 
			
		||||
 | 
			
		||||
    LocationName.vanilla_dome_1_dragon:      0xBC0114,
 | 
			
		||||
    LocationName.vanilla_dome_2_dragon:      0xBC0116,
 | 
			
		||||
    LocationName.vanilla_dome_3_dragon:      0xBC0118,
 | 
			
		||||
    LocationName.vanilla_dome_4_dragon:      0xBC0119,
 | 
			
		||||
    LocationName.vanilla_secret_1_dragon:    0xBC011A,
 | 
			
		||||
    LocationName.vanilla_secret_2_dragon:    0xBC011C,
 | 
			
		||||
    LocationName.vanilla_secret_3_dragon:    0xBC011D,
 | 
			
		||||
    LocationName.vanilla_ghost_house_dragon: 0xBC011E,
 | 
			
		||||
 | 
			
		||||
    LocationName.butter_bridge_1_dragon: 0xBC0123,
 | 
			
		||||
    LocationName.butter_bridge_2_dragon: 0xBC0124,
 | 
			
		||||
    LocationName.cheese_bridge_dragon:   0xBC0125,
 | 
			
		||||
    LocationName.cookie_mountain_dragon: 0xBC0127,
 | 
			
		||||
    LocationName.soda_lake_dragon:       0xBC0128,
 | 
			
		||||
 | 
			
		||||
    LocationName.forest_of_illusion_2_dragon: 0xBC012C,
 | 
			
		||||
    LocationName.forest_of_illusion_3_dragon: 0xBC012E,
 | 
			
		||||
    LocationName.forest_of_illusion_4_dragon: 0xBC0130,
 | 
			
		||||
    LocationName.forest_ghost_house_dragon:   0xBC0132,
 | 
			
		||||
    LocationName.forest_secret_dragon:        0xBC0134,
 | 
			
		||||
    LocationName.forest_castle_dragon:        0xBC0136,
 | 
			
		||||
 | 
			
		||||
    LocationName.chocolate_island_1_dragon:    0xBC0138,
 | 
			
		||||
    LocationName.chocolate_island_2_dragon:    0xBC0139,
 | 
			
		||||
    LocationName.chocolate_island_3_dragon:    0xBC013B,
 | 
			
		||||
    LocationName.chocolate_island_4_dragon:    0xBC013D,
 | 
			
		||||
    LocationName.chocolate_island_5_dragon:    0xBC013E,
 | 
			
		||||
 | 
			
		||||
    LocationName.sunken_ghost_ship_dragon: 0xBC0144,
 | 
			
		||||
 | 
			
		||||
    LocationName.valley_of_bowser_1_dragon: 0xBC0145,
 | 
			
		||||
    LocationName.valley_of_bowser_2_dragon: 0xBC0146,
 | 
			
		||||
    LocationName.valley_of_bowser_3_dragon: 0xBC0148,
 | 
			
		||||
    LocationName.valley_ghost_house_dragon: 0xBC014B,
 | 
			
		||||
    LocationName.valley_castle_dragon:      0xBC014F,
 | 
			
		||||
 | 
			
		||||
    LocationName.star_road_1_dragon: 0xBC0151,
 | 
			
		||||
 | 
			
		||||
    LocationName.special_zone_1_dragon: 0xBC015B,
 | 
			
		||||
    LocationName.special_zone_2_dragon: 0xBC015C,
 | 
			
		||||
    LocationName.special_zone_3_dragon: 0xBC015D,
 | 
			
		||||
    LocationName.special_zone_4_dragon: 0xBC015E,
 | 
			
		||||
    LocationName.special_zone_5_dragon: 0xBC015F,
 | 
			
		||||
    LocationName.special_zone_6_dragon: 0xBC0160,
 | 
			
		||||
    LocationName.special_zone_7_dragon: 0xBC0161,
 | 
			
		||||
    LocationName.special_zone_8_dragon: 0xBC0162,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bowser_location_table = {
 | 
			
		||||
    LocationName.bowser: 0xBC0200,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
yoshi_house_location_table = {
 | 
			
		||||
    LocationName.yoshis_house: 0xBC0201,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
all_locations = {
 | 
			
		||||
    **level_location_table,
 | 
			
		||||
    **dragon_coin_location_table,
 | 
			
		||||
    **bowser_location_table,
 | 
			
		||||
    **yoshi_house_location_table,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
location_table = {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def setup_locations(world, player: int):
 | 
			
		||||
    location_table = {**level_location_table}
 | 
			
		||||
 | 
			
		||||
    # Dragon Coins here
 | 
			
		||||
    if world.dragon_coin_checks[player].value:
 | 
			
		||||
        location_table.update({**dragon_coin_location_table})
 | 
			
		||||
 | 
			
		||||
    if world.goal[player] == "yoshi_egg_hunt":
 | 
			
		||||
        location_table.update({**yoshi_house_location_table})
 | 
			
		||||
    else:
 | 
			
		||||
        location_table.update({**bowser_location_table})
 | 
			
		||||
 | 
			
		||||
    return location_table
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
lookup_id_to_name: typing.Dict[int, str] = {id: name for name, _ in all_locations.items()}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
# Junk Definitions
 | 
			
		||||
one_up_mushroom  = "1-Up Mushroom"
 | 
			
		||||
 | 
			
		||||
# Collectable Definitions
 | 
			
		||||
yoshi_egg = "Yoshi Egg"
 | 
			
		||||
 | 
			
		||||
# Upgrade Definitions
 | 
			
		||||
mario_run           = "Run"
 | 
			
		||||
mario_carry         = "Carry"
 | 
			
		||||
mario_swim          = "Swim"
 | 
			
		||||
mario_spin_jump     = "Spin Jump"
 | 
			
		||||
mario_climb         = "Climb"
 | 
			
		||||
yoshi_activate      = "Yoshi"
 | 
			
		||||
p_switch            = "P-Switch"
 | 
			
		||||
p_balloon           = "P-Balloon"
 | 
			
		||||
progressive_powerup = "Progressive Powerup"
 | 
			
		||||
super_star_active   = "Super Star Activate"
 | 
			
		||||
 | 
			
		||||
# Switch Palace Definitions
 | 
			
		||||
yellow_switch_palace = "Yellow Switch Palace"
 | 
			
		||||
green_switch_palace  = "Green Switch Palace"
 | 
			
		||||
red_switch_palace    = "Red Switch Palace"
 | 
			
		||||
blue_switch_palace   = "Blue Switch Palace"
 | 
			
		||||
 | 
			
		||||
# Trap Definitions
 | 
			
		||||
ice_trap        = "Ice Trap"
 | 
			
		||||
stun_trap       = "Stun Trap"
 | 
			
		||||
literature_trap = "Literature Trap"
 | 
			
		||||
 | 
			
		||||
# Other Definitions
 | 
			
		||||
victory   = "The Princess"
 | 
			
		||||
koopaling = "Boss Token"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
lit_trap_text_list = [
 | 
			
		||||
[[0x8, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1b, 0x9f, 0x5, 0x44, 0x40, 0x51, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x48, 0x4d, 0x43, 0x1c, 0x4a, 0x48, 0x4b, 0x4b, 0x44, 0x51, 0x1b, 0x1f, 0x5, 0x44, 0x40, 0x51, 0x9f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1c, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x41, 0x51, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x53, 0x4e, 0x53, 0x40, 0xcb, 0x4e, 0x41, 0x4b, 0x48, 0x53, 0x44, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x8, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x45, 0x40, 0x42, 0x44, 0x1f, 0x4c, 0x58, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x9b, ], [0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x44, 0x51, 0x4c, 0x48, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x53, 0x4e, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x4c, 0x44, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x4c, 0x44, 0x1b, 0x9f, 0x0, 0x4d, 0x43, 0x1f, 0x56, 0x47, 0x44, 0x4d, 0x1f, 0x48, 0x53, 0x1f, 0x47, 0x40, 0x52, 0x9f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x4f, 0x40, 0x52, 0x53, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x53, 0x54, 0x51, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x48, 0x4d, 0x4d, 0x44, 0x51, 0x1f, 0x44, 0x58, 0xc4, 0x53, 0x4e, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x48, 0x53, 0x52, 0x1f, 0x4f, 0x40, 0x53, 0x47, 0x1b, 0x9f, 0x16, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1f, 0x47, 0x40, 0xd2, ], [0x46, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x41, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0xe, 0x4d, 0x4b, 0x58, 0x1f, 0x88, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x1b, 0x9f, 0x1c, 0x7, 0x44, 0x51, 0x41, 0x44, 0x51, 0x53, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x0, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x53, 0x47, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0xd2, 0x8, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x41, 0x52, 0x4e, 0x4b, 0x54, 0x53, 0x44, 0x4b, 0x58, 0x9f, 0x4f, 0x4e, 0x52, 0x48, 0x53, 0x48, 0x55, 0x44, 0x1b, 0x1f, 0x5, 0x48, 0x51, 0x52, 0x53, 0x1d, 0x9f, 0x4, 0x43, 0x56, 0x40, 0x51, 0x43, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x55, 0x40, 0x4c, 0x4f, 0x48, 0x51, 0x44, 0x1b, 0x1f, 0x12, 0x44, 0x42, 0x4e, 0x4d, 0x43, 0x1d, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x9f, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x1c, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x47, 0x4e, 0x56, 0x9f, ], [0x4f, 0x4e, 0x53, 0x44, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x9f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x1c, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x48, 0x51, 0x52, 0x53, 0x44, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x58, 0x9f, 0x41, 0x4b, 0x4e, 0x4e, 0x43, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x48, 0x51, 0x43, 0x1d, 0x9f, 0x8, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x54, 0x4d, 0x42, 0x4e, 0x4d, 0x43, 0x48, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x51, 0x51, 0x44, 0x55, 0x4e, 0x42, 0x40, 0x41, 0x4b, 0x58, 0x1f, 0x48, 0xcd, 0x4b, 0x4e, 0x55, 0x44, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x47, 0x48, 0x4c, 0x1b, 0x9f, ], [0x1c, 0xc, 0x44, 0x58, 0x44, 0x51, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x12, 0x40, 0x58, 0x1a, 0x1f, 0x8, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x9f, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x4c, 0x1a, 0x1f, 0x8, 0x9f, 0x43, 0x4e, 0x1a, 0x1f, 0x8, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1d, 0x9f, 0x12, 0x40, 0x4c, 0x1c, 0x8, 0x1c, 0x40, 0x4c, 0x1a, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x9f, 0x40, 0x1f, 0x41, 0x4e, 0x40, 0x53, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x40, 0x53, 0x1b, 0x1b, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, ], [0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0xcd, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x40, 0x48, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x4e, 0x4d, 0x1f, 0xc0, 0x53, 0x51, 0x40, 0x48, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x42, 0x40, 0x51, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x53, 0x51, 0x44, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x52, 0x4e, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1d, 0x1f, 0x52, 0x4e, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1d, 0x1f, 0x58, 0x4e, 0xd4, 0x52, 0x44, 0x44, 0x1a, 0x1f, 0x12, 0x4e, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0xd3, ], [0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x41, 0x4e, 0x57, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x1f, 0x45, 0x4e, 0x57, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x1f, 0xc0, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x9f, 0x4c, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x53, 0x47, 0x44, 0x51, 0x44, 0x1b, 0x1f, 0x12, 0x40, 0x58, 0x1a, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0xcb, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4d, 0x58, 0x56, 0x47, 0x44, 0x51, 0x44, 0x9a, 0x8, 0x1f, 0x43, 0x4e, 0x1f, 0x52, 0x4e, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x46, 0x51, 0x44, 0x44, 0xcd, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x4c, 0x1a, 0x9f, 0x13, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x1a, 0x1f, 0x13, 0x47, 0x40, 0x4d, 0x4a, 0x9f, 0x58, 0x4e, 0x54, 0x1d, 0x1f, 0x12, 0x40, 0x4c, 0x1c, 0x8, 0x1c, 0x40, 0x4c, 0x1a, 0x9f, 0x1c, 0x12, 0x44, 0x54, 0x52, 0x52, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x1, 0x54, 0x53, 0x1d, 0x1f, 0x52, 0x4e, 0x45, 0x53, 0x1a, 0x1f, 0x56, 0x47, 0x40, 0x53, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x58, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x52, 0x1e, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x44, 0x40, 0x52, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x9, 0x54, 0x4b, 0x48, 0x44, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x54, 0x4d, 0x1b, 0x1f, 0x0, 0x51, 0x48, 0x52, 0x44, 0x9d, 0x45, 0x40, 0x48, 0x51, 0x1f, 0x52, 0x54, 0x4d, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4a, 0x48, 0x4b, 0xcb, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x55, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1d, 0x9f, ], [0x16, 0x47, 0x4e, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x4b, 0x51, 0x44, 0x40, 0x43, 0x58, 0x9f, 0x52, 0x48, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x1f, 0x56, 0x48, 0x53, 0xc7, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1d, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x9f, 0x47, 0x44, 0x51, 0x1f, 0x4c, 0x40, 0x48, 0x43, 0x1f, 0x40, 0x51, 0x53, 0x1f, 0x45, 0x40, 0x51, 0x9f, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x45, 0x40, 0x48, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x52, 0x47, 0x44, 0x1b, 0x1f, 0x1, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x47, 0x44, 0x51, 0x9f, 0x4c, 0x40, 0x48, 0x43, 0x1d, 0x1f, 0x52, 0x48, 0x4d, 0x42, 0x44, 0x1f, 0x52, 0x47, 0x44, 0x1f, 0x48, 0xd2, 0x44, 0x4d, 0x55, 0x48, 0x4e, 0x54, 0x52, 0x1b, 0x1f, 0x7, 0x44, 0x51, 0x9f, ], [0x55, 0x44, 0x52, 0x53, 0x40, 0x4b, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x48, 0x52, 0x9f, 0x41, 0x54, 0x53, 0x1f, 0x52, 0x48, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x46, 0x51, 0x44, 0x44, 0xcd, 0x0, 0x4d, 0x43, 0x1f, 0x4d, 0x4e, 0x4d, 0x44, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x45, 0x4e, 0x4e, 0x4b, 0xd2, 0x43, 0x4e, 0x1f, 0x56, 0x44, 0x40, 0x51, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x42, 0x40, 0x52, 0x53, 0x9f, 0x48, 0x53, 0x1f, 0x4e, 0x45, 0x45, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4c, 0x58, 0x9f, 0x4b, 0x40, 0x43, 0x58, 0x1d, 0x1f, 0xe, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4c, 0x58, 0x9f, 0x4b, 0x4e, 0x55, 0x44, 0x1a, 0x1f, 0xe, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x4a, 0x4d, 0x44, 0x56, 0x1f, 0x52, 0x47, 0x44, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1a, 0x9f, ], [0x1c, 0x12, 0x47, 0x40, 0x4a, 0x44, 0x52, 0x4f, 0x44, 0x40, 0x51, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x52, 0x53, 0x1f, 0x4e, 0xc5, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x52, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0xd3, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x46, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x56, 0x48, 0x52, 0x43, 0x4e, 0x4c, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x40, 0x46, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x45, 0x4e, 0x4e, 0x4b, 0x48, 0x52, 0x47, 0x4d, 0x44, 0x52, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4f, 0x4e, 0x42, 0x47, 0x1f, 0x4e, 0x45, 0x9f, ], [0x41, 0x44, 0x4b, 0x48, 0x44, 0x45, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x44, 0x4f, 0x4e, 0x42, 0x47, 0x1f, 0x4e, 0x45, 0x9f, 0x48, 0x4d, 0x42, 0x51, 0x44, 0x43, 0x54, 0x4b, 0x48, 0x53, 0x58, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x9f, 0x43, 0x40, 0x51, 0x4a, 0x4d, 0x44, 0x52, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x4e, 0x45, 0x9f, ], [0x47, 0x4e, 0x4f, 0x44, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x44, 0x52, 0x4f, 0x40, 0x48, 0x51, 0x9b, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x44, 0x4d, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xc, 0x40, 0x51, 0x4b, 0x44, 0x58, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x1d, 0x9f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x1f, 0x43, 0x4e, 0x54, 0x41, 0x53, 0x9f, 0x56, 0x47, 0x40, 0x53, 0x44, 0x55, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x51, 0x44, 0x46, 0x48, 0x52, 0x53, 0x44, 0xd1, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x41, 0x54, 0x51, 0x48, 0x40, 0x4b, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x52, 0x48, 0x46, 0x4d, 0x44, 0x43, 0x1f, 0x41, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x4b, 0x44, 0x51, 0x46, 0x58, 0x4c, 0x40, 0x4d, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x42, 0x4b, 0x44, 0x51, 0x4a, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x53, 0x40, 0x4a, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x47, 0x48, 0x44, 0x45, 0x1f, 0x4c, 0x4e, 0x54, 0x51, 0x4d, 0x44, 0x51, 0x9b, 0x12, 0x42, 0x51, 0x4e, 0x4e, 0x46, 0x44, 0x1f, 0x52, 0x48, 0x46, 0x4d, 0x44, 0x43, 0x1f, 0x48, 0x53, 0x9b, 0x40, 0x4d, 0x43, 0x1f, 0x12, 0x42, 0x51, 0x4e, 0x4e, 0x46, 0x44, 0x5d, 0x52, 0x1f, 0x4d, 0x40, 0x4c, 0xc4, 0x56, 0x40, 0x52, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x54, 0x4f, 0x4e, 0x4d, 0x9f, 0x5d, 0x42, 0x47, 0x40, 0x4d, 0x46, 0x44, 0x1d, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x47, 0x44, 0x1f, 0x42, 0x47, 0x4e, 0x52, 0x44, 0x9f, ], [0x53, 0x4e, 0x1f, 0x4f, 0x54, 0x53, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x4e, 0x1b, 0x1f, 0xe, 0x4b, 0x43, 0x1f, 0xc, 0x40, 0x51, 0x4b, 0x44, 0x58, 0x1f, 0x56, 0x40, 0xd2, 0x40, 0x52, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x43, 0x4e, 0x4e, 0x51, 0x1c, 0x4d, 0x40, 0x48, 0x4b, 0x1b, 0x9f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x44, 0x4d, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xc, 0x40, 0x4d, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x9f, 0x43, 0x44, 0x52, 0x44, 0x51, 0x55, 0x44, 0x1f, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, 0x52, 0x4e, 0x4c, 0x44, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x48, 0x44, 0x9f, 0x43, 0x44, 0x52, 0x44, 0x51, 0x55, 0x44, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1b, 0x1f, 0x2, 0x40, 0x4d, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x1f, 0x48, 0x53, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1e, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x1f, 0x43, 0x4e, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x53, 0x4e, 0x4e, 0x1f, 0x44, 0x40, 0x46, 0x44, 0x51, 0x1f, 0x53, 0x4e, 0x9f, 0x43, 0x44, 0x40, 0x4b, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x48, 0x4d, 0x9f, ], [0x49, 0x54, 0x43, 0x46, 0x44, 0x4c, 0x44, 0x4d, 0x53, 0x1b, 0x1f, 0x5, 0x4e, 0x51, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x56, 0x48, 0x52, 0xc4, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x44, 0x4d, 0x43, 0x52, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x40, 0x42, 0x4a, 0x4d, 0x4e, 0x56, 0x4b, 0x44, 0x43, 0x46, 0x44, 0x43, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0xd3, 0x40, 0x1f, 0x52, 0x48, 0x4d, 0x46, 0x4b, 0x44, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x48, 0x4d, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x44, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x53, 0x54, 0x4d, 0x44, 0x1d, 0x1f, 0x4c, 0x54, 0x52, 0xd3, 0x41, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x56, 0x48, 0x45, 0x44, 0x1b, 0x1f, 0x1c, 0x0, 0x54, 0x52, 0x53, 0x44, 0x4d, 0x1f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, 0x42, 0x40, 0x51, 0x51, 0x48, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x40, 0x4c, 0x41, 0x48, 0x46, 0x54, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x54, 0x52, 0x44, 0x43, 0x1f, 0x53, 0x4e, 0x9f, 0x44, 0x57, 0x4f, 0x51, 0x44, 0x52, 0x52, 0x1f, 0x48, 0x53, 0x1b, 0x9f, 0x1c, 0x7, 0x44, 0x51, 0x41, 0x44, 0x51, 0x53, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0x8, 0x1f, 0x43, 0x40, 0x51, 0x44, 0x52, 0x40, 0x58, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x4d, 0x5d, 0x53, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x9f, 0x4f, 0x51, 0x40, 0x42, 0x53, 0x48, 0x42, 0x44, 0x1d, 0x5d, 0x1f, 0x52, 0x40, 0x48, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x10, 0x54, 0x44, 0x44, 0x4d, 0x1b, 0x1f, 0x5d, 0x16, 0x47, 0x44, 0x4d, 0x1f, 0x88, 0x56, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x40, 0x46, 0x44, 0x1d, 0x1f, 0x8, 0x9f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x1f, 0x43, 0x48, 0x43, 0x1f, 0x48, 0x53, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x47, 0x40, 0x4b, 0x45, 0x1c, 0x40, 0x4d, 0x1c, 0x47, 0x4e, 0x54, 0x51, 0x1f, 0x40, 0x9f, 0x43, 0x40, 0x58, 0x1b, 0x1f, 0x16, 0x47, 0x58, 0x1d, 0x9f, ], [0x52, 0x4e, 0x4c, 0x44, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1f, 0x8, 0x5d, 0x55, 0x44, 0x9f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x4c, 0x40, 0x4d, 0x58, 0x9f, 0x40, 0x52, 0x1f, 0x52, 0x48, 0x57, 0x1f, 0x48, 0x4c, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x41, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x45, 0x40, 0x52, 0x53, 0x1b, 0x5d, 0x9f, 0x1c, 0x2, 0x40, 0x51, 0x51, 0x4e, 0x4b, 0x4b, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xb, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x51, 0x54, 0x4b, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x4e, 0x41, 0x4b, 0x48, 0x46, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x53, 0x52, 0x1f, 0x45, 0x51, 0x44, 0x44, 0x43, 0x4e, 0x4c, 0x52, 0x1d, 0x1f, 0x48, 0x52, 0x9f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x1f, 0x52, 0x4e, 0x4d, 0x4d, 0x44, 0x53, 0x1b, 0x9f, 0x18, 0x4e, 0x54, 0x5d, 0x51, 0x44, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x45, 0x4e, 0x51, 0x4c, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0xc4, 0x53, 0x4e, 0x1f, 0x56, 0x51, 0x48, 0x53, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x52, 0x4e, 0x4d, 0x4d, 0x44, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x45, 0x1b, 0x9f, 0x1c, 0xb, 0x5d, 0x4, 0x4d, 0x46, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xb, 0x48, 0x4a, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1f, 0x4e, 0x55, 0x44, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x58, 0x1f, 0x4c, 0x58, 0x1f, 0x46, 0x44, 0x4d, 0x48, 0x54, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x41, 0x51, 0x40, 0x56, 0x4d, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x4b, 0x4e, 0x52, 0xd3, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x52, 0x44, 0x1f, 0x45, 0x4e, 0x4e, 0x4b, 0x52, 0x9f, 0x1c, 0x7, 0x40, 0x48, 0x4a, 0x54, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x4d, 0x1f, 0x40, 0x1f, 0x47, 0x4e, 0x4b, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0xc3, 0x40, 0x1f, 0x47, 0x4e, 0x41, 0x41, 0x48, 0x53, 0x1b, 0x1f, 0xd, 0x4e, 0x53, 0x1f, 0x40, 0x9f, 0x4d, 0x40, 0x52, 0x53, 0x58, 0x1d, 0x1f, 0x43, 0x48, 0x51, 0x53, 0x58, 0x1d, 0x1f, 0x56, 0x44, 0x53, 0x9f, 0x47, 0x4e, 0x4b, 0x44, 0x1d, 0x1f, 0x45, 0x48, 0x4b, 0x4b, 0x44, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x43, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x56, 0x4e, 0x51, 0x4c, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x1f, 0x4e, 0x4e, 0x59, 0x58, 0x1f, 0x52, 0x4c, 0x44, 0x4b, 0x4b, 0x9d, 0x4d, 0x4e, 0x51, 0x1f, 0x58, 0x44, 0x53, 0x1f, 0x40, 0x1f, 0x43, 0x51, 0x58, 0x1d, 0x9f, ], [0x41, 0x40, 0x51, 0x44, 0x1d, 0x1f, 0x52, 0x40, 0x4d, 0x43, 0x58, 0x1f, 0x47, 0x4e, 0x4b, 0x44, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x4d, 0x1f, 0x48, 0xd3, 0x53, 0x4e, 0x1f, 0x52, 0x48, 0x53, 0x1f, 0x43, 0x4e, 0x56, 0x4d, 0x1f, 0x4e, 0x4d, 0x1f, 0x4e, 0x51, 0x9f, 0x53, 0x4e, 0x1f, 0x44, 0x40, 0x53, 0x1b, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x47, 0x4e, 0x41, 0x41, 0x48, 0x53, 0x1c, 0x47, 0x4e, 0x4b, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x44, 0x40, 0x4d, 0x52, 0x9f, 0x42, 0x4e, 0x4c, 0x45, 0x4e, 0x51, 0x53, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0x6, 0x4e, 0x4e, 0x43, 0x1f, 0xc, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1a, 0x5d, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x1, 0x48, 0x4b, 0x41, 0x4e, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0xc4, 0x4c, 0x44, 0x40, 0x4d, 0x53, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x52, 0x54, 0x4d, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x48, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x55, 0x44, 0x51, 0xd8, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x6, 0x40, 0x4d, 0x43, 0x40, 0x4b, 0xc5, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x45, 0x51, 0x4e, 0xcc, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x41, 0x54, 0x52, 0x47, 0x58, 0x9f, ], [0x44, 0x58, 0x44, 0x41, 0x51, 0x4e, 0x56, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x52, 0x53, 0x54, 0x42, 0x4a, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x45, 0x54, 0x51, 0x53, 0x47, 0x44, 0x51, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x51, 0x48, 0x4c, 0x1f, 0x4e, 0x45, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x47, 0x40, 0x43, 0x58, 0x1f, 0x47, 0x40, 0x53, 0x1b, 0x9f, 0x5d, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x4e, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4c, 0x44, 0x40, 0x4d, 0x1e, 0x5d, 0x1f, 0x47, 0x44, 0x1f, 0x52, 0x40, 0x48, 0x43, 0x1b, 0x9f, 0x5d, 0x3, 0x4e, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x48, 0x52, 0x47, 0x1f, 0x4c, 0x44, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x4e, 0x51, 0x9f, ], [0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x56, 0x47, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1f, 0x8, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x4e, 0x51, 0x1f, 0x4d, 0x4e, 0x53, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x45, 0x44, 0x44, 0x4b, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x53, 0x47, 0x48, 0xd2, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0xce, 0x41, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4e, 0x4d, 0x1e, 0x5d, 0x1f, 0x5d, 0x0, 0x4b, 0x4b, 0x9f, ], [0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x53, 0x1f, 0x4e, 0x4d, 0x42, 0x44, 0x1d, 0x5d, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x1, 0x48, 0x4b, 0x41, 0x4e, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0x6, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1a, 0x5d, 0x1f, 0x47, 0xc4, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x1b, 0x1f, 0x5d, 0x16, 0x44, 0x9f, 0x43, 0x4e, 0x4d, 0x5d, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x9f, 0x40, 0x43, 0x55, 0x44, 0x4d, 0x53, 0x54, 0x51, 0x44, 0x52, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1d, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x1a, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x51, 0x58, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x13, 0x47, 0xc4, 0x7, 0x48, 0x4b, 0x4b, 0x1f, 0x4e, 0x51, 0x1f, 0x40, 0x42, 0x51, 0x4e, 0x52, 0x52, 0x1f, 0x13, 0x47, 0xc4, 0x16, 0x40, 0x53, 0x44, 0x51, 0x1b, 0x5d, 0x1f, 0x1, 0x58, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x47, 0xc4, ], [0x4c, 0x44, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x4e, 0x4d, 0x55, 0x44, 0x51, 0x52, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x1f, 0x44, 0x4d, 0x43, 0x1b, 0x1f, 0x5d, 0x16, 0x47, 0x40, 0x53, 0x1f, 0xc0, 0x4b, 0x4e, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x43, 0x4e, 0x1f, 0x54, 0x52, 0x44, 0x1f, 0x6, 0x4e, 0x4e, 0x43, 0x9f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x4e, 0x51, 0x1a, 0x5d, 0x1f, 0x52, 0x40, 0x48, 0xc3, 0x6, 0x40, 0x4d, 0x43, 0x40, 0x4b, 0x45, 0x1b, 0x1f, 0x5d, 0xd, 0x4e, 0x56, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x40, 0x4d, 0xd3, ], [0x53, 0x4e, 0x1f, 0x46, 0x44, 0x53, 0x1f, 0x51, 0x48, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x44, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x4e, 0x4d, 0x5d, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x8, 0x9f, 0x4c, 0x4e, 0x55, 0x44, 0x1f, 0x4e, 0x45, 0x45, 0x1b, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x9f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x48, 0x45, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x42, 0x44, 0x51, 0x53, 0x40, 0x48, 0x4d, 0x4b, 0x58, 0x1f, 0x54, 0x52, 0x54, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x48, 0xc5, 0x58, 0x4e, 0x54, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, ], [0x50, 0x54, 0x48, 0x53, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x44, 0x51, 0xc4, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1b, 0x5d, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x3, 0x51, 0x54, 0x4c, 0x4c, 0x44, 0x51, 0x1d, 0x1f, 0x41, 0x44, 0x40, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x4f, 0x48, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x41, 0x4b, 0x4e, 0x56, 0x1b, 0x9f, 0x7, 0x40, 0x51, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x52, 0x53, 0x51, 0x48, 0x4a, 0x44, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x4b, 0x43, 0x48, 0x44, 0x51, 0x1d, 0x1f, 0x46, 0x4e, 0x1b, 0x9f, 0x5, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x4b, 0x40, 0x4c, 0x44, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x44, 0x40, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x44, 0x52, 0x1d, 0x9f, 0x13, 0x48, 0x4b, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x56, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x11, 0x44, 0x43, 0x1f, 0x12, 0x53, 0x40, 0x51, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x44, 0x52, 0x1b, 0x9f, ], [0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x1f, 0x53, 0x44, 0x40, 0x51, 0x52, 0x1f, 0x8, 0x1f, 0x45, 0x44, 0x44, 0x4b, 0x9f, 0x53, 0x4e, 0x43, 0x40, 0x58, 0x1f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x56, 0x40, 0x48, 0x53, 0x1f, 0x53, 0xce, 0x52, 0x47, 0x44, 0x43, 0x1f, 0x53, 0x4e, 0x4c, 0x4e, 0x51, 0x51, 0x4e, 0x56, 0x1b, 0x9f, 0x13, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x4d, 0x48, 0x46, 0x47, 0x53, 0x9f, 0xd, 0x4e, 0x51, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x51, 0x42, 0x44, 0x40, 0x52, 0x44, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x52, 0x4e, 0x51, 0x51, 0x4e, 0x56, 0x1b, 0x1f, 0xc, 0x58, 0x9f, 0x44, 0x58, 0x44, 0x52, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x9f, ], [0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x52, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x1f, 0x8, 0x9f, 0x43, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x41, 0x44, 0x9f, 0x53, 0x44, 0x40, 0x51, 0x1c, 0x41, 0x4b, 0x48, 0x4d, 0x43, 0x44, 0x43, 0x1b, 0x1f, 0x8, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x45, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x40, 0x4b, 0x4a, 0x1f, 0xd, 0x4e, 0x53, 0x1f, 0x42, 0x47, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1d, 0x9f, 0x42, 0x4b, 0x44, 0x40, 0x51, 0x1c, 0x4c, 0x48, 0x4d, 0x43, 0x44, 0x43, 0x1b, 0x1f, 0xc, 0x58, 0x9f, 0x4c, 0x4e, 0x54, 0x53, 0x47, 0x1f, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x9f, ], [0x41, 0x44, 0x53, 0x51, 0x40, 0x58, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x40, 0x4d, 0x46, 0x54, 0x48, 0x52, 0xc7, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x8, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x18, 0x44, 0x52, 0x1d, 0x9f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x1f, 0x4c, 0x58, 0x1f, 0x53, 0x44, 0x40, 0x51, 0xd2, 0x53, 0x48, 0x4b, 0x1f, 0x4b, 0x40, 0x53, 0x44, 0x51, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x4c, 0x58, 0x9f, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x46, 0x4e, 0x1b, 0x1f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x16, 0x47, 0x4e, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x2, 0x40, 0x4d, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x53, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x3, 0x4e, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0xb, 0x48, 0x55, 0x44, 0x52, 0x1b, 0x9f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x9f, 0x40, 0x4b, 0x4b, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x1f, 0x5, 0x4b, 0x44, 0x56, 0x9f, 0x47, 0x48, 0x52, 0x52, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x40, 0x1b, 0x1f, 0x13, 0x4e, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x1f, 0x44, 0x40, 0x42, 0x47, 0x9f, 0x56, 0x40, 0x55, 0x44, 0x1f, 0x7, 0x44, 0x51, 0x1f, 0x42, 0x4b, 0x54, 0x53, 0x42, 0x47, 0x1f, 0x53, 0xce, 0x52, 0x40, 0x55, 0x44, 0x1f, 0x12, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x4d, 0x53, 0x54, 0x51, 0x44, 0x43, 0x9f, 0x41, 0x51, 0x40, 0x55, 0x44, 0x4b, 0x58, 0x1b, 0x1f, 0x0, 0x52, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x40, 0x53, 0x53, 0x40, 0x42, 0x4a, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x9f, ], [0x48, 0x4d, 0x1f, 0x51, 0x40, 0x46, 0x44, 0x1f, 0x0, 0x9f, 0x47, 0x4e, 0x4b, 0x43, 0x44, 0x51, 0x4c, 0x40, 0x4d, 0x1f, 0x42, 0x40, 0x4c, 0x44, 0x9f, 0x4d, 0x48, 0x46, 0x47, 0x1f, 0x0, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x40, 0x4d, 0x43, 0x1f, 0x5, 0x48, 0x52, 0x47, 0x4d, 0x44, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x47, 0x40, 0x4d, 0x43, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x1f, 0x4c, 0x48, 0x43, 0x52, 0x4a, 0x58, 0x1b, 0x1f, 0x7, 0x44, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x44, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x48, 0x4d, 0x9f, 0x56, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x5, 0x4e, 0x51, 0x1f, 0x4e, 0x45, 0x53, 0x44, 0x4d, 0x9f, ], [0x47, 0x44, 0x5d, 0x43, 0x1f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x53, 0x4e, 0x4b, 0x43, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x2, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x41, 0x44, 0x1f, 0x16, 0x47, 0xce, 0x47, 0x4e, 0x55, 0x44, 0x51, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1d, 0x9f, 0x41, 0x51, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x1f, 0x7, 0x44, 0x9f, 0x52, 0x40, 0x56, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x4f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x40, 0x4d, 0xc3, 0x50, 0x54, 0x48, 0x42, 0x4a, 0x4b, 0x58, 0x1f, 0x7, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x54, 0x4f, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x4b, 0x48, 0x45, 0x45, 0x1f, 0x47, 0x44, 0x9f, ], [0x45, 0x40, 0x42, 0x44, 0x43, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x56, 0x1f, 0x40, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x1f, 0x0, 0x41, 0x4e, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x55, 0x44, 0x1f, 0x8, 0x4d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x47, 0x44, 0x51, 0x9f, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x43, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x9f, 0x40, 0x4b, 0x4b, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x1f, 0x14, 0x4f, 0x4e, 0x4d, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0x43, 0x44, 0x51, 0x1f, 0x52, 0x53, 0x4e, 0x4e, 0xc3, 0x7, 0x44, 0x51, 0x1f, 0x44, 0x58, 0x44, 0x52, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x4b, 0x54, 0x44, 0x9f, ], [0x6, 0x4b, 0x4e, 0x56, 0x44, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x53, 0x51, 0x54, 0xc4, 0x14, 0x4d, 0x43, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x46, 0x51, 0x40, 0x53, 0x48, 0x53, 0x54, 0x43, 0x44, 0x9b, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x7, 0x40, 0x51, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x53, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0xd1, 0x56, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x42, 0x40, 0x51, 0x44, 0x9f, 0x5, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4c, 0x40, 0x58, 0x1f, 0x42, 0x40, 0x54, 0x52, 0xc4, 0x49, 0x4e, 0x58, 0x1f, 0x4e, 0x51, 0x1f, 0x43, 0x44, 0x52, 0x4f, 0x40, 0x48, 0x51, 0x9f, 0x12, 0x48, 0x4d, 0x46, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x52, 0x4e, 0x4d, 0x46, 0x52, 0x1f, 0x4e, 0xc5, 0x47, 0x44, 0x40, 0x4b, 0x53, 0x47, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x1f, 0xe, 0xc5, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x52, 0x1f, 0x45, 0x4b, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x40, 0x41, 0x4e, 0x55, 0x44, 0x1b, 0x9f, ], [0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x4e, 0x4d, 0x4b, 0x58, 0x1f, 0x4e, 0x4d, 0xc4, 0x42, 0x40, 0x53, 0x42, 0x47, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0xd2, 0x2, 0x40, 0x53, 0x42, 0x47, 0x1c, 0x24, 0x24, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x9f, 0x52, 0x4f, 0x44, 0x42, 0x48, 0x45, 0x48, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x44, 0x51, 0x4d, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x4e, 0x4d, 0x44, 0x5d, 0x52, 0x9f, 0x52, 0x40, 0x45, 0x44, 0x53, 0x58, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x40, 0x42, 0xc4, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x51, 0x44, 0x40, 0x4b, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x48, 0x4c, 0x4c, 0x44, 0x43, 0x48, 0x40, 0x53, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x51, 0x4e, 0x42, 0x44, 0x52, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1b, 0x1f, 0xe, 0x51, 0xd1, 0x56, 0x40, 0x52, 0x1f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x41, 0x44, 0x1f, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x44, 0x43, 0x9b, 0x0, 0x4b, 0x4b, 0x1f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x53, 0x4e, 0x1f, 0x43, 0x4e, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x52, 0x4a, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x52, 0x9f, 0x52, 0x4e, 0x4e, 0x4d, 0x1f, 0x40, 0x52, 0x1f, 0x47, 0x44, 0x1f, 0x43, 0x48, 0x43, 0x1d, 0x1f, 0x47, 0xc4, ], [0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x4d, 0x4e, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x44, 0x51, 0x1f, 0x41, 0xc4, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x4b, 0x58, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x4c, 0x48, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x1b, 0x1f, 0xe, 0x51, 0x51, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x41, 0x44, 0x1f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x53, 0x4e, 0x9f, 0x45, 0x4b, 0x58, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0x44, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0x44, 0x9f, ], [0x56, 0x40, 0x52, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x53, 0xce, 0x45, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1b, 0x1f, 0x8, 0x45, 0x1f, 0x47, 0x44, 0x9f, 0x45, 0x4b, 0x44, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x47, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x53, 0x4e, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0xc4, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x53, 0x4e, 0x1b, 0x1f, 0x1c, 0x7, 0x44, 0x4b, 0x4b, 0x44, 0x51, 0x1f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0x44, 0x1f, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0xce, 0x4a, 0x48, 0x4b, 0x4b, 0x1f, 0x4c, 0x44, 0x1d, 0x5d, 0x9f, 0x18, 0x4e, 0x52, 0x52, 0x40, 0x51, 0x48, 0x40, 0x4d, 0x1f, 0x53, 0x4e, 0x4b, 0x43, 0x1f, 0x47, 0x48, 0xcc, 0x42, 0x40, 0x4b, 0x4c, 0x4b, 0x58, 0x1b, 0x1f, 0x5d, 0xd, 0x4e, 0x1f, 0x4e, 0x4d, 0x44, 0x5d, 0x52, 0x9f, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x4a, 0x48, 0x4b, 0x4b, 0x9f, 0x58, 0x4e, 0x54, 0x1d, 0x5d, 0x1f, 0x2, 0x4b, 0x44, 0x55, 0x48, 0x4d, 0x46, 0x44, 0x51, 0x9f, 0x42, 0x51, 0x48, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x4d, 0x1f, 0x56, 0x47, 0x58, 0x9f, 0x40, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x47, 0x4e, 0x4e, 0x53, 0x48, 0x4d, 0x46, 0x9f, ], [0x40, 0x53, 0x1f, 0x4c, 0x44, 0x1e, 0x5d, 0x1f, 0x18, 0x4e, 0x52, 0x52, 0x40, 0x51, 0x48, 0x40, 0x4d, 0x9f, 0x40, 0x52, 0x4a, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0x44, 0x9f, 0x52, 0x47, 0x4e, 0x4e, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x53, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1d, 0x5d, 0x9f, 0x2, 0x4b, 0x44, 0x55, 0x48, 0x4d, 0x46, 0x44, 0x51, 0x9f, 0x40, 0x4d, 0x52, 0x56, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0xc4, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x4a, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1b, 0x5d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, ], [0x56, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x48, 0x45, 0x45, 0x44, 0x51, 0x44, 0x4d, 0x42, 0x44, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x40, 0x4a, 0x44, 0x1e, 0x9f, 0x1c, 0x7, 0x44, 0x4b, 0x4b, 0x44, 0x51, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x18, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x41, 0x51, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x48, 0xcd, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x47, 0x44, 0x40, 0x43, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x47, 0x4e, 0x44, 0x52, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x1f, 0x42, 0x40, 0x4d, 0x9f, 0x52, 0x53, 0x44, 0x44, 0x51, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x45, 0x1f, 0x40, 0x4d, 0xd8, 0x43, 0x48, 0x51, 0x44, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x42, 0x47, 0x4e, 0x4e, 0x52, 0x44, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x5d, 0x51, 0x44, 0x1f, 0x4e, 0x4d, 0x9f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x4e, 0x56, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x58, 0x4e, 0x54, 0x9f, ], [0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x56, 0x47, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x18, 0xe, 0x14, 0x1f, 0x40, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x56, 0x47, 0x4e, 0x5d, 0x4b, 0x4b, 0x9f, 0x43, 0x44, 0x42, 0x48, 0x43, 0x44, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x46, 0x4e, 0x1b, 0x1b, 0x1b, 0x1f, 0x1c, 0x12, 0x54, 0x44, 0x52, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x16, 0x47, 0x44, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x44, 0x4b, 0x48, 0x4c, 0x48, 0x4d, 0x40, 0x53, 0x44, 0x43, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x48, 0x52, 0x9f, 0x48, 0x4c, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x9f, 0x56, 0x47, 0x40, 0x53, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x52, 0x1d, 0x9f, 0x47, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x48, 0x4c, 0x4f, 0x51, 0x4e, 0x41, 0x40, 0x41, 0x4b, 0x44, 0x1d, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x1b, 0x9f, ], [0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5d, 0xc, 0x58, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1d, 0x5d, 0x1f, 0x47, 0x44, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1d, 0x1f, 0x5d, 0x51, 0x44, 0x41, 0x44, 0x4b, 0x52, 0x1f, 0x40, 0x53, 0x9f, 0x52, 0x53, 0x40, 0x46, 0x4d, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x6, 0x48, 0x55, 0x44, 0x9f, 0x4c, 0x44, 0x1f, 0x4f, 0x51, 0x4e, 0x41, 0x4b, 0x44, 0x4c, 0x52, 0x1d, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x9f, 0x4c, 0x44, 0x1f, 0x56, 0x4e, 0x51, 0x4a, 0x1d, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x1f, 0x4c, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x40, 0x41, 0x52, 0x53, 0x51, 0x54, 0x52, 0x44, 0x9f, 0x42, 0x51, 0x58, 0x4f, 0x53, 0x4e, 0x46, 0x51, 0x40, 0x4c, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x48, 0x4d, 0x53, 0x51, 0x48, 0x42, 0x40, 0x53, 0x44, 0x9f, ], [0x40, 0x4d, 0x40, 0x4b, 0x58, 0x52, 0x48, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x40, 0xcc, 0x48, 0x4d, 0x1f, 0x4c, 0x58, 0x1f, 0x4e, 0x56, 0x4d, 0x1f, 0x4f, 0x51, 0x4e, 0x4f, 0x44, 0x51, 0x9f, 0x40, 0x53, 0x4c, 0x4e, 0x52, 0x4f, 0x47, 0x44, 0x51, 0x44, 0x1b, 0x1f, 0x8, 0x1f, 0x42, 0x40, 0x4d, 0x9f, 0x43, 0x48, 0x52, 0x4f, 0x44, 0x4d, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x1f, 0x56, 0x48, 0x53, 0xc7, 0x40, 0x51, 0x53, 0x48, 0x45, 0x48, 0x42, 0x48, 0x40, 0x4b, 0x9f, 0x52, 0x53, 0x48, 0x4c, 0x54, 0x4b, 0x40, 0x4d, 0x53, 0x52, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x8, 0x9f, 0x40, 0x41, 0x47, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x54, 0x4b, 0x4b, 0x9f, 0x51, 0x4e, 0x54, 0x53, 0x48, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x9f, ], [0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1b, 0x1f, 0x8, 0x1f, 0x42, 0x51, 0x40, 0x55, 0xc4, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x44, 0x4d, 0x53, 0x40, 0x4b, 0x9f, 0x44, 0x57, 0x40, 0x4b, 0x53, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x56, 0x47, 0x58, 0x1f, 0x8, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x42, 0x47, 0x4e, 0x52, 0x44, 0x4d, 0x1f, 0x4c, 0x58, 0x1f, 0x4e, 0x56, 0x4d, 0x9f, 0x4f, 0x40, 0x51, 0x53, 0x48, 0x42, 0x54, 0x4b, 0x40, 0x51, 0x9f, 0x4f, 0x51, 0x4e, 0x45, 0x44, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x4e, 0x51, 0x9f, 0x51, 0x40, 0x53, 0x47, 0x44, 0x51, 0x1f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x44, 0x43, 0x1f, 0x48, 0x53, 0x9d, ], [0x45, 0x4e, 0x51, 0x1f, 0x8, 0x1f, 0x40, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4d, 0x4b, 0x58, 0x9f, 0x4e, 0x4d, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1b, 0xdd, 0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xb, 0x48, 0x45, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x4b, 0xd8, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x53, 0x47, 0xc4, 0x4c, 0x48, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x48, 0x4d, 0x55, 0x44, 0x4d, 0x53, 0x1b, 0x1f, 0x16, 0x44, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x43, 0x40, 0x51, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x44, 0x48, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x40, 0x51, 0x44, 0x9f, ], [0x51, 0x44, 0x40, 0x4b, 0x4b, 0x58, 0x1f, 0x4c, 0x44, 0x51, 0x44, 0x9f, 0x42, 0x4e, 0x4c, 0x4c, 0x4e, 0x4d, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1b, 0x1f, 0x8, 0x45, 0x1f, 0x56, 0x44, 0x9f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x45, 0x4b, 0x58, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x4e, 0x45, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x1d, 0x1f, 0x47, 0x4e, 0x55, 0x44, 0x51, 0x9f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x46, 0x51, 0x44, 0x40, 0x53, 0x9f, 0x42, 0x48, 0x53, 0x58, 0x1d, 0x1f, 0x46, 0x44, 0x4d, 0x53, 0x4b, 0x58, 0x9f, ], [0x51, 0x44, 0x4c, 0x4e, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x4e, 0x4e, 0x45, 0x52, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x44, 0x44, 0x4f, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0xd3, 0x53, 0x47, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x46, 0x4e, 0x48, 0x4d, 0x46, 0x9f, 0x4e, 0x4d, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x9f, 0x42, 0x4e, 0x48, 0x4d, 0x42, 0x48, 0x43, 0x44, 0x4d, 0x42, 0x44, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x4b, 0x40, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x51, 0x4e, 0x52, 0x52, 0x1c, 0x4f, 0x54, 0x51, 0x4f, 0x4e, 0x52, 0x44, 0x52, 0x1d, 0x9f, ], [0x53, 0x47, 0x44, 0x1f, 0x56, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x45, 0x54, 0x4b, 0x9f, 0x42, 0x47, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x44, 0x55, 0x44, 0x4d, 0x53, 0x52, 0x1d, 0x9f, 0x56, 0x4e, 0x51, 0x4a, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x46, 0x44, 0x4d, 0x44, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4b, 0x44, 0x40, 0x43, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x4e, 0x54, 0x53, 0x51, 0x44, 0x9f, 0x51, 0x44, 0x52, 0x54, 0x4b, 0x53, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4c, 0x40, 0x4a, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x45, 0x48, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x9f, ], [0x56, 0x48, 0x53, 0x47, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x55, 0x44, 0x4d, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x48, 0x53, 0x48, 0x44, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x44, 0x52, 0x44, 0x44, 0x4d, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x4b, 0x54, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x1f, 0x4c, 0x4e, 0x52, 0x53, 0x9f, 0x52, 0x53, 0x40, 0x4b, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x54, 0x4d, 0x4f, 0x51, 0x4e, 0x45, 0x48, 0x53, 0x40, 0x41, 0x4b, 0x44, 0x1b, 0x9f, 0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x1f, 0x52, 0x53, 0x4e, 0x51, 0x58, 0x1f, 0x52, 0x4e, 0x1f, 0x45, 0x40, 0x51, 0x1b, 0x9f, 0x8, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x44, 0x43, 0x1b, 0x1f, 0x13, 0x47, 0x48, 0x52, 0x1f, 0x47, 0x40, 0x52, 0x9f, 0x4c, 0x40, 0x43, 0x44, 0x1f, 0x40, 0x1f, 0x4b, 0x4e, 0x53, 0x1f, 0x4e, 0x45, 0x9f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x40, 0x4d, 0x46, 0x51, 0x58, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x56, 0x48, 0x43, 0x44, 0x4b, 0x58, 0x9f, 0x51, 0x44, 0x46, 0x40, 0x51, 0x43, 0x44, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x40, 0x1f, 0x41, 0x40, 0x43, 0x9f, ], [0x4c, 0x4e, 0x55, 0x44, 0x1b, 0x1f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x52, 0x53, 0x40, 0x4d, 0x42, 0x44, 0x1d, 0x1f, 0x4e, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x4d, 0x44, 0x53, 0x1f, 0x4, 0x40, 0x51, 0x53, 0x47, 0x1d, 0x9f, 0x4c, 0x40, 0x4d, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, 0x40, 0x52, 0x52, 0x54, 0x4c, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x48, 0x4d, 0x53, 0x44, 0x4b, 0x4b, 0x48, 0x46, 0x44, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x9f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x40, 0x42, 0x47, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x52, 0xce, ], [0x4c, 0x54, 0x42, 0x47, 0x1c, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x47, 0x44, 0x44, 0x4b, 0x1d, 0x9f, 0xd, 0x44, 0x56, 0x1f, 0x18, 0x4e, 0x51, 0x4a, 0x1d, 0x1f, 0x56, 0x40, 0x51, 0x52, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x4e, 0x1f, 0x4e, 0x4d, 0x1c, 0x56, 0x47, 0x48, 0x4b, 0x52, 0x53, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x43, 0x4e, 0x4d, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x4c, 0x54, 0x42, 0xca, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x40, 0x53, 0x44, 0xd1, 0x47, 0x40, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x9f, ], [0x42, 0x4e, 0x4d, 0x55, 0x44, 0x51, 0x52, 0x44, 0x4b, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x1f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x45, 0x40, 0xd1, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x48, 0x4d, 0x53, 0x44, 0x4b, 0x4b, 0x48, 0x46, 0x44, 0x4d, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x4c, 0x40, 0x4d, 0x1b, 0x45, 0x4e, 0x51, 0x9f, 0x4f, 0x51, 0x44, 0x42, 0x48, 0x52, 0x44, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x40, 0x4c, 0xc4, 0x51, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x52, 0x1b, 0x1f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x1f, 0x4e, 0xc5, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1d, 0x1f, 0x52, 0x48, 0x4c, 0x4f, 0x4b, 0x58, 0x9f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x9f, 0x40, 0x4d, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x40, 0x4c, 0x4e, 0x54, 0x4d, 0xd3, 0x4e, 0x45, 0x1f, 0x52, 0x4f, 0x40, 0x42, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x1f, 0x48, 0x4d, 0x1b, 0x1f, 0x7, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x9d, ], [0x4d, 0x4e, 0x53, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x52, 0x1f, 0x48, 0x4d, 0x47, 0x40, 0x41, 0x48, 0x53, 0x44, 0x43, 0x9b, 0x13, 0x47, 0x44, 0x51, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x40, 0x1f, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x48, 0x4d, 0x47, 0x40, 0x41, 0x48, 0x53, 0x44, 0x43, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1b, 0x9f, 0x0, 0x4d, 0x58, 0x1f, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x9f, 0x43, 0x48, 0x55, 0x48, 0x43, 0x44, 0x43, 0x1f, 0x41, 0x58, 0x9f, ], [0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x58, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x52, 0x9f, 0x4d, 0x44, 0x40, 0x51, 0x1f, 0x53, 0x4e, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0xd2, 0x4c, 0x40, 0x4a, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x1f, 0x4e, 0x43, 0x43, 0x52, 0x1d, 0x1f, 0x52, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x55, 0x44, 0x51, 0x40, 0x46, 0x44, 0x9f, 0x4f, 0x4e, 0x4f, 0x54, 0x4b, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x4d, 0x44, 0x53, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0xc4, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x42, 0x40, 0x4d, 0x1f, 0x41, 0x44, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x1f, 0x59, 0x44, 0x51, 0x4e, 0x1b, 0x9f, ], [0x5, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x48, 0x53, 0x9f, 0x45, 0x4e, 0x4b, 0x4b, 0x4e, 0x56, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x4e, 0x4f, 0x54, 0x4b, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x47, 0x4e, 0x4b, 0x44, 0x1f, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x48, 0x52, 0x9f, 0x40, 0x4b, 0x52, 0x4e, 0x1f, 0x59, 0x44, 0x51, 0x4e, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x4c, 0x40, 0x58, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x53, 0x48, 0x4c, 0x44, 0x1f, 0x40, 0x51, 0x44, 0x9f, ], [0x4c, 0x44, 0x51, 0x44, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x51, 0x4e, 0x43, 0x54, 0x42, 0x53, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x43, 0x44, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x43, 0x9f, 0x48, 0x4c, 0x40, 0x46, 0x48, 0x4d, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x9f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0xd8, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x42, 0x4e, 0x4b, 0x43, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x52, 0x44, 0x44, 0x4a, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x9f, 0x44, 0x4d, 0x42, 0x47, 0x40, 0x4d, 0x53, 0x44, 0x43, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x43, 0x56, 0x40, 0x51, 0x55, 0x44, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x58, 0x4e, 0x51, 0x44, 0x1f, 0x4c, 0x40, 0x43, 0x44, 0x1f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x58, 0x9f, 0x52, 0x4f, 0x44, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x16, 0x47, 0x48, 0x4b, 0x44, 0x9f, 0x47, 0x40, 0x4c, 0x4c, 0x44, 0x51, 0x52, 0x1f, 0x45, 0x44, 0x4b, 0x4b, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x9f, 0x51, 0x48, 0x4d, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x41, 0x44, 0x4b, 0x4b, 0x52, 0x1f, 0x8, 0x4d, 0x9f, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1d, 0x1f, 0x56, 0x47, 0x44, 0x51, 0xc4, 0x43, 0x40, 0x51, 0x4a, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x9d, 0x8, 0x4d, 0x1f, 0x47, 0x4e, 0x4b, 0x4b, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x52, 0x9f, ], [0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x44, 0x4b, 0x4b, 0x52, 0x9b, 0x5, 0x4e, 0x51, 0x1f, 0x40, 0x4d, 0x42, 0x48, 0x44, 0x4d, 0x53, 0x1f, 0x4a, 0x48, 0x4d, 0x46, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x44, 0x4b, 0x55, 0x48, 0x52, 0x47, 0x1f, 0x4b, 0x4e, 0x51, 0x43, 0x9f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4c, 0x40, 0x4d, 0x58, 0x1f, 0x40, 0x9f, 0x46, 0x4b, 0x44, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x9f, 0x47, 0x4e, 0x40, 0x51, 0x43, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x4f, 0x44, 0x43, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x42, 0x40, 0x54, 0x46, 0x47, 0x53, 0x9f, ], [0x13, 0x4e, 0x1f, 0x47, 0x48, 0x43, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x46, 0x44, 0x4c, 0x52, 0x1f, 0x4e, 0xcd, 0x47, 0x48, 0x4b, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x52, 0x56, 0x4e, 0x51, 0x43, 0x1b, 0x1f, 0xe, 0x4d, 0x9f, 0x52, 0x48, 0x4b, 0x55, 0x44, 0x51, 0x1f, 0x4d, 0x44, 0x42, 0x4a, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x53, 0x51, 0x54, 0x4d, 0x46, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x4b, 0x4e, 0x56, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x53, 0x40, 0x51, 0x52, 0x1d, 0x9f, 0x4e, 0x4d, 0x1f, 0x42, 0x51, 0x4e, 0x56, 0x4d, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x54, 0x4d, 0x46, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x1c, 0x45, 0x48, 0x51, 0x44, 0x1d, 0x1f, 0x48, 0x4d, 0x9f, ], [0x53, 0x56, 0x48, 0x52, 0x53, 0x44, 0x43, 0x1f, 0x56, 0x48, 0x51, 0x44, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, 0x4c, 0x44, 0x52, 0x47, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x9f, 0x4e, 0x45, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x4d, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0xd8, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x42, 0x4e, 0x4b, 0x43, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x42, 0x4b, 0x40, 0x48, 0x4c, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x4b, 0x4e, 0x4d, 0x46, 0x1c, 0x45, 0x4e, 0x51, 0x46, 0x4e, 0x53, 0x53, 0x44, 0x4d, 0x9f, ], [0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x1f, 0x6, 0x4e, 0x41, 0x4b, 0x44, 0x53, 0x52, 0x1f, 0x53, 0x47, 0x44, 0xd8, 0x42, 0x40, 0x51, 0x55, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x47, 0x40, 0x51, 0x4f, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1d, 0x9f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x1f, 0x4c, 0x40, 0x4d, 0x9f, 0x43, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4b, 0x40, 0x58, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4c, 0x40, 0x4d, 0x58, 0x1f, 0x40, 0x1f, 0x52, 0x4e, 0x4d, 0x46, 0x1f, 0x16, 0x40, 0x52, 0x9f, ], [0x52, 0x54, 0x4d, 0x46, 0x1f, 0x54, 0x4d, 0x47, 0x44, 0x40, 0x51, 0x43, 0x1f, 0x41, 0x58, 0x9f, 0x4c, 0x44, 0x4d, 0x1f, 0x4e, 0x51, 0x1f, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x4f, 0x48, 0x4d, 0x44, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x51, 0x4e, 0x40, 0x51, 0x48, 0x4d, 0xc6, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x47, 0x44, 0x48, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x13, 0x47, 0xc4, 0x56, 0x48, 0x4d, 0x43, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4c, 0x4e, 0x40, 0x4d, 0x48, 0x4d, 0xc6, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4d, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x48, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x51, 0x44, 0x43, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x45, 0x4b, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x4f, 0x51, 0x44, 0x40, 0x43, 0x1b, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x44, 0x44, 0x52, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x9f, 0x53, 0x4e, 0x51, 0x42, 0x47, 0x44, 0x52, 0x1f, 0x41, 0x4b, 0x40, 0x59, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x4b, 0x4b, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x9f, 0x51, 0x48, 0x4d, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x43, 0x40, 0x4b, 0x44, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x4c, 0x44, 0x4d, 0x9f, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x1f, 0x54, 0x4f, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x45, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x9f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x5d, 0x52, 0x1f, 0x48, 0x51, 0x44, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x45, 0x48, 0x44, 0x51, 0x42, 0x44, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x9f, 0xb, 0x40, 0x48, 0x43, 0x1f, 0x4b, 0x4e, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x9f, ], [0x53, 0x4e, 0x56, 0x44, 0x51, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x52, 0x9f, 0x45, 0x51, 0x40, 0x48, 0x4b, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x1f, 0x52, 0x4c, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x43, 0x56, 0x40, 0x51, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x44, 0x40, 0x51, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x40, 0x4c, 0x4f, 0x1f, 0x4e, 0xc5, 0x43, 0x4e, 0x4e, 0x4c, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x45, 0x4b, 0x44, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0x53, 0x4e, 0x9f, ], [0x43, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x40, 0x4b, 0x4b, 0x1f, 0x1, 0x44, 0x4d, 0x44, 0x40, 0x53, 0xc7, 0x47, 0x48, 0x52, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x1d, 0x1f, 0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x1f, 0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0x58, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x46, 0x51, 0x48, 0x4c, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x43, 0x48, 0x4c, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, ], [0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x56, 0x48, 0x4d, 0x1f, 0x4e, 0x54, 0x51, 0x1f, 0x47, 0x40, 0x51, 0x4f, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x46, 0x4e, 0x4b, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x47, 0x48, 0x4c, 0x1a, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x11, 0x4e, 0x40, 0x43, 0x52, 0x1f, 0x46, 0x4e, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x44, 0x55, 0x44, 0xd1, 0x4e, 0x4d, 0x1d, 0x1f, 0xe, 0x55, 0x44, 0x51, 0x1f, 0x51, 0x4e, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x53, 0x51, 0x44, 0x44, 0x1d, 0x1f, 0x1, 0x58, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x52, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x52, 0x54, 0x4d, 0x1f, 0x47, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x1, 0x58, 0x9f, 0x52, 0x53, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0xd1, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x1b, 0x1f, 0xe, 0x55, 0x44, 0xd1, 0x52, 0x4d, 0x4e, 0x56, 0x1f, 0x41, 0x58, 0x1f, 0x56, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x9f, ], [0x52, 0x4e, 0x56, 0x4d, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x44, 0x51, 0x51, 0x58, 0x1f, 0x45, 0x4b, 0x4e, 0x56, 0x44, 0x51, 0x52, 0x9f, 0x4e, 0x45, 0x1f, 0x9, 0x54, 0x4d, 0x44, 0x1d, 0x1f, 0xe, 0x55, 0x44, 0x51, 0x9f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x9f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x1f, 0x11, 0x4e, 0x40, 0x43, 0x52, 0x1f, 0x46, 0x4e, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x4e, 0x4d, 0x1f, 0x14, 0x4d, 0x43, 0x44, 0xd1, ], [0x42, 0x4b, 0x4e, 0x54, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x1d, 0x1f, 0x18, 0x44, 0x53, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x43, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x13, 0x54, 0x51, 0x4d, 0x1f, 0x40, 0x53, 0x9f, 0x4b, 0x40, 0x52, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x47, 0x4e, 0x4c, 0x44, 0x1f, 0x40, 0x45, 0x40, 0x51, 0x9b, 0x4, 0x58, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x56, 0x4e, 0x51, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x44, 0x44, 0x4d, 0x9f, 0x0, 0x4d, 0x43, 0x1f, 0x47, 0x4e, 0x51, 0x51, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x47, 0x40, 0x4b, 0x4b, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x9f, 0xb, 0x4e, 0x4e, 0x4a, 0x1f, 0x40, 0x53, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x1f, 0x4e, 0x4d, 0x9f, 0x4c, 0x44, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x53, 0x51, 0x44, 0x44, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x48, 0x4b, 0x4b, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x4d, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x51, 0x44, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4, 0x4b, 0x55, 0x44, 0x4d, 0x1c, 0x4a, 0x48, 0x4d, 0x46, 0x52, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4a, 0x58, 0x1d, 0x9f, 0x12, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x3, 0x56, 0x40, 0x51, 0x45, 0x1c, 0x4b, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0xd, 0x48, 0x4d, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0xc, 0x4e, 0x51, 0x53, 0x40, 0x4b, 0x1f, 0xc, 0x44, 0x4d, 0x1f, 0x43, 0x4e, 0x4e, 0x4c, 0x44, 0x43, 0x9f, ], [0x53, 0x4e, 0x1f, 0x43, 0x48, 0x44, 0x1d, 0x1f, 0xe, 0x4d, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x3, 0x40, 0x51, 0x4a, 0x1f, 0xb, 0x4e, 0x51, 0x43, 0x1f, 0x4e, 0x4d, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x4d, 0x44, 0x1f, 0x8, 0xcd, 0x53, 0x47, 0x44, 0x1f, 0xb, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0xc, 0x4e, 0x51, 0x43, 0x4e, 0xd1, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x12, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x9f, 0x4b, 0x48, 0x44, 0x1b, 0x1f, 0xe, 0x4d, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x9f, 0x51, 0x54, 0x4b, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0xe, 0x4d, 0xc4, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9d, ], [0xe, 0x4d, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x51, 0x48, 0x4d, 0x46, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x4d, 0x44, 0x52, 0x52, 0x1f, 0x41, 0x48, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1d, 0x1f, 0x8, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0xb, 0x40, 0x4d, 0x43, 0x9f, 0x4e, 0x45, 0x1f, 0xc, 0x4e, 0x51, 0x43, 0x4e, 0x51, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x12, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x4b, 0x48, 0x44, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x0, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x46, 0x4b, 0x48, 0x53, 0x53, 0x44, 0x51, 0x1d, 0x9f, 0xd, 0x4e, 0x53, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x4e, 0x52, 0x44, 0x1f, 0x56, 0x47, 0x4e, 0x9f, 0x56, 0x40, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x4b, 0x4e, 0x52, 0x53, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x9f, 0x52, 0x53, 0x51, 0x4e, 0x4d, 0x46, 0x1f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x44, 0x51, 0x1d, 0x1f, 0x3, 0x44, 0x44, 0x4f, 0x1f, 0x51, 0x4e, 0x4e, 0x53, 0xd2, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x51, 0x44, 0x40, 0x42, 0x47, 0x44, 0x43, 0x1f, 0x41, 0xd8, ], [0x53, 0x47, 0x44, 0x1f, 0x45, 0x51, 0x4e, 0x52, 0x53, 0x1b, 0x1f, 0x5, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x52, 0x47, 0x44, 0x52, 0x1f, 0x40, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x56, 0x4e, 0x4a, 0x44, 0x4d, 0x1d, 0x1f, 0x0, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x9f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x11, 0x44, 0x4d, 0x44, 0x56, 0x44, 0x43, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x41, 0x4b, 0x40, 0x43, 0x44, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x41, 0x51, 0x4e, 0x4a, 0x44, 0x4d, 0x1d, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x42, 0x51, 0x4e, 0x56, 0x4d, 0x4b, 0x44, 0x52, 0x52, 0x9f, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x9f, 0x4a, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x16, 0x47, 0x4e, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x2, 0x40, 0x4d, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x53, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x3, 0x4e, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0xb, 0x48, 0x55, 0x44, 0x52, 0x1b, 0x9f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x6, 0x4e, 0x4d, 0x44, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x9f, 0x40, 0x47, 0x44, 0x40, 0x43, 0x1d, 0x1f, 0x4, 0x42, 0x47, 0x4e, 0x44, 0x52, 0x1f, 0x51, 0x4e, 0x4b, 0xcb, 0x54, 0x4d, 0x40, 0x4d, 0x52, 0x56, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x4, 0x4c, 0x4f, 0x53, 0x58, 0x9d, 0x4e, 0x4f, 0x44, 0x4d, 0x1d, 0x1f, 0x43, 0x54, 0x52, 0x53, 0x58, 0x1d, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x9d, 0x16, 0x47, 0x58, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x16, 0x44, 0x58, 0x51, 0x45, 0x4e, 0x4b, 0x4a, 0x1f, 0x45, 0x4b, 0x44, 0x43, 0x1e, 0x9f, 0x16, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0xd2, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x53, 0x4e, 0x46, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, ], [0xb, 0x44, 0x40, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x16, 0x44, 0x58, 0x51, 0x52, 0x1f, 0x53, 0x4e, 0x9f, 0x56, 0x48, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x44, 0x40, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, 0x12, 0x44, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x47, 0x44, 0x51, 0x43, 0x41, 0x44, 0x40, 0x52, 0x53, 0xd2, 0x45, 0x51, 0x44, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, 0x6, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x40, 0x45, 0x44, 0x46, 0x54, 0x40, 0x51, 0x43, 0x52, 0x1d, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1d, 0x9f, 0x41, 0x54, 0x53, 0x1f, 0x56, 0x47, 0x48, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x1f, 0x7, 0x40, 0x55, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x45, 0x4b, 0x4e, 0x56, 0x4d, 0x1f, 0x53, 0x4e, 0x1f, 0x52, 0x4e, 0x4c, 0xc4, ], [0x4d, 0x44, 0x56, 0x1f, 0x16, 0x44, 0x58, 0x51, 0x1f, 0x16, 0x47, 0x44, 0x4d, 0x9f, 0x42, 0x51, 0x54, 0x44, 0x4b, 0x1f, 0x13, 0x47, 0x51, 0x44, 0x40, 0x43, 0x52, 0x1f, 0x52, 0x4e, 0x4c, 0xc4, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x52, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1e, 0x1f, 0x0, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1e, 0x1f, 0x16, 0x47, 0x58, 0x1d, 0x9f, 0x4e, 0x47, 0x1d, 0x1f, 0x56, 0x47, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4c, 0x4f, 0x53, 0xd8, 0x16, 0x44, 0x58, 0x51, 0x1e, 0x1f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xc, 0x51, 0x1b, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0xc, 0x51, 0x52, 0x1b, 0x9f, 0x3, 0x54, 0x51, 0x52, 0x4b, 0x44, 0x58, 0x1d, 0x1f, 0x4e, 0x45, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0xd1, 0x45, 0x4e, 0x54, 0x51, 0x1d, 0x1f, 0xf, 0x51, 0x48, 0x55, 0x44, 0x53, 0x9f, 0x3, 0x51, 0x48, 0x55, 0x44, 0x1d, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4f, 0x51, 0x4e, 0x54, 0x43, 0x9f, 0x53, 0x4e, 0x1f, 0x52, 0x40, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4f, 0x44, 0x51, 0x45, 0x44, 0x42, 0x53, 0x4b, 0x58, 0x9f, 0x4d, 0x4e, 0x51, 0x4c, 0x40, 0x4b, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, ], [0x56, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x9f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x5d, 0x43, 0x9f, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, 0x48, 0x4d, 0x55, 0x4e, 0x4b, 0x55, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x9f, 0x4e, 0x51, 0x1f, 0x4c, 0x58, 0x52, 0x53, 0x44, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1d, 0x9f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x49, 0x54, 0x52, 0x53, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x47, 0x4e, 0x4b, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, ], [0x52, 0x54, 0x42, 0x47, 0x1f, 0x4d, 0x4e, 0x4d, 0x52, 0x44, 0x4d, 0x52, 0x44, 0x1b, 0x9f, 0x1c, 0x11, 0x4e, 0x56, 0x4b, 0x48, 0x4d, 0x46, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0xb, 0x4e, 0x55, 0x44, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x9f, 0x50, 0x54, 0x48, 0x42, 0x4a, 0x4b, 0x58, 0x1f, 0x40, 0x51, 0x51, 0x44, 0x52, 0x53, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x44, 0x4d, 0x53, 0x4b, 0x44, 0x1f, 0x47, 0x44, 0x40, 0x51, 0x53, 0x1d, 0x9f, 0x12, 0x44, 0x48, 0x59, 0x44, 0x43, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0xd8, 0x41, 0x44, 0x40, 0x54, 0x53, 0x48, 0x45, 0x54, 0x4b, 0x1f, 0x45, 0x4e, 0x51, 0x4c, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x40, 0x4a, 0x44, 0x4d, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x4c, 0x44, 0x1d, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x4c, 0x40, 0x4d, 0x4d, 0x44, 0x51, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x52, 0x53, 0x48, 0x4b, 0xcb, ], [0x46, 0x51, 0x48, 0x44, 0x55, 0x44, 0x52, 0x1f, 0x4c, 0x44, 0x1b, 0x1f, 0xb, 0x4e, 0x55, 0x44, 0x1d, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x4f, 0x40, 0x51, 0x43, 0x4e, 0x4d, 0x52, 0x1f, 0x4d, 0x4e, 0x9f, 0x41, 0x44, 0x4b, 0x4e, 0x55, 0x44, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x4b, 0x4e, 0x55, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x53, 0x4e, 0x4e, 0x4a, 0x1f, 0x4c, 0x44, 0x1f, 0x52, 0xce, 0x52, 0x53, 0x51, 0x4e, 0x4d, 0x46, 0x4b, 0x58, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x43, 0x44, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0x4c, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1d, 0x1f, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x52, 0x44, 0x44, 0x1d, 0x9f, 0x48, 0x53, 0x1f, 0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x40, 0x41, 0x40, 0x4d, 0x43, 0x4e, 0x4d, 0x52, 0x9f, ], [0x4c, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1b, 0x1b, 0x1b, 0x9f, 0x1c, 0x0, 0x4b, 0x48, 0x46, 0x47, 0x48, 0x44, 0x51, 0x48, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x1f, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x1f, 0x44, 0x57, 0x4f, 0x51, 0x44, 0x52, 0x52, 0x9f, 0x48, 0x53, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x52, 0x54, 0x51, 0x44, 0x4b, 0x58, 0x1f, 0x58, 0x4e, 0xd4, 0x40, 0x4d, 0x43, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x41, 0x4e, 0x43, 0x58, 0x1f, 0x47, 0x40, 0x55, 0xc4, 0x40, 0x1f, 0x4d, 0x4e, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4e, 0x51, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x41, 0x44, 0x1f, 0x40, 0x4d, 0x1f, 0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1f, 0x4e, 0xc5, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x1f, 0x41, 0x44, 0x58, 0x4e, 0x4d, 0x43, 0x1f, 0x58, 0x4e, 0x54, 0x1b, 0x9f, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x54, 0x52, 0x44, 0x9f, ], [0x4e, 0x45, 0x1f, 0x4c, 0x58, 0x1f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x48, 0xc5, 0x8, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x44, 0x4d, 0x53, 0x48, 0x51, 0x44, 0x4b, 0x58, 0x9f, 0x42, 0x4e, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1e, 0x1f, 0xc, 0xd8, 0x46, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x4c, 0x48, 0x52, 0x44, 0x51, 0x48, 0x44, 0x52, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x7, 0x44, 0x40, 0x53, 0x47, 0x42, 0x4b, 0x48, 0x45, 0x45, 0x5d, 0x52, 0x9f, 0x4c, 0x48, 0x52, 0x44, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x40, 0x53, 0x42, 0x47, 0x44, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x45, 0x44, 0x4b, 0x53, 0x9f, ], [0x44, 0x40, 0x42, 0x47, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x4c, 0x58, 0x9f, 0x46, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x4b, 0x48, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x52, 0x1f, 0x47, 0x48, 0x4c, 0x52, 0x44, 0x4b, 0x45, 0x9b, 0x8, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x44, 0x4b, 0x52, 0x44, 0x9f, 0x4f, 0x44, 0x51, 0x48, 0x52, 0x47, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x44, 0x9f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x8, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x42, 0x4e, 0x4d, 0x53, 0x48, 0x4d, 0x54, 0x44, 0x1f, 0x53, 0x4e, 0x9f, ], [0x41, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x44, 0x4b, 0x52, 0x44, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x47, 0x44, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x9f, 0x40, 0x4d, 0x4d, 0x48, 0x47, 0x48, 0x4b, 0x40, 0x53, 0x44, 0x43, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x53, 0x54, 0x51, 0x4d, 0x1f, 0x53, 0x4e, 0x1f, 0x40, 0x1f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x58, 0x9f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x1b, 0x1f, 0x8, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x4c, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x1f, 0x4e, 0xc5, ], [0x48, 0x53, 0x1b, 0x1f, 0x1c, 0x1, 0x51, 0x4e, 0x4d, 0x53, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x4c, 0x58, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x53, 0x40, 0x58, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0x44, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x42, 0x47, 0x40, 0x4d, 0x46, 0x44, 0xc3, 0x4c, 0x58, 0x1f, 0x48, 0x43, 0x44, 0x40, 0x52, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x4c, 0x44, 0x1d, 0x9f, ], [0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x56, 0x48, 0x4d, 0x44, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x56, 0x40, 0x53, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4b, 0x53, 0x44, 0x51, 0x44, 0xc3, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x4e, 0x4b, 0x4e, 0x51, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x58, 0x9f, 0x4c, 0x48, 0x4d, 0x43, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x48, 0x52, 0x9f, 0x4e, 0x4d, 0x44, 0x1b, 0x1f, 0x8, 0x5d, 0x4c, 0x1f, 0x46, 0x4e, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x44, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x1f, 0x1c, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x53, 0x40, 0x4a, 0xc4, 0x42, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x52, 0x4c, 0x48, 0x4b, 0x44, 0x9f, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x48, 0x53, 0x9b, ], [0x1c, 0x1, 0x51, 0x4e, 0x4d, 0x53, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x13, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x53, 0x4e, 0x51, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x53, 0x44, 0x40, 0x42, 0xc7, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x4e, 0x4d, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x2, 0x51, 0x48, 0x52, 0x4f, 0x48, 0x4d, 0x1f, 0x2, 0x51, 0x48, 0x52, 0x4f, 0x48, 0x40, 0x4d, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x4d, 0x44, 0x5d, 0x44, 0x51, 0x1f, 0x46, 0x4e, 0x1f, 0x41, 0x58, 0x9d, 0x5, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x43, 0x40, 0x58, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x43, 0x48, 0x4d, 0x46, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1d, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x56, 0x44, 0x1f, 0x48, 0x4d, 0x9f, ], [0x48, 0x53, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x9f, 0x51, 0x44, 0x4c, 0x44, 0x4c, 0x41, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x16, 0x44, 0x9f, 0x45, 0x44, 0x56, 0x1d, 0x1f, 0x56, 0x44, 0x1f, 0x47, 0x40, 0x4f, 0x4f, 0x58, 0x1f, 0x45, 0x44, 0x56, 0x9d, 0x56, 0x44, 0x1f, 0x41, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x9f, 0x41, 0x51, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x52, 0x1b, 0x1f, 0x5, 0x4e, 0x51, 0x1f, 0x47, 0x44, 0x9f, 0x53, 0x4e, 0x1c, 0x43, 0x40, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x47, 0x44, 0x43, 0x52, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x41, 0x4b, 0x4e, 0x4e, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0x44, 0x9f, 0x12, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x4c, 0x58, 0x9f, ], [0x41, 0x51, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x1b, 0x9f, 0x1c, 0x12, 0x47, 0x40, 0x4a, 0x44, 0x52, 0x4f, 0x44, 0x40, 0x51, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x7, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x4b, 0x48, 0x45, 0x44, 0x1f, 0x48, 0x52, 0x1d, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x3, 0x4e, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x47, 0x54, 0x4d, 0x1f, 0x48, 0x53, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x1f, 0x47, 0x40, 0x51, 0x43, 0x9f, 0x4d, 0x40, 0x4c, 0x44, 0x52, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x52, 0x4e, 0x1f, 0x41, 0x40, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x40, 0x51, 0x44, 0x9b, 0x8, 0x53, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x52, 0x1f, 0x4f, 0x4e, 0x4e, 0x51, 0x44, 0x52, 0x53, 0x9f, ], [0x56, 0x47, 0x44, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x40, 0x51, 0x44, 0x9f, 0x51, 0x48, 0x42, 0x47, 0x44, 0x52, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x40, 0x54, 0x4b, 0x53, 0x1c, 0x45, 0x48, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x45, 0x40, 0x54, 0x4b, 0x53, 0x52, 0x1f, 0x44, 0x55, 0x44, 0x4d, 0x9f, 0x48, 0x4d, 0x1f, 0x4f, 0x40, 0x51, 0x40, 0x43, 0x48, 0x52, 0x44, 0x1b, 0x1f, 0xb, 0x4e, 0x55, 0x44, 0x9f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x4f, 0x4e, 0x4e, 0x51, 0x1f, 0x40, 0xd2, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x1f, 0x4c, 0x40, 0x58, 0x9f, 0x4f, 0x44, 0x51, 0x47, 0x40, 0x4f, 0x52, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x9f, ], [0x4f, 0x4b, 0x44, 0x40, 0x52, 0x40, 0x4d, 0x53, 0x1d, 0x9f, 0x53, 0x47, 0x51, 0x48, 0x4b, 0x4b, 0x48, 0x4d, 0x46, 0x1d, 0x9f, 0x46, 0x4b, 0x4e, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x47, 0x4e, 0x54, 0x51, 0x52, 0x1d, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x4f, 0x4e, 0x4e, 0x51, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x54, 0x4d, 0x1f, 0x48, 0x52, 0x9f, 0x51, 0x44, 0x45, 0x4b, 0x44, 0x42, 0x53, 0x44, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0xc4, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x40, 0x4b, 0x4c, 0x52, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x41, 0x51, 0x48, 0x46, 0x47, 0x53, 0x4b, 0x58, 0x1f, 0x40, 0x52, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x48, 0x42, 0x47, 0x1f, 0x4c, 0x40, 0x4d, 0x5d, 0x52, 0x9f, 0x40, 0x41, 0x4e, 0x43, 0x44, 0x1b, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4d, 0x4e, 0x56, 0x9f, 0x4c, 0x44, 0x4b, 0x53, 0x52, 0x1f, 0x41, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x43, 0x4e, 0x4e, 0x51, 0x1f, 0x40, 0x52, 0x1f, 0x44, 0x40, 0x51, 0x4b, 0x58, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x8, 0x1f, 0x43, 0x4e, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x40, 0x9f, ], [0x50, 0x54, 0x48, 0x44, 0x53, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1f, 0x4c, 0x40, 0x58, 0x9f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x53, 0x44, 0x4d, 0x53, 0x44, 0x43, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x9d, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x42, 0x47, 0x44, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x52, 0x9d, 0x40, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x4b, 0x40, 0x42, 0x44, 0x1b, 0x9f, 0x1c, 0x13, 0x47, 0x4e, 0x51, 0x44, 0x40, 0x54, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x16, 0x44, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4b, 0x44, 0x40, 0x51, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, 0x51, 0x44, 0x40, 0x56, 0x40, 0x4a, 0x44, 0x4d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x9f, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x40, 0x56, 0x40, 0x4a, 0x44, 0x1d, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x41, 0x58, 0x1f, 0x4c, 0x44, 0x42, 0x47, 0x40, 0x4d, 0x48, 0x42, 0x40, 0x4b, 0x9f, 0x40, 0x48, 0x43, 0x52, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x41, 0x58, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x40, 0x56, 0x4d, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x43, 0x4e, 0x44, 0x52, 0x9f, ], [0x4d, 0x4e, 0x53, 0x1f, 0x45, 0x4e, 0x51, 0x52, 0x40, 0x4a, 0x44, 0x1f, 0x54, 0x52, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x48, 0x4d, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x4e, 0x54, 0x4d, 0x43, 0x44, 0x52, 0x53, 0x1f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x1b, 0x1f, 0x8, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x4e, 0x45, 0x1f, 0x4d, 0x4e, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x44, 0x4d, 0x42, 0x4e, 0x54, 0x51, 0x40, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x40, 0x42, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x50, 0x54, 0x44, 0x52, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x41, 0x4b, 0x44, 0x9f, 0x40, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, ], [0x44, 0x4b, 0x44, 0x55, 0x40, 0x53, 0x44, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x9f, 0x41, 0x58, 0x1f, 0x40, 0x1f, 0x42, 0x4e, 0x4d, 0x52, 0x42, 0x48, 0x4e, 0x54, 0x52, 0x9f, 0x44, 0x4d, 0x43, 0x44, 0x40, 0x55, 0x4e, 0x54, 0x51, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, 0x40, 0x41, 0x4b, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x4f, 0x40, 0x48, 0x4d, 0x53, 0x1f, 0x40, 0x9f, 0x4f, 0x40, 0x51, 0x53, 0x48, 0x42, 0x54, 0x4b, 0x40, 0x51, 0x9f, 0x4f, 0x48, 0x42, 0x53, 0x54, 0x51, 0x44, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x4e, 0x9f, 0x42, 0x40, 0x51, 0x55, 0x44, 0x1f, 0x40, 0x1f, 0x52, 0x53, 0x40, 0x53, 0x54, 0x44, 0x1d, 0x9f, ], [0x40, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x1f, 0x53, 0x4e, 0x1f, 0x4c, 0x40, 0x4a, 0x44, 0x1f, 0x40, 0x9f, 0x45, 0x44, 0x56, 0x1f, 0x4e, 0x41, 0x49, 0x44, 0x42, 0x53, 0x52, 0x9f, 0x41, 0x44, 0x40, 0x54, 0x53, 0x48, 0x45, 0x54, 0x4b, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x45, 0x40, 0x51, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x46, 0x4b, 0x4e, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x53, 0x4e, 0x1f, 0x42, 0x40, 0x51, 0x55, 0x44, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x40, 0x48, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x51, 0xd8, 0x40, 0x53, 0x4c, 0x4e, 0x52, 0x4f, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4c, 0x44, 0x43, 0x48, 0x54, 0x4c, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, ], [0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x56, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x1d, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x4c, 0x4e, 0x51, 0x40, 0x4b, 0x4b, 0x58, 0x1f, 0x56, 0x44, 0x9f, 0x42, 0x40, 0x4d, 0x1f, 0x43, 0x4e, 0x1b, 0x1f, 0x13, 0x4e, 0x1f, 0x40, 0x45, 0x45, 0x44, 0x42, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x50, 0x54, 0x40, 0x4b, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x47, 0x48, 0x46, 0x47, 0x44, 0x52, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x51, 0x53, 0x52, 0x1b, 0x9f, 0x1c, 0x13, 0x47, 0x4e, 0x51, 0x44, 0x40, 0x54, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x45, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x40, 0x43, 0x55, 0x40, 0x4d, 0x42, 0x44, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x45, 0x48, 0x43, 0x44, 0x4d, 0x53, 0x4b, 0x58, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x48, 0x51, 0x44, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x52, 0x9f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x44, 0x4d, 0x43, 0x44, 0x40, 0x55, 0x4e, 0x51, 0x52, 0x1f, 0x53, 0x4e, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x47, 0x44, 0x9f, 0x47, 0x40, 0x52, 0x1f, 0x48, 0x4c, 0x40, 0x46, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x9f, ], [0x52, 0x54, 0x42, 0x42, 0x44, 0x52, 0x52, 0x1f, 0x54, 0x4d, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x44, 0xc3, 0x48, 0x4d, 0x1f, 0x42, 0x4e, 0x4c, 0x4c, 0x4e, 0x4d, 0x1f, 0x47, 0x4e, 0x54, 0x51, 0x52, 0x1b, 0x9f, 0x7, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x54, 0x53, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x41, 0x44, 0x47, 0x48, 0x4d, 0x43, 0x1d, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x55, 0x48, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x9f, 0x41, 0x4e, 0x54, 0x4d, 0x43, 0x40, 0x51, 0x58, 0x1b, 0x1f, 0xd, 0x44, 0x56, 0x1d, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x40, 0x4b, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x4b, 0x48, 0x41, 0x44, 0x51, 0x40, 0x4b, 0x1f, 0x4b, 0x40, 0x56, 0x52, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, 0x44, 0x52, 0x53, 0x40, 0x41, 0x4b, 0x48, 0x52, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x40, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0x4c, 0x1d, 0x1f, 0x4e, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x4b, 0x40, 0x56, 0x52, 0x1f, 0x41, 0x44, 0x9f, 0x44, 0x57, 0x4f, 0x40, 0x4d, 0x43, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x4f, 0x51, 0x44, 0x53, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0xd2, ], [0x45, 0x40, 0x55, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x4b, 0x48, 0x41, 0x44, 0x51, 0x40, 0x4b, 0x1f, 0x52, 0x44, 0x4d, 0x52, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x47, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x42, 0x44, 0x4d, 0x52, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x47, 0x48, 0x46, 0x47, 0x44, 0x51, 0x1f, 0x4e, 0x51, 0x43, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x41, 0x44, 0x48, 0x4d, 0x46, 0x52, 0x1b, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x8, 0x5d, 0x4c, 0x1f, 0x4d, 0x4e, 0x41, 0x4e, 0x43, 0x58, 0x1a, 0x1f, 0x16, 0x47, 0x4e, 0x9f, 0x40, 0x51, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x1e, 0x1f, 0x0, 0x51, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4d, 0x4e, 0x41, 0x4e, 0x43, 0x58, 0x1d, 0x1f, 0x53, 0x4e, 0x4e, 0x1e, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x5d, 0x52, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x48, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x54, 0x52, 0x1d, 0x1f, 0x43, 0x4e, 0x4d, 0x5d, 0x53, 0x1f, 0x53, 0x44, 0x4b, 0x4b, 0x1a, 0x9f, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x43, 0x1f, 0x41, 0x40, 0x4d, 0x48, 0x52, 0x47, 0x1f, 0x54, 0x52, 0x1d, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x7, 0x4e, 0x56, 0x9f, 0x43, 0x51, 0x44, 0x40, 0x51, 0x58, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, ], [0x52, 0x4e, 0x4c, 0x44, 0x41, 0x4e, 0x43, 0x58, 0x1a, 0x1f, 0x7, 0x4e, 0x56, 0x9f, 0x4f, 0x54, 0x41, 0x4b, 0x48, 0x42, 0x1d, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x9f, 0x45, 0x51, 0x4e, 0x46, 0x1f, 0x13, 0x4e, 0x1f, 0x53, 0x44, 0x4b, 0x4b, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x4d, 0x40, 0x4c, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x4b, 0x4e, 0x4d, 0x46, 0x9f, 0x43, 0x40, 0x58, 0x1f, 0x13, 0x4e, 0x1f, 0x40, 0x4d, 0x1f, 0x40, 0x43, 0x4c, 0x48, 0x51, 0x48, 0x4d, 0xc6, 0x41, 0x4e, 0x46, 0x1a, 0x1f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x7, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4f, 0x4f, 0x58, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x9f, 0x51, 0x40, 0x4c, 0x41, 0x4b, 0x44, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x51, 0x4e, 0x40, 0x43, 0x1f, 0x40, 0x4b, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x4d, 0x5d, 0x53, 0x1f, 0x42, 0x40, 0x51, 0x44, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0xd3, 0x42, 0x40, 0x51, 0x44, 0x44, 0x51, 0x52, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x44, 0x57, 0x48, 0x46, 0x44, 0x4d, 0x42, 0x48, 0x44, 0x52, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x45, 0x44, 0x40, 0x51, 0x52, 0x1b, 0x1f, 0x16, 0x47, 0x4e, 0x52, 0x44, 0x1f, 0x42, 0x4e, 0x40, 0x53, 0x9f, ], [0x4e, 0x45, 0x1f, 0x44, 0x4b, 0x44, 0x4c, 0x44, 0x4d, 0x53, 0x40, 0x4b, 0x1f, 0x41, 0x51, 0x4e, 0x56, 0xcd, 0x0, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x48, 0x4d, 0x46, 0x1f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0xc4, 0x4f, 0x54, 0x53, 0x1f, 0x4e, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x43, 0x44, 0x4f, 0x44, 0x4d, 0x43, 0x44, 0x4d, 0x53, 0x1f, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x52, 0x54, 0x4d, 0x1d, 0x1f, 0x0, 0x52, 0x52, 0x4e, 0x42, 0x48, 0x40, 0x53, 0x44, 0x52, 0x1f, 0x4e, 0xd1, 0x46, 0x4b, 0x4e, 0x56, 0x52, 0x1f, 0x40, 0x4b, 0x4e, 0x4d, 0x44, 0x1d, 0x9f, 0x5, 0x54, 0x4b, 0x45, 0x48, 0x4b, 0x4b, 0x48, 0x4d, 0x46, 0x9f, 0x40, 0x41, 0x52, 0x4e, 0x4b, 0x54, 0x53, 0x44, 0x1f, 0x43, 0x44, 0x42, 0x51, 0x44, 0x44, 0x1f, 0x8, 0xcd, ], [0x42, 0x40, 0x52, 0x54, 0x40, 0x4b, 0x1f, 0x52, 0x48, 0x4c, 0x4f, 0x4b, 0x48, 0x42, 0x48, 0x53, 0x58, 0x9b, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
 | 
			
		||||
[[0x1, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x8, 0x1f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x43, 0x44, 0x40, 0x53, 0xc7, 0x7, 0x44, 0x1f, 0x4a, 0x48, 0x4d, 0x43, 0x4b, 0x58, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x4f, 0x44, 0x43, 0x9f, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x42, 0x40, 0x51, 0x51, 0x48, 0x40, 0x46, 0x44, 0x1f, 0x47, 0x44, 0x4b, 0x43, 0x1f, 0x41, 0x54, 0x53, 0x9f, 0x49, 0x54, 0x52, 0x53, 0x1f, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x0, 0x4d, 0xc3, 0x48, 0x4c, 0x4c, 0x4e, 0x51, 0x53, 0x40, 0x4b, 0x48, 0x53, 0x58, 0x9f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, ]],
 | 
			
		||||
[[0x5, 0x4e, 0x51, 0x1d, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x4b, 0x4c, 0x4e, 0x52, 0x53, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1f, 0x44, 0x4b, 0x52, 0x44, 0x1f, 0x48, 0x4d, 0x9f, 0x4e, 0x54, 0x51, 0x1f, 0x42, 0x4e, 0x54, 0x4d, 0x53, 0x51, 0x58, 0x1d, 0x1f, 0x8, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x53, 0x44, 0x43, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x4c, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x51, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x4e, 0x4f, 0x53, 0x48, 0x4c, 0x48, 0x52, 0x4c, 0x1b, 0x1f, 0x8, 0x9f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x40, 0x51, 0x43, 0x9f, 0x56, 0x4e, 0x51, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x51, 0x4e, 0x46, 0x51, 0x44, 0x52, 0x52, 0x9f, ], [0x40, 0x4d, 0x43, 0x1f, 0x40, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x9f, 0x4d, 0x4e, 0x56, 0x1d, 0x1f, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1f, 0x45, 0x48, 0x51, 0x52, 0x53, 0x9f, 0x41, 0x44, 0x48, 0x4d, 0x46, 0x1f, 0x5d, 0x45, 0x4e, 0x51, 0x5d, 0x9f, 0x52, 0x4e, 0x42, 0x48, 0x44, 0x53, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x9f, 0x5d, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x52, 0x53, 0x5d, 0x1f, 0x48, 0x53, 0x1d, 0x1f, 0x8, 0x9f, 0x40, 0x52, 0x52, 0x48, 0x46, 0x4d, 0x1f, 0x4c, 0x58, 0x52, 0x44, 0x4b, 0x45, 0x1f, 0x4d, 0x4e, 0x9f, 0x51, 0x40, 0x4d, 0x4a, 0x1f, 0x4e, 0x51, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4b, 0x48, 0x4c, 0x48, 0x53, 0x9d, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x4d, 0x9f, ], [0x40, 0x53, 0x53, 0x48, 0x53, 0x54, 0x43, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x9f, 0x4c, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x52, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x51, 0x44, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x4c, 0x58, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x47, 0x40, 0x52, 0x1f, 0x41, 0x44, 0x42, 0x4e, 0x4c, 0x44, 0x9f, 0x4e, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x48, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x1f, 0x4f, 0x47, 0x51, 0x40, 0x52, 0x44, 0x1f, 0x1c, 0x9f, ], [0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x5d, 0x52, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x4f, 0x47, 0x51, 0x40, 0x52, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x55, 0x48, 0x44, 0x56, 0x1f, 0x4e, 0x45, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x40, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0x43, 0x4d, 0x5d, 0x53, 0x9f, 0x40, 0x42, 0x42, 0x44, 0x4f, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x1b, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x1f, 0x8, 0x5d, 0x55, 0x44, 0x9f, 0x4b, 0x44, 0x40, 0x51, 0x4d, 0x44, 0x43, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x1b, 0x1f, 0x14, 0x4d, 0x53, 0x48, 0xcb, ], [0x52, 0x4e, 0x4c, 0x44, 0x1f, 0x46, 0x40, 0x4d, 0x46, 0x1f, 0x52, 0x54, 0x42, 0x42, 0x44, 0x44, 0x43, 0xd2, 0x48, 0x4d, 0x1f, 0x4f, 0x54, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x48, 0x53, 0x9f, 0x49, 0x40, 0x42, 0x4a, 0x44, 0x53, 0x1d, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x43, 0x44, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x48, 0x52, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x58, 0x1b, 0x9f, 0x1c, 0x4, 0x4b, 0x4b, 0x48, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, ]],
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,364 @@
 | 
			
		|||
# Level Definitions
 | 
			
		||||
yoshis_house = "Yoshi's House"
 | 
			
		||||
yoshis_house_tile = "Yoshi's House - Tile"
 | 
			
		||||
 | 
			
		||||
yoshis_island_1_exit_1  = "Yoshi's Island 1 - Normal Exit"
 | 
			
		||||
yoshis_island_1_dragon  = "Yoshi's Island 1 - Dragon Coins"
 | 
			
		||||
yoshis_island_2_exit_1  = "Yoshi's Island 2 - Normal Exit"
 | 
			
		||||
yoshis_island_2_dragon  = "Yoshi's Island 2 - Dragon Coins"
 | 
			
		||||
yoshis_island_3_exit_1  = "Yoshi's Island 3 - Normal Exit"
 | 
			
		||||
yoshis_island_3_dragon  = "Yoshi's Island 3 - Dragon Coins"
 | 
			
		||||
yoshis_island_4_exit_1  = "Yoshi's Island 4 - Normal Exit"
 | 
			
		||||
yoshis_island_4_dragon  = "Yoshi's Island 4 - Dragon Coins"
 | 
			
		||||
yoshis_island_castle    = "#1 Iggy's Castle - Normal Exit"
 | 
			
		||||
yoshis_island_koopaling = "#1 Iggy's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
yellow_switch_palace = "Yellow Switch Palace"
 | 
			
		||||
 | 
			
		||||
donut_plains_1_exit_1     = "Donut Plains 1 - Normal Exit"
 | 
			
		||||
donut_plains_1_exit_2     = "Donut Plains 1 - Secret Exit"
 | 
			
		||||
donut_plains_1_dragon     = "Donut Plains 1 - Dragon Coins"
 | 
			
		||||
donut_plains_2_exit_1     = "Donut Plains 2 - Normal Exit"
 | 
			
		||||
donut_plains_2_exit_2     = "Donut Plains 2 - Secret Exit"
 | 
			
		||||
donut_plains_2_dragon     = "Donut Plains 2 - Dragon Coins"
 | 
			
		||||
donut_plains_3_exit_1     = "Donut Plains 3 - Normal Exit"
 | 
			
		||||
donut_plains_3_dragon     = "Donut Plains 3 - Dragon Coins"
 | 
			
		||||
donut_plains_4_exit_1     = "Donut Plains 4 - Normal Exit"
 | 
			
		||||
donut_plains_4_dragon     = "Donut Plains 4 - Dragon Coins"
 | 
			
		||||
donut_secret_1_exit_1     = "Donut Secret 1 - Normal Exit"
 | 
			
		||||
donut_secret_1_exit_2     = "Donut Secret 1 - Secret Exit"
 | 
			
		||||
donut_secret_1_dragon     = "Donut Secret 1 - Dragon Coins"
 | 
			
		||||
donut_secret_2_exit_1     = "Donut Secret 2 - Normal Exit"
 | 
			
		||||
donut_secret_2_dragon     = "Donut Secret 2 - Dragon Coins"
 | 
			
		||||
donut_ghost_house_exit_1  = "Donut Ghost House - Normal Exit"
 | 
			
		||||
donut_ghost_house_exit_2  = "Donut Ghost House - Secret Exit"
 | 
			
		||||
donut_secret_house_exit_1 = "Donut Secret House - Normal Exit"
 | 
			
		||||
donut_secret_house_exit_2 = "Donut Secret House - Secret Exit"
 | 
			
		||||
donut_plains_castle       = "#2 Morton's Castle - Normal Exit"
 | 
			
		||||
donut_plains_koopaling    = "#2 Morton's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
green_switch_palace = "Green Switch Palace"
 | 
			
		||||
 | 
			
		||||
vanilla_dome_1_exit_1       = "Vanilla Dome 1 - Normal Exit"
 | 
			
		||||
vanilla_dome_1_exit_2       = "Vanilla Dome 1 - Secret Exit"
 | 
			
		||||
vanilla_dome_1_dragon       = "Vanilla Dome 1 - Dragon Coins"
 | 
			
		||||
vanilla_dome_2_exit_1       = "Vanilla Dome 2 - Normal Exit"
 | 
			
		||||
vanilla_dome_2_exit_2       = "Vanilla Dome 2 - Secret Exit"
 | 
			
		||||
vanilla_dome_2_dragon       = "Vanilla Dome 2 - Dragon Coins"
 | 
			
		||||
vanilla_dome_3_exit_1       = "Vanilla Dome 3 - Normal Exit"
 | 
			
		||||
vanilla_dome_3_dragon       = "Vanilla Dome 3 - Dragon Coins"
 | 
			
		||||
vanilla_dome_4_exit_1       = "Vanilla Dome 4 - Normal Exit"
 | 
			
		||||
vanilla_dome_4_dragon       = "Vanilla Dome 4 - Dragon Coins"
 | 
			
		||||
vanilla_secret_1_exit_1     = "Vanilla Secret 1 - Normal Exit"
 | 
			
		||||
vanilla_secret_1_exit_2     = "Vanilla Secret 1 - Secret Exit"
 | 
			
		||||
vanilla_secret_1_dragon     = "Vanilla Secret 1 - Dragon Coins"
 | 
			
		||||
vanilla_secret_2_exit_1     = "Vanilla Secret 2 - Normal Exit"
 | 
			
		||||
vanilla_secret_2_dragon     = "Vanilla Secret 2 - Dragon Coins"
 | 
			
		||||
vanilla_secret_3_exit_1     = "Vanilla Secret 3 - Normal Exit"
 | 
			
		||||
vanilla_secret_3_dragon     = "Vanilla Secret 3 - Dragon Coins"
 | 
			
		||||
vanilla_ghost_house_exit_1  = "Vanilla Ghost House - Normal Exit"
 | 
			
		||||
vanilla_ghost_house_dragon  = "Vanilla Ghost House - Dragon Coins"
 | 
			
		||||
vanilla_fortress            = "Vanilla Fortress - Normal Exit"
 | 
			
		||||
vanilla_reznor              = "Vanilla Fortress - Boss"
 | 
			
		||||
vanilla_dome_castle         = "#3 Lemmy's Castle - Normal Exit"
 | 
			
		||||
vanilla_dome_koopaling      = "#3 Lemmy's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
red_switch_palace = "Red Switch Palace"
 | 
			
		||||
 | 
			
		||||
butter_bridge_1_exit_1 = "Butter Bridge 1 - Normal Exit"
 | 
			
		||||
butter_bridge_1_dragon = "Butter Bridge 1 - Dragon Coins"
 | 
			
		||||
butter_bridge_2_exit_1 = "Butter Bridge 2 - Normal Exit"
 | 
			
		||||
butter_bridge_2_dragon = "Butter Bridge 2 - Dragon Coins"
 | 
			
		||||
cheese_bridge_exit_1   = "Cheese Bridge - Normal Exit"
 | 
			
		||||
cheese_bridge_exit_2   = "Cheese Bridge - Secret Exit"
 | 
			
		||||
cheese_bridge_dragon   = "Cheese Bridge - Dragon Coins"
 | 
			
		||||
cookie_mountain_exit_1 = "Cookie Mountain - Normal Exit"
 | 
			
		||||
cookie_mountain_dragon = "Cookie Mountain - Dragon Coins"
 | 
			
		||||
soda_lake_exit_1       = "Soda Lake - Normal Exit"
 | 
			
		||||
soda_lake_dragon       = "Soda Lake - Dragon Coins"
 | 
			
		||||
twin_bridges_castle    = "#4 Ludwig's Castle - Normal Exit"
 | 
			
		||||
twin_bridges_koopaling = "#4 Ludwig's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
forest_of_illusion_1_exit_1 = "Forest of Illusion 1 - Normal Exit"
 | 
			
		||||
forest_of_illusion_1_exit_2 = "Forest of Illusion 1 - Secret Exit"
 | 
			
		||||
forest_of_illusion_2_exit_1 = "Forest of Illusion 2 - Normal Exit"
 | 
			
		||||
forest_of_illusion_2_exit_2 = "Forest of Illusion 2 - Secret Exit"
 | 
			
		||||
forest_of_illusion_2_dragon = "Forest of Illusion 2 - Dragon Coins"
 | 
			
		||||
forest_of_illusion_3_exit_1 = "Forest of Illusion 3 - Normal Exit"
 | 
			
		||||
forest_of_illusion_3_exit_2 = "Forest of Illusion 3 - Secret Exit"
 | 
			
		||||
forest_of_illusion_3_dragon = "Forest of Illusion 3 - Dragon Coins"
 | 
			
		||||
forest_of_illusion_4_exit_1 = "Forest of Illusion 4 - Normal Exit"
 | 
			
		||||
forest_of_illusion_4_exit_2 = "Forest of Illusion 4 - Secret Exit"
 | 
			
		||||
forest_of_illusion_4_dragon = "Forest of Illusion 4 - Dragon Coins"
 | 
			
		||||
forest_ghost_house_exit_1   = "Forest Ghost House - Normal Exit"
 | 
			
		||||
forest_ghost_house_exit_2   = "Forest Ghost House - Secret Exit"
 | 
			
		||||
forest_ghost_house_dragon   = "Forest Ghost House - Dragon Coins"
 | 
			
		||||
forest_secret_exit_1        = "Forest Secret - Normal Exit"
 | 
			
		||||
forest_secret_dragon        = "Forest Secret - Dragon Coins"
 | 
			
		||||
forest_fortress             = "Forest Fortress - Normal Exit"
 | 
			
		||||
forest_reznor               = "Forest Fortress - Boss"
 | 
			
		||||
forest_castle               = "#5 Roy's Castle - Normal Exit"
 | 
			
		||||
forest_castle_dragon        = "#5 Roy's Castle - Dragon Coins"
 | 
			
		||||
forest_koopaling            = "#5 Roy's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
blue_switch_palace = "Blue Switch Palace"
 | 
			
		||||
 | 
			
		||||
chocolate_island_1_exit_1    = "Chocolate Island 1 - Normal Exit"
 | 
			
		||||
chocolate_island_1_dragon    = "Chocolate Island 1 - Dragon Coins"
 | 
			
		||||
chocolate_island_2_exit_1    = "Chocolate Island 2 - Normal Exit"
 | 
			
		||||
chocolate_island_2_exit_2    = "Chocolate Island 2 - Secret Exit"
 | 
			
		||||
chocolate_island_2_dragon    = "Chocolate Island 2 - Dragon Coins"
 | 
			
		||||
chocolate_island_3_exit_1    = "Chocolate Island 3 - Normal Exit"
 | 
			
		||||
chocolate_island_3_exit_2    = "Chocolate Island 3 - Secret Exit"
 | 
			
		||||
chocolate_island_3_dragon    = "Chocolate Island 3 - Dragon Coins"
 | 
			
		||||
chocolate_island_4_exit_1    = "Chocolate Island 4 - Normal Exit"
 | 
			
		||||
chocolate_island_4_dragon    = "Chocolate Island 4 - Dragon Coins"
 | 
			
		||||
chocolate_island_5_exit_1    = "Chocolate Island 5 - Normal Exit"
 | 
			
		||||
chocolate_island_5_dragon    = "Chocolate Island 5 - Dragon Coins"
 | 
			
		||||
chocolate_ghost_house_exit_1 = "Choco-Ghost House - Normal Exit"
 | 
			
		||||
chocolate_secret_exit_1      = "Chocolate Secret - Normal Exit"
 | 
			
		||||
chocolate_fortress           = "Chocolate Fortress - Normal Exit"
 | 
			
		||||
chocolate_reznor             = "Chocolate Fortress Defeat"
 | 
			
		||||
chocolate_castle             = "#6 Wendy's Castle - Normal Exit"
 | 
			
		||||
chocolate_koopaling          = "#6 Wendy's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
sunken_ghost_ship        = "Sunken Ghost Ship - Normal Exit"
 | 
			
		||||
sunken_ghost_ship_dragon = "Sunken Ghost Ship - Dragon Coins"
 | 
			
		||||
 | 
			
		||||
valley_of_bowser_1_exit_1 = "Valley of Bowser 1 - Normal Exit"
 | 
			
		||||
valley_of_bowser_1_dragon = "Valley of Bowser 1 - Dragon Coins"
 | 
			
		||||
valley_of_bowser_2_exit_1 = "Valley of Bowser 2 - Normal Exit"
 | 
			
		||||
valley_of_bowser_2_exit_2 = "Valley of Bowser 2 - Secret Exit"
 | 
			
		||||
valley_of_bowser_2_dragon = "Valley of Bowser 2 - Dragon Coins"
 | 
			
		||||
valley_of_bowser_3_exit_1 = "Valley of Bowser 3 - Normal Exit"
 | 
			
		||||
valley_of_bowser_3_dragon = "Valley of Bowser 3 - Dragon Coins"
 | 
			
		||||
valley_of_bowser_4_exit_1 = "Valley of Bowser 4 - Normal Exit"
 | 
			
		||||
valley_of_bowser_4_exit_2 = "Valley of Bowser 4 - Secret Exit"
 | 
			
		||||
valley_ghost_house_exit_1 = "Valley Ghost House - Normal Exit"
 | 
			
		||||
valley_ghost_house_exit_2 = "Valley Ghost House - Secret Exit"
 | 
			
		||||
valley_ghost_house_dragon = "Valley Ghost House - Dragon Coins"
 | 
			
		||||
valley_fortress           = "Valley Fortress - Normal Exit"
 | 
			
		||||
valley_reznor             = "Valley Fortress - Boss"
 | 
			
		||||
valley_castle             = "#7 Larry's Castle - Normal Exit"
 | 
			
		||||
valley_castle_dragon      = "#7 Larry's Castle - Dragon Coins"
 | 
			
		||||
valley_koopaling          = "#7 Larry's Castle - Boss"
 | 
			
		||||
 | 
			
		||||
front_door = "Front Door"
 | 
			
		||||
back_door  = "Back Door"
 | 
			
		||||
bowser     = "Bowser"
 | 
			
		||||
 | 
			
		||||
star_road_1_exit_1    = "Star Road 1 - Normal Exit"
 | 
			
		||||
star_road_1_exit_2    = "Star Road 1 - Secret Exit"
 | 
			
		||||
star_road_1_dragon    = "Star Road 1 - Dragon Coins"
 | 
			
		||||
star_road_2_exit_1    = "Star Road 2 - Normal Exit"
 | 
			
		||||
star_road_2_exit_2    = "Star Road 2 - Secret Exit"
 | 
			
		||||
star_road_3_exit_1    = "Star Road 3 - Normal Exit"
 | 
			
		||||
star_road_3_exit_2    = "Star Road 3 - Secret Exit"
 | 
			
		||||
star_road_4_exit_1    = "Star Road 4 - Normal Exit"
 | 
			
		||||
star_road_4_exit_2    = "Star Road 4 - Secret Exit"
 | 
			
		||||
star_road_5_exit_1    = "Star Road 5 - Normal Exit"
 | 
			
		||||
star_road_5_exit_2    = "Star Road 5 - Secret Exit"
 | 
			
		||||
 | 
			
		||||
special_zone_1_exit_1 = "Gnarly - Normal Exit"
 | 
			
		||||
special_zone_1_dragon = "Gnarly - Dragon Coins"
 | 
			
		||||
special_zone_2_exit_1 = "Tubular - Normal Exit"
 | 
			
		||||
special_zone_2_dragon = "Tubular - Dragon Coins"
 | 
			
		||||
special_zone_3_exit_1 = "Way Cool - Normal Exit"
 | 
			
		||||
special_zone_3_dragon = "Way Cool - Dragon Coins"
 | 
			
		||||
special_zone_4_exit_1 = "Awesome - Normal Exit"
 | 
			
		||||
special_zone_4_dragon = "Awesome - Dragon Coins"
 | 
			
		||||
special_zone_5_exit_1 = "Groovy - Normal Exit"
 | 
			
		||||
special_zone_5_dragon = "Groovy - Dragon Coins"
 | 
			
		||||
special_zone_6_exit_1 = "Mondo - Normal Exit"
 | 
			
		||||
special_zone_6_dragon = "Mondo - Dragon Coins"
 | 
			
		||||
special_zone_7_exit_1 = "Outrageous - Normal Exit"
 | 
			
		||||
special_zone_7_dragon = "Outrageous - Dragon Coins"
 | 
			
		||||
special_zone_8_exit_1 = "Funky - Normal Exit"
 | 
			
		||||
special_zone_8_dragon = "Funky - Dragon Coins"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Region Definitions
 | 
			
		||||
menu_region = "Menu"
 | 
			
		||||
 | 
			
		||||
yoshis_island_region      = "Yoshi's Island"
 | 
			
		||||
donut_plains_region       = "Donut Plains"
 | 
			
		||||
vanilla_dome_region       = "Vanilla Dome"
 | 
			
		||||
twin_bridges_region       = "Twin Bridges"
 | 
			
		||||
forest_of_illusion_region = "Forest of Illusion"
 | 
			
		||||
chocolate_island_region   = "Chocolate Island"
 | 
			
		||||
valley_of_bowser_region   = "Valley of Bowser"
 | 
			
		||||
star_road_region          = "Star Road"
 | 
			
		||||
special_zone_region       = "Special Zone"
 | 
			
		||||
 | 
			
		||||
yoshis_island_1_tile        = "Yoshi's Island 1 - Tile"
 | 
			
		||||
yoshis_island_1_region      = "Yoshi's Island 1"
 | 
			
		||||
yoshis_island_2_tile        = "Yoshi's Island 2 - Tile"
 | 
			
		||||
yoshis_island_2_region      = "Yoshi's Island 2"
 | 
			
		||||
yoshis_island_3_tile        = "Yoshi's Island 3 - Tile"
 | 
			
		||||
yoshis_island_3_region      = "Yoshi's Island 3"
 | 
			
		||||
yoshis_island_4_tile        = "Yoshi's Island 4 - Tile"
 | 
			
		||||
yoshis_island_4_region      = "Yoshi's Island 4"
 | 
			
		||||
yoshis_island_castle_tile   = "#1 Iggy's Castle - Tile"
 | 
			
		||||
yoshis_island_castle_region = "#1 Iggy's Castle"
 | 
			
		||||
 | 
			
		||||
yellow_switch_palace_tile = "Yellow Switch Palace - Tile"
 | 
			
		||||
 | 
			
		||||
donut_plains_1_tile          = "Donut Plains 1 - Tile"
 | 
			
		||||
donut_plains_1_region        = "Donut Plains 1"
 | 
			
		||||
donut_plains_2_tile          = "Donut Plains 2 - Tile"
 | 
			
		||||
donut_plains_2_region        = "Donut Plains 2"
 | 
			
		||||
donut_plains_3_tile          = "Donut Plains 3 - Tile"
 | 
			
		||||
donut_plains_3_region        = "Donut Plains 3"
 | 
			
		||||
donut_plains_4_tile          = "Donut Plains 4 - Tile"
 | 
			
		||||
donut_plains_4_region        = "Donut Plains 4"
 | 
			
		||||
donut_secret_1_tile          = "Donut Secret 1 - Tile"
 | 
			
		||||
donut_secret_1_region        = "Donut Secret 1"
 | 
			
		||||
donut_secret_2_tile          = "Donut Secret 2 - Tile"
 | 
			
		||||
donut_secret_2_region        = "Donut Secret 2"
 | 
			
		||||
donut_ghost_house_tile       = "Donut Ghost House - Tile"
 | 
			
		||||
donut_ghost_house_region     = "Donut Ghost House"
 | 
			
		||||
donut_secret_house_tile      = "Donut Secret House - Tile"
 | 
			
		||||
donut_secret_house_region    = "Donut Secret House"
 | 
			
		||||
donut_plains_castle_tile     = "#2 Morton's Castle - Tile"
 | 
			
		||||
donut_plains_castle_region   = "#2 Morton's Castle"
 | 
			
		||||
donut_plains_top_secret      = "Top Secret Area"
 | 
			
		||||
donut_plains_top_secret_tile = "Top Secret Area - Tile"
 | 
			
		||||
donut_plains_star_road       = "Donut Plains - Star Road"
 | 
			
		||||
 | 
			
		||||
green_switch_palace_tile = "Green Switch Palace - Tile"
 | 
			
		||||
 | 
			
		||||
vanilla_dome_1_tile         = "Vanilla Dome 1 - Tile"
 | 
			
		||||
vanilla_dome_1_region       = "Vanilla Dome 1"
 | 
			
		||||
vanilla_dome_2_tile         = "Vanilla Dome 2 - Tile"
 | 
			
		||||
vanilla_dome_2_region       = "Vanilla Dome 2"
 | 
			
		||||
vanilla_dome_3_tile         = "Vanilla Dome 3 - Tile"
 | 
			
		||||
vanilla_dome_3_region       = "Vanilla Dome 3"
 | 
			
		||||
vanilla_dome_4_tile         = "Vanilla Dome 4 - Tile"
 | 
			
		||||
vanilla_dome_4_region       = "Vanilla Dome 4"
 | 
			
		||||
vanilla_secret_1_tile       = "Vanilla Secret 1 - Tile"
 | 
			
		||||
vanilla_secret_1_region     = "Vanilla Secret 1"
 | 
			
		||||
vanilla_secret_2_tile       = "Vanilla Secret 2 - Tile"
 | 
			
		||||
vanilla_secret_2_region     = "Vanilla Secret 2"
 | 
			
		||||
vanilla_secret_3_tile       = "Vanilla Secret 3 - Tile"
 | 
			
		||||
vanilla_secret_3_region     = "Vanilla Secret 3"
 | 
			
		||||
vanilla_ghost_house_tile    = "Vanilla Ghost House - Tile"
 | 
			
		||||
vanilla_ghost_house_region  = "Vanilla Ghost House"
 | 
			
		||||
vanilla_fortress_tile       = "Vanilla Fortress - Tile"
 | 
			
		||||
vanilla_fortress_region     = "Vanilla Fortress"
 | 
			
		||||
vanilla_dome_castle_tile    = "#3 Lemmy's Castle - Tile"
 | 
			
		||||
vanilla_dome_castle_region  = "#3 Lemmy's Castle"
 | 
			
		||||
vanilla_dome_star_road      = "Vanilla Dome - Star Road"
 | 
			
		||||
 | 
			
		||||
red_switch_palace_tile = "Red Switch Palace - Tile"
 | 
			
		||||
 | 
			
		||||
butter_bridge_1_tile       = "Butter Bridge 1 - Tile"
 | 
			
		||||
butter_bridge_1_region     = "Butter Bridge 1"
 | 
			
		||||
butter_bridge_2_tile       = "Butter Bridge 2 - Tile"
 | 
			
		||||
butter_bridge_2_region     = "Butter Bridge 2"
 | 
			
		||||
cheese_bridge_tile         = "Cheese Bridge - Tile"
 | 
			
		||||
cheese_bridge_region       = "Cheese Bridge"
 | 
			
		||||
cookie_mountain_tile       = "Cookie Mountain - Tile"
 | 
			
		||||
cookie_mountain_region     = "Cookie Mountain"
 | 
			
		||||
soda_lake_tile             = "Soda Lake - Tile"
 | 
			
		||||
soda_lake_region           = "Soda Lake"
 | 
			
		||||
twin_bridges_castle_tile   = "#4 Ludwig's Castle - Tile"
 | 
			
		||||
twin_bridges_castle_region = "#4 Ludwig's Castle"
 | 
			
		||||
twin_bridges_star_road     = "Twin Bridges - Star Road"
 | 
			
		||||
 | 
			
		||||
forest_of_illusion_1_tile   = "Forest of Illusion 1 - Tile"
 | 
			
		||||
forest_of_illusion_1_region = "Forest of Illusion 1"
 | 
			
		||||
forest_of_illusion_2_tile   = "Forest of Illusion 2 - Tile"
 | 
			
		||||
forest_of_illusion_2_region = "Forest of Illusion 2"
 | 
			
		||||
forest_of_illusion_3_tile   = "Forest of Illusion 3 - Tile"
 | 
			
		||||
forest_of_illusion_3_region = "Forest of Illusion 3"
 | 
			
		||||
forest_of_illusion_4_tile   = "Forest of Illusion 4 - Tile"
 | 
			
		||||
forest_of_illusion_4_region = "Forest of Illusion 4"
 | 
			
		||||
forest_ghost_house_tile     = "Forest Ghost House - Tile"
 | 
			
		||||
forest_ghost_house_region   = "Forest Ghost House"
 | 
			
		||||
forest_secret_tile          = "Forest Secret - Tile"
 | 
			
		||||
forest_secret_region        = "Forest Secret"
 | 
			
		||||
forest_fortress_tile        = "Forest Fortress - Tile"
 | 
			
		||||
forest_fortress_region      = "Forest Fortress"
 | 
			
		||||
forest_castle_tile          = "#5 Roy's Castle - Tile"
 | 
			
		||||
forest_castle_region        = "#5 Roy's Castle"
 | 
			
		||||
forest_star_road            = "Forest of Illusion - Star Road"
 | 
			
		||||
 | 
			
		||||
blue_switch_palace_tile = "Blue Switch Palace - Tile"
 | 
			
		||||
 | 
			
		||||
chocolate_island_1_tile      = "Chocolate Island 1 - Tile"
 | 
			
		||||
chocolate_island_1_region    = "Chocolate Island 1"
 | 
			
		||||
chocolate_island_2_tile      = "Chocolate Island 2 - Tile"
 | 
			
		||||
chocolate_island_2_region    = "Chocolate Island 2"
 | 
			
		||||
chocolate_island_3_tile      = "Chocolate Island 3 - Tile"
 | 
			
		||||
chocolate_island_3_region    = "Chocolate Island 3"
 | 
			
		||||
chocolate_island_4_tile      = "Chocolate Island 4 - Tile"
 | 
			
		||||
chocolate_island_4_region    = "Chocolate Island 4"
 | 
			
		||||
chocolate_island_5_tile      = "Chocolate Island 5 - Tile"
 | 
			
		||||
chocolate_island_5_region    = "Chocolate Island 5"
 | 
			
		||||
chocolate_ghost_house_tile   = "Choco-Ghost House - Tile"
 | 
			
		||||
chocolate_ghost_house_region = "Choco-Ghost House"
 | 
			
		||||
chocolate_secret_tile        = "Chocolate Secret - Tile"
 | 
			
		||||
chocolate_secret_region      = "Chocolate Secret"
 | 
			
		||||
chocolate_fortress_tile      = "Chocolate Fortress - Tile"
 | 
			
		||||
chocolate_fortress_region    = "Chocolate Fortress"
 | 
			
		||||
chocolate_castle_tile        = "#6 Wendy's Castle - Tile"
 | 
			
		||||
chocolate_castle_region      = "#6 Wendy's Castle"
 | 
			
		||||
 | 
			
		||||
sunken_ghost_ship_tile   = "Sunken Ghost Ship - Tile"
 | 
			
		||||
sunken_ghost_ship_region = "Sunken Ghost Ship"
 | 
			
		||||
 | 
			
		||||
valley_of_bowser_1_tile   = "Valley of Bowser 1 - Tile"
 | 
			
		||||
valley_of_bowser_1_region = "Valley of Bowser 1"
 | 
			
		||||
valley_of_bowser_2_tile   = "Valley of Bowser 2 - Tile"
 | 
			
		||||
valley_of_bowser_2_region = "Valley of Bowser 2"
 | 
			
		||||
valley_of_bowser_3_tile   = "Valley of Bowser 3 - Tile"
 | 
			
		||||
valley_of_bowser_3_region = "Valley of Bowser 3"
 | 
			
		||||
valley_of_bowser_4_tile   = "Valley of Bowser 4 - Tile"
 | 
			
		||||
valley_of_bowser_4_region = "Valley of Bowser 4"
 | 
			
		||||
valley_ghost_house_tile   = "Valley Ghost House - Tile"
 | 
			
		||||
valley_ghost_house_region = "Valley Ghost House"
 | 
			
		||||
valley_fortress_tile      = "Valley Fortress - Tile"
 | 
			
		||||
valley_fortress_region    = "Valley Fortress"
 | 
			
		||||
valley_castle_tile        = "#7 Larry's Castle - Tile"
 | 
			
		||||
valley_castle_region      = "#7 Larry's Castle"
 | 
			
		||||
valley_star_road          = "Valley of Bowser - Star Road"
 | 
			
		||||
 | 
			
		||||
front_door_tile    = "Front Door - Tile"
 | 
			
		||||
back_door_tile     = "Back Door - Tile"
 | 
			
		||||
bowser_region      = "Bowser - Region"
 | 
			
		||||
 | 
			
		||||
star_road_donut        = "Star Road - Donut Plains"
 | 
			
		||||
star_road_1_tile       = "Star Road 1 - Tile"
 | 
			
		||||
star_road_1_region     = "Star Road 1"
 | 
			
		||||
star_road_vanilla      = "Star Road - Vanilla Dome"
 | 
			
		||||
star_road_2_tile       = "Star Road 2 - Tile"
 | 
			
		||||
star_road_2_region     = "Star Road 2"
 | 
			
		||||
star_road_twin_bridges = "Star Road - Twin Bridges"
 | 
			
		||||
star_road_3_tile       = "Star Road 3 - Tile"
 | 
			
		||||
star_road_3_region     = "Star Road 3"
 | 
			
		||||
star_road_forest       = "Star Road - Forest of Illusion"
 | 
			
		||||
star_road_4_tile       = "Star Road 4 - Tile"
 | 
			
		||||
star_road_4_region     = "Star Road 4"
 | 
			
		||||
star_road_valley       = "Star Road - Valley of Bowser"
 | 
			
		||||
star_road_5_tile       = "Star Road 5 - Tile"
 | 
			
		||||
star_road_5_region     = "Star Road 5"
 | 
			
		||||
star_road_special      = "Star Road - Special Zone"
 | 
			
		||||
 | 
			
		||||
special_star_road     = "Special Zone - Star Road"
 | 
			
		||||
special_zone_1_tile   = "Gnarly - Tile"
 | 
			
		||||
special_zone_1_region = "Gnarly"
 | 
			
		||||
special_zone_2_tile   = "Tubular - Tile"
 | 
			
		||||
special_zone_2_region = "Tubular"
 | 
			
		||||
special_zone_3_tile   = "Way Cool - Tile"
 | 
			
		||||
special_zone_3_region = "Way Cool"
 | 
			
		||||
special_zone_4_tile   = "Awesome - Tile"
 | 
			
		||||
special_zone_4_region = "Awesome"
 | 
			
		||||
special_zone_5_tile   = "Groovy - Tile"
 | 
			
		||||
special_zone_5_region = "Groovy"
 | 
			
		||||
special_zone_6_tile   = "Mondo - Tile"
 | 
			
		||||
special_zone_6_region = "Mondo"
 | 
			
		||||
special_zone_7_tile   = "Outrageous - Tile"
 | 
			
		||||
special_zone_7_region = "Outrageous"
 | 
			
		||||
special_zone_8_tile   = "Funky - Tile"
 | 
			
		||||
special_zone_8_region = "Funky"
 | 
			
		||||
special_complete      = "Special Zone - Star Road - Complete"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,140 @@
 | 
			
		|||
 | 
			
		||||
from BaseClasses import MultiWorld
 | 
			
		||||
 | 
			
		||||
import math
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
text_mapping = {
 | 
			
		||||
    "A": 0x00, "B": 0x01, "C": 0x02, "D": 0x03, "E": 0x04, "F": 0x05, "G": 0x06, "H": 0x07, "I": 0x08, "J": 0x09,
 | 
			
		||||
    "K": 0x0A, "L": 0x0B, "M": 0x0C, "N": 0x0D, "O": 0x0E, "P": 0x0F, "Q": 0x10, "R": 0x11, "S": 0x12, "T": 0x13,
 | 
			
		||||
    "U": 0x14, "V": 0x15, "W": 0x16, "X": 0x17, "Y": 0x18, "Z": 0x19,
 | 
			
		||||
 | 
			
		||||
    "!": 0x1A, ".": 0x1B, "-": 0x1C, ",": 0x1D, "?": 0x1E, " ": 0x1F,
 | 
			
		||||
 | 
			
		||||
    "0": 0x22, "1": 0x23, "2": 0x24, "3": 0x25, "4": 0x26, "5": 0x27, "6": 0x28, "7": 0x29, "8": 0x2A, "9": 0x2B,
 | 
			
		||||
 | 
			
		||||
    "a": 0x40, "b": 0x41, "c": 0x42, "d": 0x43, "e": 0x44, "f": 0x45, "g": 0x46, "h": 0x47, "i": 0x48, "j": 0x49,
 | 
			
		||||
    "k": 0x4A, "l": 0x4B, "m": 0x4C, "n": 0x4D, "o": 0x4E, "p": 0x4F, "q": 0x50, "r": 0x51, "s": 0x52, "t": 0x53,
 | 
			
		||||
    "u": 0x54, "v": 0x55, "w": 0x56, "x": 0x57, "y": 0x58, "z": 0x59,
 | 
			
		||||
 | 
			
		||||
    "#": 0x5A, "(": 0x5B, ")": 0x5C, "'": 0x5D
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
title_text_mapping = {
 | 
			
		||||
    "A": [0x0A, 0x38], "B": [0x0B, 0x38], "C": [0x0C, 0x38], "D": [0x0D, 0x38], "E": [0x0E, 0x38],
 | 
			
		||||
    "F": [0x0F, 0x38], "G": [0x10, 0x38], "H": [0x11, 0x38], "I": [0x12, 0x38], "J": [0x13, 0x38],
 | 
			
		||||
    "K": [0x14, 0x38], "L": [0x15, 0x38], "M": [0x16, 0x38], "N": [0x17, 0x38], "O": [0x18, 0x38],
 | 
			
		||||
    "P": [0x19, 0x38], "Q": [0x1A, 0x38], "R": [0x1B, 0x38], "S": [0x1C, 0x38], "T": [0x1D, 0x38],
 | 
			
		||||
    "U": [0x1E, 0x38], "V": [0x1F, 0x38], "W": [0x20, 0x38], "X": [0x21, 0x38], "Y": [0x22, 0x38],
 | 
			
		||||
    "Z": [0x23, 0x38], " ": [0xFC, 0x38], ".": [0x24, 0x38],
 | 
			
		||||
    "0": [0x00, 0x38], "1": [0x01, 0x38], "2": [0x02, 0x38], "3": [0x03, 0x38], "4": [0x04, 0x38],
 | 
			
		||||
    "5": [0x05, 0x38], "6": [0x06, 0x38], "7": [0x07, 0x38], "8": [0x08, 0x38], "9": [0x09, 0x38],
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def string_to_bytes(input_string):
 | 
			
		||||
    out_array = bytearray()
 | 
			
		||||
    for letter in input_string:
 | 
			
		||||
        out_array.append(text_mapping[letter] if letter in text_mapping else text_mapping["."])
 | 
			
		||||
 | 
			
		||||
    return out_array
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generate_text_box(input_string):
 | 
			
		||||
    out_bytes = bytearray()
 | 
			
		||||
    box_line_count = 0
 | 
			
		||||
    box_line_chr_count = 0
 | 
			
		||||
    for word in input_string.split():
 | 
			
		||||
        if box_line_chr_count + len(word) > 18:
 | 
			
		||||
            out_bytes[-1] += 0x80
 | 
			
		||||
            box_line_count += 1
 | 
			
		||||
            box_line_chr_count = 0
 | 
			
		||||
 | 
			
		||||
        out_bytes.extend(string_to_bytes(word))
 | 
			
		||||
        box_line_chr_count += len(word)
 | 
			
		||||
 | 
			
		||||
        if box_line_chr_count < 18:
 | 
			
		||||
            box_line_chr_count += 1
 | 
			
		||||
            out_bytes.append(0x1F)
 | 
			
		||||
 | 
			
		||||
    for i in range(box_line_count, 8):
 | 
			
		||||
        out_bytes.append(0x9F)
 | 
			
		||||
 | 
			
		||||
    return out_bytes
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generate_goal_text(world: MultiWorld, player: int):
 | 
			
		||||
    out_array = bytearray()
 | 
			
		||||
    if world.goal[player] == "yoshi_egg_hunt":
 | 
			
		||||
        required_yoshi_eggs = max(math.floor(
 | 
			
		||||
                world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
 | 
			
		||||
        out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
        out_array += string_to_bytes(" You must acquire")
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += string_to_bytes(f'  {required_yoshi_eggs:02} Yoshi Eggs,')
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += string_to_bytes("then return here.")
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += bytearray([0x9F, 0x9F, 0x9F])
 | 
			
		||||
    else:
 | 
			
		||||
        bosses_required = world.bosses_required[player].value
 | 
			
		||||
        out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
        out_array += string_to_bytes(" You must defeat")
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += string_to_bytes(f'    {bosses_required:02} Bosses,')
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += string_to_bytes("then defeat Bowser")
 | 
			
		||||
        out_array[-1] += 0x80
 | 
			
		||||
        out_array += bytearray([0x9F, 0x9F, 0x9F])
 | 
			
		||||
 | 
			
		||||
    return out_array
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generate_received_text(item_name: str, player_name: str):
 | 
			
		||||
    out_array = bytearray()
 | 
			
		||||
 | 
			
		||||
    item_name = item_name[:18]
 | 
			
		||||
    player_name = player_name[:18]
 | 
			
		||||
 | 
			
		||||
    item_buffer = max(0, math.floor((18 - len(item_name)) / 2))
 | 
			
		||||
    player_buffer = max(0, math.floor((18 - len(player_name)) / 2))
 | 
			
		||||
 | 
			
		||||
    out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
    out_array += string_to_bytes("     Received")
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x1F] * item_buffer)
 | 
			
		||||
    out_array += string_to_bytes(item_name)
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += string_to_bytes("       from")
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x1F] * player_buffer)
 | 
			
		||||
    out_array += string_to_bytes(player_name)
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
 | 
			
		||||
    return out_array
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generate_sent_text(item_name: str, player_name: str):
 | 
			
		||||
    out_array = bytearray()
 | 
			
		||||
 | 
			
		||||
    item_name = item_name[:18]
 | 
			
		||||
    player_name = player_name[:18]
 | 
			
		||||
 | 
			
		||||
    item_buffer = max(0, math.floor((18 - len(item_name)) / 2))
 | 
			
		||||
    player_buffer = max(0, math.floor((18 - len(player_name)) / 2))
 | 
			
		||||
 | 
			
		||||
    out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
    out_array += string_to_bytes("       Sent")
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x1F] * item_buffer)
 | 
			
		||||
    out_array += string_to_bytes(item_name)
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += string_to_bytes("        to")
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x1F] * player_buffer)
 | 
			
		||||
    out_array += string_to_bytes(player_name)
 | 
			
		||||
    out_array[-1] += 0x80
 | 
			
		||||
    out_array += bytearray([0x9F, 0x9F])
 | 
			
		||||
 | 
			
		||||
    return out_array
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,236 @@
 | 
			
		|||
import typing
 | 
			
		||||
 | 
			
		||||
from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionList
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Goal(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    Determines the goal of the seed
 | 
			
		||||
    Bowser: Defeat Koopalings, reach Bowser's Castle and defeat Bowser
 | 
			
		||||
    Yoshi Egg Hunt: Find a certain number of Yoshi Eggs
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Goal"
 | 
			
		||||
    option_bowser = 0
 | 
			
		||||
    option_yoshi_egg_hunt = 1
 | 
			
		||||
    default = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BossesRequired(Range):
 | 
			
		||||
    """
 | 
			
		||||
    How many Bosses (Koopalings or Reznor) must be defeated in order to defeat Bowser
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Bosses Required"
 | 
			
		||||
    range_start = 0
 | 
			
		||||
    range_end = 11
 | 
			
		||||
    default = 7
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NumberOfYoshiEggs(Range):
 | 
			
		||||
    """
 | 
			
		||||
    How many Yoshi Eggs are in the pool for Yoshi Egg Hunt
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Total Number of Yoshi Eggs"
 | 
			
		||||
    range_start = 1
 | 
			
		||||
    range_end = 80
 | 
			
		||||
    default = 50
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PercentageOfYoshiEggs(Range):
 | 
			
		||||
    """
 | 
			
		||||
    What Percentage of Yoshi Eggs are required to finish Yoshi Egg Hunt
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Required Percentage of Yoshi Eggs"
 | 
			
		||||
    range_start = 1
 | 
			
		||||
    range_end = 100
 | 
			
		||||
    default = 100
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DragonCoinChecks(Toggle):
 | 
			
		||||
    """
 | 
			
		||||
    Whether collecting 5 Dragon Coins in each level will grant a check
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Dragon Coin Checks"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BowserCastleDoors(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    How the doors of Bowser's Castle behave
 | 
			
		||||
    Vanilla: Front and Back Doors behave as vanilla
 | 
			
		||||
    Fast: Both doors behave as the Back Door
 | 
			
		||||
    Slow: Both doors behave as the Front Door
 | 
			
		||||
    "Front Door" requires beating all 8 Rooms
 | 
			
		||||
    "Back Door" only requires going through the dark hallway to Bowser
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Bowser Castle Doors"
 | 
			
		||||
    option_vanilla = 0
 | 
			
		||||
    option_fast = 1
 | 
			
		||||
    option_slow = 2
 | 
			
		||||
    default = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LevelShuffle(Toggle):
 | 
			
		||||
    """
 | 
			
		||||
    Whether levels are shuffled
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Level Shuffle"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SwapDonutGhostHouseExits(Toggle):
 | 
			
		||||
    """
 | 
			
		||||
    If enabled, this option will swap which overworld direction the two exits of the level at the Donut Ghost House overworld tile go:
 | 
			
		||||
    False: Normal Exit goes up, Secret Exit goes right.
 | 
			
		||||
    True: Normal Exit goes right, Secret Exit goes up.
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Swap Donut GH Exits"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DisplaySentItemPopups(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    What messages to display in-game for items sent
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Display Sent Item Popups"
 | 
			
		||||
    option_none = 0
 | 
			
		||||
    option_all = 1
 | 
			
		||||
    default = 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DisplayReceivedItemPopups(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    What messages to display in-game for items received
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Display Received Item Popups"
 | 
			
		||||
    option_none = 0
 | 
			
		||||
    option_all = 1
 | 
			
		||||
    option_progression = 2
 | 
			
		||||
    default = 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TrapFillPercentage(Range):
 | 
			
		||||
    """
 | 
			
		||||
    Replace a percentage of junk items in the item pool with random traps
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Trap Fill Percentage"
 | 
			
		||||
    range_start = 0
 | 
			
		||||
    range_end = 100
 | 
			
		||||
    default = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BaseTrapWeight(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    Base Class for Trap Weights
 | 
			
		||||
    """
 | 
			
		||||
    option_none = 0
 | 
			
		||||
    option_low = 1
 | 
			
		||||
    option_medium = 2
 | 
			
		||||
    option_high = 4
 | 
			
		||||
    default = 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class IceTrapWeight(BaseTrapWeight):
 | 
			
		||||
    """
 | 
			
		||||
    Likelihood of a receiving a trap which causes the level to become slippery
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Ice Trap Weight"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StunTrapWeight(BaseTrapWeight):
 | 
			
		||||
    """
 | 
			
		||||
    Likelihood of a receiving a trap which briefly stuns Mario
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Stun Trap Weight"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LiteratureTrapWeight(BaseTrapWeight):
 | 
			
		||||
    """
 | 
			
		||||
    Likelihood of a receiving a trap which causes the player to read literature
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Literature Trap Weight"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Autosave(DefaultOnToggle):
 | 
			
		||||
    """
 | 
			
		||||
    Whether a save prompt will appear after every level
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Autosave"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MusicShuffle(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    Music shuffle type
 | 
			
		||||
    None: No Music is shuffled
 | 
			
		||||
    Consistent: Each music track is consistently shuffled throughout the game
 | 
			
		||||
    Full: Each individual level has a random music track
 | 
			
		||||
    Singularity: The entire game uses one song for overworld and one song for levels
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Music Shuffle"
 | 
			
		||||
    option_none = 0
 | 
			
		||||
    option_consistent = 1
 | 
			
		||||
    option_full = 2
 | 
			
		||||
    option_singularity = 3
 | 
			
		||||
    default = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MarioPalette(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    Mario palette color
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Mario Palette"
 | 
			
		||||
    option_mario = 0
 | 
			
		||||
    option_luigi = 1
 | 
			
		||||
    option_wario = 2
 | 
			
		||||
    option_waluigi = 3
 | 
			
		||||
    option_geno = 4
 | 
			
		||||
    option_princess = 5
 | 
			
		||||
    option_dark = 6
 | 
			
		||||
    option_sponge = 7
 | 
			
		||||
    default = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ForegroundPaletteShuffle(Toggle):
 | 
			
		||||
    """
 | 
			
		||||
    Whether to shuffle level foreground palettes
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Foreground Palette Shuffle"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BackgroundPaletteShuffle(Toggle):
 | 
			
		||||
    """
 | 
			
		||||
    Whether to shuffle level background palettes
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Background Palette Shuffle"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StartingLifeCount(Range):
 | 
			
		||||
    """
 | 
			
		||||
    How many extra lives to start the game with
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Starting Life Count"
 | 
			
		||||
    range_start = 1
 | 
			
		||||
    range_end = 99
 | 
			
		||||
    default = 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
smw_options: typing.Dict[str, type(Option)] = {
 | 
			
		||||
    "death_link": DeathLink,
 | 
			
		||||
    "goal": Goal,
 | 
			
		||||
    "bosses_required": BossesRequired,
 | 
			
		||||
    "number_of_yoshi_eggs": NumberOfYoshiEggs,
 | 
			
		||||
    "percentage_of_yoshi_eggs": PercentageOfYoshiEggs,
 | 
			
		||||
    "dragon_coin_checks": DragonCoinChecks,
 | 
			
		||||
    "bowser_castle_doors": BowserCastleDoors,
 | 
			
		||||
    "level_shuffle": LevelShuffle,
 | 
			
		||||
    "swap_donut_gh_exits": SwapDonutGhostHouseExits,
 | 
			
		||||
    #"display_sent_item_popups": DisplaySentItemPopups,
 | 
			
		||||
    "display_received_item_popups": DisplayReceivedItemPopups,
 | 
			
		||||
    "trap_fill_percentage": TrapFillPercentage,
 | 
			
		||||
    "ice_trap_weight": IceTrapWeight,
 | 
			
		||||
    "stun_trap_weight": StunTrapWeight,
 | 
			
		||||
    "literature_trap_weight": LiteratureTrapWeight,
 | 
			
		||||
    "autosave": Autosave,
 | 
			
		||||
    "music_shuffle": MusicShuffle,
 | 
			
		||||
    "mario_palette": MarioPalette,
 | 
			
		||||
    "foreground_palette_shuffle": ForegroundPaletteShuffle,
 | 
			
		||||
    "background_palette_shuffle": BackgroundPaletteShuffle,
 | 
			
		||||
    "starting_life_count": StartingLifeCount,
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,846 @@
 | 
			
		|||
import Utils
 | 
			
		||||
from Patch import read_rom, APDeltaPatch
 | 
			
		||||
from .Aesthetics import generate_shuffled_header_data
 | 
			
		||||
from .Locations import lookup_id_to_name, all_locations
 | 
			
		||||
from .Levels import level_info_dict, full_level_list, submap_level_list, location_id_to_level_id
 | 
			
		||||
from .Names.TextBox import generate_goal_text, title_text_mapping, generate_text_box
 | 
			
		||||
 | 
			
		||||
USHASH = 'cdd3c8c37322978ca8669b34bc89c804'
 | 
			
		||||
ROM_PLAYER_LIMIT = 65535
 | 
			
		||||
 | 
			
		||||
import hashlib
 | 
			
		||||
import os
 | 
			
		||||
import math
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ability_rom_data = {
 | 
			
		||||
    0xBC0003: [[0x1F2C, 0x7]], # Run         0x80
 | 
			
		||||
    0xBC0004: [[0x1F2C, 0x6]], # Carry       0x40
 | 
			
		||||
    0xBC0005: [[0x1F2C, 0x2]], # Swim        0x04
 | 
			
		||||
    0xBC0006: [[0x1F2C, 0x3]], # Spin Jump   0x08
 | 
			
		||||
    0xBC0007: [[0x1F2C, 0x5]], # Climb       0x20
 | 
			
		||||
    0xBC0008: [[0x1F2C, 0x1]], # Yoshi       0x02
 | 
			
		||||
    0xBC0009: [[0x1F2C, 0x4]], # P-Switch    0x10
 | 
			
		||||
    #0xBC000A: [[]]
 | 
			
		||||
    0xBC000B: [[0x1F2D, 0x3]], # P-Balloon   0x08
 | 
			
		||||
    0xBC000D: [[0x1F2D, 0x4]], # Super Star  0x10
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
item_rom_data = {
 | 
			
		||||
    0xBC0001: [0x18E4, 0x1], # 1-Up Mushroom
 | 
			
		||||
 | 
			
		||||
    0xBC0002: [0x1F24, 0x1, 0x1F], # Yoshi Egg
 | 
			
		||||
    0xBC0012: [0x1F26, 0x1, 0x09], # Boss Token
 | 
			
		||||
 | 
			
		||||
    0xBC000E: [0x1F28, 0x1, 0x1C], # Yellow Switch Palace
 | 
			
		||||
    0xBC000F: [0x1F27, 0x1, 0x1C], # Green Switch Palace
 | 
			
		||||
    0xBC0010: [0x1F2A, 0x1, 0x1C], # Red Switch Palace
 | 
			
		||||
    0xBC0011: [0x1F29, 0x1, 0x1C], # Blue Switch Palace
 | 
			
		||||
 | 
			
		||||
    0xBC0013: [0x0086, 0x1, 0x0E], # Ice Trap
 | 
			
		||||
    0xBC0014: [0x18BD, 0x7F, 0x18], # Stun Trap
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
music_rom_data = [
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
level_music_ids = [
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWDeltaPatch(APDeltaPatch):
 | 
			
		||||
    hash = USHASH
 | 
			
		||||
    game = "Super Mario World"
 | 
			
		||||
    patch_file_ending = ".apsmw"
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def get_source_data(cls) -> bytes:
 | 
			
		||||
        return get_base_rom_bytes()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LocalRom:
 | 
			
		||||
 | 
			
		||||
    def __init__(self, file, patch=True, vanillaRom=None, name=None, hash=None):
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.hash = hash
 | 
			
		||||
        self.orig_buffer = None
 | 
			
		||||
 | 
			
		||||
        with open(file, 'rb') as stream:
 | 
			
		||||
            self.buffer = read_rom(stream)
 | 
			
		||||
        
 | 
			
		||||
    def read_bit(self, address: int, bit_number: int) -> bool:
 | 
			
		||||
        bitflag = (1 << bit_number)
 | 
			
		||||
        return ((self.buffer[address] & bitflag) != 0)
 | 
			
		||||
 | 
			
		||||
    def read_byte(self, address: int) -> int:
 | 
			
		||||
        return self.buffer[address]
 | 
			
		||||
 | 
			
		||||
    def read_bytes(self, startaddress: int, length: int) -> bytes:
 | 
			
		||||
        return self.buffer[startaddress:startaddress + length]
 | 
			
		||||
 | 
			
		||||
    def write_byte(self, address: int, value: int):
 | 
			
		||||
        self.buffer[address] = value
 | 
			
		||||
 | 
			
		||||
    def write_bytes(self, startaddress: int, values):
 | 
			
		||||
        self.buffer[startaddress:startaddress + len(values)] = values
 | 
			
		||||
 | 
			
		||||
    def write_to_file(self, file):
 | 
			
		||||
        with open(file, 'wb') as outfile:
 | 
			
		||||
            outfile.write(self.buffer)
 | 
			
		||||
 | 
			
		||||
    def read_from_file(self, file):
 | 
			
		||||
        with open(file, 'rb') as stream:
 | 
			
		||||
            self.buffer = bytearray(stream.read())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_ability_code(rom):
 | 
			
		||||
    # Lock Abilities
 | 
			
		||||
 | 
			
		||||
    #rom.write_byte(0xC581, 0x01) # No Stars
 | 
			
		||||
    #rom.write_byte(0x62E6, 0x01) # No Star Music
 | 
			
		||||
    #rom.write_byte(0xC300, 0x01) # No P-Balloons
 | 
			
		||||
    #rom.write_byte(0xC305, 0x01) # No P-Balloons
 | 
			
		||||
 | 
			
		||||
    # Run
 | 
			
		||||
    rom.write_bytes(0x5977, bytearray([0x22, 0x10, 0xBA, 0x03])) # JSL $03BA10
 | 
			
		||||
    rom.write_bytes(0x597B, bytearray([0xEA] * 0x04))
 | 
			
		||||
 | 
			
		||||
    RUN_SUB_ADDR = 0x01BA10
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x00, bytearray([0xDA]))             # PHX
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x01, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x02, bytearray([0x90, 0x03]))       # BCC +0x03
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x04, bytearray([0xC8]))             # INY
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x05, bytearray([0xA9, 0x70]))       # LDA #70
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x07, bytearray([0xAA]))             # TAX
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x08, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x0B, bytearray([0x89, 0x80]))       # BIT #80
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x0D, bytearray([0xF0, 0x04]))       # BEQ +0x04
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x0F, bytearray([0x8A]))             # TXA
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x10, bytearray([0x8D, 0xE4, 0x13])) # STA $13E4
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x13, bytearray([0x8A]))             # TXA
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x14, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x15, bytearray([0xFA]))             # PLX
 | 
			
		||||
    rom.write_bytes(RUN_SUB_ADDR + 0x16, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Run
 | 
			
		||||
 | 
			
		||||
    # Purple Block Carry
 | 
			
		||||
    rom.write_bytes(0x726F, bytearray([0x22, 0x28, 0xBA, 0x03])) # JSL $03BA28
 | 
			
		||||
    rom.write_bytes(0x7273, bytearray([0xEA] * 0x02))
 | 
			
		||||
 | 
			
		||||
    PURPLE_BLOCK_CARRY_SUB_ADDR = 0x01BA28
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x04, bytearray([0x89, 0x40]))       # BIT #40
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x06, bytearray([0xF0, 0x09]))       # BEQ +0x09
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x09, bytearray([0xAD, 0x8F, 0x14])) # LDA $148F
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x0C, bytearray([0x0D, 0x7A, 0x18])) # ORA $187A
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x0F, bytearray([0x80, 0x03]))       # BRA +0x03
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x11, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x12, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x14, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Purple Block Carry
 | 
			
		||||
 | 
			
		||||
    # Springboard Carry
 | 
			
		||||
    rom.write_bytes(0xE6DA, bytearray([0x22, 0x40, 0xBA, 0x03])) # JSL $03BA40
 | 
			
		||||
    rom.write_bytes(0xE6DE, bytearray([0xEA] * 0x04))
 | 
			
		||||
 | 
			
		||||
    SPRINGBOARD_CARRY_SUB_ADDR = 0x01BA40
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x00, bytearray([0x48]))             # PHA
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x01, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x05, bytearray([0x89, 0x40]))       # BIT #40
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x07, bytearray([0xF0, 0x08]))       # BEQ +0x08
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x09, bytearray([0xA9, 0x0B]))       # LDA #0B
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x0B, bytearray([0x9D, 0xC8, 0x14])) # STA $14C8, X
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x0E, bytearray([0x9E, 0x02, 0x16])) # STZ $1602, X
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x11, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x12, bytearray([0x68]))             # PLA
 | 
			
		||||
    rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x13, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Springboard Carry
 | 
			
		||||
 | 
			
		||||
    # Shell Carry
 | 
			
		||||
    rom.write_bytes(0xAA66, bytearray([0xAD, 0x2C, 0x1F]))       # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(0xAA69, bytearray([0x89, 0x40]))             # BIT #40
 | 
			
		||||
    rom.write_bytes(0xAA6B, bytearray([0xF0, 0x07]))             # BEQ +0x07
 | 
			
		||||
    rom.write_bytes(0xAA6D, bytearray([0x22, 0x60, 0xBA, 0x03])) # JSL $03BA60
 | 
			
		||||
    rom.write_bytes(0xAA71, bytearray([0xEA] * 0x02))
 | 
			
		||||
 | 
			
		||||
    SHELL_CARRY_SUB_ADDR = 0x01BA60
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x01, bytearray([0xA9, 0x0B]))       # LDA #0B
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x03, bytearray([0x9D, 0xC8, 0x14])) # STA $14C8, X
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x06, bytearray([0xEE, 0x70, 0x14])) # INC $1470
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x09, bytearray([0xA9, 0x0B]))       # LDA #08
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0B, bytearray([0x8D, 0x98, 0x14])) # STA $1498
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0E, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0F, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Shell Carry
 | 
			
		||||
 | 
			
		||||
    # Yoshi Carry
 | 
			
		||||
    rom.write_bytes(0xF309, bytearray([0x22, 0x70, 0xBA, 0x03])) # JSL $03BA70
 | 
			
		||||
    rom.write_bytes(0xF30D, bytearray([0xEA] * 0x06))
 | 
			
		||||
 | 
			
		||||
    YOSHI_CARRY_SUB_ADDR = 0x01BA70
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x04, bytearray([0x89, 0x40]))       # BIT #40
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x06, bytearray([0xF0, 0x0A]))       # BEQ +0x0A
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x08, bytearray([0xA9, 0x12]))       # LDA #12
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0A, bytearray([0x8D, 0xA3, 0x14])) # STA $14A3
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0D, bytearray([0xA9, 0x21]))       # LDA #21
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0F, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x12, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x13, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Yoshi Carry
 | 
			
		||||
 | 
			
		||||
    # Climb
 | 
			
		||||
    rom.write_bytes(0x4D72, bytearray([0x5C, 0x88, 0xBA, 0x03])) # JML $03BA88
 | 
			
		||||
    rom.write_bytes(0x4D76, bytearray([0xEA] * 0x03))
 | 
			
		||||
 | 
			
		||||
    CLIMB_SUB_ADDR = 0x01BA88
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x00, bytearray([0x08]))                   # PHP
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F]))       # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x04, bytearray([0x89, 0x20]))             # BIT #20
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x06, bytearray([0xF0, 0x09]))             # BEQ +0x09
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x08, bytearray([0xA5, 0x8B]))             # LDA $8B
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x0A, bytearray([0x85, 0x74]))             # STA $74
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x0C, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x0D, bytearray([0x5C, 0x17, 0xDB, 0x00])) # JML $00DB17
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x11, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(CLIMB_SUB_ADDR + 0x12, bytearray([0x5C, 0x76, 0xCD, 0x00])) # JML $00CD76
 | 
			
		||||
    # End Climb
 | 
			
		||||
 | 
			
		||||
    # P-Switch
 | 
			
		||||
    rom.write_bytes(0xAB1A, bytearray([0x22, 0xA0, 0xBA, 0x03])) # JSL $03BAA0
 | 
			
		||||
    rom.write_bytes(0xAB1E, bytearray([0xEA] * 0x01))
 | 
			
		||||
 | 
			
		||||
    P_SWITCH_SUB_ADDR = 0x01BAA0
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x04, bytearray([0x89, 0x10]))       # BIT #10
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x06, bytearray([0xF0, 0x04]))       # BEQ +0x04
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x08, bytearray([0xA9, 0xB0]))       # LDA #B0
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0A, bytearray([0x80, 0x02]))       # BRA +0x02
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0C, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0E, bytearray([0x99, 0xAD, 0x14])) # STA $14AD
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x11, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(P_SWITCH_SUB_ADDR + 0x12, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End P-Switch
 | 
			
		||||
 | 
			
		||||
    # Spin Jump
 | 
			
		||||
    rom.write_bytes(0x5645, bytearray([0xAD, 0x2C, 0x1F]))       # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(0x5648, bytearray([0x89, 0x08]))             # BIT #08
 | 
			
		||||
    rom.write_bytes(0x564A, bytearray([0xF0, 0x12]))             # BEQ +0x12
 | 
			
		||||
    rom.write_bytes(0x564C, bytearray([0x22, 0xB8, 0xBA, 0x03])) # JSL $03BAB8
 | 
			
		||||
 | 
			
		||||
    SPIN_JUMP_SUB_ADDR = 0x01BAB8
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x01, bytearray([0x1A]))             # INC
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x02, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x05, bytearray([0xA9, 0x04]))       # LDA #04
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x07, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0A, bytearray([0xA4, 0x76]))       # LDY #76
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0C, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0D, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Spin Jump
 | 
			
		||||
 | 
			
		||||
    # Spin Jump from Water
 | 
			
		||||
    rom.write_bytes(0x6A89, bytearray([0x22, 0xF8, 0xBB, 0x03])) # JSL $03BBF8
 | 
			
		||||
    rom.write_bytes(0x6A8D, bytearray([0xEA] * 0x05))
 | 
			
		||||
 | 
			
		||||
    SPIN_JUMP_WATER_SUB_ADDR = 0x01BBF8
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x04, bytearray([0x89, 0x08]))       # BIT #08
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x06, bytearray([0xF0, 0x09]))       # BEQ +0x09
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x08, bytearray([0x1A]))             # INC
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x09, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x0C, bytearray([0xA9, 0x04]))       # LDA #04
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x0E, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x11, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x12, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Spin Jump from Water
 | 
			
		||||
 | 
			
		||||
    # Spin Jump from Springboard
 | 
			
		||||
    rom.write_bytes(0xE693, bytearray([0x22, 0x0C, 0xBC, 0x03])) # JSL $03BC0C
 | 
			
		||||
    rom.write_bytes(0xE697, bytearray([0xEA] * 0x01))
 | 
			
		||||
 | 
			
		||||
    SPIN_JUMP_SPRING_SUB_ADDR = 0x01BC0C
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x04, bytearray([0x89, 0x08]))       # BIT #08
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x06, bytearray([0xF0, 0x05]))       # BEQ +0x05
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x08, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0A, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0D, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0E, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Spin Jump from Springboard
 | 
			
		||||
 | 
			
		||||
    # Swim
 | 
			
		||||
    rom.write_bytes(0x5A25, bytearray([0x22, 0xC8, 0xBA, 0x03])) # JSL $03BAC8
 | 
			
		||||
    rom.write_bytes(0x5A29, bytearray([0xEA] * 0x04))
 | 
			
		||||
 | 
			
		||||
    SWIM_SUB_ADDR = 0x01BAC8
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x00, bytearray([0x48]))             # PHA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x01, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x05, bytearray([0x89, 0x04]))       # BIT #04
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x07, bytearray([0xF0, 0x0C]))       # BEQ +0x0C
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x09, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0A, bytearray([0x68]))             # PLA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0B, bytearray([0xDD, 0x84, 0xD9])) # CMP $D489, X
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0E, bytearray([0xB0, 0x03]))       # BCS +0x03
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x10, bytearray([0xBD, 0x84, 0xD9])) # LDA $D489, X
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x13, bytearray([0x80, 0x0A]))       # BRA +0x0A
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x15, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x16, bytearray([0x68]))             # PLA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x17, bytearray([0xDD, 0xBE, 0xDE])) # CMP $DEBE, X
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x1A, bytearray([0xB0, 0x03]))       # BCS +0x03
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x1C, bytearray([0xBD, 0xBE, 0xDE])) # LDA $DEBE, X
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x1F, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Swim
 | 
			
		||||
 | 
			
		||||
    # Item Swim
 | 
			
		||||
    rom.write_bytes(0x59D7, bytearray([0x22, 0xE8, 0xBA, 0x03])) # JSL $03BAE8
 | 
			
		||||
    rom.write_bytes(0x59DB, bytearray([0xEA] * 0x02))
 | 
			
		||||
 | 
			
		||||
    SWIM_SUB_ADDR = 0x01BAE8
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x00, bytearray([0x48]))             # PHA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x01, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x05, bytearray([0x89, 0x04]))       # BIT #04
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x07, bytearray([0xF0, 0x0A]))       # BEQ +0x0A
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x09, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0A, bytearray([0x68]))             # PLA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0B, bytearray([0xC9, 0xF0]))       # CMP #F0
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0D, bytearray([0xB0, 0x02]))       # BCS +0x02
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x0F, bytearray([0xA9, 0xF0]))       # LDA #F0
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x11, bytearray([0x80, 0x08]))       # BRA +0x08
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x13, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x14, bytearray([0x68]))             # PLA
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x15, bytearray([0xC9, 0xFF]))       # CMP #FF
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x17, bytearray([0xB0, 0x02]))       # BCS +0x02
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x19, bytearray([0xA9, 0x00]))       # LDA #00
 | 
			
		||||
    rom.write_bytes(SWIM_SUB_ADDR + 0x1B, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Item Swim
 | 
			
		||||
 | 
			
		||||
    # Yoshi
 | 
			
		||||
    rom.write_bytes(0x109FB, bytearray([0x22, 0x08, 0xBB, 0x03])) # JSL $03BB08
 | 
			
		||||
    rom.write_bytes(0x109FF, bytearray([0xEA] * 0x02))
 | 
			
		||||
 | 
			
		||||
    YOSHI_SUB_ADDR = 0x01BB08
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x04, bytearray([0x89, 0x02]))       # BIT #02
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x06, bytearray([0xF0, 0x06]))       # BEQ +0x06
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x09, bytearray([0xB9, 0xA1, 0x88])) # LDA $88A1, Y
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0C, bytearray([0x80, 0x04]))       # BRA +0x04
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0E, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0F, bytearray([0xB9, 0xA2, 0x88])) # LDA $88A2, Y
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x12, bytearray([0x9D, 0x1C, 0x15])) # STA $151C, X
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x15, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Yoshi
 | 
			
		||||
 | 
			
		||||
    # Baby Yoshi
 | 
			
		||||
    rom.write_bytes(0xA2B8, bytearray([0x22, 0x20, 0xBB, 0x03])) # JSL $03BB20
 | 
			
		||||
    rom.write_bytes(0xA2BC, bytearray([0xEA] * 0x01))
 | 
			
		||||
 | 
			
		||||
    YOSHI_SUB_ADDR = 0x01BB20
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x01, bytearray([0x9C, 0x1E, 0x14])) # STZ $141E
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x04, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x07, bytearray([0x89, 0x02]))       # BIT #02
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x09, bytearray([0xF0, 0x05]))       # BEQ +0x05
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0B, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0C, bytearray([0xA9, 0x35]))       # LDA #35
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x0E, bytearray([0x80, 0x03]))       # BRA +0x03
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x10, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x11, bytearray([0xA9, 0x70]))       # LDA #70
 | 
			
		||||
    rom.write_bytes(YOSHI_SUB_ADDR + 0x13, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Baby Yoshi
 | 
			
		||||
 | 
			
		||||
    # Midway Gate
 | 
			
		||||
    rom.write_bytes(0x72E4, bytearray([0x22, 0x38, 0xBB, 0x03])) # JSL $03BB38
 | 
			
		||||
 | 
			
		||||
    MIDWAY_GATE_SUB_ADDR = 0x01BB38
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x04, bytearray([0x89, 0x01]))       # BIT #01
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x06, bytearray([0xF0, 0x07]))       # BEQ +0x07
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x09, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0B, bytearray([0x85, 0x19]))       # STA $19
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0D, bytearray([0x80, 0x01]))       # BRA +0x01
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0F, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x10, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Midway Gate
 | 
			
		||||
 | 
			
		||||
    # Mushroom
 | 
			
		||||
    rom.write_bytes(0x5156, bytearray([0x22, 0x50, 0xBB, 0x03])) # JSL $03BB50
 | 
			
		||||
    rom.write_bytes(0x515A, bytearray([0xEA] * 0x04))
 | 
			
		||||
 | 
			
		||||
    MUSHROOM_SUB_ADDR = 0x01BB50
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x04, bytearray([0x89, 0x01]))       # BIT #01
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x06, bytearray([0xF0, 0x05]))       # BEQ +0x05
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x09, bytearray([0xE6, 0x19]))       # INC $19
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0B, bytearray([0x80, 0x01]))       # BRA +0x01
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0D, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0E, bytearray([0xA9, 0x00]))       # LDA #00
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x10, bytearray([0x85, 0x71]))       # STA $72
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x12, bytearray([0x64, 0x9D]))       # STZ $9D
 | 
			
		||||
    rom.write_bytes(MUSHROOM_SUB_ADDR + 0x14, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Mushroom
 | 
			
		||||
 | 
			
		||||
    # Take Damage
 | 
			
		||||
    rom.write_bytes(0x5142, bytearray([0x22, 0x65, 0xBB, 0x03])) # JSL $03BB65
 | 
			
		||||
    rom.write_bytes(0x5146, bytearray([0x60] * 0x01))            # RTS
 | 
			
		||||
 | 
			
		||||
    DAMAGE_SUB_ADDR = 0x01BB65
 | 
			
		||||
    rom.write_bytes(DAMAGE_SUB_ADDR + 0x00, bytearray([0x8D, 0x97, 0x14])) # STA $1497
 | 
			
		||||
    rom.write_bytes(DAMAGE_SUB_ADDR + 0x03, bytearray([0x80, 0xF4]))       # BRA -0x0C
 | 
			
		||||
    # End Take Damage
 | 
			
		||||
 | 
			
		||||
    # Fire Flower Cycle
 | 
			
		||||
    rom.write_bytes(0x5187, bytearray([0x22, 0x6A, 0xBB, 0x03])) # JSL $03BB6A
 | 
			
		||||
    rom.write_bytes(0x518B, bytearray([0x60] * 0x01))            # RTS
 | 
			
		||||
 | 
			
		||||
    PALETTE_CYCLE_SUB_ADDR = 0x01BB6A
 | 
			
		||||
    rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x00, bytearray([0xCE, 0x9B, 0x14])) # DEC $149B
 | 
			
		||||
    rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x03, bytearray([0xF0, 0xEF]))       # BEQ -0x11
 | 
			
		||||
    rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x05, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Fire Flower Cycle
 | 
			
		||||
 | 
			
		||||
    # Pipe Exit
 | 
			
		||||
    rom.write_bytes(0x526D, bytearray([0x22, 0x70, 0xBB, 0x03])) # JSL $03BB70
 | 
			
		||||
    rom.write_bytes(0x5271, bytearray([0x60, 0xEA] * 0x01))      # RTS, NOP
 | 
			
		||||
 | 
			
		||||
    PIPE_EXIT_SUB_ADDR = 0x01BB70
 | 
			
		||||
    rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x00, bytearray([0x9C, 0x19, 0x14])) # STZ $1419
 | 
			
		||||
    rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x03, bytearray([0xA9, 0x00]))       # LDA #00
 | 
			
		||||
    rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x05, bytearray([0x85, 0x71]))       # STA $72
 | 
			
		||||
    rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x07, bytearray([0x64, 0x9D]))       # STZ $9D
 | 
			
		||||
    rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x09, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Pipe Exit
 | 
			
		||||
 | 
			
		||||
    # Cape Transform
 | 
			
		||||
    rom.write_bytes(0x5168, bytearray([0x22, 0x7A, 0xBB, 0x03])) # JSL $03BB7A
 | 
			
		||||
    rom.write_bytes(0x516C, bytearray([0xEA] * 0x01))            # RTS, NOP
 | 
			
		||||
    rom.write_bytes(0x516D, bytearray([0xF0, 0xD1]))             # BEQ -0x2F
 | 
			
		||||
 | 
			
		||||
    CAPE_TRANSFORM_SUB_ADDR = 0x01BB7A
 | 
			
		||||
    rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x00, bytearray([0xA5, 0x19])) # LDA $19
 | 
			
		||||
    rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x02, bytearray([0x4A]))       # LSR
 | 
			
		||||
    rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x03, bytearray([0xD0, 0xDF])) # BNE -0x21
 | 
			
		||||
    rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x05, bytearray([0x6B]))       # RTL
 | 
			
		||||
    # End Cape Transform
 | 
			
		||||
 | 
			
		||||
    # Fire Flower
 | 
			
		||||
    rom.write_bytes(0xC5F7, bytearray([0x22, 0x80, 0xBB, 0x03])) # JSL $03BB80
 | 
			
		||||
 | 
			
		||||
    FIRE_FLOWER_SUB_ADDR = 0x01BB80
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x04, bytearray([0x89, 0x02]))       # BIT #02
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x06, bytearray([0xF0, 0x07]))       # BEQ +0x07
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x09, bytearray([0xA9, 0x03]))       # LDA #03
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0B, bytearray([0x85, 0x19]))       # STA $19
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0D, bytearray([0x80, 0x01]))       # BRA +0x01
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0F, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x10, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Fire Flower
 | 
			
		||||
 | 
			
		||||
    # Cape
 | 
			
		||||
    rom.write_bytes(0xC598, bytearray([0x22, 0x91, 0xBB, 0x03])) # JSL $03BB91
 | 
			
		||||
 | 
			
		||||
    CAPE_SUB_ADDR = 0x01BB91
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x04, bytearray([0x89, 0x04]))       # BIT #04
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x06, bytearray([0xF0, 0x07]))       # BEQ +0x07
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x09, bytearray([0xA9, 0x02]))       # LDA #02
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x0B, bytearray([0x85, 0x19]))       # STA $19
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x0D, bytearray([0x80, 0x01]))       # BRA +0x01
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x0F, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(CAPE_SUB_ADDR + 0x10, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Cape
 | 
			
		||||
 | 
			
		||||
    # P-Balloon
 | 
			
		||||
    rom.write_bytes(0xC2FF, bytearray([0x22, 0xA2, 0xBB, 0x03])) # JSL $03BBA2
 | 
			
		||||
    rom.write_bytes(0xC303, bytearray([0xEA] * 0x06))
 | 
			
		||||
 | 
			
		||||
    P_BALLOON_SUB_ADDR = 0x01BBA2
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x04, bytearray([0x89, 0x08]))       # BIT #08
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x06, bytearray([0xF0, 0x0D]))       # BEQ +0x0D
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x09, bytearray([0xA9, 0x09]))       # LDA #09
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x0B, bytearray([0x8D, 0xF3, 0x13])) # STA $13F3
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x0E, bytearray([0xA9, 0xFF]))       # LDA #FF
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x10, bytearray([0x8D, 0x91, 0x18])) # STA $1891
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x13, bytearray([0x80, 0x0B]))       # BRA +0x0B
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x15, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x16, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x18, bytearray([0x8D, 0xF3, 0x13])) # STA $13F3
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x1B, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x1D, bytearray([0x8D, 0x91, 0x18])) # STA $1891
 | 
			
		||||
    rom.write_bytes(P_BALLOON_SUB_ADDR + 0x20, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End P-Balloon
 | 
			
		||||
 | 
			
		||||
    # Star
 | 
			
		||||
    rom.write_bytes(0xC580, bytearray([0x22, 0xC8, 0xBB, 0x03])) # JSL $03BBC8
 | 
			
		||||
    rom.write_bytes(0xC584, bytearray([0xEA] * 0x01))
 | 
			
		||||
 | 
			
		||||
    STAR_SUB_ADDR = 0x01BBC8
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x04, bytearray([0x89, 0x10]))       # BIT #10
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x06, bytearray([0xF0, 0x08]))       # BEQ +0x08
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x09, bytearray([0xA9, 0xFF]))       # LDA #FF
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x0B, bytearray([0x8D, 0x90, 0x14])) # STA $1490
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x0E, bytearray([0x80, 0x06]))       # BRA +0x06
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x10, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x11, bytearray([0xA9, 0x01]))       # LDA #01
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x13, bytearray([0x8D, 0x90, 0x14])) # STA $1490
 | 
			
		||||
    rom.write_bytes(STAR_SUB_ADDR + 0x16, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Star
 | 
			
		||||
 | 
			
		||||
    # Star Timer
 | 
			
		||||
    rom.write_bytes(0x62E3, bytearray([0x22, 0xE0, 0xBB, 0x03])) # JSL $03BBE0
 | 
			
		||||
 | 
			
		||||
    STAR_TIMER_SUB_ADDR = 0x01BBE0
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x00, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x04, bytearray([0x89, 0x10]))       # BIT #10
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x06, bytearray([0xF0, 0x07]))       # BEQ +0x07
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x08, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x09, bytearray([0xA5, 0x13]))       # LDA $13
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0B, bytearray([0xC0, 0x1E]))       # CPY #1E
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0D, bytearray([0x80, 0x05]))       # BRA +0x05
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0F, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x10, bytearray([0xA5, 0x13]))       # LDA $13
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x12, bytearray([0xC0, 0x01]))       # CPY #01
 | 
			
		||||
    rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x14, bytearray([0x6B]))             # RTL
 | 
			
		||||
    # End Star Timer
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_yoshi_box(rom):
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0xEC3D, bytearray([0xEA] * 0x03)) # NOP Lines that cause Yoshi Rescue Box normally
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B20F, bytearray([0x20, 0x60, 0xDC])) # JSR $05DC60
 | 
			
		||||
 | 
			
		||||
    YOSHI_BOX_SUB_ADDR = 0x02DC60
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x00, bytearray([0x08]))                   # PHP
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x01, bytearray([0xAD, 0x26, 0x14]))       # LDA $1426
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x04, bytearray([0xC9, 0x03]))             # CMP #03
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x06, bytearray([0xF0, 0x06]))             # BEQ +0x06
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x08, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x09, bytearray([0xB9, 0xD9, 0xA5]))       # LDA $A5B9, Y
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0C, bytearray([0x80, 0x08]))             # BRA +0x08
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0E, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0F, bytearray([0xDA]))                   # PHX
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x10, bytearray([0xBB]))                   # TYX
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x11, bytearray([0xBF, 0x00, 0xC2, 0x7E])) # LDA $7EC200, X
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x15, bytearray([0xFA]))                   # PLX
 | 
			
		||||
    rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x16, bytearray([0x60]))                   # RTS
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_bowser_damage(rom):
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x1A509, bytearray([0x20, 0x50, 0xBC])) # JSR $03BC50
 | 
			
		||||
 | 
			
		||||
    BOWSER_BALLS_SUB_ADDR = 0x01BC50
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x00, bytearray([0x08]))                   # PHP
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x01, bytearray([0xAD, 0x48, 0x0F]))       # LDA $F48
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x04, bytearray([0xCF, 0xA1, 0xBF, 0x03])) # CMP $03BFA1
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x08, bytearray([0x90, 0x06]))             # BCC +0x06
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0A, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0B, bytearray([0xEE, 0xB8, 0x14]))       # INC $14B8
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0E, bytearray([0x80, 0x01]))             # BRA +0x01
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x10, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x11, bytearray([0x60]))                   # RTS
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_level_shuffle(rom, active_level_dict):
 | 
			
		||||
    rom.write_bytes(0x37600, bytearray([0x00] * 0x800)) # Duplicate Level Table
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2D89C, bytearray([0x00, 0xF6, 0x06])) # Level Load Pointer
 | 
			
		||||
    rom.write_bytes(0x20F46, bytearray([0x00, 0xF6, 0x06])) # Mid Gate Pointer
 | 
			
		||||
    rom.write_bytes(0x20E7B, bytearray([0x00, 0xF6, 0x06])) # Level Name Pointer
 | 
			
		||||
    rom.write_bytes(0x21543, bytearray([0x00, 0xF6, 0x06])) # Also Level Name Pointer?
 | 
			
		||||
    rom.write_bytes(0x20F64, bytearray([0x00, 0xF6, 0x06])) # Level Beaten Pointer
 | 
			
		||||
 | 
			
		||||
    ### Fix Translevel Check
 | 
			
		||||
    rom.write_bytes(0x2D8AE, bytearray([0x20, 0x00, 0xDD]))       # JSR $DD00
 | 
			
		||||
    rom.write_bytes(0x2D8B1, bytearray([0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA])) # NOP NOP NOP NOP NOP
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2D7CB, bytearray([0x20, 0x00, 0xDD]))       # JSR $DD00
 | 
			
		||||
    rom.write_bytes(0x2D7CE, bytearray([0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA])) # NOP NOP NOP NOP NOP
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2DD00, bytearray([0xDA]))             # PHX
 | 
			
		||||
    rom.write_bytes(0x2DD01, bytearray([0x08]))             # PHP
 | 
			
		||||
    rom.write_bytes(0x2DD02, bytearray([0xE2, 0x30]))       # SEP #30
 | 
			
		||||
    rom.write_bytes(0x2DD04, bytearray([0xAE, 0xBF, 0x13])) # LDX $13BF
 | 
			
		||||
    rom.write_bytes(0x2DD07, bytearray([0xE0, 0x25]))       # CPX #25
 | 
			
		||||
    rom.write_bytes(0x2DD09, bytearray([0x90, 0x04]))       # BCC $DD0F
 | 
			
		||||
    rom.write_bytes(0x2DD0B, bytearray([0xA2, 0x01]))       # LDX #01
 | 
			
		||||
    rom.write_bytes(0x2DD0D, bytearray([0x80, 0x02]))       # BRA $DD11
 | 
			
		||||
    rom.write_bytes(0x2DD0F, bytearray([0xA2, 0x00]))       # LDX #00
 | 
			
		||||
    rom.write_bytes(0x2DD11, bytearray([0x86, 0x0F]))       # STX $0F
 | 
			
		||||
    rom.write_bytes(0x2DD13, bytearray([0x28]))             # PLP
 | 
			
		||||
    rom.write_bytes(0x2DD14, bytearray([0xFA]))             # PLX
 | 
			
		||||
    rom.write_bytes(0x2DD15, bytearray([0x60]))             # RTS
 | 
			
		||||
    ### End Fix Translevel Check
 | 
			
		||||
 | 
			
		||||
    ### Fix Snake Blocks
 | 
			
		||||
    rom.write_bytes(0x192FB, bytearray([0x20, 0x1D, 0xBC])) # JSR $03BC1D
 | 
			
		||||
 | 
			
		||||
    SNAKE_BLOCKS_SUB_ADDR = 0x01BC1D
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x00, bytearray([0x08]))                   # PHP
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x01, bytearray([0xAD, 0xBF, 0x13]))       # LDA $13BF
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x04, bytearray([0xC9, 0x20]))             # CMP #20
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x06, bytearray([0xF0, 0x05]))             # BEQ +0x05
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x08, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x09, bytearray([0xA9, 0x01]))             # LDA #01
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0B, bytearray([0x80, 0x03]))             # BRA +0x03
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0D, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0E, bytearray([0xA9, 0x00]))             # LDA #00
 | 
			
		||||
    rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x10, bytearray([0x60]))                   # RTS
 | 
			
		||||
    ### End Fix Snake Blocks
 | 
			
		||||
 | 
			
		||||
    for level_id, level_data in level_info_dict.items():
 | 
			
		||||
        if level_id not in active_level_dict.keys():
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        tile_id = active_level_dict[level_id]
 | 
			
		||||
        tile_data = level_info_dict[tile_id]
 | 
			
		||||
 | 
			
		||||
        if level_id > 0x80:
 | 
			
		||||
            level_id = level_id - 0x50
 | 
			
		||||
 | 
			
		||||
        rom.write_byte(tile_data.levelIDAddress, level_id)
 | 
			
		||||
        rom.write_byte(0x2D608 + level_id, tile_data.eventIDValue)
 | 
			
		||||
 | 
			
		||||
    for level_id, tile_id in active_level_dict.items():
 | 
			
		||||
        rom.write_byte(0x37F70 + level_id, tile_id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_collected_paths(rom):
 | 
			
		||||
    rom.write_bytes(0x1F5B, bytearray([0x22, 0x30, 0xBC, 0x03])) # JSL $03BC30
 | 
			
		||||
    rom.write_bytes(0x1F5F, bytearray([0xEA] * 0x02))
 | 
			
		||||
 | 
			
		||||
    COLLECTED_PATHS_SUB_ADDR = 0x01BC30
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x00, bytearray([0x08]))                   # PHP
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x01, bytearray([0xAD, 0x00, 0x01]))       # LDA $0100
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x04, bytearray([0xC9, 0x0B]))             # CMP #0B
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x06, bytearray([0xD0, 0x04]))             # BNE +0x04
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x08, bytearray([0x22, 0xAD, 0xDA, 0x04])) # JSL $04DAAD
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x0C, bytearray([0x28]))                   # PLP
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x0D, bytearray([0xEE, 0x00, 0x01]))       # INC $0100
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x10, bytearray([0xAD, 0xAF, 0x0D]))       # LDA $0DAF
 | 
			
		||||
    rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x13, bytearray([0x6B]))                   # RTL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_music_shuffle(rom, world, player):
 | 
			
		||||
    from .Aesthetics import generate_shuffled_level_music, generate_shuffled_ow_music, level_music_address_data, ow_music_address_data
 | 
			
		||||
 | 
			
		||||
    shuffled_level_music = generate_shuffled_level_music(world, player)
 | 
			
		||||
    for i in range(len(shuffled_level_music)):
 | 
			
		||||
        rom.write_byte(level_music_address_data[i], shuffled_level_music[i])
 | 
			
		||||
 | 
			
		||||
    shuffled_ow_music = generate_shuffled_ow_music(world, player)
 | 
			
		||||
    for i in range(len(shuffled_ow_music)):
 | 
			
		||||
        for addr in ow_music_address_data[i]:
 | 
			
		||||
            rom.write_byte(addr, shuffled_ow_music[i])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_mario_palette(rom, world, player):
 | 
			
		||||
    from .Aesthetics import mario_palettes, fire_mario_palettes, ow_mario_palettes
 | 
			
		||||
 | 
			
		||||
    chosen_palette = world.mario_palette[player].value
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x32C8, bytes(mario_palettes[chosen_palette]))
 | 
			
		||||
    rom.write_bytes(0x32F0, bytes(fire_mario_palettes[chosen_palette]))
 | 
			
		||||
    rom.write_bytes(0x359C, bytes(ow_mario_palettes[chosen_palette]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def handle_swap_donut_gh_exits(rom):
 | 
			
		||||
    rom.write_bytes(0x2567C, bytes([0xC0]))
 | 
			
		||||
    rom.write_bytes(0x25873, bytes([0xA9]))
 | 
			
		||||
    rom.write_bytes(0x25875, bytes([0x85]))
 | 
			
		||||
    rom.write_bytes(0x25954, bytes([0x92]))
 | 
			
		||||
    rom.write_bytes(0x25956, bytes([0x0A]))
 | 
			
		||||
    rom.write_bytes(0x25E31, bytes([0x00, 0x00, 0xD8, 0x04, 0x24, 0x00, 0x98, 0x04, 0x48, 0x00, 0xD8, 0x03, 0x6C, 0x00, 0x56, 0x03,
 | 
			
		||||
                                    0x90, 0x00, 0x56, 0x03, 0xB4, 0x00, 0x56, 0x03, 0x10, 0x05, 0x18, 0x05, 0x28, 0x09, 0x24, 0x05,
 | 
			
		||||
                                    0x38, 0x0B, 0x14, 0x07, 0xEC, 0x09, 0x12, 0x05, 0xF0, 0x09, 0xD2, 0x04, 0xF4, 0x09, 0x92, 0x04]))
 | 
			
		||||
    rom.write_bytes(0x26371, bytes([0x32]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def patch_rom(world, rom, player, active_level_dict):
 | 
			
		||||
    local_random = world.slot_seeds[player]
 | 
			
		||||
 | 
			
		||||
    goal_text = generate_goal_text(world, player)
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2A6E2, goal_text)
 | 
			
		||||
    rom.write_byte(0x2B1D8, 0x80)
 | 
			
		||||
 | 
			
		||||
    intro_text = generate_text_box("Bowser has stolen all of Mario's abilities. Can you help Mario travel across Dinosaur land to get them back and save the Princess from him?")
 | 
			
		||||
    rom.write_bytes(0x2A5D9, intro_text)
 | 
			
		||||
 | 
			
		||||
    # Force all 8 Bowser's Castle Rooms
 | 
			
		||||
    rom.write_byte(0x3A680, 0xD4)
 | 
			
		||||
    rom.write_byte(0x3A684, 0xD4)
 | 
			
		||||
    rom.write_byte(0x3A688, 0xD4)
 | 
			
		||||
    rom.write_byte(0x3A68C, 0xD4)
 | 
			
		||||
    rom.write_byte(0x3A705, 0xD3)
 | 
			
		||||
    rom.write_byte(0x3A763, 0xD2)
 | 
			
		||||
    rom.write_byte(0x3A800, 0xD1)
 | 
			
		||||
    rom.write_byte(0x3A83D, 0xCF)
 | 
			
		||||
    rom.write_byte(0x3A932, 0xCE)
 | 
			
		||||
    rom.write_byte(0x3A9E1, 0xCD)
 | 
			
		||||
    rom.write_byte(0x3AA75, 0xCC)
 | 
			
		||||
 | 
			
		||||
    # Prevent Title Screen Deaths
 | 
			
		||||
    rom.write_byte(0x1C6A, 0x80)
 | 
			
		||||
 | 
			
		||||
    # Title Screen Text
 | 
			
		||||
    player_name_bytes = bytearray()
 | 
			
		||||
    player_name = world.get_player_name(player)
 | 
			
		||||
    for i in range(16):
 | 
			
		||||
        char = " "
 | 
			
		||||
        if i < len(player_name):
 | 
			
		||||
            char = world.get_player_name(player)[i]
 | 
			
		||||
        upper_char = char.upper()
 | 
			
		||||
        if upper_char not in title_text_mapping:
 | 
			
		||||
            for byte in title_text_mapping["."]:
 | 
			
		||||
                player_name_bytes.append(byte)
 | 
			
		||||
        else:
 | 
			
		||||
            for byte in title_text_mapping[upper_char]:
 | 
			
		||||
                player_name_bytes.append(byte)
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B7F1, player_name_bytes) # MARIO A
 | 
			
		||||
    rom.write_bytes(0x2B726, player_name_bytes) # MARIO A
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B815, bytearray([0xFC, 0x38] * 0x10)) # MARIO B
 | 
			
		||||
    rom.write_bytes(0x2B74A, bytearray([0xFC, 0x38] * 0x10)) # MARIO B
 | 
			
		||||
    rom.write_bytes(0x2B839, bytearray([0x71, 0x31, 0x74, 0x31, 0x2D, 0x31, 0x84, 0x30,
 | 
			
		||||
                                        0x82, 0x30, 0x6F, 0x31, 0x73, 0x31, 0x70, 0x31,
 | 
			
		||||
                                        0x71, 0x31, 0x75, 0x31, 0x83, 0x30, 0xFC, 0x38,
 | 
			
		||||
                                        0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # MARIO C
 | 
			
		||||
    rom.write_bytes(0x2B76E, bytearray([0xFC, 0x38] * 0x10)) # MARIO C
 | 
			
		||||
    rom.write_bytes(0x2B79E, bytearray([0xFC, 0x38] * 0x05)) # EMPTY
 | 
			
		||||
    rom.write_bytes(0x2B7AE, bytearray([0xFC, 0x38] * 0x05)) # EMPTY
 | 
			
		||||
    rom.write_bytes(0x2B8A8, bytearray([0xFC, 0x38] * 0x0D)) # 2 PLAYER GAME
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B85D, bytearray([0xFC, 0x38] * 0x0A)) # ERASE
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B88E, bytearray([0x2C, 0x31, 0x73, 0x31, 0x75, 0x31, 0x82, 0x30, 0x30, 0x31, 0xFC, 0x38, 0x31, 0x31, 0x73, 0x31,
 | 
			
		||||
                                        0x73, 0x31, 0x7C, 0x30, 0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # 1 Player Game
 | 
			
		||||
 | 
			
		||||
    rom.write_bytes(0x2B6D7, bytearray([0xFC, 0x38, 0xFC, 0x38, 0x16, 0x38, 0x18, 0x38, 0x0D, 0x38, 0xFC, 0x38, 0x0B, 0x38, 0x22, 0x38,
 | 
			
		||||
                                        0xFC, 0x38, 0x19, 0x38, 0x18, 0x38, 0x1B, 0x38, 0x22, 0x38, 0x10, 0x38, 0x18, 0x38, 0x17, 0x38,
 | 
			
		||||
                                        0x0E, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # Mod by PoryGone
 | 
			
		||||
 | 
			
		||||
    # Title Options
 | 
			
		||||
    rom.write_bytes(0x1E6A, bytearray([0x01]))
 | 
			
		||||
    rom.write_bytes(0x1E6C, bytearray([0x01]))
 | 
			
		||||
    rom.write_bytes(0x1E6E, bytearray([0x01]))
 | 
			
		||||
 | 
			
		||||
    # Always allow Start+Select
 | 
			
		||||
    rom.write_bytes(0x2267, bytearray([0xEA, 0xEA]))
 | 
			
		||||
 | 
			
		||||
    # Always bring up save prompt on beating a level
 | 
			
		||||
    if world.autosave[player]:
 | 
			
		||||
        rom.write_bytes(0x20F93, bytearray([0x00]))
 | 
			
		||||
 | 
			
		||||
    # Starting Life Count
 | 
			
		||||
    rom.write_bytes(0x1E25, bytearray([world.starting_life_count[player].value - 1]))
 | 
			
		||||
 | 
			
		||||
    # Repurpose Bonus Stars counter for Boss Token or Yoshi Eggs
 | 
			
		||||
    rom.write_bytes(0x3F1AA, bytearray([0x00] * 0x20))
 | 
			
		||||
    rom.write_bytes(0x20F9F, bytearray([0xEA] * 0x3B))
 | 
			
		||||
 | 
			
		||||
    # Prevent Switch Palaces setting the Switch Palace flags
 | 
			
		||||
    rom.write_bytes(0x6EC9A, bytearray([0xEA, 0xEA]))
 | 
			
		||||
    rom.write_bytes(0x6EB1, bytearray([0xEA, 0xEA]))
 | 
			
		||||
    rom.write_bytes(0x6EB4, bytearray([0xEA, 0xEA, 0xEA]))
 | 
			
		||||
 | 
			
		||||
    handle_ability_code(rom)
 | 
			
		||||
 | 
			
		||||
    handle_yoshi_box(rom)
 | 
			
		||||
    handle_bowser_damage(rom)
 | 
			
		||||
 | 
			
		||||
    handle_collected_paths(rom)
 | 
			
		||||
 | 
			
		||||
    # Handle Level Shuffle
 | 
			
		||||
    handle_level_shuffle(rom, active_level_dict)
 | 
			
		||||
 | 
			
		||||
    # Handle Music Shuffle
 | 
			
		||||
    if world.music_shuffle[player] != "none":
 | 
			
		||||
        handle_music_shuffle(rom, world, player)
 | 
			
		||||
 | 
			
		||||
    generate_shuffled_header_data(rom, world, player)
 | 
			
		||||
 | 
			
		||||
    if world.swap_donut_gh_exits[player]:
 | 
			
		||||
        handle_swap_donut_gh_exits(rom)
 | 
			
		||||
 | 
			
		||||
    handle_mario_palette(rom, world, player)
 | 
			
		||||
 | 
			
		||||
    # Store all relevant option results in ROM
 | 
			
		||||
    rom.write_byte(0x01BFA0, world.goal[player].value)
 | 
			
		||||
    rom.write_byte(0x01BFA1, world.bosses_required[player].value)
 | 
			
		||||
    required_yoshi_eggs = max(math.floor(
 | 
			
		||||
        world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
 | 
			
		||||
    rom.write_byte(0x01BFA2, required_yoshi_eggs)
 | 
			
		||||
    #rom.write_byte(0x01BFA3, world.display_sent_item_popups[player].value)
 | 
			
		||||
    rom.write_byte(0x01BFA4, world.display_received_item_popups[player].value)
 | 
			
		||||
    rom.write_byte(0x01BFA5, world.death_link[player].value)
 | 
			
		||||
    rom.write_byte(0x01BFA6, world.dragon_coin_checks[player].value)
 | 
			
		||||
    rom.write_byte(0x01BFA7, world.swap_donut_gh_exits[player].value)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    from Main import __version__
 | 
			
		||||
    rom.name = bytearray(f'SMW{__version__.replace(".", "")[0:3]}_{player}_{world.seed:11}\0', 'utf8')[:21]
 | 
			
		||||
    rom.name.extend([0] * (21 - len(rom.name)))
 | 
			
		||||
    rom.write_bytes(0x7FC0, rom.name)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_base_rom_bytes(file_name: str = "") -> bytes:
 | 
			
		||||
    base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None)
 | 
			
		||||
    if not base_rom_bytes:
 | 
			
		||||
        file_name = get_base_rom_path(file_name)
 | 
			
		||||
        base_rom_bytes = bytes(read_rom(open(file_name, "rb")))
 | 
			
		||||
 | 
			
		||||
        basemd5 = hashlib.md5()
 | 
			
		||||
        basemd5.update(base_rom_bytes)
 | 
			
		||||
        if USHASH != basemd5.hexdigest():
 | 
			
		||||
            raise Exception('Supplied Base Rom does not match known MD5 for US(1.0) release. '
 | 
			
		||||
                            'Get the correct game and version, then dump it')
 | 
			
		||||
        get_base_rom_bytes.base_rom_bytes = base_rom_bytes
 | 
			
		||||
    return base_rom_bytes
 | 
			
		||||
 | 
			
		||||
def get_base_rom_path(file_name: str = "") -> str:
 | 
			
		||||
    options = Utils.get_options()
 | 
			
		||||
    if not file_name:
 | 
			
		||||
        file_name = options["smw_options"]["rom_file"]
 | 
			
		||||
    if not os.path.exists(file_name):
 | 
			
		||||
        file_name = Utils.local_path(file_name)
 | 
			
		||||
    return file_name
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
import math
 | 
			
		||||
 | 
			
		||||
from BaseClasses import MultiWorld
 | 
			
		||||
from .Names import LocationName, ItemName
 | 
			
		||||
from ..AutoWorld import LogicMixin
 | 
			
		||||
from ..generic.Rules import add_rule, set_rule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def set_rules(world: MultiWorld, player: int):
 | 
			
		||||
 | 
			
		||||
    if world.goal[player] == "yoshi_egg_hunt":
 | 
			
		||||
        required_yoshi_eggs = max(math.floor(
 | 
			
		||||
                world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
 | 
			
		||||
 | 
			
		||||
        add_rule(world.get_location(LocationName.yoshis_house, player),
 | 
			
		||||
                 lambda state: state.has(ItemName.yoshi_egg, player, required_yoshi_eggs))
 | 
			
		||||
    else:
 | 
			
		||||
        add_rule(world.get_location(LocationName.bowser, player), lambda state: state.has(ItemName.mario_carry, player))
 | 
			
		||||
 | 
			
		||||
    world.completion_condition[player] = lambda state: state.has(ItemName.victory, player)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,253 @@
 | 
			
		|||
import os
 | 
			
		||||
import typing
 | 
			
		||||
import math
 | 
			
		||||
import threading
 | 
			
		||||
 | 
			
		||||
from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification
 | 
			
		||||
from .Items import SMWItem, ItemData, item_table
 | 
			
		||||
from .Locations import SMWLocation, all_locations, setup_locations
 | 
			
		||||
from .Options import smw_options
 | 
			
		||||
from .Regions import create_regions, connect_regions
 | 
			
		||||
from .Levels import full_level_list, generate_level_list, location_id_to_level_id
 | 
			
		||||
from .Rules import set_rules
 | 
			
		||||
from ..generic.Rules import add_rule
 | 
			
		||||
from .Names import ItemName, LocationName
 | 
			
		||||
from ..AutoWorld import WebWorld, World
 | 
			
		||||
from .Rom import LocalRom, patch_rom, get_base_rom_path, SMWDeltaPatch
 | 
			
		||||
import Patch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWWeb(WebWorld):
 | 
			
		||||
    theme = "grass"
 | 
			
		||||
 | 
			
		||||
    setup_en = Tutorial(
 | 
			
		||||
        "Multiworld Setup Guide",
 | 
			
		||||
        "A guide to setting up the Super Mario World randomizer connected to an Archipelago Multiworld.",
 | 
			
		||||
        "English",
 | 
			
		||||
        "setup_en.md",
 | 
			
		||||
        "setup/en",
 | 
			
		||||
        ["PoryGone"]
 | 
			
		||||
    )
 | 
			
		||||
    
 | 
			
		||||
    tutorials = [setup_en]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SMWWorld(World):
 | 
			
		||||
    """
 | 
			
		||||
    Super Mario World is an action platforming game.
 | 
			
		||||
    The Princess has been kidnapped by Bowser again, but Mario has somehow
 | 
			
		||||
    lost all of his abilities. Can he get them back in time to save the Princess?
 | 
			
		||||
    """
 | 
			
		||||
    game: str = "Super Mario World"
 | 
			
		||||
    option_definitions = smw_options
 | 
			
		||||
    topology_present = False
 | 
			
		||||
    data_version = 1
 | 
			
		||||
    required_client_version = (0, 3, 5)
 | 
			
		||||
 | 
			
		||||
    item_name_to_id = {name: data.code for name, data in item_table.items()}
 | 
			
		||||
    location_name_to_id = all_locations
 | 
			
		||||
 | 
			
		||||
    active_level_dict: typing.Dict[int,int]
 | 
			
		||||
    web = SMWWeb()
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, world: MultiWorld, player: int):
 | 
			
		||||
        self.rom_name_available_event = threading.Event()
 | 
			
		||||
        super().__init__(world, player)
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def stage_assert_generate(cls, world):
 | 
			
		||||
        rom_file = get_base_rom_path()
 | 
			
		||||
        if not os.path.exists(rom_file):
 | 
			
		||||
            raise FileNotFoundError(rom_file)
 | 
			
		||||
 | 
			
		||||
    def _get_slot_data(self):
 | 
			
		||||
        return {
 | 
			
		||||
            #"death_link": self.world.death_link[self.player].value,
 | 
			
		||||
            "active_levels": self.active_level_dict,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def _create_items(self, name: str):
 | 
			
		||||
        data = item_table[name]
 | 
			
		||||
        return [self.create_item(name)] * data.quantity
 | 
			
		||||
 | 
			
		||||
    def fill_slot_data(self) -> dict:
 | 
			
		||||
        slot_data = self._get_slot_data()
 | 
			
		||||
        for option_name in smw_options:
 | 
			
		||||
            option = getattr(self.world, option_name)[self.player]
 | 
			
		||||
            slot_data[option_name] = option.value
 | 
			
		||||
 | 
			
		||||
        return slot_data
 | 
			
		||||
 | 
			
		||||
    def generate_basic(self):
 | 
			
		||||
        itempool: typing.List[SMWItem] = []
 | 
			
		||||
 | 
			
		||||
        self.active_level_dict = dict(zip(generate_level_list(self.world, self.player), full_level_list))
 | 
			
		||||
        self.topology_present = self.world.level_shuffle[self.player]
 | 
			
		||||
 | 
			
		||||
        connect_regions(self.world, self.player, self.active_level_dict)
 | 
			
		||||
        
 | 
			
		||||
        # Add Boss Token amount requirements for Worlds
 | 
			
		||||
        add_rule(self.world.get_region(LocationName.donut_plains_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 1))
 | 
			
		||||
        add_rule(self.world.get_region(LocationName.vanilla_dome_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 2))
 | 
			
		||||
        add_rule(self.world.get_region(LocationName.forest_of_illusion_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 4))
 | 
			
		||||
        add_rule(self.world.get_region(LocationName.chocolate_island_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 5))
 | 
			
		||||
        add_rule(self.world.get_region(LocationName.valley_of_bowser_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 6))
 | 
			
		||||
 | 
			
		||||
        total_required_locations = 96
 | 
			
		||||
        if self.world.dragon_coin_checks[self.player]:
 | 
			
		||||
            total_required_locations += 49
 | 
			
		||||
 | 
			
		||||
        itempool += [self.create_item(ItemName.mario_run)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.mario_carry)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.mario_swim)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.mario_spin_jump)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.mario_climb)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.yoshi_activate)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.p_switch)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.p_balloon)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.super_star_active)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.progressive_powerup)] * 3
 | 
			
		||||
        itempool += [self.create_item(ItemName.yellow_switch_palace)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.green_switch_palace)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.red_switch_palace)]
 | 
			
		||||
        itempool += [self.create_item(ItemName.blue_switch_palace)]
 | 
			
		||||
        
 | 
			
		||||
        if self.world.goal[self.player] == "yoshi_egg_hunt":
 | 
			
		||||
            itempool += [self.create_item(ItemName.yoshi_egg)] * self.world.number_of_yoshi_eggs[self.player]
 | 
			
		||||
            self.world.get_location(LocationName.yoshis_house, self.player).place_locked_item(self.create_item(ItemName.victory))
 | 
			
		||||
        else:
 | 
			
		||||
            self.world.get_location(LocationName.bowser, self.player).place_locked_item(self.create_item(ItemName.victory))
 | 
			
		||||
 | 
			
		||||
        junk_count = total_required_locations - len(itempool)
 | 
			
		||||
        trap_weights = []
 | 
			
		||||
        trap_weights += ([ItemName.ice_trap] * self.world.ice_trap_weight[self.player].value)
 | 
			
		||||
        trap_weights += ([ItemName.stun_trap] * self.world.stun_trap_weight[self.player].value)
 | 
			
		||||
        trap_weights += ([ItemName.literature_trap] * self.world.literature_trap_weight[self.player].value)
 | 
			
		||||
        trap_count = 0 if (len(trap_weights) == 0) else math.ceil(junk_count * (self.world.trap_fill_percentage[self.player].value / 100.0))
 | 
			
		||||
        junk_count -= trap_count
 | 
			
		||||
 | 
			
		||||
        trap_pool = []
 | 
			
		||||
        for i in range(trap_count):
 | 
			
		||||
            trap_item = self.world.random.choice(trap_weights)
 | 
			
		||||
            trap_pool += [self.create_item(trap_item)]
 | 
			
		||||
 | 
			
		||||
        itempool += trap_pool
 | 
			
		||||
 | 
			
		||||
        itempool += [self.create_item(ItemName.one_up_mushroom)] * junk_count
 | 
			
		||||
 | 
			
		||||
        boss_location_names = [LocationName.yoshis_island_koopaling, LocationName.donut_plains_koopaling, LocationName.vanilla_dome_koopaling,
 | 
			
		||||
                               LocationName.twin_bridges_koopaling, LocationName.forest_koopaling, LocationName.chocolate_koopaling,
 | 
			
		||||
                               LocationName.valley_koopaling, LocationName.vanilla_reznor, LocationName.forest_reznor, LocationName.chocolate_reznor, LocationName.valley_reznor]
 | 
			
		||||
 | 
			
		||||
        for location_name in boss_location_names:
 | 
			
		||||
            self.world.get_location(location_name, self.player).place_locked_item(self.create_item(ItemName.koopaling))
 | 
			
		||||
 | 
			
		||||
        self.world.itempool += itempool
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def generate_output(self, output_directory: str):
 | 
			
		||||
        try:
 | 
			
		||||
            world = self.world
 | 
			
		||||
            player = self.player
 | 
			
		||||
 | 
			
		||||
            rom = LocalRom(get_base_rom_path())
 | 
			
		||||
            patch_rom(self.world, rom, self.player, self.active_level_dict)
 | 
			
		||||
 | 
			
		||||
            outfilepname = f'_P{player}'
 | 
			
		||||
            outfilepname += f"_{world.player_name[player].replace(' ', '_')}" \
 | 
			
		||||
                if world.player_name[player] != 'Player%d' % player else ''
 | 
			
		||||
 | 
			
		||||
            rompath = os.path.join(output_directory, f'AP_{world.seed_name}{outfilepname}.sfc')
 | 
			
		||||
            rom.write_to_file(rompath)
 | 
			
		||||
            self.rom_name = rom.name
 | 
			
		||||
 | 
			
		||||
            patch = SMWDeltaPatch(os.path.splitext(rompath)[0]+SMWDeltaPatch.patch_file_ending, player=player,
 | 
			
		||||
                                  player_name=world.player_name[player], patched_path=rompath)
 | 
			
		||||
            patch.write()
 | 
			
		||||
        except:
 | 
			
		||||
            raise
 | 
			
		||||
        finally:
 | 
			
		||||
            if os.path.exists(rompath):
 | 
			
		||||
                os.unlink(rompath)
 | 
			
		||||
            self.rom_name_available_event.set() # make sure threading continues and errors are collected
 | 
			
		||||
 | 
			
		||||
    def modify_multidata(self, multidata: dict):
 | 
			
		||||
        import base64
 | 
			
		||||
        # wait for self.rom_name to be available.
 | 
			
		||||
        self.rom_name_available_event.wait()
 | 
			
		||||
        rom_name = getattr(self, "rom_name", None)
 | 
			
		||||
        # we skip in case of error, so that the original error in the output thread is the one that gets raised
 | 
			
		||||
        if rom_name:
 | 
			
		||||
            new_name = base64.b64encode(bytes(self.rom_name)).decode()
 | 
			
		||||
            multidata["connect_names"][new_name] = multidata["connect_names"][self.world.player_name[self.player]]
 | 
			
		||||
 | 
			
		||||
    def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]):
 | 
			
		||||
        if self.topology_present:
 | 
			
		||||
            world_names = [
 | 
			
		||||
                LocationName.yoshis_island_region,
 | 
			
		||||
                LocationName.donut_plains_region,
 | 
			
		||||
                LocationName.vanilla_dome_region,
 | 
			
		||||
                LocationName.twin_bridges_region,
 | 
			
		||||
                LocationName.forest_of_illusion_region,
 | 
			
		||||
                LocationName.chocolate_island_region,
 | 
			
		||||
                LocationName.valley_of_bowser_region,
 | 
			
		||||
                LocationName.star_road_region,
 | 
			
		||||
                LocationName.special_zone_region,
 | 
			
		||||
            ]
 | 
			
		||||
            world_cutoffs = [
 | 
			
		||||
                0x07,
 | 
			
		||||
                0x13,
 | 
			
		||||
                0x1F,
 | 
			
		||||
                0x26,
 | 
			
		||||
                0x30,
 | 
			
		||||
                0x39,
 | 
			
		||||
                0x44,
 | 
			
		||||
                0x4F,
 | 
			
		||||
                0x59
 | 
			
		||||
            ]
 | 
			
		||||
            er_hint_data = {}
 | 
			
		||||
            for loc_name, level_data in location_id_to_level_id.items():
 | 
			
		||||
                level_id = level_data[0]
 | 
			
		||||
 | 
			
		||||
                if level_id not in self.active_level_dict:
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                keys_list = list(self.active_level_dict.keys())
 | 
			
		||||
                level_index = keys_list.index(level_id)
 | 
			
		||||
                for i in range(len(world_cutoffs)):
 | 
			
		||||
                    if level_index >= world_cutoffs[i]:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    if self.world.dragon_coin_checks[self.player].value == 0 and "Dragon Coins" in loc_name:
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    location = self.world.get_location(loc_name, self.player)
 | 
			
		||||
                    er_hint_data[location.address] = world_names[i]
 | 
			
		||||
                    break
 | 
			
		||||
 | 
			
		||||
            hint_data[self.player] = er_hint_data
 | 
			
		||||
 | 
			
		||||
    def create_regions(self):
 | 
			
		||||
        location_table = setup_locations(self.world, self.player)
 | 
			
		||||
        create_regions(self.world, self.player, location_table)
 | 
			
		||||
 | 
			
		||||
    def create_item(self, name: str, force_non_progression=False) -> Item:
 | 
			
		||||
        data = item_table[name]
 | 
			
		||||
 | 
			
		||||
        if force_non_progression:
 | 
			
		||||
            classification = ItemClassification.filler
 | 
			
		||||
        elif name == ItemName.yoshi_egg:
 | 
			
		||||
            classification = ItemClassification.progression_skip_balancing
 | 
			
		||||
        elif data.progression:
 | 
			
		||||
            classification = ItemClassification.progression
 | 
			
		||||
        elif data.trap:
 | 
			
		||||
            classification = ItemClassification.trap
 | 
			
		||||
        else:
 | 
			
		||||
            classification = ItemClassification.filler
 | 
			
		||||
 | 
			
		||||
        created_item = SMWItem(name, classification, data.code, self.player)
 | 
			
		||||
 | 
			
		||||
        return created_item
 | 
			
		||||
 | 
			
		||||
    def set_rules(self):
 | 
			
		||||
        set_rules(self.world, self.player)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
# Super Mario World
 | 
			
		||||
 | 
			
		||||
## Where is the settings page?
 | 
			
		||||
 | 
			
		||||
The [player settings page for this game](../player-settings) contains all the options you need to configure and export a config file.
 | 
			
		||||
 | 
			
		||||
## What does randomization do to this game?
 | 
			
		||||
 | 
			
		||||
Mario's basic abilities are removed, and placed into the item pool as items that any player can find. This includes:
 | 
			
		||||
- Carry
 | 
			
		||||
- Climb
 | 
			
		||||
- Run
 | 
			
		||||
- P-Switch
 | 
			
		||||
- Swim
 | 
			
		||||
- Spin Jump
 | 
			
		||||
- Yoshi
 | 
			
		||||
 | 
			
		||||
Additionally, the ability to use powerups (Mushrooms, Fire Flowers, Capes, Stars, and P-Balloons) are shuffled into the item pool, as are the Four Switch Palaces.
 | 
			
		||||
 | 
			
		||||
## What is the goal of Super Mario World when randomized?
 | 
			
		||||
 | 
			
		||||
There are two goals which can be chosen:
 | 
			
		||||
- `Bowser`: Reach Bowser's Castle and defeat Bowser, after defeating a certain number of bosses.
 | 
			
		||||
- `Yoshi Egg Hunt`: Collect a certain number of Yoshi Eggs, then return to Yoshi's House
 | 
			
		||||
 | 
			
		||||
## What items and locations get shuffled?
 | 
			
		||||
 | 
			
		||||
Each unique level exit awards a location check. Optionally, collecting five Dragon Coins in each level can also award a location check.
 | 
			
		||||
Mario's various abilities and powerups as described above are placed into the item pool.
 | 
			
		||||
If the player is playing Yoshi Egg Hunt, a certain number of Yoshi Eggs will be placed into the item pool.
 | 
			
		||||
Any additional items that are needed to fill out the item pool with be 1-Up Mushrooms.
 | 
			
		||||
 | 
			
		||||
## Which items can be in another player's world?
 | 
			
		||||
 | 
			
		||||
Any shuffled item can be in other players' worlds.
 | 
			
		||||
 | 
			
		||||
## What does another world's item look like in Super Mario World
 | 
			
		||||
 | 
			
		||||
Items do not have an appearance in Super Mario World.
 | 
			
		||||
 | 
			
		||||
## When the player receives an item, what happens?
 | 
			
		||||
 | 
			
		||||
The player can choose to receive a text box in-game when they receive an item. Regardless of that choice, items will be queued, and granted when the player next enters a level.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
# Super Mario World Randomizer Setup Guide
 | 
			
		||||
 | 
			
		||||
## Required Software
 | 
			
		||||
 | 
			
		||||
- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Super Mario World Patch Setup`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- Hardware or software capable of loading and playing SNES ROM files
 | 
			
		||||
    - An emulator capable of connecting to SNI such as:
 | 
			
		||||
        - snes9x-rr from: [snes9x rr](https://github.com/gocha/snes9x-rr/releases),
 | 
			
		||||
        - BizHawk from: [BizHawk Website](http://tasvideos.org/BizHawk.html)
 | 
			
		||||
        - RetroArch 1.10.3 or newer from: [RetroArch Website](https://retroarch.com?page=platforms). Or,
 | 
			
		||||
    - An SD2SNES, FXPak Pro ([FXPak Pro Store Page](https://krikzz.com/store/home/54-fxpak-pro.html)), or other
 | 
			
		||||
      compatible hardware
 | 
			
		||||
- Your legally obtained Super Mario World ROM file, probably named `Super Mario World (USA).sfc`
 | 
			
		||||
 | 
			
		||||
## Installation Procedures
 | 
			
		||||
 | 
			
		||||
### Windows Setup
 | 
			
		||||
 | 
			
		||||
1. During the installation of Archipelago, you will have been asked to install the SNI Client. If you did not do this,
 | 
			
		||||
   or you are on an older version, you may run the installer again to install the SNI Client.
 | 
			
		||||
2. During setup, you will be asked to locate your base ROM file. This is your Super Mario World ROM file.
 | 
			
		||||
3. If you are using an emulator, you should assign your Lua capable emulator as your default program for launching ROM
 | 
			
		||||
   files.
 | 
			
		||||
    1. Extract your emulator's folder to your Desktop, or somewhere you will remember.
 | 
			
		||||
    2. Right-click on a ROM file and select **Open with...**
 | 
			
		||||
    3. Check the box next to **Always use this app to open .sfc files**
 | 
			
		||||
    4. Scroll to the bottom of the list and click the grey text **Look for another App on this PC**
 | 
			
		||||
    5. Browse for your emulator's `.exe` file and click **Open**. This file should be located inside the folder you
 | 
			
		||||
       extracted in step one.
 | 
			
		||||
 | 
			
		||||
## Create a Config (.yaml) File
 | 
			
		||||
 | 
			
		||||
### What is a config file and why do I need one?
 | 
			
		||||
 | 
			
		||||
See the guide on setting up a basic YAML at the Archipelago setup
 | 
			
		||||
guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en)
 | 
			
		||||
 | 
			
		||||
### Where do I get a config file?
 | 
			
		||||
 | 
			
		||||
The Player Settings page on the website allows you to configure your personal settings and export a config file from
 | 
			
		||||
them. Player settings page: [Super Mario World Player Settings Page](/games/Super%20Mario%20World/player-settings)
 | 
			
		||||
 | 
			
		||||
### Verifying your config file
 | 
			
		||||
 | 
			
		||||
If you would like to validate your config file to make sure it works, you may do so on the YAML Validator page. YAML
 | 
			
		||||
validator page: [YAML Validation page](/mysterycheck)
 | 
			
		||||
 | 
			
		||||
## Joining a MultiWorld Game
 | 
			
		||||
 | 
			
		||||
### Obtain your patch file and create your ROM
 | 
			
		||||
 | 
			
		||||
When you join a multiworld game, you will be asked to provide your config file to whomever is hosting. Once that is done,
 | 
			
		||||
the host will provide you with either a link to download your patch file, or with a zip file containing everyone's patch
 | 
			
		||||
files. Your patch file should have a `.apsmw` extension.
 | 
			
		||||
 | 
			
		||||
Put your patch file on your desktop or somewhere convenient, and double click it. This should automatically launch the
 | 
			
		||||
client, and will also create your ROM in the same place as your patch file.
 | 
			
		||||
 | 
			
		||||
### Connect to the client
 | 
			
		||||
 | 
			
		||||
#### With an emulator
 | 
			
		||||
 | 
			
		||||
When the client launched automatically, SNI should have also automatically launched in the background. If this is its
 | 
			
		||||
first time launching, you may be prompted to allow it to communicate through the Windows Firewall.
 | 
			
		||||
 | 
			
		||||
##### snes9x-rr
 | 
			
		||||
 | 
			
		||||
1. Load your ROM file if it hasn't already been loaded.
 | 
			
		||||
2. Click on the File menu and hover on **Lua Scripting**
 | 
			
		||||
3. Click on **New Lua Script Window...**
 | 
			
		||||
4. In the new window, click **Browse...**
 | 
			
		||||
5. Select the connector lua file included with your client
 | 
			
		||||
    - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
 | 
			
		||||
      emulator is 64-bit or 32-bit.
 | 
			
		||||
6. If you see an error while loading the script that states `socket.dll missing` or similar, navigate to the folder of
 | 
			
		||||
the lua you are using in your file explorer and copy the `socket.dll` to the base folder of your snes9x install.
 | 
			
		||||
 | 
			
		||||
##### BizHawk
 | 
			
		||||
 | 
			
		||||
1. Ensure you have the BSNES core loaded. You may do this by clicking on the Tools menu in BizHawk and following these
 | 
			
		||||
   menu options:
 | 
			
		||||
   `Config --> Cores --> SNES --> BSNES`
 | 
			
		||||
   Once you have changed the loaded core, you must restart BizHawk.
 | 
			
		||||
2. Load your ROM file if it hasn't already been loaded.
 | 
			
		||||
3. Click on the Tools menu and click on **Lua Console**
 | 
			
		||||
4. Click the button to open a new Lua script.
 | 
			
		||||
5. Select the `Connector.lua` file included with your client
 | 
			
		||||
    - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
 | 
			
		||||
      emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
 | 
			
		||||
 | 
			
		||||
##### RetroArch 1.10.3 or newer
 | 
			
		||||
 | 
			
		||||
You only have to do these steps once. Note, RetroArch 1.9.x will not work as it is older than 1.10.3.
 | 
			
		||||
 | 
			
		||||
1. Enter the RetroArch main menu screen.
 | 
			
		||||
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
 | 
			
		||||
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
 | 
			
		||||
   Network Command Port at 55355.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
 | 
			
		||||
   Performance)".
 | 
			
		||||
 | 
			
		||||
When loading a ROM, be sure to select a **bsnes-mercury** core. These are the only cores that allow external tools to
 | 
			
		||||
read ROM data.
 | 
			
		||||
 | 
			
		||||
#### With hardware
 | 
			
		||||
 | 
			
		||||
This guide assumes you have downloaded the correct firmware for your device. If you have not done so already, please do
 | 
			
		||||
this now. SD2SNES and FXPak Pro users may download the appropriate firmware on the SD2SNES releases page. SD2SNES
 | 
			
		||||
releases page: [SD2SNES Releases Page](https://github.com/RedGuyyyy/sd2snes/releases)
 | 
			
		||||
 | 
			
		||||
Other hardware may find helpful information on the usb2snes platforms
 | 
			
		||||
page: [usb2snes Supported Platforms Page](http://usb2snes.com/#supported-platforms)
 | 
			
		||||
 | 
			
		||||
1. Close your emulator, which may have auto-launched.
 | 
			
		||||
2. Power on your device and load the ROM.
 | 
			
		||||
 | 
			
		||||
### Connect to the Archipelago Server
 | 
			
		||||
 | 
			
		||||
The patch file which launched your client should have automatically connected you to the AP Server. There are a few
 | 
			
		||||
reasons this may not happen however, including if the game is hosted on the website but was generated elsewhere. If the
 | 
			
		||||
client window shows "Server Status: Not Connected", simply ask the host for the address of the server, and copy/paste it
 | 
			
		||||
into the "Server" input field then press enter.
 | 
			
		||||
 | 
			
		||||
The client will attempt to reconnect to the new server address, and should momentarily show "Server Status: Connected".
 | 
			
		||||
 | 
			
		||||
### Play the game
 | 
			
		||||
 | 
			
		||||
When the client shows both SNES Device and Server as connected, you're ready to begin playing. Congratulations on
 | 
			
		||||
successfully joining a multiworld game!
 | 
			
		||||
 | 
			
		||||
## Hosting a MultiWorld game
 | 
			
		||||
 | 
			
		||||
The recommended way to host a game is to use our hosting service. The process is relatively simple:
 | 
			
		||||
 | 
			
		||||
1. Collect config files from your players.
 | 
			
		||||
2. Create a zip file containing your players' config files.
 | 
			
		||||
3. Upload that zip file to the Generate page above.
 | 
			
		||||
    - Generate page: [WebHost Seed Generation Page](/generate)
 | 
			
		||||
4. Wait a moment while the seed is generated.
 | 
			
		||||
5. When the seed is generated, you will be redirected to a "Seed Info" page.
 | 
			
		||||
6. Click "Create New Room". This will take you to the server page. Provide the link to this page to your players, so
 | 
			
		||||
   they may download their patch files from there.
 | 
			
		||||
7. Note that a link to a MultiWorld Tracker is at the top of the room page. The tracker shows the progress of all
 | 
			
		||||
   players in the game. Any observers may also be given the link to this page.
 | 
			
		||||
8. Once all players have joined, you may begin playing.
 | 
			
		||||
		Loading…
	
		Reference in New Issue