; Script Information =========================================================== ; Name: Bulldozer ; Description: Bulldozer is an Autohotkey recreation the original Bulldozer 1, ; Bulldozer 2, and Bulldozer 3 games originally developed by John ; Hattan (The Code Zone). ; AHK Version: 1.1.23.00+ ; OS Version: Windows 7+ ; Language: English (United States) ; Author: Weston Campbell ; Website: https://autohotkey.com/boards/viewtopic.php?f=6&t=50139 ; ============================================================================== ; Revision History ============================================================= ; Revision 18 (2019-05-09) ; * Added menubar "View" & "Layered Tiles" items to documentation index ; * Drag & drop custom theme image to game window to apply it ; ------------------------------------------------------------------------------ ; Revision 17 (2019-04-29) ; * Restored Backspace hotkey as optional undo key ; * Fixed broken link in documentation for the custom themes external page ; * Hold Ctrl while clicking the "Documentation..." menu item to force load ; external Github documentation webpage ; * Added text notice to right-click for more options on Level Select ; * Block screenshot hotkey when Level Select or About screen is displayed ; * Added level number to screenshot filename ; * Display notification when taking screenshot ; ------------------------------------------------------------------------------ ; Revision 16 (2019-03-28) ; * Added option to toggle tile layering for custom themes using transparency ; * Added hotkey F12 to save screenshot as PNG ; * Added documentation for game ; * INI Validation to ignore invalid settings ; ------------------------------------------------------------------------------ ; Revision 15 (2019-03-01) ; * Fixed background color chooser not saving custom color selections ; * Fixed bugs with MidiSound() function ; * Added sound effects for "Undo Last Move" ; * Fixed tile layering issue for custom themes ; * Added menu icons ; * Changed "Level Select" layout ; * Added "Taskbar Progress" option to enable taskbar progressbar updates ; * Added "Titlebar Progress" option to toggle completion status text in title ; * Added option to teleport with a single click if "Mouse Movement" enabled ; * Mark levels 'Solved' or 'Unsolved' by right clicking in "Level Select" ; * Minor UI Changes ; ------------------------------------------------------------------------------ ; Revision 14 (2018-08-31) ; * Changed hotkey prevention to use window handle instead of title ; * Fixed levels 64 & 127 not applying "missing target" hotfix after restart ; * Changed Titlebar progress to only check for update when moving an object ; * Added MIDI sound effects ; ------------------------------------------------------------------------------ ; Revision 13 (2018-08-28) ; * Added 'Boss Key' hotkey to quickly minimize game window using "Spacebar" ; * Added alternate 'Undo Last Move' hotkey using "Backspace" ; * Added "Page Up" & "Page Down" hotkeys to change levels ; * On-screen level number now indicates level completion status using colors ; * Minor changes to 'Level Select' screen layout ; * Automatically load last played level ; * Show levels from same collection as current level on opening 'Level Select' ; * Added 'Mouse Movement' to control the bulldozer movement with the mouse ; * Fixed level 179 to prevent bulldozer from moving outside of viewable area ; * Improved prevention of unintended tab switching of tab control ; * Fixed tab display issues when toggling menu items while not on game screen ; * Fixed 'Level Select' color status drawing issue ; * Added current level progress in the Titlebar ; ------------------------------------------------------------------------------ ; Revision 12 (2018-08-14) ; * Fixed 'Undo Last Move' not working for map strings containing only digits ; ------------------------------------------------------------------------------ ; Revision 11 (2018-08-07) ; * Fix memory leak from Level Select status coloring function ; ------------------------------------------------------------------------------ ; Revision 10 (2018-08-06) ; * Fixed levels 64 & 127 not showing a target due to bulldozer start location ; * Added level status to the Level Select screen ; ------------------------------------------------------------------------------ ; Revision 9 (2018-07-31) ; * Removed password system ; * Improved methods to prevent accidental tab switching ; * Level Select modified to choose any level without password ; * Changed how on-screen level number is displayed ; * Removed save/load ; ------------------------------------------------------------------------------ ; Revision 8 (2018-07-26) ; * Fixed inadvertently switching tabs using arrow keys ; * Added additional options to the menus ; ------------------------------------------------------------------------------ ; Revision 7 (2018-07-23) ; * Code optimization ; * Background color selection ; * New Fontmap for increased readability of level/password display text ; * Debug Mode ; * Save/Read settings with INI file ; ------------------------------------------------------------------------------ ; Revision 6 (2018-06-18) ; * Added 'Undo Last Move' menu option -- Used only after pushing object ; ------------------------------------------------------------------------------ ; Revision 5 (2018-06-12) ; * Fixed boundary tile being overwritten when pushing boulder into it ; * Added DPI scaling support ; ------------------------------------------------------------------------------ ; Revision 4 (2018-06-11) ; * Added levels from Bulldozer 2 and Bulldozer 3 ; * Resized level area for compatibility with maps from Bulldozer 2/Bulldozer 3 ; * Optimized level drawing to update changed tiles only. ; * Redesigned 'Level Select' and 'About' menu item contents ; ------------------------------------------------------------------------------ ; Revision 3 (2018-06-07) ; * Changed background image update process to prevent flickering ; ------------------------------------------------------------------------------ ; Revision 2 (2018-06-06) ; * Fixed font map displaying incorrect character for numbers 8 and 9 ; ------------------------------------------------------------------------------ ; Revision 1 (2018-06-05) ; * Initial release ; ============================================================================== ; Auto-Execute ================================================================= #SingleInstance, Force ; Allow only one running instance of script #Persistent ; Keep the script permanently running until terminated #NoEnv ; Avoid checking empty variables for environment variables #NoTrayIcon ; Disable the tray icon of the script #KeyHistory, 0 ; Disable history of keystrokes & mouse clicks DetectHiddenWindows, On ; Allow hidden windows to be visible by script SetWorkingDir, % A_ScriptDir ; Set the working directory of the script SetBatchLines, -1 ; Run script at maximum speed SetControlDelay, -1 ; Disable delay to occur after modifying a control SendMode, Input ; The method for sending keystrokes and mouse clicks ListLines, Off ; Disable history of executed script lines CoordMode, Mouse, Client ; Mouse coordinates relative to active window client OnExit("OnUnload") ; Run function when exiting the script SetTimer, MenuItemCheck, 250 ; Toggle menu items SetTimer, EmptyMem, 180000 ; 3 minutes EmptyMem() ; Empty memory return ; End automatic execution ; ============================================================================== ; Functions ==================================================================== OnLoad() { Global ; Assume-global mode Static Init := OnLoad() ; Call function App_Name := "Bulldozer" App_Version := "18" App_Date := "2019-05-09" GuiWidth := 640 ; Gui Width GuiHeight := 512 ; Gui Height GuiBGCol := "FFFFFF" ; Gui Background Color DPI := (A_ScreenDPI / 96) ; Calculate DPI scaling ; Read values from INI file IniRead, TitlebarProgress, Bulldozer.ini, Options, TitlebarProgress, 0 IniRead, TaskbarProgress, Bulldozer.ini, Options, TaskbarProgress, 0 IniRead, BackgroundColor, Bulldozer.ini, Options, BackgroundColor, 808000 ; Olive IniRead, Theme, Bulldozer.ini, Options, Theme, Color IniRead, UnlimitedUndo, Bulldozer.ini, Options, UnlimitedUndo, 0 IniRead, Sound, Bulldozer.ini, Options, Sound, 0 IniRead, LevelNumber, Bulldozer.ini, Options, LevelNumber, 0 ; On-screen level number display IniRead, MouseMovement, Bulldozer.ini, Options, MouseMovement, 0 IniRead, Solved, Bulldozer.ini, Options, Solved, U180 ; Solved level data IniRead, LastLevel, Bulldozer.ini, Options, LastLevel, 1 ; Last played level IniRead, LayeredTiles, Bulldozer.ini, Options, LayeredTiles, 0 ; Layered tiles ; INI validation TitlebarProgress := (RegExMatch(TitlebarProgress, "(0|1)") ? TitlebarProgress : 0) TaskbarProgress := (RegExMatch(TaskbarProgress, "(0|1)") ? TaskbarProgress : 0) BackgroundColor := (RegExMatch(BackgroundColor, "(^[A-Fa-f0-9]{6}$)") ? BackgroundColor : 808000) UnlimitedUndo := (RegExMatch(UnlimitedUndo, "(0|1)") ? UnlimitedUndo : 0) Sound := (RegExMatch(Sound, "(0|1)") ? Sound : 0) LevelNumber := (RegExMatch(LevelNumber, "(0|1)") ? LevelNumber : 0) MouseMovement := (RegExMatch(MouseMovement, "(0|1)") ? MouseMovement : 0) Solved := (RegExMatch(Solved, "[^(S|U|0-9)]") ? U180 : Solved) LastLevel := (RegExMatch(LastLevel, "[0-9]") && (LastLevel >= 1 && LastLevel <= 180) ? LastLevel : 1) LayeredTiles := (RegExMatch(LayeredTiles, "(0|1)") ? LayeredTiles : 0) UserColors := [] ; Initialize variable Loop, 16 { IniRead, UserColor%A_Index%, Bulldozer.ini, Options, UserColor%A_Index%, 000000 UserColors.Push("0x" UserColor%A_Index%) } Solved := StrSplit(RLE_Decode(Solved)) ; Expand run-length encoded string ; Overwrite solved level data if corrupted string If (Solved.Length() <> 180) { IniWrite, U180, Bulldozer.ini, Options, Solved ; Overwrite INI value Solved := StrSplit(RLE_Decode("U180")) ; Expand run-length encoded string } ; Level map data Maps := [] ; Create array Maps[1] := "8888888888888888888888888888888888888888AAAAAAAAAAAAAAAAAAAAA8A8A8888888888A8A8AA8A8A8889998888A8A8AA8A8A8889198888A8A8AA8A8A8889099998A8A8AA8A8A8999202198A8A8AA8A8A8910259998A8A8AA8A8A8999929888A8A8AA8A8A8888919888A8A8AA8A8A8888999888A8A8AA8A8A8888888888A8A8AAAAAAAAAAAAAAAAAAAAA8888888888888888888888888888888888888888" Maps[2] := "88888888888888888888888888888888888888888888888888888888888881900000000000000008819000000000000009088090000000000020090880900200000000000008809000000500000009088090000000000000090880900000000000200908809002000000000009088000000000000000091880000000000000000918888888888888888888888888888888888888888888888888888888888888" Maps[3] := "8888888888888888888888888888888888888888888888888888888888888D0000000000000000D8880000000009000000888D0009999999000000D8880003000009020000888D0009001059020000D8880009900009020000888D0000900009000000D8880000900009000990888D0000999299000901D888000000000000001188888888888888888888888888888888888888888888888888888888888888" Maps[4] := "888888888888888888888888888888888888888888888888888888888888888B88999999998888B88B88889000000988B888888B8990CCCC298888B88B88890000C00988B888888B89020020598888B88B88890200C11988B888888B890000C1198888B88B88890000999988B888888B89000098888888B88B88899999988888B888888888888888888888888888888888888888888888888888888888888888" Maps[5] := "8888888888888888888888888888888888888888A888888888888888888A8A8888999998888888A888A88895009888888A88888A889022989998A88888888890209891988888888888999099919888888888888990000198888888888889000900988888888A888900099998A88888A88889999988888A888A8888888888888888A8A888888888888888888A8888888888888888888888888888888888888888" Maps[6] := "8888888888888888888888888888888888888888AAAAAAAAAAAAAAAAAAAAA88AAAAAAAAAAAAAA88AA88AAA9999999AAAA88AAAAAAA900000999AAAAAAAAAA9929990009AAAAAAAAAA9500200209AAAAAAAAAA9011902099AAAAAAAAAA991190009AAAAAAAAAAAA99999999AAAAAAA88AAAAAAAAAAAAAA88AA88AAAAAAAAAAAAAA88AAAAAAAAAAAAAAAAAAAAA8888888888888888888888888888888888888888" Maps[7] := "8888888888888888888888888888888888888888FAFAF8888888888FAFAFAFAFA8888888888AFAFAFAFAF8899998888FAFAFAFAFA8890599988AFAFAFAFAF8890200988FAFAFAFAFA8999090998AFAFAFAFAF8919090098FAFAFAFAFA8912009098AFAFAFAFAF8910002098FAFAFAFAFA8999999998AFAFAFAFAF8888888888FAFAFAFAFA8888888888AFAFA8888888888888888888888888888888888888888" Maps[8] := "8888888888888888888888888888888888888888888888888888888888888C88888888888888C888888C88888888888888C88C88899999999998C888888C99050900009988C88C88902011112009C888888C90029999020988C88C88900098890099C888888C99999889999888C88C88888888888888C888888C88888888888888C8888888888888888888888888888888888888888888888888888888888888" Maps[9] := "8888888888888888888888888888888888888888888888888888888888888888A8888888888A8888888AF8889999888FA88888AFA8899009888AFA888AFAF8895209888FAFA88FAFA8899209988AFAF88AFAF8899020988FAFA888AFA8891200988AFA88888AF8891131988FA8888888A8899999988A888888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[10] := "88888888888888888888888888888888888888888888888888888888888888E8888889999888E888888888888900988888888E8E88889920988E8E8888888899911098888888E8E8E890211098E8E8E8888888902905988888888E8E88902000988E8E888888889000999888888888E8889999988888E88888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[11] := "8888888888888888888888888888888888888888E888888888888888888EE888889999999888888EE889999000009888888EE889000199909888888EE889090900009988888EE889090202910988888EE889090030090988888EE889019202090988888EE889900009090999888EE888909991050009888EE888900000990009888EE888999999999999888E8888888888888888888888888888888888888888" Maps[12] := "8888888888888888888888888888888888888888F888888888888888888F800999999000999000188009000092000200111880290500000999991118800900999200900999C88029909E902090201C888000909E92000001C8888202909E9020901C888880000099920001C888888129000000009C888888801900000000C8888888F888888888888888888F8888888888888888888888888888888888888888" Maps[13] := "8888888888888888888888888888888888888888888888888888888888888888999998F8F8F8F8F88C889000988F8F8F8F88888892009888F8F8F8888899900299888F8F888888900202098888F888889990C0CC0988899999989000C0CC09999900119890200200000000001198999990CCC0959900119888889000009999999998888899999998888888888888888888888888888888888888888888888888" Maps[14] := "8888888888888888888888888888888888888888E888888888888888888EE899888888888888998EE899888899999998998EE899888990090598998EE899888900090098998EE899888920202098998EE899888902990098998EE899899902090998998EE899891111100988998EE899899999999988998EE899888888888888998EE888888888888888888E8888888888888888888888888888888888888888" Maps[15] := "88888888888888888888888888888888888888888888888888888888888888AAA8888999999998888A888A888900000598888A888A8889029209988888AAA888890200298888888888888992020988888999999999020909998889111100990200200988899111000020020009888911110099999999998889999999988888888888888888888888888888888888888888888888888888888888888888888888" Maps[16] := "8888888888888888888888888888888888888888888899999988999888888E8891100989959988E888E89110099900098E888888911000002209888888889110090C0209888888889119990C0209888888889999020C2009888888888889002C020988888888888902002009888888E88889009900098E888E8888899999999988E8888888888888888888888888888888888888888888888888888888888888" Maps[17] := "8888888888888888888888888888888888888888888888888899999888888B889999999000998B88888990905990220988888B890000200000098B88888900200999000988888B899909999929998B88888902009990119888888B890202020111988B88888900009991119888888B890220989111988B8888890099989999988888888999988888888888888888888888888888888888888888888888888888" Maps[18] := "88888888888888888888888888888888888888888888888888888888888888888888888888888888888A89999999988F888888AF89000050988AF8888AFA89021100998FAF888FAF899911C0098AFA888AFA88899222098FAF8888AF88889000098AF888888A88889999998F88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[19] := "88888888888888888888888888888888888888888888899999999998888888F899190000009999F8888991190200209009888889111909902090098888F911111009220009F8888991111200009209888889999099999990098888F900020000000099F8888900209002902099888889029990209022098888F900059009900009F8888999999999999999888888888888888888888888888888888888888888" Maps[20] := "88888888888888888888888888888888888888888888888888888888888888E888888888888E88888888E899998888888E8888E888900999888E88888888E895000999888E8888E88890C200198E88888888E890202119888E8888E888902019998E88888888E890099988888E8888E888999988888E88888888E888888888888E88888888888888888888888888888888888888888888888888888888888888" Maps[21] := "8888888888888888888888888888888888888888F888888888888888888F8999999999999999999889C1C1C1C1C1C1C1C1988912020202020200009889C0C0C0C0C0C0C0C0988912000002000000029889C0C0C0C0C0C0C0C0988910000000020002009889C0C0C0C0C0C0C0C0988910000000000200059889999999999999999998F888888888888888888F8888888888888888888888888888888888888888" Maps[22] := "8888888888888888888888888888888888888888888899999999988888888EE890000000988A8A888EE8900200029888E888888899990000988A8A88888888890200998888888888999900020988888888889110209909999888888891100299000098888AA891100002000098888AA8919992999095988888889198900000999888888899989999999888888888888888888888888888888888888888888888" Maps[23] := "8888888888888888888888888888888888888888888888888888888888888B8889999999888888B88888890005098888888888B889020C0999988B88888889C02C21119888888B8B890002011198B8B88888890CC0209998888888B88900002098888B88888889990000988888888B8888899999988888B888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[24] := "88888888888888888888888888888888888888889999999999999999998890000000000000000998902C00020CC002000098900002CCC0000C02209891CCC000002020CC00999111C00C00C0000C2009911CC22CCCC0200C00099111C00000020CC009999111200CCC00C00009099911002C00CC000CC50989919000000000000009889999999999999999998888888888888888888888888888888888888888" Maps[25] := "88888888888888888888888888888888888888889999999999988899999990000090009889900009990200900099990020099999022000911900900990020020099119999099902000999111100022099009290001111909020990900902011999290009909000209119000990099000290099990009029990900900005900000098999999999999999999988888888888888888888888888888888888888888" Maps[26] := "88888888888888888888888888888888888888889999999999999999999990009000090009000959902000000200020009099909991199099900000990009111192900299909902091111900200202099000911119090902020990009911990009290009992990000990090092999000200200000900900990009000090009000009999999999999999999998888888888888888888888888888888888888888" Maps[27] := "88888888888888888888888888888888888888888888888888888888888888899999999999988D88888911009000009998888889110090200200988888891100929999009888888911000050990098888889110090900209988888899999909920209888888889020020202098888D8889000090000098888DD88999999999999888888888888888888888888888888888888888888888888888888888888888" Maps[28] := "88888888888888888888888888888888888888889999999999999999999990090099000090005999990000200009029990099929020992902020000990002900002000000999909900020999009111199090290909090911119990000202090091111998992099900209111199889009020000000099988E900000090900009888E899999999999999988E8E8888888888888888888888888888888888888888" Maps[29] := "8888888888888888888888888888888888888888999999999999999999999500000999000900900990909009002002000009999990000090202929099191190000992020000991111100002000900099911111000099929929999191190000200009000999999000009009200209DDDD9009002000020209DDDD9009009009009009DDDD99999999999999998888888888888888888888888888888888888888" Maps[30] := "88888888888888888888888888888888888888889999999999999999999999111000990900009009911110000000002099099111190909299920000991119000090000000909991900920900000299099009009020209990020990000020020900909909990909909229029009099009000202090000009990000900000900900059999999999999999999998888888888888888888888888888888888888888" Maps[31] := "8888888888888888888888888888888888888888C99999999999999C99999000900959099009999990C090020000200C999990C0000CCCCCC0200C9C9000C00C1111C0022009992CC2CC1111C00000099000000C1111CC2CC2999002200C1111C000000990200200C00C00CCC009C999C002000200002009999990900009009000C99999C9999999999999998888888888888888888888888888888888888888" Maps[32] := "88888888888888888888888888888888888888889999999A9999A99C99999000009A9119A9000009902200999119990025099009099111111900200C900000911111190020099999009991199C99C20990002220911900009009C029000200200220920990090099020099009009902000020CC020000209900900990000990090099999C9999999999999998888888888888888888888888888888888888888" Maps[33] := "8888888888888888888888888888888888888888999999999999999999999000090090900900C00990590C09902000200099999909000090090200099000090990C20C909C0990000002000200020009911C9922C9029C20990991191900902000209009911119022000C9209C999111190099999000000991119990000000000009999999999999999999998888888888888888888888888888888888888888" Maps[34] := "88888888888888888888888888888888888888889C9999C9999999C99C99C1111C0000000C00C0099111190C020020000009911110C90029090292099111C000200029002009911C99900C020002200C90000009C9C099C909C9900000000C000C000009909C000900020902020990C900002099020020099000005C00000C000C0C999999C99999C999C9C98888888888888888888888888888888888888888" Maps[35] := "888888888888888888888888888888888888888899999999999999999999911119E9000000000009911119E9990900929099911119E9000920020009911119E9000020092299990099E902900920200999009EE9002002009009950099992999299020099900000000900900200999000999009002009999999999E9009009000009999999999999999999998888888888888888888888888888888888888888" Maps[36] := "8888888888888888888888888888888888888888AFFFFFAFFFFFFAFFFFFAF00000F000005F111AFFF00000F000000AA111AFF0A0A0AA2AA0AA01111FF00020F000222001111FAFA2AFA02200AFA0AA1FF00000200A0000F0FFFAF00200A00AFA00A0A00FAA0A2AA000020022000FF00020AA000A00A0A00FF00000F0000F00F0000FAFFFFFAFFFFAFFAFFFFA8888888888888888888888888888888888888888" Maps[37] := "8888888888888888888888888888888888888888C99999C99C99C999999C9000009009111C50000990900000001111C000099002009000C1111C000990992999909C1111C009902000200900C11190099022090009000C022009C9900222900022002009902009009000090290099000290090000000200990090000900009009009C99C9999C9999C99C99C8888888888888888888888888888888888888888" Maps[38] := "8888888888888888888888888888888888888888999999C999C999999999C500000C000C000000099C09C909C009C99090C990000C0900220000000C9009090C0209020990C990000020C009220C000C9009C900C0000009C0C991191C020C002090000C9119190020C09902200991111C90002200200909911111C900000000C00999999999999999999C998888888888888888888888888888888888888888" Maps[39] := "8888888888888888888888888888888888888888B888999899999999999B88889599919911199009888992001191119000098899000011111190020989900209111119909099890022909999900202098902902000099002200989009009000090200209890002209990929900098902900000020200209989900009000090000998B899999999999999998B8888888888888888888888888888888888888888" Maps[40] := "88888888888888888888888888888888888888889999999999999999999990090000009000900099902902020991112002099002009099111190200990990209911119000209902000091111990200099029900911190000000990002229929900999099909090090009009000099020900200990000000990000900009500000009999999999999999999998888888888888888888888888888888888888888" Maps[41] := "88888888888888888888888888888888888888889999999999999999999990090090900009009009900020000002020000099909009299929900990990002000002009002009909992992900090200099090002020099999902990200220200959191119909000009009091911199099999999990911111990000000000009111119999999999999999999998888888888888888888888888888888888888888" Maps[42] := "88888888888888888888888888888888888888889999999999999999999890090000090099000099902900020900000990099020020091190000020990202009111190009099902900911111199902099000900911119009200990200999911900090009990200099090902002998990200002952029000988990009000000090009888999999999999999998888888888888888888888888888888888888888" Maps[43] := "888888888888888888888888888888888888888899999999999999999AAA90020001111900009999900000011110000000099090999999999900000990920009000000999119900200092299900091199020999020000000911990209000202090099119900900220902099000999599029002002000009A9900000009900000099AA99999999999999999AA8888888888888888888888888888888888888888" Maps[44] := "8888888888888888888888888888888888888888CCCCCCCCCCCCCCCCCCCCC000000009000950900CC022009229090900990CC009020209220900000CC909009009090900900CC000990000000900000CC000902090009000900CC020920900090020911CC920900999900009111CC002000000000091111CC000900900000911111CCCCCCCCCCCCCCCCCCCCC8888888888888888888888888888888888888888" Maps[45] := "88888888888888888888888888888888888888889999999999988899999990000090009889900009990200900099990020099999022000911900900990020020099119999099902000999111100022099009290001111909020990900902011999290009909000209119000990099000290099990009029990900900005900000098999999999999999999988888888888888888888888888888888888888888" Maps[46] := "88888888888888888888888888888888888888889999999999999999999990009000900009000959900020020000090209099929029990900002290990090091999009202009900929111190090999099020091111199000090999200919111192202009900999999119909009099002000000000209990990009000900000000909999999999999999999998888888888888888888888888888888888888888" Maps[47] := "8888888888888888888888888888888888888888DDDDDDDDDDDDDDDDDDDDD090909000959900090DD000000000000020000DD009929099999020909DD900009911111900900DD929929111119992920DD000909911111900909DD002000099119900900DD020900020002002220DD902002909009002000DD000990009009000000DDDDDDDDDDDDDDDDDDDDD8888888888888888888888888888888888888888" Maps[48] := "888888888888888888888888888888888888888888888889999999999988888888890000000009888888888900002020098899999989020CCCCC098890000999990200CC29889000000020200000098890000000000990CC098890000995999990CC098890000999988890CC09989111198888889020009891111988888890000098999999888888999999988888888888888888888888888888888888888888" Maps[49] := "88888888888888888888888888888888888888889999999999999888888890000000000098888888909990220000988888889000902002009888888890029999299999988888902099000000009999989002202000000001119899909902290000011198889099000900000111988890000009000001119888999599999999999998888999988888888888888888888888888888888888888888888888888888" Maps[50] := "88888888888888888888888888888888888888888899999998888888888888900000999999999888889000009000090099888890200090002020098888900200900209900988889022009920200009888899090099099999998888990900990000111988889009200000001119888890002200000011198888900000995900111988889999999999999999888888888888888888888888888888888888888888" Maps[51] := "88888888888888888888888888888888888888889999999999999999999990900000900000000009900000002009909990999999900990002002000999119900909020909009911110020000099290999111100299999000929999119090090009002009F9919090020002009059F9002002090009009999F9000000099999999FFFF999999999FFFFFFFFFF8888888888888888888888888888888888888888" Maps[52] := "88888888888888888888888888888888888888888888888888888888888888A88A88A88A88A88A888888888999998888888888A88999005988888A888888890021099888888888A88900121098888A888888899903209888888888A88889000998888A888888888999998888888888A88A88A88A88A88A8888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[53] := "8888888888888888888888888888888888888888888888888889999888888BBBB99999990598EEE88BBB8900000200988EE88BB889000299029888E88B88899291119098888888888890211100988888888888909101909988888E8888900090920988B88EE88892002000098BB88EEE889009999999BBB88EEEE899998888888888888888888888888888888888888888888888888888888888888888888888" Maps[54] := "88888888888888888888888888888888888888889999999999999999999999990090099999999999999900900911199999999990029009111009999999902092201110099999999002900911101999999990009029999999999999992000000020209999999900900220900099999999999990099225999999999999900000099999999999999999999999998888888888888888888888888888888888888888" Maps[55] := "8888888888888888888888888888888888888888DDDD8888888888888888DEED8889999999988888DEED8889000910988888DDDD8899002111988888888888900209319888888888899099290998888888888900020020988888888889000900009888888888899999995098DDDD8888888888899998DEED8888888888888888DEED8888888888888888DDDD8888888888888888888888888888888888888888" Maps[56] := "888888888888888888888888888888888888888888888888888888888888888E88888888888E8888888E88999999988E8888888E88900C00988E8888888E88902020988E8888888E88901310988E8888888E899C111C988E8888888E89002220988E8888888E89000500988E8888888E89999999988E8888888E88888888888E8888888888888888888888888888888888888888888888888888888888888888" Maps[57] := "8888888888888888888888888888888888888888888888888899998888888899999999900998888889900200000020999998890009909900099111988909220202292991119889090005000900011198890029099922000111988902002200209911119889992000000099999998888900999999988888888B899998888888BBBBB8888888888888888888888888888888888888888888888888888888888888" Maps[58] := "88888888888888888888888888888888888888889999999999999999999E9000059900000090009E9000099000020000209E900999111190909009999000911119090902000999909111900900000009E9009919000002000209E9002020999009090999E9020000000909020009E9990200290909090209EEE90000000009090099EEE9999999999999999E8888888888888888888888888888888888888888" Maps[59] := "8888888888888888888888888888888888888888888888888888888888888C88888888888888C888888C88888888888888C88C88888899999988C888888C88999000098888C88C88899102990998C888888C89112020059888C88C88891102020998C888888C89999990098888C88C88888888999988C888888C88888888888888C8888888888888888888888888888888888888888888888888888888888888" Maps[60] := "88888888888888888888888888888888888888889999AAAAAAAA999999999009999999999000005990290000900000999999900000099990009009AA999990000000009009AA900020000000009009999002999900900090000990C09009119299900C0990C092091190020022099000000911900900090990009009119009000909999999999999999999998888888888888888888888888888888888888888" Maps[61] := "888888888888888888888888888888888888888888888BBBB8888888888888888888889998B8888888888999999198B8888888888910020098B8888888888990CCC29888888888888892CCC0998888888888B8906020198888888888B8919999998888888888B8999888888888888888888888BBBB88888888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[62] := "88888888888888888888800000000000000000088000000000000000000882C09999999999990C0880C09999999999990C0881C09999999999990C0880C09991020999990C0880C09999990999990C0880C09999994099990C0880C09999999099990C0880C09999999099990C1880C09999999099990C0880C09999999299990C28800000000200010000088000000000010000000888888888888888888888" Maps[63] := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA888888888888888888888888888888888888888888899999999999999888888900000000000098888889009999999900988888890090000009009888888900900040090098888889099000000900988888890090000009909888888910200000020198888889999999999999988888888888888888888888BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" Maps[64] := "8888888888888888888888DDDDDDDDDDDDDDDD8888DEEEEEEEEEEEEEED8888DECCCCCCCCCCCCED8888DEC9999999999CED8888DEC9120000219CED8888DEC9090920909CED8888DEC9090910909CED8888DEC9090490909CED8888DEC9090290909CED8888DEC9120000219CED8888DEC9999999999CED8888DECCCCCCCCCCCCED8888DEEEEEEEEEEEEEED8888DDDDDDDDDDDDDDDD8888888888888888888888" Maps[65] := "B888888888888888888BB888888888888888888BB899999999999999998BB890000099790011198BB890002200000011198BB890092000000011198BB899090099000011198BB899090099099999998BB890220099202000098BB890020090020990098BB890200090002020098BB890000090000900998BB890000099999999988BB899999998888888888BB888888888888888888BB888888888888888888B" Maps[66] := "AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB888888888888888888888899999988888888888888900009899998888888889099099900999999988890911100000200009888909919909099000098889001119090200229988890911190922200098888909090909020022988889000000090790009888899999999999999998888888888888888888888AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB" Maps[67] := "FFFFFFFFFFFFFFFFFFFFF888888999999999998FF888888900000000098FF888888900002020098F99999989020CCCCC098F90000999990200CC298F9000000020200000098F9000000000000000098F90000000000990CC098F90000997999990CC098F90000999988890CC099F9111198888889020009F9111198888889000009F9999998888889999999FF888888888888888888FFFFFFFFFFFFFFFFFFFFF" Maps[68] := "D88888888A888888888D8D8888888A88888888D888D89998999999988D88888D91989000009998888888919992CCC0959888888891100002000098888888911002CC000098888888911020CC09999888AAAA9999000209AAAAAA8888888902009988888888889999000098D88888888890020002988D8888888D900000009888D88888D89999999998888D888D8888888A88888888D8D88888888A888888888D" Maps[69] := "CCCCCCCCCCCCCCCCCCCCC888888888888888888CC888888888899998888CC889999999990099988CC889002020000011988CC889000209900011988CC889000209900011988CC889000029900011988CC889000009900011988CC889990999999999988CC888902999599900988CC888900200000020988CC888902099990020988CC88890009AA90000988CC88899999AA99999988CCCCCCCCCCCCCCCCCCCCC" Maps[70] := "EEEEEEEEEEEEEEEEEEEE88888888888BD888EEEE99999999999B8D888EEE90000900009B88D888EE90020900009B888D888E90200900009BB888D88E90020900209BBB888D8E99000200209BBBB888DEE9099900209BBBBBBBBB99020999299999999999902209000000000011199020090000000000111990000900000000001119999499000000000011198899999999999999999988888888888888888888" Maps[71] := "DD8888888888888888DDDD8888888888888888DDDD8888888888999888DD999999999999949998DD911100000900000098DD9111000009000CC098DD9111000009220CC0999D9111000000002022009D9999900000000CC0209DDD889999992CCCC2009DDD888890020020C0009DDD888890000220CCC09DDD88889000000000009DDD88889999999999999DDD8888888888888888DDDD8888888888888888DD" Maps[72] := "99999EEEEE999999999990009EEEEE900000000990C09999999020C0C00990C1100000000CC0020990C1CCCCCCCC00C0020990C1C020000002CCC209900000CCCCC020C000099991CCCC0CC002720009E90111C000C022290099E911110000C00209999EE91CCCC00CCCC00009EEE91100C00000CCCC09EE999900CCCCC0000009EE902002000C00099999EE90000009000099EEEEEE9999999999999EEEEEEE" Maps[73] := "CCCCCCCCCCCCCCCCCCCCC11C0000C0000000000CC1200200C22002CC02CCC12C00CCC00CC0CC000CC00C020C00220002000CC0CCC00C0C00C200CCCCC00CC0C02000C40C000CC020000200CC1CC0020CC00C02C02C0200000CCCC00C00C00C000CCC000CC00CCCCCCCC0C000000CC00000000000C00C1C1CCC2CCCCCCCC2C000111CC00001300C0000CC1C1CC013111300020011111CCCCCCCCCCCCCCCCCCCCC" Maps[74] := "88888888888888888888888888888888888CCCC8999998888888888CBBC8900099999999998CBBC8900090000000098CBBC8902200002020098CBBC8902099099999098CBBC8902099290002298CCCC89002990909990988888890000202099909999998900099000000001111989999990000000011119888888900000000111198888889959999999999988888889998888888888888888888888888888888" Maps[75] := "888888888888888888888888888888888888888888BBBBBBB9999999998888BFFFFFB9009000098888BBBBBBB900220009888899999999002009998888911100990990995998889111009920020000988891110000220220009888911100990200020098889999999909999099988888888889000002098888888888890990000988888888888900009999888888888889999998888888888888888888888888" Maps[76] := "89999999999999888888891111111199998888888911199990900999998889111900999000020988891112200000202009888900190020290200998889111909290002009888891909020002000098888910092999299992988889900900020200009888889009002520090098888890090999902002988888900900009990009888889009022098999998888890090000988888888888999999999888888888" Maps[77] := "88888888888888888888889999999998999999988890099000989000009888900020009890999098889000200099902090988890299000000220009888900990009999000098889909999999999995988890299EE9000011999888900099990000119888889002200000001198888890209999000011988888900098890000119888889999988999999998888888888888888888888888888888888888888888" Maps[78] := "BC8888888888888888CBBC9999999999999999CBBC9000000000911119CBBC9000020000011119CBBC9999909900911119CBBC9000020909990009CBBC9009900009000009CBBC9909002909099999CBBC8909020209090009CBBC8909002009000009CBBC8909299999999099CBBC8902520200002009CBBC8900200009990009CBBC8999900099899999CBBC8888999998888888CBBC8888888888888888CB" Maps[79] := "EEEEEEEEEEEEEEEEEEEEEEEEEEEE99999999999EEEEEEEEE90009000009EE99999EE90000020209EE90009999902990C099EE902099000C09902009EE902006220C09922209EE990CCC000C09900009EE890C000CCC09999929EE990C00000200911119EE900CCC0990209111199E9020002090009112109E9009902090099111109E9999900099999911199EEEEE99999EEEE99999EEEEEEEEEEEEEEEEEEEEE" Maps[80] := "FFFFFFFFFFFFFFFFFFFF8888888888888888888899999999999999999999900000900000091119E99000009005000991119990909099299099011119900020900022200111199992999022009990991990000020090000909999900200900999009090099909299000020022000990002099000900909009900000900009009000099999999999999999999988888888888888888888FFFFFFFFFFFFFFFFFFFF" Maps[81] := "DDD9999999999DDDDDDDD889000000009999888DD889099999909009988DD889090202020020988DD889000000092000988DD889992002290099988DD888890099090299888DD888899290002079888DD888889002020999888DD888889090002009888DD888889099000909888DD888899009999909888DD888890000000009888DD888891111111999888DD888891111111988888DDDDDD999999999DDDDDD" Maps[82] := "99999999EEE999999999999990099999009999999888900025200098888999999202020202999999988990202020209988899999020202020209999998890000000000098889999999999099999999999888888900098888888999999999000999999999988889313131398888899999991313131999999998888931313139888889999999131313199999999888893139313988888999999999999999999999" Maps[83] := "8888888888888888888888888888888888888888999999999999999999999090000090000000000990000000200C9099C09999999009C000200200099911990090C020C090099111100200000992C0999111100299C990009299991190C009000C002009E991C090020002009079E9002002090009009999E9000000099999999DDDE999999999DDDDDDDDDD8888888888888888888888888888888888888888" Maps[84] := "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000CCC11CCC00000CC02200CCC11CCC00260CC00C0CC111111C00200CC00000C111111C00200CCCCC00CCC11CCCCCC20CC0002220C11C0000C00CC02C000200200220C20CC00C00CC0200CC00C00CC02000020CC02000020CC00C00CC0000CC00C00CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" Maps[85] := "889999998999999BBBBB889000098900009BBBBB899099099902009BBBBB890220000022009BBBBB8900209909909099999B8909020200009090009B89020020090990900099890090920009909000098999909009999090990988900202990090000009889020200000909099998990990999009001111989000909990009011119890002290004001111198900090000909991111989999999999998999999" Maps[86] := "DDDDDDDDDDDDDDDDDDDD8888888888888888888899999999999999999999900900009000090090099000290090000000200990200900900009029009999002229000220020099022090009000902200990200020090091119009909929999099111190099002009000911119000990900000001111900509900000900911190000099999999999999999999988888888888888888888DDDDDDDDDDDDDDDDDDDD" Maps[87] := "888888888888888888888888888888888888888899999999999999999999900090091190090009099000000911900900090990909209119002002209909090091192999009099002999900900090000990002000000000900999999990000000009009EE900000099990009009EE9029000090000099999990099999999990000079999988888888999999998888888888888888888888888888888888888888" Maps[88] := "88999988888888888888899009988888888888888902009999999999999989000090111111111119899202901CCCCCCC0C19899000990CCCCCCC0C19897222000000000000198900009909999999900989999902200098889999888902000020988888888889020022099888888888890022009988ABAB8888890000099888BABA8888899000998888ABAB8888889999988888BABA8888888888888888888888" Maps[89] := "89898989898989898989989898989898989898989999999999999989999990099000000009991119900000099999009111199999029900022091111990090200020900919119909902992099229991199000200020002000000990990990290990900009900020900900009099999900020002099090970990090090090900900009999999999999999999998989898989898989898998989898989898989898" Maps[90] := "DDDDDDDDDDDDDDDDDDDD88888888888888888888CCCCCCCCCCCCCCCCCCCCC000000009000900960CC022009229090900990CC009020209220900000CC909009009090900900CC000990000000900000CC000902090009000900CC020920900090020911CC920900999900009111CC002000000000091111CC000900900000911111CCCCCCCCCCCCCCCCCCCCC88888888888888888888DDDDDDDDDDDDDDDDDDDD" Maps[91] := "888888888888888888888DDDD8899998DDDDDDD88DDD88990098DDDDDDD88DD889900098DDDDDDD88D889902209888DDDDD88D899020029998888DD88D8900020000999988888D8900999990900999888D8902111190900009888D8909111102000909888D890911319090200988888909990999900999888899299002709999888888900000209998888DD888900099009888DDDDD888999999999888888888" Maps[92] := "888888888888888888888888888888888888888888889999999999999998888890900009009000999999900200020000200990200200C00C00CCC0099002200C1111C00000099000000C1111CC2CC299992CC2CC1111C00000099000C00C1111C002200990C0000CCCCCC020099990C0900200002009998890009009094990098888999999999999999988888888888888888888888888888888888888888888" Maps[93] := "88888888888888888888BBBBBBBBBBBBBBBBBBBB9999999999999999999B9090090000790000009B900029009999000902999090002091190009900990900902011999290009900929000111190902099020009991111000220990020020099119999099999902200091190090099902009000999900200990000090009BB990000999999999999BBB999999BBBBBBBBBBBBBBBBBBBB88888888888888888888" Maps[94] := "99998888888888888888900999999999999998A8900900011911111198A8900909099999011198A899290000111111119888900099299999900999989020900000999999409899209020009999990098900209222990000000989000000C0000C2C299989099990C2222200009889090000200000C00098890900099000000009998909999992999999020989000000009EEEE9000989999999999EEEE999998" Maps[95] := "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9999999999999999999B9009000090990001119990990200000000011119900002999290909111199090000000900009111990992000009029009199902009990202090090099099090090200200000990900920922909909099990000009020200090099700090090000090000999999999999999999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" Maps[96] := "AAAAAAAAAAAAAAAAAAAA8888888888888888888899999999999999999999911119000000090090099111190C020020000009911110CC00290902C2099111900020002900200991199990090200022009900000099990999909999000000009000900000990CC000900020902020990CC000020CC02002009900000790000090009099999999999999999999988888888888888888888AAAAAAAAAAAAAAAAAAAA" Maps[97] := "888888888888888888888888888888888888888888999999999999999999899190000000000000099911002C00CC000CC6099111200CCC00C00009099111C00000020CC00999911CC22CCCC0200C00099111C00C00C0000C200991CCC000002020CC0099900002CCC0000C022098902C00020CC00200009890000000000000000998999999999999999999888888888888888888888888888888888888888888" Maps[98] := "8888888888888888888888888888888888888888999999999999999999999490009000900009000990900020002000000209900000CCC0CC11CCC09990CCC200C2C1111C00099020200200C1111C020990202090C0C1111C00099000C29000CC11CC0009992C00900CC0000CC299900C009000002002000990000090009000090009999999999999999999998888888888888888888888888888888888888888" Maps[99] := "88888888888888888888DDDDDDDDDDDDDDDDDDDD9999999999999999999B9000009900000090009B9050099000020000209B900999111190909009999000911119090902000999909111900900000009A9009919000002000209A9002020999009090999A9020000000909020009A9990200290909090209AAA90000000009090099AAA9999999999999999EFFFFFFFFFFFFFFFFFFFF88888888888888888888" Maps[100] := "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB999999999999999999999400000900090000000999099909900999909099900009090022000000099009090902090209909990000020900922090009900999009000000990999119190209002090000991191900209099022009911119900022002009099111119900000000900999999999999999999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" Maps[101] := "EEEEEEEEEEEEEEEEEEEE8888888888888888888899999999999999999998900900000090009000999029020209911120020990020090991111902009909902099111190002099020000911119902000990299009111900000009900022299299009990999090900900090090000990209002009900000009900009000096000000099999999999999999999988888888888888888888EEEEEEEEEEEEEEEEEEEE" Maps[102] := "888888888888AAAAAAAA888888888888A8888888999999999999999999999609009090000900900990002000000202000009990C00929C929900C90990002000002009002009909C929C29000902000990C00020200999999029902002202009A9191119999000009009A9191119889999999999A9111119888888888888A9111119AAAAAAAAAAAAA99999998888888888888888888888888888888888888888" Maps[103] := "9999999999999998888891111111111001999988911111111112219009889999999999920C00099890000002002001002098900C2CC000C0020C00989000000C000CC00C09989002C00C0CC00CCC09989020C2CCC0000C8C09989990020C00C00CCC0998999000020CC0C00C0998890200C002002020009889002002C22200900098890090020000009999988905990090090098888889999999999999988888" Maps[104] := "EEEEEEEEEEEEEEEEEEEE888888888888888888888CCCCCCCCCCCCCCCCC88CC0000000CC000C00CC8C5CC02C00200200000C8C00C00220C020CC000CCC020C0002020C00CC11CC020CCC020002000C11CC002000C22CCC000C11CC0C2000C000000CCC11CC0C0CCCCCCCCCC00000CC000000111100000000CC0000001111C0000CCCCCCCCCCCCCCCCCCCCC88888888888888888888888EEEEEEEEEEEEEEEEEEEE" Maps[105] := "888888899998888888888FFFF8890099999888888FFFF889200000998888888889990CC0020998888888890020C0202698888888892000CC099998888888890202C1111988888888992000C1111988888888990220011119888888889000209011198888888890020299999988888888999000988888888888888999029888888888888888890098888FFFF8888888899998888FFFF888888888888888888888" Maps[106] := "8888999999999888888888889111100099888888888891C1C00209988888888991111C0C07998888888901111C00C0099888888900000C20CC209888888990CCC002000098888888920020202C009888888890C002020CC098888888900CCC00CC009888888890000CC0CC099888888890020C002009888888889992020009998888888888900999998888888888889999888888888888888888888888888888" Maps[107] := "8888888888888888888888888899999999888888899999900000099998888970002020C90000988889920202C29C0C9098888990220091111110999889000900C111111000988900200291111110C09889020C22011111129098899020029C909C900098889020020020020099988890200200200200988888999999000999999888888888899999888888888BBBBB88888888BBBBB888888888888888888888" Maps[108] := "8888888888888888888889999988AAAAAAAAAAA889000998888888888888890200999999999888888990C0900000009999998990C0002C29400900098900C0000002090002098900CCC09999999990998900CC0113111110909E8990CC031311313090998902CC099999990992098900200020020000200989009000900090009009899999999999999999998888888888888888888888888888888888888888" Maps[109] := "99999999999999999999C9C9C9C9C9C9C9C9C9C9CCCCCCCCCCCCCCCCCCCCC000C000C0000C000C0CC000200200000C020C0CCC2C02CCC0C000022C0CC00C00C1CCC00C20200CC00C2C1111C00C0CCC0CC0200C11111CC0000C0CCC200C1C1111C220200CC00CCCCCC11CC0C00C0CC00200000000020CCC0CC000C000C00000000C5CCCCCCCCCCCCCCCCCCCCC9C9C9C9C9C9C9C9C9C9C99999999999999999999" Maps[110] := "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE9999999999999999EEEE9499919911199009EEE99200119111900009EE990000111111900209E9900209111119909099E9002290999990020209E9029020000990022009E9009009000090200209E9000220999092990009E9029000000202002099E990000900009000099EEE9999999999999999EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" Maps[111] := "888888888888888888888CCCCCCCCCCCC89999988C8888888888889000988C8888889999999090988C8899999952000000988C8890009990299020988888902000020999909889999029009099A990988900000029909999009989099099090020092009890911190900000000098900111009990099999989091119098999988888890909990988888888C889000000098CCCCCCCC889999999998888888888" Maps[112] := "888888888889999988888DDDDDD88889111988A88DDDDDD88899111988A88DD888899991111988A88DD899991111119999888DD890000011119009888DD89029990099900998888890090092902020988999909920020000209889002220009090090098890000020290992009988900902020900200298889999000026209200988888890000900990099888888999999999900988888888888888889999888" Maps[113] := "8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D999999999999999999999000000900900099000990002009009092002099902220020002000902099009009911990000200999090091111199090009902929991111192992999009009111119900009999090209999909299009900002000000000000099090009949000909090999999999999999999999D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8" Maps[114] := "E8888888888888888888E89998888888888CCCC8E89099888899998888C8E8900999999009998888E8900090202202099988E8900207020000200988E8902090920020000988E8900990909990999988E8909900009002009888E89991110990202098C8E89911119900020098C8E89111199020029998C8E89111999002009888C8E891119F9009999888C8E899999F99998888CCC8E8888888888888888888" Maps[115] := "AA999998888888888888AA900099999988999998AA902020200999900098A9900CC0CC0990002098A9020020000020200098990000099099002099989022999990999990988890000099709E999299889900209992999002098889990099900090020988888902200090202209888889009900090000098888899991011999999988888891111111119888888888911111111198888888889999999999988888" Maps[116] := "899999999999DFDFDFDF891111110009999999998911111100090099000989119990200002000009891110202090009900098911192999990000900989990000900092009209888900220202002990098889002000929209920988899909909000099009888890020209909999998888900002002009888888889900090900098888888889999959999988888888888889998888888888888888888888888888" Maps[117] := "99999999999999999999999999999900099999999999999902200900009999999999000209222099999009992020290200999990000000900020009999909999909009992099900100099020020009999991CC099909999909999111100900209902009991110C090220990200999111100920220000009991111997020099220099911119900000990009999111199999999999999999999999999999999999" Maps[118] := "CD8989999999999998F88FE8B9000000000099ADB8A98900C002202009E9888F892002C00C0079CB9CB8990C00C020C09988A88F9000200200C098EC89ED9000C02000C09DA8D8C8900202000000989FCBA8900000CC00209CB8888890000CC022C098E8F9999992200090009888E91111900999999998FDC91C1110998B88D898898911110009F88E8C8B8AA9111100098C8B8888AE89999999998D88F8E88D" Maps[119] := "88888888888888888888888888888888888888889999999999999E9999999000000000009E9111199909290090999E9111199000200290009E9111199922900200009E9111199002029009209EE900999009002002009EE9009990020992999299990069900200900900000000999999002009009990009E9000009009009E99999E9999999999999EEEEEEE8888888888888888888888888888888888888888" Maps[120] := "888888888888888888888FFFFFFFFFFFFFFFFFF88FFFF88888888FFFFFF88FFF88999999888888888888899060099999998899999902CC200002098890020020000022020988902CC00C0CCC0CC009889000020C000020009988992CC02CC2900000988890020200209999999998900C0900C0091111119890000900200911111198902C090CC200111119989900090000900011198889999999999999999988" Maps[121] := "88888888888888888888888888888888888888888888899999999998888888888888888888988888888889999999989888888888891000009898888888888999020098988888888888890000989888888888898907009888888888888989002099988888888889890000019888888888898999999998888888888988888888888888888889999999999888888888888888888888888888888888888888888888" Maps[122] := "88888888888888888888888AAA8888888AAAA888888A88888888888AA888888A89999999998AA888888889100000098888888888899990CC0998888888888900000020988888888889000040009888888888890200000098888888888990CC099998888888888890000010988888888AA89999999998A888888AA88888888888A888888AAAA8888888AAA8888888888888888888888888888888888888888888" Maps[123] := "8888888888888888888888888888888888888888888888888888888888888888899999999999888888888910900000098888888889009000C009888888888930900000298888888889000070000988888888892000009039888888888900C00090098888888889000000901988888888899999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[124] := "8888888DDD88888888888888888DDD88888888888888888DDD8888888888888888888888888888888AAAA8899999888888888AAAA8896009888888888AAAA8890229998888888AAAA8891210198BBBB8888888899900098BBBB8888888888900098BBBB8888888888999998BBBB88888888888888888888888888888888FFF88888888888888888FFF88888888888888888FFF88888888888888888888888888" Maps[125] := "88888888888888888888888888888888888888888888889999999998888888888890000000988888888888900CCC009888888888889001010098888888888890001000988888888888999000999888888888888890C0988888888888888892229888888888888888907098888888888B888899999888B888888B888888888888B888888B888888888888B88888BBB8888888888BBB8888888888888888888888" Maps[126] := "888888888888888888888888BBB88B88888888B888B888BBBB88BBBB888888B888888888888888888888899999999888888888888900000099888B8888BB8901909109888B88888B8900901009888B88888B8902220009888B88888B8900040099888BB8888B8999999998888BB8888B8888888888888888888BBB888888888B88888888B88888BBBBBB88888B88888888B88888888888888888888888888888" Maps[127] := "88888888888888888888888888888888888888888AAA899999999998AAA88AAA890243101098AAA88AAA890299209098AAA88AAA890000000098AAA88AAA899902909998AAA88AAA888910909888AAA8888888890000988888888FFF888900009888FFF88FFF888999999888FFF88FFF888888888888FFF88FFF888AAAAAA888FFF88FFF888AAAAAA888FFF88FFF888AAAAAA888FFF888888888888888888888" Maps[128] := "FAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFA999999999AFAFAFFAFAF900901209FAFAFAAFAFA900009909AFAFAFFAFAF900000249FAFAFAAFAFA990902099AFAFAFFAFAFA9190909AFAFAFAAFAFAF9100009FAFAFAFFAFAFA9000999AFAFAFAAFAFAF99999FAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAF" Maps[129] := "8889999999999999998888888888888888888888898889999999999988898988888888888888888989898999999999998989898989000000000989898989890022522009898989898901111111098989898989000000000989898989890C2C2C2C098989898989000000000989898989899999999999898989888888888888888889898889999999999988898888888888888888888888899999999999999988" Maps[130] := "88988888898888889888888888888888888888888888888888889888888888889888888888888988888888999888889888888988899099998888888888888900100999888888888889009002098888888988890190990988889888888990220109888888888888900400098888888888889999999988888888888888888888888988889888888888888888888888888988889888888888888888888888888888" Maps[131] := "8888888888888888888888988E8888B8888D888888888888888888888898888F888C8888888A88888D88899999999988888888888901000109888E888888890900990988888888888902200909888C8888B889420001098888888888899999000988888888A88888899999888B88888888888888888888888888888F8888888888888E88C888888888D888F88888888889888888A88888888888888888888888" Maps[132] := "AAAAA8888888888AAAAAAA8888888888888888AAA888888888888888888AA888899999999999888AA888890000004009888A8888890001C22209888888888900000002098888888889000999010988888888890C09390C0988888888890109990009888888888900000000098888A888890000C10009888AA888890000000009888AA888899999999999888AAA8888888888888888AAAAAAA8888888888AAAAA" Maps[133] := "888888888888888888888888888888888888888888F8AAAAAAAAAAAA8F8888F8A8888888888A8F8888F8A8999999998A8F8888F8A8910990098A8F8888F8A8900992098A8F8888F8A8900901098A8F8888F8A890000C098A8F8888F8A892CC02098A8F8888F8A8942113098A8F8888F8A8999999998A8F8888F8A8888888888A8F8888F8AAAAAAAAAAAA8F888888888888888888888888888888888888888888" Maps[134] := "8888888888888888888888888888888EEEEEEEE88888889999888888888888888990099999999988899999000000000009988911099000CC0CC0009889110992C2202422C09889110000C0000000C0988911000000CCC2C0209889110099220000000098899999990000000099988888888999999900988888888888888889999888888888888888888888888EEEEEEE88888888888888888888888888888888" Maps[135] := "8888888888888888888889988888888888888888899888888888888899888888899888888888998888888998999998888888888888889007988888888888889992C098888888888888900120988899888888889000199888998889988890200988888888899888910099888888888888889999988998888888888888888889988888888998888888888888888889988888888888888888888888888888888888" Maps[136] := "88888888888888888888888E88999999888E8888888E88900009888E8888888E88902009888E8888888E88999009888E8888888E88889099988E8888888E88899000988E8888888E88890020988E8888888E88890000988E8888888E88899229988E8888888E88894200988E8888888E88892110988E8888888E88891111988E8888888E88899999988E88888888888888888888888888888888888888888888" Maps[137] := "8888888888888888888889999989998999989998899888888888888899888988AA899999999899988998AA890210009888988898AA890CC2019889988998888900C0C19899988998899900C0C0988888899899000000009899988998900092CC20989988888890099411209898888998999999999998999889988888888888889998899999999889899889888899988999998999999888888888888888888888" Maps[138] := "888888888888888888888BB88888888888888BB88BB88888888888888BB888888999999999988888888889000110009888888888890C0000C2988888888889000CC2C09888888888890C0CC0009888888888891C0200C1988888888889120990009888888888892099990098888888888949988990988888888889998888999888888BB88888888888888BB88BB88888888888888BB888888888888888888888" Maps[139] := "888888888888888888888888888888888888888888EEEEEE8999998EE88888EEEEEE8940098EE88888EE88888922298EE88888EE8899990C098EE88888EE8990000C098EE88888EE8902C001098EE88888888930CC0C098EE888888889100C0C098EE888888889900001198EE888888888999999998EE888888888888888888EE88888EEEEEEEEEEEEEEE88888EEEEEEEEEEEEEEE88888888888888888888888" Maps[140] := "8888888888888888888888889999999999998888888890000000009888888888909203900988A888888890002430988A888888889000120988A8A8888888901000988A8A8888888890910988A8A8888888889000988A8A88A8888888900988A8A88A8888888890988A8A88A8888888889988A8A88A88A8888888988A8A88A88A8888888888A8A88A88A8A8888888888888888888888888888888888888888888" Maps[141] := "888888888888888888888AAAAAAA8888888888888A8888888888888888888A8888888888888888888A8888899999999888888A8889990000009888888A8889012013209888888A8889070CC000988888888889001102209888A8888889000000999888A8888889999999988888A8888888888888888888A8888888888888888888A8888888888888888888A8888888888888AAAAAAA888888888888888888888" Maps[142] := "99999999999999999999999899888899989998899898998998898898998998988889988988988989989999999999989889999999990011009998899999989900991098998899998889029030989998999999890200249898889999998990000998988899998889999999999999999889998989998999999998999989898889988899988889898889889899999998998999999888898999999999999999999999" Maps[143] := "8888888888888888888888AA88888AA88888AA8888AA88888AA88888AA8888888888888888888888888888999999998888888888889000000988888888888890C2000988888888AA8890205C1988AA8888AA88992C100988AA888888888900001988888888888889999999888888888888888888888888888888888888888888888888AA88888AA88888AA8888AA88888AA88888AA8888888888888888888888" Maps[144] := "8C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C899999999C8C8CC8C8C99943110098C8C88C8C89090090919C8C8CC8C8C90022009098C8C88C8C89000020009C8C8CC8C8C99999090098C8C88C8C8C8C8999999C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C8" Maps[145] := "888888888E888888888888888888E8888888B8888D88888E8888888B888888D88888888888B88888888D8899999888888888888888900099888888888888889000099888888888888890C0249988D8888888889002C209888D8888C888990101098888D8888C88890091998888888888C889999998888888888888888888888F88888888A888888888F88888888A888888888F88888888A88888888888888888" Maps[146] := "88888888B888888888888D88888A8888C8888A88888C888888E888889888F8888888888888888888888889999999999888888888890000900098888888B8890CC31CC0988D88888889010C0030988888898889003423209888888888890000000098F88888E8899999999998888888888888888888888888888888888888F8988B8888D888A88888888888888888888888C8888E888888888888888888888888" Maps[147] := "8888888888888888888888999889999988899988889898891209888989888899988900098889998888888889909988888888889999990009999999888890099011160090198888920000C0C0C00029888891099020202090098888999999990099999988888888889909988888888899988899099889998888989888900098898988889998889021988999888888888899999888888888888888888888888888" Maps[148] := "8888888888888888888888888888888888888888888888888888888888888AAAA8999999988AAAA88A88A8907000988A88A88A88A8902910988A88A88A88A8900020988A88A88A88A8900909988A88A88A88A8900919888A88A88A88A8900029888A88A88A88A8900109888A88A88AAAA8999999888AAAA888888888888888888888888888888888888888888888888888888888888888888888888888888888" Maps[149] := "88888888888888888888888888B888888888888888888BB88888888888888888BBB8888BBBB88888888BBBB9999999B8888888888899000409B8888888888890203209B888888888889020900988888888888B9009900988888888888B9011109988888888888B9999999BBBB88888888BBBB8888BBB88888888888888888BB888888888888888888B8888888888888888888888888888888888888888888888" Maps[150] := "88888888888888888888888888AAAA8888888888888888A88A8888AA88888A88A888888888A888888AAAA899999988A8888888888891019998AA88888888889190209888888888888890000098888888888888902920988888888AA88899007998888AA888A888899999888888A888A888888888888888A88AA88888888A88A88AA88888AAAA888AAAA888888888A88A88888888888888888888888888888888" Maps[151] := "9999999999999999999990000002190000000009909999999909999999099098999999099998890990989000000000988909909890C2CCC020988909909890C1112204988909909890C111C0209889099098902111C200988909909899992CC020988909909888890000009889099098BA8999999998890990988888888888888909909999999999999999099000000000000000000999999999999999999999" Maps[152] := "88888A8A88888AA888888AA88A8A8888A8888888888A88A888888AA888888AA8888888888888888888888899999988888AA88888899001099888A88888A88902290098888AA88A8A89102001988888888A8A890090909888888888888990127998888888888888999999888888888A8A8888888888888A888A8A8888AA888888A8A888A8888888A88888A8A888888888AA888888888888888888888888888888" Maps[153] := "888888888888B88888888888888BB888BBB8888888BB8888B88888B8888888B88888BB88888888888BB8888999998888888888888899000998888BB888888890002098888B888888889100039888BB888888889192909888888888888890040098888888888888999999988888888888B88888888888888888BBB8B88888BB8BB88888B888BBB888B888B88888888888B88BB888BB8888888888888888888888" Maps[154] := "88888888888889999999899999988888890000098999999899999910CC198999999890000002003989999998900999029009899999989009890090098888888890098999999988899999900988888888999910400009888888889001200900099999999990C0099900000000000990202019999990002C0999990009888891C002098889999989989001C2998988888889989100009088888888888899999990" Maps[155] := "8888888888888888888888888EE8FFF8BB88888888888EE8FFF8BB8888888888888888888888888888BB89999999998EE88888BB89011002498EE8888888890092990988888888FF89900099998FF88888FF89039031098FF8888888890020000988888888EE89009000998BB88888EE89999999988BB8888888888888888888888888888BB8FFF8EE88888888888BB8FFF8EE88888888888888888888888888" Maps[156] := "88888888888888888888888E888888888888E888888888888888888888888E8E8E88999999E8E8E888888888900009888888888E888890120988E88888888899999209888888888888900002198888888888889002C0198888888888889990CC19888888888E8890124C0988E888888888900000098888888E8E8E99999999E8E8E888888888888888888888888E888888888888E88888888888888888888888" Maps[157] := "88888888888888888888888999999999999998888889999999999999988888888888888888888888888999999999999998888889999999999999988888899900142010099888888999029020200998888889990191039909988888899901000002099888888999999999999998888889999999999999988888888888888888888888888999999999999998888889999999999999988888888888888888888888" Maps[158] := "888888888888888888888EE888888889988888888EE888CC888998888888888888CC88888888FF888888888888999988FF8888888888999009888888888888999002098888888888889060000988888888888890C12299888888888888910010988888888888889999999888888888888888888888BB8888888DD888888888BB8888888DD8888AA888888888888888888AA88888888888888888888888888888" Maps[159] := "8888888888888B8888888C888D8888E8888C88D8888888888888888888888B88899999999988F888888889000000098888A888E889000000098888888888899990CC098888888888999000C009888E888F889002C000099888888888902022911198888888889000259101988888888899900999999888A8888888999988888888888C888888888888D8888888888888F888B8888888888A8888888888888888" Maps[160] := "88888888888888888888888AAA888888888BBB88888AAA888888888BBB88888AAA888888888BBB88888888999988888888888888889069888888888888DDD89129888888888888DDD89009988888888888DDD890219999888888888888902000098888888999889901000988EEE88999888999999988EEE88999888888888888EEE8888888888FFF88888888888888888FFF88888888888888888FFF88888888" Maps[161] := "888888888888888888888AA89999999998888FF88AA89111111199998FF88AA89111199990098FF88AA89991119002098FF88AA88892009090098FF88AA89990020002098FF88AA89020200202098FF88AA89090990220098FF88AA89092992002098FF88AA89090000999998FF88AA89000299988888FF88AA89990098888888FF88AA88940098FFFFFFFF88AA88999998FFFFFFFF888888888888888888888" Maps[162] := "8888888888888888888888888CC899999998888888888888911111988CC88C8889999111119888888C8889409211999888888888890290009888888888CC890099299998888888888902200000988C8888888990CC0C20988C8888888900C00C00988888CC88890220CC009888888888890002CC20988888888C8902200009988888888C8900090009888CC8888889999999998C8888888888888888888C8888" Maps[163] := "888D889999999998888888D8899888888899888888889988999998899888888998899000998898888899889900213998988888988991001210989888889899002321209898888898900036300098988888989021232009989888889890121001998898888898993120099889988888988990009988998888889988999998899888888889988888889988D888888899999999988D888888888888888888888888" Maps[164] := "8888888888888888888888999999999999999998889888888888888888988898999999999999989888989000000000009898888890CCCC0CCCC098888899900000C0000099988890011332C2331100988890C00000000000C09888900C2CCCCCCC2C0098889900102060201009988899999999999999999888888888888888888888889999999999999999988888888888888888888888888888888888888888" Maps[165] := "888888888B88888888888B88888888888888888888888B8888888888888888888889999998B888B88888888904009888888888888899229098B888888888889030919888888888B8889000919888888888888890000198888B88888888999921988888888888888890209888888888888888900098888888B88888889999988888888888B888888888B88888888888888888888888B8888888888B8888888888" Maps[166] := "88888888888888A8888888A888A88888888888888888888889999988888888888888890009888888888889999900498888A888A889000000398888888888891900091988888888888900000909888888888889020099098A888888888999029009888888888888892090098888A88A888889001009888888888888899999998A8888888A88888888888888888888888A8888888888A8888888888888A8888888" Maps[167] := "88888888888888888888888888888888888AAAA88888BBBBBBBBBB88AAA88888B888888888B88AA88888B8999999888B88A88888B8911109998B88888888B8904C20098B88888888B8902020098B88888888B8900090098B88888888B8999999998B88888888B8888888888B88888A88BBBBBBBBBBBB88888AA888888888888888888AAA88888888888888888AAAA88888888888888888888888888888888888" Maps[168] := "88888888DDDD8888888888888888888888B8888888888B88888888B88888888BBBBB88888BBB888888888B88999988B88888D8888899900999B8888DD888889001010988888DD8888890C12C0988888DD888889420020988888DD8888B9990099988888D88888B88999988B888888888BBB88888BBBBB88888888B88888888B8888888888B888888888888888888888888888888888888888888DDDD88888888" Maps[169] := "99999999999999999999999899888899989998899898998998898898998998988889988988988989989999999999989889999999990Y11009998899999989900991098998899998889029030989998999999890200249898889999998990000998988899998889999999999999999889998989998999999998999989898889988899988889898889889899999998998999999888898999999999999999999999" Maps[170] := "89999899999998999988898898910101989889888988989101019898898889889890191098988988899998910001989999888888889111119888888888899999292999998888888900202020200988888889020202020209888888890020202020098888888900000400000988888889999909099999888888888890202098888888899998921212989999888988989101019898898889999899999998999988" Maps[171] := "8888888888888888888888DDDDDD888DDDDDD88888D88888DDD88888D88888D8DDDD888DDDD8D88888D8D888888888D8D88888D8D899999988D8D88888D8D894300998D8D888888D88922200988D8888888D88910090988D888888D8D890001198D8D88888D8D899999998D8D88888D8D888888888D8D88888D8DDDD888DDDD8D88888D88888DDD88888D88888DDDDDD888DDDDDD88888888888888888888888" Maps[172] := "AA8AA8FF8888FF8AA8AAAA8AA8FFFFFFFF8AA8AA88888888888888888888FF8FF8999999998FF8FFFF8FF8900090098FF8FFF888F8902091198F888FF8A8F8900221198F8A8FF8A8F89420C1198F8A8FF8A8F8900221198F8A8FF8A8F8902090098F8A8FF888F8900299998F888FFF8FF8900098888FF8FFFF8FF8999998888FF8FF88888888888888888888AA8AA8FFFFFFFF8AA8AAAA8AA8FF8888FF8AA8AA" Maps[173] := "888888888888888888888A8A8A8888888888988888A8A8888888888888888A8A888889999888989888A888899900988888888A88889901029988988888888890091009888888888888902009098888888888889909100988888888888889620099888888888988890099988888A888888889999888888A888989888888888888A8A8888888888888888A8A8888898888888888A8A8A888888888888888888888" Maps[174] := "8888888888888888888888B888888888888888888B8B88888888888888888B8888999999998888888B8B899000011988888888B88902090009888888888889002999198888888888894300000988888888888999900209888888888888889200998888888888888890199888888888888888999988AAAA888888888888888888A888888888888888888A888888888888888888AAAA8888888888888888888888" Maps[175] := "88888888888888888888888888888888888888888888888888888888898888888899999988889988888888942119998999888888889022300989998888888899902C0989998888888889900109899988888888890200998999888888888900C198899988888888890010988999888888888999999889998888888888888888899988888888999999999999888888899999999999998888888888888888888888" Maps[176] := "88889998888888888888899899999999999899988999988888888888999889998899999999989988899988999999999898888888889900001998998889998999110209989998888989902299999899988899899000999998899889998990C49988888998899889900099888888888999899999998888998888898999999989999988899988888888899998888899889999999989988888888888888888888888" Maps[177] := "8888888888888888888888B888888888889999988B8B889999999999009888B88891190020000098888888911900020200988888889111122C2C0998888999911110000209888889021CCC3999999988899902CC001988888888890020200C1999888888890020002C100988888889904022201C0988888888902000291009888B888899999009999988B8B888888999998888888B8888888888888888888888" Maps[178] := "888999999999999999888889AAA9EEEEE9AAA9888889A99999999999A9888889A9B9009009B9A988888999990000099999888889E90032C03009E9888889E90003132009E9888889E990C171C099E9888889E90023130009E9888889E90030C23009E988888999990000099999888889A9B9009009B9A9888889A99999999999A9888889AAA9EEEEE9AAA9888889999999999999998888888888888888888888" Maps[179] := "A888888889999888888A888888899900998888888888889902020998888888888990200120998888888899021C1012099888888990212101012099888899021012121212098888902121212121C6299888900010100010120098889920C1212121212098888902121212101009988889902101012120998888889902101C120998888888899021002099888888888899020209988888A888888990099988888A" Maps[180] := "88888888888888888888888888888888888888888999999999999999999889888888888888888898898999999999999998988989420021103120989889890200031213009898898990202110312098888888900203121300998988989020211031200989889890020312130009898898999999999999998988988888888888888889889999999999999999998888888888888888888888888888888888888888" ; Theme data Themes := [] ; Create array Themes["Color"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgCAMAAAD9lVunAAAAHlBMVEVHcEz////AwMCAgIAAAAD/AAD//wCAgACAAAAAgIBYQi54AAAAAXRSTlMAQObYZgAACJRJREFUeAHEmAGa6yYMhCNpFrz3v3AfCGsEIXbS7fbNfqkDg4DyVyLuQ26lpcip9k2ly5/2Trxexf9lPSbhFLtu/J8LF6L9Iup+etFJltoirR0iJsrsl+M/9cU+9OczU6gL7L72f4DvHFFeCs22JkxTsft2kQBcVWvtB2KtwQO9kpmleO0d9q/jpYwctxx/s7/Zb1PqS183Pkk0dqIY6JkcV/69YDCoQqcPDIPZJZ4pVVFDYDdws4j4wc0HYupd0gG5T9F3QN03r7j9r6cJ4/Um/vSJnevTn4HtfQ+efdr0jX6AcN93BQWT9M7/AWAU5JFqiIeLqQrUEqrA6PYp/hfAHU18LAPWm3h1ka+tgC72N/Ptcy6+1gs/ShwBAqat2a17/7cBu8wyYDO43gGca9bmzpM5hybfYCPeRIzdTZ/Fd6tI9WgNuW9NsCH4N6GvNfjN8ff+yE4D0v6kf5Czt/tHl7rCp9z/DDBcK2B2q3pMI/v1R+2p6t1vAXZdAXb5HehPkpQtx4YjGyIN35DnqjHetQXgPuFSIqfP8KrrBLf+ebsqbOzMBztUZ+T+H3RfXY1x+FT2PwFsTf2pZvAHuyfAPv+HgG3W0g7AtoAPwHkUxy3x8iQzxs9LXe4HaTB9RsM4w86378V/+MmOqquDsShUPEmb3xynN3TEAYdmn4Bfa85g1KSc2C5V5yvSCKvmEn25iLwjDYlmjYMmX1JuKC7ekCwAT1K1uZOjF21eobUqMM87aa48Qw/0tvemQoK2aY0Mcr7S1QlC3T+1+g8KfUvYtFBw/SOKGWxWyhGAzXIGXy6iTfX1C6eINF+eclhY7LzgTnLCES86jagagNP6IkWjc9rPZn7JA+pJBTgnpk2fov9AA9v/0KCN+1fhNrrvfCXUCJ6+69l/AjwUrROwqwGkzNY7GCjHESkMzIA5rSsDrgHUT3tt82Tou6yJh7f6BkS855da/v084rkeS/S6H1Zaqoi6z//EAIgGYbez7+gq19cG0gu/zoKJAqpwP/j5wwkDAXjnB99ay5Nq7TAK8h1LKa8Akhx3fAecujvP/RpogOM1J+DUqhJtlrbZD0xqIjvfXY93dksdPkcUoRx16ETksChWliZh/rbmt9Vz6poHs6nJh51lyD99n+c3KLrfEnhwGyQ9hUHAz37wLV3u5Tcds7cAdxFwU0Hq7jsk37xOxX8BWH4E2LvLCri0rsgrwxXgMTsA76mcO/vuqX5z7x8C/hraA6a/ATwcIq6dH0mtgNcSvQJmd/9WiXcoANvLEt1FfLOfCq3I3jcE/gG4c2ujCJgJW9YM9jGElcV9Wc5flzGH6VO8JZyRbiqEqMeg+eS7Eh6A934CPND0MfsMNuN7Ln9EvQWYGTyv44BfvwDP/6ZVF3/N4EX1dPUEHNj4I2sf3y0SegG4jKjMN41nFOvzjNF92No/MljaU9B9AhQhwO4TMP0VcKAREl7vYCCXV+AC8HFs7mDnO63jgPcvnGyzFG50DklnZNnFGR8l2vERga/ABUwpe0s+KfN3M/28q2mUQdX/obOiRDf/IDlyPFii934CnJL7BIzmZVL5PZfdvGyD39F8doMX/byOLyL30qS6ApbtOxLdqUSXFTBH2JL/dG8U8/WYNavTO3Tymzl8GDQJ/NI3hu7vATb/TcDp5FfAGWAGvNzBDvjwBJ4zmICndRzwm/+r8iVCSBuy528wtQmw/FO8Gei2DcNANOIRVff/PzyA9skXljHTad04YIV3oe3sVTKpkwE4gTB/MD+bGpgwLP8mxXpg4zzVVBfpg7M22DflG6QeI3Q9haNqYJukI7iagkN/c4qW//nPcop+aJ+rI1in8M8ImcLzFJ2uo4BnMsinAqZejDECLvQ5M2AAyCP4/GeRbFzHGDI+RwVYziVV9Tz4qS54py3dDe65SHcHp+jQXxVZ/naRJZGKrKbPfS7CmA9URVa+DgHPeX11nMfq56puhdkwhui4dGDlfyj8DLhci54CeHpdRbObkzEMnZ9PfR76L30IL90j+/izAqvY8tDrNin0N9ukxFfapKZKbtoobZPSdX4csBeARwH4zmyg31vXVrxfJax8qQdhRXfqAdgbwF4udGTA/UKH4NUR3C1kdAshOoLTdQhYv3s9RYteT9GodAdMp+ihMlDbhaA0kx88UmABhp4u8VVdQvSHn094xGi1FB56vVRptr1U2Y/gBnC/VPlWkQUrg4AGUGoL8GqF5qgA935wui1ek7rM0ld9ZVlnqE670FahpV+ddmFtNoS+bzbwhqTPlSKqMSNas6H1g8uVLAhgACg6JYdD/WCk8Fd+MCT0/KkGzn7wSRjiKn3V+awR/RwifjVQkELLH6eObAdS37ULtYhin6tFVGMn9nbhN/vgutMFsJ69c/GV/MwXlR/MLTuVH7w+Ip8uHebV/954yqoHQcc54+AgjUX5QcL+bOjD/rLhbyZ9rhRRzYaA3vBvlyrzTlNVYb5II5GH5steqvWX5Nd24RUIntyAz5+mARKU/ugd/YRwSFjrpMKPvwG6JYf67pYddZOkQFI3qdnS023ZyX7w4e+uY21wVFc/WIgOHEwBr/K5H5L5rR/MOVWGq4QtnZ8H+cVxp8f5SdAcLLLAmtplGIZyAFB9e9OdAmafq4CbTXkt4GQXwuJ4WGkXqk5EK/8I/ry1Gy3nEzA7YLk+08Ccm2MAwS/pM+sm5yeGAxlcBrErJo9JM+td9IC7bbHNttp/DthvAXOTxQvAqAFPS/dnr/SzGsn6fNZtKuAjPAMmv17fBNwUUduAs/8rx4DUv446NB9H/Gl+wI2Q/Lv7sy864N7ren9a6sYzBvEBHTy9vvHqSvdqSvNqS//qSltkgVFz+on8jWP4N/WLBKfp4Uqv13dePmtfLutfTmsu0vjBwqUBtZ//f44LFg0r1fejfz3U7/C18Rta4pqH7xv2iAAAAABJRU5ErkJggg==" Themes["Monochrome"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgAgMAAAC3JUMGAAAACVBMVEVHcEz///8AAADmzmMiAAAAAXRSTlMAQObYZgAABMxJREFUeAF9lwmOq8wOha1oTPZBpJf92AI0vX+gpK5V9CaMutB0J1DKq/ztAgMNSo7EPamezv1qsAvARbLoPH4vALjJE8D9qJsU/XiIjXY/ERYxFrWn8Vldv3OAy4QE4O4Sk+Zcsej/FV1EPrmGhxRBk1KyZwmK+hmxOYznn/GHx50D/A8Zf4C7K/VE1HzdNM70+ZCrxsvzx71j5j6sxAuFhKBxpMSpSBQMaQp7Yd45ACOGGtwPwXeAa139H6CiEbHl+suDncSDGgU05D4UFeL2OzHFZnN4MFJP4P4q+CGokufXS+JOcZH2xBS/EXfN0G8OrCRIoB6zuWY8d8EPsWB5VoTtiO+IWUdDTn2HqlDghmT/iEo9cQjj5he2H+QfF44iY/+j7OMfW3BFFXHNtQbHbMEviXE2ZlTljTiKimxpU8ph9Ss1FlxfMYpkrhXYNrPvaiWuEGt5PgSltan2XY2LnBhxtkJMU7QFH9gOlohknHde3LxCkxKhMIkFm+vhwv9DRXD3TaXE0hox6M9c8RPSIidOZBYTz1MuyTZRUg3Jt9fQ+Gf1Cok1mCrKiJEJLuafGhxlpB9331QVTdIPGnzjVrIGh2BJ22bqmpIy9V1QTTEEJZ6MbrJZ1ydECpN5COpcZoZ6jiNxO/VwM/+hUKZ2qsjciO8yfXE9jGj6/4mYZ89KjKjEikMfiB8rMSfBlM1V2QtN4JZjpjHAzfwHVLaXEIMHP+Qu8iXPhGjfqd8QW+GYogLZ0Z5WYgqCIZqrYtgFi5Rgcw0mESsp21RbMNcJ0b5TvyVuV2LKK3EzZG4GdRurYxGlSCKcCR7mT6ha6UcN9vO7C7bvvCWmqMQ+duJOP6hNXSiaeAnmSDmWYHMNjsK5rPEYc+vBZY3tO2+Jm0GJfezEnEQpU+ZkUu+WqY7t2I45wMO8BMsH/t8KiLS1rXElUus5vqJ9pz6f45lwdGIfY2vEiDGggefo/yGlteOU5mDaB2cNfogF2xpbMNdzcK5Plcun0Il9HGJSUWgTN6wHrE2mwaa60eiwTHXYTbXMU32XXqfYp1wRSvCxVjtxVuIoRiySkz6aZX0h6epqTFSfC43tINTd10vZXGG3ucQ2l59f32QJ0b7zllhEiYNkiiIrcWOTm8RcJX6caDlOdDxOvqn8WPlxekMcxIhbg90TR2ua2VyV07gEj3MBoWMB8cLhhcQLyJmYzOLktdq700o8JFti85TUq47YgqtSMkc6lkwn9mAvmed+jGZD8lrt/XgltiMck3kwnwOwvs5Noj42CWsOMmxT7U3iRLyWQhbVRuytsLE6LWH1ayH5qK+lLX6c2yKhiJJ6e/S2+LofB1Ht+nGDi2IIefNLh8hKfMHSr88XAbFgefqFwC8C534shpcTD6La9WNGSy/LMCisO2Rvc3ZK1A9XH7/y+BXIrz6nWh2iTeHkU7/147A+U5w2h3s5UZ/w0ADzw2XPz69f+jz4TFxIt82mT5T0TVl2Dlekcsu8DpO5y4N9U/k19zVxudXRnljkO3GUncPFgmtwPwb7pjoFO8Ygs8qn83ivIe8cgLGhH+B+CL75q4u/yvw4EsuiV+P9M+3c3plIJ9L9+NLmL2v+8gbHXe1B5/F76RyL5bkf5a+n/roKi/4DXnx6iqqx+9YAAAAASUVORK5CYII=" ; Fontmap data Fontmaps := [] ; Create array Fontmaps["Pink"] := "iVBORw0KGgoAAAANSUhEUgAAAPAAAAAYAgMAAAC5LJjuAAAACVBMVEUAAAAnIyP/ANyc0SNYAAAAAXRSTlMAQObYZgAAAJVJREFUOMvNlMEJxTAMQ/WH6D4d4V/Uw9/rj9BDM2UVKpqYklxKSYMRsuAdbIgxUe+LDwl7q4sMOtfJSDiltAn+/WFvVdlXus5VMhTeyBNm9laXGqvyRbD8kXdh6bOwXITRgAH0YK9h8UqiGi7Je+A8m2e+LK/M7Pw+TEZ4ug9D7YNw82MY7m57INw+Qxm2L0k8QwPhHXhD8je17UVJAAAAAElFTkSuQmCC" Fontmaps["Green"] := "iVBORw0KGgoAAAANSUhEUgAAAPAAAAAYAgMAAAC5LJjuAAAACVBMVEVHcEwnIyNr22/DZy3FAAAAAXRSTlMAQObYZgAAAJZJREFUeAHN1IURg1AQRdFNEfRDB9Eb6ysdxKvM8m0ecTdYmzk4WAXQsw5YqlNMC6Cx1skv8X6/3zmeLyzVKfoSa42rWiY/xTsoGLxOMS1AjjB27HWcX8XwYexVG9sFbGZXcbwMY7lIEiPWyb/geG562ZAz1HMGXsfQxtXr2Lz9ML7wYkR87Wr/FF/4DAUca5lALZMf4gN4Q/I35hKgZAAAAABJRU5ErkJggg==" ; Icon data Icons := [] ; Create array Icons["Bulldozer16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAG1BMVEVHcEzAwMAAAAD//wCAgID/AACAgACAAAD///9wWJvwAAAAAXRSTlMAQObYZgAAAF9JREFUeNptjgEKwDAIA9Wkc/9/8TQiY7ADaXoE1AIfwqJxahoTTo2QvcTkcA9CsLOEj/ARZDcyq9HZZJHnJDqvOMUKcoXy27jV2LX1P7uW9aIM4J3/DzPT5cpz/6D8AFCgAnWwfBuRAAAAAElFTkSuQmCC" Icons["Bulldozer32"] :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAG1BMVEVHcEzAwMAAAAD//wD/AACAgACAgICAAAD///+ovIncAAAAAXRSTlMAQObYZgAAALdJREFUeAGVk2GOhjAIRHFE9P4nXiETYqF1P9+fJsxLaUBFBC+Ig30JJMCxAEIQmG1mPNhgBHeCPBKQKmQdWwAZWzzqZHwq+g3AsScH0G4w2x+Y1Rvu4ylEwflFIE0oLfiG84ZvqC2AyGkATRBErqpu9EFRUMeF2agjp5H1KpBvAnGB8aWrNzC/pi3AFp5rmwMneUZ+KSfZd5EXcBd93Rq8rZs5hW9f1L/f5PAHTv8L1mhPRl0A+QMfTwmTv+zr5gAAAABJRU5ErkJggg==" Icons["TickGreen16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAV1BMVEUAAAAAAABBhQBEhgBGiQCayQDT8l+bxgDL8E+b0ACazQCbwQCavQCbuABIiQDu+JHk9IPD7z296Ty56y2w6R2r6Qup5wud2ACd0wCasgDl9YHb83Lc9G+zrzKuAAAAAnRSTlMAM8lDrC4AAABtSURBVHjafcvHEoAgDARQjAFFmr3//3ea6FhycQ9L3s6gfoMoDSmBcL0sK34dQtjx+Qmb995ARpcxwO2cO41lUZQA1PSQVWy01m1L1eRsleWdrSi2Y19LP1s79+x7GadpZL/LMLA/S4xksQjLHAo2A8ymlo23AAAAAElFTkSuQmCC" Icons["CrossPink16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAQlBMVEUAAAAAAADEMLv0TebrOdvnMNT3VOr8bPH2uvD6cfD4du71sO31p+33e+z5Wez0nuvwRuLuQd/1l+72iO72gu31j+wka9E1AAAAAnRSTlMAM8lDrC4AAABoSURBVBjTbY1LEoAgDENtpPj/Ave/qjUyiDO+RV6TTRsDsKjd9/h4Up1QbMesqjOybBBszrmNAWm4nI6c7FzSYSR2grAbAaXHlkTkvlhZGGAfvfcjsu5hWNcBIo/5o+sgxVxq83r9wwU3SwPDoxOsTwAAAABJRU5ErkJggg==" Icons["Joystick16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAz1BMVEUAAAAAAABZW10AAABTVFZZWlxUVVZAQUMAAABvcXNYWVvaIhzUHBZzdnlTVVdZWl10dnadoKJ1dXVeX2FTVVmsra5XWFqNl5hTX2JQXF9ZXF5VWl3DxMWYpqqZo6acnZ6KjZB1hId5gYZsfIJ4e31naGpdY2ZSU1dNTU2qNSfOVCXMGxayAADO0dLDxcW8wMG6u7yxtbeVpKiVoqWZn6CGlJaMjY+GiYv/jYf9i4V+gYN0fn/if3rffHdXZGdMTEz/SEpJSkn/REfuLQDqKADKN7+jAAAAD3RSTlMAM6wRwKd5eSP39+josrKgQWYEAAAAoElEQVQY01WKVw6DMBAFHQIJ6RiD6b2Fkt57vf+ZYhTJFvOzerMD/gzLcgAYI+12Ol71MRXS4nLX0zSjonNW4SE2u1S0e8keoX4bsCRT0YMELFFUNCUBoxagIRLzRQdn6oY2X8aGYXH1Fqwor4LZKnjmkSWQvxIWn0rz/d37W4QKB7ANXceBnrfdrF1oY4ChLEmSTKgPxICfNOCB2Gog/gC2Hg+ySSMz8wAAAABJRU5ErkJggg==" Icons["ColorAqua16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUA//9kZGS1lhCsAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorBlack16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAABkZGSh99HRAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorBlue16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAP9kZGR/8tcgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorFuchsia16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX/AP9kZGSbNnzsAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorGray16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAgIBkZGTj+MOgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorGreen16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAgABkZGQQEWFDAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorLime16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUA/wBkZGRrkxZdAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorMaroon16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAAABkZGS/R8UJAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorNavy16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAIBkZGRMrmfqAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorOlive16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAgABkZGQOoXWbAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorPurple16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAAIBkZGRSHnMyAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorRed16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX/AABkZGRFM3odAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorSilver16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEXAwMBkZGQvR8m4AAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorTeal16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAgIBkZGT9SNd4AAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorWhite16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX///9kZGRRUrtgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorYellow16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX//wBkZGSPV72RAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC" Icons["ColorCustom16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABU1BMVEUAAAAAAAAchboYgLMchboXear///+az+0VgbcmlNROp+MKe7UHfbcKfbUHfLcIfrQXgrgPfrZSmP8mf/6u2PJKpuIiktQv/80A/78Of7f/6p7/zF2Q/wr/qgKOt/90pv/ji//RV/+WVP9uFf+9Ev9qB/+xA/+jxv6pkf2av/vA4Pi/4PjRU/JhnOl1deVLp+P/vOB2/992rdqW/9kNZ9hX/9VpmtWx/85PisNV/8E0Xr3/97yF/7s9c7coZrNz/64aWqnXH6n/uKT9k6Na/6IA/58CRJv5sJJJ/4//+Y62/4ww/4kAKIj/54T2nX7/iH6H/30g/3v+0ns//3j/5HH6inEJ/2v/72vzh2T/cl7yilz/41v/+loA/1f/V1Wt/0z/4kD/RUD/2j/1aTz/vzn/2jP1aTL/tDD/Ny75RyP/+B7/2Bv/Gxr/+BD/1AD/tQD/AAD/J8/SAAAABnRSTlMzJ+/hxcCUfIvEAAAAt0lEQVQY02NgEeBAAgJMDALsKECAgUNEjBMOxEQ4GAS1RLlgQF9UW5CBmw0FcAMFYsMCg2VksnITUrPz2PiAAq7eHi4B8THhIdFJ+WABCXFLexsvTylf6XRZqICpobG5tVSQdApEQFhIXk5T3cDJ3S8iGSqga2akoeDsHxqVxsbDwMtmYmdroaekqBMZl5gJFvBxc7BSVVZRc8zIKQAKCKI6TJKBVZAXCPhBgIeHR5KZgZEBBTACABywHdtSgj4lAAAAAElFTkSuQmCC" Icons["ThemeColor16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABmFBMVEUAAAAAAACMjIyGhoaMjIx/f3+IiIiEhIT8/v/V1daGhobQ0dLS0tNRmP9sDv8lfv3GNvv09vXr7Ozk5OXd3t7Y2dnU1NVGfMQZWan/6p4g/3vyiF//zFz1aTX/2jH/NS+Q/wr/rgHWZ/+FOv+9Ev+xA/+cZ/6kuf2ok/3kjf1vo/qFsPWRuvNwSO+B2+5hnOqX3+ll0un4sOeq4uVEyeMTb+N1huEVvt13rdvfZ9hqm9Z1/9OS/9JW/9Ar/8//2c00dssx/8pXj8hV/8EA/7+y/74A/700Xr2F/7wHTbf/97EuaLFz/7AA/6nXH6lh/6X+r6P9lKP/z6Eu/59M/54CRJuG/5BO/5D/+I+1/476po0AKIg4/4b7wYb+5oMA/4H+iX7+1n3uUHz2mHv/7no//3j/5Hf5inH6s2wJ/2v/+Wr/eWiv/2D9Z13/41z/3FwA/1f5o06K/0v/30r6W0j/8kX/SkX/+UH/4kD/zTr/vDah/zP/tDD3USf6iyD/+B7/2Bv/Gxr7KhT/+BD/1AD/wQD/pgD/AAASyZo1AAAABnRSTlMzJ+rewr3tYEIdAAAA2ElEQVQY02NgYUMBTAxs3DyccMDDzcbAxlOQKZWqoFDfXCHX0MIDFOCOl4oJL6ouL80rlmvlBgn4Bof4h+VkpaTlVyqCBVzsnH08IiMk42Rq2sBmuDnaWtu4ekkmylQpgswQMzcx1DMwtg+KzSisE2Nj4BLl59XS1lE3CohKlpYV5WLgEuHn1bey0NAMTEiXlhUBCgibOog7makpWWbnltQKczGwC3lKeIvrKgsIJJXJNwmxM7ALRodKuPPxqaj6yTe2C7IzcHGgAC4GVi52JMDFzMDIgAIYAfg7KGjYZYDzAAAAAElFTkSuQmCC" Icons["ThemeMonochrome16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAAAAAACMjIyGhoaMjIx/f3////8AAACIiIiFhYXV1dbR0tLT09SJiYn09vXr7Ozk5OXd3t7Y2dmeS4wlAAAABnRSTlMzJ+rewr3tYEIdAAAAVElEQVQYV43KSRKAMBBCUeIQwe7E4f6Hdadk52dF1cPSaLUJLXJ/y2hg1u1bEgz7NQiGi/gl0kUSvF3cBC8XF6HTxSnocHEI6i66oDokrBqaUTBUHjGqB1O+DAIbAAAAAElFTkSuQmCC" Icons["ThemeCustom16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABTVBMVEUAAAAAAADTmUQAAAB0VCXSmEJTh7bQmEXRl0FJfa3emzt6WSlhQxgAAACsfDYAAADSmEMAAAAAAAD////PkjpJg7XRlD36///q//89gcH61mn/99nQkj3//d3/+ds7fsBMhLdIgrb/22rRlkHakzH/+9lCg8E5fLw4e7z/87r33I//9I7/4Xv72nP/33H92nH/427erFPSmUPdmTfMizTblDL1mivxPgrxNwTsAQD0///w/////9X/99X/9sr/88D967T/9rL/+6tljKmHpKX/7aL/85v2moP/5oH5jYD/7H3+33f/5Hb0lXL2dXLqxHHmvGz0e2z40GH50WD3XV7zhV3yc1z0k1LyflH1UlDwYEnqrkfYoETwYkDyRT3ygzfNjjXyeTX0ky7Wji3tQC3yUiv4pinwLifxdyXwPx/wXRv0dRjzZhLuJBDuDQwvNJYpAAAAE3RSTlMAMzMLW+3y8eTArV9OMC8vKyMJrq99IwAAANpJREFUGNMty9V2wkAUQNFbGuqeZKY0E2kT3B3q7u64u/z/I5eQ/XjWOmAngkCWtmwmQESWJKUqmIgdg3Dy9XkuYVQUp0xsGE73TAdIJhsA7CwcDIZDkYJhGMl4fAWY9ykQeL5WVceU6wrYRTSRaKhHu6ZDDXRfUXYeu/nsuFPOffMi6G/v3lDEQ7PN/O/H6zREfTf3jx46Kv283D1QEWLk8tbvd9Pe/1+ln8GwGNMZS6q0VaunumlcNlc5jltz8Olhqj3IYIB5tOPiLRrMLGviPhK1BStsz1nWJ5D5JE7hn39tAAAAAElFTkSuQmCC" Icons["About16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAn1BMVEUAAAATWq4AAAAUXK8QPnMVXbAAAAAAAAATUZoUU5v///8TWq5antewz+tsreBWm9VSmNRNldI6hsotfsYZX7Fgo9tdoNlFjs9Bi81mqN1jpdtKlNNIkM89ic0necOuzOmoyuh7t+Y1g8gQWK2gw+SWvuSdwOKQu+FyseF4r95pp9pvqNlpotd7ptVPk89gk8xIico+gsUsbLcVW68bccC1Cb/ZAAAACnRSTlMA+TKVa0YeDqqpx9dwywAAAMVJREFUGBktwQWSwkAABMBZYrBucU9wl/v/245U0Y1FQOZ5JgF+Iv/YCyH2Dx9hEb23h3v3190P23eEL99fXTfQzrlr7wEEt8tkp4E6a6fLLQDIri0K65wtiqLdEYCd8qZpKbV50+QnBrCzMSYfaFsbY84M+HCldd3TXGut+AcgKuNcC1orzjNFgM2rTDMlaM3TtHxtgJhlshSU0rSUGYsBhL46yiqt5LHyIb6SkD3lOI7yycIEi2S1Jowxsl4l+IlXixiLfxDzENkdXU/bAAAAAElFTkSuQmCC" Icons["Website16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABuVBMVEUAAAAAAAAAAAAbhb4ag8MYg7kdHR4AAABYWVsvRE9NTlAuLzFramtbXV84ODp4enyEgoMYfLEZgLQZgMMXgcYVgMEQdadAY3USVXYAAAAAAAB7e31SUlT////m5el9fX9oaWqi2v0VgcgRfsWtrrBnZ2id6AAro/UnousQmOnI7egYisTAwcIdiMAYg7+5s7OmqatVu553jJ6MjpCBgYN9f4GHf3+IfHl2dnhtbnC07ymB1BCg7QCO2wDY8v/W8P+95v+s4P+R1v+O0P9vyf8jnf92yf1jw/hwxvTy8fKZ2O+s4O7q6uzq6Okgoec0q+bh4uRHq9/Y2dvU1de25tImoNGt5M8wpM9Wvs1Is8kMg8Ych71Mtrw0jrp3yrgWgbYkjLQdibOvsLKtqrImi6/1/6oepJ+d451miJt21JbZ+ZTI85KC3Ip2cIZxaoV+d4F6eXtwc3V+dnN0jHF3cW9jY2NfYGJwz2BaWlt9iVNrf0/M+UmR5kaI2UUqO0WBz0Sx6kHD9EA8PD6a4Ds1NjhrwjdkuzXN/Sm48iGL2iGj5xyT3w+n6wyK2gN80wOo+QCi8wCs8gCU4gC8ZIRDAAAAG3RSTlMAMiszlZVJBv3t7Ord3dvUzcm/vru7qJtRHQoDbBl9AAAA90lEQVQY02MAAmZRZWVlJRFmBihgTayvbrdSa01hgfK1vVO1FJ3jJlkngEWYoxXts0K8GpoNe211QbqEAu20shuturpjXK3bhIEC8R4OjmEdPbWdkeqhtkpAAV13Raf0iTZqaoYamn0gAb1MN5ec/gk25ep+mmlRIIGaCKP83LxKf40MczMzAQYGwXAjfVk5ueSqYn1ZTzkVfgYJbXNZ+dICaXl5aWlVmSB5BimxIl/pWFVZnwAdaXGZJFMGBskSORMFGRMLC8sKBRkDS6CxPCrBOsZNdZwypioGxhxAASZehUJVbjZGvhaFMi42BpAIIyMjEzuUAgC3gzKL3h9uqwAAAABJRU5ErkJggg==" Icons["CrossRed16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAQlBMVEUAAAAAAADEQDD0Y03tVj7nSzD3aVTqUTf2w7r1u7D1s6f0q573jHv4h3b6gnH8fmz5blnwXUb1o5f1nY/2loj2kYIsdw5nAAAAAnRSTlMAM8lDrC4AAABoSURBVBjTbY1LEoAgDENttOD/C/e/qiUyiDNmkdeXTRsLYFWz7/HhoDqg0I5RVUdk2CCYvPcTC9JwOTvmpHO5kl90BuGwBBSPLRORfTaZWaAvzrkFGWlY932FyEP+2DZIIZeavF7+5AYehgPJ4JlOTAAAAABJRU5ErkJggg==" Icons["Reset16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABBVBMVEUAAAAAAQIDBwk5b5tdl8ZGhrtCgrdGhrppocw/eKhBgrgAAABEhboAAABDg7U/e6tBgrg9daM9dKE8cp85b5tChLlCgrhBgrdChLkmSmYfPFMkRF9EhbkOGyUAAABCg7hDg7hBgrdDhLlBgrhFhbq01epJjMGAxfFtuOpos+Zlrd9WntBIibxGhrp7xvWbze6rz+d1uOOUwuKAtdpvrNdZpNdQn9RKmc5Dk8lhmsZPjL1+yfmd0/is2fWMzPWfz/B9wO1yvOx5u+aHwOWdx+SDu+JnseJzs99fq99hq92VvdteqNuOudmCsteGs9Z3q9RhptRoptFLksc5i8RFjcJUkMBRj8CQtmn4AAAAIHRSTlMAMx0D/fv59/G6qiMhBtrJu6qlpZmVj46BXE89MzIKCdU0QhUAAADISURBVBgZBcEFQgMxFEDBl926UNzlJ1mXuiMFirvf/yjMAACAl60eAlA01loPjP/0WwNQla7vWzDpwJ9tAcw/vwcW8p9p2p03YPftY3pjYH89nwxfalDqT4IVD5rOxte4b0Fux8FRGcAJRksNcv8srgJcdNITkIfezAUonxSuYwF5vHvfATCF1zgpQTWNO3/bDdDni2i0CQd5dNkZCugwjDIHmmvBVXimQU7bFxUAp5olbQFPtDZFgPpeSzxQSimlADiuKwUA8A8x1RjoBFZiQQAAAABJRU5ErkJggg==" Icons["Undo16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA0lBMVEUAAAAAAAAAAABIiQBEgABIhQBMjQBKjABCfABJigBKiwA5agA0YQBHhwBIigArTwAAAAAAAABMjQBGiADJ3mKg2QBZlABHigBDhwCq2hHH5lxFiACa0ABhnwBJigBChQCj2ACd1QCj0gCgzwCaygCQyQChxgBLjQDZ5qTQ45vI4Ia923TQ4maz12W81mDD41+w2VTC4VKqykCr0TqRujqLvS+v2Cl4qimt3iCr1R2w3xSp1BBWkg6myA2c1wCexgCTxQCEwwCPwgCawQB0sQB2qABjDDvWAAAAE3RSTlMAMyH5vc3AsKmolYV0aGcpJxAIsLU9/AAAAJ1JREFUGBlVwYcWwTAABdCXqr1Fm5AOSu299/b/vyQNTrkXiJsfXCQRYIPy10JAcnaVt/12OqcAdIcq3Pbrm2UK0MhHpu0bVgShYto2ahQ/8qZXY5CcGJSs3fAYAN4RkEq5w6x1jwC8e765nHN3PTq2ngmwXrM5riqrxoVpYH3LqhvK6cEIQPjQuLo0wHQCiYgJJW8aFNKO4h8pIPQC9d8ROIeF6scAAAAASUVORK5CYII=" Icons["LevelSelect16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAAB4i5z///9OerXxz8/joqLHQ0OomdN0AAAAAXRSTlMAQObYZgAAACVJREFUCNdjgANBCBBgEFICAhEXIMPY2NhINBUqIuQkQH01GAAArVQMUlOJoMoAAAAASUVORK5CYII=" Icons["Mouse16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAq1BMVEUAAAAAAAAAAACXoq6AjJh5g5BzfYp1fomap7GWoqwaHR9HTVQeICMAAACQnaiOm6fX2Nrh4eL////c3d7DxMb7+vv49/fs6uuYpbD6+fnLzM2Vo66MmKTw7+7n5uezu8SnrbSIlKF/jJlyfoz8/Pzf3t/U1dbS09bO0dTNzc/Gx8i9wcauuL+stLylqbCOmqaIkp6GkZ57hpR5g5F0gY+grLWQn6qPnamEj5r7gqE9AAAAEHRSTlMABjPn59rKp4JuPTk0JuXTpzPyugAAAKFJREFUeNo9y1cSgjAUQNHQm2gMBKX3XhXb/lcmmSfezzNzEUu9slS0J8SUBITGAoK0gRKSE0IHDeDUOMVzjAu3OQLMlkOzMHOdaAYIIsfNq3yDAMB/pC/f99/Z4wdpGV5YYZkC3PAZwjcAsccWC/cigJK0mNWOCoCxeF5d1Z63GACclHS2bXeJxCHocJ82mO4HtKfL62eVdfSPM3meN2H4AuxFD/FyAkagAAAAAElFTkSuQmCC" Icons["Progress16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAflBMVEUAAAAAAACTk5IAAACKiIeGhob////09PWMjIyako2OjY2Sj4zR8v+PyPHq6utNndiXko6SjoyKiop4v/KCw+/h4uNWpd1BmdtTodr7+/z39fWo1fWRzvWGxO7t//+u2/my2/h6xPj/+vaHyvX07+tssubi4uPp5eI8mNyVkIwc8xB7AAAABnRSTlMAM+8jwMBsrnnuAAAAbklEQVQY063LSRaCMBAA0RYUsTsxiRllcGS8/wVp2LHnL+u9giNkZIiMIYMlwwzoJeqPEPW7urICgUQKTRPCfxy8988SZqmkTEm67s446N61SrVO/ap14fC1MVobp2KDcNa3jcYHwwvkp50cDrAAIogHTnbEUkkAAAAASUVORK5CYII=" Icons["Sound16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABF1BMVEUAAABNUVsIZa8AAAAAAAAHCAkCK0wIbsBNWWgJbsACcMgCHzZIT1tMTVQAAAAAAAAKbr8AAADmnjpLV2cJbsAKargJZbBQXGwKbr/qoTkKbr5KWGkJYKcKbr89SVcnW4kpYZOKXyKOYB8qMTlOWmoNDxI7O0AEKUcAAAAAAABPW2sAAACks8MKbr9NVmSUo7OLm6t6jJxNWWnpnTWWprdMV2b//9aouMiWq8altcUEb8WdrLx3hJRugZBrf4//+Y5nfItleotndIRhbn5VYnL/42PsnzXpnDL4oy7/+sWerb2aqbn/+LiInLiRoLJ+kq7/+KqImKqHmKf/9Zx4hZV1g5VfeJRadJBdano7Tmo6TWn8zUT3wzXjEK8pAAAALHRSTlMAN70zLQwF9+SsY0E9LyMaFBTx7NjJxMS2sK6ln56XgHdgXVlYOzkzJyIfCjZim1kAAADKSURBVBgZBcEDYgRBAADBntVZsS/mYHm2Yzv/f0eqAAAAAAAALtPhOgAAwPEkrocCAAC2R+2vZpKHlTJszhY/we1o3EwE7CiIarXGQ+etI7XIpkrWBvPrv8dn3/elLlSszJlifje9N8YYqfdbReUpoqffz+FgMJS62kKhiF6nH71utyf1qZ2xyoqo32/EQRBIXcimLrbWWJotvt9v/BepRSW3q4o4B4f23rgdy0TgreYA16V0NDH1MA/nHgBwdbIcpl0AAAAc2wGAf5HyHXcI5SIBAAAAAElFTkSuQmCC" Icons["Number16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEUAAAAAAACQkJBoe5BWbYhddpOSkpIAAAD///+KioqMjIxXcY9ac5CNjY1Tb41OaYno8/rz9PXk4+Svxtn//vzD2+tJZ4dGZIRCX4E1VXcpSWolRmgSNlj//fnJ3++DlKhleo+SkI5SbIsvTWwAIETs9v309PXY6fTW5/Py7+7w7ezg4OKrw9drfZE/W30NLk8HKktDXdXsAAAACHRSTlMAMvLwwLCwI23EwUkAAACLSURBVBjThcxHFsIwDARQ0SexnRicYgyk0+v9T4fMC4us8mc3Txoat1Shp+pZxMSCFNbeCRk8QSHuGw85tNOIuLjZa2lLZNq276PgF7c9cBCbhzFG8kWyAydpYtZICpDswfmPcoEOVVfx6Mt9EHHRy/WlPWs/2ouLNE0LSVMV/NRPIaSUc5oMrWjUF6CZC77GdOaMAAAAAElFTkSuQmCC" Icons["2Undo16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAtFBMVEUAAAAAAAAAAAAAVokAUYAAUoMAVYkAVYUAWo0AWIwAWIsARGoAPmEAM08AAAAAAAAAWo0AVIgAt9kAVYpi1d4AaJQAUYcRvtpc1eYAstYAr9AAtMYAcZ8AT4UkwdsAuNIAtc89uc4ArsoApMkApcQAWY2k4Oab1+Nf0ONm3OJS0OGG0eAUxN90x9tUvdllvtdgyNYdvdUQvdQNucgAl8MArcEvmb06nroAhrEphaoAh6gOY5L+oCM8AAAAEXRSTlMAMyH5valnzcCwlYV0KScQCCm4P6kAAACXSURBVBgZVcEHFoIwEAXAHwR726xGaQrYe+/3v5cx4ENngEo3o8jBBy86XzeCxute6nhYxgTAZjJUMHIH1ypgiUx9MpJeAblWLZCS8KPRHUqGxmUYxSAaMgA1JWjt4iv2LwVAzfxxqJQKH/uT/3TAqySZ941BNGYLvPE8VxrunQUg1E6eQ/pgW0ATtCWRsmCISQn/RBO5N4/nDqZEsrcEAAAAAElFTkSuQmCC" Icons["Color16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAvRJREFUeNpkk09sFAUUxn8zuzOz2y3b7cKudFtKMZCgaUIRCKjBmGhqGo16knCVm9ZEYwIHT3DCIwkNnEwIJwgHCAIS/BMjGo2EcLG7aZtIS7pbut0u7D92Znbn+bq1cSMv+Q4z89733vvmewb/i+NZplzh4xZEDrUMDvhCG5qGyTcv7+XT7lwR6XrKHhnnr6NyY2VKpN2S7giCQIr5MzJ9JSTZa+Hx5wly748buaOSdZdlWdryp3wll2VCHrQOirgfKuEpRVXc6pzkvk1I7qY1vkFgdgiC1u3fR07i2j4TnOEOeRyi9LAbjB6keh/mj2A7LiOHfyAIzNsbU5hkL0x9ljyB5UR0wYuksZnhLXoZUZJtmrIdo7YTQkkoHMeJ2CT7PiF7mql1AvGPvdP/EudpEeMVBomT0t7L7CEaSoM3BFZKMQDLYXhwjv5tbxPAsXUCSxzHNrXrEy3LKF5VgmEqvNjpTpBRkhjyWAXzLP0fM9gxByOkA2qEe38borHJJlxIs8WxSDo2fU6GzZpbbldIVe/RrkVVB12h2tSXLuYLHt5iuqNBOH53kNrOHrbmNhHp0Ul7oWI8pWx77PG3Qj2KKT6uaROUY1Abwsg38Oa3rBO0Q21vrvzMjid6KS4VKC0+Ip6Isk/XcNVNBXmTgdUfiZS1KN4kGIzTePw3gRF4HYLg2crVX+/z0Uh/i9lcgf6k7msKfUt9PI10OhB195EoXcLO1mFslIXaHxT91tU1AkMxzOiX84ffGCORGtCPDSZWD7KjmWY4ChlftXNhv/8uJJOUihVWvvue3V5juxppYc1IC1RnJn+5N8PswkMyQZzMXJonS6rZI3DzilX1EZ+z+nCa4t2fuOU3Jzt1ayt0lJi/fhErTG62eXa0MMZiqE4oZlG3hJpvqPg+05UDvNbIc6denfxC1HH/htF1TnHFrvf4+YRF6gMs7B1Kv0vH9wO8EuVrJ3n9a82ZVVQ2bsHg+RhWbO6Y7L9Q41HaGLv7Gv8RYAA5OVH0igpFJAAAAABJRU5ErkJggg==" Icons["Theme16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABFFBMVEUAAAAAAABNfqkAAABUiLdMeaNUibhVibgmPVJMeaIAAAD////8//9KgrVIgrZPhbVNg7NNhLZLgrbr///3///5///z//9SsfZEfcFMgrNGf7BDfbCArQCEy/5yv/cuoPE5nedGf71CfLtFgLZCfbRNgK/1eG/1lynxPwrtAQCKzv5ywf3p8PZmufZetfRCqPE2ofEcl/ENj+0CiuwAfelVi71yn6b2moP5jYC903X0lXSwymuvyWP3XV7zhV3yc1ylwVn0k1Lyf1H1UlCqyE2duknwYEnwYkDyRT3ygzfyeTWTtjT0mjKgwC3tQC3yUiv4pinwLifxdyXwPx/wXRv0dRiLrxTzZhLuJBDuDQvwMwjyOwCMDCnvAAAAC3RSTlMAMsAj8DjnsE8/C407QQIAAADMSURBVHgBLczVQsNAEEbhSVsE/tnd7hIpCXXH3d3dnfd/D5ppvstzcahgisKM0pBhBjjwA2Wdc2aMilhfrS5Fi2ixH4a+GYS15WihUkHj8+7iGIqmsRLNlWfLqD+c7+9JqG604zhJmvXS5o6EWtufEmFpBo4UajH6Py/XZweQYDCfcP/x8qjT4UYacsZo/r463N3aDlqApbw3rvnt9OTm/ZebzuaIaETj6bZ7/9qD9rx8GhR6X93njz8oEhMWGUtismCVHlDpQHgZGfwDGk0YoyDaTbsAAAAASUVORK5CYII=" Icons["TitleProgress16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAeFBMVEUAAAAAAACQkJAAAABdd5Ndd5P///9WcI6Mi4v39PT09PTr6+zk5ebe3+BGY4SNjY37+/z8/P3R/9JU22bh4+GN8Zry9fPp6+mo9bKR9Z2E85JmepGSkI1LaIj06/Py/+3q6uvp4uiy+Luu+beS8KBZ3WtV3WZN2GBsIj57AAAABnRSTlMAM/IwxbD9z278AAAAdUlEQVQYGWXBVw7CMBBAwUcC600obumFXu5/Q/4sS5lh62Aye8DcwvAMYXhVddcZARNiHMfPd3o0TWMcmPevbWNsp+u9742Deb0k6yywSJXIImD9OfEWUHdKnALqjolXQH2diAIqGQWsZCxQWE1sAZS7TMnGHwoHCZXGVGT/AAAAAElFTkSuQmCC" Icons["LayeredTiles16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAxlBMVEUAAAAAAACEttl1uOvv+f11t+jp9/zf8fpurNmx1e4AAAAAAAC/3/f3+/2w1vL6+/v0+Pvg8frM6/rA5Pi64vjm7/ij1/Oj1vPY6fbL4POy1u3B2/G42PCqzeCEttn///9wtup0uOputelyt+pnsehksehhruf8//+QyfDl+/+azfB0vO1rtOn4/v/U8P+Yy/B8we31///X9//o9f+Bw+1jr+ju+f/Q9P/g8//J8//a8P/E6vqk3faD0faCw+2Mwu1vuuxpuezL931aAAAAH3RSTlMAM6Cv9vPx7MCxMCP9+PXx7Ozr6OPh2NjXzcfDu62h/DHlHQAAALNJREFUGNM1zlcSgzAMRVHSE9J7j4xtwPSeXve/qchmOJ9X82akKQ1CS6RRBgIlG4i6G8w3FRFQGdg4g5J5pnLvc15YyAWeEdwPA3BxboNl8ysGOnk1hXPDZAG/y7D0mpFzAUgwhHKyEfMfQJpCkfgqbMXiC+A4Ng9IyDDs4/bA86JI+B+PdfGLQ9zurFfTzowe41ofQ2+Uv103fz6I0dWQ0auf6tKO4R21jEpLU/RaRdfQHxTJGl613Fd3AAAAAElFTkSuQmCC" Icons["HelpDocument16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAllBMVEUAAAAAAAA8eKpBgrgAAABUqOT///9FhLdSqOM+gLc7frVVq+hXq+RCgrbS7ftpuORfsuRUq+LZ8//N7PvC5vqh1fWWzvOKyPF9we9suOxktetFhLhBgrhBf7M9fbI4erI0eLHT7vy33/au2vV0vO1csexvu+ZlteVZreNXrONPqOBNqOBGhbm34vqs3Ph0vu9dtO5GhbgnJpdXAAAABXRSTlMAM8GyJFpohWIAAACbSURBVBjTTcvXEoIwFEXRSJEERRN67x1s//9z5l7ijPtxzTmE6HnObBXTCSHMrdzmhjUuA/Bqb7xjo2cD+LU/nbHJR3jULT+At3h5Vh0X67atgncATlAF87GYA4A8LMNFUJlYQgcWURldVRFCXMbUxGgMYL2KnqJQ2iMkRfJbJBZAWqSmKgX4vJ3hohoyCdq+Z5Yq0yQYp78M8gX1jQ3DX3MnXgAAAABJRU5ErkJggg==" ; Asset data Assets := [] ; Create array Assets["bulldozer-push-rock"] := "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAgCAMAAACcqC7MAAAAG1BMVEUAAADAwMAAAAD//wCAgID/////AACAgACAAABa2PhcAAAAAXRSTlMAQObYZgAAAXVJREFUeNqVloGagyAMg7dcq77/E19Klyt86A6iYyjwr6SIe+FZr3vdtOMdB8/hgzjuCdGUwiIEGBHR7ElxfmMFgp8BosGUWQ77H4Kzg4AqCGCt7x6ENy0p5KjgjHYgOR7mHrF4slrntO5JPQRmDMTS0uREGFFVMBZORX28SogcJUalgoGzMkIkXQ0QDm4HQMLHDy0Y5O/NOk8jjhAxDOSMgvk7oCjG1VQUowQxqjKSpqiGghzXdRw95oxBe5BDEmWMhD2bJb3kjaZTjKLIk3J+BHhCnKcgnQTpsoN8VqZQNB1B3L9BglBCVZzqIaKM06lI/lwBS1eKR2NFuTfWchH2AmxK8WdGY4oLohVbEJPBgiSGelhs+AJZWvYKBW0gMOcIKw8ghYxkWnLmvrgVUOhT68Eqc7GwKYmCiCO9QXoi0sYeqxw31uDIKkQdTcbKo2CsQmRu+tUFg92XF2YI9l+j6YqTldlaeo1OgqbkQMff/Wtx2/YLpzkQdPoemB0AAAAASUVORK5CYII=" Assets["fig1"] := "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAANhJREFUKM+lkrENgzAQRX8CCl3YACNGYAGwRM8IMEJKOkceI9PQZYc0QcoClBZBJkd8QoIUkZJfPX1/3T/JB9LuDCevZQg6hrBnEIYhGxmUXcI/wKeyaXKjY8BfO0gKrEElhauXUmvn5Ht2Wo8dgB1gdvYOchzcU40jpNdqnBBBXh8aDTIjy1SLEcqoMrXCYjKyumgxveE2gyIYtLAUVtVgKRxhdtDMA+9PGkgVMuw1aipVYW+pFJBB5xaj0mXD7c6xz44wq8w3/fUXym4/V5jtAXCYj2Q5mxcCtmLG/B12YwAAAABJRU5ErkJggg==" Assets["fig2"] := "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgAQMAAADXDu8XAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAANtJREFUGNNF0DFOw0AQRuE36xi7Qi4onAKwb+KCgiNQRjkI2pgUFLR0FCsQ4hIuLE6CIuUO0GTJP4qUlb7iNbM7C8UB5+faXJVzhlWcZX///Aqx7ORTUcVlIx71TCMe7cCLePQdo3xp2gCjpDHUDC0b+Xg61GyxpUywIEIpicdwDssjCcwVf99EMJmq3x1bKOW9ymuSsZFj7IjBSpkUb1yYpCKfB/joAUz80rsWE39OB0H8oT2sxVe4Igbx5S5hIb52+UAtHsFoxMOMTjyI/Sx7j9WNnD7+9sfp/ANrkWbk+690aQAAAABJRU5ErkJggg==" Assets["fig3"] := "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAKZJREFUKM/NkbENwjAURE2ClCyQJTIJC2QBBqEIDQvQW6AIKTO4yihI2QEaPr5nYaoU6XKNz8/y3ZftsrooTDu242ry1xiVjpquWUUqM2MzHy5XkgcZdQ3L5GFmEN8XNeR+/tTkBOf2JHt3KujyO+sTKd8TJFSvJ+RW2RESTSJBRvKlTSRznS4Co1QBUSlEY0AYLM8syZAsQ1cm84/wCMsvtqX/0voFLXGdEKyME0wAAAAASUVORK5CYII=" Assets["fig4"] := "iVBORw0KGgoAAAANSUhEUgAAAGAAAABAAQMAAADf+uBNAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAQxJREFUKM/dkjFOw0AUROdvMHaFUhDJKQCnzSlcUHCBSJRRDoIWk4KClo5iBUJIPkMKi5MgpNwBmiz/D7GjKOnS5XWjZ49nbWOLidKFcT2uDzd7qZXNZYPJ4HDTWyGNMYJcCJY3j8/ggqlv3i1wm08KCzSpH/Y7kzVgoMlLPH1oG82oQBUql9GUQPX2sMpglDnuF8AJF8whw4A7x20eSILEioah9/tJEwBZpD/frZHXNM5o5kCi4d8E0WoLhneiBVELlBecCqt1Gwvsoe02sTk01znEhtIUgOMReB5gZoejOddyHts405stcEFyi8wCtzlBvzMiKJatgR819uJpML0Eobn62v1yR/O/rfkDRPiwwvGSWaAAAAAASUVORK5CYII=" Assets["fig5"] := "iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQMAAAD58POIAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAXhJREFUSMfMlD1OAlEUhc99gjOVUEgChTK0VCzAxCks3ACJJWEV2phxoLCwtbOYaIjJrIFiwkoMCQug04bxPkLOm4clmviVN9979547P/jBUEGVft7Pf81oFHvGYACfOMSWXIFlUtsdaQ1bUKSx8A3pLn3DXK59w1ys94zbO2ewQLwjCi9lFq+twsFocHQaDEeD8WlwQR6clDDLXxrkaIOgLEs36Zlgdf347LKMkmJmCzSSejSrGkHSaXpGWKDpGe0YT+/VLr0IaZaa0L0aQPo22YScNG7jYQ7UmGUK6WS4NzQSoJ5JmdLYFo6+FjQyQObB57JqyGtQjmlM9YgW1NiRibbVAidNjOil5YJZXnAsrq1iL7WD0YgBcaMrV22IDUcjAoyN7/YBjLkgyykSwxXmyglQswVmqd8g9AwjaHqGCKJV1UDSK+zDpoHROSzO6H6AHPr/ONz4h9/L90bDA094oAGgX1AhbVRghgcaAPoFFdJExWh4oAIA4FKpBUu15lgAAAAASUVORK5CYII=" Assets["fig6"] := "iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQMAAAD58POIAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAXJJREFUSMftlLFKw1AUhv+bWpOhSAYL7WBN1z6DQ0BBX6DgWPogco0dHIRObiJBKUKeoUPtk0ihe8cK0niuw5+cFlxqwaFftsPXe///lAQbdAU16GSd7E+MymLNqNWgCT2QTED0DtKtd+s4X1htXC6tNoZfsTaGZ7E2nlva4IConwg8lF3UtQKD0VDRBZajIfWVwQUpVFJBddmtQSor+HmeF0lPDOZX949Fl56djGRQGLYajcqGb5uhMoIJQmU0Yjy8lW9pR0jSxAsYIwaS17tVwKRxA7dj4IBdBjDNFDceDQtUU5MnNH4Glc8pjRQwY385Kxvmxc/7NAZAVQYz5kiNXCsDJrWekUPzKbs84dAU1wruUBeMRiyDIrpw0YBx5WhEgOfqF/sA+lyQ4xjW4woz4UgOdAN2qV4jUIZnECrDGETzsgHbnrg/mwZ6LTgK4/QDZJvvx/bGP31f9vv4bR8a6aKf3RgbZGtIF/3sxNjvQ/MNxxKtPa+R9iYAAAAASUVORK5CYII=" Assets["icon-ahk"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAsVBMVEXu7+/JycnOzs7MzMyxsrKzs7PDw8PGx8fP0NDX2Njt7e20tLS/v7/q6uvDw8Pg4ODGxsbGxsa0tLT29vb09PTv8PHw8fLo6eru7/Ds7e7r7O3X19fDw8Pq6+zS09Tm5ufBwcJjZGTj5OWysrOlpqecnZ1ra2tOTk4+Pj7Jysq+v8CMjY14eHlFRUVBQUE7Ozvy8/Tf4OHc3Nza2tvNzs7FxcaQkZGBgoJyc3NxcnJqamouMmu+AAAAFXRSTlPJz87OhYXR0M7KxYN1Hv3HtLKFTEuE1YDJAAAAqElEQVQYGQXBUUrDQBQAwHlvN2msFqMVEcQP738tLVRQsEWxaZp1pmzjDID1bdz2zzsZopmjrT9ysmsZfTcsUVtsWzbQ3V2B/ZQTxOUwXwOpoG6GPoB0wdPxa10KREYhv4v3DJALZRzy9cUGVHR5qJ9W5wUq+XDJn4vV+ubAksSxNZzuC2SfbRzO8Fa10tcW3X5i4O80PP62GMcZlRkOJTatnSA2R/qIfy2gON7vwGkyAAAAAElFTkSuQmCC" Assets["icon-github"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAflBMVEUAAAAUExMTEhITExMMDAwREBAUEREPDw8AAAAUEhIUExMTExMQDQ0PDw8BAQEBAQEBAQEUFBQUFBQUERETEhISEhIMDAwQEBARDQ0PDw8RDw8UExMNDQ0UEREUEREUFBQTEREAAAATEREAAAATExMODg4AAAAAAAAWFRUPDg8wS7OhAAAAKHRSTlMA99mXN8GiIAvy7sYtEf747OHepJpNQD46NPvn3LGvj4WBdnRpXBkYmAC6rwAAAI1JREFUGBkFwYVhw0AABDC9OYYwllLuZf8FK4FLXa1WVX0B6JIkSTpgSpIkSSY4pG0+XqqqfDVtDjRJbRgYqJNGl9wAzklnn9ID9CV7JTsAdilKRgBWKarkBHBKKsesn67A9Tk5mh+b7XrTcN4myUyd+aftuT2S3KEd+wVDSd6AOuMvf8k7wOe0sLx+wz9dWQ2lRTOprwAAAABJRU5ErkJggg==" Assets["icon-up"] := "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAIVBMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzLy8vNzc3Nzc3MzMxj4gTNAAAACnRSTlMAv6R/dMKunn9Wo6rAyAAAAENJREFUGNNjIAWwOCBxrBYjSaxahZDqUg1aAWMzL2IU0DKA6VBgFGCC6mJZxsAowJAF0cVZAOKwT4CqA3GAgP4cEgAA5U8Js3ndDrcAAAAASUVORK5CYII=" Assets["custom-theme"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgCAMAAAD9lVunAAAAHlBMVEVHcEz////AwMCAgIAAAAD/AAD//wCAgACAAAAAgIBYQi54AAAAAXRSTlMAQObYZgAACJRJREFUeAHEmAGa6yYMhCNpFrz3v3AfCGsEIXbS7fbNfqkDg4DyVyLuQ26lpcip9k2ly5/2Trxexf9lPSbhFLtu/J8LF6L9Iup+etFJltoirR0iJsrsl+M/9cU+9OczU6gL7L72f4DvHFFeCs22JkxTsft2kQBcVWvtB2KtwQO9kpmleO0d9q/jpYwctxx/s7/Zb1PqS183Pkk0dqIY6JkcV/69YDCoQqcPDIPZJZ4pVVFDYDdws4j4wc0HYupd0gG5T9F3QN03r7j9r6cJ4/Um/vSJnevTn4HtfQ+efdr0jX6AcN93BQWT9M7/AWAU5JFqiIeLqQrUEqrA6PYp/hfAHU18LAPWm3h1ka+tgC72N/Ptcy6+1gs/ShwBAqat2a17/7cBu8wyYDO43gGca9bmzpM5hybfYCPeRIzdTZ/Fd6tI9WgNuW9NsCH4N6GvNfjN8ff+yE4D0v6kf5Czt/tHl7rCp9z/DDBcK2B2q3pMI/v1R+2p6t1vAXZdAXb5HehPkpQtx4YjGyIN35DnqjHetQXgPuFSIqfP8KrrBLf+ebsqbOzMBztUZ+T+H3RfXY1x+FT2PwFsTf2pZvAHuyfAPv+HgG3W0g7AtoAPwHkUxy3x8iQzxs9LXe4HaTB9RsM4w86378V/+MmOqquDsShUPEmb3xynN3TEAYdmn4Bfa85g1KSc2C5V5yvSCKvmEn25iLwjDYlmjYMmX1JuKC7ekCwAT1K1uZOjF21eobUqMM87aa48Qw/0tvemQoK2aY0Mcr7S1QlC3T+1+g8KfUvYtFBw/SOKGWxWyhGAzXIGXy6iTfX1C6eINF+eclhY7LzgTnLCES86jagagNP6IkWjc9rPZn7JA+pJBTgnpk2fov9AA9v/0KCN+1fhNrrvfCXUCJ6+69l/AjwUrROwqwGkzNY7GCjHESkMzIA5rSsDrgHUT3tt82Tou6yJh7f6BkS855da/v084rkeS/S6H1Zaqoi6z//EAIgGYbez7+gq19cG0gu/zoKJAqpwP/j5wwkDAXjnB99ay5Nq7TAK8h1LKa8Akhx3fAecujvP/RpogOM1J+DUqhJtlrbZD0xqIjvfXY93dksdPkcUoRx16ETksChWliZh/rbmt9Vz6poHs6nJh51lyD99n+c3KLrfEnhwGyQ9hUHAz37wLV3u5Tcds7cAdxFwU0Hq7jsk37xOxX8BWH4E2LvLCri0rsgrwxXgMTsA76mcO/vuqX5z7x8C/hraA6a/ATwcIq6dH0mtgNcSvQJmd/9WiXcoANvLEt1FfLOfCq3I3jcE/gG4c2ujCJgJW9YM9jGElcV9Wc5flzGH6VO8JZyRbiqEqMeg+eS7Eh6A934CPND0MfsMNuN7Ln9EvQWYGTyv44BfvwDP/6ZVF3/N4EX1dPUEHNj4I2sf3y0SegG4jKjMN41nFOvzjNF92No/MljaU9B9AhQhwO4TMP0VcKAREl7vYCCXV+AC8HFs7mDnO63jgPcvnGyzFG50DklnZNnFGR8l2vERga/ABUwpe0s+KfN3M/28q2mUQdX/obOiRDf/IDlyPFii934CnJL7BIzmZVL5PZfdvGyD39F8doMX/byOLyL30qS6ApbtOxLdqUSXFTBH2JL/dG8U8/WYNavTO3Tymzl8GDQJ/NI3hu7vATb/TcDp5FfAGWAGvNzBDvjwBJ4zmICndRzwm/+r8iVCSBuy528wtQmw/FO8Gei2DcNANOIRVff/PzyA9skXljHTad04YIV3oe3sVTKpkwE4gTB/MD+bGpgwLP8mxXpg4zzVVBfpg7M22DflG6QeI3Q9haNqYJukI7iagkN/c4qW//nPcop+aJ+rI1in8M8ImcLzFJ2uo4BnMsinAqZejDECLvQ5M2AAyCP4/GeRbFzHGDI+RwVYziVV9Tz4qS54py3dDe65SHcHp+jQXxVZ/naRJZGKrKbPfS7CmA9URVa+DgHPeX11nMfq56puhdkwhui4dGDlfyj8DLhci54CeHpdRbObkzEMnZ9PfR76L30IL90j+/izAqvY8tDrNin0N9ukxFfapKZKbtoobZPSdX4csBeARwH4zmyg31vXVrxfJax8qQdhRXfqAdgbwF4udGTA/UKH4NUR3C1kdAshOoLTdQhYv3s9RYteT9GodAdMp+ihMlDbhaA0kx88UmABhp4u8VVdQvSHn094xGi1FB56vVRptr1U2Y/gBnC/VPlWkQUrg4AGUGoL8GqF5qgA935wui1ek7rM0ld9ZVlnqE670FahpV+ddmFtNoS+bzbwhqTPlSKqMSNas6H1g8uVLAhgACg6JYdD/WCk8Fd+MCT0/KkGzn7wSRjiKn3V+awR/RwifjVQkELLH6eObAdS37ULtYhin6tFVGMn9nbhN/vgutMFsJ69c/GV/MwXlR/MLTuVH7w+Ip8uHebV/954yqoHQcc54+AgjUX5QcL+bOjD/rLhbyZ9rhRRzYaA3vBvlyrzTlNVYb5II5GH5steqvWX5Nd24RUIntyAz5+mARKU/ugd/YRwSFjrpMKPvwG6JYf67pYddZOkQFI3qdnS023ZyX7w4e+uY21wVFc/WIgOHEwBr/K5H5L5rR/MOVWGq4QtnZ8H+cVxp8f5SdAcLLLAmtplGIZyAFB9e9OdAmafq4CbTXkt4GQXwuJ4WGkXqk5EK/8I/ry1Gy3nEzA7YLk+08Ccm2MAwS/pM+sm5yeGAxlcBrErJo9JM+td9IC7bbHNttp/DthvAXOTxQvAqAFPS/dnr/SzGsn6fNZtKuAjPAMmv17fBNwUUduAs/8rx4DUv446NB9H/Gl+wI2Q/Lv7sy864N7ren9a6sYzBvEBHTy9vvHqSvdqSvNqS//qSltkgVFz+on8jWP4N/WLBKfp4Uqv13dePmtfLutfTmsu0vjBwqUBtZ//f44LFg0r1fejfz3U7/C18Rta4pqH7xv2iAAAAABJRU5ErkJggg==" ; Background colors data BackgroundColors := [] ; Create array BackgroundColors["Aqua"] := "00FFFF" ; (0,255,255) BackgroundColors["Black"] := "000000" ; (0,0,0) BackgroundColors["Blue"] := "0000FF" ; (0,0,255) BackgroundColors["Fuchsia"] := "FF00FF" ; (255,0,255) BackgroundColors["Gray"] := "808080" ; (128,128,128) BackgroundColors["Green"] := "008000" ; (0,128,0) BackgroundColors["Lime"] := "00FF00" ; (0,255,0) BackgroundColors["Maroon"] := "800000" ; (128,0,0) BackgroundColors["Navy"] := "000080" ; (0,0,128) BackgroundColors["Olive"] := "808000" ; (128,128,0) [Default] BackgroundColors["Purple"] := "800080" ; (128,0,128) BackgroundColors["Red"] := "FF0000" ; (255,0,0) BackgroundColors["Silver"] := "C0C0C0" ; (192,192,192) BackgroundColors["Teal"] := "008080" ; (0,128,128) BackgroundColors["White"] := "FFFFFF" ; (255,255,255) BackgroundColors["Yellow"] := "FFFF00" ; (255,255,0) ; GDI+ Startup hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll") ; Load module VarSetCapacity(GdiplusStartupInput, (A_PtrSize = 8 ? 24 : 16), 0) ; GdiplusStartupInput structure NumPut(1, GdiplusStartupInput, 0, "UInt") ; GdiplusVersion DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &GdiplusStartupInput, "Ptr", 0) ; Initialize GDI+ ; Midi Startup hMidi := DllCall("Kernel32.dll\LoadLibrary", "Str", "Winmm.dll") VarSetCapacity(strh_MIDIOut, (A_PtrSize = 8 ? 24 : 16), 0) DllCall("Winmm.dll\midiOutOpen", "UInt", &strh_MIDIOut, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0, "UInt") h_MIDIOut := NumGet(strh_MIDIOut) MidiVolume := (100 / 100) * 0xFFFF DllCall("Winmm.dll\midiOutSetVolume", "UInt", h_MIDIOut, "UInt", MidiVolume | MidiVolume << 16) ; Create HICON from Base64 encoded data strings pIcon16 := GdipCreateFromBase64(Icons["Bulldozer16"], 1) ; 16x16 pIcon32 := GdipCreateFromBase64(Icons["Bulldozer32"], 1) ; 32x32 pTickGreen16 := GdipCreateFromBase64(Icons["TickGreen16"], 1) ; 16x16 pCrossPink16 := GdipCreateFromBase64(Icons["CrossPink16"], 1) ; 16x16 pJoystick16 := GdipCreateFromBase64(Icons["Joystick16"], 1) ; 16x16 pColorAqua16 := GdipCreateFromBase64(Icons["ColorAqua16"], 1) ; 16x16 pColorBlack16 := GdipCreateFromBase64(Icons["ColorBlack16"], 1) ; 16x16 pColorBlue16 := GdipCreateFromBase64(Icons["ColorBlue16"], 1) ; 16x16 pColorFuchsia16 := GdipCreateFromBase64(Icons["ColorFuchsia16"], 1) ; 16x16 pColorGray16 := GdipCreateFromBase64(Icons["ColorGray16"], 1) ; 16x16 pColorGreen16 := GdipCreateFromBase64(Icons["ColorGreen16"], 1) ; 16x16 pColorLime16 := GdipCreateFromBase64(Icons["ColorLime16"], 1) ; 16x16 pColorMaroon16 := GdipCreateFromBase64(Icons["ColorMaroon16"], 1) ; 16x16 pColorNavy16 := GdipCreateFromBase64(Icons["ColorNavy16"], 1) ; 16x16 pColorOlive16 := GdipCreateFromBase64(Icons["ColorOlive16"], 1) ; 16x16 pColorPurple16 := GdipCreateFromBase64(Icons["ColorPurple16"], 1) ; 16x16 pColorRed16 := GdipCreateFromBase64(Icons["ColorRed16"], 1) ; 16x16 pColorSilver16 := GdipCreateFromBase64(Icons["ColorSilver16"], 1) ; 16x16 pColorTeal16 := GdipCreateFromBase64(Icons["ColorTeal16"], 1) ; 16x16 pColorWhite16 := GdipCreateFromBase64(Icons["ColorWhite16"], 1) ; 16x16 pColorYellow16 := GdipCreateFromBase64(Icons["ColorYellow16"], 1) ; 16x16 pColorCustom16 := GdipCreateFromBase64(Icons["ColorCustom16"], 1) ; 16x16 pThemeColor16 := GdipCreateFromBase64(Icons["ThemeColor16"], 1) ; 16x16 pThemeMonochrome16 := GdipCreateFromBase64(Icons["ThemeMonochrome16"], 1) ; 16x16 pThemeCustom16 := GdipCreateFromBase64(Icons["ThemeCustom16"], 1) ; 16x16 pAbout16 := GdipCreateFromBase64(Icons["About16"], 1) ; 16x16 pWebsite16 := GdipCreateFromBase64(Icons["Website16"], 1) ; 16x16 pCrossRed16 := GdipCreateFromBase64(Icons["CrossRed16"], 1) ; 16x16 pReset16 := GdipCreateFromBase64(Icons["Reset16"], 1) ; 16x16 pUndo16 := GdipCreateFromBase64(Icons["Undo16"], 1) ; 16x16 pLevelSelect16 := GdipCreateFromBase64(Icons["LevelSelect16"], 1) ; 16x16 pMouse16 := GdipCreateFromBase64(Icons["Mouse16"], 1) ; 16x16 pProgress16 := GdipCreateFromBase64(Icons["Progress16"], 1) ; 16x16 pSound16 := GdipCreateFromBase64(Icons["Sound16"], 1) ; 16x16 pNumber16 := GdipCreateFromBase64(Icons["Number16"], 1) ; 16x16 p2Undo16 := GdipCreateFromBase64(Icons["2Undo16"], 1) ; 16x16 pColor16 := GdipCreateFromBase64(Icons["Color16"], 1) ; 16x16 pTheme16 := GdipCreateFromBase64(Icons["Theme16"], 1) ; 16x16 pTitleProgress16 := GdipCreateFromBase64(Icons["TitleProgress16"], 1) ; 16x16 pLayeredTiles16 := GdipCreateFromBase64(Icons["LayeredTiles16"], 1) ; 16x16 pHelpDocument16 := GdipCreateFromBase64(Icons["HelpDocument16"], 1) ; 16x16 ; Create BITMAP from Base64 encoded data strings pFontmapPink := GdipCreateFromBase64(Fontmaps["Pink"]) ; 240x24 pFontmapGreen := GdipCreateFromBase64(Fontmaps["Green"]) ; 240x24 pDocsbulldozerpushrock := GdipCreateFromBase64(Assets["bulldozer-push-rock"]) ; 68x32 pDocsfig1 := GdipCreateFromBase64(Assets["fig1"]) ; 64x64 pDocsfig2 := GdipCreateFromBase64(Assets["fig2"]) ; 96x32 pDocsfig3 := GdipCreateFromBase64(Assets["fig3"]) ; 64x64 pDocsfig4 := GdipCreateFromBase64(Assets["fig4"]) ; 96x64 pDocsfig5 := GdipCreateFromBase64(Assets["fig5"]) ; 128x128 pDocsfig6 := GdipCreateFromBase64(Assets["fig6"]) ; 128x128 pDocsiconahk := GdipCreateFromBase64(Assets["icon-ahk"]) ; 16x16 pDocsicongithub := GdipCreateFromBase64(Assets["icon-github"]) ; 16x16 pDocsiconup := GdipCreateFromBase64(Assets["icon-up"]) ; 24x24 pDocscustomtheme := GdipCreateFromBase64(Assets["custom-theme"]) ; 480x32 ; Create HBITMAP from Base64 encoded data strings pIcon16BMP := GdipCreateFromBase64(Icons["Bulldozer16"], 2) ; 16x16 pIcon32BMP := GdipCreateFromBase64(Icons["Bulldozer32"], 2) ; 32x32 ; Create a Bitmap object DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", (GuiWidth * DPI), "Int", (GuiHeight * DPI), "Int", 0, "Int", 0x26200A, "Ptr", 0, "PtrP", pBackgroundImage) ; Create a Graphics object associated with pBackgroundImage DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBackgroundImage, "PtrP", pBackgroundGraphics) ; Set the rendering quality of the pBackgroundGraphics Graphics object DllCall("Gdiplus.dll\GdipSetSmoothingMode", "Ptr", pBackgroundGraphics, "Int", 3) ; None ; Set the interpolation mode of the pBackgroundGraphics Graphics object DllCall("Gdiplus.dll\GdipSetInterpolationMode", "Ptr", pBackgroundGraphics, "Int", 5) ; NearestNeighbor ; Create a SolidBrush object for the background color of the game DllCall("Gdiplus.dll\GdipCreateSolidFill", "UInt", "0xFF" BackgroundColor, "PtrP", pBackgroundBrush) ; HTML contents of the documentation file DocHTML := "Bulldozer Documentation

Bulldozer

Index


Introduction

Bulldozer, developed for AutoHotkey by Weston Campbell, is a recreation of the original Bulldozer game series created by John 'FlyMan' Hattan (The Code Zone).


Bulldozer 1 first appeared in 1994 on the CD-ROM game compilation ""24 Games for Windows 95"" developed by The Code Zone for Expert Software, Inc. Bulldozer 2 became available in 2000 on ""Arcade Magic"", also developed for Expert Software, Inc. Bulldozer 1 & Bulldozer 2 were re-released in 2003 on ""Blazing Games"", a compilation of fifty games developed for Cosmi Europe, Ltd. Bulldozer 3 was completed in 2002, but remained unavailable until the 2008 release of Bulldozer which included all 180 levels from the Bulldozer trilogy. The 2008 version was created using Adobe Flash and is available on a variety of desktop and mobile platforms. Bulldozer is a variation of the popular Sokoban puzzle game.


All credit goes to John Hattan for the original idea of the Bulldozer game series. This project was an exercise in GDI+ and string manipulation, and is intended to pay tribute to the game I played in my youth.




Website Links:

Github: https://github.com/westoncampbell/BulldozerAHK

AutoHotkey: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=50139


Game Objective

The object of Bulldozer is to push each rock on to a target.


Movement

Move the bulldozer using the arrow keys, or WASD keys, on your keyboard. The bulldozer can move horizontally and vertically.

The bulldozer will not move if one of the following three conditions are true:

(1) You are trying to push multiple rocks...

You can only push one rock at a time!


(2) You are pushing against a wall. . .

The bulldozer can't move through walls.


(3) You are pushing a rock against a wall. . .

Be careful about pushing rocks against walls. The rock might become stuck, and you'll be forced to restart the level.

However, it may still be possible to reach the target depending on its position.


Completing a Level

Progress to the next level by moving all of the rocks on to the targets. Each level will have the same number of rocks as targets.


Hints

Carefully plan your moves. It's easy to get stuck which may force you to restart the level.

A rock is not locked into position once it is placed on a target.


Menubar

Game

Restart Level

Reset the level, moving all of the objects to their original starting positions.

Level Select

Show the level selection screen, allowing navigation to any of the included 180 levels.

Undo Last Move

Reset all objects from your recent move to their previous positions.

Exit

Completely close the game.


View

Layered Tiles

Toggle drawing of objects on top of the background elements for custom themes using transparency.

Depending on the custom theme, ""Layered Tiles"" may improve the appearance of the tiles.


Options

Background Color

Set the color of the background behind the game objects by choosing from one of the 16 presets or using the custom color picker.

Theme

Change the appearance of the game objects by choosing the ""Color"" or ""Monochrome"" options, or using a custom theme by selecting an external PNG image file.

Sound Effects

Toggle sound effects.

Level Number

Toggle the display of the current level number overlayed on the top-right of the game screen.

Unlimited Undo

Toggle the allowance of multiple consecutive undo actions.

Mouse Movement

Toggle the movement of the bulldozer using mouse controls.

Titlebar Progress

Toggle the display [Text] of the current level progress in the titlebar of the game window.

Taskbar Progress

Toggle the display [ProgressBar] of the current level progress in the game taskbar item.


Help

Website...

Open the game website in the default web browser.

Documentation...

Open the game documentation file.

About Bulldozer

Open the 'About' screen, displaying information related to the current version of the game.


Custom Themes

Bulldozer supports loading custom themes from an external 480x32 PNG image file.

Each 32x32 region represents one of the 15 tiles in the game.

Use an image editor to create a new theme, or choose from any of the available themes from the Bulldozer website.


Hotkeys

Several actions in the game can be triggered using a hotkey. See below for a complete list of active hotkeys:

DescriptionAreaHotkey
Restart LevelGameF2
Show 'Level Select'Game, AboutF3
Save ScreenshotGameF12
Load Previous LevelGamePgUp
Load Next LevelGamePgDn
Hide ScreenGameEsc
Move UpGame, W, Left Mouse
Move LeftGame, A, Left Mouse
Move DownGame, S, Left Mouse
Move RightGame, D, Left Mouse
Exit GameGame, Level Select, About BulldozerAlt+F4
Minimize GameGame, Level Select, About BulldozerSpace
Default ActionAbout Bulldozer, Level SelectEnter
Show 'About Bulldozer'Game, Level SelectF1
Select Previous LevelLevel Select,
Select Next LevelLevel Select,
Select Previous Level (x5)Level SelectPgUp
Select Next Level (x5)Level SelectPgDn
Select First LevelLevel SelectHome
Select Last LevelLevel SelectEnd
Load Selected LevelLevel SelectEnter

" ; Set tray icon options Menu, Tray, Icon, % "HICON:*" pIcon16 ; Tray icon Menu, Tray, Tip, Bulldozer ; TrayTip Text Menu, Tray, NoStandard ; Remove non-custom menu items Menu, Tray, Add, &Hide Icon, DisableTrayIcon ; Exit script ;Menu, Tray, Add, E&xit, MenuHandler ; Exit script } OnUnload(ExitReason, ExitCode) { Global ; Assume-global mode ; Release resources used by the Image objects DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pTheme) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pFontmapPink) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pFontmapGreen) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBackgroundImage) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pIcon32BMP) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsbulldozerpushrock) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig1) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig2) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig3) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig4) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig5) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig6) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsiconahk) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsicongithub) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsiconup) DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocscustomtheme) ; Delete Graphics objects DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pBackgroundGraphics) DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pControlGraphics) ; Delete Brush objects DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBackgroundBrush) ; Clean up resources used by GDI+ DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken) ; Free module from memory DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip) ; Destroy icons and free memory DllCall("User32.dll\DestroyIcon", "Ptr", pIcon16) DllCall("User32.dll\DestroyIcon", "Ptr", pIcon32) DllCall("User32.dll\DestroyIcon", "Ptr", pTickGreen16) DllCall("User32.dll\DestroyIcon", "Ptr", pCrossPink16) DllCall("User32.dll\DestroyIcon", "Ptr", pJoystick16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorAqua16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorBlack16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorBlue16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorFuchsia16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorGray16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorGreen16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorLime16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorMaroon16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorNavy16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorOlive16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorPurple16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorRed16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorSilver16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorTeal16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorWhite16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorYellow16) DllCall("User32.dll\DestroyIcon", "Ptr", pColorCustom16) DllCall("User32.dll\DestroyIcon", "Ptr", pThemeMonochrome16) DllCall("User32.dll\DestroyIcon", "Ptr", pThemeCustom16) DllCall("User32.dll\DestroyIcon", "Ptr", pAbout16) DllCall("User32.dll\DestroyIcon", "Ptr", pWebsite16) DllCall("User32.dll\DestroyIcon", "Ptr", pCrossRed16) DllCall("User32.dll\DestroyIcon", "Ptr", pReset16) DllCall("User32.dll\DestroyIcon", "Ptr", pUndo16) DllCall("User32.dll\DestroyIcon", "Ptr", pLevelSelect16) DllCall("User32.dll\DestroyIcon", "Ptr", pMouse16) DllCall("User32.dll\DestroyIcon", "Ptr", pProgress16) DllCall("User32.dll\DestroyIcon", "Ptr", pSound16) DllCall("User32.dll\DestroyIcon", "Ptr", pNumber16) DllCall("User32.dll\DestroyIcon", "Ptr", p2Undo16) DllCall("User32.dll\DestroyIcon", "Ptr", pColor16) DllCall("User32.dll\DestroyIcon", "Ptr", pTheme16) DllCall("User32.dll\DestroyIcon", "Ptr", pTitleProgress16) DllCall("User32.dll\DestroyIcon", "Ptr", pLayeredTiles16) DllCall("User32.dll\DestroyIcon", "Ptr", pHelpDocument16) ; Free module from memory DllCall("Kernel32.dll\FreeLibrary", "UInt", hMidi) ; Midi Shutdown DllCall("Winmm.dll\midiOutClose", "UInt", h_MIDIOut) ; Write values to INI file IniWrite, % TitlebarProgress, Bulldozer.ini, Options, TitlebarProgress IniWrite, % TaskbarProgress, Bulldozer.ini, Options, TaskbarProgress IniWrite, % BackgroundColor, Bulldozer.ini, Options, BackgroundColor IniWrite, % Theme, Bulldozer.ini, Options, Theme IniWrite, % UnlimitedUndo, Bulldozer.ini, Options, UnlimitedUndo IniWrite, % Sound, Bulldozer.ini, Options, Sound IniWrite, % LevelNumber, Bulldozer.ini, Options, LevelNumber IniWrite, % MouseMovement, Bulldozer.ini, Options, MouseMovement IniWrite, % LevelNum, Bulldozer.ini, Options, LastLevel IniWrite, % LayeredTiles, Bulldozer.ini, Options, LayeredTiles For Index, Color In UserColors { IniWrite, % Format("{:06X}", Color), Bulldozer.ini, Options, % "UserColor" A_Index } StringSolved := ST_Glue(Solved, "") ; Run-length encoded solved level data IniWrite, % RLE_Encode(StringSolved), Bulldozer.ini, Options, Solved } ThemeSet(Tileset, Update := 0) { Global ; Assume-global mode ThemeMatch := "" ; Initialize variable For ThemeName, ThemeString In Themes { If (ThemeName = (Theme := Tileset)) { Menu, ThemesMenu, Check, % (ThemeMatch := ThemeName) } Else { If (!FileExist(Tileset)) { Menu, ThemesMenu, Check, Color } Menu, ThemesMenu, Uncheck, % ThemeName } } pTheme := (FileExist(Tileset) ? GdipCreateFromPNG(Tileset) : GdipCreateFromBase64(Themes[(ThemeMatch ? ThemeMatch : (Theme := "Color"))])) Menu, ThemesMenu, % (!ThemeMatch && FileExist(Tileset) ? "Check" : "Uncheck"), &Custom... If (Update) { BackgroundLoad(TempMap) } } BackgroundColorSet(ColorHex) { Global ; Assume-global mode ColorMatch := "" ; Initialize variable ; Set brush color DllCall("Gdiplus.dll\GdipCreateSolidFill", "UInt", "0xFF" (BackgroundColor := ColorHex), "PtrP", pBackgroundBrush) BackgroundLoad(TempMap) ; Generate background with new color For ColorName, ColorCode In BackgroundColors { If (ColorCode = BackgroundColor) { Menu, ColorsMenu, Check, % (ColorMatch := ColorName) } Else { Menu, ColorsMenu, Uncheck, % ColorName } } Menu, ColorsMenu, % (!ColorMatch ? "Check" : "Uncheck"), &Custom... } GuiCreate() { Global ; Assume-global mode Static Init := GuiCreate() ; Call function ; Menubar > Game ----------------------------------------------------------- Menu, GameMenu, Add, &Restart Level`tF2, MenuHandler Menu, GameMenu, Add, &Level Select`tF3, MenuHandler Menu, GameMenu, Add ; Separator Menu, GameMenu, Add, &Undo Last Move`tCtrl+Z, MenuHandler Menu, GameMenu, Add ; Separator Menu, GameMenu, Add, E&xit`tAlt+F4, MenuHandler Menu, GameMenu, Disable, &Undo Last Move`tCtrl+Z Menu, GameMenu, Icon, &Restart Level`tF2, % "HICON:*" pReset16 Menu, GameMenu, Icon, &Level Select`tF3, % "HICON:*" pLevelSelect16 Menu, GameMenu, Icon, &Undo Last Move`tCtrl+Z, % "HICON:*" pUndo16 Menu, GameMenu, Icon, E&xit`tAlt+F4, % "HICON:*" pCrossRed16 ; Menubar > View ----------------------------------------------------------- Menu, ViewMenu, Add, &Layered Tiles, MenuHandler Menu, ViewMenu, % (!LayeredTiles ? "Uncheck" : "Check"), &Layered Tiles Menu, ViewMenu, Icon, &Layered Tiles, % "HICON:*" pLayeredTiles16 ; Menubar > Options > Background Color ------------------------------------- ColorMatch := "" ; Initialize variable For ColorName, ColorCode In BackgroundColors { Menu, ColorsMenu, Add, % ColorName, MenuHandler Menu, ColorsMenu, Icon, % ColorName, % "HICON:*" pColor%ColorName%16 If (ColorCode = BackgroundColor) { Menu, ColorsMenu, Check, % (ColorMatch := ColorName) } } Menu, ColorsMenu, Add ; Separator Menu, ColorsMenu, Add, &Custom..., MenuHandler Menu, ColorsMenu, % (ColorMatch ? "Uncheck" : "Check"), &Custom... Menu, ColorsMenu, Icon, &Custom..., % "HICON:*" pColorCustom16 ; Menubar > Options > Theme ------------------------------------------------ ThemeMatch := "" ; Initialize variable For ThemeName, ThemeString In Themes { Menu, ThemesMenu, Add, % ThemeName, MenuHandler Menu, ThemesMenu, Icon, % ThemeName, % "HICON:*" pTheme%ThemeName%16 If (ThemeName = Theme) { Menu, ThemesMenu, Check, % (ThemeMatch := ThemeName) } } Menu, ThemesMenu, Add ; Separator Menu, ThemesMenu, Add, &Custom..., MenuHandler Menu, ThemesMenu, % (ThemeMatch ? "Uncheck" : "Check"), &Custom... Menu, ThemesMenu, Icon, &Custom..., % "HICON:*" pThemeCustom16 ; Menubar > Options -------------------------------------------------------- Menu, OptionsMenu, Add, &Background Color, :ColorsMenu Menu, OptionsMenu, Add, &Theme, :ThemesMenu Menu, OptionsMenu, Add ; Separator Menu, OptionsMenu, Add, Sound Effects, MenuHandler Menu, OptionsMenu, Add, Level Number, MenuHandler Menu, OptionsMenu, Add, Unlimited Undo, MenuHandler Menu, OptionsMenu, Add, Mouse Movement, MenuHandler Menu, OptionsMenu, Add, Titlebar Progress, MenuHandler Menu, OptionsMenu, Add, Taskbar Progress, MenuHandler Menu, OptionsMenu, % (Sound ? "Check" : "Uncheck"), Sound Effects Menu, OptionsMenu, % (LevelNumber ? "Check" : "Uncheck"), Level Number Menu, OptionsMenu, % (UnlimitedUndo ? "Check" : "Uncheck"), Unlimited Undo Menu, OptionsMenu, % (MouseMovement ? "Check" : "Uncheck"), Mouse Movement Menu, OptionsMenu, % (TitlebarProgress ? "Check" : "Uncheck"), Titlebar Progress Menu, OptionsMenu, % (TaskbarProgress ? "Check" : "Uncheck"), Taskbar Progress Menu, OptionsMenu, Icon, &Background Color, % "HICON:*" pColor16 Menu, OptionsMenu, Icon, &Theme, % "HICON:*" pTheme16 Menu, OptionsMenu, Icon, Sound Effects, % "HICON:*" pSound16 Menu, OptionsMenu, Icon, Level Number, % "HICON:*" pNumber16 Menu, OptionsMenu, Icon, Unlimited Undo, % "HICON:*" p2Undo16 Menu, OptionsMenu, Icon, Mouse Movement, % "HICON:*" pMouse16 Menu, OptionsMenu, Icon, Titlebar Progress, % "HICON:*" pTitleProgress16 Menu, OptionsMenu, Icon, Taskbar Progress, % "HICON:*" pProgress16 ; Menubar > Help ----------------------------------------------------------- Menu, HelpMenu, Add, &Website..., MenuHandler Menu, HelpMenu, Add, &Documentation..., MenuHandler Menu, HelpMenu, Add ; Separator Menu, HelpMenu, Add, &About Bulldozer`tF1, MenuHandler Menu, HelpMenu, Icon, &Website..., % "HICON:*" pWebsite16 Menu, HelpMenu, Icon, &Documentation..., % "HICON:*" pHelpDocument16 Menu, HelpMenu, Icon, &About Bulldozer`tF1, % "HICON:*" pAbout16 ; Menubar ------------------------------------------------------------------ Menu, Menubar, Add, &Game, :GameMenu Menu, Menubar, Add, &View, :ViewMenu Menu, Menubar, Add, &Options, :OptionsMenu Menu, Menubar, Add, &Help, :HelpMenu ; Parent ------------------------------------------------------------------- Gui, Parent: Menu, Menubar Gui, Parent: +LastFound +OwnDialogs -Resize +HwndhBulldozer Gui, Parent: Margin, 0, 0 Gui, Parent: Color, % GuiBGCol Gui, Parent: Add, Edit, x0 y0 w0 h0 0x800 vCatch ; Catch keypresses to avoid dinging ; About -------------------------------------------------------------------- AboutText := "Bulldozer is a clone of the original Bulldozer game series created by John 'FlyMan' Hattan (The Code Zone).`n`nThe object of Bulldozer is to push all of the rocks to the targets. Move the bulldozer using the keyboard's WASD or arrow keys. The bulldozer can only push one rock at a time, and it cannot pull rocks. You will advance to the next level when each rock has been placed on a target.`n`nDeveloped for AutoHotkey by:`nWeston Campbell " Gui, About: +ParentParent +HWNDhAbout -Caption -Border Gui, About: Margin, 0, 0 Gui, About: Color, % GuiBGCol Gui, About: Add, Picture, x20 y20 w32 h32, % "HBITMAP:*" pIcon32BMP Gui, About: Font, c404040 S18 Bold, Arial Gui, About: Add, Text, % "x72 yp w" GuiWidth - 144 " h32 0x201", % App_Name Gui, About: Font, c404040 S11 Norm, Arial Gui, About: Add, Text, % "x72 y+0 w" GuiWidth - 144 " h32 0x201", % "Revision " App_Version " (" App_Date ")" Gui, About: Add, Edit, % "x20 y+10 w" GuiWidth - 40 " h" GuiHeight - 178 " 0x800 +Multi -TabStop", % AboutText Gui, About: Font ; Reset font options Gui, About: Add, Text, % "x-20 y" GuiHeight - 64 " w" GuiWidth + 40 " h1 0x10" ; Divider Gui, About: Add, Button, % "x" GuiWidth - 100 " y" GuiHeight - 44 " w80 h24 vAboutOK gControlHandler +Default", OK ; Level Select ------------------------------------------------------------- Menu, LevelSelectMenu, Add, &Play, MenuHandler Menu, LevelSelectMenu, Add ; Separator Menu, LevelSelectMenu, Add, &Solved, MenuHandler Menu, LevelSelectMenu, Add, &Unsolved, MenuHandler Menu, LevelSelectMenu, Icon, &Play, % "HICON:*" pJoystick16 Menu, LevelSelectMenu, Icon, &Solved, % "HICON:*" pTickGreen16 Menu, LevelSelectMenu, Icon, &Unsolved, % "HICON:*" pCrossPink16 Gui, LevelSelect: +ParentParent +HWNDhLevelSelect -Caption -Border Gui, LevelSelect: Margin, 0, 0 Gui, LevelSelect: Color, % GuiBGCol Gui, LevelSelect: Add, Listview, % "x10 y10 w" GuiWidth - 20 " h" GuiHeight - 84 " hwndHLV vVLV List -Multi LV0x10000 LV0x400 gControlHandler AltSubmit", Col1 Gui, LevelSelect: Default HIML := IL_Create(2) IL_Add(HIML, "HICON:*" pTickGreen16) IL_Add(HIML, "HICON:*" pCrossPink16) LV_SetImageList(HIML) Loop, 180 { LV_Add(Solved[A_Index] = "S" ? "Icon1" : "Icon2", "Level " A_Index) } Gui, LevelSelect: Font ; Reset font options Gui, LevelSelect: Add, Text, % "x-20 y" GuiHeight - 64 " w" GuiWidth + 40 " h1 0x10" ; Divider Gui, LevelSelect: Font, cA9A9A9 Italic, Arial Gui, LevelSelect: Add, Text, % "x" 20 " y" GuiHeight - 44 " w260 h24 0x200", Right-click level for more options! Gui, LevelSelect: Font Gui, LevelSelect: Add, Button, % "x" GuiWidth - 100 " y" GuiHeight - 44 " w80 h24 vLevelSelectCancel gControlHandler +Default", Cancel ; Game --------------------------------------------------------------------- Gui, Game: +ParentParent +HWNDhGame -Caption -Border Gui, Game: Margin, 0, 0 Gui, Game: Color, % GuiBGCol Gui, Game: Add, Picture, % "x" 0 " y" 0 " w" (GuiWidth * DPI) " h" (GuiHeight * DPI) " vGameImage HwndhBackground 0xE" ; Background image ; Get pointer to control graphics image DllCall("Gdiplus.dll\GdipCreateFromHWND", "Ptr", hBackground, "PtrP", pControlGraphics) SubclassControl(hBackground, "BgSubclassProc") ; Subclass static image ThemeSet(Theme) MapSet(LastLevel) Gui, LevelSelect: Show, Hide x0 y0 w%GuiWidth% h%GuiHeight% Gui, About: Show, Hide x0 y0 w%GuiWidth% h%GuiHeight% Gui, Game: Show, x0 y0 w%GuiWidth% h%GuiHeight% Gui, Parent: Show, Center w%GuiWidth% h%GuiHeight%, % "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : "") ; WM_SETICON - Set icons (TitleBar, Taskbar, ...) SendMessage, 0x80, 0, pIcon16,, ahk_id %hBulldozer% ; ICON_SMALL (16x16) SendMessage, 0x80, 1, pIcon32,, ahk_id %hBulldozer% ; ICON_BIG (32x32) } MenuItemCheck() { Global ; Assume-global mode ; Enable/Disable 'Undo Last Move' menu item Menu, GameMenu, % (UndoArray.MaxIndex() ? "Enable" : "Disable"), &Undo Last Move`tCtrl+Z UndoState := (UndoArray.MaxIndex() ? 1 : 0) } LevelSelectGuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y) { If (A_GuiControl = "VLV") { If (LV_GetNext() <> "0") { Menu, LevelSelectMenu, Show } } } UpdateLV() { Global ; Assume-global mode Gui, LevelSelect: Default Loop, 180 { LV_Modify(A_Index, (Solved[A_Index] = "S" ? "Icon1" : "Icon2")) } LV_Modify(LevelNum, "Select Vis") } ParentGuiClose(GuiHwnd) { Global ; Assume-global mode If (GuiHwnd = hBulldozer) { ExitApp ; Terminate the script unconditionally } } MenuHandler(ItemName, ItemPos, MenuName) { Global ; Assume-global mode If (MenuName = "GameMenu") { If (InStr(ItemName, "&Restart Level")) { LevelClearCheck(500) ; HOTFIX: Levels where bulldozer begins on target tile If (LevelNum = "64" || LevelNum = "127") { Maps[LevelNum] := MapBackup ; Replace level data } MapSet(LevelNum) ShowHideWindow() } Else If (InStr(ItemName, "&Level Select")) { UpdateLV() ShowHideWindow("LevelSelect", True) } Else If (InStr(ItemName, "&Undo Last Move")) { UndoMove() } Else If (InStr(ItemName, "E&xit")) { ExitApp ; Terminate the script unconditionally } } Else If (MenuName = "ViewMenu") { If (InStr(ItemName, "&Layered Tiles")) { LayeredTiles := !LayeredTiles Menu, ViewMenu, % (LayeredTiles ? "Check" : "Uncheck"), &Layered Tiles BackgroundLoad(TempMap) } } Else If (MenuName = "ColorsMenu") { If (InStr(ItemName, "&Custom...")) { BackgroundColorSet(ChooseColor("0x" BackgroundColor, hBulldozer, UserColors*)) } Else { BackgroundColorSet(BackgroundColors[ItemName]) } } Else If (MenuName = "ThemesMenu") { If (InStr(ItemName, "&Custom...")) { ;Gui, Parent: +OwnDialogs FileSelectFile, CustomTheme, 3,, Select image..., PNG (*.png) If (ErrorLevel) { return } ThemeSet(CustomTheme, true) } Else { ThemeSet(ItemName, true) } } Else If (MenuName = "OptionsMenu") { If (InStr(ItemName, "Level Number")) { LevelNumber := !LevelNumber Menu, OptionsMenu, % (LevelNumber ? "Check" : "Uncheck"), Level Number BackgroundLoad(TempMap) } Else If (InStr(ItemName, "Sound Effects")) { Sound := !Sound Menu, OptionsMenu, % (Sound ? "Check" : "Uncheck"), Sound Effects } Else If (InStr(ItemName, "Unlimited Undo")) { UnlimitedUndo := !UnlimitedUndo LastUndo := UndoArray.Pop() UndoArray := [] UndoArray.Push(LastUndo) Menu, OptionsMenu, % (UnlimitedUndo ? "Check" : "Uncheck"), Unlimited Undo } Else If (InStr(ItemName, "Mouse Movement")) { MouseMovement := !MouseMovement Menu, OptionsMenu, % (MouseMovement ? "Check" : "Uncheck"), Mouse Movement } Else If (InStr(ItemName, "Taskbar Progress")) { TaskbarProgress := !TaskbarProgress Menu, OptionsMenu, % (TaskbarProgress ? "Check" : "Uncheck"), Taskbar Progress LevelClearCheck(500) } Else If (InStr(ItemName, "Titlebar Progress")) { TitlebarProgress := !TitlebarProgress Menu, OptionsMenu, % (TitlebarProgress ? "Check" : "Uncheck"), Titlebar Progress LevelClearCheck(500) } } Else If (MenuName = "HelpMenu") { If (InStr(ItemName, "&About Bulldozer")) { ShowHideWindow("About", True) } Else If (InStr(ItemName, "&Website...")) { Run, https://autohotkey.com/boards/viewtopic.php?f=6&t=50139 } Else If (InStr(ItemName, "&Documentation...")) { If (GetKeyState("Ctrl", "P")) { Try { Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md } return } If (!InStr(FileExist("BulldozerDocs"), "D")) { BuildDocs() } Else { CheckDocs() } Try { Run, BulldozerDocs\index.html } Catch { Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md } } } Else If (MenuName = "Tray") { If (InStr(ItemName, "E&xit")) { ExitApp ; Terminate the script unconditionally } } Else If (MenuName = "LevelSelectMenu") { Gui, LevelSelect: Default LVSel := LV_GetNext() If (InStr(ItemName, "&Solved")) { If (Solved[LVSel] = "S") { return } Solved[LVSel] := "S" } Else If (InStr(ItemName, "&Unsolved")) { If (Solved[LVSel] = "U") { return } Solved[LVSel] := "U" } Else If (InStr(ItemName, "&Play")) { MapSet(LV_GetNext()) ShowHideWindow() return } UpdateLV() LV_Modify(LVSel, "Select Vis") BackgroundLoad(TempMap) } } ControlHandler() { Global ; Assume-global mode If (A_GuiControl = "LevelSelectCancel") { ShowHideWindow() } Else If (A_GuiControl = "AboutOK") { ShowHideWindow() } Else If (A_GuiControl = "VLV") { If (A_GuiEvent = "Normal" && LV_GetNext() <> "0") { MapSet(LV_GetNext()) ShowHideWindow() } } } WM_CTLCOLORBTN(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x0135, "WM_CTLCOLORBTN") ; Paint button border color to match Gui background color return DllCall("Gdi32.dll\CreateSolidBrush", "UInt", "0x" GuiBGCol, "UPtr") } WM_KEYDOWN(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x0100, "WM_KEYDOWN") ; Call function KF_REPEAT := (lParam & 0x40000000) IsAbout := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hAbout)) IsLevelSelect := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hLevelSelect)) IsGame := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hGame)) VK := Format("{:x}", wParam) ; Get virtual-key code ; Minimize Window (Boss Key) If (VK = "20") { ; SPACE WinMinimize, ahk_id %hBulldozer% } If (IsLevelSelect) { If (A_DefaultGui <> "LevelSelect") { Gui, LevelSelect: Default } If (VK = "1B") { ; ESC ShowHideWindow() } Else If (VK = "d") { ; ENTER MapSet(LV_GetNext()) ShowHideWindow() } Else If (VK = "26" || VK = "25") { ; UP ARROW/LEFT ARROW LV_Modify((LV_GetNext() = 1 ? "180" : LV_GetNext() - 1), "Select Vis") } Else If (VK = "28" || VK = "27") { ; DOWN ARROW/RIGHT ARROW LV_Modify((LV_GetNext() = 180 ? "1" : LV_GetNext() + 1), "Select Vis") } Else If (VK = "24") { ; HOME LV_Modify("1", "Select Vis") } Else If (VK = "23") { ; END LV_Modify("180", "Select Vis") } Else If (VK = "21") { ; PAGE UP LV_Modify(LV_GetNext() = 1 ? 180 + (LV_GetNext() - 6) : (LV_GetNext() - 5) < 1 ? 180 + (LV_GetNext() - 5) : LV_GetNext() - 5, "Select Vis") } Else If (VK = "22") { ; PAGE DOWN LV_Modify(LV_GetNext() = 1 ? LV_GetNext() + 4 : (LV_GetNext() + 5) > 180 ? (LV_GetNext() + 5) - 180 : LV_GetNext() + 5, "Select Vis") } return } Else If (IsAbout) { If (A_DefaultGui <> "About") { Gui, About: Default } If (VK = "1B") { ; ESC ShowHideWindow() } Else If (VK = "d") { ; ENTER ShowHideWindow() } return } Else If (IsGame) { If (A_DefaultGui <> "Game") { Gui, Game: Default } GuiControl, Parent: Focus, Catch If (VK = "26" || VK = "57") { ; UP ARROW/W Move(0, -1) } Else If (VK = "25" || VK = "41") { ; LEFT ARROW/A Move(-1, 0) } Else If (VK = "28" || VK = "53") { ; DOWN ARROW/S Move(0, 1) } Else If (VK = "27" || VK = "44") { ; RIGHT ARROW/D Move(1, 0) } Else If (VK = "21") { ; PAGE UP MapSet(LevelNum = "1" ? "180" : LevelNum - 1) } Else If (VK = "22") { ; PAGE DOWN MapSet(LevelNum = "180" ? "1" : LevelNum + 1) } Else If (VK = "1B") { ; ESC ExitApp ; Terminate the script unconditionally } Else If (VK = "8") { ; Backspace UndoMove() } Else If (VK = "7b") { ; F12 Menu, Tray, Icon SSFilename := "Bulldozer_Lv" LevelNum "_" A_Now ".png" GdipSaveToPNG(pBackgroundImage, SSFilename) TrayTip, Bulldozer, % "Screenshot Saved!`n" A_ScriptDir "\" SSFilename SetTimer, DisableTrayIcon, -10000 ; 10 seconds } return } } DisableTrayIcon() { Global ; Assume-global mode If (!A_IconHidden) { Menu, Tray, NoIcon } } UndoMove() { Global ; Assume-global mode IsAbout := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hAbout)) IsLevelSelect := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hLevelSelect)) If (IsAbout || IsLevelSelect) { return } MidiSound(MidiHistory.Pop()) If (Undo := UndoArray.Pop()) { TempMap := Undo[Undo.MaxIndex(), "M"] BackgroundUpdate(Undo) LevelClearCheck(500) } } Move(X, Y) { Global ; Assume-global mode ; Get position of bulldozer PosNum := RegExMatch(TempMap, "(4|5|6|7)") ; Get positions of next characters PosNumX1 := (PosNum + (Y ? Y * 20 : X)) PosNumX2 := (PosNum + (Y ? (Y + Y) * 20 : (X + X))) ; Get character string value of next positions PosChrX1 := SubStr(TempMap, (PosNum + (Y ? Y * 20 : X)), 1) PosChrX2 := SubStr(TempMap, (PosNum + (Y ? (Y + Y) * 20 : (X + X))), 1) ; Replace character with value from original map Char := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], PosNum, 1) ReplaceChar := (RegExMatch(Char, "(2|4|5|6|7)") ? "0" : RegExMatch(Char, "(1|3)") ? "1" : Char) ; Face bulldozer in direction of requested movement Bulldozer := (PosNumX1 = PosNum - 1 ? "6" : PosNumX1 = PosNum + 1 ? "7" : PosNumX1 = PosNum - 20 ? "4" : "5") If (PosChrX1 = "") { ; Outside playing area MidiSound("69") MapUpdate(Bulldozer "|" PosNum) return } If (RegExMatch(PosChrX1, "(8|9|A|B|C|D|E|F)")) { ; Boundaries MidiSound("86") MapUpdate(Bulldozer "|" PosNum) return } If (PosChrX1 = "3") { ; Target+Boulder If (RegExMatch(PosChrX2, "(2|3|8|9|A|B|C|D|E|F)")) { ; Boundaries MidiSound("86") MapUpdate(Bulldozer "|" PosNum) return } ; Target / Everything else MidiSound(PosChrX2 = "1" ? "81" : "70") MapUpdate((PosChrX2 = "1" ? "3" : "2") "|" PosNumX2, Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum) return } If (PosChrX1 = "2") { ; Boulder If (RegExMatch(PosChrX2, "(2|3|8|9|A|B|C|D|E|F)")) { ; Boundaries MidiSound("86") MapUpdate(Bulldozer "|" PosNum) return } ; Target / Everything else MidiSound(PosChrX2 = "1" ? "81" : "70") MapUpdate((PosChrX2 = "1" ? "3" : "2") "|" PosNumX2, Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum) return } ; Everything else MidiSound("69") ; Empty space MapUpdate(Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum) } ProgressCheck() { Global ; Assume-global mode Static PrevLevel := "" If (PosChrX1 = "2" || PosChrX1 = "3" || PrevLevel <> LevelNum) { StrReplace(TempMap, "3", "3", BoulderTargetCount) PercentText := Round((BoulderTargetCount / (InitTargetCount + InitBoulderTargetCount) * 100), 0) RemainderText := (BoulderTargetCount "/" (InitTargetCount + InitBoulderTargetCount)) } PrevLevel := LevelNum If (TaskbarProgress) { SetTaskbarProgress("N", PercentText, hBulldozer) } Else { SetTaskbarProgress() } } LevelClearCheck(Wait := 0) { Global ; Assume-global mode ProgressCheck() ; Update window title DllCall("User32.dll\SetWindowText", "UInt", hBulldozer, "Str", "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : "")) If (!InStr(TempMap, "2")) { ; If all boulders moved to targets Solved[LevelNum] := "S" ; Add flag LevelNum++ ; Increment level number + 1 Sleep, % Wait ; Delay before changing level MapSet(LevelNum) ; Load next level } } MapSet(LevelNo) { Global ; Assume-global mode MapBackup := "" ; Initialize variable UndoArray := [] ; Initialize array to store 'Undo' data MidiHistory := [] ; Initialize array to store used sound effects ; Level number validation LevelNum := (LevelNo > Maps.MaxIndex() ? "180" : LevelNo < Maps.MinIndex() ? "1" : LevelNo) ; HOTFIX: Levels where bulldozer begins on target tile If (LevelNum = "64" || LevelNum = "127") { MapBackup := Maps[LevelNum] ; Backup map } TempMap := Maps[LevelNum] ; Define TempMap data BackgroundLoad(TempMap) ; Generate background image ; HOTFIX: Levels where bulldozer begins on target tile If (LevelNum = "64" || LevelNum = "127") { Maps%LevelNum% := StrReplace(TempMap, "4", "1") ; Replace level data } StrReplace(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], "1", "1", InitTargetCount) StrReplace(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], "3", "3", InitBoulderTargetCount) ProgressCheck() ; Update window title DllCall("User32.dll\SetWindowText", "UInt", hBulldozer, "Str", "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : "")) } MapUpdate(PosReplace*) { Global ; Assume-global mode Update := [] ; Initialize the update array Undo := [] ; Initialize the undo array UndoMap := TempMap ; Backup previous TempMap value to UndoMap For K, V In PosReplace { Replacement := SubStr(V, 1, InStr(V, "|") - 1) Position := SubStr(V, InStr(V, "|") + 1) Current := SubStr(TempMap, Position, 1) Before := SubStr(TempMap, 1, Position - 1) After := SubStr(TempMap, Position + 1, StrLen(TempMap) - Position) TempMap := Before . Replacement . After Undo.Push({I: Position, C: Current, M: UndoMap}) Update.Push({I: Position, C: Replacement}) } If (TempMap "" <> UndoMap "") { ; TempMap changed UndoArray.Push(Undo) MidiHistory.Push(PlayedNote) } If (!UnlimitedUndo) { ; If option enabled If (UndoArray.MaxIndex() > 1) { ; Number of times to allow 'Undo' UndoArray.RemoveAt(1) } } BackgroundUpdate(Update) ; Generate background image LevelClearCheck(500) ; Check for remaining boulders } BackgroundLoad(MapData) { Global ; Assume-global mode ; Clear graphic to specific color DllCall("Gdiplus.dll\GdipGraphicsClear", "Ptr", pBackgroundGraphics, "UInt", "0xFF" BackgroundColor) ; Generate image using tileset coordinates from map data Loop, % StrLen(MapData) { MapChar := SubStr(MapData, A_Index, 1) NMapChar := SubStr(Maps[LevelNum], A_Index, 1) If (LayeredTiles) { If (InStr("89BCDEFA1)", MapChar, 1)) { ; Background Tiles DrawTile(MapChar, A_Index) } If (MapChar = "3") { ; Target/Boulder DrawTile("1", A_Index) ; Target } ; HOTFIX: Levels where bulldozer begins on target tile If (LevelNum = "64" || LevelNum = "127") { If (RegExMatch(MapChar, "(4|5|6|7)")) { ; Draw target under Bulldozer DrawTile("1", A_Index) ; Target } } If (RegExMatch(MapChar, "(4|5|6|7)")) { ; Draw target under Bulldozer If (NMapChar = "1") { ; Target on Original map DrawTile("1", A_Index) ; Target on current temp map } } } DrawTile(MapChar, A_Index) } ; Write text to image If (LevelNumber) { ; If option enabled Fontmap := (Solved[LevelNum] = "S" ? pFontmapGreen : pFontmapPink) Loop, Parse, % Format("{:3}", LevelNum) { If (FontCol := InStr("0123456789", A_LoopField, 1)) { DllCall("Gdiplus.dll\GdipDrawImageRectRect", "Ptr", pBackgroundGraphics, "Ptr", Fontmap, "Float", ((((24 * A_Index) - 24) + 564) * DPI), "Float", (4 * DPI), "Float", (24 * DPI), "Float", (24 * DPI), "Float", ((FontCol - 1) * 24), "Float", 0, "Float", 24, "Float", 24, "Int", 2, "Ptr", 0, "Ptr", 0, "Ptr", 0) } } } ; Redraw background image GuiControl, Game: +Redraw, % hBackground } BackgroundUpdate(arrUpdate) { Global ; Assume-global mode For K, V In arrUpdate { DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pBackgroundGraphics, "Ptr", pBackgroundBrush, "Float", ((32 * ((!(M := Mod(V.I, 20)) ? 20 : M) - 1)) * DPI), "Float", ((32 * (Ceil(V.I / 20) - 1)) * DPI), "Float", (32 * DPI), "Float", (32 * DPI)) MapChar := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], V.I, 1) If (LayeredTiles) { If (InStr("89BCDEFA1", MapChar, 1)) { DrawTile(MapChar, V.I) ; Background Tiles } If (MapChar = "3") { ; Target/Boulder DrawTile("1", V.I) ; Target } } DrawTile(V.C, V.I) } ; Redraw background image GuiControl, Game: +Redraw, % hBackground } DrawTile(TileChar, TilePos) { Global ; Assume-global mode If (TileCol := InStr("89BCDEFA2317456", TileChar, 1)) { DllCall("Gdiplus.dll\GdipDrawImageRectRect", "Ptr", pBackgroundGraphics, "Ptr", pTheme, "Float", ((32 * ((!(M := Mod(TilePos, 20)) ? 20 : M) - 1)) * DPI), "Float", ((32 * (Ceil(TilePos / 20) - 1)) * DPI), "Float", 32 * DPI, "Float", 32 * DPI, "Float", (TileCol - 1) * 32, "Float", 0, "Float", 32, "Float", 32, "Int", 2, "Ptr", 0, "Ptr", 0, "Ptr", 0) } } GdipCreateFromBase64(B64, RetType := 0) { VarSetCapacity(B64Len, 0) DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", StrLen(B64), "UInt", 0x01, "Ptr", 0, "UIntP", B64Len, "Ptr", 0, "Ptr", 0) VarSetCapacity(B64Dec, B64Len, 0) ; pbBinary size DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", StrLen(B64), "UInt", 0x01, "Ptr", &B64Dec, "UIntP", B64Len, "Ptr", 0, "Ptr", 0) pStream := DllCall("Shlwapi.dll\SHCreateMemStream", "Ptr", &B64Dec, "UInt", B64Len, "UPtr") VarSetCapacity(pBitmap, 0) DllCall("Gdiplus.dll\GdipCreateBitmapFromStreamICM", "Ptr", pStream, "PtrP", pBitmap) If (RetType = 2) { VarSetCapacity(hBitmap, 0) DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "UInt", pBitmap, "UInt*", hBitmap, "Int", 0XFFFFFFFF) } If (RetType = 1) { DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", pBitmap, "PtrP", hIcon, "UInt", 0) } ObjRelease(pStream) return (RetType = 1 ? hIcon : RetType = 2 ? hBitmap : pBitmap) } GdipCreateFromPNG(File) { If (!A_IsUnicode) { VarSetCapacity(wFile, 1024) DllCall("Kernel32.dll\MultiByteToWideChar", "UInt", 0, "UInt", 0, "Ptr", &File, "Int", -1, "Ptr", &wFile, "Int", 512) DllCall("Gdiplus.dll\GdipCreateBitmapFromFile", "Ptr", &wFile, "PtrP", pBitmap) } Else { DllCall("Gdiplus.dll\GdipCreateBitmapFromFile", "Ptr", &File, "PtrP", pBitmap) } return pBitmap } ChooseColor(StartColor, hOwner := 0, Palette*) { Global UserColors Static CustomColors rgbResult := BGR2RGB(StartColor) VarSetCapacity(CustomColors, 64, 0) NumPut(VarSetCapacity(CHOOSECOLOR, (A_PtrSize * 9), 0), CHOOSECOLOR, 0) NumPut(hOwner, CHOOSECOLOR, A_PtrSize) NumPut(rgbResult, CHOOSECOLOR, (A_PtrSize * 3), "UInt") NumPut(&CustomColors, CHOOSECOLOR, (A_PtrSize * 4), "UPtr") NumPut(0x103, CHOOSECOLOR, (A_PtrSize * 5), "UInt") For Index, Value in Palette { NumPut(BGR2RGB(Value), CustomColors, ((Index - 1) * 4), "UInt") } RetVal := DllCall("Comdlg32.dll\ChooseColor", "Ptr", &CHOOSECOLOR) If (ErrorLevel <> 0 || RetVal == 0) { return Format("{:06X}", StartColor) } Loop, 16 { UserColors[A_Index] := BGR2RGB(NumGet(CustomColors, (A_Index - 1) * 4, "UInt")) } rgbResult := NumGet(CHOOSECOLOR, (A_PtrSize * 3)) return Format("{:06X}", BGR2RGB(rgbResult)) } BGR2RGB(Color) { return ((Color & 0xFF) << 16) + (Color & 0xFF00) + ((Color >> 16) & 0xFF) } IsWindowVisible(Hwnd) { return DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " Hwnd)) } ShowHideWindow(Name := "", Show := 1) { Windows := ["About", "LevelSelect"] For K, V In Windows { If (V <> Name) { Gui, %V%: Hide } } If (Name <> "") { Gui, % Name ":" (Show ? "Show" : "Hide") } GuiControl, Parent: Focus, Catch } RLE_Encode(Message) { Previous := SubStr(Message, 1, 1) Last := SubStr(Message, 0, 1) Message .= Asc(Chr(Last) + 1) Count := 0 Loop, Parse, Message { If (Previous == A_LoopField) { Count += 1 } Else { output .= Previous . Count Previous := A_LoopField Count := 1 } } return output } RLE_Decode(Message) { Pos := 1 While(Item := RegExMatch(Message, "\D", Char, Pos)) { DigPos := RegExMatch(Message, "\d+", Dig, Item) Loop, % Dig { Output .= Char } Pos := DigPos } return Output } ST_Glue(Array, Delim := "`n") { For K, V In Array { New .= V . Delim } return Trim(New, Delim) } SubclassControl(HCTL, FuncName, Data := 0) { Static ControlCB := [] If (Controls.HasKey(HCTL)) { DllCall("Comctl32.dll\RemoveWindowSubclass", "Ptr", HCTL, "Ptr", ControlCB[HCTL], "Ptr", HCTL) DllCall("Kernel32.dll\GlobalFree", "Ptr", Controls[HCTL], "Ptr") Controls.Delete(HCTL) If (FuncName = "") { return true } } If (!DllCall("User32.dll\IsWindow", "Ptr", HCTL, "UInt")) || (!IsFunc(FuncName) || (Func(FuncName).MaxParams <> 6)) || (!CB := RegisterCallback(FuncName,, 6)) { return false } If (!DllCall("Comctl32.dll\SetWindowSubclass", "Ptr", HCTL, "Ptr", CB, "Ptr", HCTL, "Ptr", Data)) { return (DllCall("Kernel32.dll\GlobalFree", "Ptr", CB, "Ptr") & 0) } return (ControlCB[HCTL] := CB) } BgSubclassProc(hWnd, uMsg, wParam, lParam, uIdSubclass, dwRefData) { Global pControlGraphics, pBackgroundImage If (uMsg = 0x0014) { ; WM_ERASEBKGND return 1 ; Do nothing } If (uMsg = 0x000F) { ; WM_PAINT ; Draw the background image VarSetCapacity(PAINTSTRUCT, 60 + A_PtrSize, 0) DllCall("User32.dll\BeginPaint", "Ptr", hWnd, "Ptr", &PAINTSTRUCT, "UPtr") DllCall("Gdiplus.dll\GdipDrawImage", "Ptr", pControlGraphics, "Ptr", pBackgroundImage, "Float", 0, "Float", 0) DllCall("User32.dll\EndPaint", "Ptr", hWnd, "Ptr", &PAINTSTRUCT, "UPtr") return 0 } If (uMsg = 0x0002) { ; WM_DESTROY SubclassControl(hWnd, "") ; Remove the Subclass } ; Pass all other messages to DefSubclassProc return DllCall("Comctl32.dll\DefSubclassProc", "Ptr", hWnd, "UInt", uMsg, "Ptr", wParam, "Ptr", lParam, "Ptr") } EmptyMem(PID := "") { PID := (PID = "" ? DllCall("Kernel32.dll\GetCurrentProcessId") : PID) h := DllCall("Kernel32.dll\OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", PID) DllCall("Kernel32.dll\SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1) DllCall("Kernel32.dll\CloseHandle", "Int", h) } SetTaskbarProgress(State := "", Value := "", Hwnd := "") { Static TBL := "" If (TBL = "") { TBL := ComObjCreate("{56FDF344-FD6D-11D0-958A-006097C9A090}", "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}") } State := (State = "I" ? 1 : State = "N" ? 2 : State = "E" ? 4 : State = "P" ? 8 : 0) Hwnd := (Hwnd = "" ? WinExist() : Hwnd) DllCall(NumGet(NumGet(TBL + 0) + 10 * A_PtrSize), "Ptr", TBL, "Ptr", Hwnd, "UInt", State) If (Value <> "") { DllCall(NumGet(NumGet(TBL + 0) + 9 * A_PtrSize), "Ptr", TBL, "Ptr", Hwnd, "Int64", Value, "Int64", 100) } return (TBL ? 0 : 1) } MidiSound(Note) { ; Notes: 27-87 Global ; Assume-global mode Static Channel := 9, Velocity := 127 Static PrevBDPos := "", IdentCount := 0, PrevRepeat := 0, PrevDragMode := 0, DragCount := 0 If (!Sound) { return } BDPos := RegExMatch(TempMap, "(4|5|6|7)") If (BDPos = PrevBDPos && DragMode) { DragCount++ If (DragCount > 1) { return } } Else { DragCount := 0 PrevDragMode := 0 } If (DragMode && (PrevDragMode >= 1) && DragCount) { return } PrevDragMode++ If (BDPos = PrevBDPos && KF_REPEAT) { IdentCount++ If (IdentCount >= 1) { return } } Else { IdentCount := 0 } If (KF_REPEAT && !PrevRepeat && IdentCount) { return } PrevBDPos := BDPos PrevRepeat := KF_REPEAT PlayedNote := Note ; Used for "Undo" sound effects DllCall("Winmm.dll\midiOutShortMsg", "UInt", h_MIDIOut, "UInt", 0x90 | Channel | (Note << 8) | (Velocity << 16), "UInt") } WM_LBUTTONDOWN(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x0201, "WM_LBUTTONDOWN") If (Hwnd <> hGame) { return } If (MouseMovement) { KeyWait, LButton, T0.4 If (!ErrorLevel) { MoveClick() } DragMode := (ErrorLevel ? 1 : 0) SetTimer, MouseDrag, % (ErrorLevel ? 180 : "Off") } } WM_LBUTTONUP(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x0202, "WM_LBUTTONUP") DragMode := 0 SetTimer, MouseDrag, Off } WM_MOUSEMOVE(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x0200, "WM_MOUSEMOVE") VarSetCapacity(TME, 16, 0) NumPut(16, TME, 0) NumPut(2, TME, 4) ; TME_LEAVE NumPut(hGame, TME, 8) DllCall("User32.dll\TrackMouseEvent", "UInt", &TME) } WM_MOUSELEAVE(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static Init := OnMessage(0x02A3, "WM_MOUSELEAVE") DragMode := 0 SetTimer, MouseDrag, Off } MouseDrag() { Global ; Assume-global mode If (!DragMode) { return } MouseGetPos, MouseX, MouseY ColClick := Ceil(MouseX / (32 * DPI)) RowClick := Ceil(MouseY / (32 * DPI)) BDPos := RegExMatch(TempMap, "(4|5|6|7)") BDCol := Mod(BDPos, 20) BDRow := Floor(BDPos / 20) + 1 If (ColClick < BDCol) { ; Left Move(-1, 0) } Else If (ColClick > BDCol) { ; Right Move(1, 0) } Else If (RowClick < BDRow) { ; Up Move(0, -1) } Else If (RowClick > BDRow) { ; Down Move(0, 1) } } MoveClick() { Global ; Assume-global mode MouseGetPos, MouseX, MouseY ColClick := Ceil(MouseX / (32 * DPI)) RowClick := Ceil(MouseY / (32 * DPI)) ClickPos := (ColClick + (RowClick * 20)) - 20 BDPos := RegExMatch(TempMap, "(4|5|6|7)") BDCol := Mod(BDPos, 20) BDRow := Floor(BDPos / 20) + 1 ClickChar := SubStr(TempMap, ClickPos, 1) If (ClickChar <> "0") ; Open Area && (ClickChar <> "1") { ; Target return } PathMapMid := SubStr(TempMap, ClickPos, 1) PathMapPrev := SubStr(TempMap, 1, ClickPos - 1) PathMapNext := SubStr(TempMap, ClickPos + 1, StrLen(TempMap) - ClickPos) PathMapTemp := PathMapPrev "Z" PathMapNext PathMap := "" Loop, 16 { PathMap .= SubStr(PathMapTemp, A_Index = 1 ? 1 : (A_Index * 20) - 19, 20) "`n" } PathMap := RegExReplace(RegExReplace(RegExReplace(PathMap, "(4|5|6|7)", "S"), "(0|1)", " "), "(8|9|D|2|3|B|C|E|F|A)", "*") Closed := {} For Y, Line In StrSplit(PathMap, "`n") { For X, Val In StrSplit(Line) { If (Val = "*") { Closed[X,Y] := true } Else If (Val = "S") { X1 := X, Y1 := Y } Else If (Val = "Z") { X2 := X, Y2 := Y } } } Path := Astar_Grid(X1, Y1, X2, Y2, Closed) IsPath := 0 For Y, Line In StrSplit(PathMap, "`n") { For X, Val In StrSplit(Line "`n") { For Index, Cell In Path { If (Cell.X = X && Cell.Y = Y && Index >= 1 && Index < Path.MaxIndex()) { IsPath++ Continue 2 } } } } If (!IsPath) { return } BDChar := SubStr(TempMap, BDPos, 1) OriginalChar := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : RegExReplace(Maps[LevelNum], "(4|5|6|7)", "0"), BDPos, 1) OriginalChar := (OriginalChar = "2" ? SubStr(RegExReplace(TempMap, "(4|5|6|7)", "0"), BDPos, 1) : OriginalChar = "3" ? "1" : OriginalChar) MapUpdate(OriginalChar "|" BDPos, BDChar "|" ClickPos) } Astar_Grid(X1, Y1, X2, Y2, Closed := "") { If (!IsObject(Closed)) { Closed := {} } Open := {}, From := {}, G := {}, F := {} Open[X1, Y1] := true, G[X1, Y1] := 0 F[X1, Y1] := Astar_Estimate_F(X1, Y1, X2, Y2) While (Open.MaxIndex()) { Astar_Lowest_F_Set(X, Y, F, Open) If (X = X2 and Y = Y2) { return Astar_From_Path(From, X, Y) } Open[X].Delete(Y) If (!Open[X].MaxIndex()) { Open.Delete(X) } Closed[X, Y] := True For Index, Near In [{"X": X, "Y": Y-1},{"X": X-1, "Y": Y},{"X": X+1, "Y": Y},{"X": X, "Y": Y+1}] { If (Closed[Near.X, Near.Y] = True) { Continue } Open[Near.X, Near.Y] := True, tG := G[X, Y] + 1 If (IsObject(G[Near.X, Near.Y]) and tG >= G[Near.X, Near.Y]) { Continue } From[Near.X, Near.Y] := {"X": X, "Y": Y} G[Near.X, Near.Y] := tG F[Near.X, Near.Y] := G[Near.X, Near.Y] + Astar_Estimate_F(Near.X, Near.Y, X2, Y2) } } } Astar_Estimate_F(X1, Y1, X2, Y2) { return Abs(X1-X2) + Abs(Y1-Y2) } Astar_Lowest_F_Set(ByRef X, ByRef Y, ByRef F, ByRef Set) { l := 0x7FFFFFFF For tX, Element In Set { For tY, Val In Element { If (F[tX, tY] < l) { l := F[tX, tY], X := tX, Y := tY } } } return l } Astar_From_Path(From, X, Y) { Path := {}, XY := {"X": X, "Y": Y} Path.InsertAt(1, XY) While (IsObject(From[XY.X, XY.Y])) { Path.InsertAt(1, XY:= From[XY.X, XY.Y]) } return Path } GdipSaveToPNG(pBitmap, sOutput) { Ptr := (A_PtrSize ? "UPtr" : "UInt") DllCall("Gdiplus.dll\GdipGetImageEncodersSize", "UInt*", nCount, "UInt*", nSize) VarSetCapacity(ci, nSize) DllCall("Gdiplus.dll\GdipGetImageEncoders", "UInt", nCount, "UInt", nSize, Ptr, &ci) If (!(nCount && nSize)) { return -2 } If (A_IsUnicode) { Loop, % nCount { sString := StrGet(NumGet(ci, (idx := (48 + (7 * A_PtrSize)) * (A_Index - 1)) + 32 + (3 * A_PtrSize)), "UTF-16") If (!InStr(sString, "*.PNG")) { Continue } pCodec := &ci+idx Break } } Else { Loop, % nCount { Location := NumGet(ci, 76 * (A_Index - 1) + 44) nSize := DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "UInt", Location, "Int", -1, "UInt", 0, "Int", 0, "UInt", 0, "UInt", 0) VarSetCapacity(sString, nSize) DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "UInt", Location, "Int", -1, "Str", sString, "Int", nSize, "UInt", 0, "UInt", 0) If (!InStr(sString, "*.PNG")) { Continue } pCodec := &ci + 76 * (A_Index - 1) Break } } If (!pCodec) { return -3 } If (!A_IsUnicode) { nSize := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, Ptr, &sOutput, "Int", -1, Ptr, 0, "Int", 0) VarSetCapacity(wOutput, nSize*2) DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, Ptr, &sOutput, "Int", -1, Ptr, &wOutput, "Int", nSize) VarSetCapacity(wOutput, -1) If (!VarSetCapacity(wOutput)) { return -4 } E := DllCall("Gdiplus.dll\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "UInt", p ? p : 0) } Else { E := DllCall("Gdiplus.dll\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "UInt", p ? p : 0) } return E ? -5 : 0 } BuildDocs() { Global ; Assume-global mode If (!InStr(FileExist("BulldozerDocs"), "D")) { FileCreateDir, BulldozerDocs FileCreateDir, BulldozerDocs\images GdipSaveToPNG(pDocsbulldozerpushrock, "BulldozerDocs\images\bulldozer-push-rock.png") GdipSaveToPNG(pDocsfig1, "BulldozerDocs\images\Fig1.png") GdipSaveToPNG(pDocsfig2, "BulldozerDocs\images\Fig2.png") GdipSaveToPNG(pDocsfig3, "BulldozerDocs\images\Fig3.png") GdipSaveToPNG(pDocsfig4, "BulldozerDocs\images\Fig4.png") GdipSaveToPNG(pDocsfig5, "BulldozerDocs\images\Fig5.png") GdipSaveToPNG(pDocsfig6, "BulldozerDocs\images\Fig6.png") GdipSaveToPNG(pDocsiconahk, "BulldozerDocs\images\icon-ahk.png") GdipSaveToPNG(pDocsicongithub, "BulldozerDocs\images\icon-github.png") GdipSaveToPNG(pDocsiconup, "BulldozerDocs\images\icon-up.png") GdipSaveToPNG(pDocscustomtheme, "BulldozerDocs\images\custom-theme.png") Doc := FileOpen("BulldozerDocs\index.html", "w") Doc.Write(DocHTML) Doc.Close() } } CheckDocs() { Global ; Assume-global mode If (!FileExist("BulldozerDocs\images\bulldozer-push-rock.png")) || (!FileExist("BulldozerDocs\images\Fig1.png")) || (!FileExist("BulldozerDocs\images\Fig2.png")) || (!FileExist("BulldozerDocs\images\Fig3.png")) || (!FileExist("BulldozerDocs\images\Fig4.png")) || (!FileExist("BulldozerDocs\images\Fig5.png")) || (!FileExist("BulldozerDocs\images\Fig6.png")) || (!FileExist("BulldozerDocs\images\icon-ahk.png")) || (!FileExist("BulldozerDocs\images\icon-github.png")) || (!FileExist("BulldozerDocs\images\icon-up.png")) || (!FileExist("BulldozerDocs\images\custom-theme.png")) || (!FileExist("BulldozerDocs\index.html")) { FileRemoveDir, BulldozerDocs, 1 BuildDocs() } } GameGuiDropFiles(GuiHwnd, FileArray, CtrlHwnd, X, Y) { Global ; Assume-global mode If (GuiHwnd <> hGame) { return } DWidth := 0, DHeight := 0 If (FileArray.MaxIndex() > 1) { ; Single file only return } SplitPath, % FileArray[1],,, DExt If (DExt <> "png") { ; PNG image file only return } DFile := GdipCreateFromPNG(FileArray[1]) DllCall("Gdiplus.dll\GdipGetImageWidth", "UInt", DFile, "UInt*", DWidth) DllCall("Gdiplus.dll\GdipGetImageHeight", "UInt", DFile, "UInt*", DHeight) DllCall("Gdiplus.dll\GdipDisposeImage", "UInt", DFile) If (DWidth = 480 && DHeight = 32) { ; Only properly sized image ThemeSet(FileArray[1], true) return } } ; ==============================================================================