diff --git a/Build/Scripting/BCS.cfg b/Build/Scripting/BCS.cfg index d7f14135..89db7db9 100644 --- a/Build/Scripting/BCS.cfg +++ b/Build/Scripting/BCS.cfg @@ -24,7 +24,7 @@ argumentdelimiter = ","; terminator = ";"; keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; snippetsdir = "acs"; -scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "ACS"; keywords { diff --git a/Build/Scripting/GZDoom_GLDEFS.cfg b/Build/Scripting/GZDoom_GLDEFS.cfg index e10670d5..40b4a576 100644 --- a/Build/Scripting/GZDoom_GLDEFS.cfg +++ b/Build/Scripting/GZDoom_GLDEFS.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/GLDEFS"; +scripttype = "GLDEFS"; keywords { diff --git a/Build/Scripting/GZDoom_MODELDEF.cfg b/Build/Scripting/GZDoom_MODELDEF.cfg index 9cc3e1f0..17390578 100644 --- a/Build/Scripting/GZDoom_MODELDEF.cfg +++ b/Build/Scripting/GZDoom_MODELDEF.cfg @@ -12,7 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/MODELDEF"; -scripttype = 2; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "MODELDEF"; keywords { diff --git a/Build/Scripting/Hexen_ACS.cfg b/Build/Scripting/Hexen_ACS.cfg index e62167e2..a9dc3f13 100644 --- a/Build/Scripting/Hexen_ACS.cfg +++ b/Build/Scripting/Hexen_ACS.cfg @@ -24,7 +24,7 @@ argumentdelimiter = ","; terminator = ";"; keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; snippetsdir = "acs"; -scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "ACS"; keywords { diff --git a/Build/Scripting/ZDoom_ACS.cfg b/Build/Scripting/ZDoom_ACS.cfg index 18ccc448..06edfd65 100644 --- a/Build/Scripting/ZDoom_ACS.cfg +++ b/Build/Scripting/ZDoom_ACS.cfg @@ -25,7 +25,7 @@ terminator = ";"; extrawordchars = "#"; // Extra characters to be treated as a part of a word by the Script Editor keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; snippetsdir = "acs"; -scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "ACS"; keywords { diff --git a/Build/Scripting/ZDoom_ANIMDEFS.cfg b/Build/Scripting/ZDoom_ANIMDEFS.cfg new file mode 100644 index 00000000..b8776c30 --- /dev/null +++ b/Build/Scripting/ZDoom_ANIMDEFS.cfg @@ -0,0 +1,50 @@ +/*******************************************************************\ + GZDoom Builder Script highlighting definitions for ANIMDEFS +\*******************************************************************/ + +// Editor settings +description = "ZDoom ANIMDEFS"; +codepage = 0; +extensions = "txt"; +casesensitive = false; +codeblockopen = "{"; +codeblockclose = "}"; +insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase +lexer = 35; // CPP-style, case-insensitive +keywordhelp = "http://zdoom.org/wiki/ANIMDEFS"; +scripttype = "ANIMDEFS"; + +properties +{ + texture; + flat; + tics; + rand; + range; + fit; + switch; + sound; + animateddoor; + + pic; + warp; + warp2; + on; + off; + opensound; + closesound; + cameratexture; + worldpanning; +} + +constants +{ + allowdecals; + doom; + heretic; + hexen; + strife; + optional; + random; + oscillate; +} \ No newline at end of file diff --git a/Build/Scripting/ZDoom_CVARINFO.cfg b/Build/Scripting/ZDoom_CVARINFO.cfg index bb67f5d1..1fa44a85 100644 --- a/Build/Scripting/ZDoom_CVARINFO.cfg +++ b/Build/Scripting/ZDoom_CVARINFO.cfg @@ -11,6 +11,7 @@ terminator = ";"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/CVARINFO"; +scripttype = "CVARINFO"; properties { diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg index e89c8946..d86421ab 100644 --- a/Build/Scripting/ZDoom_DECORATE.cfg +++ b/Build/Scripting/ZDoom_DECORATE.cfg @@ -19,7 +19,7 @@ argumentdelimiter = ","; terminator = ";"; extrawordchars = "#.$"; // Extra characters to be treated as a part of a word by the Script Editor keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; -scripttype = 3; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "DECORATE"; keywords { diff --git a/Build/Scripting/ZDoom_LOCKDEFS.cfg b/Build/Scripting/ZDoom_LOCKDEFS.cfg index 69388ed8..d4779c71 100644 --- a/Build/Scripting/ZDoom_LOCKDEFS.cfg +++ b/Build/Scripting/ZDoom_LOCKDEFS.cfg @@ -9,16 +9,20 @@ extensions = "txt"; casesensitive = false; codeblockopen = "{"; codeblockclose = "}"; +extrawordchars = "$"; // Extra characters to be treated as a part of a word by the Script Editor insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/LOCKDEFS"; +scripttype = "LOCKDEFS"; keywords { + $Title = "//$Title \"[EP]\""; + Lock = "Lock locknumber [game]"; - Any = "Any { keyname1 keyname2 ... }"; - Message = "Message \"door message\""; - RemoteMessage = "RemoteMessage \"door message\""; + Any = "Any { [EP] }"; + Message = "Message \"[EP]\""; + RemoteMessage = "RemoteMessage \"[EP]\""; MapColor = "MapColor r g b"; LockedSound = "LockedSound soundname"; } diff --git a/Build/Scripting/ZDoom_MAPINFO.cfg b/Build/Scripting/ZDoom_MAPINFO.cfg index 0766ca42..9ede1c26 100644 --- a/Build/Scripting/ZDoom_MAPINFO.cfg +++ b/Build/Scripting/ZDoom_MAPINFO.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/MAPINFO"; +scripttype = "MAPINFO"; properties { diff --git a/Build/Scripting/ZDoom_MENUDEF.cfg b/Build/Scripting/ZDoom_MENUDEF.cfg index 6f4bd01f..906ade73 100644 --- a/Build/Scripting/ZDoom_MENUDEF.cfg +++ b/Build/Scripting/ZDoom_MENUDEF.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/MENUDEF"; +scripttype = "MENUDEF"; properties { diff --git a/Build/Scripting/ZDoom_REVERBS.cfg b/Build/Scripting/ZDoom_REVERBS.cfg index 99bba74d..84dfd67c 100644 --- a/Build/Scripting/ZDoom_REVERBS.cfg +++ b/Build/Scripting/ZDoom_REVERBS.cfg @@ -10,6 +10,7 @@ casesensitive = false; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/REVERBS"; +scripttype = "REVERBS"; keywords { @@ -49,4 +50,10 @@ keywords RoomHF = "RoomHF int"; RoomLF = "RoomLF int"; RoomRolloffFactor = "RoomRolloffFactor float"; +} + +constants +{ + true; + false; } \ No newline at end of file diff --git a/Build/Scripting/ZDoom_SBARINFO.cfg b/Build/Scripting/ZDoom_SBARINFO.cfg index b356040e..a9529fb2 100644 --- a/Build/Scripting/ZDoom_SBARINFO.cfg +++ b/Build/Scripting/ZDoom_SBARINFO.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/SBARINFO"; +scripttype = "SBARINFO"; keywords { diff --git a/Build/Scripting/ZDoom_SNDINFO.cfg b/Build/Scripting/ZDoom_SNDINFO.cfg index e3d938f0..a5b59f66 100644 --- a/Build/Scripting/ZDoom_SNDINFO.cfg +++ b/Build/Scripting/ZDoom_SNDINFO.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/SNDINFO"; +scripttype = "SNDINFO"; properties { diff --git a/Build/Scripting/ZDoom_SNDSEQ.cfg b/Build/Scripting/ZDoom_SNDSEQ.cfg index 78753c3a..47765b1b 100644 --- a/Build/Scripting/ZDoom_SNDSEQ.cfg +++ b/Build/Scripting/ZDoom_SNDSEQ.cfg @@ -10,6 +10,7 @@ casesensitive = false; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/SNDSEQ"; +scripttype = "SNDSEQ"; keywords { @@ -22,7 +23,7 @@ keywords delayonce = "delayonce <time>"; delayrand = "delayrand <min> <max>"; volume = "volume <volume>"; - //volumerel = "volumerel"; + volumerel = "volumerel <volume>"; volumerand = "volumerand <min> <max>"; attenuation = "attenuation <mode>"; door = "door <index>"; diff --git a/Build/Scripting/ZDoom_TERRAIN.cfg b/Build/Scripting/ZDoom_TERRAIN.cfg index 24fff7e0..11febeae 100644 --- a/Build/Scripting/ZDoom_TERRAIN.cfg +++ b/Build/Scripting/ZDoom_TERRAIN.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/TERRAIN"; +scripttype = "TERRAIN"; properties { diff --git a/Build/Scripting/ZDoom_TEXTURES.cfg b/Build/Scripting/ZDoom_TEXTURES.cfg index e51f7345..ba914ea1 100644 --- a/Build/Scripting/ZDoom_TEXTURES.cfg +++ b/Build/Scripting/ZDoom_TEXTURES.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/TEXTURES"; +scripttype = "TEXTURES"; properties { diff --git a/Build/Scripting/ZDoom_USDF.cfg b/Build/Scripting/ZDoom_USDF.cfg index 1588cef0..f83f2bbe 100644 --- a/Build/Scripting/ZDoom_USDF.cfg +++ b/Build/Scripting/ZDoom_USDF.cfg @@ -12,6 +12,7 @@ lexer = 35; // CPP-style, case-insensitive codeblockopen = "{"; codeblockclose = "}"; terminator = ";"; +scripttype = "USDF"; keywords { diff --git a/Build/Scripting/ZDoom_VOXELDEF.cfg b/Build/Scripting/ZDoom_VOXELDEF.cfg index d42ff5ca..0724cfda 100644 --- a/Build/Scripting/ZDoom_VOXELDEF.cfg +++ b/Build/Scripting/ZDoom_VOXELDEF.cfg @@ -12,6 +12,7 @@ codeblockclose = "}"; insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase lexer = 35; // CPP-style, case-insensitive keywordhelp = "http://zdoom.org/wiki/VOXELDEF"; +scripttype = "VOXELDEF"; properties { diff --git a/Build/Scripting/ZDoom_X11R6RGB.cfg b/Build/Scripting/ZDoom_X11R6RGB.cfg new file mode 100644 index 00000000..79e2c119 --- /dev/null +++ b/Build/Scripting/ZDoom_X11R6RGB.cfg @@ -0,0 +1,23 @@ +/*******************************************************************\ + GZDoom Builder Script highlighting definitions for X11R6RGB +\*******************************************************************/ + +// Editor settings +description = "ZDoom X11R6RGB"; +codepage = 0; +extensions = "txt"; +casesensitive = false; +insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase +lexer = 35; // CPP-style, case-insensitive +keywordhelp = "http://zdoom.org/wiki/X11R6RGB"; +scripttype = "X11R6RGB"; + +keywords +{ + +} + +constants +{ + +} \ No newline at end of file diff --git a/Build/Scripting/Zandronum_ACS.cfg b/Build/Scripting/Zandronum_ACS.cfg index 874c83a1..3000a548 100644 --- a/Build/Scripting/Zandronum_ACS.cfg +++ b/Build/Scripting/Zandronum_ACS.cfg @@ -25,7 +25,7 @@ terminator = ";"; extrawordchars = "#"; // Extra characters to be treated as a part of a word by the Script Editor keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; snippetsdir = "acs"; -scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate +scripttype = "ACS"; keywords { diff --git a/Resources/Icons/Script.ico b/Resources/Icons/Script.ico index 2f7362b4..77c84304 100644 Binary files a/Resources/Icons/Script.ico and b/Resources/Icons/Script.ico differ diff --git a/Resources/Icons/Script.png b/Resources/Icons/Script.png index 022a785e..c364714e 100644 Binary files a/Resources/Icons/Script.png and b/Resources/Icons/Script.png differ diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj index d581c897..12049888 100644 --- a/Source/Core/Builder.csproj +++ b/Source/Core/Builder.csproj @@ -698,6 +698,9 @@ <EmbeddedResource Include="Controls\Scripting\ScriptEditorPreviewControl.resx"> <DependentUpon>ScriptEditorPreviewControl.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="Controls\Scripting\ScriptResourcesControl.resx"> + <DependentUpon>ScriptResourcesControl.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="Resources\SkySphere.md3" /> <None Include="Resources\ThingStatistics.png" /> <None Include="Resources\Copy.png" /> @@ -706,6 +709,20 @@ <Compile Include="Actions\HintsManager.cs" /> <Compile Include="Config\AllTexturesSet.cs" /> <Compile Include="Config\FlagTranslation.cs" /> + <Compile Include="Controls\Scripting\ScriptIconsManager.cs" /> + <Compile Include="Controls\Scripting\ScriptResourceDocumentTab.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\Scripting\ScriptResourcesControl.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\Scripting\ScriptResourcesControl.designer.cs"> + <DependentUpon>ScriptResourcesControl.cs</DependentUpon> + </Compile> + <Compile Include="Controls\VisualStudioTabControl.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Data\Scripting\ScriptResource.cs" /> <Compile Include="Rendering\RenderModeEnums.cs" /> <Compile Include="Config\PasteOptions.cs" /> <Compile Include="Config\ScriptDocumentSettings.cs" /> @@ -899,6 +916,12 @@ <Compile Include="Rendering\VisualVertexHandle.cs" /> <Compile Include="Geometry\Line3D.cs" /> <Compile Include="Data\Scripting\ScriptHandlerAttribute.cs" /> + <Compile Include="Windows\ScriptGoToLineForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Windows\ScriptGoToLineForm.Designer.cs"> + <DependentUpon>ScriptGoToLineForm.cs</DependentUpon> + </Compile> <Compile Include="ZDoom\AmbientSoundInfo.cs" /> <Compile Include="ZDoom\DecorateCategoryInfo.cs" /> <Compile Include="ZDoom\LockDefsParser.cs" /> @@ -1111,6 +1134,9 @@ <EmbeddedResource Include="Windows\ExceptionDialog.resx"> <DependentUpon>ExceptionDialog.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="Windows\ScriptGoToLineForm.resx"> + <DependentUpon>ScriptGoToLineForm.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="Windows\TagStatisticsForm.resx"> <DependentUpon>TagStatisticsForm.cs</DependentUpon> </EmbeddedResource> @@ -1184,6 +1210,7 @@ <None Include="Resources\ModelDisabled.png" /> <None Include="Resources\ModelFiltered.png" /> <Content Include="Resources\Model_selected.png" /> + <None Include="Resources\Script.png" /> <None Include="Resources\SplitSectors.png" /> <None Include="Resources\ScriptProperty.png" /> <None Include="Resources\TextWhitespace.png" /> @@ -1264,7 +1291,6 @@ <DependentUpon>AngleForm.cs</DependentUpon> </Compile> <Compile Include="Windows\PreferencesController.cs" /> - <None Include="Resources\Script2.png" /> <None Include="Resources\ScriptCompile.png" /> <None Include="Resources\ScriptPalette.png" /> <None Include="Resources\SaveAll.png" /> diff --git a/Source/Core/Config/ScriptConfiguration.cs b/Source/Core/Config/ScriptConfiguration.cs index faf7e59b..e57f3211 100644 --- a/Source/Core/Config/ScriptConfiguration.cs +++ b/Source/Core/Config/ScriptConfiguration.cs @@ -46,6 +46,9 @@ namespace CodeImp.DoomBuilder.Config CVARINFO, SNDINFO, LOCKDEFS, + MENUDEF, + SBARINFO, + USDF, } internal class ScriptConfiguration : IComparable<ScriptConfiguration> @@ -203,9 +206,29 @@ namespace CodeImp.DoomBuilder.Config arrayclose = cfg.ReadSetting("arrayclose", ""); //mxd argumentdelimiter = cfg.ReadSetting("argumentdelimiter", ""); terminator = cfg.ReadSetting("terminator", ""); - scripttype = (ScriptType)cfg.ReadSetting("scripttype", (int)ScriptType.UNKNOWN); //mxd extrawordchars = cfg.ReadSetting("extrawordchars", ""); //mxd + //mxd. Get script type... + string scripttypestr = cfg.ReadSetting("scripttype", string.Empty); + if(!string.IsNullOrEmpty(scripttypestr)) + { + List<string> typenames = new List<string>(Enum.GetNames(typeof(ScriptType))); + int pos = typenames.IndexOf(scripttypestr.ToUpperInvariant()); + if(pos == -1) + { + scripttype = ScriptType.UNKNOWN; + General.ErrorLogger.Add(ErrorType.Warning, "Unknown script type \"" + scripttypestr.ToUpperInvariant() + "\" in \"" + description + "\" script configuration."); + } + else + { + scripttype = (ScriptType)pos; + } + } + else + { + scripttype = ScriptType.UNKNOWN; + } + //mxd. Make braces array if(!string.IsNullOrEmpty(functionopen)) braces.Add(functionopen[0]); if(!string.IsNullOrEmpty(functionclose)) braces.Add(functionclose[0]); diff --git a/Source/Core/Config/ScriptDocumentSettings.cs b/Source/Core/Config/ScriptDocumentSettings.cs index 8a9913fc..09840998 100644 --- a/Source/Core/Config/ScriptDocumentSettings.cs +++ b/Source/Core/Config/ScriptDocumentSettings.cs @@ -8,7 +8,17 @@ namespace CodeImp.DoomBuilder.Config public int CaretPosition; public int FirstVisibleLine; public string Filename; + public string ResourceLocation; // Used by ScriptResourceDocumentTab only + public ScriptType ScriptType; // Used by ScriptResourceDocumentTab only + public ScriptDocumentTabType TabType; public bool IsActiveTab; public long Hash; } + + internal enum ScriptDocumentTabType + { + LUMP, + RESOURCE, + FILE, + } } diff --git a/Source/Core/Controls/Scripting/ScriptDocumentTab.cs b/Source/Core/Controls/Scripting/ScriptDocumentTab.cs index d5997efc..1e8764e9 100644 --- a/Source/Core/Controls/Scripting/ScriptDocumentTab.cs +++ b/Source/Core/Controls/Scripting/ScriptDocumentTab.cs @@ -49,6 +49,7 @@ namespace CodeImp.DoomBuilder.Controls // The script edit control protected readonly ScriptEditorControl editor; private string title; //mxd + protected ScriptDocumentTabType tabtype; //mxd // Derived classes must set this! protected ScriptConfiguration config; @@ -64,9 +65,10 @@ namespace CodeImp.DoomBuilder.Controls public virtual bool IsSaveAsRequired { get { return true; } } public virtual bool IsClosable { get { return true; } } public virtual bool IsReconfigurable { get { return true; } } + public virtual bool IsReadOnly { get { return false; } } //mxd public virtual string Filename { get { return null; } } public ScriptEditorPanel Panel { get { return panel; } } - internal Scintilla Scintilla { get { return editor.Scintilla; } } //mxd + public ScriptEditorControl Editor { get { return editor; } } //mxd public string Title { get { return title; } } //mxd public bool IsChanged { get { return editor.IsChanged; } } public int SelectionStart { get { return editor.SelectionStart; } set { editor.SelectionStart = value; } } @@ -92,6 +94,7 @@ namespace CodeImp.DoomBuilder.Controls // Keep panel and config this.panel = panel; this.config = config; //mxd + this.BackColor = SystemColors.ControlLightLight; //mxd // Make the script control editor = new ScriptEditorControl(); @@ -111,12 +114,21 @@ namespace CodeImp.DoomBuilder.Controls editor.OnFindNext += panel.FindNext; editor.OnFindPrevious += panel.FindPrevious; //mxd editor.OnTextChanged += editor_TextChanged; //mxd + editor.OnGoToLine += panel.GoToLine; //mxd + editor.OnCompileScript -= Compile; //mxd //mxd. Bind functionbar events editor.OnFunctionBarDropDown += functionbar_DropDown; //mxd. Setup styles editor.SetupStyles(config); + + //mxd. Apply panel settings + editor.ShowWhitespace = panel.ShowWhitespace; + editor.WrapLongLines = panel.WrapLongLines; + + //mxd. Set icon + this.ImageIndex = panel.Icons.GetScriptIcon(config.ScriptType); } // Disposer @@ -129,6 +141,8 @@ namespace CodeImp.DoomBuilder.Controls editor.OnFindNext -= panel.FindNext; editor.OnFindPrevious -= panel.FindPrevious; //mxd editor.OnTextChanged -= editor_TextChanged; //mxd + editor.OnGoToLine -= panel.GoToLine; //mxd + editor.OnCompileScript -= Compile; //mxd base.Dispose(disposing); } @@ -208,6 +222,7 @@ namespace CodeImp.DoomBuilder.Controls editor.SetupStyles(newconfig); //mxd List<CompilerError> errors = UpdateNavigator(); //mxd if(panel.ActiveTab == this) panel.ShowErrors(errors, true); //mxd + this.ImageIndex = panel.Icons.GetScriptIcon(config.ScriptType); //mxd. Set icon } // Call this to set the tab title @@ -315,21 +330,23 @@ namespace CodeImp.DoomBuilder.Controls } //mxd - internal void SetViewSettings(ScriptDocumentSettings settings) + internal virtual void SetViewSettings(ScriptDocumentSettings settings) { + if(settings.TabType != tabtype) throw new Exception("TabType mismatch!"); + // Text must be exactly the same long hash = MurmurHash2.Hash(Text); - bool applyfolding = General.Settings.ScriptShowFolding && (Scintilla.Lexer == Lexer.Cpp || Scintilla.Lexer == Lexer.CppNoCase); + bool applyfolding = General.Settings.ScriptShowFolding && (editor.Scintilla.Lexer == Lexer.Cpp || editor.Scintilla.Lexer == Lexer.CppNoCase); if(hash == settings.Hash) { // Restore fold levels if(applyfolding) ApplyFolding(settings.FoldLevels ?? GetFoldLevels()); // Restore scroll - Scintilla.FirstVisibleLine = settings.FirstVisibleLine; + editor.Scintilla.FirstVisibleLine = settings.FirstVisibleLine; // Restore caret position - Scintilla.SetEmptySelection(settings.CaretPosition); + editor.Scintilla.SetEmptySelection(settings.CaretPosition); } // Do what Visual Studio does: fold all #regions else if(applyfolding) @@ -340,7 +357,7 @@ namespace CodeImp.DoomBuilder.Controls internal void SetDefaultViewSettings() { - if(General.Settings.ScriptShowFolding && (Scintilla.Lexer == Lexer.Cpp || Scintilla.Lexer == Lexer.CppNoCase)) + if(General.Settings.ScriptShowFolding && (editor.Scintilla.Lexer == Lexer.Cpp || editor.Scintilla.Lexer == Lexer.CppNoCase)) ApplyFolding(GetFoldLevels()); } @@ -356,7 +373,7 @@ namespace CodeImp.DoomBuilder.Controls foreach(int level in foldlevels) { foreach(int line in foldlevelsarr[level]) - Scintilla.Lines[line].FoldLine(FoldAction.Contract); + editor.Scintilla.Lines[line].FoldLine(FoldAction.Contract); } } @@ -365,9 +382,9 @@ namespace CodeImp.DoomBuilder.Controls Dictionary<int, HashSet<int>> foldlevels = new Dictionary<int, HashSet<int>>(); int foldlevel = NativeMethods.SC_FOLDLEVELBASE; - for(int i = 0; i < Scintilla.Lines.Count; i++) + for(int i = 0; i < editor.Scintilla.Lines.Count; i++) { - string line = Scintilla.Lines[i].Text.TrimStart(); + string line = editor.Scintilla.Lines[i].Text.TrimStart(); if(line.StartsWith("#region", true, CultureInfo.InvariantCulture)) { foldlevel++; @@ -384,17 +401,17 @@ namespace CodeImp.DoomBuilder.Controls } //mxd - internal ScriptDocumentSettings GetViewSettings() + internal virtual ScriptDocumentSettings GetViewSettings() { Dictionary<int, HashSet<int>> foldlevels = new Dictionary<int, HashSet<int>>(); - for(int i = 0; i < Scintilla.Lines.Count; i++) + for(int i = 0; i < editor.Scintilla.Lines.Count; i++) { - if(!Scintilla.Lines[i].Expanded) + if(!editor.Scintilla.Lines[i].Expanded) { - if(!foldlevels.ContainsKey(Scintilla.Lines[i].FoldLevel)) - foldlevels.Add(Scintilla.Lines[i].FoldLevel, new HashSet<int>()); - foldlevels[Scintilla.Lines[i].FoldLevel].Add(i); + if(!foldlevels.ContainsKey(editor.Scintilla.Lines[i].FoldLevel)) + foldlevels.Add(editor.Scintilla.Lines[i].FoldLevel, new HashSet<int>()); + foldlevels[editor.Scintilla.Lines[i].FoldLevel].Add(i); } } @@ -402,9 +419,11 @@ namespace CodeImp.DoomBuilder.Controls { Filename = this.Filename, FoldLevels = foldlevels, - CaretPosition = Scintilla.SelectionStart, + ScriptType = config.ScriptType, + CaretPosition = editor.Scintilla.SelectionStart, + TabType = tabtype, IsActiveTab = (this.Panel.ActiveTab == this), - FirstVisibleLine = Scintilla.FirstVisibleLine, + FirstVisibleLine = editor.Scintilla.FirstVisibleLine, Hash = MurmurHash2.Hash(Text), }; } diff --git a/Source/Core/Controls/Scripting/ScriptEditorControl.cs b/Source/Core/Controls/Scripting/ScriptEditorControl.cs index 94f71df2..6766ddb9 100644 --- a/Source/Core/Controls/Scripting/ScriptEditorControl.cs +++ b/Source/Core/Controls/Scripting/ScriptEditorControl.cs @@ -82,6 +82,8 @@ namespace CodeImp.DoomBuilder.Controls public delegate void OpenFindReplaceDelegate(); public delegate void FindNextDelegate(); public delegate void FindPreviousDelegate(); //mxd + public delegate void GoToLineDelegate(); //mxd + public delegate void CompileScriptDelegate(); //mxd public event ExplicitSaveTabDelegate OnExplicitSaveTab; public event OpenScriptBrowserDelegate OnOpenScriptBrowser; @@ -90,6 +92,8 @@ namespace CodeImp.DoomBuilder.Controls public event FindPreviousDelegate OnFindPrevious; //mxd public new event EventHandler OnTextChanged; //mxd public event EventHandler OnFunctionBarDropDown; //mxd + public event GoToLineDelegate OnGoToLine; //mxd + public event CompileScriptDelegate OnCompileScript; //mxd #endregion @@ -126,7 +130,7 @@ namespace CodeImp.DoomBuilder.Controls public string SelectedText { get { return scriptedit.SelectedText; } } //mxd public bool ShowWhitespace { get { return scriptedit.ViewWhitespace != WhitespaceMode.Invisible; } set { scriptedit.ViewWhitespace = value ? WhitespaceMode.VisibleAlways : WhitespaceMode.Invisible; } } public bool WrapLongLines { get { return scriptedit.WrapMode != WrapMode.None; } set { scriptedit.WrapMode = (value ? WrapMode.Char : WrapMode.None); } } - public Scintilla Scintilla { get { return scriptedit; } } //mxd + internal Scintilla Scintilla { get { return scriptedit; } } //mxd #endregion @@ -238,6 +242,9 @@ namespace CodeImp.DoomBuilder.Controls // This moves the caret to a given line and ensures the line is visible public void MoveToLine(int linenumber) { + //mxd. Safety required + linenumber = General.Clamp(linenumber, 0, scriptedit.Lines.Count); + scriptedit.Lines[linenumber].Goto(); EnsureLineVisible(linenumber); scriptedit.SetEmptySelection(scriptedit.Lines[linenumber].Position); @@ -735,6 +742,12 @@ namespace CodeImp.DoomBuilder.Controls } } + //mxd + public void DuplicateLine() + { + scriptedit.DirectMessage(NativeMethods.SCI_LINEDUPLICATE); + } + //mxd internal List<CompilerError> UpdateNavigator(ScriptDocumentTab tab) { @@ -883,6 +896,13 @@ namespace CodeImp.DoomBuilder.Controls return true; } + //mxd. F5 for Compile Script + if(keydata == Keys.F5) + { + if(OnCompileScript != null) OnCompileScript(); + return true; + } + // CTRL+F for find & replace if(keydata == (Keys.Control | Keys.F)) { @@ -890,8 +910,15 @@ namespace CodeImp.DoomBuilder.Controls return true; } + // CTRL+G for go to line + if(keydata == (Keys.Control | Keys.G)) + { + if(OnGoToLine != null) OnGoToLine(); + return true; + } + // CTRL+S for save - if(keydata == (Keys.Control | Keys.S)) + if(!scriptedit.ReadOnly && keydata == (Keys.Control | Keys.S)) { if(OnExplicitSaveTab != null) OnExplicitSaveTab(); return true; @@ -905,7 +932,7 @@ namespace CodeImp.DoomBuilder.Controls } // CTRL+Space to autocomplete - if(keydata == (Keys.Control | Keys.Space)) + if(!scriptedit.ReadOnly && keydata == (Keys.Control | Keys.Space)) { // Hide call tip if any scriptedit.CallTipCancel(); @@ -916,7 +943,7 @@ namespace CodeImp.DoomBuilder.Controls } //mxd. Tab to expand code snippet. Do it only when the text cursor is at the end of a keyword. - if(keydata == Keys.Tab && !scriptedit.AutoCActive) + if(!scriptedit.ReadOnly && keydata == Keys.Tab && !scriptedit.AutoCActive) { string curword = GetCurrentWord().ToLowerInvariant(); if(scriptconfig.Snippets.Contains(curword) && scriptedit.CurrentPosition == scriptedit.WordEndPosition(scriptedit.CurrentPosition, true)) @@ -1041,7 +1068,7 @@ namespace CodeImp.DoomBuilder.Controls } } - if(General.Settings.ScriptAutoShowAutocompletion) + if(!scriptedit.ReadOnly && General.Settings.ScriptAutoShowAutocompletion) { // Display the autocompletion list handler.ShowAutoCompletionList(); @@ -1163,25 +1190,28 @@ namespace CodeImp.DoomBuilder.Controls { InsertSnippet(lines); } - // Format editor comment? - else if(e.Text.StartsWith("$")) + else { string definition = scriptconfig.GetFunctionDefinition(e.Text); if(!string.IsNullOrEmpty(definition)) { int entrypos = definition.IndexOf(ENTRY_POSITION_MARKER, StringComparison.OrdinalIgnoreCase); - // Remove the marker - if(entrypos != -1) definition = definition.Remove(entrypos, 4); - - // Replace insterted text with expanded comment - int startpos = scriptedit.WordStartPosition(scriptedit.CurrentPosition, true); - scriptedit.SelectionStart = startpos; - scriptedit.SelectionEnd = scriptedit.WordEndPosition(scriptedit.CurrentPosition, true); - scriptedit.ReplaceSelection(definition); - - // Update caret position - if(entrypos != -1) scriptedit.SetEmptySelection(startpos + entrypos); + // Replace inserted text with expanded version? + if(e.Text.StartsWith("$") || entrypos != -1) + { + // Remove the marker + if(entrypos != -1) definition = definition.Remove(entrypos, 4); + + // Replace insterted text with expanded comment + int startpos = scriptedit.WordStartPosition(scriptedit.CurrentPosition, true); + scriptedit.SelectionStart = startpos; + scriptedit.SelectionEnd = scriptedit.WordEndPosition(scriptedit.CurrentPosition, true); + scriptedit.ReplaceSelection(definition); + + // Update caret position + if(entrypos != -1) scriptedit.SetEmptySelection(startpos + entrypos); + } } } } diff --git a/Source/Core/Controls/Scripting/ScriptEditorPanel.Designer.cs b/Source/Core/Controls/Scripting/ScriptEditorPanel.Designer.cs index 7a5c6982..fd564e67 100644 --- a/Source/Core/Controls/Scripting/ScriptEditorPanel.Designer.cs +++ b/Source/Core/Controls/Scripting/ScriptEditorPanel.Designer.cs @@ -30,10 +30,10 @@ namespace CodeImp.DoomBuilder.Controls { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScriptEditorPanel)); - this.tabs = new System.Windows.Forms.TabControl(); this.toolbar = new System.Windows.Forms.ToolStrip(); this.buttonnew = new System.Windows.Forms.ToolStripDropDownButton(); this.buttonopen = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.buttonsave = new System.Windows.Forms.ToolStripButton(); this.buttonsaveall = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); @@ -53,7 +53,6 @@ namespace CodeImp.DoomBuilder.Controls this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.buttonscriptconfig = new System.Windows.Forms.ToolStripDropDownButton(); this.buttoncompile = new System.Windows.Forms.ToolStripButton(); - this.buttonclose = new System.Windows.Forms.ToolStripButton(); this.buttonkeywordhelp = new System.Windows.Forms.ToolStripButton(); this.buttonsearch = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -64,12 +63,6 @@ namespace CodeImp.DoomBuilder.Controls this.searchwholeword = new System.Windows.Forms.ToolStripButton(); this.openfile = new System.Windows.Forms.OpenFileDialog(); this.savefile = new System.Windows.Forms.SaveFileDialog(); - this.splitter = new System.Windows.Forms.SplitContainer(); - this.label1 = new System.Windows.Forms.Label(); - this.errorlist = new System.Windows.Forms.ListView(); - this.colIndex = new System.Windows.Forms.ColumnHeader(); - this.colDescription = new System.Windows.Forms.ColumnHeader(); - this.colFile = new System.Windows.Forms.ColumnHeader(); this.errorimages = new System.Windows.Forms.ImageList(this.components); this.statusbar = new System.Windows.Forms.StatusStrip(); this.statuslabel = new System.Windows.Forms.ToolStripStatusLabel(); @@ -77,29 +70,66 @@ namespace CodeImp.DoomBuilder.Controls this.scripttype = new System.Windows.Forms.ToolStripStatusLabel(); this.statusflasher = new System.Windows.Forms.Timer(this.components); this.statusresetter = new System.Windows.Forms.Timer(this.components); + this.menustrip = new System.Windows.Forms.MenuStrip(); + this.filemenuitem = new System.Windows.Forms.ToolStripMenuItem(); + this.menunew = new System.Windows.Forms.ToolStripMenuItem(); + this.menuopen = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.menusave = new System.Windows.Forms.ToolStripMenuItem(); + this.menusaveall = new System.Windows.Forms.ToolStripMenuItem(); + this.editmenuitem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuundo = new System.Windows.Forms.ToolStripMenuItem(); + this.menuredo = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.menucut = new System.Windows.Forms.ToolStripMenuItem(); + this.menucopy = new System.Windows.Forms.ToolStripMenuItem(); + this.menupaste = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.menusnippets = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.menuindent = new System.Windows.Forms.ToolStripMenuItem(); + this.menuunindent = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.menugotoline = new System.Windows.Forms.ToolStripMenuItem(); + this.menuduplicateline = new System.Windows.Forms.ToolStripMenuItem(); + this.viewmenuitem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuwhitespace = new System.Windows.Forms.ToolStripMenuItem(); + this.menuwordwrap = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.menustayontop = new System.Windows.Forms.ToolStripMenuItem(); + this.searchmenuitem = new System.Windows.Forms.ToolStripMenuItem(); + this.menufind = new System.Windows.Forms.ToolStripMenuItem(); + this.menufindnext = new System.Windows.Forms.ToolStripMenuItem(); + this.menufindprevious = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsmenu = new System.Windows.Forms.ToolStripMenuItem(); + this.menucompile = new System.Windows.Forms.ToolStripMenuItem(); + this.scripticons = new System.Windows.Forms.ImageList(this.components); + this.projecticons = new System.Windows.Forms.ImageList(this.components); + this.mainsplitter = new CodeImp.DoomBuilder.Controls.CollapsibleSplitContainer(); + this.projecttabs = new System.Windows.Forms.TabControl(); + this.tabresources = new System.Windows.Forms.TabPage(); + this.scriptresources = new CodeImp.DoomBuilder.Controls.ScriptResourcesControl(); + this.splitter = new System.Windows.Forms.SplitContainer(); + this.tabs = new CodeImp.DoomBuilder.Controls.VSTabControl(); + this.label1 = new System.Windows.Forms.Label(); + this.errorlist = new System.Windows.Forms.ListView(); + this.colIndex = new System.Windows.Forms.ColumnHeader(); + this.colDescription = new System.Windows.Forms.ColumnHeader(); + this.colFile = new System.Windows.Forms.ColumnHeader(); this.toolbar.SuspendLayout(); + this.statusbar.SuspendLayout(); + this.menustrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.mainsplitter)).BeginInit(); + this.mainsplitter.Panel1.SuspendLayout(); + this.mainsplitter.Panel2.SuspendLayout(); + this.mainsplitter.SuspendLayout(); + this.projecttabs.SuspendLayout(); + this.tabresources.SuspendLayout(); this.splitter.Panel1.SuspendLayout(); this.splitter.Panel2.SuspendLayout(); this.splitter.SuspendLayout(); - this.statusbar.SuspendLayout(); this.SuspendLayout(); // - // tabs - // - this.tabs.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.tabs.Location = new System.Drawing.Point(3, 8); - this.tabs.Margin = new System.Windows.Forms.Padding(3, 8, 3, 3); - this.tabs.Name = "tabs"; - this.tabs.Padding = new System.Drawing.Point(12, 3); - this.tabs.SelectedIndex = 0; - this.tabs.Size = new System.Drawing.Size(794, 379); - this.tabs.TabIndex = 0; - this.tabs.TabStop = false; - this.tabs.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabs_Selecting); - this.tabs.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tabs_MouseUp); - // // toolbar // this.toolbar.AllowMerge = false; @@ -107,6 +137,7 @@ namespace CodeImp.DoomBuilder.Controls this.toolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.buttonnew, this.buttonopen, + this.toolStripSeparator7, this.buttonsave, this.buttonsaveall, this.toolStripSeparator1, @@ -126,7 +157,6 @@ namespace CodeImp.DoomBuilder.Controls this.toolStripSeparator4, this.buttonscriptconfig, this.buttoncompile, - this.buttonclose, this.buttonkeywordhelp, this.buttonsearch, this.toolStripSeparator5, @@ -135,17 +165,17 @@ namespace CodeImp.DoomBuilder.Controls this.searchnext, this.searchmatchcase, this.searchwholeword}); - this.toolbar.Location = new System.Drawing.Point(0, 0); + this.toolbar.Location = new System.Drawing.Point(0, 24); this.toolbar.Name = "toolbar"; - this.toolbar.Size = new System.Drawing.Size(800, 25); + this.toolbar.Size = new System.Drawing.Size(928, 25); this.toolbar.TabIndex = 1; // // buttonnew // this.buttonnew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.buttonnew.Image = global::CodeImp.DoomBuilder.Properties.Resources.NewScript; + this.buttonnew.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScriptNew; this.buttonnew.ImageTransparentColor = System.Drawing.Color.Magenta; - this.buttonnew.Margin = new System.Windows.Forms.Padding(6, 1, 0, 2); + this.buttonnew.Margin = new System.Windows.Forms.Padding(7, 1, 0, 2); this.buttonnew.Name = "buttonnew"; this.buttonnew.Size = new System.Drawing.Size(29, 22); this.buttonnew.Text = "New File"; @@ -153,19 +183,24 @@ namespace CodeImp.DoomBuilder.Controls // buttonopen // this.buttonopen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.buttonopen.Image = global::CodeImp.DoomBuilder.Properties.Resources.OpenScript; + this.buttonopen.Image = global::CodeImp.DoomBuilder.Properties.Resources.OpenMap; this.buttonopen.ImageTransparentColor = System.Drawing.Color.Magenta; - this.buttonopen.Margin = new System.Windows.Forms.Padding(3, 1, 0, 2); this.buttonopen.Name = "buttonopen"; this.buttonopen.Size = new System.Drawing.Size(23, 22); this.buttonopen.Text = "Open File"; this.buttonopen.Click += new System.EventHandler(this.buttonopen_Click); // + // toolStripSeparator7 + // + this.toolStripSeparator7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25); + // // buttonsave // this.buttonsave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.buttonsave.Enabled = false; - this.buttonsave.Image = global::CodeImp.DoomBuilder.Properties.Resources.SaveScript; + this.buttonsave.Image = global::CodeImp.DoomBuilder.Properties.Resources.SaveMap; this.buttonsave.ImageTransparentColor = System.Drawing.Color.Magenta; this.buttonsave.Name = "buttonsave"; this.buttonsave.Size = new System.Drawing.Size(23, 22); @@ -330,23 +365,11 @@ namespace CodeImp.DoomBuilder.Controls this.buttoncompile.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.buttoncompile.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScriptCompile; this.buttoncompile.ImageTransparentColor = System.Drawing.Color.Magenta; - this.buttoncompile.Margin = new System.Windows.Forms.Padding(3, 1, 0, 2); this.buttoncompile.Name = "buttoncompile"; this.buttoncompile.Size = new System.Drawing.Size(23, 22); this.buttoncompile.Text = "Compile Script"; this.buttoncompile.Click += new System.EventHandler(this.buttoncompile_Click); // - // buttonclose - // - this.buttonclose.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.buttonclose.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.buttonclose.Image = global::CodeImp.DoomBuilder.Properties.Resources.Close; - this.buttonclose.ImageTransparentColor = System.Drawing.Color.Magenta; - this.buttonclose.Name = "buttonclose"; - this.buttonclose.Size = new System.Drawing.Size(23, 22); - this.buttonclose.Text = "Close File"; - this.buttonclose.Click += new System.EventHandler(this.buttonclose_Click); - // // buttonkeywordhelp // this.buttonkeywordhelp.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; @@ -435,12 +458,484 @@ namespace CodeImp.DoomBuilder.Controls // this.savefile.Title = "Save Script As"; // + // errorimages + // + this.errorimages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("errorimages.ImageStream"))); + this.errorimages.TransparentColor = System.Drawing.Color.Transparent; + this.errorimages.Images.SetKeyName(0, "ScriptError3.png"); + // + // statusbar + // + this.statusbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statuslabel, + this.positionlabel, + this.scripttype}); + this.statusbar.Location = new System.Drawing.Point(0, 498); + this.statusbar.Name = "statusbar"; + this.statusbar.Size = new System.Drawing.Size(928, 22); + this.statusbar.TabIndex = 3; + this.statusbar.Text = "statusStrip1"; + // + // statuslabel + // + this.statuslabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.statuslabel.Image = global::CodeImp.DoomBuilder.Properties.Resources.Status0; + this.statuslabel.Margin = new System.Windows.Forms.Padding(3, 3, 0, 2); + this.statuslabel.Name = "statuslabel"; + this.statuslabel.Size = new System.Drawing.Size(60, 17); + this.statuslabel.Text = "Ready."; + // + // positionlabel + // + this.positionlabel.Name = "positionlabel"; + this.positionlabel.Size = new System.Drawing.Size(762, 17); + this.positionlabel.Spring = true; + this.positionlabel.Text = "100 : 12 (120)"; + this.positionlabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // scripttype + // + this.scripttype.Margin = new System.Windows.Forms.Padding(30, 3, 0, 2); + this.scripttype.Name = "scripttype"; + this.scripttype.Size = new System.Drawing.Size(58, 17); + this.scripttype.Text = "Plain Text"; + this.scripttype.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // statusflasher + // + this.statusflasher.Tick += new System.EventHandler(this.statusflasher_Tick); + // + // statusresetter + // + this.statusresetter.Tick += new System.EventHandler(this.statusresetter_Tick); + // + // menustrip + // + this.menustrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.filemenuitem, + this.editmenuitem, + this.viewmenuitem, + this.searchmenuitem, + this.toolsmenu}); + this.menustrip.Location = new System.Drawing.Point(0, 0); + this.menustrip.Name = "menustrip"; + this.menustrip.Size = new System.Drawing.Size(928, 24); + this.menustrip.TabIndex = 4; + this.menustrip.Text = "menuStrip1"; + // + // filemenuitem + // + this.filemenuitem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menunew, + this.menuopen, + this.toolStripSeparator13, + this.menusave, + this.menusaveall}); + this.filemenuitem.Name = "filemenuitem"; + this.filemenuitem.Size = new System.Drawing.Size(37, 20); + this.filemenuitem.Text = "File"; + this.filemenuitem.DropDownOpening += new System.EventHandler(this.filemenuitem_DropDownOpening); + // + // menunew + // + this.menunew.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScriptNew; + this.menunew.Name = "menunew"; + this.menunew.Size = new System.Drawing.Size(185, 22); + this.menunew.Text = "New"; + // + // menuopen + // + this.menuopen.Image = global::CodeImp.DoomBuilder.Properties.Resources.OpenMap; + this.menuopen.Name = "menuopen"; + this.menuopen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.menuopen.Size = new System.Drawing.Size(185, 22); + this.menuopen.Text = "Open..."; + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(182, 6); + // + // menusave + // + this.menusave.Image = global::CodeImp.DoomBuilder.Properties.Resources.SaveMap; + this.menusave.Name = "menusave"; + this.menusave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.menusave.Size = new System.Drawing.Size(185, 22); + this.menusave.Text = "Save"; + this.menusave.Click += new System.EventHandler(this.buttonsave_Click); + // + // menusaveall + // + this.menusaveall.Image = global::CodeImp.DoomBuilder.Properties.Resources.SaveAll; + this.menusaveall.Name = "menusaveall"; + this.menusaveall.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.menusaveall.Size = new System.Drawing.Size(185, 22); + this.menusaveall.Text = "Save all"; + this.menusaveall.Click += new System.EventHandler(this.buttonsaveall_Click); + // + // editmenuitem + // + this.editmenuitem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuundo, + this.menuredo, + this.toolStripSeparator10, + this.menucut, + this.menucopy, + this.menupaste, + this.toolStripSeparator9, + this.menusnippets, + this.toolStripSeparator12, + this.menuindent, + this.menuunindent, + this.toolStripSeparator14, + this.menugotoline, + this.menuduplicateline}); + this.editmenuitem.Name = "editmenuitem"; + this.editmenuitem.Size = new System.Drawing.Size(39, 20); + this.editmenuitem.Text = "Edit"; + this.editmenuitem.DropDownOpening += new System.EventHandler(this.editmenuitem_DropDownOpening); + // + // menuundo + // + this.menuundo.Image = global::CodeImp.DoomBuilder.Properties.Resources.Undo; + this.menuundo.Name = "menuundo"; + this.menuundo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.menuundo.Size = new System.Drawing.Size(188, 22); + this.menuundo.Text = "Undo"; + this.menuundo.Click += new System.EventHandler(this.buttonundo_Click); + // + // menuredo + // + this.menuredo.Image = global::CodeImp.DoomBuilder.Properties.Resources.Redo; + this.menuredo.Name = "menuredo"; + this.menuredo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.menuredo.Size = new System.Drawing.Size(188, 22); + this.menuredo.Text = "Redo"; + this.menuredo.Click += new System.EventHandler(this.buttonredo_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(185, 6); + // + // menucut + // + this.menucut.Image = global::CodeImp.DoomBuilder.Properties.Resources.Cut; + this.menucut.Name = "menucut"; + this.menucut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.menucut.Size = new System.Drawing.Size(188, 22); + this.menucut.Text = "Cut"; + this.menucut.Click += new System.EventHandler(this.buttoncut_Click); + // + // menucopy + // + this.menucopy.Image = global::CodeImp.DoomBuilder.Properties.Resources.Copy; + this.menucopy.Name = "menucopy"; + this.menucopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.menucopy.Size = new System.Drawing.Size(188, 22); + this.menucopy.Text = "Copy"; + this.menucopy.Click += new System.EventHandler(this.buttoncopy_Click); + // + // menupaste + // + this.menupaste.Image = global::CodeImp.DoomBuilder.Properties.Resources.Paste; + this.menupaste.Name = "menupaste"; + this.menupaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.menupaste.Size = new System.Drawing.Size(188, 22); + this.menupaste.Text = "Paste"; + this.menupaste.Click += new System.EventHandler(this.buttonpaste_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(185, 6); + // + // menusnippets + // + this.menusnippets.Image = global::CodeImp.DoomBuilder.Properties.Resources.PuzzlePiece; + this.menusnippets.Name = "menusnippets"; + this.menusnippets.Size = new System.Drawing.Size(188, 22); + this.menusnippets.Text = "Insert snippet"; + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(185, 6); + // + // menuindent + // + this.menuindent.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextIndent; + this.menuindent.Name = "menuindent"; + this.menuindent.Size = new System.Drawing.Size(188, 22); + this.menuindent.Text = "Increase indentation"; + this.menuindent.Click += new System.EventHandler(this.buttonindent_Click); + // + // menuunindent + // + this.menuunindent.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextUnindent; + this.menuunindent.Name = "menuunindent"; + this.menuunindent.Size = new System.Drawing.Size(188, 22); + this.menuunindent.Text = "Decrease indentation"; + this.menuunindent.Click += new System.EventHandler(this.buttonunindent_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(185, 6); + // + // menugotoline + // + this.menugotoline.Name = "menugotoline"; + this.menugotoline.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); + this.menugotoline.Size = new System.Drawing.Size(188, 22); + this.menugotoline.Text = "Go to line..."; + this.menugotoline.Click += new System.EventHandler(this.menugotoline_Click); + // + // menuduplicateline + // + this.menuduplicateline.Name = "menuduplicateline"; + this.menuduplicateline.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); + this.menuduplicateline.Size = new System.Drawing.Size(188, 22); + this.menuduplicateline.Text = "Duplicate line"; + this.menuduplicateline.Click += new System.EventHandler(this.menuduplicateline_Click); + // + // viewmenuitem + // + this.viewmenuitem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuwhitespace, + this.menuwordwrap, + this.toolStripSeparator11, + this.menustayontop}); + this.viewmenuitem.Name = "viewmenuitem"; + this.viewmenuitem.Size = new System.Drawing.Size(44, 20); + this.viewmenuitem.Text = "View"; + // + // menuwhitespace + // + this.menuwhitespace.CheckOnClick = true; + this.menuwhitespace.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextWhitespace; + this.menuwhitespace.Name = "menuwhitespace"; + this.menuwhitespace.Size = new System.Drawing.Size(165, 22); + this.menuwhitespace.Text = "Show whitespace"; + this.menuwhitespace.Click += new System.EventHandler(this.buttonwhitespace_Click); + // + // menuwordwrap + // + this.menuwordwrap.CheckOnClick = true; + this.menuwordwrap.Image = global::CodeImp.DoomBuilder.Properties.Resources.WordWrap; + this.menuwordwrap.Name = "menuwordwrap"; + this.menuwordwrap.Size = new System.Drawing.Size(165, 22); + this.menuwordwrap.Text = "Show word wrap"; + this.menuwordwrap.Click += new System.EventHandler(this.buttonwordwrap_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(162, 6); + // + // menustayontop + // + this.menustayontop.CheckOnClick = true; + this.menustayontop.Image = global::CodeImp.DoomBuilder.Properties.Resources.Pin; + this.menustayontop.Name = "menustayontop"; + this.menustayontop.Size = new System.Drawing.Size(165, 22); + this.menustayontop.Text = "Always on top"; + this.menustayontop.Click += new System.EventHandler(this.menustayontop_Click); + // + // searchmenuitem + // + this.searchmenuitem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menufind, + this.menufindnext, + this.menufindprevious}); + this.searchmenuitem.Name = "searchmenuitem"; + this.searchmenuitem.Size = new System.Drawing.Size(54, 20); + this.searchmenuitem.Text = "Search"; + this.searchmenuitem.DropDownOpening += new System.EventHandler(this.searchmenuitem_DropDownOpening); + // + // menufind + // + this.menufind.Image = global::CodeImp.DoomBuilder.Properties.Resources.Search; + this.menufind.Name = "menufind"; + this.menufind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); + this.menufind.Size = new System.Drawing.Size(164, 22); + this.menufind.Text = "Find..."; + this.menufind.Click += new System.EventHandler(this.buttonsearch_Click); + // + // menufindnext + // + this.menufindnext.Image = global::CodeImp.DoomBuilder.Properties.Resources.SearchNext; + this.menufindnext.Name = "menufindnext"; + this.menufindnext.ShortcutKeys = System.Windows.Forms.Keys.F3; + this.menufindnext.Size = new System.Drawing.Size(164, 22); + this.menufindnext.Text = "Find next"; + this.menufindnext.Click += new System.EventHandler(this.searchnext_Click); + // + // menufindprevious + // + this.menufindprevious.Image = global::CodeImp.DoomBuilder.Properties.Resources.SearchPrev; + this.menufindprevious.Name = "menufindprevious"; + this.menufindprevious.ShortcutKeys = System.Windows.Forms.Keys.F2; + this.menufindprevious.Size = new System.Drawing.Size(164, 22); + this.menufindprevious.Text = "Find previous"; + this.menufindprevious.Click += new System.EventHandler(this.searchprev_Click); + // + // toolsmenu + // + this.toolsmenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menucompile}); + this.toolsmenu.Name = "toolsmenu"; + this.toolsmenu.Size = new System.Drawing.Size(48, 20); + this.toolsmenu.Text = "Tools"; + this.toolsmenu.DropDownOpening += new System.EventHandler(this.toolsmenu_DropDownOpening); + // + // menucompile + // + this.menucompile.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScriptCompile; + this.menucompile.Name = "menucompile"; + this.menucompile.ShortcutKeys = System.Windows.Forms.Keys.F5; + this.menucompile.Size = new System.Drawing.Size(138, 22); + this.menucompile.Text = "Compile"; + this.menucompile.Click += new System.EventHandler(this.buttoncompile_Click); + // + // scripticons + // + this.scripticons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("scripticons.ImageStream"))); + this.scripticons.TransparentColor = System.Drawing.Color.Transparent; + this.scripticons.Images.SetKeyName(0, "File.ico"); + this.scripticons.Images.SetKeyName(1, "GroupUnknown.png"); + this.scripticons.Images.SetKeyName(2, "PK3.ico"); + this.scripticons.Images.SetKeyName(3, "ResourceMAP.png"); + this.scripticons.Images.SetKeyName(4, "Script.png"); + this.scripticons.Images.SetKeyName(5, "ScriptACS.png"); + this.scripticons.Images.SetKeyName(6, "ScriptMODELDEF.png"); + this.scripticons.Images.SetKeyName(7, "ScriptDECORATE.png"); + this.scripticons.Images.SetKeyName(8, "ScriptGLDEFS.png"); + this.scripticons.Images.SetKeyName(9, "ScriptSNDSEQ.png"); + this.scripticons.Images.SetKeyName(10, "ScriptMAPINFO.png"); + this.scripticons.Images.SetKeyName(11, "ScriptVOXELDEF.png"); + this.scripticons.Images.SetKeyName(12, "ScriptTEXTURES.png"); + this.scripticons.Images.SetKeyName(13, "ScriptANIMDEFS.png"); + this.scripticons.Images.SetKeyName(14, "ScriptREVERBS.png"); + this.scripticons.Images.SetKeyName(15, "ScriptTERRAIN.png"); + this.scripticons.Images.SetKeyName(16, "ScriptX11.png"); + this.scripticons.Images.SetKeyName(17, "ScriptCVARINFO.png"); + this.scripticons.Images.SetKeyName(18, "ScriptSNDINFO.png"); + this.scripticons.Images.SetKeyName(19, "ScriptLOCKDEFS.png"); + this.scripticons.Images.SetKeyName(20, "ScriptMENUDEF.png"); + this.scripticons.Images.SetKeyName(21, "ScriptSBARINFO.png"); + this.scripticons.Images.SetKeyName(22, "ScriptUSDF.png"); + this.scripticons.Images.SetKeyName(23, "GroupUnknown.png"); + this.scripticons.Images.SetKeyName(24, "GroupACS.png"); + this.scripticons.Images.SetKeyName(25, "GroupMODELDEF.png"); + this.scripticons.Images.SetKeyName(26, "GroupDECORATE.png"); + this.scripticons.Images.SetKeyName(27, "GroupGLDEFS.png"); + this.scripticons.Images.SetKeyName(28, "GroupSNDSEQ.png"); + this.scripticons.Images.SetKeyName(29, "GroupMAPINFO.png"); + this.scripticons.Images.SetKeyName(30, "GroupVOXELDEF.png"); + this.scripticons.Images.SetKeyName(31, "GroupTEXTURES.png"); + this.scripticons.Images.SetKeyName(32, "GroupANIMDEFS.png"); + this.scripticons.Images.SetKeyName(33, "GroupREVERBS.png"); + this.scripticons.Images.SetKeyName(34, "GroupTERRAIN.png"); + this.scripticons.Images.SetKeyName(35, "GroupX11.png"); + this.scripticons.Images.SetKeyName(36, "GroupCVARINFO.png"); + this.scripticons.Images.SetKeyName(37, "GroupSNDINFO.png"); + this.scripticons.Images.SetKeyName(38, "GroupLOCKDEFS.png"); + this.scripticons.Images.SetKeyName(39, "GroupMENUDEF.png"); + this.scripticons.Images.SetKeyName(40, "GroupSBARINFO.png"); + this.scripticons.Images.SetKeyName(41, "GroupUSDF.png"); + this.scripticons.Images.SetKeyName(42, "GroupOpen.png"); + this.scripticons.Images.SetKeyName(43, "OpenGroupACS.png"); + this.scripticons.Images.SetKeyName(44, "OpenGroupMODELDEF.png"); + this.scripticons.Images.SetKeyName(45, "OpenGroupDECORATE.png"); + this.scripticons.Images.SetKeyName(46, "OpenGroupGLDEFS.png"); + this.scripticons.Images.SetKeyName(47, "OpenGroupSNDSEQ.png"); + this.scripticons.Images.SetKeyName(48, "OpenGroupMAPINFO.png"); + this.scripticons.Images.SetKeyName(49, "OpenGroupVOXELDEF.png"); + this.scripticons.Images.SetKeyName(50, "OpenGroupTEXTURES.png"); + this.scripticons.Images.SetKeyName(51, "OpenGroupANIMDEFS.png"); + this.scripticons.Images.SetKeyName(52, "OpenGroupREVERBS.png"); + this.scripticons.Images.SetKeyName(53, "OpenGroupTERRAIN.png"); + this.scripticons.Images.SetKeyName(54, "OpenGroupX11.png"); + this.scripticons.Images.SetKeyName(55, "OpenGroupCVARINFO.png"); + this.scripticons.Images.SetKeyName(56, "OpenGroupSNDINFO.png"); + this.scripticons.Images.SetKeyName(57, "OpenGroupLOCKDEFS.png"); + this.scripticons.Images.SetKeyName(58, "OpenGroupMENUDEF.png"); + this.scripticons.Images.SetKeyName(59, "OpenGroupSBARINFO.png"); + this.scripticons.Images.SetKeyName(60, "OpenGroupUSDF.png"); + // + // projecticons + // + this.projecticons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("projecticons.ImageStream"))); + this.projecticons.TransparentColor = System.Drawing.Color.Transparent; + this.projecticons.Images.SetKeyName(0, "Resources.png"); + // + // mainsplitter + // + this.mainsplitter.Cursor = System.Windows.Forms.Cursors.Default; + this.mainsplitter.Dock = System.Windows.Forms.DockStyle.Fill; + this.mainsplitter.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.mainsplitter.Location = new System.Drawing.Point(0, 49); + this.mainsplitter.Name = "mainsplitter"; + // + // mainsplitter.Panel1 + // + this.mainsplitter.Panel1.Controls.Add(this.projecttabs); + this.mainsplitter.Panel1.Padding = new System.Windows.Forms.Padding(3, 3, 0, 0); + this.mainsplitter.Panel1MinSize = 180; + // + // mainsplitter.Panel2 + // + this.mainsplitter.Panel2.Controls.Add(this.splitter); + this.mainsplitter.Panel2.Padding = new System.Windows.Forms.Padding(0, 3, 3, 1); + this.mainsplitter.Size = new System.Drawing.Size(928, 449); + this.mainsplitter.SplitterDistance = 200; + this.mainsplitter.SplitterWidth = 8; + this.mainsplitter.TabIndex = 1; + // + // projecttabs + // + this.projecttabs.Controls.Add(this.tabresources); + this.projecttabs.Dock = System.Windows.Forms.DockStyle.Fill; + this.projecttabs.ImageList = this.projecticons; + this.projecttabs.Location = new System.Drawing.Point(3, 3); + this.projecttabs.Name = "projecttabs"; + this.projecttabs.Padding = new System.Drawing.Point(3, 3); + this.projecttabs.SelectedIndex = 0; + this.projecttabs.Size = new System.Drawing.Size(197, 446); + this.projecttabs.TabIndex = 0; + // + // tabresources + // + this.tabresources.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.tabresources.Controls.Add(this.scriptresources); + this.tabresources.ImageIndex = 0; + this.tabresources.Location = new System.Drawing.Point(4, 23); + this.tabresources.Name = "tabresources"; + this.tabresources.Padding = new System.Windows.Forms.Padding(3); + this.tabresources.Size = new System.Drawing.Size(189, 419); + this.tabresources.TabIndex = 0; + this.tabresources.Text = " Resources "; + this.tabresources.UseVisualStyleBackColor = true; + // + // scriptresources + // + this.scriptresources.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.scriptresources.Dock = System.Windows.Forms.DockStyle.Fill; + this.scriptresources.Location = new System.Drawing.Point(3, 3); + this.scriptresources.Margin = new System.Windows.Forms.Padding(0); + this.scriptresources.Name = "scriptresources"; + this.scriptresources.Size = new System.Drawing.Size(183, 413); + this.scriptresources.TabIndex = 0; + // // splitter // this.splitter.Dock = System.Windows.Forms.DockStyle.Fill; this.splitter.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; this.splitter.IsSplitterFixed = true; - this.splitter.Location = new System.Drawing.Point(0, 25); + this.splitter.Location = new System.Drawing.Point(0, 3); this.splitter.Name = "splitter"; this.splitter.Orientation = System.Windows.Forms.Orientation.Horizontal; // @@ -452,11 +947,35 @@ namespace CodeImp.DoomBuilder.Controls // this.splitter.Panel2.Controls.Add(this.label1); this.splitter.Panel2.Controls.Add(this.errorlist); - this.splitter.Size = new System.Drawing.Size(800, 516); - this.splitter.SplitterDistance = 390; + this.splitter.Size = new System.Drawing.Size(717, 445); + this.splitter.SplitterDistance = 319; this.splitter.TabIndex = 2; this.splitter.TabStop = false; // + // tabs + // + this.tabs.ActiveColor = System.Drawing.SystemColors.HotTrack; + this.tabs.AllowDrop = true; + this.tabs.BackTabColor = System.Drawing.SystemColors.Control; + this.tabs.BorderColor = System.Drawing.SystemColors.ControlDark; + this.tabs.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabs.HighlightColor = System.Drawing.SystemColors.Highlight; + this.tabs.ItemSize = new System.Drawing.Size(240, 22); + this.tabs.Location = new System.Drawing.Point(0, 0); + this.tabs.Name = "tabs"; + this.tabs.Padding = new System.Drawing.Point(12, 3); + this.tabs.SelectedIndex = 0; + this.tabs.SelectedTextColor = System.Drawing.SystemColors.HighlightText; + this.tabs.ShowClosingButton = true; + this.tabs.ShowToolTips = true; + this.tabs.Size = new System.Drawing.Size(717, 319); + this.tabs.TabIndex = 0; + this.tabs.TabStop = false; + this.tabs.TextColor = System.Drawing.SystemColors.WindowText; + this.tabs.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabs_Selecting); + this.tabs.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tabs_MouseUp); + this.tabs.OnCloseTabClicked += new System.EventHandler<System.Windows.Forms.TabControlEventArgs>(this.tabs_OnCloseTabClicked); + // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -467,7 +986,7 @@ namespace CodeImp.DoomBuilder.Controls this.label1.Location = new System.Drawing.Point(3, 0); this.label1.Name = "label1"; this.label1.Padding = new System.Windows.Forms.Padding(1); - this.label1.Size = new System.Drawing.Size(794, 16); + this.label1.Size = new System.Drawing.Size(711, 16); this.label1.TabIndex = 1; this.label1.Text = "Errors"; // @@ -488,7 +1007,7 @@ namespace CodeImp.DoomBuilder.Controls this.errorlist.MultiSelect = false; this.errorlist.Name = "errorlist"; this.errorlist.ShowGroups = false; - this.errorlist.Size = new System.Drawing.Size(794, 100); + this.errorlist.Size = new System.Drawing.Size(711, 100); this.errorlist.SmallImageList = this.errorimages; this.errorlist.TabIndex = 0; this.errorlist.TabStop = false; @@ -511,74 +1030,32 @@ namespace CodeImp.DoomBuilder.Controls this.colFile.Text = "File"; this.colFile.Width = 150; // - // errorimages - // - this.errorimages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("errorimages.ImageStream"))); - this.errorimages.TransparentColor = System.Drawing.Color.Transparent; - this.errorimages.Images.SetKeyName(0, "ScriptError3.png"); - // - // statusbar - // - this.statusbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.statuslabel, - this.positionlabel, - this.scripttype}); - this.statusbar.Location = new System.Drawing.Point(0, 541); - this.statusbar.Name = "statusbar"; - this.statusbar.Size = new System.Drawing.Size(800, 22); - this.statusbar.TabIndex = 3; - this.statusbar.Text = "statusStrip1"; - // - // statuslabel - // - this.statuslabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); - this.statuslabel.Image = global::CodeImp.DoomBuilder.Properties.Resources.Status0; - this.statuslabel.Margin = new System.Windows.Forms.Padding(3, 3, 0, 2); - this.statuslabel.Name = "statuslabel"; - this.statuslabel.Size = new System.Drawing.Size(60, 17); - this.statuslabel.Text = "Ready."; - // - // positionlabel - // - this.positionlabel.Name = "positionlabel"; - this.positionlabel.Size = new System.Drawing.Size(634, 17); - this.positionlabel.Spring = true; - this.positionlabel.Text = "100 : 12 (120)"; - this.positionlabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // scripttype - // - this.scripttype.Margin = new System.Windows.Forms.Padding(30, 3, 0, 2); - this.scripttype.Name = "scripttype"; - this.scripttype.Size = new System.Drawing.Size(58, 17); - this.scripttype.Text = "Plain Text"; - this.scripttype.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // statusflasher - // - this.statusflasher.Tick += new System.EventHandler(this.statusflasher_Tick); - // - // statusresetter - // - this.statusresetter.Tick += new System.EventHandler(this.statusresetter_Tick); - // // ScriptEditorPanel // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.SystemColors.Control; - this.Controls.Add(this.splitter); + this.Controls.Add(this.mainsplitter); this.Controls.Add(this.statusbar); this.Controls.Add(this.toolbar); + this.Controls.Add(this.menustrip); this.Name = "ScriptEditorPanel"; - this.Size = new System.Drawing.Size(800, 563); + this.Size = new System.Drawing.Size(928, 520); this.toolbar.ResumeLayout(false); this.toolbar.PerformLayout(); + this.statusbar.ResumeLayout(false); + this.statusbar.PerformLayout(); + this.menustrip.ResumeLayout(false); + this.menustrip.PerformLayout(); + this.mainsplitter.Panel1.ResumeLayout(false); + this.mainsplitter.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.mainsplitter)).EndInit(); + this.mainsplitter.ResumeLayout(false); + this.projecttabs.ResumeLayout(false); + this.tabresources.ResumeLayout(false); this.splitter.Panel1.ResumeLayout(false); this.splitter.Panel2.ResumeLayout(false); this.splitter.ResumeLayout(false); - this.statusbar.ResumeLayout(false); - this.statusbar.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -586,7 +1063,7 @@ namespace CodeImp.DoomBuilder.Controls #endregion - private System.Windows.Forms.TabControl tabs; + private CodeImp.DoomBuilder.Controls.VSTabControl tabs; private System.Windows.Forms.ToolStrip toolbar; private System.Windows.Forms.ToolStripButton buttonopen; private System.Windows.Forms.ToolStripDropDownButton buttonnew; @@ -604,7 +1081,6 @@ namespace CodeImp.DoomBuilder.Controls private System.Windows.Forms.ToolStripButton buttonpaste; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripDropDownButton buttonscriptconfig; - private System.Windows.Forms.ToolStripButton buttonclose; private System.Windows.Forms.SplitContainer splitter; private System.Windows.Forms.ListView errorlist; private System.Windows.Forms.Label label1; @@ -633,5 +1109,45 @@ namespace CodeImp.DoomBuilder.Controls private System.Windows.Forms.ToolStripButton buttonindent; private System.Windows.Forms.ToolStripButton buttonwhitespace; private System.Windows.Forms.ToolStripButton buttonwordwrap; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.MenuStrip menustrip; + private System.Windows.Forms.ToolStripMenuItem filemenuitem; + private System.Windows.Forms.ToolStripMenuItem menusave; + private System.Windows.Forms.ToolStripMenuItem menusaveall; + private System.Windows.Forms.ToolStripMenuItem editmenuitem; + private System.Windows.Forms.ToolStripMenuItem menuundo; + private System.Windows.Forms.ToolStripMenuItem menuredo; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private System.Windows.Forms.ToolStripMenuItem menucut; + private System.Windows.Forms.ToolStripMenuItem menucopy; + private System.Windows.Forms.ToolStripMenuItem menupaste; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem menusnippets; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem menuindent; + private System.Windows.Forms.ToolStripMenuItem menuunindent; + private System.Windows.Forms.ToolStripMenuItem viewmenuitem; + private System.Windows.Forms.ToolStripMenuItem menuwhitespace; + private System.Windows.Forms.ToolStripMenuItem menuwordwrap; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.ToolStripMenuItem menustayontop; + private System.Windows.Forms.ToolStripMenuItem searchmenuitem; + private System.Windows.Forms.ToolStripMenuItem menufind; + private System.Windows.Forms.ToolStripMenuItem menufindnext; + private System.Windows.Forms.ToolStripMenuItem menufindprevious; + private System.Windows.Forms.ToolStripMenuItem toolsmenu; + private System.Windows.Forms.ToolStripMenuItem menucompile; + private CollapsibleSplitContainer mainsplitter; + private System.Windows.Forms.TabControl projecttabs; + private System.Windows.Forms.TabPage tabresources; + private ScriptResourcesControl scriptresources; + private System.Windows.Forms.ImageList scripticons; + private System.Windows.Forms.ImageList projecticons; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem menugotoline; + private System.Windows.Forms.ToolStripMenuItem menuopen; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private System.Windows.Forms.ToolStripMenuItem menuduplicateline; + private System.Windows.Forms.ToolStripMenuItem menunew; } } diff --git a/Source/Core/Controls/Scripting/ScriptEditorPanel.cs b/Source/Core/Controls/Scripting/ScriptEditorPanel.cs index 671595a1..9fac4780 100644 --- a/Source/Core/Controls/Scripting/ScriptEditorPanel.cs +++ b/Source/Core/Controls/Scripting/ScriptEditorPanel.cs @@ -23,6 +23,8 @@ using System.IO; using System.Windows.Forms; using CodeImp.DoomBuilder.Compilers; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Controls.Scripting; +using CodeImp.DoomBuilder.Data.Scripting; using CodeImp.DoomBuilder.Windows; using ScintillaNET; @@ -55,13 +57,25 @@ namespace CodeImp.DoomBuilder.Controls private ScriptStatusInfo status; private int statusflashcount; private bool statusflashicon; + + //mxd + private ScriptEditorForm parentform; + private ScriptIconsManager iconsmgr; + + //mxd. Text editor settings + private bool showwhitespace; + private bool wraplonglines; + private bool blockupdate; #endregion #region ================== Properties public ScriptDocumentTab ActiveTab { get { return (tabs.SelectedTab as ScriptDocumentTab); } } - + internal ScriptIconsManager Icons { get { return iconsmgr; } } + public bool ShowWhitespace { get { return showwhitespace; } } + public bool WrapLongLines { get { return wraplonglines; } } + #endregion #region ================== Constructor @@ -70,11 +84,15 @@ namespace CodeImp.DoomBuilder.Controls public ScriptEditorPanel() { InitializeComponent(); + iconsmgr = new ScriptIconsManager(scripticons); //mxd + tabs.ImageList = scripticons; //mxd } // This initializes the control - public void Initialize() + public void Initialize(ScriptEditorForm form) { + parentform = form; //mxd + // Make list of script configs scriptconfigs = new List<ScriptConfiguration>(General.ScriptConfigs.Values); scriptconfigs.Add(new ScriptConfiguration()); @@ -83,19 +101,28 @@ namespace CodeImp.DoomBuilder.Controls // Fill the list of new document types foreach(ScriptConfiguration cfg in scriptconfigs) { + Image icon = scripticons.Images[iconsmgr.GetScriptIcon(cfg.ScriptType)]; //mxd + // Button for new script menu ToolStripMenuItem item = new ToolStripMenuItem(cfg.Description); - //item.Image = buttonnew.Image; + item.Image = icon; //mxd item.Tag = cfg; item.Click += buttonnew_Click; buttonnew.DropDownItems.Add(item); // Button for script type menu item = new ToolStripMenuItem(cfg.Description); - //item.Image = buttonnew.Image; + item.Image = icon; //mxd item.Tag = cfg; item.Click += buttonscriptconfig_Click; buttonscriptconfig.DropDownItems.Add(item); + + //mxd. Button for the "New" menu item + item = new ToolStripMenuItem(cfg.Description); + item.Image = icon; //mxd + item.Tag = cfg; + item.Click += buttonnew_Click; + menunew.DropDownItems.Add(item); } // Setup supported extensions @@ -113,6 +140,9 @@ namespace CodeImp.DoomBuilder.Controls } } openfile.Filter = "Script files|" + filterall + "|" + filterseperate + "|All files|*.*"; + + //mxd. Initialize script resources control + scriptresources.Setup(this, General.Map.Data.ScriptResources); // Load the script lumps ScriptDocumentTab activetab = null; //mxd @@ -132,10 +162,10 @@ namespace CodeImp.DoomBuilder.Controls ScriptLumpDocumentTab t = new ScriptLumpDocumentTab(this, maplumpinfo.Name, config); //mxd. Apply stored settings? - if(General.Map.Options.ScriptLumpSettings.ContainsKey(maplumpinfo.Name)) + if(General.Map.Options.ScriptDocumentSettings.ContainsKey(maplumpinfo.Name)) { - t.SetViewSettings(General.Map.Options.ScriptLumpSettings[maplumpinfo.Name]); - if(General.Map.Options.ScriptLumpSettings[maplumpinfo.Name].IsActiveTab) + t.SetViewSettings(General.Map.Options.ScriptDocumentSettings[maplumpinfo.Name]); + if(General.Map.Options.ScriptDocumentSettings[maplumpinfo.Name].IsActiveTab) activetab = t; } else @@ -144,7 +174,7 @@ namespace CodeImp.DoomBuilder.Controls } t.OnTextChanged += tabpage_OnLumpTextChanged; //mxd - t.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd + t.Editor.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd tabs.TabPages.Add(t); } else if(maplumpinfo.Script != null) @@ -153,10 +183,10 @@ namespace CodeImp.DoomBuilder.Controls ScriptLumpDocumentTab t = new ScriptLumpDocumentTab(this, maplumpinfo.Name, maplumpinfo.Script); //mxd. Apply stored settings? - if(General.Map.Options.ScriptLumpSettings.ContainsKey(maplumpinfo.Name)) + if(General.Map.Options.ScriptDocumentSettings.ContainsKey(maplumpinfo.Name)) { - t.SetViewSettings(General.Map.Options.ScriptLumpSettings[maplumpinfo.Name]); - if(General.Map.Options.ScriptLumpSettings[maplumpinfo.Name].IsActiveTab) + t.SetViewSettings(General.Map.Options.ScriptDocumentSettings[maplumpinfo.Name]); + if(General.Map.Options.ScriptDocumentSettings[maplumpinfo.Name].IsActiveTab) activetab = t; } else @@ -165,21 +195,48 @@ namespace CodeImp.DoomBuilder.Controls } t.OnTextChanged += tabpage_OnLumpTextChanged; //mxd - t.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd + t.Editor.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd tabs.TabPages.Add(t); } } - // Load the files that were previously opened for this map - foreach(ScriptDocumentSettings settings in General.Map.Options.ScriptFileSettings.Values) + // Load files, which were previously opened for this map + foreach(ScriptDocumentSettings settings in General.Map.Options.ScriptDocumentSettings.Values) { - // Does this file exist? - if(File.Exists(settings.Filename)) + switch(settings.TabType) { - // Load this! - ScriptFileDocumentTab t = OpenFile(settings.Filename); - t.SetViewSettings(settings); //mxd - if(settings.IsActiveTab) activetab = t; + //TODO: load all tab types here... + case ScriptDocumentTabType.LUMP: continue; + + case ScriptDocumentTabType.FILE: + // Does this file exist? + if(File.Exists(settings.Filename)) + { + // Load this! + ScriptFileDocumentTab t = OpenFile(settings.Filename); + t.SetViewSettings(settings); //mxd + if(settings.IsActiveTab) activetab = t; + } + break; + + case ScriptDocumentTabType.RESOURCE: + // Find target resource... + if(!General.Map.Data.ScriptResources.ContainsKey(settings.ScriptType)) continue; + foreach(ScriptResource res in General.Map.Data.ScriptResources[settings.ScriptType]) + { + if(res.Resource.Location.location == settings.ResourceLocation) + { + // Load this! + ScriptResourceDocumentTab t = OpenResource(res); + t.SetViewSettings(settings); + if(settings.IsActiveTab) activetab = t; + break; + } + } + break; + + default: + throw new NotImplementedException("Unknown ScriptDocumentTabType!"); } } @@ -188,10 +245,19 @@ namespace CodeImp.DoomBuilder.Controls { tabs.SelectedTab = activetab; } - //mxd. Select "Scripts" tab, because that's what user will want 99% of time + //mxd. Select the "Scripts" tab, because that's what user will want 99% of time else if(tabs.TabPages.Count > 0) { - int scriptsindex = GetTabPageIndex("SCRIPTS"); + int scriptsindex = -1; + for(int i = 0; i < tabs.TabPages.Count; i++) + { + if(tabs.TabPages[i].Text == "SCRIPTS") + { + scriptsindex = i; + break; + } + } + tabs.SelectedIndex = (scriptsindex == -1 ? 0 : scriptsindex); activetab = tabs.TabPages[tabs.SelectedIndex] as ScriptDocumentTab; } @@ -214,18 +280,39 @@ namespace CodeImp.DoomBuilder.Controls } // Done - UpdateToolbar(true); + UpdateInterface(true); } // This applies user preferences public void ApplySettings() { + // Set Errors panel settings errorlist.Columns[0].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn0width", errorlist.Columns[0].Width); errorlist.Columns[1].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn1width", errorlist.Columns[1].Width); errorlist.Columns[2].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn2width", errorlist.Columns[2].Width); - buttonwhitespace.Checked = General.Settings.ReadSetting("scriptspanel.showwhitespace", false); //mxd - buttonwordwrap.Checked = General.Settings.ReadSetting("scriptspanel.wraplonglines", false); //mxd - ApplyTabSettings(); //mxd + + //mxd. Set splitter position and state + if(General.Settings.ReadSetting("scriptspanel.splittercollapsed", false)) + mainsplitter.IsCollapsed = true; + + int splitterdistance = General.Settings.ReadSetting("scriptspanel.splitterdistance", int.MinValue); + if(splitterdistance == int.MinValue) + { + splitterdistance = 200; + if(MainForm.DPIScaler.Width != 1.0f) + splitterdistance = (int)Math.Round(splitterdistance * MainForm.DPIScaler.Width); + } + mainsplitter.SplitPosition = splitterdistance; + + //mxd. Set text editor settings + showwhitespace = General.Settings.ReadSetting("scriptspanel.showwhitespace", false); + buttonwhitespace.Checked = showwhitespace; + menuwhitespace.Checked = showwhitespace; + wraplonglines = General.Settings.ReadSetting("scriptspanel.wraplonglines", false); + buttonwordwrap.Checked = wraplonglines; + menuwordwrap.Checked = wraplonglines; + menustayontop.Checked = General.Settings.ScriptOnTop; + ApplyTabSettings(); } // This saves user preferences @@ -233,8 +320,11 @@ namespace CodeImp.DoomBuilder.Controls { General.Settings.WriteSetting("scriptspanel.errorscolumn0width", errorlist.Columns[0].Width); General.Settings.WriteSetting("scriptspanel.errorscolumn1width", errorlist.Columns[1].Width); - General.Settings.WriteSetting("scriptspanel.showwhitespace", buttonwhitespace.Checked); //mxd - General.Settings.WriteSetting("scriptspanel.wraplonglines", buttonwordwrap.Checked); //mxd + General.Settings.WriteSetting("scriptspanel.errorscolumn2width", errorlist.Columns[2].Width); //mxd + General.Settings.WriteSetting("scriptspanel.splittercollapsed", mainsplitter.IsCollapsed); //mxd + General.Settings.WriteSetting("scriptspanel.splitterdistance", mainsplitter.SplitPosition); //mxd + General.Settings.WriteSetting("scriptspanel.showwhitespace", showwhitespace); //mxd + General.Settings.WriteSetting("scriptspanel.wraplonglines", wraplonglines); //mxd } //mxd @@ -250,6 +340,41 @@ namespace CodeImp.DoomBuilder.Controls } } } + + //mxd + internal void OnReloadResources() + { + // Re-initialize script resources control + scriptresources.Setup(this, General.Map.Data.ScriptResources); + + // Resource tabs may need re-linking... + foreach(var tp in tabs.TabPages) + { + var tab = (tp as ScriptResourceDocumentTab); + if(tab != null) tab.OnReloadResources(); + } + } + + //mxd. Handle heavy resource loss + internal void OnScriptResourceLost(ScriptResourceDocumentTab sourcetab) + { + // Resource was lost. Remove tab + if(!sourcetab.IsChanged) + { + tabs.TabPages.Remove(sourcetab); + } + // Resource was lost, but the tab contains unsaved changes. Replace it with ScriptFileDocumentTab + else + { + int tabindex = tabs.TabPages.IndexOf(sourcetab); + var newtab = new ScriptFileDocumentTab(sourcetab); + + tabs.SuspendLayout(); + tabs.TabPages.Remove(sourcetab); + tabs.TabPages.Insert(tabindex, newtab); + tabs.ResumeLayout(); + } + } #endregion @@ -302,7 +427,7 @@ namespace CodeImp.DoomBuilder.Controls // Replace if possible public void Replace(FindReplaceOptions options) { - if(!string.IsNullOrEmpty(findoptions.FindText) && (options.ReplaceWith != null) && (ActiveTab != null)) + if(!string.IsNullOrEmpty(findoptions.FindText) && options.ReplaceWith != null && ActiveTab != null && !ActiveTab.IsReadOnly) { if(string.Compare(ActiveTab.SelectedText, options.FindText, !options.CaseSensitive) == 0) { @@ -321,7 +446,7 @@ namespace CodeImp.DoomBuilder.Controls { int replacements = 0; findoptions = options; - if(!string.IsNullOrEmpty(findoptions.FindText) && (options.ReplaceWith != null) && (ActiveTab != null)) + if(!string.IsNullOrEmpty(findoptions.FindText) && options.ReplaceWith != null && ActiveTab != null && !ActiveTab.IsReadOnly) { int firstfindpos = -1; int lastpos = -1; @@ -389,6 +514,8 @@ namespace CodeImp.DoomBuilder.Controls try { + findreplaceform.CanReplace = !ActiveTab.IsReadOnly; //mxd + if(findreplaceform.Visible) findreplaceform.Focus(); else @@ -397,9 +524,18 @@ namespace CodeImp.DoomBuilder.Controls if(ActiveTab.SelectionEnd != ActiveTab.SelectionStart) findreplaceform.SetFindText(ActiveTab.SelectedText); } - catch(Exception) + catch { } // If we can't pop up the find/replace form right now, thats just too bad. + } + + //mxd + public void GoToLine() + { + if(ActiveTab == null) return; + + var form = new ScriptGoToLineForm { LineNumber = ActiveTab.Editor.Scintilla.CurrentLine }; + if(form.ShowDialog(this.parentform) == DialogResult.OK) { - // If we can't pop up the find/replace form right now, thats just too bad. + ActiveTab.MoveToLine(form.LineNumber - 1); } } @@ -489,20 +625,27 @@ namespace CodeImp.DoomBuilder.Controls // This writes all explicitly opened files to the configuration public void WriteOpenFilesToConfiguration() { - General.Map.Options.ScriptFileSettings.Clear(); //mxd - General.Map.Options.ScriptLumpSettings.Clear(); //mxd - + General.Map.Options.ScriptDocumentSettings.Clear(); //mxd foreach(ScriptDocumentTab t in tabs.TabPages) //mxd { - if(t.ExplicitSave) + if(t is ScriptFileDocumentTab) { - // Don't store tabs, which were never saved (this only happens when a new tab was created and no text was entered into it before closing the script editor) - if(!t.IsSaveAsRequired) - General.Map.Options.ScriptFileSettings[t.Filename] = t.GetViewSettings(); + // Don't store tabs, which were never saved (this only happens when a new tab was created and no text + // was entered into it before closing the script editor) + if(t.ExplicitSave && !t.IsSaveAsRequired) + { + var settings = t.GetViewSettings(); + General.Map.Options.ScriptDocumentSettings[settings.Filename] = settings; + } + } + else if(t is ScriptLumpDocumentTab || t is ScriptResourceDocumentTab) + { + var settings = t.GetViewSettings(); + General.Map.Options.ScriptDocumentSettings[settings.Filename] = settings; } else { - General.Map.Options.ScriptLumpSettings[t.Filename] = t.GetViewSettings(); + throw new NotImplementedException("Unknown ScriptDocumentTab type"); } } } @@ -579,11 +722,11 @@ namespace CodeImp.DoomBuilder.Controls if(!t.ExplicitSave) t.Save(); } - UpdateToolbar(false); + UpdateInterface(false); } // This updates the toolbar for the current status - private void UpdateToolbar(bool focuseditor) + private void UpdateInterface(bool focuseditor) { int numscriptsopen = tabs.TabPages.Count; int explicitsavescripts = 0; @@ -591,33 +734,53 @@ namespace CodeImp.DoomBuilder.Controls // Any explicit save scripts? foreach(ScriptDocumentTab dt in tabs.TabPages) - if(dt.ExplicitSave) explicitsavescripts++; + if(dt.ExplicitSave && !dt.IsReadOnly) explicitsavescripts++; // Get current script, if any are open - if(numscriptsopen > 0) - t = (tabs.SelectedTab as ScriptDocumentTab); + if(numscriptsopen > 0) t = (tabs.SelectedTab as ScriptDocumentTab); // Enable/disable buttons - buttonsave.Enabled = (t != null && t.ExplicitSave && t.IsChanged); + bool tabiseditable = (t != null && !t.IsReadOnly); //mxd + + buttonsave.Enabled = (tabiseditable && t.ExplicitSave && t.IsChanged); buttonsaveall.Enabled = (explicitsavescripts > 0); - buttoncompile.Enabled = (t != null && t.Config.Compiler != null); + buttoncompile.Enabled = (tabiseditable && t.Config.Compiler != null); buttonsearch.Enabled = (t != null); //mxd buttonkeywordhelp.Enabled = (t != null && !string.IsNullOrEmpty(t.Config.KeywordHelp)); - buttonscriptconfig.Enabled = (t != null && t.IsReconfigurable); - buttonundo.Enabled = (t != null && t.Scintilla.CanUndo); - buttonredo.Enabled = (t != null && t.Scintilla.CanRedo); - buttoncopy.Enabled = (t != null && t.Scintilla.SelectionStart < t.Scintilla.SelectionEnd); - buttoncut.Enabled = (t != null && t.Scintilla.SelectionStart < t.Scintilla.SelectionEnd); - buttonpaste.Enabled = (t != null && t.Scintilla.CanPaste); - buttonclose.Enabled = (t != null && t.IsClosable); - buttonsnippets.DropDownItems.Clear(); //mxd - buttonsnippets.Enabled = (t != null && t.Config.Snippets.Count > 0); //mxd - buttonindent.Enabled = (t != null); //mxd - buttonunindent.Enabled = (t != null && t.Scintilla.Lines[t.Scintilla.CurrentLine].Indentation > 0); //mxd - buttonwhitespace.Enabled = (t != null); //mxd - buttonwordwrap.Enabled = (t != null); //mxd - searchmatchcase.Enabled = (t != null); //mxd - searchwholeword.Enabled = (t != null); //mxd + buttonscriptconfig.Enabled = (tabiseditable && t.IsReconfigurable); + + // Undo/Redo + buttonundo.Enabled = (tabiseditable && t.Editor.Scintilla.CanUndo); + buttonredo.Enabled = (tabiseditable && t.Editor.Scintilla.CanRedo); + + // Cut/Copy/Paste + buttoncopy.Enabled = (t != null && t.Editor.Scintilla.SelectionStart < t.Editor.Scintilla.SelectionEnd); + buttoncut.Enabled = (tabiseditable && t.Editor.Scintilla.SelectionStart < t.Editor.Scintilla.SelectionEnd); + buttonpaste.Enabled = (tabiseditable && t.Editor.Scintilla.CanPaste); + + //mxd. Snippets + buttonsnippets.DropDownItems.Clear(); + menusnippets.DropDownItems.Clear(); + + bool havesnippets = (tabiseditable && t.Config.Snippets.Count > 0); + buttonsnippets.Enabled = havesnippets; + menusnippets.Enabled = havesnippets; + + //mxd. Indent/Unindent + buttonindent.Enabled = tabiseditable; + buttonunindent.Enabled = (tabiseditable && t.Editor.Scintilla.Lines[t.Editor.Scintilla.CurrentLine].Indentation > 0); + + //mxd. Whitespace + buttonwhitespace.Enabled = (t != null); + menuwhitespace.Enabled = (t != null); + + //mxd. Wordwrap + buttonwordwrap.Enabled = (t != null); + menuwordwrap.Enabled = (t != null); + + //mxd. Quick search options + searchmatchcase.Enabled = (t != null); + searchwholeword.Enabled = (t != null); if(t != null) { @@ -625,7 +788,7 @@ namespace CodeImp.DoomBuilder.Controls searchbox.Enabled = true; if(searchbox.Text.Length > 0) { - if(t.Scintilla.Text.IndexOf(searchbox.Text, searchmatchcase.Checked ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase) != -1) + if(t.Editor.Scintilla.Text.IndexOf(searchbox.Text, searchmatchcase.Checked ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase) != -1) { searchprev.Enabled = true; searchnext.Enabled = true; @@ -655,7 +818,13 @@ namespace CodeImp.DoomBuilder.Controls if(t.Config != null && t.Config.Snippets.Count > 0) { if(t.Config.Snippets.Count > 0) - foreach(string snippetname in t.Config.Snippets) buttonsnippets.DropDownItems.Add(snippetname).Click += OnInsertSnippetClick; + { + foreach(string snippetname in t.Config.Snippets) + { + buttonsnippets.DropDownItems.Add(snippetname).Click += OnInsertSnippetClick; + menusnippets.DropDownItems.Add(snippetname).Click += OnInsertSnippetClick; + } + } } // Focus to script editor @@ -673,22 +842,22 @@ namespace CodeImp.DoomBuilder.Controls scripttype.Text = ((t != null && t.Config != null) ? t.Config.Description : "Plain Text"); } - //mxd - private int GetTabPageIndex(string title) - { - if(tabs.TabPages.Count == 0) return -1; - - for(int i = 0; i < tabs.TabPages.Count; i++) - { - if(tabs.TabPages[i].Text == title) return i; - } - - return -1; - } - // This opens the given file, returns null when failed public ScriptFileDocumentTab OpenFile(string filename) { + //mxd. Check if we already have this file opened + foreach(var tab in tabs.TabPages) + { + if(!(tab is ScriptFileDocumentTab)) continue; + ScriptFileDocumentTab filetab = (ScriptFileDocumentTab)tab; + + if(filetab.Filename == filename) + { + tabs.SelectedTab = filetab; + return filetab; + } + } + ScriptConfiguration foundconfig = new ScriptConfiguration(); // Find the most suitable script configuration to use @@ -732,8 +901,8 @@ namespace CodeImp.DoomBuilder.Controls // Done t.OnTextChanged += tabpage_OnTextChanged; //mxd - t.Scintilla.UpdateUI += scintilla_OnUpdateUI; - UpdateToolbar(true); + t.Editor.Scintilla.UpdateUI += scintilla_OnUpdateUI; + UpdateInterface(true); return t; } @@ -741,6 +910,46 @@ namespace CodeImp.DoomBuilder.Controls return null; } + //mxd + internal ScriptResourceDocumentTab OpenResource(ScriptResource resource) + { + // Check if we already have this file opened + foreach(var tab in tabs.TabPages) + { + if(!(tab is ScriptResourceDocumentTab)) continue; + ScriptResourceDocumentTab restab = (ScriptResourceDocumentTab)tab; + + if(restab.Filename == resource.FilePathName) + { + tabs.SelectedTab = restab; + return restab; + } + } + + // Create new document + ScriptConfiguration config = General.GetScriptConfiguration(resource.ScriptType); + if(config == null || config.ScriptType != resource.ScriptType) + { + General.ErrorLogger.Add(ErrorType.Warning, "Incorrect or missing script configuration for \"" + resource.ScriptType + "\" script type. Using plain text configuration."); + config = new ScriptConfiguration(); + } + + var t = new ScriptResourceDocumentTab(this, resource, config); + + // Mark any errors this script may have + if(compilererrors != null) t.MarkScriptErrors(compilererrors); + + // Add to tabs + tabs.TabPages.Add(t); + tabs.SelectedTab = t; + + // Done + t.OnTextChanged += tabpage_OnTextChanged; + t.Editor.Scintilla.UpdateUI += scintilla_OnUpdateUI; + UpdateInterface(true); + return t; + } + // This saves the current open script public void ExplicitSaveCurrentTab() { @@ -891,7 +1100,7 @@ namespace CodeImp.DoomBuilder.Controls scripttype.Text = scriptconfig.Description; // Done - UpdateToolbar(true); + UpdateInterface(true); } // When new script is clicked @@ -906,7 +1115,7 @@ namespace CodeImp.DoomBuilder.Controls tabs.SelectedTab = t; // Done - UpdateToolbar(true); + UpdateInterface(true); } // Open script clicked @@ -931,21 +1140,15 @@ namespace CodeImp.DoomBuilder.Controls ScriptFileDocumentTab t = OpenFile(name); // Apply document settings - bool settingsfound = false; - foreach(ScriptDocumentSettings settings in General.Map.Options.ScriptFileSettings.Values) + if(General.Map.Options.ScriptDocumentSettings.ContainsKey(t.Filename)) { - // Does this file exist? - if(settings.Filename == t.Filename) - { - // Apply stored settings - t.SetViewSettings(settings); - settingsfound = true; - break; - } + t.SetViewSettings(General.Map.Options.ScriptDocumentSettings[t.Filename]); + } + else + { + // Apply default settings + t.SetDefaultViewSettings(); } - - // Apply default settings - if(!settingsfound) t.SetDefaultViewSettings(); } } @@ -968,7 +1171,7 @@ namespace CodeImp.DoomBuilder.Controls // Save the current script ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); SaveScript(t); - UpdateToolbar(true); + UpdateInterface(true); } // Save All clicked @@ -984,7 +1187,7 @@ namespace CodeImp.DoomBuilder.Controls } } - UpdateToolbar(true); + UpdateInterface(true); } // This is called by Save and Save All to save a script @@ -1001,6 +1204,10 @@ namespace CodeImp.DoomBuilder.Controls { // Save to new filename t.SaveAs(savefile.FileName); + + //mxd. Also compile if needed + if(t.Config.Compiler != null) t.Compile(); + return true; } @@ -1010,6 +1217,10 @@ namespace CodeImp.DoomBuilder.Controls // Save to same filename t.Save(); + + //mxd. Also compile if needed + if(t.Config.Compiler != null) t.Compile(); + return true; } @@ -1024,15 +1235,7 @@ namespace CodeImp.DoomBuilder.Controls ShowErrors(tab.UpdateNavigator(), true); } - UpdateToolbar(true); - } - - // This closes the current file - private void buttonclose_Click(object sender, EventArgs e) - { - ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); - CloseScript(t, false); - UpdateToolbar(true); + UpdateInterface(true); } // Compile Script clicked @@ -1075,7 +1278,7 @@ namespace CodeImp.DoomBuilder.Controls DisplayStatus(ScriptStatusType.Info, "Script \"" + t.Title + "\" compiled without errors."); Cursor.Current = Cursors.Default; - UpdateToolbar(true); + UpdateInterface(true); } // Undo clicked @@ -1083,7 +1286,7 @@ namespace CodeImp.DoomBuilder.Controls { ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); t.Undo(); - UpdateToolbar(true); + UpdateInterface(true); } // Redo clicked @@ -1091,7 +1294,7 @@ namespace CodeImp.DoomBuilder.Controls { ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); t.Redo(); - UpdateToolbar(true); + UpdateInterface(true); } // Cut clicked @@ -1099,7 +1302,7 @@ namespace CodeImp.DoomBuilder.Controls { ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); t.Cut(); - UpdateToolbar(true); + UpdateInterface(true); } // Copy clicked @@ -1107,7 +1310,7 @@ namespace CodeImp.DoomBuilder.Controls { ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); t.Copy(); - UpdateToolbar(true); + UpdateInterface(true); } // Paste clicked @@ -1115,7 +1318,7 @@ namespace CodeImp.DoomBuilder.Controls { ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab); t.Paste(); - UpdateToolbar(true); + UpdateInterface(true); } //mxd @@ -1135,12 +1338,28 @@ namespace CodeImp.DoomBuilder.Controls //mxd private void buttonwhitespace_Click(object sender, EventArgs e) { + if(blockupdate) return; + + blockupdate = true; + showwhitespace = !showwhitespace; + buttonwhitespace.Checked = showwhitespace; + menuwhitespace.Checked = showwhitespace; + blockupdate = false; + ApplyTabSettings(); } //mxd private void buttonwordwrap_Click(object sender, EventArgs e) { + if(blockupdate) return; + + blockupdate = true; + wraplonglines = !wraplonglines; + buttonwordwrap.Checked = wraplonglines; + menuwordwrap.Checked = wraplonglines; + blockupdate = false; + ApplyTabSettings(); } @@ -1150,6 +1369,25 @@ namespace CodeImp.DoomBuilder.Controls OpenFindAndReplace(); } + //mxd + private void menugotoline_Click(object sender, EventArgs e) + { + GoToLine(); + } + + //mxd + private void menuduplicateline_Click(object sender, EventArgs e) + { + if(ActiveTab != null) ActiveTab.Editor.DuplicateLine(); + } + + //mxd + private void menustayontop_Click(object sender, EventArgs e) + { + General.Settings.ScriptOnTop = menustayontop.Checked; + parentform.TopMost = General.Settings.ScriptOnTop; + } + //mxd private void OnInsertSnippetClick(object sender, EventArgs eventArgs) { @@ -1163,6 +1401,18 @@ namespace CodeImp.DoomBuilder.Controls ForceFocus(); } + //mxd + private void tabs_OnCloseTabClicked(object sender, TabControlEventArgs e) + { + ScriptDocumentTab t = (e.TabPage as ScriptDocumentTab); + + //TODO: allow any tab to be closed. + if(!t.IsClosable) return; + + CloseScript(t, false); + UpdateInterface(true); + } + //mxd. Text in ScriptFileDocumentTab was changed private void tabpage_OnTextChanged(object sender, EventArgs eventArgs) { @@ -1172,8 +1422,8 @@ namespace CodeImp.DoomBuilder.Controls if(curtab != null) { buttonsave.Enabled = (curtab.ExplicitSave && curtab.IsChanged); - buttonundo.Enabled = curtab.Scintilla.CanUndo; - buttonredo.Enabled = curtab.Scintilla.CanRedo; + buttonundo.Enabled = curtab.Editor.Scintilla.CanUndo; + buttonredo.Enabled = curtab.Editor.Scintilla.CanRedo; } } } @@ -1186,8 +1436,8 @@ namespace CodeImp.DoomBuilder.Controls ScriptDocumentTab curtab = tabs.SelectedTab as ScriptDocumentTab; if(curtab != null) { - buttonundo.Enabled = curtab.Scintilla.CanUndo; - buttonredo.Enabled = curtab.Scintilla.CanRedo; + buttonundo.Enabled = curtab.Editor.Scintilla.CanUndo; + buttonredo.Enabled = curtab.Editor.Scintilla.CanRedo; } } } @@ -1269,15 +1519,15 @@ namespace CodeImp.DoomBuilder.Controls private void searchnext_Click(object sender, EventArgs e) { - ActiveTab.FindNext(GetQuickSearchOptions()); + FindNext(); } private void searchprev_Click(object sender, EventArgs e) { - ActiveTab.FindPrevious(GetQuickSearchOptions()); + FindPrevious(); } - //mxd. This flashes the status icon + // This flashes the status icon private void statusflasher_Tick(object sender, EventArgs e) { statusflashicon = !statusflashicon; @@ -1286,13 +1536,84 @@ namespace CodeImp.DoomBuilder.Controls if(statusflashcount == 0) statusflasher.Stop(); } - //mxd. This resets the status to ready + // This resets the status to ready private void statusresetter_Tick(object sender, EventArgs e) { DisplayStatus(ScriptStatusType.Ready, null); } #endregion - + + #region ================== Menu opening events (mxd) + + private void filemenuitem_DropDownOpening(object sender, EventArgs e) + { + ScriptDocumentTab t = ActiveTab; + menusave.Enabled = (t != null && !t.IsReadOnly && t.ExplicitSave && t.IsChanged); + + // Any explicit save scripts? + int explicitsavescripts = 0; + foreach(ScriptDocumentTab dt in tabs.TabPages) + if(dt.ExplicitSave && !dt.IsReadOnly) explicitsavescripts++; + + menusaveall.Enabled = (explicitsavescripts > 0); + } + + private void editmenuitem_DropDownOpening(object sender, EventArgs e) + { + ScriptDocumentTab t = ActiveTab; + if(t != null) + { + Scintilla s = t.Editor.Scintilla; + + menuundo.Enabled = s.CanUndo; + menuredo.Enabled = s.CanRedo; + + menucut.Enabled = (s.SelectionEnd > s.SelectionStart); + menucopy.Enabled = (s.SelectionEnd > s.SelectionStart); + menupaste.Enabled = s.CanPaste; + + menuindent.Enabled = true; + menuunindent.Enabled = s.Lines[s.CurrentLine].Indentation > 0; + + menugotoline.Enabled = true; + menuduplicateline.Enabled = true; + } + else + { + menuundo.Enabled = false; + menuredo.Enabled = false; + + menucut.Enabled = false; + menucopy.Enabled = false; + menupaste.Enabled = false; + + menusnippets.Enabled = false; + + menuindent.Enabled = false; + menuunindent.Enabled = false; + + menugotoline.Enabled = false; + menuduplicateline.Enabled = false; + } + } + + private void searchmenuitem_DropDownOpening(object sender, EventArgs e) + { + ScriptDocumentTab t = ActiveTab; + menufind.Enabled = (t != null); + + bool enable = (!string.IsNullOrEmpty(findoptions.FindText) && t != null); + menufindnext.Enabled = enable; + menufindprevious.Enabled = enable; + } + + private void toolsmenu_DropDownOpening(object sender, EventArgs e) + { + ScriptDocumentTab t = ActiveTab; + menucompile.Enabled = (ActiveTab != null && !t.IsReadOnly && t.Config.Compiler != null); + } + + #endregion } } diff --git a/Source/Core/Controls/Scripting/ScriptEditorPanel.resx b/Source/Core/Controls/Scripting/ScriptEditorPanel.resx index 923a3eb7..d1e2c085 100644 --- a/Source/Core/Controls/Scripting/ScriptEditorPanel.resx +++ b/Source/Core/Controls/Scripting/ScriptEditorPanel.resx @@ -117,9 +117,6 @@ <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> - <metadata name="tabs.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> - <value>True</value> - </metadata> <metadata name="toolbar.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <value>True</value> </metadata> @@ -132,15 +129,6 @@ <metadata name="savefile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>194, 17</value> </metadata> - <metadata name="splitter.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> - <value>True</value> - </metadata> - <metadata name="label1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> - <value>True</value> - </metadata> - <metadata name="errorlist.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> - <value>True</value> - </metadata> <metadata name="errorimages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>283, 17</value> </metadata> @@ -148,32 +136,31 @@ <value> AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI - BQAAAk1TRnQBSQFMAwEBAAGMAQABjAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA - ARADAAEBAQABIAYAARD/ACMAAc8B2AHyAf8BTwFnAbkB/wEYATMBkwH/ARABJgFsAf8BCQEfAWMB/wEJ - ASMBgQH/AT4BVAGkAf8BzwHYAfIB/9wAAYEBlAHUAf8BIwFCAawB/wERATYBuAH/AQEBMQHQAf8BAAEu - AeIB/wEAASsB3AH/AQABKAG9Af8BAAEfAZYB/wEAARoBgQH/AVwBbgGyAf/UAAGJAZ0B3AH/ATABTwG7 - Af8BEQFBAd0B/wEAATkB+gH/AQABNgH5Af8BPAFnAfgB/wE8AWcB+AH/AQABLgHqAf8BAAErAeQB/wEA - ASQBtgH/AQABGgGBAf8BXAFuAbIB/8wAAc8B2AHyAf8BRQFgAcYB/wEjAU8B4wH/ARABRwH9Af8BEAFH - Af0B/wFLAYEB/gH/A/4B/wP+Af8BTgGBAfoB/wEAAS8B7gH/AQABKwHkAf8BAAEkAbYB/wEAARoBgQH/ - Ac8B2AHyAf/IAAGnAbYB5QH/AUIBZQHZAf8BIQFUAv8BIgFWAv8BIQFUAv8BWgGLAv8D/gH/A/4B/wFF - AW4B+wH/AQABMwH4Af8BAAEvAe4B/wEAASsB5AH/AQABHwGWAf8BPgFUAaQB/8gAAWUBiQHVAf8BQQFo - Ae4B/wEzAWIC/wE2AWQC/wEzAWIC/wEuAV8C/wFeAY4C/wFVAYYC/wEQAUcB/QH/AQIBPQH7Af8BAAEz - AfgB/wEAAS4B6gH/AQABKAG9Af8BCQEjAYEB/8gAAYEBlAHRAf8BRQFuAfsB/wFHAYEC/wFLAYEB/gH/ - AUcBgQL/AVUBhgL/A/4B/wP+Af8BMwFiAv8BDQFFAfsB/wEAATkB+gH/AQABMAHzAf8BAAErAdwB/wEJ - AR8BYwH/yAABigGbAdQB/wFVAYYB+wH/AVoBiwL/AV4BjgL/AVoBiwL/AZcBsQL/A/4B/wP+Af8BbgGa - Av8BFgFMAf0B/wECAT0B+wH/AQABMwH4Af8BAAEuAeIB/wEQASYBbAH/yAABiQGdAdwB/wFuAZYB8gH/ - AW4BmgL/AYEBnAL/AW4BmgL/AbEBxAL/A/4B/wP+Af8BogG4Af4B/wEdAVEB/gH/AQ0BRQH7Af8BAAE2 - AfkB/wEBATEB0AH/ARgBMwGTAf/IAAGnAbYB5QH/AY0BowHlAf8BhwGkAv8BjQGoAv8BhwGkAv8BxQHT - Af4B/wP+Af8D/gH/AbUBxwH+Af8BIQFUAv8BEAFHAf0B/wEAATkB+gH/AREBNgG4Af8BWQGAAboB/8gA - Ac8B2AHyAf8BlwGnAd0B/wGVAasB8QH/AZcBsQL/AY0BqAL/AakBvgL/A/4B/wP+Af8BgwGhAv8BIgFW - Av8BEAFHAf0B/wERAUEB3QH/ASMBQgGsAf8BzwHYAfIB/8wAAbQBwgHsAf8BmwGqAd0B/wGVAasB8QH/ - AYcBpAL/AW4BmgL/AVoBiwL/AUcBgQL/ATMBYgL/ASIBVgL/ASMBTwHjAf8BMAFPAbsB/wFqAYwB1AH/ - 1AABtAHCAewB/wGXAacB3QH/AY0BowHlAf8BbgGWAfIB/wFVAYYB+wH/AUUBbgH7Af8BQQFoAe4B/wFC - AWUB2QH/AUUBYAHGAf8BgQGVAdwB/9wAAcwB2AH+Af8BnQGtAeAB/wGJAZ0B3AH/AYoBmwHUAf8BgQGU - AdEB/wFlAYkB1QH/AYEBlAHRAf8BzAHYAf4B//8A0QABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEA - AQEFAAGAFwAD/wEAAv8GAAHwAQ8GAAHgAQcGAAHAAQMGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGA - AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAHAAQMGAAHgAQcGAAHwAQ8GAAL/BgAL + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy + BQAAAk1TRnQBSQFMAwEBAAF0AQIBdAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA + ARADAAEBAQABIAYAARD/ACMAAc8B2AHyAf8BEgEqAbkB/wIAAZMB/wIAAS8B/wIAASYB/wIAAYEB/wEB + ARcBpAH/Ac8B2AHyAf/cAAGBAZQB1AH/AQABBQGsAf8CAAG4Af8CAAHQAf8CAAHiAf8CAAHcAf8CAAG9 + Af8CAAGWAf8CAAGBAf8BHwExAbIB/9QAAYkBnQHcAf8BAAESAbsB/wEAAQQB3QH/AgAB+gH/AgAB+QH/ + AQABKgH4Af8BAAEqAfgB/wIAAeoB/wIAAeQB/wIAAbYB/wIAAYEB/wEfATEBsgH/zAABzwHYAfIB/wEI + ASMBxgH/AQABEgHjAf8BAAEKAf0B/wEAAQoB/QH/AQ4BgQH+Af8D/gH/A/4B/wERAYEB+gH/AgAB7gH/ + AgAB5AH/AgABtgH/AgABgQH/Ac8B2AHyAf/IAAGnAbYB5QH/AQUBKAHZAf8BAAEXAv8BAAEZAv8BAAEX + Av8BHQGLAv8D/gH/A/4B/wEIATEB+wH/AgAB+AH/AgAB7gH/AgAB5AH/AgABlgH/AQEBFwGkAf/IAAEo + AYkB1QH/AQQBKwHuAf8BAAElAv8BAAEnAv8BAAElAv8BAAEiAv8BIQGOAv8BGAGGAv8BAAEKAf0B/wIA + AfsB/wIAAfgB/wIAAeoB/wIAAb0B/wIAAYEB/8gAAYEBlAHRAf8BCAExAfsB/wEKAYEC/wEOAYEB/gH/ + AQoBgQL/ARgBhgL/A/4B/wP+Af8BAAElAv8BAAEIAfsB/wIAAfoB/wIAAfMB/wIAAdwB/wIAASYB/8gA + AYoBmwHUAf8BGAGGAfsB/wEdAYsC/wEhAY4C/wEdAYsC/wGXAbEC/wP+Af8D/gH/ATEBmgL/AQABDwH9 + Af8CAAH7Af8CAAH4Af8CAAHiAf8CAAEvAf/IAAGJAZ0B3AH/ATEBlgHyAf8BMQGaAv8BgQGcAv8BMQGa + Av8BsQHEAv8D/gH/A/4B/wGiAbgB/gH/AQABFAH+Af8BAAEIAfsB/wIAAfkB/wIAAdAB/wIAAZMB/8gA + AacBtgHlAf8BjQGjAeUB/wGHAaQC/wGNAagC/wGHAaQC/wHFAdMB/gH/A/4B/wP+Af8BtQHHAf4B/wEA + ARcC/wEAAQoB/QH/AgAB+gH/AgABuAH/ARwBgAG6Af/IAAHPAdgB8gH/AZcBpwHdAf8BlQGrAfEB/wGX + AbEC/wGNAagC/wGpAb4C/wP+Af8D/gH/AYMBoQL/AQABGQL/AQABCgH9Af8BAAEEAd0B/wEAAQUBrAH/ + Ac8B2AHyAf/MAAG0AcIB7AH/AZsBqgHdAf8BlQGrAfEB/wGHAaQC/wExAZoC/wEdAYsC/wEKAYEC/wEA + ASUC/wEAARkC/wEAARIB4wH/AQABEgG7Af8BLQGMAdQB/9QAAbQBwgHsAf8BlwGnAd0B/wGNAaMB5QH/ + ATEBlgHyAf8BGAGGAfsB/wEIATEB+wH/AQQBKwHuAf8BBQEoAdkB/wEIASMBxgH/AYEBlQHcAf/cAAHM + AdgB/gH/AZ0BrQHgAf8BiQGdAdwB/wGKAZsB1AH/AYEBlAHRAf8BKAGJAdUB/wGBAZQB0QH/AcwB2AH+ + Af//ANEAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAL/BgAB8AEPBgAB4AEH + BgABwAEDBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABwAED + BgAB4AEHBgAB8AEPBgAC/wYACw== </value> </data> <metadata name="statusbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> @@ -185,7 +172,1299 @@ <metadata name="statusresetter.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>588, 17</value> </metadata> - <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <metadata name="menustrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>820, 17</value> + </metadata> + <metadata name="scripticons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>927, 17</value> + </metadata> + <data name="scripticons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABc + HwEAAk1TRnQBSQFMAgEBPQEAAVABAgFQAQIBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + BAABAQIAAQEBAAEgBwABAf8A/wATAAFCAYQBjwH/ATMBgAGPAf8BLQFGAYcB/wEkATsBSAH/ARsBLwE8 + Af8BEQEjAS4B/wEGARUBHwH/AQABBwEQAf8CAAECAf8DAAH/AwAB/wMAAf/QAAFEAYcBkgH/AYkBoQGr + Af8BNwGyAdQB/wNEAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHs + Af8BAAHgAewB/wNEAf8BAAEYASkB/8wAAUcBigGVAf8BSwG+AdMB/wGKAaQBrgH/AUsB3AL/A0QB/wEA + AeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQABNAGA + Af/MAAFKAY4BmAH/AUYB0gHsAf8BiwGkAa0B/wGJAcIBzgH/A0QB/wEAAeAB7AH/AwAB/wEAAeAB7AH/ + AwAB/wEAAeAB7AH/AwAB/wEAAeAB7AH/A0QB/wEAARgBKAH/yAABgAGRAZwB/wGBAdcB7wH/AUoBxQHg + Af8BjAGmAbAB/wGAAd0B/gH/A0QB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHs + Af8BAAHgAewB/wEAAeAB7AH/AQABNgGBAf/IAAGDAZUBnwH/AYkB3AHxAf8BjAHiAv8BjQGoAbEB/wGM + AboBxwH/A0QB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEA + AeAB7AH/A0QB/wEeATQBQQH/xAABhgGaAaMB/wGSAeEB8gH/AZgB6AH9Af8BgAHEAd4B/wGOAacBsAH/ + AYEB3gH9Af8DRAH/A0QB/wNEAf8DRAH/A0QB/wNEAf8DRAH/ATgB1gL/ASMBqQHRAf8BjwGbAaQB/8AA + AYgBnAGlAf8BmgHmAfMB/wGfAesB+wH/AZgB6AH+Af8BiwGsAbkB/wGLAawBuQH/AYoBqgG3Af8BiAGm + AbMB/wGGAaMBrwH/AYMBnwGqAf8BgQGaAaYB/wFMAZUBoQH/AUkBkQGdAf8BRwGOAZkB/wFGAYsBlQH/ + AUQBiAGTAf/AAAGLAaABqAH/AaAB6gH2Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH+Af8BRwHaAv8BNAHU + Av8BNAHUAv8BNAHUAv8BNAHUAv8BNAHUAv8BNAHUAv8BRAGIAZMB/8wAAY4BogGrAf8BpwHuAfYB/wGr + AfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/QH/AT4B1AH7Af8BiQGeAacB/wGGAZkBowH/AYIBlAGf + Af8BSwGQAZoB/wFHAYwBlwH/AUQBiAGTAf/MAAGPAaQBrAH/AaAB0gHaAf8BqwHwAfcB/wGrAfAB9wH/ + AaYB7gH5Af8BnwHrAfsB/wGNAaEBqgH/6AABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGP + AaQBrAH//wD/AP8A/wDsAAFBAYQBjwH/ATIBgAGPAf8BLAFFAYcB/wEjAToBRwH/ARoBLgE7Af8BEAEi + AS0B/wEFARQBHgH/AQABBgEPAf8CAAEBAf8DAAH/AwAB/wMAAf8QAAFBAYQBjwH/ATIBgAGPAf8BLAFF + AYcB/wEjAToBRwH/ARoBLgE7Af8BEAEiAS0B/wEFARQBHgH/AQABBgEPAf8CAAEBAf8DAAH/AwAB/wMA + Af8QAAFCAYQBjwH/ATMBgAGPAf8BLQFGAYcB/wEkATsBSAH/ARsBLwE8Af8BEQEjAS4B/wEGARUBHwH/ + AQABBwEQAf8CAAECAf8DAAH/AwAB/wMAAf8QAAFCAYQBjwH/ATMBgAGPAf8BLQFGAYcB/wEkATsBSAH/ + ARsBLwE8Af8BEQEjAS4B/wEGARUBHwH/AQABBwEQAf8CAAECAf8DAAH/AwAB/wMAAf8QAAFDAYcBkgH/ + AYkBoQGrAf8DSwH/A6kB/wOZAf8DmQH/A5kB/wOUAf8DPAH/A60B/wOJAf8BAAFAAcsB/wEAARcBKAH/ + DAABQwGHAZIB/wGJAaEBqwH/ATYBsgHUAf8ByAETAQAB/wH4AbMBoQH/AfYBNQEaAf8B8gEyARQB/wHP + ARgBAAH/AQABLQGGAf8BAAEtAYQB/wEAASsBSwH/AQABKwFJAf8BAAEXASgB/wwAAUQBhwGSAf8BiQGh + AasB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8CAAHGAf8BAAEGAQAB/wIA + AcYB/wIAAcYB/wIAAcYB/wIAAQIB/wwAAUQBhwGSAf8BiQGhAasB/wE3AbIB1AH/AQABjwHNAf8BAAGP + Ac0B/wEAAY8BzQH/AQABjAHHAf8CAAHuAf8BAAGCAbQB/wEAAUkBqQH/AQABRAGfAf8BAAE/AZYB/wEA + ARgBKQH/DAABRgGKAZUB/wFKAb4B0wH/AYoBpAGuAf8DvwH/AZ0BJwEAAf8DowH/AZ0BJwEAAf8DlAH/ + A5UB/wGdAScBAAH/A6EB/wGdAScBAAH/AQABMwGAAf8MAAFGAYoBlQH/AUoBvgHTAf8BigGkAa4B/wFK + AdwC/wHJARMBAAH/AfgBswGhAf8B9gE1ARoB/wHxATEBEgH/Ac0BFgEAAf8BxwESAQAB/wHHARIBAAH/ + AQABNAGeAf8BAAEzAYAB/wwAAUcBigGVAf8BAAENAQUB/wGKAaQBrgH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEA + Af8MAAFHAYoBlQH/AUsBvgHTAf8BigGkAa4B/wFLAdwC/wEsAc8C/wEiAcsC/wIAAe4B/wIAAe4B/wIA + Ae4B/wEAAaoB6wH/AQABoAHlAf8BAAGMAdQB/wEAATQBgAH/DAABSQGOAZgB/wFFAdIB7AH/AYsBpAGt + Af8D0wH/AZ0BJwEAAf8DwgH/AZ0BJwEAAf8DuAH/A7wB/wGdAScBAAH/A64B/wGdAScBAAH/ARwBmAHg + Af8BAAEXAScB/wgAAUkBjgGYAf8BRQHSAewB/wGLAaQBrQH/AYkBwgHOAf8BPQHYAv8ByQETAQAB/wH4 + AbMBoQH/AfYBNQEaAf8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8B3QEjAQAB/wE4ASQBGgH/AQABFwEn + Af8IAAFKAY4BmAH/AQABDgEHAf8BiwGkAa0B/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AgABxgH/AgABxgH/AgABxgH/AgABxgH/AgABxgH/AQABBgEAAf8BBgEVAR8B/wgAAUoBjgGYAf8BRgHS + AewB/wGLAaQBrQH/AYkBwgHOAf8BPgHYAv8CAAHuAf8CAAHuAf8CAAHuAf8CAAHuAf8CAAHuAf8BAQGw + Ae4B/wEAAagB6QH/AgAB7gH/AQABGAEoAf8IAAGAAZEBnAH/AYEB1wHvAf8BSQHFAeAB/wGMAaYBsAH/ + AZ0BJwEAAf8D3QH/AZ0BJwEAAf8D1wH/AZ0BJwEAAf8BnQEnAQAB/wOxAf8BnQEnAQAB/wGdAScBAAH/ + AQABNQGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BSQHFAeAB/wGMAaYBsAH/AYAB3QH+Af8BNAHTAv8ByQET + AQAB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8BxwESAQAB/wEAATUBgQH/ + CAABgAGRAZwB/wEAAQ4BBwH/AQABDQEGAf8BjAGmAbAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/CAABgAGR + AZwB/wGBAdcB7wH/AUoBxQHgAf8BjAGmAbAB/wGAAd0B/gH/AgAB7gH/AgAB7gH/AgAB7gH/AgAB7gH/ + AgAB7gH/ARMBvgH3Af8CAAHuAf8CAAHuAf8BAAE2AYEB/wgAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGN + AagBsQH/A/EB/wGdAScBAAH/A/EB/wGdAScBAAH/AZ0BJwEAAf8D6AH/AZ0BJwEAAf8BQQGzAfIB/wGd + AScBAAH/AT8BwQHnAf8BHQEzAUAB/wQAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGNAagBsQH/AYwBugHH + Af8BQAHYAv8BxwESAQAB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wHeAZIBNwH/AfYBNQEaAf8BxwES + AQAB/wEAAYcBtgH/AR0BMwFAAf8EAAGDAZUBnwH/AQEBDgEHAf8BAQEPAQgB/wGNAagBsQH/AQABBgEA + Af8BAAEGAQAB/wEAAQYBAAH/AgABxgH/AgABxgH/AgABxgH/AgABxgH/AQABBgEAAf8CAAHGAf8BAAEG + AQAB/wEeATQBQQH/BAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BjAG6AccB/wIAAe4B/wIA + Ae4B/wE0AdQC/wIAAe4B/wIAAe4B/wEhAc0C/wEYAcUB/AH/AgAB7gH/AQABogHbAf8BHgE0AUEB/wQA + AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGdAScBAAH/A68B/wGdAScBAAH/ + A+YB/wPlAf8BnQEnAQAB/wGEAdAB+wH/AZ0BJwEAAf8BnQEnAQAB/wEiAakB0QH/AY8BmwGkAf8BhgGa + AaMB/wGSAeEB8gH/AZgB6AH9Af8BgAHEAd4B/wGOAacBsAH/AYEB3gH9Af8BxwETAQAB/wH4AbMBoQH/ + AfYBNQEaAf8B3gGSATcB/wGlAQYBAAH/Ad4BkgE3Af8BxwESAQAB/wEsAcAB5QH/ASIBqQHRAf8BjwGb + AaQB/wGGAZoBowH/AQEBDwEHAf8BAQEPAQcB/wEAAQ0BBgH/AY4BpwGwAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEG + AQAB/wGPAZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/ + AYQB4AL/AYQB4AL/AYQB4AL/AYQB4AL/AYEB3wL/AUgB3QL/AUEB2AL/ATgB1gL/ASMBqQHRAf8BjwGb + AaQB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5Af8BiwGsAbkB/wGKAaoBtwH/ + AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BSwGVAaEB/wFIAZEBnQH/AUYBjgGZAf8BRQGL + AZUB/wFDAYgBkwH/AYgBnAGlAf8BmgHmAfMB/wGfAesB+wH/AZgB6AH+Af8BiwGsAbkB/wGLAawBuQH/ + AYoBqgG3Af8BiAGmAbMB/wGGAaMBrwH/AYMBnwGqAf8BgQGaAaYB/wFLAZUBoQH/AUgBkQGdAf8BRgGO + AZkB/wFFAYsBlQH/AUMBiAGTAf8BiAGcAaUB/wEBAQ8BBwH/AQIBDwEHAf8BAQEPAQgB/wGLAawBuQH/ + AYsBrAG5Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGBAZoBpgH/AUwBlQGhAf8BSQGR + AZ0B/wFHAY4BmQH/AUYBiwGVAf8BRAGIAZMB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/ + AYsBrAG5Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BTAGV + AaEB/wFJAZEBnQH/AUcBjgGZAf8BRgGLAZUB/wFEAYgBkwH/AYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/ + AZ8B6wH7Af8BmAHoAf4B/wFGAdoC/wEzAdQC/wEzAdQC/wEzAdQC/wEzAdQC/wEzAdQC/wEzAdQC/wFD + AYgBkwH/DAABiwGgAagB/wGgAeoB9gH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/gH/AUYB2gL/ATMB1AL/ + ATMB1AL/ATMB1AL/ATMB1AL/ATMB1AL/ATMB1AL/AUMBiAGTAf8MAAGLAaABqAH/AQIBDwEHAf8BAgEP + AQcB/wECAQ8BBwH/AQEBDwEIAf8BAAEOAQgB/wEAAQ4BCAH/AQABDgEIAf8BAAEOAQgB/wEAAQ4BCAH/ + AQABDgEIAf8BAAEOAQgB/wFEAYgBkwH/DAABiwGgAagB/wGgAeoB9gH/AaYB7gH5Af8BnwHrAfsB/wGY + AegB/gH/AUcB2gL/ATQB1AL/ATQB1AL/ATQB1AL/ATQB1AL/ATQB1AL/ATQB1AL/AUQBiAGTAf8MAAGO + AaIBqwH/AacB7gH2Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf0B/wE9AdQB+wH/AYkBngGn + Af8BhgGZAaMB/wGCAZQBnwH/AUoBkAGaAf8BRgGMAZcB/wFDAYgBkwH/DAABjgGiAasB/wGnAe4B9gH/ + AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH9Af8BPQHUAfsB/wGJAZ4BpwH/AYYBmQGjAf8BggGU + AZ8B/wFKAZABmgH/AUYBjAGXAf8BQwGIAZMB/wwAAY4BogGrAf8BAgEPAQcB/wECAQ8BBwH/AQIBDwEH + Af8BAgEPAQcB/wEBAQ8BBwH/AQABDgEHAf8BiQGeAacB/wGGAZkBowH/AYIBlAGfAf8BSwGQAZoB/wFH + AYwBlwH/AUQBiAGTAf8MAAGOAaIBqwH/AacB7gH2Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BmAHo + Af0B/wE+AdQB+wH/AYkBngGnAf8BhgGZAaMB/wGCAZQBnwH/AUsBkAGaAf8BRwGMAZcB/wFEAYgBkwH/ + DAABjwGkAawB/wGgAdIB2gH/AasB8AH3Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGhAaoB/yQA + AY8BpAGsAf8BoAHSAdoB/wGrAfAB9wH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8kAAGP + AaQBrAH/AQIBDgEGAf8BAgEPAQcB/wECAQ8BBwH/AQIBDwEHAf8BAgEPAQcB/wGNAaEBqgH/JAABjwGk + AawB/wGgAdIB2gH/AasB8AH3Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGhAaoB/ygAAY8BpAGs + Af8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/ + AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywA + AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB//8A/wD/AP8ALAABNwGEAY8B/wEo + AYABjwH/ASIBOwGHAf8BGQEwAT0B/wEQASQBMQH/AQYBGAEjAf8BAAEKARQB/wIAAQUB/wMAAf8DAAH/ + AwAB/wMAAf8QAAE3AYQBjwH/ASgBgAGPAf8BIgE7AYcB/wEZATABPQH/ARABJAExAf8BBgEYASMB/wEA + AQoBFAH/AgABBQH/AwAB/wMAAf8DAAH/AwAB/xAAATcBhAGPAf8BKAGAAY8B/wEiATsBhwH/ARkBMAE9 + Af8BEAEkATEB/wEGARgBIwH/AQABCgEUAf8CAAEFAf8DAAH/AwAB/wMAAf8DAAH/EAABPQGEAY8B/wEu + AYABjwH/ASgBQQGHAf8BHwE2AUMB/wEWASoBNwH/AQwBHgEpAf8BAQEQARoB/wEAAQIBCwH/AwAB/wMA + Af8DAAH/AwAB/xAAATkBhwGSAf8BiQGhAasB/wEsAbIB1AH/ARkBogHbAf8BjgGqAb8B/wGXAZIBjwH/ + AY4BqgG+Af8BGQGiAdsB/wEAAYIBtAH/ARkBogHbAf8BjgGqAb8B/wGXAZIBjwH/AQABDQEeAf8MAAE5 + AYcBkgH/AYkBoQGrAf8BLAGyAdQB/wGzAasBigL/AfkB0AP/AfsD/wH3A/8B6AL/AfkB0AL/Ae4BtwH/ + AdoBrwEzAf8BqgGKASYB/wEAAQ0BHgH/DAABOQGHAZIB/wGJAaEBqwH/ASwBsgHUAf8BAAGPAc0B/wGC + AYgBLwH/AQcBjAGrAf8BCQGKAaYB/wELAYcBngH/AYQBgwEiAf8BAAEnAaMB/wEMAQ4BqAH/AQABNAGW + Af8BAAENAR4B/wwAAT8BhwGSAf8BiQGhAasB/wEyAbIB1AH/AQABjgHLAf8BAAGIAcMB/wEAAYIBuwH/ + AQABgwG6Af8BAAFHAbIB/wEAAT8BpAH/AQABNwGXAf8BAAEyAY4B/wEAAS8BiAH/AQABEwEkAf8MAAE8 + AYoBlQH/AUABvgHTAf8BigGkAa4B/wEYAYgBpwH/ATcBJAEYAf8BHgIaAf8BNwEkARcB/wEQAYMBpgH/ + AQABswHwAf8BDgGBAaQB/wE3ASQBGAH/AR4CGgH/AQABKQGAAf8MAAE8AYoBlQH/AUABvgHTAf8BigGk + Aa4B/wGDAaoBrQH/AdMB2AHSBf8B/gHzAdQB/wHyAeEBsAH/Ae4B2gGfAf8B0QG9AYAB/wGzAasBigH/ + AvYB3QH/AQABKQGAAf8MAAE8AYoBlQH/AUABvgHTAf8BigGkAa4B/wFAAdwC/wGBAbUBvQH/AZgBmwE7 + Af8BhQGlAaEB/wGBAaEBngH/AZIBkwE0Af8BAwGNAd0B/wEPASgBzAH/AQABjAHUAf8BAAEpAYAB/wwA + AUIBigGVAf8BRgG+AdMB/wGKAaQBrgH/AUUB2QH8Af8BLAEUAQAB/wEYAZsBtwH/AQwBrwHgAf8BKQES + AQAB/wEAAZMBvwH/ASYBEgEAAf8BAAFHAa4B/wEkARABAAH/AQABLwGAAf8MAAE/AY4BmAH/ATsB0gHs + Af8BiwGkAa0B/wESAYoBswH/ASQBJgEpAf8BIAELAQAB/wEkASYBKgH/AQoBiwG5Af8BCwHBAfoB/wEI + AYkBuAH/ASQBJgEpAf8BIAELAQAB/wEkASYBKgH/AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHsAf8BiwGk + Aa0B/wGJAcIBzgH/ASABnQGwAf8B2AHXAdID/wH6Af8B8AHkAb4B/wHcAcYBhgH/ARgBNQEsAf8BnAGr + AawF/wHtAd4BtQH/AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHsAf8BiwGkAa0B/wGJAcIBzgH/ATMB2AL/ + AZMBqQGXAf8BHgHOAv8BNgG1AcgB/wEyAa8BxQH/AQ4BmgHlAf8BFQEzAdEB/wEAAagB6QH/AQABhQHN + Af8BAAENAR0B/wgAAUUBjgGYAf8BQQHSAewB/wGLAaQBrQH/AUABiAFEAf8BLwE4ASkB/wEmAZIBngH/ + ASYBMQEkAf8BFwGTAaoB/wEtAQoBAAH/AS0BCgEAAf8BFAEwATEB/wEAAUYBnQH/AS0BCgEAAf8BAAET + ASMB/wgAAYABkQGcAf8BgQHXAe8B/wE/AcUB4AH/AYwBpgGwAf8BCQGJAbsB/wEUATIBigH/AQkBiQG8 + Af8BBQGQAcUB/wEaAc0C/wECAY4BxAH/AQkBiQG7Af8BFAEyAYoB/wEJAYkBvAH/AQABKwGBAf8IAAGA + AZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGMAaYBsAH/AYAB3QH+Af8BGAGaAbIB/wHiAuEF/wEjAYEBgAH/ + ARABxwH8Af8BBQGpAdYB/wG8AcIBwQX/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGM + AaYBsAH/AYAB3QH+Af8BmAGkAYgB/wEuAdAB9QH/AZcBowGIAf8BGgHNAv8BGAGmAesB/wEqAQABugH/ + AREBhwHbAf8BFAEwAdAB/wEAASsBgQH/CAABgAGRAZwB/wGBAdcB7wH/AUUBxQHgAf8BjAGmAbAB/wEt + AQoBAAH/ASgBwgHrAf8BLQEKAQAB/wEhAb4B6AH/AS0BCgEAAf8BEQG7AewB/wEtAQoBAAH/AQABqAHf + Af8BLQEKAQAB/wEAATEBgQH/CAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BAAEzAbQB/wEA + AQgBgwH/AQABMwG0Af8BAQGHAbkB/wEpAdQC/wEAAYYBuQH/AQABMwG0Af8BAAEIAYMB/wEAATMBtAH/ + AQABgwG3Af8BEwEpATYB/wQAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGNAagBsQH/AYwBugHHAf8BNgHY + Av8BIwGZAaYB/wE7AZ4BowH/ASkB1AL/ASEB0AL/ARYBzQL/AQwBmgG4Af8BOwGZAaEB/wEAAZoBzQH/ + ARMBKQE2Af8EAAGDAZUBnwH/AYkB3AHxAf8BjAHiAv8BjQGoAbEB/wGMAboBxwH/AYEBygHgAf8BigGz + AbEB/wGUAakBlwH/ASkB1AL/ASQBrQHtAf8BIgGEAdoB/wEWAaQB6wH/AQ8BnAHnAf8BAAGiAdsB/wET + ASkBNgH/BAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BOAEuARUB/wE0AZsBowH/AS0BPwE2 + Af8BLAGJAYoB/wEtAc8B+QH/ASsBNQElAf8BIwGGAYoB/wERAcAB9gH/AR4BOwE6Af8BLQEKAQAB/wEZ + AS8BPAH/BAABhgGaAaMB/wGSAeEB8gH/AZgB6AH9Af8BgAHEAd4B/wGOAacBsAH/AQABNAGjAf8BBgGI + AbkB/wESAZMBvgH/AYQB4AL/ARIBkwG+Af8BBgGIAbkB/wEAATQBowH/AQYBhwG5Af8BDQGRAb4B/wEY + AakB0QH/AY8BmwGkAf8BhgGaAaMB/wGSAeEB8gH/AZgB6AH9Af8BgAHEAd4B/wGOAacBsAH/AYEB3gH9 + Af8BhAHgAv8BhAHgAv8BhAHgAv8BhAHgAv8BgQHfAv8BPQHdAv8BNgHYAv8BLQHWAv8BGAGpAdEB/wGP + AZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/AawBkAEE + Af8BjQHRAeAB/wGEAeAC/wFAAbsB7QH/ATkBjwHaAf8BPQHdAv8BNgHYAv8BLQHWAv8BGAGpAdEB/wGP + AZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/AYQB4AL/ + AYQB4AL/AYQB4AL/AYQB4AL/AYEB3wL/AUMB3QL/ATwB2AL/ATMB1gL/AR4BqQHRAf8BjwGbAaQB/wGI + AZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGz + Af8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BQQGVAaEB/wE+AZEBnQH/ATwBjgGZAf8BOwGLAZUB/wE5 + AYgBkwH/AYgBnAGlAf8BmgHmAfMB/wGfAesB+wH/AZgB6AH+Af8BiwGsAbkB/wGLAawBuQH/AYoBqgG3 + Af8BiAGmAbMB/wGGAaMBrwH/AYMBnwGqAf8BgQGaAaYB/wFBAZUBoQH/AT4BkQGdAf8BPAGOAZkB/wE7 + AYsBlQH/ATkBiAGTAf8BiAGcAaUB/wGaAeYB8wH/AZ8B6wH7Af8BmAHoAf4B/wGLAawBuQH/AYsBrAG5 + Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGBAZoBpgH/AUEBlQGhAf8BPgGRAZ0B/wE8 + AY4BmQH/ATsBiwGVAf8BOQGIAZMB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5 + Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BRwGVAaEB/wFE + AZEBnQH/AUIBjgGZAf8BQQGLAZUB/wE/AYgBkwH/AYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/AZ8B6wH7 + Af8BmAHoAf4B/wE8AdoC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wE5AYgBkwH/ + DAABiwGgAagB/wGgAeoB9gH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/gH/ATwB2gL/ASkB1AL/ASkB1AL/ + ASkB1AL/ASkB1AL/ASkB1AL/ASkB1AL/ATkBiAGTAf8MAAGLAaABqAH/AaAB6gH2Af8BpgHuAfkB/wGf + AesB+wH/AZgB6AH+Af8BPAHaAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BOQGI + AZMB/wwAAYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf4B/wFCAdoC/wEvAdQC/wEv + AdQC/wEvAdQC/wEvAdQC/wEvAdQC/wEvAdQC/wE/AYgBkwH/DAABjgGiAasB/wGnAe4B9gH/AasB8AH3 + Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH9Af8BMwHUAfsB/wGJAZ4BpwH/AYYBmQGjAf8BggGUAZ8B/wFA + AZABmgH/ATwBjAGXAf8BOQGIAZMB/wwAAY4BogGrAf8BpwHuAfYB/wGrAfAB9wH/AaYB7gH5Af8BnwHr + AfsB/wGYAegB/QH/ATMB1AH7Af8BiQGeAacB/wGGAZkBowH/AYIBlAGfAf8BQAGQAZoB/wE8AYwBlwH/ + ATkBiAGTAf8MAAGOAaIBqwH/AacB7gH2Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf0B/wEz + AdQB+wH/AYkBngGnAf8BhgGZAaMB/wGCAZQBnwH/AUABkAGaAf8BPAGMAZcB/wE5AYgBkwH/DAABjgGi + AasB/wGnAe4B9gH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH9Af8BOQHUAfsB/wGJAZ4BpwH/ + AYYBmQGjAf8BggGUAZ8B/wFGAZABmgH/AUIBjAGXAf8BPwGIAZMB/wwAAY8BpAGsAf8BoAHSAdoB/wGr + AfAB9wH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8kAAGPAaQBrAH/AaAB0gHaAf8BqwHw + AfcB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGNAaEBqgH/JAABjwGkAawB/wGgAdIB2gH/AasB8AH3 + Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGhAaoB/yQAAY8BpAGsAf8BoAHSAdoB/wGrAfAB9wH/ + AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8oAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGP + AaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8sAAGP + AaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH/AY8BpAGsAf//AP8A/wD/ACwAATcBhAGPAf8BKAGAAY8B/wEiATsBhwH/ARkBMAE9 + Af8BEAEkATEB/wEGARgBIwH/AQABCgEUAf8CAAEFAf8DAAH/AwAB/wMAAf8DAAH/EAABNwGEAY8B/wEo + AYABjwH/ASIBOwGHAf8BGQEwAT0B/wEQASQBMQH/AQYBGAEjAf8BAAEKARQB/wIAAQUB/wMAAf8DAAH/ + AwAB/wMAAf8QAAE3AYQBjwH/ASgBgAGPAf8BIgE7AYcB/wEZATABPQH/ARABJAExAf8BBgEYASMB/wEA + AQoBFAH/AgABBQH/AwAB/wMAAf8DAAH/AwAB/xAAATcBhAGPAf8BKAGAAY8B/wEiATsBhwH/ARkBMAE9 + Af8BEAEkATEB/wEGARgBIwH/AQABCgEUAf8CAAEFAf8DAAH/AwAB/wMAAf8DAAH/EAABOQGHAZIB/wGJ + AaEBqwH/ASwBsgHNAf8BAAGTAcYB/wEAAZkBvQH/Aa4B2gHtAf8BsgHUAc0B/wErAbIBlQH/AawB6gHo + Af8BsQHsAfUB/wIAAcoB/wErATMBNgH/AQABDQEeAf8MAAE5AYcBkgH/AYkBoQGrAf8BLAGyAdQB/wEA + ASgBkwH/AgABEgH/AQABGAEPAf8BAAEKAQMB/wEAATYBFAH/AQABPAEVAf8BAAGGARkB/wEKAasBMwH/ + AQUBmgEqAf8BAAENAR4B/wwAATkBhwGSAf8BiQGhAasB/wEsAbIB1AH/AQABjwHNAf8BkQIAAf8B4AHX + Ac4B/wL9Af4B/wHzAfUB9AH/Ae8B8gHvAf8B8AH4AfsB/wHeAc0BtAH/AcMBiQEOAf8BAAENAR4B/wwA + ATkBhwGSAf8BiQGhAasB/wEsAbIB1AH/AQABjwHNAf8B0gHEAa0B/wEAAaEB0gH/AQABjAHHAf8BAAGI + Ab4B/wEAAYIBtAH/AQABPgGpAf8BAAE5AZ8B/wEAATQBlgH/AQABDQEeAf8MAAE8AYoBlQH/AUABvgHT + Af8BigGkAa4B/wE+AdkB9gH/ASMByQHpAf8BqwHkAf4B/wHNAegB7wH/ASsBswGYAf8BqgHaAcMB/wGG + AaUB6QH/AgAB0gH/AQMBBQGTAf8BAAEpAYAB/wwAATwBigGVAf8BQAG+AdMB/wGKAaQBrgH/AR0BnAG1 + Af8BAAEjARQB/wEAATEBDAH/AQABMQEGAf8BAAGMARwB/wEAAaEBJgH/AQkBrwE1Af8BEQG1AT0B/wEX + AbwBgwH/AQABKQGAAf8MAAE8AYoBlQH/AUABvgHTAf8BigGkAa4B/wFAAdwC/wGkATMBGwH/AfwB+wH6 + Af8B/AL+Af8B9QH3AfYB/wHzAfYB9QH/AfIB+QH8Af8B2QG5AZQB/wHJAZMBHAH/AQABKQGAAf8MAAE8 + AYoBlQH/AUABvgHTAf8BigGkAa4B/wFAAdwC/wGPAR0BAAH/AasBhwEKAf8BLgHIAe8B/wElAcMB8AH/ + AQABswHwAf8BAAGqAesB/wGPAR0BAAH/AQABjAHUAf8BAAEpAYAB/wwAAT8BjgGYAf8BOwHSAewB/wGL + AaQBrQH/AYcBwQHKAf8BMgHTAfAB/wGfAeMC/wHAAegB9gH/ASsBtAGbAf8BowHMAcUB/wIAAdIB/wIA + AdEB/wIAAdIB/wECAQUBkgH/AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHsAf8BiwGkAa0B/wEiAY0BkQH/ + AQABPwEWAf8BAAGQASIB/wEIAasBMgH/AQgBsAE0Af8BAAGqASsB/wEAAaQBKgH/AQwBsAE4Af8BBwGu + ATEB/wEFAa0BMAH/AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHsAf8BiwGkAa0B/wGJAcIBzgH/AZ8BgAEq + Af8B9QHyAe8B/wH7AfoB+QH/Av4C/wH6AfwB/gH/AvQB8QH/AdgBrQFAAf8BzQGZASMB/wHGAZMBHgH/ + AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHsAf8BiwGkAa0B/wGJAcIBzgH/AY8BHQEAAf8BjwEdAQAB/wGV + ASYBAAH/AbwBogE2Af8BLgHJAfYB/wEBAbkB9QH/AY8BHQEAAf8BAAGoAekB/wGPAR0BAAH/AQABDQEd + Af8IAAGAAZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGMAaYBsAH/AYUB3gH8Af8BhgHcAv8BmwHbAe4B/wEr + AbgBqAH/AgAB0wH/AgAB0gH/AgAB0gH/AgAB0QH/AgAB0QH/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHv + Af8BPwHFAeAB/wGMAaYBsAH/AREBpgGTAf8BAAGmASoB/wEPAbgBPAH/ARMBtgFAAf8BDQGyATkB/wET + AbYBQAH/ARABsgE9Af8BEAG0AT0B/wEZAboBhQH/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BPwHF + AeAB/wGMAaYBsAH/Ab4BNgEwAf8BpAEpARcB/wGqAT8BLAH/AbwBpQGUAf8B2AHQAcgB/wHsAeEB1QH/ + AeQBvQGUAf8B3gGwAUEB/wHUAaEBLAH/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGM + AaYBsAH/AY8BHQEAAf8BjwEdAQAB/wGPAR0BAAH/Ab0BowE3Af8BOQHSAfcB/wEQAccB/AH/AY8BHQEA + Af8BAAG2AfIB/wGPAR0BAAH/AQABKwGBAf8IAAGDAZUBnwH/AYkB3AHxAf8BjAHiAv8BjQGoAbEB/wGP + AbwByAH/AUAB2wL/AYsB3gL/AZMB2QHbAf8CAAHaAf8CAAHRAf8CAAEgAf8CAAHSAf8CAAHWAf8BLAGy + AZUB/wETASkBNgH/BAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BjAG6AccB/wElAb4B2QH/ + AQcBogGWAf8BAQGnATEB/wELAbIBOQH/AQQBrAEvAf8BDwG1AToB/wEUAbgBPwH/ARoBvQGGAf8BFgG9 + AYIB/wETASkBNgH/BAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BjAG6AccB/wE2AdgC/wEq + AckB9gH/AcIBLAEvAf8BtgEoASUB/wGjASYBGgH/AaABOAEfAf8BsAGSATUB/wHIAacBhAH/AdgBsAGG + Af8BEwEpATYB/wQAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGNAagBsQH/AY8BHQEAAf8BrAGJAQwB/wGC + AdUB9AH/ASkB1AL/ASkB1AL/ASEB0AL/AY8BHQEAAf8BDQHFAfwB/wGPAR0BAAH/AQABogHbAf8BEwEp + ATYB/wQAAYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGAAdwB9wH/AUEB2AHs + Af8BOQHKAcsB/wEMARYB3QH/AgAB0QH/AgAB0gH/AgAB0gH/AgAB1gH/ASwBswGVAf8BGAGpAdEB/wGP + AZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/AYQB4AL/ + ATUBxwHdAf8BFgGpAZsB/wENAbABPAH/ARUBvAGBAf8BEwG7AUAB/wEMAaoBgwH/ARoBsAHBAf8BGAGp + AdEB/wGPAZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/ + AYQB4AL/AYQB4AL/AYQB4AL/AYQB4AL/AUEBwgHoAf8BQAGuAdUB/wGnASYBIQH/AZABJAERAf8BGAGp + AdEB/wGPAZsBpAH/AYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGnAbAB/wGZAeIB+gH/ + AYQB4AL/AYQB4AL/AYQB4AL/AYQB4AL/AYEB3wL/AT0B3QL/ATYB2AL/AS0B1gL/ARgBqQHRAf8BjwGb + AaQB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5Af8BiwGsAbkB/wGKAaoBtwH/ + AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BQQGVAaEB/wE+AZEBnQH/ATwBjgGZAf8BOwGL + AZUB/wE5AYgBkwH/AYgBnAGlAf8BmgHmAfMB/wGfAesB+wH/AZgB6AH+Af8BiwGsAbkB/wGLAawBuQH/ + AYoBqgG3Af8BiAGmAbMB/wGGAaMBrwH/AYMBnwGqAf8BgQGaAaYB/wFBAZUBoQH/AT4BkQGdAf8BPAGO + AZkB/wE7AYsBlQH/ATkBiAGTAf8BiAGcAaUB/wGaAeYB8wH/AZ8B6wH7Af8BmAHoAf4B/wGLAawBuQH/ + AYsBrAG5Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGBAZoBpgH/AUEBlQGhAf8BPgGR + AZ0B/wE8AY4BmQH/ATsBiwGVAf8BOQGIAZMB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/ + AYsBrAG5Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BQQGV + AaEB/wE+AZEBnQH/ATwBjgGZAf8BOwGLAZUB/wE5AYgBkwH/AYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/ + AZ8B6wH7Af8BmAHoAf4B/wE8AdoC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wE5 + AYgBkwH/DAABiwGgAagB/wGgAeoB9gH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/gH/ATwB2gL/ASkB1AL/ + ASkB1AL/ASkB1AL/ASkB1AL/ASkB1AL/ASkB1AL/ATkBiAGTAf8MAAGLAaABqAH/AaAB6gH2Af8BpgHu + AfkB/wGfAesB+wH/AZgB6AH+Af8BPAHaAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHU + Av8BOQGIAZMB/wwAAYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf4B/wE8AdoC/wEp + AdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wE5AYgBkwH/DAABjgGiAasB/wGnAe4B9gH/ + AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH9Af8BMwHUAfsB/wGJAZ4BpwH/AYYBmQGjAf8BggGU + AZ8B/wFAAZABmgH/ATwBjAGXAf8BOQGIAZMB/wwAAY4BogGrAf8BpwHuAfYB/wGrAfAB9wH/AaYB7gH5 + Af8BnwHrAfsB/wGYAegB/QH/ATMB1AH7Af8BiQGeAacB/wGGAZkBowH/AYIBlAGfAf8BQAGQAZoB/wE8 + AYwBlwH/ATkBiAGTAf8MAAGOAaIBqwH/AacB7gH2Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BmAHo + Af0B/wEzAdQB+wH/AYkBngGnAf8BhgGZAaMB/wGCAZQBnwH/AUABkAGaAf8BPAGMAZcB/wE5AYgBkwH/ + DAABjgGiAasB/wGnAe4B9gH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH9Af8BMwHUAfsB/wGJ + AZ4BpwH/AYYBmQGjAf8BggGUAZ8B/wFAAZABmgH/ATwBjAGXAf8BOQGIAZMB/wwAAY8BpAGsAf8BoAHS + AdoB/wGrAfAB9wH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8kAAGPAaQBrAH/AaAB0gHa + Af8BqwHwAfcB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGNAaEBqgH/JAABjwGkAawB/wGgAdIB2gH/ + AasB8AH3Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGhAaoB/yQAAY8BpAGsAf8BoAHSAdoB/wGr + AfAB9wH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8oAAGPAaQBrAH/AY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGs + Af8sAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGs + Af8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf//AP8A/wD/ACwAATcBhAGPAf8BKAGAAY8B/wEiATsBhwH/ + ARkBMAE9Af8BEAEkATEB/wEGARgBIwH/AQABCgEUAf8CAAEFAf8DAAH/AwAB/wMAAf8DAAH/EAABNwGE + AY8B/wEoAYABjwH/ASIBOwGHAf8BGQEwAT0B/wEQASQBMQH/AQYBGAEjAf8BAAEKARQB/wIAAQUB/wMA + Af8DAAH/AwAB/wMAAf8QAAE3AYQBjwH/ASgBgAGPAf8BIgE7AYcB/wEZATABPQH/ARABJAExAf8BBgEY + ASMB/wEAAQoBFAH/AgABBQH/AwAB/wMAAf8DAAH/AwAB/xAAATcBhAGPAf8BKAGAAY8B/wEiATsBhwH/ + ARkBMAE9Af8BEAEkATEB/wEGARgBIwH/AQABCgEUAf8CAAEFAf8DAAH/AwAB/wMAAf8DAAH/EAABOQGH + AZIB/wGJAaEBqwH/ASwBsgHUAf8CAAGAAf8CAAGJAf8CBQG2Af8CFwHmAf8CFwHmAf8CFwHmAf8CFwHm + Af8CFwHmAf8CFwHmAf8BAAENAR4B/wwAATkBhwGSAf8BiQGhAasB/wEsAbIB1AH/AQABjwHNAf8BAAEK + AScB/wIAAQcB/wMAAf8CAAEEAf8CAAENAf8DAAH/AgABCQH/AgABCAH/AQABDQEeAf8MAAE5AYcBkgH/ + AYkBoQGrAf8BLAGyAdQB/wEAAY8BzQH/AQABjgHMAf8BAAGJAcUB/wEAATkBqQH/AQABKwGYAf8BJgGM + AcAB/wEpAYkBuQH/AQABJAGKAf8BAAEjAUEB/wEAAQ0BHgH/DAABOQGHAZIB/wGJAaEBqwH/A6gB/wOn + Af8DpwH/A6cB/wOoAf8DywH/A4kB/wEgAaoB+QH/AQABMgHRAf8BAAE0AZYB/wEAAQ0BHgH/DAABPAGK + AZUB/wFAAb4B0wH/AYoBpAGuAf8CBQG2Af8CFwHmAf8CFwHmAf8CFwHmAf8CFwHmAf8CFwHmAf8CFwHm + Af8CFwHmAf8CFwHmAf8BAAEpAYAB/wwAATwBigGVAf8BQAG+AdMB/wGKAaQBrgH/AUAB3AL/ARMBpwHM + Af8BAAENAR4B/wIAAQcB/wEAAREBKgH/AgABEgH/AgABBwH/AQABAwEdAf8BBwEjAYAB/wEAASkBgAH/ + DAABPAGKAZUB/wFAAb4B0wH/AYoBpAGuAf8BQAHcAv8BIAHNAf0B/wESAb4B7wH/AQABnwHLAf8BAAGC + Aa8B/wEAAZ4BxwH/AQABoAHGAf8BAAE6AakB/wEAATQBrAH/AQABKQGAAf8MAAE8AYoBlQH/AUABvgHT + Af8BigGkAa4B/wPOAf8DywH/A8UB/wPCAf8D2wH/A44B/wGFAb0B9gH/AQABggHgAf8BAAGMAdQB/wEA + ASkBgAH/DAABPwGOAZgB/wE7AdIB7AH/AYsBpAGtAf8BAAEFATsB/wIAAYYB/wIFAbYB/wIXAeYB/wIX + AeYB/wIXAeYB/wIXAeYB/wIXAeYB/wIXAeYB/wIIAb8B/wEAAQ0BHQH/CAABPwGOAZgB/wE7AdIB7AH/ + AYsBpAGtAf8BiQHCAc4B/wEzAdgC/wEVAYUBmwH/AQIBKwGfAf8BAAEgAY0B/wEAAQgBKAH/ARIBIQGp + Af8BAAEHASgB/wEAASMBkQH/AQUBMgGqAf8BAAENAR0B/wgAAT8BjgGYAf8BOwHSAewB/wGLAaQBrQH/ + AYkBwgHOAf8BMQHVAfsB/wEeAcEB6QH/AQEBlgHDAf8BAgGlAccB/wE1AewB8gH/ATAB8wH2Af8BAAGn + AcgB/wEAAUEBtQH/AQABPAG7Af8BAAENAR0B/wgAAT8BjgGYAf8BOwHSAewB/wGLAaQBrQH/A+4B/wPq + Af8D4AH/A8oB/wPdAf8DkwH/AQABjQHrAf8BAAGfAewB/wEAAagB6QH/AQABgAHWAf8BAAENAR0B/wgA + AYABkQGcAf8BgQHXAe8B/wE/AcUB4AH/AYwBpgGwAf8BLAGvAdgB/wEBASkBnwH/AgABNwH/AgABpgH/ + AhQB3gH/AhQB3gH/AgIBrgH/AgABNwH/AQABEgGPAf8BAAErAYEB/wgAAYABkQGcAf8BgQHXAe8B/wE/ + AcUB4AH/AYwBpgGwAf8BNgHFAeIB/wEjAcIB6QH/ASMBxwHvAf8BAAE0AZQB/wEAAQoBNAH/AgABOAH/ + AQABCAEyAf8BAAEZAT4B/wEAAYkBvAH/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGM + AaYBsAH/AUAB2gH6Af8BIQHAAegB/wEEAZUBwQH/ARABuAHWAf8BrwH0AfYB/wGvAfkB+gH/AQgBvgHZ + Af8BAAGHAboB/wEAAZwB1gH/AQABKwGBAf8IAAGAAZEBnAH/AYEB1wHvAf8BPwHFAeAB/wGMAaYBsAH/ + A5cB/wPsAf8D4AH/A+AB/wOXAf8BAQGyAfgB/wEIAb4B9wH/AQABrAHwAf8BAAGBAecB/wEAASsBgQH/ + CAABgwGVAZ8B/wGJAdwB8QH/AYwB4gL/AY0BqAGxAf8BjAG6AccB/wE2AdgC/wEpAdQC/wIAATcB/wIA + AaYB/wIAAaYB/wIAATcB/wENAcUB/AH/AQMBuwH3Af8BAAGiAdsB/wETASkBNgH/BAABgwGVAZ8B/wGJ + AdwB8QH/AYwB4gL/AY0BqAGxAf8BjAG6AccB/wE2AdgC/wEpAdQC/wEpAdQC/wEAAQYBhgH/AQABEgE5 + Af8BAAEGAYYB/wENAcQB+wH/AQMBuwH3Af8BAAGiAdsB/wETASkBNgH/BAABgwGVAZ8B/wGJAdwB8QH/ + AYwB4gL/AY0BqAGxAf8BigG4AcUB/wEuAckB7QH/AQ4BpQHNAf8BGQGfAcQB/wG2AfQB9QH/AagB7wHy + Af8BDQGbAcMB/wEAAZoBywH/AQABrgHmAf8BAAGgAdgB/wETASkBNgH/BAABgwGVAZ8B/wGJAdwB8QH/ + AYwB4gL/AY0BqAGxAf8BlQGoAa0B/wObAf8D7AH/A+gB/wObAf8BIQHQAv8BFgHMAv8BAAGEAesB/wE7 + AbYB9gH/AYYBvgH3Af8BEwEpATYB/wQAAYYBmgGjAf8BkgHhAfIB/wGYAegB/QH/AYABxAHeAf8BjgGn + AbAB/wGBAd4B/QH/AYQB4AL/AYQB4AL/AYQB4AL/AYQB4AL/AYEB3wL/AT0B3QL/ATYB2AL/AS0B1gL/ + ARgBqQHRAf8BjwGbAaQB/wGGAZoBowH/AZIB4QHyAf8BmAHoAf0B/wGAAcQB3gH/AY4BpwGwAf8BgQHe + Af0B/wGEAeAC/wGEAeAC/wEAARgBhAH/AQABIgGUAf8BAAEZAYUB/wE9Ad0C/wE2AdgC/wEtAdYC/wEY + AakB0QH/AY8BmwGkAf8BhgGaAaMB/wGSAeEB8gH/AZgB6AH9Af8BgAHEAd4B/wGOAacBsAH/AT4B1QHz + Af8BNwHHAeIB/wEbAaYBxwH/ASABmgHCAf8BHwGaAcEB/wEaAaYBxwH/AS8BxAHiAf8BMQHQAfUB/wEs + AdQB/QH/ARgBqQHRAf8BjwGbAaQB/wGGAZoBowH/AZIB4QHyAf8BmAHoAf0B/wGAAcQB3gH/AY4BpwGw + Af8BkgG4AcUB/wOeAf8D8gH/A54B/wGEAeAC/wGBAd8C/wEsAc0B/AH/AQABkQHwAf8BAAGKAe8B/wEY + AakB0QH/AY8BmwGkAf8BiAGcAaUB/wGaAeYB8wH/AZ8B6wH7Af8BmAHoAf4B/wGLAawBuQH/AYsBrAG5 + Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGBAZoBpgH/AUEBlQGhAf8BPgGRAZ0B/wE8 + AY4BmQH/ATsBiwGVAf8BOQGIAZMB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5 + Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BQQGVAaEB/wE+ + AZEBnQH/ATwBjgGZAf8BOwGLAZUB/wE5AYgBkwH/AYgBnAGlAf8BmgHmAfMB/wGfAesB+wH/AZgB6AH+ + Af8BiwGsAbkB/wGLAawBuQH/AYoBqgG3Af8BiAGmAbMB/wGGAaMBrwH/AYMBnwGqAf8BgQGaAaYB/wFB + AZUBoQH/AT4BkQGdAf8BPAGOAZkB/wE7AYsBlQH/ATkBiAGTAf8BiAGcAaUB/wGaAeYB8wH/AZ8B6wH7 + Af8BmAHoAf4B/wGLAawBuQH/AYsBrAG5Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGB + AZoBpgH/AUEBlQGhAf8BPgGRAZ0B/wE8AY4BmQH/ATsBiwGVAf8BOQGIAZMB/wGLAaABqAH/AaAB6gH2 + Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH+Af8BPAHaAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHU + Av8BKQHUAv8BOQGIAZMB/wwAAYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf4B/wE8 + AdoC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wE5AYgBkwH/DAABiwGgAagB/wGg + AeoB9gH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/gH/ATwB2gL/ASkB1AL/ASkB1AL/ASkB1AL/ASkB1AL/ + ASkB1AL/ASkB1AL/ATkBiAGTAf8MAAGLAaABqAH/AaAB6gH2Af8BpgHuAfkB/wGfAesB+wH/AZgB6AH+ + Af8BPAHaAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BOQGIAZMB/wwAAY4BogGr + Af8BpwHuAfYB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/QH/ATMB1AH7Af8BiQGeAacB/wGG + AZkBowH/AYIBlAGfAf8BQAGQAZoB/wE8AYwBlwH/ATkBiAGTAf8MAAGOAaIBqwH/AacB7gH2Af8BqwHw + AfcB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf0B/wEzAdQB+wH/AYkBngGnAf8BhgGZAaMB/wGCAZQBnwH/ + AUABkAGaAf8BPAGMAZcB/wE5AYgBkwH/DAABjgGiAasB/wGnAe4B9gH/AasB8AH3Af8BpgHuAfkB/wGf + AesB+wH/AZgB6AH9Af8BMwHUAfsB/wGJAZ4BpwH/AYYBmQGjAf8BggGUAZ8B/wFAAZABmgH/ATwBjAGX + Af8BOQGIAZMB/wwAAY4BogGrAf8BpwHuAfYB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/QH/ + ATMB1AH7Af8BiQGeAacB/wGGAZkBowH/AYIBlAGfAf8BQAGQAZoB/wE8AYwBlwH/ATkBiAGTAf8MAAGP + AaQBrAH/AaAB0gHaAf8BqwHwAfcB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGNAaEBqgH/JAABjwGk + AawB/wGgAdIB2gH/AasB8AH3Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGhAaoB/yQAAY8BpAGs + Af8BoAHSAdoB/wGrAfAB9wH/AasB8AH3Af8BpgHuAfkB/wGfAesB+wH/AY0BoQGqAf8kAAGPAaQBrAH/ + AaAB0gHaAf8BqwHwAfcB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGNAaEBqgH/KAABjwGkAawB/wGP + AaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH/LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/LAABjwGk + AawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH//wD/AP8A/wAsAAFCAYQBjwH/ATkBRwGF + Af8BLQE6AUQB/wEeASoBMwH/AQ8BGQEhAf8BAAEHAQ4B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wQAAUIBhAGPAf8BOQFHAYUB/wEtAToBRAH/AR4BKgEzAf8BDwEZASEB/wEAAQcBDgH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/BAABNwGEAY8B/wEoAYABjwH/ASIBOwGH + Af8BGQEwAT0B/wEQASQBMQH/AQYBGAEjAf8BAAEKARQB/wIAAQUB/wMAAf8DAAH/AwAB/wMAAf8QAAE3 + AYQBjwH/ASgBgAGPAf8BIgE7AYcB/wEZATABPQH/ARABJAExAf8BBgEYASMB/wEAAQoBFAH/AgABBQH/ + AwAB/wMAAf8DAAH/AwAB/xAAAUQBhwGSAf8BogHfAfAB/wE9Ac0B6gH/ARYBuAHiAf8BBAGuAdsB/wEA + AakB2QH/AQABoQHSAf8BAAGYAccB/wEAAY4BvAH/AQABgwGuAf8BAAFMAasB/wEAAUkBqQH/AQABRAGf + Af8BAAE/AZYB/wMAAf8EAAFEAYcBkgH/AaIB3wHwAf8BPQHNAeoB/wEWAbgB4gH/A0QB/wNEAf8DRAH/ + A0QB/wNEAf8DRAH/A0QB/wEAAUkBqQH/AQABRAGfAf8BAAE/AZYB/wMAAf8EAAE5AYcBkgH/AYkBoQGr + Af8BLAGyAdQB/wEAAY8BzQH/AQABjwHNAf8BAAGPAc0B/wEAAYwBxwH/AQABiAG+Af8BAAGCAbQB/wEA + AT4BqQH/AQABOQGfAf8BAAE0AZYB/wEAAQ0BHgH/DAABOQGHAZIB/wGJAaEBqwH/ASwBsgHUAf8BAAGP + Ac0B/wEAAY8BzQH/AQABjwHNAf8BAAGMAccB/wGcAbkByQH/AS8BzwHyAf8BhwHqAf0B/wEHAZ0B1gH/ + AQABNwGkAf8BAAENAR4B/wwAAUcBigGVAf8BqgHoAfYB/wGVAeUB/AH/AYQB3wH7Af8CAAHuAf8BNwHQ + AfcB/wEqAcYB9AH/AR0BvgHwAf8BDgG0AewB/wIAAe4B/wEAAaQB5gH/AgAB7gH/AgAB7gH/AgAB7gH/ + AwAB/wQAAUcBigGVAf8BqgHoAfYB/wGVAeUB/AH/A0QB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEA + AeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/A0QB/wEAAZAB1wH/AQABRAGfAf8DAAH/BAABPAGK + AZUB/wFAAb4B0wH/AYoBpAGuAf8BQAHcAv8BIQHPAv8BFwHLAv8BDgHEAfoB/wEDAbwB9QH/AQABswHw + Af8BAAGqAesB/wEAAaAB5QH/AQABjAHUAf8BAAEpAYAB/wwAATwBigGVAf8BQAG+AdMB/wGKAaQBrgH/ + AUAB3AL/ASEBzwL/ARcBywL/AQABjAHgAf8BAgGhAd8B/wESAa8B4QH/AT8B6QH9Af8BgQHvAv8BGQG0 + AeMB/wEAASkBgAH/DAABSgGOAZgB/wGwAeoB9gH/AZ8B6QH7Af8CAAHuAf8CAAHuAf8CAAHuAf8BNQHO + AfcB/wEqAcYB9AH/ARoBvAHwAf8CAAHuAf8BAgGqAegB/wIAAe4B/wEAAZYB3AH/AgAB7gH/AQABAQEI + Af8EAAFKAY4BmAH/AbAB6gH2Af8BnwHpAfsB/wNEAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHg + AewB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wNEAf8BAAGWAdwB/wEAAUkBqQH/AQABAQEIAf8EAAE/ + AY4BmAH/ATsB0gHsAf8BiwGkAa0B/wGJAcIBzgH/ATMB2AL/AScB0wL/AR4BzgL/ARMByQH+Af8BCwHB + AfoB/wEBAbkB9QH/AQABsAHuAf8BAAGoAekB/wEAAYUBzQH/AQABDQEdAf8IAAE/AY4BmAH/ATsB0gHs + Af8BiwGkAa0B/wGJAcIBzgH/ATMB2AL/AScB0wL/AQABiQHYAf8BiwHsAv8BLgHhAfkB/wEeAcAB6AH/ + AQEBjAHQAf8BBQGSAdMB/wEHAZUB1QH/AQABDQEdAf8IAAGAAZEBnAH/AbYB7QH4Af8CAAHuAf8CAAHu + Af8CAAHuAf8CAAHuAf8CAAHuAf8BNQHOAfcB/wEoAcUB9AH/AgAB7gH/AQoBsgHsAf8CAAHuAf8BAAGe + AeIB/wIAAe4B/wEIARABGAH/BAABgAGRAZwB/wG2Ae0B+AH/AaoB7AH7Af8DRAH/AQAB4AHsAf8DAAH/ + AQAB4AHsAf8DAAH/AQAB4AHsAf8DAAH/AQAB4AHsAf8DRAH/AQABngHiAf8BAAGCAbQB/wEIARABGAH/ + BAABgAGRAZwB/wGBAdcB7wH/AT8BxQHgAf8BjAGmAbAB/wGAAd0B/gH/ASoB0wL/ASkB1AL/ASQB0QL/ + ARoBzQL/ARABxwH8Af8BCAG+AfcB/wEAAbYB8gH/AQABrAHsAf8BAAErAYEB/wgAAYABkQGcAf8BgQHX + Ae8B/wE/AcUB4AH/AYwBpgGwAf8BgAHdAf4B/wEqAdMC/wEmAaMB0gH/AYgB1AHyAf8BPgHgAfgB/wEa + AcwB7wH/AQcBlQHVAf8BAAGUAcgB/wEAAawB7AH/AQABKwGBAf8IAAGDAZUBnwH/Ab4B8AH5Af8CAAHu + Af8CAAHuAf8CAAHuAf8CAAHuAf8CAAHuAf8BPgHVAfkB/wIAAe4B/wIAAe4B/wEYAbsB8AH/AgAB7gH/ + AQABpAHjAf8CAAHuAf8BFgEgASkB/wQAAYMBlQGfAf8BvgHwAfkB/wGrAfAB9wH/A0QB/wEAAeAB7AH/ + AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/A0QB/wEAAaQB4wH/ + AQABigG/Af8BFgEgASkB/wQAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGNAagBsQH/AYwBugHHAf8BNgHY + Av8BKQHUAv8BKQHUAv8BKQHUAv8BIQHQAv8BFgHNAv8BDQHFAfwB/wEDAbsB9wH/AQABogHbAf8BEwEp + ATYB/wQAAYMBlQGfAf8BiQHcAfEB/wGMAeIC/wGNAagBsQH/AYwBugHHAf8BNgHYAv8BKQHUAv8BFwG1 + AeYB/wHZAfkB/gH/AQ8B0wH0Af8BDQG1AeUB/wELAZgB1gH/AQABrgHmAf8BAAGiAdsB/wETASkBNgH/ + BAABhgGZAaMB/wG+AfAB+QH/AgAB7gH/AgAB7gH/AaQB6wH6Af8CAAHuAf8CAAHuAf8BSgHcAfwB/wE+ + AdUB+QH/AgAB7gH/ASUBxAHzAf8CAAHuAf8CAAHuAf8CAAHuAf8BJAEwATgB/wQAAYYBmQGjAf8BvgHw + AfkB/wG2Ae0B+AH/A0QB/wEAAeAB7AH/AQAB4AHsAf8BAAHgAewB/wEAAeAB7AH/AQAB4AHsAf8BAAHg + AewB/wEAAeAB7AH/A0QB/wECAakB5wH/AQABjwHHAf8BJAEwATgB/wQAAYYBmgGjAf8BkgHhAfIB/wGY + AegB/QH/AYABxAHeAf8BjgGnAbAB/wGBAd4B/QH/AYQB4AL/AYQB4AL/AYQB4AL/AYQB4AL/AYEB3wL/ + AT0B3QL/ATYB2AL/AS0B1gL/ARgBqQHRAf8BjwGbAaQB/wGGAZoBowH/AZIB4QHyAf8BmAHoAf0B/wGA + AcQB3gH/AY4BpwGwAf8BgQHeAf0B/wGEAeAC/wEAAZ4B3QH/AY8B6AH5Af8BkgHoAfkB/wGXAekB+wH/ + AQ4BmAHYAf8BGgGmAdAB/wEtAdYC/wEYAakB0QH/AY8BmwGkAf8BiQGcAaYB/wG+AfAB+QH/AbYB7QH4 + Af8BtgHtAfgB/wGrAfAB9wH/AaIB7AH6Af8BlQHmAfsB/wGJAeEB/AH/AUoB3AH8Af8BPAHTAfoB/wEw + AcwB9wH/ASIBwwHzAf8BFgG5Ae8B/wEAAZkBzwH/ATABPQFHAf8EAAGJAZwBpgH/Ab4B8AH5Af8BtgHt + AfgB/wG2Ae0B+AH/A0QB/wNEAf8DRAH/A0QB/wNEAf8DRAH/A0QB/wEiAcMB8wH/ARYBuQHvAf8BAAGZ + Ac8B/wEwAT0BRwH/BAABiAGcAaUB/wGaAeYB8wH/AZ8B6wH7Af8BmAHoAf4B/wGLAawBuQH/AYsBrAG5 + Af8BigGqAbcB/wGIAaYBswH/AYYBowGvAf8BgwGfAaoB/wGBAZoBpgH/AUEBlQGhAf8BPgGRAZ0B/wE8 + AY4BmQH/ATsBiwGVAf8BOQGIAZMB/wGIAZwBpQH/AZoB5gHzAf8BnwHrAfsB/wGYAegB/gH/AYsBrAG5 + Af8BiwGsAbkB/wGKAaoBtwH/AYgBpgGzAf8BhgGjAa8B/wGDAZ8BqgH/AYEBmgGmAf8BQQGVAaEB/wE+ + AZEBnQH/ATwBjgGZAf8BOwGLAZUB/wE5AYgBkwH/AYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5 + Af8BvgHwAfkB/wG0AfIB+AH/AaoB7AH7Af8BoAHpAfsB/wGVAeUB/AH/AYoB3wH8Af8BTAHYAfsB/wFB + AdIB+AH/ATUBygH0Af8BKgHAAfEB/wEwAT0BRwH/BAABiwGgAagB/wG+AfAB+QH/Ab4B8AH5Af8BvgHw + AfkB/wG+AfAB+QH/AbQB8gH4Af8BqgHsAfsB/wGgAekB+wH/AZUB5QH8Af8BigHfAfwB/wFMAdgB+wH/ + AUEB0gH4Af8BNQHKAfQB/wEqAcAB8QH/ATABPQFHAf8EAAGLAaABqAH/AaAB6gH2Af8BpgHuAfkB/wGf + AesB+wH/AZgB6AH+Af8BPAHaAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BKQHUAv8BOQGI + AZMB/wwAAYsBoAGoAf8BoAHqAfYB/wGmAe4B+QH/AZ8B6wH7Af8BmAHoAf4B/wE8AdoC/wEpAdQC/wEp + AdQC/wEpAdQC/wEpAdQC/wEpAdQC/wEpAdQC/wE5AYgBkwH/DAABjQGhAaoB/wGNAaEBqgH/AY0BoQGq + Af8BjQGhAaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGE + AZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/AUIBhAGPAf8EAAGNAaEBqgH/AY0BoQGqAf8BjQGh + AaoB/wGNAaEBqgH/AY0BoQGqAf8BiwGfAagB/wGJAZwBpgH/AYkBmwGmAf8BhwGaAaQB/wGGAZkBowH/ + AYQBlgGgAf8BhAGWAaAB/wGDAZUBoAH/AYMBlQGgAf8BQgGEAY8B/wQAAY4BogGrAf8BpwHuAfYB/wGr + AfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGYAegB/QH/ATMB1AH7Af8BiQGeAacB/wGGAZkBowH/AYIBlAGf + Af8BQAGQAZoB/wE8AYwBlwH/ATkBiAGTAf8MAAGOAaIBqwH/AacB7gH2Af8BqwHwAfcB/wGmAe4B+QH/ + AZ8B6wH7Af8BmAHoAf0B/wEzAdQB+wH/AYkBngGnAf8BhgGZAaMB/wGCAZQBnwH/AUABkAGaAf8BPAGM + AZcB/wE5AYgBkwH/DAABjwGkAawB/wGyAeQB7AH/AbYB7QH4Af8BtgHtAfgB/wGpAewB9gH/AZIB4QHz + Af8BjQGhAaoB/yQAAY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/ + AY0BoQGqAf8kAAGPAaQBrAH/AaAB0gHaAf8BqwHwAfcB/wGrAfAB9wH/AaYB7gH5Af8BnwHrAfsB/wGN + AaEBqgH/JAABjwGkAawB/wGgAdIB2gH/AasB8AH3Af8BqwHwAfcB/wGmAe4B+QH/AZ8B6wH7Af8BjQGh + AaoB/ygAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGs + Af8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB//8A/wD/AP8A + LAABPQGEAY8B/wE0AUIBhQH/ASgBNQE/Af8BGQElAS4B/wEKARQBHAH/AQABAgEJAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8EAAFBAYQBjwH/ATgBRgGFAf8BLAE5AUMB/wEdASkBMgH/ + AQ4BGAEgAf8BAAEGAQ0B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wQAAUEBhAGP + Af8BOAFGAYUB/wEsATkBQwH/AR0BKQEyAf8BDgEYASAB/wEAAQYBDQH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/BAABQgGEAY8B/wE5AUcBhQH/AS0BOgFEAf8BHgEqATMB/wEPARkBIQH/ + AQABBwEOAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8EAAE/AYcBkgH/AaIB3wHw + Af8BNgHKAeYB/wENAa0B1QH/AQABnwHIAf8BAAGfAcwB/wEAAZgBxgH/AQABiQGzAf8BAAFFAaYB/wEA + AT4BnAH/AQABPAGcAf8BAAE3AZgB/wEAATMBjwH/AQABMgGLAf8DAAH/BAABQwGHAZIB/wGiAd8B8AH/ + A4QB/wOtAf8DmQH/A5kB/wOUAf8DlAH/A0IB/wOtAf8DiQH/AQABOgHJAf8BAAE8AaoB/wEAAT4BlgH/ + AwAB/wQAAUMBhwGSAf8BogHfAfAB/wE8Ac0B6gH/AcgBEwEAAf8B+AGzAaEB/wH2ATUBGgH/AfIBMgEU + Af8BzwEYAQAB/wEAATYBjAH/AQABMgGIAf8BAAExAYgB/wEAATMBjQH/AQABNwGPAf8BAAE6AZAB/wMA + Af8EAAFEAYcBkgH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8DAAH/ + BAABQgGKAZUB/wGqAegB9gH/AY8B2wHxAf8BLQEKAQAB/wEvAb0B3QH/AScBuwHeAf8BLQEKAQAB/wEM + AaIBzQH/AS0BCgEAAf8BAAGRAcYB/wEtAQoBAAH/AQABhAG/Af8BLQEKAQAB/wEAATUBkQH/AwAB/wQA + AUYBigGVAf8BqgHoAfYB/wOSAf8BnQEnAQAB/wOjAf8BnQEnAQAB/wOVAf8DlAH/AZ0BJwEAAf8DyAH/ + AZ0BJwEAAf8BDgGWAe4B/wEAAUABzwH/AQABQwGfAf8DAAH/BAABRgGKAZUB/wGqAegB9gH/AZUB5QH8 + Af8BhAHfAfsB/wHJARMBAAH/AfgBswGhAf8B9gE1ARoB/wHxATEBEgH/Ac0BFgEAAf8BxwESAQAB/wHH + ARIBAAH/AQABPwGmAf8BAAE9AaMB/wEAATQBiwH/AwAB/wQAAUcBigGVAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8CAAHGAf8BAAEGAQAB/wIAAcYB/wIAAcYB/wIA + AcYB/wEAAQYBAAH/AQABBgEAAf8DAAH/BAABRQGOAZgB/wGwAeoB9gH/AS0BCgEAAf8BgQHJAd4B/wEt + AQoBAAH/AS8BvQHdAf8BLQEKAQAB/wEtAQoBAAH/AS0BCgEAAf8BAQGfAdAB/wEtAQoBAAH/AS0BCgEA + Af8BAAGAAbwB/wEAATkBmgH/AgABAwH/BAABSQGOAZgB/wGwAeoB9gH/A5wB/wGdAScBAAH/A8MB/wGd + AScBAAH/A7gB/wO8Af8BnQEnAQAB/wPbAf8BnQEnAQAB/wGKAcEB+wH/AQABgwHbAf8BAAGBAawB/wIA + AQcB/wQAAUkBjgGYAf8BsAHqAfYB/wGfAekB+wH/AZIB5AH8Af8BgQHdAfsB/wHJARMBAAH/AfgBswGh + Af8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wHdASMBAAH/AT0BKAEeAf8BAAExAYkB/wIA + AQcB/wQAAUoBjgGYAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEA + Af8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQEBCAH/BAABgAGRAZwB/wG2Ae0B+AH/AS0BCgEAAf8BjgHUAeUB/wEtAQoBAAH/AT4BygHlAf8BLQEK + AQAB/wEqAcIB6AH/AS0BCgEAAf8BEAGxAeIB/wEtAQoBAAH/AQABlQHNAf8BLQEKAQAB/wEAAUIBqQH/ + AQMBCwETAf8EAAGAAZEBnAH/AbYB7QH4Af8DoAH/AZ0BJwEAAf8D3QH/AZ0BJwEAAf8D2wH/AZ0BJwEA + Af8BnQEnAQAB/wPmAf8BnQEnAQAB/wGdAScBAAH/AZ0BJwEAAf8BAAGMAboB/wEHAQ8BFwH/BAABgAGR + AZwB/wG2Ae0B+AH/AaoB7AH7Af8BmwHoAfsB/wGPAeMB/AH/AYEB3QH7Af8ByQETAQAB/wH2ATUBGgH/ + AfYBNQEaAf8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8BxwESAQAB/wEAATMBjwH/AQcBDwEXAf8EAAGA + AZEBnAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AgABxgH/ + AgABxgH/AgABxgH/AgABxgH/AgABxgH/AQABBgEAAf8BAAEGAQAB/wEIARABGAH/BAABgwGVAZ8B/wG+ + AfAB+QH/AS0BCgEAAf8BoAHmAfQB/wEtAQoBAAH/AYUB2wH1Af8BRQHaAfcB/wEtAQoBAAH/ASoBxwHw + Af8BHwHBAe8B/wEtAQoBAAH/AS0BCgEAAf8BAAGdAdkB/wEAAYgBvAH/AREBGwEkAf8EAAGDAZUBnwH/ + Ab4B8AH5Af8DpAH/AZ0BJwEAAf8D8wH/AZ0BJwEAAf8BnQEnAQAB/wPqAf8BnQEnAQAB/wPoAf8BnQEn + AQAB/wFBAbMB8gH/ASUBrwHrAf8BAAGTAcQB/wEVAR8BKAH/BAABgwGVAZ8B/wG+AfAB+QH/AasB8AH3 + Af8BpQHsAfsB/wGYAecB+wH/AYkB4QH8Af8BxwESAQAB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wHe + AZIBNwH/AfYBNQEaAf8BxwESAQAB/wEAAT8BnwH/ARUBHwEoAf8EAAGDAZUBnwH/AQABBgEAAf8BAAEG + AQAB/wEAAQYBAAH/AQABMAGmAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BFgEgASkB/wQAAYYBmQGjAf8BvgHwAfkB/wG2 + Ae0B+AH/AbAB7gH6Af8BpAHrAfoB/wGVAeYB+wH/AYkB4QH8Af8BRQHcAfwB/wE5AdUB+QH/AS0BzQH3 + Af8BIAHEAfMB/wERAbkB7wH/AQABqQHnAf8BAAGPAccB/wEfASsBMwH/BAABhgGZAaMB/wG+AfAB+QH/ + Aa8BwgHHAf8BnQEnAQAB/wOvAf8BnQEnAQAB/wOrAf8D7wH/AZ0BJwEAAf8D5wH/AZ0BJwEAAf8BnQEn + AQAB/wGdAScBAAH/AQABlQHQAf8BIwEvATcB/wQAAYYBmQGjAf8BvgHwAfkB/wG2Ae0B+AH/AbAB7gH6 + Af8BpAHrAfoB/wGVAeYB+wH/AccBEwEAAf8B+AGzAaEB/wH2ATUBGgH/Ad4BkgE3Af8BpQEGAQAB/wHe + AZIBNwH/AccBEgEAAf8BAAGAAbMB/wEjAS8BNwH/BAABhgGZAaMB/wEAAQYBAAH/AQABBgEAAf8BAAEw + AaYB/wEAAUQBvwH/AQABMAGmAf8BAAEGAQAB/wIAAcYB/wIAAcYB/wIAAcYB/wIAAcYB/wEAAQYBAAH/ + AgABxgH/AQABBgEAAf8BJAEwATgB/wQAAYkBnAGmAf8BvgHwAfkB/wG2Ae0B+AH/AbYB7QH4Af8BqwHw + AfcB/wGiAewB+gH/AZUB5gH7Af8BiQHhAfwB/wFFAdwB/AH/ATcB0wH6Af8BKwHMAfcB/wEdAcMB8wH/ + AREBuQHvAf8BAAGZAc8B/wErATgBQgH/BAABiQGcAaYB/wG+AfAB+QH/AbkB7gH4Af8BvAHuAfkB/wGy + AfEB+AH/AakB7QH6Af8BnQG9AcUB/wOfAf8D7QH/A+oB/wOnAf8BPAHMAfUB/wEqAcEB8QH/AQABhwHq + Af8BLwE8AUYB/wQAAYkBnAGmAf8BvgHwAfkB/wG2Ae0B+AH/AbYB7QH4Af8BqwHwAfcB/wGiAewB+gH/ + AdIBRQEjAf8B2QEgAQAB/wH4AbMBoQH/AfgBswGhAf8B3gGSATcB/wHHARIBAAH/AQoBnQHKAf8BAAGR + AcQB/wEvATwBRgH/BAABiQGcAaYB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAATABpgH/AQABBgEA + Af8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/ATABPQFHAf8EAAGLAaABqAH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BtAHy + AfgB/wGqAewB+wH/AaAB6QH7Af8BlQHlAfwB/wGKAd8B/AH/AUcB2AH7Af8BPAHSAfgB/wEwAcoB9AH/ + ASUBwAHxAf8BKwE4AUIB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BvgHwAfkB/wG0 + AfIB+AH/AaoB7AH7Af8BnwG9AcQB/wOeAf8D8gH/A54B/wFAAdIB+AH/ATQBygH0Af8BHgG1AfAB/wEv + ATwBRgH/BAABiwGgAagB/wG+AfAB+QH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/AbQB8gH4Af8BqgHs + AfsB/wHPAUABHwH/AccBEwEAAf8BxwESAQAB/wHHARIBAAH/AdABGQEAAf8BLwHAAegB/wEoAb0B7QH/ + AS8BPAFGAf8EAAGLAaABqAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEA + Af8BMAE9AUcB/wQAAY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGLAZ8BqAH/ + AYkBnAGmAf8BiQGbAaYB/wGHAZoBpAH/AYYBmQGjAf8BhAGWAaAB/wGEAZYBoAH/AYMBlQGgAf8BgwGV + AaAB/wE9AYQBjwH/BAABjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AYsBnwGo + Af8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGEAZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGD + AZUBoAH/AUEBhAGPAf8EAAGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BiwGf + AagB/wGJAZwBpgH/AYkBmwGmAf8BhwGaAaQB/wGGAZkBowH/AYQBlgGgAf8BhAGWAaAB/wGDAZUBoAH/ + AYMBlQGgAf8BQQGEAY8B/wQAAY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGL + AZ8BqAH/AYkBnAGmAf8BiQGbAaYB/wGHAZoBpAH/AYYBmQGjAf8BhAGWAaAB/wGEAZYBoAH/AYMBlQGg + Af8BgwGVAaAB/wFCAYQBjwH/BAABjwGkAawB/wGyAeQB7AH/AbYB7QH4Af8BtgHtAfgB/wGpAewB9gH/ + AZIB4QHzAf8BjQGhAaoB/yQAAY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGS + AeEB8wH/AY0BoQGqAf8kAAGPAaQBrAH/AbIB5AHsAf8BtgHtAfgB/wG2Ae0B+AH/AakB7AH2Af8BkgHh + AfMB/wGNAaEBqgH/JAABjwGkAawB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEA + Af8BjQGhAaoB/ygAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGs + Af8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/ + AY8BpAGsAf8BjwGkAawB/ywAAY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB//8A + /wD/AP8ALAABMwGEAY8B/wEqATgBhQH/AR4BKwE1Af8BDwEbASQB/wEAAQoBEgH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wQAATMBhAGPAf8BKgE4AYUB/wEeASsBNQH/AQ8BGwEk + Af8BAAEKARIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8EAAEzAYQBjwH/ + ASoBOAGFAf8BHgErATUB/wEPARsBJAH/AQABCgESAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/BAABMwGEAY8B/wEqATgBhQH/AR4BKwE1Af8BDwEbASQB/wEAAQoBEgH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wQAATUBhwGSAf8BogHfAfAB/wEuAc0B6gH/ + AQcBuAHiAf8BAAGuAdsB/wEAAakB2QH/AQABoQHSAf8BAAGYAccB/wEAAY4BvAH/AQABgwGuAf8BAAE9 + AasB/wEAAToBqQH/AQABNQGfAf8BAAEwAZYB/wMAAf8EAAE1AYcBkgH/AaIB3wHwAf8BBgGIAaUB/wEA + ATkBnQH/AQABLwGMAf8BAAE0AZkB/wEAATIBmgH/AQABmAHHAf8BAAEpAZAB/wEAASYBigH/AQABHQE4 + Af8BAAEjAYgB/wEAAR8BgwH/AQABMAGWAf8DAAH/BAABNQGHAZIB/wEzATkBAAH/ATQBhQEaAf8BqAGk + AYkB/wGzAasBhwH/AbEBqgE9Af8BtwGvATsB/wGdAZoBJAH/ATMBOQEAAf8BAQEiAQAB/wEAASYBAAH/ + AQABKgEAAf8BAAEiAQAB/wEAASUBAAH/AwAB/wQAATUBhwGSAf8BpAHVAd0B/wGXAaYBigH/AQcBuAHi + Af8BAAGuAdsB/wEAAakB2QH/AQkBnAG4Af8BKgEvAYoB/wEjAQABsgH/AQABHwGvAf8BCAEPAa4B/wEL + AQcBrgH/AQABNQGfAf8BAAEwAZYB/wMAAf8EAAE4AYoBlQH/AaoB6AH2Af8BlQHlAfwB/wHSAcQBrQH/ + AY0B2QH1Af8BKAHQAfcB/wEbAcYB9AH/AQ4BvgHwAf8BAAG0AewB/wEAAaoB6AH/AQABpAHmAf8BAAGa + Ad8B/wEAAZAB1wH/AQABNQGfAf8DAAH/BAABOAGKAZUB/wGqAegB9gH/ARUBogHbAf8BjgGqAb8B/wGX + AZIBjwH/AY4BqgG+Af8BFQGiAdsB/wEOAb4B8AH/ARUBogHbAf8BjgGqAb8B/wGXAZIBjwH/AY4BqgG+ + Af8BFQGiAdsB/wEAATUBnwH/AwAB/wQAATgBigGVAf8BswGrAYoC/wH5AdAD/wH7A/8B9wP/AegC/wH5 + AdAC/wHuAbcB/wHaAa8BLwH/AaoBigEiAf8BwwG5AZwB/wG2AZ8BKAH/AYIBNwEAAf8BNAE8AQAB/wMA + Af8EAAE4AYoBlQH/AaoB6AH2Af8BpwGrAYcB/wGQAcoB0QH/AYYBwwHQAf8BPAG/Ac4B/wGVAZ4BgwH/ + ARsBmgHYAf8BFgExAdAB/wEAAaoB6AH/AQABpAHmAf8BDgEYAcYB/wEAAZAB1wH/AQABNQGfAf8DAAH/ + BAABOwGOAZgB/wGwAeoB9gH/AZ8B6QH7Af8BjwEZAQAB/wGrAYcBBgH/AYwB1gHvAf8BggHRAfEB/wEb + AcYB9AH/AQsBvAHwAf8BjwEZAQAB/wEAAaoB6AH/AY8BGQEAAf8BAAGWAdwB/wEAAToBqQH/AwAB/wQA + ATsBjgGYAf8BsAHqAfYB/wEYAYkBpwH/ATMBIAEUAf8BGgIWAf8BMwEgARMB/wERAYYBpgH/ARsBxgH0 + Af8BDgGDAaUB/wEzASABFAH/ARoCFgH/ATMBIAETAf8BBwE8AaMB/wEAAToBqQH/AwAB/wQAATsBjgGY + Af8BgwGqAa0B/wHWAdoB0gX/Af4B8wHUAf8B8gHhAbAB/wHuAdoBnwH/AdEBvQGAAf8BswGrAYoB/wL2 + Ad0D/wHXAv8B8AG4Av8B5QGnAf8BiAE3ARoB/wMAAf8EAAE7AY4BmAH/AbAB6gH2Af8BpgHGAboB/wGo + AaUBNgH/AZoBswGiAf8BlQGvAaEB/wKdATMB/wEfAaUB5AH/ARsBNwHSAf8BAAG0AewB/wEAAaoB6AH/ + AQ0BJgHMAf8BAAGKAdcB/wEAAToBqQH/AwAB/wQAAYABkQGcAf8BtgHtAfgB/wGqAewB+wH/AY8BGQEA + Af8BjwEZAQAB/wGVASIBAAH/AbwBogEyAf8BhAHTAfMB/wEZAcUB9AH/AY8BGQEAAf8BAAGyAewB/wGP + ARkBAAH/AQABngHiAf8BAAGCAbQB/wEAAQEBCQH/BAABgAGRAZwB/wG2Ae0B+AH/ARIBkAG5Af8BIAEi + ASUB/wEcAQcBAAH/ASABIgEmAf8BCgGNAbkB/wEmAc4B9wH/AQgBiwG4Af8BIAEiASUB/wEcAQcBAAH/ + ASABIgEmAf8BAAGGAbYB/wEAAYIBtAH/AQABAQEJAf8EAAGAAZEBnAH/AbYB7QH4Af8BgwGqAa0B/wHY + AdcB0gP/AfoB/wHwAeQBvgH/AdwBxgGGAf8BIQE3ASgB/wGiAa4BrQX/Ae0B3gG1Af8B6QHXAZwB/wEp + AT0BLQH/AQABMwGeAf8BAAEBAQkB/wQAAYABkQGcAf8BtgHtAfgB/wGqAewB+wH/AagBswGUAf8BjwHj + AfwB/wGRAcQBxgH/AYcBvgHEAf8BJwGsAecB/wEiATwB1AH/AQsBvAHwAf8BAAGyAewB/wEUASEBygH/ + AQABngHiAf8BAAGCAbQB/wEAAQEBCQH/BAABgwGVAZ8B/wG+AfAB+QH/AasB8AH3Af8BjwEZAQAB/wGP + ARkBAAH/AY8BGQEAAf8BvQGjATMB/wGKAdgB8gH/ASMBzQH3Af8BjwEZAQAB/wEJAbsB8AH/AY8BGQEA + Af8BAAGkAeMB/wEAAYoBvwH/AQcBEQEaAf8EAAGDAZUBnwH/Ab4B8AH5Af8BCgGUAcQB/wEFAYkBuwH/ + ARABLgGKAf8BBQGJAbwB/wEEAZEBxAH/AS8B1QH5Af8BAQGPAcQB/wEFAYkBuwH/ARABLgGKAf8BBQGJ + AbwB/wEAAYoBwQH/AQABigG/Af8BBwERARoB/wQAAYMBlQGfAf8BvgHwAfkB/wGrAfAB9wH/ATwBqgGv + Af8B4gLhBf8BLAGHATwB/wEvAdUB+QH/ARwBtgHWAf8BvgHDAcEF/wEwAYEBNwH/AQABmwHTAf8BAAGK + Ab8B/wEHAREBGgH/BAABgwGVAZ8B/wG+AfAB+QH/AasB8AH3Af8BrQGvAYYB/wGaAeIB8QH/AaMBqgGH + Af8BPQHdAfsB/wEuAbEB6AH/ASkBAAG6Af8BHgGRAdwB/wEaATYB0gH/ARcBJwHMAf8BAAGkAeMB/wEA + AYoBvwH/AQcBEQEaAf8EAAGGAZkBowH/Ab4B8AH5Af8BtgHtAfgB/wGPARkBAAH/AawBiQEIAf8BpgHj + AfEB/wGJAeEB/AH/ATsB3AH8Af8BLwHVAfkB/wGPARkBAAH/ARYBxAHzAf8BjwEZAQAB/wEAAakB5wH/ + AQABjwHHAf8BFQEhASkB/wQAAYYBmQGjAf8BvgHwAfkB/wECAYgBuQH/AQABLwG0Af8BAAEEAYMB/wEA + AS8BtAH/AQABhwG5Af8BOwHcAfwB/wEAAYcBuQH/AQABLwG0Af8BAAEEAYMB/wEAAS8BtAH/AQABhAG3 + Af8BAAGPAccB/wEVASEBKQH/BAABhgGZAaMB/wG+AfAB+QH/AbYB7QH4Af8BsAHuAfoB/wGCAaYBowH/ + AYoBpQGiAf8BiQHhAfwB/wE7AdwB/AH/AS8B1QH5Af8BGgGfAbQB/wGAAZwBoAH/AQgBrwHfAf8BAAGp + AecB/wEAAY8BxwH/ARUBIQEpAf8EAAGGAZkBowH/Ab4B8AH5Af8BtgHtAfgB/wGwAdwB2wH/AaoBwgGu + Af8BpQGyAZQB/wGJAeEB/AH/ATcBtwHrAf8BLQGJAdcB/wElAasB5wH/ARsBowHkAf8BBwG5Ae8B/wEA + AakB5wH/AQABjwHHAf8BFQEhASkB/wQAAYkBnAGmAf8BvgHwAfkB/wG2Ae0B+AH/AdcBygGzAf8BugHw + AfUB/wGiAewB+gH/AZUB5gH7Af8BiQHhAfwB/wE7AdwB/AH/AS0B0wH6Af8BIQHMAfcB/wETAcMB8wH/ + AQcBuQHvAf8BAAGZAc8B/wEhAS4BOAH/BAABiQGcAaYB/wG+AfAB+QH/ARcBlQG9Af8BBQGIAbgB/wEA + ATEBowH/AQQBiAG5Af8BEQGUAb0B/wGJAeEB/AH/AQ0BkgG9Af8BAQGHAbkB/wEAAS8BowH/AQABhgG4 + Af8BAwGMAbsB/wEAAZkBzwH/ASEBLgE4Af8EAAGJAZwBpgH/Ab4B8AH5Af8BtgHtAfgB/wG2Ae0B+AH/ + AasB8AH3Af8BogHsAfoB/wGVAeYB+wH/AYkB4QH8Af8BOwHcAfwB/wEtAdMB+gH/ASEBzAH3Af8BEwHD + AfMB/wEHAbkB7wH/AQABmQHPAf8BIQEuATgB/wQAAYkBnAGmAf8BvgHwAfkB/wG2Ae0B+AH/AbYB7QH4 + Af8BsAGTAQAB/wGlAtsB/wGVAeYB+wH/AYIBuwHrAf8BMwGNAdgB/wEtAdMB+gH/ASEBzAH3Af8BEwHD + AfMB/wEHAbkB7wH/AQABmQHPAf8BIQEuATgB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5 + Af8BvgHwAfkB/wG0AfIB+AH/AaoB7AH7Af8BoAHpAfsB/wGVAeUB/AH/AYoB3wH8Af8BPQHYAfsB/wEy + AdIB+AH/ASYBygH0Af8BGwHAAfEB/wEhAS4BOAH/BAABiwGgAagB/wG+AfAB+QH/Ab4B8AH5Af8BvgHw + AfkB/wG+AfAB+QH/AbQB8gH4Af8BqgHsAfsB/wGgAekB+wH/AZUB5QH8Af8BigHfAfwB/wE9AdgB+wH/ + ATIB0gH4Af8BJgHKAfQB/wEbAcAB8QH/ASEBLgE4Af8EAAGLAaABqAH/Ab4B8AH5Af8BvgHwAfkB/wG+ + AfAB+QH/Ab4B8AH5Af8BtAHyAfgB/wGqAewB+wH/AaAB6QH7Af8BlQHlAfwB/wGKAd8B/AH/AT0B2AH7 + Af8BMgHSAfgB/wEmAcoB9AH/ARsBwAHxAf8BIQEuATgB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/ + Ab4B8AH5Af8BvgHwAfkB/wG0AfIB+AH/AaoB7AH7Af8BmgHWAfMB/wGLAb8B6wH/AYoB3wH8Af8BPQHY + AfsB/wEyAdIB+AH/ASYBygH0Af8BGwHAAfEB/wEhAS4BOAH/BAABjQGhAaoB/wGNAaEBqgH/AY0BoQGq + Af8BjQGhAaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGE + AZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/ATMBhAGPAf8EAAGNAaEBqgH/AY0BoQGqAf8BjQGh + AaoB/wGNAaEBqgH/AY0BoQGqAf8BiwGfAagB/wGJAZwBpgH/AYkBmwGmAf8BhwGaAaQB/wGGAZkBowH/ + AYQBlgGgAf8BhAGWAaAB/wGDAZUBoAH/AYMBlQGgAf8BMwGEAY8B/wQAAY0BoQGqAf8BjQGhAaoB/wGN + AaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGLAZ8BqAH/AYkBnAGmAf8BiQGbAaYB/wGHAZoBpAH/AYYBmQGj + Af8BhAGWAaAB/wGEAZYBoAH/AYMBlQGgAf8BgwGVAaAB/wEzAYQBjwH/BAABjQGhAaoB/wGNAaEBqgH/ + AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZ + AaMB/wGEAZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/ATMBhAGPAf8EAAGPAaQBrAH/AbIB5AHs + Af8BtgHtAfgB/wG2Ae0B+AH/AakB7AH2Af8BkgHhAfMB/wGNAaEBqgH/JAABjwGkAawB/wGyAeQB7AH/ + AbYB7QH4Af8BtgHtAfgB/wGpAewB9gH/AZIB4QHzAf8BjQGhAaoB/yQAAY8BpAGsAf8BsgHkAewB/wG2 + Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGqAf8kAAGPAaQBrAH/AbIB5AHsAf8BtgHt + AfgB/wG2Ae0B+AH/AakB7AH2Af8BkgHhAfMB/wGNAaEBqgH/KAABjwGkAawB/wGPAaQBrAH/AY8BpAGs + Af8BjwGkAawB/wGPAaQBrAH/LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/ + LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/LAABjwGkAawB/wGPAaQBrAH/ + AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH//wD/AP8A/wAsAAEzAYQBjwH/ASoBOAGFAf8BHgErATUB/wEP + ARsBJAH/AQABCgESAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/BAABMwGE + AY8B/wEqATgBhQH/AR4BKwE1Af8BDwEbASQB/wEAAQoBEgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wQAATMBhAGPAf8BKgE4AYUB/wEeASsBNQH/AQ8BGwEkAf8BAAEKARIB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8EAAEzAYQBjwH/ASoBOAGFAf8BHgEr + ATUB/wEPARsBJAH/AQABCgESAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + BAABNQGHAZIB/wOHAf8DhwH/A4YB/wOHAf8DtwH/A4QB/wEAAYgB6wH/AQABMQHGAf8BAAGDAa4B/wEA + AT0BqwH/AQABLwHTAf8BDwGiAfcB/wEAAS0BzgH/AwAB/wQAATUBhwGSAf8BogHfAfAB/wEuAckB3QH/ + AQ8BuAHUAf8BhgHKAd4B/wG9AdsB1wH/AScBswGVAf8BoQHmAeQB/wGqAe4B8gH/AbYB2wHeAf8BEQEQ + AbIB/wE8AYoBkAH/Aa0BwAHNAf8BqAG/Ac8B/wMAAf8EAAE1AYcBkgH/AQABFAELAf8BAAEGAQAB/wEA + ATIBEAH/AQABOAERAf8BAAGGARUB/wEGAasBLwH/AQEBmgEmAf8BAAEqAQsB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wQAATUBhwGSAf8BogHfAfAB/wEuAc0B6gH/AQwBngHNAf8BnAE8ATIB/wL4AfkB/wHu + Ae0B5gH/AeUB2wHJAf8B2QG/AaAB/wHJAZwBKwH/Ad4B2AHLAf8B6AH1AfkB/wHkAe4B7wH/AeAB6gHp + Af8DAAH/BAABOAGKAZUB/wOnAf8DpwH/A6cB/wOoAf8DywH/A4kB/wEcAaoB+QH/AQABMgHXAf8BAAGq + AegB/wEAAaQB5gH/AQABNwHaAf8BFQGlAfcB/wEAATQB1wH/AwAB/wQAATgBigGVAf8BqgHoAfYB/wGQ + AeAB8QH/AYEB2gHvAf8BMAHMAd0B/wHPAe4B+gH/AbkB2QHQAf8BKAGyAZYB/wGtAeoB6QH/AbEB7AH1 + Af8CAAHKAf8BJwEvATIB/wEnAS8BMgH/AaEBsAG5Af8DAAH/BAABOAGKAZUB/wEAAS0BCAH/AQABLQEC + Af8BAAGMARgB/wEAAaEBIgH/AQUBrwExAf8BDQG1ATkB/wETAbwBgwH/AQ0BtQE5Af8BAAGXASIB/wEA + ASEBAAH/AQABAwEAAf8BAAEGAQAB/wMAAf8DAAH/BAABOAGKAZUB/wGqAegB9gH/AZUB5QH8Af8BOwGj + Ac0B/wHDAbMBoQH/AfwB/QH+Af8B8wL3Af8B8QH4AfkB/wHvAfUB+wH/AeQB4QHYAf8BxQGXASIB/wHJ + AacBPQH/AdIBwQGoAf8B1wHUAccB/wMAAf8EAAE7AY4BmAH/A84B/wPLAf8DxQH/A8IB/wPbAf8DjgH/ + AYYBvQH2Af8BAAGKAeMB/wEAAbQB7AH/AQABqQHoAf8BAAE3Ad4B/wEwAbQB+gH/AQABNQHYAf8DAAH/ + BAABOwGOAZgB/wGwAeoB9gH/AZsB5QH0Af8BjwHgAfQB/wE6AdQB5gH/AbsB6gH8Af8B0gHqAe4B/wEo + AbQBmAH/AaoB2gHDAf8BhgGlAekB/wIAAdIB/wEAAQEBkwH/AScBLwEyAf8BJwEvATIB/wMAAf8EAAE7 + AY4BmAH/AQABkAEeAf8BBAGrAS4B/wEEAbABMAH/AQABqgEnAf8BAAGkASYB/wEIAbABNAH/AQMBrgEt + Af8BAQGtASwB/wESAboBggH/AQsBtAE4Af8BAAGbASUB/wEAATQBCwH/AQABBgEAAf8DAAH/BAABOwGO + AZgB/wGwAeoB9gH/AZ8B6QH7Af8BtAE1ASoB/wHgAdcBzgH/Av0B/gH/AfMB9QH0Af8B7wHyAe8B/wHw + AfgB+wH/Ad4BzQG0Af8BwwGJAQoB/wG8AYIBAgH/AbUBNgEAAf8BtQE6AQAB/wMAAf8EAAGAAZEBnAH/ + A+4B/wPqAf8D4AH/A8oB/wPdAf8DkwH/AQABjgHsAf8BAwGtAfAB/wELAbwB8AH/AQABmwHoAf8BAAGN + AekB/wE1AbYB9QH/AQABOwHTAf8BAAEBAQkB/wQAAYABkQGcAf8BtgHtAfgB/wGmAekB9QH/AZgB5QH1 + Af8BigHcAe4B/wGwAekB/AH/AccB6wH0Af8BKAG0AZoB/wGjAcwBxQH/AgAB0gH/AgAB0QH/AgAB0gH/ + AQABAQGSAf8BJwEvATIB/wEAAQEBCQH/BAABgAGRAZwB/wEAAacBJgH/AQsBuAE4Af8BDwG2ATwB/wEJ + AbIBNQH/AQ8BtgE8Af8BDAGyATkB/wEMAbQBOQH/ARUBugGFAf8BFwG9AYYB/wEMAbgBOQH/AQYBtwEz + Af8BAAGhATgB/wEAATUBigH/AQABAQEJAf8EAAGAAZEBnAH/AbYB7QH4Af8BqgHsAfsB/wGmAToBIgH/ + AfwB+wH6Af8B/AL+Af8B9QH3AfYB/wHzAfYB9QH/AfIB+QH8Af8B2QG5AZQB/wHJAZMBGAH/AcQBkQEY + Af8BuwGFAQkB/wG4AToBAAH/AQABAQEJAf8EAAGDAZUBnwH/A5cB/wOXAf8D7AH/A+AB/wPgAf8DlwH/ + ARUBvAH2Af8BIwHNAfcB/wELAbcB8QH/AQABggHnAf8BOQG5AfoB/wEHAZoB7QH/AQABhgHKAf8BBwER + ARoB/wQAAYMBlQGfAf8BvgHwAfkB/wGpAe4B9AH/AaMB6gH4Af8BnAHnAfkB/wGgAecB/AH/AacB3wHs + Af8BKQG5AacB/wIAAdMB/wIAAdIB/wIAAdIB/wIAAdEB/wIAAdEB/wEnAS8BMgH/AQcBEQEaAf8EAAGD + AZUBnwH/AaAB0gHUAf8BHgGtAZMB/wEAAagBLQH/AQcBsgE1Af8BAAGsASsB/wELAbUBNgH/ARABuAE7 + Af8BFgG9AYYB/wESAb0BggH/AQABpAE6Af8BAAGVAa0B/wEAAZ0B2AH/AQABigG/Af8BBwERARoB/wQA + AYMBlQGfAf8BvgHwAfkB/wGrAfAB9wH/AZ8BgQEnAf8B9QHyAe8B/wH7AfoB+QH/Av4C/wH6AfwB/gH/ + AvQB8QH/AdgBrQE8Af8BzQGZAR8B/wHGAZMBGgH/Ab8BigEQAf8BwQGIAQkB/wEHAREBGgH/BAABhgGZ + AaMB/wG+AfAB+QH/AaYBvQHBAf8DmwH/A+wB/wPoAf8DmwH/ATsB3AH8Af8BLgHUAfkB/wEAAYUB6wH/ + ATcBtgH2Af8BhgG+AfcB/wEAAY8B6QH/AQABjwHHAf8BFQEhASkB/wQAAYYBmQGjAf8BvgHwAfkB/wG4 + Ae4B+AH/AbEB7gH6Af8BpgHrAfoB/wGcAegB+wH/AaUB6AH8Af8BnAHcAdoB/wIAAdkB/wIAAdEB/wIA + ARwB/wIAAdIB/wIAAdYB/wEoAbIBlQH/ARUBIQEpAf8EAAGGAZkBowH/Ab4B8AH5Af8BtgHtAfgB/wGY + AdMB2AH/ASABrgGZAf8BCgGwATgB/wERAbwBgQH/AQ8BuwE8Af8BBwGpAYIB/wETAaoBvAH/ARMBvgHr + Af8BBwG5Ae8B/wEAAakB5wH/AQABjwHHAf8BFQEhASkB/wQAAYYBmQGjAf8BvgHwAfkB/wG2Ae0B+AH/ + AcMBjQGGAf8BqAE3ASQB/wGrAYQBLwH/AbwBpwGWAf8B2AHQAcgB/wHsAeEB1QH/AeQBvQGUAf8B3gGw + AT0B/wHUAaEBKAH/AcYBkAEUAf8BwwGJAQoB/wEVASEBKQH/BAABiQGcAaYB/wG+AfAB+QH/AbYB7QH4 + Af8BqAG/AcMB/wOeAf8D8gH/A54B/wGJAeEB/AH/ATsB3AH8Af8BHwHFAfgB/wEAAZAB7wH/AQABiQHu + Af8BAAGsAe8B/wEAAZkBzwH/ASEBLgE4Af8EAAGJAZwBpgH/Ab4B8AH5Af8BswHqAfQB/wG0AewB9gH/ + AaoB7wH1Af8BnwHpAfQB/wGNAd0B6QH/ATcCygH/AQgBEgHcAf8CAAHRAf8CAAHSAf8CAAHSAf8CAAHW + Af8BKAGzAZUB/wEhAS4BOAH/BAABiQGcAaYB/wG+AfAB+QH/AbYB7QH4Af8BtgHtAfgB/wGrAfAB9wH/ + AZEB1gHfAf8BKQG2Aa4B/wEnAbUBvAH/ATgB1wH2Af8BLQHTAfoB/wEhAcwB9wH/ARMBwwHzAf8BBwG5 + Ae8B/wEAAZkBzwH/ASEBLgE4Af8EAAGJAZwBpgH/Ab4B8AH5Af8BtgHtAfgB/wG2Ae0B+AH/AasB8AH3 + Af8BnwHhAfMB/wHGAYQBhgH/AbkBNQExAf8BpAEsAR8B/wGfATYBHQH/AbABkgExAf8ByAGnAYQB/wHY + AbABhgH/Ac4BoAEtAf8BIQEuATgB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BrQHC + AcUB/wOhAf8BpQHAAcYB/wGgAekB+wH/AZUB5QH8Af8BigHfAfwB/wEzAc8B+gH/AS8B0AH4Af8BJgHK + AfQB/wEbAcAB8QH/ASEBLgE4Af8EAAGLAaABqAH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5 + Af8BtAHyAfcB/wGqAewB+gH/AaAB6QH7Af8BlQHlAfwB/wEJARAB2wH/AgAB0gH/AQgBDAHaAf8BJgHK + AfQB/wEbAcAB8QH/ASEBLgE4Af8EAAGLAaABqAH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5 + Af8BtAHyAfgB/wGqAewB+wH/AaAB6QH7Af8BlQHlAfwB/wGKAd8B/AH/AT0B2AH7Af8BMgHSAfgB/wEm + AcoB9AH/ARsBwAHxAf8BIQEuATgB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BvgHw + AfkB/wG0AfIB+AH/AaoB7AH7Af8BoAHpAfsB/wGVAeUB/AH/AYYBwgHlAf8BgAGrAdIB/wGkASIBHAH/ + AY4BHwEMAf8BhgElAQ8B/wEhAS4BOAH/BAABjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGN + AaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGEAZYBoAH/AYQBlgGg + Af8BgwGVAaAB/wGDAZUBoAH/ATMBhAGPAf8EAAGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/ + AY0BoQGqAf8BiwGfAagB/wGJAZwBpgH/AYkBmwGmAf8BhwGaAaQB/wGGAZkBowH/AYQBlgGgAf8BhAGW + AaAB/wGDAZUBoAH/AYMBlQGgAf8BMwGEAY8B/wQAAY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGq + Af8BjQGhAaoB/wGLAZ8BqAH/AYkBnAGmAf8BiQGbAaYB/wGHAZoBpAH/AYYBmQGjAf8BhAGWAaAB/wGE + AZYBoAH/AYMBlQGgAf8BgwGVAaAB/wEzAYQBjwH/BAABjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGh + AaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGEAZYBoAH/ + AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/ATMBhAGPAf8EAAGPAaQBrAH/AbIB5AHsAf8BtgHtAfgB/wG2 + Ae0B+AH/AakB7AH2Af8BkgHhAfMB/wGNAaEBqgH/JAABjwGkAawB/wGyAeQB7AH/AbYB7QH4Af8BtgHt + AfgB/wGpAewB9gH/AZIB4QHzAf8BjQGhAaoB/yQAAY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4 + Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGqAf8kAAGPAaQBrAH/AbIB5AHsAf8BtgHtAfgB/wG2Ae0B+AH/ + AakB7AH2Af8BkgHhAfMB/wGNAaEBqgH/KAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGP + AaQBrAH/LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/LAABjwGkAawB/wGP + AaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/LAABjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH//wD/AP8A/wAsAAEzAYQBjwH/ASoBOAGFAf8BHgErATUB/wEPARsBJAH/AQABCgES + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/BAABMwGEAY8B/wEqATgBhQH/ + AR4BKwE1Af8BDwEbASQB/wEAAQoBEgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wQAATMBhAGPAf8BKgE4AYUB/wEeASsBNQH/AQ8BGwEkAf8BAAEKARIB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8EAAEzAYQBjwH/ASoBOAGFAf8BHgErATUB/wEPARsBJAH/ + AQABCgESAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/BAABNQGHAZIB/wGi + Ad8B8AH/AS4BzQHqAf8BBwG4AeIB/wEAAa4B2wH/AQgBpAHWAf8BlQH0Av8BBAGdAdcB/wEAATkBqgH/ + AQABNAGcAf8BAAE9AasB/wEAAToBqQH/AQABNQGfAf8BAAEwAZYB/wMAAf8EAAE1AYcBkgH/AaIB3wHw + Af8CAAGbAf8CAAGbAf8CAAGHAf8CAAE9Af8CAAGuAf8CEAHeAf8CEAHeAf8CAAGmAf8CAAEzAf8CAAEj + Af8CAAEjAf8CAAEjAf8DAAH/BAABNQGHAZIB/wGiAd8B8AH/AR0BpAG6Af8BAAEFASEB/wMAAf8BAAGp + AdkB/wIAARUB/wMAAf8CAAECAf8CAAECAf8DAAH/AQABOgGpAf8BAAEBARYB/wMAAf8DAAH/BAABNQGH + AZIB/wGiAd8B8AH/AS4BzQHqAf8BBwG4AeIB/wEAAawB2AH/AQABnQHKAf8BAAE9AaUB/wEAARcBJgH/ + AQABEwEjAf8BAAElAYkB/wEAATQBnwH/AQABOQGnAf8BAAE1AZ8B/wEAATABlgH/AwAB/wQAATgBigGV + Af8BqgHoAfYB/wGVAeUB/AH/AYQB3wH7Af8BMwHWAfoB/wGcAbkByQH/ASsBzwHyAf8BhwHqAf0B/wED + AZ0B1gH/AQABiwHFAf8BAAGNAcYB/wEAAZoB3wH/AQABkAHXAf8BAAE1AZ8B/wMAAf8EAAE4AYoBlQH/ + AaoB6AH2Af8CAAGAAf8CAAGJAf8CAQG2Af8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHm + Af8CBAG/Af8CAAGGAf8CAAEjAf8DAAH/BAABOAGKAZUB/wGqAegB9gH/AZUB5QH8Af8BAAEgATIB/wIA + AQMB/wMAAf8DAAH/AgABCQH/AwAB/wIAAQUB/wIAAQQB/wMAAf8CAAESAf8DAAH/AwAB/wQAATgBigGV + Af8BqgHoAfYB/wGVAeUB/AH/AYQB3wH7Af8BMAHRAfQB/wEcAbgB2wH/AQgBPQGmAf8BmwGtAdgB/wGT + AaYB0QH/AQABMgGhAf8BAAGRAcwB/wEAAZYB2gH/AQABkAHXAf8BAAE1AZ8B/wMAAf8EAAE7AY4BmAH/ + AbAB6gH2Af8BnwHpAfsB/wGSAeQB/AH/AQABjAHgAf8BAAGhAd8B/wEOAa8B4QH/ATsB6QH9Af8BgQHv + Av8BFQG0AeMB/wEAAZABywH/AQABowHmAf8BAAGWAdwB/wEAAToBqQH/AwAB/wQAATsBjgGYAf8BsAHq + AfYB/wIBAbYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wIT + AeYB/wITAeYB/wIHAcYB/wMAAf8EAAE7AY4BmAH/AbAB6gH2Af8BnwHpAfsB/wE2AbcBygH/AQABCgEa + Af8CAAEDAf8BAAENASYB/wIAAQ4B/wIAAQMB/wIAARkB/wEDAR8BgAH/AgABEgH/AgABDwH/AQABFgEv + Af8DAAH/BAABOwGOAZgB/wGwAeoB9gH/AZ8B6QH7Af8BkQHjAfsB/wE6AdQB8QH/ASIBtgHVAf8BAAGI + AbIB/wEnAZEBxAH/ASgBjQG9Af8BAAE7AawB/wEAAZABxQH/AQABnQHdAf8BAAGVAdsB/wEAAToBqQH/ + AwAB/wQAAYABkQGcAf8BtgHtAfgB/wGqAewB+wH/AZsB6AH7Af8BAAGJAdgB/wGLAewC/wEqAeEB+QH/ + ARoBwAHoAf8BAAGMAdAB/wEBAZIB0wH/AQMBlQHVAf8BAAGpAegB/wEAAZ4B4gH/AQABggG0Af8BAAEB + AQkB/wQAAYABkQGcAf8BtgHtAfgB/wEAAQkBgQH/AgABhgH/AgEBtgH/AhMB5gH/AhMB5gH/AhMB5gH/ + AhMB5gH/AhMB5gH/AhMB5gH/AgQBvwH/AgABhgH/AgABLQH/AQABAQEJAf8EAAGAAZEBnAH/AbYB7QH4 + Af8BqgHsAfsB/wGbAegB+wH/ASMBjAGaAf8BAAEnAZ8B/wEAARwBjQH/AQABBAEkAf8BDgEdAakB/wEA + AQMBJAH/AQABHwGRAf8BAQEuAaoB/wEAARUBMwH/AQABggG0Af8BAAEBAQkB/wQAAYABkQGcAf8BtgHt + AfgB/wGqAewB+wH/AZoB5gH5Af8BhgHVAewB/wEmAbIBzAH/AQABigGwAf8BAAGlAcgB/wEAAaYByAH/ + AQABgQGsAf8BAAGQAb8B/wEAAZ4B2QH/AQABnQHgAf8BAAGCAbQB/wEAAQEBCQH/BAABgwGVAZ8B/wG+ + AfAB+QH/AasB8AH3Af8BpQHsAfsB/wEiAaMB0gH/AYgB1AHyAf8BOgHgAfgB/wEWAcwB7wH/AQMBlQHV + Af8BBQGcAckB/wEJAbsB8AH/AQABsgHsAf8BAAGkAeMB/wEAAYoBvwH/AQcBEQEaAf8EAAGDAZUBnwH/ + Ab4B8AH5Af8BqwHwAfcB/wGFAboB1QH/ARABLQGdAf8CAAEzAf8CAAGmAf8CEAHeAf8CEAHeAf8CAAGu + Af8CAAEzAf8BAAEQAY8B/wEAAYQBwwH/AQABigG/Af8BBwERARoB/wQAAYMBlQGfAf8BvgHwAfkB/wGr + AfAB9wH/AZUB0gHfAf8BjQHUAeYB/wGAAdMB7QH/AQIBNAGTAf8BAAEGATAB/wIAATQB/wEAAQQBLgH/ + AQABFgE6Af8BAAGOAbwB/wELATkBkgH/AQABPQGvAf8BBwERARoB/wQAAYMBlQGfAf8BvgHwAfkB/wGr + AfAB9wH/AaIB6AH3Af8BiwHTAeUB/wEWAaEBwQH/AQYBqAHHAf8BNAHuAfIB/wEuAfQB9gH/AQABqgHJ + Af8BAAGKAboB/wEAAaMB2AH/AQABoQHfAf8BAAGKAb8B/wEHAREBGgH/BAABhgGZAaMB/wG+AfAB+QH/ + AbYB7QH4Af8BsAHuAfoB/wGkAesB+gH/ARMBtQHmAf8B2QH5Af4B/wELAdMB9AH/AQkBtQHlAf8BCAGY + AdUB/wEQAbYB4gH/AQcBuQHvAf8BAAGpAecB/wEAAY8BxwH/ARUBIQEpAf8EAAGGAZkBowH/Ab4B8AH5 + Af8BtgHtAfgB/wGwAe4B+gH/AaQB6wH6Af8BlQHmAfsB/wIAATMB/wIAAaYB/wIAAaYB/wIAATMB/wEW + AcQB8wH/AQcBuQHvAf8BAAGpAecB/wEAAY8BxwH/ARUBIQEpAf8EAAGGAZkBowH/Ab4B8AH5Af8BtgHt + AfgB/wGwAe4B+gH/AaQB6wH6Af8BlQHmAfsB/wGJAeEB/AH/AQABAgGGAf8BAAEOATUB/wEAAQIBhgH/ + ARYBwwHyAf8BBwG5Ae8B/wEAAakB5wH/AQABjwHHAf8BFQEhASkB/wQAAYYBmQGjAf8BvgHwAfkB/wG2 + Ae0B+AH/Aa0B6gH2Af8BlQHWAeMB/wEXAZ8BvwH/ARMBuwHWAf8BsAH0AfYB/wGwAfkB+gH/AQgBwAHZ + Af8BAAGNAboB/wEAAagB2QH/AQABpgHjAf8BAAGPAccB/wEVASEBKQH/BAABiQGcAaYB/wG+AfAB+QH/ + AbYB7QH4Af8BtgHtAfgB/wGrAfAB9wH/AQABngHdAf8BjwHoAfkB/wGSAegB+QH/AZcB6QH7Af8BCgGY + AdgB/wENAaABzAH/ARMBwwHzAf8BBwG5Ae8B/wEAAZkBzwH/ASEBLgE4Af8EAAGJAZwBpgH/Ab4B8AH5 + Af8BtgHtAfgB/wG2Ae0B+AH/AasB8AH3Af8BogHsAfoB/wGVAeYB+wH/AYkB4QH8Af8BOwHcAfwB/wEt + AdMB+gH/ASEBzAH3Af8BEwHDAfMB/wEHAbkB7wH/AQABmQHPAf8BIQEuATgB/wQAAYkBnAGmAf8BvgHw + AfkB/wG2Ae0B+AH/AbYB7QH4Af8BqwHwAfcB/wGiAewB+gH/AZUB5gH7Af8BAAEUAYQB/wEAAR4BlAH/ + AQABFQGFAf8BIQHMAfcB/wETAcMB8wH/AQcBuQHvAf8BAAGZAc8B/wEhAS4BOAH/BAABiQGcAaYB/wG+ + AfAB+QH/AbYB7QH4Af8BtAHqAfUB/wGfAd8B5gH/ATMBtwHJAf8BHQGiAcMB/wG4AvQB/wGqAfAB8QH/ + AQ4BnAHCAf8BBwGgAcgB/wENAbUB4gH/AQYBtwHsAf8BAAGZAc8B/wEhAS4BOAH/BAABiwGgAagB/wG+ + AfAB+QH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/AQABjgHYAf8BAAGPAdgB/wEAAZIB3AH/AQMBmAHi + Af8BCwGdAeEB/wEPAZ4B3wH/ATIB0gH4Af8BJgHKAfQB/wEbAcAB8QH/ASEBLgE4Af8EAAGLAaABqAH/ + Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BtAHyAfgB/wGqAewB+wH/AaAB6QH7Af8BlQHl + AfwB/wGKAd8B/AH/AT0B2AH7Af8BMgHSAfgB/wEmAcoB9AH/ARsBwAHxAf8BIQEuATgB/wQAAYsBoAGo + Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BvgHwAfkB/wG0AfIB+AH/AaoB7AH7Af8BoAHpAfsB/wGV + AeUB/AH/AYoB3wH8Af8BPQHYAfsB/wEyAdIB+AH/ASYBygH0Af8BGwHAAfEB/wEhAS4BOAH/BAABiwGg + AagB/wG+AfAB+QH/Ab4B8AH5Af8BvQHuAfcB/wG3AecB7wH/AaAB1gHcAf8BMAGuAcUB/wEkAZ0BwAH/ + ASABnAHAAf8BHAGmAcUB/wEvAb8B3gH/AS0BygHuAf8BJQHIAfIB/wEbAcAB8QH/ASEBLgE4Af8EAAGN + AaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BiwGfAagB/wGJAZwBpgH/AYkBmwGm + Af8BhwGaAaQB/wGGAZkBowH/AYQBlgGgAf8BhAGWAaAB/wGDAZUBoAH/AYMBlQGgAf8BMwGEAY8B/wQA + AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGLAZ8BqAH/AYkBnAGmAf8BiQGb + AaYB/wGHAZoBpAH/AYYBmQGjAf8BhAGWAaAB/wGEAZYBoAH/AYMBlQGgAf8BgwGVAaAB/wEzAYQBjwH/ + BAABjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJ + AZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGEAZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/ATMBhAGP + Af8EAAGNAaEBqgH/AY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGqAf8BiwGfAagB/wGJAZwBpgH/ + AYkBmwGmAf8BhwGaAaQB/wGGAZkBowH/AYQBlgGgAf8BhAGWAaAB/wGDAZUBoAH/AYMBlQGgAf8BMwGE + AY8B/wQAAY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGq + Af8kAAGPAaQBrAH/AbIB5AHsAf8BtgHtAfgB/wG2Ae0B+AH/AakB7AH2Af8BkgHhAfMB/wGNAaEBqgH/ + JAABjwGkAawB/wGyAeQB7AH/AbYB7QH4Af8BtgHtAfgB/wGpAewB9gH/AZIB4QHzAf8BjQGhAaoB/yQA + AY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGqAf8oAAGP + AaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGsAf8BjwGk + AawB/wGPAaQBrAH/AY8BpAGsAf8sAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGs + Af8sAAGPAaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf//AP8ALgADTgGWAx0B/wMd + Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/A04BlggAA04BlgNMAf8DTAH/ + A0wB/wNMAf8DTAH/A0wB/wNMAf8DTAH/A0wB/wNMAf8DTAH/A0wB/wNOAZYIAANOAZYDTAH/A0wB/wNM + Af8DTAH/A0wB/wNMAf8DTAH/A0wB/wNMAf8DTAH/A0wB/wNMAf8DTgGWSAADIQH/AQABBgEAAf8BAAEG + AQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AyEB/wgAA1AF/wP+Af8CAQHuAf8D/gH/A/0B/wP9Af8D/gH/ + AgEB7gH/A/4B/wIBAe4B/wIBAe4B/wIBAe4B/wNQAf8IAANQBf8D/QH/A/0B/wP+Af8D/gH/A/0B/wP9 + Af8D/QH/A/0B/wP9Af8D/QX/A1AB/0gAAyUB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8CAAHGAf8CAAHGAf8CAAHGAf8CAAHGAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8DJQH/ + CAADVAH/A/4B/wIBAe4B/wIBAe4B/wIBAe4B/wP6Af8D9AH/A/gB/wIBAe4B/wP+Af8CAQHuBf8CAQHu + Af8DVAH/CAADVAH/A/0B/wPzAf8D9wH/A3MB/wNzAf8D+gH/A/MB/wPxAf8D8AH/A/AB/wPvAf8D/QH/ + A1QB/wQAATYBhAGPAf8BLQE7AYUB/wEhAS4BOAH/ARIBHgEnAf8BAwENARUB/wIAAQIB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wgAAysB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEA + Af8BAAEGAQAB/wMrAf8IAANaAf8CAQHuAf8CAQHuAf8CAQHuAf8CAQHuAf8CAQHuAf8DwwH/A94B/wIB + Ae4B/wP5Af8CAQHuAf8D/gH/AgEB7gH/A1oB/wgAA1oB/wP9Af8D8gH/A8MB/wNzAf8BHwHgAewB/wNz + Af8D0QH/A5oB/wONAf8DjQH/A+4B/wP9Af8DWgH/BAABOAGHAZIB/wGiAd8B8AH/ATEBzQHqAf8BCgG4 + AeIB/wEAAa4B2wH/AQABqQHZAf8BAAGhAdIB/wEAAZgBxwH/AQABjgG8Af8BAAGDAa4B/wEAAUABqwH/ + AQABPQGpAf8BAAE4AZ8B/wEAATMBlgH/AwAB/wgAAzAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8CAAHGAf8BAAEGAQAB/wIAAcYB/wIAAcYB/wIAAcYB/wEAAQYBAAH/AQABBgEA + Af8DMAH/CAADXwH/AgEB7gH/AgEB7gH/AgEB7gH/AgEB7gH/AgEB7gH/A/sB/wIBAe4B/wIBAe4B/wP+ + Af8CAQHuBf8CAQHuAf8DXwH/CAADXwH/A/0B/wP0Af8D+wH/A3MB/wEfAeAB7AH/AR8B4AHsAf8DcwH/ + A/oB/wP0Af8D8AH/A+0B/wP9Af8DXwH/BAABOwGKAZUB/wGqAegB9gH/AZUB5QH8Af8BhAHfAfsB/wE2 + AdYB+gH/ASsB0AH3Af8BHgHGAfQB/wERAb4B8AH/AQIBtAHsAf8BAAGqAegB/wEAAaQB5gH/AQABmgHf + Af8BAAGQAdcB/wEAATgBnwH/AwAB/wgAAzcB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEG + AQAB/wM3Af8IAANmAf8CAQHuAf8CAQHuAf8D+QH/AgEB7gH/AgEB7gH/A8cB/wPUAf8CAQHuAf8D4AH/ + AgEB7gH/AgEB7gH/AgEB7gH/A2YB/wgAA2YB/wP9Af8D+QH/A3MB/wNzAf8BHwHgAewB/wEfAeAB7AH/ + AR8B4AHsAf8DcwH/A3MB/wPUAf8D7gH/A/0B/wNmAf8EAAE+AY4BmAH/AbAB6gH2Af8BnwHpAfsB/wGS + AeQB/AH/AYEB3QH7Af8BNgHWAfoB/wEpAc4B9wH/AR4BxgH0Af8BDgG8AfAB/wECAbQB7AH/AQABqgHo + Af8BAAGjAeYB/wEAAZYB3AH/AQABPQGpAf8DAAH/CAADPQH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wIAAcYB/wIAAcYB/wIAAcYB/wIAAcYB/wIAAcYB/wEAAQYBAAH/AQABBgEA + Af8DPQH/CAADbAH/A/4B/wP3Af8D9wH/A/cB/wP0Af8D8gH/A/UB/wP6Af8D9wH/A/QB/wP0Af8D/gH/ + A2wB/wgAA2wB/wP+Af8DcwH/AR8B4AHsAf8BHwHgAewB/wEfAeAB7AH/AR8B4AHsAf8BHwHgAewB/wEf + AeAB7AH/AR8B4AHsAf8DcwH/A/IB/wP9Af8DbAH/BAABgAGRAZwB/wG2Ae0B+AH/AaoB7AH7Af8BmwHo + AfsB/wGPAeMB/AH/AYEB3QH7Af8BMgHVAfkB/wEpAc4B9wH/ARwBxQH0Af8BDgG8AfAB/wEAAbIB7AH/ + AQABqQHoAf8BAAGeAeIB/wEAAYIBtAH/AQABBAEMAf8IAANEAf8BAAEGAQAB/wEAAQYBAAH/AQABMAGm + Af8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEA + AQYBAAH/AQABBgEAAf8DRAH/CAADcwH/A/0B/wP4Af8B9QGCAQIB/wPYAf8DqgH/A7YB/wH1AYIBAgH/ + AfUBggECAf8B9QGCAQIB/wPBAf8D6gH/A/0B/wNzAf8IAANzAf8D/gH/A3MB/wEfAeAB7AH/AR8B4AHs + Af8BHwHgAewB/wEfAeAB7AH/AR8B4AHsAf8BHwHgAewB/wEfAeAB7AH/A3MB/wP0Af8D/QH/A3MB/wQA + AYMBlQGfAf8BvgHwAfkB/wGrAfAB9wH/AaUB7AH7Af8BmAHnAfsB/wGJAeEB/AH/AUAB3QH7Af8BMgHV + AfkB/wEmAc0B9wH/ARkBxAHzAf8BDAG7AfAB/wEAAbIB7AH/AQABpAHjAf8BAAGKAb8B/wEKARQBHQH/ + CAADSgH/AQABBgEAAf8BAAEwAaYB/wEAAUQBvwH/AQABMAGmAf8BAAEGAQAB/wIAAcYB/wIAAcYB/wIA + AcYB/wIAAcYB/wEAAQYBAAH/AgABxgH/AQABBgEAAf8DSgH/CAADeQH/A/4B/wH1AYIBAgH/AfUBggEC + Af8B9QGCAQIB/wP3Af8D8gH/A/kF/wH1AYIBAgH/A/MB/wPpAf8D/QH/A3kB/wgAA3kB/wP+Af8DcwH/ + AR8B4AHsAf8DAAH/AR8B4AHsAf8DAAH/AR8B4AHsAf8DAAH/AR8B4AHsAf8DcwH/A/MB/wP9Af8DeQH/ + BAABhgGZAaMB/wG+AfAB+QH/AbYB7QH4Af8BsAHuAfoB/wGkAesB+gH/AZUB5gH7Af8BiQHhAfwB/wE+ + AdwB/AH/ATIB1QH5Af8BJgHNAfcB/wEZAcQB8wH/AQoBuQHvAf8BAAGpAecB/wEAAY8BxwH/ARgBJAEs + Af8IAAOEAf8BAAEGAQAB/wEAAQYBAAH/AQABMAGmAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEG + AQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8DhAH/CAADhAH/AfUBggEC + Af8B9QGCAQIB/wH1AYIBAgH/AfUBggECAf8B9QGCAQIB/wPmAf8B9QGCAQIB/wH1AYIBAgH/AfUBggEC + Af8DxwH/A+cB/wP9Af8DhAH/CAADhAH/A/4B/wNzAf8BHwHgAewB/wEfAeAB7AH/AR8B4AHsAf8BHwHg + AewB/wEfAeAB7AH/AR8B4AHsAf8BHwHgAewB/wNzAf8D8gH/A/0B/wOEAf8EAAGJAZwBpgH/Ab4B8AH5 + Af8BtgHtAfgB/wG2Ae0B+AH/AasB8AH3Af8BogHsAfoB/wGVAeYB+wH/AYkB4QH8Af8BPgHcAfwB/wEw + AdMB+gH/ASQBzAH3Af8BFgHDAfMB/wEKAbkB7wH/AQABmQHPAf8BJAExATsB/wgAA4oB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEG + AQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wOKAf8IAAOKAf8B9QGCAQIB/wH1AYIBAgH/AfUBggEC + Af8B9QGCAQIB/wH1AYIBAgH/A/4B/wH1AYIBAgX/A/4B/wP9Af8D/QH/A/0B/wOKAf8IAAOKAf8D/gH/ + A3MB/wEfAeAB7AH/AR8B4AHsAf8BHwHgAewB/wEfAeAB7AH/AR8B4AHsAf8BHwHgAewB/wEfAeAB7AH/ + A3MB/wP+Af8D/QH/A4oB/wQAAYsBoAGoAf8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BvgHwAfkB/wG0 + AfIB+AH/AaoB7AH7Af8BoAHpAfsB/wGVAeUB/AH/AYoB3wH8Af8BQAHYAfsB/wE1AdIB+AH/ASkBygH0 + Af8BHgHAAfEB/wEkATEBOwH/CAADkAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEG + AQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wOQAf8DTgGW + CAADkAH/AfUBggECAf8B9QGCAQIB/wH1AYIBAgH/AfUBggECAf8B9QGCAQIB/wPoAf8B9QGCAQIB/wH1 + AYIBAgH/AfUBggECAf8D6wH/A+sB/wOQAf8DTwGWCAADkAH/A/0B/wP2Af8DcwH/A3MB/wNzAf8DcwH/ + A3MB/wNzAf8DcwH/A/QB/wPtAf8DkAH/A08BlgQAAY0BoQGqAf8BjQGhAaoB/wGNAaEBqgH/AY0BoQGq + Af8BjQGhAaoB/wGLAZ8BqAH/AYkBnAGmAf8BiQGbAaYB/wGHAZoBpAH/AYYBmQGjAf8BhAGWAaAB/wGE + AZYBoAH/AYMBlQGgAf8BgwGVAaAB/wE2AYQBjwH/CAADlQH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8DlQH/ + A04BlgwAA5UB/wP+Af8D8wH/A/MB/wPzAf8D7wH/A+0B/wPvAf8D/gH/A+4B/wPtAf8DlQH/A08BlgwA + A5UB/wP9Af8D7AH/A/AB/wPzAf8D8gH/A/IB/wPyAf8D/gH/A+4B/wPtAf8DlQH/A08BlggAAY8BpAGs + Af8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGqAf8oAAOaAf8BAAEG + AQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8DmgH/A04BlhAAA5oB/wP9Af8D6AH/A+cB/wPnAf8D5gH/A+UB/wPlAf8D/QH/A+sB/wOa + Af8DTwGWEAADmgH/A/0B/wPoAf8D5wH/A+cB/wPmAf8D5QH/A+UB/wP9Af8D6wH/A5oB/wNPAZYQAAGP + AaQBrAH/AY8BpAGsAf8BjwGkAawB/wGPAaQBrAH/AY8BpAGsAf8sAAOeAf8BAAEGAQAB/wEAAQYBAAH/ + AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEGAQAB/wEAAQYBAAH/A54B/wNOAZYUAAOe + Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wOeAf8DTwGWFAADngH/A/0B/wP9Af8D/QH/ + A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/A08BllQAA04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOh + Af8DoQH/A04BlhgAA08BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A08BlhgAA08BlgOh + Af8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A08BllgAA04BlgMOAf8DDgH/Aw4B/wMOAf8DDgH/ + Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wNOAZYIAANOAZYDGAH/AxgB/wMXAf8DFgH/AxcB/wMX + Af8DFgH/AxYB/wMWAf8DFgH/AxYB/wMWAf8DTgGZAwMBBAQAA04BlgNMAf8DTAH/A0wB/wNMAf8DTAH/ + A0wB/wNMAf8DTAH/A0wB/wNMAf8DTAH/A0wB/wNOAZYIAANOAZYDHAH/AxsB/wMZAf8DFwH/AxcB/wMZ + Af8DGwH/AxwB/wMcAf8DHAH/AxwB/wMcAf8DTgGWCAADEgH/AfsB+AH1Af8B+QH3AfMB/wP9Af8D/QH/ + A/0B/wP9Af8B7QHlAeMB/wH2AfMB+QH/Ad4B0wHrAf8B5gHeAfAB/wP9Bf8DEgH/CAADHAX/A/kB/wPu + Af8D5wH/A+4B/wPuAf8D4wH/A98B/wPjAf8D5wH/A+MB/wPlAf8DFgH/AwUBBwQAA1AF/wP9Af8D/QH/ + A/4B/wP+Af8DsAH/A3oB/wOuAf8DegH/A/4B/wP+Af8BFQFsAcwB/wNQAf8IAAMgBf8D9AH/A90B/wPN + Af8DzgH/A90B/wPwAf8D+wH/A/0B/wP9Af8D/QX/AyAB/wgAAxYB/wH0AfAB6QH/Ac8BuQGQAf8D8wH/ + A/IB/wPyAf8B5wHgAdQB/wG+AZ8BoAH/AYABAAG5Af8BxQGyAdoB/wG1AZoB0gH/Aa0BjQHNAf8D/QH/ + AxYB/wgAAyAB/wP9Af8D6QH/AS0BCgEAAf8D1gH/A9kB/wEtAQoBAAH/A84B/wEtAQoBAAH/A80B/wEt + AQoBAAH/A8wB/wEtAQoBAAH/AxgB/wMFAQcEAANUAf8D/gH/AZ0BVwErAf8D/gH/AZ0BVwErAf8DuAH/ + A4YB/wGdAVcBKwH/A7cB/wGdAVcBKwH/A/sB/wP4Af8BEwFtAc0B/wNUAf8IAAMkAf8D/QH/AaQBlwGQ + Af8BxwESAQAB/wG7ARwBAAH/AY0BiQGGAf8DvQH/A9MB/wPoAf8D8AH/A/AB/wPvAf8D/QH/AyQB/wgA + AxwB/wP9Af8BywGxAYEB/wGXAYsBMwH/AZcBiwEzAf8BlwGLATMB/wGkAYcBCQH/AYcBMQGQAf8BOwEY + AaAB/wONAf8DjQH/AawBjQHNAf8D/QH/AxwB/wgAAyYB/wP9Af8BLQEKAQAB/wPUAf8BLQEKAQAB/wPU + Af8BLQEKAQAB/wEtAQoBAAH/AS0BCgEAAf8D1AH/AS0BCgEAAf8BLQEKAQAB/wPYAf8DHgH/AwUBBwQA + A1oB/wO9Af8BnQFXASsB/wOkAf8BnQFXASsB/wOVAf8DqgH/AZ0BVwErAf8DvgH/AZ0BVwErAf8BzgHg + AfMB/wP+Af8BzQHgAfQB/wNaAf8IAAMqAf8D/QH/AcoBFAEAAf8B+AGzAaEB/wHzATMBFgH/AdABGQEA + Af8BMwIyAf8DPAH/A0oB/wOEAf8DhgH/A+kB/wP8Af8DKgH/CAADIQH/A/0B/wHbAc0BtAH/AcYBqgEw + Af8B0gG/AZsB/wHSAb4BmgH/AcYBqQEwAf8B0wHHAeAB/wG1AZoB0QH/A+4B/wPuAf8BswGYAdAB/wHu + AekB9AH/AyEB/wgAAysB/wP9Af8BLQEKAQAB/wPcAf8BLQEKAQAB/wPbAf8BLQEKAQAB/wPhAf8BLQEK + AQAB/wPgAf8BLQEKAQAB/wPRAf8BLQEKAQAB/wMlAf8DAwEEBAADXwH/A5MB/wGdAVcBKwH/A7IB/wGd + AVcBKwH/A7IB/wGdAVcBKwH/AZ0BVwErAf8DwgH/AZ0BVwErAf8BnQFXASsB/wGdAVcBKwH/A/4B/wNf + Af8IAAMvAf8D/QH/AcgBEwEAAf8B+AGzAaEB/wH2ATUBGgH/AfIBMgEUAf8BzwEYAQAB/wOyAf8DuwH/ + A70B/wPGAf8D1gH/A/MB/wMuAf8IAAMoAf8D/QH/A/EB/wGmAYsBFgH/A5YB/wGeAZABMwH/AZ4BkAEz + Af8BiwE6AZwB/wGBAR0BowH/A5UB/wOVAf8BqwGLAcwB/wP9Af8DKAH/CAADMgH/A/0B/wEtAQoBAAH/ + A+kB/wEtAQoBAAH/A+kB/wPsAf8BLQEKAQAB/wPpAf8D7AH/AS0BCgEAAf8BLQEKAQAB/wPyAf8DMAH/ + CAADZgH/A5cB/wGdAVcBKwH/A6wB/wGdAVcBKwH/AZ0BVwErAf8DqwH/AZ0BVwErAf8DzQH/AZ0BVwEr + Af8BbgGxAfIB/wF4Aa4B4wH/A/4B/wNmAf8IAAM2Af8D/QH/A/EB/wHJARMBAAH/AfgBswGhAf8B9gE1 + ARoB/wHxATEBEgH/Ac0BFgEAAf8BxwESAQAB/wHHARIBAAH/AzsB/wGxAbgBuwH/A90B/wMyAf8IAAMu + Af8D/QH/A/AB/wHJAbABgAH/AesB6QHlAf8ByQGwAT0B/wPuAf8B0QHGAd8B/wGAAQABuQH/AcIBrwHX + Af8BsgGXAc8B/wGqAYsBywH/A/0B/wMuAf8IAAM4Af8D/QH/A/AB/wPvAf8D7wH/A+4B/wPuAf8D7QH/ + A+0B/wPsAf8D6wH/A+sB/wP9Af8DOAH/CAADbAH/A5cB/wGdAVcBKwH/A7wB/wGdAVcBKwH/A7gB/wO1 + Af8BnQFXASsB/wPXAf8BnQFXASsB/wGdAVcBKwH/AZ0BVwErAf8D/gH/A2wB/wgAAzwB/wP9Af8D8AH/ + A+8B/wHJARMBAAH/AfgBswGhAf8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wHdASMBAAH/ + AY0BgAFFAf8DzQH/AzUB/wgAAzUB/wP9Af8D7wH/AaMBmwGMAf8BpwGTASwB/wGpAZABGwH/A58B/wGT + AYQBpAH/AYcBJAGoAf8BkwGEAaQB/wGTAYQBpAH/A+oB/wP9Af8DNQH/CAADPwH/A/0B/wPvAf8DoAH/ + A58B/wOfAf8DnwH/A58B/wOfAf8DnwH/A58B/wPqAf8D/QH/Az8B/wgAA3MB/wOSAf8D5AH/A9IB/wPS + Af8DzQH/A8cB/wPHAf8D3gH/A5sB/wGaAcgB9wH/AWUBqAHqAf8D/gH/A3MB/wgAA0MB/wP9Af8D7wH/ + A6AB/wOfAf8ByQETAQAB/wH2ATUBGgH/AfYBNQEaAf8B9gE1ARoB/wH2ATUBGgH/AfYBNQEaAf8BxwES + AQAB/wPJAf8DOwH/CAADOwH/A/0B/wPtAf8D7QH/AbkBkgEAAf8B4gHbAc8B/wPrAf8B0AHEAd0B/wGy + AZcBzwH/A+oB/wPpAf8D6QH/A/0B/wM7Af8IAANFAf8D/QH/A+0B/wPtAf8D7AH/A+wB/wPrAf8D6wH/ + A+oB/wPqAf8D6QH/A+kB/wP9Af8DRQH/CAADeQH/A5MB/wPwAf8D7gH/A+4B/wPqAf8D4AH/A8oB/wPd + Af8DkwH/ATUBkAHsAf8BswHUAfcB/wP+Af8DeQH/CAADSQH/A/0B/wPtAf8D7QH/A+wB/wHHARIBAAH/ + AfYBNQEaAf8B9gE1ARoB/wH2ATUBGgH/Ad4BkgE3Af8B9gE1ARoB/wHHARIBAAH/A9IB/wNDAf8IAAOE + Af8D/QH/A+wB/wOqAf8DqQH/A6kB/wOpAf8BogGbAaoB/wGbAY0BqwH/A6kB/wOpAf8D5wH/A/0B/wOE + Af8IAAOEAf8D/QH/A+wB/wOqAf8DqQH/A6kB/wOpAf8DqQH/A6kB/wOpAf8DqQH/A+cB/wP9Af8DhAH/ + CAADhAH/A8IB/wOXAf8DlwH/A5cB/wOXAf8D7AH/A+AB/wPgAf8DlwH/AbkB2QH6Af8D/gH/AdYB6AH7 + Af8DhAH/CAADhAH/A/0B/wPsAf8DqgH/A6kB/wHHARMBAAH/AfgBswGhAf8B9gE1ARoB/wHeAZIBNwH/ + AaUBBgEAAf8B3gGSATcB/wHHARIBAAH/A+MB/wOCAf8IAAOKAf8D/QH/A+sB/wPrAf8D6gH/A+oB/wPp + Af8D6AH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DigH/CAADigH/A/0B/wPrAf8D6wH/A+oB/wPqAf8D6QH/ + A+gB/wP9Af8D/QH/A/0B/wP9Af8D/QH/A4oB/wgAA4oB/wP+Af8D9AH/A/QB/wP5Af8DxAH/A5sB/wPs + Af8D6AH/A5sB/wP+Af8D/gH/ASQBhwHrAf8DigH/CAADigH/A/0B/wPrAf8D6wH/A+oB/wHSAUUBIwH/ + AdkBIAEAAf8B+AGzAaEB/wH4AbMBoQH/Ad4BkgE3Af8BxwESAQAB/wPWAf8D8AH/A4oB/wgAA5AB/wP9 + Af8D6gH/A68B/wOvAf8DrwH/A68B/wOvAf8D/QH/A+AB/wPlAf8D6wH/A5AB/wNOAZYIAAOQAf8D/QH/ + A+oB/wOvAf8DrwH/A68B/wOvAf8DrwH/A/0B/wPgAf8D5QH/A+sB/wOQAf8DTgGWCAADkAH/A/0B/wPq + Af8DrwH/A7gB/wPeAf8DxgH/A54B/wPyAf8DngH/A/EB/wPtAf8DqgH/A08BlggAA5AB/wP9Af8D6gH/ + A68B/wOvAf8DrwH/Ac8BQAEfAf8BxwETAQAB/wHHARIBAAH/AccBEgEAAf8B0AEZAQAB/wPfAf8DjgH/ + A04BlggAA5UB/wP9Af8D6QH/A+gB/wPoAf8D5wH/A+cB/wPmAf8D/QH/A+UB/wPrAf8DlQH/A04BlgwA + A5UB/wP9Af8D6QH/A+gB/wPoAf8D5wH/A+cB/wPmAf8D/QH/A+UB/wPrAf8DlQH/A04BlgwAA5UB/wP9 + Af8D6QH/A+gB/wPoAf8D6gH/A/UB/wPIAf8DoQH/A8gB/wPyAf8DlQH/A08BlgwAA5UB/wP9Af8D6QH/ + A+gB/wPoAf8D5wH/A+cB/wPmAf8D/QH/A+UB/wPrAf8DlQH/A04BlgwAA5oB/wP9Af8D6AH/A+cB/wPn + Af8D5gH/A+UB/wPlAf8D/QH/A+sB/wOaAf8DTgGWEAADmgH/A/0B/wPoAf8D5wH/A+cB/wPmAf8D5QH/ + A+UB/wP9Af8D6wH/A5oB/wNOAZYQAAOaAf8D/QH/A+gB/wPnAf8D5wH/A+YB/wPoAf8D7gH/A/4B/wPy + Af8DpgH/A08BlhAAA5oB/wP9Af8D6AH/A+cB/wPnAf8D5gH/A+UB/wPlAf8D/QH/A+sB/wOaAf8DTgGW + EAADngH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/A04BlhQAA54B/wP9Af8D/QH/ + A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A54B/wNOAZYUAAOeAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9 + Af8D/QH/A/0B/wOeAf8DTwGWFAADngH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/ + A04BlhQAA04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A04BlhgAA04BlgOhAf8DoQH/ + A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A04BlhgAA08BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOh + Af8DoQH/A08BlhgAA04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A04BlhgAA04BlgMO + Af8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wNOAZYIAANOAZYDDgH/ + Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DTgGWCAADTgGWAw4B/wMO + Af8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/A04BlggAA04BlgMOAf8DDgH/ + Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wNOAZYIAAMSBf8B1wHMAcEB/wGr + AT0BDwH/AdQBogErAf8BxwGUARsB/wHAAYsBEAH/AbkBgAECAf8BuAGEAQkB/wHbAd0B1gH/AeMB8AHy + Af8B2wHlAeQB/wHPAdkB2AH/AxIB/wgAAxIF/wPtAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/ + A/0B/wP9Bf8DEgH/CAADEgX/AcQBxgHIAf8BrQGxAbQB/wGwAbMBtwH/Aa8BtQG6Af8BrgG2AbwB/wGu + AbYBvAH/Aa8BtQG6Af8BsAGzAbcB/wGtAbEBtAH/AcQBxgHIBf8DEgH/CAADEgH/AQABhwEAAf8BAAEd + AQAB/wEAAQ8BAAH/AQABDAEAAf8BAAERAQAB/wEAAR0BAAH/AQABKgEAAf8BAAGRAQoB/wEAAb4BJAH/ + AQABuAEgAf8BAAGjAQ4B/wEAAZoBEQH/AxIB/wgAAxYB/wP9Af8BvgGuAZwB/wG/AY8BGQH/AdYBowEq + Af8BygGXAR8B/wHEAZABFwH/AbsBggEEAf8BwgGbASwB/wHjAe0B7wH/Ad0B5QHkAf8B2gHgAdwB/wHd + AeUB4gH/AxYB/wgAAxYB/wP9Af8D7QH/AdIBxAGtAf8B5AHjAeIB/wPtAf8D7QH/A+0B/wPtAf8B8QLw + Af8D7QH/AfEC8AH/A/0B/wMWAf8IAAMWAf8D/QH/AR4BkwG6Af8BIAGtAeQB/wESAaEB3AH/ARABjQG7 + Af8BGwGKAasB/wEbAYoBqwH/ARABjQG7Af8BEgGiAdwB/wEgAa0B5AH/AR0BkgG6Af8D/QH/AxYB/wgA + AxYB/wGFAYoBHAH/AagBpAGJAf8BswGrAYcB/wGxAaoBPQH/AbcBrwE7Af8BnQGaASQB/wEzATkBAAH/ + AQEBIgEAAf8BAAEmAQAB/wEAASoBAAH/AQABIgEAAf8BAAEzAQAB/wMWAf8IAAMcAf8B+QH4AfcB/wGt + AZYBOwH/Ad0BvAGZAf8B2gGuATwB/wHNAZkBHgH/AcUBjQEQAf8BvQGBAQAB/wHRAbsBnwH/AeYB8wH1 + Af8B3QHiAd8B/wHbAeEB3QH/AeEB6wHqAf8DHAH/CAADHAH/A/0B/wPtAf8BjwEZAQAB/wGrAYcBBgH/ + Ad0B1gHKAf8B3gLdAf8B8QLwAf8D7QH/AY8BGQEAAf8D7QH/AY8BGQEAAf8D/QH/AxwB/wgAAxwB/wP9 + Af8BKAGZAb0B/wEqAbkB8QH/ASEBjAGpAf8BhAGAATsB/wGYAYkBOwH/AZgBiQE7Af8BgwGAAToB/wEh + AYsBqQH/ASoBuQHyAf8BJwGYAbwB/wP9Af8DHAH/CAADHAP/AfsD/wH7A/8B9wP/AegC/wH5AdAC/wHu + AbcB/wHaAa8BLwH/AaoBigEiAf8BwwG5AZwB/wG2AZ8BKAH/AYIBNwEAAf8BgAGDAQIB/wMcAf8IAAMh + Af8B7gHqAeUB/wGrAZUBOgH/AvgB+QH/Ae4B7QHmAf8B5QHbAckB/wHZAb8BoAH/AckBnAErAf8B3gHY + AcsB/wHoAfUB+QH/AeQB7gHvAf8B4AHqAekB/wHnAvMB/wMhAf8IAAMhAf8D/QH/A+0B/wGPARkBAAH/ + AY8BGQEAAf8BlQEiAQAB/wG8AaIBMgH/AecC5gH/A+0B/wGPARkBAAH/A+0B/wGPARkBAAH/A/0B/wMh + Af8IAAMhAf8D/QH/ASUBnQHFAf8BIAGWAbwB/wEzASsBJgH/AZQBiQGCAf8BMQEvATEB/wExAS8BMQH/ + AZQBiQGCAf8BMwEqASYB/wEgAZYBvAH/ASQBnAHDAf8D/QH/AyEB/wgAAyEB/wLbAdIF/wH+AfMB1AH/ + AfIB4QGwAf8B7gHaAZ8B/wHRAb0BgAH/AbMBqwGKAf8C9gHdA/8B1wL/AfABuAL/AeUBpwH/AagBiwEm + Af8DIQH/CAADKAH/Ad4B1QHLAf8BwwGzAaEB/wH8Af0B/gH/AfMC9wH/AfEB+AH5Af8B7wH1AfsB/wHk + AeEB2AH/AcUBlwEiAf8ByQGnAT0B/wHSAcEBqAH/AdcB1AHHAf8B5ALsAf8DKAH/CAADKAH/A/0B/wPt + Af8BjwEZAQAB/wGPARkBAAH/AY8BGQEAAf8BvQGjATMB/wHlAeIB2wH/A+0B/wGPARkBAAH/A+0B/wGP + ARkBAAH/A/0B/wMoAf8IAAMoAf8D/QH/ASMBnwHKAf8BJgGIAZ4B/wEtARwBEAH/ASgBJwEpAf8BBwEF + AQYB/wEHAQUBBgH/ASgBJwEpAf8BLQEcARAB/wEmAYgBngH/ASIBngHJAf8D/QH/AygB/wgAAygB/wG5 + AbUBrgH/AdgB1wHSA/8B+gH/AfAB5AG+Af8B3AHGAYYB/wEwASUBCQH/AaoBpwGgBf8B7QHeAbUB/wHp + AdcBnAH/AZoBkQEvAf8B4AHfAd0B/wMoAf8IAAMuAf8BvwGtAZkB/wHgAdcBzgH/Av0B/gH/AfMB9QH0 + Af8B7wHyAe8B/wHwAfgB+wH/Ad4BzQG0Af8BwwGJAQoB/wG8AYIBAgH/AbUBNgEAAf8BtQE6AQAB/wG2 + AYoBFgH/Ay4B/wgAAy4B/wP9Af8D7QH/AY8BGQEAAf8BrAGJAQgB/wHhAdoBzgH/Ae8C7gH/A+0B/wPt + Af8BjwEZAQAB/wPtAf8BjwEZAQAB/wP9Af8DLgH/CAADLgH/A/0B/wEjAZ0ByAH/AScBigGhAf8BGwEK + AQEB/wETARIBEwH/ASICHwH/ASICHwH/ARMBEgETAf8BGwEKAQEB/wEnAYoBoQH/ASIBnAHHAf8D/QH/ + Ay4B/wgAAy4B/wP9Af8BsQGtAagB/wHiAuEF/wGTAY0BOAH/A+4B/wHTAdEBzgH/AckBxgHABf8BlwGO + ATcB/wHeAd0B2wH/A/0B/wMuAf8IAAM1Af8BqgGQATMB/wH8AfsB+gH/AfwC/gH/AfUB9wH2Af8B8wH2 + AfUB/wHyAfkB/AH/AdkBuQGUAf8ByQGTARgB/wHEAZEBGAH/AbsBhQEJAf8BuAE6AQAB/wGeASIBAAH/ + AzUB/wgAAzUB/wP9Af8D7QH/AdMBxwGyAf8D7AH/A+8B/wHxAvAB/wPtAf8D7QH/Ae8C7gH/Ae8C7gH/ + AfEC8AH/A/0B/wM1Af8IAAM1Af8D/QH/ASMBlwG+Af8BGQGWAcIB/wEgASEBJAH/ARsBEAELAf8IAAEb + ARABCwH/ASABIQEjAf8BGQGWAcIB/wEiAZYBvQH/A/0B/wM1Af8IAAM1Af8D/QH/A+8B/wGAAToBMAH/ + AY4BigGAAf8DnwH/A58B/wOfAf8BgwGAATcB/wGVAZEBhwH/AZgBlwGWAf8D6gH/A/0B/wM1Af8IAAM7 + Af8BpAGHAScB/wH1AfIB7wH/AfsB+gH5Af8C/gL/AfoB/AH+Af8C9AHxAf8B2AGtATwB/wHNAZkBHwH/ + AcYBkwEaAf8BvwGKARAB/wHBAYgBCQH/AZEBIgEAAf8DOwH/CAADOwH/A/0B/wPtAf8D7QH/A+wB/wPs + Af8D6wH/A+sB/wPtAf8D6gH/A+kB/wPpAf8D/QH/AzsB/wgAAzsB/wP9Af8BJAGTAbYB/wEOAZ0B2AH/ + AQMBgAGsAf8BIQEtATUB/wEkAR4BGwH/ASQBHgEbAf8BIQEtATYB/wECAYABrAH/AQ4BnQHYAf8BJAGS + AbUB/wP9Af8DOwH/CAADOwH/A/0B/wPtAf8D7QH/A+wB/wPsAf8D6wH/A+sB/wPqAf8D6gH/A+kB/wPp + Af8D/QH/AzsB/wgAA4QB/wHOAb4BrgH/AakBkgE3Af8BngGIAS8B/wG6AakBlwH/AdgB0AHIAf8B7AHh + AdUB/wHkAb0BlAH/Ad4BsAE9Af8B1AGhASgB/wHGAZABFAH/AcMBiQEKAf8BjwEtAQsB/wOEAf8IAAOE + Af8D/QH/A+wB/wOqAf8DqQH/A6kB/wOpAf8DqQH/A6kB/wOpAf8DqQH/A+cB/wP9Af8DhAH/CAADhAH/ + A/0B/wEkAZMBtQH/AQ8BmAHOAf8BAAGDAcIB/wEAAYIBuAH/AQIBgQGuAf8BAgGBAa4B/wEAAYIBuAH/ + AQABgwHCAf8BDwGYAc4B/wEjAZIBtAH/A/0B/wOEAf8IAAOEAf8D/QH/A+wB/wOqAf8DqQH/A6kB/wOp + Af8DqQH/A6kB/wOpAf8DqQH/A+cB/wP9Af8DhAH/CAADigH/A/0B/wPrAf8B5gHlAeMB/wHIAb4BtAH/ + AbwBrgGgAf8BpgGUAYEB/wGhAYcBKQH/AbABkgExAf8ByAGnAYQB/wHYAbABhgH/Ac4BoAEtAf8BkQE5 + ASIB/wOKAf8IAAOKAf8D/QH/A+sB/wPrAf8D6gH/A+oB/wPpAf8D6AH/A/0B/wP9Af8D/QH/A/0B/wP9 + Af8DigH/CAADigH/A/0B/wEkAZMBtAH/AQwBkwHIAf8BAAGAAb0B/wEAAS0BpgH/AQABLgGdAf8BAAEu + AZ0B/wEAAS0BpgH/AQABgAG9Af8BDAGTAcgB/wEoAZcBuQH/A/0B/wOKAf8IAAOKAf8D/QH/A+sB/wPr + Af8D6gH/A+oB/wPpAf8D6AH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DigH/CAADkAH/A/0B/wPqAf8DrwH/ + A68B/wOvAf8DrwH/AaYBowGfAf8B4gHcAdYB/wGlAZgBigH/AZEBOgEjAf8BiwEtARAB/wOQAf8DTgGW + CAADkAH/A/0B/wPqAf8DrwH/A68B/wOvAf8DrwH/A68B/wP9Af8D4AH/A+UB/wPrAf8DkAH/A04BlggA + A5AB/wP9Af8BJQGSAbMB/wEIAZABxQH/AQABOgG3Af8BAAEhAZgB/wIAASMB/wIAASMB/wEAASEBmAH/ + AQABOgG3Af8BCAGQAcUB/wElAZIBtAH/A5AB/wNOAZYIAAOQAf8D/QH/A+oB/wOvAf8DrwH/A68B/wOv + Af8DrwH/A/0B/wPgAf8D5QH/A+sB/wOQAf8DTgGWCAADlQH/A/0B/wPpAf8D6AH/A+gB/wPnAf8D5wH/ + A+YB/wP9Af8D5QH/A+sB/wOVAf8DTgGWDAADlQH/A/0B/wPpAf8D6AH/A+gB/wPnAf8D5wH/A+YB/wP9 + Af8D5QH/A+sB/wOVAf8DTgGWDAADlQH/A/0B/wEgAY8BsgH/AQABiAG/Af8BAAEqAasB/wEAASUBpAH/ + AQABEwGPAf8BAAETAY8B/wEAASUBpAH/AQABKgGrAf8BAAGIAb8B/wOVAf8DTgGWDAADlQH/A/0B/wPp + Af8D6AH/A+gB/wPnAf8D5wH/A+YB/wP9Af8D5QH/A+sB/wOVAf8DTgGWDAADmgH/A/0B/wPoAf8D5wH/ + A+cB/wPmAf8D5QH/A+UB/wP9Af8D6wH/A5oB/wNOAZYQAAOaAf8D/QH/A+gB/wPnAf8D5wH/A+YB/wPl + Af8D5QH/A/0B/wPrAf8DmgH/A04BlhAAA5oB/wP9Af8BNQGdAbkB/wEpAZ0BwwH/ARsBkQG6Af8BHwGW + Ab0B/wEfAZYBvQH/AR8BlgG9Af8BIAGXAb8B/wEbAZEBugH/A5oB/wNOAZYQAAOaAf8D/QH/A+gB/wPn + Af8D5wH/A+YB/wPlAf8D5QH/A/0B/wPrAf8DmgH/A04BlhAAA54B/wP9Af8D/QH/A/0B/wP9Af8D/QH/ + A/0B/wP9Af8D/QH/A54B/wNOAZYUAAOeAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wOe + Af8DTgGWFAADngH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/A04BlhQAA54B/wP9 + Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A54B/wNOAZYUAANOAZYDoQH/A6EB/wOhAf8DoQH/ + A6EB/wOhAf8DoQH/A6EB/wNOAZYYAANOAZYDoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wNO + AZYYAANOAZYDoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wNOAZYYAANOAZYDoQH/A6EB/wOh + Af8DoQH/A6EB/wOhAf8DoQH/A6EB/wNOAZYYAANOAZYDDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/ + Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DTgGWCAADTgGWAw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMO + Af8DDgH/Aw4B/wMOAf8DDgH/A04BlggAA04BlgMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/ + Aw4B/wMOAf8DDgH/Aw4B/wNOAZYIAANOAZYDDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMO + Af8DDgH/Aw4B/wMOAf8DTgGWCAADEgX/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/ + A/0F/wMSAf8IAAMSBf8DrAH/AzEB/wOnAf8DMQH/A/0B/wHvAfUB+gH/AQABLgHLAf8BAAGEAd4B/wEA + ASsBywH/AcMB2QHwBf8DEgH/CAADEgH/AdkB7AHkAf8D/gH/A/4B/wHpAvIB/wHNAdgB1QH/AdIBrgGX + Af8ByALlAf8BvAHwAfMB/wHCAfIB9QH/AdQB8QH1Af8B3QHsAfIB/wHeAeYB8QH/AxIB/wgAAxIF/wGy + AbUBuAH/AQABDAEsAf8BAAEGAR4B/wIAAQsB/wIAAQMB/wIAAQYB/wIAAQoB/wMAAf8DAAH/AwAB/wMA + Af8DEgH/CAADFgH/A/0B/wPqAf8D6gH/A+oB/wPeAf8BiAGJAYsB/wGKAYsBjQH/A98B/wPqAf8D6gH/ + A+oB/wP9Af8DFgH/CAADFgH/A64B/wM0Af8DkAH/A6EB/wM0Af8D8gH/AesB7QHwAf8BAAEuAcwB/wEm + AaYB6QH/AQABjAHpAf8BHAGaAdcB/wP9Af8DFgH/CAADFgH/Ae0B9AHwAf8D9QH/AeUB6wHpAf8BoQHa + AdkB/wGlAesB7gH/AacB6wHwAf8BqQHqAe4B/wGvAeEB6AH/AbsB1AHeAf8ByQHUAd8B/wHSAdsB5QH/ + Ad4B5QHvAf8DFgH/CAADFgH/A/0B/wGpAaoBrAH/AgABFgH/AgABGAH/AgABDAH/AwAB/wEAAQ8BBAH/ + AQABBgEAAf8BAAEUAQAB/wMAAf8DAAH/AwAB/wMWAf8IAAMcAf8D/QH/A+oB/wPqAf8D6gH/AakBswHG + Af8BmwGtAdgB/wGTAaYB0QH/AasBtAHHAf8D6gH/A+oB/wPqAf8D/QH/AxwB/wgAAxwB/wM5Af8DkAH/ + A4oB/wOhAf8DOQH/ASUBgAGaAf8DjQH/AS8BhQGbAf8BAAErAcsB/wEuAbEB8gH/AQABgAHbAf8BuQHU + AfAB/wMcAf8IAAMcAf8B9gL4Af8D9AH/AbgBwAG9Af8BKgGwAZQB/wGYAd4B2wH/AZ4B6gHuAf8BrQHa + Ad8B/wG3AckB0AH/AYwBmAGsAf8BrwG/AcsB/wHCAdAB3QH/Ac8B2gHnAf8DHAH/CAADHAH/A/0B/wGp + AaoBrAH/AgABDgH/AQABFAELAf8BAAEGAQAB/wEAATIBEAH/AQABOAERAf8BAAGGARUB/wEGAasBLwH/ + AQEBmgEmAf8BAAEqAQsB/wMAAf8DHAH/CAADIQH/A/0B/wPqAf8D6gH/A+oB/wG6AdUB7AH/ATsBnQHO + Af8BOwGZAcYB/wGsAccB3QH/A+oB/wPqAf8D6gH/A/0B/wMhAf8IAAMhAf8DkAH/A5AB/wMoAf8DpgH/ + Az0B/wEAASsBywH/AagBxAHiAf8D7wH/AZQBugHiAf8BAAGLAd4B/wEAAZIB7QH/ARkBnAHfAf8DIQH/ + CAADIQH/AeYB8QHtAf8B2QHnAeEB/wHoAe0B6gH/AdMB4wHaAf8BKQGzAZYB/wGkAecB5AH/AaoB7gHy + Af8BtgHbAd4B/wERARABsgH/ATwBigGQAf8BtQHFAdAB/wG5AckB1wH/AyEB/wgAAyEB/wP9Af8BqgGr + AawB/wEAAR8BEAH/AQABLQEIAf8BAAEtAQIB/wEAAYwBGAH/AQABoQEiAf8BBQGvATEB/wENAbUBOQH/ + ARMBvAGDAf8BDQG1ATkB/wEAAZcBIgH/AyEB/wgAAygB/wP9Af8D6gH/A+oB/wHmAegB6gH/AZ8BygHk + Af8BggHWAfAB/wE9AdgB8AH/AZMBvwHZAf8B5gHoAeoB/wPqAf8D6gH/A/0B/wMoAf8IAAMoAf8DhwH/ + A4YB/wOHAf8DtwH/A4QB/wEAAYgB6wH/AQABMwG6Af8DlQH/AZMBlQGWAf8BAAEwAdIB/wEQAaIB9wH/ + AQABgAHaAf8DKAH/CAADKAH/Ae0B9QHyAf8B4QHpAeYB/wGJAZ4BlgH/A9wB/wG9AdUByQH/ASgBsgGV + Af8BrgHqAegB/wGxAewB9QH/AgABygH/AScBLwEyAf8BJwEvATIB/wGhAbABuQH/AygB/wgAAygB/wP9 + Af8BpQGtAagB/wEAATsBEgH/AQABkAEeAf8BBAGrAS4B/wEEAbABMAH/AQABqgEnAf8BAAGkASYB/wEI + AbABNAH/AQMBrgEtAf8BAQGtASwB/wESAboBggH/AygB/wgAAy4B/wP9Af8D6gH/A+oB/wG4Ac4B3wH/ + ATQBxgHfAf8BiwH7Af0B/wE9Av0B/wEuAc0B5QH/AcgB3QHtAf8D6gH/A+oB/wP9Af8DLgH/CAADLgH/ + A6cB/wOnAf8DqAH/A8sB/wOJAf8BHAGqAfkB/wEAATYB1wH/A+0B/wPsAf8BAAGEAdwB/wEWAaUB9wH/ + AQABOwHcAf8DLgH/CAADLgH/AfMB+AH2Af8B5QHrAekB/wHUAeMB3QH/AfcC9gH/AewB8AHsAf8BLAG1 + AZcB/wGqAdoBwwH/AYYBpQHpAf8CAAHSAf8BAAEBAZMB/wEnAS8BMgH/AScBLwEyAf8DLgH/CAADLgH/ + A/0B/wHRAdUB0wH/ATYBrAGOAf8BAAGnASUB/wELAbgBOAH/AQ8BtgE8Af8BCQGyATUB/wEPAbYBPAH/ + AQwBsgE5Af8BDAG0ATkB/wEVAboBhQH/ARcBvQGGAf8DLgH/CAADNQH/A/0B/wPqAf8D6gH/AbQB0QHn + Af8BggHYAe4B/wG+Av0B/wG3Av4B/wE5AeEB8wH/AbQB0gHoAf8D6gH/A+oB/wP9Af8DNQH/CAADNQH/ + A8sB/wPFAf8DwgH/A9sB/wOOAf8BhgG9AfUB/wEAAYIBzQH/A58B/wGdAZ8BoAH/AQABNwHbAf8BMAG0 + AfoB/wEAAYYB4gH/AzUB/wgAAzUB/wH0AfkB9wH/AecB6wHpAf8BmQGjAZ4B/wPDAf8B1gHZAdcB/wEr + AbIBlgH/AaMBzAHFAf8CAAHSAf8CAAHRAf8CAAHSAf8BAAEBAZIB/wEnAS8BMgH/AzUB/wgAAzUB/wP9 + Af8D7wH/A6AB/wGHAY8BigH/ARkBjQEuAf8BAAGlASkB/wEHAbIBNQH/AQABrAErAf8BCwG1ATYB/wEQ + AbgBOwH/ARYBvQGGAf8BEgG9AYIB/wM1Af8IAAM7Af8D/QH/A+oB/wPqAf8B4QHuAfcB/wGNAcEB3gH/ + AcUB/QH8Af8BuwH7AfoB/wGDAbsB2gH/AdAB3QHmAf8D6gH/A+oB/wP9Af8DOwH/CAADOwH/A+oB/wPg + Af8DygH/A90B/wOTAf8BAAGPAesB/wGlAccB6gH/A+oB/wGTAbwB5wH/AQABjwHpAf8BOAG3AfUB/wEg + AaUB6wH/AzsB/wgAAzsB/wH4AfoB+QH/AekC6wH/AesB7QHsAf8D8AH/AeEB5wHkAf8BgAG8AaQB/wIA + AdIB/wIAAdIB/wIAAdIB/wIAAdEB/wIAAdEB/wEnAS8BMgH/AzsB/wgAAzsB/wP9Af8D7QH/A+0B/wPs + Af8D7AH/AckB0AHMAf8BgQGuAZMB/wEOAbABNwH/AREBvAGBAf8BDwG7ATwB/wEfAa0BPQH/AbYByQHA + Af8DOwH/CAADhAH/A/0B/wPqAf8D6gH/A+oB/wHFAdcB5AH/AZgBuwHZAf8BmgG8AdkB/wHHAdgB5QH/ + A+oB/wPqAf8D6gH/A/0B/wOEAf8IAAOEAf8DlwH/A+wB/wPgAf8D4AH/A5cB/wE8AZ4BvwH/A6kB/wGQ + AaEBtAH/AQABgQHkAf8BOQG5AfkB/wEOAZ0B7QH/Ab4B2QH3Af8DhAH/CAADhAH/A/0B/wPsAf8DrAH/ + A68B/wO9Af8BrQHIAbkB/wIAAdQB/wIAAdEB/wIAARwB/wIAAdIB/wIAAdYB/wEoAbIBlQH/A4QB/wgA + A4QB/wP9Af8D7AH/A6oB/wOpAf8DqQH/A6kB/wOpAf8BlwGdAZoB/wEzAZcBhAH/ATwBkQGHAf8D4gH/ + A/0B/wOEAf8IAAOKAf8D/QH/A+oB/wPqAf8D6gH/A+oB/wPqAf8D6gH/A/0B/wP9Af8D/QH/A/0B/wP9 + Af8DigH/CAADigH/A8MB/wObAf8D7AH/A+gB/wObAf8D6QH/AeYB5wHoAf8BAAGHAesB/wE7AbcB9gH/ + AYkBvwH3Af8BLgGvAfEB/wP9Af8DigH/CAADigH/AfcB+gH5Af8B6AHqAekB/wHoAeoB6QH/AeMB5wHl + Af8B0wHgAdsB/wGrAc4BwAH/ARIBEwHaAf8CAAHRAf8CAAHSAf8CAAHSAf8CAAHWAf8BKAGzAZUB/wOK + Af8IAAOKAf8D/QH/A+sB/wPrAf8D6gH/A+oB/wPpAf8D6AH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DigH/ + CAADkAH/A/0B/wPqAf8D6wH/A+sB/wPrAf8D6wH/A+YB/wP9Af8D4AH/A+UB/wPrAf8DkAH/A04BlggA + A5AB/wP9Af8DvQH/A54B/wPyAf8DngH/A68B/wOvAf8B1QHnAfoB/wEAAZEB7gH/AQABiwHuAf8BuwHT + AesB/wOQAf8DTgGWCAADkAH/AfwC/QH/A+oB/wOvAf8BrwGwAa8B/wGvArAB/wOvAf8DrwH/AQsBEQHb + Af8CAAHSAf8BCQEMAdoB/wPrAf8DkAH/A04BlggAA5AB/wP9Af8D6gH/A68B/wOvAf8DrwH/A68B/wOv + Af8D/QH/A+AB/wPlAf8D6wH/A5AB/wNOAZYIAAOVAf8D/QH/A+kB/wOvAf8DrwH/A68B/wOvAf8D5gH/ + A/0B/wPlAf8D6wH/A5UB/wNOAZYMAAOVAf8D/QH/A+kB/wO+Af8DoQH/A74B/wPnAf8D5gH/A/0B/wHQ + AdsB5gH/AeUB6AHrAf8DlQH/A04BlgwAA5UB/wP9Af8D6QH/A+gB/wPoAf8D5wH/A+cB/wPmAf8D/QH/ + A+UB/wPrAf8DlQH/A04BlgwAA5UB/wP9Af8D6QH/A+gB/wPoAf8D5wH/A+cB/wPmAf8D/QH/A+UB/wPr + Af8DlQH/A04BlgwAA5oB/wP9Af8D6AH/A+cB/wPnAf8D5gH/A+UB/wPlAf8D/QH/A+sB/wOaAf8DTgGW + EAADmgH/A/0B/wPoAf8D5wH/A+cB/wPmAf8D5QH/A+UB/wP9Af8D6wH/A5oB/wNOAZYQAAOaAf8D/QH/ + A+gB/wPnAf8D5wH/A+YB/wPlAf8D5QH/A/0B/wPrAf8DmgH/A04BlhAAA5oB/wP9Af8D6AH/A+cB/wPn + Af8D5gH/A+UB/wPlAf8D/QH/A+sB/wOaAf8DTgGWEAADngH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/ + A/0B/wP9Af8DngH/A04BlhQAA54B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A54B/wNO + AZYUAAOeAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wOeAf8DTgGWFAADngH/A/0B/wP9 + Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/A04BlhQAA04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/ + A6EB/wOhAf8DoQH/A04BlhgAA04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A04BlhgA + A04BlgOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A04BlhgAA04BlgOhAf8DoQH/A6EB/wOh + Af8DoQH/A6EB/wOhAf8DoQH/A04BlhgAA04BlgMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/ + Ax0B/wMdAf8DHQH/Ax0B/wNOAZYIAANOAZYDDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMO + Af8DDgH/Aw4B/wMOAf8DTgGWCAADTgGWAw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/ + Aw4B/wMOAf8DDgH/A04BlggAA04BlgMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMOAf8DDgH/Aw4B/wMO + Af8DDgH/Aw4B/wNOAZYIAAMhBf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QX/ + AyEB/wgAAxIF/wP9Af8D/QH/A8oB/wPOAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Bf8DEgH/CAADEgX/ + A/0B/wIAAZsB/wIAAZsB/wIAAZsB/wIAAZsB/wIAAY4B/wIAATgB/wIAASMB/wIAASMB/wIAASMB/wIA + ASMB/wMSAf8IAAMSBf8D/QH/A/0B/wP9Af8D/QH/AgABBQH/AgABBAH/AYwBkgGWAf8BAQEPARYB/wEA + AQYBFAH/AdcC2AX/AxIB/wgAAyUB/wP9Af8D8wH/A/MB/wPyAf8D8gH/A/IB/wPxAf8D8QH/A/AB/wPw + Af8D7wH/A/0B/wMlAf8IAAMWAf8D/QH/A/MB/wPzAf8BAAGMAeIB/wEAAZEB0AH/A8IB/wPrAf8D8QH/ + A/AB/wPwAf8D7wH/A/0B/wMWAf8IAAMWAf8D/QH/A/MB/wIAAZsB/wIAAZsB/wIAAYcB/wIAAT0B/wIA + Aa4B/wIQAd4B/wIQAd4B/wIAAaYB/wIAATMB/wIAASMB/wMWAf8IAAMWAf8D/QH/A/MB/wPzAf8D8gH/ + A/IB/wEAAQUBIwH/AQABAgEeAf8BMwE7AYEB/wMAAf8CAAEcAf8BGQEjASgB/wP9Af8DFgH/CAADKwH/ + A/0B/wPyAf8DjQH/A40B/wONAf8DjQH/A40B/wONAf8DjQH/A40B/wPuAf8D/QH/AysB/wgAAxwB/wP9 + Af8D8gH/A40B/wONAf8BAAGaAdwB/wEAAZkB1QH/ASgBMgE5Af8DgwH/A40B/wONAf8D7gH/A/0B/wMc + Af8IAAMcAf8D/QH/A/IB/wIAAYAB/wIAAYkB/wIBAbYB/wITAeYB/wITAeYB/wITAeYB/wITAeYB/wIT + AeYB/wITAeYB/wIEAb8B/wMcAf8IAAMcAf8D/QH/A/IB/wIAAQwB/wEuAS8BMAH/A40B/wEAAQcBKgH/ + AQABCQEtAf8DAAH/AgABBAH/AQABDQE0Af8CAAELAf8BFAEfASUB/wMcAf8IAAMwAf8D/QH/A/IB/wPx + Af8D8QH/A/AB/wPwAf8D7wH/A+8B/wPuAf8D7gH/A+0B/wP9Af8DMAH/CAADIQH/A/0B/wPyAf8D8QH/ + A/EB/wEIAaQB1gH/AZUB9AL/AQQBnQHXAf8BjwGuAcUB/wPWAf8D7gH/A+0B/wP9Af8DIQH/CAADIQH/ + A/0B/wPyAf8CAQG2Af8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHm + Af8CEwHmAf8DIQH/CAADIQH/A/0B/wPqAf8BAAEEASIB/wPtAf8D8AH/AgABFAH/AgABEwH/AgABCQH/ + AgABBgH/AgABGQH/AaEBpQGnAf8BBAEVASUB/wMhAf8IAAM3Af8D/QH/A/EB/wOWAf8DlgH/A5UB/wOV + Af8DlQH/A5UB/wOVAf8DlQH/A+wB/wP9Af8DNwH/CAADKAH/A/0B/wPxAf8DlgH/A5YB/wGcAbkByQH/ + ASsBzwHyAf8BhwHqAf0B/wEDAZ0B1gH/ARcBgwGkAf8DgQH/A+wB/wP9Af8DKAH/CAADKAH/A/0B/wPx + Af8CAAEsAf8CAAGGAf8CAQG2Af8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CEwHmAf8CBAG/ + Af8DKAH/CAADKAH/A/0B/wPxAf8BAAEHASgB/wEhASUBJgH/A5UB/wIAAQcB/wIAAQkB/wIAAQ8B/wIA + AQ8B/wMAAf8D7AH/AbgCugH/AygB/wgAAz0B/wP9Af8D8AH/A+8B/wPvAf8D7gH/A+4B/wPtAf8D7QH/ + A+wB/wPrAf8D6wH/A/0B/wM9Af8IAAMuAf8D/QH/A/AB/wPvAf8BAAGMAeAB/wEAAaEB3wH/AQ4BrwHh + Af8BOwHpAf0B/wGBAe8C/wEVAbQB4wH/ASQBoAHMAf8D6wH/A/0B/wMuAf8IAAMuAf8D/QH/A/AB/wPv + Af8CvQHMAf8BMAEvAZkB/wIAATMB/wIAAaYB/wIQAd4B/wIQAd4B/wIAAa4B/wIAATMB/wEoAScBlQH/ + Ay4B/wgAAy4B/wP9Af8CvQG+Af8BAAEFASEB/wMAAf8D7gH/AQoBFQEcAf8DAAH/AgABAgH/AgABAgH/ + AwAB/wPrAf8BNwE9AYIB/wMuAf8IAANEAf8D/QH/A+8B/wOgAf8DnwH/A58B/wOfAf8DnwH/A58B/wOf + Af8DnwH/A+oB/wP9Af8DRAH/CAADNQH/A/0B/wPvAf8DoAH/AQABiQHYAf8BiwHsAv8BKgHhAfkB/wEa + AcAB6AH/AQABjAHQAf8BAQGSAdMB/wEDAZUB1QH/A+oB/wP9Af8DNQH/CAADNQH/A/0B/wPvAf8DoAH/ + A58B/wOfAf8DnwH/AY0BjAGYAf8CNAGiAf8CLQGiAf8CgAGUAf8D6gH/A/0B/wM1Af8IAAM1Af8D/QH/ + A+8B/wEAAQwBFAH/AgABAwH/AwAB/wMAAf8CAAEJAf8DAAH/AgABBQH/AgABBAH/AwAB/wIAARIB/wM1 + Af8IAANKAf8D/QH/A+0B/wPtAf8D7AH/A+wB/wPrAf8D6wH/A+oB/wPqAf8D6QH/A+kB/wP9Af8DSgH/ + CAADOwH/A/0B/wPtAf8D7QH/ASIBowHSAf8BiAHUAfIB/wE6AeAB+AH/ARYBzAHvAf8BAwGVAdUB/wGd + AbIBwwH/A+kB/wPpAf8D/QH/AzsB/wgAAzsB/wP9Af8D7QH/A+0B/wPsAf8D7AH/A+sB/wPrAf8D6gH/ + A+oB/wPpAf8D6QH/A/0B/wM7Af8IAAM7Af8D/QH/A+0B/wG9Ar4B/wEAAQwBGQH/AgABAwH/AQABDQEm + Af8CAAEOAf8CAAEDAf8CAAEZAf8BAwEfAYAB/wIAARIB/wIAAQ8B/wM7Af8IAAOEAf8D/QH/A+wB/wOq + Af8DqQH/A6kB/wOpAf8DqQH/A6kB/wOpAf8DqQH/A+cB/wP9Af8DhAH/CAADhAH/A/0B/wPsAf8DqgH/ + A6kB/wETAbUB5gH/AdkB+QH+Af8BCwHTAfQB/wEJAbUB5QH/AQsBlwHSAf8DnQH/A+cB/wP9Af8DhAH/ + CAADhAH/A/0B/wPsAf8DqgH/A6kB/wOpAf8DqQH/A6kB/wOpAf8DqQH/A6kB/wPnAf8D/QH/A4QB/wgA + A4QB/wP9Af8D7AH/A6oB/wEvATEBNAH/AQABJwGfAf8BAAEcAY0B/wEAAQQBJAH/AQ4BHQGpAf8BAAED + ASQB/wEAAR8BkQH/AQEBLgGqAf8BGgEpATkB/wOEAf8IAAOKAf8D/QH/A+sB/wPrAf8D6gH/A+oB/wPp + Af8D6AH/A/0B/wP9Af8D/QH/A/0B/wP9Af8DigH/CAADigH/A/0B/wPrAf8D6wH/A+oB/wEAAZ4B3QH/ + AY8B6AH5Af8BkgHoAfkB/wGXAekB+wH/AQoBmAHYAf8BngG5Ac8B/wP9Af8D/QH/A4oB/wgAA4oB/wP9 + Af8D6wH/A+sB/wPqAf8D6gH/A+kB/wPoAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wOKAf8IAAOKAf8D/QH/ + A+sB/wPSAf8B1wLWAf8B2gHbAdwB/wEsATkBiwH/AQABBgEwAf8CAAE0Af8BAAEEAS4B/wEPASQBPQH/ + AcIBxQHIAf8BngGdAZwB/wOKAf8IAAOQAf8D/QH/A+oB/wOvAf8DrwH/A68B/wOvAf8DrwH/A/0B/wPg + Af8D5QH/A+sB/wOQAf8DTgGWCAADkAH/A/0B/wPqAf8DrwH/A68B/wEAAY4B2AH/AQABjwHYAf8BAAGS + AdwB/wEDAZgB4gH/AQsBnQHhAf8BDwGeAd8B/wPrAf8DkAH/A04BlggAA5AB/wP9Af8D6gH/A68B/wOv + Af8DrwH/A68B/wOvAf8D/QH/A+AB/wPlAf8D6wH/A5AB/wNOAZYIAAOQAf8D/QH/A+oB/wOvAf8DrwH/ + A68B/wOvAf8BAAECAYYB/wEAAQ4BNQH/AQABAgGGAf8D5AH/A+sB/wOQAf8DTgGWCAADlQH/A/0B/wPp + Af8D6AH/A+gB/wPnAf8D5wH/A+YB/wP9Af8D5QH/A+sB/wOVAf8DTgGWDAADlQH/A/0B/wPpAf8D6AH/ + A+gB/wPnAf8D5wH/A+YB/wP9Af8D5QH/A+sB/wOVAf8DTgGWDAADlQH/A/0B/wPpAf8D6AH/A+gB/wPn + Af8D5wH/A+YB/wP9Af8D5QH/A+sB/wOVAf8DTgGWDAADlQH/A/0B/wPpAf8D6AH/A+gB/wPnAf8D5wH/ + AQABFAGEAf8BAAEeAZQB/wEAARUBhQH/A+sB/wOVAf8DTgGWDAADmgH/A/0B/wPoAf8D5wH/A+cB/wPm + Af8D5QH/A+UB/wP9Af8D6wH/A5oB/wNOAZYQAAOaAf8D/QH/A+gB/wPnAf8D5wH/A+YB/wPlAf8D5QH/ + A/0B/wPrAf8DmgH/A04BlhAAA5oB/wP9Af8D6AH/A+cB/wPnAf8D5gH/A+UB/wPlAf8D/QH/A+sB/wOa + Af8DTgGWEAADmgH/A/0B/wPoAf8D5wH/A+cB/wPmAf8D5QH/A+UB/wP9Af8D6wH/A5oB/wNOAZYQAAOe + Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wOeAf8DTgGWFAADngH/A/0B/wP9Af8D/QH/ + A/0B/wP9Af8D/QH/A/0B/wP9Af8DngH/A04BlhQAA54B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9 + Af8D/QH/A54B/wNOAZYUAAOeAf8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wOeAf8DTgGW + FAADTgGWA6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DTgGWGAADTgGWA6EB/wOhAf8DoQH/ + A6EB/wOhAf8DoQH/A6EB/wOhAf8DTgGWGAADTgGWA6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOh + Af8DTgGWGAADTgGWA6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DTgGWvwAB/wMAAf8DAAH/ + AwAB/wsAAf8BjgErAQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AY4BKwEAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wGOASsBAAH/AwAB/wMAAf8XAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/1sAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ASgBJAEaAf8BFQEQAQAB/wMAAf8DAAH/BAABjgErAQAB/wEA + AaEB4QH/AQABoQHhKf8BAAGhAeEB/wEAAaEB4QH/AwAB/xMAAf8DAAH/A7AB/wOxAf8DsAH/A60B/wOr + Af8DoAH/AwAB/wwAATYBhAGPAf8BLQE7AYUB/wEhAS4BOAH/ARIBHgEnAf8BAwENARUB/wIAAQIB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAf8DAAH/ARkBCwEAAf8BnwGCAQAB/wHb + AccBkAH/AeYB1wG0Af8B5gHXAbQB/wG0Aa4BjwH/ASsBIQEAAf8BLwEhAQAB/wEOAQIBAAH/AwAB/wMA + Af8HAAH/AQABoQHhAf8BDAHBAf4B/wMAAf8DAAH/AwAB/wMAAf8DjQH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8BAAGhAeEB/wEMAcEB/gH/AwAB/w8AAf8DqgH/AwAB/wPXAf8D2QH/A9wB/wPfAf8D4QH/A88B/wMA + Af8MAAE4AYcBkgH/AaIB3wHwAf8BMQHNAeoB/wEKAbgB4gH/AQABrgHbAf8BAAGpAdkB/wEAAaEB0gH/ + AQABmAHHAf8BAAGOAbwB/wEAAYMBrgH/AQABQAGrAf8BAAE9AakB/wEAATgBnwH/AQABMwGWAf8DAAH/ + CwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEiARkBBQH/ASgBFwEAAf8DAAH/ + AwAB/wcABf8DAAH/AwAB/wMAAf8DAAH/AwAB/wONAf8DAAH/AwAB/wMAAf8DAAH/AwAF/wMAAf8DAAH/ + CwAB/wOqAf8DwQH/AwAB/wPVAf8D2QH/A90B/wPhAf8D5QH/A9IB/wMAAf8MAAE7AYoBlQH/AaoB6AH2 + Af8BlQHlAfwB/wGEAd8B+wH/ATYB1gH6Af8BKwHQAfcB/wEeAcYB9AH/AREBvgHwAf8BAgG0AewB/wEA + AaoB6AH/AQABpAHmAf8BAAGaAd8B/wEAAZAB1wH/AQABOAGfAf8DAAH/EAADGAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/BwAB/wEkAR4BFAH/AwAB/wsABf8DAAH/AwAB/wMAAf8DAAH/AwAB/wONAf8DAAH/ + AwAB/wMAAf8DAAH/AwAF/wMAAf8DAAH/CwAB/wMAAf8DAAH/A6oB/wPOAf8D0wH/A9gB/wPcAf8D4AH/ + A9EB/wMAAf8MAAE+AY4BmAH/AbAB6gH2Af8BnwHpAfsB/wGSAeQB/AH/AYEB3QH7Af8BNgHWAfoB/wEp + Ac4B9wH/AR4BxgH0Af8BDgG8AfAB/wECAbQB7AH/AQABqgHoAf8BAAGjAeYB/wEAAZYB3AH/AQABPQGp + Af8DAAH/DAADGAH/A9gB/wMYAf8DwAH/A84B/wPTAf8D2AH/AwAB/wcAAf8DwAH/A4AB/wsABf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wONAf8DAAH/AwAB/wMAAf8DAAH/AwAF/wMAAf8DAAH/CwAB/wPVAf8DwQH/ + A8QB/wPJAf8DzwH/A9MB/wPXAf8D2wH/A80B/wMAAf8MAAGAAZEBnAH/AbYB7QH4Af8BqgHsAfsB/wGb + AegB+wH/AY8B4wH8Af8BgQHdAfsB/wEyAdUB+QH/ASkBzgH3Af8BHAHFAfQB/wEOAbwB8AH/AQABsgHs + Af8BAAGpAegB/wEAAZ4B4gH/AQABggG0Af8BAAEEAQwB/wwAAxgB/wMYAf8DGAH/A8AB/wPJAf8DzwH/ + A9MB/wMAAf8EAAMYAf8DGAH/AwAB/wsABf8DAAH/AwAB/wMAAf8DAAH/AwAB/wONAf8DAAH/AwAB/wMA + Af8DAAH/AwAF/wMAAf8DAAH/CwAB/wPTAf8DvAH/A8AB/wPFAf8DyQH/A80B/wPRAf8D1QH/A8wB/wMA + Af8MAAGDAZUBnwH/Ab4B8AH5Af8BqwHwAfcB/wGlAewB+wH/AZgB5wH7Af8BiQHhAfwB/wFAAd0B+wH/ + ATIB1QH5Af8BJgHNAfcB/wEZAcQB8wH/AQwBuwHwAf8BAAGyAewB/wEAAaQB4wH/AQABigG/Af8BCgEU + AR0B/wwAAxgB/wPTAf8DvAH/A8AB/wPFAf8DyQH/A80B/wMAAf8HAAH/A8AB/wOAAf8IAAGOASsBAAX/ + A40B/wONAf8DjQH/A40B/wONAf8BAAGhAeEB/wEAAaEB4QH/AwAB/wGOASsBAAH/AwAB/wGOASsBAAX/ + AY4BKwEAAf8DAAH/CwAB/wPRAf8DtwH/A7sB/wPAAf8DxAH/A8gB/wPMAf8D0QH/A8kB/wMAAf8MAAGG + AZkBowH/Ab4B8AH5Af8BtgHtAfgB/wGwAe4B+gH/AaQB6wH6Af8BlQHmAfsB/wGJAeEB/AH/AT4B3AH8 + Af8BMgHVAfkB/wEmAc0B9wH/ARkBxAHzAf8BCgG5Ae8B/wEAAakB5wH/AQABjwHHAf8BGAEkASwB/wwA + AxgB/wPRAf8DtwH/A7sB/wPAAf8DxAH/A8gB/wMAAf8EAAMYAf8DGAH/AwAB/wsABf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wEAAaEB4QH/AQwBwQH+Af8DAAH/AwAB/wMAAf8DAAX/AwAB/wMAAf8LAAH/A9EB/wOz + Af8DtQH/A7kB/wO/Af8DwwH/A8cB/wPLAf8DxgH/AwAB/wwAAYkBnAGmAf8BvgHwAfkB/wG2Ae0B+AH/ + AbYB7QH4Af8BqwHwAfcB/wGiAewB+gH/AZUB5gH7Af8BiQHhAfwB/wE+AdwB/AH/ATAB0wH6Af8BJAHM + AfcB/wEWAcMB8wH/AQoBuQHvAf8BAAGZAc8B/wEkATEBOwH/DAADGAH/A9EB/wOzAf8DtQH/A7kB/wO/ + Af8DwwH/AwAB/wcAAf8DwAH/A4AB/wsABf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAF/wMAAf8DAAH/CwAB/wPRAf8DrQH/A7EB/wO0Af8DuQH/A7wB/wPBAf8DxQH/A8QB/wMA + Af8MAAGLAaABqAH/Ab4B8AH5Af8BvgHwAfkB/wG+AfAB+QH/Ab4B8AH5Af8BtAHyAfgB/wGqAewB+wH/ + AaAB6QH7Af8BlQHlAfwB/wGKAd8B/AH/AUAB2AH7Af8BNQHSAfgB/wEpAcoB9AH/AR4BwAHxAf8BJAEx + ATsB/wwAAxgB/wPRAf8DrQH/A7EB/wO0Af8DuQH/A7wB/wMAAf8EAAMYAf8DGAH/AwAB/wsABf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wGOASsBAAH/AwAB/wMAAf8DAAH/AwAB/wMABf8DAAH/AwAB/wsAAf8DygH/ + A6gB/wOsAf8DsAH/A7QB/wO4Af8DvAH/A8AB/wPBAf8DAAH/DAABjQGhAaoB/wGNAaEBqgH/AY0BoQGq + Af8BjQGhAaoB/wGNAaEBqgH/AYsBnwGoAf8BiQGcAaYB/wGJAZsBpgH/AYcBmgGkAf8BhgGZAaMB/wGE + AZYBoAH/AYQBlgGgAf8BgwGVAaAB/wGDAZUBoAH/ATYBhAGPAf8MAAMYAf8DygH/A6gB/wOsAf8DsAH/ + A7QB/wO4Af8DAAH/BwAB/wPAAf8DgAH/CwAF/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAX/AwAB/wMAAf8LAAH/A8sB/wOpAf8DrAH/A7AB/wO0Af8DtwH/A7sB/wO9Af8DwAH/ + AwAB/wwAAY8BpAGsAf8BsgHkAewB/wG2Ae0B+AH/AbYB7QH4Af8BqQHsAfYB/wGSAeEB8wH/AY0BoQGq + Af8sAAMYAf8DGAH/AxgB/wMYAf8DGAH/AxgB/wMYAf8DGAH/BwAB/wGFAYMBJgH/AwAB/wsABf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wGOASsBAAH/AwAB/wMAAf8DAAH/AwAB/wMABf8DAAH/AwAB/wsAAf8D8gH/ + A9UB/wPSAf8D0QH/A84B/wPLAf8DygH/A8cB/wPGAf8DAAH/EAABjwGkAawB/wGPAaQBrAH/AY8BpAGs + Af8BjwGkAawB/wGPAaQBrAH/LwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEy + ASwBHQH/AZ0BkQEMAf8DAAH/AwAB/wQAAY4BKwEAAf8BAAGhAeEB/wEAAaEB4Sn/AQABoQHhAf8BAAGh + AeEB/wMAAf8LAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/1cAAf8BCQIA + Af8BnwGCAQAB/wHbAccBkAH/AeYB1wG0Af8B5gHXAbQB/wHmAdcBtAH/AeYB1wG0Af8B4AHVAbEB/wG0 + Aa4BjwH/ARYBCgEAAf8DAAH/AwAB/wcAAf8BAAGhAeEB/wEMAcEB/gH/AwAB/wMAAf8DAAH/AwAB/wGO + ASsBAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BAAGhAeEB/wEMAcEB/gH/AwAB/48AAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/CwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wFCAU0BPgcAAT4DAAEoAwABQAQAAQECAAEB + AQABAQYAAQgWAAP/AQAC/wYAAv8HAAEPBwABBwcAAQcHAAEDBwABAwcAAQEXAAEHBwABBwYAAQEB/wYA + AYMB/wYAAv8GAAL/BgAQ/wEAAQ8BAAEPAQABDwEAAQ8BAAEHAQABBwEAAQcBAAEHAQABBwEAAQcBAAEH + AQABBwEAAQMBAAEDAQABAwEAAQMBAAEDAQABAwEAAQMBAAEDAQABAQEAAQEBAAEBAQABAREAAQcBAAEH + AQABBwEAAQcBAAEHAQABBwEAAQcBAAEHAQEB/wEBAf8BAQH/AQEB/wGDAf8BgwH/AYMB/wGDIf8BAAEP + AQABDwEAAQ8BAAEPAQABBwEAAQcBAAEHAQABBwEAAQcBAAEHAQABBwEAAQcBAAEDAQABAwEAAQMBAAED + AQABAwEAAQMBAAEDAQABAwEAAQEBAAEBAQABAQEAAQERAAEHAQABBwEAAQcBAAEHAQABBwEAAQcBAAEH + AQABBwEBAf8BAQH/AQEB/wEBAf8BgwH/AYMB/wGDAf8BgyH/AQABDwEAAQ8BAAEPAQABDwEAAQcBAAEH + AQABBwEAAQcBAAEHAQABBwEAAQcBAAEHAQABAwEAAQMBAAEDAQABAwEAAQMBAAEDAQABAwEAAQMBAAEB + AQABAQEAAQEBAAEBEQABBwEAAQcBAAEHAQABBwEAAQcBAAEHAQABBwEAAQcBAQH/AQEB/wEBAf8BAQH/ + AYMB/wGDAf8BgwH/AYMh/wEAAQ8BAAEPAQABDwEAAQ8BAAEHAQABBwEAAQcBAAEHAQABBwEAAQcBAAEH + AQABBwEAAQMBAAEDAQABAwEAAQMBAAEDAQABAwEAAQMBAAEDAQABAQEAAQEBAAEBAQABAREAAQcBAAEH + AQABBwEAAQcBAAEHAQABBwEAAQcBAAEHAQEB/wEBAf8BAQH/AQEB/wGDAf8BgwH/AYMB/wGDIf8BAAEB + AQABAQEAAQ8BAAEPAQABAQEAAQEBAAEHAQABBwEAAQEBAAEBAQABBwEAAQcBAAEBAQABAQEAAQMBAAED + AQABAQEAAQEBAAEDAQABAwEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQUAAQEBAAEBBQABAQEAAQEBAAEH + AQABBwEAAQEBAAEBAQABBwEAAQcBAQH/AQEB/wEBAf8BAQH/AYMB/wGDAf8BgwH/AYMh/wEAAQEBAAEB + AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEB + AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEB + AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAgEB/wEBAf8BAQH/AQEB/wGDAf8BgwH/AYMB/wGD + If8BAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEA + AQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEA + AQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAIBAf8BAQH/AQEB/wEBAf8BgwH/ + AYMB/wGDAf8BgyH/AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEB + AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEB + AQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQACAQH/AQEB/wEB + Af8BAQH/AYMB/wGDAf8BgwH/AYMh/wEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEA + AQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEA + AQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEA + AgEB/wEBAf8BAQH/AQEB/wGDAf8BgwH/AYMB/wGDEf8BgAEBAYABAQGAAQEC/wGAAQEBgAEBAYABAQL/ + AYABAQGAAQEBgAEBAQABAQGAAQEBgAEBAYABAQEAAQEBgAEBAYABAQGAAQEBAAEBAYABAQGAAQEBgAEB + AQABAQGAAQEBgAEBAYABAQEAAQEBgAEBAYABAQGAAQEBAAEBAYABAQGAAQEBgAEBAQABAQGAAQEBgAEB + AYABAQEAAQEBgAEBAYABAQGAAQEBAAEBAYABAQGAAQEBgAEBAQABAQGAAQMBgAEDAYABAwEBAf8BgAEH + AYABBwGAAQcBgwH/AYABDwGAAQ8BgAEPAv8BgAEfAYABHwGAAR8C/wGAAQEBgAEAAYABAQGAAQEBgAEB + AYABAAGAAQEBgAEBAYABAQGAAQABgAEBAYABAQGAAQEBgAEAAYABAQGAAQEBgAEBAYABAAGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQMBgAED + AYABAwGAAQMBgAEHAYABBwGAAQcBgAEHAYABDwGAAQ8BgAEPAYABDwGAAR8BgAEfAYABHwGAAR8BgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQECgQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAwGAAQMBgAEDAYABAwGAAQcBgAEHAYABBwGAAQcBgAEPAYABDwGAAQ8BgAEPAYABHwGA + AR8BgAEfAYABHwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQMBgAEDAYABAwGAAQMBgAEHAYABBwGAAQcBgAEHAYABDwGA + AQ8BgAEPAYABDwGAAR8BgAEfAYABHwGAAR8BgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEDAYABAwGAAQMBgAEDAYABBwGA + AQcBgAEHAYABBwGAAQ8BgAEPAYABDwGAAQ8BgAEfAYABHwGAAR8BgAEfBf8BwwIAAfgBBwL/AeABAQIA + AfABBwEAAQEBwAEBAgAB4AEHAQABAQGAAQECAAHAAQcBAAEBAeABIwIAAcABBwEAAQEBwAEjAgABwAEH + AQABAQHAASMCAAHAAQcBAAEBAcABIwIAAcABBwEAAQEBwAEjAgABwAEHAQABAQHAASMCAAHAAQcBAAEB + AcABIwIAAcABBwEAAQEBwAEjAgABwAEHAQEB/wHAASMCAAHAAQcBgwH/AYABAQIAAcABBwL/AcABAQIA + BP8B4AEDAgAL +</value> + </data> + <metadata name="projecticons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 56</value> + </metadata> + <data name="projecticons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABC + CAAAAk1TRnQBSQFMAwEBAAFAAQEBQAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8DAAH0DfMyAAG8BAcBtAaz + ArQyAAEHAf8CrQH/AbMH/wG0MgABBwGLAf8B9AGLAbMB/wHvAbwB/wHvAbwB/wGzMQAB8wGtAf8C2wH/ + AbMB/wX0Af8BszAAAfMBrQH/AdsC1AHcAbMB/wH3AgcBGQH3Af8BszAAAbMB/wHbAdQD2wGzAf8FGQH/ + AbMwAAGzAf8C1APbAbMB/wUJAf8BszEAAa0B/wLbAdwB2gG0B/8BtDIAAa0B/wPbAbQHswG0MgABBwGL + Af8B2wEJAf8BiwH2A/QB/wEHMwABBwH/AYsC/wGLAfQE8wH/Ae8zAAHvAf8B8wKLAfQB8wGSAgcB8gH/ + Ae8zAAHvAf8I8gHxAf8B7zMAAe8L/wHvMwABBwvvAQcxAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB + AQABAQUAAYAXAAP/AQABwAcAAcAHAAHABwABwAcAAYAfAAGABwABwAcAAcABAQYAAcABAQYAAcABAQYA + AcABAQYAAcABAQYAAcABAQYACw== +</value> + </data> + <metadata name="tabs.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> + <metadata name="label1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> + <metadata name="errorlist.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <value>True</value> </metadata> </root> \ No newline at end of file diff --git a/Source/Core/Controls/Scripting/ScriptFileDocumentTab.cs b/Source/Core/Controls/Scripting/ScriptFileDocumentTab.cs index 4aa5122a..715d19c3 100644 --- a/Source/Core/Controls/Scripting/ScriptFileDocumentTab.cs +++ b/Source/Core/Controls/Scripting/ScriptFileDocumentTab.cs @@ -56,10 +56,24 @@ namespace CodeImp.DoomBuilder.Controls // Initialize this.filepathname = ""; + tabtype = ScriptDocumentTabType.FILE; //mxd if(config.Extensions.Length > 0) ext = "." + config.Extensions[0]; SetTitle("Untitled" + ext); editor.ClearUndoRedo(); } + + //mxd. Replace constructor + internal ScriptFileDocumentTab(ScriptResourceDocumentTab sourcetab) + : base(sourcetab.Panel, sourcetab.Config) + { + // Set text and view settings + tabtype = ScriptDocumentTabType.FILE; + editor.Scintilla.Text = sourcetab.Editor.Scintilla.Text; + SetViewSettings(sourcetab.GetViewSettings()); + + // Set title + SetTitle(sourcetab.Filename); + } #endregion @@ -149,6 +163,7 @@ namespace CodeImp.DoomBuilder.Controls this.filepathname = filepathname; editor.ClearUndoRedo(); SetTitle(Path.GetFileName(filepathname)); + this.ToolTipText = filepathname; //mxd panel.ShowErrors(UpdateNavigator(), true); //mxd return true; diff --git a/Source/Core/Controls/Scripting/ScriptIconsManager.cs b/Source/Core/Controls/Scripting/ScriptIconsManager.cs new file mode 100644 index 00000000..7538e3bd --- /dev/null +++ b/Source/Core/Controls/Scripting/ScriptIconsManager.cs @@ -0,0 +1,42 @@ +using System.Windows.Forms; +using CodeImp.DoomBuilder.Config; + +namespace CodeImp.DoomBuilder.Controls.Scripting +{ + internal class ScriptIconsManager + { + private const int SCRIPT_TYPE_ICONS_OFFSET = 4; + private const int SCRIPT_GROUP_ICONS_OFFSET = 23; + private const int SCRIPT_GROUP_OPEN_ICONS_OFFSET = 42; + + private ImageList icons; + public ImageList Icons { get { return icons; } } + + public ScriptIconsManager(ImageList icons) + { + this.icons = icons; + } + + public int GetResourceIcon(int datalocationtype) + { + return datalocationtype; + } + + public int GetScriptIcon(ScriptType type) + { + int scripttype = (int)type + SCRIPT_TYPE_ICONS_OFFSET; + if(scripttype >= SCRIPT_GROUP_ICONS_OFFSET) scripttype = SCRIPT_TYPE_ICONS_OFFSET; + return scripttype; + } + + public int GetScriptFolderIcon(ScriptType type, bool opened) + { + int scripttype = (int)type; + if(scripttype >= SCRIPT_GROUP_ICONS_OFFSET - SCRIPT_TYPE_ICONS_OFFSET) + scripttype = SCRIPT_TYPE_ICONS_OFFSET; + + if(opened) return SCRIPT_GROUP_OPEN_ICONS_OFFSET + scripttype; + return SCRIPT_GROUP_ICONS_OFFSET + scripttype; + } + } +} diff --git a/Source/Core/Controls/Scripting/ScriptLumpDocumentTab.cs b/Source/Core/Controls/Scripting/ScriptLumpDocumentTab.cs index b258a217..553def44 100644 --- a/Source/Core/Controls/Scripting/ScriptLumpDocumentTab.cs +++ b/Source/Core/Controls/Scripting/ScriptLumpDocumentTab.cs @@ -55,6 +55,7 @@ namespace CodeImp.DoomBuilder.Controls public ScriptLumpDocumentTab(ScriptEditorPanel panel, string lumpname, ScriptConfiguration config) : base(panel, config) { // Initialize + tabtype = ScriptDocumentTabType.LUMP; //mxd if(lumpname == MapManager.CONFIG_MAP_HEADER) { this.lumpname = MapManager.TEMP_MAP_HEADER; diff --git a/Source/Core/Controls/Scripting/ScriptResourceDocumentTab.cs b/Source/Core/Controls/Scripting/ScriptResourceDocumentTab.cs new file mode 100644 index 00000000..d7cb1ca8 --- /dev/null +++ b/Source/Core/Controls/Scripting/ScriptResourceDocumentTab.cs @@ -0,0 +1,163 @@ +#region ================== Namespaces + +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using CodeImp.DoomBuilder.Compilers; +using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Data.Scripting; + +#endregion + +namespace CodeImp.DoomBuilder.Controls +{ + //mxd. Document tab bound to a resource entry. Script type can't be changed. Can be readonly. + //Must be replaced with ScriptFileDocumentTab when unable to locate target resource entry to save to. + internal sealed class ScriptResourceDocumentTab : ScriptDocumentTab + { + #region ================== Variables + + private ScriptResource source; + private string hash; + private string filepathname; + + #endregion + + #region ================== Properties + + public override bool IsReconfigurable { get { return false; } } + public override bool IsSaveAsRequired { get { return false; } } + public override bool IsReadOnly { get { return source.IsReadOnly; } } + public override string Filename { get { return filepathname; } } + + #endregion + + #region ================== Constructor + + internal ScriptResourceDocumentTab(ScriptEditorPanel panel, ScriptResource resource, ScriptConfiguration config) : base(panel, config) + { + // Store resource + source = resource; + + // Load the data + MemoryStream stream = source.Resource.LoadFile(source.Filename, source.LumpIndex); + if(stream != null) + { + hash = MD5Hash.Get(stream); + editor.SetText(stream.ToArray()); + editor.Scintilla.ReadOnly = source.IsReadOnly; + editor.ClearUndoRedo(); + } + else + { + General.ErrorLogger.Add(ErrorType.Warning, "Failed to load " + source.ScriptType + " resource \"" + source.Filename + "\" from \"" + source.Resource.Location.GetDisplayName() + "\"."); + } + + // Set title and tooltip + tabtype = ScriptDocumentTabType.RESOURCE; + filepathname = source.FilePathName; + SetTitle(source.ToString()); + this.ToolTipText = filepathname; + + // Update navigator + panel.ShowErrors(UpdateNavigator(), true); + } + + #endregion + + #region ================== Methods + + public override void Compile() + { + List<CompilerError> errors = new List<CompilerError>(); + DataReader reader = source.Resource; + if(reader != null && reader.CompileLump(source.Filename, source.LumpIndex, config, errors)) + { + // Update script navigator + errors.AddRange(UpdateNavigator()); + } + + // Feed errors to panel + panel.ShowErrors(errors, false); + } + + // This checks if a script error applies to this script + public override bool VerifyErrorForScript(CompilerError e) + { + return (string.Compare(e.filename, source.Filename, true) == 0); + } + + // This saves the document (used for both explicit and implicit) + // Return true when successfully saved + public override bool Save() + { + if(source.IsReadOnly) return false; + + // Find lump, check it's hash + bool dosave = true; + DataReader reader = source.Resource; + if(reader.FileExists(source.Filename, source.LumpIndex)) + { + using(MemoryStream ms = reader.LoadFile(source.Filename, source.LumpIndex)) + { + if(MD5Hash.Get(ms) != hash + && MessageBox.Show("Target lump was modified by another application. Do you still want to replace it?", "Warning", MessageBoxButtons.OKCancel) + == DialogResult.Cancel) + { + dosave = false; + } + } + } + + if(dosave) + { + // Store the lump data + using(MemoryStream stream = new MemoryStream(editor.GetText())) + { + if(reader.SaveFile(stream, source.Filename, source.LumpIndex)) + { + // Update what must be updated + hash = MD5Hash.Get(stream); + editor.SetSavePoint(); + UpdateTitle(); + } + } + } + + return dosave; + } + + internal override ScriptDocumentSettings GetViewSettings() + { + // Store resource location + var settings = base.GetViewSettings(); + DataReader reader = source.Resource; + if(reader != null) + { + settings.ResourceLocation = reader.Location.location; + settings.Filename = Path.Combine(reader.Location.location, filepathname); // Make unique location + } + return settings; + } + + //mxd. Check if resource still exists + internal void OnReloadResources() + { + DataReader reader = source.Resource; + if(reader == null) + { + // Ask script editor to replace us with ScriptFileDocumentTab + panel.OnScriptResourceLost(this); + } + else + { + // Some paths may need updating... + filepathname = source.FilePathName; + this.ToolTipText = filepathname; + } + } + + #endregion + } +} diff --git a/Source/Core/Controls/Scripting/ScriptResourcesControl.cs b/Source/Core/Controls/Scripting/ScriptResourcesControl.cs new file mode 100644 index 00000000..e89ef36d --- /dev/null +++ b/Source/Core/Controls/Scripting/ScriptResourcesControl.cs @@ -0,0 +1,473 @@ +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Data.Scripting; + +#endregion + +namespace CodeImp.DoomBuilder.Controls +{ + internal partial class ScriptResourcesControl : UserControl + { + + #region ================== Nodes sorter + + private class ScriptNodesSorter : IComparer + { + private List<string> resourceorder; + private HashSet<TextResourceNodeType> resourcetypes; + + public ScriptNodesSorter() + { + // Needed to show resources in the map-defined order + resourceorder = new List<string>(); + foreach(DataReader reader in General.Map.Data.Containers) + { + resourceorder.Add(reader.Location.location); + } + + resourcetypes = new HashSet<TextResourceNodeType> { TextResourceNodeType.RESOURCE_DIRECTORY, TextResourceNodeType.RESOURCE_PK3, TextResourceNodeType.RESOURCE_WAD }; + } + + // Compare between two tree nodes + public int Compare(object o1, object o2) + { + TreeNode n1 = o1 as TreeNode; + TreeNode n2 = o2 as TreeNode; + + TextResourceNodeData d1 = (TextResourceNodeData)n1.Tag; + TextResourceNodeData d2 = (TextResourceNodeData)n2.Tag; + + // Sort resources by load order + if(resourcetypes.Contains(d1.NodeType) && resourcetypes.Contains(d2.NodeType)) + { + int n1index = resourceorder.IndexOf(d1.ResourceLocation); + int n2index = resourceorder.IndexOf(d2.ResourceLocation); + + if(n1index > n2index) return 1; + if(n1index < n2index) return -1; + return 0; + } + + // Push map namespace resources before anything else + if(d1.NodeType == TextResourceNodeType.RESOURCE_MAP && d2.NodeType != TextResourceNodeType.RESOURCE_MAP) return -1; + if(d1.NodeType != TextResourceNodeType.RESOURCE_MAP && d2.NodeType == TextResourceNodeType.RESOURCE_MAP) return 1; + + // Push embedded WADs before anything else except map resources + if(n1.Parent != null && n2.Parent != null) + { + if(d1.NodeType == TextResourceNodeType.RESOURCE_WAD && d2.NodeType != TextResourceNodeType.RESOURCE_WAD) return -1; + if(d1.NodeType != TextResourceNodeType.RESOURCE_WAD && d2.NodeType == TextResourceNodeType.RESOURCE_WAD) return 1; + } + + // Push script folders before script files + if(d1.NodeType == TextResourceNodeType.DIRECTORY && d2.NodeType != TextResourceNodeType.DIRECTORY) return -1; + if(d1.NodeType != TextResourceNodeType.DIRECTORY && d2.NodeType == TextResourceNodeType.DIRECTORY) return 1; + + // Sort by name + return n1.Text.CompareTo(n2.Text); + } + } + + #endregion + + #region ================== Constants + + #endregion + + #region ================== Enums + + private enum TextResourceNodeType + { + RESOURCE_WAD, + RESOURCE_DIRECTORY, + RESOURCE_PK3, + RESOURCE_MAP, + DIRECTORY, + NODE, + } + + #endregion + + #region ================== Structs + + private struct TextResourceNodeData + { + public ScriptResource Resource; + public string ResourceLocation; // Where PK3/WAD/Folder resource is located + public string LocationInResource; // Path to text file inside resource + public TextResourceNodeType NodeType; + public ScriptType ScriptType; + + public override string ToString() + { + return (NodeType == TextResourceNodeType.NODE + ? Path.Combine(ResourceLocation, LocationInResource) + (Resource.LumpIndex != -1 ? ":" + Resource.LumpIndex : "") + : ResourceLocation); + } + } + + private struct ScriptTypeItem + { + public string Name; + public ScriptType Type; + public override string ToString() { return Name; } + } + + #endregion + + #region ================== Variables + + private ScriptEditorPanel scriptpanel; + private Dictionary<string, Dictionary<ScriptType, HashSet<ScriptResource>>> resourcesperlocation; + private List<ScriptTypeItem> usedscripttypes; + + #endregion + + #region ================== Properties + + #endregion + + #region ================== Constructor / Setup + + public ScriptResourcesControl() + { + InitializeComponent(); + } + + public void Setup(ScriptEditorPanel scriptpanel, Dictionary<ScriptType, HashSet<ScriptResource>> resources) + { + this.scriptpanel = scriptpanel; + projecttree.ImageList = scriptpanel.Icons.Icons; // Link icons + resourcesperlocation = new Dictionary<string, Dictionary<ScriptType, HashSet<ScriptResource>>>(); + foreach(HashSet<ScriptResource> group in resources.Values) + { + foreach(ScriptResource resource in group) + { + string key = resource.Resource.Location.location; + if(!resourcesperlocation.ContainsKey(key)) + resourcesperlocation.Add(key, new Dictionary<ScriptType, HashSet<ScriptResource>>()); + + if(!resourcesperlocation[key].ContainsKey(resource.ScriptType)) + resourcesperlocation[key].Add(resource.ScriptType, new HashSet<ScriptResource>()); + + resourcesperlocation[key][resource.ScriptType].Add(resource); + } + } + + // Add used script types to the filter combobox + string curfilter = filterbytype.SelectedText; + filterbytype.Items.Clear(); + filterbytype.Items.Add(new ScriptTypeItem { Name = "All", Type = ScriptType.UNKNOWN }); + + usedscripttypes = new List<ScriptTypeItem>(); + foreach(ScriptType st in resources.Keys) + usedscripttypes.Add(new ScriptTypeItem { Name = Enum.GetName(typeof(ScriptType), st), Type = st }); + usedscripttypes.Sort((i1, i2) => String.Compare(i1.Name, i2.Name, StringComparison.Ordinal)); + + int toselect = 0; + for(int i = 0; i < usedscripttypes.Count; i++) + { + if(usedscripttypes[i].Name == curfilter) toselect = i; + filterbytype.Items.Add(usedscripttypes[i]); + } + filterbytype.SelectedIndex = toselect; // This will also trigger tree update + } + + #endregion + + #region ================== Methods + + private void UpdateResourcesTree() + { + ScriptType targettype = (filterbytype.SelectedIndex > -1 ? ((ScriptTypeItem)filterbytype.SelectedItem).Type : ScriptType.UNKNOWN); + UpdateResourcesTree(targettype, filterproject.Text); + } + + private void UpdateResourcesTree(ScriptType filtertype, string filterfilename) + { + TreeNode selected = projecttree.SelectedNode; + TreeNode toselect = null; + + projecttree.BeginUpdate(); + projecttree.Nodes.Clear(); + + char[] splitter = { Path.DirectorySeparatorChar }; + bool filenamefiltered = !string.IsNullOrEmpty(filterfilename); + bool filteringapplied = (filenamefiltered || filtertype != ScriptType.UNKNOWN); + + // Create nodes + foreach(KeyValuePair<string, Dictionary<ScriptType, HashSet<ScriptResource>>> group in resourcesperlocation) + { + foreach(ScriptTypeItem item in usedscripttypes) + { + // Filter by script type? + if(filtertype != ScriptType.UNKNOWN && item.Type != filtertype) continue; + + // Current resource has this scrit type? + if(!group.Value.ContainsKey(item.Type)) continue; + + HashSet<ScriptResource> resources = group.Value[item.Type]; + foreach(ScriptResource res in resources) + { + bool asreadonly = res.Resource.IsReadOnly; + + // Filter by filename? + if(filenamefiltered && Path.GetFileName(res.Filename).IndexOf(filterfilename, StringComparison.OrdinalIgnoreCase) == -1) + continue; + + // Resource type node added? + TreeNode root; + string key = res.Resource.Location.location; + + // WAD resource inside another resource? + if(res.Resource is WADReader && ((WADReader)res.Resource).ParentResource != null) + { + WADReader wr = (WADReader)res.Resource; + string parentkey = wr.ParentResource.Location.location; + TreeNode parent = GetResourceNode(projecttree.Nodes, wr.ParentResource.Location.GetDisplayName(), parentkey, wr.ParentResource); + + if(parent.Nodes.ContainsKey(key)) + { + root = parent.Nodes[key]; + } + else + { + root = GetResourceNode(parent.Nodes, Path.GetFileName(wr.Location.GetDisplayName()), key, res.Resource); + TrySelectNode(selected, root, ref toselect); + } + } + else if(projecttree.Nodes.ContainsKey(key)) + { + root = projecttree.Nodes[key]; + } + else + { + root = GetResourceNode(projecttree.Nodes, res.Resource.Location.GetDisplayName(), key, res.Resource); + TrySelectNode(selected, root, ref toselect); + } + + // Single resource item or active filtering? + int iconindex = scriptpanel.Icons.GetScriptIcon(res.ScriptType); + if(filteringapplied || (resources.Count == 1 && res.ScriptType != ScriptType.ACS)) + { + // Create new node + var data = new TextResourceNodeData + { + ResourceLocation = key, + LocationInResource = Path.GetDirectoryName(res.Filename), + NodeType = TextResourceNodeType.NODE, + Resource = res, + ScriptType = res.ScriptType, + }; + TreeNode scriptnode = new TreeNode(res.ToString(), iconindex, iconindex) { Tag = data, ToolTipText = data.ToString() }; + if(asreadonly) scriptnode.ForeColor = SystemColors.GrayText; + TrySelectNode(selected, scriptnode, ref toselect); + + // Add the node + root.Nodes.Add(scriptnode); + } + else + { + // Script type added? + string typename = "[" + Enum.GetName(typeof(ScriptType), res.ScriptType) + "]"; + int groupiconindex = scriptpanel.Icons.GetScriptFolderIcon(res.ScriptType, false); + + TreeNode scriptroot; + if(root.Nodes.ContainsKey(typename)) + { + scriptroot = root.Nodes[typename]; + } + else + { + scriptroot = new TreeNode(typename, groupiconindex, groupiconindex); + scriptroot.Name = typename; + scriptroot.Tag = new TextResourceNodeData + { + ResourceLocation = key, + NodeType = TextResourceNodeType.DIRECTORY, + ScriptType = res.ScriptType, + }; + if(asreadonly) scriptroot.ForeColor = SystemColors.GrayText; + root.Nodes.Add(scriptroot); + + TrySelectNode(selected, scriptroot, ref toselect); + } + + // Add the resource path nodes if needed... + string path = Path.GetDirectoryName(res.Filename); + TreeNode pathnode = scriptroot; + string localpath = string.Empty; + + if(!string.IsNullOrEmpty(path)) + { + List<string> parts = new List<string>(path.Split(splitter, StringSplitOptions.RemoveEmptyEntries)); + while(parts.Count > 0) + { + if(pathnode.Nodes.ContainsKey(parts[0])) + { + pathnode = pathnode.Nodes[parts[0]]; + } + else + { + localpath = Path.Combine(localpath, parts[0]); + + TreeNode child = new TreeNode(parts[0], groupiconindex, groupiconindex); + child.Name = parts[0]; + var cdata = new TextResourceNodeData + { + ResourceLocation = key, + LocationInResource = localpath, + NodeType = TextResourceNodeType.DIRECTORY, + ScriptType = res.ScriptType + }; + child.Tag = cdata; + child.ToolTipText = cdata.ToString(); + if(asreadonly) child.ForeColor = SystemColors.GrayText; + pathnode.Nodes.Add(child); + pathnode = child; + + TrySelectNode(selected, pathnode, ref toselect); + } + + parts.RemoveAt(0); + } + } + + // Create new node + TextResourceNodeData data = new TextResourceNodeData + { + ResourceLocation = key, + LocationInResource = localpath, + NodeType = TextResourceNodeType.NODE, + Resource = res, + }; + TreeNode scriptnode = new TreeNode(res.ToString(), iconindex, iconindex) { Tag = data, ToolTipText = data.ToString() }; + if(asreadonly) scriptnode.ForeColor = SystemColors.GrayText; + TrySelectNode(selected, scriptnode, ref toselect); + + // Add the node + pathnode.Nodes.Add(scriptnode); + } + } + } + } + + // If there's only one root node, shift all nodes up + if(projecttree.Nodes.Count == 1 && projecttree.Nodes[0].Nodes.Count > 0) + { + TreeNode[] children = new TreeNode[projecttree.Nodes[0].Nodes.Count]; + projecttree.Nodes[0].Nodes.CopyTo(children, 0); + + projecttree.Nodes.Clear(); + projecttree.Nodes.AddRange(children); + } + + // Sort the nodes + projecttree.TreeViewNodeSorter = new ScriptNodesSorter(); + + // Have valid selection? + if(toselect != null) projecttree.SelectedNode = toselect; + + // Expand all nodes when filtered + if(filenamefiltered) projecttree.ExpandAll(); + + projecttree.EndUpdate(); + } + + private TreeNode GetResourceNode(TreeNodeCollection nodes, string title, string key, DataReader resource) + { + // Node already added? + if(nodes.ContainsKey(key)) return nodes[key]; + + // Create new node + int resourceiconindex = scriptpanel.Icons.GetResourceIcon(resource.Location.type); + + TreeNode root = new TreeNode(title, resourceiconindex, resourceiconindex); + root.Name = key; + root.Tag = new TextResourceNodeData { ResourceLocation = key, NodeType = (TextResourceNodeType)resource.Location.type }; + root.ToolTipText = key; + if(resource.IsReadOnly) root.ForeColor = SystemColors.GrayText; + nodes.Add(root); + + return root; + } + + private static void TrySelectNode(TreeNode oldselection, TreeNode node, ref TreeNode toselect) + { + if(oldselection == null || oldselection.Text != node.Text + || oldselection.ToolTipText != node.ToolTipText + || oldselection.Tag.ToString() != node.Tag.ToString()) + return; + + // Found match! + toselect = node; + } + + #endregion + + #region ================== Events + + private void filterproject_TextChanged(object sender, EventArgs e) + { + UpdateResourcesTree(); + } + + private void filterprojectclear_Click(object sender, EventArgs e) + { + filterproject.Clear(); + } + + private void filterbytype_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateResourcesTree(); + } + + private void projecttree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + { + //TODO: special handling for SCRIPTS/DIALOGUE + if(!(e.Node.Tag is TextResourceNodeData)) throw new NotSupportedException("Tag must be TextResourceData!"); + TextResourceNodeData data = (TextResourceNodeData)e.Node.Tag; + + // Open file + if(data.Resource != null) scriptpanel.OpenResource(data.Resource); + } + + // Switch to opened resource icon + private void projecttree_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + if(!(e.Node.Tag is TextResourceNodeData)) throw new NotSupportedException("Tag must be TextResourceData!"); + TextResourceNodeData data = (TextResourceNodeData)e.Node.Tag; + + // Group node? + if(data.NodeType == TextResourceNodeType.DIRECTORY) + { + e.Node.ImageIndex = scriptpanel.Icons.GetScriptFolderIcon(data.ScriptType, true); + e.Node.SelectedImageIndex = e.Node.ImageIndex; + } + } + + // Switch to closed resource icon + private void projecttree_BeforeCollapse(object sender, TreeViewCancelEventArgs e) + { + if(!(e.Node.Tag is TextResourceNodeData)) throw new NotSupportedException("Tag must be TextResourceData!"); + TextResourceNodeData data = (TextResourceNodeData)e.Node.Tag; + + // Group node? + if(data.NodeType == TextResourceNodeType.DIRECTORY) + { + e.Node.ImageIndex = scriptpanel.Icons.GetScriptFolderIcon(data.ScriptType, false); + e.Node.SelectedImageIndex = e.Node.ImageIndex; + } + } + + #endregion + } +} diff --git a/Source/Core/Controls/Scripting/ScriptResourcesControl.designer.cs b/Source/Core/Controls/Scripting/ScriptResourcesControl.designer.cs new file mode 100644 index 00000000..37319db0 --- /dev/null +++ b/Source/Core/Controls/Scripting/ScriptResourcesControl.designer.cs @@ -0,0 +1,132 @@ +namespace CodeImp.DoomBuilder.Controls +{ + partial class ScriptResourcesControl + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.projecttree = new CodeImp.DoomBuilder.Controls.BufferedTreeView(); + this.filterproject = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.filterprojectclear = new System.Windows.Forms.Button(); + this.filterbytype = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // projecttree + // + this.projecttree.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.projecttree.HideSelection = false; + this.projecttree.Location = new System.Drawing.Point(3, 56); + this.projecttree.Name = "projecttree"; + this.projecttree.ShowNodeToolTips = true; + this.projecttree.Size = new System.Drawing.Size(293, 494); + this.projecttree.TabIndex = 7; + this.projecttree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.projecttree_NodeMouseDoubleClick); + this.projecttree.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.projecttree_BeforeExpand); + this.projecttree.BeforeCollapse += new System.Windows.Forms.TreeViewCancelEventHandler(this.projecttree_BeforeCollapse); + // + // filterproject + // + this.filterproject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filterproject.Location = new System.Drawing.Point(75, 3); + this.filterproject.Name = "filterproject"; + this.filterproject.Size = new System.Drawing.Size(190, 20); + this.filterproject.TabIndex = 5; + this.filterproject.TextChanged += new System.EventHandler(this.filterproject_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(37, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Filter:"; + // + // filterprojectclear + // + this.filterprojectclear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.filterprojectclear.Image = global::CodeImp.DoomBuilder.Properties.Resources.SearchClear; + this.filterprojectclear.Location = new System.Drawing.Point(271, 1); + this.filterprojectclear.Name = "filterprojectclear"; + this.filterprojectclear.Size = new System.Drawing.Size(25, 23); + this.filterprojectclear.TabIndex = 6; + this.filterprojectclear.UseVisualStyleBackColor = true; + this.filterprojectclear.Click += new System.EventHandler(this.filterprojectclear_Click); + // + // filterbytype + // + this.filterbytype.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filterbytype.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.filterbytype.FormattingEnabled = true; + this.filterbytype.Location = new System.Drawing.Point(75, 29); + this.filterbytype.Name = "filterbytype"; + this.filterbytype.Size = new System.Drawing.Size(221, 21); + this.filterbytype.TabIndex = 8; + this.filterbytype.SelectedIndexChanged += new System.EventHandler(this.filterbytype_SelectedIndexChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(9, 33); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Script type:"; + // + // ScriptResourcesControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.Controls.Add(this.label2); + this.Controls.Add(this.filterbytype); + this.Controls.Add(this.projecttree); + this.Controls.Add(this.filterprojectclear); + this.Controls.Add(this.filterproject); + this.Controls.Add(this.label1); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "ScriptResourcesControl"; + this.Size = new System.Drawing.Size(299, 553); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private CodeImp.DoomBuilder.Controls.BufferedTreeView projecttree; + private System.Windows.Forms.Button filterprojectclear; + private System.Windows.Forms.TextBox filterproject; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox filterbytype; + private System.Windows.Forms.Label label2; + } +} diff --git a/Source/Core/Controls/Scripting/ScriptResourcesControl.resx b/Source/Core/Controls/Scripting/ScriptResourcesControl.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/Source/Core/Controls/Scripting/ScriptResourcesControl.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/Source/Core/Controls/VisualStudioTabControl.cs b/Source/Core/Controls/VisualStudioTabControl.cs new file mode 100644 index 00000000..d2ca23d7 --- /dev/null +++ b/Source/Core/Controls/VisualStudioTabControl.cs @@ -0,0 +1,336 @@ +#region ======================== Namespaces + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; +using System.Windows.Forms; + +#endregion + +// Based on http://www.codeproject.com/Articles/1106140/VisualStudio-Like-TabControl +namespace CodeImp.DoomBuilder.Controls +{ + public class VSTabControl : TabControl + { + #region ======================== Events + + public event EventHandler<TabControlEventArgs> OnCloseTabClicked; + + #endregion + + #region ======================== Properties + + public bool ShowClosingButton { get; set; } + + [Category("Colors"), Browsable(true), Description("The color of the selected page")] + public Color ActiveColor { get { return activeColor; } set { activeColor = value; } } + + [Category("Colors"), Browsable(true), Description("The color of the highlighted page")] + public Color HighlightColor { get { return highlightColor; } set { highlightColor = value; } } + + [Category("Colors"), Browsable(true), Description("The color of the background of the tab")] + public Color BackTabColor { get { return backTabColor; } set { backTabColor = value; } } + + [Category("Colors"), Browsable(true), Description("The color of the border of the control")] + public Color BorderColor { get { return borderColor; } set { borderColor = value; } } + + [Category("Colors"), Browsable(true), Description("The color of the title of the page")] + public Color TextColor { get { return textColor; } set { textColor = value; } } + + [Category("Colors"), Browsable(true), Description("The color of the title of the page")] + public Color SelectedTextColor { get { return selectedTextColor; } set { selectedTextColor = value; } } + + #endregion + + #region ======================== Variables + + private readonly StringFormat centersringformat = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center }; + private TabPage predraggedTab; + + private Color textColor = SystemColors.WindowText; + private Color selectedTextColor = SystemColors.HighlightText; + private Color activeColor = SystemColors.HotTrack; + private Color highlightColor = SystemColors.Highlight; + private Color backTabColor = SystemColors.Control; + private Color borderColor = SystemColors.Control; + + private int closebuttonmouseoverindex = -1; //mxd + + #endregion + + #region ======================== Constructor + + public VSTabControl() + { + SetStyle( + ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw + | ControlStyles.OptimizedDoubleBuffer, + true); + DoubleBuffered = true; + SizeMode = TabSizeMode.Normal; + ItemSize = new Size(240, 16); + AllowDrop = true; + } + + #endregion + + #region ======================== Event overrides + + protected override void CreateHandle() + { + base.CreateHandle(); + Alignment = TabAlignment.Top; + } + + protected override void OnDragOver(DragEventArgs drgevent) + { + //mxd. Collect used tab page types... + var tabpagetypes = new HashSet<Type>(); + foreach(var page in TabPages) tabpagetypes.Add(page.GetType()); + + //mxd. Identify dragged tab type... + TabPage draggedTab = null; + foreach(var T in tabpagetypes) + { + draggedTab = (TabPage)drgevent.Data.GetData(T); + if(draggedTab != null) break; + } + + var pointedTab = GetPointedTab(); + + if(ReferenceEquals(draggedTab, predraggedTab) && pointedTab != null) + { + drgevent.Effect = DragDropEffects.Move; + if(!ReferenceEquals(pointedTab, draggedTab)) ReplaceTabPages(draggedTab, pointedTab); + } + + base.OnDragOver(drgevent); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + predraggedTab = GetPointedTab(); + + //mxd. MEMO: OnMouseUp is not fired when clicking on inactive tab... + if(ShowClosingButton) + { + for(var i = 0; i < TabCount; i++) + { + Rectangle r = GetCloseButtonRect(GetTabRect(i)); + if(r.Contains(e.Location)) + { + // Raise event... + if(OnCloseTabClicked != null) + { + TabControlEventArgs te = new TabControlEventArgs(TabPages[i], i, TabControlAction.Selected); + OnCloseTabClicked(this, te); + closebuttonmouseoverindex = -1; + } + break; + } + } + } + + base.OnMouseDown(e); + } + + protected override void OnMouseMove(MouseEventArgs e) + { + if(e.Button == MouseButtons.Left && predraggedTab != null) + { + DoDragDrop(predraggedTab, DragDropEffects.Move); + } + //mxd. Closing button highlight needs updating? + else if(ShowClosingButton) + { + int index = GetPointedTabIndex(); + if(index != -1) + { + Rectangle cr = GetCloseButtonRect(GetTabRect(index)); + bool inside = cr.Contains(PointToClient(Cursor.Position)); + + if(inside && closebuttonmouseoverindex == -1) + { + closebuttonmouseoverindex = index; + Refresh(); + } + else if(!inside && closebuttonmouseoverindex != -1) + { + closebuttonmouseoverindex = -1; + Refresh(); + } + } + } + + base.OnMouseMove(e); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + predraggedTab = null; + base.OnMouseUp(e); + } + + protected override void OnPaint(PaintEventArgs e) + { + Graphics g = e.Graphics; + + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.Clear(backTabColor); + + //mxd + int highlightedtabindex = GetPointedTabIndex(); + for(var i = 0; i < TabCount; i++) + { + var tabrect = GetTabRect(i); //mxd + var Header = new Rectangle( + new Point(tabrect.Location.X + 2, tabrect.Location.Y), + new Size(tabrect.Width, tabrect.Height)); + var HeaderSize = new Rectangle(Header.Location, new Size(Header.Width, Header.Height)); + var TextSize = new Rectangle(HeaderSize.Location.X, HeaderSize.Location.Y, HeaderSize.Width, HeaderSize.Height - 2); + + //mxd + if(TabPages[i].ImageIndex != -1) + { + int offset = ImageList.Images[TabPages[i].ImageIndex].Width + 2; + HeaderSize.X += offset; + HeaderSize.Width -= offset; + + TextSize.X += offset + 2; + TextSize.Width -= offset + 2; + } + + if(i == SelectedIndex || i == highlightedtabindex) + { + // Draws the back of the color when it is selected + var tabbgrect = new Rectangle(tabrect.X, tabrect.Y - 2, tabrect.Width, tabrect.Height + 2); + using(var bgbrush = new SolidBrush(i == SelectedIndex ? activeColor : highlightColor)) + g.FillRectangle(bgbrush, tabbgrect); + + // Draws the title of the page + using(var textbrush = new SolidBrush(selectedTextColor)) + { + g.DrawString(TabPages[i].Text, Font, textbrush, TextSize, centersringformat); + + // Draws the closing button + if(ShowClosingButton) + { + //mxd. Draw bg rect? + var bgrect = GetCloseButtonRect(tabrect); + if(closebuttonmouseoverindex == i) + { + using(var bgbrush = new SolidBrush(Color.FromArgb(96, selectedTextColor))) + g.FillRectangle(bgbrush, bgrect); + } + + //mxd. Draw X + using(var closepen = new Pen(selectedTextColor, 1f)) + { + const int offset = 4; + int tlx = bgrect.X + offset; + int tly = bgrect.Y + offset; + int brx = bgrect.X + bgrect.Width - offset; + int bry = bgrect.Y + bgrect.Height - offset; + + g.DrawLine(closepen, tlx, tly, brx, bry); + g.DrawLine(closepen, tlx, bry, brx, tly); + } + } + } + } + else + { + // Simply draw the header when it is not selected + using(var textbrush = new SolidBrush(textColor)) + { + g.DrawString(TabPages[i].Text, Font, textbrush, TextSize, centersringformat); + } + } + + //mxd. Draw icon? + if(TabPages[i].ImageIndex != -1) + { + g.DrawImage(ImageList.Images[TabPages[i].ImageIndex], Header.X + 2, 3); + } + } + + // Draw the background of the tab control + using(var backtabbrush = new SolidBrush(backTabColor)) + g.FillRectangle(backtabbrush, new Rectangle(0, ItemSize.Height, Width, Height - ItemSize.Height)); + + // Draw the border of the TabControl + using(var borderpen = new Pen(borderColor, 2)) + g.DrawRectangle(borderpen, new Rectangle(0, ItemSize.Height, Width, Height - ItemSize.Height)); + + // Draw the horizontal line + using(var linepen = new Pen(activeColor, 2)) + g.DrawLine(linepen, new Point(0, ItemSize.Height - 1), new Point(Width, ItemSize.Height - 1)); + } + + #endregion + + #region ======================== Methods + + //mxd + private static Rectangle GetCloseButtonRect(Rectangle tabrect) + { + int height = tabrect.Height - 6; + return new Rectangle(tabrect.Right - height - 3, 3, height, height); + } + + private TabPage GetPointedTab() + { + for(var i = 0; i < TabPages.Count; i++) + { + if(GetTabRect(i).Contains(PointToClient(Cursor.Position))) + { + return TabPages[i]; + } + } + + return null; + } + + //mxd + private int GetPointedTabIndex() + { + for(var i = 0; i < TabPages.Count; i++) + { + if(GetTabRect(i).Contains(PointToClient(Cursor.Position))) + { + return i; + } + } + + return -1; + } + + private void ReplaceTabPages(TabPage Source, TabPage Destination) + { + var SourceIndex = TabPages.IndexOf(Source); + var DestinationIndex = TabPages.IndexOf(Destination); + + TabPages[DestinationIndex] = Source; + TabPages[SourceIndex] = Destination; + + if(SelectedIndex == SourceIndex) + { + SelectedIndex = DestinationIndex; + } + else if(SelectedIndex == DestinationIndex) + { + SelectedIndex = SourceIndex; + } + + Refresh(); + } + + #endregion + } +} diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs index d781bdcf..a0be1701 100644 --- a/Source/Core/Data/DataManager.cs +++ b/Source/Core/Data/DataManager.cs @@ -27,6 +27,7 @@ using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Data.Scripting; using CodeImp.DoomBuilder.GZBuilder.Data; using CodeImp.DoomBuilder.GZBuilder.MD3; using CodeImp.DoomBuilder.Geometry; @@ -43,20 +44,6 @@ using Matrix = SlimDX.Matrix; namespace CodeImp.DoomBuilder.Data { - public struct TextResource //mxd - { - public string Filename; // Path to text file inside of Resource - public int LumpIndex; // Text lump index if Resource is wad - internal DataReader Resource; - public HashSet<string> Entries; // Actors/models/sounds etc. - public ScriptType ScriptType; - - public override string ToString() - { - return Filename + (LumpIndex != -1 ? ":" + LumpIndex : "") + " (" + Entries.Count + " entries)"; - } - } - public sealed class DataManager { #region ================== Constants @@ -110,7 +97,7 @@ namespace CodeImp.DoomBuilder.Data private Dictionary<int, AmbientSoundInfo> ambientsounds; //mxd. Text resources - private Dictionary<ScriptType, HashSet<TextResource>> textresources; + private Dictionary<ScriptType, HashSet<ScriptResource>> scriptresources; // Background loading private Queue<ImageData> imageque; @@ -169,7 +156,7 @@ namespace CodeImp.DoomBuilder.Data public string[] TerrainNames { get { return terrainnames; } } public string[] DamageTypes { get { return damagetypes; } } public Dictionary<string, PixelColor> KnownColors { get { return knowncolors; } } - internal Dictionary<ScriptType, HashSet<TextResource>> TextResources { get { return textresources; } } + internal Dictionary<ScriptType, HashSet<ScriptResource>> ScriptResources { get { return scriptresources; } } internal CvarsCollection CVars { get { return cvars; } } public Dictionary<int, PixelColor> LockColors { get { return lockcolors; } } public Dictionary<int, int> LockableActions { get { return lockableactions; } } @@ -344,7 +331,7 @@ namespace CodeImp.DoomBuilder.Data skyboxes = new Dictionary<string, SkyboxInfo>(StringComparer.Ordinal); soundsequences = new string[0]; terrainnames = new string[0]; - textresources = new Dictionary<ScriptType, HashSet<TextResource>>(); + scriptresources = new Dictionary<ScriptType, HashSet<ScriptResource>>(); damagetypes = new string[0]; knowncolors = new Dictionary<string, PixelColor>(StringComparer.OrdinalIgnoreCase); cvars = new CvarsCollection(); @@ -378,9 +365,15 @@ namespace CodeImp.DoomBuilder.Data // Choose container type switch(dl.type) { + //mxd. Load resource in read-only mode if: + // 1. UseResourcesInReadonlyMode map option is set. + // 2. OR file has "Read only" flag set. + // 3. OR resource has "Exclude from testing parameters" flag set. + // 4. OR resource is official IWAD. + // WAD file container case DataLocation.RESOURCE_WAD: - c = new WADReader(dl, configlist.Contains(dl) || new FileInfo(dl.location).IsReadOnly); + c = new WADReader(dl, General.Map.Options.UseResourcesInReadonlyMode || dl.notfortesting || new FileInfo(dl.location).IsReadOnly); if(((WADReader)c).WadFile.IsOfficialIWAD) //mxd { if(!string.IsNullOrEmpty(prevofficialiwad)) @@ -391,12 +384,12 @@ namespace CodeImp.DoomBuilder.Data // Directory container case DataLocation.RESOURCE_DIRECTORY: - c = new DirectoryReader(dl, configlist.Contains(dl)); + c = new DirectoryReader(dl, General.Map.Options.UseResourcesInReadonlyMode || dl.notfortesting); break; // PK3 file container case DataLocation.RESOURCE_PK3: - c = new PK3Reader(dl, configlist.Contains(dl) || new FileInfo(dl.location).IsReadOnly); + c = new PK3Reader(dl, General.Map.Options.UseResourcesInReadonlyMode || dl.notfortesting || new FileInfo(dl.location).IsReadOnly); break; } } @@ -623,7 +616,7 @@ namespace CodeImp.DoomBuilder.Data skyboxes = null; //mxd soundsequences = null; //mxd terrainnames = null; //mxd - textresources = null; //mxd + scriptresources = null; //mxd damagetypes = null; //mxd knowncolors = null; //mxd cvars = null; //mxd @@ -1842,7 +1835,7 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - textresources[decorate.ScriptType] = new HashSet<TextResource>(decorate.TextResources.Values); + scriptresources[decorate.ScriptType] = new HashSet<ScriptResource>(decorate.ScriptResources.Values); currentreader = null; if(!decorate.HasError) @@ -2266,7 +2259,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; foreach(KeyValuePair<string, ModelData> e in parser.Entries) @@ -2348,7 +2341,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Get voxel models @@ -2398,7 +2391,7 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Create Gldefs Entries dictionary @@ -2485,7 +2478,7 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; } @@ -2519,7 +2512,7 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; reverbs = parser.GetReverbs(); } @@ -2547,7 +2540,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Anything to do? @@ -2630,7 +2623,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; soundsequences = parser.GetSoundSequences(); } @@ -2700,7 +2693,7 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; } @@ -2727,7 +2720,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Sort @@ -2759,7 +2752,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Set as collection @@ -2787,7 +2780,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Set as collection @@ -2815,7 +2808,7 @@ namespace CodeImp.DoomBuilder.Data } // Add to text resources collection - textresources[parser.ScriptType] = new HashSet<TextResource>(parser.TextResources.Values); + scriptresources[parser.ScriptType] = new HashSet<ScriptResource>(parser.ScriptResources.Values); currentreader = null; // Apply to the enums list? diff --git a/Source/Core/Data/DirectoryReader.cs b/Source/Core/Data/DirectoryReader.cs index 0834643c..e136a59a 100644 --- a/Source/Core/Data/DirectoryReader.cs +++ b/Source/Core/Data/DirectoryReader.cs @@ -54,16 +54,16 @@ namespace CodeImp.DoomBuilder.Data protected override void Initialize() { // Load all WAD files in the root as WAD resources - string[] wadfiles = GetWadFiles(); //mxd + string[] wadfiles = GetWadFiles(); wads = new List<WADReader>(wadfiles.Length); foreach(string wadfile in wadfiles) { - //mxd. Don't add the map file. Otherwise DataManager will try to load it twice (and fial). + // Don't add the map file. Otherwise DataManager will try to load it twice (and fial). string wadfilepath = Path.Combine(location.location, wadfile); if(General.Map.FilePathName != wadfilepath) { DataLocation wdl = new DataLocation(DataLocation.RESOURCE_WAD, wadfilepath, false, false, true); - wads.Add(new WADReader(wdl, isreadonly)); + wads.Add(new WADReader(wdl, isreadonly) { ParentResource = this } ); } } } diff --git a/Source/Core/Data/PK3Reader.cs b/Source/Core/Data/PK3Reader.cs index 53ab3b2f..e26edd9b 100644 --- a/Source/Core/Data/PK3Reader.cs +++ b/Source/Core/Data/PK3Reader.cs @@ -22,10 +22,10 @@ using System.IO; using CodeImp.DoomBuilder.Compilers; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.IO; -using SharpCompress.Archive; //mxd +using SharpCompress.Archive; using SharpCompress.Archive.Zip; -using SharpCompress.Common; //mxd -using SharpCompress.Reader; //mxd +using SharpCompress.Common; +using SharpCompress.Reader; #endregion @@ -520,21 +520,68 @@ namespace CodeImp.DoomBuilder.Data return filedata; } - //mxd. TODO: test this + //mxd internal override bool SaveFile(MemoryStream stream, string filename, int unused) { return SaveFile(stream, filename); } internal override bool SaveFile(MemoryStream stream, string filename) { // Not implemented in SevenZipArchive... if(isreadonly || archivetype == ArchiveType.SevenZip) return false; - // Re-open the archive - using(ZipArchive za = (ZipArchive)ArchiveFactory.Open(location.location)) - { - if(za == null) return false; + // Convert slashes... + filename = filename.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); - // Replace entry - //TODO: Do we need to remove the old entry? - za.AddEntry(filename, stream, stream.Length, DateTime.Now); + // Check if target file is locked... + var checkresult = FileLockChecker.CheckFile(location.location); + if(!string.IsNullOrEmpty(checkresult.Error)) + { + string errmsg = "Unable to save file \"" + filename + "\" into archive \"" + location.GetDisplayName() + "\"."; + if(checkresult.Processes.Count > 0) + { + string processpath = string.Empty; + try + { + // All manner of exceptions are possible here... + processpath = checkresult.Processes[0].MainModule.FileName; + } + catch { } + + errmsg += " Archive is locked by " + checkresult.Processes[0].ProcessName + + " (" + (!string.IsNullOrEmpty(processpath) ? "\"" + processpath + "\"" : "") + + ", started at " + checkresult.Processes[0].StartTime + ")."; + } + + General.ErrorLogger.Add(ErrorType.Error, errmsg); + return false; + } + + using(MemoryStream savestream = new MemoryStream()) + { + using(ZipArchive za = (ZipArchive)ArchiveFactory.Open(location.location)) + { + if(za == null) + { + string errmsg = "Unable to save file \"" + filename + "\" into archive \"" + location.GetDisplayName() + "\". Unable to open target file as a zip archive."; + General.ErrorLogger.Add(ErrorType.Error, errmsg); + return false; + } + + // Find and remove original entry... + foreach(ZipArchiveEntry entry in za.Entries) + { + if(!entry.IsDirectory && entry.Key == filename) + { + za.RemoveEntry(entry); + break; + } + } + + // Add new entry and save the archive to stream... + za.AddEntry(filename, stream, 0L, DateTime.Now); + za.SaveTo(savestream, CompressionType.Deflate); + } + + // Replace archive file... + File.WriteAllBytes(location.location, savestream.ToArray()); } return true; diff --git a/Source/Core/Data/PK3StructuredReader.cs b/Source/Core/Data/PK3StructuredReader.cs index 43da9b5e..97cca26b 100644 --- a/Source/Core/Data/PK3StructuredReader.cs +++ b/Source/Core/Data/PK3StructuredReader.cs @@ -55,6 +55,7 @@ namespace CodeImp.DoomBuilder.Data #region ================== Properties protected readonly string[] PatchLocations = { PATCHES_DIR, TEXTURES_DIR, FLATS_DIR, SPRITES_DIR, GRAPHICS_DIR }; //mxd. Because ZDoom looks for patches and sprites in this order + internal List<WADReader> Wads { get { return wads; } } //mxd #endregion @@ -78,7 +79,7 @@ namespace CodeImp.DoomBuilder.Data { string tempfile = CreateTempFile(w); DataLocation wdl = new DataLocation(DataLocation.RESOURCE_WAD, tempfile, Path.Combine(location.GetDisplayName(), Path.GetFileName(w)), false, false, true); - wads.Add(new WADReader(wdl, location.type != DataLocation.RESOURCE_DIRECTORY)); + wads.Add(new WADReader(wdl, location.type != DataLocation.RESOURCE_DIRECTORY) { ParentResource = this } ); } } diff --git a/Source/Core/Data/Scripting/ScriptResource.cs b/Source/Core/Data/Scripting/ScriptResource.cs new file mode 100644 index 00000000..775dbbe8 --- /dev/null +++ b/Source/Core/Data/Scripting/ScriptResource.cs @@ -0,0 +1,130 @@ +#region ================== Namespaces + +using System; +using System.Collections.Generic; +using System.IO; +using CodeImp.DoomBuilder.Config; + +#endregion + +namespace CodeImp.DoomBuilder.Data.Scripting +{ + public sealed class ScriptResource + { + #region ================== Variables + + private string filename; + private string filepathname; + private string resourcedisplayname; + private int lumpindex = -1; + private DataReader resource; + private string resourcepath; + private HashSet<string> entries; + private ScriptType scripttype; + private bool isreadonly; + + // Special cases... + private string parentresourcelocation; + + #endregion + + #region ================== Properties + + public string Filename { get { return filename; } } // Path to text file inside of Resource + public string FilePathName { get { return filepathname; } } // Resource location and file path inside resource combined + public int LumpIndex { get { return lumpindex; } } // Text lump index if Resource is wad, -1 otherwise + internal DataReader Resource { get { return GetResource(); } } + public HashSet<string> Entries { get { return entries; } } // Actors/models/sounds etc. + public ScriptType ScriptType { get { return scripttype; } } + public bool IsReadOnly { get { return isreadonly; } } + + #endregion + + #region ================== Constructor + + public ScriptResource(TextResourceData source, ScriptType type) + { + resource = source.Source; + resourcepath = resource.Location.location; + resourcedisplayname = resource.Location.GetDisplayName(); + filename = source.Filename.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + filepathname = Path.Combine(resourcepath, filename); + entries = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + lumpindex = source.LumpIndex; + scripttype = type; + isreadonly = resource.IsReadOnly; + + // Embedded resources require additional tender loving care... + if(resource is WADReader) + { + WADReader wr = (WADReader)resource; + if(wr.ParentResource is PK3Reader) + parentresourcelocation = wr.ParentResource.Location.location; + } + } + + #endregion + + #region ================== Methods + + private DataReader GetResource() + { + if(resource == null || resource.IsDisposed) + { + resource = null; + + // Try to re-aquire resource + if(!string.IsNullOrEmpty(parentresourcelocation)) + { + // Special case: WAD resource inside of PK3 resource. + // Resource resourcepath will be different after reloading resources, because it's randomly generated. + // So resolve using displayname and parent resource location... + foreach(DataReader reader in General.Map.Data.Containers) + { + // Found parent + if(reader.Location.location == parentresourcelocation && reader is PK3Reader) + { + PK3Reader pr = (PK3Reader)reader; + foreach(WADReader wr in pr.Wads) + { + if(wr.Location.GetDisplayName() == resourcedisplayname) + { + // Found it + resource = reader; + + // Some paths need updating... + resourcepath = resource.Location.location; + filepathname = Path.Combine(resourcepath, filename); + + break; + } + } + } + } + } + else + { + foreach(DataReader reader in General.Map.Data.Containers) + { + if(reader.Location.location == resourcepath) + { + // Found it + resource = reader; + break; + } + } + } + } + + return resource; + } + + // Used as tab and script navigator item title + public override string ToString() + { + return (lumpindex != -1 ? lumpindex + ":" : "") + Path.GetFileName(filename); + } + + #endregion + } +} diff --git a/Source/Core/Data/WADReader.cs b/Source/Core/Data/WADReader.cs index d2a2b0a4..110ce620 100644 --- a/Source/Core/Data/WADReader.cs +++ b/Source/Core/Data/WADReader.cs @@ -23,6 +23,7 @@ using System.IO; using System.Text.RegularExpressions; using CodeImp.DoomBuilder.Compilers; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Data.Scripting; using CodeImp.DoomBuilder.GZBuilder.Data; using CodeImp.DoomBuilder.IO; using CodeImp.DoomBuilder.ZDoom; @@ -80,6 +81,7 @@ namespace CodeImp.DoomBuilder.Data public bool IsIWAD { get { return is_iwad; } } internal WAD WadFile { get { return file; } } //mxd + internal PK3StructuredReader ParentResource; //mxd #endregion @@ -94,7 +96,7 @@ namespace CodeImp.DoomBuilder.Data throw new FileNotFoundException("Could not find the file \"" + location.location + "\"", location.location); // Initialize - file = new WAD(location.location, true); + file = new WAD(location.location, asreadonly); strictpatches = dl.option1; Initialize(); //mxd @@ -126,7 +128,7 @@ namespace CodeImp.DoomBuilder.Data private void Initialize() { is_iwad = file.IsIWAD; - isreadonly = file.IsReadOnly; // I guess opening an official IWAD in write-enabled mode is possible + isreadonly |= is_iwad; // Just in case... // Initialize patchranges = new List<LumpRange>(); @@ -510,11 +512,11 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - if(!General.Map.Data.TextResources.ContainsKey(parser.ScriptType)) - General.Map.Data.TextResources[parser.ScriptType] = new HashSet<TextResource>(); + if(!General.Map.Data.ScriptResources.ContainsKey(parser.ScriptType)) + General.Map.Data.ScriptResources[parser.ScriptType] = new HashSet<ScriptResource>(); - foreach(KeyValuePair<string, TextResource> group in parser.TextResources) - General.Map.Data.TextResources[parser.ScriptType].Add(group.Value); + foreach(KeyValuePair<string, ScriptResource> group in parser.ScriptResources) + General.Map.Data.ScriptResources[parser.ScriptType].Add(group.Value); return parser; //mxd } @@ -792,11 +794,11 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - if(!General.Map.Data.TextResources.ContainsKey(parser.ScriptType)) - General.Map.Data.TextResources[parser.ScriptType] = new HashSet<TextResource>(); + if(!General.Map.Data.ScriptResources.ContainsKey(parser.ScriptType)) + General.Map.Data.ScriptResources[parser.ScriptType] = new HashSet<ScriptResource>(); - foreach(KeyValuePair<string, TextResource> group in parser.TextResources) - General.Map.Data.TextResources[parser.ScriptType].Add(group.Value); + foreach(KeyValuePair<string, ScriptResource> group in parser.ScriptResources) + General.Map.Data.ScriptResources[parser.ScriptType].Add(group.Value); return parser; //mxd } @@ -877,11 +879,11 @@ namespace CodeImp.DoomBuilder.Data } //mxd. Add to text resources collection - if(!General.Map.Data.TextResources.ContainsKey(parser.ScriptType)) - General.Map.Data.TextResources[parser.ScriptType] = new HashSet<TextResource>(); + if(!General.Map.Data.ScriptResources.ContainsKey(parser.ScriptType)) + General.Map.Data.ScriptResources[parser.ScriptType] = new HashSet<ScriptResource>(); - foreach(KeyValuePair<string, TextResource> group in parser.TextResources) - General.Map.Data.TextResources[parser.ScriptType].Add(group.Value); + foreach(KeyValuePair<string, ScriptResource> group in parser.ScriptResources) + General.Map.Data.ScriptResources[parser.ScriptType].Add(group.Value); return parser; //mxd } @@ -1167,7 +1169,7 @@ namespace CodeImp.DoomBuilder.Data internal override MemoryStream LoadFile(string name, int lumpindex) { - if(lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != name) + if(lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != name.ToUpperInvariant()) return null; Lump l = file.Lumps[lumpindex]; @@ -1193,12 +1195,15 @@ namespace CodeImp.DoomBuilder.Data l.Stream.Seek(0, SeekOrigin.Begin); lumpdata.WriteTo(l.Stream); + // Update WAD file + file.WriteHeaders(); + return true; } internal override bool SaveFile(MemoryStream lumpdata, string lumpname, int lumpindex) { - if(isreadonly || lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != lumpname) + if(isreadonly || lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != lumpname.ToUpperInvariant()) return false; // Remove the lump @@ -1209,6 +1214,9 @@ namespace CodeImp.DoomBuilder.Data l.Stream.Seek(0, SeekOrigin.Begin); lumpdata.WriteTo(l.Stream); + // Update WAD file + file.WriteHeaders(); + return true; } @@ -1253,7 +1261,7 @@ namespace CodeImp.DoomBuilder.Data // Find the lump if(lumpname == MapManager.CONFIG_MAP_HEADER) reallumpname = MapManager.TEMP_MAP_HEADER; - Lump lump = file.FindLump(reallumpname); + Lump lump = file.FindLump(reallumpname, lumpindex, lumpindex); if(lump == null) throw new Exception("Unable to find lump \"" + reallumpname + "\" to compile in \"" + location.GetDisplayName() + "\"."); @@ -1272,6 +1280,29 @@ namespace CodeImp.DoomBuilder.Data return false; } + //mxd. AccCompiler requires some additional settings... + if(scriptconfig.ScriptType == ScriptType.ACS) + { + AccCompiler acccompiler = compiler as AccCompiler; + if(acccompiler == null) + { + // Fail + errors.Add(new CompilerError("Unexpected ACS compiler: " + compiler)); + return false; + } + + if(lumpname == "SCRIPTS" && this == General.Map.TemporaryMapFile) + { + acccompiler.SourceIsMapScriptsLump = true; + } + else + { + //TODO: implement library compiling... + errors.Add(new CompilerError("Compilation of ACS libraries is not supported yet...")); + return false; + } + } + try { // Write lump data to temp script file in compiler's temp directory @@ -1298,16 +1329,6 @@ namespace CodeImp.DoomBuilder.Data compiler.SourceFile = sourcefile; compiler.WorkingDirectory = Path.GetDirectoryName(inputfile); - //mxd. AccCompiler requires some additional settings... - if(scriptconfig.ScriptType == ScriptType.ACS) - { - AccCompiler acccompiler = compiler as AccCompiler; - if(acccompiler != null) - { - acccompiler.SourceIsMapScriptsLump = (this == General.Map.TemporaryMapFile && lumpname == "SCRIPTS"); - } - } - if(compiler.Run()) { // Process errors diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index 0a94a0ed..4d91a95c 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -26,6 +26,7 @@ using CodeImp.DoomBuilder.Actions; using CodeImp.DoomBuilder.Compilers; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Data.Scripting; using CodeImp.DoomBuilder.Editing; using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.GZBuilder.Data; //mxd @@ -1852,31 +1853,19 @@ namespace CodeImp.DoomBuilder { Cursor.Current = Cursors.WaitCursor; - if(scriptwindow == null) - { - // Load the window - scriptwindow = new ScriptEditorForm(); - } + // Load the window? + if(scriptwindow == null) scriptwindow = new ScriptEditorForm(); // Window not yet visible? - if(!scriptwindow.Visible) - { - // Show the window - if(General.Settings.ScriptOnTop) - { - if(scriptwindow.Visible && (scriptwindow.Owner == null)) scriptwindow.Hide(); - scriptwindow.Show(General.MainWindow); - } - else - { - if(scriptwindow.Visible && (scriptwindow.Owner != null)) scriptwindow.Hide(); - scriptwindow.Show(); - } - } + if(!scriptwindow.Visible) scriptwindow.Show(); + + scriptwindow.TopMost = General.Settings.ScriptOnTop; //mxd + if(scriptwindow.WindowState == FormWindowState.Minimized) + scriptwindow.WindowState = FormWindowState.Normal; //mxd - if(scriptwindow.WindowState == FormWindowState.Minimized) scriptwindow.WindowState = FormWindowState.Normal; //mxd scriptwindow.Activate(); scriptwindow.Focus(); + Cursor.Current = Cursors.Default; } @@ -1978,7 +1967,7 @@ namespace CodeImp.DoomBuilder //mxd. Update script numbers and names private void UpdateScriptNames() { - General.Map.Data.TextResources[ScriptType.ACS] = new HashSet<TextResource>(); + General.Map.Data.ScriptResources[ScriptType.ACS] = new HashSet<ScriptResource>(); // Find SCRIPTS lump and parse it foreach(MapLumpInfo maplumpinfo in config.MapLumps.Values) @@ -2032,7 +2021,7 @@ namespace CodeImp.DoomBuilder if(parser.Parse(data, scriptconfig.Compiler.Files, true, AcsParserSE.IncludeType.NONE, false)) { // Add to text resource list - General.Map.Data.TextResources[parser.ScriptType].UnionWith(parser.TextResources.Values); + General.Map.Data.ScriptResources[parser.ScriptType].UnionWith(parser.ScriptResources.Values); // Update the names UpdateScriptNames(parser); @@ -2254,12 +2243,15 @@ namespace CodeImp.DoomBuilder General.MainWindow.CheckEditModeButton(General.Editing.Mode.EditModeButtonName); } + //mxd. Update script names + UpdateScriptNames(); + + //mxd. Script Editor may need updating... + if(scriptwindow != null) scriptwindow.OnReloadResources(); + // Reset status General.MainWindow.DisplayStatus(oldstatus); Cursor.Current = oldcursor; - - //mxd. Update script names - UpdateScriptNames(); } // Game Configuration action diff --git a/Source/Core/Map/MapOptions.cs b/Source/Core/Map/MapOptions.cs index 9375ad97..d2aa4239 100644 --- a/Source/Core/Map/MapOptions.cs +++ b/Source/Core/Map/MapOptions.cs @@ -57,9 +57,8 @@ namespace CodeImp.DoomBuilder.Map // Additional resources private DataLocationList resources; - //mxd. View settings for opened script files and lumps - private Dictionary<string, ScriptDocumentSettings> scriptfilesettings; - private Dictionary<string, ScriptDocumentSettings> scriptlumpsettings; + //mxd. View settings for opened script files, resources and lumps + private Dictionary<string, ScriptDocumentSettings> scriptsettings; // mxd. Script compiler private string scriptcompiler; @@ -86,6 +85,7 @@ namespace CodeImp.DoomBuilder.Map //mxd. private bool uselongtexturenames; + private bool useresourcesinreadonlymode; //mxd. Position and scale private readonly Vector2D viewposition; @@ -98,8 +98,7 @@ namespace CodeImp.DoomBuilder.Map internal string ConfigFile { get { return configfile; } set { configfile = value; } } internal DataLocationList Resources { get { return resources; } } internal bool StrictPatches { get { return strictpatches; } set { strictpatches = value; } } - internal Dictionary<string, ScriptDocumentSettings> ScriptFileSettings { get { return scriptfilesettings; } } //mxd - internal Dictionary<string, ScriptDocumentSettings> ScriptLumpSettings { get { return scriptlumpsettings; } } //mxd + internal Dictionary<string, ScriptDocumentSettings> ScriptDocumentSettings { get { return scriptsettings; } } //mxd internal string ScriptCompiler { get { return scriptcompiler; } set { scriptcompiler = value; } } //mxd internal string PreviousName { get { return previousname; } set { previousname = value; } } internal string CurrentName @@ -144,6 +143,7 @@ namespace CodeImp.DoomBuilder.Map //mxd public bool UseLongTextureNames { get { return uselongtexturenames; } set { uselongtexturenames = value; } } + public bool UseResourcesInReadonlyMode { get { return useresourcesinreadonlymode; } set { useresourcesinreadonlymode = value; } } //mxd. Position and scale public Vector2D ViewPosition { get { return viewposition; } } @@ -163,8 +163,7 @@ namespace CodeImp.DoomBuilder.Map this.strictpatches = false; this.resources = new DataLocationList(); this.mapconfig = new Configuration(true); - this.scriptfilesettings = new Dictionary<string, ScriptDocumentSettings>(); //mxd - this.scriptlumpsettings = new Dictionary<string, ScriptDocumentSettings>(); //mxd + this.scriptsettings = new Dictionary<string, ScriptDocumentSettings>(StringComparer.OrdinalIgnoreCase); //mxd this.scriptcompiler = ""; //mxd this.tagLabels = new Dictionary<int, string>(); //mxd this.viewposition = new Vector2D(float.NaN, float.NaN); //mxd @@ -185,8 +184,7 @@ namespace CodeImp.DoomBuilder.Map this.configfile = cfg.ReadSetting("gameconfig", ""); this.resources = new DataLocationList(); this.mapconfig = new Configuration(true); - this.scriptfilesettings = new Dictionary<string, ScriptDocumentSettings>(); //mxd - this.scriptlumpsettings = new Dictionary<string, ScriptDocumentSettings>(); //mxd + this.scriptsettings = new Dictionary<string, ScriptDocumentSettings>(StringComparer.OrdinalIgnoreCase); //mxd // Read map configuration this.mapconfig.Root = cfg.ReadSetting("maps." + mapname, new Hashtable()); @@ -238,6 +236,7 @@ namespace CodeImp.DoomBuilder.Map //mxd uselongtexturenames = longtexturenamessupported && this.mapconfig.ReadSetting("uselongtexturenames", false); + useresourcesinreadonlymode = this.mapconfig.ReadSetting("useresourcesinreadonlymode", false); //mxd. Position and scale float vpx = this.mapconfig.ReadSetting("viewpositionx", float.NaN); @@ -267,8 +266,8 @@ namespace CodeImp.DoomBuilder.Map } } - //mxd. Script files settings - IDictionary sflist = this.mapconfig.ReadSetting("scriptfiles", new Hashtable()); + //mxd. Read script documents settings + IDictionary sflist = this.mapconfig.ReadSetting("scriptdocuments", new Hashtable()); foreach(DictionaryEntry mp in sflist) { // Item is a structure? @@ -276,32 +275,10 @@ namespace CodeImp.DoomBuilder.Map if(scfinfo != null) { ScriptDocumentSettings settings = ReadScriptDocumentSettings(scfinfo); - if(!string.IsNullOrEmpty(settings.Filename)) scriptfilesettings.Add(settings.Filename, settings); - } - } - - //mxd. Script lumps settings - IDictionary sllist = this.mapconfig.ReadSetting("scriptlumps", new Hashtable()); - foreach(DictionaryEntry mp in sllist) - { - // Item is a structure? - IDictionary sclinfo = mp.Value as IDictionary; - if(sclinfo != null) - { - ScriptDocumentSettings settings = ReadScriptDocumentSettings(sclinfo); - if(!string.IsNullOrEmpty(settings.Filename)) scriptlumpsettings.Add(settings.Filename, settings); + if(!string.IsNullOrEmpty(settings.Filename)) scriptsettings[settings.Filename] = settings; } } } - - //mxd. Is that really needed?.. - /*~MapOptions() - { - // Clean up - this.resources = null; - this.scriptfilesettings = null; //mxd - this.scriptlumpsettings = null; //mxd - }*/ #endregion @@ -391,6 +368,7 @@ namespace CodeImp.DoomBuilder.Map //mxd mapconfig.WriteSetting("uselongtexturenames", uselongtexturenames); + mapconfig.WriteSetting("useresourcesinreadonlymode", useresourcesinreadonlymode); //mxd. Position and scale mapconfig.WriteSetting("viewpositionx", General.Map.Renderer2D.OffsetX); @@ -404,16 +382,11 @@ namespace CodeImp.DoomBuilder.Map // Write grid settings General.Map.Grid.WriteToConfig(mapconfig, "grid"); - //mxd. Write script files settings to config - mapconfig.DeleteSetting("scriptfiles"); - foreach(ScriptDocumentSettings settings in scriptfilesettings.Values) - WriteScriptDocumentSettings(mapconfig, "scriptfiles.file", settings); - - - //mxd. Write script lumps settings to config - mapconfig.DeleteSetting("scriptlumps"); - foreach(ScriptDocumentSettings settings in scriptlumpsettings.Values) - WriteScriptDocumentSettings(mapconfig, "scriptlumps.lump", settings); + //mxd. Write script document settings to config + int sdcounter = 0; + mapconfig.DeleteSetting("scriptdocuments"); + foreach(ScriptDocumentSettings settings in scriptsettings.Values) + WriteScriptDocumentSettings(mapconfig, "scriptdocuments.document" + (sdcounter++), settings); // Load the file or make a new file if(File.Exists(settingsfile)) @@ -446,6 +419,9 @@ namespace CodeImp.DoomBuilder.Map if(scfinfo["hash"] is int) settings.Hash = (int)scfinfo["hash"]; else if(scfinfo["hash"] is long) settings.Hash = (long)scfinfo["hash"]; } + if(scfinfo.Contains("resource") && (scfinfo["resource"] is string)) settings.ResourceLocation = (string)scfinfo["resource"]; + if(scfinfo.Contains("tabtype") && (scfinfo["tabtype"] is int)) settings.TabType = (ScriptDocumentTabType)scfinfo["tabtype"]; + if(scfinfo.Contains("scripttype") && (scfinfo["scripttype"] is int)) settings.ScriptType = (ScriptType)scfinfo["scripttype"]; if(scfinfo.Contains("caretposition") && (scfinfo["caretposition"] is int)) settings.CaretPosition = (int)scfinfo["caretposition"]; if(scfinfo.Contains("firstvisibleline") && (scfinfo["firstvisibleline"] is int)) settings.FirstVisibleLine = (int)scfinfo["firstvisibleline"]; if(scfinfo.Contains("activetab") && (scfinfo["activetab"] is bool)) settings.IsActiveTab = (bool)scfinfo["activetab"]; @@ -498,6 +474,9 @@ namespace CodeImp.DoomBuilder.Map ListDictionary data = new ListDictionary(); data.Add("filename", settings.Filename); data.Add("hash", settings.Hash); + data.Add("resource", settings.ResourceLocation); + data.Add("tabtype", (int)settings.TabType); + data.Add("scripttype", (int)settings.ScriptType); if(settings.CaretPosition > 0) data.Add("caretposition", settings.CaretPosition); if(settings.FirstVisibleLine > 0) data.Add("firstvisibleline", settings.FirstVisibleLine); if(settings.IsActiveTab) data.Add("activetab", true); diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs index 89b2b032..643f6f6a 100644 --- a/Source/Core/Properties/Resources.Designer.cs +++ b/Source/Core/Properties/Resources.Designer.cs @@ -662,13 +662,6 @@ namespace CodeImp.DoomBuilder.Properties { } } - internal static System.Drawing.Bitmap NewScript { - get { - object obj = ResourceManager.GetObject("NewScript", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - internal static System.Drawing.Bitmap OpenMap { get { object obj = ResourceManager.GetObject("OpenMap", resourceCulture); @@ -851,6 +844,13 @@ namespace CodeImp.DoomBuilder.Properties { } } + internal static System.Drawing.Bitmap ScriptNew { + get { + object obj = ResourceManager.GetObject("ScriptNew", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Bitmap ScriptPalette { get { object obj = ResourceManager.GetObject("ScriptPalette", resourceCulture); diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx index aebb9bf4..6b41d4fb 100644 --- a/Source/Core/Properties/Resources.resx +++ b/Source/Core/Properties/Resources.resx @@ -118,18 +118,21 @@ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> - <data name="Zoom" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Zoom.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="Clear" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Clear.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Cut" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Cut.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="ArrowUp" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ArrowUp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="ClearTextures" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ClearTextures.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Angle4" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle4.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="MergeGeoRemoveLines" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\MergeGeoRemoveLines.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Keyboard" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Keyboard.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -142,8 +145,8 @@ <data name="ColorPick" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ColorPick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="SearchMatchCase" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\SearchMatchCase.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="ArrowDown" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ArrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="File" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\NewMap.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -172,35 +175,29 @@ <data name="Replace" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Replace.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Angle6" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle6.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Grid4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Grid4.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="MixedThings" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\MixedThings.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="TextUnindent" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\TextUnindent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="Marine" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Marine.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="InfoPanelCollapse" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\InfoPanelCollapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="mergegeometry" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\mergegeometry.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="Splash3_small" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Splash3_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Group" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Group.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="TagStatistics" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\TagStatistics.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="VisualVertices" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\VisualVertices.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Angle7" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle7.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Screenshot" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Screenshot.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -211,14 +208,11 @@ <data name="ScriptHelp" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ScriptHelp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Light_animate" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Light_animate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Angle2" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="CommentSmile" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\CommentSmile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="KnownTextureSet" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\KnownTextureSet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Search" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Search.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Splash3_trans" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Splash3_trans.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -232,20 +226,32 @@ <data name="Expand" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Expand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Unpin" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Unpin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Redo" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Redo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Brightness" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Brightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="SplitSectors" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\SplitSectors.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="ViewBrightness" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ViewBrightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Model" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Model.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Configuration" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Configuration.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="mergegeometry" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\mergegeometry.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="CommentProblem" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\CommentProblem.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="UnknownImage" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\UnknownImage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Comment" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Comment.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="ScriptSnippet" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ScriptSnippet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="List_Images" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\List_Images.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -271,15 +277,18 @@ <data name="Warning" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Warning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Angle1" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Hourglass" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Hourglass.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="mergegeometry2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\mergegeometry2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="CLogo" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\CLogo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Copy" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="WarningOff" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\WarningOff.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -304,6 +313,9 @@ <data name="Cursor" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Cursor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Configuration" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Configuration.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Preferences" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Preferences.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -313,14 +325,14 @@ <data name="OpenMap" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\OpenMap.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="ScriptProperty" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ScriptProperty.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="treeview" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\treeview.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Status1" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Status1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="ArrowDown" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ArrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="SearchMatchCase" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\SearchMatchCase.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="PasteSpecial" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\PasteSpecial.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -331,6 +343,9 @@ <data name="NewMap" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\NewMap2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Properties" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Properties.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="About" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\About.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -343,8 +358,11 @@ <data name="Prefab2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Prefab2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Grid2" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Grid2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Angle5" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle5.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Brightness" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Brightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="WordWrap" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\WordWrap.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -352,11 +370,14 @@ <data name="fog" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\fog.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="FixedThingsScale" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\FixedThingsScale.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="InfoLine" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\InfoLine.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Status10" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Status10.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="MergeGeo" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\MergeGeo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="MissingTexture" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\MissingTexture.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -367,12 +388,12 @@ <data name="ScriptError" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ScriptError.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Lightbulb" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Lightbulb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="MCrash" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\MCrash.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="PuzzlePiece" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\PuzzlePiece.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="DockerExpand" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\DockerExpand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -388,8 +409,8 @@ <data name="ScriptCompile" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ScriptCompile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="PuzzlePiece" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\PuzzlePiece.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Zoom" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Zoom.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="SearchPrev" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\SearchPrev.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -400,10 +421,13 @@ <data name="GridDynamic" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\GridDynamic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Text" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Text.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Collapse" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Collapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="NewScript" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <data name="ScriptNew" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\NewScript.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="SnapVerts" type="System.Resources.ResXFileRef, System.Windows.Forms"> @@ -412,17 +436,23 @@ <data name="Unlink" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Unlink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="TextIndent" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\TextIndent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Status10" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Status10.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Status0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Status0.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Script2" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Script2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="ScreenshotActiveWindow" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\ScreenshotActiveWindow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="ClearTextures" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ClearTextures.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Script2" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Cut" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Cut.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Status2" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Status2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Prefab" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Prefab.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -430,23 +460,26 @@ <data name="ImageStack" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ImageStack.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="CommentSmile" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\CommentSmile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="SearchMatch" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\SearchMatch.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Hourglass" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Hourglass.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="GridIncrease" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\GridIncrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Folder" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="GZDB2" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\GZDB2.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="MergeGeoClassic" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\MergeGeoClassic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Comment" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Comment.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="GroupAdd" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\GroupAdd.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="VisualVertices" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\VisualVertices.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Status12" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Status12.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -454,23 +487,23 @@ <data name="SearchNext" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\SearchNext.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Status2" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Status2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Light_animate" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Light_animate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Link" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="Light" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Light.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="InfoPanelExpand" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\InfoPanelExpand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="ScriptSnippet" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ScriptSnippet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="TagStatistics" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\TagStatistics.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Properties" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Properties.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Test" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Test.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -478,11 +511,14 @@ <data name="Undo" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Undo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="UnknownImage" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\UnknownImage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="CommentProblem" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\CommentProblem.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Unpin" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Unpin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="SlimDX_small" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\SlimDX_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="KnownTextureSet" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\KnownTextureSet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Angle" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Angle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -502,14 +538,17 @@ <data name="Pin" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Pin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="OpenScript" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\OpenScript.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="ViewNormal" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ViewNormal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="ScriptKeyword" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\ScriptKeyword.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="MissingThing" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\MissingThing.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Angle3" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Angle3.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Monster3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Monster3.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -520,79 +559,40 @@ <data name="DockerCollapse" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\DockerCollapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="GroupAdd" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\GroupAdd.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Copy" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="ViewBrightness" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ViewBrightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Grid2" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Grid2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Light" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Light.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Lightbulb" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Lightbulb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Help" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Help.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="OpenScript" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\OpenScript.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="TextUnindent" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\TextUnindent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="SlimDX_small" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\SlimDX_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="MissingThing" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\MissingThing.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Status11" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Status11.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="ScreenshotActiveWindow" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ScreenshotActiveWindow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Status1" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Status1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="WarningLarge" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\WarningLarge.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Search" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Search.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="GZDB2" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\GZDB2.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Text" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Text.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="TextIndent" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\TextIndent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Check" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Check.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="ScriptProperty" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\ScriptProperty.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="FixedThingsScale" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\FixedThingsScale.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle1" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle2" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle3" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle3.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle4" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle4.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle5" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle5.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle6" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle6.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Angle7" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Angle7.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="MergeGeo" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\MergeGeo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="MergeGeoClassic" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\MergeGeoClassic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="MergeGeoRemoveLines" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\MergeGeoRemoveLines.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="SplitSectors" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\SplitSectors.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> </root> \ No newline at end of file diff --git a/Source/Core/Resources/NewScript.png b/Source/Core/Resources/NewScript.png index 9e6fe958..96098383 100644 Binary files a/Source/Core/Resources/NewScript.png and b/Source/Core/Resources/NewScript.png differ diff --git a/Source/Core/Resources/Script.png b/Source/Core/Resources/Script.png new file mode 100644 index 00000000..c364714e Binary files /dev/null and b/Source/Core/Resources/Script.png differ diff --git a/Source/Core/Resources/Script2.png b/Source/Core/Resources/Script2.png deleted file mode 100644 index 80f929b9..00000000 Binary files a/Source/Core/Resources/Script2.png and /dev/null differ diff --git a/Source/Core/Resources/ScriptCompile.png b/Source/Core/Resources/ScriptCompile.png index 8e5d4d6d..0a00ed57 100644 Binary files a/Source/Core/Resources/ScriptCompile.png and b/Source/Core/Resources/ScriptCompile.png differ diff --git a/Source/Core/Resources/ScriptPalette.png b/Source/Core/Resources/ScriptPalette.png index 20f9d693..a2026057 100644 Binary files a/Source/Core/Resources/ScriptPalette.png and b/Source/Core/Resources/ScriptPalette.png differ diff --git a/Source/Core/Windows/MainForm.Designer.cs b/Source/Core/Windows/MainForm.Designer.cs index e3ecf3fc..699ccfbf 100644 --- a/Source/Core/Windows/MainForm.Designer.cs +++ b/Source/Core/Windows/MainForm.Designer.cs @@ -2758,7 +2758,6 @@ namespace CodeImp.DoomBuilder.Windows this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MainMenuStrip = this.menumain; this.Name = "MainForm"; - this.Opacity = 0; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Text = "GZDoom Builder"; this.Deactivate += new System.EventHandler(this.MainForm_Deactivate); diff --git a/Source/Core/Windows/MapOptionsForm.Designer.cs b/Source/Core/Windows/MapOptionsForm.Designer.cs index 7e9deff4..e159e9f7 100644 --- a/Source/Core/Windows/MapOptionsForm.Designer.cs +++ b/Source/Core/Windows/MapOptionsForm.Designer.cs @@ -28,6 +28,7 @@ namespace CodeImp.DoomBuilder.Windows /// </summary> private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.Windows.Forms.Label label3; System.Windows.Forms.Label label2; System.Windows.Forms.Label label1; @@ -45,6 +46,8 @@ namespace CodeImp.DoomBuilder.Windows this.longtexturenames = new System.Windows.Forms.CheckBox(); this.strictpatches = new System.Windows.Forms.CheckBox(); this.datalocations = new CodeImp.DoomBuilder.Controls.ResourceListEditor(); + this.readonlyresources = new System.Windows.Forms.CheckBox(); + this.tooltip = new System.Windows.Forms.ToolTip(this.components); label3 = new System.Windows.Forms.Label(); label2 = new System.Windows.Forms.Label(); label1 = new System.Windows.Forms.Label(); @@ -154,7 +157,7 @@ namespace CodeImp.DoomBuilder.Windows // label4 // label4.AutoSize = true; - label4.Location = new System.Drawing.Point(14, 207); + label4.Location = new System.Drawing.Point(14, 229); label4.Name = "label4"; label4.Size = new System.Drawing.Size(299, 52); label4.TabIndex = 17; @@ -163,7 +166,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(179, 405); + this.apply.Location = new System.Drawing.Point(179, 427); this.apply.Name = "apply"; this.apply.Size = new System.Drawing.Size(112, 25); this.apply.TabIndex = 2; @@ -175,7 +178,7 @@ namespace CodeImp.DoomBuilder.Windows // 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(297, 405); + this.cancel.Location = new System.Drawing.Point(297, 427); this.cancel.Name = "cancel"; this.cancel.Size = new System.Drawing.Size(112, 25); this.cancel.TabIndex = 3; @@ -187,13 +190,14 @@ namespace CodeImp.DoomBuilder.Windows // this.panelres.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.panelres.Controls.Add(this.readonlyresources); this.panelres.Controls.Add(this.longtexturenames); this.panelres.Controls.Add(this.strictpatches); this.panelres.Controls.Add(this.datalocations); this.panelres.Controls.Add(label4); this.panelres.Location = new System.Drawing.Point(12, 130); this.panelres.Name = "panelres"; - this.panelres.Size = new System.Drawing.Size(397, 269); + this.panelres.Size = new System.Drawing.Size(397, 291); this.panelres.TabIndex = 1; this.panelres.TabStop = false; this.panelres.Text = " Resources "; @@ -222,18 +226,31 @@ namespace CodeImp.DoomBuilder.Windows // this.datalocations.AllowDrop = true; this.datalocations.DialogOffset = new System.Drawing.Point(40, 20); - this.datalocations.Location = new System.Drawing.Point(14, 71); + this.datalocations.Location = new System.Drawing.Point(14, 93); this.datalocations.Name = "datalocations"; this.datalocations.Size = new System.Drawing.Size(368, 127); this.datalocations.TabIndex = 0; // + // readonlyresources + // + this.readonlyresources.AutoSize = true; + this.readonlyresources.Location = new System.Drawing.Point(14, 69); + this.readonlyresources.Name = "readonlyresources"; + this.readonlyresources.Size = new System.Drawing.Size(210, 17); + this.readonlyresources.TabIndex = 22; + this.readonlyresources.Text = "Open map resources in read-only mode"; + this.tooltip.SetToolTip(this.readonlyresources, "When enabled, map resources will be loaded in read-only mode,\r\nwhich allows to ed" + + "it them in an external application while the map\r\nis opened. You won\'t be able t" + + "o edit resources in the Script Editor."); + this.readonlyresources.UseVisualStyleBackColor = true; + // // MapOptionsForm // this.AcceptButton = this.apply; this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.CancelButton = this.cancel; - this.ClientSize = new System.Drawing.Size(421, 438); + this.ClientSize = new System.Drawing.Size(421, 460); this.Controls.Add(this.panelres); this.Controls.Add(this.cancel); this.Controls.Add(this.apply); @@ -269,6 +286,8 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.Label scriptcompilerlabel; private System.Windows.Forms.Label examplelabel; private System.Windows.Forms.CheckBox longtexturenames; + private System.Windows.Forms.CheckBox readonlyresources; + private System.Windows.Forms.ToolTip tooltip; } diff --git a/Source/Core/Windows/MapOptionsForm.cs b/Source/Core/Windows/MapOptionsForm.cs index dedceceb..047000b5 100644 --- a/Source/Core/Windows/MapOptionsForm.cs +++ b/Source/Core/Windows/MapOptionsForm.cs @@ -263,6 +263,9 @@ namespace CodeImp.DoomBuilder.Windows //mxd. Use long texture names? if(longtexturenames.Enabled) options.UseLongTextureNames = longtexturenames.Checked; + + //mxd. Resource usage + options.UseResourcesInReadonlyMode = readonlyresources.Checked; // Hide window this.DialogResult = DialogResult.OK; @@ -326,6 +329,9 @@ namespace CodeImp.DoomBuilder.Windows // Update long texture names checkbox (mxd) longtexturenames.Enabled = info.Configuration.ReadSetting("longtexturenames", false); longtexturenames.Checked = longtexturenames.Enabled && options.UseLongTextureNames; + + //mxd. Update resource usage + readonlyresources.Checked = options.UseResourcesInReadonlyMode; } // When keys are pressed in the level name field diff --git a/Source/Core/Windows/MapOptionsForm.resx b/Source/Core/Windows/MapOptionsForm.resx index dd3caf31..bc3bf4aa 100644 --- a/Source/Core/Windows/MapOptionsForm.resx +++ b/Source/Core/Windows/MapOptionsForm.resx @@ -138,4 +138,7 @@ Drag items to change order (lower items override higher items). Use the context menu to cut, copy, paste or remove items. Grayed items are loaded according to the game configuration.</value> </data> + <metadata name="tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> </root> \ No newline at end of file diff --git a/Source/Core/Windows/OpenMapOptionsForm.Designer.cs b/Source/Core/Windows/OpenMapOptionsForm.Designer.cs index 7da624a4..bc4ee4be 100644 --- a/Source/Core/Windows/OpenMapOptionsForm.Designer.cs +++ b/Source/Core/Windows/OpenMapOptionsForm.Designer.cs @@ -28,6 +28,7 @@ namespace CodeImp.DoomBuilder.Windows /// </summary> private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.Windows.Forms.ColumnHeader columnHeader1; System.Windows.Forms.Label label1; System.Windows.Forms.Label label2; @@ -43,6 +44,8 @@ namespace CodeImp.DoomBuilder.Windows this.mapslist = new System.Windows.Forms.ListView(); this.scriptcompiler = new System.Windows.Forms.ComboBox(); this.scriptcompilerlabel = new System.Windows.Forms.Label(); + this.readonlyresources = new System.Windows.Forms.CheckBox(); + this.tooltip = new System.Windows.Forms.ToolTip(this.components); columnHeader1 = new System.Windows.Forms.ColumnHeader(); label1 = new System.Windows.Forms.Label(); label2 = new System.Windows.Forms.Label(); @@ -76,7 +79,7 @@ namespace CodeImp.DoomBuilder.Windows // label3 // label3.AutoSize = true; - label3.Location = new System.Drawing.Point(14, 207); + label3.Location = new System.Drawing.Point(14, 227); label3.Name = "label3"; label3.Size = new System.Drawing.Size(299, 52); label3.TabIndex = 17; @@ -86,13 +89,14 @@ namespace CodeImp.DoomBuilder.Windows // this.panelres.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.panelres.Controls.Add(this.readonlyresources); this.panelres.Controls.Add(this.longtexturenames); this.panelres.Controls.Add(this.strictpatches); this.panelres.Controls.Add(this.datalocations); this.panelres.Controls.Add(label3); this.panelres.Location = new System.Drawing.Point(12, 246); this.panelres.Name = "panelres"; - this.panelres.Size = new System.Drawing.Size(396, 270); + this.panelres.Size = new System.Drawing.Size(396, 292); this.panelres.TabIndex = 2; this.panelres.TabStop = false; this.panelres.Text = " Resources "; @@ -121,7 +125,7 @@ namespace CodeImp.DoomBuilder.Windows // this.datalocations.AllowDrop = true; this.datalocations.DialogOffset = new System.Drawing.Point(40, 20); - this.datalocations.Location = new System.Drawing.Point(14, 71); + this.datalocations.Location = new System.Drawing.Point(14, 91); this.datalocations.Name = "datalocations"; this.datalocations.Size = new System.Drawing.Size(368, 127); this.datalocations.TabIndex = 0; @@ -129,7 +133,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(178, 524); + this.apply.Location = new System.Drawing.Point(178, 544); this.apply.Name = "apply"; this.apply.Size = new System.Drawing.Size(112, 25); this.apply.TabIndex = 3; @@ -141,7 +145,7 @@ namespace CodeImp.DoomBuilder.Windows // 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(296, 524); + this.cancel.Location = new System.Drawing.Point(296, 544); this.cancel.Name = "cancel"; this.cancel.Size = new System.Drawing.Size(112, 25); this.cancel.TabIndex = 4; @@ -205,13 +209,24 @@ namespace CodeImp.DoomBuilder.Windows this.scriptcompilerlabel.Text = "Script Type:"; this.scriptcompilerlabel.TextAlign = System.Drawing.ContentAlignment.TopRight; // + // readonlyresources + // + this.readonlyresources.AutoSize = true; + this.readonlyresources.Location = new System.Drawing.Point(14, 68); + this.readonlyresources.Name = "readonlyresources"; + this.readonlyresources.Size = new System.Drawing.Size(210, 17); + this.readonlyresources.TabIndex = 21; + this.readonlyresources.Text = "Open map resources in read-only mode"; + this.tooltip.SetToolTip(this.readonlyresources, resources.GetString("readonlyresources.ToolTip")); + this.readonlyresources.UseVisualStyleBackColor = true; + // // OpenMapOptionsForm // this.AcceptButton = this.apply; this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.CancelButton = this.cancel; - this.ClientSize = new System.Drawing.Size(420, 559); + this.ClientSize = new System.Drawing.Size(420, 579); this.Controls.Add(this.scriptcompiler); this.Controls.Add(this.scriptcompilerlabel); this.Controls.Add(this.mapslist); @@ -251,6 +266,8 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.ComboBox scriptcompiler; private System.Windows.Forms.Label scriptcompilerlabel; private System.Windows.Forms.CheckBox longtexturenames; + private System.Windows.Forms.CheckBox readonlyresources; + private System.Windows.Forms.ToolTip tooltip; } diff --git a/Source/Core/Windows/OpenMapOptionsForm.cs b/Source/Core/Windows/OpenMapOptionsForm.cs index 0a9b8960..36c66523 100644 --- a/Source/Core/Windows/OpenMapOptionsForm.cs +++ b/Source/Core/Windows/OpenMapOptionsForm.cs @@ -392,6 +392,9 @@ namespace CodeImp.DoomBuilder.Windows // Update long texture names checkbox (mxd) longtexturenames.Enabled = cfg.ReadSetting("longtexturenames", false); longtexturenames.Checked = (longtexturenames.Enabled && options != null && options.UseLongTextureNames); + + // Update resource usage + readonlyresources.Checked = (options != null && options.UseResourcesInReadonlyMode); } // OK clicked @@ -480,6 +483,9 @@ namespace CodeImp.DoomBuilder.Windows //mxd. Use long texture names? if(longtexturenames.Enabled) options.UseLongTextureNames = longtexturenames.Checked; + //mxd. Resource usage + options.UseResourcesInReadonlyMode = readonlyresources.Checked; + // Hide window wadfile.Dispose(); this.DialogResult = DialogResult.OK; diff --git a/Source/Core/Windows/OpenMapOptionsForm.resx b/Source/Core/Windows/OpenMapOptionsForm.resx index cc710259..e966d544 100644 --- a/Source/Core/Windows/OpenMapOptionsForm.resx +++ b/Source/Core/Windows/OpenMapOptionsForm.resx @@ -135,4 +135,13 @@ Drag items to change order (lower items override higher items). Use the context menu to cut, copy, paste or remove items. Grayed items are loaded according to the game configuration.</value> </data> + <metadata name="tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <data name="readonlyresources.ToolTip" xml:space="preserve"> + <value>When enabled, map resources will be loaded in read-only mode, +which allows to edit them in an external application while the map +is opened. You won't be able to edit resources in the Script Editor. +</value> + </data> </root> \ No newline at end of file diff --git a/Source/Core/Windows/ScriptEditorForm.Designer.cs b/Source/Core/Windows/ScriptEditorForm.Designer.cs index b5537ae3..16a673e5 100644 --- a/Source/Core/Windows/ScriptEditorForm.Designer.cs +++ b/Source/Core/Windows/ScriptEditorForm.Designer.cs @@ -50,7 +50,6 @@ namespace CodeImp.DoomBuilder.Windows this.Controls.Add(this.editor); this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.KeyPreview = true; this.Name = "ScriptEditorForm"; this.Opacity = 0; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; diff --git a/Source/Core/Windows/ScriptEditorForm.cs b/Source/Core/Windows/ScriptEditorForm.cs index 274479c2..67cd840e 100644 --- a/Source/Core/Windows/ScriptEditorForm.cs +++ b/Source/Core/Windows/ScriptEditorForm.cs @@ -17,7 +17,6 @@ #region ================== Namespaces using System; -using System.Drawing; using System.Windows.Forms; using CodeImp.DoomBuilder.Controls; @@ -46,7 +45,7 @@ namespace CodeImp.DoomBuilder.Windows public ScriptEditorForm() { InitializeComponent(); - editor.Initialize(); + editor.Initialize(this); } #endregion @@ -72,6 +71,12 @@ namespace CodeImp.DoomBuilder.Windows base.Close(); } + //mxd + internal void OnReloadResources() + { + editor.OnReloadResources(); + } + #endregion #region ================== Events diff --git a/Source/Core/Windows/ScriptEditorForm.resx b/Source/Core/Windows/ScriptEditorForm.resx index 70e4475d..b5a99d71 100644 --- a/Source/Core/Windows/ScriptEditorForm.resx +++ b/Source/Core/Windows/ScriptEditorForm.resx @@ -120,26 +120,138 @@ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACQWzEBkFsxRJBbMWiQWzGBkFsxnpBbMbqQWzHYkFsx9ZVhOf+aaUH/o3RP/62CX/+QWzG4kFsxCgAA - AAAAAAAAlF8zKriQbf/WuqP/38az/+fUw//u39P/9eri//v07//9+vb///79//vr3//77+b/wZ2A/5Rf - MzAAAAAAAAAAAJlkNknHpIX////////////////////////+/P/++/f//vfx//728f/krob/+ujb/86v - lf+ZZDZLAAAAAAAAAACeaTkdnmk57bSFWf/ZpXv/2J5v/9ebav/YlmP/1pJd/9SPWf/Tjlf/4p1p//rj - 0f/Yu6L/nmk5YQAAAAAAAAAApG88AaRvPHLVroz//fDl//bGof/2zqz/+NS0//bYu//127//997D//rk - zP/99ez/4s66/6RvPH0AAAAAAAAAAAAAAACqdUAGt4ZW//7+/f/ozrT/z7ae/861n//OtZ//zreg/9a7 - pP/63MP//eve/+zczf+qdUCgAAAAAAAAAAAAAAAAsXtDA7mGUv/+/Pn/99q9/+3Rtf/u0rf/8tS8//LV - u//z173/+dzC//vn1P/17eL/sXtDywAAAAAAAAAAAAAAAAAAAAC5hUv//vv3/+/Tuf/QuaD/z7ig/8+3 - of/PuKD/z7ig//HWvP/74sv//Pn1/7eCR/cAAAAAAAAAAAAAAAAAAAAAvYhL8/z28P/538f/8dW3//LV - uP/y1Lr/8ta8//LWu//43MP/++DJ///8+v/BjVP/AAAAAAAAAAAAAAAAAAAAAMSOTrr159j/+eTR/9K4 - n//SuZ//07mh/9O7o//Tu6P/8ta+//vhyP///fv/yJRX/8SOTgEAAAAAAAAAAAAAAADKlFKJ8NnB//vt - 4f/42b//+NvB//fcw//43sX/99/H//ffyv/65dD///79/8uPWv/KlFLjypRSEgAAAAAAAAAA0JpVae3Q - sv//9vD/6NG7/8+7qP/Pu6v/z76u/8/AsP/Xx7j//Orb/////f/SnXH/7tnB/9CaVc0AAAAAAAAAANWf - WFPryqX///37//vn0//66NX/+ufY//vr3f/77uD//PDj//zw5P//////4KBw///7+f/fuIf/AAAAAAAA - AADapFtE68aa///////87+L//fDn//3x6//99e7//fjx//369////Pr///////779//02sD/2qRb1gAA - AAAAAAAA3qhdLurAjP///////////////////////fn0//vz6v/469n/+ObT//Xfxv/py6b/3qhd3N6o - XSEAAAAAAAAAAOKsXwvirF+Z6ryB/+i3d//msm3/5LBo/+KsX+HirF/K4qxfqOKsX6PirF+J4qxfbuKs - XxYAAAAAAAOsQQADrEEAA6xBAAOsQQADrEGAA6xBgAOsQcADrEHAA6xBwAGsQcAArEHAAKxBwACsQcAA - rEHAAKxBwAGsQQ== + AAABAAMAICAAAAEAIACoEAAANgAAABgYAAABACAAiAkAAN4QAAAQEAAAAQAgAGgEAABmGgAAKAAAACAA + AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAQAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAEAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADEAAABCAAAAQwAA + AEMAAABDAAAAQwAAAEMAAABDAAAAQwAAAEMAAABDAAAAQwAAAEMAAABDAAAAQwAAAEMAAABDAAAAQwAA + AEMAAABDAAAAQwAAAEMAAABDAAAAQwAAAEIAAAAxAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAWsLCu86+v + rf+urqv/ra2r/62tq/+trav/ra2r/62tq/+trav/ra2r/62tq/+trav/ra2r/62tq/+trav/rq6s/6+v + rP+urqz/ra2r/62tq/+trav/ra2r/62tq/+urqv/r6+t/7CwrvMAAAAWAAAABgAAAAsAAAAGAAAAAAAA + ABawsK3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////srGv/wAAABcAAAASAAAAIgAA + ABEAAAAAAAAAFq6uq/////////////////////////////////////////////////////////////// + ///+/v7///////////9LSUb///////////////////////////////////////////+4tbD/AAAAHgAA + ACVvbWv/AAAAFgAAAAAAAAAWra2r///////9/f3///////////////////////////////////////// + /////////v7+//z8/P/+/v7//////0JBP//g393///////////+jutL/Lmad/wAsef8vZp7/rMTb/87D + tv8AAAAzLCkmXmFdXP8AAAASAAAAAAAAABatrav///////39/f//////aGho/8HBwf//////k5OT/8HB + wf+/v7///////5GRkf/+/v7//Pz8//39/f//////NjIx/z84NP/p8Pf/Bk2P/wA0gv8AdMr/AECc/wB0 + yv8AOIX/DkyL/wADBk9aUEf/VFBO/wAAAAkAAAAAAAAAFq2tq////////Pz8//////////////////// + //////////////////////////////39/f/6+vr/+/v7//////++urf/PVBi/wA3hf8GfdH/BlGr/zWa + 4v8ARaL/NZri/whNpf8Kfc//AEGL/y1CWPJAOzdqAAAAAgAAAAAAAAAWra2r///////6+vr//f39/5OT + k//BwcL/wMDA/7+/v///////ampq/8LCwv++vr7//Pz8//n5+f/5+fn//v79//////8JTpH/Cly1/zOa + 4v8NWbP/TKzs/wBHqP9MrO3/Dlat/zSb4/8QVKX/AEOO8wAAABYAAAAAAAAAAAAAABatrav///////n5 + +f/8/Pz//////////////////v7////////////////////////7+/v/+Pj5//n5+f/9/fv//////wAu + ev8kdM7/XrTu/yFqv/90xfn/AEqv/3TF+f8hZrr/XLPv/yhquf8AQYr/AAAAIwAAAA8AAAAGAAAAFq2t + q///////+Pj3//v7+v+Tk5H/v7++/729vP/+/v3/kpKR/76+vf/+/v3/kJCP//v7+v/4+Pf/+vr5//// + ////////AC98/0mP3P+Mzvv/RIXO/6Xi//8ATrn/peL//0SDy/+Kz/3/S4bK/wA+iP8AAAA8AAAAJwAA + AA0AAAAWra2r///////39/b/+vr5//////////7//f38//7+/f////7//f78//z8+//9/fz/+fn4//j4 + 9//9/fz/Z2Ri/6qgmf8ANID/bqrp/6Da//8tes7/FGzI/wBVwf8UcM//LHrN/6ji//9uodv/ADyJ/2hf + WLZxbmr/AAAACgAAABatrav///////b19f/6+fn/ZWZm/7y8vP/8+vv/kJCQ/7y8vP+6urr/+/r6/46O + jv/49/f/9/b2//v6+v++u7v/WE5E/wA2gf8AZNv/EHDU/1Ka4v9vsOz/brTv/2+y7/9SmeH/GHHP/wBV + xP8APon/bGJZ/15bWGoAAAACAAAAFq2tq///////9PPz//b19f/6+Pj/+fj4//n39//6+fn/+vn5//j3 + 9//39vb/+fj4//f29v/29fX/9/b2///+/f//////ADOA/1qv9/9tvfb/VLHy/0qs8f9KrPH/Sqzx/1Sx + 8v9nuvb/YrHy/wBDjv8AAAApAAAACQAAAAAAAAAWra2r///////z8vL/8/Ly//X09P/49/f/+/r6//z7 + +//7+vr/9/b2//f29v/7+vr//Pv7//r5+f/49/f///38/7+5tP8ANG3/EnTD/yaS4f8mkd3/J5Dc/yiQ + 3P8okNz/J5He/yiU4v8Xecb/CEB5/zcyL3oAAAASAAAAAAAAABatrav///////Lx8f/y8fH/9vX1/9zd + 2/+SkpL/hISE/4CAgP/6+fn/+vn5/4CAgP+EhIT/kpKS/+bl5f//////PTo3/0VAPv8eXJn/AEmX/wBs + v/8CeM7/A3nO/wJ5zv8AbsH/AFCc/wA9htlZUk7/V1RQ/wAAABYAAAAAAAAAFq2tq///////8fDv//Lx + 8P/49/b/kpKS/6ytqv/HxsX/goKD//r59//6+ff/goOD/8fGxf+srar/lJSV//////9KR0X///////r3 + 9v96nb//EFKU/wA7h/8APon/AD6K/xtcnP9ohqP/AAAAFgAAABFmYmD/AAAAEQAAAAAAAAAWra2r//// + ///v7+7/8PDv//j49/+FhYb/ubi2/5+gn//Pzc7/9fX0//X19P/Pzc7/oKCf/7m4tv+Hh4f//////1JQ + Tv/6+vn/+ff0/////f9COTL/pZuS/46Ee/9gVU7/IhkV/9LKv/8AAAAWAAAABnNwbf8AAAAGAAAAAAAA + ABatrav//////+7u7f/x8fD/8vHx/4qKiv+4uLb/jo6P//Lw8f/x8fD/8fHw//Lw8f+Ki4v/uLi2/4iI + iP/29fX/9/f2//Ly8f/x8O//+fj2/4J+fv8xLSz/Kign/x8dHf+KiIn/v724/wAAABYAAAAAAAAAAAAA + AAAAAAAAAAAAFq2tq///////7+/u//b29P/Ix8f/kpKR/7++vP+Ghob/9vb1/+/v7v/v7+7/9vb1/4aG + hv+/vrz/kpKR/8jHx//39/b/8PDv/+7u7f/w8O//9vf1//z8+//+/v3//f38//////+ysrD/AAAAFgAA + AAAAAAAAAAAAAAAAAAAAAAAWra2r///////y8vH/goKC/5WUlP+1tLL/t7e2/4yMi//09PP/7e7s/+3u + 7P/09PP/jIyL/7e3tv+1tLL/lZSU/4KCg//z8/H/7e3s/+zt6//u7u3/7u/t/+7v7f/u7u3//////66u + rP8AAAAWAAAAAAAAAAAAAAAAAAAAAAAAABatrav///////Lx8f+FhYX/xMLB/66tq/+MjI3/z8/O//Hw + 8P/s6+v/7Ovr//Hw8P/X1tb/jIyN/6mopv/EwsH/hYWG//Py8v/s6+v/6+rq/+vq6v/r6ur/6unp/+ro + 6f//////ra2r/wAAABYAAAAAAAAAAAAAAAAAAAAAAAAAFq2tq///////8O7u/4KCg/+hoKD/xcTD/5+e + nP+MjY3/8fDw/+vq6v/r6ur/8fDw/4yMjf+bmpn/xsTE/6GgoP+CgoP/8O/v/+rp6f/p6Oj/6ejo/+no + 6P/o5+f/6Ofn//////+trav/AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAWra2r///////r6ur/6uno/729 + vP+ioqH/qaek/4uKiv/x8PD/6+rq/+vq6v/x8PD/h4eI/6mnpP+ioqL/vb28/+rp6P/19fT///////// + /////////////////////////////66uq/8AAAAWAAAAAAAAAAAAAAAAAAAAAAAAABatrqv//////+jm + 5f/r6un/7Orp/5mZmP+xsK7/iYmJ//Lx8P/r6un/6+ro//Lx7/+Liov/sbCt/5iYmP/x8O//6uno//// + ///Ly8r/p6ek/6enpf+np6X/p6ek/6Wlov//////r6+t/wAAABAAAAAAAAAAAAAAAAAAAAAAAAAAFq6u + q///////5uTj/+no5//o5+b/hoaG/7+7uv+Vk5L/wcLB/+zr6v/s6+r/yMjH/5WTkv++urn/hYaG/+/t + 7P/n5uX//////6enpP//////+/z8//b19f/v7u3//////+np6f+vr63qAAAABQAAAAAAAAAAAAAAAAAA + AAAAAAAWrq6r///////k4+L/5+bl/+zr6v+RkZH/xMHA/9LQzv+EhIX/7u3s/+7t7P+EhIT/0s/O/8PB + wP+QkZH/7Ovp/+bl4///////p6el//v8/P/z8vL/6+rp///////n5+f/ra2q5QAAAAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABaurqv//////+Pi4f/l5OP/6Ofm/9LS0f+RkZH/hYWG/4KDg//s6+r/7Ovq/4KD + g/+FhYb/kZGR/9LS0f/o5+b/5OPi//////+np6X/9vX1/+vq6f//////5ubm/6ysqeUAAAAFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAFq6uq///////4uHg/+Pi4f/k4+L/5+bl/+ro5//r6uj/6ujn/+bl + 5P/m5eT/6ujn/+vq6P/q6Of/5+bl/+Tj4v/i4eD//////6enpP/v7u3//////+bm5v+trarmAAAABQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVrq6s///////g397/4eDf/+Hg3//h4N//4uHg/+Lh + 4P/i4eD/4eDf/+Hg3//i4eD/4uHg/+Lh4P/h4N//4eDf/+Df3v//////paWj///////n5+f/p6ekrAAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2vr63///////////////////////// + ////////////////////////////////////////////////////////////////////////6enp/6en + pa4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABK+vrbSwsK3/rq6s/66u + q/+urqv/rq6r/66uq/+urqv/rq6r/66uq/+urqv/rq6r/66uq/+urqv/rq6r/66uq/+trqv/rq6r/6+v + rf+srKqwAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAADwAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAB8AAAA/AAAAfwAAAP8AAAH/AAAD/ygA + AAAYAAAAMAAAAAEAIAAAAAAAYAkAAAAAAAAAAAAAAAAAAAAAAABUVFQLAAAAHAAAACEAAAAhAAAAIQAA + ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAHC85 + QwsAAAAAAAAAAAAAAAAWFhUyV1dWmVdXVaBWVlWhVlZVoVZWVaFWVlWhVlZVoVZWVaFWVlWhVlZVoVZW + VaFXV1ahV1dWoVZWVaFWVlWhVlZVoVZWVaFXV1WhV1dWmRUVFTI/VWwDMURWBAAAAAAsLCtPzc3L/erq + 6v7q6ur/6urq/urq6v7q6ur/6urq/urq6v7q6ur/6urq/urq6v/q6ur+6urq/urq6v7q6ur/6urq/urq + 6v7q6ur/zs3M/SwsK1ANEhcSBwsOFS9FXAMrKypQ1tbV//7+/v////////////////////////////// + /////////v7+//7+/v/R0dD/oJ+d//39/f/5+/z/2ePt/8LN3//T3ur/09TT/y8uLFojIiFmNTQziixD + WwUrKypQ1tbV/v39/f7s7Oz/ycnJ/vf39/7Ozs7/39/f/vb29v7V1dX//Pz8/v39/f/Ozc3+ZWJg/trc + 3v52mr//NHGu/gVDlP4ncbP/YYKo/hsiKnBIQz7CLSsqhixFXgMrKypQ1tbV/vz8/P719fX/5OTk/vv7 + +/7n5+f/7+/v/vr6+v7q6ur/+/v7/vv7+//m5eT+bHB1/jtejv4FZ7j/Fm2+/glWr/4ffsz/CFyt/gJB + ft47RE7bOUZSSQAAAAArKypQ1tbV//v7+//p6en/v7+//9DQ0P/b29v/x8fH/8DAwP/Z2dn/+vr6//n5 + +f/+/v3/gqLF/w5br/8yj9n/NIfS/xViu/9FnOD/KH3L/yBruf8AMWm/FiUzDjRZewIrKypQ1tbV/vr6 + +f7v7+7/09PT/t7e3f7w8PD/09PS/vb29f7U1NT/+fn5/vn5+P/+/v3+f5a8/ihsvv5krun/X6Xh/iNt + xf52u+3/Uprc/keKzv4AL2bLAAAAJRQjMQ0rKypQ1tbV/vn5+P709PP/6eno/u3t7P739/b/6Ojn/vj4 + 9/7n5+b/+Pj3/vv7+v+ZlZP+X3WY/kuHzP6AwPL/NYPR/g5gxP42iNf/aazl/nSq4P4TP3flUUxIsBUU + EzorKypQ1tbV//j39//d3Nz/qqqq/+/t7v+zsrL/ysrK/+7t7f+8vLz/9/b2//n4+P+7t7X/QFd5/xBm + yf8yit//XKfp/2Wx7/9hrO3/P5Hf/x1x0f8UQXjxS0ZCjT1bdxUrKypQ1tbV/vb19f719PT/9/b2/vn4 + +P77+vr/+Pf3/vf29v76+fn/+Pf3/vf29v/29fP+b4en/ih5w/5Gper/Op/m/jid5v46nuf/QqPp/j+Z + 3/4JN2jTDQwLLy5MagMrKypQ1tbV//X09P/z8vL/7Ozr/7q5uf+hoaH/zMvL//n4+P+fn5//p6am/9va + 2v/W1dT/SEtQ/yFYjf8JYbH/CnnM/wt+0f8LfM//CWu6/wZRm+lHTVT2JyUjeTRSbgUrKypQ1tbV/vTz + 8v7z8vH/w8LC/qenpf6zsrL/x8bG/vj39v6fn5//tra0/piYmP/S0dD+pKOi/vr49/57m7n/Ik+C/iVQ + hv4ZRXr/T3GS/iAlKlAtMzhKQEJFhkNgegMrKypQ1tbV/vLy8f7x8fD/vr29/qyrqv6pqan/6ejo/vLy + 8f7NzMz/pqal/pOTk//k5OP+zczL/vX08v7V09H/Zl9b/l9ZVP5FPjv/j4qF/jIwLlBsiaIiaH+TQQAA + AAArKypQ1tbV/vLy8v7s7Or/sbCw/rGxr/6jo6P/8vHx/u/v7v7Z2dj/oqGg/puamf/c29v+8/Py/u/u + 7f7s6+r/0dDP/snIx/7MzMv/y8rJ/i0tLFAAAAAAAAAAAAAAAAArKypQ1tbV//X19P+Kior/qqmn/66t + rP+ysrH/8PDv/+zt6//e3t3/paWk/7Cwrv+ZmJj/u7q6/+7u7f/s7Ov/7e3s/+3t7P/x8fH/1tbV/ysr + KlAAAAAAAAAAAAAAAAArKypQ1tbV/vTz8/6Pjo//tbSz/p6dnf6+vr7/7u3t/uvq6v7h4OD/oqGi/q6t + rP+mpaX+urq6/uzr6/7q6en/6ejo/uno6P7u7e3/1dXU/isrKlAAAAAAAAAAAAAAAAArKypQ1tbV/vDv + 7/7Jycj/sLCv/qemo/6kpKT/7ezs/urp6f7W1tb/lpaV/qmoqP+8vLv+4eHg/vj39/75+fn/+fn5/vn5 + +f76+vr/1tbU/isrKlAAAAAAAAAAAAAAAAArKypQ1tbV/+3s6//q6ej/v769/6yrqf+ioqH/6Ofm/+vq + 6P/R0M//oZ+e/5ubmv/u7ez/9PPz/9HR0P+9vbv/u7u6/7m5t//Ly8n/1NTT/FBPT0gAAAAAAAAAAAAA + AAArKypQ1tbV/uvq6f7o5+b/urq5/rSxsP6vrqz/x8fH/uzr6v6pqKj/ure2/piYl//r6uj+8vLx/ry8 + u/77/Pz/8/Py/vX09P7p6ej7xMTCtMLCwB8AAAAAAAAAAAAAAAArKypQ1tbV/urp6P7m5eT/1dTT/qam + pf6SkpL/t7e3/uzr6v6IiIj/mpqa/ri4uP/n5uX+8fHw/ry8u/709PT/8/Ly/u/v7/6+vry/zs7MHwAA + AAAAAAAAAAAAAAAAAAArKypQ1tbV/+no5//j4uH/5OPi/+fl5P/o5+b/5uXk/+Tj4v/o5uX/6Ofl/+bl + 5P/i4eD/8O/v/7y8uv/09PP/5+fn9L6+vLzT09ICAAAAAAAAAAAAAAAAAAAAAAAAAAArKytM1tbV/vPy + 8v7w7+//7+/u/vDv7/7w8O//8O/v/u/v7v7w8O//8O/v/vDv7//v7+7+9/b2/t3d3P7o6Oj1wcHAls3N + zBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWlZQ2ubm34sLCwP7CwsD/wsK//sLCv/7CwsD/wsK//sLC + v/7CwsD/wsK//sLCwP/Cwr/+wcK//sLCwf6+vr2ezs7NFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAcAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA + BwAAAAcAAAAHAAAABwAAAAcAAAAHAAAADwAAAB8AAAA/AAAAfwAoAAAAEAAAACAAAAABACAAAAAAAEAE + AAAAAAAAAAAAAAAAAAAAAAAAJSUlFQAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAA + ACwAAAAsAAAALBUZHhUAAAAAAAAAAFhYVofW1tX/1tbV/9bW1f/W1tX/1tbV/9bW1f/W1tX/1tbV/9bW + 1f/W1tX/1tbV/9bW1f9YWFeHERkfES1BVQVWVlWK/v7+///////////////////////+/v7//f39/6Ki + oP/39/b/6O3z/4ukxf+2yt3/YV5Zkz88O6AdLT0KVlZViv39/f/Z2dn/7+/v/9TU1P/v7+//4uLi//v7 + +/+8urn/WWuE/wRTo/8NZLr/D2S1/wZDetNGR0nWLEhjAlZWVYr8/Pz/4uLi/9/f4P/u7u//ysrK/+3t + 7f/4+Pn//v79/w1To/8vhND/MIDP/zuL0/8yg8z/ACFGiipIZAVWVlWK+/v6/+Hh4P/e3t3/4+Pi/+3t + 7P/g4N//+fn4/8PAvv8tZ7D/Z6nl/y580P9Kk9n/erbo/xo2WrwcGxpPVlZVivr5+f/T09P/6unp/9DP + z//p6Oj/3dzc//f29v/Fwb7/Fl+0/0ie5/9cr+//V6rs/ziM3v8bOFzJNUhbHVZWVYr4+Pj/9PPz/9jY + 1/++vr7/+Pf3/76+vv/a2dn/vru5/x1Rgf8TdsX/FYTV/xSC0v8PZrL1O0ZR3SI2SQpWVlWK9/f2//T0 + 8/+fn57/ra2t//f39f+ura3/oKCf/6alpP/7+fj/comg/0xmh/8nQmL/TlRYilBXXYVBW3IFVlZVivb2 + 9v/o5+f/pKSj/7++vv/w8O//vr29/6Skov/r6ur/8PDv/9jX1v+Vk5L/qaio/1xbWooAAAAAAAAAAFZW + VYr4+Pj/mJeX/6mpqP/Qz8//7Ozr/9LR0f+op6b/mJeX/+/v7v/s6+v/7Ozr//X19f9WVlWKAAAAAAAA + AABWVlWK9vX1/7Kysf+rqqn/vr29/+vq6v+9vL3/q6mo/7Kysf/z8/L/9PPz//Pz8//5+fn/VlZVigAA + AAAAAAAAVldVivPy8f/q6Of/o6Kh/7Szs//r6un/trW0/6Oiof/s6+r/3Nzb/9LS0f/MzMr/4+Pi/4eH + hn8AAAAAAAAAAFdXVYrx8PD/6Ofm/66trP+Xl5f/7ezr/5eWlv+traz/5+bl/9PT0v/z8/P/8/Pz/8XF + w7PNzcwBAAAAAAAAAABXV1WK8O/v/+Lh4P/l4+L/5uXj/+Pi4f/m5eP/5ePi/+Hg3//S0tH/9fT0/8PD + waXT09IBAAAAAAAAAAAAAAAAhoaFcdfX1f/W1tX/1tbV/9bW1f/W1tX/1tbV/9bW1f/W1tX/1tbV/8PD + wpgAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD + AAAAAwAAAAMAAAADAAAAAwAAAAcAAAAfAAA= </value> </data> </root> \ No newline at end of file diff --git a/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs b/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs index f138ec09..95e1ee22 100644 --- a/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs +++ b/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs @@ -33,7 +33,7 @@ namespace CodeImp.DoomBuilder.Windows this.casesensitive = new System.Windows.Forms.CheckBox(); this.wordonly = new System.Windows.Forms.CheckBox(); this.replacetext = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); + this.labelreplace = new System.Windows.Forms.Label(); this.findnextbutton = new System.Windows.Forms.Button(); this.replaceallbutton = new System.Windows.Forms.Button(); this.closebutton = new System.Windows.Forms.Button(); @@ -84,14 +84,14 @@ namespace CodeImp.DoomBuilder.Windows this.replacetext.Size = new System.Drawing.Size(152, 20); this.replacetext.TabIndex = 1; // - // label2 + // labelreplace // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(14, 54); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(72, 13); - this.label2.TabIndex = 6; - this.label2.Text = "Replace with:"; + this.labelreplace.AutoSize = true; + this.labelreplace.Location = new System.Drawing.Point(14, 54); + this.labelreplace.Name = "labelreplace"; + this.labelreplace.Size = new System.Drawing.Size(72, 13); + this.labelreplace.TabIndex = 6; + this.labelreplace.Text = "Replace with:"; // // findnextbutton // @@ -157,7 +157,7 @@ namespace CodeImp.DoomBuilder.Windows this.Controls.Add(this.closebutton); this.Controls.Add(this.replaceallbutton); this.Controls.Add(this.findnextbutton); - this.Controls.Add(this.label2); + this.Controls.Add(this.labelreplace); this.Controls.Add(this.replacetext); this.Controls.Add(this.wordonly); this.Controls.Add(this.casesensitive); @@ -184,7 +184,7 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.CheckBox casesensitive; private System.Windows.Forms.CheckBox wordonly; private System.Windows.Forms.TextBox replacetext; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label labelreplace; private System.Windows.Forms.Button findnextbutton; private System.Windows.Forms.Button replaceallbutton; private System.Windows.Forms.Button closebutton; diff --git a/Source/Core/Windows/ScriptFindReplaceForm.cs b/Source/Core/Windows/ScriptFindReplaceForm.cs index 07a3bd55..f2eed58e 100644 --- a/Source/Core/Windows/ScriptFindReplaceForm.cs +++ b/Source/Core/Windows/ScriptFindReplaceForm.cs @@ -28,10 +28,24 @@ namespace CodeImp.DoomBuilder.Windows #region ================== Variables private bool appclose; + private bool canreplace; #endregion #region ================== Properties + + internal bool CanReplace //mxd + { + get { return canreplace; } + set + { + canreplace = value; + labelreplace.Enabled = canreplace; + replacetext.Enabled = canreplace; + replacebutton.Enabled = canreplace; + replaceallbutton.Enabled = canreplace; + } + } #endregion diff --git a/Source/Core/Windows/ScriptFindReplaceForm.resx b/Source/Core/Windows/ScriptFindReplaceForm.resx index d0eedeb9..fcaa9700 100644 --- a/Source/Core/Windows/ScriptFindReplaceForm.resx +++ b/Source/Core/Windows/ScriptFindReplaceForm.resx @@ -126,7 +126,7 @@ <metadata name="replacetext.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <value>True</value> </metadata> - <metadata name="label2.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <metadata name="labelreplace.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <value>True</value> </metadata> </root> \ No newline at end of file diff --git a/Source/Core/Windows/ScriptGoToLineForm.Designer.cs b/Source/Core/Windows/ScriptGoToLineForm.Designer.cs new file mode 100644 index 00000000..13427cde --- /dev/null +++ b/Source/Core/Windows/ScriptGoToLineForm.Designer.cs @@ -0,0 +1,132 @@ +namespace CodeImp.DoomBuilder.Windows +{ + partial class ScriptGoToLineForm + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.label = new System.Windows.Forms.Label(); + this.linenumber = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.cancel = new System.Windows.Forms.Button(); + this.accept = new System.Windows.Forms.Button(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // label + // + this.label.AutoSize = true; + this.label.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.label.Location = new System.Drawing.Point(13, 19); + this.label.Name = "label"; + this.label.Size = new System.Drawing.Size(68, 13); + this.label.TabIndex = 0; + this.label.Text = "Line number:"; + // + // linenumber + // + this.linenumber.AllowDecimal = false; + this.linenumber.AllowExpressions = false; + this.linenumber.AllowNegative = false; + this.linenumber.AllowRelative = false; + this.linenumber.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.linenumber.ButtonStep = 1; + this.linenumber.ButtonStepBig = 10F; + this.linenumber.ButtonStepFloat = 1F; + this.linenumber.ButtonStepSmall = 0.1F; + this.linenumber.ButtonStepsUseModifierKeys = false; + this.linenumber.ButtonStepsWrapAround = false; + this.linenumber.Location = new System.Drawing.Point(87, 14); + this.linenumber.Name = "linenumber"; + this.linenumber.Size = new System.Drawing.Size(186, 24); + this.linenumber.StepValues = null; + this.linenumber.TabIndex = 1; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.panel1.Controls.Add(this.linenumber); + this.panel1.Controls.Add(this.label); + this.panel1.Location = new System.Drawing.Point(-1, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(286, 50); + this.panel1.TabIndex = 2; + // + // 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(185, 58); + this.cancel.Name = "cancel"; + this.cancel.Size = new System.Drawing.Size(94, 26); + this.cancel.TabIndex = 2; + this.cancel.Text = "Cancel"; + this.cancel.UseVisualStyleBackColor = true; + this.cancel.Click += new System.EventHandler(this.cancel_Click); + // + // accept + // + this.accept.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.accept.Location = new System.Drawing.Point(85, 58); + this.accept.Name = "accept"; + this.accept.Size = new System.Drawing.Size(94, 26); + this.accept.TabIndex = 3; + this.accept.Text = "OK"; + this.accept.UseVisualStyleBackColor = true; + this.accept.Click += new System.EventHandler(this.accept_Click); + // + // ScriptGoToLineForm + // + this.AcceptButton = this.accept; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.cancel; + this.ClientSize = new System.Drawing.Size(284, 89); + this.Controls.Add(this.accept); + this.Controls.Add(this.cancel); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ScriptGoToLineForm"; + this.Opacity = 0; + this.Text = "Go To Line"; + this.Shown += new System.EventHandler(this.ScriptGoToLineForm_Shown); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label; + private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox linenumber; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button cancel; + private System.Windows.Forms.Button accept; + } +} \ No newline at end of file diff --git a/Source/Core/Windows/ScriptGoToLineForm.cs b/Source/Core/Windows/ScriptGoToLineForm.cs new file mode 100644 index 00000000..136050d0 --- /dev/null +++ b/Source/Core/Windows/ScriptGoToLineForm.cs @@ -0,0 +1,32 @@ +using System; +using System.Windows.Forms; + +namespace CodeImp.DoomBuilder.Windows +{ + public partial class ScriptGoToLineForm : DelayedForm + { + public int LineNumber { get { return linenumber.GetResult(-1); } set { linenumber.Text = value.ToString(); } } + + public ScriptGoToLineForm() + { + InitializeComponent(); + } + + private void accept_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + this.Close(); + } + + private void cancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void ScriptGoToLineForm_Shown(object sender, EventArgs e) + { + linenumber.Focus(); + } + } +} diff --git a/Source/Core/Windows/ScriptGoToLineForm.resx b/Source/Core/Windows/ScriptGoToLineForm.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/Source/Core/Windows/ScriptGoToLineForm.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/Source/Core/ZDoom/DecorateParser.cs b/Source/Core/ZDoom/DecorateParser.cs index c5e3a9a9..9e52008c 100644 --- a/Source/Core/ZDoom/DecorateParser.cs +++ b/Source/Core/ZDoom/DecorateParser.cs @@ -188,7 +188,7 @@ namespace CodeImp.DoomBuilder.ZDoom } //mxd. Add to current text resource - if(!textresources[textresourcepath].Entries.Contains(actor.ClassName)) textresources[textresourcepath].Entries.Add(actor.ClassName); + if(!scriptresources[textresourcepath].Entries.Contains(actor.ClassName)) scriptresources[textresourcepath].Entries.Add(actor.ClassName); } break; diff --git a/Source/Core/ZDoom/ZDTextParser.cs b/Source/Core/ZDoom/ZDTextParser.cs index 168c2d15..66c56310 100644 --- a/Source/Core/ZDoom/ZDTextParser.cs +++ b/Source/Core/ZDoom/ZDTextParser.cs @@ -24,6 +24,7 @@ using System.IO; using CodeImp.DoomBuilder.Compilers; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Data.Scripting; using CodeImp.DoomBuilder.Rendering; #endregion @@ -65,7 +66,7 @@ namespace CodeImp.DoomBuilder.ZDoom //mxd. Text lumps protected string textresourcepath; - protected readonly Dictionary<string, TextResource> textresources; + protected readonly Dictionary<string, ScriptResource> scriptresources; protected readonly HashSet<string> untrackedtextresources; #endregion @@ -79,7 +80,7 @@ namespace CodeImp.DoomBuilder.ZDoom public string ErrorSource { get { return errorsource; } } public bool HasError { get { return (errordesc != null); } } internal abstract ScriptType ScriptType { get; } //mxd - internal Dictionary<string, TextResource> TextResources { get { return textresources; } } //mxd + internal Dictionary<string, ScriptResource> ScriptResources { get { return scriptresources; } } //mxd #endregion @@ -90,7 +91,7 @@ namespace CodeImp.DoomBuilder.ZDoom { // Initialize errordesc = null; - textresources = new Dictionary<string, TextResource>(StringComparer.OrdinalIgnoreCase); //mxd + scriptresources = new Dictionary<string, ScriptResource>(StringComparer.OrdinalIgnoreCase); //mxd untrackedtextresources = new HashSet<string>(StringComparer.OrdinalIgnoreCase); //mxd skipregions = true; //mxd } @@ -148,23 +149,15 @@ namespace CodeImp.DoomBuilder.ZDoom } string path = Path.Combine(parsedata.SourceLocation.location, parsedata.Filename + (parsedata.LumpIndex != -1 ? "#" + parsedata.LumpIndex : "")); - if(textresources.ContainsKey(path) || untrackedtextresources.Contains(path)) + if(scriptresources.ContainsKey(path) || untrackedtextresources.Contains(path)) return false; //mxd. Create TextResource for this file if(parsedata.Trackable) { textresourcepath = path; - TextResource res = new TextResource - { - Resource = parsedata.Source, - Entries = new HashSet<string>(StringComparer.OrdinalIgnoreCase), - Filename = parsedata.Filename.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), - LumpIndex = parsedata.LumpIndex, - ScriptType = this.ScriptType, - }; - - textresources.Add(textresourcepath, res); + ScriptResource res = new ScriptResource(parsedata, this.ScriptType); + scriptresources.Add(textresourcepath, res); } // Track the untrackable! else