From 2b9a2335796eba2dd8732a113586fdbd5900f543 Mon Sep 17 00:00:00 2001 From: codeimp Date: Sat, 31 May 2008 19:31:45 +0000 Subject: [PATCH] lots more UDMF code --- Build/Configurations/Hexen.cfg | 4 + Build/Configurations/Skulltag_DoomHexen.cfg | 4 + Build/Configurations/ZDoom_DoomHexen.cfg | 99 +- Build/Configurations/ZDoom_DoomUDMF.cfg | 6653 +++++++++++++++++ Build/Configurations/ZDoom_HereticHexen.cfg | 4 + Build/Configurations/ZDoom_Hexen.cfg | 4 + Build/Configurations/ZDoom_StrifeHexen.cfg | 4 + Documents/udmf_zd11.txt | 219 + Source/Builder.csproj | 2 + Source/Config/GameConfiguration.cs | 70 +- Source/Config/LinedefActivateInfo.cs | 19 +- .../Controls/FieldsEditorControl.Designer.cs | 40 +- Source/IO/Configuration.cs | 2 +- Source/IO/DoomMapSetIO.cs | 49 +- Source/IO/HexenMapSetIO.cs | 48 +- Source/IO/UniversalMapSetIO.cs | 76 +- Source/IO/UniversalParser.cs | 1123 +++ Source/Map/Linedef.cs | 32 +- Source/Map/Thing.cs | 11 +- Source/Rendering/Renderer2D.cs | 4 +- Source/Resources/UDMF.cfg | 67 + Source/Windows/LinedefEditForm.Designer.cs | 598 +- Source/Windows/LinedefEditForm.cs | 91 +- Source/Windows/LinedefEditForm.resx | 186 + Source/Windows/SectorEditForm.Designer.cs | 1 + Source/Windows/ThingEditForm.Designer.cs | 91 +- Source/Windows/ThingEditForm.cs | 11 +- Source/Windows/ThingEditForm.resx | 876 +-- 28 files changed, 9432 insertions(+), 956 deletions(-) create mode 100644 Build/Configurations/ZDoom_DoomUDMF.cfg create mode 100644 Documents/udmf_zd11.txt create mode 100644 Source/IO/UniversalParser.cs create mode 100644 Source/Resources/UDMF.cfg diff --git a/Build/Configurations/Hexen.cfg b/Build/Configurations/Hexen.cfg index 5abc4aa2..671255f7 100644 --- a/Build/Configurations/Hexen.cfg +++ b/Build/Configurations/Hexen.cfg @@ -298,6 +298,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Build/Configurations/Skulltag_DoomHexen.cfg b/Build/Configurations/Skulltag_DoomHexen.cfg index 8a95a3ce..2634a30b 100644 --- a/Build/Configurations/Skulltag_DoomHexen.cfg +++ b/Build/Configurations/Skulltag_DoomHexen.cfg @@ -325,6 +325,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Build/Configurations/ZDoom_DoomHexen.cfg b/Build/Configurations/ZDoom_DoomHexen.cfg index fc92f83b..917617bd 100644 --- a/Build/Configurations/ZDoom_DoomHexen.cfg +++ b/Build/Configurations/ZDoom_DoomHexen.cfg @@ -18,10 +18,11 @@ formatinterface = "HexenMapSetIO"; defaultlumpname = "MAP01"; // Special linedefs -soundlinedefflags = 64; // See linedefflags -singlesidedflags = 1; // See linedefflags -doublesidedflags = 4; // See linedefflags -impassableflags = 1; +// See linedefflags +soundlinedefflag = 64; +singlesidedflag = 1; +doublesidedflag = 4; +impassableflag = 1; // Generalized actions generalizedlinedefs = false; @@ -225,92 +226,6 @@ maplumpnames } -/* -ADDITIONAL UNIVERSAL DOOM MAP FORMAT FIELD DEFINITIONS -Only add fields here that Doom Builder does not edit with its own user-interface! -The "default" is the editor's default value. Set "specdefault" to the UDMF specification's -default when "default" differs from the UDMF specification's default! - -Field data types: -0 = integer * -1 = float -2 = string -3 = bool -4 = linedeftype (integer) * -5 = sectoreffect (integer) * -6 = texture (string) -7 = flat (string) -8 = angle in degrees (integer) -9 = angle in radians (float) -10 = XXRRGGBB color (integer) -11 = enum option (integer) * -12 = enum bits (integer) * -13 = sector tag (integer) * -14 = thing tag (integer) * -15 = linedef tag (integer) * -16 = enum option (string) -*/ -universalfields -{ - linedefs - { - texture_scale_x - { - type = 1; - default = 1.0f; - } - - texture_scale_y - { - type = 1; - default = 1.0f; - } - - texture_offset_x - { - type = 1; - default = 0.0f; - } - - texture_offset_y - { - type = 1; - default = 0.0f; - } - - brightness - { - type = 0; - default = -1; - } - - colormap - { - type = 10; - default = 0; - } - - normalmap - { - type = 6; - default = ""; - } - - second_action - { - type = 4; - default = 0; - } - - hidden - { - type = 3; - default = false; - } - } -} - - // DEFAULT SECTOR BRIGHTNESS LEVELS sectorbrightness { @@ -572,6 +487,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Build/Configurations/ZDoom_DoomUDMF.cfg b/Build/Configurations/ZDoom_DoomUDMF.cfg new file mode 100644 index 00000000..f2a396e7 --- /dev/null +++ b/Build/Configurations/ZDoom_DoomUDMF.cfg @@ -0,0 +1,6653 @@ +/*************************************************************\ + Doom Builder Game Configuration for (Hexen format) +\*************************************************************/ + +// This is required to prevent accedential use of a different configuration +type = "Doom Builder 2 Game Configuration"; + +// This is the title to show for this game +game = "ZDoom (Doom in UDMF format)"; + +// This is the simplified game engine/sourceport name +engine = "zdoom"; + +// The format interface handles the map data format +formatinterface = "HexenMapSetIO"; + +// Default lump name for new map +defaultlumpname = "MAP01"; + +// Special linedefs +// See linedefflags +soundlinedefflag = 64; +singlesidedflag = 1; +doublesidedflag = 4; +impassableflag = 1; + +// Generalized actions +generalizedlinedefs = false; +generalizedsectors = true; + +// Texture loading options +mixtexturesflats = true; +defaulttexturescale = 1.0f; +defaultflatscale = 1.0f; + +// Thing number for start position in 3D Mode +start3dmode = 32000; + +// Default flags for first new thing +defaulthingflags = 999; + + +/* +TEXTURES AND FLAT SOURCES +This tells Doom Builder where to find the information for textures +and flats in the IWAD file, Addition WAD file and Map WAD file. + +Start and end lumps must be given in a structure (of which the +key name doesnt matter) and any textures or flats in between them +are loaded in either the textures category or flats category. + +For textures: PNAMES, TEXTURE1 and TEXTURE2 are loaded by default. +*/ + +// Texture sources +textures +{ + zdoom1 + { + start = "TX_START"; + end = "TX_END"; + } +} + +// Flat sources +flats +{ + standard1 + { + start = "F_START"; + end = "F_END"; + } + + standard2 + { + start = "FF_START"; + end = "FF_END"; + } + + standard3 + { + start = "FF_START"; + end = "F_END"; + } + + standard4 + { + start = "F_START"; + end = "FF_END"; + } +} + + +/* +GAME DETECT PATTERN +Used to guess the game for which a WAD file is made. + +1 = One of these lumps must exist +2 = None of these lumps must exist +3 = All of these lumps must exist +*/ + +gamedetect +{ + TEXTMAP = 3; + ENDMAP = 3; +} + + +/* +MAP LUMP NAMES +Map lumps are loaded with the map as long as they are right after each other. When the editor +meets a lump which is not defined in this list it will ignore the map if not satisfied. +The order of items defines the order in which lumps will be written to WAD file on save. +To indicate the map header lump, use ~MAP + +Legenda: +required = Lump is required to exist. +blindcopy = Lump will be copied along with the map blindly. (usefull for lumps Doom Builder doesn't use) +nodebuild = The nodebuilder generates this lump. +allowempty = The nodebuilder is allowed to leave this lump empty. +script = This lump is a text-based script. Specify the filename of the script configuration to use. +*/ + +maplumpnames +{ + ~MAP + { + required = true; + blindcopy = true; + nodebuild = false; + } + + TEXTMAP + { + required = true; + nodebuild = false; + allowempty = true; + } + + BEHAVIOR + { + required = false; + nodebuild = false; + blindcopy = true; + } + + ZNODES + { + required = false; + nodebuild = true; + allowempty = false; + } + + BLOCKMAP + { + required = false; + nodebuild = true; + allowempty = true; + } + + REJECT + { + required = false; + nodebuild = true; + allowempty = true; + } + + SCRIPTS + { + required = false; + nodebuild = false; + script = "ZDoom_ACS.cfg"; + } + + ENDMAP + { + required = true; + nodebuild = false; + allowempty = true; + } +} + + +/* +ADDITIONAL UNIVERSAL DOOM MAP FORMAT FIELD DEFINITIONS +Only add fields here that Doom Builder does not edit with its own user-interface! +The "default" is the editor's default value. Set "specdefault" to the UDMF specification's +default when "default" differs from the UDMF specification's default! + +Field data types: +0 = integer * +1 = float +2 = string +3 = bool +4 = linedeftype (integer) * +5 = sectoreffect (integer) * +6 = texture (string) +7 = flat (string) +8 = angle in degrees (integer) +9 = angle in radians (float) +10 = XXRRGGBB color (integer) +11 = enum option (integer) * +12 = enum bits (integer) * +13 = sector tag (integer) * +14 = thing tag (integer) * +15 = linedef tag (integer) * +16 = enum option (string) +*/ +universalfields +{ + linedefs + { + texture_scale_x + { + type = 1; + default = 1.0f; + } + + texture_scale_y + { + type = 1; + default = 1.0f; + } + + texture_offset_x + { + type = 1; + default = 0.0f; + } + + texture_offset_y + { + type = 1; + default = 0.0f; + } + + brightness + { + type = 0; + default = -1; + } + + colormap + { + type = 10; + default = 0; + } + + normalmap + { + type = 6; + default = ""; + } + + second_action + { + type = 4; + default = 0; + } + + hidden + { + type = 3; + default = false; + } + } +} + + +// DEFAULT SECTOR BRIGHTNESS LEVELS +sectorbrightness +{ + 255; + 240; + 224; + 208; + 192; + 176; + 160; + 144; + 128; + 112; + 96; + 80; + 64; + 48; + 32; + 16; + 0; +} + +// SECTOR TYPES +sectortypes +{ + 0 = "Normal"; + 1 = "Light Phased"; + 2 = "Light Sequence Start"; + 3 = "Light Sequence Special 1"; + 4 = "Light Sequence Special 2"; + 21 = "Light Phased"; + 22 = "Light Sequence Start"; + 23 = "Light Sequence Special 1"; + 24 = "Light Sequence Special 2"; + 26 = "Stairs Special 1"; + 27 = "Stairs Special 2"; + 65 = "Light Flicker"; + 66 = "Light Strobe Fast"; + 67 = "Light Strobe Slow"; + 68 = "Light Strobe Hurt"; + 69 = "Damage Hellslime"; + 71 = "Damage Nukage"; + 72 = "Light Glow"; + 74 = "Sector Door Close (30 sec)"; + 75 = "Damage End Level"; + 76 = "Light StrobeSlowSync"; + 77 = "Light StrobeFastSync"; + 78 = "Sector Door Raise (5 min)"; + 79 = "Low Friction"; + 80 = "Damage Super Hellslime"; + 81 = "Light Fire Flicker"; + 82 = "Damage -2 or -5% health (no protection)"; + 83 = "Damage -4 or -8% health (no protection)"; + 84 = "Scroll east + -2 or -5% health (no protection)"; + 105 = "Delayed damage weak"; + 115 = "Instant death (doesn't work in 2.0.93 yet!)"; + 116 = "Delayed damage strong"; + 118 = "Carry player by tag"; + 198 = "Light Indoor 2"; + 199 = "Light Indoor 1"; + 200 = "Sky 2 (MAPINFO)"; + 201 = "Scroll North (slow)"; + 202 = "Scroll North (medium)"; + 203 = "Scroll North (fast)"; + 204 = "Scroll East (slow)"; + 205 = "Scroll East (medium)"; + 206 = "Scroll East (fast)"; + 207 = "Scroll South (slow)"; + 208 = "Scroll South (medium)"; + 209 = "Scroll South (fast)"; + 210 = "Scroll West (slow)"; + 211 = "Scroll West (medium)"; + 212 = "Scroll West (fast)"; + 213 = "Scroll NorthWest (slow)"; + 214 = "Scroll NorthWest (medium)"; + 215 = "Scroll NorthWest (fast)"; + 216 = "Scroll NorthEast (slow)"; + 217 = "Scroll NorthEast (medium)"; + 218 = "Scroll NorthEast (fast)"; + 219 = "Scroll SouthEast (slow)"; + 220 = "Scroll SouthEast (medium)"; + 221 = "Scroll SouthEast (fast)"; + 222 = "Scroll SouthWest (slow)"; + 223 = "Scroll SouthWest (medium)"; + 224 = "Scroll SouthWest (fast)"; + 40 = "Wind East weak"; + 41 = "Wind East medium"; + 42 = "Wind East strong"; + 43 = "Wind North weak"; + 44 = "Wind North medium"; + 45 = "Wind North strong"; + 46 = "Wind South weak"; + 47 = "Wind South medium"; + 48 = "Wind South strong"; + 49 = "Wind West weak"; + 50 = "Wind West medium"; + 51 = "Wind West strong"; + 225 = "Carry East Slow"; + 226 = "Carry East Med.Slow"; + 227 = "Carry East Medium"; + 228 = "Carry East Med.Fast"; + 229 = "Carry East Fast"; + 230 = "Carry North Slow"; + 231 = "Carry North Med.Slow"; + 232 = "Carry North Medium"; + 233 = "Carry North Med.Fast"; + 234 = "Carry North Fast"; + 235 = "Carry South Slow"; + 236 = "Carry South Med.Slow"; + 237 = "Carry South Medium"; + 238 = "Carry South Med.Fast"; + 239 = "Carry South Fast"; + 240 = "Carry West Slow"; + 241 = "Carry West Med.Slow"; + 242 = "Carry West Medium"; + 243 = "Carry West Med.Fast"; + 244 = "Carry West Fast"; +} + +// GENERALIZED SECTOR TYPES +gen_sectortypes +{ + effect + { + 0 = "Normal"; + 1 = "Light Phased"; + 2 = "Light Sequence Start"; + 3 = "Light Sequence Special 1"; + 4 = "Light Sequence Special 2"; + 21 = "Light Phased"; + 22 = "Light Sequence Start"; + 23 = "Light Sequence Special 1"; + 24 = "Light Sequence Special 2"; + 26 = "Stairs Special 1"; + 27 = "Stairs Special 2"; + 65 = "Light Flicker"; + 66 = "Light Strobe Fast"; + 67 = "Light Strobe Slow"; + 68 = "Light Strobe Hurt"; + 69 = "Damage Hellslime"; + 71 = "Damage Nukage"; + 72 = "Light Glow"; + 74 = "Sector Door Close (30 sec)"; + 75 = "Damage End Level"; + 76 = "Light StrobeSlowSync"; + 77 = "Light StrobeFastSync"; + 78 = "Sector Door Raise (5 min)"; + 80 = "Damage Super Hellslime"; + 81 = "Light Fire Flicker"; + 82 = "Damage -2 or -5% health (no protection)"; + 83 = "Damage -4 or -8% health (no protection)"; + 84 = "Scroll east + -2 or -5% health (no protection)"; + 105 = "Delayed damage weak"; + 115 = "Instant death (doesn't work in 2.0.93 yet!)"; + 116 = "Delayed damage strong"; + 118 = "Carry player by tag"; + 198 = "Light Indoor 2"; + 199 = "Light Indoor 1"; + 200 = "Sky 2 (MAPINFO)"; + 201 = "Scroll North (slow)"; + 202 = "Scroll North (medium)"; + 203 = "Scroll North (fast)"; + 204 = "Scroll East (slow)"; + 205 = "Scroll East (medium)"; + 206 = "Scroll East (fast)"; + 207 = "Scroll South (slow)"; + 208 = "Scroll South (medium)"; + 209 = "Scroll South (fast)"; + 210 = "Scroll West (slow)"; + 211 = "Scroll West (medium)"; + 212 = "Scroll West (fast)"; + 213 = "Scroll NorthWest (slow)"; + 214 = "Scroll NorthWest (medium)"; + 215 = "Scroll NorthWest (fast)"; + 216 = "Scroll NorthEast (slow)"; + 217 = "Scroll NorthEast (medium)"; + 218 = "Scroll NorthEast (fast)"; + 219 = "Scroll SouthEast (slow)"; + 220 = "Scroll SouthEast (medium)"; + 221 = "Scroll SouthEast (fast)"; + 222 = "Scroll SouthWest (slow)"; + 223 = "Scroll SouthWest (medium)"; + 224 = "Scroll SouthWest (fast)"; + 40 = "Wind East weak"; + 41 = "Wind East medium"; + 42 = "Wind East strong"; + 43 = "Wind North weak"; + 44 = "Wind North medium"; + 45 = "Wind North strong"; + 46 = "Wind South weak"; + 47 = "Wind South medium"; + 48 = "Wind South strong"; + 49 = "Wind West weak"; + 50 = "Wind West medium"; + 51 = "Wind West strong"; + 225 = "Carry East Slow"; + 226 = "Carry East Med.Slow"; + 227 = "Carry East Medium"; + 228 = "Carry East Med.Fast"; + 229 = "Carry East Fast"; + 230 = "Carry North Slow"; + 231 = "Carry North Med.Slow"; + 232 = "Carry North Medium"; + 233 = "Carry North Med.Fast"; + 234 = "Carry North Fast"; + 235 = "Carry South Slow"; + 236 = "Carry South Med.Slow"; + 237 = "Carry South Medium"; + 238 = "Carry South Med.Fast"; + 239 = "Carry South Fast"; + 240 = "Carry West Slow"; + 241 = "Carry West Med.Slow"; + 242 = "Carry West Medium"; + 243 = "Carry West Med.Fast"; + 244 = "Carry West Fast"; + } + + damage + { + 0 = "None"; + 256 = "Damage 5 per second"; + 512 = "Damage 10 per second"; + 768 = "Damage 20 per second"; + } + + secret + { + 0 = "No"; + 1024 = "Yes"; + } + + friction + { + 0 = "Disabled"; + 2048 = "Enabled"; + } + + pusher + { + 0 = "Disabled"; + 4096 = "Enabled"; + } +} + +// LINEDEF FLAGS +linedefflags +{ + 1 = "Impassable"; + 2 = "Block Monster"; + 4 = "Double Sided"; + 8 = "Upper Unpegged"; + 16 = "Lower Unpegged"; + 32 = "Secret"; + 64 = "Block Sound"; + 128 = "Hidden"; + 256 = "Shown"; + 512 = "Repeatable Action"; + 8192 = "Monster Activates"; + 32768 = "Block Everything"; +} + +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + +// LINEDEF ACTIVATIONS +// Make sure these are in order from lowest value to highest value +linedefactivations +{ + 0 = "Player walks over"; + 1024 = "Player presses Use"; + 2048 = "Monster walks over"; + 3072 = "Projectile hits"; + 4096 = "Player bumps"; + 5120 = "Projectile flies over"; + 6144 = "Player presses Use (PassThru)"; + 7168 = "Projectile hits or crosses"; +} + +// LINEDEF TYPES +linedeftypes +{ + + misc + { + + 0 + { + title = "None"; + } + } + + + polyobj + { + title = "Polyobj"; + + 1 + { + title = "Polyobj Start Line"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Mirror Polyobj Number"; + } + + arg2 + { + title = "Sound Number"; + } + } + + 2 + { + title = "Polyobj Rotate Left"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Target Angle"; + } + } + + 3 + { + title = "Polyobj Rotate Right"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Target Angle"; + } + } + + 4 + { + title = "Polyobj Move"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Movement Length"; + } + } + + 5 + { + title = "Polyobj Explicit Line"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Rendering order"; + } + + arg2 + { + title = "Mirror Polyobj Number"; + } + + arg3 + { + title = "Sound Number"; + } + } + + 6 + { + title = "Polyobj Move (8px)"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Movement Length (8px)"; + } + } + + 7 + { + title = "Polyobj Door Swing"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Delay"; + } + } + + 8 + { + title = "Polyobj Door Slide"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Movement Length"; + } + + arg4 + { + title = "Delay"; + } + } + + 90 + { + title = "Polyobj Rotate Left (override)"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Target Angle"; + } + } + + 91 + { + title = "Polyobj Rotate Right (override)"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Target Angle"; + } + } + + 92 + { + title = "Polyobj Move (override)"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Movement Length"; + } + } + + 93 + { + title = "Polyobj Move (8px, override)"; + + arg0 + { + title = "Polyobj Number"; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Movement Length (8px)"; + } + } + } + + + line + { + title = "Line"; + + 9 + { + title = "Line Horizon"; + } + + 121 + { + title = "Line Identification"; + + arg0 + { + title = "Set Line ID"; + } + } + + 182 + { + title = "Line Mirror"; + } + } + + + door + { + title = "Door"; + + 10 + { + title = "Door Close"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Light Tag"; + type = 13; + } + } + + 11 + { + title = "Door Open"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Light Tag"; + type = 13; + } + } + + 12 + { + title = "Door Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Close Delay"; + } + + arg3 + { + title = "Light Tag"; + type = 13; + } + } + + 13 + { + title = "Door Locked Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Close Delay"; + } + + arg3 + { + title = "Key Number"; + type = 11; + enum = "keys"; + } + + arg4 + { + title = "Light Tag"; + type = 13; + } + } + + 14 + { + title = "Door Animated"; + + arg0 + { + title = "Sector tag"; + type = 13; + } + + arg1 + { + title = "Animation Speed"; + } + + arg2 + { + title = "Close Delay"; + } + } + + 202 + { + title = "Door Generic"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Type"; + type = 11; + enum = "generic_door_types"; + } + + arg3 + { + title = "Delay"; + } + + arg4 + { + title = "Lock"; + type = 11; + enum = "keys"; + } + } + + 249 + { + title = "Door Close Wait Open"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Delay"; + } + + arg3 + { + title = "Light Tag"; + type = 13; + } + } + } + + + autosave + { + title = "Autosave"; + + 15 + { + title = "Autosave"; + } + } + + + floor + { + title = "Floor"; + + 20 + { + title = "Floor Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 21 + { + title = "Floor Lower to Lowest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 22 + { + title = "Floor Lower to Nearest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 23 + { + title = "Floor Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 24 + { + title = "Floor Raise to Highest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 25 + { + title = "Floor Raise to Nearest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 28 + { + title = "Floor Crusher Start"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Crush Damage"; + } + } + + 35 + { + title = "Floor Raise (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 36 + { + title = "Floor Lower (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 46 + { + title = "Floor Crusher Stop"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 66 + { + title = "Floor Lower Instantly (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg2 + { + title = "Target Height (8px)"; + } + } + + 67 + { + title = "Floor Raise Instantly (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg2 + { + title = "Target Height (8px)"; + } + } + + 68 + { + title = "Floor Move (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Target Height (8px)"; + } + + arg3 + { + title = "Negative Height"; + type = 11; + enum = "noyes"; + } + } + + 95 + { + title = "Floor and Ceiling Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 96 + { + title = "Floor and Ceiling Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 138 + { + title = "Floor Waggle"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Amplitude"; + } + + arg2 + { + title = "Frequency"; + } + + arg3 + { + title = "Phase Offset"; + } + + arg4 + { + title = "Duration"; + } + } + + 200 + { + title = "Floor Generic Change"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + + arg3 + { + title = "Target"; + type = 11; + enum = "generic_floor_target"; + } + + arg4 + { + title = "Options"; + type = 12; + enum + { + 1 = "Remove effect"; + 2 = "Change texture"; + 3 = "Change special"; + 4 = "Numeric model"; + 8 = "Raise"; + 16 = "Crusher"; + } + } + } + + 235 + { + title = "Floor Transfer Trigger"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 236 + { + title = "Floor Transfer Numeric"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 238 + { + title = "Floor Raise to Lowest Ceiling"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 239 + { + title = "Floor Raise by TxTy"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 240 + { + title = "Floor Raise by Texture"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 241 + { + title = "Floor Lower to Lowest TxTy"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 242 + { + title = "Floor Lower to Highest"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Adjust Target Height"; + } + } + + 250 + { + title = "Floor Donut"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Pillar Movement Speed"; + } + + arg2 + { + title = "Stairs Movement Speed"; + } + } + + 251 + { + title = "Floor and Ceiling Lower and Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Floor Movement Speed"; + } + + arg2 + { + title = "Ceiling Movement Speed"; + } + } + } + + + stairs + { + title = "Stairs"; + + 26 + { + title = "Stairs Build Down"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Build Step Delay"; + } + + arg4 + { + title = "Reset Delay"; + } + } + + 27 + { + title = "Stairs Build Up"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Build Step Delay"; + } + + arg4 + { + title = "Reset Delay"; + } + } + + 31 + { + title = "Stairs Build Down (sync)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Reset Delay"; + } + } + + 32 + { + title = "Stairs Build Up (sync)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Reset Delay"; + } + } + + 204 + { + title = "Stairs Generic Build"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Options"; + type = 12; + enum + { + 1 = "Upwards"; + 2 = "Ignore textures"; + } + } + + arg4 + { + title = "Reset Delay"; + } + } + + 217 + { + title = "Stairs Build Doom"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Step Amount"; + } + + arg3 + { + title = "Build Step Delay"; + } + + arg4 + { + title = "Reset Delay"; + } + } + } + + + pillar + { + title = "Pillar"; + + 29 + { + title = "Pillar Build"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 30 + { + title = "Pillar Open"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Floor Movement Amount"; + } + + arg3 + { + title = "Ceiling Movement Amount"; + } + } + + 94 + { + title = "Pillar Build and Crush"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + } + + + forcefield + { + title = "Forcefield"; + + 33 + { + title = "Forcefield Set"; + } + + 34 + { + title = "Forcefield Remove"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + } + + + ceiling + { + title = "Ceiling"; + + 38 + { + title = "Ceiling Waggle"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Amplitude"; + } + + arg2 + { + title = "Frequency"; + } + + arg3 + { + title = "Phase Offset"; + } + + arg4 + { + title = "Duration"; + } + } + + 40 + { + title = "Ceiling Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 41 + { + title = "Ceiling Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 42 + { + title = "Ceiling Crusher Start"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Crush Damage"; + } + } + + 43 + { + title = "Ceiling Crush Once"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Crush Damage"; + } + } + + 44 + { + title = "Ceiling Crusher Stop"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 45 + { + title = "Ceiling Crush Once and Open"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Crush Damage"; + } + } + + 69 + { + title = "Ceiling Move (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + + arg3 + { + title = "Negative Height"; + type = 11; + enum = "noyes"; + } + } + + 192 + { + title = "Ceiling Lower to Highest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 193 + { + title = "Ceiling Lower Instantly"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 194 + { + title = "Ceiling Raise Instantly"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 195 + { + title = "Ceiling Crush Once and Open A"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Crush Movement Speed"; + } + + arg2 + { + title = "Raise Movement Speed"; + } + + arg3 + { + title = "Crush Damage"; + } + } + + 196 + { + title = "Ceiling Crush Start A"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Crush Movement Speed"; + } + + arg2 + { + title = "Raise Movement Speed"; + } + + arg3 + { + title = "Crush Damage"; + } + } + + 197 + { + title = "Ceiling Crush Start A (silent)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Crush Movement Speed"; + } + + arg2 + { + title = "Raise Movement Speed"; + } + + arg3 + { + title = "Crush Damage"; + } + } + + 198 + { + title = "Ceiling Raise (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 199 + { + title = "Ceiling Lower (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount (8px)"; + } + } + + 201 + { + title = "Ceiling Generic Change"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + + arg3 + { + title = "Target"; + type = 11; + enum = "generic_ceiling_target"; + } + + arg4 + { + title = "Options"; + type = 12; + enum + { + 1 = "Remove effect"; + 2 = "Change texture"; + 3 = "Change effect"; + 4 = "Numeric model"; + 8 = "Raise"; + 16 = "Crusher"; + } + } + } + + 205 + { + title = "Ceiling Generic Crush"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Crush Movement Speed"; + } + + arg2 + { + title = "Raise Movement Amount"; + } + + arg3 + { + title = "Silent"; + } + + arg4 + { + title = "Crush Damage"; + } + } + + 252 + { + title = "Ceiling Raise to Nearest Ceiling"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 253 + { + title = "Ceiling Lower to Lowest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 254 + { + title = "Ceiling Lower to Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 255 + { + title = "Ceiling Crush Once and Open A (silent)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Crush Movement Speed"; + } + + arg2 + { + title = "Raise Movement Speed"; + } + + arg3 + { + title = "Crush Damage"; + } + } + } + + + breakable + { + title = "Breakable"; + + 49 + { + title = "Breakable Glass"; + } + } + + + transfer + { + title = "Transfer"; + + 50 + { + title = "Transfer Brightness Level"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Options"; + type = 11; + enum + { + 0 = "From Control Ceiling Down to Type 0"; + 1 = "From Target Ceiling Down to Control Floor"; + 2 = "From Control Ceiling Down to Any"; + } + } + } + + 209 + { + title = "Transfer Heights"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Options"; + type = 12; + enum + { + 1 = "Use fake ceiling/floor"; + 2 = "Draw fake floor only"; + 4 = "Inside sector only"; + 8 = "Swimmable below fake"; + 16 = "Do not draw"; + 32 = "Keep lighting"; + } + } + } + + 210 + { + title = "Transfer Floor Brightness"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 211 + { + title = "Transfer Ceiling Brightness"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + } + + + platform + { + title = "Platform"; + + 60 + { + title = "Platform Perpetual Move"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + } + + 61 + { + title = "Platform Stop"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 62 + { + title = "Platform Lower Wait Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + } + + 63 + { + title = "Platform Lower (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + + arg3 + { + title = "Movement Amount (8px)"; + } + } + + 64 + { + title = "Platform Raise Wait Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + } + + 65 + { + title = "Platform Raise (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + + arg3 + { + title = "Movement Amount (8px)"; + } + } + + 172 + { + title = "Platform Raise to Nearest Wait Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + } + + 203 + { + title = "Platform Generic Change"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + + arg3 + { + title = "Type"; + type = 11; + enum = "generic_lift_types"; + } + + arg4 + { + title = "Movement Amount"; + } + } + + 206 + { + title = "Platform Lower Wait Raise (lip)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + + arg3 + { + title = "Lip Amount"; + } + + arg4 + { + title = "Movement sound type"; + } + } + + 207 + { + title = "Platform Perpetual Move (lip)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Reverse Delay"; + } + + arg3 + { + title = "Lip Amount"; + } + } + + 228 + { + title = "Platform Raise Tx0"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 230 + { + title = "Platform Raise by Value Tx (8px)"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + + arg2 + { + title = "Movement Amount"; + } + } + + 231 + { + title = "Platform Toggle Ceiling"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + } + + + teleport + { + title = "Teleport"; + + 39 + { + title = "Teleport to Pain State (silent)"; + + arg0 + { + title = "Target MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Target Sector Tag"; + type = 13; + } + } + + 70 + { + title = "Teleport"; + + arg0 + { + title = "Target MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Target Sector Tag"; + type = 13; + } + + arg2 + { + title = "Fog"; + type = 11; + enum = "yesno"; + } + } + + 71 + { + title = "Teleport (silent)"; + + arg0 + { + title = "Target MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Keep orientation"; + type = 11; + enum = "yesno"; + } + + arg2 + { + title = "Target Sector Tag"; + type = 13; + } + } + + 74 + { + title = "Teleport To Map"; + + arg0 + { + title = "Map Number"; + } + + arg1 + { + title = "Position"; + } + + arg2 + { + title = "Keep orientation"; + type = 11; + enum = "noyes"; + } + } + + 76 + { + title = "Teleport Other"; + + arg0 + { + title = "Thing ID"; + type = 14; + } + + arg1 + { + title = "Target Thing ID"; + type = 14; + } + + arg2 + { + title = "Fog"; + type = 11; + enum = "yesno"; + } + } + + 77 + { + title = "Teleport Group"; + + arg0 + { + title = "Group Thing ID"; + type = 14; + } + + arg1 + { + title = "Source Thing ID"; + type = 14; + } + + arg2 + { + title = "Target Thing ID"; + type = 14; + } + + arg3 + { + title = "Move source"; + type = 11; + enum = "yesno"; + } + + arg4 + { + title = "Fog"; + type = 11; + enum = "yesno"; + } + } + + 78 + { + title = "Teleport in sector"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Source Thing ID"; + type = 14; + } + + arg2 + { + title = "Target Thing ID"; + type = 14; + } + + arg3 + { + title = "Fog"; + type = 11; + enum = "noyes"; + } + + arg4 + { + title = "Group Thing ID"; + type = 14; + } + } + + 215 + { + title = "Teleport To Line"; + + arg0 + { + title = "Source Line Tag"; + type = 15; + } + + arg1 + { + title = "Target Line Tag"; + type = 15; + } + + arg2 + { + title = "Reverse Angle"; + type = 11; + enum = "noyes"; + } + } + } + + + thing + { + title = "Thing"; + + 72 + { + title = "Thing Thrust"; + + arg0 + { + title = "Thrust Angle"; + } + + arg1 + { + title = "Thrust Distance"; + } + } + + 73 + { + title = "Thing Damage"; + + arg0 + { + title = "Damage Amount"; + } + } + + 119 + { + title = "Thing Damage"; + + arg0 + { + title = "Thing ID"; + type = 14; + } + + arg1 + { + title = "Damage"; + } + + arg2 + { + title = "Death"; + type = 11; + enum = "death_types"; + } + } + + 125 + { + title = "Thing Move"; + + arg0 + { + title = "Thing ID"; + type = 14; + } + + arg1 + { + title = "Target Thing ID"; + type = 14; + } + } + + 127 + { + title = "Thing Set Special"; + + arg0 + { + title = "Thing ID"; + type = 14; + } + + arg1 + { + title = "Special"; + type = 4; + } + + arg2 + { + title = "Special arg 1"; + } + + arg3 + { + title = "Special arg 2"; + } + + arg4 + { + title = "Special arg 3"; + } + } + + 128 + { + title = "Thing Thrust Z"; + + arg0 + { + title = "Thing ID"; + type = 14; + } + + arg1 + { + title = "Force"; + } + + arg2 + { + title = "Down Up"; + type = 11; + enum = "updown"; + } + + arg3 + { + title = "Add Set"; + type = 11; + enum = "addset"; + } + } + + 130 + { + title = "Thing Activate"; + + arg0 + { + title = "Thing Tag"; + type = 14; + } + } + + 131 + { + title = "Thing Deactivate"; + + arg0 + { + title = "Thing Tag"; + type = 14; + } + } + + 132 + { + title = "Thing Remove"; + + arg0 + { + title = "Thing Tag"; + type = 14; + } + } + + 133 + { + title = "Thing Destroy"; + + arg0 + { + title = "Thing Tag"; + type = 14; + } + } + + 134 + { + title = "Thing Projectile"; + + arg0 + { + title = "MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Horizontal Speed"; + } + + arg4 + { + title = "Vertical Speed"; + } + } + + 135 + { + title = "Thing Spawn"; + + arg0 + { + title = "MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Thing Angle"; + } + } + + 136 + { + title = "Thing Projectile with Gravity"; + + arg0 + { + title = "MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Movement Angle"; + } + + arg3 + { + title = "Horizontal Speed"; + } + + arg4 + { + title = "Vertical Speed"; + } + } + + 137 + { + title = "Thing Spawn (silent)"; + + arg0 + { + title = "MapSpot Tag"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Thing Angle"; + } + } + + 139 + { + title = "Thing Spawn Facing"; + + arg0 + { + title = "Mapspot ID"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Fog"; + type = 11; + enum = "yesno"; + } + + arg3 + { + title = "New Thing ID"; + } + } + + 175 + { + title = "Thing Projectile Intercept"; + + arg0 + { + title = "Mapspot ID"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Speed"; + } + + arg3 + { + title = "Thing ID target"; + type = 14; + } + + arg4 + { + title = "New Thing ID"; + } + } + + 176 + { + title = "Thing ID Change"; + + arg0 + { + title = "Old Thing ID"; + type = 14; + } + + arg1 + { + title = "New Thing ID"; + } + } + + 177 + { + title = "Thing Hate"; + + arg0 + { + title = "Hater ID"; + type = 14; + } + + arg1 + { + title = "Hatee ID"; + type = 14; + } + + arg2 + { + title = "Hate"; + type = 11; + enum + { + 0 = "Target only"; + 1 = "Target and Player"; + 2 = "Forced Target and Player"; + 3 = "Hunt Target and Player"; + 4 = "Forced Hunt Target and Player"; + 5 = "Target, Ignore Player"; + 6 = "Forced Target, Ignore Player"; + } + } + } + + 178 + { + title = "Thing Aimed Projectile"; + + arg0 + { + title = "Mapspot ID"; + type = 14; + } + + arg1 + { + title = "Spawn Thing"; + type = 11; + enum = "spawnthing"; + } + + arg2 + { + title = "Speed"; + } + + arg3 + { + title = "Target Thing ID"; + type = 14; + } + + arg4 + { + title = "New Thing ID"; + } + } + + 180 + { + title = "Thing Set Translation"; + + arg0 + { + title = "Thing ID"; + } + + arg1 + { + title = "Translation index"; + } + } + + 229 + { + title = "Thing Goal"; + + arg0 + { + title = "Monster Thing Tag"; + type = 14; + } + + arg1 + { + title = "Target Thing Tag"; + type = 14; + } + + arg2 + { + title = "Delay"; + } + } + + 248 + { + title = "Thing Heal"; + + arg0 + { + title = "Health Amount"; + } + } + } + + + end + { + title = "End"; + + 75 + { + title = "End Game"; + } + + 243 + { + title = "End Normal"; + + arg0 + { + title = "Position"; + } + } + + 244 + { + title = "End Secret"; + + arg0 + { + title = "Position"; + } + } + } + + + script + { + title = "Script"; + + 80 + { + title = "Script Execute"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Map Number"; + } + + arg2 + { + title = "Script Argument 1"; + } + + arg3 + { + title = "Script Argument 2"; + } + + arg4 + { + title = "Script Argument 3"; + } + } + + 81 + { + title = "Script Suspend"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Map Number"; + } + } + + 82 + { + title = "Script Terminate"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Map Number"; + } + } + + 83 + { + title = "Script Locked Execute"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Map Number"; + } + + arg2 + { + title = "Script Argument 1"; + } + + arg3 + { + title = "Script Argument 2"; + } + + arg4 + { + title = "Key Number"; + type = 11; + enum = "keys"; + } + } + + 84 + { + title = "Script Execute with Result"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Script Argument 1"; + } + + arg2 + { + title = "Script Argument 2"; + } + + arg3 + { + title = "Script Argument 3"; + } + } + + 226 + { + title = "Script Execute Always"; + + arg0 + { + title = "Script Number"; + } + + arg1 + { + title = "Map Number"; + } + + arg2 + { + title = "Script Argument 1"; + } + + arg3 + { + title = "Script Argument 2"; + } + + arg4 + { + title = "Script Argument 3"; + } + } + } + + + scroll + { + title = "Scroll"; + + 100 + { + title = "Scroll Texture Left"; + + arg0 + { + title = "Scroll Speed"; + } + } + + 101 + { + title = "Scroll Texture Right"; + + arg0 + { + title = "Scroll Speed"; + } + } + + 102 + { + title = "Scroll Texture Up"; + + arg0 + { + title = "Scroll Speed"; + } + } + + 103 + { + title = "Scroll Texture Down"; + + arg0 + { + title = "Scroll Speed"; + } + } + + 221 + { + title = "Scroll Texture Both"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Left Speed"; + } + + arg2 + { + title = "Right Speed"; + } + + arg3 + { + title = "Down Speed"; + } + + arg4 + { + title = "Up Speed"; + } + } + + 222 + { + title = "Scroll Texture Model"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Options"; + type = 12; + enum + { + 1 = "Displacement"; + 2 = "Accelerative"; + } + } + } + + 223 + { + title = "Scroll Floor"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Options"; + type = 12; + enum + { + 1 = "Displacement"; + 2 = "Accelerative"; + 4 = "Scroll by linedef dx/dy"; + } + } + + arg2 + { + title = "Scroll"; + type = 11; + enum + { + 1 = "Texture only"; + 2 = "Things only"; + 4 = "Both"; + } + } + + arg3 + { + title = "Horizontal Speed"; + } + + arg4 + { + title = "Vertical Speed"; + } + } + + 224 + { + title = "Scroll Ceiling"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Options"; + type = 12; + enum + { + 1 = "Displacement"; + 2 = "Accelerative"; + 4 = "Scroll by linedef dx/dy"; + } + } + + arg2 + { + title = "Scroll"; + type = 11; + enum + { + 1 = "Texture only"; + 2 = "Things only"; + 4 = "Both"; + } + } + + arg3 + { + title = "Horizontal Speed"; + } + + arg4 + { + title = "Vertical Speed"; + } + } + + 225 + { + title = "Scroll Texture by Offsets"; + } + } + + + light + { + title = "Light"; + + 110 + { + title = "Light Raise"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Lighting Amount"; + } + } + + 111 + { + title = "Light Lower"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Lighting Amount"; + } + } + + 112 + { + title = "Light Change"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightness Level"; + } + } + + 113 + { + title = "Light Fade"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightness Level"; + } + + arg2 + { + title = "Fade Duration"; + } + } + + 114 + { + title = "Light Flow"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightest Level"; + } + + arg2 + { + title = "Darkest Level"; + } + + arg3 + { + title = "Fade Duration"; + } + } + + 115 + { + title = "Light Flicker"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightest Level"; + } + + arg2 + { + title = "Darkest Level"; + } + } + + 116 + { + title = "Light Strobe"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightest Level"; + } + + arg2 + { + title = "Darkest Level"; + } + + arg3 + { + title = "Brightest Duration"; + } + + arg4 + { + title = "Darkest Duration"; + } + } + + 117 + { + title = "Light Stop"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 232 + { + title = "Light Strobe Doom"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Brightest Duration"; + } + + arg2 + { + title = "Darkest Duration"; + } + } + + 233 + { + title = "Light Change to Darkest"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + + 234 + { + title = "Light Change to Brightest"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + } + } + + + earthquake + { + title = "Earthquake"; + + 120 + { + title = "Earthquake"; + + arg0 + { + title = "Intensity"; + } + + arg1 + { + title = "Duration"; + } + + arg2 + { + title = "Damage Radius"; + } + + arg3 + { + title = "Tremor Radius"; + } + + arg4 + { + title = "Thing Tag"; + type = 14; + } + } + } + + + use + { + title = "Use"; + + 129 + { + title = "Use Puzzle Item"; + + arg0 + { + title = "Item Number"; + } + + arg1 + { + title = "Script Number"; + } + + arg2 + { + title = "Script Argument 1"; + } + + arg3 + { + title = "Script Argument 2"; + } + + arg4 + { + title = "Script Argument 3"; + } + } + } + + + sector + { + title = "Sector"; + + 140 + { + title = "Sector Change Sound"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Sound Number"; + } + } + + 183 + { + title = "Sector Floor Alignment to Line"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Line Side"; + type = 11; + enum = "frontback"; + } + } + + 184 + { + title = "Sector Ceiling Alignment to Line"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Line Side"; + type = 11; + enum = "frontback"; + } + } + + 185 + { + title = "Sector Rotate Alignment"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Floor Angle"; + } + + arg2 + { + title = "Ceiling Angle"; + } + } + + 186 + { + title = "Sector Ceiling Panning"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Horizontal Integral"; + } + + arg2 + { + title = "Horizontal Fractional"; + } + + arg3 + { + title = "Vertical Integral"; + } + + arg4 + { + title = "Vertical Fractional"; + } + } + + 187 + { + title = "Sector Floor Panning"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Horizontal Integral"; + } + + arg2 + { + title = "Horizontal Fractional"; + } + + arg3 + { + title = "Vertical Integral"; + } + + arg4 + { + title = "Vertical Fractional"; + } + } + + 188 + { + title = "Sector Ceiling Scale"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Horizontal Integral"; + } + + arg2 + { + title = "Horizontal Fractional"; + } + + arg3 + { + title = "Vertical Integral"; + } + + arg4 + { + title = "Vertical Fractional"; + } + } + + 189 + { + title = "Sector Floor Scale"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Horizontal Integral"; + } + + arg2 + { + title = "Horizontal Fractional"; + } + + arg3 + { + title = "Vertical Integral"; + } + + arg4 + { + title = "Vertical Fractional"; + } + } + + 212 + { + title = "Sector Color"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Red"; + } + + arg2 + { + title = "Green"; + } + + arg3 + { + title = "Blue"; + } + } + + 213 + { + title = "Sector Fade"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Red"; + } + + arg2 + { + title = "Green"; + } + + arg3 + { + title = "Blue"; + } + } + + 214 + { + title = "Sector Damage"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Damage Amount"; + } + + arg2 + { + title = "Death"; + type = 11; + enum = "death_types"; + } + } + + 216 + { + title = "Sector Gravity"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Gravity Integral"; + } + + arg2 + { + title = "Gravity Fractional"; + } + } + + 218 + { + title = "Sector Wind"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Wind Strength"; + } + + arg2 + { + title = "Wind Angle"; + } + + arg3 + { + title = "Line Vector"; + } + } + + 219 + { + title = "Sector Friction"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Friction Amount"; + } + } + + 220 + { + title = "Sector Current"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Current Strength"; + } + + arg2 + { + title = "Current Angle"; + } + + arg3 + { + title = "Line Vector"; + } + } + } + + + alert + { + title = "Alert"; + + 173 + { + title = "Alert monsters"; + + arg0 + { + title = "Target ID"; + type = 14; + } + + arg1 + { + title = "Emitter ID"; + type = 14; + } + } + } + + + communicator + { + title = "Communicator"; + + 174 + { + title = "Communicator message"; + + arg0 + { + title = "Message ID"; + } + + arg1 + { + title = "Front side only"; + type = 11; + enum = "noyes"; + } + + arg2 + { + title = "Message identification"; + type = 11; + enum = "noyes"; + } + + arg3 + { + title = "Add to Log"; + type = 11; + enum = "yesno"; + } + } + } + + + change + { + title = "Change"; + + 179 + { + title = "Change Skill"; + + arg0 + { + title = "New Skill Level"; + } + } + } + + + plane + { + title = "Plane"; + + 181 + { + title = "Plane Align (slope)"; + + arg0 + { + title = "Align Floor"; + type = 11; + enum + { + 0 = "None"; + 1 = "Front"; + 2 = "Back"; + } + } + + arg1 + { + title = "Align Ceiling"; + type = 11; + enum + { + 0 = "None"; + 1 = "Front"; + 2 = "Back"; + } + } + } + } + + + static + { + title = "Static"; + + 190 + { + title = "Static Init"; + + arg0 + { + title = "Sector Tag"; + } + + arg1 + { + title = "Property"; + } + + arg2 + { + title = "Flip Sky"; + } + } + } + + + player + { + title = "Player"; + + 191 + { + title = "Player Property"; + + arg0 + { + title = "Everyone"; + } + + arg1 + { + title = "Toggle"; + } + + arg2 + { + title = "Property"; + } + } + } + + + translucent + { + title = "Translucent"; + + 208 + { + title = "Translucent Line"; + + arg0 + { + title = "Line Tag"; + type = 15; + } + + arg1 + { + title = "Transparency Amount"; + } + } + } + + + point + { + title = "Point"; + + 227 + { + title = "Point Pusher and Puller Force"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Thing Tag"; + type = 14; + } + + arg2 + { + title = "Strength"; + } + + arg3 + { + title = "Line Vector"; + } + } + } + + + camera + { + title = "Camera"; + + 237 + { + title = "Camera Change"; + + arg0 + { + title = "Thing Tag"; + type = 14; + } + + arg1 + { + title = "Everyone"; + type = 11; + enum = "noyes"; + } + + arg2 + { + title = "Movement Resets"; + type = 11; + enum = "noyes"; + } + } + } + + + elevator + { + title = "Elevator"; + + 245 + { + title = "Elevator Raise to Nearest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 246 + { + title = "Elevator Raise to Activated Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + + 247 + { + title = "Elevator Lower to Nearest Floor"; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + + arg1 + { + title = "Movement Speed"; + } + } + } + +} + + +// THING FLAGS +thingflags +{ + 1 = "Easy"; + 2 = "Medium"; + 4 = "Hard"; + 8 = "Deaf"; + 16 = "Dormant"; + 32 = "Fighter class"; + 64 = "Cleric class"; + 128 = "Mage class"; + 256 = "Singleplayer"; + 512 = "Cooperative"; + 1024 = "Deathmatch"; + 2048 = "Translucent (25%)"; + 4096 = "Invisible"; + 8192 = "Friendly"; + 16384 = "Frozen while inactive"; +} + +// THING FLAGS ERROR MASK +// Mask for the thing flags which indicates the options +// that make the same thing appear in the same modes +thingflagsmask1 = 7; // 1 + 2 + 4 +thingflagsmask2 = 1792; // 256 + 512 + 1024 + + +// THING TYPES +// Color numbers are the basic colors +// Arrow indicates if the things will have an arrow to indicate direction +// Sort: 0 = List as in configuration, 1 = List alphabetically +// Blocking: 0 = No, 1 = Completely, 2 = True-Height +// Error: +// 0 = Dont check for errors +// 1 = Must be inside map (default) +// 2 = Must be inside map and may not collide +thingtypes +{ + editor + { + color = 15; // White + arrow = 1; + title = "Editor Things"; + width = 16; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + error = 0; + + 32000 = "3D Mode start"; + } + + cameras + { + color = 7; // Light Grey + arrow = 1; + title = "Cameras and Interpolation"; + width = 16; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + error = 1; + + 9025 + { + title = "Camera"; + arg1 + { + title = "Pitch"; + } + arg2 + { + title = "Pan"; + } + arg3 + { + title = "Time"; + } + } + 9073 + { + title = "Aiming Camera"; + arg1 + { + title = "Pitch"; + } + arg2 + { + title = "Max Angle"; + } + arg3 + { + title = "Max Pitch"; + } + arg4 + { + title = "Thing"; + type = 14; + } + } + 9080 = "Skybox Viewpoint"; + 9081 + { + title = "Skybox Picker"; + arg1 + { + title = "Thing"; + type = 14; + } + } + 9074 + { + title = "Actor Mover"; + arg1 + { + title = "Point"; + } + arg2 + { + title = "High Point"; + } + arg3 + { + title = "Options"; + type = 12; + enum + { + 1 = "Linear path"; + 2 = "Use point angle"; + 4 = "Use point pitch"; + 8 = "Face movement direction"; + 128 = "Nonsolid"; + } + } + arg4 + { + title = "Thing"; + type = 14; + } + } + 9070 + { + title = "Interpolation point"; + arg1 + { + title = "Pitch"; + } + arg2 + { + title = "Travel Time"; + } + arg3 + { + title = "Hold Time"; + } + arg4 + { + title = "Next"; + } + arg5 + { + title = "High Next"; + } + } + 9075 = "Interpolation Special"; + 9072 + { + title = "Moving Camera"; + arg1 + { + title = "Point"; + } + arg2 + { + title = "High Point"; + } + arg3 + { + title = "Options"; + type = 12; + enum + { + 1 = "Linear path"; + 2 = "Use point angle"; + 4 = "Use point pitch"; + 8 = "Face movement direction"; + 128 = "Everyone"; + } + } + arg4 + { + title = "Thing"; + type = 14; + } + } + 9071 + { + title = "Path Follower"; + arg1 + { + title = "Point"; + } + arg2 + { + title = "High Point"; + } + arg3 + { + title = "Options"; + type = 12; + enum + { + 1 = "Linear path"; + 2 = "Use point angle"; + 4 = "Use point pitch"; + 8 = "Face movement direction"; + } + } + } + 9047 = "Patrol Special"; + } + + bridges + { + color = 8; // Grey + arrow = 0; + title = "Bridges"; + width = 16; + sort = 1; + height = 1; + hangs = 0; + blocking = 0; + error = 1; + + 5064 + { + title = "Bridge radius 16"; + width = 16; + } + 5061 + { + title = "Bridge radius 32"; + width = 32; + } + 5065 + { + title = "Bridge radius 8"; + width = 8; + } + 9990 + { + title = "Bridge Custom"; + arg1 = "Radius"; + arg2 = "Thickness"; + } + } + + players + { + color = 10; // Light Green + arrow = 1; + title = "Player Starts"; + width = 16; + sort = 1; + height = 56; + hangs = 0; + blocking = 2; + error = 2; + + 1 + { + title = "Player 1 start"; + sprite = "PLAYA2A8"; + } + 2 + { + title = "Player 2 start"; + sprite = "PLAYA2A8"; + } + 3 + { + title = "Player 3 start"; + sprite = "PLAYA2A8"; + } + 4 + { + title = "Player 4 start"; + sprite = "PLAYA2A8"; + } + 4001 + { + title = "Player 5 start"; + sprite = "PLAYA2A8"; + } + 4002 + { + title = "Player 6 start"; + sprite = "PLAYA2A8"; + } + 4003 + { + title = "Player 7 start"; + sprite = "PLAYA2A8"; + } + 4004 + { + title = "Player 8 start"; + sprite = "PLAYA2A8"; + } + 11 + { + title = "Player Deathmatch start"; + sprite = "PLAYF1"; + } + } + + teleports + { + color = 2; // Green + arrow = 1; + title = "Teleports"; + width = 16; + sort = 1; + height = 56; + hangs = 0; + blocking = 0; + error = 1; + + 14 + { + title = "Teleport Destination"; + sprite = "TFOGB0"; + } + 9044 + { + title = "Teleport with Z Height"; + sprite = "TFOGB0"; + } + } + + monsters + { + color = 12; // Light Red + arrow = 1; + title = "Monsters"; + width = 20; + sort = 1; + height = 56; + hangs = 0; + blocking = 2; + error = 2; + + 3004 + { + title = "Former Human"; + sprite = "POSSA2A8"; + } + + + 9 + { + title = "Former Sergeant"; + sprite = "SPOSA2A8"; + } + + + 3001 + { + title = "Imp"; + sprite = "TROOA2A8"; + } + + + 65 + { + title = "Chaingunner"; + sprite = "CPOSA2"; + } + + + 3002 + { + title = "Demon"; + width = 30; + sprite = "SARGA2A8"; + } + + + 58 + { + title = "Spectre"; + width = 30; + sprite = "SARGA2A8"; + } + + + 3006 + { + title = "Lost Soul"; + width = 16; + sprite = "SKULA8A2"; + } + + + 3005 + { + title = "Cacodemon"; + width = 31; + sprite = "HEADA2A8"; + } + + + 69 + { + title = "Hell Knight"; + width = 24; + sprite = "BOS2A2C8"; + height = 64; + } + + + 3003 + { + title = "Baron of Hell"; + width = 24; + sprite = "BOSSA2A8"; + height = 64; + } + + + 68 + { + title = "Arachnotron"; + width = 64; + sprite = "BSPIA2A8"; + height = 64; + } + + + 71 + { + title = "Pain Elemental"; + width = 31; + sprite = "PAINA2A8"; + } + + + 66 + { + title = "Revenant"; + sprite = "SKELA2D8"; + } + + + 67 + { + title = "Mancubus"; + width = 48; + sprite = "FATTC2C8"; + height = 64; + } + + + 64 + { + title = "Archvile"; + sprite = "VILEA2D8"; + } + + + 16 + { + title = "Cyberdemon"; + width = 40; + sprite = "CYBRA2"; + height = 110; + } + + + 7 + { + title = "Spider Mastermind"; + width = 128; + sprite = "SPIDA2A8"; + height = 100; + } + + + 84 + { + title = "Wolfenstein SS"; + sprite = "SSWVA2"; + } + + + 72 + { + title = "Commander Keen"; + width = 16; + sprite = "KEENA0"; + height = 72; + hangs = 1; + } + + + 88 + { + title = "Icon of Sin"; + width = 16; + sprite = "BBRNA0"; + height = 16; + } + + + 89 + { + title = "Monsters Spawner"; + sprite = "BOSFB0"; + height = 32; + } + + + 87 + { + title = "Monsters Target"; + height = 32; + } + + + 9050 + { + title = "Arachnotron (stealth)"; + width = 64; + sprite = "BSPIA2A8"; + height = 64; + } + + + 9051 + { + title = "Archvile (stealth)"; + width = 20; + sprite = "VILEA2D8"; + } + + + 9052 + { + title = "Baron of Hell (stealth)"; + width = 24; + sprite = "BOSSA2A8"; + height = 64; + } + + + 9053 + { + title = "Cacodemon (stealth)"; + width = 31; + sprite = "HEADA2A8"; + } + + + 9054 + { + title = "Chaingunner (stealth)"; + sprite = "CPOSA2"; + } + + + 9055 + { + title = "Demon (stealth)"; + width = 30; + sprite = "SARGA2A8"; + } + + + 9056 + { + title = "Hell Knight (stealth)"; + width = 24; + sprite = "BOS2A2C8"; + height = 64; + } + + + 9057 + { + title = "Imp (stealth)"; + sprite = "TROOA2A8"; + } + + + 9058 + { + title = "Mancubus (stealth)"; + width = 48; + sprite = "FATTC2C8"; + height = 64; + } + + + 9059 + { + title = "Revenant (stealth)"; + sprite = "SKELA2D8"; + } + + + 9060 + { + title = "Former Sergeant (stealth)"; + sprite = "SPOSA2A8"; + } + + + 9061 + { + title = "Former Human (stealth)"; + sprite = "POSSA2A8"; + } + } + + weapons + { + color = 14; // Yellow + arrow = 0; + title = "Weapons"; + width = 20; + sort = 1; + height = 25; + hangs = 0; + blocking = 0; + + 2005 + { + title = "Chainsaw"; + sprite = "CSAWA0"; + } + 2001 + { + title = "Shotgun"; + sprite = "SHOTA0"; + } + 82 + { + title = "Super Shotgun"; + sprite = "SGN2A0"; + } + 2002 + { + title = "Chaingun"; + sprite = "MGUNA0"; + } + 2003 + { + title = "Rocket launcher"; + sprite = "LAUNA0"; + } + 2004 + { + title = "Plasma gun"; + sprite = "PLASA0"; + } + 2006 + { + title = "BFG9000"; + sprite = "BFUGA0"; + height = 30; + } + } + + ammunition + { + color = 6; // Brown + arrow = 0; + title = "Ammunition"; + width = 16; + sort = 1; + height = 20; + blocking = 0; + hangs = 0; + + 2007 + { + title = "Ammo clip"; + sprite = "CLIPA0"; + } + 2008 + { + title = "Shotgun shells"; + sprite = "SHELA0"; + } + 2010 + { + title = "Rocket"; + sprite = "ROCKA0"; + height = 25; + } + 2047 + { + title = "Cell charge"; + sprite = "CELLA0"; + } + 2048 + { + title = "Box of Ammo"; + sprite = "AMMOA0"; + } + 2049 + { + title = "Box of Shells"; + sprite = "SBOXA0"; + } + 2046 + { + title = "Box of Rockets"; + sprite = "BROKA0"; + width = 30; + height = 25; + } + 17 + { + title = "Cell charge pack"; + sprite = "CELPA0"; + height = 25; + } + 8 + { + title = "Backpack"; + sprite = "BPAKA0"; + } + } + + health + { + color = 1; // Blue + arrow = 0; + title = "Health and Armor"; + width = 16; + sort = 1; + height = 20; + hangs = 0; + blocking = 0; + + 2011 + { + title = "Stimpack"; + sprite = "STIMA0"; + } + 2012 + { + title = "Medikit"; + sprite = "MEDIA0"; + height = 25; + } + 2014 + { + title = "Health bonus"; + sprite = "BON1A0"; + } + 2015 + { + title = "Armor bonus"; + sprite = "BON2A0"; + } + 2018 + { + title = "Green armor"; + sprite = "ARM1A0"; + } + 2019 + { + title = "Blue armor"; + sprite = "ARM2A0"; + } + } + + powerups + { + color = 9; // Light Blue + arrow = 0; + title = "Powerups"; + width = 20; + sort = 1; + height = 40; + hangs = 0; + blocking = 0; + + 83 + { + title = "Megasphere"; + sprite = "MEGAA0"; + height = 40; + } + 2013 + { + title = "Soulsphere"; + sprite = "SOULA0"; + height = 45; + } + 2022 + { + title = "Invulnerability"; + sprite = "PINVA0"; + height = 30; + } + 2023 + { + title = "Berserk"; + sprite = "PSTRA0"; + } + 2024 + { + title = "Invisibility"; + sprite = "PINSA0"; + height = 45; + } + 2025 + { + title = "Radiation suit"; + sprite = "SUITA0"; + height = 60; + } + 2026 + { + title = "Computer map"; + sprite = "PMAPA0"; + height = 35; + } + 2045 + { + title = "Lite Amplification goggles"; + sprite = "PVISA0"; + } + } + + keys + { + color = 13; // Light Magenta + arrow = 0; + title = "Keys"; + width = 16; + sort = 1; + height = 20; + hangs = 0; + blocking = 0; + + 5 + { + title = "Blue keycard"; + sprite = "BKEYA0"; + } + 40 + { + title = "Blue skullkey"; + sprite = "BSKUB0"; + } + 13 + { + title = "Red keycard"; + sprite = "RKEYA0"; + } + 38 + { + title = "Red skullkey"; + sprite = "RSKUB0"; + } + 6 + { + title = "Yellow keycard"; + sprite = "YKEYA0"; + } + 39 + { + title = "Yellow skullkey"; + sprite = "YSKUB0"; + } + } + + obstacles + { + color = 3; // Cyan + arrow = 0; + title = "Obstacles"; + width = 20; + sort = 1; + height = 20; + hangs = 0; + blocking = 2; + + 2035 + { + title = "Barrel"; + width = 10; + sprite = "BAR1A0"; + height = 32; + } + 70 + { + title = "Burning barrel"; + width = 10; + sprite = "FCANA0"; + height = 32; + } + 48 + { + title = "Tall techno pillar"; + sprite = "ELECA0"; + } + 30 + { + title = "Tall green pillar"; + sprite = "COL1A0"; + } + 32 + { + title = "Tall red pillar"; + sprite = "COL3A0"; + } + 31 + { + title = "Short green pillar"; + sprite = "COL2A0"; + } + 36 + { + title = "Short green pillar (beating heart)"; + sprite = "COL5A0"; + } + 33 + { + title = "Short red pillar"; + sprite = "COL4A0"; + } + 37 + { + title = "Short red pillar (skull)"; + sprite = "COL6A0"; + } + 47 + { + title = "Stalagmite"; + sprite = "SMITA0"; + } + 43 + { + title = "Gray tree"; + sprite = "TRE1A0"; + } + 54 + { + title = "Large brown tree"; + width = 32; + sprite = "TRE2A0"; + } + 41 + { + title = "Evil Eye"; + sprite = "CEYEA0"; + } + 42 + { + title = "Floating skull rock"; + sprite = "FSKUA0"; + } + } + + lights + { + color = 11; // Light Cyan + arrow = 0; + title = "Light sources"; + width = 16; + sort = 1; + height = 16; + hangs = 0; + blocking = 2; + + 85 + { + title = "Tall techno floor lamp"; + sprite = "TLMPA0"; + } + 86 + { + title = "Short techno floor lamp"; + sprite = "TLP2A0"; + } + 2028 + { + title = "Floor lamp"; + sprite = "COLUA0"; + } + 34 + { + title = "Candle"; + sprite = "CANDA0"; + blocking = 0; + } + 35 + { + title = "Candelabra"; + sprite = "CBRAA0"; + } + 44 + { + title = "Tall blue firestick"; + sprite = "TBLUA0"; + } + 45 + { + title = "Tall green firestick"; + sprite = "TGRNA0"; + } + 46 + { + title = "Tall red firestick"; + sprite = "TREDA0"; + } + 55 + { + title = "Short blue firestick"; + sprite = "SMBTA0"; + } + 56 + { + title = "Short green firestick"; + sprite = "SMGTA0"; + } + 57 + { + title = "Short red firestick"; + sprite = "SMRTA0"; + } + } + + decoration + { + color = 4; // Red + arrow = 0; + title = "Decoration"; + width = 16; + sort = 1; + height = 16; + hangs = 0; + blocking = 0; + + 79 + { + title = "Pool of blood"; + sprite = "POB2A0"; + } + + + 80 + { + title = "Pool of blood"; + sprite = "POL5A0"; + } + + + 81 + { + title = "Pool of brains"; + sprite = "BRS1A0"; + } + + + 49 + { + title = "Hanging victim, twitching (blocking)"; + sprite = "GOR1A0"; + height = 68; + hangs = 1; + blocking = 2; + } + + + 63 + { + title = "Hanging victim, twitching"; + sprite = "GOR1A0"; + height = 68; + hangs = 1; + } + + + 50 + { + title = "Hanging victim, arms out (blocking)"; + sprite = "GOR2A0"; + height = 84; + hangs = 1; + blocking = 2; + } + + + 59 + { + title = "Hanging victim, arms out"; + sprite = "GOR2A0"; + height = 84; + hangs = 1; + } + + + 52 + { + title = "Hanging pair of legs (blocking)"; + sprite = "GOR4A0"; + height = 68; + hangs = 1; + blocking = 2; + } + + + 60 + { + title = "Hanging pair of legs"; + sprite = "GOR4A0"; + height = 68; + hangs = 1; + } + + + 51 + { + title = "Hanging victim, 1-legged (blocking)"; + sprite = "GOR3A0"; + height = 84; + hangs = 1; + blocking = 2; + } + + + 61 + { + title = "Hanging victim, 1-legged"; + sprite = "GOR3A0"; + height = 52; + hangs = 1; + } + + + 53 + { + title = "Hanging leg (blocking)"; + sprite = "GOR5A0"; + height = 52; + hangs = 1; + blocking = 2; + } + + + 62 + { + title = "Hanging leg"; + sprite = "GOR5A0"; + height = 52; + hangs = 1; + } + + + 25 + { + title = "Impaled human"; + sprite = "POL1A0"; + blocking = 2; + } + + + 26 + { + title = "Twitching impaled human"; + sprite = "POL6A0"; + blocking = 2; + } + + + 27 + { + title = "Skull on a pole"; + sprite = "POL4A0"; + blocking = 2; + } + + + 28 + { + title = "5 skulls shish kebob"; + sprite = "POL2A0"; + blocking = 2; + } + + + 29 + { + title = "Pile of skulls and candles"; + sprite = "POL3A0"; + blocking = 2; + } + + + 10 + { + title = "Bloody mess 1"; + sprite = "PLAYW0"; + } + + + 12 + { + title = "Bloody mess 2"; + sprite = "PLAYW0"; + } + + + 24 + { + title = "Pool of blood and flesh"; + sprite = "POL5A0"; + } + + + 15 + { + title = "Dead player"; + sprite = "PLAYN0"; + } + + + 18 + { + title = "Dead former human"; + sprite = "POSSL0"; + width = 20; + } + + + 19 + { + title = "Dead former sergeant"; + sprite = "SPOSL0"; + width = 20; + } + + + 20 + { + title = "Dead imp"; + sprite = "TROOM0"; + width = 20; + } + + + 21 + { + title = "Dead demon"; + sprite = "SARGN0"; + width = 30; + } + + + 22 + { + title = "Dead cacodemon"; + sprite = "HEADL0"; + width = 31; + } + + + 23 + { + title = "Dead lost soul"; + } + + + 73 + { + title = "Hanging victim, guts removed"; + sprite = "HDB1A0"; + height = 88; + hangs = 1; + blocking = 2; + } + + + 74 + { + title = "Hanging victim, guts and brain removed"; + sprite = "HDB2A0"; + height = 88; + hangs = 1; + blocking = 2; + } + + + 75 + { + title = "Hanging torso, looking down"; + sprite = "HDB3A0"; + height = 64; + hangs = 1; + blocking = 2; + } + + + 76 + { + title = "Hanging torso, open skull"; + sprite = "HDB4A0"; + height = 64; + hangs = 1; + blocking = 2; + } + + + 77 + { + title = "Hanging torso, looking down"; + sprite = "HDB5A0"; + height = 64; + hangs = 1; + blocking = 2; + } + + + 78 + { + title = "Hanging torso, brain removed"; + sprite = "HDB6A0"; + height = 64; + hangs = 1; + blocking = 2; + } + 9027 = "Red Particle Fountain"; + 9028 = "Green Particle Fountain"; + 9029 = "Blue Particle Fountain"; + 9030 = "Yellow Particle Fountain"; + 9031 = "Purple Particle Fountain"; + 9032 = "Black Particle Fountain"; + 9033 = "White Particle Fountain"; + } + + sectors + { + color = 7; + arrow = 0; + title = "Sector Actions"; + width = 0; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + + 9082 = "Silent Sector"; + 9998 = "Actor enters sector"; + 9989 = "Actor hits fake floor"; + 9996 = "Actor hits ceiling"; + 9999 = "Actor hits floor"; + 9997 = "Actor leaves sector"; + 9982 = "Eyes above fake ceiling"; + 9992 = "Eyes above fake floor"; + 9983 = "Eyes below fake ceiling"; + 9993 = "Eyes below fake floor"; + 9995 = "Player uses sector"; + 9994 = "Player uses wall"; + } + + sounds + { + color = 5; // Purple + arrow = 0; + title = "Sounds"; + width = 0; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + + 1400 = "Sound Sequence 0"; + 1401 = "Sound Sequence 1"; + 1402 = "Sound Sequence 2"; + 1403 = "Sound Sequence 3"; + 1404 = "Sound Sequence 4"; + 1405 = "Sound Sequence 5"; + 1406 = "Sound Sequence 6"; + 1407 = "Sound Sequence 7"; + 1408 = "Sound Sequence 8"; + 1409 = "Sound Sequence 9"; + 1411 + { + title = "Sound Sequence"; + arg1 + { + title = "Sound Sequence Number"; + } + } + 14001 = "Ambient Sound 1"; + 14002 = "Ambient Sound 2"; + 14003 = "Ambient Sound 3"; + 14004 = "Ambient Sound 4"; + 14005 = "Ambient Sound 5"; + 14006 = "Ambient Sound 6"; + 14007 = "Ambient Sound 7"; + 14008 = "Ambient Sound 8"; + 14009 = "Ambient Sound 9"; + 14010 = "Ambient Sound 10"; + 14011 = "Ambient Sound 11"; + 14012 = "Ambient Sound 12"; + 14013 = "Ambient Sound 13"; + 14014 = "Ambient Sound 14"; + 14015 = "Ambient Sound 15"; + 14016 = "Ambient Sound 16"; + 14017 = "Ambient Sound 17"; + 14018 = "Ambient Sound 18"; + 14019 = "Ambient Sound 19"; + 14020 = "Ambient Sound 20"; + 14021 = "Ambient Sound 21"; + 14022 = "Ambient Sound 22"; + 14023 = "Ambient Sound 23"; + 14024 = "Ambient Sound 24"; + 14025 = "Ambient Sound 25"; + 14026 = "Ambient Sound 26"; + 14027 = "Ambient Sound 27"; + 14028 = "Ambient Sound 28"; + 14029 = "Ambient Sound 29"; + 14030 = "Ambient Sound 30"; + 14031 = "Ambient Sound 31"; + 14032 = "Ambient Sound 32"; + 14033 = "Ambient Sound 33"; + 14034 = "Ambient Sound 34"; + 14035 = "Ambient Sound 35"; + 14036 = "Ambient Sound 36"; + 14037 = "Ambient Sound 37"; + 14038 = "Ambient Sound 38"; + 14039 = "Ambient Sound 39"; + 14040 = "Ambient Sound 40"; + 14041 = "Ambient Sound 41"; + 14042 = "Ambient Sound 42"; + 14043 = "Ambient Sound 43"; + 14044 = "Ambient Sound 44"; + 14045 = "Ambient Sound 45"; + 14046 = "Ambient Sound 46"; + 14047 = "Ambient Sound 47"; + 14048 = "Ambient Sound 48"; + 14049 = "Ambient Sound 49"; + 14050 = "Ambient Sound 50"; + 14051 = "Ambient Sound 51"; + 14052 = "Ambient Sound 52"; + 14053 = "Ambient Sound 53"; + 14054 = "Ambient Sound 54"; + 14055 = "Ambient Sound 55"; + 14056 = "Ambient Sound 56"; + 14057 = "Ambient Sound 57"; + 14058 = "Ambient Sound 58"; + 14059 = "Ambient Sound 59"; + 14060 = "Ambient Sound 60"; + 14061 = "Ambient Sound 61"; + 14062 = "Ambient Sound 62"; + 14063 = "Ambient Sound 63"; + 14064 = "Ambient Sound 64"; + 14065 + { + title = "Ambient Sound"; + arg1 + { + title = "Ambient Sound Number"; + } + } + } + + marine + { + color = 15; + arrow = 1; + title = "Marines"; + width = 16; + sort = 1; + height = 56; + hangs = 0; + blocking = 0; + + 9100 = "Scripted Marine"; + 9101 = "Marine Fist"; + 9102 = "Marine Berserk"; + 9103 = "Marine Chainsaw"; + 9104 = "Marine Pistol"; + 9105 = "Marine Shotgun"; + 9106 = "Marine SSG"; + 9107 = "Marine Chaingun"; + 9108 = "Marine Rocket Launcher"; + 9109 = "Marine Plasma Rifle"; + 9110 = "Marine Railgun"; + 9111 = "Marine BFG9000"; + } + + slopes + { + color = 8; // Grey + arrow = 0; + title = "Slopes"; + width = 0; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + + 9511 + { + title = "Copy ceiling plane"; + arg1 + { + title = "Sector Tag"; + type = 13; + } + } + 9510 + { + title = "Copy floor plane"; + arg1 + { + title = "Sector Tag"; + type = 13; + } + } + 9503 + { + title = "Set ceiling slope"; + arrow = 1; + arg1 + { + title = "Z-Angle"; + } + } + 9502 + { + title = "Set floor slope"; + arrow = 1; + arg1 + { + title = "Z-Angle"; + } + } + 9501 + { + title = "Slope ceiling to here"; + arg1 + { + title = "Line"; + type = 15; + } + } + 9500 + { + title = "Slope floor to here"; + arg1 + { + title = "Line"; + type = 15; + } + } + } + + zdoom + { + color = 7; // Light Grey + arrow = 1; + title = "ZDoom"; + width = 0; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + + 9200 + { + title = "Decal"; + arg1 + { + title = "Decal ID"; + } + } + 5001 = "Pusher"; + 5002 = "Puller"; + 9024 + { + title = "Path Node"; + arg1 + { + title = "Next Node"; + type = 14; + } + arg2 + { + title = "Delay"; + } + } + 9026 + { + title = "Spark"; + arg1 + { + title = "Particles Amount"; + } + } + 9045 = "Deep Water"; + 9046 = "Secret"; + 9300 = "Polyobject Anchor"; + 9301 = "Polyobject Start Spot"; + 9302 = "Polyobject Start Spot (crush)"; + 9303 = "Polyobject Spawn(Hurts to touch)"; + 9001 = "Map Spot"; + 9013 = "Map Spot (gravity)"; + 9076 = "Hate target"; + } + + portals + { + color = 7; + arrow = 0; + title = "Portals"; + width = 0; + sort = 1; + height = 0; + hangs = 0; + blocking = 0; + + 9077 + { + title = "Upper Sector"; + arg1 + { + title = "Flat Transparency"; + } + } + + 9078 + { + title = "Lower Sector"; + arg1 + { + title = "Flat Transparency"; + } + } + } +} + + +// ENUMERATIONS +// These are enumerated lists for linedef types and UDMF fields. +enums +{ + yesno + { + 1 = "Yes"; + 0 = "No"; + } + + noyes + { + 0 = "Yes"; + 1 = "No"; + } + + onoff + { + 0 = "On"; + 1 = "Off"; + } + + offon + { + 1 = "On"; + 0 = "Off"; + } + + updown + { + 0 = "Up"; + 1 = "Down"; + } + + addset + { + 0 = "Add"; + 1 = "Set"; + } + + frontback + { + 0 = "Front"; + 1 = "Back"; + } + + backfront + { + 1 = "Front"; + 0 = "Back"; + } + + keys + { + 0 = "None"; + 1 = "Red key card"; + 2 = "Blue key card"; + 3 = "Yellow key card"; + 4 = "Red skull key"; + 5 = "Blue skull key"; + 6 = "Yellow skull key"; + 100 = "Any key"; + 101 = "All keys"; + 102 = "Impossible"; + 129 = "Any red key"; + 130 = "Any blue key"; + 131 = "Any yellow key"; + 229 = "One of each color"; + } + + spawnthing + { + 0 = "None"; + 1 = "Shotgun Guy"; + 2 = "Chaingun Guy"; + 3 = "Baron Of Hell"; + 4 = "Zombieman"; + 5 = "Imp"; + 6 = "Arachnotron"; + 7 = "Spider Mastermind"; + 8 = "Demon"; + 9 = "Spectre"; + 10 = "Imp Fireball"; + 11 = "Clip"; + 12 = "Shells"; + 19 = "Cacodemon"; + 20 = "Revenant"; + 21 = "Bridge"; + 22 = "Armour Bonus"; + 23 = "Stimpack"; + 24 = "Medkit"; + 25 = "Soul Sphere"; + 27 = "Shotgun"; + 28 = "Chaingun"; + 29 = "Rocket Launcher"; + 30 = "Plasma Gun"; + 31 = "BFG"; + 32 = "Chainsaw"; + 33 = "Super Shotgun"; + 51 = "Plasma Bolt"; + 53 = "Tracer"; + 68 = "Green Armour"; + 69 = "Blue Armour"; + 75 = "Cell"; + 85 = "Blue Keycard"; + 86 = "Red Keycard"; + 87 = "Yellow Keycard"; + 88 = "Yellow Skullkey"; + 89 = "Red Skullkey"; + 90 = "Blue Skullkey"; + 98 = "Temp Large Flame"; + 100 = "Stealth Baron"; + 101 = "Stealth Hell Knight"; + 102 = "Stealth Zombieman"; + 103 = "Stealth Shotgun Guy"; + 110 = "Lost Soul"; + 111 = "Arch-Vile"; + 112 = "Mancubus"; + 113 = "Hell Knight"; + 114 = "Cyberdemon"; + 115 = "Pain Elemental"; + 116 = "Wolf SS Soldier"; + 117 = "Stealth Arachnotron"; + 118 = "Stealth Arch-Vile"; + 119 = "Stealth Cacodemon"; + 120 = "Stealth Chaingun Guy"; + 121 = "Stealth Demon"; + 122 = "Stealth Imp"; + 123 = "Stealth Mancubus"; + 124 = "Stealth Revenant"; + 125 = "Barrel"; + 126 = "Cacodemon Shot"; + 127 = "Rocket (Projectile)"; + 128 = "BFG Shot"; + 129 = "Arachnotron Plasma Bolt"; + 130 = "Blood"; + 131 = "Bullet Puff"; + 132 = "Megasphere"; + 133 = "Invulnerability Sphere"; + 134 = "Berserk Pack"; + 135 = "Invisibility Sphere"; + 136 = "Radiation Suit"; + 137 = "Computer Map"; + 138 = "Light-Amp Goggles"; + 139 = "Box Of Ammo"; + 140 = "Rocket (Ammo)"; + 141 = "Box Of Rockets"; + 142 = "Larce Cell"; + 143 = "Box Of Shells"; + 144 = "Backpack"; + 145 = "Guts"; + 146 = "Blood Pool 1"; + 147 = "Blood Pool 2"; + 148 = "Blood Pool 3"; + 149 = "Flaming Barrel"; + 150 = "Brains"; + 151 = "Scripted Marine"; + 152 = "Health Bonus"; + 153 = "Mancubus Shot"; + 154 = "Baron Fireball"; + } + + generic_floor_target + { + 0 = "Relative offset"; + 1 = "Highest neighbor"; + 2 = "Lowest neighbor"; + 3 = "Nearest neighbor"; + 4 = "Lowest neighbor"; + 5 = "Ceiling"; + 6 = "Shortest lower texture"; + } + + generic_ceiling_target + { + 0 = "Relative offset"; + 1 = "Highest neighbor"; + 2 = "Lowest neighbor"; + 3 = "Nearest neighbor"; + 4 = "Highest neighbor"; + 5 = "Floor"; + 6 = "Shortest lower texture"; + } + + generic_door_types + { + 0 = "Open Close"; + 1 = "Open Stay"; + 2 = "Close Open"; + 3 = "Close Stay"; + } + + generic_lift_types + { + 0 = "Up Stay"; + 1 = "Down Up"; + 2 = "Down to nearest"; + 3 = "Down to lowest"; + 4 = "Perpetual raise"; + } + + death_types + { + 0 = "Unknown"; + 12 = "Water"; + 13 = "Slime"; + 14 = "Lava"; + 15 = "Crush"; + 16 = "Telefrag"; + 17 = "Falling"; + 18 = "Suicide"; + 19 = "Barrel"; + 20 = "Exit"; + 21 = "Splash"; + 22 = "Hit"; + } +} diff --git a/Build/Configurations/ZDoom_HereticHexen.cfg b/Build/Configurations/ZDoom_HereticHexen.cfg index 73dc99f3..657fbfe5 100644 --- a/Build/Configurations/ZDoom_HereticHexen.cfg +++ b/Build/Configurations/ZDoom_HereticHexen.cfg @@ -480,6 +480,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Build/Configurations/ZDoom_Hexen.cfg b/Build/Configurations/ZDoom_Hexen.cfg index c81ebc7f..efab252b 100644 --- a/Build/Configurations/ZDoom_Hexen.cfg +++ b/Build/Configurations/ZDoom_Hexen.cfg @@ -325,6 +325,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Build/Configurations/ZDoom_StrifeHexen.cfg b/Build/Configurations/ZDoom_StrifeHexen.cfg index de3e69d8..440be284 100644 --- a/Build/Configurations/ZDoom_StrifeHexen.cfg +++ b/Build/Configurations/ZDoom_StrifeHexen.cfg @@ -485,6 +485,10 @@ linedefflags 32768 = "Block Everything"; } +// Activations filter for Hexen type activations +// This filters the activation bits from the flags +linedefactivationsfilter = 7168; + // LINEDEF ACTIVATIONS // Make sure these are in order from lowest value to highest value linedefactivations diff --git a/Documents/udmf_zd11.txt b/Documents/udmf_zd11.txt new file mode 100644 index 00000000..88102028 --- /dev/null +++ b/Documents/udmf_zd11.txt @@ -0,0 +1,219 @@ +=============================================================================== +Universal Doom Map Format ZDoom extensions v1.1 - 27.05.2008 + + + Copyright (c) 2008 Christoph Oelckers. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + +=============================================================================== + +This document discusses only the additions ZDoom makes to the UDMF +specification. + +======================================= +I. Grammar / Syntax +======================================= + + No changes. + +======================================= +II. Implementation Semantics +======================================= + +------------------------------------ +II.A : Storage and Retrieval of Data +------------------------------------ + +No changes. + +----------------------------------- +II.B : Storage Within Archive Files +----------------------------------- + +In addition to the base specification ZDoom recognizes the following lumps +between the TEXTMAP and ENDMAP lumps: + + BEHAVIOR = contains compiled ACS code + DIALOGUE = contains compiled Strife conversation scripts. + ZNODES = Nodes (must be stored as compressed GL nodes) + BLOCKMAP = blockmap. It is recommended not to include this lump in UDMF maps. + REJECT = reject table. Recommended use is for special effects only. + + Lumps starting with 'SCRIPT' are guaranteed to be ignored by ZDoom so they + can be used to store ACS and dialogue script sources. + +-------------------------------- +II.C : Implementation Dependence +-------------------------------- + +ZDoom supports all namespaces defined in the base specification and adds two new +ones: + "ZDoom" + "ZDoomTranslated" + +The only difference between these two namespaces is how line, thing and sector +specials are handled: + +'ZDoom' uses Hexen type specials which are ZDoom's native implementation. + +'ZDoomTranslated' uses Doom-type specials. Such maps have to be processed by +a special translator. A special translator is a text lump that defines how +Doom-format specials are translated into Hexen-format specials. By default +each game defines its own translation table but these can be overridden in +MAPINFO. It is the mapper's responsibility to choose the correct translation +table for a map. + + +======================================= +III. Standardized Fields +======================================= + +ZDoom's namespaces implement all fields from the standard, regardless of +any restrictions mentioned in the spec. +In particular, the 'ZDoomTranslated' namespaces implements thing specials. +These will ignore the implicit trigger type and triggering semantics are the +same as for native maps. +The only field not fully supported is the thing's 'friend' field. ZDoom does +not offer MBF's friendly monster implementation and will remap any use of this +field to 'strifeally', even for the 'Doom' namespace. + +In addition to the standard fields, ZDoom defines the following: +Note: All fields default to false unless mentioned otherwise. + + linedef + { + alpha = ; // Translucency of this line, default is 1.0 + renderstyle = ; // Render style, can be "translucent" or "add", + // default is "translucent". + anycross = ; // New SPAC flag, true = any non-projectile + // crossing will trigger this line + monsteractivate = ; // Monsters can trigger this line. + // For compatibility only because this flag's + // semantics can not be fully reproduced with + // explicit trigger flags. + blockplayers = ; // Line blocks players' movement. + blockeverything = ; // Line blocks everything. + firstsideonly = ; // Line can only be triggered from the front side. + zoneboundary = ; // Line is a boundary for sound reverb zones. + clipmidtex = ; // Line's mid textures are clipped to floor and ceiling. + wrapmidtex = ; // Line's mid textures are wrapped. + midtex3d = ; // Actors can walk on mid texture. + checkswitchrange = ;// Switches can only be activated when vertically reachable. + + } + + sidedef + { + offsetx_top = ; // X offset for upper texture, Default = 0.0. + offsety_top = ; // y offset for upper texture, Default = 0.0. + offsetx_mid = ; // X offset for mid texture, Default = 0.0. + offsety_mid = ; // y offset for mid texture, Default = 0.0. + offsetx_bottom = ; // X offset for lower texture, Default = 0.0. + offsety_bottom = ; // y offset for lower texture, Default = 0.0. + // When global texture offsets are used they will + // be added on top of these values. + light = ; // This side's light level. Default is 0. + lightabsolute = ; // true = 'light' is an absolute value. Default is + // relative to the owning sector's light level. + nofakecontrast = ; // Disables use of fake contrast on this sidedef. + } + + sector + { + xpanningfloor = ; // X texture offset of floor texture, Default = 0.0. + ypanningfloor = ; // Y texture offset of floor texture, Default = 0.0. + xpanningceiling = ; // X texture offset of ceiling texture, Default = 0.0. + ypanningceiling = ; // Y texture offset of ceiling texture, Default = 0.0. + xscalefloor = ; // X texture scale of floor texture, Default = 1.0. + yscalefloor = ; // Y texture scale of floor texture, Default = 1.0. + xscaleceiling = ; // X texture scale of ceiling texture, Default = 1.0. + yscaleceiling = ; // Y texture scale of ceiling texture, Default = 1.0. + rotationfloor = ; // Rotation of floor texture in degrees, Default = 0.0. + rotationceiling = ; // Rotation of ceiling texture in degrees, Default = 0.0. + lightfloor = ; // The floor's light level. Default is 0. + lightceiling = ; // The ceiling's light level. Default is 0. + lightfloorabsolute = ; // true = 'lightfloor' is an absolute value. Default is + // relative to the owning sector's light level. + lightceilingabsolute = ; // true = 'lightceiling' is an absolute value. Default is + // relative to the owning sector's light level. + gravity = ; // Sector's gravity. Default is 1.0. + lightcolor = ; // Sector'S light color as RRGGBB value, default = 0xffffff. + fadecolor = ; // Sector'S fog color as RRGGBB value, default = 0x000000. + desaturation = ; // Color desaturation factor. 0 = none, 1 = full, default = 0. + silent = ; // Actors in this sector make no sound, + nofallingdamage = ; // Falling damage is disabled in this sector + dropactors = ; // Actors drop with instantly moving floors + + * Note about dropactors + + The spec requires this to be false by default. Currently, however ZDoom assumes this to be true + for Doom format maps so any map converter converting to the ZDoomTranslated namespace should + set this flag for each tagged sector. + + } + + thing + { + skill[n] = // Unlike the base spec, n can range from 1-8. + // 8 is the maximum amount of skills the skill + // menu can display. + class[n] = // Unlike the base spec, n can range from 1-8. + // 8 is the maximum amount of classes the class + // menu can display. + } + + +*** Special notes for map format conversions: + + Setting the line's ID via special is not supported so any special using + this option must be converted to use the line's ID field instead. + Unless mentioned differently the arg being used to define the line ID + should be set to 0. + The following line specials are affected: + + 121: Line_SetIdentification, arg 0 + 208: TranslucentLine, arg0 (arg0 must be preserved) + 1: Polyobj_StartLine, arg3 + 5: Polyobj_ExplicitLine, arg4 + 215: Teleport_Line, arg0 + 222: Scroll_Texture_Model, arg0 (arg0 must be preserved) + + Some specials also allow setting the extended flags. These must also be + converted to explicitly setting the flags through the defined map fields. + This affects the following specials: + + 121: Line_SetIdentification, arg1 + 208: TranslucentLine, arg2 + + These args are to be converted as follows to flags, bit by bit: + + Bit 0 (Value 1): zoneboundary + Bit 1 (Value 2): jumpover + Bit 2 (Value 4): blockfloaters + Bit 3 (Value 8): clipmidtex + Bit 4 (Value 16): wrapmidtex + Bit 5 (Value 32): midtex3d + Bit 6 (Value 64): checkswitchrange + + When used in special 208 this arg should be cleared afterward. + + Special 121 is not being used by UDMF maps in ZDoom and should be completely + deleted after conversion. + + +======================================= +Changelog +======================================= + +1.1: +Changed default light mode for sectors and sidedefs to relative and renamed +associated properties to avoid having a non-intuitive standard value for the +light field. +Added 'nofakecontrast' option to sidedefs. + +=============================================================================== +EOF +=============================================================================== diff --git a/Source/Builder.csproj b/Source/Builder.csproj index e160e080..9da17a00 100644 --- a/Source/Builder.csproj +++ b/Source/Builder.csproj @@ -123,6 +123,7 @@ + @@ -574,6 +575,7 @@ + Designer AngleControl.cs diff --git a/Source/Config/GameConfiguration.cs b/Source/Config/GameConfiguration.cs index eebfabb9..3955f9b7 100644 --- a/Source/Config/GameConfiguration.cs +++ b/Source/Config/GameConfiguration.cs @@ -46,14 +46,15 @@ namespace CodeImp.DoomBuilder.Config private float defaulttexturescale; private float defaultflatscale; private string formatinterface; - private int soundlinedefflags; - private int singlesidedflags; - private int doublesidedflags; - private int impassableflags; + private string soundlinedefflag; + private string singlesidedflag; + private string doublesidedflag; + private string impassableflag; private bool mixtexturesflats; private bool generalizedactions; private bool generalizedeffects; private int start3dmodethingtype; + private int linedefactivationsfilter; // Map lumps private IDictionary maplumpnames; @@ -63,12 +64,12 @@ namespace CodeImp.DoomBuilder.Config private IDictionary flatranges; // Things - private Dictionary thingflags; + private Dictionary thingflags; private List thingcategories; private Dictionary things; // Linedefs - private Dictionary linedefflags; + private Dictionary linedefflags; private Dictionary linedefactions; private List sortedlinedefactions; private List actioncategories; @@ -95,14 +96,15 @@ namespace CodeImp.DoomBuilder.Config public float DefaultTextureScale { get { return defaulttexturescale; } } public float DefaultFlatScale { get { return defaultflatscale; } } public string FormatInterface { get { return formatinterface; } } - public int SoundLinedefFlags { get { return soundlinedefflags; } } - public int SingleSidedFlags { get { return singlesidedflags; } } - public int DoubleSidedFlags { get { return doublesidedflags; } } - public int ImpassableFlags { get { return impassableflags; } } + public string SoundLinedefFlag { get { return soundlinedefflag; } } + public string SingleSidedFlag { get { return singlesidedflag; } } + public string DoubleSidedFlag { get { return doublesidedflag; } } + public string ImpassableFlag { get { return impassableflag; } } public bool MixTexturesFlats { get { return mixtexturesflats; } } public bool GeneralizedActions { get { return generalizedactions; } } public bool GeneralizedEffects { get { return generalizedeffects; } } public int Start3DModeThingType { get { return start3dmodethingtype; } } + public int LinedefActivationsFilter { get { return linedefactivationsfilter; } } // Map lumps public IDictionary MapLumpNames { get { return maplumpnames; } } @@ -112,12 +114,12 @@ namespace CodeImp.DoomBuilder.Config public IDictionary FlatRanges { get { return flatranges; } } // Things - public IDictionary ThingFlags { get { return thingflags; } } + public IDictionary ThingFlags { get { return thingflags; } } public List ThingCategories { get { return thingcategories; } } public ICollection Things { get { return things.Values; } } // Linedefs - public IDictionary LinedefFlags { get { return linedefflags; } } + public IDictionary LinedefFlags { get { return linedefflags; } } public IDictionary LinedefActions { get { return linedefactions; } } public List SortedLinedefActions { get { return sortedlinedefactions; } } public List ActionCategories { get { return actioncategories; } } @@ -143,12 +145,14 @@ namespace CodeImp.DoomBuilder.Config // Constructor internal GameConfiguration(Configuration cfg) { + object obj; + // Initialize this.cfg = cfg; - this.thingflags = new Dictionary(); + this.thingflags = new Dictionary(); this.thingcategories = new List(); this.things = new Dictionary(); - this.linedefflags = new Dictionary(); + this.linedefflags = new Dictionary(); this.linedefactions = new Dictionary(); this.actioncategories = new List(); this.sortedlinedefactions = new List(); @@ -163,14 +167,22 @@ namespace CodeImp.DoomBuilder.Config defaulttexturescale = cfg.ReadSetting("defaulttexturescale", 1f); defaultflatscale = cfg.ReadSetting("defaultflatscale", 1f); formatinterface = cfg.ReadSetting("formatinterface", ""); - soundlinedefflags = cfg.ReadSetting("soundlinedefflags", 0); - singlesidedflags = cfg.ReadSetting("singlesidedflags", 0); - doublesidedflags = cfg.ReadSetting("doublesidedflags", 0); - impassableflags = cfg.ReadSetting("impassableflags", 0); mixtexturesflats = cfg.ReadSetting("mixtexturesflats", false); generalizedactions = cfg.ReadSetting("generalizedlinedefs", false); generalizedeffects = cfg.ReadSetting("generalizedsectors", false); start3dmodethingtype = cfg.ReadSetting("start3dmode", 0); + linedefactivationsfilter = cfg.ReadSetting("linedefactivationsfilter", 0); + + // Flags have special (invariant culture) conversion + // because they are allowed to be written as integers in the configs + obj = cfg.ReadSettingObject("soundlinedefflag", 0); + if(obj is int) soundlinedefflag = ((int)obj).ToString(CultureInfo.InvariantCulture); else soundlinedefflag = obj.ToString(); + obj = cfg.ReadSetting("singlesidedflag", 0); + if(obj is int) singlesidedflag = ((int)obj).ToString(CultureInfo.InvariantCulture); else singlesidedflag = obj.ToString(); + obj = cfg.ReadSetting("doublesidedflag", 0); + if(obj is int) doublesidedflag = ((int)obj).ToString(CultureInfo.InvariantCulture); else doublesidedflag = obj.ToString(); + obj = cfg.ReadSetting("impassableflag", 0); + if(obj is int) impassableflag = ((int)obj).ToString(CultureInfo.InvariantCulture); else impassableflag = obj.ToString(); // Get map lumps maplumpnames = cfg.ReadSetting("maplumpnames", new Hashtable()); @@ -286,6 +298,7 @@ namespace CodeImp.DoomBuilder.Config dic = cfg.ReadSetting("linedefflags", new Hashtable()); foreach(DictionaryEntry de in dic) { + /* // Try paring the bit value if(int.TryParse(de.Key.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, @@ -304,6 +317,9 @@ namespace CodeImp.DoomBuilder.Config { General.WriteLogLine("WARNING: Structure 'linedefflags' contains invalid keys!"); } + */ + + linedefflags.Add(de.Key.ToString(), de.Value.ToString()); } } @@ -382,18 +398,8 @@ namespace CodeImp.DoomBuilder.Config dic = cfg.ReadSetting("linedefactivations", new Hashtable()); foreach(DictionaryEntry de in dic) { - // Try paring the bit value - if(int.TryParse(de.Key.ToString(), - NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, - CultureInfo.InvariantCulture, out bitvalue)) - { - // Add to the list - linedefactivates.Add(new LinedefActivateInfo(bitvalue, de.Value.ToString())); - } - else - { - General.WriteLogLine("WARNING: Structure 'linedefactivations' contains invalid keys!"); - } + // Add to the list + linedefactivates.Add(new LinedefActivateInfo(de.Key.ToString(), de.Value.ToString())); } // Sort the list @@ -488,6 +494,7 @@ namespace CodeImp.DoomBuilder.Config dic = cfg.ReadSetting("thingflags", new Hashtable()); foreach(DictionaryEntry de in dic) { + /* // Try paring the bit value if(int.TryParse(de.Key.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, @@ -506,6 +513,9 @@ namespace CodeImp.DoomBuilder.Config { General.WriteLogLine("WARNING: Structure 'thingflags' contains invalid keys!"); } + */ + + thingflags.Add(de.Key.ToString(), de.Value.ToString()); } } diff --git a/Source/Config/LinedefActivateInfo.cs b/Source/Config/LinedefActivateInfo.cs index 81a08704..e59a76a4 100644 --- a/Source/Config/LinedefActivateInfo.cs +++ b/Source/Config/LinedefActivateInfo.cs @@ -32,7 +32,7 @@ using CodeImp.DoomBuilder.Map; namespace CodeImp.DoomBuilder.Config { - public class LinedefActivateInfo : INumberedTitle, IComparable + public class LinedefActivateInfo : IComparable { #region ================== Constants @@ -41,14 +41,16 @@ namespace CodeImp.DoomBuilder.Config #region ================== Variables // Properties - private int index; + private int intkey; + private string key; private string title; #endregion #region ================== Properties - public int Index { get { return index; } } + public int Index { get { return intkey; } } + public string Key { get { return key; } } public string Title { get { return title; } } #endregion @@ -56,12 +58,15 @@ namespace CodeImp.DoomBuilder.Config #region ================== Constructor / Disposer // Constructor - internal LinedefActivateInfo(int index, string title) + internal LinedefActivateInfo(string key, string title) { // Initialize - this.index = index; + this.key = key; this.title = title; + // Try parsing key as int for comparison + if(!int.TryParse(key, out intkey)) intkey = 0; + // We have no destructor GC.SuppressFinalize(this); } @@ -79,8 +84,8 @@ namespace CodeImp.DoomBuilder.Config // This compares against another activate info public int CompareTo(LinedefActivateInfo other) { - if(this.index < other.index) return -1; - else if(this.index > other.index) return 1; + if(this.intkey < other.intkey) return -1; + else if(this.intkey > other.intkey) return 1; else return 0; } diff --git a/Source/Controls/FieldsEditorControl.Designer.cs b/Source/Controls/FieldsEditorControl.Designer.cs index 57d3439d..3eff7647 100644 --- a/Source/Controls/FieldsEditorControl.Designer.cs +++ b/Source/Controls/FieldsEditorControl.Designer.cs @@ -34,11 +34,11 @@ namespace CodeImp.DoomBuilder.Controls System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); this.fieldslist = new System.Windows.Forms.DataGridView(); - this.deleterowstimer = new System.Windows.Forms.Timer(this.components); - this.browsebutton = new System.Windows.Forms.Button(); this.fieldname = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.fieldtype = new System.Windows.Forms.DataGridViewComboBoxColumn(); this.fieldvalue = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.deleterowstimer = new System.Windows.Forms.Timer(this.components); + this.browsebutton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.fieldslist)).BeginInit(); this.SuspendLayout(); // @@ -47,7 +47,7 @@ namespace CodeImp.DoomBuilder.Controls this.fieldslist.AllowUserToResizeColumns = false; this.fieldslist.AllowUserToResizeRows = false; this.fieldslist.BackgroundColor = System.Drawing.SystemColors.Window; - this.fieldslist.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.fieldslist.BorderStyle = System.Windows.Forms.BorderStyle.None; this.fieldslist.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; this.fieldslist.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.Disable; this.fieldslist.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; @@ -83,23 +83,6 @@ namespace CodeImp.DoomBuilder.Controls this.fieldslist.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.fieldslist_CellClick); this.fieldslist.SelectionChanged += new System.EventHandler(this.fieldslist_SelectionChanged); // - // deleterowstimer - // - this.deleterowstimer.Interval = 1; - this.deleterowstimer.Tick += new System.EventHandler(this.deleterowstimer_Tick); - // - // browsebutton - // - this.browsebutton.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.browsebutton.Image = global::CodeImp.DoomBuilder.Properties.Resources.treeview; - this.browsebutton.ImageAlign = System.Drawing.ContentAlignment.BottomCenter; - this.browsebutton.Location = new System.Drawing.Point(370, 43); - this.browsebutton.Name = "browsebutton"; - this.browsebutton.Size = new System.Drawing.Size(30, 24); - this.browsebutton.TabIndex = 2; - this.browsebutton.UseVisualStyleBackColor = true; - this.browsebutton.Visible = false; - // // fieldname // dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; @@ -139,6 +122,23 @@ namespace CodeImp.DoomBuilder.Controls this.fieldvalue.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.fieldvalue.Width = 120; // + // deleterowstimer + // + this.deleterowstimer.Interval = 1; + this.deleterowstimer.Tick += new System.EventHandler(this.deleterowstimer_Tick); + // + // browsebutton + // + this.browsebutton.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.browsebutton.Image = global::CodeImp.DoomBuilder.Properties.Resources.treeview; + this.browsebutton.ImageAlign = System.Drawing.ContentAlignment.BottomCenter; + this.browsebutton.Location = new System.Drawing.Point(370, 43); + this.browsebutton.Name = "browsebutton"; + this.browsebutton.Size = new System.Drawing.Size(30, 24); + this.browsebutton.TabIndex = 2; + this.browsebutton.UseVisualStyleBackColor = true; + this.browsebutton.Visible = false; + // // FieldsEditorControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/Source/IO/Configuration.cs b/Source/IO/Configuration.cs index 612e962e..d0644ee6 100644 --- a/Source/IO/Configuration.cs +++ b/Source/IO/Configuration.cs @@ -904,7 +904,7 @@ namespace CodeImp.DoomBuilder.IO if(ValidateKeyword(val.Trim(), line)) { // Add to the struct depending on the keyword - switch(val.Trim().ToLower()) + switch(val.Trim().ToLowerInvariant()) { case "true": diff --git a/Source/IO/DoomMapSetIO.cs b/Source/IO/DoomMapSetIO.cs index 60f5124e..15f8f18a 100644 --- a/Source/IO/DoomMapSetIO.cs +++ b/Source/IO/DoomMapSetIO.cs @@ -57,12 +57,11 @@ namespace CodeImp.DoomBuilder.IO // This reads a map from the file and returns a MapSet public override MapSet Read(MapSet map, string mapname) { - int firstindex; Dictionary vertexlink; Dictionary sectorlink; // Find the index where first map lump begins - firstindex = wad.FindLumpIndex(mapname) + 1; + int firstindex = wad.FindLumpIndex(mapname) + 1; // Read vertices vertexlink = ReadVertices(map, firstindex); @@ -89,6 +88,7 @@ namespace CodeImp.DoomBuilder.IO MemoryStream mem; BinaryReader reader; int num, i, x, y, type, flags; + Dictionary stringflags; float angle; Thing t; @@ -111,9 +111,17 @@ namespace CodeImp.DoomBuilder.IO type = reader.ReadUInt16(); flags = reader.ReadUInt16(); + // Make string flags + stringflags = new Dictionary(); + foreach(KeyValuePair f in manager.Config.ThingFlags) + { + int fnum; + if(int.TryParse(f.Key, out fnum)) stringflags[f.Key] = ((flags & fnum) == fnum); + } + // Create new item t = map.CreateThing(); - t.Update(type, x, y, 0, angle, flags, 0, 0, Thing.EMPTY_ARGS); + t.Update(type, x, y, 0, angle, stringflags, 0, 0, Thing.EMPTY_ARGS); //t.DetermineSector(); t.UpdateConfiguration(); } @@ -224,6 +232,7 @@ namespace CodeImp.DoomBuilder.IO Lump linedefslump, sidedefslump; int num, i, offsetx, offsety, v1, v2; int s1, s2, flags, action, tag, sc; + Dictionary stringflags; string thigh, tmid, tlow; Linedef l; Sidedef s; @@ -254,10 +263,18 @@ namespace CodeImp.DoomBuilder.IO tag = readline.ReadUInt16(); s1 = readline.ReadUInt16(); s2 = readline.ReadUInt16(); - + + // Make string flags + stringflags = new Dictionary(); + foreach(KeyValuePair f in manager.Config.LinedefFlags) + { + int fnum; + if(int.TryParse(f.Key, out fnum)) stringflags[f.Key] = ((flags & fnum) == fnum); + } + // Create new item l = map.CreateLinedef(vertexlink[v1], vertexlink[v2]); - l.Update(flags, tag, action, Linedef.EMPTY_ARGS); + l.Update(stringflags, 0, tag, action, Linedef.EMPTY_ARGS); l.UpdateCache(); // Line has a front side? @@ -332,6 +349,7 @@ namespace CodeImp.DoomBuilder.IO BinaryWriter writer; Lump lump; int insertpos; + int flags; // Create memory to write to mem = new MemoryStream(); @@ -340,12 +358,20 @@ namespace CodeImp.DoomBuilder.IO // Go for all things foreach(Thing t in map.Things) { + // Convert flags + flags = 0; + foreach(KeyValuePair f in t.Flags) + { + int fnum; + if(f.Value && int.TryParse(f.Key, out fnum)) flags |= fnum; + } + // Write properties to stream writer.Write((Int16)t.Position.x); writer.Write((Int16)t.Position.y); writer.Write((Int16)((t.Angle * Angle2D.PIDEG) - 90)); writer.Write((UInt16)t.Type); - writer.Write((UInt16)t.Flags); + writer.Write((UInt16)flags); } // Find insert position and remove old lump @@ -398,6 +424,7 @@ namespace CodeImp.DoomBuilder.IO Lump lump; ushort sid; int insertpos; + int flags; // Create memory to write to mem = new MemoryStream(); @@ -406,10 +433,18 @@ namespace CodeImp.DoomBuilder.IO // Go for all lines foreach(Linedef l in map.Linedefs) { + // Convert flags + flags = 0; + foreach(KeyValuePair f in l.Flags) + { + int fnum; + if(f.Value && int.TryParse(f.Key, out fnum)) flags |= fnum; + } + // Write properties to stream writer.Write((UInt16)vertexids[l.Start]); writer.Write((UInt16)vertexids[l.End]); - writer.Write((UInt16)l.Flags); + writer.Write((UInt16)flags); writer.Write((UInt16)l.Action); writer.Write((UInt16)l.Tag); diff --git a/Source/IO/HexenMapSetIO.cs b/Source/IO/HexenMapSetIO.cs index a715150d..a11027b0 100644 --- a/Source/IO/HexenMapSetIO.cs +++ b/Source/IO/HexenMapSetIO.cs @@ -90,6 +90,7 @@ namespace CodeImp.DoomBuilder.IO BinaryReader reader; int num, i, tag, z, action, x, y, type, flags; int[] args = new int[Thing.NUM_ARGS]; + Dictionary stringflags; float angle; Thing t; @@ -119,10 +120,18 @@ namespace CodeImp.DoomBuilder.IO args[2] = reader.ReadByte(); args[3] = reader.ReadByte(); args[4] = reader.ReadByte(); + + // Make string flags + stringflags = new Dictionary(); + foreach(KeyValuePair f in manager.Config.ThingFlags) + { + int fnum; + if(int.TryParse(f.Key, out fnum)) stringflags[f.Key] = ((flags & fnum) == fnum); + } // Create new item t = map.CreateThing(); - t.Update(type, x, y, z, angle, flags, tag, action, args); + t.Update(type, x, y, z, angle, stringflags, tag, action, args); //t.DetermineSector(); t.UpdateConfiguration(); } @@ -234,6 +243,7 @@ namespace CodeImp.DoomBuilder.IO int num, i, offsetx, offsety, v1, v2; int s1, s2, flags, action, sc; int[] args = new int[Linedef.NUM_ARGS]; + Dictionary stringflags; string thigh, tmid, tlow; Linedef l; Sidedef s; @@ -268,10 +278,18 @@ namespace CodeImp.DoomBuilder.IO args[4] = readline.ReadByte(); s1 = readline.ReadUInt16(); s2 = readline.ReadUInt16(); + + // Make string flags + stringflags = new Dictionary(); + foreach(KeyValuePair f in manager.Config.LinedefFlags) + { + int fnum; + if(int.TryParse(f.Key, out fnum)) stringflags[f.Key] = ((flags & fnum) == fnum); + } // Create new item l = map.CreateLinedef(vertexlink[v1], vertexlink[v2]); - l.Update(flags, 0, action, args); + l.Update(stringflags, (flags & manager.Config.LinedefActivationsFilter), 0, action, args); l.UpdateCache(); // Line has a front side? @@ -346,6 +364,7 @@ namespace CodeImp.DoomBuilder.IO BinaryWriter writer; Lump lump; int insertpos; + int flags; // Create memory to write to mem = new MemoryStream(); @@ -354,6 +373,15 @@ namespace CodeImp.DoomBuilder.IO // Go for all things foreach(Thing t in map.Things) { + // Convert flags + flags = 0; + foreach(KeyValuePair f in t.Flags) + { + int fnum; + if(f.Value && int.TryParse(f.Key, out fnum)) flags |= fnum; + } + + // Write properties to stream // Write properties to stream writer.Write((UInt16)t.Tag); writer.Write((Int16)t.Position.x); @@ -361,7 +389,7 @@ namespace CodeImp.DoomBuilder.IO writer.Write((Int16)t.ZOffset); writer.Write((Int16)((t.Angle * Angle2D.PIDEG) - 90)); writer.Write((UInt16)t.Type); - writer.Write((UInt16)t.Flags); + writer.Write((UInt16)flags); writer.Write((Byte)t.Action); writer.Write((Byte)t.Args[0]); writer.Write((Byte)t.Args[1]); @@ -420,6 +448,7 @@ namespace CodeImp.DoomBuilder.IO Lump lump; ushort sid; int insertpos; + int flags; // Create memory to write to mem = new MemoryStream(); @@ -428,10 +457,21 @@ namespace CodeImp.DoomBuilder.IO // Go for all lines foreach(Linedef l in map.Linedefs) { + // Convert flags + flags = 0; + foreach(KeyValuePair f in l.Flags) + { + int fnum; + if(f.Value && int.TryParse(f.Key, out fnum)) flags |= fnum; + } + + // Add activates to flags + flags |= (l.Activate & manager.Config.LinedefActivationsFilter); + // Write properties to stream writer.Write((UInt16)vertexids[l.Start]); writer.Write((UInt16)vertexids[l.End]); - writer.Write((UInt16)l.Flags); + writer.Write((UInt16)flags); writer.Write((Byte)l.Action); writer.Write((Byte)l.Args[0]); writer.Write((Byte)l.Args[1]); diff --git a/Source/IO/UniversalMapSetIO.cs b/Source/IO/UniversalMapSetIO.cs index 3247859c..f3cfb872 100644 --- a/Source/IO/UniversalMapSetIO.cs +++ b/Source/IO/UniversalMapSetIO.cs @@ -24,6 +24,7 @@ using System.Text; using System.IO; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Geometry; +using System.Windows.Forms; #endregion @@ -33,14 +34,45 @@ namespace CodeImp.DoomBuilder.IO { #region ================== Constants + // Name of the UDMF configuration file + private const string UDMF_CONFIG_NAME = "UDMF.cfg"; + #endregion + #region ================== Variables + + private Configuration config; + + #endregion + #region ================== Constructor / Disposer // Constructor - public UniversalMapSetIO(WAD wad, MapManager manager) - : base(wad, manager) + public UniversalMapSetIO(WAD wad, MapManager manager) : base(wad, manager) { + // Make configuration + config = new Configuration(); + + // Find a resource named Font.cfg + string[] resnames = General.ThisAssembly.GetManifestResourceNames(); + foreach(string rn in resnames) + { + // Found it? + if(rn.EndsWith(UDMF_CONFIG_NAME, StringComparison.InvariantCultureIgnoreCase)) + { + // Get a stream from the resource + Stream udmfcfg = General.ThisAssembly.GetManifestResourceStream(rn); + StreamReader udmfcfgreader = new StreamReader(udmfcfg, Encoding.ASCII); + + // Load configuration from stream + config.InputConfiguration(udmfcfgreader.ReadToEnd()); + + // Done + udmfcfgreader.Dispose(); + udmfcfg.Dispose(); + break; + } + } } #endregion @@ -53,15 +85,47 @@ namespace CodeImp.DoomBuilder.IO #endregion - #region ================== Parsing - - #endregion - #region ================== Reading // This reads a map from the file and returns a MapSet public override MapSet Read(MapSet map, string mapname) { + UniversalParser textmap = new UniversalParser(); + StreamReader lumpreader = null; + + // Find the index where first map lump begins + int firstindex = wad.FindLumpIndex(mapname) + 1; + + // Get the TEXTMAP lump from wad file + Lump lump = wad.FindLump("TEXTMAP", firstindex); + if(lump == null) throw new Exception("Could not find required lump TEXTMAP!"); + + try + { + // Parse the UDMF data + lumpreader = new StreamReader(lump.Stream); + textmap.InputConfiguration(lumpreader.ReadToEnd()); + + // Check for errors + if(textmap.ErrorResult != 0) + { + // Show parse error + General.ShowErrorMessage("Error while parsing UDMF map data:\n" + textmap.ErrorDescription, MessageBoxButtons.OK); + } + else + { + + } + } + catch(Exception e) + { + General.ShowErrorMessage("Unexpected error reading UDMF map data. " + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK); + } + finally + { + if(lumpreader != null) lumpreader.Dispose(); + } + // Return result return map; } diff --git a/Source/IO/UniversalParser.cs b/Source/IO/UniversalParser.cs new file mode 100644 index 00000000..942a0bf7 --- /dev/null +++ b/Source/IO/UniversalParser.cs @@ -0,0 +1,1123 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.IO; +using System.Text; +using System.Globalization; +using System.Collections; +using System.Collections.Specialized; + +#endregion + +namespace CodeImp.DoomBuilder.IO +{ + public sealed class UniversalParser + { + #region ================== Constants + + // Path seperator + public const string DEFAULT_SEPERATOR = "."; + + // Parse mode constants + private const int PM_NOTHING = 0; + private const int PM_ASSIGNMENT = 1; + private const int PM_NUMBER = 2; + private const int PM_STRING = 3; + private const int PM_KEYWORD = 4; + + // Error strings + private const string ERROR_KEYMISSING = "Missing key name in assignment or scope."; + private const string ERROR_KEYSPACES = "Spaces not allowed in key names."; + private const string ERROR_ASSIGNINVALID = "Invalid assignment. Missing a previous terminator symbol?"; + private const string ERROR_VALUEINVALID = "Invalid value in assignment. Missing a previous terminator symbol?"; + private const string ERROR_VALUETOOBIG = "Value too big."; + private const string ERROR_KEYNOTUNQIUE = "Key is not unique within scope."; + private const string ERROR_KEYWORDUNKNOWN = "Unknown keyword in assignment. Missing a previous terminator symbol?"; + + #endregion + + #region ================== Variables + + // Error result + private int cpErrorResult = 0; + private string cpErrorDescription = ""; + private int cpErrorLine = 0; + + // Configuration root + private ListDictionary root = null; + + #endregion + + #region ================== Properties + + // Properties + public int ErrorResult { get { return cpErrorResult; } } + public string ErrorDescription { get { return cpErrorDescription; } } + public int ErrorLine { get { return cpErrorLine; } } + public ListDictionary Root { get { return root; } set { root = value; } } + + #endregion + + #region ================== Constructor / Destructor + + // Constructor + public UniversalParser() + { + // Standard new configuration + NewConfiguration(); + + // We have no destructor + GC.SuppressFinalize(this); + } + + // Constructor to load a file immediately + public UniversalParser(string filename) + { + // Load configuration from file + LoadConfiguration(filename); + + // We have no destructor + GC.SuppressFinalize(this); + } + + #endregion + + #region ================== Private Methods + + // This is called by all the ReadSetting overloads to perform the read + private bool CheckSetting(string setting, string pathseperator) + { + ListDictionary cs = null; + + // Split the path in an array + string[] keys = setting.Split(pathseperator.ToCharArray()); + + // Get the root item + object item = root; + + // Go for each item + for(int i = 0; i < keys.Length; i++) + { + // Check if the current item is of ConfigStruct type + if(item is ListDictionary) + { + // Check if the key is valid + if(ValidateKey(null, keys[i].Trim(), -1) == true) + { + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Check if the requested item exists + if(cs.Contains(keys[i]) == true) + { + // Set the item to the next item + item = cs[keys[i]]; + } + else + { + // Key not found + return false; + } + } + else + { + // Invalid key in path + return false; + } + } + else + { + // Unable to go any further + return false; + } + } + + // Return result + return true; + } + + // This is called by all the ReadSetting overloads to perform the read + private object ReadAnySetting(string setting, object defaultsetting, string pathseperator) + { + ListDictionary cs = null; + + // Split the path in an array + string[] keys = setting.Split(pathseperator.ToCharArray()); + + // Get the root item + object item = root; + + // Go for each item + for(int i = 0; i < keys.Length; i++) + { + // Check if the current item is of ConfigStruct type + if(item is ListDictionary) + { + // Check if the key is valid + if(ValidateKey(null, keys[i].Trim(), -1) == true) + { + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Check if the requested item exists + if(cs.Contains(keys[i]) == true) + { + // Set the item to the next item + item = cs[keys[i]]; + } + else + { + // Key not found + // return default setting + return defaultsetting; + } + } + else + { + // Invalid key in path + // return default setting + return defaultsetting; + } + } + else + { + // Unable to go any further + // return default setting + return defaultsetting; + } + } + + // Return the item + return item; + } + + + // This returns a string added with escape characters + private string EscapedString(string str) + { + // Replace the \ with \\ first! + str = str.Replace("\\", "\\\\"); + str = str.Replace("\n", "\\n"); + str = str.Replace("\r", "\\r"); + str = str.Replace("\t", "\\t"); + str = str.Replace("\"", "\\\""); + + // Return result + return str; + } + + + // This raises an error + private void RaiseError(int line, string description) + { + // Raise error + cpErrorResult = 1; + cpErrorDescription = description; + cpErrorLine = line; + } + + + // This validates a given key and sets + // error properties if key is invalid and errorline > -1 + private bool ValidateKey(ListDictionary container, string key, int errorline) + { + bool validateresult; + + // Check if key is an empty string + if(key == "") + { + // ERROR: Missing key name in statement + if(errorline > -1) RaiseError(errorline, ERROR_KEYMISSING); + validateresult = false; + } + else + { + // Check if there are spaces in the key + if(key.IndexOfAny(" ".ToCharArray()) > -1) + { + // ERROR: Spaces not allowed in key names + if(errorline > -1) RaiseError(errorline, ERROR_KEYSPACES); + validateresult = false; + } + else + { + // Check if we can test existance + if(container != null) + { + // Test if the key exists in this container + if(container.Contains(key) == true) + { + // ERROR: Key is not unique within struct + if(errorline > -1) RaiseError(errorline, ERROR_KEYNOTUNQIUE); + validateresult = false; + } + else + { + // Key OK + validateresult = true; + } + } + else + { + // Key OK + validateresult = true; + } + } + } + + // Return result + return validateresult; + } + + + // This validates a given keyword and sets + // error properties if keyword is invalid and errorline > -1 + private bool ValidateKeyword(string keyword, int errorline) + { + bool validateresult; + + // Check if key is an empty string + if(keyword == "") + { + // ERROR: Missing key name in statement + if(errorline > -1) RaiseError(errorline, ERROR_ASSIGNINVALID); + validateresult = false; + } + else + { + // Check if there are spaces in the key + if(keyword.IndexOfAny(" ".ToCharArray()) > -1) + { + // ERROR: Spaces not allowed in key names + if(errorline > -1) RaiseError(errorline, ERROR_ASSIGNINVALID); + validateresult = false; + } + else + { + // Key OK + validateresult = true; + } + } + + // Return result + return validateresult; + } + + + // This parses a structure in the given data starting + // from the given pos and line and updates pos and line. + private ListDictionary InputStructure(ref string data, ref int pos, ref int line) + { + char c = '\0'; // current data character + int pm = PM_NOTHING; // current parse mode + string key = "", val = ""; // current key and value beign built + bool escape = false; // escape sequence? + bool endofstruct = false; // true as soon as this level struct ends + ListDictionary cs = new ListDictionary(); + + // Go through all of the data until + // the end or until the struct closes + // or when an arror occurred + while ((pos < data.Length) && (cpErrorResult == 0) && (endofstruct == false)) + { + // Get current character + c = data[pos]; + + // ================ What parse mode are we at? + if(pm == PM_NOTHING) + { + // Now check what character this is + switch(c) + { + case '{': // Begin of new struct + + // Validate key + if(ValidateKey(cs, key.Trim(), line)) + { + // Next character + pos++; + + // Parse this struct and add it + cs.Add(key.Trim(), InputStructure(ref data, ref pos, ref line)); + + // Check the last character + pos--; + + // Reset the key + key = ""; + } + + // Leave switch + break; + + case '}': // End of this struct + + // Stop parsing in this struct + endofstruct = true; + + // Leave the loop + break; + + case '=': // Assignment + + // Validate key + if(ValidateKey(cs, key.Trim(), line)) + { + // Now parsing assignment + pm = PM_ASSIGNMENT; + } + + // Leave switch + break; + + case ';': // Terminator + + // Validate key + if(ValidateKey(cs, key.Trim(), line)) + { + // Add the key with null as value + cs.Add(key.Trim(), null); + + // Reset key and value + key = ""; + val = ""; + } + + // Leave switch + break; + + case '\n': // New line + + // Count the line + line++; + + // Add this to the key as a space. + // Spaces are not allowed, but it will be trimmed + // when its the first or last character. + key += " "; + + // Leave switch + break; + + case '\\': // Possible comment + case '/': + + // Check for the line comment // + if(data.Substring(pos, 2) == "//") + { + // Find the next line + int np = data.IndexOf("\n", pos); + + // Next line found? + if(np > -1) + { + // Count the line + line++; + + // Skip everything on this line + pos = np; + } + else + { + // No end of line + // Skip everything else + pos = data.Length; + } + } + // Check for the block comment /* */ + else if(data.Substring(pos, 2) == "/*") + { + // Find the next closing block comment + int np = data.IndexOf("*/", pos); + + // Closing block comment found? + if(np > -1) + { + // Count the lines in the block comment + string blockdata = data.Substring(pos, np - pos + 2); + line += (blockdata.Split("\n".ToCharArray()).Length - 1); + + // Skip everything in this block + pos = np + 1; + } + else + { + // No end of line + // Skip everything else + pos = data.Length; + } + } + + // Leave switch + break; + + default: // Everything else + + // Add character to key + key += c.ToString(CultureInfo.InvariantCulture); + + // Leave switch + break; + } + } + // ================ Parsing an assignment + else if(pm == PM_ASSIGNMENT) + { + // Check for string opening + if(c == '\"') + { + // Now parsing string + pm = PM_STRING; + } + // Check for numeric character + else if("0123456789-.&".IndexOf(c.ToString(CultureInfo.InvariantCulture)) > -1) + { + // Now parsing number + pm = PM_NUMBER; + + // Go one byte back, because this + // byte is part of the number! + pos--; + } + // Check for new line + else if(c == '\n') + { + // Count the new line + line++; + } + // Check if assignment ends + else if(c == ';') + { + // End of assignment + pm = PM_NOTHING; + + // Remove this if it causes problems + key = ""; + val = ""; + } + // Otherwise (if not whitespace) it will be a keyword + else if((c != ' ') && (c != '\t')) + { + // Now parsing a keyword + pm = PM_KEYWORD; + + // Go one byte back, because this + // byte is part of the keyword! + pos--; + } + } + // ================ Parsing a number + else if(pm == PM_NUMBER) + { + // Check if number ends here + if(c == ';') + { + // Floating point? + if(val.IndexOf(".") > -1) + { + float fval = 0; + + // Convert to float (remove the f first) + try { fval = System.Convert.ToSingle(val.Trim(), CultureInfo.InvariantCulture); } + catch(System.FormatException) + { + // ERROR: Invalid value in assignment + RaiseError(line, ERROR_VALUEINVALID); + } + + // Add it to struct + cs.Add(key.Trim(), fval); + } + else + { + int ival = 0; + long lval = 0; + + // Convert to int + try + { + // Convert to value + ival = System.Convert.ToInt32(val.Trim(), CultureInfo.InvariantCulture); + + // Add it to struct + cs.Add(key.Trim(), ival); + } + catch(System.OverflowException) + { + // Too large for Int32, try Int64 + try + { + // Convert to value + lval = System.Convert.ToInt64(val.Trim(), CultureInfo.InvariantCulture); + + // Add it to struct + cs.Add(key.Trim(), lval); + } + catch(System.OverflowException) + { + // Too large for Int64, return error + RaiseError(line, ERROR_VALUETOOBIG); + } + catch(System.FormatException) + { + // ERROR: Invalid value in assignment + RaiseError(line, ERROR_VALUEINVALID); + } + } + catch(System.FormatException) + { + // ERROR: Invalid value in assignment + RaiseError(line, ERROR_VALUEINVALID); + } + } + + // Reset key and value + key = ""; + val = ""; + + // End of assignment + pm = PM_NOTHING; + } + // Check for new line + else if(c == '\n') + { + // Count the new line + line++; + } + // Everything else is part of the value + else + { + val += c.ToString(CultureInfo.InvariantCulture); + } + } + // ================ Parsing a string + else if(pm == PM_STRING) + { + // Check if in an escape sequence + if(escape) + { + // What character? + switch(c) + { + case '\\': val += "\\"; break; + case 'n': val += "\n"; break; + case '\"': val += "\""; break; + case 'r': val += "\r"; break; + case 't': val += "\t"; break; + default: + + // Is it a number? + if("0123456789".IndexOf(c.ToString(CultureInfo.InvariantCulture)) > -1) + { + int vv = 0; + char vc = '0'; + + // Convert the next 3 characters to a number + string v = data.Substring(pos, 3); + try { vv = System.Convert.ToInt32(v.Trim(), CultureInfo.InvariantCulture); } + catch(System.FormatException) + { + // ERROR: Invalid value in assignment + RaiseError(line, ERROR_VALUEINVALID); + } + + // Convert the number to a char + try { vc = System.Convert.ToChar(vv, CultureInfo.InvariantCulture); } + catch(System.FormatException) + { + // ERROR: Invalid value in assignment + RaiseError(line, ERROR_VALUEINVALID); + } + + // Add the char + val += vc.ToString(CultureInfo.InvariantCulture); + } + else + { + // Add the character as it is + val += c.ToString(CultureInfo.InvariantCulture); + } + + // Leave switch + break; + } + + // End of escape sequence + escape = false; + } + else + { + // Check for sequence start + if(c == '\\') + { + // Next character is of escape sequence + escape = true; + } + // Check if string ends + else if(c == '\"') + { + // Add string to struct + cs.Add(key.Trim(), val); + + // End of assignment + pm = PM_ASSIGNMENT; + + // Reset key and value + key = ""; + val = ""; + } + // Check for new line + else if(c == '\n') + { + // Count the new line + line++; + } + // Everything else is just part of string + else + { + // Add to value + val += c.ToString(CultureInfo.InvariantCulture); + } + } + } + // ================ Parsing a keyword + else if(pm == PM_KEYWORD) + { + // Check if keyword ends + if(c == ';') + { + // Validate the keyword + if(ValidateKeyword(val.Trim(), line)) + { + // Add to the struct depending on the keyword + switch(val.Trim().ToLowerInvariant()) + { + case "true": + + // Add boolean true + cs.Add(key.Trim(), true); + break; + + case "false": + + // Add boolean false + cs.Add(key.Trim(), false); + break; + + default: + + // Unknown keyword + RaiseError(line, ERROR_KEYWORDUNKNOWN); + break; + } + + // End of assignment + pm = PM_NOTHING; + + // Reset key and value + key = ""; + val = ""; + } + } + // Check for new line + else if(c == '\n') + { + // Count the new line + line++; + } + // Everything else is just part of keyword + else + { + // Add to value + val += c.ToString(CultureInfo.InvariantCulture); + } + } + + // Next character + pos++; + } + + // Return the parsed result + return cs; + } + + + // This will create a data structure from the given object + private string OutputStructure(ListDictionary cs, int level, string newline, bool whitespace) + { + string leveltabs = ""; + string spacing = ""; + StringBuilder db = new StringBuilder(""); + + // Check if this ConfigStruct is not empty + if(cs.Count > 0) + { + // Create whitespace + if(whitespace) + { + for(int i = 0; i < level; i++) leveltabs += "\t"; + spacing = " "; + } + + // Get enumerator + IDictionaryEnumerator de = cs.GetEnumerator(); + + // Go for each item + for(int i = 0; i < cs.Count; i++) + { + // Go to next item + de.MoveNext(); + + // Check if the value if of ConfigStruct type + if(de.Value is ListDictionary) + { + // Output recursive structure + if(whitespace) { db.Append(leveltabs); db.Append(newline); } + db.Append(leveltabs); db.Append(de.Key); db.Append(newline); + db.Append(leveltabs); db.Append("{"); db.Append(newline); + db.Append(OutputStructure((ListDictionary)de.Value, level + 1, newline, whitespace)); + db.Append(leveltabs); db.Append("}"); db.Append(newline); + if(whitespace) { db.Append(leveltabs); db.Append(newline); } + } + // Check if the value is of boolean type + else if(de.Value is bool) + { + // Check value + if((bool)de.Value == true) + { + // Output the keyword "true" + db.Append(leveltabs); db.Append(de.Key.ToString()); db.Append(spacing); + db.Append("="); db.Append(spacing); db.Append("true;"); db.Append(newline); + } + else + { + // Output the keyword "false" + db.Append(leveltabs); db.Append(de.Key.ToString()); db.Append(spacing); + db.Append("="); db.Append(spacing); db.Append("false;"); db.Append(newline); + } + } + // Check if value is of float type + else if(de.Value is float) + { + // Output the value with a postfixed f + db.Append(leveltabs); db.Append(de.Key); db.Append(spacing); db.Append("="); + db.Append(spacing); db.Append(String.Format(CultureInfo.InvariantCulture, "{0}", de.Value)); db.Append("f;"); db.Append(newline); + } + // Check if value is of other numeric type + else if(de.Value.GetType().IsPrimitive) + { + // Output the value unquoted + db.Append(leveltabs); db.Append(de.Key); db.Append(spacing); db.Append("="); + db.Append(spacing); db.Append(String.Format(CultureInfo.InvariantCulture, "{0}", de.Value)); db.Append(";"); db.Append(newline); + } + else + { + // Output the value with quotes and escape characters + db.Append(leveltabs); db.Append(de.Key); db.Append(spacing); db.Append("="); + db.Append(spacing); db.Append("\""); db.Append(EscapedString(de.Value.ToString())); db.Append("\";"); db.Append(newline); + } + } + } + + // Return the structure + return db.ToString(); + } + + #endregion + + #region ================== Public Methods + + // This clears the last error + public void ClearError() + { + // Clear error + cpErrorResult = 0; + cpErrorDescription = ""; + cpErrorLine = 0; + } + + + // This creates a new configuration + public void NewConfiguration() + { + // Create new configuration + root = new ListDictionary(); + } + + // This checks if a given setting exists (disregards type) + public bool SettingExists(string setting) { return CheckSetting(setting, DEFAULT_SEPERATOR); } + public bool SettingExists(string setting, string pathseperator) { return CheckSetting(setting, pathseperator); } + + // This can give a value of a key specified in a path form + // also, this does not error when the setting does not exist, + // but instead returns the given default value. + public string ReadSetting(string setting, string defaultsetting) { object r = ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR); if(r != null) return r.ToString(); else return null; } + public string ReadSetting(string setting, string defaultsetting, string pathseperator) { object r = ReadAnySetting(setting, defaultsetting, pathseperator); if(r != null) return r.ToString(); else return null; } + public int ReadSetting(string setting, int defaultsetting) { return Convert.ToInt32(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public int ReadSetting(string setting, int defaultsetting, string pathseperator) { return Convert.ToInt32(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public float ReadSetting(string setting, float defaultsetting) { return Convert.ToSingle(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public float ReadSetting(string setting, float defaultsetting, string pathseperator) { return Convert.ToSingle(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public short ReadSetting(string setting, short defaultsetting) { return Convert.ToInt16(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public short ReadSetting(string setting, short defaultsetting, string pathseperator) { return Convert.ToInt16(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public long ReadSetting(string setting, long defaultsetting) { return Convert.ToInt64(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public long ReadSetting(string setting, long defaultsetting, string pathseperator) { return Convert.ToInt64(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public bool ReadSetting(string setting, bool defaultsetting) { return Convert.ToBoolean(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public bool ReadSetting(string setting, bool defaultsetting, string pathseperator) { return Convert.ToBoolean(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public byte ReadSetting(string setting, byte defaultsetting) { return Convert.ToByte(ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR), CultureInfo.InvariantCulture); } + public byte ReadSetting(string setting, byte defaultsetting, string pathseperator) { return Convert.ToByte(ReadAnySetting(setting, defaultsetting, pathseperator), CultureInfo.InvariantCulture); } + public ListDictionary ReadSetting(string setting, ListDictionary defaultsetting) { return (ListDictionary)ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR); } + public ListDictionary ReadSetting(string setting, ListDictionary defaultsetting, string pathseperator) { return (ListDictionary)ReadAnySetting(setting, defaultsetting, pathseperator); } + + public object ReadSettingObject(string setting, object defaultsetting) { return ReadAnySetting(setting, defaultsetting, DEFAULT_SEPERATOR); } + + + // This writes a given setting to the configuration. + // Wont change existing structs, but will add them as needed. + // Returns true when written, false when failed. + public bool WriteSetting(string setting, object settingvalue) { return WriteSetting(setting, settingvalue, DEFAULT_SEPERATOR); } + public bool WriteSetting(string setting, object settingvalue, string pathseperator) + { + ListDictionary cs = null; + + // Split the path in an array + string[] keys = setting.Split(pathseperator.ToCharArray()); + string finalkey = keys[keys.Length - 1]; + + // Get the root item + object item = root; + + // Go for each path item + for(int i = 0; i < (keys.Length - 1); i++) + { + // Check if the key is valid + if(ValidateKey(null, keys[i].Trim(), -1) == true) + { + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Check if the requested item exists + if(cs.Contains(keys[i]) == true) + { + // Check if the requested item is a ConfigStruct + if(cs[keys[i]] is ListDictionary) + { + // Set the item to the next item + item = cs[keys[i]]; + } + else + { + // Cant proceed with path + return false; + } + } + else + { + // Key not found + // Create it now + ListDictionary ncs = new ListDictionary(); + cs.Add(keys[i], ncs); + + // Set the item to the next item + item = cs[keys[i]]; + } + } + else + { + // Invalid key in path + return false; + } + } + + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Check if the key already exists + if(cs.Contains(finalkey) == true) + { + // Update the value + cs[finalkey] = settingvalue; + } + else + { + // Create the key/value pair + cs.Add(finalkey, settingvalue); + } + + // Return success + return true; + } + + + // This removes a given setting from the configuration. + public bool DeleteSetting(string setting) { return DeleteSetting(setting, DEFAULT_SEPERATOR); } + public bool DeleteSetting(string setting, string pathseperator) + { + ListDictionary cs = null; + + // Split the path in an array + string[] keys = setting.Split(pathseperator.ToCharArray()); + string finalkey = keys[keys.Length - 1]; + + // Get the root item + object item = root; + + // Go for each path item + for(int i = 0; i < (keys.Length - 1); i++) + { + // Check if the key is valid + if(ValidateKey(null, keys[i].Trim(), -1) == true) + { + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Check if the requested item exists + if(cs.Contains(keys[i]) == true) + { + // Check if the requested item is a ConfigStruct + if(cs[keys[i]] is ListDictionary) + { + // Set the item to the next item + item = cs[keys[i]]; + } + else + { + // Cant proceed with path + return false; + } + } + else + { + // Key not found + // Create it now + ListDictionary ncs = new ListDictionary(); + cs.Add(keys[i], ncs); + + // Set the item to the next item + item = cs[keys[i]]; + } + } + else + { + // Invalid key in path + return false; + } + } + + // Cast to ConfigStruct + cs = (ListDictionary)item; + + // Arrived at our destination + // Delete the key if the key exists + if(cs.Contains(finalkey) == true) + { + // Key exists, delete it + cs.Remove(finalkey); + + // Return success + return true; + } + else + { + // Key not found, return fail + return false; + } + } + + + // This will save the current configuration to the specified file + public bool SaveConfiguration(string filename) { return SaveConfiguration(filename, "\r\n", true); } + public bool SaveConfiguration(string filename, string newline) { return SaveConfiguration(filename, newline, true); } + public bool SaveConfiguration(string filename, string newline, bool whitespace) + { + // Kill the file if it exists + if(File.Exists(filename) == true) File.Delete(filename); + + // Open file stream for writing + FileStream fstream = File.OpenWrite(filename); + + // Create output structure and write to file + string data = OutputConfiguration(newline, whitespace); + byte[] baData= Encoding.ASCII.GetBytes(data); + fstream.Write(baData, 0, baData.Length); + fstream.Flush(); + fstream.Close(); + + // Return true when done, false when errors occurred + if(cpErrorResult == 0) return true; else return false; + } + + + // This will output the current configuration as a string + public string OutputConfiguration() { return OutputConfiguration("\r\n", true); } + public string OutputConfiguration(string newline) { return OutputConfiguration(newline, true); } + public string OutputConfiguration(string newline, bool whitespace) + { + // Simply return the configuration structure as string + return OutputStructure(root, 0, newline, whitespace); + } + + + // This will load a configuration from file + public bool LoadConfiguration(string filename) + { + // Check if the file is missing + if(File.Exists(filename) == false) + { + throw(new FileNotFoundException("File not found \"" + filename + "\"", filename)); + } + else + { + // Load the file contents + FileStream fstream = File.OpenRead(filename); + byte[] fbuffer = new byte[fstream.Length]; + fstream.Read(fbuffer, 0, fbuffer.Length); + fstream.Close(); + + // Convert byte array to string + string data = Encoding.ASCII.GetString(fbuffer); + + // Load the configuration from this data + return InputConfiguration(data); + } + } + + + // This will load a configuration from string + public bool InputConfiguration(string data) + { + // Remove returns and tabs because the + // parser only uses newline for new lines. + data = data.Replace("\r", ""); + data = data.Replace("\t", ""); + + // Clear errors + ClearError(); + + // Parse the data to the root structure + int pos = 0; + int line = 1; + root = InputStructure(ref data, ref pos, ref line); + + // Return true when done, false when errors occurred + if(cpErrorResult == 0) return true; else return false; + } + + #endregion + } +} diff --git a/Source/Map/Linedef.cs b/Source/Map/Linedef.cs index 5f545ebd..a2a43ed2 100644 --- a/Source/Map/Linedef.cs +++ b/Source/Map/Linedef.cs @@ -68,8 +68,9 @@ namespace CodeImp.DoomBuilder.Map private RectangleF rect; // Properties - private int flags; + private Dictionary flags; private int action; + private int activate; private int tag; private int[] args; @@ -87,8 +88,9 @@ namespace CodeImp.DoomBuilder.Map public Sidedef Front { get { return front; } } public Sidedef Back { get { return back; } } public Line2D Line { get { return new Line2D(start.Position, end.Position); } } - public int Flags { get { return flags; } set { flags = value; } } + public Dictionary Flags { get { return flags; } } public int Action { get { return action; } set { action = value; } } + public int Activate { get { return activate; } set { activate = value; } } public int Tag { get { return tag; } set { tag = value; if((tag < 0) || (tag > MapSet.HIGHEST_TAG)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } public bool Selected { get { return selected; } set { selected = value; } } public bool Marked { get { return marked; } set { marked = value; } } @@ -114,6 +116,7 @@ namespace CodeImp.DoomBuilder.Map this.end = end; this.updateneeded = true; this.args = new int[NUM_ARGS]; + this.flags = new Dictionary(); // Attach to vertices startvertexlistitem = start.AttachLinedef(this); @@ -190,9 +193,10 @@ namespace CodeImp.DoomBuilder.Map // Copy properties l.action = action; l.args = (int[])args.Clone(); - l.flags = flags; + l.flags = new Dictionary(flags); l.tag = tag; l.updateneeded = true; + l.activate = activate; l.selected = selected; CopyFieldsTo(l); } @@ -287,6 +291,15 @@ namespace CodeImp.DoomBuilder.Map #region ================== Methods + // This checks and returns a flag without creating it + public bool IsFlagSet(string flagname) + { + if(flags.ContainsKey(flagname)) + return flags[flagname]; + else + return false; + } + // This flips the linedef's vertex attachments public void FlipVertices() { @@ -346,14 +359,14 @@ namespace CodeImp.DoomBuilder.Map if((front != null) && (back != null)) { // Apply or remove flags for doublesided line - flags &= ~General.Map.Config.SingleSidedFlags; - flags |= General.Map.Config.DoubleSidedFlags; + flags[General.Map.Config.SingleSidedFlag] = false; + flags[General.Map.Config.DoubleSidedFlag] = true; } else { // Apply or remove flags for singlesided line - flags &= ~General.Map.Config.DoubleSidedFlags; - flags |= General.Map.Config.SingleSidedFlags; + flags[General.Map.Config.SingleSidedFlag] = true; + flags[General.Map.Config.DoubleSidedFlag] = false; } } @@ -731,11 +744,12 @@ namespace CodeImp.DoomBuilder.Map #region ================== Changes // This updates all properties - public void Update(int flags, int tag, int action, int[] args) + public void Update(Dictionary flags, int activate, int tag, int action, int[] args) { // Apply changes - this.flags = flags; + this.flags = new Dictionary(flags); this.tag = tag; + this.activate = activate; this.action = action; this.args = new int[NUM_ARGS]; args.CopyTo(this.args, 0); diff --git a/Source/Map/Thing.cs b/Source/Map/Thing.cs index b54cf91a..fb2be446 100644 --- a/Source/Map/Thing.cs +++ b/Source/Map/Thing.cs @@ -55,7 +55,7 @@ namespace CodeImp.DoomBuilder.Map private int type; private Vector3D pos; private float angle; - private int flags; + private Dictionary flags; private int tag; private int action; private int[] args; @@ -79,7 +79,7 @@ namespace CodeImp.DoomBuilder.Map public Vector3D Position { get { return pos; } } public float Angle { get { return angle; } } public int AngleDeg { get { return (int)Angle2D.RadToDeg(angle); } } - public int Flags { get { return flags; } set { flags = value; } } + public Dictionary Flags { get { return flags; } } public int Action { get { return action; } set { action = value; } } public int[] Args { get { return args; } } public bool Selected { get { return selected; } set { selected = value; } } @@ -103,6 +103,7 @@ namespace CodeImp.DoomBuilder.Map // Initialize this.map = map; this.mainlistitem = listitem; + this.flags = new Dictionary(); // We have no destructor GC.SuppressFinalize(this); @@ -145,7 +146,7 @@ namespace CodeImp.DoomBuilder.Map t.type = type; t.angle = angle; t.pos = pos; - t.flags = flags; + t.flags = new Dictionary(flags); t.tag = tag; t.action = action; t.x = x; @@ -236,12 +237,12 @@ namespace CodeImp.DoomBuilder.Map // This updates all properties // NOTE: This does not update sector! (call DetermineSector) public void Update(int type, int x, int y, int zoffset, float angle, - int flags, int tag, int action, int[] args) + Dictionary flags, int tag, int action, int[] args) { // Apply changes this.type = type; this.angle = angle; - this.flags = flags; + this.flags = new Dictionary(flags); this.tag = tag; this.action = action; this.args = new int[NUM_ARGS]; diff --git a/Source/Rendering/Renderer2D.cs b/Source/Rendering/Renderer2D.cs index 0d9c8e1f..88b7f3ee 100644 --- a/Source/Rendering/Renderer2D.cs +++ b/Source/Rendering/Renderer2D.cs @@ -539,7 +539,7 @@ namespace CodeImp.DoomBuilder.Rendering public PixelColor DetermineLinedefColor(Linedef l) { // Impassable lines - if((l.Flags & General.Map.Config.ImpassableFlags) != 0) + if(l.IsFlagSet(General.Map.Config.ImpassableFlag)) { // Determine color if(l.Selected) return General.Colors.Selection; @@ -551,7 +551,7 @@ namespace CodeImp.DoomBuilder.Rendering // Determine color if(l.Selected) return General.Colors.Selection; else if(l.Action != 0) return General.Colors.Actions.WithAlpha(DOUBLESIDED_LINE_ALPHA); - else if((l.Flags & General.Map.Config.SoundLinedefFlags) != 0) return General.Colors.Sounds.WithAlpha(DOUBLESIDED_LINE_ALPHA); + else if(l.IsFlagSet(General.Map.Config.SoundLinedefFlag)) return General.Colors.Sounds.WithAlpha(DOUBLESIDED_LINE_ALPHA); else return General.Colors.Linedefs.WithAlpha(DOUBLESIDED_LINE_ALPHA); } } diff --git a/Source/Resources/UDMF.cfg b/Source/Resources/UDMF.cfg new file mode 100644 index 00000000..deaf963b --- /dev/null +++ b/Source/Resources/UDMF.cfg @@ -0,0 +1,67 @@ +/********************************************************************\ + Configuration for UDMF map reader/writer (UniversalMapSetIO) +\********************************************************************/ + +// These are the fields managed by Doom Builder (either handled or ignored intentionally) +// and are no to be shown in the custom fields of the map elements. +managedfields +{ + vertex + { + x; + y; + } + + linedef + { + id; + v1; + v2; + special; + arg0; + arg1; + arg2; + arg3; + arg4; + sidefront; + sideback; + } + + sidedef + { + offsetx; + offsety; + texturetop; + texturebottom; + texturemiddle; + sector; + } + + sector + { + heightfloor; + heightceiling; + texturefloor; + textureceiling; + lightlevel; + special; + id; + } + + thing + { + id; + x; + y; + height; + angle; + type; + special; + arg0; + arg1; + arg2; + arg3; + arg4; + } +} + diff --git a/Source/Windows/LinedefEditForm.Designer.cs b/Source/Windows/LinedefEditForm.Designer.cs index 5ffe0248..8405edbe 100644 --- a/Source/Windows/LinedefEditForm.Designer.cs +++ b/Source/Windows/LinedefEditForm.Designer.cs @@ -41,21 +41,26 @@ namespace CodeImp.DoomBuilder.Windows System.Windows.Forms.Label label11; System.Windows.Forms.Label label12; System.Windows.Forms.Label activationlabel; - this.arg0label = new System.Windows.Forms.Label(); - this.arg1label = new System.Windows.Forms.Label(); - this.arg4label = new System.Windows.Forms.Label(); - this.arg2label = new System.Windows.Forms.Label(); - this.arg3label = new System.Windows.Forms.Label(); this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); this.actiongroup = new System.Windows.Forms.GroupBox(); this.hexenpanel = new System.Windows.Forms.Panel(); - this.arg3 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg4 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); this.activation = new System.Windows.Forms.ComboBox(); this.action = new CodeImp.DoomBuilder.Controls.ActionSelectorControl(); this.browseaction = new System.Windows.Forms.Button(); - this.doompanel = new System.Windows.Forms.Panel(); + this.udmfpanel = new System.Windows.Forms.Panel(); + this.udmfactivates = new CodeImp.DoomBuilder.Controls.CheckboxArrayControl(); + this.argspanel = new System.Windows.Forms.Panel(); + this.arg2 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg1 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg0 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg3 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg4 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg1label = new System.Windows.Forms.Label(); + this.arg0label = new System.Windows.Forms.Label(); + this.arg3label = new System.Windows.Forms.Label(); + this.arg2label = new System.Windows.Forms.Label(); + this.arg4label = new System.Windows.Forms.Label(); this.tag = new CodeImp.DoomBuilder.Controls.NumericTextbox(); this.newtag = new System.Windows.Forms.Button(); this.settingsgroup = new System.Windows.Forms.GroupBox(); @@ -63,16 +68,9 @@ namespace CodeImp.DoomBuilder.Windows this.checkBox1 = new System.Windows.Forms.CheckBox(); this.tabs = new System.Windows.Forms.TabControl(); this.tabproperties = new System.Windows.Forms.TabPage(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.idgroup = new System.Windows.Forms.GroupBox(); this.tabsidedefs = new System.Windows.Forms.TabPage(); - this.backside = new System.Windows.Forms.CheckBox(); - this.backgroup = new System.Windows.Forms.GroupBox(); - this.backsector = new CodeImp.DoomBuilder.Controls.NumericTextbox(); - this.backlow = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); - this.backmid = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); - this.backhigh = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); - this.backoffsety = new CodeImp.DoomBuilder.Controls.NumericTextbox(); - this.backoffsetx = new CodeImp.DoomBuilder.Controls.NumericTextbox(); + this.splitter = new System.Windows.Forms.SplitContainer(); this.frontside = new System.Windows.Forms.CheckBox(); this.frontgroup = new System.Windows.Forms.GroupBox(); this.frontsector = new CodeImp.DoomBuilder.Controls.NumericTextbox(); @@ -81,11 +79,16 @@ namespace CodeImp.DoomBuilder.Windows this.fronthigh = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); this.frontoffsety = new CodeImp.DoomBuilder.Controls.NumericTextbox(); this.frontoffsetx = new CodeImp.DoomBuilder.Controls.NumericTextbox(); + this.backside = new System.Windows.Forms.CheckBox(); + this.backgroup = new System.Windows.Forms.GroupBox(); + this.backsector = new CodeImp.DoomBuilder.Controls.NumericTextbox(); + this.backlow = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); + this.backmid = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); + this.backhigh = new CodeImp.DoomBuilder.Controls.TextureSelectorControl(); + this.backoffsety = new CodeImp.DoomBuilder.Controls.NumericTextbox(); + this.backoffsetx = new CodeImp.DoomBuilder.Controls.NumericTextbox(); this.tabcustom = new System.Windows.Forms.TabPage(); this.fieldslist = new CodeImp.DoomBuilder.Controls.FieldsEditorControl(); - this.arg0 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg1 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg2 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); label2 = new System.Windows.Forms.Label(); taglabel = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); @@ -101,13 +104,18 @@ namespace CodeImp.DoomBuilder.Windows activationlabel = new System.Windows.Forms.Label(); this.actiongroup.SuspendLayout(); this.hexenpanel.SuspendLayout(); + this.udmfpanel.SuspendLayout(); + this.argspanel.SuspendLayout(); this.settingsgroup.SuspendLayout(); this.tabs.SuspendLayout(); this.tabproperties.SuspendLayout(); - this.groupBox1.SuspendLayout(); + this.idgroup.SuspendLayout(); this.tabsidedefs.SuspendLayout(); - this.backgroup.SuspendLayout(); + this.splitter.Panel1.SuspendLayout(); + this.splitter.Panel2.SuspendLayout(); + this.splitter.SuspendLayout(); this.frontgroup.SuspendLayout(); + this.backgroup.SuspendLayout(); this.tabcustom.SuspendLayout(); this.SuspendLayout(); // @@ -222,67 +230,17 @@ namespace CodeImp.DoomBuilder.Windows // activationlabel // activationlabel.AutoSize = true; - activationlabel.Location = new System.Drawing.Point(6, 18); + activationlabel.Location = new System.Drawing.Point(6, 17); activationlabel.Name = "activationlabel"; activationlabel.Size = new System.Drawing.Size(44, 14); activationlabel.TabIndex = 10; activationlabel.Text = "Trigger:"; // - // arg0label - // - this.arg0label.Location = new System.Drawing.Point(-26, 58); - this.arg0label.Name = "arg0label"; - this.arg0label.Size = new System.Drawing.Size(179, 14); - this.arg0label.TabIndex = 12; - this.arg0label.Text = "Argument 1:"; - this.arg0label.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.arg0label.UseMnemonic = false; - // - // arg1label - // - this.arg1label.Location = new System.Drawing.Point(-26, 84); - this.arg1label.Name = "arg1label"; - this.arg1label.Size = new System.Drawing.Size(179, 14); - this.arg1label.TabIndex = 14; - this.arg1label.Text = "Argument 2:"; - this.arg1label.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.arg1label.UseMnemonic = false; - // - // arg4label - // - this.arg4label.Location = new System.Drawing.Point(215, 84); - this.arg4label.Name = "arg4label"; - this.arg4label.Size = new System.Drawing.Size(179, 14); - this.arg4label.TabIndex = 16; - this.arg4label.Text = "Argument 5:"; - this.arg4label.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.arg4label.UseMnemonic = false; - // - // arg2label - // - this.arg2label.Location = new System.Drawing.Point(-26, 110); - this.arg2label.Name = "arg2label"; - this.arg2label.Size = new System.Drawing.Size(179, 14); - this.arg2label.TabIndex = 18; - this.arg2label.Text = "Argument 3:"; - this.arg2label.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.arg2label.UseMnemonic = false; - // - // arg3label - // - this.arg3label.Location = new System.Drawing.Point(215, 58); - this.arg3label.Name = "arg3label"; - this.arg3label.Size = new System.Drawing.Size(179, 14); - this.arg3label.TabIndex = 20; - this.arg3label.Text = "Argument 4:"; - this.arg3label.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.arg3label.UseMnemonic = false; - // // cancel // this.cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.cancel.Location = new System.Drawing.Point(439, 493); + this.cancel.Location = new System.Drawing.Point(439, 553); this.cancel.Name = "cancel"; this.cancel.Size = new System.Drawing.Size(112, 25); this.cancel.TabIndex = 17; @@ -293,7 +251,7 @@ namespace CodeImp.DoomBuilder.Windows // apply // this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.apply.Location = new System.Drawing.Point(320, 493); + this.apply.Location = new System.Drawing.Point(320, 553); this.apply.Name = "apply"; this.apply.Size = new System.Drawing.Size(112, 25); this.apply.TabIndex = 16; @@ -303,64 +261,36 @@ namespace CodeImp.DoomBuilder.Windows // // actiongroup // - this.actiongroup.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.actiongroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.actiongroup.Controls.Add(this.hexenpanel); this.actiongroup.Controls.Add(label2); this.actiongroup.Controls.Add(this.action); this.actiongroup.Controls.Add(this.browseaction); - this.actiongroup.Controls.Add(this.doompanel); - this.actiongroup.Location = new System.Drawing.Point(8, 238); + this.actiongroup.Controls.Add(this.udmfpanel); + this.actiongroup.Controls.Add(this.argspanel); + this.actiongroup.Location = new System.Drawing.Point(8, 166); this.actiongroup.Name = "actiongroup"; - this.actiongroup.Size = new System.Drawing.Size(517, 192); + this.actiongroup.Size = new System.Drawing.Size(517, 253); this.actiongroup.TabIndex = 18; this.actiongroup.TabStop = false; this.actiongroup.Text = " Action "; // // hexenpanel // - this.hexenpanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.hexenpanel.Controls.Add(this.arg2); - this.hexenpanel.Controls.Add(this.arg1); - this.hexenpanel.Controls.Add(this.arg0); - this.hexenpanel.Controls.Add(this.arg3); - this.hexenpanel.Controls.Add(this.arg4); this.hexenpanel.Controls.Add(this.activation); this.hexenpanel.Controls.Add(activationlabel); - this.hexenpanel.Controls.Add(this.arg1label); - this.hexenpanel.Controls.Add(this.arg0label); - this.hexenpanel.Controls.Add(this.arg3label); - this.hexenpanel.Controls.Add(this.arg2label); - this.hexenpanel.Controls.Add(this.arg4label); - this.hexenpanel.Location = new System.Drawing.Point(6, 52); + this.hexenpanel.Location = new System.Drawing.Point(6, 139); this.hexenpanel.Name = "hexenpanel"; - this.hexenpanel.Size = new System.Drawing.Size(505, 132); + this.hexenpanel.Size = new System.Drawing.Size(505, 49); this.hexenpanel.TabIndex = 13; - // - // arg3 - // - this.arg3.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg3.Location = new System.Drawing.Point(400, 53); - this.arg3.Name = "arg3"; - this.arg3.Size = new System.Drawing.Size(93, 24); - this.arg3.TabIndex = 28; - // - // arg4 - // - this.arg4.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg4.Location = new System.Drawing.Point(400, 79); - this.arg4.Name = "arg4"; - this.arg4.Size = new System.Drawing.Size(93, 24); - this.arg4.TabIndex = 27; + this.hexenpanel.Visible = false; // // activation // this.activation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.activation.FormattingEnabled = true; - this.activation.Location = new System.Drawing.Point(56, 14); + this.activation.Location = new System.Drawing.Point(56, 13); this.activation.Name = "activation"; this.activation.Size = new System.Drawing.Size(437, 22); this.activation.TabIndex = 11; @@ -391,15 +321,134 @@ namespace CodeImp.DoomBuilder.Windows this.browseaction.UseVisualStyleBackColor = true; this.browseaction.Click += new System.EventHandler(this.browseaction_Click); // - // doompanel + // udmfpanel // - this.doompanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.udmfpanel.Controls.Add(this.udmfactivates); + this.udmfpanel.Location = new System.Drawing.Point(6, 143); + this.udmfpanel.Name = "udmfpanel"; + this.udmfpanel.Size = new System.Drawing.Size(505, 104); + this.udmfpanel.TabIndex = 12; + this.udmfpanel.Visible = false; + // + // udmfactivates + // + this.udmfactivates.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.doompanel.Location = new System.Drawing.Point(6, 54); - this.doompanel.Name = "doompanel"; - this.doompanel.Size = new System.Drawing.Size(505, 132); - this.doompanel.TabIndex = 12; + this.udmfactivates.AutoScroll = true; + this.udmfactivates.Columns = 2; + this.udmfactivates.Location = new System.Drawing.Point(56, 5); + this.udmfactivates.Name = "udmfactivates"; + this.udmfactivates.Size = new System.Drawing.Size(401, 95); + this.udmfactivates.TabIndex = 1; + // + // argspanel + // + this.argspanel.Controls.Add(this.arg2); + this.argspanel.Controls.Add(this.arg1); + this.argspanel.Controls.Add(this.arg0); + this.argspanel.Controls.Add(this.arg3); + this.argspanel.Controls.Add(this.arg4); + this.argspanel.Controls.Add(this.arg1label); + this.argspanel.Controls.Add(this.arg0label); + this.argspanel.Controls.Add(this.arg3label); + this.argspanel.Controls.Add(this.arg2label); + this.argspanel.Controls.Add(this.arg4label); + this.argspanel.Location = new System.Drawing.Point(6, 54); + this.argspanel.Name = "argspanel"; + this.argspanel.Size = new System.Drawing.Size(505, 83); + this.argspanel.TabIndex = 13; + this.argspanel.Visible = false; + // + // arg2 + // + this.arg2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg2.Location = new System.Drawing.Point(123, 55); + this.arg2.Name = "arg2"; + this.arg2.Size = new System.Drawing.Size(93, 24); + this.arg2.TabIndex = 41; + // + // arg1 + // + this.arg1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg1.Location = new System.Drawing.Point(123, 29); + this.arg1.Name = "arg1"; + this.arg1.Size = new System.Drawing.Size(93, 24); + this.arg1.TabIndex = 40; + // + // arg0 + // + this.arg0.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg0.Location = new System.Drawing.Point(123, 3); + this.arg0.Name = "arg0"; + this.arg0.Size = new System.Drawing.Size(93, 24); + this.arg0.TabIndex = 39; + // + // arg3 + // + this.arg3.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg3.Location = new System.Drawing.Point(364, 3); + this.arg3.Name = "arg3"; + this.arg3.Size = new System.Drawing.Size(93, 24); + this.arg3.TabIndex = 38; + // + // arg4 + // + this.arg4.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg4.Location = new System.Drawing.Point(364, 29); + this.arg4.Name = "arg4"; + this.arg4.Size = new System.Drawing.Size(93, 24); + this.arg4.TabIndex = 37; + // + // arg1label + // + this.arg1label.Location = new System.Drawing.Point(-62, 34); + this.arg1label.Name = "arg1label"; + this.arg1label.Size = new System.Drawing.Size(179, 14); + this.arg1label.TabIndex = 33; + this.arg1label.Text = "Argument 2:"; + this.arg1label.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.arg1label.UseMnemonic = false; + // + // arg0label + // + this.arg0label.Location = new System.Drawing.Point(-62, 8); + this.arg0label.Name = "arg0label"; + this.arg0label.Size = new System.Drawing.Size(179, 14); + this.arg0label.TabIndex = 32; + this.arg0label.Text = "Argument 1:"; + this.arg0label.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.arg0label.UseMnemonic = false; + // + // arg3label + // + this.arg3label.Location = new System.Drawing.Point(179, 8); + this.arg3label.Name = "arg3label"; + this.arg3label.Size = new System.Drawing.Size(179, 14); + this.arg3label.TabIndex = 36; + this.arg3label.Text = "Argument 4:"; + this.arg3label.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.arg3label.UseMnemonic = false; + // + // arg2label + // + this.arg2label.Location = new System.Drawing.Point(-62, 60); + this.arg2label.Name = "arg2label"; + this.arg2label.Size = new System.Drawing.Size(179, 14); + this.arg2label.TabIndex = 35; + this.arg2label.Text = "Argument 3:"; + this.arg2label.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.arg2label.UseMnemonic = false; + // + // arg4label + // + this.arg4label.Location = new System.Drawing.Point(179, 34); + this.arg4label.Name = "arg4label"; + this.arg4label.Size = new System.Drawing.Size(179, 14); + this.arg4label.TabIndex = 34; + this.arg4label.Text = "Argument 5:"; + this.arg4label.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.arg4label.UseMnemonic = false; // // tag // @@ -467,147 +516,74 @@ namespace CodeImp.DoomBuilder.Windows this.tabs.Margin = new System.Windows.Forms.Padding(1); this.tabs.Name = "tabs"; this.tabs.SelectedIndex = 0; - this.tabs.Size = new System.Drawing.Size(541, 466); + this.tabs.Size = new System.Drawing.Size(541, 526); this.tabs.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; this.tabs.TabIndex = 20; // // tabproperties // - this.tabproperties.Controls.Add(this.groupBox1); + this.tabproperties.Controls.Add(this.idgroup); this.tabproperties.Controls.Add(this.settingsgroup); this.tabproperties.Controls.Add(this.actiongroup); this.tabproperties.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tabproperties.Location = new System.Drawing.Point(4, 23); this.tabproperties.Name = "tabproperties"; this.tabproperties.Padding = new System.Windows.Forms.Padding(5); - this.tabproperties.Size = new System.Drawing.Size(533, 439); + this.tabproperties.Size = new System.Drawing.Size(533, 499); this.tabproperties.TabIndex = 0; this.tabproperties.Text = "Properties"; this.tabproperties.UseVisualStyleBackColor = true; // - // groupBox1 + // idgroup // - this.groupBox1.Controls.Add(this.tag); - this.groupBox1.Controls.Add(taglabel); - this.groupBox1.Controls.Add(this.newtag); - this.groupBox1.Location = new System.Drawing.Point(8, 166); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(517, 66); - this.groupBox1.TabIndex = 20; - this.groupBox1.TabStop = false; - this.groupBox1.Text = " Identification "; + this.idgroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.idgroup.Controls.Add(this.tag); + this.idgroup.Controls.Add(taglabel); + this.idgroup.Controls.Add(this.newtag); + this.idgroup.Location = new System.Drawing.Point(8, 425); + this.idgroup.Name = "idgroup"; + this.idgroup.Size = new System.Drawing.Size(517, 66); + this.idgroup.TabIndex = 20; + this.idgroup.TabStop = false; + this.idgroup.Text = " Identification "; // // tabsidedefs // - this.tabsidedefs.Controls.Add(this.backside); - this.tabsidedefs.Controls.Add(this.backgroup); - this.tabsidedefs.Controls.Add(this.frontside); - this.tabsidedefs.Controls.Add(this.frontgroup); + this.tabsidedefs.Controls.Add(this.splitter); this.tabsidedefs.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tabsidedefs.Location = new System.Drawing.Point(4, 23); this.tabsidedefs.Name = "tabsidedefs"; this.tabsidedefs.Padding = new System.Windows.Forms.Padding(5); - this.tabsidedefs.Size = new System.Drawing.Size(533, 439); + this.tabsidedefs.Size = new System.Drawing.Size(533, 499); this.tabsidedefs.TabIndex = 1; this.tabsidedefs.Text = "Sidedefs"; this.tabsidedefs.UseVisualStyleBackColor = true; // - // backside + // splitter // - this.backside.AutoSize = true; - this.backside.Location = new System.Drawing.Point(20, 212); - this.backside.Name = "backside"; - this.backside.Size = new System.Drawing.Size(74, 18); - this.backside.TabIndex = 2; - this.backside.Text = "Back Side"; - this.backside.UseVisualStyleBackColor = true; - this.backside.CheckStateChanged += new System.EventHandler(this.backside_CheckStateChanged); + this.splitter.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitter.Location = new System.Drawing.Point(5, 5); + this.splitter.Name = "splitter"; + this.splitter.Orientation = System.Windows.Forms.Orientation.Horizontal; // - // backgroup + // splitter.Panel1 // - this.backgroup.Controls.Add(this.backsector); - this.backgroup.Controls.Add(label12); - this.backgroup.Controls.Add(this.backlow); - this.backgroup.Controls.Add(this.backmid); - this.backgroup.Controls.Add(this.backhigh); - this.backgroup.Controls.Add(this.backoffsety); - this.backgroup.Controls.Add(this.backoffsetx); - this.backgroup.Controls.Add(label7); - this.backgroup.Controls.Add(label8); - this.backgroup.Controls.Add(label9); - this.backgroup.Controls.Add(label10); - this.backgroup.Enabled = false; - this.backgroup.Location = new System.Drawing.Point(8, 214); - this.backgroup.Name = "backgroup"; - this.backgroup.Size = new System.Drawing.Size(517, 208); - this.backgroup.TabIndex = 1; - this.backgroup.TabStop = false; - this.backgroup.Text = " "; + this.splitter.Panel1.Controls.Add(this.frontside); + this.splitter.Panel1.Controls.Add(this.frontgroup); // - // backsector + // splitter.Panel2 // - this.backsector.AllowNegative = false; - this.backsector.AllowRelative = false; - this.backsector.ImeMode = System.Windows.Forms.ImeMode.Off; - this.backsector.Location = new System.Drawing.Point(103, 37); - this.backsector.Name = "backsector"; - this.backsector.Size = new System.Drawing.Size(94, 20); - this.backsector.TabIndex = 17; - this.backsector.Enter += new System.EventHandler(this.SelectAllText); - // - // backlow - // - this.backlow.Location = new System.Drawing.Point(416, 37); - this.backlow.Name = "backlow"; - this.backlow.Required = false; - this.backlow.Size = new System.Drawing.Size(83, 120); - this.backlow.TabIndex = 15; - this.backlow.TextureName = ""; - // - // backmid - // - this.backmid.Location = new System.Drawing.Point(325, 37); - this.backmid.Name = "backmid"; - this.backmid.Required = false; - this.backmid.Size = new System.Drawing.Size(83, 120); - this.backmid.TabIndex = 14; - this.backmid.TextureName = ""; - // - // backhigh - // - this.backhigh.Location = new System.Drawing.Point(234, 37); - this.backhigh.Name = "backhigh"; - this.backhigh.Required = false; - this.backhigh.Size = new System.Drawing.Size(83, 120); - this.backhigh.TabIndex = 13; - this.backhigh.TextureName = ""; - // - // backoffsety - // - this.backoffsety.AllowNegative = true; - this.backoffsety.AllowRelative = true; - this.backoffsety.ImeMode = System.Windows.Forms.ImeMode.Off; - this.backoffsety.Location = new System.Drawing.Point(152, 76); - this.backoffsety.Name = "backoffsety"; - this.backoffsety.Size = new System.Drawing.Size(45, 20); - this.backoffsety.TabIndex = 9; - this.backoffsety.Enter += new System.EventHandler(this.SelectAllText); - // - // backoffsetx - // - this.backoffsetx.AllowNegative = true; - this.backoffsetx.AllowRelative = true; - this.backoffsetx.ImeMode = System.Windows.Forms.ImeMode.Off; - this.backoffsetx.Location = new System.Drawing.Point(103, 76); - this.backoffsetx.Name = "backoffsetx"; - this.backoffsetx.Size = new System.Drawing.Size(45, 20); - this.backoffsetx.TabIndex = 8; - this.backoffsetx.Enter += new System.EventHandler(this.SelectAllText); + this.splitter.Panel2.Controls.Add(this.backside); + this.splitter.Panel2.Controls.Add(this.backgroup); + this.splitter.Size = new System.Drawing.Size(523, 489); + this.splitter.SplitterDistance = 239; + this.splitter.TabIndex = 3; // // frontside // this.frontside.AutoSize = true; - this.frontside.Location = new System.Drawing.Point(20, 6); + this.frontside.Location = new System.Drawing.Point(15, 1); this.frontside.Name = "frontside"; this.frontside.Size = new System.Drawing.Size(75, 18); this.frontside.TabIndex = 0; @@ -617,6 +593,9 @@ namespace CodeImp.DoomBuilder.Windows // // frontgroup // + this.frontgroup.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.frontgroup.Controls.Add(this.frontsector); this.frontgroup.Controls.Add(label11); this.frontgroup.Controls.Add(this.frontlow); @@ -629,9 +608,9 @@ namespace CodeImp.DoomBuilder.Windows this.frontgroup.Controls.Add(label4); this.frontgroup.Controls.Add(label3); this.frontgroup.Enabled = false; - this.frontgroup.Location = new System.Drawing.Point(8, 8); + this.frontgroup.Location = new System.Drawing.Point(3, 3); this.frontgroup.Name = "frontgroup"; - this.frontgroup.Size = new System.Drawing.Size(517, 200); + this.frontgroup.Size = new System.Drawing.Size(517, 233); this.frontgroup.TabIndex = 0; this.frontgroup.TabStop = false; this.frontgroup.Text = " "; @@ -652,7 +631,7 @@ namespace CodeImp.DoomBuilder.Windows this.frontlow.Location = new System.Drawing.Point(416, 37); this.frontlow.Name = "frontlow"; this.frontlow.Required = false; - this.frontlow.Size = new System.Drawing.Size(83, 120); + this.frontlow.Size = new System.Drawing.Size(83, 112); this.frontlow.TabIndex = 12; this.frontlow.TextureName = ""; // @@ -661,7 +640,7 @@ namespace CodeImp.DoomBuilder.Windows this.frontmid.Location = new System.Drawing.Point(325, 37); this.frontmid.Name = "frontmid"; this.frontmid.Required = false; - this.frontmid.Size = new System.Drawing.Size(83, 120); + this.frontmid.Size = new System.Drawing.Size(83, 112); this.frontmid.TabIndex = 11; this.frontmid.TextureName = ""; // @@ -670,7 +649,7 @@ namespace CodeImp.DoomBuilder.Windows this.fronthigh.Location = new System.Drawing.Point(234, 37); this.fronthigh.Name = "fronthigh"; this.fronthigh.Required = false; - this.fronthigh.Size = new System.Drawing.Size(83, 120); + this.fronthigh.Size = new System.Drawing.Size(83, 112); this.fronthigh.TabIndex = 10; this.fronthigh.TextureName = ""; // @@ -696,6 +675,101 @@ namespace CodeImp.DoomBuilder.Windows this.frontoffsetx.TabIndex = 8; this.frontoffsetx.Enter += new System.EventHandler(this.SelectAllText); // + // backside + // + this.backside.AutoSize = true; + this.backside.Location = new System.Drawing.Point(17, 1); + this.backside.Name = "backside"; + this.backside.Size = new System.Drawing.Size(74, 18); + this.backside.TabIndex = 2; + this.backside.Text = "Back Side"; + this.backside.UseVisualStyleBackColor = true; + this.backside.CheckStateChanged += new System.EventHandler(this.backside_CheckStateChanged); + // + // backgroup + // + this.backgroup.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.backgroup.Controls.Add(this.backsector); + this.backgroup.Controls.Add(label12); + this.backgroup.Controls.Add(this.backlow); + this.backgroup.Controls.Add(this.backmid); + this.backgroup.Controls.Add(this.backhigh); + this.backgroup.Controls.Add(this.backoffsety); + this.backgroup.Controls.Add(this.backoffsetx); + this.backgroup.Controls.Add(label7); + this.backgroup.Controls.Add(label8); + this.backgroup.Controls.Add(label9); + this.backgroup.Controls.Add(label10); + this.backgroup.Enabled = false; + this.backgroup.Location = new System.Drawing.Point(3, 3); + this.backgroup.Name = "backgroup"; + this.backgroup.Size = new System.Drawing.Size(519, 240); + this.backgroup.TabIndex = 1; + this.backgroup.TabStop = false; + this.backgroup.Text = " "; + // + // backsector + // + this.backsector.AllowNegative = false; + this.backsector.AllowRelative = false; + this.backsector.ImeMode = System.Windows.Forms.ImeMode.Off; + this.backsector.Location = new System.Drawing.Point(103, 37); + this.backsector.Name = "backsector"; + this.backsector.Size = new System.Drawing.Size(94, 20); + this.backsector.TabIndex = 17; + this.backsector.Enter += new System.EventHandler(this.SelectAllText); + // + // backlow + // + this.backlow.Location = new System.Drawing.Point(416, 37); + this.backlow.Name = "backlow"; + this.backlow.Required = false; + this.backlow.Size = new System.Drawing.Size(83, 112); + this.backlow.TabIndex = 15; + this.backlow.TextureName = ""; + // + // backmid + // + this.backmid.Location = new System.Drawing.Point(325, 37); + this.backmid.Name = "backmid"; + this.backmid.Required = false; + this.backmid.Size = new System.Drawing.Size(83, 112); + this.backmid.TabIndex = 14; + this.backmid.TextureName = ""; + // + // backhigh + // + this.backhigh.Location = new System.Drawing.Point(234, 37); + this.backhigh.Name = "backhigh"; + this.backhigh.Required = false; + this.backhigh.Size = new System.Drawing.Size(83, 112); + this.backhigh.TabIndex = 13; + this.backhigh.TextureName = ""; + // + // backoffsety + // + this.backoffsety.AllowNegative = true; + this.backoffsety.AllowRelative = true; + this.backoffsety.ImeMode = System.Windows.Forms.ImeMode.Off; + this.backoffsety.Location = new System.Drawing.Point(152, 76); + this.backoffsety.Name = "backoffsety"; + this.backoffsety.Size = new System.Drawing.Size(45, 20); + this.backoffsety.TabIndex = 9; + this.backoffsety.Enter += new System.EventHandler(this.SelectAllText); + // + // backoffsetx + // + this.backoffsetx.AllowNegative = true; + this.backoffsetx.AllowRelative = true; + this.backoffsetx.ImeMode = System.Windows.Forms.ImeMode.Off; + this.backoffsetx.Location = new System.Drawing.Point(103, 76); + this.backoffsetx.Name = "backoffsetx"; + this.backoffsetx.Size = new System.Drawing.Size(45, 20); + this.backoffsetx.TabIndex = 8; + this.backoffsetx.Enter += new System.EventHandler(this.SelectAllText); + // // tabcustom // this.tabcustom.Controls.Add(this.fieldslist); @@ -703,7 +777,7 @@ namespace CodeImp.DoomBuilder.Windows this.tabcustom.Location = new System.Drawing.Point(4, 23); this.tabcustom.Name = "tabcustom"; this.tabcustom.Padding = new System.Windows.Forms.Padding(3); - this.tabcustom.Size = new System.Drawing.Size(533, 439); + this.tabcustom.Size = new System.Drawing.Size(533, 499); this.tabcustom.TabIndex = 2; this.tabcustom.Text = "Custom"; this.tabcustom.UseVisualStyleBackColor = true; @@ -713,42 +787,19 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.fieldslist.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.fieldslist.Location = new System.Drawing.Point(11, 11); this.fieldslist.Margin = new System.Windows.Forms.Padding(8); this.fieldslist.Name = "fieldslist"; - this.fieldslist.Size = new System.Drawing.Size(511, 417); + this.fieldslist.Size = new System.Drawing.Size(511, 477); this.fieldslist.TabIndex = 0; // - // arg0 - // - this.arg0.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg0.Location = new System.Drawing.Point(159, 53); - this.arg0.Name = "arg0"; - this.arg0.Size = new System.Drawing.Size(93, 24); - this.arg0.TabIndex = 29; - // - // arg1 - // - this.arg1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg1.Location = new System.Drawing.Point(159, 79); - this.arg1.Name = "arg1"; - this.arg1.Size = new System.Drawing.Size(93, 24); - this.arg1.TabIndex = 30; - // - // arg2 - // - this.arg2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg2.Location = new System.Drawing.Point(159, 105); - this.arg2.Name = "arg2"; - this.arg2.Size = new System.Drawing.Size(93, 24); - this.arg2.TabIndex = 31; - // // LinedefEditForm // this.AcceptButton = this.apply; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.CancelButton = this.cancel; - this.ClientSize = new System.Drawing.Size(561, 528); + this.ClientSize = new System.Drawing.Size(561, 588); this.Controls.Add(this.tabs); this.Controls.Add(this.cancel); this.Controls.Add(this.apply); @@ -766,17 +817,23 @@ namespace CodeImp.DoomBuilder.Windows this.actiongroup.PerformLayout(); this.hexenpanel.ResumeLayout(false); this.hexenpanel.PerformLayout(); + this.udmfpanel.ResumeLayout(false); + this.argspanel.ResumeLayout(false); this.settingsgroup.ResumeLayout(false); this.tabs.ResumeLayout(false); this.tabproperties.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); + this.idgroup.ResumeLayout(false); + this.idgroup.PerformLayout(); this.tabsidedefs.ResumeLayout(false); - this.tabsidedefs.PerformLayout(); - this.backgroup.ResumeLayout(false); - this.backgroup.PerformLayout(); + this.splitter.Panel1.ResumeLayout(false); + this.splitter.Panel1.PerformLayout(); + this.splitter.Panel2.ResumeLayout(false); + this.splitter.Panel2.PerformLayout(); + this.splitter.ResumeLayout(false); this.frontgroup.ResumeLayout(false); this.frontgroup.PerformLayout(); + this.backgroup.ResumeLayout(false); + this.backgroup.PerformLayout(); this.tabcustom.ResumeLayout(false); this.ResumeLayout(false); @@ -814,20 +871,23 @@ namespace CodeImp.DoomBuilder.Windows private CodeImp.DoomBuilder.Controls.NumericTextbox backsector; private CodeImp.DoomBuilder.Controls.NumericTextbox frontsector; private System.Windows.Forms.ComboBox activation; - private System.Windows.Forms.Panel doompanel; + private System.Windows.Forms.Panel udmfpanel; private System.Windows.Forms.Panel hexenpanel; - private System.Windows.Forms.Label arg0label; - private System.Windows.Forms.Label arg1label; - private System.Windows.Forms.Label arg4label; - private System.Windows.Forms.Label arg2label; - private System.Windows.Forms.Label arg3label; private System.Windows.Forms.TabPage tabcustom; private CodeImp.DoomBuilder.Controls.FieldsEditorControl fieldslist; - private System.Windows.Forms.GroupBox groupBox1; - private CodeImp.DoomBuilder.Controls.ArgumentBox arg4; - private CodeImp.DoomBuilder.Controls.ArgumentBox arg3; + private System.Windows.Forms.GroupBox idgroup; + private CodeImp.DoomBuilder.Controls.CheckboxArrayControl udmfactivates; + private System.Windows.Forms.Panel argspanel; private CodeImp.DoomBuilder.Controls.ArgumentBox arg2; private CodeImp.DoomBuilder.Controls.ArgumentBox arg1; private CodeImp.DoomBuilder.Controls.ArgumentBox arg0; + private CodeImp.DoomBuilder.Controls.ArgumentBox arg3; + private CodeImp.DoomBuilder.Controls.ArgumentBox arg4; + private System.Windows.Forms.Label arg1label; + private System.Windows.Forms.Label arg0label; + private System.Windows.Forms.Label arg3label; + private System.Windows.Forms.Label arg2label; + private System.Windows.Forms.Label arg4label; + private System.Windows.Forms.SplitContainer splitter; } } \ No newline at end of file diff --git a/Source/Windows/LinedefEditForm.cs b/Source/Windows/LinedefEditForm.cs index ac37e62b..9c1507b0 100644 --- a/Source/Windows/LinedefEditForm.cs +++ b/Source/Windows/LinedefEditForm.cs @@ -46,7 +46,8 @@ namespace CodeImp.DoomBuilder.Windows InitializeComponent(); // Fill flags list - foreach(KeyValuePair lf in General.Map.Config.LinedefFlags) flags.Add(lf.Value, lf.Key); + foreach(KeyValuePair lf in General.Map.Config.LinedefFlags) + flags.Add(lf.Value, lf.Key); // Fill actions list action.GeneralizedCategories = General.Map.Config.GenActionCategories; @@ -54,6 +55,7 @@ namespace CodeImp.DoomBuilder.Windows // Fill activations list activation.Items.AddRange(General.Map.Config.LinedefActivates.ToArray()); + foreach(LinedefActivateInfo ai in General.Map.Config.LinedefActivates) udmfactivates.Add(ai.Title, ai); // Fill universal fields list fieldslist.ListFixedFields(General.Map.Config.LinedefFields); @@ -69,10 +71,41 @@ namespace CodeImp.DoomBuilder.Windows // Initialize custom fields editor fieldslist.Setup(); - // Show appropriate panels/tabs - doompanel.Visible = General.Map.IsType(typeof(DoomMapSetIO)); - hexenpanel.Visible = General.Map.IsType(typeof(HexenMapSetIO)); - //if(!General.Map.IsType(typeof(UniversalMapSetIO))) tabs.TabPages.Remove(tabcustom); + // THE CODE BELOW IS ABSOLUTELY UGLY + // I should make different controls for each format + // that handle linedef properties + + // UDMF map? + if(General.Map.IsType(typeof(UniversalMapSetIO))) + { + udmfpanel.Visible = true; + argspanel.Visible = true; + } + // Hexen map? + else if(General.Map.IsType(typeof(HexenMapSetIO))) + { + hexenpanel.Visible = true; + argspanel.Visible = true; + actiongroup.Height = 210; + this.Height = 510; + } + // Doom map? + else + { + actiongroup.Height = 68; + this.Height = 470; + } + + // ID group? + if(!General.Map.IsType(typeof(HexenMapSetIO))) + { + // Match position after the action group + idgroup.Top = actiongroup.Bottom + actiongroup.Margin.Bottom + idgroup.Margin.Top; + } + else + { + idgroup.Visible = false; + } } // This sets up the form to edit the given lines @@ -94,12 +127,19 @@ namespace CodeImp.DoomBuilder.Windows // Flags foreach(CheckBox c in flags.Checkboxes) - c.Checked = (fl.Flags & (int)c.Tag) != 0; + c.Checked = fl.Flags[c.Tag.ToString()]; // Activations foreach(LinedefActivateInfo ai in activation.Items) - if((fl.Flags & ai.Index) == ai.Index) activation.SelectedItem = ai; - + if((fl.Activate & ai.Index) == ai.Index) activation.SelectedItem = ai; + + // UDMF Activations + foreach(CheckBox c in udmfactivates.Checkboxes) + { + LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); + c.Checked = fl.Flags[ai.Key]; + } + // Action/tags action.Value = fl.Action; tag.Text = fl.Tag.ToString(); @@ -148,7 +188,7 @@ namespace CodeImp.DoomBuilder.Windows // Flags foreach(CheckBox c in flags.Checkboxes) { - if(((l.Flags & (int)c.Tag) != 0) != c.Checked) + if(l.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; @@ -160,10 +200,21 @@ namespace CodeImp.DoomBuilder.Windows { sai = (activation.Items[0] as LinedefActivateInfo); foreach(LinedefActivateInfo ai in activation.Items) - if((l.Flags & ai.Index) == ai.Index) sai = ai; + if((l.Activate & ai.Index) == ai.Index) sai = ai; if(sai != activation.SelectedItem) activation.SelectedIndex = -1; } - + + // UDMF Activations + foreach(CheckBox c in udmfactivates.Checkboxes) + { + LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); + if(c.Checked != fl.Flags[ai.Key]) + { + c.ThreeState = true; + c.CheckState = CheckState.Indeterminate; + } + } + // Action/tags if(l.Action != action.Value) action.Empty = true; if(l.Tag.ToString() != tag.Text) tag.Text = ""; @@ -252,20 +303,24 @@ namespace CodeImp.DoomBuilder.Windows // Go for all the lines foreach(Linedef l in lines) { - // Remove activation flags - if(activation.SelectedIndex > -1) - foreach(LinedefActivateInfo ai in activation.Items) l.Flags &= ~ai.Index; - // Apply all flags foreach(CheckBox c in flags.Checkboxes) { - if(c.CheckState == CheckState.Checked) l.Flags |= (int)c.Tag; - else if(c.CheckState == CheckState.Unchecked) l.Flags &= ~(int)c.Tag; + if(c.CheckState == CheckState.Checked) l.Flags[c.Tag.ToString()] = true; + else if(c.CheckState == CheckState.Unchecked) l.Flags[c.Tag.ToString()] = false; } // Apply chosen activation flag if(activation.SelectedIndex > -1) - l.Flags |= (activation.SelectedItem as LinedefActivateInfo).Index; + l.Activate = (activation.SelectedItem as LinedefActivateInfo).Index; + + // UDMF activations + foreach(CheckBox c in udmfactivates.Checkboxes) + { + LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); + if(c.CheckState == CheckState.Checked) l.Flags[ai.Key] = true; + else if(c.CheckState == CheckState.Unchecked) l.Flags[ai.Key] = false; + } // Action/tags if(!action.Empty) l.Action = action.Value; diff --git a/Source/Windows/LinedefEditForm.resx b/Source/Windows/LinedefEditForm.resx index f28fec56..7180493f 100644 --- a/Source/Windows/LinedefEditForm.resx +++ b/Source/Windows/LinedefEditForm.resx @@ -117,43 +117,229 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + False + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + \ No newline at end of file diff --git a/Source/Windows/SectorEditForm.Designer.cs b/Source/Windows/SectorEditForm.Designer.cs index 179a656f..db249db3 100644 --- a/Source/Windows/SectorEditForm.Designer.cs +++ b/Source/Windows/SectorEditForm.Designer.cs @@ -394,6 +394,7 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.fieldslist.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.fieldslist.Location = new System.Drawing.Point(11, 11); this.fieldslist.Margin = new System.Windows.Forms.Padding(8); this.fieldslist.Name = "fieldslist"; diff --git a/Source/Windows/ThingEditForm.Designer.cs b/Source/Windows/ThingEditForm.Designer.cs index 917d97a8..1997d4c3 100644 --- a/Source/Windows/ThingEditForm.Designer.cs +++ b/Source/Windows/ThingEditForm.Designer.cs @@ -58,6 +58,11 @@ namespace CodeImp.DoomBuilder.Windows this.tabeffects = new System.Windows.Forms.TabPage(); this.actiongroup = new System.Windows.Forms.GroupBox(); this.hexenpanel = new System.Windows.Forms.Panel(); + this.arg2 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg1 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg0 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg3 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); + this.arg4 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); this.arg1label = new System.Windows.Forms.Label(); this.arg0label = new System.Windows.Forms.Label(); this.arg3label = new System.Windows.Forms.Label(); @@ -73,11 +78,6 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist = new CodeImp.DoomBuilder.Controls.FieldsEditorControl(); this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); - this.arg4 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg3 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg0 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg1 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); - this.arg2 = new CodeImp.DoomBuilder.Controls.ArgumentBox(); groupBox1 = new System.Windows.Forms.GroupBox(); label4 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); @@ -451,6 +451,46 @@ namespace CodeImp.DoomBuilder.Windows this.hexenpanel.Size = new System.Drawing.Size(609, 208); this.hexenpanel.TabIndex = 13; // + // arg2 + // + this.arg2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg2.Location = new System.Drawing.Point(179, 63); + this.arg2.Name = "arg2"; + this.arg2.Size = new System.Drawing.Size(93, 24); + this.arg2.TabIndex = 32; + // + // arg1 + // + this.arg1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg1.Location = new System.Drawing.Point(179, 37); + this.arg1.Name = "arg1"; + this.arg1.Size = new System.Drawing.Size(93, 24); + this.arg1.TabIndex = 31; + // + // arg0 + // + this.arg0.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg0.Location = new System.Drawing.Point(179, 11); + this.arg0.Name = "arg0"; + this.arg0.Size = new System.Drawing.Size(93, 24); + this.arg0.TabIndex = 30; + // + // arg3 + // + this.arg3.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg3.Location = new System.Drawing.Point(425, 11); + this.arg3.Name = "arg3"; + this.arg3.Size = new System.Drawing.Size(93, 24); + this.arg3.TabIndex = 29; + // + // arg4 + // + this.arg4.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arg4.Location = new System.Drawing.Point(425, 37); + this.arg4.Name = "arg4"; + this.arg4.Size = new System.Drawing.Size(93, 24); + this.arg4.TabIndex = 28; + // // arg1label // this.arg1label.Location = new System.Drawing.Point(-6, 42); @@ -585,6 +625,7 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.fieldslist.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.fieldslist.Location = new System.Drawing.Point(8, 9); this.fieldslist.Margin = new System.Windows.Forms.Padding(8, 9, 8, 9); this.fieldslist.Name = "fieldslist"; @@ -614,46 +655,6 @@ namespace CodeImp.DoomBuilder.Windows this.apply.UseVisualStyleBackColor = true; this.apply.Click += new System.EventHandler(this.apply_Click); // - // arg4 - // - this.arg4.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg4.Location = new System.Drawing.Point(425, 37); - this.arg4.Name = "arg4"; - this.arg4.Size = new System.Drawing.Size(93, 24); - this.arg4.TabIndex = 28; - // - // arg3 - // - this.arg3.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg3.Location = new System.Drawing.Point(425, 11); - this.arg3.Name = "arg3"; - this.arg3.Size = new System.Drawing.Size(93, 24); - this.arg3.TabIndex = 29; - // - // arg0 - // - this.arg0.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg0.Location = new System.Drawing.Point(179, 11); - this.arg0.Name = "arg0"; - this.arg0.Size = new System.Drawing.Size(93, 24); - this.arg0.TabIndex = 30; - // - // arg1 - // - this.arg1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg1.Location = new System.Drawing.Point(179, 37); - this.arg1.Name = "arg1"; - this.arg1.Size = new System.Drawing.Size(93, 24); - this.arg1.TabIndex = 31; - // - // arg2 - // - this.arg2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.arg2.Location = new System.Drawing.Point(179, 63); - this.arg2.Name = "arg2"; - this.arg2.Size = new System.Drawing.Size(93, 24); - this.arg2.TabIndex = 32; - // // ThingEditForm // this.AcceptButton = this.apply; diff --git a/Source/Windows/ThingEditForm.cs b/Source/Windows/ThingEditForm.cs index 0d7f4ada..9df1410a 100644 --- a/Source/Windows/ThingEditForm.cs +++ b/Source/Windows/ThingEditForm.cs @@ -57,7 +57,8 @@ namespace CodeImp.DoomBuilder.Windows InitializeComponent(); // Fill flags list - foreach(KeyValuePair tf in General.Map.Config.ThingFlags) flags.Add(tf.Value, tf.Key); + foreach(KeyValuePair tf in General.Map.Config.ThingFlags) + flags.Add(tf.Value, tf.Key); // Fill actions list action.GeneralizedCategories = General.Map.Config.GenActionCategories; @@ -122,7 +123,7 @@ namespace CodeImp.DoomBuilder.Windows // Flags foreach(CheckBox c in flags.Checkboxes) - c.Checked = (ft.Flags & (int)c.Tag) != 0; + c.Checked = ft.Flags[c.Tag.ToString()]; // Coordination angledeg = ft.AngleDeg - 90; @@ -158,7 +159,7 @@ namespace CodeImp.DoomBuilder.Windows // Flags foreach(CheckBox c in flags.Checkboxes) { - if(((t.Flags & (int)c.Tag) != 0) != c.Checked) + if(t.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; @@ -327,8 +328,8 @@ namespace CodeImp.DoomBuilder.Windows // Apply all flags foreach(CheckBox c in flags.Checkboxes) { - if(c.CheckState == CheckState.Checked) t.Flags |= (int)c.Tag; - else if(c.CheckState == CheckState.Unchecked) t.Flags &= ~(int)c.Tag; + if(c.CheckState == CheckState.Checked) t.Flags[c.Tag.ToString()] = true; + else if(c.CheckState == CheckState.Unchecked) t.Flags[c.Tag.ToString()] = false; } // Action/tags diff --git a/Source/Windows/ThingEditForm.resx b/Source/Windows/ThingEditForm.resx index 5dc9e20f..46636dfd 100644 --- a/Source/Windows/ThingEditForm.resx +++ b/Source/Windows/ThingEditForm.resx @@ -169,451 +169,451 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD+ + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD6 ZwAAAk1TRnQBSQFMAgEBFAEAARgBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABYAMAAQEBAAEgBgABYP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOgABBAIBAQQBFAIB ARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIB ARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBJAABMAIBAUoBlAGL - AcUB/wGEAXwBxAH/AYEBcwHEAf8BfwFxAcMB/wF9AW8BwQH/AX0BcQG2Af8BMAIBAUoBFAIBARkcAAEw - AgEBSgEEAVYBlwH/AQQBRwF+Af8BBAFAAXIB/wEEAT4BbwH/AQQBOwFpAf8BBAE0AVwB/wEwAgEBSgEU - AgEBGRwAATACAQJKAWMBZQH/ATsBUwFVAf8BNQFLAU0B/wEzAUkBSwH/ATEBRQFHAf8BLQE7ATwB/wEw - AgEBSgEUAgEBGRwAATACAQFKATEBVQFkAf8BJQFHAVUB/wEgAUEBTgH/AR8BQAFNAf8BHgE8AUgB/wEe - ATMBOwH/ATACAQFKARQCAQEZGAABgAFLAWEB5wGfAZUB0gH/AZ4BlAHTAf8BnAGSAdIB/wGbAZEB0gH/ - AZkBjgHSAf8BlQGKAdAB/wGLAYEBywH/AX8BcgHFAf8BZwEiATUB2wEUAgEBGRQAATkBMQFaAecBBAFn - AbUB/wEEAWcBtAH/AQQBZQGyAf8BBAFkAa8B/wEEAWIBqwH/AQQBXgGkAf8BBAFSAY4B/wEEAUABcgH/ - AUcBDgEYAdsBFAIBARkUAAFdATgBPAHnAVUBeQF8Af8BVAF5AXwB/wFTAXgBewH/AVEBdgF5Af8BTwF0 - AXcB/wFMAW8BcgH/AUMBYAFjAf8BNAFLAU0B/wFRAg4B2wEUAgEBGRQAAVMBMQE6AecBNAFoAX4B/wEz - AWkBfgH/ATIBZwF9Af8BMQFmAXsB/wEvAWQBeQH/AS0BXwF0Af8BKAFTAWQB/wEgAUEBTgH/AU8CDgHb - ARQCAQEZEAABeAE0AUQB3AGrAaEB4gH/Aa4BowHoAf8BsAGkAewB/wGvAaQB6wH/Aa8BpAHqAf8BrwGk - AeoB/wGtAaEB6AH/AaoBnwHiAf8BnQGTAdMB/wGDAXoBxgH/AWYBIgE1AdsBFAIBARkMAAFGASQBQgHc - AQQBfAHbAf8BBAGBAeYB/wEEAYIB7QH/AQQBgQHsAf8BBAGBAeoB/wEEAYEB6gH/AQQBgAHkAf8BBAF7 - AdkB/wEEAWYBswH/AQQBRwF/Af8BRwEOARgB2wEUAgEBGQwAAWICKgHcAV8BkwGYAf8BXwGfAaUB/wFh - AaUBqwH/AWEBowGpAf8BYAGiAagB/wFgAaIBqAH/AV4BngGjAf8BXQGTAZgB/wFUAXgBfAH/ATsBVAFW - Af8BUQIOAdsBFAIBARkMAAFXASgBKgHcATEBgQGgAf8BKgGJAbEB/wElAZEBvQH/ASYBjwG6Af8BJwGN - AbgB/wEnAY0BuAH/ASkBiAGvAf8BLwGBAaAB/wEyAWgBfgH/ASQBSAFXAf8BTwIOAdsBFAIBARkIAAEw + AcUB/wGEAX0BxAH/AYEBdAHEAf8BgAFyAcMB/wF+AXABwQH/AX4BcgG2Af8BMAIBAUoBFAIBARkcAAEw + AgEBSgEFAVcBlwH/AQUBSAF/Af8BBQFBAXMB/wEFAT8BcAH/AQUBPAFqAf8BBQE1AV0B/wEwAgEBSgEU + AgEBGRwAATACAQFKAUsBZAFmAf8BPAFUAVYB/wE2AUwBTgH/ATQBSgFMAf8BMgFGAUgB/wEuATwBPQH/ + ATACAQFKARQCAQEZHAABMAIBAUoBMgFWAWUB/wEmAUgBVgH/ASEBQgFPAf8BIAFBAU4B/wEfAT0BSQH/ + AR8BNAE8Af8BMAIBAUoBFAIBARkYAAF8AT4BUAHnAZ8BlQHSAf8BngGUAdMB/wGcAZIB0gH/AZsBkQHS + Af8BmQGOAdIB/wGVAYoB0AH/AYsBgQHLAf8BgAFzAcUB/wFmARgBKAHbARQCAQEZFAABQgEoAUsB5wEF + AWgBtQH/AQUBaAG0Af8BBQFmAbIB/wEFAWUBrwH/AQUBYwGrAf8BBQFfAaQB/wEFAVMBjgH/AQUBQQFz + Af8BTwEKARMB2wEUAgEBGRQAAV0BLwExAecBVgF6AX0B/wFVAXoBfQH/AVQBeQF8Af8BUgF3AXoB/wFQ + AXUBeAH/AU0BcAFzAf8BRAFhAWQB/wE1AUwBTgH/AVcCCgHbARQCAQEZFAABVQEoATEB5wE1AWkBfwH/ + ATQBagF/Af8BMwFoAX4B/wEyAWcBfAH/ATABZQF6Af8BLgFgAXUB/wEpAVQBZQH/ASEBQgFPAf8BVQIK + AdsBFAIBARkQAAFzASgBNAHcAasBoQHiAf8BrgGjAegB/wGwAaQB7AH/Aa8BpAHrAf8BrwGkAeoB/wGv + AaQB6gH/Aa0BoQHoAf8BqgGfAeIB/wGdAZMB0wH/AYMBewHGAf8BZgEYASgB2wEUAgEBGQwAAU0BGgEy + AdwBBQF9AdsB/wEFAYEB5gH/AQUBggHtAf8BBQGBAewB/wEFAYEB6gH/AQUBgQHqAf8BBQGBAeQB/wEF + AXwB2QH/AQUBZwGzAf8BBQFIAYAB/wFPAQoBEwHbARQCAQEZDAABYwIfAdwBYAGTAZgB/wFgAZ8BpQH/ + AWIBpQGrAf8BYgGjAakB/wFhAaIBqAH/AWEBogGoAf8BXwGeAaMB/wFeAZMBmAH/AVUBeQF9Af8BPAFV + AVcB/wFXAgoB2wEUAgEBGQwAAVkCHwHcATIBgQGgAf8BKwGJAbEB/wEmAZEBvQH/AScBjwG6Af8BKAGN + AbgB/wEoAY0BuAH/ASoBiAGvAf8BMAGBAaAB/wEzAWkBfwH/ASUBSQFYAf8BVQIKAdsBFAIBARkIAAEw AgEBSgGsAaIB4wH/Aa8BpAHrAf8BtQGqAfAB/wG1AaoB8AH/AbUBqgHwAf8BtQGqAfAB/wGwAaUB7QH/ - AbEBpgHvAf8BrQGiAecB/wGXAY0BzwH/AZkBjgHRAf8BggF5AcYB/wEwAgEBSggAATACAQFKAQQBfQHe - Af8BBAGBAe0B/wEEAYkB+gH/AQQBiQH6Af8BBAGJAfoB/wEEAYkB+gH/AQQBgwHwAf8BBAGFAfQB/wEE - AYAB5AH/AQQBXgGlAf8BBAFiAasB/wEEAUYBfQH/ATACAQFKCAABMAIBAUoBXwGXAZwB/wFhAaQBqgH/ - AWgBrAGyAf8BaAGsAbIB/wFoAawBsgH/AWgBrAGyAf8BYgGmAawB/wFjAakBrwH/AV8BnQGiAf8BTgFv - AXIB/wFQAXMBdgH/AToBUgFUAf8BMAIBAUoIAAEwAgEBSgEwAYIBpAH/ASYBjwG8Af8BIQGbAc0B/wEh - AZsBzQH/ASEBmwHNAf8BIQGbAc0B/wEkAZIBwAH/ASEBlgHGAf8BLAGHAa0B/wEvAWABcwH/ATABYwF4 - Af8BIwFHAVYB/wEwAgEBSggAAbIBpwHqAf8BtQGrAe0B/wG0AagB8QH/AbUBqgHwAf8BtQGqAfAB/wG1 - AaoB7wH/AbMBqAHrAf8BpgGdAdMB/wGCAXoBwAH/AWQBVQGuAf8DBAH/AZkBjwHQAf8BlQGKAdAB/wGB - AXYBvQH/AQIDAQQAAQQBggHvAf8BBAGIAfgB/wEEAYkB+gH/AQQBiQH6Af8BBAGJAfoB/wEEAYgB+gH/ - AQQBhAHxAf8BBAFuAcIB/wEEAUMBdwH/AQQBGQErAf8DBAH/AQQBYQGqAf8BBAFeAaQB/wEEAT0BbAH/ - AQIDAQQAAWQBpAGqAf8BaQGpAa8B/wFmAa0BtAH/AWgBrAGyAf8BaAGsAbIB/wFoAasBsQH/AWYBpQGq - Af8BXAGAAYEB/wE4AU0BTwH/ARYCHQH/AwQB/wFQAXMBdgH/AUwBbwFyAf8BNAFGAUgB/wECAwEEAAEp - AZABuwH/ASYBlwHGAf8BHQGcAdEB/wEhAZsBzQH/ASEBmwHNAf8BIgGaAcsB/wEpAZEBvAH/AToBbgGB - Af8BJAFDAU8B/wEPARkBHQH/AwQB/wEwAWMBdwH/AS0BXwF0Af8BIgE9AUcB/wECAwEEAAG1AaoB8gH/ - Ab8BtQHzAf8BtwGsAfAB/wG1AaoB8AH/AakBoAHZAf8BiQGBAcQB/wFpAVoBswH/AWMBWgGNAf8DBAH/ - AwQB/wFfAVABqwH/Aa0BogHlAf8BpAGaAdcB/wGIAX8ByAH/ARQCAQEZBAABBAGKAf0B/wETAZIC/wEE - AYsB/gH/AQQBiQH6Af8BBAF0Ac4B/wEEAUwBgwH/AQQBIQE5Af8BBAEFAQYB/wMEAf8DBAH/AQQBEwEg - Af8BBAF/AeEB/wEEAW8BxAH/AQQBTQGFAf8BFAIBARkEAAFoAa4BtQH/AXYBtQG7Af8BawGtAbMB/wFo - AawBsgH/AV8BhgGKAf8BQAFYAVoB/wEcASYBJwH/AwUB/wMEAf8DBAH/ARECFgH/AV8BmgGgAf8BWgGB - AYMB/wE/AVoBXAH/ARQCAQEZBAABHgGeAdIB/wEfAakB4gH/ASIBnQHPAf8BIQGbAc0B/wE4AXcBjAH/ - ASgBTAFaAf8BEgEhAScB/wEEAgUB/wMEAf8DBAH/AQsBEwEWAf8BLQGFAaoB/wE1AXIBhgH/ASYBTgFe - Af8BFAIBARkBCwIBAQ0BvQGzAfMB/wHGAb0B9QH/AboBsAHwAf8BtQGqAfAB/wGVAYoBygH/AX8BcgG8 - Af8BXAFNAaQB/wMEAf8DBAH/AwQB/wGEAX0BwQH/AbIBpwHwAf8BqQGeAeIB/wGOAYIBzQH/ARQCAQEZ - AQsCAQENARABkQL/ASABmAL/AQgBjQL/AQQBiQH6Af8BBAFZAZwB/wEEAToBZgH/AQQBDAETAf8DBAH/ - AwQB/wMEAf8BBAFGAXwB/wEEAYYB9gH/AQQBegHXAf8BBAFVAZQB/wEUAgEBGQELAgEBDQFzAbQBugH/ - AYABugHAAf8BcAGvAbUB/wFoAawBsgH/AUsBaAFqAf8BMQFCAUQB/wELAQ0BDgH/AwQB/wMEAf8DBAH/ - ATsBUQFSAf8BZAGrAbEB/wFdAZIBlwH/AUUBZQFnAf8BFAIBARkBCwIBAQ0BHwGnAd4B/wEpAa4B5AH/ - ASQBoAHTAf8BIQGbAc0B/wEwAVoBagH/ASABOgFEAf8BCAEMAQ4B/wMEAf8DBAH/AwQB/wEmAUYBUgH/ - ASABmAHKAf8BLwGBAZ8B/wEqAVcBaQH/ARQCAQEZAQsCAQENAcEBuAH0Af8BygHCAfUB/wG7AbEB8AH/ - AbUBqgHwAf8BtQGqAe8B/wG1AaoB7wH/AXEBZAG3Af8DBAH/AwQB/wFbAU0BnQH/AagBnwHXAf8BrwGk - AesB/wGtAaIB5gH/AZEBhQHOAf8BFAIBARkBCwIBAQ0BFwGUAv8BJwGbAv8BCAGNAv8BBAGJAfoB/wEE - AYgB+gH/AQQBiAH5Af8BBAErAUsB/wMEAf8DBAH/AQQBBwEJAf8BBAFzAcsB/wEEAYEB7AH/AQQBgAHi - Af8BBAFYAZoB/wEUAgEBGQELAgEBDQF4AbcBvQH/AYEBvQHCAf8BcAGvAbQB/wFoAawBsgH/AWgBqwGx - Af8BaAGrAbEB/wEkATEBMwH/AwQB/wMEAf8BBgIHAf8BXgGDAYcB/wFhAaMBqQH/AV4BmwGhAf8BSAFo - AWsB/wEUAgEBGQELAgEBDQEiAasB4wH/AS8BsAHlAf8BJQGfAdEB/wEhAZsBzQH/ASIBmgHLAf8BIwGZ - AckB/wEYASsBMwH/AwQB/wMEAf8BBQIHAf8BOQF1AYkB/wEmAY8BugH/ASsBhgGsAf8BKwFaAW0B/wEU - AgEBGQQAAcABtwH0Af8BzwHIAfYB/wHAAbYB8wH/AbQBqQHsAf8BsgGoAeoB/wF5AWwBugH/AT0BIgHE - Af8BgwF8AcIB/wFYAUkBogH/AXEBZAG3Af8BtQGqAe4B/wG1AaoB8AH/AasBoQHjAf8BkQGGAc0B/wEJ - AgEBCgQAARYBlAL/ATEBoAL/ARQBkwL/AQQBhQH0Af8BBAGDAfAB/wEEATMBWgH/AwQB/wEEAUUBewH/ - AQQBBwEKAf8BBAErAUsB/wEEAYgB+AH/AQQBiQH6Af8BBAF9Ad0B/wEEAVgBmQH/AQkCAQEKBAABdwG2 - AbwB/wGIAcEBxgH/AXcBtQG7Af8BZwGnAawB/wFlAaQBqQH/ASsBOwE9Af8DBAH/AToBUAFSAf8BBwII - Af8BJAExATMB/wFoAaoBsAH/AWgBrAGyAf8BXgGWAZsB/wFIAWcBagH/AQkCAQEKBAABIQGqAeMB/wE4 - AbMB5gH/ASEBqQHhAf8BKAGUAcAB/wEqAZABugH/ARwBMwE9Af8DBAH/ASUBRQFSAf8BBQEHAQgB/wEY - ASsBMwH/ASQBmAHIAf8BIQGbAc0B/wEuAYEBpAH/ASwBWQFrAf8BCQIBAQoEAAG8AbEB8wH/AdMBzAH3 - Af8BzAHEAfYB/wG7AbIB6gH/AXkBbAG6Af8DBAH/AZMBiQHJAf8BtwGrAfIB/wFwAWIBtgH/AZUBigHK - Af8BtgGrAfEB/wG1AaoB8AH/AasBoQHiAf8BmAGPAcwB/wgAAQ0BkAL/ATcBowL/ASsBnQL/AQQBigH9 - Af8BBAEzAVoB/wMEAf8BBAFXAZcB/wEEAYsC/wEEASkBRwH/AQQBWQGcAf8BBAGLAf4B/wEEAYkB+gH/ - AQQBfAHbAf8BBAFeAaQB/wgAAXEBswG5Af8BjQHDAcgB/wGDAb8BxAH/AXEBqAGtAf8BKwE7AT0B/wME - Af8BSQFlAWcB/wFqAa8BtQH/ASMBLwEwAf8BSwFoAWoB/wFqAa8BtQH/AWgBrAGyAf8BXgGUAZgB/wFP - AW0BcAH/CAABHwGlAd0B/wE9AbUB5gH/ATIBsQHlAf8BMQGWAcAB/wEcATMBPQH/AwQB/wEvAVcBZwH/ - AR4BnwHVAf8BFwEpATAB/wEwAVoBagH/AR8BngHTAf8BIQGbAc0B/wEwAYEBoAH/ATIBXgFwAf8IAAEw - AgEBSgHTAc0B9wH/AdYB0AH3Af8BqQGjAcwB/wFjAVoBjQH/AZQBigHKAf8BtgGrAfEB/wG1AaoB7gH/ - AaQBmwHSAf8BrwGlAeQB/wG1AaoB8AH/AbUBqgHwAf8BrAGiAeQB/wEwAgEBSggAATACAQFKATkBowL/ - AT0BpQL/AQQBbQHAAf8BBAEFAQYB/wEEAVkBmwH/AQQBigH9Af8BBAGIAfgB/wEEAWsBvQH/AQQBgAHk - Af8BBAGJAfoB/wEEAYkB+gH/AQQBfgHgAf8BMAIBAUoIAAEwAgEBSgGOAcQByAH/AZEBxgHKAf8BYAF7 - AX0B/wMFAf8BSwFnAWoB/wFpAa0BtAH/AWgBqgGwAf8BWgF9AYAB/wFiAZoBnwH/AWgBrAGyAf8BaAGs - AbIB/wFfAZkBngH/ATACAQFKCAABMAIBAUoBPgG1AecB/wFCAbYB5wH/AUIBaQF5Af8BBAIFAf8BLwFZ - AWoB/wEgAZ0B0AH/ASQBmAHIAf8BOQFsAYAB/wExAYUBqAH/ASEBmwHNAf8BIQGbAc0B/wEuAYMBpwH/ - ATACAQFKDAABbwEdASYBygHaAdUB+AH/AcIBuwHmAf8BsAGqAdUB/wHBAbcB8gH/AbsBsgHuAf8BuQGv - Ae8B/wG1AaoB8AH/AbUBqgHwAf8BtQGqAfAB/wG1AaoB8AH/AYQBTwFrAegQAAFVARgBKAHKAUUBqQL/ - AQkBjgL/AQQBeQHVAf8BFAGTAv8BBwGNAv8BBQGMAv8BBAGJAfoB/wEEAYkB+gH/AQQBiQH6Af8BBAGJ - AfoB/wE0ATsBawHoEAABZAIdAcoBlwHJAc0B/wF8AaUBqQH/AWcBhwGKAf8BeAG0AboB/wFxAa0BsgH/ - AW8BrQGyAf8BaAGsAbIB/wFoAawBsgH/AWgBrAGyAf8BaAGsAbIB/wFgAkgB6BAAAVUBHQEkAcoBSAG5 - AegB/wFCAZMBtgH/AUMBdwGIAf8BJQGnAd0B/wEqAZ0BzAH/AScBnAHNAf8BIQGbAc0B/wEhAZsBzQH/ - ASEBmwHNAf8BIQGbAc0B/wFKAT0BTwHoFAABbwEfASYByQHWAdAB+AH/AdMBzAH3Af8BzgHHAfYB/wHF - AbwB9AH/AbwBsQHyAf8BtwGtAfAB/wGzAagB7gH/AbEBpgHvAf8BeQEyAUUB2xgAAVcBGQEmAckBPgGm - Av8BOAGjAv8BLwGfAv8BHQGXAv8BDAGPAv8BBAGLAf4B/wEEAYYB9gH/AQQBhQH0Af8BRwEoAUcB2xgA - AWMCHwHJAZIBxgHKAf8BjQHEAcgB/wGGAcABxQH/AX0BuQG/Af8BcQGyAbgB/wFsAa0BswH/AWYBqQGv - Af8BYwGpAbAB/wFhATEBMwHbGAABVwEcASQByQFCAbcB5wH/AT0BtQHmAf8BNgGyAeUB/wEnAawB5AH/ - ASEBowHZAf8BIwGcAc4B/wEkAZcBxgH/ASABlgHHAf8BUQEoATUB2xwAATACAQFKAcMBugH0Af8BxwG/ - AfUB/wHLAcMB9QH/AcUBvAH0Af8BvAGxAfMB/wGxAaYB7wH/ATACAQFKIAABMAIBAUoBHAGWAv8BIgGZ - Av8BKQGcAv8BHQGXAv8BDQGQAv8BBAGFAfQB/wEwAgEBSiAAATACAQFKAXwBuQG+Af8BgQG7AcAB/wGC - Ab4BwwH/AX0BuQG/Af8BcQGzAbkB/wFjAakBrwH/ATACAQFKIAABMAIBAUoBJQGsAeQB/wErAa4B5AH/ - ATEBsAHlAf8BJwGsAeQB/wEfAaUB3QH/ASEBlgHGAf8BMAIBAUosAAELAgEBDQELAgEBDTgAAQsCAQEN - AQsCAQENOAABCwIBAQ0BCwIBAQ04AAELAgEBDQELAgEBDTQAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZ - AQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZ - AQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASQAATACAQFKAToBRgGCAf8BKgE1AXMB/wEl - AS8BagH/ASQBLgFnAf8BIgEsAWEB/wEkASoBUAH/ATACAQFKARQCAQEZHAABMAIBAUoBkgFSAZIB/wGB - AUEBgQH/AXwBOwF8Af8BegE5AXoB/wF0ATgBdAH/AWQBOAFkAf8BMAIBAUoBFAIBARkcAAEwAgEBSgEE - ApAB/wEEAnkB/wEEAm4B/wEEAmsB/wEEAmUB/wEEAlgB/wEwAgEBSgEUAgEBGRwAATACAQFKA6UB/wOR - Af8DhwH/A4UB/wOBAf8DeQH/ATACAQFKARQCAQEZGAABVgEoAVEB5wE7AUwBpgH/AToBSwGnAf8BOQFK - AaUB/wE4AUgBowH/ATYBRgGgAf8BNAFDAZkB/wEuATsBgwH/ASQBLgFqAf8BTwEKARMB2wEUAgEBGRQA - AYgBMQFRAecBsAFZAbAB/wGxAVcBsQH/AbABVQGwAf8BrwFTAa8B/wGsAVEBrAH/AaYBTgGmAf8BkwFG - AZMB/wF8AToBfAH/AV8BEQEZAdsBFAIBARkUAAE5AlMB5wEEAq0B/wEEAq0B/wEEAqsB/wEEAqgB/wEE - AqQB/wEEAp0B/wEEAogB/wEEAm0B/wFHAhYB2wEUAgEBGRQAAZACWgHnA7sB/wO7Af8DuAH/A7YB/wO1 - Af8DrwH/A54B/wOHAf8BZgIiAdsBFAIBARkQAAFYARoBOgHcATwBUwHTAf8BPQFWAeEB/wE+AVgB6QH/ - AT4BWAHnAf8BPQFXAeYB/wE9AVcB5gH/AToBVAHhAf8BOQFRAdUB/wE6AUoBpgH/ASkBNAF2Af8BTwEK - ARMB2wEUAgEBGQwAAX4BJAE6AdwByQFtAckB/wHTAXEB0wH/AdkBcwHZAf8B2AF0AdgB/wHXAXIB1wH/ - AdcBcgHXAf8B0gFuAdIB/wHKAWsBygH/AbABVwGwAf8BggFAAYIB/wFfAQ4BGQHbARQCAQEZDAABRgI/ - AdwBBALRAf8BBALcAf8BBALkAf8BBALiAf8BBALhAf8BBALhAf8BBALaAf8BBALQAf8BBAKsAf8BBAJ6 - Af8BRwIWAdsBFAIBARkMAAGEAj8B3APTAf8D2gH/A98B/wPeAf8D3AH/A9wB/wPZAf8D0gH/A7oB/wOS - Af8BZgIiAdsBFAIBARkIAAEwAgEBSgE+AVUB1wH/AT4BWAHoAf8BRgFgAfAB/wFGAWAB8AH/AUYBYAHw - Af8BRgFgAfAB/wE+AVkB6wH/AUABWgHvAf8BPQFWAd4B/wE2AUUBmAH/ATcBRwGfAf8BKAEzAXQB/wEw - AgEBSggAATACAQFKAcsBbwHLAf8B2AFzAdgB/wHgAX0B4AH/AeABfQHgAf8B4AF9AeAB/wHgAX0B4AH/ - AdsBdQHbAf8B3gF3Ad4B/wHRAXAB0QH/AaUBUAGlAf8BqwFSAasB/wGBAT8BgQH/ATACAQFKCAABMAIB - AUoBBALVAf8BBALjAf8BBALwAf8BBALwAf8BBALwAf8BBALwAf8BBALmAf8BBALpAf8BBALaAf8BBAKe - Af8BBAKkAf8BBAJ4Af8BMAIBAUoIAAEwAgEBSgPVAf8D3wH/A+YB/wPmAf8D5gH/A+YB/wPgAf8D4QH/ - A9kB/wOwAf8DtQH/A5AB/wEwAgEBSggAAUMBXAHlAf8BSQFiAesB/wFCAV0B9AH/AUYBYAHwAf8BRgFg - AfAB/wFGAWAB7wH/AUYBXgHlAf8BQwFUAa4B/wEqATQBawH/AREBFAEmAf8DBAH/ATgBRwGdAf8BNAFD - AZkB/wEoATABYAH/AQIDAQQAAdcBeAHXAf8B3AF+AdwB/wHiAXsB4gH/AeABfQHgAf8B4AF9AeAB/wHf - AX0B3wH/AdgBegHYAf8BsgFmAbIB/wF8AUABfAH/AT8BIgE/Af8DBAH/AaoBUgGqAf8BpgFOAaYB/wFz - AT0BcwH/AQIDAQQAAQQC5QH/AQQC7gH/AQQC8AH/AQQC8AH/AQQC8AH/AQQC7wH/AQQC5wH/AQQCuQH/ - AQQCcgH/AQQCKQH/AwQB/wEEAqMB/wEEAp0B/wEEAmgB/wECAwEEAAPfAf8D5AH/A+YB/wPmAf8D5gH/ - A+UB/wPgAf8DwwH/A4sB/wNHAf8DBAH/A7QB/wOvAf8DggH/AQIDAQQAAUUBYAH0Af8BWgFyAfUB/wFL - AWQB8AH/AUYBYAHwAf8BQAFTAcAB/wEvAToBeQH/ARUBGgE0Af8DBQH/AwQB/wMEAf8BDQEPAR0B/wE8 - AVUB3AH/ATwBTwG4Af8BLAE4AX8B/wEUAgEBGQQAAeMBfQHjAf8B5gGLAeYB/wHgAYEB4AH/AeABfQHg - Af8BuwFrAbsB/wGGAUYBhgH/AUsBJwFLAf8BHwEVAR8B/wMEAf8DBAH/ATcBHQE3Af8BzwFvAc8B/wG4 - AWIBuAH/AYsBQwGLAf8BFAIBARkEAAEEAvIB/wEIA/8BBAL0Af8BBALwAf8BBALFAf8BBAKBAf8BBAI3 - Af8BBAIFAf8DBAH/AwQB/wEEAh8B/wEEAtgB/wEEArwB/wEEAoEB/wEUAgEBGQQAA+cB/wPyAf8D5wH/ - A+YB/wPJAf8DmAH/A1kB/wMLAf8DBAH/AwQB/wM7Af8D1gH/A8MB/wOZAf8BFAIBARkBCwIBAQ0BVgFu - AfUB/wFpAX8B9gH/AVIBagHvAf8BRgFgAfAB/wE3AUUBjAH/ASUBLQFbAf8BCQEKARIB/wMEAf8DBAH/ - AwQB/wEsATYBbwH/AUABWwHxAf8BOAFQAdQB/wEvAT4BigH/ARQCAQEZAQsCAQENAeYBhwHmAf8B6QGX - AekB/wHhAYMB4QH/AeABfQHgAf8BmgFQAZoB/wFvAToBbwH/AS0BGAEtAf8DBAH/AwQB/wMEAf8BgQFC - AYEB/wHfAXgB3wH/AckBagHJAf8BmQFJAZkB/wEUAgEBGQELAgEBDQEEA/8BFAP/AQQC+QH/AQQC8AH/ - AQQClgH/AQQCYgH/AQQCEwH/AwQB/wMEAf8DBAH/AQQCdwH/AQQC7AH/AQQCzwH/AQQCjgH/ARQCAQEZ - AQsCAQENA/AB/wP5Af8D6wH/A+YB/wOqAf8DgAH/AykB/wMEAf8DBAH/AwQB/wOQAf8D4gH/A9AB/wOk - Af8BFAIBARkBCwIBAQ0BXwF2AfYB/wFyAYIB9wH/AVMBawHuAf8BRgFgAfAB/wFGAWAB7wH/AUcBYQHu - Af8BGwEhAUQB/wMEAf8DBAH/AgYBCQH/AUEBVAG7Af8BPgFYAecB/wE7AVQB3gH/ATABPwGQAf8BFAIB - ARkBCwIBAQ0B5wGOAecB/wHrAZ8B6wH/AeABgwHgAf8B4AF9AeAB/wHfAX0B3wH/Ad4BfQHeAf8BWQEu - AVkB/wMEAf8DBAH/ASQBFAEkAf8BuQFqAbkB/wHYAXQB2AH/AdABbwHQAf8BngFKAZ4B/wEUAgEBGQEL - AgEBDQEMA/8BGwP/AQQC+QH/AQQC8AH/AQQC7wH/AQQC7wH/AQQCSAH/AwQB/wMEAf8BBAIJAf8BBALC - Af8BBALiAf8BBALZAf8BBAKTAf8BFAIBARkBCwIBAQ0D9AH/A/0B/wPrAf8D5gH/A+UB/wPlAf8DawH/ - AwQB/wMEAf8DFAH/A8gB/wPeAf8D2AH/A6gB/wEUAgEBGQQAAV0BdAH1Af8BfQGMAfcB/wFcAXMB9AH/ - AUcBYAHnAf8BRQFeAeQB/wEgASgBUQH/AwQB/wErATUBbgH/AgYBCgH/ARsBIQFEAf8BRwFhAe0B/wFG - AWAB8AH/ATsBUwHYAf8BMgFAAY0B/wEJAgEBCgQAAecBjQHnAf8B7QGpAe0B/wHmAYwB5gH/AdoBfAHa - Af8B1wF5AdcB/wFlATUBZQH/AScBCwEnAf8BgAFBAYAB/wEmARQBJgH/AVkBLgFZAf8B3QF8Ad0B/wHg - AX0B4AH/AcwBbQHMAf8BnAFLAZwB/wEJAgEBCgQAAQoD/wElA/8BCQP/AQQC6gH/AQQC5gH/AQQCVwH/ - AwQB/wEEAnYB/wEEAgoB/wEEAkgB/wEEAu4B/wEEAvAB/wEEAtQB/wEEApMB/wEJAgEBCgQAA/MB/wQA - A/MB/wPiAf8D4AH/A3gB/wMEAf8DjgH/AxcB/wNrAf8D5AH/A+YB/wPUAf8DqAH/AQkCAQEKBAABUwFs - AfUB/wGBAZIB+AH/AXYBhgH3Af8BWAFuAeIB/wEgASgBUQH/AwQB/wE2AUMBhwH/AUcBYgH0Af8BGgEg - AUAB/wE3AUUBjAH/AUgBYgHzAf8BRgFgAfAB/wE7AVMB1AH/AToBSAGTAf8IAAHlAYQB5QH/Ae4BrwHu - Af8B6wGjAesB/wHYAYQB2AH/AWUBNQFlAf8DBAH/AZYBTwGWAf8B4wF/AeMB/wFWAS0BVgH/AZoBUAGa - Af8B4gF/AeIB/wHgAX0B4AH/AckBbQHJAf8BoQFUAaEB/wgAAQQC/gH/ASsD/wEfA/8BBALzAf8BBAJX - Af8DBAH/AQQCkQH/AQQC9AH/AQQCRQH/AQQClgH/AQQC9AH/AQQC8AH/AQQC0QH/AQQCngH/CAAD7gH/ - CAAD5wH/A3gB/wMEAf8DpgH/A+gB/wNmAf8DqgH/A+cB/wPmAf8D0wH/A68B/wgAATACAQFKAYIBkwH4 - Af8BhwGYAfgB/wFQAVwBnwH/AwUB/wE3AUQBiwH/AUcBYQHyAf8BRwFhAe0B/wFDAVMBqgH/AUMBWgHY - Af8BRgFgAfAB/wFGAWAB8AH/ATwBVAHaAf8BMAIBAUoIAAEwAgEBSgHuAbAB7gH/Ae8BtQHvAf8BpwFu - AacB/wEfARUBHwH/AZkBUAGZAf8B4QF+AeEB/wHdAXwB3QH/AbABYwGwAf8BzQF0Ac0B/wHgAX0B4AH/ - AeABfQHgAf8BzQFvAc0B/wEwAgEBSggAATACAQFKASwD/wEwA/8BBAK4Af8BBAIFAf8BBAKVAf8BBALy - Af8BBALuAf8BBAK1Af8BBALaAf8BBALwAf8BBALwAf8BBALXAf8BMAIBAUoIAAEwAgEBSggAA8IB/wML - Af8DqQH/A+cB/wPkAf8DwQH/A9kB/wPmAf8D5gH/A9UB/wEwAgEBSgwAAV4BFQEoAcoBjwGfAfkB/wFu - AX4B1QH/AVMBYgG2Af8BXwF2AfEB/wFWAW0B6gH/AVIBaQHsAf8BRgFgAfAB/wFGAWAB8AH/AUYBYAHw - Af8BRgFgAfAB/wFTASoBZwHoEAABcwEYASYBygHxAbwB8QH/AdEBkwHRAf8BtgF6AbYB/wHkAY4B5AH/ - Ad4BhQHeAf8B3gGBAd4B/wHgAX0B4AH/AeABfQHgAf8B4AF9AeAB/wHgAX0B4AH/AZcBNQFgAegQAAFS - AigBygE4A/8BBAL5Af8BBALMAf8BCQP/AQQC+AH/AQQC9gH/AQQC8AH/AQQC8AH/AQQC8AH/AQQC8AH/ - ATQCZwHoEAABdwIoAcoEAAPrAf8DzwH/A/MB/wPrAf8D6gH/A+YB/wPmAf8D5gH/A+YB/wGZAmcB6BQA - AWABFAEmAckBiAGZAfgB/wGBAZMB+AH/AXoBiQH3Af8BZgF8AfYB/wFTAWwB8wH/AUwBZQHvAf8BRAFe - Ae0B/wE/AVoB8AH/AVcBGQFDAdsYAAF0ARoBJQHJAe8BtgHvAf8B7gGvAe4B/wHsAaYB7AH/AegBlQHo - Af8B5AGEAeQB/wHgAYEB4AH/Ad0BegHdAf8B3gF2Ad4B/wGFASIBQQHbGAABVAImAckBMQP/ASsD/wEj - A/8BEgP/AQQC/AH/AQQC9AH/AQQC7AH/AQQC6QH/AUcCQgHbKAAD9wH/A+0B/wPnAf8D4gH/A+EB/wGG - AkIB2xwAATACAQFKAWQBegH2Af8BbAGBAfYB/wFzAYQB9wH/AWYBfAH2Af8BUwFsAfUB/wFAAVoB7wH/ - ATACAQFKIAABMAIBAUoB6AGTAegB/wHqAZoB6gH/AesBoAHrAf8B6AGVAegB/wHlAYQB5QH/Ad4BdwHe - Af8BMAIBAUogAAEwAgEBSgEQA/8BFwP/AR0D/wESA/8BBAL+Af8BBALpAf8BMAIBAUogAAEwAgEBSgP3 - Af8D+QH/A/0B/wP3Af8D7gH/A+EB/wEwAgEBSiwAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIBAQ04AAEL - AgEBDQELAgEBDTgAAQsCAQENAQsCAQENNAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIB - AQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIB - AQQBFAIBARkBFAIBARkBFAIBARkBAgMBJAABMAIBAUoDZAH/A1kB/wNUAf8DUwH/A1EB/wNMAf8BMAIB - AUoBFAIBARkcAAEwAgEBSgGRAW8BHQH/AX0BXAEVAf8BcgFTARIB/wFvAVEBEgH/AWkBTAERAf8BWAFC - ARMB/wEwAgEBSgEUAgEBGRwAATACAQFKATcBYQE3Af8BKgFSASoB/wElAUwBJQH/ASQBSgEkAf8BIwFF - ASMB/wEiAToBIgH/ATACAQFKARQCAQEZHAABMAIBAUoCngFNAf8ClgEoAf8CkwEaAf8CkgEXAf8CjQEU - Af8CegEXAf8BMAIBAUoBFAIBARkYAAFsAjUB5wNxAf8DcQH/A28B/wNuAf8DbQH/A2kB/wNgAf8DVAH/ - AVsCFgHbARQCAQEZFAABkAFCAQ8B5wG0AYIBHQH/AbQBgQEcAf8BsgGBARwB/wGvAYEBGwH/AawBgAEa - Af8BpAF6ARkB/wGOAWsBFwH/AXIBUgESAf8BXAERAQcB2wEUAgEBGRQAAVQBOAEgAecBPAF5ATwB/wE7 - AXoBOwH/AToBeQE6Af8BOQF3ATkB/wE3AXUBNwH/ATUBbwE1Af8BLwFhAS8B/wElAUsBJQH/AU8BDgEJ - AdsBFAIBARkUAAGIAVMBNwHnArIBYwH/ArQBYQH/ArIBXgH/ArEBWgH/ArEBVgH/Aq0BTwH/AqIBOQH/ - ApMBGAH/AWYBHQEIAdsBFAIBARkQAAFpAikB3AOBAf8DhAH/A4kB/wOIAf8DhgH/A4YB/wODAf8DgQH/ - A3AB/wNaAf8BWwIWAdsBFAIBARkMAAGEAS8BDAHcAdkBnQEjAf8B5QGlASQB/wHtAawBJQH/AesBqgEl - Af8B6gGoASQB/wHqAagBJAH/AeMBpAEiAf8B2QGcASEB/wGzAYEBHAH/AX8BXQEUAf8BXAERAQcB2wEU - AgEBGQwAAVgBKgEUAdwBPQGYAT0B/wE4AagBOAH/ATUBswE1Af8BNgGwATYB/wE2Aa4BNgH/ATYBrgE2 - Af8BNwGmATcB/wE7AZkBOwH/ATsBeQE7Af8BKQFUASkB/wFPAQ4BCQHbARQCAQEZDAABfgE6ASkB3ALL - AX4B/wLUAYEB/wLaAYMB/wLYAYIB/wLXAYIB/wLXAYIB/wLUAYEB/wLMAXoB/wK0AV8B/wKZAScB/wFm - AR0BCAHbARQCAQEZCAABMAIBAUoDgQH/A4kB/wOQAf8DkAH/A5AB/wOQAf8DigH/A4wB/wODAf8DagH/ - A20B/wNYAf8BMAIBAUoIAAEwAgEBSgHcAaABJAH/AewBqgElAf8B9gGzASoB/wH2AbMBKgH/AfYBswEq - Af8B9gGzASoB/wHvAa0BJQH/AfIBsAEmAf8B4gGkASQB/wGkAXsBGwH/AasBfwEbAf8BfQFcARQB/wEw - AgEBSggAATACAQFKATwBnQE8Af8BNQGxATUB/wEzAcABMwH/ATMBwAEzAf8BMwHAATMB/wEzAcABMwH/ - ATQBtgE0Af8BMgG7ATIB/wE5AaQBOQH/ATcBbwE3Af8BOAF0ATgB/wEoAVMBKAH/ATACAQFKCAABMAIB - AUoCzQGBAf8C2AGCAf8C3wGNAf8C3wGNAf8C3wGNAf8C3wGNAf8C2wGDAf8C3QGHAf8C0gGBAf8CrQFT - Af8CsAFWAf8CmAEjAf8BMAIBAUoIAAOJAf8DjgH/A5AB/wOQAf8DkAH/A48B/wOLAf8DdgH/A1YB/wMz - Af8DBAH/A2wB/wNpAf8DUgH/AQIDAQQAAesBrAEoAf8B8gGyASsB/wH4AbQBKAH/AfYBswEqAf8B9gGz - ASoB/wH1AbIBKgH/AewBrAEpAf8BvgGKASEB/wF0AVUBFQH/ASoBIAEKAf8DBAH/AaoBfwEbAf8BpAF6 - ARkB/wFpAU8BFAH/AQIDAQQAATgBsQE4Af8BNgG7ATYB/wEvAcQBLwH/ATMBwAEzAf8BMwHAATMB/wEz - Ab8BMwH/ATkBsgE5Af8BQgF/AUIB/wEpAU0BKQH/ARABHAEQAf8DBAH/ATgBcwE4Af8BNQFvATUB/wEm - AUUBJgH/AQIDAQQAAtgBhwH/AtwBjwH/AuEBiwH/At8BjQH/At8BjQH/At4BjQH/AtgBigH/ArUBcwH/ - Ao8BJQH/Ak0BBAH/AwQB/wKuAVYB/wKtAU8B/wKIAR0B/wECAwEEAAORAf8DnAH/A5EB/wOQAf8DewH/ - A10B/wM8Af8DCgH/AwQB/wMEAf8DLAH/A4EB/wN3Af8DXQH/ARQCAQEZBAAB+QG2ASkC/wG/ATcB/wH4 - AbcBLAH/AfYBswEqAf8BygGTASMB/wGBAWEBGAH/ATgBKgEMAf8CBQEEAf8DBAH/AwQB/wEgARgBCAH/ - AeABowEjAf8BxAGOAR4B/wGEAWMBFgH/ARQCAQEZBAABMAHGATAB/wE2AdEBNgH/ATQBwwE0Af8BMwHA - ATMB/wFCAYcBQgH/AS4BVwEuAf8BFQEmARUB/wMEAf8DBAH/AwQB/wENARYBDQH/AToBoQE6Af8BPgGB - AT4B/wEsAVoBLAH/ARQCAQEZBAAC4gGNAf8C5QGhAf8C3wGSAf8C3wGNAf8CvwF6Af8CmAE0Af8CXgEE - Af8CHQEEAf8DBAH/AwQB/wJEAQQB/wLRAYEB/wK7AXAB/wKeATEB/wEUAgEBGQELAgEBDQOaAf8DpgH/ - A5UB/wOQAf8DZwH/A08B/wMgAf8DBAH/AwQB/wMEAf8DWAH/A40B/wOBAf8DYwH/ARQCAQEZAQsCAQEN - Af8BvgEzAv8BxQFGAf8B+gG6ATAB/wH2AbMBKgH/AZkBcwEcAf8BZAFJARMB/wETAQ8BBgH/AwQB/wME - Af8DBAH/AXkBWQEWAf8B9AGxAScB/wHYAZsBIAH/AZUBbwEXAf8BFAIBARkBCwIBAQ0BMwHQATMB/wFA - AdMBQAH/ATYBxgE2Af8BMwHAATMB/wE2AWcBNgH/ASQBQgEkAf8BCQEOAQkB/wMEAf8DBAH/AwQB/wEr - AVABKwH/ATEBvgExAf8BOwGXATsB/wExAWUBMQH/ARQCAQEZAQsCAQENAuUBnAH/AugBrQH/AuEBmAH/ - At8BjQH/AqQBTQH/AoUBFwH/AjgBBAH/AwQB/wMEAf8DBAH/ApIBKgH/At4BiAH/AssBegH/AqUBPwH/ - ARQCAQEZAQsCAQENA58B/wOqAf8DlQH/A5AB/wOPAf8DjwH/A0UB/wMEAf8DBAH/AxIB/wN6Af8DiAH/ - A4IB/wNlAf8BFAIBARkBCwIBAQ0B/wHBATwC/wHIAU4B/wH5AbkBMQH/AfYBswEqAf8B9QGyASoB/wH0 - AbIBKgH/AUoBNwEPAf8DBAH/AwQB/wEJAQgBBAH/AccBkQEjAf8B6wGqASUB/wHiAaMBIwH/AZoBcwEY - Af8BFAIBARkBCwIBAQ0BOQHSATkB/wFFAdUBRQH/ATcBxQE3Af8BMwHAATMB/wEzAb8BMwH/ATQBvgE0 - Af8BGwExARsB/wMEAf8DBAH/AQYBBwEGAf8BQgGEAUIB/wE2AbABNgH/ATkBowE5Af8BMgFpATIB/wEU - AgEBGQELAgEBDQLmAaQB/wLrAbQB/wLhAZgB/wLfAY0B/wLeAY0B/wLeAY0B/wJwAQoB/wMEAf8DBAH/ - Ai0BBAH/Ar0BeQH/AtgBggH/AtEBgQH/AqgBRAH/ARQCAQEZBAADngH/A7EB/wOeAf8DjQH/A4oB/wNM - Af8DBAH/A1gB/wMUAf8DRQH/A44B/wOQAf8DgQH/A2UB/wEJAgEBCgQAAf8BwAE6Av8BzAFZAv8BwQE5 - Af8B7wGvASoB/wHrAasBKAH/AVkBQQERAf8DBAH/AXgBWAEWAf8BCgEIAQQB/wFKATcBDwH/AfMBsQEq - Af8B9gGzASoB/wHcAZ8BIgH/AZkBcwEZAf8BCQIBAQoEAAE3AdIBNwH/AU0B1gFNAf8BNwHQATcB/wE4 - AbYBOAH/ATkBsAE5Af8BIAE7ASAB/wMEAf8BKgFPASoB/wEGAQgBBgH/ARsBMQEbAf8BNQG9ATUB/wEz - AcABMwH/ATsBnAE7Af8BMwFoATMB/wEJAgEBCgQAAuYBogH/Au0BvQH/AuUBogH/AtsBiwH/AtgBiAH/ - An4BEQH/Ak0BBAH/ApIBKAH/AjEBBAH/AnABCgH/At0BjQH/At8BjQH/As0BfgH/AqcBRgH/AQkCAQEK - BAADmQH/A7YB/wOtAf8DkQH/A0wB/wMEAf8DZQH/A5MB/wNDAf8DZwH/A5EB/wOQAf8DgQH/A2kB/wgA - Af8BvAExAv8BzgFgAv8ByQFSAf8B8QG0ATMB/wFZAUEBEQH/AwQB/wGUAXABGwH/AfoBtgErAf8BRgE0 - AQ4B/wGZAXMBHAH/AfkBtQErAf8B9gGzASoB/wHZAZ0BIgH/AaEBegEdAf8IAAEyAc8BMgH/AVIB1wFS - Af8BSAHVAUgB/wFAAbYBQAH/ASABOwEgAf8DBAH/ATUBZAE1Af8BMAHHATAB/wEaAS8BGgH/ATYBZwE2 - Af8BMQHGATEB/wEzAcABMwH/ATwBmQE8Af8BOQFtATkB/wgAAuQBmQH/Au4BwgH/AuwBuAH/AtoBmAH/ - An4BEQH/AwQB/wKhAUkB/wLiAZAB/wJsAQgB/wKkAU0B/wLhAZAB/wLfAY0B/wLMAX4B/wKoAVQB/wgA - ATACAQFKA7gB/wO7Af8DdQH/AwoB/wNmAf8DkQH/A44B/wN1Af8DgwH/A5AB/wOQAf8DgQH/ATACAQFK - CAABMAIBAUoB/wHOAWEC/wHQAWYB/wG1AYkBKAH/AgUBBAH/AZgBcwEcAf8B+AG0ASoB/wHzAbEBKgH/ - AboBhwEhAf8B3wGiAScB/wH2AbMBKgH/AfYBswEqAf8B3wGhASMB/wEwAgEBSggAATACAQFKAVMB2AFT - Af8BVgHYAVYB/wFJAXcBSQH/AwQB/wE2AWcBNgH/ATIBxAEyAf8BNQG9ATUB/wFBAXwBQQH/AT0BoAE9 - Af8BMwHAATMB/wEzAcABMwH/ATsBnwE7Af8BMAIBAUoIAAEwAgEBSgLvAcQB/wLwAcgB/wKuAXoB/wId - AQQB/wKkAU0B/wLhAY8B/wLdAY0B/wK0AXAB/wLQAYIB/wLfAY0B/wLfAY0B/wLPAYEB/wEwAgEBSgwA - AWoCGgHKA8AB/wOVAf8DgAH/A54B/wOVAf8DlAH/A5AB/wOQAf8DkAH/A5AB/wFyAj0B6BAAAXcBIQEL - AcoB/wHTAW8B/wHtAbgBPQH/AccBmAEuAf8B/gHAAToB/wH3AbkBMgH/AfcBtwEwAf8B9gGzASoB/wH2 - AbMBKgH/AfYBswEqAf8B9gGzASoB/wGeAU4BEAHoEAABWgEjAQsBygFcAdoBXAH/AU8BrgFPAf8BTAGE - AUwB/wE7Ac0BOwH/AToBwQE6Af8BOAHBATgB/wEzAcABMwH/ATMBwAEzAf8BMwHAATMB/wEzAcABMwH/ - AU8BSgEaAegQAAFzASYBHQHKAvEBzwH/AtYBpQH/ArwBhQH/AuQBpAH/At4BmQH/At8BlgH/At8BjQH/ - At8BjQH/At8BjQH/At8BjQH/AZcBYQE9AegUAAFrAhwByQO7Af8DtgH/A64B/wOjAf8DlwH/A5EB/wON - Af8DjAH/AWsCKAHbGAABdAEgAQ4ByQH/AdABZwL/Ac0BYAL/AcsBVgL/AcMBQwH/Af0BuwExAf8B9wG3 - AS0B/wHyAbEBKAH/AfIBrwEmAf8BiQEzAQoB2xgAAVsBIQELAckBVwHZAVcB/wFSAdgBUgH/AUsB1gFL - Af8BPgHTAT4B/wE0AcwBNAH/ATUBwgE1Af8BNAG7ATQB/wExAbsBMQH/AVcBMwERAdsYAAF0ASUBHAHJ - AvAByAH/Au8BwwH/Au0BuwH/AugBqgH/AuMBmQH/At8BkgH/At0BigH/At0BhwH/AYUBQQEoAdscAAEw - AgEBSgOiAf8DpgH/A6oB/wOjAf8DmQH/A4wB/wEwAgEBSiAAATACAQFKAf8BwwFBAv8BxgFJAv8ByQFQ - Av8BwgFDAv8BvQExAf8B8gGvASYB/wEwAgEBSiAAATACAQFKATwB0wE8Af8BQgHUAUIB/wFGAdUBRgH/ - AT4B0wE+Af8BMgHPATIB/wEyAbsBMgH/ATACAQFKIAABMAIBAUoC5wGoAf8C6gGwAf8C6wG1Af8C6AGq - Af8C5AGZAf8C3QGHAf8BMAIBAUosAAELAgEBDQELAgEBDTgAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIB - AQ04AAELAgEBDQELAgEBDTQAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASwAAQQCAQEEARQCAQEZ - ARQCAQEZARQCAQEZAQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASwAAQQCAQEEARQCAQEZ - ARQCAQEZARQCAQEZAQIDASQAATACAQFKAiwBVAH/AiIBRwH/Ah4BQgH/Ah0BQAH/AhwBPQH/AhwBMgH/ - ATACAQFKARQCAQEZHAABMAIBAUoBfAEEAVcB/wFlAQQBSAH/AVsBBAFBAf8BWQEEAT8B/wFUAQQBPAH/ - AUoBBAE1Af8BMAIBAUoBFAIBARkcAAEwAgEBSgEjAUUBUgH/ARoBOgFHAf8BFgE1AUIB/wEWATQBQAH/ - ARUBMQE8Af8BFgEqATEB/wEwAgEBSgEUAgEBGRwAATACAQFKA4UB/wN3Af8DbwH/A20B/wNpAf8DYAH/ - ATACAQFKARQCAQEZGAABTgEYATEB5wIvAWkB/wIuAWkB/wIuAWgB/wItAWcB/wIsAWQB/wIqAWAB/wIl - AVMB/wIdAUIB/wFMAQkBDgHbARQCAQEZFAABfAEEATIB5wGPAQQBaAH/AY8BBAFoAf8BjQEEAWcB/wGL - AQQBZQH/AYgBBAFjAf8BggEEAV8B/wF1AQQBUgH/AVsBBAFAAf8BVwEEAQ4B2wEUAgEBGRQAAUoBKAEx - AecBJAFUAWgB/wEiAVUBaQH/ASIBUwFoAf8BIQFSAWYB/wEgAVEBZAH/AR8BTQFgAf8BHAFDAVMB/wEW - ATUBQgH/AUsBCgEOAdsBFAIBARkUAAF/AksB5wOXAf8DlwH/A5UB/wOTAf8DkgH/A40B/wOBAf8DbwH/ - AV0CGAHbARQCAQEZEAABUwEPASgB3AIuAYQB/wIpAZEB/wImAZsB/wInAZkB/wInAZgB/wInAZgB/wIp - AZAB/wItAYQB/wIuAWkB/wIhAUkB/wFLAQgBDgHbARQCAQEZDAABeAEEASQB3AGtAQQBfQH/AbYBBAGB - Af8BvAEEAYMB/wG7AQQBgwH/AboBBAGCAf8BugEEAYIB/wG0AQQBgQH/AawBBAF8Af8BjgEEAWcB/wFm - AQQBSAH/AVcBBAEOAdsBFAIBARkMAAFNAR8BKAHcAR4BagGFAf8BFwFzAZQB/wESAXkBnwH/ARMBeAGd - Af8BFAF3AZsB/wEUAXcBmwH/ARcBcgGTAf8BHAFqAYYB/wEiAVQBaQH/ARkBOwFIAf8BSwEKAQ4B2wEU - AgEBGQwAAXgCNQHcA6wB/wOyAf8DtgH/A7UB/wO0Af8DtAH/A7EB/wOrAf8DlgH/A3gB/wFdAhgB2wEU - AgEBGQgAATACAQFKAi4BhwH/AiYBmgH/AiMBqAH/AiMBqAH/AiMBqAH/AiMBqAH/AiUBngH/AiMBowH/ - AisBjwH/AisBYAH/AiwBZAH/AiABRwH/ATACAQFKCAABMAIBAUoBsAEEAX8B/wG8AQQBgwH/AcYBBAGK - Af8BxgEEAYoB/wHGAQQBigH/AcYBBAGKAf8BvgEEAYUB/wHBAQQBhwH/AbQBBAGBAf8BgwEEAV8B/wGI - AQQBYwH/AWQBBAFHAf8BMAIBAUoIAAEwAgEBSgEdAW0BiQH/ARIBeAGeAf8BDQGBAa0B/wENAYEBrQH/ - AQ0BgQGtAf8BDQGBAa0B/wEQAXsBowH/AQ4BfgGnAf8BGQFxAZEB/wEhAU4BYAH/ASEBUAFkAf8BGAE6 - AUcB/wEwAgEBSggAATACAQFKA64B/wO2Af8DvQH/A70B/wO9Af8DvQH/A7cB/wO5Af8DsQH/A44B/wOS - Af8DdgH/ATACAQFKCAACKQGZAf8CJwGiAf8CIAGrAf8CIwGoAf8CIwGoAf8CJAGnAf8CKQGbAf8CNAFu - Af8CIQFCAf8CDgEZAf8DBAH/AiwBYwH/AioBYAH/Ah8BPAH/AQIDAQQAAb0BBAGEAf8BxQEEAYkB/wHG - AQQBigH/AcYBBAGKAf8BxgEEAYoB/wHGAQQBigH/Ab8BBAGFAf8BmQEEAW8B/wFfAQQBQwH/ASMBBAEZ - Af8DBAH/AYcBBAFiAf8BggEEAV8B/wFXAQQBPgH/AQIDAQQAARUBeQGdAf8BEgF/AacB/wEKAYEBsQH/ - AQ0BgQGtAf8BDQGBAa0B/wEOAYEBqwH/ARYBegGeAf8BKAFZAW0B/wEaATYBQgH/AQsBFQEZAf8DBAH/ - ASEBUAFjAf8BHwFNAWAB/wEYATEBOwH/AQIDAQQAA7YB/wO7Af8DvQH/A70B/wO9Af8DvAH/A7gB/wOe - Af8DcgH/AzcB/wMEAf8DkQH/A40B/wNrAf8BAgMBBAACIAGtAf8CIwG5Af8CJAGqAf8CIwGoAf8CNAF4 - Af8CJQFLAf8CEQEhAf8DBAH/AwQB/wMEAf8CCwETAf8CKwGMAf8CMQFzAf8CIwFOAf8BFAIBARkEAAHI - AQQBjAH/AdcBBAGWAf8ByQEEAYwB/wHGAQQBigH/AaMBBAF2Af8BbAEEAU0B/wEuAQQBIQH/AQUBBAEF - Af8DBAH/AwQB/wEaAQQBEwH/AbMBBAGBAf8BmwEEAXAB/wFtAQQBTQH/ARQCAQEZBAABCgGBAbMB/wEK - AYoBvwH/AQ4BgQGvAf8BDQGBAa0B/wEmAWABeAH/AR0BPgFLAf8BDgEbASEB/wMEAf8DBAH/AwQB/wEJ - ARABEwH/ARoBcAGOAf8BJAFcAXMB/wEbAT8BTgH/ARQCAQEZBAADvgH/A8cB/wO+Af8DvQH/A6QB/wN9 - Af8DRQH/AwkB/wMEAf8DBAH/Ay0B/wOvAf8DnwH/A34B/wEUAgEBGQELAgEBDQIiAbcB/wIkAcIB/wIm - Aa0B/wIjAagB/wIrAVkB/wIdATkB/wIHAQwB/wMEAf8DBAH/AwQB/wIiAUUB/wIiAaYB/wItAYMB/wIm - AVgB/wEUAgEBGQELAgEBDQHUAQQBlAH/AeEBBAGdAf8BzgEEAY8B/wHGAQQBigH/AYABBAFaAf8BUgEE - AToB/wEQAQQBDAH/AwQB/wMEAf8DBAH/AWMBBAFGAf8BwwEEAYgB/wGrAQQBewH/AXoBBAFWAf8BFAIB - ARkBCwIBAQ0BCgGIAb0B/wEKAZAByAH/AQ8BggGyAf8BDQGBAa0B/wEhAUgBWAH/ARcBLwE5Af8BBgEK - AQwB/wMEAf8DBAH/AwQB/wEbATgBRAH/AQwBgAGrAf8BHQFpAYQB/wEcAUcBWAH/ARQCAQEZAQsCAQEN - A8UB/wPOAf8DwQH/A70B/wOJAf8DZgH/Ax8B/wMEAf8DBAH/AwQB/wN2Af8DugH/A6oB/wOEAf8BFAIB - ARkBCwIBAQ0CIwG8Af8CJQHHAf8CJwGsAf8CIwGoAf8CJAGnAf8CJQGlAf8CFgErAf8DBAH/AwQB/wIF - AQcB/wI0AXYB/wInAZkB/wIqAY0B/wInAVsB/wEUAgEBGQELAgEBDQHaAQQBmAH/AecBBAGhAf8BzgEE - AY8B/wHGAQQBigH/AcYBBAGKAf8BxQEEAYoB/wE8AQQBKwH/AwQB/wMEAf8BCAEEAQcB/wGhAQQBdAH/ - AbsBBAGDAf8BswEEAYEB/wF+AQQBWQH/ARQCAQEZAQsCAQENAQoBjAHCAf8BCwGUAc0B/wEQAYEBsQH/ - AQ0BgQGtAf8BDgGBAasB/wEPAYABqgH/AREBIwEqAf8DBAH/AwQB/wEFAQYBBwH/ASYBXgF1Af8BEwF4 - AZ0B/wEYAXEBkAH/AR0BSQFbAf8BFAIBARkBCwIBAQ0DyQH/A9EB/wPBAf8DvQH/A7wB/wO8Af8DVAH/ - AwQB/wMEAf8DEAH/A6MB/wO1Af8DsAH/A4cB/wEUAgEBGQQAAiMBuwH/AiYBzgH/AiQBuQH/AigBngH/ - AioBmQH/AhoBMwH/AwQB/wIiAUQB/wIFAQcB/wIWASsB/wIlAaQB/wIjAagB/wItAYcB/wIoAVkB/wEJ - AgEBCgQAAdkBBAGXAf8B7gEEAaYB/wHXAQQBlgH/AcIBBAGHAf8BvgEEAYUB/wFIAQQBMwH/AwQB/wFi - AQQBRQH/AQkBBAEHAf8BPAEEASsB/wHFAQQBiQH/AcYBBAGKAf8BrwEEAX4B/wF+AQQBWQH/AQkCAQEK - BAABCgGLAcEB/wELAZkB1AH/AQsBiQG+Af8BFAF8AaIB/wEWAXkBnQH/ARQBKgEzAf8DBAH/ARoBOAFE - Af8BBQIHAf8BEQEjASoB/wEQAX8BqQH/AQ0BgQGtAf8BHAFsAYkB/wEeAUgBWQH/AQkCAQEKBAADyAH/ - A9YB/wPIAf8DugH/A7cB/wNfAf8DBAH/A3UB/wMSAf8DVAH/A7sB/wO9Af8DrQH/A4cB/wEJAgEBCgQA - AiIBtQH/AicB0QH/AiUByQH/AjABngH/AhoBMwH/AwQB/wIqAVYB/wIhAa4B/wIVASgB/wIrAVkB/wIh - Aa0B/wIjAagB/wIuAYQB/wItAV4B/wgAAdIBBAGSAf8B8wEEAaoB/wHqAQQBowH/AckBBAGMAf8BSAEE - ATMB/wMEAf8BfAEEAVgB/wHKAQQBjQH/ATkBBAEpAf8BgAEEAVoB/wHJAQQBjAH/AcYBBAGKAf8BrQEE - AX0B/wGCAQQBXwH/CAABCgGHAbsB/wELAZwB2QH/AQsBlgHQAf8BHAF9AaEB/wEUASoBMwH/AwQB/wEh - AUYBVgH/AQoBggG0Af8BEQEhASgB/wEhAUgBWAH/AQsBgQGzAf8BDQGBAa0B/wEdAWsBhgH/ASMBTAFd - Af8IAAPEAf8D2QH/A9MB/wO+Af8DXwH/AwQB/wOGAf8DvwH/A1AB/wOJAf8DvgH/A70B/wOsAf8DjQH/ - CAABMAIBAUoCJwHTAf8CJwHWAf8COwFmAf8DBAH/AisBWAH/AiIBqwH/AiUBpAH/AjQBawH/Ai4BiwH/ - AiMBqAH/AiMBqAH/AiwBigH/ATACAQFKCAABMAIBAUoB9AEEAaoB/wH4AQQBrQH/AZgBBAFuAf8BBQEE - AQUB/wF/AQQBWgH/AcgBBAGMAf8BxQEEAYkB/wGWAQQBbQH/AbQBBAGBAf8BxgEEAYoB/wHGAQQBigH/ - AbEBBAGAAf8BMAIBAUoIAAEwAgEBSgELAZ0B2QH/AQsBnwHdAf8BMAFVAWMB/wMEAf8BIQFIAVgB/wEM - AYEBsQH/ARABfwGpAf8BKAFXAWoB/wEdAW8BjAH/AQ0BgQGtAf8BDQGBAa0B/wEbAW4BjAH/ATACAQFK - CAABMAIBAUoD2gH/A9wB/wOdAf8DCQH/A4gB/wO+Af8DuwH/A5wB/wOxAf8DvQH/A70B/wOuAf8BMAIB - AUoMAAFVAQYBIQHKAikB2gH/Aj0BlgH/Aj0BdQH/AicBtgH/AioBqAH/AigBqAH/AiMBqAH/AiMBqAH/ - AiMBqAH/AiMBqAH/AUoBFQFCAegQAAFzAQMBGgHKAf4BBAGxAf8BzgEEAZAB/wGpAQQBegH/AdcBBAGW - Af8BzQEEAY8B/wHLAQQBjgH/AcYBBAGKAf8BxgEEAYoB/wHGAQQBigH/AcYBBAGKAf8BjAEEAT0B6BAA - AVIBGAEhAcoBCwGjAeIB/wErAXoBlgH/ATABYAF0Af8BDwGIAbsB/wEUAYEBrAH/ARIBgQGtAf8BDQGB - Aa0B/wENAYEBrQH/AQ0BgQGtAf8BDQGBAa0B/wFDATMBQgHoEAABcAIhAcoD3wH/A8EB/wOpAf8DyAH/ - A8EB/wPAAf8DvQH/A70B/wO9Af8DvQH/AYQCVQHoFAABVAEGASAByQInAdYB/wInAdIB/wImAcwB/wIk - Ab8B/wIkAbIB/wIlAakB/wIlAaMB/wIiAaMB/wFRAQ4BLQHbGAABdAEDARoByQH5AQQBrQH/AfQBBAGq - Af8B7QEEAaUB/wHfAQQBmwH/AdEBBAGSAf8ByQEEAYwB/wHDAQQBiAH/AcEBBAGHAf8BewEEASgB2xgA - AVIBFwEgAckBCwGfAd0B/wELAZwB2QH/AQsBmAHTAf8BCgGPAcYB/wEMAYUBuAH/AQ8BgQGvAf8BEAF+ - AacB/wENAX4BqAH/AUsBIgEtAdsYAAFwAiAByQPcAf8D2QH/A9QB/wPMAf8DwwH/A74B/wO6Af8DuQH/ - AXsCNQHbHAABMAIBAUoCIwG/Af8CJAHDAf8CJQHIAf8CJAG/Af8CIgG1Af8CIwGjAf8BMAIBAUogAAEw - AgEBSgHdAQQBmgH/AeMBBAGeAf8B6AEEAaIB/wHfAQQBmwH/AdIBBAGSAf8BwQEEAYcB/wEwAgEBSiAA - ATACAQFKAQoBjgHFAf8BCgGRAcoB/wELAZUBzgH/AQoBjwHGAf8BCgGHAbsB/wEOAX4BpwH/ATACAQFK - IAABMAIBAUoDywH/A84B/wPRAf8DzAH/A8QB/wO5Af8BMAIBAUosAAELAgEBDQELAgEBDTgAAQsCAQEN - AQsCAQENOAABCwIBAQ0BCwIBAQ04AAELAgEBDQELAgEBDTQAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZ - AQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZ - AQIDASwAAQQCAQEEARQCAQEZARQCAQEZARQCAQEZAQIDASQAATACAQFKA0EB/wM6Af8DOAH/AzcB/wM2 - Af8DNAH/ATACAQFKARQCAQEZHAABMAIBAUoBcAFKAT0B/wFfAToBLgH/AVcBNAEpAf8BVQEzASgB/wFQ - ATEBJgH/AUIBLQElAf8BMAIBAUoBFAIBARkcAAEwAgEBSgEnAUMBJwH/AR4BOQEeAf8BGgE1ARoB/wEa - ATMBGgH/ARkBMAEZAf8BGAEpARgB/wEwAgEBSgEUAgEBGRwAATACAQFKAVEBUwEsAf8BRQFHASEB/wE/ - AUIBHQH/AT4BQAEcAf8BOwE9ARsB/wExATIBGwH/ATACAQFKARQCAQEZGAABWgImAecDSwH/A0sB/wNK - Af8DSQH/A0gB/wNFAf8DPwH/AzgB/wFVAg4B2wEUAgEBGRQAAXcBKAEgAecBhwFUAUIB/wGIAVQBQQH/ - AYYBUwFAAf8BhAFRAT8B/wGCAU8BPQH/AYABTAE6Af8BbwFCATQB/wFXATQBKAH/AVcCCgHbARQCAQEZ - FAABTAEoARcB5wEqAVQBKgH/ASkBVAEpAf8BKQFTASkB/wEoAVIBKAH/AScBUQEnAf8BJQFNASUB/wEh - AUMBIQH/ARoBNQEaAf8BSwEKAQgB2wEUAgEBGRQAAWUBMQEXAecBZQFpAS4B/wFmAWkBLQH/AWUBaAEt - Af8BYwFnASwB/wFhAWUBKwH/AV0BYQEpAf8BUQFUASQB/wE/AUIBHQH/AVEBDgEJAdsBFAIBARkQAAFe - AhoB3ANdAf8DYwH/A2gB/wNnAf8DZQH/A2UB/wNiAf8DXAH/A0sB/wM7Af8BVQIOAdsBFAIBARkMAAF2 - AR8BGAHcAbABXwFCAf8BwgFfATwB/wHNAWABOgH/AcoBYAE7Af8ByQFfAToB/wHJAV8BOgH/AcEBXgE7 - Af8BsQFdAUAB/wGHAVMBQQH/AWEBOgEtAf8BVwIKAdsBFAIBARkMAAFSAR8BDwHcASsBbAErAf8BJwF3 - AScB/wElAX4BJQH/ASYBfAEmAf8BJgF7ASYB/wEmAXsBJgH/AScBdQEnAf8BKQFsASkB/wEpAVQBKQH/ - AR0BOgEdAf8BSwEKAQgB2wEUAgEBGQwAAWcBKAEPAdwBgQGEAS0B/wGLAZIBKAH/AZQBnAEkAf8BkgGZ - ASUB/wGRAZgBJgH/AZEBmAEmAf8BigGQAScB/wGBAYQBKwH/AWUBaQEtAf8BRwFJASAB/wFRAQ4BCAHb - ARQCAQEZCAABMAIBAUoDXwH/A2gB/wNxAf8DcQH/A3EB/wNxAf8DaQH/A2sB/wNiAf8DRgH/A0gB/wM6 - Af8BMAIBAUoIAAEwAgEBSgG1AV8BQQH/AcsBYAE7Af8B1AFnAUEB/wHUAWcBQQH/AdQBZwFBAf8B1AFn - AUEB/wHPAWEBOwH/AdIBYgE8Af8BvgFfAT4B/wGAAU0BPAH/AYEBTwE9Af8BXwE5ASwB/wEwAgEBSggA - ATACAQFKASoBbwEqAf8BJQF9ASUB/wEkAYMBJAH/ASQBgwEkAf8BJAGDASQB/wEkAYMBJAH/ASQBgAEk - Af8BIwGBASMB/wEoAXQBKAH/AScBTQEnAf8BJwFQAScB/wEdAToBHQH/ATACAQFKCAABMAIBAUoBggGI - ASwB/wGTAZsBJQH/AaABqAEiAf8BoAGoASIB/wGgAagBIgH/AaABqAEiAf8BlwGfASMB/wGbAaMBIgH/ - AYgBjgEpAf8BXQFgASoB/wFhAWQBKwH/AUUBSAEfAf8BMAIBAUoIAANoAf8DbgH/A3EB/wNxAf8DcQH/ - A28B/wNqAf8DUAH/AzkB/wMoAf8DBAH/A0gB/wNFAf8DNwH/AQIDAQQAAckBYwE/Af8BzwFnAUMB/wHX - AWUBPgH/AdQBZwFBAf8B1AFnAUEB/wHTAWcBQQH/AcoBZQFBAf8BjgFbAUkB/wFYATgBLQH/ASABFQES - Af8DBAH/AYEBTwE+Af8BgAFMAToB/wFPATMBKgH/AQIDAQQAAScBfQEnAf8BJgGBASYB/wEhAYUBIQH/ - ASQBgwEkAf8BJAGDASQB/wEkAYIBJAH/ASgBfgEoAf8BLgFYAS4B/wEdATUBHQH/AQwBFAEMAf8DBAH/ - AScBUAEnAf8BJQFNASUB/wEbATABGwH/AQIDAQQAAZMBmgEnAf8BmwGjASUB/wGjAasBHgH/AaABqAEi - Af8BoAGoASIB/wGfAacBIgH/AZQBmwEoAf8BagFuATMB/wFAAUIBIAH/ARgBGQENAf8DBAH/AWABYwEs - Af8BXQFhASkB/wE6ATwBHgH/AQIDAQQAA3IB/wN/Af8DcgH/A3EB/wNVAf8DPAH/Ay0B/wMJAf8DBAH/ - AwQB/wMjAf8DYAH/A1EB/wM9Af8BFAIBARkEAAHYAWcBQAH/AdsBdAFQAf8B1AFqAUQB/wHUAWcBQQH/ - AZwBXgFIAf8BZAE/ATMB/wErARwBFwH/AgUBBAH/AwQB/wMEAf8BGQEQAQ4B/wG7AV8BPwH/AZUBWgFE - Af8BaAE/ATEB/wEUAgEBGQQAASIBhwEiAf8BJAGQASQB/wEkAYUBJAH/ASQBgwEkAf8BLgFgAS4B/wEh - AT0BIQH/AQ8BGwEPAf8DBAH/AwQB/wMEAf8BCgEQAQoB/wEpAXIBKQH/ASwBXAEsAf8BHwE/AR8B/wEU - AgEBGQQAAaQBrQEfAf8BsAG6ASEB/wGiAaoBIgH/AaABqAEiAf8BdAF4ATIB/wFJAUsBJAH/ASABIQER - Af8DBAH/AwQB/wMEAf8CEwELAf8BhgGMASoB/wFvAXMBMAH/AUsBTgEjAf8BFAIBARkBCwIBAQ0DfAH/ - A4cB/wN2Af8DcQH/A0MB/wM1Af8DGwH/AwQB/wMEAf8DBAH/AzoB/wNtAf8DWwH/A0EB/wEUAgEBGQEL - AgEBDQHaAXEBTAH/Ad0BfQFcAf8B1QFuAUoB/wHUAWcBQQH/AXcBSwE8Af8BSwEwAScB/wEPAQsBCQH/ - AwQB/wMEAf8DBAH/AVsBOgEvAf8B1AFjATwB/wGvAV0BQAH/AXUBRQE1Af8BFAIBARkBCwIBAQ0BIwGO - ASMB/wElAZcBJQH/ASYBhwEmAf8BJAGDASQB/wEmAUcBJgH/ARkBLgEZAf8BBwEKAQcB/wMEAf8DBAH/ - AwQB/wEeATgBHgH/ASMBgQEjAf8BKQFrASkB/wEiAUYBIgH/ARQCAQEZAQsCAQENAa4BtwEgAf8BuQHC - ASIB/wGlAa0BJAH/AaABqAEiAf8BVgFZASoB/wE3ATkBHAH/AgwBBwH/AwQB/wMEAf8DBAH/AUMBRQEi - Af8BngGmASAB/wGBAYMBKwH/AVUBWAEmAf8BFAIBARkBCwIBAQ0DgQH/A4wB/wN2Af8DcQH/A28B/wNv - Af8DMQH/AwQB/wMEAf8DEAH/A1QB/wNnAf8DYQH/A0IB/wEUAgEBGQELAgEBDQHcAXcBUwH/Ad8BgQFi - Af8B1AFuAUsB/wHUAWcBQQH/AdMBZwFBAf8B0gFnAUIB/wE4ASQBHQH/AwQB/wMEAf8BCAIGAf8BmQFe - AUgB/wHKAWABOwH/Ab0BXgE9Af8BeQFHATcB/wEUAgEBGQELAgEBDQEkAZIBJAH/ASYBmwEmAf8BJgGG - ASYB/wEkAYMBJAH/ASQBggEkAf8BJQGBASUB/wETASIBEwH/AwQB/wMEAf8BBQEGAQUB/wEuAV4BLgH/ - ASYBfAEmAf8BKAFzASgB/wEjAUkBIwH/ARQCAQEZAQsCAQENAbMBvAEhAf8BvQHHASMB/wGkAawBJQH/ - AaABqAEiAf8BnwGnASIB/wGeAaYBIwH/ASkBKgEVAf8DBAH/AwQB/wIHAQUB/wFyAXYBMwH/AZIBmQEl - Af8BiAGOASkB/wFYAVsBJwH/ARQCAQEZBAADgQH/A5YB/wOBAf8DbQH/A2kB/wM0Af8DBAH/AzoB/wMS - Af8DMQH/A24B/wNxAf8DXgH/A0IB/wEJAgEBCgQAAdwBdgFSAf8B4QGGAWsB/wHaAXUBUQH/AcwBZgFD - Af8ByQFkAUEB/wFDASsBIwH/AwQB/wFbATkBLgH/AQgBBwEGAf8BOAEkAR0B/wHRAWcBQgH/AdQBZwFB - Af8BtQFeAUAB/wF3AUgBOAH/AQkCAQEKBAABJAGSASQB/wEnAaABJwH/ASUBkAElAf8BJwGAAScB/wEo - AXwBKAH/ARcBKQEXAf8DBAH/AR4BNwEeAf8BBQEGAQUB/wETASIBEwH/ASUBgQElAf8BJAGDASQB/wEp - AW8BKQH/ASQBSAEkAf8BCQIBAQoEAAGyAbsBIQH/AcQBzgEkAf8BsAG5ASIB/wGXAZ4BJwH/AZMBmgEo - Af8BMQEzARkB/wMEAf8BQgFEASEB/wIHAQUB/wEpASoBFQH/AZ0BpAEkAf8BoAGoASIB/wGCAYcBKwH/ - AVcBWgEnAf8BCQIBAQoEAAN7Af8DmwH/A5AB/wNyAf8DNAH/AwQB/wNCAf8DcwH/AzAB/wNDAf8DcgH/ - A3EB/wNdAf8DRQH/CAAB2gFvAUoB/wHiAYoBcQH/Ad8BgQFmAf8ByAFvAVAB/wFDASsBIwH/AwQB/wFz - AUkBOgH/AdgBaQFCAf8BNQEiARwB/wF3AUsBPAH/AdcBaAFCAf8B1AFnAUEB/wGxAV4BQQH/AX0BTgE/ - Af8IAAEjAY0BIwH/ASgBpAEoAf8BJwGdAScB/wEtAYABLQH/ARcBKQEXAf8DBAH/ASUBRQElAf8BIgGI - ASIB/wETASEBEwH/ASYBRwEmAf8BIgGHASIB/wEkAYMBJAH/ASoBbAEqAf8BKAFLASgB/wgAAawBtQEg - Af8ByAHSASQB/wHAAcoBIwH/AZgBngEuAf8BMQEzARkB/wMEAf8BVAFWASkB/wGmAa8BHwH/AScBKAEU - Af8BVgFZASoB/wGlAa0BIAH/AaABqAEiAf8BgQGEASwB/wFbAV0BLQH/CAABMAIBAUoDngH/A6IB/wNQ - Af8DCQH/A0MB/wNyAf8DbgH/A08B/wNiAf8DcQH/A3EB/wNfAf8BMAIBAUoIAAEwAgEBSgHiAYsBcgH/ - AeMBjwF2Af8BhAFfAVEB/wIFAQQB/wF2AUoBPAH/AdYBaAFCAf8B0QFnAUIB/wGLAVoBSAH/AboBYQFD - Af8B1AFnAUEB/wHUAWcBQQH/AbkBXwFAAf8BMAIBAUoIAAEwAgEBSgEoAaQBKAH/ASkBpwEpAf8BMwFS - ATMB/wMEAf8BJgFHASYB/wEjAYUBIwH/ASUBgQElAf8BLgFWAS4B/wErAXEBKwH/ASQBgwEkAf8BJAGD - ASQB/wEpAXEBKQH/ATACAQFKCAABMAIBAUoByAHTASUB/wHMAdYBJQH/AWMBZQE6Af8DBAH/AVYBWAEq - Af8BowGrASAB/wGdAaQBJAH/AWgBawEzAf8BhQGLAS0B/wGgAagBIgH/AaABqAEiAf8BhAGKASsB/wEw - AgEBSgwAAWQCFwHKA6gB/wN2Af8DWgH/A4EB/wN2Af8DdQH/A3EB/wNxAf8DcQH/A3EB/wFgAiwB6BAA - AXMBFQEOAcoB5AGUAX0B/wG9AXoBYgH/AZgBZgFUAf8B1wF2AVQB/wHQAXABTgH/AdEBbQFKAf8B1AFn - AUEB/wHUAWcBQQH/AdQBZwFBAf8B1AFnAUEB/wGNASsBHQHoEAABVQEYAQYBygEqAasBKgH/ATcBewE3 - Af8BNQFeATUB/wEnAY4BJwH/ASkBgwEpAf8BJwGEAScB/wEkAYMBJAH/ASQBgwEkAf8BJAGDASQB/wEk - AYMBJAH/AUoBMwEUAegQAAFtASEBBgHKAdEB3AEmAf8BkAGWATwB/wFxAXUBPAH/Aa0BtgElAf8BoQGo - ASgB/wGhAakBJgH/AaABqAEiAf8BoAGoASIB/wGgAagBIgH/AaABqAEiAf8BcwFCARUB6BQAAWYCFwHJ - A6IB/wObAf8DkgH/A4MB/wN5Af8DcgH/A20B/wNrAf8BYQIdAdsYAAFyARQBEQHJAeMBjwF3Af8B4gGL - AXEB/wHgAYQBaQH/Ad0BewFZAf8B2AFvAUsB/wHUAWoBRQH/AdABZQFAAf8B0wFiATsB/wGAAR0BEwHb - GAABVwEZAQYByQEpAacBKQH/ASgBpAEoAf8BJwGfAScB/wElAZYBJQH/ASQBiwEkAf8BJQGEASUB/wEl - AYEBJQH/ASMBgQEjAf8BUQEjAQoB2xgAAWwBIAEGAckBzAHXASUB/wHIAdIBJQH/AcIBzAEkAf8BtwHA - ASIB/wGqAbMBIgH/AaEBqgEjAf8BmwGjASMB/wGcAaQBIQH/AXABLQEKAdscAAEwAgEBSgOCAf8DhwH/ - A4wB/wODAf8DewH/A2sB/wEwAgEBSiAAATACAQFKAd0BegFYAf8B3gF/AV4B/wHfAYEBZAH/Ad0BewFZ - Af8B2gFvAUoB/wHSAWIBPAH/ATACAQFKIAABMAIBAUoBJQGVASUB/wEmAZkBJgH/ASYBnAEmAf8BJQGW - ASUB/wEjAY0BIwH/ASMBgQEjAf8BMAIBAUogAAEwAgEBSgG2Ab8BIQH/AboBxAEiAf8BvgHIASMB/wG3 - AcABIgH/AawBtQEgAf8BmwGjASIB/wEwAgEBSiwAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIBAQ04AAEL - AgEBDQELAgEBDTgAAQsCAQENAQsCAQENHAABQgFNAT4HAAE+AwABKAMAAUADAAFgAwABAQEAAQEGAAED - FgAD/4EAAfwBHwH8AR8B/AEfAfwBHwHwAQcB8AEHAfABBwHwAQcB4AEDAeABAwHgAQMB4AEDAcABAQHA - AQEBwAEBAcABAQGAAQEBgAEBAYABAQGAAQEBgAEAAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYARAAGA - AQABgAEAAYABAAGAAQABgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHAAQMBwAEDAcABAwHA - AQMB4AEHAeABBwHgAQcB4AEHAfABDwHwAQ8B8AEPAfABDwH+AX8B/gF/Af4BfwH+AX8B/AEfAfwBHwH8 - AR8B/AEfAfABBwHwAQcB8AEHAfABBwHgAQMB4AEDAeABAwHgAQMBwAEBAcABAQHAAQEBwAEBAYABAQGA - AQEBgAEBAYABAQGAAQABgAEAAYABAAGAAQABgAEAAYABAAGAAQABgBEAAYABAAGAAQABgAEAAaABAAGA - AQEBgAEBAYABAQGwAQEBgAEBAYABAQGAAQEBsAEBAcABAwHAAQMBwAEDAdABAwHgAQcB4AEHAeABBwH+ - AQcB8AEPAfABDwHwAQ8B8AEPAf4BfwH+AX8B/gF/Af4BfwH8AR8B/AEfAfwBHwH8AR8B8AEHAfABBwHw - AQcB8AEHAeABAwHgAQMB4AEDAeABAwHAAQEBwAEBAcABAQHAAQEBgAEBAYABAQGAAQEBgAEBAYABAAGA - AQABgAEAAYABAAGAAQABgAEAAYABAAGAEQABgAEAAYABAAGAAQABgAEAAYABAQGAAQEBgAEBAYABAQGA - AQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBwHwAQ8B8AEPAfABDwHw - AQ8B/gF/Af4BfwH+AX8B/gF/AfwBHwH8AR8B/AEfAfwBHwHwAQcB8AEHAfABBwHwAQcB4AEDAeABAwHg - AQMB4AEDAcABAQHAAQEBwAEBAcABAQGAAQEBgAEBAYABAQGAAQEBgAEAAYABAAGAAQABgAEAAYABAAGA - AQABgAEAAYARAAGAAQABgAEAAYABAAGAAQABgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHA - AQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHAfABDwHwAQ8B8AEPAfABDwH+AX8B/gF/Af4BfwH+ - AX8B/AEfAfwBHwH8AR8B/AEfAfABBwHwAQcB8AEHAfABBwHgAQMB4AEDAeABAwHgAQMBwAEBAcABAQHA + AbEBpgHvAf8BrQGiAecB/wGXAY0BzwH/AZkBjgHRAf8BggF6AcYB/wEwAgEBSggAATACAQFKAQUBfgHe + Af8BBQGBAe0B/wEFAYkB+gH/AQUBiQH6Af8BBQGJAfoB/wEFAYkB+gH/AQUBgwHwAf8BBQGFAfQB/wEF + AYEB5AH/AQUBXwGlAf8BBQFjAasB/wEFAUcBfgH/ATACAQFKCAABMAIBAUoBYAGXAZwB/wFiAaQBqgH/ + AWkBrAGyAf8BaQGsAbIB/wFpAawBsgH/AWkBrAGyAf8BYwGmAawB/wFkAakBrwH/AWABnQGiAf8BTwFw + AXMB/wFRAXQBdwH/ATsBUwFVAf8BMAIBAUoIAAEwAgEBSgExAYIBpAH/AScBjwG8Af8BIgGbAc0B/wEi + AZsBzQH/ASIBmwHNAf8BIgGbAc0B/wElAZIBwAH/ASIBlgHGAf8BLQGHAa0B/wEwAWEBdAH/ATEBZAF5 + Af8BJAFIAVcB/wEwAgEBSggAAbIBpwHqAf8BtQGrAe0B/wG0AagB8QH/AbUBqgHwAf8BtQGqAfAB/wG1 + AaoB7wH/AbMBqAHrAf8BpgGdAdMB/wGCAXsBwAH/AWUBVgGuAf8DBQH/AZkBjwHQAf8BlQGKAdAB/wGB + AXcBvQH/AQIDAQQAAQUBggHvAf8BBQGIAfgB/wEFAYkB+gH/AQUBiQH6Af8BBQGJAfoB/wEFAYgB+gH/ + AQUBhAHxAf8BBQFvAcIB/wEFAUQBeAH/AQUBGgEsAf8DBQH/AQUBYgGqAf8BBQFfAaQB/wEFAT4BbQH/ + AQIDAQQAAWUBpAGqAf8BagGpAa8B/wFnAa0BtAH/AWkBrAGyAf8BaQGsAbIB/wFpAasBsQH/AWcBpQGq + Af8BXQKBAf8BOQFOAVAB/wEXAh4B/wMFAf8BUQF0AXcB/wFNAXABcwH/ATUBRwFJAf8BAgMBBAABKgGQ + AbsB/wEnAZcBxgH/AR4BnAHRAf8BIgGbAc0B/wEiAZsBzQH/ASMBmgHLAf8BKgGRAbwB/wE7AW8BgQH/ + ASUBRAFQAf8BEAEaAR4B/wMFAf8BMQFkAXgB/wEuAWABdQH/ASMBPgFIAf8BAgMBBAABtQGqAfIB/wG/ + AbUB8wH/AbcBrAHwAf8BtQGqAfAB/wGpAaAB2QH/AYkBgQHEAf8BagFbAbMB/wFkAVsBjQH/AwUB/wMF + Af8BYAFRAasB/wGtAaIB5QH/AaQBmgHXAf8BiAGAAcgB/wEUAgEBGQQAAQUBigH9Af8BFAGSAv8BBQGL + Af4B/wEFAYkB+gH/AQUBdQHOAf8BBQFNAYMB/wEFASIBOgH/AQUBBgEHAf8DBQH/AwUB/wEFARQBIQH/ + AQUBgAHhAf8BBQFwAcQB/wEFAU4BhQH/ARQCAQEZBAABaQGuAbUB/wF3AbUBuwH/AWwBrQGzAf8BaQGs + AbIB/wFgAYYBigH/AUEBWQFbAf8BHQEnASgB/wMGAf8DBQH/AwUB/wESAhcB/wFgAZoBoAH/AVsBgQGD + Af8BQAFbAV0B/wEUAgEBGQQAAR8BngHSAf8BIAGpAeIB/wEjAZ0BzwH/ASIBmwHNAf8BOQF4AYwB/wEp + AU0BWwH/ARMBIgEoAf8BBQIGAf8DBQH/AwUB/wEMARQBFwH/AS4BhQGqAf8BNgFzAYYB/wEnAU8BXwH/ + ARQCAQEZAQsCAQENAb0BswHzAf8BxgG9AfUB/wG6AbAB8AH/AbUBqgHwAf8BlQGKAcoB/wGAAXMBvAH/ + AV0BTgGkAf8DBQH/AwUB/wMFAf8BhAF+AcEB/wGyAacB8AH/AakBngHiAf8BjgGCAc0B/wEUAgEBGQEL + AgEBDQERAZEC/wEhAZgC/wEJAY0C/wEFAYkB+gH/AQUBWgGcAf8BBQE7AWcB/wEFAQ0BFAH/AwUB/wMF + Af8DBQH/AQUBRwF9Af8BBQGGAfYB/wEFAXsB1wH/AQUBVgGUAf8BFAIBARkBCwIBAQ0BdAG0AboB/wGB + AboBwAH/AXEBrwG1Af8BaQGsAbIB/wFMAWkBawH/ATIBQwFFAf8BDAEOAQ8B/wMFAf8DBQH/AwUB/wE8 + AVIBUwH/AWUBqwGxAf8BXgGSAZcB/wFGAWYBaAH/ARQCAQEZAQsCAQENASABpwHeAf8BKgGuAeQB/wEl + AaAB0wH/ASIBmwHNAf8BMQFbAWsB/wEhATsBRQH/AQkBDQEPAf8DBQH/AwUB/wMFAf8BJwFHAVMB/wEh + AZgBygH/ATABgQGfAf8BKwFYAWoB/wEUAgEBGQELAgEBDQHBAbgB9AH/AcoBwgH1Af8BuwGxAfAB/wG1 + AaoB8AH/AbUBqgHvAf8BtQGqAe8B/wFyAWUBtwH/AwUB/wMFAf8BXAFOAZ0B/wGoAZ8B1wH/Aa8BpAHr + Af8BrQGiAeYB/wGRAYUBzgH/ARQCAQEZAQsCAQENARgBlAL/ASgBmwL/AQkBjQL/AQUBiQH6Af8BBQGI + AfoB/wEFAYgB+QH/AQUBLAFMAf8DBQH/AwUB/wEFAQgBCgH/AQUBdAHLAf8BBQGBAewB/wEFAYEB4gH/ + AQUBWQGaAf8BFAIBARkBCwIBAQ0BeQG3Ab0B/wGBAb0BwgH/AXEBrwG0Af8BaQGsAbIB/wFpAasBsQH/ + AWkBqwGxAf8BJQEyATQB/wMFAf8DBQH/AQcCCAH/AV8BgwGHAf8BYgGjAakB/wFfAZsBoQH/AUkBaQFs + Af8BFAIBARkBCwIBAQ0BIwGrAeMB/wEwAbAB5QH/ASYBnwHRAf8BIgGbAc0B/wEjAZoBywH/ASQBmQHJ + Af8BGQEsATQB/wMFAf8DBQH/AQYCCAH/AToBdgGJAf8BJwGPAboB/wEsAYYBrAH/ASwBWwFuAf8BFAIB + ARkEAAHAAbcB9AH/Ac8ByAH2Af8BwAG2AfMB/wG0AakB7AH/AbIBqAHqAf8BegFtAboB/wE+ASMBxAH/ + AYMBfQHCAf8BWQFKAaIB/wFyAWUBtwH/AbUBqgHuAf8BtQGqAfAB/wGrAaEB4wH/AZEBhgHNAf8BCQIB + AQoEAAEXAZQC/wEyAaAC/wEVAZMC/wEFAYUB9AH/AQUBgwHwAf8BBQE0AVsB/wMFAf8BBQFGAXwB/wEF + AQgBCwH/AQUBLAFMAf8BBQGIAfgB/wEFAYkB+gH/AQUBfgHdAf8BBQFZAZkB/wEJAgEBCgQAAXgBtgG8 + Af8BiAHBAcYB/wF4AbUBuwH/AWgBpwGsAf8BZgGkAakB/wEsATwBPgH/AwUB/wE7AVEBUwH/AQgCCQH/ + ASUBMgE0Af8BaQGqAbAB/wFpAawBsgH/AV8BlgGbAf8BSQFoAWsB/wEJAgEBCgQAASIBqgHjAf8BOQGz + AeYB/wEiAakB4QH/ASkBlAHAAf8BKwGQAboB/wEdATQBPgH/AwUB/wEmAUYBUwH/AQYBCAEJAf8BGQEs + ATQB/wElAZgByAH/ASIBmwHNAf8BLwGBAaQB/wEtAVoBbAH/AQkCAQEKBAABvAGxAfMB/wHTAcwB9wH/ + AcwBxAH2Af8BuwGyAeoB/wF6AW0BugH/AwUB/wGTAYkByQH/AbcBqwHyAf8BcQFjAbYB/wGVAYoBygH/ + AbYBqwHxAf8BtQGqAfAB/wGrAaEB4gH/AZgBjwHMAf8IAAEOAZAC/wE4AaMC/wEsAZ0C/wEFAYoB/QH/ + AQUBNAFbAf8DBQH/AQUBWAGXAf8BBQGLAv8BBQEqAUgB/wEFAVoBnAH/AQUBiwH+Af8BBQGJAfoB/wEF + AX0B2wH/AQUBXwGkAf8IAAFyAbMBuQH/AY0BwwHIAf8BgwG/AcQB/wFyAagBrQH/ASwBPAE+Af8DBQH/ + AUoBZgFoAf8BawGvAbUB/wEkATABMQH/AUwBaQFrAf8BawGvAbUB/wFpAawBsgH/AV8BlAGYAf8BUAFu + AXEB/wgAASABpQHdAf8BPgG1AeYB/wEzAbEB5QH/ATIBlgHAAf8BHQE0AT4B/wMFAf8BMAFYAWgB/wEf + AZ8B1QH/ARgBKgExAf8BMQFbAWsB/wEgAZ4B0wH/ASIBmwHNAf8BMQGBAaAB/wEzAV8BcQH/CAABMAIB + AUoB0wHNAfcB/wHWAdAB9wH/AakBowHMAf8BZAFbAY0B/wGUAYoBygH/AbYBqwHxAf8BtQGqAe4B/wGk + AZsB0gH/Aa8BpQHkAf8BtQGqAfAB/wG1AaoB8AH/AawBogHkAf8BMAIBAUoIAAEwAgEBSgE6AaMC/wE+ + AaUC/wEFAW4BwAH/AQUBBgEHAf8BBQFaAZsB/wEFAYoB/QH/AQUBiAH4Af8BBQFsAb0B/wEFAYEB5AH/ + AQUBiQH6Af8BBQGJAfoB/wEFAX8B4AH/ATACAQFKCAABMAIBAUoBjgHEAcgB/wGRAcYBygH/AWEBfAF+ + Af8DBgH/AUwBaAFrAf8BagGtAbQB/wFpAaoBsAH/AVsBfgGBAf8BYwGaAZ8B/wFpAawBsgH/AWkBrAGy + Af8BYAGZAZ4B/wEwAgEBSggAATACAQFKAT8BtQHnAf8BQwG2AecB/wFDAWoBegH/AQUCBgH/ATABWgFr + Af8BIQGdAdAB/wElAZgByAH/AToBbQGBAf8BMgGFAagB/wEiAZsBzQH/ASIBmwHNAf8BLwGDAacB/wEw + AgEBSgwAAWkBEwEYAcoB2gHVAfgB/wHCAbsB5gH/AbABqgHVAf8BwQG3AfIB/wG7AbIB7gH/AbkBrwHv + Af8BtQGqAfAB/wG1AaoB8AH/AbUBqgHwAf8BtQGqAfAB/wF9AUIBWAHoEAABWQEOARoBygFGAakC/wEK + AY4C/wEFAXoB1QH/ARUBkwL/AQgBjQL/AQYBjAL/AQUBiQH6Af8BBQGJAfoB/wEFAYkB+gH/AQUBiQH6 + Af8BOwEyAVgB6BAAAWECEwHKAZcByQHNAf8BfQGlAakB/wFoAYcBigH/AXkBtAG6Af8BcgGtAbIB/wFw + Aa0BsgH/AWkBrAGyAf8BaQGsAbIB/wFpAawBsgH/AWkBrAGyAf8BYAI9AegQAAFZARMBGAHKAUkBuQHo + Af8BQwGTAbYB/wFEAXgBiAH/ASYBpwHdAf8BKwGdAcwB/wEoAZwBzQH/ASIBmwHNAf8BIgGbAc0B/wEi + AZsBzQH/ASIBmwHNAf8BTgEzAUIB6BQAAWkBFAEZAckB1gHQAfgB/wHTAcwB9wH/Ac4BxwH2Af8BxQG8 + AfQB/wG8AbEB8gH/AbcBrQHwAf8BswGoAe4B/wGxAaYB7wH/AXQBJgEzAdsYAAFbAREBGQHJAT8BpgL/ + ATkBowL/ATABnwL/AR4BlwL/AQ0BjwL/AQUBiwH+Af8BBQGGAfYB/wEFAYUB9AH/AU8BHQE1AdsYAAFg + AhQByQGSAcYBygH/AY0BxAHIAf8BhgHAAcUB/wF+AbkBvwH/AXIBsgG4Af8BbQGtAbMB/wFnAakBrwH/ + AWQBqQGwAf8BYQEjAScB2xgAAVsBEQEXAckBQwG3AecB/wE+AbUB5gH/ATcBsgHlAf8BKAGsAeQB/wEi + AaMB2QH/ASQBnAHOAf8BJQGXAcYB/wEhAZYBxwH/AVcBHQEoAdscAAEwAgEBSgHDAboB9AH/AccBvwH1 + Af8BywHDAfUB/wHFAbwB9AH/AbwBsQHzAf8BsQGmAe8B/wEwAgEBSiAAATACAQFKAR0BlgL/ASMBmQL/ + ASoBnAL/AR4BlwL/AQ4BkAL/AQUBhQH0Af8BMAIBAUogAAEwAgEBSgF9AbkBvgH/AYEBuwHAAf8BggG+ + AcMB/wF+AbkBvwH/AXIBswG5Af8BZAGpAa8B/wEwAgEBSiAAATACAQFKASYBrAHkAf8BLAGuAeQB/wEy + AbAB5QH/ASgBrAHkAf8BIAGlAd0B/wEiAZYBxgH/ATACAQFKLAABCwIBAQ0BCwIBAQ04AAELAgEBDQEL + AgEBDTgAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIBAQ00AAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQEC + AwEsAAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQECAwEsAAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQEC + AwEsAAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQECAwEkAAEwAgEBSgE7AUcBggH/ASsBNgF0Af8BJgEw + AWsB/wElAS8BaAH/ASMBLQFiAf8BJQErAVEB/wEwAgEBSgEUAgEBGRwAATACAQFKAZIBUwGSAf8BgQFC + AYEB/wF9ATwBfQH/AXsBOgF7Af8BdQE5AXUB/wFlATkBZQH/ATACAQFKARQCAQEZHAABMAIBAUoBBQKQ + Af8BBQJ6Af8BBQJvAf8BBQJsAf8BBQJmAf8BBQJZAf8BMAIBAUoBFAIBARkcAAEwAgEBSgOlAf8DkQH/ + A4cB/wOFAf8DgQH/A3oB/wEwAgEBSgEUAgEBGRgAAVkBIAFCAecBPAFNAaYB/wE7AUwBpwH/AToBSwGl + Af8BOQFJAaMB/wE3AUcBoAH/ATUBRAGZAf8BLwE8AYMB/wElAS8BawH/AVUBCQEOAdsBFAIBARkUAAGA + ASgBQgHnAbABWgGwAf8BsQFYAbEB/wGwAVYBsAH/Aa8BVAGvAf8BrAFSAawB/wGmAU8BpgH/AZMBRwGT + Af8BfQE7AX0B/wFhAQ4BEwHbARQCAQEZFAABQgJDAecBBQKtAf8BBQKtAf8BBQKrAf8BBQKoAf8BBQKk + Af8BBQKdAf8BBQKIAf8BBQJuAf8BTwIRAdsBFAIBARkUAAGIAksB5wO7Af8DuwH/A7gB/wO2Af8DtQH/ + A68B/wOeAf8DhwH/AWYCGAHbARQCAQEZEAABWwEUASoB3AE9AVQB0wH/AT4BVwHhAf8BPwFZAekB/wE/ + AVkB5wH/AT4BWAHmAf8BPgFYAeYB/wE7AVUB4QH/AToBUgHVAf8BOwFLAaYB/wEqATUBdwH/AVUBCQEO + AdsBFAIBARkMAAF4ARoBKgHcAckBbgHJAf8B0wFyAdMB/wHZAXQB2QH/AdgBdQHYAf8B1wFzAdcB/wHX + AXMB1wH/AdIBbwHSAf8BygFsAcoB/wGwAVgBsAH/AYIBQQGCAf8BYQEKARMB2wEUAgEBGQwAAU0CLwHc + AQUC0QH/AQUC3AH/AQUC5AH/AQUC4gH/AQUC4QH/AQUC4QH/AQUC2gH/AQUC0AH/AQUCrAH/AQUCewH/ + AU8CEQHbARQCAQEZDAABfAIvAdwD0wH/A9oB/wPfAf8D3gH/A9wB/wPcAf8D2QH/A9IB/wO6Af8DkgH/ + AWYCGAHbARQCAQEZCAABMAIBAUoBPwFWAdcB/wE/AVkB6AH/AUcBYQHwAf8BRwFhAfAB/wFHAWEB8AH/ + AUcBYQHwAf8BPwFaAesB/wFBAVsB7wH/AT4BVwHeAf8BNwFGAZgB/wE4AUgBnwH/ASkBNAF1Af8BMAIB + AUoIAAEwAgEBSgHLAXABywH/AdgBdAHYAf8B4AF+AeAB/wHgAX4B4AH/AeABfgHgAf8B4AF+AeAB/wHb + AXYB2wH/Ad4BeAHeAf8B0QFxAdEB/wGlAVEBpQH/AasBUwGrAf8BgQFAAYEB/wEwAgEBSggAATACAQFK + AQUC1QH/AQUC4wH/AQUC8AH/AQUC8AH/AQUC8AH/AQUC8AH/AQUC5gH/AQUC6QH/AQUC2gH/AQUCngH/ + AQUCpAH/AQUCeQH/ATACAQFKCAABMAIBAUoD1QH/A98B/wPmAf8D5gH/A+YB/wPmAf8D4AH/A+EB/wPZ + Af8DsAH/A7UB/wOQAf8BMAIBAUoIAAFEAV0B5QH/AUoBYwHrAf8BQwFeAfQB/wFHAWEB8AH/AUcBYQHw + Af8BRwFhAe8B/wFHAV8B5QH/AUQBVQGuAf8BKwE1AWwB/wESARUBJwH/AwUB/wE5AUgBnQH/ATUBRAGZ + Af8BKQExAWEB/wECAwEEAAHXAXkB1wH/AdwBfwHcAf8B4gF8AeIB/wHgAX4B4AH/AeABfgHgAf8B3wF+ + Ad8B/wHYAXsB2AH/AbIBZwGyAf8BfQFBAX0B/wFAASMBQAH/AwUB/wGqAVMBqgH/AaYBTwGmAf8BdAE+ + AXQB/wECAwEEAAEFAuUB/wEFAu4B/wEFAvAB/wEFAvAB/wEFAvAB/wEFAu8B/wEFAucB/wEFArkB/wEF + AnMB/wEFAioB/wMFAf8BBQKjAf8BBQKdAf8BBQJpAf8BAgMBBAAD3wH/A+QB/wPmAf8D5gH/A+YB/wPl + Af8D4AH/A8MB/wOLAf8DSAH/AwUB/wO0Af8DrwH/A4IB/wECAwEEAAFGAWEB9AH/AVsBcwH1Af8BTAFl + AfAB/wFHAWEB8AH/AUEBVAHAAf8BMAE7AXoB/wEWARsBNQH/AwYB/wMFAf8DBQH/AQ4BEAEeAf8BPQFW + AdwB/wE9AVABuAH/AS0BOQGAAf8BFAIBARkEAAHjAX4B4wH/AeYBiwHmAf8B4AGBAeAB/wHgAX4B4AH/ + AbsBbAG7Af8BhgFHAYYB/wFMASgBTAH/ASABFgEgAf8DBQH/AwUB/wE4AR4BOAH/Ac8BcAHPAf8BuAFj + AbgB/wGLAUQBiwH/ARQCAQEZBAABBQLyAf8BCQP/AQUC9AH/AQUC8AH/AQUCxQH/AQUCgQH/AQUCOAH/ + AQUCBgH/AwUB/wMFAf8BBQIgAf8BBQLYAf8BBQK8Af8BBQKBAf8BFAIBARkEAAPnAf8D8gH/A+cB/wPm + Af8DyQH/A5gB/wNaAf8DDAH/AwUB/wMFAf8DPAH/A9YB/wPDAf8DmQH/ARQCAQEZAQsCAQENAVcBbwH1 + Af8BagGAAfYB/wFTAWsB7wH/AUcBYQHwAf8BOAFGAYwB/wEmAS4BXAH/AQoBCwETAf8DBQH/AwUB/wMF + Af8BLQE3AXAB/wFBAVwB8QH/ATkBUQHUAf8BMAE/AYoB/wEUAgEBGQELAgEBDQHmAYcB5gH/AekBlwHp + Af8B4QGDAeEB/wHgAX4B4AH/AZoBUQGaAf8BcAE7AXAB/wEuARkBLgH/AwUB/wMFAf8DBQH/AYEBQwGB + Af8B3wF5Ad8B/wHJAWsByQH/AZkBSgGZAf8BFAIBARkBCwIBAQ0BBQP/ARUD/wEFAvkB/wEFAvAB/wEF + ApYB/wEFAmMB/wEFAhQB/wMFAf8DBQH/AwUB/wEFAngB/wEFAuwB/wEFAs8B/wEFAo4B/wEUAgEBGQEL + AgEBDQPwAf8D+QH/A+sB/wPmAf8DqgH/A4EB/wMqAf8DBQH/AwUB/wMFAf8DkAH/A+IB/wPQAf8DpAH/ + ARQCAQEZAQsCAQENAWABdwH2Af8BcwGCAfcB/wFUAWwB7gH/AUcBYQHwAf8BRwFhAe8B/wFIAWIB7gH/ + ARwBIgFFAf8DBQH/AwUB/wIHAQoB/wFCAVUBuwH/AT8BWQHnAf8BPAFVAd4B/wExAUABkAH/ARQCAQEZ + AQsCAQENAecBjgHnAf8B6wGfAesB/wHgAYMB4AH/AeABfgHgAf8B3wF+Ad8B/wHeAX4B3gH/AVoBLwFa + Af8DBQH/AwUB/wElARUBJQH/AbkBawG5Af8B2AF1AdgB/wHQAXAB0AH/AZ4BSwGeAf8BFAIBARkBCwIB + Ag0D/wEcA/8BBQL5Af8BBQLwAf8BBQLvAf8BBQLvAf8BBQJJAf8DBQH/AwUB/wEFAgoB/wEFAsIB/wEF + AuIB/wEFAtkB/wEFApMB/wEUAgEBGQELAgEBDQP0Af8D/QH/A+sB/wPmAf8D5QH/A+UB/wNsAf8DBQH/ + AwUB/wMVAf8DyAH/A94B/wPYAf8DqAH/ARQCAQEZBAABXgF1AfUB/wF+AYwB9wH/AV0BdAH0Af8BSAFh + AecB/wFGAV8B5AH/ASEBKQFSAf8DBQH/ASwBNgFvAf8CBwELAf8BHAEiAUUB/wFIAWIB7QH/AUcBYQHw + Af8BPAFUAdgB/wEzAUEBjQH/AQkCAQEKBAAB5wGNAecB/wHtAakB7QH/AeYBjAHmAf8B2gF9AdoB/wHX + AXoB1wH/AWYBNgFmAf8BKAEMASgB/wGBAUIBgQH/AScBFQEnAf8BWgEvAVoB/wHdAX0B3QH/AeABfgHg + Af8BzAFuAcwB/wGcAUwBnAH/AQkCAQEKBAABCwP/ASYD/wEKA/8BBQLqAf8BBQLmAf8BBQJYAf8DBQH/ + AQUCdwH/AQUCCwH/AQUCSQH/AQUC7gH/AQUC8AH/AQUC1AH/AQUCkwH/AQkCAQEKBAAD8wH/BAAD8wH/ + A+IB/wPgAf8DeQH/AwUB/wOOAf8DGAH/A2wB/wPkAf8D5gH/A9QB/wOoAf8BCQIBAQoEAAFUAW0B9QH/ + AYEBkgH4Af8BdwGGAfcB/wFZAW8B4gH/ASEBKQFSAf8DBQH/ATcBRAGHAf8BSAFjAfQB/wEbASEBQQH/ + ATgBRgGMAf8BSQFjAfMB/wFHAWEB8AH/ATwBVAHUAf8BOwFJAZMB/wgAAeUBhAHlAf8B7gGvAe4B/wHr + AaMB6wH/AdgBhAHYAf8BZgE2AWYB/wMFAf8BlgFQAZYB/wHjAYAB4wH/AVcBLgFXAf8BmgFRAZoB/wHi + AYAB4gH/AeABfgHgAf8ByQFuAckB/wGhAVUBoQH/CAABBQL+Af8BLAP/ASAD/wEFAvMB/wEFAlgB/wMF + Af8BBQKRAf8BBQL0Af8BBQJGAf8BBQKWAf8BBQL0Af8BBQLwAf8BBQLRAf8BBQKeAf8IAAPuAf8IAAPn + Af8DeQH/AwUB/wOmAf8D6AH/A2cB/wOqAf8D5wH/A+YB/wPTAf8DrwH/CAABMAIBAUoBggGTAfgB/wGH + AZgB+AH/AVEBXQGfAf8DBgH/ATgBRQGLAf8BSAFiAfIB/wFIAWIB7QH/AUQBVAGqAf8BRAFbAdgB/wFH + AWEB8AH/AUcBYQHwAf8BPQFVAdoB/wEwAgEBSggAATACAQFKAe4BsAHuAf8B7wG1Ae8B/wGnAW8BpwH/ + ASABFgEgAf8BmQFRAZkB/wHhAX8B4QH/Ad0BfQHdAf8BsAFkAbAB/wHNAXUBzQH/AeABfgHgAf8B4AF+ + AeAB/wHNAXABzQH/ATACAQFKCAABMAIBAUoBLQP/ATED/wEFArgB/wEFAgYB/wEFApUB/wEFAvIB/wEF + Au4B/wEFArUB/wEFAtoB/wEFAvAB/wEFAvAB/wEFAtcB/wEwAgEBSggAATACAQFKCAADwgH/AwwB/wOp + Af8D5wH/A+QB/wPBAf8D2QH/A+YB/wPmAf8D1QH/ATACAQFKDAABXgEOARoBygGPAZ8B+QH/AW8BfwHV + Af8BVAFjAbYB/wFgAXcB8QH/AVcBbgHqAf8BUwFqAewB/wFHAWEB8AH/AUcBYQHwAf8BRwFhAfAB/wFH + AWEB8AH/AVcBIgFWAegQAAFrAQ4BGAHKAfEBvAHxAf8B0QGTAdEB/wG2AXsBtgH/AeQBjgHkAf8B3gGF + Ad4B/wHeAYEB3gH/AeABfgHgAf8B4AF+AeAB/wHgAX4B4AH/AeABfgHgAf8BjQErAU8B6BAAAVcCGgHK + ATkD/wEFAvkB/wEFAswB/wEKA/8BBQL4Af8BBQL2Af8BBQLwAf8BBQLwAf8BBQLwAf8BBQLwAf8BOwJW + AegQAAFtAhoBygQAA+sB/wPPAf8D8wH/A+sB/wPqAf8D5gH/A+YB/wPmAf8D5gH/AY4CVgHoFAABYAEO + ARkByQGIAZkB+AH/AYEBkwH4Af8BewGJAfcB/wFnAX0B9gH/AVQBbQHzAf8BTQFmAe8B/wFFAV8B7QH/ + AUABWwHwAf8BWwETATMB2xgAAWwBEQEXAckB7wG2Ae8B/wHuAa8B7gH/AewBpgHsAf8B6AGVAegB/wHk + AYQB5AH/AeABgQHgAf8B3QF7Ad0B/wHeAXcB3gH/AXsBGAExAdsYAAFXAhkByQEyA/8BLAP/ASQD/wET + A/8BBQL8Af8BBQL0Af8BBQLsAf8BBQLpAf8BTwIyAdsoAAP3Af8D7QH/A+cB/wPiAf8D4QH/AXsCMgHb + HAABMAIBAUoBZQF7AfYB/wFtAYEB9gH/AXQBhAH3Af8BZwF9AfYB/wFUAW0B9QH/AUEBWwHvAf8BMAIB + AUogAAEwAgEBSgHoAZMB6AH/AeoBmgHqAf8B6wGgAesB/wHoAZUB6AH/AeUBhAHlAf8B3gF4Ad4B/wEw + AgEBSiAAATACAQFKARED/wEYA/8BHgP/ARMD/wEFAv4B/wEFAukB/wEwAgEBSiAAATACAQFKA/cB/wP5 + Af8D/QH/A/cB/wPuAf8D4QH/ATACAQFKLAABCwIBAQ0BCwIBAQ04AAELAgEBDQELAgEBDTgAAQsCAQEN + AQsCAQENOAABCwIBAQ0BCwIBAQ00AAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQECAwEsAAEEAgEBBAEU + AgEBGQEUAgEBGQEUAgEBGQECAwEsAAEEAgEBBAEUAgEBGQEUAgEBGQEUAgEBGQECAwEsAAEEAgEBBAEU + AgEBGQEUAgEBGQEUAgEBGQECAwEkAAEwAgEBSgNlAf8DWgH/A1UB/wNUAf8DUgH/A00B/wEwAgEBSgEU + AgEBGRwAATACAQFKAZEBcAEeAf8BfgFdARYB/wFzAVQBEwH/AXABUgETAf8BagFNARIB/wFZAUMBFAH/ + ATACAQFKARQCAQEZHAABMAIBAUoBOAFiATgB/wErAVMBKwH/ASYBTQEmAf8BJQFLASUB/wEkAUYBJAH/ + ASMBOwEjAf8BMAIBAUoBFAIBARkcAAEwAgEBSgKeAU4B/wKWASkB/wKTARsB/wKSARgB/wKNARUB/wJ7 + ARgB/wEwAgEBSgEUAgEBGRgAAWsCKwHnA3IB/wNyAf8DcAH/A28B/wNuAf8DagH/A2EB/wNVAf8BXAIR + AdsBFAIBARkUAAGIATcBDgHnAbQBggEeAf8BtAGBAR0B/wGyAYEBHQH/Aa8BgQEcAf8BrAGBARsB/wGk + AXsBGgH/AY4BbAEYAf8BcwFTARMB/wFdAQ4BBAHbARQCAQEZFAABVgEvARsB5wE9AXoBPQH/ATwBewE8 + Af8BOwF6ATsB/wE6AXgBOgH/ATgBdgE4Af8BNgFwATYB/wEwAWIBMAH/ASYBTAEmAf8BVQEKAQgB2wEU + AgEBGRQAAYABQwEuAecCsgFkAf8CtAFiAf8CsgFfAf8CsQFbAf8CsQFXAf8CrQFQAf8CogE6Af8CkwEZ + Af8BZgEWAQcB2wEUAgEBGRAAAWgCHwHcA4EB/wOEAf8DiQH/A4gB/wOGAf8DhgH/A4MB/wOBAf8DcQH/ + A1sB/wFcAhEB2wEUAgEBGQwAAXwBJAEJAdwB2QGdASQB/wHlAaUBJQH/Ae0BrAEmAf8B6wGqASYB/wHq + AagBJQH/AeoBqAElAf8B4wGkASMB/wHZAZwBIgH/AbMBgQEdAf8BgAFeARUB/wFdAQ4BBAHbARQCAQEZ + DAABWwEfAQ8B3AE+AZgBPgH/ATkBqAE5Af8BNgGzATYB/wE3AbABNwH/ATcBrgE3Af8BNwGuATcB/wE4 + AaYBOAH/ATwBmQE8Af8BPAF6ATwB/wEqAVUBKgH/AVUBCgEIAdsBFAIBARkMAAF4ASoBHwHcAssBfwH/ + AtQBgQH/AtoBgwH/AtgBggH/AtcBggH/AtcBggH/AtQBgQH/AswBewH/ArQBYAH/ApkBKAH/AWYBFgEH + AdsBFAIBARkIAAEwAgEBSgOBAf8DiQH/A5AB/wOQAf8DkAH/A5AB/wOKAf8DjAH/A4MB/wNrAf8DbgH/ + A1kB/wEwAgEBSggAATACAQFKAdwBoAElAf8B7AGqASYB/wH2AbMBKwH/AfYBswErAf8B9gGzASsB/wH2 + AbMBKwH/Ae8BrQEmAf8B8gGwAScB/wHiAaQBJQH/AaQBfAEcAf8BqwGAARwB/wF+AV0BFQH/ATACAQFK + CAABMAIBAUoBPQGdAT0B/wE2AbEBNgH/ATQBwAE0Af8BNAHAATQB/wE0AcABNAH/ATQBwAE0Af8BNQG2 + ATUB/wEzAbsBMwH/AToBpAE6Af8BOAFwATgB/wE5AXUBOQH/ASkBVAEpAf8BMAIBAUoIAAEwAgEBSgLN + AYEB/wLYAYIB/wLfAY0B/wLfAY0B/wLfAY0B/wLfAY0B/wLbAYMB/wLdAYcB/wLSAYEB/wKtAVQB/wKw + AVcB/wKYASQB/wEwAgEBSggAA4kB/wOOAf8DkAH/A5AB/wOQAf8DjwH/A4sB/wN3Af8DVwH/AzQB/wMF + Af8DbQH/A2oB/wNTAf8BAgMBBAAB6wGsASkB/wHyAbIBLAH/AfgBtAEpAf8B9gGzASsB/wH2AbMBKwH/ + AfUBsgErAf8B7AGsASoB/wG+AYoBIgH/AXUBVgEWAf8BKwEhAQsB/wMFAf8BqgGAARwB/wGkAXsBGgH/ + AWoBUAEVAf8BAgMBBAABOQGxATkB/wE3AbsBNwH/ATABxAEwAf8BNAHAATQB/wE0AcABNAH/ATQBvwE0 + Af8BOgGyAToB/wFDAYABQwH/ASoBTgEqAf8BEQEdAREB/wMFAf8BOQF0ATkB/wE2AXABNgH/AScBRgEn + Af8BAgMBBAAC2AGHAf8C3AGPAf8C4QGLAf8C3wGNAf8C3wGNAf8C3gGNAf8C2AGKAf8CtQF0Af8CjwEm + Af8CTgEFAf8DBQH/Aq4BVwH/Aq0BUAH/AogBHgH/AQIDAQQAA5EB/wOcAf8DkQH/A5AB/wN8Af8DXgH/ + Az0B/wMLAf8DBQH/AwUB/wMtAf8DgQH/A3gB/wNeAf8BFAIBARkEAAH5AbYBKgL/Ab8BOAH/AfgBtwEt + Af8B9gGzASsB/wHKAZMBJAH/AYEBYgEZAf8BOQErAQ0B/wIGAQUB/wMFAf8DBQH/ASEBGQEJAf8B4AGj + ASQB/wHEAY4BHwH/AYQBZAEXAf8BFAIBARkEAAExAcYBMQH/ATcB0QE3Af8BNQHDATUB/wE0AcABNAH/ + AUMBhwFDAf8BLwFYAS8B/wEWAScBFgH/AwUB/wMFAf8DBQH/AQ4BFwEOAf8BOwGhATsB/wE/AYEBPwH/ + AS0BWwEtAf8BFAIBARkEAALiAY0B/wLlAaEB/wLfAZIB/wLfAY0B/wK/AXsB/wKYATUB/wJfAQUB/wIe + AQUB/wMFAf8DBQH/AkUBBQH/AtEBgQH/ArsBcQH/Ap4BMgH/ARQCAQEZAQsCAQENA5oB/wOmAf8DlQH/ + A5AB/wNoAf8DUAH/AyEB/wMFAf8DBQH/AwUB/wNZAf8DjQH/A4EB/wNkAf8BFAIBARkBCwIBAQ0B/wG+ + ATQC/wHFAUcB/wH6AboBMQH/AfYBswErAf8BmQF0AR0B/wFlAUoBFAH/ARQBEAEHAf8DBQH/AwUB/wMF + Af8BegFaARcB/wH0AbEBKAH/AdgBmwEhAf8BlQFwARgB/wEUAgEBGQELAgEBDQE0AdABNAH/AUEB0wFB + Af8BNwHGATcB/wE0AcABNAH/ATcBaAE3Af8BJQFDASUB/wEKAQ8BCgH/AwUB/wMFAf8DBQH/ASwBUQEs + Af8BMgG+ATIB/wE8AZcBPAH/ATIBZgEyAf8BFAIBARkBCwIBAQ0C5QGcAf8C6AGtAf8C4QGYAf8C3wGN + Af8CpAFOAf8ChQEYAf8COQEFAf8DBQH/AwUB/wMFAf8CkgErAf8C3gGIAf8CywF7Af8CpQFAAf8BFAIB + ARkBCwIBAQ0DnwH/A6oB/wOVAf8DkAH/A48B/wOPAf8DRgH/AwUB/wMFAf8DEwH/A3sB/wOIAf8DggH/ + A2YB/wEUAgEBGQELAgEBDQH/AcEBPQL/AcgBTwH/AfkBuQEyAf8B9gGzASsB/wH1AbIBKwH/AfQBsgEr + Af8BSwE4ARAB/wMFAf8DBQH/AQoBCQEFAf8BxwGRASQB/wHrAaoBJgH/AeIBowEkAf8BmgF0ARkB/wEU + AgEBGQELAgEBDQE6AdIBOgH/AUYB1QFGAf8BOAHFATgB/wE0AcABNAH/ATQBvwE0Af8BNQG+ATUB/wEc + ATIBHAH/AwUB/wMFAf8BBwEIAQcB/wFDAYQBQwH/ATcBsAE3Af8BOgGjAToB/wEzAWoBMwH/ARQCAQEZ + AQsCAQENAuYBpAH/AusBtAH/AuEBmAH/At8BjQH/At4BjQH/At4BjQH/AnEBCwH/AwUB/wMFAf8CLgEF + Af8CvQF6Af8C2AGCAf8C0QGBAf8CqAFFAf8BFAIBARkEAAOeAf8DsQH/A54B/wONAf8DigH/A00B/wMF + Af8DWQH/AxUB/wNGAf8DjgH/A5AB/wOBAf8DZgH/AQkCAQEKBAAB/wHAATsC/wHMAVoC/wHBAToB/wHv + Aa8BKwH/AesBqwEpAf8BWgFCARIB/wMFAf8BeQFZARcB/wELAQkBBQH/AUsBOAEQAf8B8wGxASsB/wH2 + AbMBKwH/AdwBnwEjAf8BmQF0ARoB/wEJAgEBCgQAATgB0gE4Af8BTgHWAU4B/wE4AdABOAH/ATkBtgE5 + Af8BOgGwAToB/wEhATwBIQH/AwUB/wErAVABKwH/AQcBCQEHAf8BHAEyARwB/wE2Ab0BNgH/ATQBwAE0 + Af8BPAGcATwB/wE0AWkBNAH/AQkCAQEKBAAC5gGiAf8C7QG9Af8C5QGiAf8C2wGLAf8C2AGIAf8CfwES + Af8CTgEFAf8CkgEpAf8CMgEFAf8CcQELAf8C3QGNAf8C3wGNAf8CzQF/Af8CpwFHAf8BCQIBAQoEAAOZ + Af8DtgH/A60B/wORAf8DTQH/AwUB/wNmAf8DkwH/A0QB/wNoAf8DkQH/A5AB/wOBAf8DagH/CAAB/wG8 + ATIC/wHOAWEC/wHJAVMB/wHxAbQBNAH/AVoBQgESAf8DBQH/AZQBcQEcAf8B+gG2ASwB/wFHATUBDwH/ + AZkBdAEdAf8B+QG1ASwB/wH2AbMBKwH/AdkBnQEjAf8BoQF7AR4B/wgAATMBzwEzAf8BUwHXAVMB/wFJ + AdUBSQH/AUEBtgFBAf8BIQE8ASEB/wMFAf8BNgFlATYB/wExAccBMQH/ARsBMAEbAf8BNwFoATcB/wEy + AcYBMgH/ATQBwAE0Af8BPQGZAT0B/wE6AW4BOgH/CAAC5AGZAf8C7gHCAf8C7AG4Af8C2gGYAf8CfwES + Af8DBQH/AqEBSgH/AuIBkAH/Am0BCQH/AqQBTgH/AuEBkAH/At8BjQH/AswBfwH/AqgBVQH/CAABMAIB + AUoDuAH/A7sB/wN2Af8DCwH/A2cB/wORAf8DjgH/A3YB/wODAf8DkAH/A5AB/wOBAf8BMAIBAUoIAAEw + AgEBSgH/Ac4BYgL/AdABZwH/AbUBiQEpAf8CBgEFAf8BmAF0AR0B/wH4AbQBKwH/AfMBsQErAf8BugGH + ASIB/wHfAaIBKAH/AfYBswErAf8B9gGzASsB/wHfAaEBJAH/ATACAQFKCAABMAIBAUoBVAHYAVQB/wFX + AdgBVwH/AUoBeAFKAf8DBQH/ATcBaAE3Af8BMwHEATMB/wE2Ab0BNgH/AUIBfQFCAf8BPgGgAT4B/wE0 + AcABNAH/ATQBwAE0Af8BPAGfATwB/wEwAgEBSggAATACAQFKAu8BxAH/AvAByAH/Aq4BewH/Ah4BBQH/ + AqQBTgH/AuEBjwH/At0BjQH/ArQBcQH/AtABggH/At8BjQH/At8BjQH/As8BgQH/ATACAQFKDAABZgIS + AcoDwAH/A5UB/wOBAf8DngH/A5UB/wOUAf8DkAH/A5AB/wOQAf8DkAH/AXACMwHoEAABbQEVAQgBygH/ + AdMBcAH/Ae0BuAE+Af8BxwGYAS8B/wH+AcABOwH/AfcBuQEzAf8B9wG3ATEB/wH2AbMBKwH/AfYBswEr + Af8B9gGzASsB/wH2AbMBKwH/AZUBQQEPAegQAAFcARcBCAHKAV0B2gFdAf8BUAGuAVAB/wFNAYQBTQH/ + ATwBzQE8Af8BOwHBATsB/wE5AcEBOQH/ATQBwAE0Af8BNAHAATQB/wE0AcABNAH/ATQBwAE0Af8BUwE9 + ARcB6BAAAWsBGAETAcoC8QHPAf8C1gGlAf8CvAGFAf8C5AGkAf8C3gGZAf8C3wGWAf8C3wGNAf8C3wGN + Af8C3wGNAf8C3wGNAf8BjQFPATMB6BQAAWYCEQHJA7sB/wO2Af8DrgH/A6MB/wOXAf8DkQH/A40B/wOM + Af8BaQIdAdsYAAFsARQBCAHJAf8B0AFoAv8BzQFhAv8BywFXAv8BwwFEAf8B/QG7ATIB/wH3AbcBLgH/ + AfIBsQEpAf8B8gGvAScB/wGAAScBCQHbGAABXQEUAQgByQFYAdkBWAH/AVMB2AFTAf8BTAHWAUwB/wE/ + AdMBPwH/ATUBzAE1Af8BNgHCATYB/wE1AbsBNQH/ATIBuwEyAf8BWwEnAQ4B2xgAAWwBFwERAckC8AHI + Af8C7wHDAf8C7QG7Af8C6AGqAf8C4wGZAf8C3wGSAf8C3QGKAf8C3QGHAf8BewExAR0B2xwAATACAQFK + A6IB/wOmAf8DqgH/A6MB/wOZAf8DjAH/ATACAQFKIAABMAIBAUoB/wHDAUIC/wHGAUoC/wHJAVEC/wHC + AUQC/wG9ATIB/wHyAa8BJwH/ATACAQFKIAABMAIBAUoBPQHTAT0B/wFDAdQBQwH/AUcB1QFHAf8BPwHT + AT8B/wEzAc8BMwH/ATMBuwEzAf8BMAIBAUogAAEwAgEBSgLnAagB/wLqAbAB/wLrAbUB/wLoAaoB/wLk + AZkB/wLdAYcB/wEwAgEBSiwAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIBAQ04AAELAgEBDQELAgEBDTgA + AQsCAQENAQsCAQENNAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIB + ARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIB + ARkBFAIBARkBAgMBJAABMAIBAUoCLQFVAf8CIwFIAf8CHwFDAf8CHgFBAf8CHQE+Af8CHQEzAf8BMAIB + AUoBFAIBARkcAAEwAgEBSgF9AQUBWAH/AWYBBQFJAf8BXAEFAUIB/wFaAQUBQAH/AVUBBQE9Af8BSwEF + ATYB/wEwAgEBSgEUAgEBGRwAATACAQFKASQBRgFTAf8BGwE7AUgB/wEXATYBQwH/ARcBNQFBAf8BFgEy + AT0B/wEXASsBMgH/ATACAQFKARQCAQEZHAABMAIBAUoDhQH/A3gB/wNwAf8DbgH/A2oB/wNhAf8BMAIB + AUoBFAIBARkYAAFTARUBKAHnAjABagH/Ai8BagH/Ai8BaQH/Ai4BaAH/Ai0BZQH/AisBYQH/AiYBVAH/ + Ah4BQwH/AVEBCAEKAdsBFAIBARkUAAF3AQUBKAHnAY8BBQFpAf8BjwEFAWkB/wGNAQUBaAH/AYsBBQFm + Af8BiAEFAWQB/wGCAQUBYAH/AXYBBQFTAf8BXAEFAUEB/wFbAQQBCgHbARQCAQEZFAABTgEgASgB5wEl + AVUBaQH/ASMBVgFqAf8BIwFUAWkB/wEiAVMBZwH/ASEBUgFlAf8BIAFOAWEB/wEdAUQBVAH/ARcBNgFD + Af8BUQEJAQoB2wEUAgEBGRQAAXkCPgHnA5cB/wOXAf8DlQH/A5MB/wOSAf8DjQH/A4EB/wNwAf8BXwIT + AdsBFAIBARkQAAFYAQwBHwHcAi8BhAH/AioBkQH/AicBmwH/AigBmQH/AigBmAH/AigBmAH/AioBkAH/ + Ai4BhAH/Ai8BagH/AiIBSgH/AVEBBwEKAdsBFAIBARkMAAFzAQQBGgHcAa0BBQF+Af8BtgEFAYEB/wG8 + AQUBgwH/AbsBBQGDAf8BugEFAYIB/wG6AQUBggH/AbQBBQGBAf8BrAEFAX0B/wGOAQUBaAH/AWcBBQFJ + Af8BWwEEAQoB2wEUAgEBGQwAAVMBGAEfAdwBHwFrAYUB/wEYAXQBlAH/ARMBegGfAf8BFAF5AZ0B/wEV + AXgBmwH/ARUBeAGbAf8BGAFzAZMB/wEdAWsBhgH/ASMBVQFqAf8BGgE8AUkB/wFRAQkBCgHbARQCAQEZ + DAABcwIpAdwDrAH/A7IB/wO2Af8DtQH/A7QB/wO0Af8DsQH/A6sB/wOWAf8DeQH/AV8CEwHbARQCAQEZ + CAABMAIBAUoCLwGHAf8CJwGaAf8CJAGoAf8CJAGoAf8CJAGoAf8CJAGoAf8CJgGeAf8CJAGjAf8CLAGP + Af8CLAFhAf8CLQFlAf8CIQFIAf8BMAIBAUoIAAEwAgEBSgGwAQUBgAH/AbwBBQGDAf8BxgEFAYoB/wHG + AQUBigH/AcYBBQGKAf8BxgEFAYoB/wG+AQUBhQH/AcEBBQGHAf8BtAEFAYEB/wGDAQUBYAH/AYgBBQFk + Af8BZQEFAUgB/wEwAgEBSggAATACAQFKAR4BbgGJAf8BEwF5AZ4B/wEOAYEBrQH/AQ4BgQGtAf8BDgGB + Aa0B/wEOAYEBrQH/AREBfAGjAf8BDwF/AacB/wEaAXIBkQH/ASIBTwFhAf8BIgFRAWUB/wEZATsBSAH/ + ATACAQFKCAABMAIBAUoDrgH/A7YB/wO9Af8DvQH/A70B/wO9Af8DtwH/A7kB/wOxAf8DjgH/A5IB/wN3 + Af8BMAIBAUoIAAIqAZkB/wIoAaIB/wIhAasB/wIkAagB/wIkAagB/wIlAacB/wIqAZsB/wI1AW8B/wIi + AUMB/wIPARoB/wMFAf8CLQFkAf8CKwFhAf8CIAE9Af8BAgMBBAABvQEFAYQB/wHFAQUBiQH/AcYBBQGK + Af8BxgEFAYoB/wHGAQUBigH/AcYBBQGKAf8BvwEFAYUB/wGZAQUBcAH/AWABBQFEAf8BJAEFARoB/wMF + Af8BhwEFAWMB/wGCAQUBYAH/AVgBBQE/Af8BAgMBBAABFgF6AZ0B/wETAYABpwH/AQsBgQGxAf8BDgGB + Aa0B/wEOAYEBrQH/AQ8BgQGrAf8BFwF7AZ4B/wEpAVoBbgH/ARsBNwFDAf8BDAEWARoB/wMFAf8BIgFR + AWQB/wEgAU4BYQH/ARkBMgE8Af8BAgMBBAADtgH/A7sB/wO9Af8DvQH/A70B/wO8Af8DuAH/A54B/wNz + Af8DOAH/AwUB/wORAf8DjQH/A2wB/wECAwEEAAIhAa0B/wIkAbkB/wIlAaoB/wIkAagB/wI1AXkB/wIm + AUwB/wISASIB/wMFAf8DBQH/AwUB/wIMARQB/wIsAYwB/wIyAXQB/wIkAU8B/wEUAgEBGQQAAcgBBQGM + Af8B1wEFAZYB/wHJAQUBjAH/AcYBBQGKAf8BowEFAXcB/wFtAQUBTgH/AS8BBQEiAf8BBgEFAQYB/wMF + Af8DBQH/ARsBBQEUAf8BswEFAYEB/wGbAQUBcQH/AW4BBQFOAf8BFAIBARkEAAELAYEBswH/AQsBigG/ + Af8BDwGBAa8B/wEOAYEBrQH/AScBYQF5Af8BHgE/AUwB/wEPARwBIgH/AwUB/wMFAf8DBQH/AQoBEQEU + Af8BGwFxAY4B/wElAV0BdAH/ARwBQAFPAf8BFAIBARkEAAO+Af8DxwH/A74B/wO9Af8DpAH/A34B/wNG + Af8DCgH/AwUB/wMFAf8DLgH/A68B/wOfAf8DfwH/ARQCAQEZAQsCAQENAiMBtwH/AiUBwgH/AicBrQH/ + AiQBqAH/AiwBWgH/Ah4BOgH/AggBDQH/AwUB/wMFAf8DBQH/AiMBRgH/AiMBpgH/Ai4BgwH/AicBWQH/ + ARQCAQEZAQsCAQENAdQBBQGUAf8B4QEFAZ0B/wHOAQUBjwH/AcYBBQGKAf8BgQEFAVsB/wFTAQUBOwH/ + AREBBQENAf8DBQH/AwUB/wMFAf8BZAEFAUcB/wHDAQUBiAH/AasBBQF8Af8BewEFAVcB/wEUAgEBGQEL + AgEBDQELAYgBvQH/AQsBkAHIAf8BEAGCAbIB/wEOAYEBrQH/ASIBSQFZAf8BGAEwAToB/wEHAQsBDQH/ + AwUB/wMFAf8DBQH/ARwBOQFFAf8BDQGBAasB/wEeAWoBhAH/AR0BSAFZAf8BFAIBARkBCwIBAQ0DxQH/ + A84B/wPBAf8DvQH/A4kB/wNnAf8DIAH/AwUB/wMFAf8DBQH/A3cB/wO6Af8DqgH/A4QB/wEUAgEBGQEL + AgEBDQIkAbwB/wImAccB/wIoAawB/wIkAagB/wIlAacB/wImAaUB/wIXASwB/wMFAf8DBQH/AgYBCAH/ + AjUBdwH/AigBmQH/AisBjQH/AigBXAH/ARQCAQEZAQsCAQENAdoBBQGYAf8B5wEFAaEB/wHOAQUBjwH/ + AcYBBQGKAf8BxgEFAYoB/wHFAQUBigH/AT0BBQEsAf8DBQH/AwUB/wEJAQUBCAH/AaEBBQF1Af8BuwEF + AYMB/wGzAQUBgQH/AX8BBQFaAf8BFAIBARkBCwIBAQ0BCwGMAcIB/wEMAZQBzQH/AREBgQGxAf8BDgGB + Aa0B/wEPAYEBqwH/ARABgQGqAf8BEgEkASsB/wMFAf8DBQH/AQYBBwEIAf8BJwFfAXYB/wEUAXkBnQH/ + ARkBcgGQAf8BHgFKAVwB/wEUAgEBGQELAgEBDQPJAf8D0QH/A8EB/wO9Af8DvAH/A7wB/wNVAf8DBQH/ + AwUB/wMRAf8DowH/A7UB/wOwAf8DhwH/ARQCAQEZBAACJAG7Af8CJwHOAf8CJQG5Af8CKQGeAf8CKwGZ + Af8CGwE0Af8DBQH/AiMBRQH/AgYBCAH/AhcBLAH/AiYBpAH/AiQBqAH/Ai4BhwH/AikBWgH/AQkCAQEK + BAAB2QEFAZcB/wHuAQUBpgH/AdcBBQGWAf8BwgEFAYcB/wG+AQUBhQH/AUkBBQE0Af8DBQH/AWMBBQFG + Af8BCgEFAQgB/wE9AQUBLAH/AcUBBQGJAf8BxgEFAYoB/wGvAQUBfwH/AX8BBQFaAf8BCQIBAQoEAAEL + AYsBwQH/AQwBmQHUAf8BDAGJAb4B/wEVAX0BogH/ARcBegGdAf8BFQErATQB/wMFAf8BGwE5AUUB/wEG + AggB/wESASQBKwH/AREBgAGpAf8BDgGBAa0B/wEdAW0BiQH/AR8BSQFaAf8BCQIBAQoEAAPIAf8D1gH/ + A8gB/wO6Af8DtwH/A2AB/wMFAf8DdgH/AxMB/wNVAf8DuwH/A70B/wOtAf8DhwH/AQkCAQEKBAACIwG1 + Af8CKAHRAf8CJgHJAf8CMQGeAf8CGwE0Af8DBQH/AisBVwH/AiIBrgH/AhYBKQH/AiwBWgH/AiIBrQH/ + AiQBqAH/Ai8BhAH/Ai4BXwH/CAAB0gEFAZIB/wHzAQUBqgH/AeoBBQGjAf8ByQEFAYwB/wFJAQUBNAH/ + AwUB/wF9AQUBWQH/AcoBBQGNAf8BOgEFASoB/wGBAQUBWwH/AckBBQGMAf8BxgEFAYoB/wGtAQUBfgH/ + AYIBBQFgAf8IAAELAYcBuwH/AQwBnAHZAf8BDAGWAdAB/wEdAX4BoQH/ARUBKwE0Af8DBQH/ASIBRwFX + Af8BCwGCAbQB/wESASIBKQH/ASIBSQFZAf8BDAGBAbMB/wEOAYEBrQH/AR4BbAGGAf8BJAFNAV4B/wgA + A8QB/wPZAf8D0wH/A74B/wNgAf8DBQH/A4YB/wO/Af8DUQH/A4kB/wO+Af8DvQH/A6wB/wONAf8IAAEw + AgEBSgIoAdMB/wIoAdYB/wI8AWcB/wMFAf8CLAFZAf8CIwGrAf8CJgGkAf8CNQFsAf8CLwGLAf8CJAGo + Af8CJAGoAf8CLQGKAf8BMAIBAUoIAAEwAgEBSgH0AQUBqgH/AfgBBQGtAf8BmAEFAW8B/wEGAQUBBgH/ + AYABBQFbAf8ByAEFAYwB/wHFAQUBiQH/AZYBBQFuAf8BtAEFAYEB/wHGAQUBigH/AcYBBQGKAf8BsQEF + AYEB/wEwAgEBSggAATACAQFKAQwBnQHZAf8BDAGfAd0B/wExAVYBZAH/AwUB/wEiAUkBWQH/AQ0BgQGx + Af8BEQGAAakB/wEpAVgBawH/AR4BcAGMAf8BDgGBAa0B/wEOAYEBrQH/ARwBbwGMAf8BMAIBAUoIAAEw + AgEBSgPaAf8D3AH/A50B/wMKAf8DiAH/A74B/wO7Af8DnAH/A7EB/wO9Af8DvQH/A64B/wEwAgEBSgwA + AVkBBQEVAcoCKgHaAf8CPgGWAf8CPgF2Af8CKAG2Af8CKwGoAf8CKQGoAf8CJAGoAf8CJAGoAf8CJAGo + Af8CJAGoAf8BTgEQATYB6BAAAWsBAwESAcoB/gEFAbEB/wHOAQUBkAH/AakBBQF7Af8B1wEFAZYB/wHN + AQUBjwH/AcsBBQGOAf8BxgEFAYoB/wHGAQUBigH/AcYBBQGKAf8BxgEFAYoB/wGEAQUBMwHoEAABVwEO + ARUBygEMAaMB4gH/ASwBewGWAf8BMQFhAXUB/wEQAYgBuwH/ARUBgQGsAf8BEwGBAa0B/wEOAYEBrQH/ + AQ4BgQGtAf8BDgGBAa0B/wEOAYEBrQH/AUoBKgE2AegQAAFqAhUBygPfAf8DwQH/A6kB/wPIAf8DwQH/ + A8AB/wO9Af8DvQH/A70B/wO9Af8BfQJGAegUAAFXAQUBFAHJAigB1gH/AigB0gH/AicBzAH/AiUBvwH/ + AiUBsgH/AiYBqQH/AiYBowH/AiMBowH/AVcBCgEiAdsYAAFsAQMBEQHJAfkBBQGtAf8B9AEFAaoB/wHt + AQUBpQH/Ad8BBQGbAf8B0QEFAZIB/wHJAQUBjAH/AcMBBQGIAf8BwQEFAYcB/wF1AQQBHQHbGAABVwEO + ARQByQEMAZ8B3QH/AQwBnAHZAf8BDAGYAdMB/wELAY8BxgH/AQ0BhQG4Af8BEAGBAa8B/wERAX8BpwH/ + AQ4BfwGoAf8BUQEYASIB2xgAAWkCFAHJA9wB/wPZAf8D1AH/A8wB/wPDAf8DvgH/A7oB/wO5Af8BdQIo + AdscAAEwAgEBSgIkAb8B/wIlAcMB/wImAcgB/wIlAb8B/wIjAbUB/wIkAaMB/wEwAgEBSiAAATACAQFK + Ad0BBQGaAf8B4wEFAZ4B/wHoAQUBogH/Ad8BBQGbAf8B0gEFAZIB/wHBAQUBhwH/ATACAQFKIAABMAIB + AUoBCwGOAcUB/wELAZEBygH/AQwBlQHOAf8BCwGPAcYB/wELAYcBuwH/AQ8BfwGnAf8BMAIBAUogAAEw + AgEBSgPLAf8DzgH/A9EB/wPMAf8DxAH/A7kB/wEwAgEBSiwAAQsCAQENAQsCAQENOAABCwIBAQ0BCwIB + AQ04AAELAgEBDQELAgEBDTgAAQsCAQENAQsCAQENNAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMB + LAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBLAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMB + LAABBAIBAQQBFAIBARkBFAIBARkBFAIBARkBAgMBJAABMAIBAUoDQgH/AzsB/wM5Af8DOAH/AzcB/wM1 + Af8BMAIBAUoBFAIBARkcAAEwAgEBSgFxAUsBPgH/AWABOwEvAf8BWAE1ASoB/wFWATQBKQH/AVEBMgEn + Af8BQwEuASYB/wEwAgEBSgEUAgEBGRwAATACAQFKASgBRAEoAf8BHwE6AR8B/wEbATYBGwH/ARsBNAEb + Af8BGgExARoB/wEZASoBGQH/ATACAQFKARQCAQEZHAABMAIBAUoBUgFUAS0B/wFGAUgBIgH/AUABQwEe + Af8BPwFBAR0B/wE8AT4BHAH/ATIBMwEcAf8BMAIBAUoBFAIBARkYAAFdAiAB5wNMAf8DTAH/A0sB/wNK + Af8DSQH/A0YB/wNAAf8DOQH/AVcCCgHbARQCAQEZFAABdQEgARsB5wGHAVUBQwH/AYgBVQFCAf8BhgFU + AUEB/wGEAVIBQAH/AYIBUAE+Af8BgQFNATsB/wFwAUMBNQH/AVgBNQEpAf8BWwIJAdsBFAIBARkUAAFR + ASABFAHnASsBVQErAf8BKgFVASoB/wEqAVQBKgH/ASkBUwEpAf8BKAFSASgB/wEmAU4BJgH/ASIBRAEi + Af8BGwE2ARsB/wFRAQkBBwHbARQCAQEZFAABZQEoARQB5wFmAWoBLwH/AWcBagEuAf8BZgFpAS4B/wFk + AWgBLQH/AWIBZgEsAf8BXgFiASoB/wFSAVUBJQH/AUABQwEeAf8BVwEKAQgB2wEUAgEBGRAAAV4CFAHc + A14B/wNkAf8DaQH/A2gB/wNmAf8DZgH/A2MB/wNdAf8DTAH/AzwB/wFXAgoB2wEUAgEBGQwAAXIBGAET + AdwBsAFgAUMB/wHCAWABPQH/Ac0BYQE7Af8BygFhATwB/wHJAWABOwH/AckBYAE7Af8BwQFfATwB/wGx + AV4BQQH/AYcBVAFCAf8BYgE7AS4B/wFbAgkB2wEUAgEBGQwAAVcBGAEMAdwBLAFtASwB/wEoAXgBKAH/ + ASYBfwEmAf8BJwF9AScB/wEnAXwBJwH/AScBfAEnAf8BKAF2ASgB/wEqAW0BKgH/ASoBVQEqAf8BHgE7 + AR4B/wFRAQkBBwHbARQCAQEZDAABZgEfAQwB3AGBAYQBLgH/AYsBkgEpAf8BlAGcASUB/wGSAZkBJgH/ + AZEBmAEnAf8BkQGYAScB/wGKAZABKAH/AYEBhAEsAf8BZgFqAS4B/wFIAUoBIQH/AVcBCgEHAdsBFAIB + ARkIAAEwAgEBSgNgAf8DaQH/A3IB/wNyAf8DcgH/A3IB/wNqAf8DbAH/A2MB/wNHAf8DSQH/AzsB/wEw + AgEBSggAATACAQFKAbUBYAFCAf8BywFhATwB/wHUAWgBQgH/AdQBaAFCAf8B1AFoAUIB/wHUAWgBQgH/ + Ac8BYgE8Af8B0gFjAT0B/wG+AWABPwH/AYEBTgE9Af8BgQFQAT4B/wFgAToBLQH/ATACAQFKCAABMAIB + AUoBKwFwASsB/wEmAX4BJgH/ASUBgwElAf8BJQGDASUB/wElAYMBJQH/ASUBgwElAf8BJQGBASUB/wEk + AYEBJAH/ASkBdQEpAf8BKAFOASgB/wEoAVEBKAH/AR4BOwEeAf8BMAIBAUoIAAEwAgEBSgGCAYgBLQH/ + AZMBmwEmAf8BoAGoASMB/wGgAagBIwH/AaABqAEjAf8BoAGoASMB/wGXAZ8BJAH/AZsBowEjAf8BiAGO + ASoB/wFeAWEBKwH/AWIBZQEsAf8BRgFJASAB/wEwAgEBSggAA2kB/wNvAf8DcgH/A3IB/wNyAf8DcAH/ + A2sB/wNRAf8DOgH/AykB/wMFAf8DSQH/A0YB/wM4Af8BAgMBBAAByQFkAUAB/wHPAWgBRAH/AdcBZgE/ + Af8B1AFoAUIB/wHUAWgBQgH/AdMBaAFCAf8BygFmAUIB/wGOAVwBSgH/AVkBOQEuAf8BIQEWARMB/wMF + Af8BgQFQAT8B/wGBAU0BOwH/AVABNAErAf8BAgMBBAABKAF+ASgB/wEnAYEBJwH/ASIBhQEiAf8BJQGD + ASUB/wElAYMBJQH/ASUBggElAf8BKQF/ASkB/wEvAVkBLwH/AR4BNgEeAf8BDQEVAQ0B/wMFAf8BKAFR + ASgB/wEmAU4BJgH/ARwBMQEcAf8BAgMBBAABkwGaASgB/wGbAaMBJgH/AaMBqwEfAf8BoAGoASMB/wGg + AagBIwH/AZ8BpwEjAf8BlAGbASkB/wFrAW8BNAH/AUEBQwEhAf8BGQEaAQ4B/wMFAf8BYQFkAS0B/wFe + AWIBKgH/ATsBPQEfAf8BAgMBBAADcwH/A4AB/wNzAf8DcgH/A1YB/wM9Af8DLgH/AwoB/wMFAf8DBQH/ + AyQB/wNhAf8DUgH/Az4B/wEUAgEBGQQAAdgBaAFBAf8B2wF1AVEB/wHUAWsBRQH/AdQBaAFCAf8BnAFf + AUkB/wFlAUABNAH/ASwBHQEYAf8CBgEFAf8DBQH/AwUB/wEaAREBDwH/AbsBYAFAAf8BlQFbAUUB/wFp + AUABMgH/ARQCAQEZBAABIwGHASMB/wElAZABJQH/ASUBhQElAf8BJQGDASUB/wEvAWEBLwH/ASIBPgEi + Af8BEAEcARAB/wMFAf8DBQH/AwUB/wELAREBCwH/ASoBcwEqAf8BLQFdAS0B/wEgAUABIAH/ARQCAQEZ + BAABpAGtASAB/wGwAboBIgH/AaIBqgEjAf8BoAGoASMB/wF1AXkBMwH/AUoBTAElAf8BIQEiARIB/wMF + Af8DBQH/AwUB/wIUAQwB/wGGAYwBKwH/AXABdAExAf8BTAFPASQB/wEUAgEBGQELAgEBDQN9Af8DhwH/ + A3cB/wNyAf8DRAH/AzYB/wMcAf8DBQH/AwUB/wMFAf8DOwH/A24B/wNcAf8DQgH/ARQCAQEZAQsCAQEN + AdoBcgFNAf8B3QF+AV0B/wHVAW8BSwH/AdQBaAFCAf8BeAFMAT0B/wFMATEBKAH/ARABDAEKAf8DBQH/ + AwUB/wMFAf8BXAE7ATAB/wHUAWQBPQH/Aa8BXgFBAf8BdgFGATYB/wEUAgEBGQELAgEBDQEkAY4BJAH/ + ASYBlwEmAf8BJwGHAScB/wElAYMBJQH/AScBSAEnAf8BGgEvARoB/wEIAQsBCAH/AwUB/wMFAf8DBQH/ + AR8BOQEfAf8BJAGBASQB/wEqAWwBKgH/ASMBRwEjAf8BFAIBARkBCwIBAQ0BrgG3ASEB/wG5AcIBIwH/ + AaUBrQElAf8BoAGoASMB/wFXAVoBKwH/ATgBOgEdAf8CDQEIAf8DBQH/AwUB/wMFAf8BRAFGASMB/wGe + AaYBIQH/AYEBgwEsAf8BVgFZAScB/wEUAgEBGQELAgEBDQOBAf8DjAH/A3cB/wNyAf8DcAH/A3AB/wMy + Af8DBQH/AwUB/wMRAf8DVQH/A2gB/wNiAf8DQwH/ARQCAQEZAQsCAQENAdwBeAFUAf8B3wGBAWMB/wHU + AW8BTAH/AdQBaAFCAf8B0wFoAUIB/wHSAWgBQwH/ATkBJQEeAf8DBQH/AwUB/wEJAgcB/wGZAV8BSQH/ + AcoBYQE8Af8BvQFfAT4B/wF6AUgBOAH/ARQCAQEZAQsCAQENASUBkgElAf8BJwGbAScB/wEnAYYBJwH/ + ASUBgwElAf8BJQGCASUB/wEmAYEBJgH/ARQBIwEUAf8DBQH/AwUB/wEGAQcBBgH/AS8BXwEvAf8BJwF9 + AScB/wEpAXQBKQH/ASQBSgEkAf8BFAIBARkBCwIBAQ0BswG8ASIB/wG9AccBJAH/AaQBrAEmAf8BoAGo + ASMB/wGfAacBIwH/AZ4BpgEkAf8BKgErARYB/wMFAf8DBQH/AggBBgH/AXMBdwE0Af8BkgGZASYB/wGI + AY4BKgH/AVkBXAEoAf8BFAIBARkEAAOBAf8DlgH/A4EB/wNuAf8DagH/AzUB/wMFAf8DOwH/AxMB/wMy + Af8DbwH/A3IB/wNfAf8DQwH/AQkCAQEKBAAB3AF3AVMB/wHhAYYBbAH/AdoBdgFSAf8BzAFnAUQB/wHJ + AWUBQgH/AUQBLAEkAf8DBQH/AVwBOgEvAf8BCQEIAQcB/wE5ASUBHgH/AdEBaAFDAf8B1AFoAUIB/wG1 + AV8BQQH/AXgBSQE5Af8BCQIBAQoEAAElAZIBJQH/ASgBoAEoAf8BJgGQASYB/wEoAYEBKAH/ASkBfQEp + Af8BGAEqARgB/wMFAf8BHwE4AR8B/wEGAQcBBgH/ARQBIwEUAf8BJgGBASYB/wElAYMBJQH/ASoBcAEq + Af8BJQFJASUB/wEJAgEBCgQAAbIBuwEiAf8BxAHOASUB/wGwAbkBIwH/AZcBngEoAf8BkwGaASkB/wEy + ATQBGgH/AwUB/wFDAUUBIgH/AggBBgH/ASoBKwEWAf8BnQGkASUB/wGgAagBIwH/AYIBhwEsAf8BWAFb + ASgB/wEJAgEBCgQAA3wB/wObAf8DkAH/A3MB/wM1Af8DBQH/A0MB/wN0Af8DMQH/A0QB/wNzAf8DcgH/ + A14B/wNGAf8IAAHaAXABSwH/AeIBigFyAf8B3wGBAWcB/wHIAXABUQH/AUQBLAEkAf8DBQH/AXQBSgE7 + Af8B2AFqAUMB/wE2ASMBHQH/AXgBTAE9Af8B1wFpAUMB/wHUAWgBQgH/AbEBXwFCAf8BfgFPAUAB/wgA + ASQBjQEkAf8BKQGkASkB/wEoAZ0BKAH/AS4BgQEuAf8BGAEqARgB/wMFAf8BJgFGASYB/wEjAYgBIwH/ + ARQBIgEUAf8BJwFIAScB/wEjAYcBIwH/ASUBgwElAf8BKwFtASsB/wEpAUwBKQH/CAABrAG1ASEB/wHI + AdIBJQH/AcABygEkAf8BmAGeAS8B/wEyATQBGgH/AwUB/wFVAVcBKgH/AaYBrwEgAf8BKAEpARUB/wFX + AVoBKwH/AaUBrQEhAf8BoAGoASMB/wGBAYQBLQH/AVwBXgEuAf8IAAEwAgEBSgOeAf8DogH/A1EB/wMK + Af8DRAH/A3MB/wNvAf8DUAH/A2MB/wNyAf8DcgH/A2AB/wEwAgEBSggAATACAQFKAeIBiwFzAf8B4wGP + AXcB/wGEAWABUgH/AgYBBQH/AXcBSwE9Af8B1gFpAUMB/wHRAWgBQwH/AYsBWwFJAf8BugFiAUQB/wHU + AWgBQgH/AdQBaAFCAf8BuQFgAUEB/wEwAgEBSggAATACAQFKASkBpAEpAf8BKgGnASoB/wE0AVMBNAH/ + AwUB/wEnAUgBJwH/ASQBhQEkAf8BJgGBASYB/wEvAVcBLwH/ASwBcgEsAf8BJQGDASUB/wElAYMBJQH/ + ASoBcgEqAf8BMAIBAUoIAAEwAgEBSgHIAdMBJgH/AcwB1gEmAf8BZAFmATsB/wMFAf8BVwFZASsB/wGj + AasBIQH/AZ0BpAElAf8BaQFsATQB/wGFAYsBLgH/AaABqAEjAf8BoAGoASMB/wGEAYoBLAH/ATACAQFK + DAABYQIOAcoDqAH/A3cB/wNbAf8DgQH/A3cB/wN2Af8DcgH/A3IB/wNyAf8DcgH/AWACIwHoEAABawEO + AQkBygHkAZQBfgH/Ab0BewFjAf8BmAFnAVUB/wHXAXcBVQH/AdABcQFPAf8B0QFuAUsB/wHUAWgBQgH/ + AdQBaAFCAf8B1AFoAUIB/wHUAWgBQgH/AYQBIwEYAegQAAFZAQ4BBQHKASsBqwErAf8BOAF8ATgB/wE2 + AV8BNgH/ASgBjgEoAf8BKgGDASoB/wEoAYQBKAH/ASUBgwElAf8BJQGDASUB/wElAYMBJQH/ASUBgwEl + Af8BTgEqARAB6BAAAWgBFQEFAcoB0QHcAScB/wGQAZYBPQH/AXIBdgE9Af8BrQG2ASYB/wGhAagBKQH/ + AaEBqQEnAf8BoAGoASMB/wGgAagBIwH/AaABqAEjAf8BoAGoASMB/wFxATYBEAHoFAABYwIOAckDogH/ + A5sB/wOSAf8DgwH/A3oB/wNzAf8DbgH/A2wB/wFhAhYB2xgAAWsBDgELAckB4wGPAXgB/wHiAYsBcgH/ + AeABhAFqAf8B3QF8AVoB/wHYAXABTAH/AdQBawFGAf8B0AFmAUEB/wHTAWMBPAH/AXkBFgEOAdsYAAFb + AREBBQHJASoBpwEqAf8BKQGkASkB/wEoAZ8BKAH/ASYBlgEmAf8BJQGLASUB/wEmAYQBJgH/ASYBgQEm + Af8BJAGBASQB/wFXARkBCQHbGAABZgEUAQUByQHMAdcBJgH/AcgB0gEmAf8BwgHMASUB/wG3AcABIwH/ + AaoBswEjAf8BoQGqASQB/wGbAaMBJAH/AZwBpAEiAf8BawEiAQkB2xwAATACAQFKA4IB/wOHAf8DjAH/ + A4MB/wN8Af8DbAH/ATACAQFKIAABMAIBAUoB3QF7AVkB/wHeAYABXwH/Ad8BgQFlAf8B3QF8AVoB/wHa + AXABSwH/AdIBYwE9Af8BMAIBAUogAAEwAgEBSgEmAZUBJgH/AScBmQEnAf8BJwGcAScB/wEmAZYBJgH/ + ASQBjQEkAf8BJAGBASQB/wEwAgEBSiAAATACAQFKAbYBvwEiAf8BugHEASMB/wG+AcgBJAH/AbcBwAEj + Af8BrAG1ASEB/wGbAaMBIwH/ATACAQFKLAABCwIBAQ0BCwIBAQ04AAELAgEBDQELAgEBDTgAAQsCAQEN + AQsCAQENOAABCwIBAQ0BCwIBAQ0cAAFCAU0BPgcAAT4DAAEoAwABQAMAAWADAAEBAQABAQYAAQMWAAP/ + gQAB/AEfAfwBHwH8AR8B/AEfAfABBwHwAQcB8AEHAfABBwHgAQMB4AEDAeABAwHgAQMBwAEBAcABAQHA AQEBwAEBAYABAQGAAQEBgAEBAYABAQGAAQABgAEAAYABAAGAAQABgAEAAYABAAGAAQABgBEAAYABAAGA AQABgAEAAYABAAGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAcABAwHAAQMBwAEDAcABAwHg - AQcB4AEHAeABBwHgAQcB8AEPAfABDwHwAQ8B8AEPAf4BfwH+AX8B/gF/Af4Bfws= + AQcB4AEHAeABBwHgAQcB8AEPAfABDwHwAQ8B8AEPAf4BfwH+AX8B/gF/Af4BfwH8AR8B/AEfAfwBHwH8 + AR8B8AEHAfABBwHwAQcB8AEHAeABAwHgAQMB4AEDAeABAwHAAQEBwAEBAcABAQHAAQEBgAEBAYABAQGA + AQEBgAEBAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAAGAEQABgAEAAYABAAGAAQABoAEAAYABAQGA + AQEBgAEBAbABAQGAAQEBgAEBAYABAQGwAQEBwAEDAcABAwHAAQMB0AEDAeABBwHgAQcB4AEHAf4BBwHw + AQ8B8AEPAfABDwHwAQ8B/gF/Af4BfwH+AX8B/gF/AfwBHwH8AR8B/AEfAfwBHwHwAQcB8AEHAfABBwHw + AQcB4AEDAeABAwHgAQMB4AEDAcABAQHAAQEBwAEBAcABAQGAAQEBgAEBAYABAQGAAQEBgAEAAYABAAGA + AQABgAEAAYABAAGAAQABgAEAAYARAAGAAQABgAEAAYABAAGAAQABgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHAfABDwHwAQ8B8AEPAfABDwH+ + AX8B/gF/Af4BfwH+AX8B/AEfAfwBHwH8AR8B/AEfAfABBwHwAQcB8AEHAfABBwHgAQMB4AEDAeABAwHg + AQMBwAEBAcABAQHAAQEBwAEBAYABAQGAAQEBgAEBAYABAQGAAQABgAEAAYABAAGAAQABgAEAAYABAAGA + AQABgBEAAYABAAGAAQABgAEAAYABAAGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAcABAwHA + AQMBwAEDAcABAwHgAQcB4AEHAeABBwHgAQcB8AEPAfABDwHwAQ8B8AEPAf4BfwH+AX8B/gF/Af4BfwH8 + AR8B/AEfAfwBHwH8AR8B8AEHAfABBwHwAQcB8AEHAeABAwHgAQMB4AEDAeABAwHAAQEBwAEBAcABAQHA + AQEBgAEBAYABAQGAAQEBgAEBAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAAGAEQABgAEAAYABAAGA + AQABgAEAAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHg + AQcB4AEHAeABBwHwAQ8B8AEPAfABDwHwAQ8B/gF/Af4BfwH+AX8B/gF/Cw==