diff --git a/BizHawk.MultiClient/tools/LuaWriter.Designer.cs b/BizHawk.MultiClient/tools/LuaWriter.Designer.cs index 608a7f758a..f33672451e 100644 --- a/BizHawk.MultiClient/tools/LuaWriter.Designer.cs +++ b/BizHawk.MultiClient/tools/LuaWriter.Designer.cs @@ -29,40 +29,146 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - this.LuaText = new BizHawk.MultiClient.LuaWriterBox(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LuaWriter)); this.timer = new System.Windows.Forms.Timer(this.components); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MessageLabel = new System.Windows.Forms.Label(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.configToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.syntaxHighlightingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LuaText = new BizHawk.MultiClient.LuaWriterBox(); + this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // - // LuaText - // - this.LuaText.AcceptsTab = true; - this.LuaText.Location = new System.Drawing.Point(12, 12); - this.LuaText.Name = "LuaText"; - this.LuaText.Size = new System.Drawing.Size(819, 417); - this.LuaText.TabIndex = 0; - this.LuaText.Text = ""; - this.LuaText.WordWrap = false; - this.LuaText.ZoomFactor = 2F; - // // timer // this.timer.Enabled = true; this.timer.Interval = 1000; this.timer.Tick += new System.EventHandler(this.timer_Tick); // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.configToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(843, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(195, 22); + this.saveToolStripMenuItem.Text = "&Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.ShortcutKeyDisplayString = "Alt+F4"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(195, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // MessageLabel + // + this.MessageLabel.AutoSize = true; + this.MessageLabel.Location = new System.Drawing.Point(16, 424); + this.MessageLabel.Name = "MessageLabel"; + this.MessageLabel.Size = new System.Drawing.Size(91, 13); + this.MessageLabel.TabIndex = 2; + this.MessageLabel.Text = " "; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(195, 22); + this.saveAsToolStripMenuItem.Text = "Save &As..."; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); + // + // configToolStripMenuItem + // + this.configToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fontToolStripMenuItem, + this.syntaxHighlightingToolStripMenuItem}); + this.configToolStripMenuItem.Name = "configToolStripMenuItem"; + this.configToolStripMenuItem.Size = new System.Drawing.Size(55, 20); + this.configToolStripMenuItem.Text = "&Config"; + // + // syntaxHighlightingToolStripMenuItem + // + this.syntaxHighlightingToolStripMenuItem.Enabled = false; + this.syntaxHighlightingToolStripMenuItem.Name = "syntaxHighlightingToolStripMenuItem"; + this.syntaxHighlightingToolStripMenuItem.Size = new System.Drawing.Size(178, 22); + this.syntaxHighlightingToolStripMenuItem.Text = "Syntax Highlighting"; + // + // fontToolStripMenuItem + // + this.fontToolStripMenuItem.Enabled = false; + this.fontToolStripMenuItem.Name = "fontToolStripMenuItem"; + this.fontToolStripMenuItem.Size = new System.Drawing.Size(178, 22); + this.fontToolStripMenuItem.Text = "Font"; + // + // LuaText + // + this.LuaText.AcceptsTab = true; + this.LuaText.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.LuaText.EnableAutoDragDrop = true; + this.LuaText.Location = new System.Drawing.Point(24, 27); + this.LuaText.Name = "LuaText"; + this.LuaText.Size = new System.Drawing.Size(819, 392); + this.LuaText.TabIndex = 0; + this.LuaText.Text = ""; + this.LuaText.WordWrap = false; + this.LuaText.ZoomFactor = 2F; + this.LuaText.TextChanged += new System.EventHandler(this.LuaText_TextChanged); + this.LuaText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.LuaText_KeyUp); + // // LuaWriter // this.AllowDrop = true; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(843, 441); + this.Controls.Add(this.MessageLabel); this.Controls.Add(this.LuaText); + this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; this.Name = "LuaWriter"; this.Text = "LuaWriter"; this.Load += new System.EventHandler(this.LuaWriter_Load); this.DragDrop += new System.Windows.Forms.DragEventHandler(this.LuaWriter_DragDrop); this.DragEnter += new System.Windows.Forms.DragEventHandler(this.LuaWriter_DragEnter); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } @@ -70,5 +176,15 @@ private LuaWriterBox LuaText; private System.Windows.Forms.Timer timer; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.Label MessageLabel; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem configToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem syntaxHighlightingToolStripMenuItem; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/tools/LuaWriter.cs b/BizHawk.MultiClient/tools/LuaWriter.cs index 06c868e436..520f1c1af4 100644 --- a/BizHawk.MultiClient/tools/LuaWriter.cs +++ b/BizHawk.MultiClient/tools/LuaWriter.cs @@ -14,16 +14,33 @@ namespace BizHawk.MultiClient public partial class LuaWriter : Form { public string CurrentFile = ""; + + bool changes = false; + bool hasChanged; + public Regex keyWords = new Regex("and|break|do|else|if|end|false|for|function|in|local|nil|not|or|repeat|return|then|true|until|while|elseif"); Regex keyWords = new Regex("and|break|do|else|if|end|false|for|function|in|local|nil|not|or|repeat|return|then|true|until|while|elseif"); char[] Symbols = { '+','-','*','/','%','^','#','=','<','>','(',')','{','}','[',']',';',':',',','.' }; + public LuaWriter() { InitializeComponent(); } private void timer_Tick(object sender, EventArgs e) + { + if (!hasChanged) + { + return; + } + + ProcessText(); + + hasChanged = false; + } + + private void ProcessText() { int selPos = LuaText.SelectionStart; int selChars = LuaText.SelectedText.Length; @@ -32,11 +49,8 @@ namespace BizHawk.MultiClient LuaText.SelectionColor = Color.FromArgb(Global.Config.LuaDefaultTextColor); ColorReservedWords(); - ColorComments(); - ColorStrings(); - ColorSymbols(); LuaText.Select(selPos, selChars); @@ -167,7 +181,7 @@ namespace BizHawk.MultiClient } } } - + private void ColorReservedWords() { foreach (Match keyWordMatch in keyWords.Matches(LuaText.Text)) @@ -195,9 +209,17 @@ namespace BizHawk.MultiClient if (!String.IsNullOrWhiteSpace(CurrentFile)) { LoadCurrentFile(); + ProcessText(); + NoChanges(); } } + private void NoChanges() + { + changes = false; + MessageLabel.Text = CurrentFile; + } + private void LoadCurrentFile() { var file = new FileInfo(CurrentFile); @@ -221,6 +243,8 @@ namespace BizHawk.MultiClient LuaText.Text = luaText.ToString(); } } + + MessageLabel.Text = CurrentFile; } private void LuaWriter_DragEnter(object sender, DragEventArgs e) @@ -238,5 +262,95 @@ namespace BizHawk.MultiClient LoadCurrentFile(); } } + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!String.IsNullOrWhiteSpace(CurrentFile)) + { + SaveScript(); + } + else if (changes) + { + SaveScriptAs(); + MessageLabel.Text = Path.GetFileName(CurrentFile) + " saved."; + } + } + + private void SaveScript() + { + var file = new FileInfo(CurrentFile); + + using (StreamWriter sw = new StreamWriter(CurrentFile)) + { + foreach (string s in LuaText.Lines) + { + sw.WriteLine(s + '\n'); + } + } + + NoChanges(); + } + + private void SaveScriptAs() + { + var file = GetSaveFileFromUser(CurrentFile); + if (file != null) + { + CurrentFile = file.FullName; + SaveScript(); + MessageLabel.Text = Path.GetFileName(CurrentFile) + " saved."; + Global.Config.RecentWatches.Add(file.FullName); + } + } + + public static FileInfo GetSaveFileFromUser(string currentFile) + { + var sfd = new SaveFileDialog(); + if (currentFile.Length > 0) + { + sfd.FileName = Path.GetFileNameWithoutExtension(currentFile); + sfd.InitialDirectory = Path.GetDirectoryName(currentFile); + } + else if (!(Global.Emulator is NullEmulator)) + { + sfd.FileName = PathManager.FilesystemSafeName(Global.Game); + sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, ""); + } + else + { + sfd.FileName = "NULL"; + sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, ""); + } + sfd.Filter = "Watch Files (*.lua)|*.lua|All Files|*.*"; + sfd.RestoreDirectory = true; + Global.Sound.StopSound(); + var result = sfd.ShowDialog(); + Global.Sound.StartSound(); + if (result != DialogResult.OK) + return null; + var file = new FileInfo(sfd.FileName); + return file; + } + + private void LuaText_KeyUp(object sender, KeyEventArgs e) + { + hasChanged = true; + } + + private void Changes() + { + changes = true; + MessageLabel.Text = CurrentFile + " *"; + } + + private void LuaText_TextChanged(object sender, EventArgs e) + { + Changes(); + } + + private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveScriptAs(); + } } } \ No newline at end of file diff --git a/BizHawk.MultiClient/tools/LuaWriter.resx b/BizHawk.MultiClient/tools/LuaWriter.resx index b351ef9fea..1afba62822 100644 --- a/BizHawk.MultiClient/tools/LuaWriter.resx +++ b/BizHawk.MultiClient/tools/LuaWriter.resx @@ -120,4 +120,174 @@ 17, 17 + + 97, 17 + + + + + AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA/AAAAPQAAAD0AAAA9AAAAPQAA + AD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAA + AD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPwAA + ADQAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2FhYb7R0dH/x8fH+8PD + w/vCwsL7wsLC+7+/v/u/v7/7vr6++7y8vPu7u7v7u7u7+7i4uPu2trb7tra2+7W1tfu1tbX7sbGx+7Cw + sPuvr6/7r6+v+66urvutra37ra2t+6mpqfuoqKj7p6en+6enp/umpqb7paWl+6WlpfuhoaH7oKCg+6Cg + oPufn5/7oKCg/ZiYmP8TExNVAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+7u7v/u7u7/7u7u/+7u7v/u7u7/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/6enp/+np6f/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+np6f9XV1elAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/u7u7/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li + 4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Pj + 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn//Dw8P9VVVWlAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/w8PD/4+Pj/+Pj4//j4+P/4+Pj/9ra2v/j4+P/4+Pj/+Pj + 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj + 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn//Ly8v9VVVWlAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/w8PD/AAAA/+Pj4/8AAAD/4+Pj/9ra + 2v/j4+P/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM + TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/4+Pj/+Pj4//j4+P/5+fn//Pz + 8/9YWFilAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/y8vL/5OTk/+fn + 5//n5+f/5+fn/9ra2v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn + 5//n5+f/6Ojo//X19f9ZWVmlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/y8vL/AAAA/+fn5/8AAAD/5+fn/9ra2v/n5+f//wAA//8AAP//AAD//wAA//8AAP//AAD/5+fn/0xM + TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM + TP9MTEz/5+fn/+fn5//n5+f/6Ojo//X19f9aWlqlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/z8/P/5eXl/+jo6P/o6Oj/6Ojo/9ra2v/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//n5+f9cXFylAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/y8vL/AAAA/+jo6P8AAAD/6Ojo/9ra2v/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//Dw8P/19fX/+/v7//39/f/+/v7//v7+//z8/P/4+Pj/8/Pz/+rq + 6v/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//n5+f9eXl6lAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/z8/P/6enp/+np6f/p6en/6enp/9ra + 2v/p6en/6enp/+np6f/p6en/6enp/+np6f/w8PD/+vr6//////////////////////////////////// + //////////////39/f/19fX/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp//v7 + +/9fX1+lAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/z8/P/AAAA/+np + 6f8AAAD/6enp/9ra2v/p6en/TExM/0xMTP9MTEz/TExM/6ioqP///////////+7e3v+4dHT/lzIy/4gT + E/+GDQ3/hg0N/48hIf+pVFT/2bS0////////////19fX/2tra//p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/6enp//z8/P9hYWGlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/19fX/6+vr/+zs7P/s7Oz/7Ozs/9ra2v/s7Oz/7Ozs/+zs7P/s7Oz/9vb2////////////uXR0/34A + AP98AAD/fgAA/38AAP9/AAD/fwAA/38AAP98AAD/fAAA/5w8PP/mz8////////39/f/v7+//7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs//z8/P9jY2OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/19fX/AAAA/+zs7P8AAAD/7Ozs/9ra2v/s7Oz/TExM/0xMTP+lpaX///////// + //+dQUH/ewAA/34AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP9/AAD/fwAA/30AAP92AAD/3bu7//// + ///W1tb/Xl5e/0xMTP9MTEz/7Ozs/+zs7P/s7Oz/7Ozs//z8/P9jY2OlAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/39/f/7u7u/+7u7v/u7u7/7u7u/9ra2v/u7u7/7u7u//Ly + 8v///////////6NISP95AAD/fwAA/38AAP9+AAD/fQAA/34AAP98AAD/fAAA/4EAAP98AAD/egAA/30A + AP97AAD/cwAA/+3b2///////+vr6/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u//z8/P9mZmalAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/39/f/AAAA//Ly8v8AAAD/8vLy/9ra + 2v/y8vL//wAA///Dw///////yZOT/3gAAP+3b2//y5eX/82cnP/Onp7/lzAw/7t4eP/lysr/zJqa/5Q1 + Nf+YMDD/3bu7/9ixsf/IkpL/v4KC/4kUFP/9+/v//////2dnZ/9MTEz/8vLy//Ly8v/y8vL/8vLy//z8 + /P9mZmalAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/39/f/8vLy//Ly + 8v/y8vL/8vLy/9ra2v/y8vL/9PT0///////48fH/egAA/4AEBP//////06en/8GFhf/BhYX/u3h4//// + //+2cHD/+PDw/9/Bwf/mzc3/6NLS/5s/P///////1ays/3kAAP/OnZ3///////r6+v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//z8/P9nZ2elAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/5+fn/AAAA//Pz8/8AAAD/8/Pz/9ra2v/z8/P/+Pj4///////Tpqb/ewAA/4oWFv/y5eX/hw8P/38A + AP9+AAD/rF1d/+/f3/96AAD/qVNT/9u2tv+zaWn/37+//7l3d//p0tL/smdn/3wAAP+XMDD///////39 + /f/z8/P/8/Pz//Pz8//z8/P/8/Pz//z8/P9paWmlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/5+fn/9fX1//X19f/19fX/9fX1/9ra2v/19fX/+/v7//////+xZGT/ewAA/4sY + GP/y5eX/mDEx/38AAP9/AAD/sGFh//Hj4/+AAAD/qllZ/9iysv+ZNTX/und3/61bW//27Oz/wIKC/30A + AP9+AAD/7t3d///////29vb/9fX1//X19f/19fX/9fX1//z8/P9qamqlAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/7+/v/AAAA//X19f8AAAD/9fX1/9ra2v/19fX//f39//// + //+aNjb/fgAA/4sXF//y5eX/mDEx/38AAP9/AAD/smZm//fw8P9/AAD/sWNj/9avr/+yZmb/+PHx/8ua + mv/8+Pj/rVxc/3wAAP98AAD/2rW1///////4+Pj/9fX1//X19f/19fX/9fX1//z8/P9tbW2lAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/7+/v/9fX1//X19f/19fX/9fX1/9ra + 2v/19fX//f39//////+WLS3/fQAA/4wZGf/8+fn/mjU1/38AAP9/AAD/ihYW/5k0NP9/AAD/ihUV/5Ur + K/99AAD/ixkZ/65dXf+bNzf/fwEB/38AAP96AAD/2bS0///////5+fn/9fX1//X19f/19fX/9fX1//z8 + /P9tbW2lAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/AAAA//f3 + 9/8AAAD/9/f3/9ra2v/39/f/2dnZ//////+bNzf/fgAA/4oVFf/o0tL/li0t/38AAP9/AAD/fwAA/38A + AP9/AAD/fwAA/3oAAP+cOjr/qlVV/5w6Ov98AAD/fQAA/4AAAP99AAD/2rS0///////6+vr/9/f3//f3 + 9//39/f/9/f3//z8/P9vb2+lAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz/9/f3//f39//39/f/9/f3/9ra2v/39/f//Pz8//////+zZ2f/fAAA/4ABAf+DBwf/gAEB/38A + AP9/AAD/fwAA/38AAP9/AAD/fAAA/8CCgv/////////////////s2Nj/gw4O/34AAP98AAD/7+Dg//// + ///4+Pj/9/f3//f39//39/f/9/f3//z8/P9xcXGlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/8/Pz/AAAA//n5+f8AAAD/+fn5/9ra2v/5+fn/kZGR///////WrKz/eQAA/38A + AP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP9+AAD/ihgY/////////////7a2///Ozv//////zJmZ/3cA + AP+YMjL///////7+/v/5+fn/+fn5//n5+f/5+fn/+fn5//z8/P9xcXGlAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+fn5//n5+f/5+fn/+fn5/9ra2v/5+fn/+vr6//// + ///69fX/fwcH/30AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP99AAD/pUlJ///////9/f3/+fn5//v7 + +///////59DQ/3UAAP/Vq6v///////39/f/5+fn/+fn5//n5+f/5+fn/+fn5//z8/P9ycnKlAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/AAAA//n5+f8AAAD/+fn5/9ra + 2v/5+fn/TExM/9DQ0P//////1Kio/3gAAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP99AAD/ihgY//// + /////////f39////////////tGlp/3wAAP////////////v7+//6+vr/+fn5//n5+f/5+fn/+fn5//z8 + /P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+Pj4//v7 + +//7+/v/+/v7/9ra2v/7+/v/+/v7//z8/P///////////6xaWv93AAD/fwAA/38AAP9/AAD/fwAA/38A + AP9/AAD/ewAA/7hycv/////////////////buLj/fgMD/+3b2////////////////////////Pz8//v7 + +//7+/v/+/v7//z8/P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz/+Pj4//v7+/8AAAD/+/v7/9ra2v/7+/v/+/v7//v7+//9/f3///////////+iTU3/fAAA/38A + AP9/AAD/fwAA/38AAP9/AAD/fwAA/3oAAP+aNzf/sWNj/5o2Nv93AAD/3Lm5///////HkZH/tWxs/9Kn + p/////////////z8/P/7+/v/+/v7//z8/P90dHSlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+//7+/v/+/v7/9ra2v/7+/v/+/v7//v7+//7+/v//f39//// + ////////woaG/4UNDf97AAD/fAAA/34AAP9/AAD/fgAA/30AAP96AAD/ewAA/40gIP/o0dH//////6xb + W/94AAD/fgAA/3cAAP/Hj4////////7+/v/7+/v/+/v7//z8/P90dHSlAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+/8AAAD/+/v7/9ra2v/7+/v/TExM/0xM + TP9MTEz/TExM/6CgoP////////////Po6P/DiIj/pk1N/4wbG/+CBgb/hg4O/5o2Nv+0aWn/3by8//// + ////////4sXF/3wAAP9/AAD/fwAA/38AAP98AAD////////////7+/v/+/v7//z8/P90dHSlAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+//7+/v/+/v7/9ra + 2v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//v7+//////////////////37+//06Oj/+PDw//// + ////////////////////////1q6u/34AAP9/AAD/fwAA/4AAAP99AAD////////////7+/v/+/v7//z8 + /P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8 + /P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/3t7e/+mpqb/z8/P//// + /////////////9vb2/+7u7v/kJCQ/11dXf//////+/j4/4oXF/97AAD/fwAA/3oAAP+jSEj///////7+ + /v/8/Pz//Pz8//f39/9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/+/v7//////+/g4P+lTU3/jSEh/69j + Y//58vL///////7+/v/8/Pz//Pz8//X19f9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//v7+//// + /////////////////////////v7+//z8/P/8/Pz//Pz8//Pz8/9zc3OjAAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//39/f/+/v7///////7+/v/9/f3//Pz8//z8/P/8/Pz//Pz8/+Li4v9kZGSVAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra + 2v/8/Pz/TExM/0xMTP9MTEz//Pz8//8AAP//AAD//wAA//z8/P/8/Pz/TExM/0xMTP9MTEz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/7+/v/29vb/8TExP/ExMT/xMTE/8bGxv/Gxsb/xcXF/8DAwP/Jycn/yMjI/8vL + y/8vLy8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/wMDA/9vb2//s7Oz/7Ozs/+7u7v/w8PD/8PDw/+fn + 5//T09P/1dXV/0RERDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/xMTE//n5+f/8/Pz//Pz8//z8 + /P/8/Pz/9/f3/+Li4v/c3Nz/R0dHLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/ycnJ//v7 + +//8/Pz//Pz8//z8/P/19fX/3Nzc/9vb2/9ISEgvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xM + TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz//Pz8//8AAP//AAD//wAA//8AAP/8/Pz//Pz8//z8 + /P/7+/v/zMzM//v7+//8/Pz//Pz8//X19f/c3Nz/3Nzc/0lJSTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra + 2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/7+/v/0tLS//v7+//8/Pz/9fX1/9zc3P/h4eH/SkpKLwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8 + /P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM + TP9MTEz/TExM/0xMTP9MTEz/TExM//z8/P/7+/v/2NjY//z8/P/19fX/3Nzc/+Pj4/9NTU0vAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/3Nzc//Pz8//c3Nz/4uLi/05O + TjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xM + TP/8/Pz//Pz8//z8/P9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP/8/Pz//Pz8//z8/P/8/Pz/4+Pj/+Li + 4v/o6Oj/W1tbOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/9/f3//X1 + 9f/y8vL/6Ojo//Pz8/9jY2NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 + /P/8/Pz//Pz8//z8/P/39/f//Pz8/2ZmZkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa2tn7Z2dnv1NTU5NTU + 1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU + 1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1ObX19fpb29vOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA+AAAAAA/ + AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgA + AAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAf + AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgA + AAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAf + AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAD8AAPgAAAAAfwAA+AAAAAD/AAD4AAAAAf8AAPgA + AAAD/wAA+AAAAAf/AAD4AAAAD/8AAPgAAAAf/wAA+AAAAD//AAD4AAAAf/8AAPgAAAD//wAA/AAAAf// + AAA= + + \ No newline at end of file