diff --git a/.gitignore b/.gitignore index a996e86f11..3035ca2681 100644 --- a/.gitignore +++ b/.gitignore @@ -108,8 +108,6 @@ oprofile_data/ /plugins/GSdx/Template /plugins/USBqemu/Win32/bin /tools/bin -/tools/GSDumpGUI/bin -/tools/GSDumpGUI/obj .vs /pcsx2/windows/VCprojects/GSdx_opengl_debug_hw.txt diff --git a/appveyor.yml b/appveyor.yml index 9abb3226fa..70ed76565f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,8 +18,6 @@ skip_commits: # Linux only plugins for now - plugins/onepad/ - plugins/onepad_legacy/ - # Tools - - tools/GSDumpGUI/ environment: matrix: diff --git a/tools/GSDumpGUI/Core/Program.cs b/tools/GSDumpGUI/Core/Program.cs deleted file mode 100644 index cb9ef723cd..0000000000 --- a/tools/GSDumpGUI/Core/Program.cs +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Specialized = System.Collections.Specialized; -using Reflection = System.Reflection; -using System.Runtime.InteropServices; -using System.Threading; -using System.Diagnostics; -using GSDumpGUI.Properties; -using System.IO; -using TCPLibrary.MessageBased.Core; -using System.Drawing; - -namespace GSDumpGUI -{ - static class Program - { - static public GSDumpGUI frmMain; - static public TCPLibrary.MessageBased.Core.BaseMessageServer Server; - static public List Clients; - - static public TCPLibrary.MessageBased.Core.BaseMessageClient Client; - static private GSDump dump; - static private GSDXWrapper wrap; - - static private TreeNode CurrentNode; - static public IntPtr hMainIcon; - - [STAThread] - static void Main(String[] args) - { - if (args.Length == 5) - { - hMainIcon = Resources.AppIcon.Handle; - - // do this first, else racy mess ;) - wrap = new GSDXWrapper(); - var port = Convert.ToInt32(args[4]); - - try - { - Client = new TCPLibrary.MessageBased.Core.BaseMessageClient(); - Client.OnMessageReceived += new TCPLibrary.MessageBased.Core.BaseMessageClient.MessageReceivedHandler(Client_OnMessageReceived); - Client.Connect("localhost", port); - } - catch (Exception) - { - Client = null; - } - - // Retrieve parameters - String DLLPath = args[0]; - String DumpPath = args[1]; - String Operation = args[2]; - Int32 Renderer = Convert.ToInt32(args[3]); - - wrap.Load(DLLPath); - Directory.SetCurrentDirectory(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\")); - if (Operation == "GSReplay") - { - dump = GSDump.LoadDump(DumpPath); - - if (Client != null) - { - SendStatistics(); - SendDumpSize(); - } - - wrap.Run(dump, Renderer); - } - else - wrap.GSConfig(); - wrap.Unload(); - - if (GSDXWrapper.DumpTooOld) - { - if (Client != null) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.StateOld; - Client.Send(msg); - } - } - - if (Client != null) - Client.Disconnect(); - } - else - { - Clients = new List(); - - Server = new TCPLibrary.MessageBased.Core.BaseMessageServer(); - Server.OnClientMessageReceived += new BaseMessageServer.MessageReceivedHandler(Server_OnClientMessageReceived); - Server.OnClientAfterConnect += new TCPLibrary.Core.Server.ConnectedHandler(Server_OnClientAfterConnect); - Server.OnClientAfterDisconnected += new TCPLibrary.Core.Server.DisconnectedHandler(Server_OnClientAfterDisconnected); - Server.Enabled = true; - - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - using (frmMain = new GSDumpGUI()) - { - Application.Run(frmMain); - } - - Server.Enabled = false; - } - } - - static void Server_OnClientAfterDisconnected(TCPLibrary.Core.Server server, TCPLibrary.Core.ClientS sender) - { - Clients.Remove((TCPLibrary.MessageBased.Core.BaseMessageClientS)sender); - RefreshList(false); - } - - static void Server_OnClientMessageReceived(BaseMessageServer server, BaseMessageClientS sender, TCPMessage Mess) - { - switch (Mess.MessageType) - { - case MessageType.Connect: - break; - case MessageType.MaxUsers: - break; - case MessageType.SizeDump: - frmMain.Invoke(new Action(delegate(object e) - { - frmMain.txtDumpSize.Text = (((int)Mess.Parameters[0]) / 1024f / 1024f).ToString("F2") + " MB"; - }), new object[] { null }); - break; - case MessageType.Statistics: - frmMain.Invoke(new Action(delegate(object e) - { - frmMain.txtGIFPackets.Text = ((int)Mess.Parameters[0]).ToString(); - frmMain.txtPath1.Text = ((int)Mess.Parameters[1]).ToString(); - frmMain.txtPath2.Text = ((int)Mess.Parameters[2]).ToString(); - frmMain.txtPath3.Text = ((int)Mess.Parameters[3]).ToString(); - frmMain.txtReadFifo.Text = ((int)Mess.Parameters[5]).ToString(); - frmMain.txtVSync.Text = ((int)Mess.Parameters[4]).ToString(); - frmMain.txtRegisters.Text = ((int)Mess.Parameters[6]).ToString(); - }), new object[] { null }); - break; - case MessageType.StateOld: - frmMain.Invoke(new Action(delegate(object e) - { - MessageBox.Show("Savestate too old to be read. :(", "Warning"); - frmMain.Focus(); - }), new object[] { null }); - break; - case MessageType.GetDebugMode: - frmMain.Invoke(new Action(delegate(object e) - { - frmMain.chkDebugMode.Checked = (Boolean)Mess.Parameters[0]; - - frmMain.lblGif.Enabled = frmMain.chkDebugMode.Checked; - frmMain.lblContent.Enabled = frmMain.chkDebugMode.Checked; - frmMain.btnRunToSelection.Enabled = frmMain.chkDebugMode.Checked; - frmMain.treTreeView.Enabled = frmMain.chkDebugMode.Checked; - frmMain.btnStep.Enabled = frmMain.chkDebugMode.Checked; - frmMain.cmdGoToStart.Enabled = frmMain.chkDebugMode.Checked; - frmMain.cmdGoToNextVSync.Enabled = frmMain.chkDebugMode.Checked; - frmMain.treeGifPacketContent.Enabled = frmMain.chkDebugMode.Checked; - if (frmMain.chkDebugMode.Checked == false) - { - frmMain.treeGifPacketContent.Nodes.Clear(); - frmMain.treTreeView.Nodes.Clear(); - } - - }), new object[] { null }); - break; - case MessageType.DebugState: - frmMain.Invoke(new Action(delegate(object e) - { - frmMain.treTreeView.Nodes.Clear(); - List parents = new List(); - List nodes = new List(); - foreach (var itm in Mess.Parameters) - { - String[] parts = itm.ToString().Split(new char[] { '|' }); - switch (parts[1]) - { - case "Transfer": - TreeNode tn2 = new TreeNode(); - tn2.Name = parts[0]; - tn2.Text = parts[0] + " - " + parts[1] + " - " + parts[2] + " - " + parts[3] + " byte"; - nodes.Add(tn2); - break; - case "ReadFIFO2": - TreeNode tn3 = new TreeNode(); - tn3.Name = parts[0]; - tn3.Text = parts[0] + " - " + parts[1] + " - " + parts[2] + " byte"; - nodes.Add(tn3); - break; - case "VSync": - TreeNode tn = new TreeNode(); - tn.Name = parts[0]; - tn.Text = parts[0] + " - " + parts[1] + " - " + parts[2] + " byte"; - tn.Nodes.AddRange(nodes.ToArray()); - parents.Add(tn); - - nodes.Clear(); - break; - case "Registers": - TreeNode tn4 = new TreeNode(); - tn4.Name = parts[0]; - tn4.Text = parts[0] + " - " + parts[1] + " - " + parts[2] + " byte"; - nodes.Add(tn4); - break; - } - } - frmMain.treTreeView.Nodes.AddRange(parents.ToArray()); - }), new object[] { null }); - break; - case MessageType.Step: - case MessageType.RunToCursor: - frmMain.Invoke(new Action(delegate(object e) - { - int idtoselect = (int)Mess.Parameters[0]; - TreeNode[] noes = frmMain.treTreeView.Nodes.Find(idtoselect.ToString(), true); - if (noes.Length > 0) - { - if (CurrentNode != null) - CurrentNode.BackColor = Color.White; - noes[0].BackColor = Color.LightBlue; - CurrentNode = noes[0]; - frmMain.treTreeView.SelectedNode = noes[0]; - } - }), new object[] { null }); - break; - case MessageType.PacketInfo: - frmMain.Invoke(new Action(delegate(object e) - { - if (Mess.Parameters[0].GetType() == typeof(GIFTag)) - { - GIFTag tag = (GIFTag)Mess.Parameters[0]; - - frmMain.txtGifPacketSize.Text = tag.size + " bytes"; - frmMain.treeGifPacketContent.Nodes.Clear(); - - frmMain.treeGifPacketContent.Nodes.Add("Transfer Path " + tag.path); - - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add("nloop = " + tag.nloop); - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add("eop = " + tag.eop); - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add("flg = " + tag.flg.ToString()); - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add("pre = " + tag.pre); - - TreeNode nodePrim = new TreeNode("Prim"); - string[] prim = tag.prim.ToString().Split(new char[] { '@' }); - for (int j = 0; j < prim.Length; j++) - nodePrim.Nodes.Add(prim[j]); - - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add(nodePrim); - - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add("nreg = " + (tag.nreg == 0 ? (16).ToString() : tag.nreg.ToString())); - - TreeNode nodeReg = new TreeNode("reg"); - for (int j = 0; j < tag.regs.Count; j++) - { - string[] fvals = tag.regs[j].ToString().Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries); - TreeNode nodeObj = new TreeNode(fvals[0]); - for (int z = 1; z < fvals.Length; z++) - { - TreeNode item = new TreeNode(fvals[z]); - nodeObj.Nodes.Add(item); - } - nodeReg.Nodes.Add(nodeObj); - } - frmMain.treeGifPacketContent.Nodes[0].Nodes.Add(nodeReg); - - frmMain.treeGifPacketContent.Nodes[0].ExpandAll(); - } - else - { - String[] vals = Mess.Parameters[0].ToString().Split('|'); - frmMain.txtGifPacketSize.Text = vals[0] + " bytes"; - frmMain.treeGifPacketContent.Nodes.Clear(); - frmMain.treeGifPacketContent.Nodes.Add(vals[1]); - frmMain.treeGifPacketContent.Nodes[0].ExpandAll(); - } - }), new object[] { null }); - break; - default: - break; - } - } - - static void Client_OnMessageReceived(TCPLibrary.Core.Client sender, TCPLibrary.MessageBased.Core.TCPMessage Mess) - { - TCPMessage msg; - switch (Mess.MessageType) - { - case TCPLibrary.MessageBased.Core.MessageType.Connect: - break; - case TCPLibrary.MessageBased.Core.MessageType.MaxUsers: - break; - case TCPLibrary.MessageBased.Core.MessageType.SizeDump: - SendDumpSize(); - break; - case MessageType.Statistics: - SendStatistics(); - break; - case MessageType.SetDebugMode: - wrap.DebugMode = (Boolean)Mess.Parameters[0]; - - msg = new TCPMessage(); - msg.MessageType = MessageType.GetDebugMode; - msg.Parameters.Add(wrap.DebugMode); - Client.Send(msg); - - if (wrap.DebugMode) - { - msg = new TCPMessage(); - msg.MessageType = MessageType.DebugState; - msg.Parameters.AddRange(wrap.GetGifPackets(dump)); - Client.Send(msg); - - msg = new TCPMessage(); - msg.MessageType = MessageType.Step; - msg.Parameters.Add(dump.Data.FindIndex(a => a == wrap.CurrentGIFPacket)); - Client.Send(msg); - } - break; - case MessageType.GetDebugMode: - msg = new TCPMessage(); - msg.MessageType = MessageType.GetDebugMode; - msg.Parameters.Add(wrap.DebugMode); - Client.Send(msg); - - if (wrap.DebugMode) - { - msg = new TCPMessage(); - msg.MessageType = MessageType.DebugState; - msg.Parameters.AddRange(wrap.GetGifPackets(dump)); - Client.Send(msg); - - msg = new TCPMessage(); - msg.MessageType = MessageType.Step; - msg.Parameters.Add(dump.Data.FindIndex(a => a == wrap.CurrentGIFPacket)); - Client.Send(msg); - } - break; - - case MessageType.PacketInfo: - int id = (int)Mess.Parameters[0]; - msg = new TCPMessage(); - msg.MessageType = MessageType.PacketInfo; - msg.Parameters.Add(wrap.GetGifPacketInfo(dump, id)); - Client.Send(msg); - break; - case MessageType.Step: - case MessageType.RunToCursor: - case MessageType.RunToNextVSync: - wrap.ExternalEvent.WaitOne(); - wrap.ExternalEvent.Reset(); - wrap.QueueMessage.Enqueue(Mess); - wrap.ThereIsWork = true; - break; - default: - break; - } - } - - private static void SendDumpSize() - { - TCPMessage msg; - msg = new TCPMessage(); - msg.MessageType = MessageType.SizeDump; - if (dump != null) - msg.Parameters.Add(dump.Size); - else - msg.Parameters.Add(0); - Client.Send(msg); - } - - private static void SendStatistics() - { - TCPMessage msg; - msg = new TCPMessage(); - msg.MessageType = MessageType.Statistics; - if (dump != null) - { - msg.Parameters.Add(dump.Data.Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && (a.data[0] == 3 || a.data[0] == 0)).Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && a.data[0] == 1).Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && a.data[0] == 2).Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 1).Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 2).Count); - msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 3).Count); - } - else - { - msg.Parameters.Add(0); - msg.Parameters.Add(0); - msg.Parameters.Add(0); - msg.Parameters.Add(0); - msg.Parameters.Add(0); - msg.Parameters.Add(0); - msg.Parameters.Add(0); - } - Client.Send(msg); - } - - static void Server_OnClientAfterConnect(TCPLibrary.Core.Server server, TCPLibrary.Core.ClientS sender) - { - Clients.Add((TCPLibrary.MessageBased.Core.BaseMessageClientS)sender); - RefreshList(true); - } - - private static void RefreshList(bool SelectLast) - { - frmMain.Invoke(new Action( delegate(object e) - { - frmMain.lstProcesses.Items.Clear(); - - foreach (var itm in Clients) - { - frmMain.lstProcesses.Items.Add(itm.IPAddress); - } - if (SelectLast) - frmMain.lstProcesses.SelectedIndex = frmMain.lstProcesses.Items.Count - 1; - if (frmMain.lstProcesses.SelectedIndex == -1) - { - frmMain.chkDebugMode.Checked = false; - frmMain.chkDebugMode.Enabled = false; - frmMain.lblGif.Enabled = false; - frmMain.lblContent.Enabled = false; - frmMain.btnRunToSelection.Enabled = false; - frmMain.treTreeView.Enabled = false; - frmMain.btnStep.Enabled = false; - frmMain.cmdGoToStart.Enabled = false; - frmMain.cmdGoToNextVSync.Enabled = false; - frmMain.treeGifPacketContent.Enabled = false; - frmMain.treeGifPacketContent.Nodes.Clear(); - frmMain.treTreeView.Nodes.Clear(); - } - }), new object[] { null}); - } - } -} diff --git a/tools/GSDumpGUI/Forms/Entities/GsDlls.cs b/tools/GSDumpGUI/Forms/Entities/GsDlls.cs deleted file mode 100644 index 1b18b37959..0000000000 --- a/tools/GSDumpGUI/Forms/Entities/GsDlls.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace GSDumpGUI.Forms.Entities -{ - public sealed class GsDlls : GsFiles { } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Entities/GsDumpFile.cs b/tools/GSDumpGUI/Forms/Entities/GsDumpFile.cs deleted file mode 100644 index d6250fc5a0..0000000000 --- a/tools/GSDumpGUI/Forms/Entities/GsDumpFile.cs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.IO; - -namespace GSDumpGUI.Forms.Entities -{ - public sealed class GsDumpFile : GsFile - { - public FileInfo PreviewFile { get; set; } - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Entities/GsDumps.cs b/tools/GSDumpGUI/Forms/Entities/GsDumps.cs deleted file mode 100644 index e58878236d..0000000000 --- a/tools/GSDumpGUI/Forms/Entities/GsDumps.cs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.IO; - -namespace GSDumpGUI.Forms.Entities -{ - public sealed class GsDumps : GsFiles - { - private FileInfo GsDumpPreviewFile { get; set; } - } -} diff --git a/tools/GSDumpGUI/Forms/Entities/GsFile.cs b/tools/GSDumpGUI/Forms/Entities/GsFile.cs deleted file mode 100644 index b098ee1ee5..0000000000 --- a/tools/GSDumpGUI/Forms/Entities/GsFile.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.IO; - -namespace GSDumpGUI.Forms.Entities -{ - public class GsFile - { - public FileInfo File { get; set; } - public string DisplayText { get; set; } - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Entities/GsFiles.cs b/tools/GSDumpGUI/Forms/Entities/GsFiles.cs deleted file mode 100644 index 6a882a4482..0000000000 --- a/tools/GSDumpGUI/Forms/Entities/GsFiles.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.ComponentModel; - -namespace GSDumpGUI.Forms.Entities -{ - public abstract class GsFiles - where TUnderlying : GsFile - { - private int _selectedFileIndex = -1; - - public class SelectedIndexUpdatedEventArgs - { - public SelectedIndexUpdatedEventArgs(int formerIndex, int updatedIndex) - { - FormerIndex = formerIndex; - UpdatedIndex = updatedIndex; - } - - public int FormerIndex { get; } - public int UpdatedIndex { get; } - } - - public delegate void SelectedIndexUpdateEventHandler(object sender, SelectedIndexUpdatedEventArgs args); - - public event SelectedIndexUpdateEventHandler OnIndexUpdatedEvent; - public BindingList Files { get; } = new BindingList(); - - public int SelectedFileIndex - { - get - { - return _selectedFileIndex; - } - set - { - var oldValue = _selectedFileIndex; - _selectedFileIndex = value; - OnIndexUpdatedEvent?.Invoke(this, new SelectedIndexUpdatedEventArgs(oldValue, value)); - } - } - - public bool IsSelected => SelectedFileIndex != -1 && Files.Count > SelectedFileIndex; - - public TUnderlying Selected - { - get - { - return SelectedFileIndex >= 0 ? Files[SelectedFileIndex] : null; - } - set - { - SelectedFileIndex = Files.IndexOf(value); - } - } - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Helper/ExtensionMethods.cs b/tools/GSDumpGUI/Forms/Helper/ExtensionMethods.cs deleted file mode 100644 index 34559dd3a5..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/ExtensionMethods.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2009-2020 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Windows.Forms; - -// Important ! Create the ExtensionMethods class as a "public static" class -public static class ExtensionMethods -{ - public static void EnableContextMenu(this RichTextBox rtb) - { - if (rtb.ContextMenuStrip == null) - { - // Create a ContextMenuStrip without icons - ContextMenuStrip cms = new ContextMenuStrip(); - cms.ShowImageMargin = false; - - // Add the Copy option (copies the selected text inside the richtextbox) - ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy"); - tsmiCopy.Click += (sender, e) => rtb.Copy(); - cms.Items.Add(tsmiCopy); - - // Add the Clear option (clears the text inside the richtextbox) - ToolStripMenuItem tsmiClear = new ToolStripMenuItem("Clear Log"); - tsmiClear.Click += (sender, e) => rtb.Clear(); - cms.Items.Add(tsmiClear); - - // Add a Separator - cms.Items.Add(new ToolStripSeparator()); - - // Add the Select All Option (selects all the text inside the richtextbox) - ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All"); - tsmiSelectAll.Click += (sender, e) => rtb.SelectAll(); - cms.Items.Add(tsmiSelectAll); - - // When opening the menu, check if the condition is fulfilled - // in order to enable the action - cms.Opening += (sender, e) => - { - tsmiCopy.Enabled = rtb.SelectionLength > 0; - tsmiClear.Enabled = rtb.TextLength > 0; - tsmiSelectAll.Enabled = rtb.TextLength > 0 && rtb.SelectionLength < rtb.TextLength; - }; - - rtb.ContextMenuStrip = cms; - } - } -} diff --git a/tools/GSDumpGUI/Forms/Helper/FolderWithFallBackFinder.cs b/tools/GSDumpGUI/Forms/Helper/FolderWithFallBackFinder.cs deleted file mode 100644 index 9279dfc9c3..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/FolderWithFallBackFinder.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.IO; -using System.Linq; - -namespace GSDumpGUI.Forms.Helper -{ - public class FolderWithFallBackFinder : IFolderWithFallBackFinder - { - public DirectoryInfo GetViaPatternWithFallback(string defaultDir, string filePattern, params string[] fallBackFolder) - { - if (!string.IsNullOrWhiteSpace(defaultDir)) - return new DirectoryInfo(defaultDir); - - DirectoryInfo gsdxDllDirectory; - if (TryGetExistingDirectory(fallBackFolder, filePattern, out gsdxDllDirectory)) - return gsdxDllDirectory; - return new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); - } - - private static bool TryGetExistingDirectory(string[] relativePaths, string pattern, out DirectoryInfo validDirectory) - { - if (relativePaths == null) - throw new ArgumentNullException(nameof(relativePaths)); - foreach (var relativePath in relativePaths) - { - - var candidate = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, relativePath)); - if (candidate.Exists && candidate.GetFiles(pattern).Any()) - { - validDirectory = candidate; - return true; - } - } - - validDirectory = null; - return false; - } - } -} diff --git a/tools/GSDumpGUI/Forms/Helper/GsDumpFinder.cs b/tools/GSDumpGUI/Forms/Helper/GsDumpFinder.cs deleted file mode 100644 index d40606e0b8..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/GsDumpFinder.cs +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Collections.Generic; -using System.IO; -using GSDumpGUI.Forms.Entities; - -namespace GSDumpGUI.Forms.Helper -{ - public class GsDumpFinder : IGsDumpFinder - { - private readonly ILogger _logger; - - public GsDumpFinder(ILogger logger) - { - _logger = logger; - } - - public IEnumerable GetValidGsdxDumps(DirectoryInfo directory) - { - var dumps = new FileInfo[0]; - - try - { - dumps = directory.GetFiles("*.gs", SearchOption.TopDirectoryOnly); - } - catch (DirectoryNotFoundException) - { - _logger.Warning($"Failed to open folder '{directory}'."); - yield break; - } - - foreach (var dump in dumps) - { - int crc; - using (var fileStream = File.OpenRead(dump.FullName)) - { - using (var br = new BinaryReader(fileStream)) - { - crc = br.ReadInt32(); - br.Close(); - } - } - - var extensions = new[] {".png", ".bmp"}; - var dumpPreview = default(FileInfo); - foreach (var extension in extensions) - { - var imageFile = new FileInfo(Path.ChangeExtension(dump.FullName, extension)); - if (!imageFile.Exists) - continue; - dumpPreview = imageFile; - break; - } - - _logger.Information($"Identified Dump for game ({crc:X}) with filename '{dump}'"); - yield return new GsDumpFile - { - DisplayText = dump.Name + " | CRC : " + crc.ToString("X"), - File = dump, - PreviewFile = dumpPreview - }; - } - } - } -} diff --git a/tools/GSDumpGUI/Forms/Helper/GsdxDllFinder.cs b/tools/GSDumpGUI/Forms/Helper/GsdxDllFinder.cs deleted file mode 100644 index f47b103df6..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/GsdxDllFinder.cs +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Collections.Generic; -using System.IO; -using GSDumpGUI.Forms.Entities; - -namespace GSDumpGUI.Forms.Helper -{ - public class GsdxDllFinder : IGsdxDllFinder - { - private readonly ILogger _logger; - - public GsdxDllFinder(ILogger logger) - { - _logger = logger; - } - - public IEnumerable GetEnrichedPathToValidGsdxDlls(DirectoryInfo directory) - { - var availableDlls = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly); - - var wrap = new GSDXWrapper(); - foreach (var availableDll in availableDlls) - { - GsFile dll; - try - { - wrap.Load(availableDll.FullName); - - dll = new GsFile - { - DisplayText = availableDll.Name + " | " + wrap.PS2EGetLibName(), - File = availableDll - }; - _logger.Information($"'{availableDll}' correctly identified as '{wrap.PS2EGetLibName()}'"); - - wrap.Unload(); - } - catch (InvalidGSPlugin) - { - _logger.Warning($"Failed to load '{availableDll}'. Is it really a GSdx DLL?"); - continue; - } - - yield return dll; - } - } - } -} diff --git a/tools/GSDumpGUI/Forms/Helper/IFolderWithFallBackFinder.cs b/tools/GSDumpGUI/Forms/Helper/IFolderWithFallBackFinder.cs deleted file mode 100644 index 6905006f0e..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/IFolderWithFallBackFinder.cs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.IO; - -namespace GSDumpGUI.Forms.Helper -{ - public interface IFolderWithFallBackFinder - { - DirectoryInfo GetViaPatternWithFallback(string defaultDir, string filePattern, params string[] fallBackFolder); - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Helper/IGsDumpFinder.cs b/tools/GSDumpGUI/Forms/Helper/IGsDumpFinder.cs deleted file mode 100644 index 27682aad2a..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/IGsDumpFinder.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Collections.Generic; -using System.IO; -using GSDumpGUI.Forms.Entities; - -namespace GSDumpGUI.Forms.Helper -{ - public interface IGsDumpFinder - { - IEnumerable GetValidGsdxDumps(DirectoryInfo directory); - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Helper/IGsdxDllFinder.cs b/tools/GSDumpGUI/Forms/Helper/IGsdxDllFinder.cs deleted file mode 100644 index d4d129fee2..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/IGsdxDllFinder.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Collections.Generic; -using System.IO; -using GSDumpGUI.Forms.Entities; - -namespace GSDumpGUI.Forms.Helper -{ - public interface IGsdxDllFinder - { - IEnumerable GetEnrichedPathToValidGsdxDlls(DirectoryInfo directory); - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Helper/ILogger.cs b/tools/GSDumpGUI/Forms/Helper/ILogger.cs deleted file mode 100644 index d771d65f6d..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/ILogger.cs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace GSDumpGUI.Forms.Helper -{ - public interface ILogger - { - void Information(string line = null); - void Warning(string line = null); - void Error(string line = null); - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Forms/Helper/RichTextBoxLogger.cs b/tools/GSDumpGUI/Forms/Helper/RichTextBoxLogger.cs deleted file mode 100644 index 7f37a8e52b..0000000000 --- a/tools/GSDumpGUI/Forms/Helper/RichTextBoxLogger.cs +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Drawing; -using System.Windows.Forms; - -namespace GSDumpGUI.Forms.Helper -{ - public class RichTextBoxLogger : ILogger - { - private readonly RichTextBox _richTextBox; - public RichTextBoxLogger(RichTextBox richTextBox) - { - _richTextBox = richTextBox; - _richTextBox.BackColor = Color.White; - _richTextBox.Focus(); - _richTextBox.HideSelection = false; - } - - private void WriteLine(Color color, string line = null) - { - _richTextBox.Invoke(new MethodInvoker(delegate - { - ThreadLocalWrite(color, line); - })); - } - - private void ThreadLocalWrite(Color color, string line) - { - if (line == null) - { - _richTextBox.AppendText(Environment.NewLine); - return; - } - - _richTextBox.SelectionStart = _richTextBox.TextLength; - _richTextBox.SelectionLength = 0; - - _richTextBox.SelectionColor = color; - _richTextBox.AppendText(line); - _richTextBox.SelectionColor = _richTextBox.ForeColor; - - _richTextBox.AppendText(Environment.NewLine); - } - - public void Information(string line = null) => WriteLine(Color.Black, line); - public void Warning(string line = null) => WriteLine(Color.DarkGoldenrod, line); - public void Error(string line = null) => WriteLine(Color.DarkRed, line); - } -} diff --git a/tools/GSDumpGUI/Forms/SettingsProvider/PortableXmlSettingsProvider.cs b/tools/GSDumpGUI/Forms/SettingsProvider/PortableXmlSettingsProvider.cs deleted file mode 100644 index 8927b2e873..0000000000 --- a/tools/GSDumpGUI/Forms/SettingsProvider/PortableXmlSettingsProvider.cs +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (C) 2009-2019 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Specialized; -using System.Configuration; -using System.IO; -using System.Xml; -using System.Xml.Linq; - -namespace GSDumpGUI.Forms.SettingsProvider -{ - public sealed class PortableXmlSettingsProvider : System.Configuration.SettingsProvider, IApplicationSettingsProvider - { - private const string RootNode = "configuration"; - private static string SettingsDirectory => AppDomain.CurrentDomain.BaseDirectory; - public override string Name => nameof(PortableXmlSettingsProvider); - private static string ApplicationSettingsFile => Path.Combine(SettingsDirectory, "portable.config"); - - public static void ApplyProvider(params ApplicationSettingsBase[] settingsList) - => ApplyProvider(new PortableXmlSettingsProvider(), settingsList); - - public override string ApplicationName - { - get - { - return nameof(GSDumpGUI); - } - set { } - } - - private static XDocument GetOrCreateXmlDocument() - { - if (!File.Exists(ApplicationSettingsFile)) - return CreateNewDocument(); - try - { - return XDocument.Load(ApplicationSettingsFile); - } - catch - { - return CreateNewDocument(); - } - } - - private static void ApplyProvider(PortableXmlSettingsProvider provider, params ApplicationSettingsBase[] settingsList) - { - foreach (ApplicationSettingsBase settings in settingsList) - { - settings.Providers.Clear(); - settings.Providers.Add(provider); - foreach (SettingsProperty property in settings.Properties) - property.Provider = provider; - settings.Reload(); - } - } - - public override void Initialize(string name, NameValueCollection config) - { - if (String.IsNullOrEmpty(name)) - name = Name; - base.Initialize(name, config); - } - - public SettingsPropertyValue GetPreviousVersion(SettingsContext context, SettingsProperty property) - { - throw new NotImplementedException(); - } - - public void Reset(SettingsContext context) - { - if (!File.Exists(ApplicationSettingsFile)) - return; - File.Delete(ApplicationSettingsFile); - } - - public void Upgrade(SettingsContext context, SettingsPropertyCollection properties) { } - - private static XDocument CreateNewDocument() - { - return new XDocument(new XElement(RootNode)); - } - - public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection) - { - var xmlDoc = GetOrCreateXmlDocument(); - var propertyValueCollection = new SettingsPropertyValueCollection(); - foreach (SettingsProperty settingsProperty in collection) - { - propertyValueCollection.Add(new SettingsPropertyValue(settingsProperty) - { - IsDirty = false, - SerializedValue = GetValue(xmlDoc, settingsProperty) - }); - } - - return propertyValueCollection; - } - - public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) - { - var xmlDoc = GetOrCreateXmlDocument(); - foreach (SettingsPropertyValue settingsPropertyValue in collection) - SetValue(xmlDoc, settingsPropertyValue); - try - { - using (var writer = CreateWellFormattedXmlWriter(ApplicationSettingsFile)) - { - xmlDoc.Save(writer); - } - } - catch { } - } - - private static XmlWriter CreateWellFormattedXmlWriter(string outputFileName) - { - var settings = new XmlWriterSettings - { - NewLineHandling = NewLineHandling.Entitize, - Indent = true - }; - return XmlWriter.Create(outputFileName, settings); - } - - private static object GetValue(XContainer xmlDoc, SettingsProperty prop) - { - if (xmlDoc == null) - return prop.DefaultValue; - - var rootNode = xmlDoc.Element(RootNode); - if (rootNode == null) - return prop.DefaultValue; - - var settingNode = rootNode.Element(prop.Name); - if (settingNode == null) - return prop.DefaultValue; - - return DeserializeSettingValueFromXmlNode(settingNode, prop); - } - - private static void SetValue(XContainer xmlDoc, SettingsPropertyValue value) - { - if (xmlDoc == null) - throw new ArgumentNullException(nameof(xmlDoc)); - - var rootNode = xmlDoc.Element(RootNode); - if (rootNode == null) - throw new ArgumentNullException(nameof(rootNode)); - - var settingNode = rootNode.Element(value.Name); - - var settingValueNode = SerializeSettingValueToXmlNode(value); - if (settingNode == null) - rootNode.Add(new XElement(value.Name, settingValueNode)); - else - settingNode.ReplaceAll(settingValueNode); - - } - - private static XNode SerializeSettingValueToXmlNode(SettingsPropertyValue value) - { - if (value.SerializedValue == null) - return new XText(""); - switch (value.Property.SerializeAs) - { - case SettingsSerializeAs.String: - return new XText((string) value.SerializedValue); - case SettingsSerializeAs.Xml: - case SettingsSerializeAs.Binary: - case SettingsSerializeAs.ProviderSpecific: - throw new NotImplementedException($"I don't know how to handle serialization of settings that should be serialized as {value.Property.SerializeAs}"); - default: - throw new ArgumentOutOfRangeException(); - } - } - - private static object DeserializeSettingValueFromXmlNode(XNode node, SettingsProperty prop) - { - using (var reader = node.CreateReader()) - { - reader.MoveToContent(); - switch (prop.SerializeAs) - { - case SettingsSerializeAs.Xml: - case SettingsSerializeAs.Binary: - case SettingsSerializeAs.ProviderSpecific: - throw new NotImplementedException($"I don't know how to handle deserialization of settings that should be deserialized as {prop.SerializeAs}"); - - case SettingsSerializeAs.String: - return reader.ReadElementContentAsString(); - default: - throw new ArgumentOutOfRangeException(); - } - } - } - } -} diff --git a/tools/GSDumpGUI/Forms/frmMain.Designer.cs b/tools/GSDumpGUI/Forms/frmMain.Designer.cs deleted file mode 100644 index d7f4fc0740..0000000000 --- a/tools/GSDumpGUI/Forms/frmMain.Designer.cs +++ /dev/null @@ -1,801 +0,0 @@ -namespace GSDumpGUI -{ - partial class GSDumpGUI - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) - { - DisposeExtra(); - - if (components != null) - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GSDumpGUI)); - this.txtGSDXDirectory = new System.Windows.Forms.TextBox(); - this.lblDirectory = new System.Windows.Forms.Label(); - this.cmdBrowseGSDX = new System.Windows.Forms.Button(); - this.cmdBrowseDumps = new System.Windows.Forms.Button(); - this.lblDumpDirectory = new System.Windows.Forms.Label(); - this.txtDumpsDirectory = new System.Windows.Forms.TextBox(); - this.lstGSDX = new System.Windows.Forms.ListBox(); - this.lstDumps = new System.Windows.Forms.ListBox(); - this.lblDumps = new System.Windows.Forms.Label(); - this.GsdxList = new System.Windows.Forms.Label(); - this.cmdRun = new System.Windows.Forms.Button(); - this.cmdConfigGSDX = new System.Windows.Forms.Button(); - this.txtLog = new System.Windows.Forms.RichTextBox(); - this.lblLog = new System.Windows.Forms.Label(); - this.cmdOpenIni = new System.Windows.Forms.Button(); - this.pctBox = new System.Windows.Forms.PictureBox(); - this.rdaDX9HW = new System.Windows.Forms.RadioButton(); - this.rdaDX1011HW = new System.Windows.Forms.RadioButton(); - this.rdaOGLHW = new System.Windows.Forms.RadioButton(); - this.rdaDX9SW = new System.Windows.Forms.RadioButton(); - this.rdaDX1011SW = new System.Windows.Forms.RadioButton(); - this.rdaOGLSW = new System.Windows.Forms.RadioButton(); - this.lblOverride = new System.Windows.Forms.Label(); - this.rdaNone = new System.Windows.Forms.RadioButton(); - this.lblInternalLog = new System.Windows.Forms.Label(); - this.txtIntLog = new System.Windows.Forms.RichTextBox(); - this.lblDebugger = new System.Windows.Forms.Label(); - this.lstProcesses = new System.Windows.Forms.ListBox(); - this.lblChild = new System.Windows.Forms.Label(); - this.lblDumpSize = new System.Windows.Forms.Label(); - this.txtDumpSize = new System.Windows.Forms.Label(); - this.txtGIFPackets = new System.Windows.Forms.Label(); - this.lblGIFPackets = new System.Windows.Forms.Label(); - this.txtPath1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.txtPath2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.txtPath3 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.txtVSync = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.txtReadFifo = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.txtRegisters = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.chkDebugMode = new System.Windows.Forms.CheckBox(); - this.lblGif = new System.Windows.Forms.Label(); - this.btnStep = new System.Windows.Forms.Button(); - this.btnRunToSelection = new System.Windows.Forms.Button(); - this.treTreeView = new System.Windows.Forms.TreeView(); - this.cmdGoToStart = new System.Windows.Forms.Button(); - this.cmdGoToNextVSync = new System.Windows.Forms.Button(); - this.txtGifPacketSize = new System.Windows.Forms.Label(); - this.lblGIFPacketSize = new System.Windows.Forms.Label(); - this.treeGifPacketContent = new System.Windows.Forms.TreeView(); - this.lblContent = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.pctBox)).BeginInit(); - this.SuspendLayout(); - // - // txtGSDXDirectory - // - this.txtGSDXDirectory.Location = new System.Drawing.Point(871, 24); - this.txtGSDXDirectory.Name = "txtGSDXDirectory"; - this.txtGSDXDirectory.Size = new System.Drawing.Size(243, 20); - this.txtGSDXDirectory.TabIndex = 0; - this.txtGSDXDirectory.TabStop = false; - this.txtGSDXDirectory.Enter += new System.EventHandler(this.txtGSDXDirectory_Enter); - this.txtGSDXDirectory.Leave += new System.EventHandler(this.txtGSDXDirectory_Leave); - this.txtGSDXDirectory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtGSDXDirectory_KeyDown); - // - // lblDirectory - // - this.lblDirectory.AutoSize = true; - this.lblDirectory.Location = new System.Drawing.Point(871, 10); - this.lblDirectory.Name = "lblDirectory"; - this.lblDirectory.Size = new System.Drawing.Size(78, 13); - this.lblDirectory.TabIndex = 1; - this.lblDirectory.Text = "GSdx Directory"; - // - // cmdBrowseGSDX - // - this.cmdBrowseGSDX.Location = new System.Drawing.Point(1120, 24); - this.cmdBrowseGSDX.Name = "cmdBrowseGSDX"; - this.cmdBrowseGSDX.Size = new System.Drawing.Size(26, 22); - this.cmdBrowseGSDX.TabIndex = 2; - this.cmdBrowseGSDX.TabStop = false; - this.cmdBrowseGSDX.Text = "..."; - this.cmdBrowseGSDX.UseVisualStyleBackColor = true; - this.cmdBrowseGSDX.Click += new System.EventHandler(this.cmdBrowseGSDX_Click); - // - // cmdBrowseDumps - // - this.cmdBrowseDumps.Location = new System.Drawing.Point(1120, 64); - this.cmdBrowseDumps.Name = "cmdBrowseDumps"; - this.cmdBrowseDumps.Size = new System.Drawing.Size(26, 23); - this.cmdBrowseDumps.TabIndex = 5; - this.cmdBrowseDumps.TabStop = false; - this.cmdBrowseDumps.Text = "..."; - this.cmdBrowseDumps.UseVisualStyleBackColor = true; - this.cmdBrowseDumps.Click += new System.EventHandler(this.cmdBrowseDumps_Click); - // - // lblDumpDirectory - // - this.lblDumpDirectory.AutoSize = true; - this.lblDumpDirectory.Location = new System.Drawing.Point(871, 51); - this.lblDumpDirectory.Name = "lblDumpDirectory"; - this.lblDumpDirectory.Size = new System.Drawing.Size(85, 13); - this.lblDumpDirectory.TabIndex = 4; - this.lblDumpDirectory.Text = "Dumps Directory"; - // - // txtDumpsDirectory - // - this.txtDumpsDirectory.Location = new System.Drawing.Point(871, 67); - this.txtDumpsDirectory.Name = "txtDumpsDirectory"; - this.txtDumpsDirectory.Size = new System.Drawing.Size(243, 20); - this.txtDumpsDirectory.TabIndex = 3; - this.txtDumpsDirectory.TabStop = false; - this.txtDumpsDirectory.Enter += new System.EventHandler(this.txtDumpsDirectory_Enter); - this.txtDumpsDirectory.Leave += new System.EventHandler(this.txtDumpsDirectory_Leave); - this.txtDumpsDirectory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDumpsDirectory_KeyDown); - // - // lstGSDX - // - this.lstGSDX.FormattingEnabled = true; - this.lstGSDX.Location = new System.Drawing.Point(451, 24); - this.lstGSDX.Name = "lstGSDX"; - this.lstGSDX.Size = new System.Drawing.Size(411, 173); - this.lstGSDX.TabIndex = 1; - // - // lstDumps - // - this.lstDumps.FormattingEnabled = true; - this.lstDumps.Location = new System.Drawing.Point(12, 24); - this.lstDumps.Name = "lstDumps"; - this.lstDumps.Size = new System.Drawing.Size(433, 173); - this.lstDumps.TabIndex = 0; - // - // lblDumps - // - this.lblDumps.AutoSize = true; - this.lblDumps.Location = new System.Drawing.Point(9, 8); - this.lblDumps.Name = "lblDumps"; - this.lblDumps.Size = new System.Drawing.Size(59, 13); - this.lblDumps.TabIndex = 9; - this.lblDumps.Text = "Dumps List"; - // - // GsdxList - // - this.GsdxList.AutoSize = true; - this.GsdxList.Location = new System.Drawing.Point(451, 8); - this.GsdxList.Name = "GsdxList"; - this.GsdxList.Size = new System.Drawing.Size(52, 13); - this.GsdxList.TabIndex = 10; - this.GsdxList.Text = "GSdx List"; - // - // cmdRun - // - this.cmdRun.Location = new System.Drawing.Point(871, 167); - this.cmdRun.Name = "cmdRun"; - this.cmdRun.Size = new System.Drawing.Size(275, 30); - this.cmdRun.TabIndex = 11; - this.cmdRun.TabStop = false; - this.cmdRun.Text = "Run"; - this.cmdRun.UseVisualStyleBackColor = true; - this.cmdRun.Click += new System.EventHandler(this.cmdRun_Click); - // - // cmdConfigGSDX - // - this.cmdConfigGSDX.Location = new System.Drawing.Point(1051, 93); - this.cmdConfigGSDX.Name = "cmdConfigGSDX"; - this.cmdConfigGSDX.Size = new System.Drawing.Size(95, 32); - this.cmdConfigGSDX.TabIndex = 12; - this.cmdConfigGSDX.TabStop = false; - this.cmdConfigGSDX.Text = "Configure GSdx"; - this.cmdConfigGSDX.UseVisualStyleBackColor = true; - this.cmdConfigGSDX.Click += new System.EventHandler(this.cmdConfigGSDX_Click); - // - // txtLog - // - this.txtLog.Location = new System.Drawing.Point(15, 225); - this.txtLog.Multiline = true; - this.txtLog.Name = "txtLog"; - this.txtLog.ReadOnly = true; - this.txtLog.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Both; - this.txtLog.Size = new System.Drawing.Size(430, 160); - this.txtLog.TabIndex = 13; - this.txtLog.TabStop = false; - this.txtLog.EnableContextMenu(); - // - // lblLog - // - this.lblLog.AutoSize = true; - this.lblLog.Location = new System.Drawing.Point(12, 209); - this.lblLog.Name = "lblLog"; - this.lblLog.Size = new System.Drawing.Size(54, 13); - this.lblLog.TabIndex = 14; - this.lblLog.Text = "Log GSdx"; - // - // cmdOpenIni - // - this.cmdOpenIni.Location = new System.Drawing.Point(1051, 130); - this.cmdOpenIni.Name = "cmdOpenIni"; - this.cmdOpenIni.Size = new System.Drawing.Size(95, 32); - this.cmdOpenIni.TabIndex = 15; - this.cmdOpenIni.TabStop = false; - this.cmdOpenIni.Text = "Open GSdx.ini"; - this.cmdOpenIni.UseVisualStyleBackColor = true; - this.cmdOpenIni.Click += new System.EventHandler(this.cmdOpenIni_Click); - // - // pctBox - // - this.pctBox.Location = new System.Drawing.Point(871, 225); - this.pctBox.Name = "pctBox"; - this.pctBox.Size = new System.Drawing.Size(275, 160); - this.pctBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pctBox.TabIndex = 16; - this.pctBox.TabStop = false; - this.pctBox.Click += new System.EventHandler(PreviewImageClick); - // - // rdaDX9HW - // - this.rdaDX9HW.AutoSize = true; - this.rdaDX9HW.Location = new System.Drawing.Point(874, 111); - this.rdaDX9HW.Name = "rdaDX9HW"; - this.rdaDX9HW.Size = new System.Drawing.Size(75, 17); - this.rdaDX9HW.TabIndex = 17; - this.rdaDX9HW.Tag = "1"; - this.rdaDX9HW.Text = "D3D9 HW"; - this.rdaDX9HW.UseVisualStyleBackColor = true; - this.rdaDX9HW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // rdaDX1011HW - // - this.rdaDX1011HW.AutoSize = true; - this.rdaDX1011HW.Location = new System.Drawing.Point(874, 129); - this.rdaDX1011HW.Name = "rdaDX1011HW"; - this.rdaDX1011HW.Size = new System.Drawing.Size(81, 17); - this.rdaDX1011HW.TabIndex = 18; - this.rdaDX1011HW.Tag = "2"; - this.rdaDX1011HW.Text = "D3D11 HW"; - this.rdaDX1011HW.UseVisualStyleBackColor = true; - this.rdaDX1011HW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // rdaOGLHW - // - this.rdaOGLHW.AutoSize = true; - this.rdaOGLHW.Location = new System.Drawing.Point(874, 147); - this.rdaOGLHW.Name = "rdaOGLHW"; - this.rdaOGLHW.Size = new System.Drawing.Size(69, 17); - this.rdaOGLHW.TabIndex = 19; - this.rdaOGLHW.Tag = "3"; - this.rdaOGLHW.Text = "OGL HW"; - this.rdaOGLHW.UseVisualStyleBackColor = true; - this.rdaOGLHW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // rdaDX9SW - // - this.rdaDX9SW.AutoSize = true; - this.rdaDX9SW.Location = new System.Drawing.Point(971, 111); - this.rdaDX9SW.Name = "rdaDX9SW"; - this.rdaDX9SW.Size = new System.Drawing.Size(74, 17); - this.rdaDX9SW.TabIndex = 20; - this.rdaDX9SW.Tag = "4"; - this.rdaDX9SW.Text = "D3D9 SW"; - this.rdaDX9SW.UseVisualStyleBackColor = true; - this.rdaDX9SW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // rdaDX1011SW - // - this.rdaDX1011SW.AutoSize = true; - this.rdaDX1011SW.Location = new System.Drawing.Point(971, 129); - this.rdaDX1011SW.Name = "rdaDX1011SW"; - this.rdaDX1011SW.Size = new System.Drawing.Size(80, 17); - this.rdaDX1011SW.TabIndex = 21; - this.rdaDX1011SW.Tag = "5"; - this.rdaDX1011SW.Text = "D3D11 SW"; - this.rdaDX1011SW.UseVisualStyleBackColor = true; - this.rdaDX1011SW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // rdaOGLSW - // - this.rdaOGLSW.AutoSize = true; - this.rdaOGLSW.Location = new System.Drawing.Point(971, 147); - this.rdaOGLSW.Name = "rdaOGLSW"; - this.rdaOGLSW.Size = new System.Drawing.Size(68, 17); - this.rdaOGLSW.TabIndex = 22; - this.rdaOGLSW.Tag = "6"; - this.rdaOGLSW.Text = "OGL SW"; - this.rdaOGLSW.UseVisualStyleBackColor = true; - this.rdaOGLSW.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // lblOverride - // - this.lblOverride.AutoSize = true; - this.lblOverride.Location = new System.Drawing.Point(871, 93); - this.lblOverride.Name = "lblOverride"; - this.lblOverride.Size = new System.Drawing.Size(94, 13); - this.lblOverride.TabIndex = 23; - this.lblOverride.Text = "Renderer Override"; - // - // rdaNone - // - this.rdaNone.AutoSize = true; - this.rdaNone.Checked = true; - this.rdaNone.Location = new System.Drawing.Point(971, 93); - this.rdaNone.Name = "rdaNone"; - this.rdaNone.Size = new System.Drawing.Size(51, 17); - this.rdaNone.TabIndex = 24; - this.rdaNone.TabStop = true; - this.rdaNone.Tag = "0"; - this.rdaNone.Text = "None"; - this.rdaNone.UseVisualStyleBackColor = true; - this.rdaNone.CheckedChanged += new System.EventHandler(this.rda_CheckedChanged); - // - // lblInternalLog - // - this.lblInternalLog.AutoSize = true; - this.lblInternalLog.Location = new System.Drawing.Point(451, 209); - this.lblInternalLog.Name = "lblInternalLog"; - this.lblInternalLog.Size = new System.Drawing.Size(63, 13); - this.lblInternalLog.TabIndex = 25; - this.lblInternalLog.Text = "Log Internal"; - // - // txtIntLog - // - this.txtIntLog.Location = new System.Drawing.Point(451, 225); - this.txtIntLog.Multiline = true; - this.txtIntLog.Name = "txtIntLog"; - this.txtIntLog.ReadOnly = true; - this.txtIntLog.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Both; - this.txtIntLog.Size = new System.Drawing.Size(411, 160); - this.txtIntLog.TabIndex = 24; - this.txtIntLog.TabStop = false; - this.txtIntLog.EnableContextMenu(); - // - // lblDebugger - // - this.lblDebugger.AutoSize = true; - this.lblDebugger.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblDebugger.Location = new System.Drawing.Point(417, 398); - this.lblDebugger.Name = "lblDebugger"; - this.lblDebugger.Size = new System.Drawing.Size(62, 13); - this.lblDebugger.TabIndex = 26; - this.lblDebugger.Text = "Debugger"; - // - // lstProcesses - // - this.lstProcesses.FormattingEnabled = true; - this.lstProcesses.Location = new System.Drawing.Point(12, 430); - this.lstProcesses.Name = "lstProcesses"; - this.lstProcesses.Size = new System.Drawing.Size(248, 277); - this.lstProcesses.TabIndex = 27; - this.lstProcesses.SelectedIndexChanged += new System.EventHandler(this.lstProcesses_SelectedIndexChanged); - // - // lblChild - // - this.lblChild.AutoSize = true; - this.lblChild.Location = new System.Drawing.Point(9, 414); - this.lblChild.Name = "lblChild"; - this.lblChild.Size = new System.Drawing.Size(82, 13); - this.lblChild.TabIndex = 28; - this.lblChild.Text = "Child Processes"; - // - // lblDumpSize - // - this.lblDumpSize.AutoSize = true; - this.lblDumpSize.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblDumpSize.Location = new System.Drawing.Point(279, 430); - this.lblDumpSize.Name = "lblDumpSize"; - this.lblDumpSize.Size = new System.Drawing.Size(67, 13); - this.lblDumpSize.TabIndex = 29; - this.lblDumpSize.Text = "Dump Size"; - // - // txtDumpSize - // - this.txtDumpSize.AutoSize = true; - this.txtDumpSize.Location = new System.Drawing.Point(279, 445); - this.txtDumpSize.Name = "txtDumpSize"; - this.txtDumpSize.Size = new System.Drawing.Size(27, 13); - this.txtDumpSize.TabIndex = 30; - this.txtDumpSize.Text = "N/A"; - // - // txtGIFPackets - // - this.txtGIFPackets.AutoSize = true; - this.txtGIFPackets.Location = new System.Drawing.Point(279, 478); - this.txtGIFPackets.Name = "txtGIFPackets"; - this.txtGIFPackets.Size = new System.Drawing.Size(27, 13); - this.txtGIFPackets.TabIndex = 33; - this.txtGIFPackets.Text = "N/A"; - // - // lblGIFPackets - // - this.lblGIFPackets.AutoSize = true; - this.lblGIFPackets.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblGIFPackets.Location = new System.Drawing.Point(279, 463); - this.lblGIFPackets.Name = "lblGIFPackets"; - this.lblGIFPackets.Size = new System.Drawing.Size(110, 13); - this.lblGIFPackets.TabIndex = 32; - this.lblGIFPackets.Text = "Total GIF Packets"; - // - // txtPath1 - // - this.txtPath1.AutoSize = true; - this.txtPath1.Location = new System.Drawing.Point(279, 512); - this.txtPath1.Name = "txtPath1"; - this.txtPath1.Size = new System.Drawing.Size(27, 13); - this.txtPath1.TabIndex = 35; - this.txtPath1.Text = "N/A"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(279, 497); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(114, 13); - this.label2.TabIndex = 34; - this.label2.Text = "Path1 GIF Packets"; - // - // txtPath2 - // - this.txtPath2.AutoSize = true; - this.txtPath2.Location = new System.Drawing.Point(279, 546); - this.txtPath2.Name = "txtPath2"; - this.txtPath2.Size = new System.Drawing.Size(27, 13); - this.txtPath2.TabIndex = 37; - this.txtPath2.Text = "N/A"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label3.Location = new System.Drawing.Point(279, 531); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(114, 13); - this.label3.TabIndex = 36; - this.label3.Text = "Path2 GIF Packets"; - // - // txtPath3 - // - this.txtPath3.AutoSize = true; - this.txtPath3.Location = new System.Drawing.Point(279, 580); - this.txtPath3.Name = "txtPath3"; - this.txtPath3.Size = new System.Drawing.Size(27, 13); - this.txtPath3.TabIndex = 39; - this.txtPath3.Text = "N/A"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.Location = new System.Drawing.Point(279, 565); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(114, 13); - this.label5.TabIndex = 38; - this.label5.Text = "Path3 GIF Packets"; - // - // txtVSync - // - this.txtVSync.AutoSize = true; - this.txtVSync.Location = new System.Drawing.Point(279, 615); - this.txtVSync.Name = "txtVSync"; - this.txtVSync.Size = new System.Drawing.Size(27, 13); - this.txtVSync.TabIndex = 41; - this.txtVSync.Text = "N/A"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(279, 600); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(91, 13); - this.label4.TabIndex = 40; - this.label4.Text = "Vsync Packets"; - // - // txtReadFifo - // - this.txtReadFifo.AutoSize = true; - this.txtReadFifo.Location = new System.Drawing.Point(279, 649); - this.txtReadFifo.Name = "txtReadFifo"; - this.txtReadFifo.Size = new System.Drawing.Size(27, 13); - this.txtReadFifo.TabIndex = 43; - this.txtReadFifo.Text = "N/A"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label7.Location = new System.Drawing.Point(279, 634); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(114, 13); - this.label7.TabIndex = 42; - this.label7.Text = "ReadFIFO Packets"; - // - // txtRegisters - // - this.txtRegisters.AutoSize = true; - this.txtRegisters.Location = new System.Drawing.Point(279, 684); - this.txtRegisters.Name = "txtRegisters"; - this.txtRegisters.Size = new System.Drawing.Size(27, 13); - this.txtRegisters.TabIndex = 45; - this.txtRegisters.Text = "N/A"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label6.Location = new System.Drawing.Point(279, 669); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(110, 13); - this.label6.TabIndex = 44; - this.label6.Text = "Registers Packets"; - // - // chkDebugMode - // - this.chkDebugMode.AutoSize = true; - this.chkDebugMode.Enabled = false; - this.chkDebugMode.Location = new System.Drawing.Point(759, 430); - this.chkDebugMode.Name = "chkDebugMode"; - this.chkDebugMode.Size = new System.Drawing.Size(88, 17); - this.chkDebugMode.TabIndex = 46; - this.chkDebugMode.Text = "Debug Mode"; - this.chkDebugMode.UseVisualStyleBackColor = true; - this.chkDebugMode.CheckedChanged += new System.EventHandler(this.chkDebugMode_CheckedChanged); - // - // lblGif - // - this.lblGif.AutoSize = true; - this.lblGif.Enabled = false; - this.lblGif.Location = new System.Drawing.Point(417, 415); - this.lblGif.Name = "lblGif"; - this.lblGif.Size = new System.Drawing.Size(66, 13); - this.lblGif.TabIndex = 48; - this.lblGif.Text = "GIF Packets"; - // - // btnStep - // - this.btnStep.Enabled = false; - this.btnStep.Location = new System.Drawing.Point(759, 499); - this.btnStep.Name = "btnStep"; - this.btnStep.Size = new System.Drawing.Size(108, 40); - this.btnStep.TabIndex = 49; - this.btnStep.TabStop = false; - this.btnStep.Text = "Step"; - this.btnStep.UseVisualStyleBackColor = true; - this.btnStep.Click += new System.EventHandler(this.btnStep_Click); - // - // btnRunToSelection - // - this.btnRunToSelection.Enabled = false; - this.btnRunToSelection.Location = new System.Drawing.Point(759, 545); - this.btnRunToSelection.Name = "btnRunToSelection"; - this.btnRunToSelection.Size = new System.Drawing.Size(108, 40); - this.btnRunToSelection.TabIndex = 50; - this.btnRunToSelection.TabStop = false; - this.btnRunToSelection.Text = "Run To Selection"; - this.btnRunToSelection.UseVisualStyleBackColor = true; - this.btnRunToSelection.Click += new System.EventHandler(this.btnRunToSelection_Click); - // - // treTreeView - // - this.treTreeView.Enabled = false; - this.treTreeView.Location = new System.Drawing.Point(420, 431); - this.treTreeView.Name = "treTreeView"; - this.treTreeView.Size = new System.Drawing.Size(332, 276); - this.treTreeView.TabIndex = 51; - this.treTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treTreeView_AfterSelect); - // - // cmdGoToStart - // - this.cmdGoToStart.Enabled = false; - this.cmdGoToStart.Location = new System.Drawing.Point(759, 453); - this.cmdGoToStart.Name = "cmdGoToStart"; - this.cmdGoToStart.Size = new System.Drawing.Size(108, 40); - this.cmdGoToStart.TabIndex = 52; - this.cmdGoToStart.TabStop = false; - this.cmdGoToStart.Text = "Go to Start"; - this.cmdGoToStart.UseVisualStyleBackColor = true; - this.cmdGoToStart.Click += new System.EventHandler(this.cmdGoToStart_Click); - // - // cmdGoToNextVSync - // - this.cmdGoToNextVSync.Enabled = false; - this.cmdGoToNextVSync.Location = new System.Drawing.Point(759, 591); - this.cmdGoToNextVSync.Name = "cmdGoToNextVSync"; - this.cmdGoToNextVSync.Size = new System.Drawing.Size(108, 40); - this.cmdGoToNextVSync.TabIndex = 53; - this.cmdGoToNextVSync.TabStop = false; - this.cmdGoToNextVSync.Text = "Go to next VSync"; - this.cmdGoToNextVSync.UseVisualStyleBackColor = true; - this.cmdGoToNextVSync.Click += new System.EventHandler(this.cmdGoToNextVSync_Click); - // - // txtGifPacketSize - // - this.txtGifPacketSize.AutoSize = true; - this.txtGifPacketSize.Location = new System.Drawing.Point(873, 430); - this.txtGifPacketSize.Name = "txtGifPacketSize"; - this.txtGifPacketSize.Size = new System.Drawing.Size(0, 13); - this.txtGifPacketSize.TabIndex = 55; - // - // lblGIFPacketSize - // - this.lblGIFPacketSize.AutoSize = true; - this.lblGIFPacketSize.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblGIFPacketSize.Location = new System.Drawing.Point(871, 398); - this.lblGIFPacketSize.Name = "lblGIFPacketSize"; - this.lblGIFPacketSize.Size = new System.Drawing.Size(95, 13); - this.lblGIFPacketSize.TabIndex = 54; - this.lblGIFPacketSize.Text = "Gif Packet Size"; - // - // treeGifPacketContent - // - this.treeGifPacketContent.Enabled = false; - this.treeGifPacketContent.Location = new System.Drawing.Point(874, 431); - this.treeGifPacketContent.Name = "treeGifPacketContent"; - this.treeGifPacketContent.Size = new System.Drawing.Size(272, 276); - this.treeGifPacketContent.TabIndex = 57; - // - // lblContent - // - this.lblContent.AutoSize = true; - this.lblContent.Enabled = false; - this.lblContent.Location = new System.Drawing.Point(871, 414); - this.lblContent.Name = "lblContent"; - this.lblContent.Size = new System.Drawing.Size(101, 13); - this.lblContent.TabIndex = 56; - this.lblContent.Text = "GIF Packet Content"; - // - // GSDumpGUI - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1158, 718); - this.Controls.Add(this.treeGifPacketContent); - this.Controls.Add(this.lblContent); - this.Controls.Add(this.txtGifPacketSize); - this.Controls.Add(this.lblGIFPacketSize); - this.Controls.Add(this.cmdGoToNextVSync); - this.Controls.Add(this.cmdGoToStart); - this.Controls.Add(this.treTreeView); - this.Controls.Add(this.btnRunToSelection); - this.Controls.Add(this.btnStep); - this.Controls.Add(this.lblGif); - this.Controls.Add(this.chkDebugMode); - this.Controls.Add(this.txtRegisters); - this.Controls.Add(this.label6); - this.Controls.Add(this.txtReadFifo); - this.Controls.Add(this.label7); - this.Controls.Add(this.txtVSync); - this.Controls.Add(this.label4); - this.Controls.Add(this.txtPath3); - this.Controls.Add(this.label5); - this.Controls.Add(this.txtPath2); - this.Controls.Add(this.label3); - this.Controls.Add(this.txtPath1); - this.Controls.Add(this.label2); - this.Controls.Add(this.txtGIFPackets); - this.Controls.Add(this.lblGIFPackets); - this.Controls.Add(this.txtDumpSize); - this.Controls.Add(this.lblDumpSize); - this.Controls.Add(this.lstProcesses); - this.Controls.Add(this.lblChild); - this.Controls.Add(this.lblDebugger); - this.Controls.Add(this.lblInternalLog); - this.Controls.Add(this.txtIntLog); - this.Controls.Add(this.rdaNone); - this.Controls.Add(this.lblOverride); - this.Controls.Add(this.rdaOGLSW); - this.Controls.Add(this.rdaDX1011SW); - this.Controls.Add(this.rdaDX9SW); - this.Controls.Add(this.rdaOGLHW); - this.Controls.Add(this.rdaDX1011HW); - this.Controls.Add(this.rdaDX9HW); - this.Controls.Add(this.lstGSDX); - this.Controls.Add(this.pctBox); - this.Controls.Add(this.cmdOpenIni); - this.Controls.Add(this.lblLog); - this.Controls.Add(this.txtLog); - this.Controls.Add(this.cmdConfigGSDX); - this.Controls.Add(this.cmdRun); - this.Controls.Add(this.GsdxList); - this.Controls.Add(this.lblDumps); - this.Controls.Add(this.lstDumps); - this.Controls.Add(this.cmdBrowseDumps); - this.Controls.Add(this.lblDumpDirectory); - this.Controls.Add(this.txtDumpsDirectory); - this.Controls.Add(this.cmdBrowseGSDX); - this.Controls.Add(this.lblDirectory); - this.Controls.Add(this.txtGSDXDirectory); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.Name = "GSDumpGUI"; - this.Text = "GSDumpGUI"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GSDumpGUI_FormClosing); - this.Load += new System.EventHandler(this.GSDumpGUI_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GSDumpGUI_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.pctBox)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox txtGSDXDirectory; - private System.Windows.Forms.Label lblDirectory; - private System.Windows.Forms.Button cmdBrowseGSDX; - private System.Windows.Forms.Button cmdBrowseDumps; - private System.Windows.Forms.Label lblDumpDirectory; - private System.Windows.Forms.TextBox txtDumpsDirectory; - private System.Windows.Forms.ListBox lstGSDX; - private System.Windows.Forms.ListBox lstDumps; - private System.Windows.Forms.Label lblDumps; - private System.Windows.Forms.Label GsdxList; - private System.Windows.Forms.Button cmdRun; - private System.Windows.Forms.Button cmdConfigGSDX; - private System.Windows.Forms.RichTextBox txtLog; - private System.Windows.Forms.Label lblLog; - private System.Windows.Forms.Button cmdOpenIni; - private System.Windows.Forms.PictureBox pctBox; - private System.Windows.Forms.RadioButton rdaDX9HW; - private System.Windows.Forms.RadioButton rdaDX1011HW; - private System.Windows.Forms.RadioButton rdaOGLHW; - private System.Windows.Forms.RadioButton rdaDX9SW; - private System.Windows.Forms.RadioButton rdaDX1011SW; - private System.Windows.Forms.RadioButton rdaOGLSW; - private System.Windows.Forms.Label lblOverride; - private System.Windows.Forms.RadioButton rdaNone; - private System.Windows.Forms.Label lblInternalLog; - private System.Windows.Forms.RichTextBox txtIntLog; - private System.Windows.Forms.Label lblDebugger; - private System.Windows.Forms.Label lblChild; - public System.Windows.Forms.ListBox lstProcesses; - private System.Windows.Forms.Label lblDumpSize; - public System.Windows.Forms.Label txtDumpSize; - public System.Windows.Forms.Label txtGIFPackets; - private System.Windows.Forms.Label lblGIFPackets; - public System.Windows.Forms.Label txtPath1; - private System.Windows.Forms.Label label2; - public System.Windows.Forms.Label txtPath2; - private System.Windows.Forms.Label label3; - public System.Windows.Forms.Label txtPath3; - private System.Windows.Forms.Label label5; - public System.Windows.Forms.Label txtVSync; - private System.Windows.Forms.Label label4; - public System.Windows.Forms.Label txtReadFifo; - private System.Windows.Forms.Label label7; - public System.Windows.Forms.Label txtRegisters; - private System.Windows.Forms.Label label6; - public System.Windows.Forms.CheckBox chkDebugMode; - public System.Windows.Forms.TreeView treTreeView; - public System.Windows.Forms.Label lblGif; - public System.Windows.Forms.Button btnStep; - public System.Windows.Forms.Button btnRunToSelection; - public System.Windows.Forms.Button cmdGoToStart; - public System.Windows.Forms.Button cmdGoToNextVSync; - public System.Windows.Forms.Label txtGifPacketSize; - private System.Windows.Forms.Label lblGIFPacketSize; - public System.Windows.Forms.TreeView treeGifPacketContent; - public System.Windows.Forms.Label lblContent; - } -} - diff --git a/tools/GSDumpGUI/Forms/frmMain.cs b/tools/GSDumpGUI/Forms/frmMain.cs deleted file mode 100644 index 1bad6a874a..0000000000 --- a/tools/GSDumpGUI/Forms/frmMain.cs +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using System.IO; -using System.Diagnostics; -using System.Linq; -using System.Linq.Expressions; -using GSDumpGUI.Forms.Entities; -using GSDumpGUI.Forms.Helper; -using GSDumpGUI.Forms.SettingsProvider; -using GSDumpGUI.Properties; -using TCPLibrary.MessageBased.Core; - -namespace GSDumpGUI -{ - public partial class GSDumpGUI : Form - { - private readonly ILogger _internalLogger; - private readonly ILogger _gsdxLogger; - private readonly IGsdxDllFinder _gsdxDllFinder; - private readonly IGsDumpFinder _gsDumpFinder; - private readonly IFolderWithFallBackFinder _folderWithFallBackFinder; - - public List Processes; - - private Int32 _selected; - public Int32 SelectedRad - { - get { return _selected; } - set - { - if (value > 6) - value = 0; - _selected = value; - switch (_selected) - { - case 0: - rdaNone.Checked = true; - break; - case 1: - rdaDX9HW.Checked = true; - break; - case 2: - rdaDX1011HW.Checked = true; - break; - case 3: - rdaOGLHW.Checked = true; - break; - case 4: - rdaDX9SW.Checked = true; - break; - case 5: - rdaDX1011SW.Checked = true; - break; - case 6: - rdaOGLSW.Checked = true; - break; - } - } - } - - private readonly Bitmap NoImage; - - private Settings Settings => Settings.Default; - - private readonly GsDumps _availableGsDumps; - private readonly GsDlls _availableGsDlls; - - private List _dllWatcher; - private List _dumpWatcher; - - enum FileChangeEvt { Dll = 1, Dump = 2 }; - private ConcurrentQueue _watcherEvents; - private System.Windows.Forms.Timer _fileChangesWatchdog; - - private string _gsdxPathOld, _dumpPathOld; - - public GSDumpGUI() - { - PortableXmlSettingsProvider.ApplyProvider(Settings); - - InitializeComponent(); - _internalLogger = new RichTextBoxLogger(txtIntLog); - _gsdxLogger = new RichTextBoxLogger(txtLog); - _gsdxDllFinder = new GsdxDllFinder(_internalLogger); - _gsDumpFinder = new GsDumpFinder(_internalLogger); - _folderWithFallBackFinder = new FolderWithFallBackFinder(); - _availableGsDumps = new GsDumps(); - _availableGsDlls = new GsDlls(); - - _availableGsDumps.OnIndexUpdatedEvent += UpdatePreviewImage; - - this.Text += Environment.Is64BitProcess ? " 64bits" : " 32bits"; - - if (String.IsNullOrEmpty(Settings.GSDXDir) || !Directory.Exists(Settings.GSDXDir)) - Settings.GSDXDir = AppDomain.CurrentDomain.BaseDirectory; - - if (String.IsNullOrEmpty(Settings.DumpDir) || !Directory.Exists(Settings.DumpDir)) - Settings.DumpDir = AppDomain.CurrentDomain.BaseDirectory; - - txtGSDXDirectory.Text = Settings.GSDXDir; - txtDumpsDirectory.Text = Settings.DumpDir; - - BindListControl(lstDumps, _availableGsDumps, g => g.Files, f => f.DisplayText, g => g.SelectedFileIndex); - BindListControl(lstGSDX, _availableGsDlls, g => g.Files, f => f.DisplayText, g => g.SelectedFileIndex); - - Processes = new List(); - - NoImage = CreateDefaultImage(); - - _dllWatcher = new List(); - _dumpWatcher = new List(); - _watcherEvents = new ConcurrentQueue(); - - _fileChangesWatchdog = new System.Windows.Forms.Timer(); - _fileChangesWatchdog.Tick += new EventHandler(FileChangesWatchdog); - _fileChangesWatchdog.Interval = 1000; - _fileChangesWatchdog.Start(); - } - - private void DisposeExtra() - { - foreach (FileSystemWatcher w in _dllWatcher) - { - w.EnableRaisingEvents = false; - w.Dispose(); - } - - foreach (FileSystemWatcher w in _dumpWatcher) - { - w.EnableRaisingEvents = false; - w.Dispose(); - } - - _dllWatcher.Clear(); - _dumpWatcher.Clear(); - - _fileChangesWatchdog.Stop(); - _fileChangesWatchdog.Dispose(); - } - - private void FileChangesWatchdog(object source, EventArgs e) - { - bool dllReload = false; - bool dumpReload = false; - - FileChangeEvt evt; - while (_watcherEvents.TryDequeue(out evt)) - { - if (evt == FileChangeEvt.Dll) dllReload = true; - else if (evt == FileChangeEvt.Dump) dumpReload = true; - } - - if (dllReload) ReloadGsdxDlls(); - if (dumpReload) ReloadGsdxDumps(); - } - - private void OnDllDirChange(object source, FileSystemEventArgs e) - { - _watcherEvents.Enqueue(FileChangeEvt.Dll); - } - - private void OnDumpDirChange(object source, FileSystemEventArgs e) - { - _watcherEvents.Enqueue(FileChangeEvt.Dump); - } - - private static void BindListControl(ListControl lb, TModel model, Func> collectionAccessor, Expression> displayTextAccessor, Expression> selectedIndexAccessor) - { - lb.DataSource = new BindingSource - { - DataSource = collectionAccessor(model) - }; - lb.DisplayMember = ((MemberExpression)displayTextAccessor.Body).Member.Name; - lb.DataBindings.Add(nameof(lb.SelectedIndex), model, ((MemberExpression)selectedIndexAccessor.Body).Member.Name, false, DataSourceUpdateMode.OnPropertyChanged); - } - - private static Bitmap CreateDefaultImage() - { - var defaultImage = new Bitmap(320, 240, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - using (var g = Graphics.FromImage(defaultImage)) - { - g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, 320, 240)); - g.DrawString("No Image", new Font(FontFamily.GenericSansSerif, 48, FontStyle.Regular), new SolidBrush(Color.White), new PointF(0, 70)); - } - - return defaultImage; - } - - private void ReloadGsdxDlls() - { - _internalLogger.Information("Starting GSdx Loading Procedures"); - - var gsdxFolder = _folderWithFallBackFinder.GetViaPatternWithFallback(Settings.GSDXDir, "*.dll", "", "plugins", "dll", "dlls"); - _availableGsDlls.Files.Clear(); - foreach (var file in _gsdxDllFinder.GetEnrichedPathToValidGsdxDlls(gsdxFolder)) - _availableGsDlls.Files.Add(file); - - Settings.GSDXDir = gsdxFolder.FullName; - _internalLogger.Information("Completed GSdx Loading Procedures"); - - string[] paths = { "", "\\plugins", "\\dll", "\\dlls" }; - - foreach (FileSystemWatcher w in _dllWatcher) - { - w.EnableRaisingEvents = false; - w.Dispose(); - } - - _dllWatcher.Clear(); - - for (int i = 0; i < paths.Length; i++) - { - try - { - FileSystemWatcher w = new FileSystemWatcher(Settings.GSDXDir + paths[i], "*.dll"); - //w.Changed += OnDllDirChange; - w.Created += OnDllDirChange; - w.Deleted += OnDllDirChange; - w.Renamed += OnDllDirChange; - w.EnableRaisingEvents = true; - _dllWatcher.Add(w); - } - catch { } - } - } - - private void ReloadGsdxDumps() - { - _internalLogger.Information("Starting GSdx Dump Loading Procedures..."); - - var dumpFolder = _folderWithFallBackFinder.GetViaPatternWithFallback(Settings.DumpDir, "*.gs", "", "dumps", "gsdumps"); - - _availableGsDumps.Files.Clear(); - foreach (var file in _gsDumpFinder.GetValidGsdxDumps(dumpFolder)) - _availableGsDumps.Files.Add(file); - - Settings.DumpDir = dumpFolder.FullName; - _internalLogger.Information("...Completed GSdx Dump Loading Procedures"); - - string[] paths = { "", "\\dumps", "\\gsdumps" }; - - foreach (FileSystemWatcher w in _dumpWatcher) - { - w.EnableRaisingEvents = false; - w.Dispose(); - } - - _dumpWatcher.Clear(); - - for (int i = 0; i < paths.Length; i++) - { - try - { - FileSystemWatcher w = new FileSystemWatcher(Settings.DumpDir + paths[i], "*.gs"); - //w.Changed += OnDumpDirChange; - w.Created += OnDumpDirChange; - w.Deleted += OnDumpDirChange; - w.Renamed += OnDumpDirChange; - w.EnableRaisingEvents = true; - _dumpWatcher.Add(w); - } - catch { } - } - } - - private void GSDumpGUI_Load(object sender, EventArgs e) - { - ReloadGsdxDlls(); - ReloadGsdxDumps(); - - // Auto select GS dump and GSdx dll - _availableGsDumps.Selected = _availableGsDumps.Files.FirstOrDefault(); - _availableGsDlls.Selected = _availableGsDlls.Files.FirstOrDefault(); - } - - private void cmdBrowseGSDX_Click(object sender, EventArgs e) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.ValidateNames = false; - ofd.CheckFileExists = false; - ofd.CheckPathExists = true; - ofd.InitialDirectory = Settings.GSDXDir; - ofd.FileName = "Select Folder"; - - if(ofd.ShowDialog() == DialogResult.OK) - { - string newpath = Path.GetDirectoryName(ofd.FileName); - if (!Settings.GSDXDir.Equals(newpath, StringComparison.OrdinalIgnoreCase)) - { - txtGSDXDirectory.Text = newpath; - Settings.GSDXDir = newpath; - Settings.Save(); - ReloadGsdxDlls(); - _availableGsDlls.Selected = _availableGsDlls.Files.FirstOrDefault(); - } - } - } - - private void cmdBrowseDumps_Click(object sender, EventArgs e) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.ValidateNames = false; - ofd.CheckFileExists = false; - ofd.CheckPathExists = true; - ofd.InitialDirectory = Settings.DumpDir; - ofd.FileName = "Select Folder"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - string newpath = Path.GetDirectoryName(ofd.FileName); - if (!Settings.DumpDir.Equals(newpath, StringComparison.OrdinalIgnoreCase)) - { - txtDumpsDirectory.Text = newpath; - Settings.DumpDir = newpath; - Settings.Save(); - ReloadGsdxDumps(); - _availableGsDumps.Selected = _availableGsDumps.Files.FirstOrDefault(); - } - } - } - - private void cmdRun_Click(object sender, EventArgs e) - { - // Execute the GSReplay function - if (!_availableGsDumps.IsSelected) - { - MessageBox.Show("Select your Dump first", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; - } - - if (!_availableGsDlls.IsSelected) - { - MessageBox.Show("Select your GSdx first", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; - } - - ExecuteFunction("GSReplay"); - } - - private void ExecuteFunction(String Function) - { - txtLog.Text = ""; - - CreateDirs(); - - // Set the Arguments to pass to the child - String SelectedRenderer = ""; - switch (SelectedRad) - { - case 0: - SelectedRenderer = "-1"; - break; - case 1: - SelectedRenderer = "0"; - break; - case 2: - SelectedRenderer = "3"; - break; - case 3: - SelectedRenderer = "12"; - break; - case 4: - SelectedRenderer = "1"; - break; - case 5: - SelectedRenderer = "4"; - break; - case 6: - SelectedRenderer = "13"; - break; - } - - if (SelectedRenderer != "-1") - { - String GSdxIniPath = AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\inis\\gsdx.ini"; - NativeMethods.WritePrivateProfileString("Settings", "Renderer", SelectedRenderer, GSdxIniPath); - } - var port = Program.Server.Port; - - // dll path is mandatory for the two operations GSReplay and GSconfigure but dumpPath only for GSReplay - var dllPath = _availableGsDlls.Selected.File.FullName; - var dumpPath = _availableGsDumps.Selected?.File?.FullName; - if (string.IsNullOrWhiteSpace(dumpPath) && "GSReplay".Equals(Function)) - throw new ArgumentException("You need to specify a dump path in case you want to replay a GsDump.", nameof(dumpPath)); - - _gsdxLogger.Information("Start new gsdx instance"); - _gsdxLogger.Information($"\tdll: {dllPath}"); - _gsdxLogger.Information($"\tdump: {dumpPath}"); - - // Start the child and link the events. - ProcessStartInfo psi = new ProcessStartInfo(); - psi.UseShellExecute = false; - psi.RedirectStandardOutput = true; - psi.RedirectStandardError = true; - psi.CreateNoWindow = true; - psi.FileName = Process.GetCurrentProcess().ProcessName; - psi.Arguments = "\"" + dllPath + "\"" + " \"" + dumpPath + "\"" + " \"" + Function + "\"" + " " + SelectedRenderer + " " + port; - Process p = Process.Start(psi); - p.OutputDataReceived += new DataReceivedEventHandler(p_StdOutDataReceived); - p.ErrorDataReceived += new DataReceivedEventHandler(p_StdErrDataReceived); - p.BeginOutputReadLine(); - p.BeginErrorReadLine(); - p.Exited += new EventHandler(p_Exited); - Processes.Add(p); - } - - private static void CreateDirs() - { - // Create and set the config directory. - String Dir = AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\"; - if (!Directory.Exists(Dir)) - { - Directory.CreateDirectory(Dir); - } - Dir += "\\Inis\\"; - if (!Directory.Exists(Dir)) - { - Directory.CreateDirectory(Dir); - File.Create(Dir + "\\gsdx.ini").Close(); - } - Dir = AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs"; - Directory.SetCurrentDirectory(Dir); - } - - private void p_Exited(object sender, EventArgs e) - { - // Remove the child if is closed - Processes.Remove((Process)sender); - } - - private void p_StdOutDataReceived(object sender, DataReceivedEventArgs e) - { - _gsdxLogger.Information(e.Data); - } - - private void p_StdErrDataReceived(object sender, DataReceivedEventArgs e) - { - _gsdxLogger.Error(e.Data); - } - - private void cmdConfigGSDX_Click(object sender, EventArgs e) - { - // Execute the GSconfigure function - if (!_availableGsDlls.IsSelected) - { - MessageBox.Show("Select your GSdx first", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; - } - - ExecuteFunction("GSconfigure"); - } - - private void cmdOpenIni_Click(object sender, EventArgs e) - { - // Execute the GSconfigure function - CreateDirs(); - Process.Start(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\inis\\gsdx.ini"); - } - - private void UpdatePreviewImage(object sender, GsFiles.SelectedIndexUpdatedEventArgs args) - { - if (pctBox.Image != NoImage) - pctBox.Image?.Dispose(); - if (_availableGsDumps.Selected?.PreviewFile == null) - { - pctBox.Image = NoImage; - pctBox.Cursor = Cursors.Default; - } - else - { - pctBox.Load(_availableGsDumps.Selected.PreviewFile.FullName); - pctBox.Cursor = Cursors.Hand; - } - - pctBox.Tag = _availableGsDumps.Selected?.PreviewFile?.FullName; - } - - private static void PreviewImageClick(object sender, EventArgs e) - { - var previewControl = (PictureBox)sender; - if (previewControl.Tag == null) - return; - Process.Start((string)previewControl.Tag); - } - - private void GSDumpGUI_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Return && !txtGSDXDirectory.Focused && !txtDumpsDirectory.Focused) - cmdRun_Click(sender, e); - - if (e.KeyCode == Keys.F1) - cmdConfigGSDX_Click(sender, e); - - if ((e.KeyCode == Keys.F2)) - SelectedRad++; - } - - private void rda_CheckedChanged(object sender, EventArgs e) - { - RadioButton itm = ((RadioButton)(sender)); - if (itm.Checked == true) - SelectedRad = Convert.ToInt32(itm.Tag); - } - - private void txtGSDXDirectory_Enter(object sender, EventArgs e) - { - _gsdxPathOld = txtGSDXDirectory.Text; - } - - private void txtDumpsDirectory_Enter(object sender, EventArgs e) - { - _dumpPathOld = txtDumpsDirectory.Text; - } - - private void txtGSDXDirectory_Leave(object sender, EventArgs e) - { - string newpath = txtGSDXDirectory.Text; - if (!_gsdxPathOld.Equals(newpath, StringComparison.OrdinalIgnoreCase)) - txtGSDXDirectory.Text = _gsdxPathOld; - } - - private void txtDumpsDirectory_Leave(object sender, EventArgs e) - { - string newpath = txtDumpsDirectory.Text; - if(!_dumpPathOld.Equals(newpath, StringComparison.OrdinalIgnoreCase)) - txtDumpsDirectory.Text = _dumpPathOld; - } - - private void txtGSDXDirectory_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Return) - { - string newpath = txtGSDXDirectory.Text; - if (!String.IsNullOrEmpty(newpath) && - !_gsdxPathOld.Equals(newpath, StringComparison.OrdinalIgnoreCase) && - Directory.Exists(newpath)) - { - _gsdxPathOld = newpath; - Settings.GSDXDir = newpath; - Settings.Save(); - ReloadGsdxDlls(); - _availableGsDlls.Selected = _availableGsDlls.Files.FirstOrDefault(); - } - } - } - - private void txtDumpsDirectory_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Return) - { - string newpath = txtDumpsDirectory.Text; - if (!String.IsNullOrEmpty(newpath) && - !_dumpPathOld.Equals(newpath, StringComparison.OrdinalIgnoreCase) && - Directory.Exists(newpath)) - { - _dumpPathOld = newpath; - Settings.DumpDir = newpath; - Settings.Save(); - ReloadGsdxDumps(); - _availableGsDumps.Selected = _availableGsDumps.Files.FirstOrDefault(); - } - } - } - - private void lstProcesses_SelectedIndexChanged(object sender, EventArgs e) - { - if (lstProcesses.SelectedIndex != -1) - { - chkDebugMode.Enabled = true; - - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.GetDebugMode; - msg.Parameters.Add(chkDebugMode.Checked); - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - - msg = new TCPMessage(); - msg.MessageType = MessageType.SizeDump; - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - - msg = new TCPMessage(); - msg.MessageType = MessageType.Statistics; - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - else - { - chkDebugMode.Enabled = false; - } - } - - private void chkDebugMode_CheckedChanged(object sender, EventArgs e) - { - if (lstProcesses.SelectedIndex != -1) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.SetDebugMode; - msg.Parameters.Add(chkDebugMode.Checked); - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - } - - private void btnStep_Click(object sender, EventArgs e) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.Step; - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - - private void btnRunToSelection_Click(object sender, EventArgs e) - { - if (treTreeView.SelectedNode != null) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.RunToCursor; - msg.Parameters.Add(Convert.ToInt32(treTreeView.SelectedNode.Text.Split(new string[]{" - "}, StringSplitOptions.None)[0])); - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - else - MessageBox.Show("You have not selected a node to jump to"); - } - - private void cmdGoToStart_Click(object sender, EventArgs e) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.RunToCursor; - msg.Parameters.Add(0); - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - - private void cmdGoToNextVSync_Click(object sender, EventArgs e) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.RunToNextVSync; - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - - private void treTreeView_AfterSelect(object sender, TreeViewEventArgs e) - { - if (treTreeView.SelectedNode != null) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.PacketInfo; - msg.Parameters.Add(Convert.ToInt32(treTreeView.SelectedNode.Text.Split(new string[] { " - " }, StringSplitOptions.None)[0])); - Program.Clients.Find(a => a.IPAddress == lstProcesses.SelectedItem.ToString()).Send(msg); - } - treTreeView.SelectedNode = e.Node; - } - - private void GSDumpGUI_FormClosing(object sender, FormClosingEventArgs e) - { - // Make sure all child processes are closed upon closing the main form - Processes.ForEach(p => - { - try { p.Kill(); } catch { } - p.Dispose(); - }); - } - } -} diff --git a/tools/GSDumpGUI/Forms/frmMain.resx b/tools/GSDumpGUI/Forms/frmMain.resx deleted file mode 100644 index 2501a738cb..0000000000 --- a/tools/GSDumpGUI/Forms/frmMain.resx +++ /dev/null @@ -1,2462 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAcAEBAAAAAAIABoBAAAdgAAABgYAAAAACAAiAkAAN4EAAAgIAAAAAAgAKgQAABmDgAAMDAAAAAA - IACoJQAADh8AAEBAAAAAACAAKEIAALZEAABgYAAAAAAgAKiUAADehgAAgIAAAAAAIAAoCAEAhhsBACgA - AAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /wv7+/tN+/v7j/v7+4/8/PxP7+/vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjo - 6Av8/Pxl/Pv717F3Z/Kvdmbz/Pz83Pv7+4Hz8/MWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/v - 7xD8/Pxn/fz83q90ZP6RPib/5crD/+28r/77+/rt+/v7h/Pz8xUAAAAAAAAAAAAAAAAAAAAAAAAAAPPz - 8xX9/f2E/Pz8576OgP6RPif/5srB/+SQe//jjnj/6qyc/v39/e/9/f2H8/PzFQAAAAAAAAAAAAAAAPPz - 8xX7+/uH/f397/3Hd/747eH/8unm/+mlk//rrZz//v7+/+abh//pqpr+/Pv77fr6+nTo6OgLAAAAAP// - /wz5+flb/Pz75/3Iev7+vV7//fn3//no5P/88/D/5piD//HIvP/+/v7/55yJ//jp5f77+vnf/Pz8Zf// - /wv5+flT/Pz8vf3x4Pr+tUz//vTj//rs6P/kknz/9+Da//vx7//ml4P/8svA//7+/v/Kopf/qWtZ/fv6 - +db7+/tE/Pjxtv3esPj9+vb//uCx//62Tf/+8t7/9t3X/+SSff/00cf/5ZaB//LLwP/EmIz/kT0n/5A9 - Jv+tcWDw+/v7fPzt19D9yX77/sFp//79+//+4bX//rhR//779v/23NX/5JF6//PMw//GnI//kT4n/5E9 - Jv+QPSb/wJOH8fv7+4L8/Pqp/fr56f3Iev7+wmr//sRv//7Ief/+9/P//ung//zz8f/+w6f/8rKW/5NA - Kf+QPSb/wZSH/fz8/Nf7+/tH+/v7Tf39/Yb8+/rt/cVz/v7Fcv/+9/P//php//6PXP/+49f//uzj//6Q - Xf/1vqf/1bWt/fz8/Nz8/Pxl////C+Pj4wnz8/MW+/v7hv39/en9+/n+/pJh//6xjf/+18T//o5Z//7i - 1f/+kV///cqz/vz8/Nn8/PxX////CgAAAAAAAAAAAAAAAPHx8RL6+vpo/Pz85v2zkP7+lmb//vr4//7T - v//+jFj//cOp/v39/eH8/Pxj39/fCAAAAAAAAAAAAAAAAAAAAAAAAAAA7u7uD/v7+4X8/Pzs/bST/v6Y - af/99fH//fbz+vz8/Nr8/Pxl5eXlCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MW+/v7hvz8 - ++T9tpb4/M259Pz8/Lf7+/tN////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjCfv7 - +0j8/Pyb/O/ow/z496H7+/tE////CQAAAAAAAAAAAAAAAAAAAAAAAAAA/n8AAPwfAAD4DwAA4AcAAMAH - AADAAwAAgAEAAAABAAAAAAAAAAEAAIADAADABwAA8A8AAPAfAAD4PwAA/H8AACgAAAAYAAAAMAAAAAEA - IAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjo - 6Av5+fkr/Pz8Wv39/X/9/f1//Pz8Wvn5+Szr6+sN////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////C/f39z37+/uJ+/v7vdS1rNDRr6bQ+/n5vfv7 - +5D4+PhM8/PzFn9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADo6OgL+vr6Ov39/ZP8/Pzf2r+395VGMPqVSDP74MrE+Pz8/Of8/Pyu/Pz8VvPz8xb///8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AvDw8BH7+/tA/f39k/v6+tzYvLT6mU45/5E+ - J//DlIf/8dfQ//Xb1P38+/rq/Pz8svz8/Fr19fUZf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD///8B8/PzFfj4+E77+/ud/Pz84NW4sPqVRS/+kT4n/8mglP/wx7z/5JR//+SUf/7z1Mv9/fz87vz8 - /LT5+flZ8/PzFX9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH19fUZ+fn5Wfz8/K78/Pzm9/Hu+6tu - XP+TQSr/w5SH/+7Dt//jj3n/55+M/+ediv/kl4T/9NrT/fv6+uz8/Pyy/Pz8V+np6RcAAAAAAAAAAAAA - AAAAAAAAf39/AvPz8xX8/PxZ/Pz8tPz8++v94rr8+82K/9zAtf/Tsqj/9uHc/+aZhf/ml4L/99/Z//rr - 5//oopD/5JWC//PSyvz7+vrr/Pz8rfz8/Erq6uoMAAAAAAAAAAAAAAAA6urqDPv7+0j8/Pyu/Pz77f3m - xv39uVf//r9j//727P/+/fz//PXz/+utnP/kkXz/8ce7//78/P/55uH/5puH/+SVgv/24Nr8/f395f39 - /Zf6+vo6////CwAAAADj4+MJ+fn5Kvv7+4H9/Pre/eO8/P26Wv/+wWj//u7W//bd1v/vv7P//fb1//zz - 8P/ttKT/5ZN+//DCtv/9+fj/+ebh/+utnv/13Nb/8ufl+vr599z8/PyU+/v7Pf///wr6+vox/Pz8dfz8 - /L389Ofx/bta/v66Vv/+7NH//v7+//DDuP/kkHr/7beo//36+f/89vT/66+e/+SQev/wwrb//v38//78 - /P/u4t7/mk45/tGwp/r7+/vg+/v7h/j4+CX7+/t5/Pz8xf369fD9/Pv8/d6v//67WP/+xnP//vPh//z1 - 8//stab/5JJ8/+++sf/99/b/99/Z/+OOeP/nnIj//PTy/+jX0v+kXkv/kD0m/5dJM/7Utaz2+vn3tPv7 - +0b8/Pyk/eO+5f3Ecf397tb//v38//7juv/+ulX//sFn//7x3f/9+fj/7rut/+SRe//rrJz/6aaT/+SQ - ev/yy8H/6NXP/59YRP+RPif/kT0n/5A9Jv+TQy7607Wsyfr6+mv9/f2z/OC46P24Uv7+wWn//vLg//79 - +//+3q7//rdP//7Fcf/++/X//Pb0/+yzpP/kkHr/5ZR///HHvP/s3dn/mk44/5E+J/+RPSb/kT4n/5A9 - Jv+bUj7649POy/r6+m/7+/uY/Pv51f3jvfz9uln//sBm//7u1//+8dv//rtY//67WP/+9+z//v7+//z2 - 9P/xxbn/9NLK//7w6f/eua3/lkUw/5E9Jv+RPif/kD0m/6RfTP7m1dD3/f39t/v7+079/f1r/f39qv39 - /e794rr9/bhS/v69Xv/+vV7//rhS//7iuP/+/Pv//tO///7u5//+/v7//vj1//6QXf/+n3P/1aqd/5I/ - KP+QPSb/m086/uXUz/r8/Pzf/f39h/j4+Cb5+fkr+fn5Wfz8/LP8+/nq/eC1/f25WP/+ulj//uG0//7z - 7P/+uJn//o1Z//6ecf/+4tb//v38//7Hrv/+kmD//qF3/9eomP+3gHL+49HL+Pz8/Nr9/f2T+/v7PP// - /wrj4+MJ9PT0F/z8/Fb8/Pyy/Pv67f3s0/396s///fj1//64mP/+jVn//p1w//6RX//+mmz//ubb//78 - +//+uZn//otX//25m/76+Pf4/Pz81fv7+436+vo5////CwAAAAAAAAAAf39/AvPz8xb8/PxY/Pz8rfz8 - /OL9/f35/dPA//6NWf/+nG///vXx//7SvP/+lGP//p9z//7Tv//+lmf//Z5z//3m3Pn8/PzY+/v7hvr6 - +jTl5eUKAAAAAAAAAAAAAAAAAAAAAP///wH09PQX+/v7Sfz8/JX8/Pzf/efc/P2Za//+k2L//trI//79 - /f/+2Mf//pVl//6LWP/9oXn//eje+/z8/Nz7+/uR+vr6N+Xl5QoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAB6urqDPv7+0P8/Pyo/Pz87P3ay/39k2H+/pdo//7j1v/+/f3//dG9//2ccP795Nr5/Pz83/z8 - /JX7+/s85eXlCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz8xX8/PxX+vr6svz7 - ++r93c/9/Zlr//6Yaf/92cn//fz8/P359vD8/PzT+/v7kfv7+z7r6+sNAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHz8/MW/Pz8Vvz8/LL8/Pzs/d3Q+v2SYv39oHf9/PXy7fz8 - /Lr8/Px1+vr6M+Xl5QoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C9PT0F/z8/Fb9/f2e/Pz8yPzh1eD86uHa/Pz8svz8/Gb4+Pgj////BwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjCfj4+Cb8/Pxc/f39iP39 - /aH7+/uO/Pz8X/f39yL///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/4H/AP8A - /wD+AH8A/AA/APgAHwDwAA8A4AAHAMAAAwDAAAEAgAABAAAAAQAAAAEAAAABAIAAAQDAAAMA4AAHAPAA - DwD4AB8A/AA/AP4AfwD/Af8A/4P/AP/H/wAoAAAAIAAAAEAAAAABACAAAAAAAAAgAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj4+MJ9vb2Hfv7 - +zz8/Pxe/f39eP39/Xj8/Pxe+/v7PPb29h3j4+MJ////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B6OjoC/n5 - +Sj5+flY+/v7iPz8/Kjz7uu48+zruPz6+qj7+/uJ/Pz8Xfr6+jDx8fESv7+/BAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Aerq - 6gz5+fks+vr6Zfz8/KX8/PvQ7eLf4q1yYuiqbFvo697a4vz8/NL8/Pyu+/v7ePf390D09PQX////BAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwLr6+sN+fn5LPz8/Gb8/Pyp/Pv73Ove2vSsbl76kD0l/JE/KfzClon7/f399v39/eX8/PzA+/v7hfv7 - +0T09PQYzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD///8D7+/vEPn5+S78/Pxm/Pz8qfv7+93p2dX2rnNi/pE/KP+RPSb/q2xa/+/e2v/35N/++ezn+vz7 - +uv8/PzE+/v7hvv7+0Xr6+sZzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAzMzMBfPz8xb6+vo4/Pz8bfz8/Kv8+/vc59bR9rB1Zf6SQSv/kT4n/61uXP/pz8f/7r6y/+ac - iv/rsqP+9+Xg+/z7+uv8/PzE+/v7hvv7+0X19fUZzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAMzMzAX09PQY9/f3Q/v7+338/Py1/Pz83+zg2/azfW79k0Ms/5E+J/+vc2H/58zE/+22 - qP/jjnj/4494/+OSff/rsaH+9uPe+/v6+uv8/PzE+/v7hvv7+0X09PQYzMzMBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADMzMwF6+vrGfv7+0X7+/uF/Pz8wfz8/Ob9/Pr34MrD/aFdSf+TQiz/t4Bx/+bM - xf/stKX/4495/+WVgP/ss6T/6KGP/+OSff/rsaP+9+Pf+vz7++r8/PzD+/v7hfv7+0Lz8/MV////AwAA - AAAAAAAAAAAAAAAAAAAAAAAA////BPT09Bj7+/tF+/v7hvz8/MT8+/rq/e3V+v3aqP7z3ML/yJ+S/8KV - iP/u4t7/8svA/+SQev/kkHr/7ban//vv7P/11s7/6KGP/+OTfv/rsqP+9+Pe+vv6+ur8/PzA+/v7fPr6 - +jf///8O////AQAAAAAAAAAAAAAAAAAAAAHw8PAR+/v7Pvv7+4T8/PzE/Pz76v3t1fr9zIT+/bhT//7c - qv/16uL/9e/t//38/P/008r/5ZR//+SQev/ss6T//Pb0//35+P/01s3/6KKQ/+OTfv/rsqP+9+Tf+fz7 - ++b8/Py0/Pz8bPn5+S7q6uoM////AQAAAAAAAAAA29vbB/j4+Cb6+vpt/Pz8u/z7+ur97db6/cuE/v23 - Uv/+wWn//unI//749P/99vT//v39//z18//xxrr/5ZN9/+WWgf/wwLP//Pb0//359//01c3/6KGP/+OS - ff/vw7j+/PXz9/z8/N/8/Pyr/Pz8Zvn5+Szo6OgLAAAAAOPj4wn29vYc+/v7SPz8/JX8/Pva/e7a+P3L - g/79t1H//sFo//7ju//++fL/8ce7/+ywoP/45N///v39//z19P/xx7v/5ZN9/+WXgv/vwLP//Pb0//34 - 9//118//7bep//TY0P/z6eb98+vp9vr5+d38/Pyp/Pz8ZPj4+Cff398I+Pj4Jfz8/FH9/f2E/Pz8vvz4 - 8ev926r8/bZQ//67Wf/+3az//vv1//77+v/ssqP/5JJ8/+mlkv/55uH//v7+//z29P/xx7z/5ZN9/+WX - g//vwLP//Pb0//36+f/88/D/8+fk/8KVif+wdmb+5NHM9vv6+tz8/Pyj/Pz8VPT09Bf8/PxQ/f39kvz8 - /Mj8/Pzm/fz5+P3mw/7+vmH//rhR//7OiP/+8t///v7+//ji3P/oo5D/5JF7/+ihj//66eX//v7+//z1 - 8//wxLj/4495/+aZhf/yy8D//v7+//Xv7f/FmIz/l0o1/5FAKv+oalj95dbR9Pv6+s37+/t8+fn5K/v7 - +3j8/Py9/Pr37P348Pr9/f3+/fn0//7ht//+v2H//rdP//7OiP/+8+L//v38//fi3f/noIz/5JB6/+ed - i//66uf//ff0/+y0pv/jj3n/5pqF//POxP/07ev/xJiL/5dIM/+RPif/kD0m/5E/KP+nZVP56NnW3vv6 - +pj7+/tH+/v7mPz38NT9y4P2/b9m/v3kv//+/v7//vz3//7htf/+vl///rZL//7PiP/+9eb//v7+//jl - 3//mnIf/4495/+abiP/rrZz/5JB5/+WXgv/yyL7/8+jl/8KVh/+VRC7/kT4n/5E9J/+RPSf/kD0m/489 - J/uxeWjk8+3rrPz8/GL9/f2k/Pbv1/3Gefj9tEv//r5h//7lv//+/v3//vz4//7gsv/+vl///rVK//7Q - iv/+9ur//v7+//jm4f/mmoX/4495/+OPef/ll4H/8se8//fx7v/JoJT/kj4n/5E+J/+RPSb/kT0m/5E+ - J/+QPSb/kUAp/MeflOX28/Kv/Pz8Zfv7+5D8/PvF/PHe8v3Fdf79tU3//sBl//7lwP/+/fr//vv0//7W - mf/+uFP//rZM//7pyP/+/fv//v7+//jl4f/mnYj/5pmE//HHvf/9+fj/38a+/5hKM/+RPif/kT0m/5E9 - Jv+RPif/kD0m/5RELv/BlIj68+7s4Pv7+5/8/PxP/Pz8bvz8/Kj9/fzl/e7Z+/3Hef79tU7//sFp//7l - v//+6Mf//sd1//64Uv/+yHj//vLg//769//+9vP//v7+//rq5//229P//vbz//7Yxv/zxbH/wYt7/5dG - Mf+RPSb/kT4n/5A9Jv+WSDL/wZSI/fLr6fT8/PzO/f39gPr6+jH7+/tJ/f39evz8/MP8+/ns/e3W+/3J - e/79t1L//r5h//6/Yf/+uFL//sl6//7u1f/+9vH//tTA//69oP/+6+P//v7+//7+/f/+59v//pJg//6V - ZP/xrpL/wId3/5dIMv+QPSb/l0o1/8GTh/3w6OX2/Pz83Pz8/KT8/PxV9fX1Gfj4+CT7+/tB+/v7hvz8 - /MX8+/ns/ezS+/3JfP79t1D//rdQ//7Je//+7dL//vXv//7Nt//+l2f//oxY//6pgf/+6d///v7+//7y - 7P/+s5D//pFf//6XZ//wr5P/w45//6hmVP7DmIz87+Xi9Pz8/Nz8/Pyp/Pz8ZPj4+Cff398I6OjoC/T0 - 9Bf7+/tE+/v7hvz8/MX8+/nr/ezR+v3Oiv79zYj//uvP//707f/+zbb//plr//6QXv/+lmb//oxX//6p - gv/+59z//v38//7q4P/+ror//otX//6ccP/3zbv/7uLf/PXv7fH9/f3W/Pz8pvz8/GX5+fks6OjoCwAA - AAAAAAABv7+/BOrq6hj7+/tE+/v7hvz8/MP8+/ro/fXn+P305v399vD+/s63//6bbf/+kF7//rWT//7J - sP/+nG7//o1Y//6rhP/+5dn//vDq//67m//+jFf//Ztu//3UwP38/Pzy/Pz80vv7+5z8/Pxe+fn5K+rq - 6gz///8BAAAAAAAAAAAAAAAA////BPT09Bj7+/tE/f39gvz8/Lr8/Pzf/Pz89P3o3v39p4D//oxY//6b - bv/+5tz//vz7//7Vwf/+nG///o5a//6ogP/+upv//pZn//2Xaf/9w6j9/PDq9Pz8/Nj8/Pye/Pz8WPj4 - +CXo6OgL////AQAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMBfT09Bj7+/s+/Pz8cfz8/Kv8/Pzd/e/p9/25 - mv79kWD//pVm//7Jsf/++fb//v38//7Ww//+nXD//oxX//6MWP/9l2j//cGn/fzu6PX9/f3b/f39pvz8 - /GH4+Pgn4+PjCQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////BPHx8RL19fUy+vr6bf39 - /bT8/Pzm/ejf+v21lP79kF7//pdo//7Jsf/++/n//vz7//7WxP/+nnL//ZVl//3Bp/387+n1/Pz83P39 - /aj6+vpm+fn5LOrq6gz///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Au/v - 7xD6+vo5+/v7fvz8/MH8/Pzq/erh+/20k/79j13//pZn//7Ir//+/Pv//fn3//3f0f791cP8/PDq9P39 - /dv9/f2o/Pz8Zvn5+S3r6+sN////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA////A/Pz8xb7+/tD+/v7hvz8/MT8/Pzr/ezj+/2zkf79jVr//pVl//3FrP/9+/r+/fz8+Pz5 - +Or8/PzR/Pz8pPz8/GX5+fkt6+vrDf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAzMzMBfT09Bj7+/tE+/v7hvz8/MX8/Pzq/e7n+P2wjv39i1f+/Zdo/v3u - 6Pj8/Pzk/f39uv39/Yr5+flZ+fn5Kv///wz///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////BOrq6hj7+/tE/f39g/z8/Lz9/f3b/PDr6/zB - pvT8z7vx/fn44fz8/Lr9/f16+/v7QPb29h3l5eUK////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/BPPz8xb7+/s8/f39a/v7 - +5b8/Py3/Pbzy/z498T8/Pym/f39d/v7+z/z8/MWzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4+PjCfb2 - 9h77+/s8/Pz8X/39/YD7+/uP+/v7gfz8/F/6+vo49PT0F8zMzAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////+B////AP///gA///wAH//4AA//8AAH/8AAA/+AAAP/AA - AB/wAAAP4AAAB8AAAAOAAAADgAAAAQAAAAEAAAABAAAAAYAAAAHAAAADwAAAB+AAAA/wAAAf+AAAP/4A - AH//AAD//4AB//+AA///wAf//+Af///4P////H//KAAAADAAAABgAAAAAQAgAAAAAAAASAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAB29vbB/Dw8BH39/ch+vr6N/v7+038/Pxi/f39b/r6+nD8/Pxi+/v7Tfr6 - +jf39/ci8fHxEtvb2wd/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHf398I9PT0F/n5+S38/PxK/Pz8Zvv7+3/7+/uR+/v7nPv7 - +5z7+/uR+/v7f/z8/Gb7+/tL+vr6MPX19Rrq6uoMv7+/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd/f3wj09PQY+vr6NPz8/Fr9/f2B+/v7n/z8 - /LP8+vq/+Pf2xfj29sX6+vq//Pz8s/v7+5/7+/uE/Pz8Yvv7+z/4+Pgj7+/vEMzMzAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B39/fCPX19Rr6+vo4/Pz8Yvv7 - +5H8/Py3/Pz8z/z8/Nzm1M7hqWpY5KloVuTexb7h/Pz83Pz8/ND8/Py7+/v7nPz8/HX7+/tN+fn5K/Hx - 8RLU1NQGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHf398I9fX1Gfr6 - +jf8/Pxj/Pz8lfz8/MH8/Pzf/f397vLq6PScVD/2jzwl9o88JfaYTDf25dLN9f39/e/8/Pzj/Pz8zfz8 - /K37+/uC/Pz8VPn5+Szy8vITzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AuPj - 4wn19fUa+vr6N/z8/GT7+/uW/Pz8wvz8/OL7+/v059bS+ppQOv2OOyP9jz0m/Y88Jf2VRzH90rCn/f39 - /fv9/f32/Pz86/z8/Nf8/Py0+/v7h/z8/Fb5+fku8vLyE9TU1AYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACqqqoD5eXlCvX19Rr6+vo5/Pz8Y/z8/JX8/PzC/Pz84vv7+/Tt4Nz8olxJ/o87JP6QPSb+kD0m/488 - Jf/NqJ7+/f39/v39/f79/Pz9/f39+f39/e/8/Pza/Pz8tvv7+4f8/PxW+fn5LfLy8hPU1NQGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAL+/vwTr6+sN9vb2Hvv7+zv6+vpm+/v7l/z8/ML8/Pzj/Pz79O3h3vyZTTf+jzsk/pA9 - Jv6QPSb/jzkh/7uIev/59fP/+Orm/+u0pv7prJz++Ofi/f38/Pr8/Pzx/Pz82vz8/Lf7+/uH/Pz8Vfn5 - +S3y8vITzMzMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA1NTUBvDw8BH4+Pgn+/v7Rvr6+m77+/ua/Pz8xPz8/OL8/Pz06djU+6Jd - Sv6POyT+kD0m/pA9Jv+RPyf/w5WI//nz8f/yzMH/5JF8/+KMd//ijnj+6KOS/vbh2/79/f36/f398P39 - /dv8/Py2+/v7h/z8/Fb5+fku8vLyE9TU1AYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8fHxEvn5+Sv8/PxQ+/v7e/z8/KX8/PzJ/f395fz8 - /PT07uz8nFI9/o88JP6QPSb+kD0m/4w1HP++jX//+/j3//PRx//jj3n/4495/+OPef/ijXj/4o95/uae - jP746OT+/f39+vz8/PH9/f3b/Pz8t/39/Yf8/PxV+fn5LPLy8hPMzMwFAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1Aby8vIT+fn5Lvz8/FX7+/uE+/v7sPz8 - /NL8/Pzo/Pz89fn29fymY1D+jzsj/pA9Jv6QPSb/kkAp/72Mfv/48e//8s3D/+OPef/jjnj/4495/+OP - eP/jjnj/4o54/+KOeP7noY/+9uHb/v39/fr9/f3w/Pz82vz8/Lb7+/uH/Pz8Vfn5+S3x8fESzMzMBQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTUBvLy8hP5+fkt/Pz8Vvv7 - +4f8/Py2/Pz82f39/e79/f34/f39/fr39/6hXEj+jjoi/pA9J/+SQCn/z6uh//v4+P/zzsT/5JF7/+OO - eP/jj3n/5I95/+68r//uvbD/4413/+KNeP/ij3n+56KR/vjn4/79/f36/f398Pv7+9v8/Py2/f39hvz8 - /FP5+fkp7u7uD7+/vwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8vLyE/n5 - +S38/PxV+/v7h/z8/Lf8/Pza/f398P38+/r98uL9/eW//v326/7y6eb+ol1J/5RELv/NqJ3//v39//z1 - 8//kknz/4454/+OPef/kj3n/7rms//35+P/+/fz/7r2v/+SRe//ijXj/4o54/uadi/73497+/fz8+v39 - /fD8/PzZ/Pz8tPv7+4D8/PxK9/f3Iujo6At/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzM - zAXw8PAR+fn5LPz8/FX7+/uH/Pz8tvz8/Nr9/f3w/f39+v3t1/79wmz+/bRI/v3Oi//++/j/7N7b/93D - vP/+/f3//v7+//bd1v/jjHX/4495/+OPef/llX///fj3//7+/v/+/v7//Pf1/+68r//jjnf/4o54/+KO - eP7opJP+9+Tf/v39/fr9/f3u/f391vz8/Kr8/Pxz+/v7P/b29hzj4+MJ////AQAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/Aurq6gz4+Pgl/Pz8T/v7+4T8/Py2/Pz82vz8/PH9/f36/fDe/v29YP79tEn+/bNK//7D - bf/++fL//v7+//7+/v/+/v7//v7+//z08//nn4z/4495/+OPef/jjXf/7ryv//77+v/+/v7//v7+//78 - /P/uuq3/5I95/+KNeP/ijnj+5p6L/vjp5P39/f34/Pz87Pz8/M38/Pye/Pz8aPr6+jn19fUZ39/fCAAA - AAEAAAAAAAAAAAAAAAAAAAAAzMzMBfT09Bf7+/s9/Pz8dfz8/K78/PzY/f397/39/fr97NP+/cFp/v20 - Sf79tEr//rVK//7Vmv/+/Pn//v7+//7+/v/+/v7//v7+//7+/v/34dz/6KKP/+OPef/jj3n/5I94/+/A - s//9+fj//v7+//7+/v/9+Pj/7ryv/+SPef/ijnj/4o54/uillP757+39/f399v39/eX8/PzF/f39l/r6 - +mX6+vo49fX1Gt/f3wj///8BAAAAAAAAAAG/v78E6urqDPj4+Cb8/PxV/Pz8lPz8/Mv8/Pzs/f39+f3y - 4v79wGf+/bRK/v20Sv/+tEn//tGP//769f/+/v7/+/Lv//TWzv/9+fj//v7+//7+/v/+/f3/+Obg/+ed - iv/jj3n/4495/+SRe//vv7L//v39//7+/v/+/v7//fj3/+65q//jjnf/4o14/+WYhf756+f+/f39/Pz8 - /PT8/Pzj/Pz8w/v7+5b8/Pxj+vr6OPT09Bjf398IAAAAAd/f3wjy8vIT9/f3Ivv7+0D8/Pxw/Pz8q/39 - /dv8+/v1/e7Z/P2+ZP79tEn+/bRK//62Tf/+0pH//v37//7+/v/9+ff/6KOR/+OMdf/rrZ3/+/Dt//7+ - /v/+/v7//v7+//jk3v/oopD/4495/+OPef/jjnf/78C0//349v/+/v7//v7+//78/P/vv7P/6aSS//TW - zv79/Pz++/f3/urc1/z7+vr0/Pz84vz8/ML8/PyV/Pz8Yvr6+jTz8/MW1NTUBvT09Bf5+fkv/Pz8Sv39 - /Wv8/PyU/Pz8w/z8/Ob9+vX4/cuA/f20Sv79tEr//rRI//7Tk//++fH//v7+//7+/v/67+v/4412/+OP - ef/jkHr/66+f//z29f/+/v7//v7+//79/f/34dv/552K/+OPef/jj3n/5JJ8//DBtP/+/f3//v7+//7+ - /v/9+vr//Pb0//39/f/8+vr+v4+D/p5VQf7fyML8/Pz89Pz8/OL8/PzA+/v7kPz8/Fj5+fkq6+vrDfn5 - +S38/PxU/f39f/z8/KH8/PzA/Pz83Pz8/PH9+PL7/cRz/v20Sv/+tUv//rRH//7erv/+/fr//v7+//7+ - /v/++/r/6qyb/+OQef/jj3n/4494/+qqmf/89PL//v7+//7+/v/+/v7/+efi/+igjv/jkHn/4495/+ON - dv/wwbX//fv6//7+/v/+/v7//v7+//v49//ClYj/jjgg/pA9Jf6TQiv+4crE/Pr5+fT8/Pzf/Pz8tfv7 - +3v7+/tA9PT0GPv7+0b6+vp3/Pz8q/z8/M78/Pzj/f398P39/fn9/Pv9/eXC/v69Xf/+tkv//rVL//69 - Xv/+3av//v79//7+/v/+/v7/+u3q/+qsnP/jj3j/4495/+OOeP/rsKH/+/Lv//7+/v/+/v7//v7+//bc - 1f/klH7/4495/+OPef/lk37/9t3X//7+/v/+/v7//fv7/8SYi/+UQyz/kD0n/5A8Jv6QPCX+nFM+/tvC - u/r8/Pzt/Pz8y/z8/JT8/PxU+Pj4Jfz8/Fv9/f2S/Pz8yPz8/Of8/Pz1/f39+/39/f39/f3+/f38/v7o - x//+vVz//rVL//61S//+tEn//t6u//7+/f/+/v7//v7+//zz8f/no5D/4495/+OPef/jj3n/6qua//35 - +P/+/v7//v7+//XXz//lk33/4495/+OPef/kkn3/9+Da//7+/v/8+vn/v4+C/487I/+RPif/kT4n/5A9 - Jv+QPSb+kD0m/pVFMPzj0Mry/f391vz8/KX8/Pxo+vr6Nfr6+nX8/Pyo/fz81/zu2vH91p37/eS//v36 - 9P79/f3+/f39/v7+/v/+5L3//r9h//61S//+tUv//rVJ//7dq//+/Pr//v7+//7+/v/78O3/6qyb/+OP - ef/jj3n/4454/+uvn//67er/9dnR/+WZhP/jj3n/4495/+WWgf/wwrb//fv6//z7+v/ClYj/kD0m/5E+ - J/+RPSb/kT4o/5E+J/+QPSb/kD0m/pA8JfyYSzb13MW+3fr6+rP7+/t8/Pz8Sv39/Yb8/Py4/fv44fzG - e/X9s0r9/bdS//7Wm//+/f3//v7+//7+/v/+/fr//uXA//69Xf/+tUv//rVL//64UP/+3q7//v7+//7+ - /v/+/v7/+u7r/+ikk//jj3j/4495/+SQev/nm4j/5ZWA/+OPef/jj3n/5JV///TTyv/+/Pz/8+zp/7J4 - Z/+SQCn/kT0n/5E+J/+RPif/kT0m/5E+J/+RPif/kD0m/489Jv2POyT2tX5u4Pn4+Lz7+/uL/Pz8Wv39 - /Yz8/Py7/Pv44/3Fc/b9s0v9/bRK//60R//+1pv//vr1//7+/v/+/v7//v7+//7lwP/+vmD//rVL//61 - S//+tEb//t6u//78+f/+/v7//v7+//z18v/pqZj/45B6/+OPef/jj3n/4495/+OPef/klH7/8svC//78 - /P/7+fj/vo1//444If+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kD0m/489Jv2SQSv2yaGX4Pv7 - +739/f2N/Pz8XP39/YD8/Pyv/Pv73fznyvP9v2T8/bRK/v20Sv/+tkz//tab//79+//+/v7//v7+//79 - +v/+5L3//r1f//61S//+tUv//rlT//7nxP/+/v7//v7+//7+/v/66+j/6amY/+OPeP/jj3n/4495/+WX - g//008r//vz7//z6+v/El4v/lEMt/5E+Jv+RPif/kT0m/5E+J/+RPib/kT4n/5E+J/+QPSb/kD0m/pJA - Kfy8jH/19e/t3vz8/Lf7+/uD/Pz8UP39/Wv7+/ua/Pz80P39/e796s78/b1g/v21Sv79s0r//rRI//7X - nf/+/fv//v7+//7+/v/+/vz//s+K//61Sf/+tUv//rVK//7apP/+/v7//v7+//7+/v/+/v7/+/Ty/+ik - k//jj3n/45B6//PQx//+/f3//v7+//Xv7f+SQCj/kDwl/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5A9 - Jv+QPSb+kkAp/r2Nf/z8/Pzz/Pz82fz8/Kv8/Pxx+/v7Pvz8/FH7+/uD/Pz8v/39/eX9/f34/efJ/f3B - aP79tUr+/bRK//60SP/+153//vv2//78+P/+37H//rxc//61S//+tkz//sFo//7s0f/+/v7//v7+//7+ - /v/+/v7//v7+//vw7f/xyL3/9tnS//78+//++PT//t3O//7e0P/hy8b/nVM//5I/Kf+QPSb/kT4n/5E+ - J/+RPif/kD0m/5A9Jv6RPyj+vIt9/vXv7vr8/Pzt/Pz8zfv7+5j8/Pxb+fn5K/v7+z78/Pxp/Pz8pvz8 - /NT9/f3v/fz7+v3oy/79vV/+/bVK/v2zSv/+u1n//t2r//7gs//+vFz//rVL//62TP/+v2H//uXB//79 - /P/+/v7//vz6//7z7f/+/fz//v7+//7+/v/+/v7//v7+//76+P/+so7//o9d//6MWP/+xKn/4cvF/5A8 - JP+QPCT/kT4n/5E+J/+QPSb/kD0m/pE/KP69joD++PX0/Pz8/PT8/Pzf/Pz8tv39/X37+/tD9fX1G/j4 - +Cf7+/tJ/f39f/z8/LP8/Pza/f397/39/fr96Mv+/cFo/v21Sv79tEr//rVJ//60Sf/+tUv//rZM//7B - Z//+5cH//v7+//7+/v/+8Or//rGO//6LVv/+u5v//vby//7+/v/+/v7//v7+//7z7f/+mWv//oxY//6M - V//+ilX//sqy/+LMxv+cUDz/kDwl/5A9Jv+QPSb+kkAp/ruKfP749fT8+/v79Pz8/OL8/PzA+/v7kPz8 - /Fn5+fkr7e3tDvPz8xX5+fkq/Pz8U/v7+4b8/Py2/Pz82v39/fD9/Pv6/efH/v2+YP79tUr+/bRK//61 - S//+tkz//r5i//7lwP/+/fz//v7+//7v6P/+rIb//o5b//6MWP/+jlv//reW//76+P/+/v7//v7+//78 - /P/+yLD//pVl//6MWP/+jFf//o9b//7Irv/fyML/mU45/405If6QPSb+vIx9/vXv7fv8/Pz0/Pz84vz8 - /ML8/PyV/Pz8Yvr6+jTz8/MW1NTUBuPj4wnx8fES+fn5LPz8/FX7+/uH/Pz8tvz8/Nr8/Pzx/f39+v3p - zf79v2P+/bVK/v20S//+v2T//uS+//7+/v/+/v7//vHq//6sh//+jFj//oxY//6MWP/+jFj//otW//61 - kv/+9/T//v7+//7+/v/+/v7//sWq//6VZf/+jFj//oxX//6FTv/+zLb/9e7s/sOYjf7Rsaj+/f39+vz8 - /PL9/f3h/Pz8wvv7+5b8/Pxj+vr6OPT09Bjf398IAAAAAf///wHU1NQG8vLyE/n5+S38/PxV/f39hvz8 - /Lb8/Pza/f397/39/fr96Mn+/cZ1/v3Dbv795MD//f39//7+/v/+8er//rCM//6OW//+jFj//otX//6L - Vv/+jFf//oxY//6OW//+uZr//vv5//7+/v/+/v7//vj0//7GrP/+i1b//oxY//2LV//9n3P+/fHr/v39 - /f39/f35/f397/z8/Nr8/Py8+/v7kvr6+mP6+vo39fX1Gt/f3wj///8BAAAAAAAAAAAAAAAAzMzMBfLy - 8hP5+fks/Pz8Vfv7+4f8/Py3/Pz82v39/fD9/fz5/fv4/f379/79/f3+/f39/v3x6//+p3///oxY//6M - WP/+jFf//qd///7k2P/+mm3//oxX//6MWP/+jFf//rKN//77+f/+/v7//v7+//7g0v/+iVT//YtX//2L - V/79lWb+/erh/v39/fr9/f3v/Pz82Pz8/LX7+/uK/Pz8Xfr6+jX09PQY39/fCAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAANTU1Aby8vIT+fn5Lfz8/Fb9/f2G/Pz8tPz8/Nf8/Pzq/Pz89f39/fv9/f3+/fv6/v21 - lf7+jVn//oxY//6LV//+pXz//uvi//7+/v/+4dT//pxv//6LV//+jFj//oxX//67m//+9/P//uPW//6j - ef/+i1j//YtX/v2RYP79xKv+/fj2+/z8/PH8/Pza/Pz8tP39/YP8/PxV+vr6MPT09Bff398I////AQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8vLyE/n5+S38/PxU+/v7gvz8/Kz8/PzM/Pz84/v7 - +/P8/Pz7/fby/v2RX/79ilf//oxY//6KVf/+49f//v7+//7+/v/+/f3//ubb//6Za//+i1f//oxY//6O - W//+oXf//php//2MWf/9i1f+/ZNi/v3Cp/799/X8/Pz89Pz8/OD8/Py8+/v7ivz8/FX5+fkr8vLyE9vb - 2wcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////BfHx8RL5+fkq+/v7Tfz8 - /HT7+/uc/Pz8wv39/eH8/Pz0/fr5/P2uiv79i1f+/YpX//6LWP/+pX3//u7m//7+/v/+/v7//v7+//7m - 2//+nG///oxX//6MWP/+i1f//otX//2LV/79kmH+/cCk/v37+vz8/Pzz/Pz84vz8/MH7+/uS/Pz8Xfr6 - +jDy8vITzMzMBQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU - 1Abv7+8Q+Pj4JPv7+z/8/Pxm+/v7l/z8/Mb8/Pzn/f39+P3t5f39p37+/YpV/v2LV//+jVj//qqD//7y - 7f/+/v7//v7+//79/f/+4dP//php//6MV//9i1f//YtX/v2TYv79v6T+/fXw+/z8/PT8/Pzi/Pz8wvz8 - /JX8/Pxj+vr6NfT09BfU1NQGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC/v78E6OjoC/X19Rr7+/s7/f39a/z8/KT8/PzS/f397v39/fr9+Pb+/aZ9/v2L - V/79ilf//otX//6ec//+8+3//v7+//7+/v/+/v7//u3l//6Ya//9i1f+/ZJg/v2/pP79/fz8/Pz89Pz8 - /OP8/PzC+/v7lvz8/GP6+vo39PT0F9/f3wgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AuXl5Qr39/cf+/v7Rv39/Xv8/Pyx/Pz82f39 - /e/9/f36/e3m/v2pg/79ilb+/YtX//6LV//+q4X//u/n//7+/v/9/f3+/f39/v3i1v79tZX+/cqz/f31 - 8fv8/Pzz/f394fz8/ML8/PyV+vr6ZPr6+jj19fUa39/fCP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLr6+sN+Pj4J/z8 - /FH7+/uF/Pz8tvz8/Nr8/Pzx/f39+v3x7P79pHr+/YpW/v2KV//+jFj//qV8//707//9/f3+/f39/v39 - /f39+vn7/fz79/39/fD8/Pzg/Pz8wfv7+5b6+vpk+vr6N/X19Rnf398IAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADMzMwF8fHxEvn5+Sz8/PxV+/v7h/z8/Lb8/Pza/f398P39/fr98ez+/aiC/v2LV/79i1f//opW//6n - f//97eb+/f39/f39/fn9/f3w/Pz85Pz8/NP8/Py5+/v7kvz8/GL6+vo49fX1Gd/f3wj///8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////BfLy8hP5+fkt/Pz8Vf39/Yb8/Py2/Pz82v39/e/9/f35/e3l/P2j - ev79ilX+/YtX/v2LV/79vJ79/f39+v39/e/9/f3b/Pz8wPz8/KP9/f2C/Pz8XPr6+jX19fUZ39/fCAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzAXy8vIT+fn5LPz8/FX7+/uH/Pz8tfz8 - /Nf8/Pzr/Pz88/338/j9pX77/YtX/P2RYfv9yrP4/f398Pz8/N38/Py7/f39j/z8/Gn7+/tI////LPPz - 8xbf398IAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU1NQG8vLyE/n5 - +S35+flV/f39gvz8/Kz8/PzI/Pz82f39/eX87eft/Miv8v3Xxu/89fLn/Pz82fz8/L37+/uT/Pz8Yfr6 - +jn39/cf7+/vENTU1Ab///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAzMzMBfHx8RL5+fkq+/v7Tvz8/HP7+/uT/Pz8rPz8/MH8/PzR/Pv72fz8/NT8/PzF/Pz8r/v7 - +5D8/Pxn+/v7O/X19Rvj4+MJqqqqAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1Abw8PAR+Pj4JPv7+z38/PxW+vr6cf39/Yr7+/uf/Pz8qPz8 - /KP7+/uR/f39d/z8/Fn6+vo69vb2Hujo6At/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHb29sH8PDwEff39x/6+voy+/v7Rvz8 - /F38/Pxs/Pz8cvz8/Gz8/Pxd+/v7RPr6+jD19fUb6urqDL+/vwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA///8P/// - AAD//+AH//8AAP//wAP//wAA//+AAP//AAD//wAAf/8AAP/+AAA//wAA//wAAB//AAD/+AAAD/8AAP/w - AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAD/AAD8AAAAAH8AAPwAAAAAPwAA+AAAAAAf - AAD4AAAAAA8AAPAAAAAABwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAADAAAAAAAAAAEAAAAA - AAAAAQAAAAAAAAABAACAAAAAAAMAAIAAAAAAAwAAwAAAAAAHAADgAAAAAAcAAOAAAAAADwAA8AAAAAAf - AAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/AAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/8AAAD/8AAP/4 - AAAf/wAA//gAAD//AAD//AAAf/8AAP/+AAD//wAA//8AA///AAD//4AH//8AAP//4A///wAA///4P/// - AAD///////8AACgAAABAAAAAgAAAAAEAIAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAf39/AtTU1Abr6+sN9PT0F/j4+CT6+vo0+/v7Rfz8/FX8/Pxj/f39a/39 - /Wv8/Pxj/Pz8Vfv7+0X6+vo0+Pj4JPT09Bfr6+sN1NTUBn9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjw8PAR9vb2Hvn5+S/7+/tC/Pz8Vvr6 - +mn9/f15+/v7h/v7+477+/uO+/v7h/39/Xn6+vpp/Pz8Vvv7+0L6+vow9/f3H/Hx8RLj4+MJv7+/BAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIT+Pj4I/r6 - +jj8/PxQ/Pz8af39/X79/f2P+/v7nfv7+6f8/Pys/Pz8rPv7+6f7+/ud/f39j/39/X78/Pxp/Pz8U/v7 - +zz5+fko9fX1Ge3t7Q7U1NQGf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f - 3wjy8vIU+Pj4Jvf39z/8/Pxc/f39evz8/JT8/Pyo/Pz8t/z8/MD5+PfG69/bye3g3Mn49PPG/Pz8wPz8 - /Lf8/Pyo+/v7lv39/X78/Pxk/Pz8Svr6+jL39/cf8PDwEd/f3wh/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/At/f3wjy8vIU+Pj4J/v7+0H8/Pxi/f39hPz8/KT8/Py8/Pz8zfz8/Nf69vbc2sG536ps - WeGrbl3h0rGo3/Xw7tz8/PzX/Pz8zfz8/L/8/Pyq+/v7kPr6+nP8/PxV+vr6Ofj4+CPx8fES39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIU+Pj4J/v7+0L8/Pxj+/v7iPz8/Kr8/PzH/Pz82vz8 - /Ob59vbs2Ly075xUP/CMOSLxjTki8ZdJM/DNqp/v9e7t7Pz8/Of8/Pzd/Pz8zvz8/Lj7+/ud+/v7fvz8 - /F37+/s++Pj4JfLy8hPf398If39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIU+Pj4J/v7+0L8/Pxk+/v7ifz8 - /Kz8/PzK/Pz84Pz8/O349vX117mx+J5WQfmPPCX5jzwm+Y88JvmPPCX5m1E7+dzCu/j+/Pz1/f398Pz8 - /Ob8/PzX/Pz8wvz8/Kb7+/uE/Pz8YPv7+0D4+Pgl8vLyE9/f3wh/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqA+Pj4wny8vIU+Pj4J/v7 - +0L6+vpk+/v7ifz8/K38/PzL/f394f39/fD59vb41riw+6BaR/2PPCX9jzwl/ZA9Jv2PPSX9jzwl/apt - XP3izsj9/f39/P39/fr8/Pz0/Pz87Pz8/N38/PzH/Pz8qvv7+4f8/Pxh+/v7QPj4+CXy8vIT39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABv7+/BOPj - 4wnz8/MV+Pj4J/v7+0L6+vpk+/v7ifz8/K38/PzL/Pz84v39/fD69/b41beu/aFcSP6QPCb+kDwl/pA9 - Jv6QPSb/jTgg/59XRP7jzsn+/fz8/v39/f79/f39/f39+/39/ff9/f3v/Pz84Pz8/Mn8/Pyr+/v7h/z8 - /GH7+/tA+Pj4JfLy8hPf398If39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CzMzMBerq6gz09PQX+fn5Kfv7+0P8/Pxk/f39ifz8/K38/PzL/Pz84v39/fD69/b41bat/aJd - Sv6QPSb+kDwl/pA9Jv6QPSb/jjcg/5tPOv/WubH//fz8/vv08v702NH+8s3E/vbd1/379vX8/f39+P39 - /fD9/f3h/Pz8yvz8/Kv7+/uH/Pz8Yfv7+z/4+Pgl8vLyE9/f3wh/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38C29vbB+7u7g/29vYc+fn5Lvv7+0j8/Pxo+/v7i/z8/K78/PzM/Pz84v39 - /fD6+Pf41bev/aJdSv6QPib+kDwl/pA9Jv6QPSb/jTcf/5pOOP/YurP/+vf1//fl4P/rs6X/5pyK/uWZ - hf7oppb+8tHJ/vv19Pz9/f34/f398P39/eH8/PzK/Pz8q/v7+4f8/Pxh+/v7P/j4+CXy8vIT39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C39/fCPHx8RL39/ch+vr6Nvz8/FD9/f1v+/v7kPz8 - /LH8/PzN/Pz84/z8/PH6+Pf41rmx/aJdSv6QPib+kDwl/pA9Jv6QPSb/jTgf/5pOOP/avrX/+/j3//fi - 2//pppT/4495/+KNd//ijnj+45B7/uijkv7z0cn+/Pb1/P39/fj9/f3w/f394fz8/Mr8/Pyr+/v7h/z8 - /GH7+/s/+Pj4JfLy8hPf398If39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C39/fCPHx8RL4+Pgk+/v7PPz8 - /Fn7+/t5+/v7mfz8/Lf8/PzQ/Pz85Pz8/PH6+Pf52b21/aFcSP6QPSb+kDwl/pA9Jv6QPSb/jTgf/5pO - Of/avrb/+/j3//jk3v/ooY7/4413/+OOeP/jj3n/4o54/+KOeP7jkHv+56OR/vPSyv789/X8/f39+P39 - /fD9/f3h/Pz8yvz8/Kz7+/uH/Pz8Yff390D4+Pgl8vLyE9/f3wh/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C39/fCPLy - 8hP4+Pgl+/v7P/z8/F/7+/uC/Pz8o/z8/L/9/f3W/Pz85/z8/PL8/Pz54MvE/aJeSv6QPSX+kDwl/pA9 - Jv6QPSb/jTgg/5pOOP/avbb/+vf2//jl4P/nnor/44x2/+OPeP/jj3n/4495/+OPef/ijnj/4o54/uOQ - ev7nopD+89TL/vz49vz9/f34/f398P39/eH8/PzL/Pz8rPv7+4f8/Pxh9/f3QPj4+CXx8fES39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C39/fCPLy8hP4+Pgl+/v7P/z8/GH7+/uG/Pz8qfz8/Mb8/Pzc/Pz86/z8/PT9/f36+PX0/c2o - nf6POyP+kD0l/pA9Jv6QPSb/jjkh/5xRPP/Zvrf/+vf2//nm4P/nnIf/44x2/+OPef/jj3n/4495/+OP - eP/jjXf/4454/+KOeP/ijnj+45B6/uegjv701s7++/j3/f39/fj8/Pzx/Pz84vz8/Mv8/Pys+/v7h/z8 - /GH39/c/+Pj4JPDw8BHb29sHf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38C39/fCPLy8hP4+Pgl+/v7P/z8/GH7+/uH/Pz8rPz8/Mr9/f3h/f397/39 - /ff9/f38/f39/vz7+/7XurL+k0Ms/o46I/6QPSf/jzoj/6hoVv/m1ND//fz8//nn4v/nnYn/44x1/+OP - ef/jj3n/4495/+WUf//uu67/9trT/+usnP/jjXf/4o54/+KOeP7ij3n+5p6M/vTY0P78+fj9/f39+fz8 - /PH8/Pzi/Pz8y/z8/Kv7+/uG/Pz8Xvv7+zv39/cg7u7uD8zMzAUAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C39/fCPLy8hP4+Pgl+/v7P/z8/GH7+/uH/Pz8rPz8 - /Mv8/Pzi/f398P39/fn9/Pr8/fbq/v3y4P79+/f++PPy/sylmv6VRS//jzoj/6hnVf/m083//v39//77 - +v/qp5b/44x2/+OPef/jj3n/4495/+STfP/uuaz//PX0//7+/f/45N//6qmY/+SPeP/ijnj/4o54/uKP - ef7mnYv+9NnS/vz6+f39/f35/f398Pz8/OL8/PzJ/Pz8qfv7+4H8/PxY+vr6NfX19Rvo6OgLqqqqAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C39/fCPHx8RL4+Pgl+/v7P/z8 - /GH7+/uH/Pz8q/z8/Mr9/f3h/Pz88f39/fn9+/j9/ebG/v2+Yf79tU3+/tCR/v369f/38vD/yaGV/7Bz - Yv/jzsf//v39//7+/v/45uH/5peC/+OOeP/jj3n/4495/+OPef/ppJH//Pb0//7+/v/+/v7//v79//fj - 3f/qqZj/5JB5/+KOeP/ijnj+4o95/uaei/712tP+/Pr5/f39/fn9/f3w/Pz83/z8/Mb7+/ui+/v7ePz8 - /E/5+fku9PT0F+Pj4wl/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1NTUBu/v - 7xD39/ci+/v7Pvz8/GD9/f2G/Pz8q/z8/Mr9/f3h/f398P39/fj9+/j9/ejI/v29YP79tEn+/bJI//29 - Yv/+6s3//v7+//r39v/59PP//f38//7+/v/+/v7/9+Tf/+ebh//jj3n/4495/+OPef/jjnj/6aeU//z0 - 8//+/v7//v7+//7+/v/+/f3/9+Da/+qpmP/kkXv/4o54/+GNeP/ij3n+5p6L/vTa0/78+fj9/f39+Pz8 - /O39/f3b/Pz8vvv7+5j8/Pxu+/v7R/n5+Snz8/MV4+PjCX9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqqqqA+jo6Av29vYc+vr6N/z8/Fv7+/uD/Pz8qfz8/Mn9/f3h/f398P39/fj9+vb9/ebE/v29 - YP79tEn+/bNK//20Sf/+vmD//uXA//7+/v/+/v7//v7+//7+/v/+/v7//v7+//349v/vvrH/5ZeC/+OP - ef/jj3n/4495/+SSff/vv7L/+/Lv//7+/v/+/v7//v7+//79/f/339n/6qmY/+SRe//ijnj/4Y14/+KP - ef7mnor+89nR/v36+fv9/f32/Pz86vz8/NX8/Py1+/v7j/z8/Gf7+/tD+Pj4J/Ly8hTf398If39/AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAdTU1Abx8fES+fn5Kvv7+079/f14/Pz8o/z8/Mb8/Pzg/f397/39 - /fj9+vb8/eTB/v2+Yf79tEn+/rRK/v20Sv/+tk7//sh5//7v2v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+/Lv/+68sP/lloL/4495/+OPef/jj3n/5ZWA/+/As//78e7//v7+//7+/v/+/v7//v39//be - 2P/qqZj/5JF7/+KOeP/ijnj+4o94/uaejP72497+/f39+vz8/PT8/Pzm/Pz8z/v7+7D7+/uL/Pz8ZPv7 - +0L4+Pgn8vLyFN/f3wh/f38CAAAAAAAAAAAAAAAAAAAAAb+/vwTo6OgL9vb2HPr6+jn6+vpj/f39kf7+ - /rv9/f3b/f397v39/fj9+vX8/eS//v2/Zf79tEr+/bRK/v20Sv/+tk3//sZ0//7py//+/v3//v7+//33 - 9v/77+z//Pb0//7+/f/+/v7//v7+//7+/v/78e//7r2v/+WWgv/jj3n/4495/+OPeP/lloH/78C0//vw - 7f/+/v7//v7+//7+/v/+/f3/9t7Y/+qpmP/kkXv/4o54/+KOeP7ijXf+8czC/v39/f39/f35/Pz88fz8 - /OP8/PzM/Pz8rv39/Yn8/Pxk+/v7Qvj4+Cfy8vIU39/fCH9/fwIAAAAAqqqqA9TU1Abo6OgL8/PzFvn5 - +Sr8/PxK+/v7dvz8/KX8/PzM/Pz85/z8/PX9+vX7/eK9/v3BaP79tUv+/bRK/v20Sv/+tUv//sZ0//7q - y//+/vz//v7+//vy7//yzcT/7LWm//LKwP/78O3//v79//7+/v/+/v7//v7+//vy7//vvrH/5ZeC/+OP - ef/jj3n/4494/+aXg//vwbT/++/s//7+/v/+/v7//v7+//79/f/33tj/6qmY/+OPef/ijHb/5p+O/vfi - 3f79/f3+/Pz8/f39/Pj9/f3w/Pz84vz8/Mv8/Pyt+/v7ifz8/GP7+/tB+Pj4JvLy8hPb29sHf39/At/f - 3wjv7+8Q9fX1G/n5+Sn7+/tA/Pz8YPv7+4r8/Py1/Pz82P39/e79+vf5/eO9/f3Ba/79tUz+/bRK/v20 - Sv/+tUr//sVx//7qzP/+/vz//v7+//78+//01cz/5pmF/+ONdv/lmIT/8MK3//vw7f/+/v7//v7+//7+ - /v/+/v7/+/Hu/++/sv/lmIP/4495/+OPef/jj3j/5piE/+/Btf/67+z//v7+//7+/v/+/v7//v39//fh - 2v/ttab/7LSl//TZ0v79/Pv+/fz8/vLp5/7bw7r98+zq+P39/fD8/Pzi/Pz8y/z8/Kz7+/uI/Pz8Yfv7 - +z739/ci7u7uD8zMzAXx8fES9/f3Ifr6+jT7+/tI/Pz8YPv7+377+/ui/Pz8xf39/eH8/Pzz/e7Y+/3F - dP79tUz+/bRK/v20Sv/+tUn//sZ1//7rzv/+/vz//v7+//7+/v/9+Pf/8MW6/+ONd//jj3n/4454/+WY - hP/wwrb/+/Hv//7+/v/+/v7//v7+//7+/v/77+z/78C0/+WYg//jj3n/4495/+OPeP/mmIT/8MG1//vw - 7P/+/v7//v7+//7+/v/+/v3/+/Dt//vx7//9/fz//f39/vTt6/7Dlor+olxJ/sihlv3z6+n4/f398P39 - /eH8/PzK/Pz8qv39/YP8/Pxa+vr6NfX19Rrl5eUK9/f3H/r6+jf8/PxU/f39b/v7+4n7+/ui/Pz8vfz8 - /Nf8/Pzr/f399/3kv/z9vF/+/bRJ/v20Sv/+tUv//rRG//7Yov/+/v3//v7+//7+/v/+/v7//vv6//PS - yf/lmIP/4494/+OPef/jj3j/5ZiD//DBtv/88/H//v7+//7+/v/+/v7//v79//rv6//vwbT/5piE/+OP - ef/jj3n/4454/+aYg//wwrX/+/Hu//7+/v/+/v7//v7+//7+/v/+/v7//v7+//bw7v/Dl4v+l0gy/o88 - Jf6cUz7+yaGW/fPs6vj9/f3w/Pz84Pz8/Mb7+/ui+/v7dvz8/Er4+Pgn7+/vEPn5+S78/PxP/Pz8dPv7 - +5b7+/uw/Pz8xfz8/Nj8/Pzn/Pz88/39/fr97tj9/cd5/v22Tv/+tUv//rVL//61Sv/+yn///urM//7+ - /f/+/v7//v7+//7+/v/77+z/77+y/+WWgv/jj3n/4495/+OPeP/ll4L/78G1//z18//+/v7//v7+//7+ - /v/+/f3/+u7q//DBtf/mmYX/4495/+OPef/jjnj/5peD//HGuv/89PL//v7+//7+/v/+/v7//v7+//n1 - 8//Bk4b/lkgx/487JP6QPSb+kD0m/p5WQv7LpZv88uro+Pz8/O38/PzZ/Pz8uPv7+438/Pxc+vr6NPT0 - 9Bj7+/s9/Pz8ZPv7+5D8/Py1/Pz8z/z8/OD8/Pzr/Pz88/39/fn9/f38/fr3/v3lwv7+xXD//rdO//61 - S//+tUv//rlU//7Cav/+6Mj//v79//7+/v/+/v7//v39//rt6v/uvbD/5ZaB/+OPef/jj3n/4495/+WW - gf/vwLP//fj3//7+/v/+/v7//v7+//79/f/66ub/7LSl/+ONd//jj3n/4495/+OPeP/pp5b/+ejk//7+ - /v/+/v7//v7+//z5+f/AkYT/lUUv/5A8Jv+QPSb/kDwl/pA9Jv6QPSb+m1E8/smhl/vz7ev0/Pz85Pz8 - /Mf7+/ud/Pz8bfv7+0H39/ch+/v7Tv39/Xj8/Pyl/Pz8yfz8/OL9/f3v/f399v39/fr9/f38/f39/v39 - /f79+vX+/uXB//7Ebv/+t03//rVL//61S//+tUv//sFp//7pyP/+/v3//v7+//7+/v/+/f3/+u7r/+68 - rv/klYD/4495/+OPef/jj3n/5JR//+++sf/9+fj//v7+//7+/v/+/fz/+eXg/+qqmv/jj3j/4495/+OP - ef/jjXf/6qua//nq5//+/v7//v39//r39v+/kIP/lEMt/5A9Jv+RPif/kT4n/5A9Jv+QPSb+kDwl/pA9 - Jf6bUDz8yqSZ9/Pt6+r8/PzQ/Pz8qv39/Xz8/PxQ+fn5Lfz8/F/7+/uK/Pz8tf39/db8+vns/fPm9/3v - 3Pz9+PH+/f39/v39/f79/f3+/f39/v779//+5cL//sNr//62TP/+tUv//rVL//61S//+wmn//unJ//7+ - /f/+/v7//v7+//79/f/77+z/7bqs/+SUf//jj3n/4495/+OPef/kkn3/772w//35+P/+/f3/+ejk/+ut - nf/kkn3/4495/+OPef/jjnj/5JJ8//PPxv/9+vn//v7+//r39v+0e2v/kkEq/5A9Jv+RPif/kD0m/5E+ - J/+RPif/kD0m/5A9Jv6QPSb+kD0l/JlNOfjLpZzt9e/u1vz8/LT9/f2J/Pz8YPv7+zz9/f1v+/v7mvz8 - /MP8+vjg/OjJ8f3BbPr9u139/dCQ/v3v2v79/f3+/f39/v39/f7+/v7//v36//7mw//+wGf//rZL//61 - S//+tUv//rVL//7Caf/+6cr//v79//7+/v/+/v7//v7+//vx7v/tuKr/5JR+/+OPef/jj3n/4495/+SS - fP/vwbT/9+Lc/+uun//jkHr/4495/+OPef/jj3j/5p2J//TRyP/9+Pb//Pv6//r29f++joD/kUAp/5A9 - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/o89Jv2PPCX5l0o07tW2rtr59fW8+/v7lvz8 - /HD7+/tL/f39e/z8/Kb8/PzL/fPj5fzHfPT9s0j7/bRK/v20Sf/+yXr//vDa//7+/v/+/v7//v7+//7+ - /v/+/v3//ufF//7AZf/+tkv//rVL//61S//+tUr//sNq//7qzf/+/v7//v7+//7+/v/+/v7//PPx/+y2 - p//jk3z/4495/+OPef/jj3n/5I95/+SPef/kkHn/4495/+OPef/jj3j/5puH//TRx//9+vj//v38/+3i - 3v+vc2L/kD0m/5E9J/+RPif/kT4n/5E+J/+RPib/kT0m/5E+J/+RPif/kT4n/5A9Jv+QPSb9jzwm+Y03 - IO+/koXd8+zqwfz8/J79/f16/Pz8Vv39/X78/Pyp/Pz8zfzw4Of8xHT1/bNJ+/20Sv79tEr//rRI//7J - fP/+8Nv//v79//7+/v/+/v7//v7+//7+/v/+58T//sBm//62S//+tUv//rVL//61SP/+w2z//uvO//7+ - /f/+/v7//v7+//7+/v/89fL/7LSl/+SSfP/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/5puH//PO - xf/++vn//v7+//r29f+2fm7/kDwk/5A9Jf+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+QPSb/kD0m/Y89JvmTQy7w0rGo3fj19ML8/Pyg/f39fPz8/Ff9/f12/Pz8ofz8/Mj8+fPj/OG38/29 - Yfv9tUv+/bRK/v20Sv/+tEf//sp9//7w2//+/fz//v7+//7+/v/+/v7//v79//7mwv/+wmr//rdN//61 - S//+tUv//rRJ//7Fcf/+7NL//v79//7+/v/+/v7//v7+//z08f/stKX/45J8/+OPef/jj3n/4495/+OP - ef/jkHn/5pyJ//LNxP/9+vn//v7+//jy8f/EmIv/lUYv/5A8Jf+RPif/kT4n/5E+J/+RPif/kD0m/5E+ - J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9Jv2URzH5v5CD7+/m5Nz8/Py//Pz8m/z8/HX8/PxQ/Pz8Z/v7 - +5L8/Py8/Pz83P347/D93K/6/b5l/f21TP79tEr+/bRK//60R//+y3///vDc//79/P/+/v7//v7+//7+ - /v/+/fr//ubB//7Baf/+tUv//rVL//61S//+tEj//tSU//758P/+/v7//v7+//7+/v/+/v7//PTx/+y0 - pf/kk3z/4495/+OPef/jkHr/556L//POxf/9+vn//v7+//v49//In5T/lkgy/5A8Jf+RPif/kT4n/5E+ - J/+RPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9Jv6XSTT8vIx++O7i3+78/PzZ/Pz8ufv7 - +5H8/Pxp+/v7RPz8/FT9/f1//Pz8rvz8/NP8/Pzr/fft+P3drf39wGb+/bZN/v20Sv79tEr//rRH//7L - gP/+8Nz//v38//7+/v/+/v7//v79//7y3//+yHn//rVJ//61S//+tUv//rZM//7Skv/+9+v//v7+//7+ - /v/+/v7//v7+//7+/v/79PL/7LWn/+SVgP/kkXv/55+M//LNxP/9+fn//v7+//7+/v/59fP/wZOG/5RE - Lf+QPCX/kT4m/5E+Jv+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9Jv6YSjX+vIx+/O3h - 3vf8/Pzr/Pz80/z8/K/9/f2D/Pz8Wvr6+jb7+/tD/Pz8bfz8/J78/PzH/Pz85Pz8/PT99u37/dyu/v3B - aP79tk3+/bRK/v20Sv/+tEf//syB//7x3f/+/v3//v7+//705f/+1pv//r1e//61S//+tUv//rdP//7B - aP/+4bf//vv2//7+/v/+/v7//v7+//7+/v/+/v7//v7+//zz8P/wxLn/7LOj//XVzf/9+vn//v38//7z - 7v/+6eD//urh/+zY0v+4gnT/lEMt/5E+J/+QPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9 - Jv6YSzb+vIx9/u3f3Pv8/Pz0/f395fz8/Mr7+/ui/Pz8c/v7+0n5+fko+vr6Nfz8/Fv7+/uL/Pz8t/z8 - /Nj8/Pzt/f399/327Pz93K3+/cFo/v22Tf79tEr+/bRK//60SP/+0Y3//vPh//705f/+1Zj//rxa//62 - S//+tUv//rdP//7BaP/+26f//vbp//7+/v/+/v7//v38//76+P/+/fz//v7+//7+/v/+/v7//v39//37 - +v/+/f3//v39//7t5P/+waT//qZ///6ngP/+zLX/7NbO/7eCc/+WRjD/kDwl/5E+Jv+RPif/kT4n/5E+ - J/+QPSb/kD0m/pA9Jv6YTDb+vIt8/uze2/z9/f34/Pz87fz8/Nn8/Py6/f39j/z8/GH6+vo59vb2HPj4 - +Cf7+/tI/Pz8c/v7+5/8/PzE/Pz83/39/e/9/f34/fbs/P3crf79wWj+/bZN/v20Sv79tUv//rxb//7N - hf/+z4r//rta//62S//+tUv//rdP//7BaP/+2qX//vXn//7+/v/+/v7//vfz//7dzv/+ybL//tnI//74 - 9f/+/v7//v7+//7+/v/+/v7//v7+//759//+zrf//pFe//6LVv/+iVT//pZm//7Ksv/s19D/toBx/5NC - Kv+QPCX/kT4n/5E+J/+QPSb/kD0m/pA9Jv6YSzb+vIt8/urd2f39/f34/f398Pz8/OD8/PzG+/v7ov39 - /Xf7+/tM+fn5KfHx8RL19fUa+vr6M/z8/Fj7+/uB/Pz8qPz8/Mj8/Pzg/f397/39/fj99uz8/dyt/v3B - Z/79tk3+/bRK/v21S//+tUn//rRJ//61S//+tUv//rdP//7BZ//+2qX//vXn//7+/v/+/v7//vby//7R - vP/+o3j//o1a//6bbf/+zrf//vn3//7+/v/+/v7//v7+//7+/v/++PX//sqy//6QXf/+jFj//oxY//6J - VP/+lmf//sqz/+3Y0v+4g3T/kj8o/487JP+QPSb/kD0m/pA9Jv6XSjX+u4p8/uvd2f39/f34/f398P39 - /eH8/PzK/Pz8qvv7+4T8/Pxb+vr6NvX19Rvo6OgL7u7uD/f39yD7+/s8/Pz8X/v7+4b8/Pyq/Pz8yfz8 - /OD9/f3w/f39+P327Pz93Kz+/cBm/v22TP79tEr+/bRK//61S//+tUv//rdO//7AZv/+2qX//vXo//7+ - /v/+/v7//vby//7Qu//+oXf//o5b//6MWP/+i1f//php//7Mtf/++vj//v7+//7+/v/+/v7//vz8//7i - 1f/+qoT//pFf//6MWP/+jFj//opU//6WZv/+yrL/7dvV/7iEdv+RPSb+jjoi/o87JP6WRzH+vIt8/uzf - 2/z9/f34/f398Pz8/OL8/PzL/Pz8rPv7+4j8/Pxh+/v7Pvf39yLu7u4P1NTUBt/f3wjx8fES+Pj4JPv7 - +z/8/Pxh+/v7h/z8/Kv8/PzJ/f394f39/fD9/f34/fbs/P3crf79v2X+/bVL/v20Sv79tEr//rZO//7A - Zf/+2qT//vXo//7+/v/+/v7//vby//7Qu//+onf//o5b//6MWP/+jFj//oxY//6LV//+l2j//suz//76 - +f/+/v7//v7+//7+/v/++PX//tfF//6pgv/+kV///oxY//6MWP/+ilT//pVk//7LtP/u39r/y6Wb/qlp - WP6mZVL+w5iM/u7g3fv9/f33/f397/39/eH8/PzL/Pz8rfv7+4n8/Pxj+/v7Qfj4+Cby8vIT29vbB39/ - fwJ/f38C39/fCPLy8hP4+Pgl+/v7QPz8/GH7+/uH/Pz8q/z8/Mn9/f3h/f398P39/fj99+78/d2t/v2+ - Yf79tEj+/bRK/v2+Yv/+2qT//vbp//7+/v/+/v7//vbz//7RvP/+oXf//o5b//6MWP/+jFj//oxY//6M - WP/+jFj//otX//6XZ//+ybH//vr4//7+/v/+/v7//v7+//739P/+1sP//qmB//6RX//+jFj//oxY//6K - VP/9lGX//uPX/vn29f7n19L+5NPN/vPr6fv9/f32/Pz87f39/d78/PzJ/Pz8rPv7+4n8/Pxk+/v7Qvj4 - +Cfy8vIU39/fCH9/fwIAAAAAAAAAAH9/fwLf398I8vLyE/j4+Cb7+/tA/Pz8Yfv7+4f8/Pyr/Pz8yv39 - /eH9/f3v/f39+P347/z94bj+/cd3/v3Dbv7+3Kr+/fbr//39/f/9/f3//vf0//7Svf/+oXb//o5b//6M - WP/+jFj//otX//6LVv/+jFf//oxY//6MWP/+jFj//pdp//7Jsf/++/j//v7+//7+/v/+/v7//vj1//7X - xP/+oHX//otX//6MWP/9i1f//olU/v23lv79+/n+/f39/v39/fv8/Pz1/Pz86vz8/Nr8/PzE/Pz8qPv7 - +4b8/Pxi+/v7Qfj4+Cfy8vIU39/fCH9/fwIAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIT+Pj4Jfv7 - +0D8/Pxh+/v7h/z8/Kv8/PzK/f394f39/fD9/f34/fn0/P3y4/798d/+/fjw/v39/f79/f3+/ff0//7T - wP/+oHX//o5a//6MWP/+jFj//opV//6qg//+zrj//qiB//6MWP/+jFj//oxY//6MWP/+mGn//sqx//77 - +P/+/v7//v7+//7+/v/+59z//qd///6LVv/9i1f//otX/v2KVv79pn7+/fn3/v39/fz9/f32/Pz86vz8 - /Nf8/Py+/Pz8of39/YD8/Pxe+/v7P/j4+Cby8vIU39/fCH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C39/fCPLy8hP4+Pgl+/v7QPz8/GH7+/uH/Pz8q/z8/Mn8/Pzg/Pz87f39/fb9/f36/f38/f39 - /f79/f3+/fn3/v7Xxf79nnP//o5a//6MWP/+jFj//otV//6nfv/+4tX//vr3//7o3v/+pXv//otW//6M - WP/+jFj//oxY//6Yaf/+yrL//vv4//7+/v/+7+f//r+i//6WZv/9i1f//otX/v2MV/79lmf+/c23/v37 - +/z9/f33/Pz87Pz8/Nn8/Py9+/v7nP39/Xn8/PxY+/v7O/j4+CPy8vIT39/fCH9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLf398I8vLyE/j4+CX7+/tA/Pz8Yf39/YX8/Pyo/Pz8xfz8 - /Nr8/Pzo/Pz88v39/fj9/f38/fz8/v3s5P79p4D+/YpX//6MWP/+jFj//otX//6ogf/+4tb//vz7//7+ - /v/+/f3//uvi//6id//+ilX//oxY//6MWP/+jFj//php//7Ls//+7OP//sKl//6XaP/9jFn//otX/v2M - V/79l2f+/cat/v318v39/f35/f398P39/d78/PzC+/v7n/39/Xf8/PxT+vr6Nff39x/w8PAR39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIT+Pj4Jfv7 - +z/8/Pxf+/v7gfz8/KH8/Py8/Pz80vz8/OP9/f3w/f39+P38/Pz949f+/ZBd/v2KVf79i1f//oxY//6K - Vv/+wKT//vby//7+/v/+/v7//v7+//7+/v/+7uf//qF1//6KVf/+jFj//oxY//6MWP/+jlv//pBf//6N - Wv/9i1j//YtX/v2MV/79l2j+/cKn/v308P39/f35/Pz88f39/eH8/PzJ/Pz8pv39/X38/PxV+vr6NPb2 - 9h3t7e0O1NTUBn9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C39/fCPHx8RL4+Pgj+/v7O/z8/Fj9/f12/f39lPz8/LH8/PzM/f394fz8/PH9/f35/e7n/f2u - iv79iVX+/YtX/v2LV//+i1j//phq//7Svv/++fb//v7+//7+/v/+/v7//v7+//7u5//+oXf//oxW//6M - WP/+jFj//oxX//6LV//9i1f//YtX/v2MWP79mGn+/b+j/v3y7f39/f35/Pz88fz8/OP8/PzL/Pz8rPv7 - +4T8/Pxc+vr6OPb29h7t7e0OzMzMBQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLf398I8PDwEff39yD6+vo0+/v7Tfz8/Gn7+/uK/Pz8rfz8 - /M79/f3l/Pz89P38+/v95Nr+/ad//v2MV/79i1f+/YtX//6LV//+mGj//tO///749v/+/v7//v7+//7+ - /v/+/v7//uvh//6ke//+jVn//oxY//6MWP/+i1f//YtX/v2MWf79mWv+/cCk/v3w6v39/f35/Pz88fz8 - /OP8/PzM/Pz8rfv7+4j8/Pxh+/v7Pff39yLv7+8Q1NTUBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/Atvb2wfu7u4P9fX1Gvn5 - +Sz7+/tF/Pz8Zfv7+438/Py1/Pz81fz8/Or9/f32/fv6/P3i1f79qID+/Y1Z/v2LV/79i1f//otX//6Y - af/+1MD//vj1//7+/v/+/v7//v7+//79/f/+59z//qZ+//6NWv/+i1f//YtX/v2NWf79mmz+/b+k/v3u - 5/39/fz5/Pz88fz8/OL8/PzM/Pz8rvv7+4n8/Pxj+/v7QPj4+CXx8fES29vbB39/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CzMzMBejo6Avz8/MW+fn5Kfv7+0b8/Pxu+/v7mfz8/L/8/Pzc/f397v39/fj9/Pv8/eDT/v2o - gv79jVr+/YtX/v2LV//+i1f//phq//7UwP/++fb//v7+//7+/v/+/v7//vz7//7k2P/+p4H//Y1b/v2M - WP79mmz+/b+k/v3s5f39/f34/Pz88fz8/OL8/PzM/Pz8rfv7+4n8/Pxj+/v7Qfj4+Cby8vIT39/fCP// - /wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqqqoD5eXlCvT09Bf5+fku/Pz8UPv7+3r8/Pyk/Pz8x/z8 - /N/9/f3v/f39+P38+/z939H+/amD/v2OW/79i1f+/YtX//6LV//+mGr//tTB//769//+/v7//f39/v39 - /f79+/r+/eTY/v2zkv79p4D+/cSq/f3s5fz9/f34/f398Pz8/OL8/PzL/Pz8rfv7+4n8/Pxj+/v7Qfj4 - +Cby8vIU39/fCP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqqgPo6OgL9vb2HPr6 - +jb8/Pxa+/v7g/z8/Kn8/PzJ/f394f39/e/9/f34/fv7/P3ez/79qYP+/Y5b/v2LV/79i1f//otX//6X - av/+07///vr3//39/f79/f3+/f39/v38+/799fH9/e/p/P349fr9/f32/f397v39/eH8/PzL/Pz8rfv7 - +4n8/Pxj+/v7Qfj4+Cby8vIU39/fCP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABzMzMBe7u7g/39/ch+/v7Pfz8/F/9/f2G/Pz8q/z8/Mr9/f3h/f398P39/fj9+/r8/d3P/v2p - gv79jlv+/YtX/v2LV//+i1f//pdo//7Svf/9+Pb+/f39/v39/f79/f38/f39+v39/fb9/f3w/Pz86Pz8 - /Nz8/PzI/Pz8q/39/Yj8/Pxj+/v7Qfj4+Cby8vIU39/fCP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLb29sH8fHxEvj4+CT7+/s//Pz8Yfv7+4f8/Pyr/Pz8yf39 - /eH9/f3v/f39+P37+vz93c7+/aiA/v2NWv79i1f+/YtX//6KVv/9l2n//c+6/v359/79/f38/f39+fz8 - /PL9/f3p/f393vz8/NH8/Py+/Pz8pf39/YX8/Pxi+/v7Qfj4+Cfy8vIU39/fCH9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjx8fES+Pj4Jfv7 - +0D8/Pxh+/v7h/z8/Kv8/PzJ/Pz84P39/e/9/f34/fv6+/3ez/39p3/+/Y1Z/v2LV/79i1f+/YpW/v2a - bf7949f9/f39+vz8/PL8/Pzm/Pz81fz8/ML8/Pyt+/v7lv39/Xv8/Pxd+/v7P/j4+Cby8vIU39/fCH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C39/fCPLy8hP4+Pgl+/v7QPz8/GH7+/uH/Pz8q/z8/Mn8/Pzf/Pz87fz8/PT9+/r4/d7Q+/2m - fvz9ilj9/YpX/f2LWP39mGz7/d7Q+fz8/PP8/Pzn/Pz81Pz8/Lr9/f2d+/v7g/z8/Gn8/PxR+vr6Ofj4 - +CPy8vIT39/fCH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLf398I8vLyE/j4+CX7+/tA/Pz8Yfv7+4b8/Pyp/Pz8xfz8 - /Nn8/Pzm/Pz87fz6+fL94NL2/aqD+P2LWPn9nXP4/MOq9f308fD8/Pzn/f391vz8/Lz8/Pyb/f39ePz8 - /Fr7+/tB+fn5Lvb29h7w8PAR39/fCH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/At/f3wjy8vIT+Pj4Jvv7 - +z/8/Pxf+/v7gvz8/KH8/Py5/Pz8yvz8/Nf9/f3h/Pv66P3o3+792Mbw/eHV7v3x7On8/Pzg/Pz80vz8 - /L38/Pyg/f39e/z8/Ff6+vo5+Pj4I/Pz8xXq6uoM1NTUBn9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C39/fCPLy8hP4+Pgk+/v7Pfz8/Fn9/f12+/v7j/z8/KP8/Py1/Pz8xPz8/NH8/PzZ/Pr63fz7 - +9r8/PzR/Pz8w/z8/LH9/f2a/f39ffz8/Fv7+/s79/f3IvDw8BHf398Iv7+/BAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLf398I8fHxEvf39yH6+vo1+/v7S/z8/GH9/f12+/v7ivv7 - +538/Pyt/Pz8ufz8/L78/Py6/Pz8rvv7+539/f2I/Pz8cfz8/Ff7+/s8+Pj4JPLy8hPf398If39/AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/Atvb2wfu7u4P9fX1Gvn5 - +Sn6+vo5+/v7S/z8/F78/Pxx+/v7gvv7+477+/uS+/v7j/v7+4P8/Pxy/Pz8Xvv7+0n6+vo1+Pj4I/Ly - 8hPj4+MJqqqqAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38C1NTUBurq6gzy8vIU9vb2Hvn5+Sv6+vo6+/v7Sfz8/Fb8/Pxf/Pz8Yvz8/F/8/PxW+/v7Sfr6 - +jn5+fkq9vb2HPDw8BHj4+MJv7+/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// - ///////8P/////////AP////////wAP///////8AAP///////gAAf//////8AAAf//////gAAA////// - 8AAAB//////gAAAD/////8AAAAH/////gAAAAP////8AAAAAf////AAAAAA////4AAAAAB////AAAAAA - D///4AAAAAAH///AAAAAAAf//4AAAAAAA///AAAAAAAB//8AAAAAAAD//gAAAAAAAH/+AAAAAAAAP/wA - AAAAAAAf/AAAAAAAAA/wAAAAAAAAD+AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB4AAAAAAAAADgAAAAAAA - AAOAAAAAAAAAA4AAAAAAAAADgAAAAAAAAAOAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAfAAAAAAAAAB+AA - AAAAAAAP4AAAAAAAAA/wAAAAAAAAH/gAAAAAAAA//AAAAAAAAH/+AAAAAAAA//8AAAAAAAH//4AAAAAA - B///wAAAAAAP///gAAAAAB////gAAAAAH////AAAAAA////+AAAAAH////8AAAAA/////4AAAAH///// - gAAAA//////AAAAH/////+AAAA//////8AAAP//////4AAB///////wAAf///////gAD////////gAf/ - ///////gD/////////g///////////////8oAAAAYAAAAMAAAAABACAAAAAAAAAgAQAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqgPb29sH6OjoC+/v7xD09PQY9/f3Ifn5+Sv6+vo2+/v7Qfv7 - +0v8/PxW/Pz8X/z8/Gb8/Pxq/Pz8avz8/Gb8/Pxf/Pz8Vvv7+0v7+/tB+vr6Nvn5+Sv39/ch9PT0GPDw - 8BHo6OgL29vbB6qqqgN/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8Bv7+/BNvb2wfr6+sN8vLyE/X1 - 9Rv4+Pgl+vr6MPv7+zv7+/tI/Pz8VPz8/F/8/Pxp+vr6c/39/Xn7+/t9+/v7ff39/Xn6+vpz/Pz8avz8 - /F/8/PxU+/v7SPv7+zz6+vow+Pj4Jvb29hzy8vIU6+vrDd/f3wjMzMwFqqqqAwAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAG/v78E39/fCO3t7Q7z8/MW9/f3H/n5+Sr6+vo3+/v7Rfz8/FL8/Pxg/Pz8bP39/Xf9/f2B+/v7ivv7 - +5D7+/uT+/v7k/v7+5D7+/uK/f39gf39/Xf8/Pxs/Pz8YPz8/FP7+/tG+vr6Ofn5+Sz39/ch9PT0GO/v - 7xDl5eUK1NTUBr+/vwR/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAb+/vwTf398I7e3tDvT09Bf39/ci+fn5L/v7+z77+/tO/Pz8Xvz8 - /G39/f16+/v7hvv7+5D7+/uZ/Pz8oPz8/KX8/Pyo/Pz8qPz8/KX8/Pyg+/v7mfv7+5D9/f2G/f39evz8 - /G38/Pxe/Pz8UPv7+0H6+voz+Pj4JvX19Rvy8vIT6+vrDd/f3wi/v78Ef39/AgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8Bv7+/BN/f3wju7u4P9PT0GPj4 - +CT6+vo0+/v7Rfz8/Ff8/Pxq+/v7e/v7+4r7+/uX/Pz8ofz8/Kr8/Pyx/Pz8tvz8/Lr8/Py8/Pz8vPz8 - /Lr8/Py2/Pz8sfz8/Kr9/f2h+/v7l/v7+4v9/f18/Pz8bfz8/F37+/tM+/v7PPn5+S739/ci9PT0GO7u - 7g/j4+MJzMzMBX9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /wG/v78E39/fCO7u7g/19fUZ+Pj4Jvr6+jb7+/tJ+fn5Xvz8/HL7+/uG+/v7l/z8/Kb8/Pyy/Pz8uvz8 - /MH8/PzG+fb1yuzh3czdxb/O3sfBzuvc2Mz28O7K+/v7x/z8/MH8/Py6/Pz8svv7+6f7+/ua/f39iv39 - /Xn8/Pxn/Pz8Vfv7+0P6+vo0+Pj4JvX19Rrw8PAR6OjoC9TU1AZ/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAb+/vwTf398I7u7uD/X19Rn4+Pgn+vr6N/v7+0v8/Pxh/f39ePv7 - +4/7+/ui/Pz8s/z8/MD8/PzL/Pz80f37+9b6+fja7N/c3M+tot2xdmbesnlq3sqimd3k0c3c+PX02vv7 - +tb8/PzR/Pz8y/z8/ML8/Py2/Pz8qPv7+5f9/f2E+vr6cfz8/F38/PxK+vr6OPn5+Sn29vYc8fHxEujo - 6AvMzMwFf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABv7+/BN/f3wju7u4P9fX1Gfj4 - +Cb6+vo4+/v7TPr6+mP7+/t7+/v7k/z8/Kn8/Py7/Pz8yvz8/NX8/Pzd/Pz84vr39+Xx6OXovY6B6Z9a - R+qTQi3qlEMu6ptRPeqzfGzp5NLM6Pbw7uX8/Pzi/f393vz8/Nf8/PzN/Pz8wfz8/LP8/Pyh+/v7jvv7 - +3r8/Pxk/Pz8UPv7+zz5+fkr9vb2HvLy8hPl5eUK1NTUBn9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /wG/v78E39/fCO7u7g/19fUa+Pj4J/r6+jj7+/tM+vr6ZPv7+3z8/PyU/Pz8q/z8/MD8/PzP/f392/z8 - /OT8/Pzr+PX07ufU0PDBlIjyoFtH8pFAKfKNOiPzjToj8489JvKaUTzyt4Jz8t3FvfD07eru/Pz86/z8 - /Ob8/Pzf/f391vz8/Mr8/Py6/Pz8qfv7+5b7+/uA/Pz8afz8/FP7+/s/+fn5Lff39x/y8vIT6OjoC9TU - 1AZ/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAb+/vwTf398I7u7uD/X19Rn4+Pgn+vr6N/v7+0z6+vpk/f39fPv7 - +5b6+vqt/Pz8wfz8/NP8/Pzg/f396f38/PD6+Pf06NjT9saekviWSjX5kD4o+Y47JPmPPCb5jzwm+Y47 - JfmPPCb5kUEq+cKViPjm1ND3/Pz89fz8/PL8/Pzt/Pz85vz8/N38/PzQ/Pz8wfv7+7D8/Pyb/f39g/z8 - /Gz8/PxV+/v7QPn5+S729vYe8vLyE+jo6AvMzMwFf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Cv7+/BN/f3wju7u4P6+vrGfj4 - +Cb6+vo3+/v7TPz8/GP7+/t9+/v7lvz8/K78/PzC/Pz81Pz8/OP8/Pzs/Pz88/v6+ffz6uf6wZKF+5tQ - PPyOOiL8jzwk/JA+JfyQPib8kD4m/JA+JvyPPCT8jDYd/K5yYvzWurL8/fz8+/39/fj8/Pz1/Pz88fz8 - /Ov8/Pzi/f391vz8/Mf8/Py0/Pz8nvv7+4f8/Pxu/Pz8Vvv7+0D5+fks9vb2HvLy8hPl5eUKzMzMBX9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwK/v78E4+PjCe/v7xD19fUZ+Pj4Jvr6+jj7+/tM/Pz8Y/39/Xz8/PyV/Pz8rfz8/ML8/PzT/Pz84vz8 - /Oz8/Pzz+ff2+Ovc2PvAkoX8oV1K/ZE/KP6POyT+jzwl/pA9Jv6QPSb+kD0m/o46Iv6URS/+qmpZ/tKz - qv7u4+H+/f39/f39/fz9/f36/f399/z8/PP8/Pzt/Pz85Pz8/Nn8/PzI/Pz8tfz8/KD7+/uH/Pz8bvz8 - /Fb7+/s/+fn5Lvf39x/y8vIT6OjoC9TU1AZ/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABqqqqA8zMzAXj4+MJ7+/vEPX19Rr4+Pgn+vr6OPv7+0z6+vpk/f39fP39 - /ZX8/Pyt/Pz8wvz8/NT8/Pzi/Pz87Pv7+/T6+Pf459XQ+8iflP2dVED+kj8p/o86I/6QPSb+kD0m/o89 - Jv+PPSX/jjoi/5E/KP+lYU/+0bCn/u/k4v79/Pz+/f39/v38/P79/Pz9/f39+/38/Pn8/Pz1/f397/z8 - /Ob8/PzZ/Pz8yfz8/Lf8/Pyg+/v7h/z8/G78/PxW+/v7QPn5+S739/cf8vLyE+jo6AvU1NQGf39/AgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqqqoD1NTUBuXl5Qrw8PAR9fX1Gvn5 - +Sj6+vo4////TPz8/GT7+/t9+/v7lvz8/K78/PzC/Pz81Pz8/OP8/Pzt/Pz89Pv6+vnv5eL8xpuO/ZlN - N/6POyT+jzsk/pA9Jv6QPSb+jz0m/5A9Jv+QPCX/jTcf/5xTP/++kIT/+vb2/v38/P79/Pv+/Pn4/vz3 - 9f789vX+/Pj3/fz7+vz9/Pz6/f399v39/fD8/Pzn/f392/z8/Mv8/Py3/Pz8oP39/Yf8/Pxu/Pz8Vvv7 - +0D5+fkt9vb2HvLy8hPo6OgLzMzMBX9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/Ar+/ - vwTb29sH6urqDPLy8hP29vYd+fn5Kvv7+zv7+/tO/Pz8ZP39/X37+/uW/Pz8rfz8/ML8/PzU/Pz84vz8 - /O38/Pz0+ff2+fDn5Py/kYP9oVtH/pA+J/6PPCX+kDwl/pA9Jv6QPSb+kD0m/486Iv+POSL/m086/8OW - if/o2NP//Pv7/v37+v756uf+8tHI/u/Ctv7uwLT+8cvC/vjp5f389/b8/f39+v39/fb9/f3w/Pz85/v7 - +9v8/PzK/Pz8tvz8/KD9/f2H/Pz8bvz8/Fb7+/tA+fn5Lff39x/y8vIT5eXlCtTU1AZ/f38CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38CzMzMBePj4wnu7u4P9PT0F/f39yH5+fkt+/v7Pvz8/FH8/Pxn+/v7f/v7 - +5f8/Pyu/Pz8w/z8/NT8/Pzi/Pz87fz8/PT69/f46NbS+8ackP2hW0f+kkEq/o87JP6QPCX+kD0m/o89 - Jv+QPSb/jzoi/5I/KP+eVD//wpOH/+PPyf/58/H/+vHu//TWz//tvLD/6KeX/uafjf7mnoz+6KiY/u/D - t/724dv++/X0/P39/fr9/f32/f398Pz8/Of8/Pza/Pz8yvz8/Lb8/Pyg+/v7h/z8/G78/PxW+/v7QPn5 - +S739/cf8vLyE+jo6AvU1NQGf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLMzMwF5eXlCvDw8BH19fUZ+Pj4Jfr6 - +jL7+/tC/Pz8Vf39/Wv9/f2B+/v7mfz8/K/8/PzD/Pz81fz8/OL8/Pzt/Pv79Pv5+fnq3Nn8yKCV/ZlN - OP6QPif+jzsk/pA9Jv6QPSb+jz0m/5A9Jf+QPCT/kDsk/59VQf+8iHr/69vY//nz8v/67+v/9NXN/+qq - mv/jkXz/4Yp0/+KNd/7ijnj+45F8/uadiv7vwrf+9+Ld/vz49/39/Pz6/f399vz8/PH8/Pzn/Pz82vz8 - /Mr8/Py3/Pz8oP39/Yf8/Pxu/Pz8Vvv7+0D5+fkt9vb2HvLy8hPo6OgLzMzMBX9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszM - zAXl5eUK8fHxEvX19Rv4+Pgn+vr6N/v7+0j8/Pxb/Pz8cf39/Yb7+/uc/Pz8svz8/MX8/PzV/Pz85Pz8 - /O38/Pz0+vn4+fTt6/zBlIj9nlVB/o88JP6PPCX+kD0l/pA9Jv6QPSb+kD0m/487I/+MNRz/mk44/8CQ - gv/t39v/+vf2//rt6v/zz8X/552J/+SRfP/jjXf/4454/+KNeP/ijnj+4o55/uOQe/7noI7+7r+y/vjo - 5P779/b9/f39+v39/fb8/Pzx/Pz85/39/dv8/PzL/Pz8t/z8/KD9/f2H/Pz8bvz8/Fb7+/tA+fn5LPb2 - 9h7y8vIT5eXlCszMzAV/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38C1NTUBujo6Avx8fES9vb2Hvn5+Sv7+/s7+/v7Tvz8/GL7+/t4+/v7jf39 - /aH8/Py1/Pz8x/39/db8/Pzj/Pz87fz8/PT6+Pf46tvW/MOWiv2jXkv+kkAq/o87JP6QPCX+kD0m/o89 - Jv+QPSb/jzoi/5E+Jv+aTTj/w5WI/+PPyP/69PP/+u3p//LKwP/pp5X/4495/+OOeP/jjnj/4495/+OO - ef/ijnj/4o54/uKOeP7kk37+6KSS/u6/sv724tz++/X0/P39/fr9/f32/f398Pz8/Of9/f3b/Pz8yvz8 - /Lb8/Pyg+/v7h/z8/G78/PxW+/v7QPn5+S739/cf8vLyE+jo6AvU1NQGf39/AgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLU1NQG6OjoC/Ly8hP29vYe+fn5Lfv7 - +z75+flS/Pz8aPv7+378/PyU/Pz8qPz8/Lr8/PzL/Pz82v39/eX9/f3u+/v79fz7+/nq29f7y6SZ/Z1U - QP6SQSr+jzsj/pA9Jv6QPSb+jz0m/5A9Jf+POyP/kT4m/59WQf+8iXz/5tPN//jx7//67uv/8s3D/+mo - l//jj3n/44x2/+OOeP/jj3n/4495/+OPef/jjnn/4o54/+KOeP7ijnj+5JN+/uafjP7vw7j+9uHb/vv2 - 9f39/Pz6/f399v39/fD8/Pzo/Pz82vz8/Mr8/Py3/Pz8oP39/Yf8/Pxu/Pz8Vvv7+0D5+fku9vb2HvLy - 8hPo6OgL1NTUBn9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszM - zAXl5eUK8vLyE/b29h75+fks+/v7P/z8/FP8/Pxq+/v7g/v7+5n8/Pyv/Pz8wfz8/ND9/f3e/Pz86P39 - /e/8/Pz1/Pz8+vn49/zMqJ3+nlZA/o87JP6POyT+kD0m/pA9Jv6QPSb+kD0m/5A8Jf+MNh7/mk44/7uI - ev/y5+X/+/j3//vw7f/008r/552J/+OOeP/jjHb/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+KN - eP/ijnj+4o54/uOQev7mnYr+78G1/vjn4/78+fn9/f39+v39/fb8/Pzx/Pz85/39/dv8/PzL/Pz8t/z8 - /KD9/f2H/Pz8bvz8/Fb7+/tA+fn5LPb29h3x8fES5eXlCszMzAV/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38C1NTUBuXl5Qry8vIT9/f3H/n5+S37+/s//Pz8Vvz8/G39/f2F+/v7nfz8 - /LL8/PzF/Pz81Pz8/OD8/Pzq/Pz88f39/fb9/f35/Pr6/PPq6P2/kYP+kUAo/o88Jf6QPCX+kD0m/o89 - Jv+QPSb/jzsj/5A9Jv+cUDz/w5aK/+XSzf/7+Pf/+u3p//LMwv/oo5H/5JF7/+ONd//jjnj/4495/+OP - ef/jj3n/4495/+OOd//jjnf/4454/+OOef/ijnj/4o54/uKPef7jk33+56OS/u6+sf735eD+/Pb1/P39 - /fr9/f32/f398Pz8/Of9/f3b/Pz8yvz8/Lb8/Pyg/f39h/z8/G78/PxW+/v7P/n5+Sz29vYe8fHxEuXl - 5QrMzMwFf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLU1NQG6OjoC/Ly8hP39/cf+fn5Lvv7 - +0D8/PxW/Pz8bvv7+4f7+/uf/Pz8tPz8/Mf8/PzX/Pz84/z8/Oz8/Pzz/f399/39/fr9/f38/Pv7/fTt - 6/7AkoX+kD4n/o87I/6QPCX+jz0m/5A9Jv+POyT/l0kz/6dmVP/Gm5D/5dPO//jy8P/78e7/8szB/+qq - mP/jj3j/4413/+OOeP/jj3n/4495/+OPef/llH//556L/+yxof/rrp7/56CO/+SPef/jjnj/4o54/+KO - eP7ijnj+5JR//ueikP7vwrf+9uHb/vz29Pz9/f36/f399v39/fD8/Pzn/Pz82vz8/Mr8/Py2/Pz8oPv7 - +4f8/Pxt/Pz8VPv7+z75+fkr7e3tHO/v7xDj4+MJv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszM - zAXo6OgL8vLyE/b29h75+fkt+/v7QPz8/FX8/Pxt+/v7h/v7+5/8/Py3/Pz8yfz8/Nn8/Pzm/f397/z8 - /PT9/f34/fz7/P38+f39/Pr+/fz8/vr39/7NqZ/+n1hE/pA9Jv6PPCT/kD0m/5E9J/+TQSv/qmpY/82o - nf/27+7//fz8//vy8P/11s7/6aWS/+OPef/jjHX/4494/+OPef/jj3n/4495/+SRe//ooI3/7ruu//ji - 3P/23NX/78Cz/+aYg//kkHr/4454/+KNeP/ijnj+4o54/uOSfP7mnYv+78O4/vfk3/78+fj9/fz8+v39 - /fb8/Pzx/Pz85/z8/Nr8/PzK/Pz8tvv7+5/7+/uF/Pz8avz8/FH7+/s7+Pj4J/T09Bjt7e0O29vbB6qq - qgMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl5Qry8vIT9vb2Hvn5+Sz39/dA/Pz8Vvr6+m77+/uH/Pz8oPz8 - /Lb8/PzL/Pz82vz8/Ob9/f3w/f399v39/fn9/Pv7/fr0/f316P799uz+/fz6/v38/P7u49/+0K2j/pxQ - O/6RPyn/jzoj/5A7Jf+qaVf/0a6k//Xt6//9/Pv//vz8//fg2v/popD/5JJ9/+ONd//jj3j/4495/+OP - ef/jj3j/4453/+edif/vvrL/+urm//349v/9+Pb/+Ofi/+68r//nnYj/4453/+OPef/ijXj/4o54/uKP - ef7jkXz+56GP/u6+sv746eX++/f2/f39/fr9/f32/f398Pz8/Of8/Pza/Pz8yvz8/LX7+/ud/f39gvz8 - /Gf4+PhO+vr6Nvj4+CPz8/MW6urqDMzMzAV/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLU1NQG6OjoC/Hx8RL39/cf+fn5Lvv7 - +z/8/PxW/Pz8bvv7+4f8/Pyg/Pz8tvz8/Mr9/f3b/Pz85/39/fD9/f32/f39+v348vz97tf9/dqm/v3R - kP7905X+/d6z/v326v769vT+693Z/8ukmf+mY1H/mk04/6hnVP/Sr6X/7uHd//79/f/+/v7/+/Pw//PQ - xv/kj3r/4454/+OOeP/jj3n/4495/+OPef/kj3n/5JJ7/+++sP/34dv//fn5//79/f/+/v7//Pf2//fk - 3v/uvrH/56CN/+ONd//jjnj/4o54/+KOeP7ijnj+5JR+/uejkv7uwLP+9uLd/vv29Pz9/f36/f399v39 - /e/8/Pzm/Pz82fz8/Mj8/Pyy+/v7mf39/X38/Pxi+/v7SPr6+jH39/cg8vLyE+Xl5QrMzMwFf39/AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszM - zAXl5eUK8fHxEvb29h35+fkt+/v7QPz8/FX6+vpu+/v7h/v7+5/8/Py2/Pz8yvz8/Nr8/Pzn/f398P39 - /fb9/fz6/fr2/P3t1f392KP+/b9j/v22Tv79t1D+/sNv/v3pzP/9+PL/+vj3//Lp5v/InpL/uYR1/82n - m//x5+P//v39//7+/v/+/v7/+evn//DEuP/jinP/4453/+OPef/jj3n/4495/+OOeP/kkHr/5peB//XX - zv/9+ff//v7+//7+/v/+/v7//v7+//79/P/34Nr/7r2w/+aZhf/kkXv/4454/+KNeP/ijnj+4o54/uOT - fv7mnov+78W5/vbi3f779/b9/fz8+v39/fb9/f3v/f395fz8/Nf8/PzE/Pz8rfv7+5P6+vp3/Pz8W/v7 - +0H5+fkt9vb2HfDw8BHj4+MJv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38Cv7+/BN/f3wjv7+8Q9fX1G/n5+Sr7+/s+/Pz8VPz8/Gz7+/uH/Pz8oPz8 - /Lf8/PzL/f392/z8/Of8/Pzx/f399v39/fr9+/j9/fLi/v3Wnf79vmD+/bVK/v20Sv79s0f+/bVO//7Y - ov/+8d3//v7+//7+/v/28O7/9e3r//v49//9/f3//v7+//7+/v/+/v7/+Ojj/+/Btf/ji3T/4454/+OP - ef/jj3n/4495/+OOeP/jkXv/5puG//bc1v/+/f3//v7+//7+/v/+/v7//v7+//7+/v/+/Pz/+OXg/+67 - rf/mmIT/4453/+OPef/ijXj/4o54/uKOeP7jkHr+5p6L/u7AtP746ub+/Pn5/f39/fr9/f32/f397vz8 - /OP8/PzU/Pz8wPz8/Kj7+/uM/Pz8cPz8/FT7+/s9+fn5KfX19Rrv7+8Q4+PjCb+/vwQAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqqqoD29vbB+3t7Q719fUZ+fn5KPv7 - +zv8/PxS/f39a/39/YX7+/uf/Pz8tvz8/Mr8/Pza/Pz85/39/fD9/f32/f39+v358/z97tn+/dSa/v3C - a/79t1D+/bRK/v20Sv79s0j//rdP//7Skf/+7NL//v7+//7+/v/8+/r//Pr5//79/f/+/v7//v7+//7+ - /v/+/v7/+/Px//TTy//nnIn/5JN9/+OPef/jj3n/4495/+OPef/jj3n/5JF7/+67rv/34dv//v38//7+ - /v/+/v7//v7+//7+/v/+/v7//Pb1//jm4f/uvK//55+M/+OOd//jjnj/4o54/+KOeP7ijnj+45N+/uek - kv7uv7L+9+bh/fv29Pz9/f35/Pz89Pz8/Oz8/Pzg/Pz80Pz8/Lr8/Pyh+/v7hvz8/Gr8/PxR+/v7O/// - /yf19fUa7+/vEN/f3wi/v78E////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAG/v78E5eXlCvLy8hT4+Pgj+vr6Nfv7+0z6+vpn+/v7gvv7+538/Py0/Pz8yfz8/Nr8/Pzn/f398P39 - /fb9/f36/fn0/P3r0/792KL+/cBo/v23Uf79tEn+/bRK/v20Sv/+tEn//rdQ//7Skf/+7NL//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//fr6//nn4v/vv7P/6KOQ/+SUf//jj3n/4495/+OP - ef/jj3j/4413/+igjv/vwLP/+OXg//349//+/v7//v7+//7+/v/+/v7//v7+//37+v/339r/7ryv/+ed - if/kkHr/4454/+KOeP/ijnj+4o54/uSUfv7noo/+78S5/vfj3v38+Pf7/f39+Pz8/PL9/f3p/Pz83fz8 - /Mr8/Py0+/v7nP39/YH8/Pxn+/v7Tvr6+jn4+Pgn9fX1Gu7u7g/f398Iv7+/BP///wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLb29sH7e3tDvX19Rr5+fkt+/v7Q/z8/F77+/t7+/v7mPz8 - /LL7+/vI/Pz82fz8/Of9/f3w/f399v39/Pr9+/n9/e/b/v3Yov79vWD+/bZN/v20Sf7+tEr+/bNK//60 - Sv/+tUz//rpZ//7apf/+8d3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//35 - +P/66+f/7ryw/+egjv/kknz/45B6/+OPef/jj3n/4495/+OOd//nnor/776w//np5P/9+vj//v7+//7+ - /v/+/v7//v7+//7+/v/+/Pz/9+Hc/+67rv/mmIP/5JB6/+OOeP/ijXj/4o54/uKOeP7jkXv+5p6L/vDI - vf757er9/fz8+/39/ff9/f3w/Pz85/z8/Nn8/PzH/Pz8sfv7+5n9/f1+/Pz8Zfv7+036+vo4+Pj4J/X1 - 9Rnu7u4P39/fCL+/vwQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb+/vwTl5eUK8vLyE/f3 - 9yL6+vo4/Pz8Uf39/W/7+/uO/Pz8qvz8/MP9/f3W/f395f39/fD9/f32/f39+v369fz98uH+/dSZ/v3B - aP79tk7+/bRK/v20Sv79tEr//rVL//60SP/+vmD//tKR//7v2f/++/b//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//79/f/9+vn/+OTg//DCtv/nnYr/5JJ9/+OPef/jj3n/4495/+OP - ef/kkXv/55uG/+++sf/4497//v39//7+/v/+/v7//v7+//7+/v/+/v7//ff2//jl4f/uuq7/552J/+OO - d//jj3n/4o14/+KOeP7ijnj+4496/uuwov702NH+/fz8/f39/fr8/Pz1/f397/39/eX8/PzX/Pz8xfv7 - +7D7+/uX+/v7fvz8/GT4+PhN+vr6OPj4+Cf19fUZ7u7uD9/f3wi/v78EAAAAAQAAAAAAAAAAAAAAAQAA - AAF/f38Cv7+/BN/f3wju7u4P9fX1Gfn5+Sv7+/tC/Pz8Xv39/X39/f2c/Pz8uPz8/ND9/f3h/Pz87fz8 - /PX9/f35/fnz/P3s1f7915/+/cJr/v23Uf79tEn+/bRK/v20Sv/+tEr//rRJ//6/Y//+0pP//uvP//75 - 8//+/v7//v7+//79/P/78O3/+ejj//jm4f/89vT//v38//7+/v/+/v7//v7+//7+/v/+/v7//Pf1//fh - 2//vwbX/6KGO/+WUf//jj3n/4495/+OPef/jj3j/5JB6/+igjP/vwLT/9+Pd//36+v/+/v7//v7+//7+ - /v/+/v7//v7+//339v/34dv/7ryv/+eei//jjnf/4454/+KOeP/ijnf+4ot1/uqtnv701s/+/fz8/v39 - /fz9/f35/Pz89f39/e78/Pzj/Pz81fz8/MT8/Pyu+/v7lvv7+338/Pxk+/v7Tfr6+jj4+Pgn9fX1Ge7u - 7g/f398Iv7+/BP///wEAAAAAf39/AqqqqgPMzMwF39/fCOvr6w3z8/MW9/f3Ivr6+jX7+/tO/Pz8avv7 - +4v8/Pyp/Pz8xP39/dv9/f3p/Pz88/38/Pn9+vf8/e7X/f3Zpf79vWD+/bdP/v20Sf79s0r//bRK//60 - Sv/+tk7//rtY//7Skv/+6cv//v37//7+/v/+/v7//fr5//rt6f/008r/8MK2/+/AtP/23db/+/Hu//79 - /f/+/v7//v7+//7+/v/+/v7//v7+//z39v/45eD/7ryv/+iikP/kk37/4495/+OPef/jj3n/4495/+OO - d//ooI3/77+z//np5f/9+Pf//v7+//7+/v/+/v7//v7+//7+/v/+/Pz/99/Y/+68rv/mmIT/5JF7/+KN - d//ijnj/5JR//u26rf724tz+/f38/v39/f38/Pz8/Pz8+fz8/PT8/Pzt/Pz84vz8/NX8/PzD/Pz8rfv7 - +5b7+/t9/Pz8ZPv7+0z6+vo3+Pj4JvT09Bjt7e0O39/fCL+/vwQAAAABv7+/BNvb2wfo6OgL7+/vEPT0 - 9Bf39/cg+fn5Lvv7+0H8/Pxa/f39d/v7+5f8/Py0/Pz8zfz8/OL9/f3u/f399v37+Pv98+X9/dWd/v2/ - ZP79tUr+/bRK/v20Sv79s0r//rVL//60SP/+u1n//tGN//7t1P/+/Pj//v7+//7+/v/+/f3/+u/r/+/D - t//noI3/4495/+SSe//qq5r/9NPL//349//+/v3//v7+//7+/v/+/v7//v7+//7+/v/9+vn/+ejj/+/A - s//nnYr/45B6/+OPef/jj3n/4495/+OPef/kj3n/55uH/+69sf/45uL//v39//7+/v/+/v7//v7+//7+ - /v/+/v7//fv5//jm4P/uu63/5piD/+KLc//kkXv/6q+g//Xa1P78+fj+/f39/v39/f78+/r++/r5/Pz8 - /Pn8/Pz0/Pz87fz8/OP8/PzU/Pz8w/z8/K77+/uW/f39fPz8/GP7+/tL+vr6Nvj4+CTz8/MW6+vrDdvb - 2weqqqoD4+PjCe3t7Q7y8vIU9vb2HPj4+CX6+vox+/v7P/z8/FP9/f1r+/v7hvz8/KP8/Py++/v71fz8 - /Of8/Pzx/fv4+P3x4fz91p79/cJt/v23Uf79tEn+/bRK/v20Sv/+tEr//rRI//6/Yv/+0pD//u3T//75 - 8P/+/v3//v7+//7+/v/9+ff/9+DZ/+iikP/kk33/4453/+OPeP/lloL/66+g//TQyP/89PL//vz8//7+ - /v/+/v7//v7+//7+/v/+/f3//fj2//fh2//wwrb/556K/+SUf//jj3n/4495/+OPef/jj3j/5JJ8/+ed - if/vwLT/9+Ld//79/f/+/v7//v7+//7+/v/+/v7//v7+//z29f/45uH/8srA//DBtf/xyL3/9d7Y//rx - 7/79/Pz+/f39/vv49/7l0s3+yqKX/eLMxvzz6+n4/Pz89Pz8/O38/Pzi/Pz81Pz8/MP8/Pyt/f39lP39 - /Xv8/Pxh+/v7Sfr6+jP39/ch8vLyFOjo6AvMzMwF7u7uD/Pz8xb39/cg+fn5LPr6+jj7+/tG/Pz8Vfz8 - /Gj9/f1++/v7l/z8/LH8/PzI/Pz83Pz8/Ov8/Pz0/fTn+v3ivP39wGj+/bdQ/v20Sf79tEr+/bRK//60 - Sv/+tk3//r5g//7Skv/+6cn//v36//7+/f/+/v7//v7+//7+/v/89vT/9dfP/+SSff/jjnf/4495/+OP - ef/jjnj/5ZiE/+utnf/11s//++/t//78/P/+/v7//v7+//7+/v/+/v7//v7+//z29P/34tz/7r2w/+ij - kP/klH//4495/+OPef/jj3n/4495/+OOd//ooY//78C0//nn4//9+Pf//v7+//7+/v/+/v7//v7+//7+ - /v/+/fz/++7r//rq5//67+z//Pr5//z8/P/9/f3+/Pv7/ubUz/7EmIz+ol1K/ruLff3bwrr79Ozr+fz7 - +/T8/Pzs/Pz84vz8/NT8/PzB/Pz8q/v7+5P9/f13/Pz8XPv7+0P5+fkt9vb2HO/v7xDf398I9PT0F/f3 - 9yH5+fkv+/v7P/z8/E/8/Pxf/f39b/v7+4H8/PyU/Pz8qf39/b/8/PzT/Pz84/39/e/9/f32/e3T+v3S - k/39tk7+/bNH/v60Sv79s0r//rVL//61Sf/+uVL//tCN//7r0P/+/vz//v7+//7+/v/+/v7//v7+//7+ - /v/89fP/9dfP/+WVgP/jj3j/4495/+OPef/jj3n/4494/+SUfv/qqZj/9dbO//z19P/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/9+fj/+enl/+69sP/nn4z/5JF7/+OQev/jj3n/4495/+OPef/jjXf/552K/++/ - sv/56uX//fv6//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/69/f/9Ozr/sCS - hv6dVED+jTgh/pJBK/63g3T94MrE/Pn19Pn7+vr0+/v77fz8/OP8/PzT/Pz8v/z8/Kn7+/uN/Pz8cPz8 - /FT6+vo6+Pj4JfPz8xbq6uoM9/f3IPn5+S77+/tA/Pz8Vfz8/Gj7+/t7+/v7jPv7+5z8/Pyt/Pz8vvz8 - /M/8/Pzd/Pz86vz8/PP9/f34/erP/P3Qjv39tlD+/bNI/v20Sv/+tUv//rVL//61Sf/+uVP//tOU//7t - 1P/+/v3//v7+//7+/v/+/v7//v7+//7+/v/9+vn/+OTf/+qsnP/ll4L/4494/+OPef/jj3n/4495/+OQ - ev/klX//66+f//PRyP/9+Pj//v39//7+/v/+/v7//v7+//7+/v/+/f3//fn4//fi3P/vwbX/552K/+ST - ff/jj3n/4495/+OPef/jj3n/5JJ8/+ebhv/wwbT/+OTf//79/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//z6+f/p2tX/vo+A/qFaRv6SQCn+jzwl/pA9Jv6bUDv+s3ts/eLLxvz17uz4/Pz88/z8 - /Oz8/Pzg/Pz8z/z8/Lr8/Pyg+/v7gvz8/GT7+/tG+fn5L/b29h3v7+8Q+fn5Kfr6+jr8/PxR/Pz8av39 - /YD8/PyV+/v7p/z8/LX8/PzD/Pz80Pz8/N38/Pzn/f398P39/ff9/f36/e/d/f3aqP79vWH+/bZP//61 - Sv/+tUv//rVL//61Sv/+uFH//sp+//7gsv/+8uD//v79//7+/v/+/v7//v7+//7+/v/+/f3/+/Lv//PS - yv/qrp3/5ZaC/+OPeP/jj3n/4495/+OPef/jj3j/5ZiE/+uvoP/01c3/+/Du//78/P/+/v7//v7+//7+ - /v/+/v7//v7+//z29P/34Nr/77+z/+iikP/llYD/4495/+OPef/jj3n/4454/+SPef/ooY7/8MS4//no - 5P/+/Pv//v7+//7+/v/+/v7//v7+//7+/v/+/v7//Pr6/+XSzP/FmY3/nlVB/5JCK/+POyT+kD0m/pA8 - Jf6RPif+nFE8/ruIev3cw7z78uro+Pz8/PP9/f3p/Pz82vz8/Mj8/Pyv+/v7kfz8/HL8/PxS+vr6OPj4 - +CTz8/MV+vr6M/v7+0f8/Pxh/f39ffv7+5b8/Pys/Pz8vvz8/Mv8/PzX/f394f39/en9/f3w/Pz89f39 - /fn9/f38/ffv/v3qz/79zIb+/r5h//63T//+tUv//rVL//61S//+t0///r5f//7Lf//+3a3//vbq//78 - +P/+/v7//v7+//7+/v/+/v7//vz8//z19P/yzcP/6qqZ/+STfv/jkHr/4495/+OPef/jj3n/4454/+WW - gf/qqpn/9dfQ//vx7//+/f3//v7+//7+/v/+/v7//v7+//7+/v/99/X/+OXg/+67rf/nnov/4494/+OP - ef/jj3n/4495/+OPef/jjXf/6aeV//LOxP/99/b//v7+//7+/v/+/v7//v7+//7+/v/7+Pf/7d/b/8SX - i/+fV0P/jzoi/488Jf+PPSb/kD0l/pA9Jv6QPCX+kT8o/phKNP66iHr93MS9+vfz8ff8+/vv/Pz84/z8 - /NL8/Py7/Pz8nv39/X78/Pxd+/v7Qvn5+Sv19fUb+/v7Pfz8/FP9/f1v+/v7jvz8/Kj8/Py+/Pz80Pz8 - /N39/f3l/Pz87Pz8/PL9/f32/f39+f39/fz9/f39/fz7/v348P7958b+/s6I//69XP/+tkv//rVL//61 - S//+tUv//rdO//63T//+wmn//t2t//7z5P/+/v3//v7+//7+/v/+/v7//v7+//79/f/78e//9NLJ/+ik - kv/klH//4494/+OPef/jj3n/4495/+OPef/jkXz/6q2c//TTyv/9+fj//v79//7+/v/+/v7//v7+//7+ - /v/+/v3//fj2//Xa0v/rrZ7/44x2/+OPef/jj3n/4495/+OPef/jj3n/556L/+68r//78/L//v39//7+ - /v/+/v7//v7+//37+//x5uT/vo2A/6BYRf+QPSb/kT0n/5E9J/+QPSb/jzwl/pA9Jv6QPSb+jzwl/o45 - Iv6WSDL+s3xs/OHOyfr18O/0/f396fz8/Nr8/PzE+/v7p/v7+4n8/Pxo+/v7S/r6+jP39/ci+/v7SPz8 - /F/9/f18/Pz8m/z8/LX8/PzL/Pz83fz8/Of9/f3v/Pz89P39/ff9/f36/f39/P39/f39/f3+/f39/v38 - +v799uz+/uS+//7Qjf/+vVz//rhP//62S//+tUv//rZL//61Sv/+uFL//sJq//7cqv/+8d3//v79//7+ - /v/+/v7//v7+//7+/v/++/v/+u3p//TSyf/pqpn/5JaB/+OPeP/jj3n/4495/+OPef/jjnj/5ZeD/+uw - oP/00sr//PPx//79/P/+/v7//v7+//7+/v/+/Pz//PPw//LLwf/pppT/4453/+OPef/jj3n/4495/+OP - ef/jjXf/56GP//DEuP/89fT//v7+//7+/v/+/f3//Pr5/+bUz//EmIz/oVlG/5RDLf+QPCX/kT4n/5E+ - J/+RPSb/kD0m/489Jv+QPSb+kDwl/o87JP6QPSb+m1M9/bR8bfvcxL318+vp7P39/d78/PzK/Pz8r/v7 - +5L8/Pxy/Pz8Vfv7+zz5+fkq/Pz8VP39/Wv7+/uJ+/v7p/z8/MD8/PzV/f395f37+O/8+PL1/ffu+f35 - 9Pv+/Pv8/f39/f39/f79/f3+/f39/v39/f79/f3+/vXo//7lwP/+zYX//r9h//64UP/+tUv//rVL//61 - S//+tUr//rNH//7Gc//+3av//vTk//78+P/+/v7//v7+//7+/v/+/v7//vv7//zz8f/yzML/6qub/+SV - gP/jkHr/4495/+OPef/jj3n/4454/+WYg//rrZ3/9djQ//vw7f/+/f3//v7+//78/P/78Oz/9djQ/+yx - of/mmob/4494/+OPef/jj3n/4495/+OOeP/jj3n/666e//XZ0f/9+fj//v7+//79/f/7+fn/5dHL/8OW - if+fWET/kT8o/5A8Jf+RPif/kT0m/5E+J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6QPSX+kD0m/ZVG - Mfu6h3n328K67vTt7OL7+vrP/Pz8tvv7+5r7+/t8/Pz8X/v7+0b6+voz/Pz8X/39/Xb8/PyU/Pz8svz8 - /Mn8/Pzc/Pv66/z37/P97tn5/erO/P3w3/39+PH+/f38/v39/f79/f3+/f39/v39/f79/f3+/v7+//74 - 7v/+58f//syD//69XP/+tkv//rVL//61S//+tUv//rVL//60Rv/+w2r//t6u//726v/+/vz//v7+//7+ - /v/+/v7//v7+//7+/v/89fP/88/G/+ikkv/jkXz/4495/+OPef/jj3n/4495/+OOeP/kkn3/6qqZ//XW - z//9+Pf//v7+//329f/118//6aiX/+SUf//jj3j/4495/+OPef/jj3n/4494/+OOeP/ll4H/8ca6//34 - 9v/+/f3//v7+//z6+v/17+3/t4Bw/5dIMv+NOCD/kD0m/5E+J/+RPSb/kD0m/5E9J/+RPif/kT4n/5E+ - J/+QPSb/kD0m/pA9Jv6QPSb+jzwl/Y87JfuSQiv4toFy8OLPyuT59fTT/Pz8vPv7+6L7+/uF+vr6avz8 - /FH7+/s+/Pz8afv7+4H7+/uf/Pz8u/z8/ND8+fXi/fLk7/3Xofb9yHv6/cNv/P3Mg/393Kz+/e3X/v39 - /P79/f3+/f39/v39/f79/f3+/v7+//79+v/++O///uW///7QjP/+vFz//rdO//62S//+tUv//rVL//61 - Sf/+uFL//sJp//7dq//+8d7//v79//7+/v/+/v7//v7+//7+/v/+/Pv/+u3p//TTyf/pp5X/5JaB/+OP - eP/jj3n/4495/+OPef/jkHr/5ZWA/+uyov/z0sn/+u3p//PQx//rsaL/5JWA/+OQev/jj3n/4495/+OP - ef/jj3j/5ZaB/+mnlv/zz8X/+uvn//78+//8+/r/+/n3/+jY0//AkIP/nlZB/5A+J/+QPCX/kT0n/5E+ - J/+RPif/kT0m/5E+J/+RPif/kT4n/5E+J/+RPib/kD0m/489Jv+QPSb+kDwl/ZA9JfyQPSb4m1I98LN9 - bebo2NPW+PPzwPz8/Kj7+/uN+vr6dPz8/Fv7+/tH/Pz8cvv7+4r7+/un/Pz8wv39+9b+8+Tl/N+18f3D - b/f9tlH7/bNL/f25Vv79w3D//dac//3u1//9+fP//f39//39/f/9/f3//v7+//7+/v/+/v7//vXo//7k - vv/+zon//r5g//64UP/+tkv//rVL//61S//+tUn//rZN//7Fcf/+3av//vLg//79+//+/v7//v7+//7+ - /v/+/v7//vv6//vv6//yzcP/6qyb/+SWgf/jj3n/4495/+OPef/jj3n/4454/+aahv/qq5v/776x/+qr - mv/mmob/4494/+OPef/jj3n/4495/+OPeP/lloH/6qyc//PPxf/77+v//vv6//z6+f/z7On/3cW9/8CS - hP+eVUH/k0Er/487Jf+RPif/kT4n/5E+J/+RPif/kT4n/5E9J/+RPSf/kT4n/5E+J/+RPif/kT4n/5A9 - Jv+PPSb/kD0m/pA+JvyPPCX4jzwl8Z5WQefYvbTY8enlxPz8/K78/PyU/f39e/z8/GP8/PxP/f39ef39 - /ZD8/Pyt/Pz8x/z8/Nn86s7o/MyF8v24VPj9skj8/bNK/v20S/7+s0f//r9i//7WnP/+8Nv//vv2//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//726v/+5sL//syC//6+YP/+t07//rVL//61S//+tUv//rVK//60 - Rv/+xXH//t6u//726//+/Pr//v7+//7+/v/+/v7//v7+//78/P/89fL/8szC/+mol//jknz/45B6/+OP - ef/jj3n/4495/+OPeP/jjnj/4412/+OOeP/jj3j/4495/+OPef/jj3n/45B5/+SSfP/qqZj/88zC//33 - 9f/+/fz//v39//fx7//fycL/tHxs/5ZHMf+NOCD/kDwl/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E9 - Jv+RPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA+JvyPPCb5jToj8plNOOjPrqTa7OLexvz8 - /LH7+/uZ+/v7gfz8/Gn8/PxV/f39ev39/ZL8/Pyv/Pz8yP39+9v96cvp/Ml/8/23U/n9s0n8/bNK/v20 - Sv7+tEr//rZN//67V//+1pr//u3V//7+/f/+/v7//v7+//7+/v/+/v7//v7+//79+//++O7//ubB//7O - iP/+vFz//rZL//61S//+tUv//rVL//61Sv/+t07//sJp//7er//+8+T//v7+//7+/v/+/v7//v7+//7+ - /v/+/fz/+/Ds//TSyf/no5H/5ZR//+OPeP/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+OP - ef/jj3j/5JR+/+mkk//00sn/+/Hu//79/f/+/v7//Pv6/+vc2P+wdGT/mEs1/487I/+QPSb/kT0m/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA+ - JvyPPCb5kD4o8p9aR+jex8Da8+3qx/z8/LL7+/ua/f39gvz8/Gr8/PxV/f39d/v7+4/8/Pys/Pz8xvz8 - /Nn8793o/Nmm8/3Aafj9tlH8/bRK/v20Sv79tEr//rRJ//61Sv/+wGT//tWZ//7t0//+/Pj//v7+//7+ - /v/+/v7//v7+//7+/v/+/fv//vbq//7kvf/+z4v//r1c//64UP/+tkv//rVL//61S//+tUn//rhR//7E - bf/+3a3//vLg//7+/v/+/v7//v7+//7+/v/+/v7//vv6//rt6f/z0Mb/6qua/+WXgv/jj3j/4495/+OP - ef/jj3n/4495/+OPef/jj3n/4495/+OPeP/ll4L/6qua//PRyP/67en//vz7//7+/v/9+/v/5tTP/8SY - i/+aTTj/kT0m/5A7JP+RPif/kT4n/5E+J/+RPif/kT4n/5E9Jv+RPSb/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4m/5A9Jv+PPSb/kD0m/pA+JvyQPyn5oV5L8r+Shujt4t/Z+PX1xvv7+7D7+/uY/f39f/z8 - /Gb8/PxS/Pz8cPv7+4j8/Pyl/Pz8wPz8/NX9+PDl/OzT8f3QkPf9wGj7/bZQ/f20Sv79tEr+/bRK//61 - Sv/+tEf//sFm//7Wmv/+8Nv//vr0//7+/v/+/v7//v7+//7+/v/+/v7//v7+//715//+5b7//syC//6/ - Yv/+uFD//rVL//61S//+tUv//rVK//60R//+x3b//uC0//779f/+/vz//v7+//7+/v/+/v7//v7+//77 - +//88/H/8srA/+mrmv/klH//45B6/+OPef/jj3n/4495/+OPef/jj3n/45B6/+SVgP/qrJv/8szC//vz - 8f/+/Pv//v79//z5+f/r3Nf/x52Q/6FaRv+QPSX/kDsk/5E+J/+RPif/kT4n/5E+J/+RPSb/kT4n/5E9 - Jv+QPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+RPib/kD0m/489Jv+QPSb+kD0m/ZJBKfyeVkT4vIyA8eHM - xuf49fTY/Pz8w/z8/K37+/uT+/v7evz8/GH7+/tN/Pz8Zvv7+377+/uc/Pz8uPz8/M/9/f3h/fr27/3q - 0Pb90ZP7/bxf/f21Tf39tEr+/bRK/v2zSv/+tUr//rVI//67V//+15z//vDa//7+/f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/++O///ujH//7OiP/+vV///rVM//61S//+tUv//rVL//61S//+tEj//sp8//7y - 4P/++/f//v7+//7+/v/+/v7//v7+//7+/v/+/v7//PPx//PQxv/oo5H/5JJ8/+OPef/jj3n/4495/+OP - ef/jj3n/45F8/+qnlv/00sn//ff1//7+/f/+/v7//Pv7//Tt6/+/j4L/nlZB/445Iv+RPSb/kT4n/5E+ - J/+RPif/kT4n/5E9Jv+RPSb/kT4m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9 - Jv6QPSb+kT4o/ZZIM/u9joD44c3I8P39/OX9/f3W/Pz8wPz8/Kj7+/uN/Pz8cvz8/Fn7+/tF/Pz8Wfz8 - /HH7+/uQ/Pz8rvz8/Mf8/Pzc/Pz76/z38PT958n6/dSX/f29Yv39t1D+/bVK/v20Sv79tEr//rRJ//62 - Tf/+vl///tab//7t0//+/v3//v7+//7+/v/+/v7//v7+//7+/v/+/fr//vjt//7apf/+w23//rVJ//61 - Sv/+tUv//rVL//61S//+tEf//sd2//7t0//++vT//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vv7//rs - 6f/z0sn/6aiX/+WWgf/jj3j/4495/+OOeP/lloH/6aqZ//TTy//77uv//vz8//7+/v/+/v7/+vj3/+7j - 3/+tcF//k0Ir/487I/+RPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+RPSb/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6RPyn+oFpH/b2Mf/vhzMf39O/t7/z8/OP8/PzS/Pz8u/39 - /aD9/f2D/Pz8aPz8/E/7+/s8+/v7Tfz8/GX9/f2E/Pz8pPz8/L/8/PzV/Pz85/z8/PL99uz4/ejJ/P3R - kf39wWj+/bhR/v21Sv79tEr+/bRK//60Sv/+tEj//sJp//7Wm//+8Nv//vr0//7+/v/+/v7//v7+//7+ - /v/+/Pj//vTl//7YoP/+wmv//rVJ//61Sv/+tUv//rVL//62S//+uFD//suA//7u1f/++vT//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//37+v/67+z/8svB/+qunv/lmYT/45B6/+aahf/rr5//88/F//vv - 7f/+/Pv//v7+//7+/v/+/v7/+/n4//Lp5/+8i37/nVRA/487I/+QPCX/kT0m/5E+J/+RPSb/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPib/kD0m/489Jv+QPSb+kD0m/pE/KP6hW0f+u4t+/eDL - xfv18O72/Pz87fz8/OD8/PzN/Pz8tPv7+5j9/f15/Pz8Xvv7+0X6+voy+/v7Qvz8/Fr9/f14+/v7mfz8 - /Lb8/PzO/Pz84v39/e79/f32/fjy+/3qz/390JL+/b9k/v22Tf79tUr+/bRK/v20Sv/+tUv//rRI//6+ - YP/+157//vDc//78+P/+/v7//v7+//79+v/+9OX//uG2//7Lgf/+vF3//rVM//61S//+tUv//rZM//63 - T//+wGT//tWZ//705f/+/Pj//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/fz//PTy//TT - yv/ssqP/5p2J/+y0pf/11c3//ff2//79/f/+/v3//vv6//739P/+9fL//vXy//z08f/iy8f/uYV4/5VF - Lv+QOyT/kDwl/5E+J/+QPSb/kT0m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9 - Jv6QPSb+kkEq/plMN/69jH7+4crE/P39/fr8/Pz0/f396f39/dv8/PzH/Pz8rP39/Y79/f1v/Pz8U/v7 - +zv5+fkp+vr6OPv7+078/Pxs+/v7jfz8/Kv8/PzF/f392/v7++r8/Pzz/fz7+f358/z96Mv+/dOY/v29 - YP79t0/+/bVK/v60Sv79tEr//rRK//63Tv/+u1n//tif//7v1//+/v7//v7+//7y4P/+37L//sh3//69 - Xf/+t0///rVL//61S//+tkz//rhR//6/Yf/+0ZD//ufG//78+f/+/v3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//vz8//z18//67en/+Obh//rt6v/89fP//v39//7+/v/+9/T//ubb//7H - rv/+wqb//sOo//7Ks//56OH/4MrE/72Mf/+URC7/kT4n/5JAKf+QPSb/kT0m/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6RPyn+nVRA/r6Of/7hzcf9+PPy+v39/ff9/f3w/Pz85Pz8 - /NP8/Py9/Pz8ofv7+4P8/Pxj+/v7SPr6+jH39/ch+fn5L/v7+0T8/Pxg/f39f/z8/J78/Py5/Pz80f39 - /eH8/Pzt/Pz89f39/fn99uz8/efI/v3Slf79wGf+/bhR/v21Sv79tEr+/bRK//60Sv/+tUr//sh3//7c - qv/+7tb//vDa//7fsf/+y4D//rtZ//63T//+tUv//rVL//62TP/+uVP//sFn//7QjP/+5cH//vXp//7+ - /v/+/v7//v7+//7+/v/+/Pr//vn2//759//+/fz//v7+//7+/v/+/v7//v7+//7+/v/+/f3//vz7//79 - /f/+/v7//v7+//76+P/+3c7//ryd//6ieP/+nnP//p5z//6ieP/+yrL/9dnO/+DKw/+5hXf/nlRA/5A7 - JP+QPCT/kT0m/5E+J/+RPif/kT4n/5E+J/+RPib/kD0m/489Jv+QPSb+kD0m/pFAKf6hXEj+vIt9/uLN - x/317uz7/f39+Pz8/PP9/f3p/f392/z8/Mj7+/uw/f39k/z8/HX8/PxW+/v7Pfn5+Sj19fUZ+Pj4Jvr6 - +jn8/PxS/Pz8cPv7+478/Pyq/Pz8w/39/db9/f3l/f397/39/fb9/f36/ffu/P3pzf790ZH+/cBn/v23 - T/79tUr+/bRK/v20Sv/+tkz//rxb//7Ief/+1pr//tif//7JfP/+vFr//rZM//61S//+tUv//rZM//64 - Uf/+wWf//tCL//7lwf/+9ur//v7+//7+/v/+/v7//vv6//707//+5tv//t3O//7ez//+6uH//vf0//79 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v38//7y7P/+wqf//pVl//6LVv/+ilb//olU//6I - Uf/+oHX//smw//nm3v/iy8X/t4Fy/5lLNv+POiL/kDwl/5E9Jv+RPif/kT4n/5E+J/+QPSb/kD0m/pA9 - Jv6QPSb+kkEq/p1UQP68i3z+38nD/fr49/z9/f34/Pz88/z8/Oz8/Pzg/Pz8z/z8/Lr8/Pyh+/v7hPz8 - /Gb7+/tJ+vr6Mff39x/y8vIT9vb2Hfn5+S37+/tE/Pz8Xv39/Xv7+/uY/Pz8s/z8/Mj8/PzZ/Pz85/39 - /fD9/f32/f38+v369v396c3+/dOV/v2+YP79tk3+/bVK/v20Sv79s0r//rZM//63Tf/+tk3//rZN//62 - Tf/+tk3//rVL//61S//+tkv//rdP//6+Yf/+0Iz//uXB//779f/+/v3//v7+//7+/v/+/v7//vHr//7Y - xv/+rIf//php//6abP/+tZP//uXY//76+P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vv6//7m - 2//+s5L//opV//6MV//+jFj//oxX//6LVv/+iFL//p5z//7Eqv/88+//4czH/7yKff+POiL/jzoj/5A8 - JP+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6RPyj+mEw3/r2Mfv7izcf9+/n4/P39/fn8/Pz0/Pz87Pz8 - /OP8/PzT/Pz8v/z8/Kn7+/uO+vr6cfz8/FX6+vo6+Pj4J/T09Bfr6+sN8/PzFvj4+CP6+vo1+/v7TPr6 - +mf7+/uC+/v7nfz8/LT8/PzJ/Pz82vz8/Of9/f3w/f399v39/Pr99+78/efI/v3Ul/79v2P+/bhR/v21 - Sv79tEr+/bRK//61Sv/+tUr//rVJ//61Sv/+tUv//rVL//62TP/+uVP//r9k//7Qjf/+5cD//vbq//7+ - /f/+/v7//v7+//79/f/+7+j//tG8//6uif/+l2f//o5b//6PXP/+mGn//rmY//7by//++vj//v79//7+ - /v/+/v7//v7+//7+/v/+/v7//vz7//7u5v/+vqH//pRj//6NWf/+jFj//oxY//6MV//+ilT//o9c//6g - dP/+yLD/9dzS/9/Jw/+7iHr/m086/446I/+POyT/kD0m/489Jv+QPSb+kD0m/pE/Kf6gWkb+u4t8/uHM - xv317uz7/Pz8+fz8/PT8/Pzs/Pz84vz8/NT8/PzB/Pz8q/39/ZL9/f13/Pz8Xfv7+0T5+fkt9vb2HfDw - 8BHj4+MJ7u7uD/X19Rn5+fko+vr6Ovz8/FL9/f1r+/v7hfz8/J78/Py1/Pz8yvz8/Nr8/Pzm/f398P39 - /fb9/f36/fbs/P3oyv790ZD+/cFo/v23Uf79tUr+/bRK/v20Sv/+tUr//rVL//61S//+tUv//rZL//64 - U//+wWf//s+K//7lwP/+9ef//v7+//7+/v/+/v7//vv5//7x6//+0r3//rCM//6UZP/+jVn//oxY//6M - V//+i1b//plr//65mP/+4NH//vfz//79/f/+/v7//v7+//7+/v/+/v7//v39//738//+0bz//qmC//6V - ZP/+j1z//oxY//6MWP/+jFf//opU//6MWP/+oHX//sqy//be1P/izcj/t4J0/5xTP/+POyP+jzsj/o87 - JP6QPCX+kT4n/qBZRf67inz+38nD/ffy8fv9/f34/Pz88/z8/O38/Pzi/Pz80/z8/ML6+vqt/Pz8lPv7 - +3v8/Pxh+/v7Sfr6+jT39/ch8vLyFOjo6AvU1NQG4+PjCe/v7xD19fUb+fn5Kvv7+z78/PxU/Pz8bP39 - /Yb7+/uf/Pz8tvz8/Mr8/Pza/Pz85/z8/PH9/f32/f39+v358/396c3+/dGQ/v2+Yf79tk3+/bVL/v20 - Sv79s0r//rVL//61S//+tkz//rdP//6/Y//+z4r//uTA//758f/+/v7//v7+//7+/v/+/fz//vDq//7X - xf/+qoP//pRj//6MWP/+jFj//oxY//6MWP/+jFj//otW//6XaP/+so///ubb//749f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+6N7//sev//6ke//+lWT//o1a//6MWP/+jFj//oxX//6LVf/+hk///qB0//7I - rv/++fb/4czF/7yLfP6XSDL+kT8o/pA9Jv6SQSr+l0kz/ryMff7hysT8/f39+/39/fj8/Pzz/Pz87Pz8 - /OP8/PzU/Pz8wvz8/K77+/uW+/v7fPr6+mP7+/tL+vr6Nvj4+CTz8/MW6+vrDdvb2weqqqoD1NTUBuXl - 5Qrx8fES9vb2Hfn5+Sz7+/s//Pz8Vfz8/G39/f2G+/v7n/z8/Lb8/PzK/Pz82vz8/Of9/f3w/f399v38 - +/r9+PH9/efI/v3Tlv79vV/+/bdQ/v21Sv7+tEr+/bRK//61S//+uFL//r5g//7Qjf/+5L///vjv//79 - +//+/v7//v7+//7+/v/+8On//tK+//6qg//+lmb//o5b//6MWP/+jFj//oxY//6MWP/+jFj//oxX//6O - W//+l2n//rWT//7dzv/++vj//v7+//7+/v/+/v7//v7+//7+/v/++fb//uje//7Fq//+qID//pVl//6N - Wf/+jFj//oxY//6MV//+i1X//o1Z//6gdv/+ybD/9uLa/+rb1/7WuLD+uIR2/q5yYv6ze2v+yKKX/uXS - zfz28e/6/f399/z8/PP8/Pzr/f394fz8/NT8/PzC/Pz8rfv7+5b9/f18+vr6ZPv7+0z6+vo3+Pj4JvT0 - 9Bjt7e0O39/fCL+/vwQAAAABqqqqA9TU1Abo6OgL8fHxEvb29h75+fkt+/v7P/z8/FX6+vpu/f39hvv7 - +5/8/Py2/Pz8yfz8/Nr8/Pzn/f398P39/fb9/f36/fbr/P3nx/790ZL+/cBm/v23UP79tEj+/bRK/v23 - Uv/+wGb//s+K//7kv//+9eb//v7+//7+/v/+/v7//vv6//7x6//+0bz//rCM//6UY//+jlv//oxY//6M - WP/+jFj//oxY//6MWP/+jFj//oxY//6MV//+jVr//phq//65mf/+3M3//vr4//79/f/+/v7//v7+//7+ - /v/+/v7//vn1//7m2//+xav//qmC//6VZP/+jlv//oxY//6MWP/+jFf//opU//6PXP/9oHf//dnJ//vx - 7f7z7Or+4MrF/tm/t/7dxLz96t3Z/Pfz8fr9/f32/Pz88f39/en8/Pzf/Pz80fz8/MH8/Pys/Pz8lfv7 - +336+vpk+/v7TPr6+jj4+Pgn9fX1Ge7u7g/f398Iv7+/BP///wEAAAAAAAAAAH9/fwLMzMwF5eXlCvLy - 8hP29vYe+fn5LPv7+z/8/PxV/Pz8bf39/Yb7+/uf/Pz8tvz8/Mr8/Pza/Pz85/39/fD9/f32/f39+v33 - 7/z96cz+/dGQ/v3BaP79uFP+/bhT/v3AZv79zon//uS///726v/+/v7//v7+//7+/v/+/Pr//vDq//7W - xP/+ron//pRk//6MWP/+jFj//oxY//6MWP/+jFf//oxX//6MV//+jFj//oxY//6MWP/+jFj//otW//6Z - av/+tpX//ubc//728//+/v3//v7+//7+/v/+/v7//v7+//7+/v/+5Nj//sWr//6mff/+kmH//oxY//6M - WP/+jFj//oxX//6KVf/9h1P+/cGl/v3o3f79/f3+/f39/v39/f39/f38/f39+fz8/PX9/f3v/Pz85/z8 - /Nz8/PzO/Pz8vvz8/Kv8/PyU/f39e/z8/GP7+/tM+vr6OPj4+Cb19fUZ7u7uD9/f3wi/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl5Qry8vIT9vb2Hvn5+Sz7+/s//Pz8Vfz8/G37+/uH+/v7n/z8 - /Lf8/PzK/Pz82vz8/Of9/f3w/f399v38+/r9+vb9/e3U/f3bqf79yn/+/cd3/v3UmP7+58T+/fnz//38 - +v/9/f3//f39//7+/v/+8er//tbC//6ogP/+lWX//o1Z//6MWP/+jFj//oxY//6MWP/+ilb//opV//6L - Vv/+jFf//oxY//6MWP/+jFj//oxY//6NWf/+l2n//rGP//7i1P/++/j//v7+//7+/v/+/v7//v7+//7+ - /v/++/r//uje//7Fq//+mGr//otW//6MWP/+jFj//YtX//2KVv/9ilX+/ad+/v3Svv79/fz+/f38/v39 - /fz9/f35/Pz89f39/e/8/Pzm/Pz82vz8/Mz8/Py7+/v7p/v7+5H9/f15/Pz8Yfv7+0v6+vo3+Pj4J/X1 - 9Rnu7u4P39/fCL+/vwQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AtTU1Abo6OgL8vLyE/b2 - 9h75+fkt+/v7QPz8/FX8/Pxt/f39hvv7+5/8/Py2/Pz8yfz8/Nr7+/vn/f397/z8/PX9/f35/fnx+/3x - 3/396c7+/ejJ/v3u2P799ur+/f39/v39/f79/f3+/fv6//7w6v/+0b3//q+K//6VZf/+jlv//oxY//6M - WP/+jFj//otW//6QXv/+qYL//ruc//64mP/+m27//o9d//6LV//+jFj//oxY//6MV//+jlv//pZn//65 - mf/+3cz//vv4//7+/f/+/v7//v7+//7+/v/+/v7//u7n//7Nt//+mmz//opW//6MWP/9i1f//YpX//2L - Vv79i1b+/aF2/v3Nt/79/Pv+/f39/P39/fr8/Pz1/f397/z8/OT8/PzX/Pz8yPz8/Lb7+/ui+/v7jf39 - /Xb8/Pxf/Pz8Svr6+jb4+Pgm9fX1Ge7u7g/f398Iv7+/BP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH9/fwLU1NQG5eXlCvLy8hP29vYe+fn5Lfv7+z/8/PxV/Pz8bf39/Yb7+/uf/Pz8tfz8 - /Mn8/Pza/f395f39/e78/Pz0/f39+P38/Pv9/f38/fz7/v39/P79/f3+/f39/v39/f79+/n+/fHr//7T - wP/+sI3//pRk//6NWf/+jFj//oxY//6MWP/+i1f//pJg//6le//+z7n//uba//7h0//+vZ///p5x//6P - XP/+i1f//oxY//6MWP/+jFf//otW//6aa//+uZn//uLV//738//+/f3//v7+//7+/v/+9vL//uHT//6/ - ov/+l2j//otW//6LV//9ilf//YtX/v2NWf79kF7+/a2J/v3Vw/79/fz8/f39+v39/fb9/f3v/Pz85vz8 - /Nf8/PzG/Pz8s/z8/J77+/uI/Pz8cfz8/Fv7+/tH9fX1Nfj4+CX09PQY7u7uD9/f3wi/v78E////AQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl5Qry8vIT9vb2Hvn5 - +Sz7+/s//Pz8Vfz8/G37+/uH+/v7n/z8/LX8/PzJ/Pz82fz8/OT8/Pzt/Pz88/39/ff9/f36/f39/P39 - /f39/f3+/f39/v39/f799O/+/d3P/v2phP79k2P//oxY//6MWP/+jFj//oxY//6MWP/+i1X//qR6//7L - sv/+9vL//v79//76+P/+8On//rmZ//6Zav/+i1b//oxX//6MWP/+jFj//oxY//6LVv/+l2j//rOQ//7n - 3P/++vj//v7+//7+/f/+5Nf//sGk//6bbf/+kF7//YtY//2LV/79i1f+/YxY/v2RX/79nHD+/cqy/v3q - 4f39/f37/f399/z8/PH8/Pzn/Pz82vz8/Mj8/Pyz+/v7nP39/YT8/Pxt/Pz8Vvv7+0L6+vox9/f3IvT0 - 9Bft7e0O39/fCL+/vwQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/AszMzAXo6OgL8vLyE/b29h75+fkt+/v7QPz8/FX8/Pxt/f39hfv7+538/Pyz/Pz8xfz8 - /NT8/Pzg/f396f39/e/8/Pz0/f39+P39/fv9/f38/f39/v38/P7949f+/biY/v2Xaf7+jFr//oxY//6M - WP/+jFj//oxX//6NWf/+qYL//s64//7v6P/+/Pv//v7+//79/f/++vj//uTY//7Ao//+mWr//o1Z//6L - V//+jFj//oxY//6MV//+jlv//php//64mP/+3c7//vPu//7l2f/+wKP//qJ4//6RXv/9jFn//YpX//2L - V/79jFf+/ZNh/v2lfP79xav+/efd/f349vv9/f34/Pz88v39/en8/Pzc/Pz8y/z8/Lb9/f2d/f39g/z8 - /Gr8/PxU+/v7P/n5+S739/cg8/PzFu3t7Q7f398Iv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLU1NQG6OjoC/Ly8hP29vYe+fn5Lfv7 - +z/8/PxV/Pz8bP39/YP7+/ua/Pz8rvz8/MD8/PzP/f392/z8/OT8/Pzs/Pz88/39/ff9/f36/Pz8/f37 - +v7918b+/Z5y/v2OW/79ilb//otX//6MWP/+jFj//otX//6OW//+wab//ufc//7+/f/+/v7//v7+//7+ - /v/+/v7//vn2//7h1P/+vqD//pxu//6PXP/+i1f//oxY//6MWP/+jFf//o1Z//6abP/+s5H//sSp//64 - mP/+oXf//pJg//6MWP/9ilf//YtX/v2NWf79kmH+/aZ9/v3Cp/795tv+/ff0+/39/fj8/Pzz/Pz86/z8 - /N/8/PzP/Pz8uvv7+6L9/f2H/Pz8bPz8/FP7+/s++fn5LPb29h7y8vIU6urqDNvb2we/v78E////AQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CzMzMBeXl5Qry8vIT9vb2Hvn5+Sz7+/s+/Pz8U/z8/Gn7+/uA/Pz8lfz8/Kj8/Py6/Pz8yf39 - /db8/Pzi/Pz86/z8/PL9/f34/f39+/37+v3908D+/ZZm/v2MWP79ilb+/YpX//6MWP/+jFj//otX//6O - W//+ybH//uzj//79/P/+/v7//v7+//7+/v/+/v7//v7+//759//+6d7//riX//6cbv/+jVn//oxX//6M - WP/+jFj//oxY//6LVv/+jVn//o5b//6LV//+jFj//otY//2LV/79i1f+/Y1Z/v2SYf79oXb+/cGm/v3i - 1f39/f38/f39+fz8/PP8/Pzs/f394fz8/NL8/Py/+/v7p/39/Yz8/Pxx/Pz8Vvv7+z/5+fks9vb2HfHx - 8RLo6OgL1NTUBqqqqgMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszMzAXo6OgL8fHxEvb29h35+fkr+/v7PPz8 - /E/8/Pxj/f39eP39/Yz8/Pyg/Pz8svz8/MP8/PzT/f394fz8/Ov8/Pzz/f39+f39/Pv94NP9/bGN/v2Q - X/79iVX+/otX/v2KV//+i1j//oxY//6NWv/+pHv//s22//7z7v/+/fz//v7+//7+/v/+/v7//v7+//7+ - /f/++ff//une//6+oP/+mWr//oxW//6MV//+jFj//oxY//6MWP/+jFj//oxY//6MWP/9i1f//YpX//2L - V/79jFf+/ZNi/v2id/79wKT+/ePX/f349vz9/f35/Pz89Pz8/Oz8/Pzi/Pz80/z8/MH8/Pyq+/v7kPv7 - +3b8/Pxb+/v7Qvn5+S729vYe8fHxEuXl5QrMzMwFf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwLU1NQG6OjoC/Hx8RL29vYc+fn5Kfr6+jj8/PxK/Pz8XP39/W/9/f2D+/v7mPz8/Kz8/PzB/Pz80/z8 - /OL8/Pzt/Pz89f39/fn98ev8/dfF/v2qhP79k2L+/YpV/v2LV/79i1f//otX//6MWf/+k2L//qqE//7L - tP/+8Or//vv5//7+/v/+/v7//v7+//7+/v/+/v3//vn3//7h0//+wKP//plq//6PXP/+jFf//oxY//6M - WP/+jFj//otX//2LV//9ilf//YtX/v2MWP79k2L+/aV9/v3ApP7949b9/fXx+/39/fj8/Pz0/Pz87P39 - /eH8/PzU/Pz8wfr6+qz9/f2T/f39efz8/F/7+/tH+vr6Mff39yDy8vIU6OjoC8zMzAWqqqoDAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38C1NTUBuXl5Qrw8PAR9fX1Gvj4+Cb6+voz+/v7Q/z8 - /FT8/Pxo+/v7fvz8/JX8/Pyt/Pz8xP39/db9/f3l/Pz88f39/ff9+/r7/fPv/f3Mtv79qoP+/ZFf/v2L - V/79i1f+/YtX//6LV//+i1f//pJh//6mff/+07///u3l//78+v/+/v7//v7+//7+/v/+/v7//v7+//75 - 9v/+5Nf//riY//6dcP/+j1z//oxX//6MWP/+jFj//otX//2KV//9i1f+/Y1a/v2SYP79o3r+/b+k/v3g - 0v39+ff8/f39+Pz8/PT8/Pzt/Pz84vz8/NT8/PzC/Pz8rfz8/JX7+/t8/Pz8Yvz8/Er6+vo09/f3IvPz - 8xXq6uoM1NTUBn9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AszM - zAXj4+MJ7u7uD/Pz8xb39/cg+fn5Lfv7+zz7+/tO/Pz8Zfv7+377+/uZ/Pz8s/z8/Mn8/Pzc/Pz86vz8 - /PP9/f34/fz7/P339P390Lv+/aV7/v2MV/79ilb+/YtX/v2KV//+jFj//oxX//6PXP/+n3P//tC7//70 - 7//+/v7//v7+//7+/v/+/v7//v7+//7+/v/++vj//u/n//65mv/+mGn//otW//6MV//9i1f//YtX/v2L - V/79jFf+/ZJg/v2ec/79v6T+/eHV/v38+/z9/f35/Pz89Pz8/O38/Pzj/Pz81Pz8/MP8/Pyu+/v7lvv7 - +338/Pxj/Pz8Svr6+jb4+Pgl////Fuvr6w3b29sHqqqqAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E39/fCOvr6w3y8vIT9vb2Hfn5+Sr6+vo6/Pz8T/z8 - /Gj7+/uE/Pz8oPz8/Ln8/PzP/f394fz8/Oz8/Pz0/f38+v38+/z97eb+/dO//v2nfv79kmH+/YpV/v2L - V/79ilf//otX//6NWf/+kV7//qmC//7Ks//+9O///vz6//7+/v/+/v7//v7+//7+/v/+/f3//vr4//7i - 1v/+v6P//phq//2MWv/9ilb//YtX/v2MV/79k2L+/aR8/v2/o/794tb9/fXx+/39/Pn8/Pz0/Pz87Pz8 - /OL8/PzU/Pz8wvz8/K39/f2V/f39fPr6+mT7+/tM+vr6N/j4+Cb19fUZ7e3tDt/f3wi/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Cv7+/BNTU - 1Abl5eUK8fHxEvb29hz5+fkp+/v7Pfz8/FT9/f1v/f39jPv7+6f8/PzA/Pz81fz8/OP9/f3u/f399v39 - /fr9+/r8/e/o/v3OuP79qoT+/ZNi/v2KVv79i1f+/YtX//6LV//+i1f//pNi//6pgv/+0bz//u7m//77 - +v/+/v7//v7+//7+/v/+/v7//v7+//749f/+4NL//rud//2ccf/9j13+/YtX/v2RX/79pHz+/b+k/v3f - 0/789fL8/f39+Pz8/PT8/Pzt/Pz84vz8/NT8/PzD/Pz8rfv7+5b7+/t9+vr6ZPv7+036+vo4+Pj4JvX1 - 9Rnu7u4P39/fCL+/vwT///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF5eXlCvDw8BH29vYc+fn5Lfv7+0L5+flc+/v7ePz8 - /JT8/Pyv/Pz8x/z8/Nj9/f3l/f398P39/fb9/f36/fv7/f349v79zbf+/aZ//v2NWf79i1f+/YtX/v2K - V//+jFj//otX//6RX//+oHX//tTA//7x6v/+/fz//v7+//39/f/9/f3+/f39/v39/f79+fb+/erh/v27 - nv79n3T+/ZVm/v2hd/79wKX+/eDU/f39/fz9/f35/Pz88/z8/Oz8/Pzj/Pz81Pz8/ML8/Pyu/f39lfv7 - +338/Pxj+/v7TPr6+jj4+Pgm////GO7u7g/f398Iv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl - 5Qrx8fES9/f3Ifr6+jP7+/tJ/Pz8Y/v7+3/7+/ua/Pz8s/z8/Mj8/PzZ/Pz85/39/e/9/f32/f39+v38 - +/398Or+/dK+/v2ke/79kF7+/YpW/v6LV/79ilf//otX//6NWf/+j13//qZ+//7Mtf/+9fD//v38//39 - /f/9/f3+/f39/v39/f79/Pz+/fn3/v3s5P793c/+/dbF/f3e0P397eX8/ff0+/39/fj8/Pzz/Pz87Pz8 - /OL8/PzU/Pz8wvz8/K37+/uW/f39fPr6+mT7+/tM+vr6N/j4+Cf19fUZ7e3tDt/f3wi/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAf39/AtTU1Abq6uoM9PT0F/j4+CX6+vo4/Pz8T/z8/Gj7+/uD+/v7nfz8 - /LT8/PzJ/Pz82vz8/Ob9/f3v/f399v39/fr9+/v8/ezk/v3Qu/79qIL+/ZNi/v2KVv79i1f+/YtX//6L - V//+jFf//pJi//6qhP/+zrf//vDp//36+P/9/f3+/f39/v39/f79/f3+/f38/v36+f799fH9/fPu+/31 - 8vr9+/n4/Pz89fz8/PH8/Pzq/Pz84Pz8/NP8/PzC/Pz8rfv7+5b7+/t9+vr6ZPv7+036+vo4+Pj4J/X1 - 9Rru7u4P39/fCL+/vwT///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqgPb29sH7e3tDvX1 - 9Rr5+fko+/v7PPz8/FL9/f1r+/v7hvz8/J78/Py1/Pz8yvz8/Nr8/Pzn/f398P39/fb9/f36/fv7/P30 - 8f79y7T+/aiC/v2QXf79i1f+/YtX/v2KV//+jFj//otX//6SYf/+pXz//tTA//3t5f/9+/r+/f39/v39 - /f79/f3+/f39/f39/fz9/f36/f39+Pz8/PX8/Pzy/Pz87fz8/Of9/f3e/Pz80fz8/MH8/Pys/Pz8lfv7 - +338/Pxj+/v7TPr6+jj4+Pgm9fX1Ge7u7g/f398Iv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH9/fwK/v78E4+PjCfDw8BH29vYc+fn5K/v7+z78/PxU/Pz8bf39/Yb7+/uf/Pz8t/z8 - /Mr8/Pza/Pz85/z8/PH9/f32/f39+v38+/399PH+/dC6/v2jef79jVn+/YpW/v2LV/79ilf//otX//6M - V//+j1z//qJ3//3Puf/99PD+/f39/v39/f79/f39/f39/P39/fn9/f32/Pz88vz8/O38/Pzo/f394fz8 - /Nj8/PzN/Pz8vfz8/Kr7+/uT+/v7e/z8/GP7+/tL+vr6N/j4+Cb19fUZ7e3tDt/f3wi/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBejo6Avx8fES9vb2Hfn5 - +S37+/s//Pz8Vfz8/G39/f2G+/v7n/z8/Lb8/PzJ/Pz82vz8/Of9/f3v/f399v39/fr9+/v8/ezk/f3Q - vP79pn3+/ZJh/v2KVf79i1f+/YtX//2KV//9i1j//ZBf//2pg//9zLX+/fXx/v37+v39/f38/f39+fz8 - /PX9/f3v/Pz86P39/eH8/PzY/Pz8zvz8/MP8/Py1/Pz8o/v7+5D7+/t5/Pz8Yvv7+0z6+vo3+Pj4J/X1 - 9Rru7u4P39/fCL+/vwT///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/AtTU1Abo6OgL8fHxEvb29h75+fkt+/v7P/z8/FX8/Pxt+/v7h/v7+5/8/Py2/Pz8yvz8 - /Nr8/Pzm/f397/39/fb9/f35/fv6+/3v6f39y7T+/aiC/v2SYP79ilb+/YtX/v2LV/79i1f+/YpV/v2R - YP79rIf+/ePX/v318vz9/f35/Pz89f39/e/8/Pzm/Pz83Pz8/ND8/PzE/Pz8t/z8/Kr9/f2Z/f39h/r6 - +nT6+vpf/Pz8Svr6+jf4+Pgm9fX1Ge/v7xDf398Iv7+/BP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLMzMwF5eXlCvLy8hP29vYe+fn5LPv7 - +z/8/PxV/Pz8bf39/Yb7+/uf/Pz8tvz8/Mr8/Pza/Pz85/39/fD8/Pz1/f39+P38+/r99/T8/cy0/f2k - fP39i1j9/YtX/v2LV/79i1f+/YtX/v2JVf79mm/9/cy2/P3u5vr9/f32/f398Pz8/Of9/f3b/Pz8zPz8 - /Lz8/Pys/f39nPv7+437+/t8/Pz8avz8/Fj7+/tF+vr6NPj4+CX09PQX7e3tDt/f3wi/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CzMzMBejo6Avy8vIT9vb2Hvn5+S37+/tA/Pz8Vfz8/G39/f2G+/v7n/z8/Lb8/PzJ+/v72f39 - /eX8/Pzs/Pz88v38/Pb8+/r4/e3m+f3QvPv9onn8/Y9e/f2JVf39ilf9/YpX/f2RX/z9qIH6/drK+fzy - 7fX9/f3w/Pz86Pz8/Nz8/PzM/Pz8uvz8/Kb7+/uS/f39f/z8/G78/Pxe+/v7Tvv7+z76+vow+Pj4I/T0 - 9Bft7e0O39/fCL+/vwQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AtTU1Abo6OgL8vLyE/b29h75+fkt+/v7P/z8 - /FX8/Pxt+/v7hvz8/J78/Pyz/Pz8xvz8/NX8/Pzf/Pz85/z8/O39/f3w/Pr58/zs5fX9zLj4/aqF+f2V - Zfr9jVr6/ZVn+v2ngfj9xKv2/O3l8/349u78/Pzn/Pz83fz8/M/8/Py8/Pz8pv39/Y79/f14/Pz8ZPz8 - /FP7+/tD+vr6Nvn5+Sr39/cf8/PzFe3t7Q7f398Iv7+/BP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwLMzMwF5eXlCvLy8hP29vYe+fn5LPv7+z/8/PxV/Pz8bPv7+4T8/Pyb+/v7sPz8/MH8/PzO/Pz82Pz8 - /N/9/f3l/f396fz7+u389fLx/M+68/yyj/X8onn1/LKR9PzKtPL949jv/Pv76/z8/OT9/f3b/Pz8z/z8 - /L78/Pyp+/v7kf39/Xj8/Pxh+/v7TPr6+jr5+fkt9/f3IvX19Rnw8PAR6OjoC9vb2we/v78EAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl5Qry8vIT9vb2Hvn5+Sz7+/s//Pz8U/r6 - +mr9/f2A/Pz8lfz8/Kj8/Py3/Pz8wvz8/Mz8/PzU/f392/v7++L8+/vn/Pby6/zw6e396uPu/O7p7f31 - 8un8+ffl/f393v39/db8/PzL/Pz8vfz8/Kv8/PyV+/v7ffz8/GL7+/tM+vr6OPn5+Sj29vYc8vLyFOvr - 6w3f398I1NTUBqqqqgMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AtTU - 1Abo6OgL8vLyE/b29h75+fks+/v7Pfz8/FH6+vpl/f39ePv7+4v7+/ua+/v7p/z8/LP8/Py9/Pz8x/z8 - /M/8/PzX/Pz73Pz7+t/8+vng/fz63vz7+9r8/PzT/Pz8y/z8/MD8/Py0/Pz8pfv7+5P7+/t++vr6Z/z8 - /E/6+vo6+fn5KfX19Rvx8fES6OjoC9vb2we/v78Ef39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLU1NQG5eXlCvHx8RL29vYd+fn5Kvr6+jr8/PxK/Pz8XPz8 - /G37+/t8+/v7iv39/Zb8/Pyj/Pz8rv39/bj8/PzC/Pz8yfz8/Mz8/PzO/Pz8zPz8/Mb8/Py+/Pz8tPv7 - +6f7+/ua/f39iv39/Xn8/Pxl/Pz8Ufv7+zz5+fkr9vb2HPDw8BHl5eUK1NTUBqqqqgMAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBeXl - 5Qrw8PAR9fX1Gvj4+CX6+voy+/v7QPz8/E/8/Pxd/f39a/39/Xj7+/uG+/v7k/v7+5/8/Pyp/Pz8sfz8 - /Lb8/Py4/Pz8tfz8/K78/Pyl/f39mfv7+4z9/f19/Pz8bvz8/F77+/tN+/v7PPn5+Sv29vYe8vLyE+Xl - 5QrMzMwFf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAf39/AszMzAXl5eUK7u7uD/T09Bf39/ch+fn5K/r6+jf7+/tC+/v7Tvz8 - /Fv6+vpp/Pz8dfv7+4H7+/uM+/v7k/v7+5j7+/uZ+/v7l/r6+pH7+/uI/f39fP39/W/8/Pxh/Pz8U/v7 - +0X6+vo3+fn5Kvb29h7y8vIU6urqDNTU1AZ/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwLMzMwF39/fCOvr - 6w3y8vIU9fX1G/j4+CP5+fks+vr6N/v7+0L7+/tO/Pz8Wfz8/GP6+vpt/Pz8c/39/Xf9/f14/f39dvr6 - +nH8/Pxp/Pz8X/z8/FT7+/tH+/v7O/r6+jD4+Pgl9fX1G/Ly8hPq6uoM29vbB6qqqgMAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38Cv7+/BNvb2wfo6OgL7+/vEPPz8xb29vYd+Pj4Jvn5+S/6+vo5+/v7Q/v7 - +0z8/PxU/Pz8Wfz8/F38/Pxe/Pz8XPz8/Ff8/PxQ+/v7Sfv7+z76+vo0+fn5Kvf39yH19fUZ8PDwEejo - 6Avb29sHv7+/BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////////w - D//////////////AA/////////////8AAP////////////wAAD////////////gAAA////////////AA - AAf//////////+AAAAH//////////8AAAAD//////////4AAAAB//////////wAAAAA//////////gAA - AAAf/////////AAAAAAP////////+AAAAAAH////////8AAAAAAD////////wAAAAAAB////////gAAA - AAAA////////AAAAAAAAf//////+AAAAAAAAP//////4AAAAAAAAH//////wAAAAAAAAD//////gAAAA - AAAAB//////AAAAAAAAAA/////+AAAAAAAAAAf////8AAAAAAAAAAf////4AAAAAAAAAAP////wAAAAA - AAAAAH////gAAAAAAAAAAD////AAAAAAAAAAAB////AAAAAAAAAAAB///+AAAAAAAAAAAA///+AAAAAA - AAAAAAf//8AAAAAAAAAAAAP//8AAAAAAAAAAAAH//4AAAAAAAAAAAAD//4AAAAAAAAAAAAB//gAAAAAA - AAAAAAA//AAAAAAAAAAAAAAf8AAAAAAAAAAAAAAf8AAAAAAAAAAAAAAf4AAAAAAAAAAAAAAP4AAAAAAA - AAAAAAAPwAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAHgAAAAAAA - AAAAAAADgAAAAAAAAAAAAAADgAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAHwAAAAAAA - AAAAAAAHwAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAP4AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAf8AAAAAAA - AAAAAAAf+AAAAAAAAAAAAAA/+AAAAAAAAAAAAAB//AAAAAAAAAAAAAD//gAAAAAAAAAAAAH//wAAAAAA - AAAAAAP//4AAAAAAAAAAAAf//8AAAAAAAAAAAA///+AAAAAAAAAAAB////AAAAAAAAAAAD////gAAAAA - AAAAAH////wAAAAAAAAAAP////4AAAAAAAAAAf////8AAAAAAAAAA/////+AAAAAAAAAB//////gAAAA - AAAAD//////wAAAAAAAAH//////8AAAAAAAAP//////+AAAAAAAAf//////+AAAAAAAA////////AAAA - AAAB////////gAAAAAAD////////wAAAAAAH////////wAAAAAAP////////4AAAAAAf////////8AAA - AAA/////////+AAAAAB//////////AAAAAD//////////gAAAAP//////////wAAAA///////////4AA - AB///////////8AAAD///////////+AAAH////////////gAAP////////////4AAf////////////+A - B//////////////gH///////////////////////////////////////KAAAAIAAAAAAAQAAAQAgAAAA - AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqgPMzMwF29vbB+Xl5Qrt7e0O8vLyE/X19Rn39/cg+Pj4J/n5 - +S/6+vo3+/v7P/v7+0f8/PxP/Pz8V/z8/F78/Pxk/Pz8Z/z8/Gr8/Pxq/Pz8Z/z8/GT8/Pxe/Pz8V/z8 - /E/7+/tH+/v7P/r6+jf5+fkv+Pj4Jvf39yD19fUZ8vLyFO7u7g/o6OgL29vbB7+/vwSqqqoDf39/AgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38Cv7+/BNvb - 2wfl5eUK7e3tDvLy8hP19fUZ9/f3IPj4+Cf5+fkv+vr6OPv7+0H7+/tJ/Pz8Uvz8/Fr8/Pxh/Pz8aPz8 - /G76+vpy+vr6dPr6+nT6+vpy/Pz8bvz8/Gj8/Pxh/Pz8Wvz8/FL7+/tJ+/v7Qfr6+jj5+fkv+fn5KPf3 - 9yD19fUa8vLyFO7u7g/o6OgL29vbB8zMzAWqqqoDf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAB////AszMzAXf398I6OjoC+/v7xDz8/MW9vb2HPj4+CT5+fks+vr6Nfv7 - +z77+/tI/Pz8Uvz8/Fv8/Pxk/Pz8bPz8/HP9/f16+/v7gP39/YP7+/uF+/v7hf39/YP7+/uA/f39evz8 - /HP8/Pxs/Pz8ZPz8/Fv8/PxS+/v7SPv7+z76+vo2+fn5Lfj4+CX29vYd9PT0F/Dw8BHq6uoM39/fCNTU - 1Aa/v78Ef39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr - 6w3x8fES9PT0GPf39yD5+fko+vr6Mvv7+zz7+/tG/Pz8Ufz8/Fv8/Pxl/Pz8bvr6+nf9/f1+/f39hfv7 - +4z7+/uR/Pz8lPz8/JX8/PyV/Pz8lPv7+5H7+/uM/f39hf39/X76+vp3/Pz8bvz8/GX8/Pxb/Pz8Ufv7 - +0f7+/s9+vr6M/n5+Sr39/ci9fX1G/Ly8hTu7u4P6OjoC9/f3wjMzMwFqqqqA39/fwIAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAB/f38CzMzMBd/f3wjq6uoM8fHxEvX19Rn39/ci+fn5LPr6+jb7+/tB+/v7Tfz8 - /Fn8/Pxk/Pz8bv39/Xn9/f2B+/v7ivv7+5D7+/uX+/v7nPz8/KH8/Pyj/Pz8pfz8/KX8/Pyj/Pz8ofv7 - +5z7+/uX+/v7kPv7+4r9/f2B/f39efz8/G78/Pxk/Pz8Wfv7+077+/tD+vr6Ofn5+S/4+Pgm9vb2HfPz - 8xbw8PAR6urqDN/f3wjU1NQGqqqqA39/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf39/AszMzAXf398I6+vrDfLy - 8hP19fUb+Pj4JPn5+S/7+/s7+/v7R/z8/FT8/Pxh+vr6bv39/Xn7+/uE+/v7jvv7+5b7+/ud/Pz8o/z8 - /Kj8/Pyt/Pz8sfz8/LP8/Py0/Pz8tPz8/LP8/Pyx/Pz8rfz8/Kj8/Pyj+/v7nfv7+5b7+/uO/f39hP39 - /Xr9/f1v/Pz8Y/z8/Fj7+/tM+/v7QPr6+jX5+fkr9/f3IvX19Rvy8vIU7e3tDuXl5Qrb29sHv7+/BH9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH9/fwK/v78E39/fCOrq6gzy8vIT9fX1G/j4+CX6+vow+/v7Pfv7+0v8/Pxa/Pz8aP39 - /Xb9/f2D+/v7j/v7+5n8/Pyj/Pz8qvz8/LH8/Py2/Pz8uvz8/L78/PzA/Pz8wvz8/MP8/PzD/Pz8wvz8 - /MD8/Py+/Pz8uvz8/Lb8/Pyx/Pz8qvz8/KP7+/ua/f39kP39/YX9/f16/Pz8bfz8/GD8/PxT+/v7Rvr6 - +jr5+fkv+Pj4Jfb29h3z8/MV7+/vEOXl5Qrb29sHv7+/BH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38CzMzMBd/f3wjt7e0O8vLyFPb2 - 9hz4+Pgm+vr6Mvv7+0D8/PxP/Pz8Xvz8/G79/f19/f39jPv7+5n8/Pyk/Pz8rvz8/Lb8/Py8/Pz8wvz8 - /Mb8+/vJ+fX1zPHo5s7hy8bP17u00Ne8tdDgysXP7eHdzvXv78z7+/nJ/Pz8xvz8/ML8/Py8/Pz8tvz8 - /K78/Pym/f39m/39/ZD9/f2D/f39dvz8/Gj8/Pxa+/v7Tfv7+0D6+vo0+fn5Kvf39yD09PQY8PDwEerq - 6gzf398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/Ar+/vwTf398I6urqDPLy8hP19fUb+Pj4Jvr6+jL7+/tA/Pz8UPz8/GH8/Pxy+/v7g/v7 - +5P7+/ui/Pz8rvz8/Ln8/PzB/Pz8yfz8/M78/PzT+/v71vv6+djz7eva5dTO28Wcj9y0fm/dtX9x3cOZ - jdzdxb/b7eHf2vn399j7+/vW/Pz80/z8/M78/PzJ/Pz8w/z8/Lv8/Pyx/Pz8pvv7+5r7+/uM+/v7fv39 - /W/8/Pxg/Pz8Uvv7+0T6+vo3+fn5K/f39yH09PQY8fHxEujo6Avf398Iv7+/BH9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCO3t7Q7y8vIT9vb2Hfj4 - +Cb6+voz+/v7Qfz8/FH8/Pxi/Pz8dPv7+4b7+/uX/Pz8pvz8/LT8/Py//Pz8yfz8/NH8/PzX/f392/v7 - +9/49fTh7+Xi49O0q+S7iXvkqGhW5Z1WQuaeV0Pmp2RS5bR8bOTKpJrk59bS4/Tt6uH7+vrf/f392/z8 - /Nf8/PzS/Pz8y/z8/MP8/Py5/Pz8rvz8/KH9/f2T+/v7hfv7+3b6+vpn+fn5WPv7+0n7+/s7+fn5L/j4 - +CP19fUb8fHxEuvr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAF/f38CzMzMBd/f3wjq6uoM8vLyFPX19Rv4+Pgm+vr6Mvv7+0H8/PxR/Pz8Y/z8/HX9/f2H+/v7mfz8 - /Kr8/Py5/Pz8xvz8/ND8/PzZ/Pz83/z8/OT8+/vn+vj46vHo5evhy8Xst4Jz7ZdMN+2QPijujDgf7ow4 - IO6OOyPukkIq7a1wX+3TtKrs6NjU6/j09Or7+vrn/Pz85Pz8/OD9/f3b/Pz81Pz8/Mv8/PzB/Pz8tvz8 - /Kj8/Pyb+/v7jPv7+3z9/f1r/Pz8W/v7+0v7+/s9+fn5L/j4+CT19fUa8fHxEurq6gzf398Iv7+/BH9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////AszMzAXf398I7e3tDvLy8hT29vYd+Pj4Jvr6 - +jP7+/tB/Pz8Uvz8/GP9/f12/f39iP39/Zr8/Pyr/Pz8u/z8/Mj8/PzU/Pz83Pz8/OP8/Pzo/Pz87fj1 - 9O/z6+nw07Oq8raBcvOhXEjzkkEr8489JvOOOiP0jjoj9I48JfOPPifznFM/865yYfPKo5fy6NjU8fTt - 6+/8/Pzt/Pz86vz8/Ob8/Pzg/Pz82fz8/NH8/PzH/Pz8u/z8/K78/Pyg+/v7kfv7+4D9/f1v/Pz8Xvv7 - +077+/s++vr6Mfj4+CX19fUb8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwLMzMwF39/fCOvr6w3y8vIU9vb2HPj4+Cf6+voy+/v7Qfz8/FH6+vpk/f39dvv7+4n8/Pyb/Pz8rfz8 - /Lz8/PzL/f391vz8/OD8/Pzn/Pz87fv7+vH7+fn07+Xh9eDKxPe5hXb3l0s1+JJBKviOOyP4jzwl+I89 - JviPPSb4jz0l+I88JPiQPif4k0Mr+LJ4aPjZvLT3697a9vz8/PT8/Pzy/f397/z8/Ov9/f3l/f393v39 - /db8/PzM/Pz8wfz8/LT8/Pyl/Pz8lPv7+4P8/Pxx+vr6YPv7+077+/s/+vr6Mfj4+CX19fUb8vLyE+rq - 6gzf398Iv7+/BH9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wGqqqoDzMzMBd/f3wjr6+sN8vLyFPb29h34+Pgm+vr6M/v7 - +0H8/PxS/Pz8Y/39/Xb7+/uJ+/v7nPz8/K38/Py9/Pz8y/z8/Nf9/f3h/f396f39/e/8/Pzz+PX09vXu - 7PjVtq75tX5v+qBbSPuQQCn7jz0n+448JfuPPSb7jz0m+489JvuPPSb7jz0m+448JfuNOiP7p2VS+8Wb - kPvhzcf6/fz8+f39/ff8/Pz1/Pz88fz8/O38/Pzo/Pz84vz8/Nr8/PzQ/Pz8xPz8/Lb7+/un/f39lvv7 - +4X8/Pxz/Pz8Yfz8/FD7+/s/+vr6Mvj4+CX19fUb8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BqqqqA8zM - zAXj4+MJ6+vrDfLy8hT29vYc+Pj4J/r6+jL7+/tC/Pz8Ufr6+mT9/f12+/v7ifv7+5z8/Pyt/Pz8vfz8 - /Mv8/PzY/Pz84vz8/Or9/f3w+/r69fv5+fju4t/638nD+7qJevyYTDb9kkIr/Y05Iv2OOyT9jz0m/Y89 - Jv2PPSb9jz0m/Y88Jf2OPCX9kD8o/ZRFLv2rbVz9yJ6T/ePOyfz9/Pz8/fz8+/39/fn9/f33/Pz89P39 - /fD8/Pzr/f395fz8/N38/PzT/Pz8x/z8/Ln8/Pyp+/v7mf39/Yb8/Px0/Pz8Yfz8/E/7+/tA+vr6Mfj4 - +CX19fUb8vLyE+rq6gzf398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////AaqqqgPMzMwF4+PjCe3t7Q7y8vIU9vb2HPj4+Cb6+voz+/v7Qfz8 - /FL8/Pxj/f39dvv7+4n7+/uc/Pz8rfz8/L38/PzL/Pz82Pz8/OL8/Pzq/f398Pz8/PX69/f49e7t+9W4 - sfyze2z9oVxI/ZE+KP6QPSb+jzwk/o88Jf6QPSb+kD0m/pA9Jv6QPSb+jzsk/o03IP6ZTDf+q2xc/sig - lv7o2NT+8+zq/v38/P79/f39/f39/P39/fr9/f34/Pz89fz8/PL8/Pzt/Pz85/z8/N/8/PzV/Pz8yPz8 - /Lr8/Pyr+/v7mfv7+4f8/Px0/Pz8Yfz8/FD7+/s/+vr6Mvj4+CX19fUb8vLyE+vr6w3f398IzMzMBX9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E1NTUBuPj - 4wnt7e0O8/PzFfb29h34+Pgn+vr6M/v7+0L8/PxR+vr6ZP39/Xb7+/uJ+/v7nPz8/K38/Py9/Pz8y/z8 - /Nj8/Pzi/Pz86v39/fD7+vr1+vj3+e7h3vvdxb39vIt+/ZlNOP6TQiz+jjki/o87JP6QPSb+kD0m/pA9 - Jv6PPSb/jzwl/447I/+PPCX/kT8o/qdlU/7HnZL+4cvG/vr39/79/Pz+/f39/v39/f79/Pz+/fz8/f39 - /fv9/f35/f399/z8/PP9/f3v/Pz86Pz8/OD9/f3W/Pz8yfz8/Lz8/Pyr+/v7mvv7+4f8/Px0/Pz8Yfz8 - /FD7+/tA+vr6Mfj4+CX19fUb8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAF/f38Cv7+/BNvb2wfl5eUK7e3tDvPz8xX29vYd+Pj4J/r6+jT7+/tC/Pz8Uvz8 - /GP9/f12+/v7ifv7+5z8/Pyu/Pz8vfz8/Mz8/PzY/Pz84vz8/Or8/Pzx/Pz89fv49/j17+372Lyz/bN7 - av6gWkb+kT4n/pA8Jv6PPCX+kDwl/pA9Jv6QPSb+jz0m/5A9Jv+POyT/jTcf/5E/Kf+bUj7/vIp8/ubU - z/717uz+/Pz8/v39/f79/f3+/fz8/v38/P79+/v+/fz8/f39/fv9/f36/f39+Pz8/PT9/f3v/f396f39 - /eH9/f3W/Pz8yvz8/Lv8/Pys/f39mfv7+4f8/Px0/Pz8Yfz8/FD7+/tA+vr6Mfj4+CX19fUb8vLyE+rq - 6gzf398Iv7+/BH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38CqqqqA8zMzAXf398I6OjoC+/v - 7xDz8/MW9/f3H/n5+Sn6+vo1+/v7Q/z8/FP8/Pxk/f39dvv7+4n7+/uc/Pz8rfz8/L38/PzL/Pz82Pz8 - /OL8/Pzq/Pz88fv7+vX69/f57uHd+9u/uP29jX7+nVM+/pNDLP6OOiP+jzsk/pA9Jv6QPSb+jz0m/489 - Jv+QPSX/jzsk/5A8JP+SPyj/n1hE/7aBcv/Ttaz/9O7t//37+/79/Pv++/Ty/vnr6P745uH+9+Hc/vfi - 3f735eH++e/t/fv39vz9+/v6/f39+Pz8/PT9/f3v/Pz86v39/eH8/PzX+/v7yvz8/Lz8/Pyr+/v7mvv7 - +4f8/Px0/Pz8Yfz8/FD7+/tA+vr6Mvj4+CX19fUb8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/AqqqqgPU1NQG39/fCOrq6gzw8PAR9PT0GPf39yD5+fkq+vr6Nvv7+0T8/PxU/Pz8Zf39 - /Xf7+/uK+/v7nPz8/K78/Py9/Pz8zPz8/Nj7+/vj+/v76/z8/PH8/Pz1+vj4+fXv7vvbv7j9s3pq/p9X - Qv6RQCn+jzwl/pA8Jf6QPCX+kD0m/pA9Jv6PPSb/kD0m/5A8Jf+NNx//kTwl/5tPOv+1fW7/28G5/+/k - 4f/6+Pf//fv7/v35+f735N/+8c7E/u/Btf7st6n+7bqs/u7Ctv702tT++e7r/fz49/z9/f37/f39+Pz8 - /PX8/Pzx/Pz86vz8/OL9/f3W/Pz8y/z8/Lv8/Pys/f39mfv7+4f8/Px0/Pz8Yfz8/FD39/dA+vr6Mfj4 - +CX19fUb8vLyE+rq6gzf398Iv7+/BH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E29vbB+Xl5Qrt7e0O8vLyFPX1 - 9Rv4+Pgj+fn5Lfr6+jn7+/tH/Pz8Vvz8/Gf9/f14/f39ivv7+538/Pyt/Pz8vvz8/Mv8/PzY/Pz84vz8 - /Or9/f3w+/v79fr49/ju4t/72Ly0/b2Nf/6fV0L+k0Ms/o87JP6POyT+kD0m/pA9Jv6QPSb+jz0m/5A9 - Jv+POyP/kDsk/5NAKf+fVkL/t4Fy/9Kwpv/u4t7/+PPx//rz8f/35eH/89TM/+7Btf/qrp/+6KaW/ueg - jv7nopD+6KmY/u6+sv7z08z++enl/fz29fz8+/r7/f39+Pz8/PX9/f3w/Pz86v39/eH8/PzX/Pz8yfz8 - /Lz8/Pyr+/v7mvv7+4f8/Px0/Pz8Yfz8/FD7+/tA+vr6Mvj4+CX29vYc8vLyE+vr6w3f398IzMzMBX9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38Cv7+/BNvb2wfl5eUK7+/vEPPz8xX29vYd+Pj4Jfr6+jD7+/s8+/v7Sfz8/Fj8/Pxp/f39ev39 - /Yz8/Pye/Pz8r/z8/L78/PzN/Pz82Pz8/OP8/Pzr/Pz88fz8/PX7+fn59vDv+93Gv/2ze2z+nVM//pFA - Kf6POyT+kDwl/pA9Jf6QPSb+kD0m/o89Jv+QPSb/kD0l/403H/+POiP/m045/7N4aP/bv7f/8efk//v3 - 9//79fP/+Onl//HJvv/opJL/5JeE/+KOef7jj3r+45B7/uKQev7jk37+5qCO/uy0pv701c7++evo/vv4 - 9/39/f37/f39+Pz8/PX8/Pzx/Pz86vz8/OL8/PzX/Pz8y/z8/Lz8/Pys+/v7mvv7+4f8/Px0/Pz8Yfz8 - /E/7+/s/+vr6Mfj4+CX19fUb8vLyE+rq6gzf398Iv7+/BH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf39/AszMzAXf398I6urqDPDw8BH09PQY9/f3IPn5 - +Sr6+vo0+/v7Qfv7+078/Pxd/Pz8bf39/X39/f2O+/v7n/z8/K/8/Py//Pz8zPz8/Nn8/Pzi/Pz86/39 - /fD8+/v1+vj3+O/j4fvXubL9vY1//qFaR/6TQy3+jzwl/o87JP6QPSX+kD0m/pA9Jv6PPSb/kD0m/487 - I/+POiP/k0Eq/55UQP+4gnP/0rCn/+ze2v/58vD/+vDt//ff2P/wxbn/6q2c/+WVgP/jj3r/4ot2/+KM - d//ijnj+4o54/uKPef7klYL+56KR/u26rf7z0cn++Ojk/vz29Pz8+/v7/f39+Pz8/PX9/f3w/Pz86vv7 - ++H8/PzX/Pz8yfz8/Lv8/Pyr/f39mfv7+4f8/Px0/Pz8Yfz8/FD7+/tA+vr6Mvj4+CX29vYc8vLyE+vr - 6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwK/v78E39/fCOjo6Avx8fES9PT0GPf39yH5+fkr+vr6N/v7+0T8/PxS/Pz8Yfz8/HH7+/uC+/v7kvv7 - +6L8/Pyy/Pz8wfz8/M/8/Pza/Pz85Pz8/Ov8/Pzy/f399vv6+vn28O/74czG/bR9bv6aTjn+kT8o/o46 - I/6QPCX+kD0m/pA9Jv6QPSb+kD0m/pA9Jv+RPSb/jjgg/444IP+aTTf/r3Ni/9q9tf/07On/+/n4//z1 - 8//45N7/8MS4/+eciP/kkHv/44x2/+ONd//jj3n/4o54/+KOeP7ijnj+4o54/uKOef7jk37+5p6L/uy1 - pv7019D++ezp/vz5+f39/f37/f39+fz8/PX8/Pzx/Pz86vz8/OL8/PzX/Pz8y/z8/Lz8/Pys+/v7mvv7 - +4f8/Px0/Pz8Yfz8/E/7+/s/+vr6MPj4+CX19fUa8vLyE+jo6Avf398Iv7+/BH9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38CzMzMBd/f3wjr6+sN8fHxEvX19Rv4+Pgj+fn5L/v7 - +zv7+/tJ/Pz8V/z8/Gf6+vp3+/v7h/39/Zb8/Pym/Pz8tPz8/ML8/PzO/Pz82vz8/OP8/Pzr/Pz88fz8 - /PX6+Pf48ejl+9a5sf28jH3+ol1K/pNDLP6QPSb+jzsk/pA8Jf6QPSb+kD0m/o89Jv+QPSb/jzsj/445 - If+TQSv/nVI9/7iDdP/Tsqj/69zY//nz8f/68O3/9t7X/+/BtP/qqZf/5JN+/+OOeP/jjXf/4454/+OP - ef/jjnn/4o54/+KNeP/ijnj+4o54/uOQe/7kloL+6KOS/u26rP7z0cj++Onl/vv19Pz8/Pz7/f39+Pz8 - /PX9/f3w/Pz86v39/eH9/f3W/Pz8yfz8/Lv8/Pyr/f39mfv7+4f8/Px0/Pz8Yfz8/FD7+/tA+vr6Mvj4 - +CX29vYc8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/Ar+/ - vwTf398I6urqDPHx8RL19fUZ+Pj4JPn5+S/7+/s9+/v7S/z8/Fv9/f1r+/v7fPv7+4z7+/uc/Pz8q/z8 - /Ln8/PzG/Pz80vz8/Nz9/f3l/Pz87Pz8/PL8/Pz2/Pv6+fXu7Pvj0Mv9uIR0/ppPOv6RQCn+jjoi/o88 - Jf6QPSb+kD0m/pA9Jv6PPSb/kD0m/5E9Jv+OOSH/jTgf/5tPOv+ucGD/17iw//Ts6v/79/b//PXz//jk - 3v/wxrr/556L/+SPef/jjHb/4413/+OPef/jj3n/4495/+OPef/jj3n/4o54/+GNeP/ijnj+4o54/uKP - ef7klH/+5p6L/uy2qP712NH++Ovo/vz5+f39/Pz7/f39+fz8/PX8/Pzx/Pz86vz8/OL8/PzX/Pz8yvz8 - /Lz8/Pys+/v7mvv7+4f8/Px0/Pz8Yfz8/E/7+/s/+vr6MPj4+CX19fUa8vLyE+rq6gzf398Iv7+/BH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9fX1G/Hx8SX6+vox+/v7Pvv7 - +078/Pxe+vr6b/v7+4D7+/uQ/Pz8oPz8/K/8/Py8/Pz8yfz8/NT8/Pzd/f395fz8/Oz8/Pzx/f399vv7 - +vn28vH72b62/b2Of/6kYU3+k0Ms/pA+Jv6POyT+kDwl/pA9Jv6QPSb+jz0m/5A9Jv+POyT/jjgg/5NB - Kv+aTzn/uIN0/9Szq//q2tb/+fPy//rv7P/339n/78Cz/+molv/llH//4454/+ONd//jjnj/4495/+OP - ef/jj3n/4495/+OPef/jj3n/4o54/+KNeP/ijnj+4o54/uORe/7klYD+6KSS/u25q/7y0cj++Orn/vv1 - 9Pz9/f37/f39+Pz8/PX9/f3w/Pz86v39/eH9/f3W/Pz8yvz8/Lv8/Pyr/f39mfv7+4f8/Px0/Pz8Yfz8 - /FD7+/s/+vr6Mvj4+CX19fUb8fHxEuvr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38Cv7+/BN/f - 3wjq6uoM8vLyE/X19Rv4+Pgl+vr6MPv7+z/7+/tO/Pz8X/z8/HH7+/uD/Pz8lPz8/KX8/Py0/Pz8wfz8 - /M38/PzY/f394fz8/Oj9/f3u/Pz88/39/fb9/f36+vn4+/Ho5f3Cl4r+nlZB/pRELf6OOiL+jzwk/pA9 - Jv6QPSb+jz0m/489Jv+QPSb/kD0m/487JP+OOCH/nFI9/61wX//Us6v/9Ovp//r19P/89fP/9+Lc//HH - u//ooo//5JB5/+OMdv/jjXf/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/4o54/+KN - eP/ijnj+4o54/uKPef7klX/+5p6L/u24qv712NH++Orm/vz6+f38+/v7/f39+fz8/PX8/Pzx/Pz86v39 - /eH8/PzX/Pz8yvz8/Lz8/Pyr+/v7mvv7+4f8/Px0/Pz8Yfz8/E/7+/tA+vr6MPj4+CX19fUa8fHxEurq - 6gzf398Iv7+/BH9/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABf39/AszMzAXf398I6+vrDfLy8hP29vYc+Pj4Jfr6+jL7+/s//Pz8UPz8 - /GH8/Pxz+/v7hfv7+5b7+/un/Pz8tvz8/MT8/PzQ/Pz82vz8/OP9/f3p/f397/z8/PP9/f33/f39+f39 - /fv28e/96dvW/riFdf6URCz+kT4n/o88JP6QPCX+kD0m/pA9Jv6PPSb/kD0m/488JP+OOSH/lEMt/5tP - O/+4hHX/1riv/+ra1v/69fT/+u/s//fh2v/vwLP/6aaV/+WVgP/jjnf/4454/+OOeP/jj3n/4495/+OP - ef/jj3n/4495/+OOeP/jjnf/4454/+OOeP/jjnj/4o54/+KNeP/ijnj+4o54/uORe/7klYD+6KST/uy3 - qf7y0cj++ezp/vv29Pz9/f37/f39+Pz8/PX9/f3w/Pz86v39/eH9/f3W/Pz8yvz8/Lv8/Pyr+/v7mfv7 - +4f8/Px0/Pz8Yfz8/FD7+/s/+vr6Mfj4+CT19fUa8fHxEurq6gzb29sHv7+/BH9/fwIAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOrq - 6gzy8vIT9fX1G/j4+CX6+vox+/v7QPz8/E/8/Pxh/Pz8dP39/Yb7+/uY/Pz8qfz8/Ln8/PzH/Pz80/z8 - /N39/f3l/Pz87Pz8/PH8/Pz1/f39+P39/fr9/f37/fz8/fTu7P7n1tH+tHxr/o46Iv6POyT+kDwl/pA8 - Jf6QPSb+jz0m/5A9Jv+QPSb/kj8o/5NDLP+iXEn/s3lp/9S0rP/z7Or/+fTy//z18//34dr/8ci8/+ml - kv/kkHn/4413/+ONd//jjnj/4495/+OPef/jj3n/4495/+SRfP/llH//5pmE/+ecif/mmYX/5ZWC/+SR - fP/jjnj/4o54/+KNeP/hjXj/4o54/uKPef7klYD+5p6L/u26rP702dH++Onl/vz5+P38+/v7/f39+Pz8 - /PX9/f3w/Pz86v39/eH8/PzX/Pz8yvz8/Lz8/Pyr+/v7mfv7+4f6+vp0/Pz8Yfv7+077+/s++fn5L/j4 - +CPr6+sZ8PDwEejo6AvU1NQGqqqqA39/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAF/f38CzMzMBd/f3wjr6+sN8vLyE/X19Rv4+Pgl+vr6Mvv7+z/8/PxQ/Pz8Yfz8 - /HT7+/uH+/v7mfz8/Kv8/Py6/Pz8yPz8/NT8/Pzf/Pz85/z8/O38/Pzy/f399v39/fn9/f37/f39/P39 - /f39/f3++PX0/u3h3v66iHj+k0Ms/pA9Jf6OOiL+jzwk/o89Jv+QPSf/kDwl/485Iv+aTTj/qWlX/8SY - jP/hysX/7uLf//r39v/68O3/+OTe//DBtP/ppZP/5ZaA/+ONd//jjnf/4454/+OPef/jj3n/4495/+OP - ef/jjnj/5piE/+ijkv/uuq3/8szC/+++sv/rrp//5pqG/+ONd//jjnj/4o54/+KNeP/ijnj+4o54/uOR - e/7klH/+6KSS/uy2p/7z0sn++e3p/vz29fz9/f37/f39+Pz8/PX9/f3w/f396f39/eH9/f3W/Pz8yvz8 - /Lv8/Pyr+/v7mf39/Yb6+vpz/Pz8X/v7+037+/s8+fn5Lvf39yH09PQX7u7uD+Xl5QrU1NQGqqqqAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf39/AszMzAXf398I6+vrDfLy - 8hP19fUb+Pj4Jfr6+jH7+/tA/Pz8T/z8/GH8/Px0+/v7h/v7+5r8/Pyr/Pz8vPz8/Mn9/f3W/Pz84Pz8 - /Oj9/f3v/Pz88/39/ff9/fz5/f37+/37+P39+vb+/fv5/v39/P77+fn+8+zr/sqkmf6nZlT+mUw2/pA8 - JP6PPCX/jzwl/5A8Jv+SQCr/lkcx/6prWf/EmYz/4MnD//v5+f/9/Pz//vv7//jk3v/yyr//6aiW/+SQ - ev/jjnf/4412/+OOeP/jj3n/4495/+OPef/jj3n/5JF7/+WUf//pp5b/77yw//XX0P/67On/9t3W//LJ - v//qq5r/5ZaB/+SRe//jjnj/4o54/+KNeP/hjXj/4o54/uKPef7kloD+5p2L/u27rf7018/++Ojk/vv3 - 9v38+/r7/f39+Pz8/PX9/f3w/f396f39/eH8/PzX/Pz8yfz8/Lv8/Pyq+/v7mP39/YT8/Pxw/Pz8Xfz8 - /Er6+vo6+fn5K/f39x/z8/MV7e3tDt/f3wjMzMwFf39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAX9/fwK/v78E39/fCOrq6gzy8vIT9fX1G/j4+CX6+voy9/f3QPz8/FD8/Pxh/Pz8dPv7 - +4f9/f2Z/Pz8rPz8/Lv8/PzK/f391v39/eH9/f3p/f397/z8/PT9/f33/f39+v38+vv9+vX9/ffu/v30 - 5v79+PD+/fz6/v38+/759vb+5tXQ/s+sov6rbFr+k0Mt/5A+J/+POiP/jjki/5lLNv+qaVf/xpyQ/+jW - 0f/07er//f39//78/P/9+Pb/88zC/+qmlf/ml4L/4412/+OOd//jjnj/4495/+OPef/jj3n/4494/+OO - eP/lloH/6KCO/+/AtP/44dz/++7r//35+P/88/H/+Ofi//HHu//qrJr/5piC/+OOd//jjnj/4o54/+KN - eP/ijnj+4o54/uORe/7kk37+56OS/uy1pv7z08r++ezp/vz39fz9/f37/f39+Pz8/PX9/f3w/f396f39 - /eH9/f3W/Pz8yfz8/Lr8/Pyq+/v7lv39/YL8/Pxu/Pz8Wvv7+0j6+vo3+fn5Kfb29h3y8vIT6urqDNvb - 2we/v78Ef39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f38CzMzMBd/f3wjY2NgN8vLyE/X1 - 9Rv4+Pgl+vr6Mfv7+0D8/PxQ/Pz8Yfz8/HT7+/uH+/v7mvz8/Kv8/Py8/Pz8yvz8/Nf9/f3h/f396f39 - /e/8/Pz0/f39+P38+vr9+fT8/fPk/f3qzv795L/+/d+y/v3kwP7969H+/fXo/v37+v728O7+59fT/8Wb - j/+qa1n/mk04/5RCLP+YSjT/qmpZ/8Wajv/fyMH/+fXz//79/f/+/v7//fj3//ru6//vvK7/5ZN+/+SP - ef/jjXb/4454/+OPef/jj3n/4495/+OPef/kj3n/5JB5/+mjkf/uu67/9dnR//z19P/++vr//v7+//7+ - /f/89/X/9uDZ//DHu//qqpn/5piD/+SRe//jjnj/4o54/+KNeP/ijnj+4o54/uKPef7kloL+5p+M/u27 - rv701c3++Ojk/vz49/z8+/r7/f39+Pz8/PT9/f3v/f396fz8/OD8/PzV/Pz8yPz8/Ln7+/un/Pz8lPv7 - +3/8/Pxq/Pz8Vvv7+0T6+voz+Pj4JfX19Rrw8PAR5eXlCtTU1AaqqqoD////AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAf39/Ar+/vwTf398I6urqDPHx8RL19fUa+Pj4Jfr6+jH7+/tA/Pz8UPz8/GH8/Px0+/v7h/39 - /Zn8/Pys/Pz8u/z8/Mr9/f3W/f394fz8/Or9/f3w/Pz89f39/fj9/f37/fr1/P3z5f39477+/c+M/v3F - cv79vmD+/cRx/v3NiP795sX+/fz4/vz6+P728O//59XQ/8+rof+pZ1X/nVI9/6trWP/Fmo3/6NbR//bv - 7f/9/Pv//v7+//7+/v/78e7/9+Ha/+yxov/jjHX/4413/+OOeP/jj3n/4495/+OPef/jj3n/4454/+SQ - ev/lk33/7ban//fi2//78e7//vz8//79/f/+/v7//v7+//78/P/89vT/+Obh//DGu//qq5v/5ZWA/+ON - d//jjnj/4o54/+GNeP/ijnj+4o54/uOQe/7klH7+56KQ/uy0pv7z1Mz++e3p/vz49/z9/f37/f39+Pz8 - /PT9/f3w/Pz86Pz8/OD8/PzU/Pz8yPz8/Lb8/Pyk+/v7j/v7+3v6+vpm/Pz8Ufv7+z/5+fkv9/f3IvT0 - 9Bfu7u4P4+PjCczMzAWqqqoDAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E29vbB+rq6gzx8fES9fX1Gvj4 - +CT6+vox+/v7P/z8/FD8/Pxh/Pz8dPv7+4f7+/ua/Pz8q/z8/Lz8/PzJ/Pz81/39/eH8/Pzq/f398Pz8 - /PX9/f34/fz6+/369fz98d/9/eK8/v3SlP79wGf+/bhU/v2zR/79t1L+/b1g/v3Zpf/98uL//fny//z6 - +v/28O7/59XQ/8iekv++jYD/y6SY/9/Gv//38e///v38//7+/v/+/v7//v7+//rt6v/12tL/662d/+OK - c//jjXf/4495/+OPef/jj3n/4495/+OPef/jjnj/5JF7/+WWgP/vv7L/+/Hu//36+f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/f/89fP/9uDa//HGu//qqZj/5pmE/+SRe//jjnj/4o54/+KNeP/ijnj+4o54/uKP - ef7kloL+56GP/u28r/7z1Mz++Onl/vz39vz8+/r7/f39+Pz8/PT9/f3v+/v76P39/d78/PzT/Pz8w/z8 - /LP7+/uf+/v7i/z8/HX8/Pxh+/v7Tfv7+zv5+fks9/f3IPPz8xbu7u4P4+PjCczMzAV/f38CAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CqqqqA9TU1Abl5eUK8PDwEfT09Bj4+Pgj+fn5L/v7+z78/PxP/Pz8YPz8/HP7+/uH+/v7mvz8 - /Kz8/Py7/Pz8y/39/db8/Pzi/Pz86vz8/PH8/Pz1/f39+P39/fv9+vb9/fTn/v3kwP79zYf+/cBl/v23 - Uf79tUv+/bRJ/v2zSP79s0j+/c2I//7mxP/+9Ob//v7+//38/P/59PP/7uLf/+ze2v/y6OX/9/Lw//38 - +//+/v7//v7+//7+/v/+/v7/+evo//TWzv/rrJz/44t0/+OOd//jj3n/4495/+OPef/jj3n/4454/+ON - d//kknz/5pmE//DDt//89vX//vz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//78/P/89/b/+OXg//DF - uf/qqpn/5ZN+/+OOd//jj3n/4o54/+KOeP7ijnj+4o54/uOQev7klH7+56GP/uy0pv701s7++e3q/vv4 - 9/39/f37/f39+Pz8/PT9/f3u/Pz85vz8/N38/PzP/Pz8wfz8/K78/Pyb/f39hfz8/HD8/Pxc+/v7Sfr6 - +jj5+fkq9vb2HvPz8xXt7e0O4+PjCczMzAV/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqgPMzMwF4+PjCe7u7g/09PQX9/f3Ifn5 - +S77+/s8+/v7Tfz8/F/8/Pxy+/v7hvv7+5n8/Pyr/Pz8vPz8/Mn8/PzX/f394fz8/Or9/f3w/Pz89f39 - /fj9/Pr7/fn0/P3w3/794rz+/dKU/v3BaP79uVT+/bVL/v20Sf79tEr+/bJH//2yRv/+yX3//t+y//7x - 3v/+/v7//v7+//38/P/69vX/+fX0//z6+f/9/fz//v7+//7+/v/+/v7//v7+//7+/v/78e7/9+Da/+23 - qf/llYD/5JJ8/+OPef/jj3n/4495/+OPef/jj3n/4454/+OQev/klH7/7LWm//bd1//67+v//v39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//79/f/78/H/99/Z//HGu//qqZj/5pqG/+SQef/jjnj/4o54/+KN - eP/ijnj+4o54/uOQev7kloL+56KR/u28r/7z08v++Orm/fv29fz9/Pv6/f399/z8/PP8/Pzs/f395fz8 - /Nn8/PzN/Pz8u/z8/Kr8/PyV+/v7gfz8/Gz8/PxY+/v7Rvr6+jb5+fko9vb2HfLy8hTt7e0O39/fCMzM - zAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABv7+/BNvb2wfr6+sN8vLyFPb29h75+fkq+vr6Ofz8/Er8/Pxd+vr6cfv7+4X7+/uY/Pz8q/z8 - /Lv8/PzL/Pz81/z8/OL8/Pzq/Pz88fz8/PX9/f35/f39+/369/398+f+/eXE/v3NiP79vmP+/bdQ/v21 - Sv79tEr+/bRK/v20Sv79tEn//rRJ//7Gdf/+2aP//u/Y//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//349//67uv/8MS5/+ihj//ll4L/45B5/+OPef/jj3n/4495/+OP - ef/jj3n/4454/+ONd//oopD/772w//bc1v/+/Pv//v39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79 - /f/9+vn/+OTg//DEuf/qqZj/5JF6/+OOd//jj3n/4o54/+KOeP7ijnj+4o54/uKPef7klH7+5qCM/uy2 - pv7z2ND++e7r/fz5+Pz9/f35/f399/z8/PL8/Pzs/Pz84vz8/Nj8/PzI/Pz8uPz8/KX7+/uR/f39fPz8 - /Gj8/PxV+/v7RPr6+jT4+Pgn9vb2HPLy8hTq6uoM39/fCL+/vwR/f38CAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF4+PjCfDw8BH19fUZ+Pj4Jvr6 - +jT7+/tG/Pz8WPr6+m39/f2B+/v7lvz8/Kj8/Py6/Pz8yf39/db8/Pzg/f396f39/e/8/Pz1/f39+P38 - +/v9+fP8/fHg/v3huf790ZP+/cFq/v25VP79tUz+/bRJ/v20Sv79tEr//bRK//60SP/+tEj//sl7//7d - rf/+8Nz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vz7//z2 - 9f/229X/78G1/+qpmP/lmIP/5JJ9/+OPef/jj3n/4495/+OPef/jjnj/4454/+WYg//ppJL/78C0//be - 1//67+v//v39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79/f/78vD/9+Db//HGu//qqZf/5pqG/+OO - eP/jjnj/4o54/+KNeP/ijnj+4o54/uOQev7kloD+56SR/u27rv7y08v++ezp/fz49/v9/Pz5/Pz89fz8 - /PH9/f3p/Pz84Pz8/NP8/PzF/Pz8s/z8/KH7+/uO/f39evz8/Gb8/PxU+/v7Q/r6+jT4+Pgn9vb2HfLy - 8hTt7e0O39/fCMzMzAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABf39/Atvb2wfq6uoM8/PzFff39x/5+fku+/v7Pvz8/FL6+vpn/f39fPv7+5L7+/un/Pz8uPz8 - /Mj9/f3W/Pz84v39/en9/f3w/Pz89f39/fn9/f37/fv4/f3z5v7958f+/c6K/v29X/79t1D+/bRJ/v20 - Sv79tEr+/bRK/v20Sv/+tUv//rRI//6zSP/+y4L//uK5//7y4f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v39//zy8P/44t3/772x/+ihj//lloL/45B6/+OP - ef/jj3n/4495/+OPef/jj3n/4454/+ONdv/ppJH/7r2v//be1//9+/r//v38//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//79/f/+/Pz/+OTf//DDt//qqJf/5I94/+OOeP/jj3n/4o54/+KOeP7ijnj+4o54/uKP - eP7klH3+5p6L/uy4qv713tn++/Lw/Pz7+/v9/f34/Pz89f39/e/8/Pzo/Pz83fz8/NH8/PzC/Pz8svv7 - +5/7+/uM+/v7ePz8/GT8/PxS+/v7Qvr6+jL4+Pgm9fX1G/Ly8hPq6uoM39/fCL+/vwR/f38CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wLMzMwF5eXlCu7u7g/19fUa+Pj4Jvr6 - +jb7+/tI/Pz8Xvr6+nT9/f2K/Pz8oPz8/LT8/PzE/Pz80/z8/N/9/f3p/f397/z8/PX9/f34/fz8+/35 - 8/z98uL+/eG5/v3Rkf79wmv+/bhT/v21TP79tEn+/bRK/v20Sv/9tEr//rRK//60Sf/+vFz//sVy//7c - qv/+8N3//vnw//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//fn4//vw7f/12dL/78G1/+mol//lmIT/5JJ9/+OPef/jj3n/4495/+OPef/jj3j/4454/+aY - g//ppJD/78G0//bc1f/77+z//v39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79/f/78e//9+Lc//HG - u//qqJf/5pqG/+OOd//jjnj/4o54/+KNeP/ijnj+4o54/uOQev7klH/+6amZ/vHLwf735N/9/Pn4/P39 - /fr9/f33/Pz88/39/e79/f3l/f392/z8/M78/PzA/Pz8r/v7+539/f2K/f39d/z8/GT8/PxS9/f3Qvr6 - +jP4+Pgm9vb2HfLy8hPt7e0O39/fCMzMzAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38Cv7+/BNvb2wfq6uoM8vLyE/f39x/5+fks+/v7P/z8/FL8/Pxp/f39gPv7+5j8/Pyt/Pz8wPz8 - /ND9/f3e/Pz85/39/fD8/Pz0/f39+f38+/v9+/j9/fPk/v3oyP790I3+/b1g/v23Uf79tEn+/bRK/v60 - Sv79s0r//bRK//61Sv/+tUv//rZN//7GdP/+157//uvQ//79+//+/v3//v7+//7+/v/+/v3//vz8//77 - +//++/r//vz7//79/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vz8//vx7//239n/7ryv/+ij - kf/ll4L/5JF7/+OQev/jj3n/4495/+OPef/jj3n/4453/+SOdv/ppZP/776x//ff2f/9+Pf//vz7//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//79/f/+/Pz/9+Hc//DCt//qqJf/5JF6/+SQef/jj3n/4o54/+GN - eP/ijnj+4o13/uKMdv7mnIr+7bqu/vTY0f779vX+/f39/P39/fr9/f32/Pz88/z8/Oz9/f3l/Pz82vz8 - /M78/Py//Pz8r/v7+537+/uK/f39dvz8/GP8/PxR+/v7Qfr6+jL4+Pgm9fX1G/Ly8hTq6uoM39/fCMzM - zAV/f38CAAAAAQAAAAAAAAAAAAAAAQAAAAH///8B////Ar+/vwTb29sH5eXlCvDw8BH09PQY+Pj4Jfr6 - +jP7+/tH/Pz8W/z8/HP7+/uL+/v7ovz8/Lf8/PzK/Pz82Pz8/OT8/Pzt/Pz89P39/ff9/f36/fnz/P3z - 5f794bn+/dCP/v3CbP79uFP+/bZN/v20Sf79tEr+/bRK//20Sv/+tEr//rRJ//68XP/+xnT//tmj//7t - 0//+9ur//v79//7+/v/+/v7//v38//349v/67Oj/+OXf//fi3P/56eX//Pf1//78+//+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v3//fn4//rv7P/12dL/78K1/+mnlv/mmIT/5JJ8/+OPef/jj3n/4495/+OP - ef/jj3j/4494/+aYg//ppJL/78G0//bb1P/78O3//v39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79 - /f/78e//+OPe//HFuv/qqJf/5pqF/+OOd//jjnj/4o54/+KNeP/ijXf+4ot1/uadi/7uv7P+9dzW/vz3 - 9v79/f39/f39+/39/fn9/f32/Pz88fz8/Ov8/Pzi/Pz82fz8/Mz8/Py+/Pz8rfv7+5z7+/uJ/f39dvr6 - +mT8/PxS+/v7Qfr6+jP4+Pgm9vb2HPLy8hPr6+sN39/fCMzMzAX///8CAAAAAQAAAAB/f38Cf39/Aqqq - qgPMzMwF29vbB+Xl5Qrt7e0O8/PzFvb29h75+fks+/v7O/z8/E/8/Pxl/f39ffz8/JX8/Pys/Pz8wPz8 - /NL8/Pzf/Pz86vz8/PH9/f33/fz7+v37+fz98uL9/ejI/v3Rkf79vWH+/bhS/v20Sf79tEr+/bNK//2z - Sv/9tEr//rVK//62Tf/+t1H//sZ0//7Yn//+6s3//v36//7+/f/+/v7//v7+//78/P/89vT/+erm//TW - zv/xyr//8ca7//PSyf/55+P//PTx//78/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vv6//vx - 7v/23db/7ryu/+mlk//ll4P/5JF8/+OQev/jj3n/4495/+OPef/jj3n/4454/+SRev/pppX/77+y//ff - 2f/89fT//vv7//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79/f/+/Pv/9+DZ//DDt//qqZf/5ZN+/+SQ - ev/jjnj/4o13/+KNeP/ij3v/6KSU/vDIvv73497+/Pn4/v39/f79/f39/f39+/38/Pn8/Pz1/Pz88fz8 - /Or8/Pzj/Pz82Pz8/Mz8/Py+/Pz8rfv7+5z7+/uJ/f39dvz8/GP8/PxR+/v7Qfr6+jL4+Pgm9fX1G/Ly - 8hPq6uoM39/fCL+/vwR/f38CAAAAAb+/vwTMzMwF29vbB+Pj4wnq6uoM8PDwEfPz8xb29vYe+Pj4J/r6 - +jX7+/tF/Pz8Wfz8/G77+/uH/Pz8nvz8/LT8/PzH/Pz82Pz8/OT9/f3u/Pz89P39/fn9+fT7/fXq/f3h - u/79z43+/cJs/v24Uv79tk3+/bRK/v20Sv79tEr//bRK//60Sv/+tEj//rta//7GdP/+2aL//u3U//72 - 6v/+/v3//v7+//7+/v/+/v3//Pf1//bf2P/xx7z/66+g/+ijkf/ooo//666d//DCtv/22tP//PXz//78 - +//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3//fn4//ru6//22tP/8MK2/+mmlP/mmIT/5JF7/+OP - ef/jj3n/4495/+OPef/jj3j/5JB5/+aXgv/ppJL/78C0//Xa1P/78e///v39//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//79/f/78u//+OTf//HGuv/qqpn/5piE/+OMdf/ijHX/45J9/+aikP/uvbH+9uDa/vvy - 7/79+/v+/f39/v38/P78+/v9/Pv6+/38/Pj8/Pz1/f398Pz8/Ov8/Pzi/Pz82Pz8/Mv8/Py9/Pz8rfv7 - +5z7+/uJ/f39dvz8/GP8/PxR+/v7QPr6+jL4+Pgl9fX1G/Hx8RLq6uoM29vbB7+/vwSqqqoD1NTUBt/f - 3wjo6OgL7u7uD/Ly8hP19fUZ9/f3H/n5+Sj6+vox+/v7QPz8/FD8/Pxk+/v7efv7+5D8/Pym/Pz8u/z8 - /M38/Pzd/Pz86Pz8/PH9/fz2/fz6+v3y4/z96Mr9/dKU/v29Yf79uFT+/bRJ/v20Sf79s0r//bNK//20 - Sv/+tEr//rZN//65U//+xnP//tif//7qy//++/f//v78//7+/v/+/v7//v7+//37+//67+z/8cm+/+mq - mf/llYH/44t1/+OMdf/lloD/6aST//DBtf/4493/+/Hv//79/P/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//vr5//vx7v/229T/7ruu/+mnlf/ll4L/5JJ8/+OPef/jj3n/4495/+OPef/jj3n/4453/+WT - ff/pp5b/78C0//ff2f/78/H//fv6//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79/f/9+vj/9+DZ//DG - uv/qrJz/5puH/+eciP/pppT/7byv//TWzv768e/+/fv7/v39/f79/Pz+/Pr6/vPr6f7q3dj98ejl+/fz - 8fn6+Pf1/Pz88fz8/Or8/Pzi/Pz82Pz8/Mv8/Py9/Pz8rfz8/Jv9/f2I/Pz8dfz8/GL8/PxQ+/v7P/n5 - +S/4+Pgj9PT0GPDw8BHl5eUK1NTUBr+/vwTl5eUK6urqDPDw8BHz8/MW9vb2Hfj4+CT5+fkr+vr6Nfv7 - +z/7+/tO/Pz8Xfr6+nH7+/uF+/v7mvz8/K/8/PzC/Pz80/39/eH8/Pzr/Pz88/37+Pj9+PH7/eTA/f3P - i/39wmz+/bdR/v22Tf79tEr+/bRK/v2zSv/9tEr//rRK//60SP/+ulj//sZ0//7YoP/+7dT//vfr//79 - /P/+/v7//v7+//7+/v/+/v3//ff1//jl4P/staf/5ZaB/+SQe//jjnj/4454/+SRe//llYD/6aeW/+++ - sv/22tT//fj3//78+//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3//fr5//ru6//229T/78G1/+ik - kv/lmIT/5JB6/+OPef/jj3n/4495/+OPef/jj3j/5JB6/+WWgf/ppZP/78C0//Xb1P/78/H//v39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//79/P/78/H/+ejj//TUzP/xx73/8srA//PSyf/24tz/+u/s/vz5 - +P79/f3+/f39/vz6+f759fT+3cS9/r+Rg/7UtKv96NfT+/Xt6/j8/Pz1/Pz88fz8/Or8/Pzi/Pz82Pz8 - /Mv8/Py9/Pz8rf39/Zr9/f2H+vr6dPz8/GD7+/tO+/v7PPn5+S739/cg9PT0F+3t7Q7j4+MJ1NTUBu3t - 7Q7x8fES9PT0GPf39yD5+fko+vr6Mfr6+jr7+/tF/Pz8UPz8/F76+vpt+/v7f/v7+5H8/Pyl/Pz8uPz8 - /Mr8/PzZ/f395f39/e78/Pz1/ffu+f3v2/z92KH9/b1h/v24VP79tEn+/bRJ/v60Sv79tEr//bRK//61 - Sv/+t07//rpY//7GdP/+2J///unJ//768v/+/vz//v7+//7+/v/+/v7//v7+//79/f/89PL/9+DZ/+qs - m//jjHb/4454/+OPef/jj3n/4494/+OOeP/ll4P/6KSS//DCtv/4493/+/Du//78/P/+/v3//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//fn4//vw7f/12dL/7ruu/+molv/ll4L/5JJ9/+OPef/jj3n/4495/+OP - ef/jj3n/4453/+WVf//pqJb/78C0//fg2v/78u///vv7//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /f/9+vn/+u7r//nm4v/56OX/+u7r//z39v/8/Pv//f39/v39/f79/Pz+8ujm/uTQy/7Dl4v+olxJ/reD - c/7NqZ/949DL+/bv7vn6+Pf1/Pz88fz8/Or8/Pzi/Pz82Pz8/Mv8/Py8/Pz8q/v7+5n7+/uF+vr6cfz8 - /F37+/tJ+vr6Ofn5+Sn29vYd8vLyE+rq6gzf398I8vLyFPX19Rn39/ch+fn5K/r6+jb7+/tB+/v7S/z8 - /Ff8/Pxj/Pz8cP39/X77+/uP+/v7n/z8/LH8/PzC/Pz80f39/d79/f3p/Pz88f39/ff98d/6/eK5/P3M - hP39tk3+/bVK/v20Sv79tEr+/bNK//20Sv/+tUr//rRI//66V//+yHn//tmk//7u1v/++O7//v37//7+ - /v/+/v7//v7+//7+/v/+/v7//v39//zz8f/23tj/6qub/+OMdv/jjnj/4495/+OPef/jj3n/4495/+SR - e//klH//6aeW/++9sP/23NX//fj4//78+//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3//fv6//ru - 6//23db/78G1/+iikP/lmIP/45B6/+OPef/jj3n/4495/+OPef/jj3n/5JB6/+WUf//ppJP/8MG0//bc - 1P/89vT//v39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79/f/9+vn//fj3//349//9+vn//v38//39 - /f/9/f3//Pv7/vv4+P7fyML+vYx+/qdkUv6SQSv+m1E8/qhnVf7KpJn96NfT+/Tt7Pn8/Pz1/f398Pz8 - /Or8/Pzi/Pz81/z8/Mr8/Py7/Pz8qvv7+5b7+/uB/Pz8bPz8/Ff7+/tE+vr6Mvj4+CT09PQY7u7uD+Xl - 5Qr19fUa9/f3IPn5+Sv6+vo4+/v7Rfz8/FL8/Pxf/f39a/v7+3j7+/uF+/v7kvz8/KD8/Pyu/Pz8vvz8 - /Mz8/PzZ/Pz85Pz8/O38/Pzz/f39+P3u2Pv826j9/cZ3/v2zRv79s0f+/bRK/v20Sv/9tEr//rVL//61 - Sv/+tEj//rxa//7OiP/+4rn//vfs//7+/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3//Pb0//jk - 3v/stKX/5ZWA/+SRe//jj3j/4495/+OPef/jj3n/4494/+OOeP/lmIT/6KSS//DDt//34Nv/+/Dt//78 - /P/+/v3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//fn4//vx7v/12NH/7ryu/+mol//lloH/5JN9/+OP - ef/jj3n/4495/+OPef/jj3n/4453/+aWgf/qqJb/8MK1//fh2v/78e7//vz7//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//z7+v/x6OX/4s3I/8Waj/6kX0z+l0o0/o04 - If6QPSf+lkkz/rF4aP7Mppz949HL+/bv7fj59/f1/f398Pz8/Or9/f3h/f391vz8/Mj8/Py4/Pz8pfv7 - +5D9/f16/Pz8ZPz8/E/7+/s7+fn5K/b29h3y8vIT6+vrDff39yH5+fko+vr6Nvv7+0X8/PxV/Pz8ZPz8 - /HP9/f2A+/v7jvv7+5r8/Pym/Pz8svz8/L78/PzL/f391v39/eH9/f3p/Pz88f39/fb9/f35/e7X+/3Z - pP39xXX+/bNI/v2zSP79s0r//bRK//61S//+tUv//rVK//60R//+vVz//tCN//7kvf/++O7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/++vn/+uzp//DDt//opJL/5JWA/+OOeP/jj3n/4495/+OP - ef/jj3n/4495/+ORev/kk33/6aeV/++8sP/23df//fj4//78/P/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/f3//vz7//ru6//33tj/78Cz/+igjv/ll4P/45B6/+OPef/jj3n/4495/+OPef/jj3n/5JB6/+WS - ff/ppZL/8MG0//bd1v/9+ff//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/9/Pv/+vf2/+HLxf+9jX//p2RR/pNBKv6QPSb+jz0l/pA9Jf6RPyf+mUw3/qhnVf7Np5396djU+/bx - 7vn8/Pz1/f398P39/en8/Pzg/Pz80/z8/MX8/Pyy+/v7n/v7+4j8/Pxx/Pz8Wvv7+0X6+voz+Pj4I/T0 - 9Bfw8PAR+fn5KPr6+jH7+/tB/Pz8Uvz8/GT8/Px1+/v7hvz8/JT6+vqi/Pz8rfz8/Lj8/PzC/Pz8zP39 - /db8/Pzf/Pz85/39/e78/Pz0/f39+P39/fv98eH8/eG6/v3Nif79uFT+/bVO//20Sv/+tUv//rVL//61 - S//+tUr//rVJ//67WP/+yX3//tqk//7rz//+9un//v36//7+/v/+/v7//v7+//7+/v/+/v7//v7+//79 - /P/89PL/9dnS/++/sv/opZP/5ZaB/+ORe//jj3n/4495/+OPef/jj3n/4494/+OOeP/lmIT/6aWT//DD - t//339j/+/Dt//78/P/+/v3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//fj3//vw7v/119D/772w/+qp - mP/mmIP/5JN9/+OPef/jj3n/4495/+OPef/jj3j/4453/+aXg//qqJb/8MS3//jk3v/78vD//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v3//fv7//Lp5v/gycP/xZqO/6ZjUP+YSzX/jzsj/o87 - JP6QPSb+kD0l/pA8Jf6RPyj+mU04/rR7bP7NqJ7949HM+/Ps6vj6+Pf0/f397vz8/Of9/f3b/Pz8zvz8 - /L38/Pyq+/v7k/v7+3z8/Pxk+/v7Tfr6+jr5+fkp9vb2HPPz8xX5+fkv+vr6Ofv7+0v8/Pxf/Pz8c/39 - /YX7+/uY/f39pvz8/LX8/Py//Pz8yfz8/NL8/Pza/f394fz8/Oj9/f3u/Pz88/39/ff9/f35/f39/P32 - 7v397tj+/dei/v2/Zf79uVf//rZL//62S//+tUv//rVL//61S//+tUv//rhT//7AZf/+y4H//tql//7q - zP/++vT//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//78+//88/H/99/Z/+25q//noI3/5JN+/+OO - eP/jj3n/4495/+OPef/jj3n/4495/+OPev/kkXz/6aaU/+69r//34Nr//fj4//78/P/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v38//vv7P/34Nr/77+z/+iikP/mmIP/45B5/+OPef/jj3n/4495/+OP - ef/jj3n/5I95/+SQev/qqJf/8ci9//jk3v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//38 - /P/69/b/5NDK/76Mf/+lYU//lEIr/5A8Jf+PPCb/kD0m/pA9Jv6QPSb+kD0l/pA8Jf6SQCn+m086/q1v - Xv7Oq6H85tbR+vfx8Pj8/Pzz/Pz87Pz8/OL8/PzX/Pz8xvz8/LT7+/ud+/v7hvz8/G38/PxV+/v7Qfn5 - +S/39/ch9fX1Gfr6+jf7+/tC/Pz8Vfz8/Gr9/f1/+/v7k/z8/Kb8/Py1/Pz8w/z8/M39/f3W/Pz83fz8 - /OT9/f3p/f397vz8/PP9/f32/f39+f39/fv9/f39/Pn1/v327P795cP+/dKV/v3GdP/+u1f//rhQ//62 - S//+tUv//rVL//61S//+t0///rtX//7AZf/+x3f//tec//7qzP/+9eb//v38//7+/v/+/v7//v7+//7+ - /v/+/v7//v79//36+f/77uv/9dbO/+69sP/opJL/5ZaC/+OQev/jj3n/4495/+OPef/jj3n/4454/+OP - ef/lmYT/6aaV//DDt//23db/+/Du//78/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//fj3//vw - 7v/01Mv/7riq/+egjf/jjnf/4494/+OPef/jj3n/4495/+OPef/jj3j/4454/+efjf/tuKr/9dnS//78 - /P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/Pz/9Ovp/9/HwP/Fmo3/p2VT/5hLNv+RPSb/kDwl/5A9 - Jv+PPSb/kDwl/pA9Jv6QPSb+kDwl/pA9Jv6TQSv+nFI+/rB3Z/3JoZb749HM+vPs6vX7+vnw/Pz85/z8 - /Nz8/PzM/Pz8vPz8/KX7+/uO/Pz8dfz8/F37+/tI+vr6Nfj4+Cb29vYe+/v7Pvz8/Er8/Pxf/Pz8dfv7 - +4z8/Pyg/Pz8tPz8/MP8/PzR/Pz82vz8/OP8/Pzo/Pz87fz8/PH8/Pz0/f399/39/fn9/f38/f39/f39 - /f39/f3+/f39/v305f796Mr+/dOW//7BZf/+u1b//rZL//62S//+tUv//rVL//61S//+tkz//rZK//60 - R//+wmn//ted//7py//+/Pn//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//77+//89PL/9t3X/+22 - qP/nn43/45J8/+OOeP/jj3n/4495/+OPef/jj3n/4495/+OOeP/kkXz/6KSS/++9sP/4493//fn4//79 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v39//no4//z0Mb/6aiY/+OMdv/jjnj/4495/+OP - ef/jj3n/4495/+OPef/jj3n/5pqG/+mpmf/z0Mf//fr6//79/f/+/v7//v7+//7+/v/+/v7//v39//z5 - +f/o19P/v4+C/6RfTP+TQiv/jzoj/5E9J/+RPif/kT4n/5A9Jv+PPCX+kDwm/pA9J/6QPSb+jzwl/o04 - If6OOSL+kkIr/qdoV/3OraT759nV+Pj19PP8/Pzr/Pz84vz8/NP6+vrD/Pz8rPv7+5b9/f19/Pz8Zfz8 - /E/7+/s7+fn5K/f39yL7+/tH/Pz8U/z8/Gj7+/t/+/v7lvz8/Kr8/Py9/Pz8zPz8/Nr8/Pzi/Pz86v39 - /e78/Pzy/Pz89f39/fj9/f36/f39+/39/fz9/f39/f39/v39/f79/f3+/fny/v3z5f79473//tSW//7H - dP/+u1j//rhQ//62S//+tUv//rVL//62S//+tUr//rRI//66WP/+xG///tab//7qzP/+9eb//v79//7+ - /v/+/v7//v7+//7+/v/+/v7//v39//36+f/67er/9dfP/+69sP/nopD/5JaB/+OPev/jj3n/4495/+OP - ef/jj3n/4454/+OQev/lmIT/6aeW//DDt//23NX/+/Hv//78/P/+/v7//v7+//7+/v/+/v7//v7+//78 - +//9+Pf/9tzV/++/sv/oopD/4413/+OOeP/jj3n/4495/+OPef/jj3n/4454/+ONd//mnYr/67Kj//TW - zv/++/v//v39//7+/v/+/v7//v39//z7+v/07er/3sbA/8Waj/+paFb/mEs1/5E/KP+QPCX/kT0n/5E+ - J/+RPif/kD0m/5A9Jv+PPSb/kD0m/pA9Jv6QPCX+jzsk/o87JP6QPif+m1I8/bB2ZvvJoZb55dPO9fPr - 6e37+vrk/f391vz8/Mf8/Pyy+/v7nP39/YT8/Pxt/Pz8V/v7+0P6+voy+fn5Kfz8/E/8/Pxc/Pz8cf39 - /Yj7+/uf/Pz8s/z8/Mb8/PzU/Pz84v39/en9/fzw/Pv69P38+/f9/fz5/f38+/39/fz9/f39/f39/f39 - /f79/f3+/f39/v39/f79/f3+/f39/v3z4//+6Mb//tOU//7CaP/+u1f//rZM//62S//+tUv//rVL//61 - S//+tUv//rRJ//6zRv/+w2z//tie//7qzP/+/Pn//v38//7+/v/+/v7//v7+//7+/v/+/v7//v7+//77 - +//89fP/9tvU/+y1pv/noI3/45F8/+OPef/jj3n/4495/+OPef/jj3n/4495/+OOeP/kk37/6KWT/++/ - sv/45N///Pf2//78/P/+/v7//v7+//7+/v/+/v7//fj2//vw7f/zzcT/662d/+eciP/jj3j/4495/+OP - ef/jj3n/4495/+OPef/jjnj/44x2/+ehjv/uvrD/9t3W//79/P/+/v7//v7+//79/f/8+vr/9/Lx/+jX - 0f/BkoX/pGBN/5RELv+OOiL/kD0m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9 - Jv6QPSb+kD0m/o88JP6QPSb9k0Is/KtsW/nRsKb15tfS7/j18+f8+/vZ/Pz8y/z8/Lf8/Pyj/f39i/z8 - /HT8/Pxf+/v7S/r6+jn5+fkv/Pz8WPz8/GT9/f16+/v7kfv7+6f8/Py6/Pz8zfz8/Nr8/Pzm/Pr47fz5 - 8/P99Oj3/fLi+v316vv9+PH8/fz5/f39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/fny//70 - 5P/+5L3//tSX//7Gc//+u1j//rhQ//62S//+tUv//rVL//61S//+tUr//rRJ//67WP/+w2z//tab//7q - zP/+9ef//v79//7+/v/+/v7//v7+//7+/v/+/v7//v39//36+f/67On/9djQ/+69sP/noY7/5JaB/+OP - ef/jj3n/4495/+OPef/jj3n/4454/+ORe//lmIP/6aiW//DCtv/229T/+/Px//78+//+/v7//vz8//35 - +P/44t3/8sq//+yyov/mnIj/5ZR//+OPef/jj3n/4495/+OPef/jj3j/4454/+OPef/kkXz/67Cg//XZ - 0f/67er//v79//7+/v/+/v7//Pv6//Xt6//Yu7L/vYx+/6ZkUv+XSjT/kkAp/5A8Jf+RPSf/kT4n/5E9 - Jv+RPSf/kT4n/5E+J/+RPif/kT0m/5A9Jv+PPSb/kD0m/pA9Jv6QPSb+kD0l/pA9Jv2RPif8nFM++q9z - YvbJoZbw59bT6PLr6Nz8/PzO/Pz8u/z8/Kj9/f2R/f39e/r6+mf8/PxT+/v7Qfr6+jf8/Pxg+vr6bfv7 - +4P7+/uZ/Pz8r/z8/MH8/PzT/Pv73/z7+ur99u3w/fDf9v3pzPn95cD8/enN/f3v2/799uz+/fv3/v39 - /P79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3//v78//7z4v/+5sP//tOS//7Da//+u1j//rdN//62 - S//+tUv//rVL//61S//+tUv//rRI//6zRf/+xW///tef//7qzP/++vT//v36//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//77+v/89PP/9djR/+y1pf/noY//45F8/+OQev/jj3n/4495/+OPef/jj3n/4495/+OO - eP/klYD/6aWT/+/BtP/45eD//PTz//37+v/89vT/++7q//LMwv/pqJf/5pqG/+OOeP/jj3n/4495/+OP - ef/jj3n/4495/+OPef/jkHr/5ZaB/+efi//ww7f/+/Ht//36+f/+/v7//v79//38/P/28O7/59bR/7uH - ef+aTjj/kT8o/445If+QPCb/kT4n/5E+J/+RPSb/kD0m/5E9J/+RPij/kT4n/5E+J/+RPif/kT4n/5A9 - Jv+PPSb/jz0m/5A9Jv6QPSb+kDwl/ZA8JPyRPif6kkMr96xwX/HQsKfq5tbR3vr599H8+vq//Pz8rfv7 - +5f7+/uC/Pz8bvz8/Fv7+/tJ+/v7P/z8/Gj6+vp1+/v7i/z8/KH8/Py2/Pz8x/z8/Nj8+fbj/Pfu7fzj - wfP91Jn4/cyF+v3Hefz9zYj9/dWc/v3iu/797tf+/fny/v39/f79/f3+/f39/v39/f79/f3+/f39/v7+ - /v/+/v7//vrz//7z4//+5L3//tWY//7Fcv/+u1n//rdP//62S//+tUv//rVL//61S//+tUr//rRI//67 - WP/+wmr//tac//7pyv/+9ej//v79//7+/v/+/v7//v7+//7+/v/+/v7//v39//76+v/67Oj/9dnS/+69 - sP/mn4z/5JaB/+OPeP/jj3n/4495/+OPef/jj3n/4494/+SRe//ll4L/6amY//DFuf/12tP/+uzo//ff - 2f/yy8D/7LKi/+WZhP/kk37/4495/+OPef/jj3n/4495/+OPef/jj3j/5JN+/+ediv/ssaL/8szC//jj - 3f/9+Pf//fv7//37+//8+vn/+PTy/93Evf/ClIj/pmNQ/5JBKv+QPSb/kDwl/5E9Jv+RPif/kT4n/5E+ - Jv+RPSb/kT4n/5E+KP+RPif/kT4n/5E+J/+RPif/kT4m/5A9Jv+PPSb/kD0m/pA9Jv6QPCX+jzwl/ZA9 - JvqQPif3nFI+8axvXuvLp5zf8ejl0/fx8MP8/Pyx+/v7nfv7+4n7+/t2/Pz8Y/z8/FD7+/tG/f39b/39 - /Xz7+/uS/Pz8qPz8/Lz8/PzN/Pz83Pz06ub97dfw/NOa9f2+Zfn9t1L7/bJJ/f25V/39wmr+/c+L/v3d - sP/979v//fjx//38+v/9/f3//f39//39/f/9/f3//v7+//7+/v/+/v7//vz5//7y4f/+5cH//tKS//7D - bv/+u1n//rdO//62TP/+tUv//rVL//61S//+tUv//rRI//60R//+xnL//ted//7qzP/++fD//vz5//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//36+f/89fL/9dfO/+y1pv/no5D/45N9/+ORe//jj3n/4495/+OP - ef/jj3n/4494/+OOd//ll4P/6amZ/+6+sf/008r/8MW5/+utnf/mnYn/4453/+OPeP/jj3n/4495/+OP - ef/jj3n/45B6/+SSfP/mnYn/7LGi//PNw//77ur//fn4//7+/f/7+fj/+PTy//Dm4v/l083/wpWJ/6Rg - Tf+WSDL/jjkh/5A8Jf+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6PPSb9jz0m+488JPeQPifykkIq7LiCdOHn1tHV8urnxfz8 - /LX7+/ui+/v7j/39/Xz8/Pxp/Pz8V/v7+0z8/Px1/f39gvv7+5j8/Pyt/Pz8wfz8/ND8/Pvf/OvS6PzZ - qPH8xnn1/bdS+f20TPz9s0r9/bZO/v65Vf79vV7//sl7//7drP/+7NP//vr0//79/f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v3//vr0//7z4v/+5L7//tWY//7EcP/+u1n//rdO//62S//+tUv//rVL//61 - S//+tUr//rVJ//66Vv/+wmn//tec//7qyv/+9ur//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v39//77 - +v/67On/9tzU/+68r//mnov/5JaB/+OPeP/jj3n/4495/+OPef/jj3n/4494/+SSfP/mmIT/55+M/+mm - lP/ooY//5pqF/+SUfv/jj3j/4495/+OPef/jj3n/4495/+OPeP/kknz/552J/+yyo//008r/+enk//34 - 9v/+/Pv//v38//bw7v/t4d3/0bCm/7Z/cP+kYE3/lUYw/5JAKf+QPCX/kT0m/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E9Jv+RPSb/kT0m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4m/5A9Jv+PPSb/kD0m/o89 - Jv2PPSb7jzwl+I47JPKNOiHsrnVk4trBudfq39rI/Pz8uPz8/KX7+/uT+/v7gfz8/G78/Pxc/Pz8Uf39 - /Xn7+/uG+/v7nPz8/LH8/PzE/Pz70/39++H95sTp/M2L8v2+Zfb9skf6/bNJ/P2zSv79tEr+/bNJ//60 - R//+u1n//suA//7drP/+8Nv//vnw//7+/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vv3//7y - 4P/+5L///tKR//7EcP/+u1n//rdP//62S//+tUv//rVL//61S//+tUv//rRI//62S//+x3T//tie//7q - zf/+9+7//vz5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//36+f/89fL/9NXN/+y2qP/oo5H/5JR+/+SR - e//jj3n/4495/+OPef/jj3n/4495/+OOeP/jjnj/4413/+OOd//jj3j/4495/+OPef/jj3n/4495/+OP - ef/jkHn/5JN9/+adif/ssaL/8svC//rr5//9+vj//v39//79/f/9+/r/69zY/9a4sP+2gHD/mEo0/5JA - Kf+OOSH/kDwl/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT0m/5E9Jv+RPSb/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4m/5A9Jv+QPSb+jz0m/Y89JvuPPSb4jTsk84w4IOyuc2Li2b+32Ord - 2Mn8/Py6/Pz8qPv7+5b7+/uE/Pz8cfz8/F/8/PxV/f39ev39/Yf8/Pye/Pz8svz8/MX8/PvU/Pz74vzk - wOr8zITy/b5j9/2ySPr9s0n8/bNK/v20Sv79s0r//rRJ//63Tv/+u1j//sl6//7drP/+7dP//vz4//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/vz//vv1//7z4v/+5L///tWX//7Dbf/+u1j//rdN//62 - S//+tUv//rVL//61S//+tUr//rVL//66VP/+wmn//ted//7py//+9+3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v39//77+//67er/9t3W/+67rv/nn4z/5ZWA/+OPeP/jj3n/4495/+OPef/jj3n/4495/+OP - ef/jjnj/4494/+OPef/jj3n/4495/+OPef/jj3n/4494/+ORe//nnYn/7LCh//TSyv/66ub//ff2//79 - /f/+/v7//fz7//v49//YurL/r3Ni/59WQf+QPCX/kDwl/5A8Jf+RPSb/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT0n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPib/kD0m/5A9 - Jv6PPSb9jz0m+489JviPPifzkEAp7LWAcuLl083Y8Ojlyfz8/Lr8/Pyp+/v7l/v7+4X8/Pxy/Pz8YPz8 - /FX9/f14/f39hfv7+5z8/Pyx/Pz8xPz8/NP9/f3h/OjK6vzUmfL8w3D3/bVQ+v20Tfz9tEr+/bRK/v2z - Sv/9tEr//rRJ//60R//+vFz//sp+//7cq//+8Nv//vjv//7+/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//vv1//7y4P/+5L3//tKR//7Fcf/+u1j//rhP//62S//+tUv//rVL//61S//+tUr//rRI//64 - UP/+x3X//tee//7qzv/+9+z//vz5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//36+f/88/D/9NTM/+24 - qv/opJH/5ZV//+SRe//jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+OP - ef/klH7/5p2J/+yzpP/yy8L/+enl//35+P/+/f3//v7+//39/P/z6uj/5dLM/8GShf+ZTDb/k0Aq/444 - If+QOyT/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E9Jv+RPib/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4m/5A9Jv+PPSb/kD0m/o89Jv2PPif7kD8o+JhLN/OjYE7sxZuQ4u/m - 4tf28O/J/Pz8uvz8/Kj7+/uW+/v7hPz8/HH8/Pxe/Pz8VPz8/HX7+/uC+/v7mfz8/K78/PzB/Pz80fz8 - ++D98uDp/OXB8v3PjPb9vF36/bdS/P20Sv79tEr+/bNK//2zSv/9tEr//rVK//62Tf/+uVP//sl5//7d - rP/+7dX//v38//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/vz//vv3//7z4v/+5cD//tSX//7C - av/+u1j//rZM//62S//+tUv//rVL//61S//+tUr//rZL//64Uv/+wmv//tig//7qzf/++fD//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v39//77+v/77uv/9tzW/+26rP/nn4z/5JV//+OPeP/jj3n/4495/+OP - ef/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3j/45B6/+adif/rr6D/89LK//rs6P/99/b//v39//7+ - /v/9/fz//Pn5/+LNxv/AkYP/p2VS/5A8JP+QOyT/kDwl/5E9Jv+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPSb/kD0m/5E9Jv+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/jz0m/5A9 - Jv6QPSb+jz0m/ZA/KPuSQSv4pGNS88CUh+zaw7vi+fX01/r6+Mj8/Py4/Pz8pvv7+5P7+/uB/Pz8bvz8 - /Fv8/PxR/f39b/39/Xv7+/uS/Pz8qPz8/Lz8/PzN/Pz83Pz37uf98d/w/Nyv9f3Mg/n9v2f8/bdT/f21 - Tf79tEr+/bRK/v20Sv/9tEr//rRJ//60R//+vV3//sp9//7cq//+8Nz//vju//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//vr0//7y4P/+5L3//tKS//7GdP/+u1n//rhR//61S//+tUv//rVL//61 - S//+tUr//rRI//65VP/+x3b//tqk//7x3P/++/b//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//35 - +P/78O3/9NTL/+26rP/opJH/5JWA/+SRe//jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/4495/+SV - f//mnYn/7LWm//PNw//56OP//fn4//79/P/+/v3//fz7//Lq5//jzcj/x52R/6dlUv+ZTTf/jjkh/487 - JP+RPif/kT4n/5E+J/+RPif/kT4n/5E9Jv+RPSb/kT4n/5E+Jv+RPSb/kT0m/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPib/kD0m/489Jv+QPSb+kD0m/pA9Jv6QPij9mEw3+qNhT/i8jH/y2sG57Ozf - 3OH7+/vW/Pz8xvz8/LX7+/ui+/v7j/v7+3z8/Pxp/Pz8Vvv7+0z8/Pxn/Pz8dPv7+4v8/Pyh/Pz8tvz8 - /Mj8/PzZ/Pv55P369+787Nb0/d+1+f3Mhfv9vF/9/bdS/f20Sv79tEr+/rRK/v2zSv/9tEr//rVK//62 - TP/+t07//sl6//7erf/+7tf//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v3//vz5//7z - 4//+58P//tWZ//7DbP/+u1r//rVM//61S//+tUv//rVL//61S//+tUr//rZL//63T//+x3f//ufD//73 - 6//+/fr//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v79//77+v/78O3/9tzW/+24qv/nn4z/5JR+/+OP - eP/jj3n/4495/+OPef/jj3n/4495/+OPef/jj3n/556L/+ywoP/008v/+/Ds//349//+/v3//v7+//38 - /P/69/f/487I/76Ogf+nZFL/k0Ms/5E+Jv+RPSb/kT0m/5E+J/+RPif/kT4n/5E+J/+RPib/kT0m/5E9 - Jv+RPib/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5A9Jv+PPSb/jz0m/5A9 - Jv6QPSb+kD4n/ZJBLPyjX0z6vo+C99e8tfLy7Orr+ff34Pz8/NT8/PzD/Pz8svz8/J77+/uK/f39dvz8 - /GP8/PxQ+/v7Rvz8/F79/f1r+/v7gv39/Zj8/Pyv/Pz8wvv7+9T8/Pzg/Pz86/z16vL97dj4/dut+/3N - hv39wGj9/bhT/v22Tf79tEr+/bRK/v20Sv/9tEr//rRJ//60R//+vl///sl8//7drP/+79r//vju//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vrz//7z4v/+4LT//sp///6/Y//+tUr//rVK//61 - S//+tUv//rVL//61S//+tUr//rRG//7Da//+4rj//vPj//78+f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v79//35+P/77uv/9NTM/+67rv/oo5H/5ZaB/+OQev/jj3j/4495/+OPeP/jjnj/5JR//+ac - if/ttqj/88/G//nn4//9+vn//v38//7+/v/+/v7//Pr6//fy8f/Zvbb/rG1c/5lMNv+POyT/jzsj/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPSb/kT0m/5E+Jv+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E9Jv+QPSb/jz0m/5A9Jv6QPSb+kD0m/pE/KP6YTDb9pWNR/LyLffrYvbX36tzZ8fr4 - +On9/f3e/Pz80fz8/MD9/f2t/f39mP39/YP9/f1v/Pz8XPz8/Er7+/s//Pz8VPz8/GH9/f14+/v7kPv7 - +6f8/Py7/Pz8zvz8/Nz9/f3p/f388P369ff97tf6/d+0/f3Lgv39vF7+/bdQ/v21Sv79tEr+/bRK/v2z - Sv/9tEr//rVK//61Sv/+tUn//sl7//7erv/+79r//v79//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v3//v77//7qzP/+0pL//sJr//60SP/+tUn//rVL//61S//+tUv//rVL//61Sv/+tEb//sJo//7f - sP/+8dz//vz3//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//77+v/78u//9tzV/+y2 - qP/mnov/45J8/+OOeP/jj3n/4454/+KNdv/mnIj/6q2d//TSyf/88vH//fn4//7+/v/+/v7//v7+//7+ - /v/7+Pj/9O3q/9Gwpv+eVUD/kDwk/487I/+QPCT/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kD0m/489Jv+QPSb+kD0m/pA9 - Jv6RPif+kkEr/qFcSf29joD82b22+fPs6vb7+vrw/Pv76P39/dv8/PzO/Pz8u/z8/Kn9/f2S/f39fPz8 - /Gj8/PxV+/v7Qvr6+jj7+/tM/Pz8Wf39/W/9/f2H+/v7n/z8/LT8/PzI/Pz81/39/eX8/Pzt/Pv69f32 - 6/n97dX8/dys/f3MiP79wGf+/blU/v22Tf79tEr+/bRK/v20Sv/9tEr//rRJ//60SP/+vmD//sl7//7d - rP/+79j//vju//7+/v/+/v7//v7+//7+/v/+/v7//v7+//768//+8+L//uG2//7Lgv/+v2T//rVK//61 - Sv/+tUv//rVL//61S//+tkv//rdO//65U//+yHf//uO7//7z4//+/Pn//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v39//35+P/67en/9NXM/+69sP/pppX/5pqF/+SSfP/lmIP/6KGO/+24 - qv/z0cj/+efi//76+f/+/Pz//v7+//7+/v/+/v7//v7+//37+v/59fT/4MrE/7uIe/+jX0z/kj8o/487 - I/+QPCX/kT0m/5E+J/+RPSb/kT0m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPif/kT0m/5A9Jv+PPSb/kD0m/pA9Jv6QPSb+kT8o/pdKNf6nZVP+vIt+/di9tvvr3tr5+Pb19f39 - /e79/f3l/Pz82Pz8/Mr8/Py2+/v7ov39/Yv8/Px0/Pz8YPv7+0z7+/s7+vr6Mfv7+0P8/PxQ/Pz8Zv39 - /X77+/uX/Pz8rfz8/ML8/PzS/f394fz8/Ov8/Pzz/f399/369fv97tn8/d6z/v3KgP79vWD+/bdQ/v21 - Sv79tEr+/bRK/v20Sv79tEr//rVL//60SP/+tUn//sp9//7er//+8dz//v38//7+/f/+/v7//v7+//7+ - /v/+/v7//vXm//7nxP/+1pr//sRv//68XP/+tUz//rVL//61S//+tUv//rVL//62TP/+uVP//r9h//7P - iP/+6cj//vfr//79+v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//77 - +//89PL/997Y/+69sP/pp5b/5ZaB/+ijkf/tt6n/9dbO//329P/++vr//v7+//7+/v/+/v7//v79//79 - /P/+/Pv//vz7//79/f/x5uT/28G8/7qHev+VRS//kDsj/486I/+QPCX/kT4n/5A9Jv+QPSb/kT0m/5E+ - J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+QPSb/kD0m/pA9Jv6QPSb+kD0m/pE+ - J/6TQiz+n1hF/r2Nf/7Zvbb98+zq+/39/fj8/Pzz/Pz87Pz8/OP8/PzU/Pz8xfz8/LH7+/uc+/v7hPz8 - /Gz8/PxY+/v7RPr6+jT5+fkq+/v7PPv7+0j8/Pxd/Pz8dfv7+478/Pyk/Pz8u/z8/Mz8/Pzc/Pz85v39 - /fD8/Pz1/fz6+f327Pv97NX9/dyu/v3Oiv79wGb+/blU/v22TP79tUr+/bRK/v20Sv/9tEr//rRJ//61 - Sv/+vmD//sp8//7er//+79j//vnw//7+/v/+/v7//vr0//7y4P/+5L///tSW//7IeP/+vV3//rlT//61 - S//+tUv//rVL//62S//+t07//rpW//7BZv/+zYT//t2s//7x3v/++/X//v79//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v39//36+f/77+z/99/a//TUzP/yy8H/89LJ//bd - 1v/66+j//vr6//79/P/+/v3//vn2//7x6//+4dT//tfF//7Vw//+1sT//tnI//jbz//u3dn/1riw/7mE - dv+jXkv/jzoj/5E9Jv+TQCn/kT4n/5A9Jv+RPSb/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - J/+RPSb/kD0m/489Jv+QPSb+kD0m/pA9Jv6RPyj+lkgy/qdmU/68jH3+2Ly0/e3g3Pv49fT6/f399v39 - /fD8/Pzo/Pz83fz8/M78/Py+/Pz8qfv7+5P9/f17/Pz8ZPz8/E/7+/s8+fn5Lfj4+CT6+vo1+/v7QPz8 - /FX8/Pxs/f39hPv7+5z8/Pyz/Pz8xf39/db8/Pzi/Pz87Pz8/PL8/Pz4/f39+v358vz97tj9/d6y/v3K - gP79vmL+/bhR/v21S/79tEr+/bRK/v20Sv79tEr//rVK//60SP/+uFH//s2E//7htf/+8uD//vz4//78 - +f/+9OX//uXB//7VmP/+w2z//rxZ//63Tf/+tkv//rVL//61S//+tUv//rZN//65U//+wGP//sp9//7b - qP/+68///vnx//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/f/+/f3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/f3//vv7//35+P/9+vr//vz8//7+/v/+/v7//v7+//78+//+8On//uDS//7F - qv/+s5H//rGO//6yj//+tpX//s23//7v6f/v4Nz/2r+4/7iEdv+VRC//k0Is/5NBKv+RPij/kD0m/5E9 - Jv+RPif/kT4n/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5A9Jv+PPSb/kD0m/pA9Jv6QPSb+kT4n/pVF - L/6fWET+vYx9/ti8tP7x5+X8/f39+v39/fj8/Pzz/Pz87fz8/OP8/PzY/Pz8x/z8/Lb8/Pyg/f39ifz8 - /HL8/Pxb+/v7R/r6+jX4+Pgm9vb2Hvn5+S76+vo5+/v7TPz8/GL9/f16+/v7kfz8/Kj8/Py7/Pz8zfz8 - /Nr8/Pzm/f397vz8/PT8/Pz4/fz5+v337fz97NT+/d2v/v3Oiv79v2X+/blU/v21S/79tUr+/bRK/v20 - Sv/9tEr//rVK//64UP/+xG7//tKQ//7iuP/+7ND//u3U//7kvv/+05X//sd2//68W//+uFH//rZM//61 - S//+tUv//rZL//62Tf/+ulb//sBl//7NhP/+2qb//uvP//726v/+/Pn//v7+//7+/v/+/v7//v7+//79 - /P/++/n//vj1//728//++vj//v38//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3//vz8//79 - /f/+/v7//v7+//7+/v/++/n//vPu//7UwP/+uJj//qZ+//6bbv/+mm7//ppt//6abP/+rIb//smx//jX - yf/v4Nv/1riv/7qHef+jXkz/jzoj/487I/+QPCT/kD0m/5E+J/+RPif/kT4n/5E+J/+RPif/kT4n/5E+ - Jv+QPSb/jz0m/5A9Jv6QPSb+kD0m/pE/KP6VRi/+p2ZU/ryLff7YvLT+7eHe/ffz8vv9/f34/Pz89P39 - /e/8/Pzn/Pz83Pz8/M/8/Py++vr6rP39/ZX7+/t/+vr6aPz8/FH7+/s++fn5Lff39yD09PQY+Pj4J/r6 - +jH7+/tD/Pz8WP39/W/7+/uG+/v7nPv7+7D8/PzD/Pz80fz8/N/8/Pzo/f398Pz8/PT9/f34/f39+/z3 - 8P397db+/d2w/v3KgP79v2X+/bhR/v22TP79tEr+/bRK/v2zSv/9tUv//rdO//68W//+xG///tKQ//7a - pP/+3Kn//tSV//7Eb//+vFr//rdO//62S//+tUv//rVL//61S//+t07//rlT//7AZf/+yn3//tqm//7q - zP/++O7//v7+//7+/v/+/v7//v7+//79/P/++/n//vTv//7s5P/+59z//uPW//7r4v/+8u3//vn2//7+ - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//738//+6uD//rye//6Z - af/+j1z//opV//6KVv/+iVT//oZP//6SYP/+p3///siw//7u5v/u3db/28G6/7eCc/+WRjD/kkAp/487 - I/+QPCX/kT0m/5E+Jv+RPif/kT4n/5E+J/+RPif/kD0m/489Jv+QPSb+kD0m/pA9Jv6RPif+lkgy/p9Y - RP68jH3+17uz/u7j4f39/f37/f39+fz8/PX9/f3w/f396fz8/OD8/PzT/Pz8xfz8/LP8/Pyg+/v7ivz8 - /HP8/Pxd+/v7R/r6+jb4+Pgm9fX1GvLy8hP39/cg+fn5Kvr6+jr7+/tN/Pz8Yvv7+3j7+/uO+/v7ovz8 - /Lf8/PzG/Pz81Pz8/OD9/f3p/f397/z8/PT9/f34/fv4+/337/z97NT+/d2w/v3Oiv79v2L+/blU/v21 - Sv79tEr+/bRK/v20Sv/9tUz//rhR//67Wf/+wGT//sNr//7DbP/+wGb//rtZ//64Uf/+tkz//rVL//61 - S//+tkv//rZM//66Vv/+v2P//syD//7apf/+687//vfr//78+P/+/v7//v7+//7+/v/+/v7//vfz//7s - 5P/+1sT//r6h//60kv/+rIf//rye//7Ot//+6N3//vr4//79/P/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//vHr//7f0f/+sY7//o9c//6MWf/+i1f//otX//6LVv/+ilT//o1Y//6S - Yf/+qoP//siv//jYy//x5uP/1bev/7qHef+iXEn/jzoi/487I/+QOyT/kT0m/5E+J/+RPif/kT4m/5A9 - Jv+PPSb/jz0m/5A9Jv6QPSb+kT8o/pNCK/6nZVP+vIt8/te7tP7u4+H99/Py+/39/fj8/Pz1/f398Pz8 - /Or9/f3h/f391vz8/Mj8/Py4/Pz8pfv7+5H7+/t8/Pz8Zvz8/FH7+/s9+fn5Le/v7yDz8/MV7u7uD/X1 - 9Rv39/ci+vr6MPv7+0L8/PxV/Pz8afv7+3/8/PyU/Pz8qPz8/Ln8/PzJ/f391v39/eH9/f3p/f398Pz8 - /PX9/f34/f39+/337/z97db+/d2v/v3LgP79wGb+/bdQ/v22Tf79tEr+/bRK/v2zSv/9tUv//rVL//61 - Sf/+tEj//rRI//60Sf/+tUv//rVL//61S//+tUv//rVL//63T//+uFP//sBm//7Jff/+2qX//urM//73 - 6//+/v7//v7+//7+/v/+/v7//vz7//759//+6uD//tbD//66m//+nXH//pNi//6LV//+m27//q+K//7Q - u//+6+H//vby//79/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+7+j//tzM//6u - iv/+jFn//oxY//6MWP/+jFj//oxY//6MV//+ilT//odQ//6UZP/+qID//sqy//7u5//t2dP/2b64/7iC - dP+bUDv/lEMs/486I/+QPCX/kD0m/5E9Jv+QPSb/jz0m/5A9Jv6QPSb+kD0m/pE+J/6XSjT+n1hE/ryK - fP7XurL+7eDd/f39/fv9/f35/Pz89f39/fD8/Pzq/Pz84vz8/Nf8/PzK/Pz8u/z8/Kr7+/uW+/v7gvz8 - /G38/PxY+/v7Rfr6+jP4+Pgl9fX1Ge/v7xDq6uoM8/PzFfb29hz5+fko+vr6N/v7+0f8/Pxa/Pz8bvv7 - +4P7+/uX/Pz8qfz8/Lv8/PzJ/Pz81/39/eH9/f3p/f398Pz8/PX9/f34/fv4+/z38P397NP+/d6x/v3O - if79vV/+/blU/v21Sv79tEr+/rRK/v20Sv/9tEr//rVK//61Sv/+tUr//rVK//61S//+tUv//rVL//61 - S//+tkz//rpW//6+Yf/+zIP//tqm//7qzf/++O7//vz4//7+/v/+/v7//v7+//7+/v/+9/T//uvi//7R - vf/+s5D//qF2//6SYP/+jlv//oxX//6QXv/+mWr//q+L//7Ir//+59z//vr4//79/P/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//707//+5dn//riY//6WZ//+kF7//o1Y//6MWP/+jFj//oxY//6L - Vv/+ilX//o1Y//6RXv/+qoT//seu//nazf/x5+T/1riw/7yKfP+hWkb/jjki/446I/+OOyT/jzwl/489 - Jv+QPSb+kD0m/pA9Jv6RPyj+kkEr/qZkUv68i3z+2Luz/fDn5P348/L7/f39+fz8/PX8/Pzx/Pz86vz8 - /OL8/PzY/Pz8y/z8/Lz8/Pyr+/v7mf39/YX8/Pxx/Pz8Xfz8/Er6+vo5+fn5Kfb29h7y8vIU6+vrDePj - 4wnv7+8Q8/PzFvf39x/5+fks+vr6Ovv7+0z8/Pxe+vr6cv39/YX7+/uY/Pz8q/z8/Lv8/PzK/f391v39 - /eH9/f3p/f398Pz8/PX9/f34/f39+/337fz97db+/dyt/v3Kf/79wGf+/bhR/v22Tf79tEr+/bRK/v2z - Sv/9tEr//rVL//61S//+tUv//rVL//61S//+tUv//rdP//65U//+wGf//sl8//7apf/+6sz//vbp//7+ - /v/+/v7//v7+//7+/v/+/Pv//vj1//7p3//+07///rmZ//6cb//+kmH//oxX//6MV//+jFj//otX//6N - Wf/+mWv//q2H//7Puf/+6N7//vby//79/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vj2//7u - 5v/+x67//qd///6abP/+kF7//o5a//6MWP/+jFj//oxY//6MV//+ilT//odQ//6WZv/+p4D//sqz//3p - 4P/s18//2Ly1/7eBc/+dVEH/k0Mu/486I/6POyT+jzsk/o88JP6QPCX+kD4m/phLNf6hW0j+u4p8/ti7 - s/3s39z8/f39+/39/fj8/Pz1+/v78fz8/Or8/Pzi/Pz82Pz8/Mv8/Py9/Pz8rf39/Zr9/f2H+vr6dPz8 - /GD7+/tO+/v7Pfn5+S739/cg9PT0F+3t7Q7j4+MJ1NTUBujo6Avv7+8Q9PT0F/f39yL5+fku+/v7Pfv7 - +078/Pxg+vr6c/v7+4b7+/uZ/Pz8q/z8/Lz8/PzK/Pz81/39/eH8/Pzq/f398Pz8/PX9/f34/fv4+/34 - 8v397NP+/d6x/v3Nh/79vV7+/bhT/v21Sv79tEr+/bNK//2zSv/9tEr//rVL//61S//+tUv//rVL//62 - TP/+uVX//r5h//7Lgv/+2qX//urN//758f/+/Pn//v7+//7+/v/+/v7//v7+//749f/+6+L//tK+//6y - j//+n3T//pFg//6OWv/+jFj//oxY//6MWP/+jFf//oxY//6PXP/+mGn//q2I//7Ir//+6d///vr4//79 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/fz//vf0//7ay//+v6P//qiB//6XaP/+kF7//o1Y//6M - WP/+jFj//oxY//6LVv/+i1X//oxY//6PW//+qoP//sas//nd0f/w5uT/17qy/7yMfv+fWUX/kDwk/o45 - If6NOCH+jjki/pA8Jf6RPyj+pWFP/r2Nfv7Yu7P98+vp/Pn19Pr9/f35/Pz89f39/fD8/Pzq/Pz84vz8 - /Nj8/PzL/Pz8vfz8/K38/Pyb/f39iPz8/HX8/Pxi/Pz8UPv7+z/6+vow+Pj4I/T09Bjw8PAR5eXlCtTU - 1Aa/v78E39/fCOjo6Avw8PAR9fX1Gvj4+CP6+vox+/v7P/z8/E/8/Pxh+vr6dPv7+4f9/f2Z/Pz8q/z8 - /Lv8/PzK/f391v39/eH9/f3p/f398Pz8/PX9/f34/f39+/327Pz97db+/dyr/v3Lgv79wWf+/bhS/v22 - Tf79tEr+/bRK/v20Sv/9tEr//rVL//61S//+t0///rlU//7BZ//+yn7//tql//7qzf/+9ej//v7+//7+ - /v/+/v7//v7+//78/P/+9/T//unf//7Svv/+uZn//p5y//6TYf/+jVn//oxY//6MWP/+jFj//oxY//6M - WP/+jFj//otX//6OXP/+mWv//q6J//7Puf/+5tv//vfz//79/P/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/Pv//uvj//7Yx//+vZ///qd///6Za//+kV7//o5a//6MWP/+jFj//oxY//6MV//+ilT//odQ//6X - Z//+qIH//su0//vk2v/r1s//2b+3/r+Qg/6sbVz+oVtI/pxSPf6bTzv+oFlF/qhnVf6+j4L+2by1/eze - 2vv9/f36/f399/z8/PX9/f3w/Pz86v39/eH8/PzX/Pz8y/z8/L38/Pyt+/v7nPv7+4n9/f12/Pz8Y/z8 - /FH7+/tA+vr6Mvj4+CX19fUb8fHxEurq6gzb29sHv7+/BKqqqgPMzMwF39/fCOrq6gzx8fES9fX1Gvj4 - +CX6+vow9/f3QPz8/E/8/Pxh/Pz8dPv7+4f7+/ua/Pz8q/z8/Lz8/PzK/Pz81/39/eH8/Pzq/Pz88fz8 - /PX9/f34/fv5+/359f397NT+/d6y/v3Mhv79vV/+/bhS/v21Sv79tEr+/bNK//2zSv/9tEv//rZM//65 - Vf/+vmH//suA//7apP/+6s3//vr0//78+v/+/v7//v7+//7+/v/+/v7//vn3//7r4//+1MD//rKP//6e - cv/+kmD//o1a//6MWP/+jFj//oxY//6MWP/+jFj//oxY//6MWP/+jFj//oxY//6OW//+l2n//qyG//7J - sP/+7OT//vr4//7+/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/++vj//vHq//7Ww//+vZ///qZ+//6X - aP/+kF3//o1Y//6MWP/+jFj//oxY//6MV//+i1X//otW//6NWv/+q4X//sev//nh1v/07ez+6tvX/tm+ - t/7BlIj+tHxt/q91ZP66iHn+zKed/uDKxP307ev8+fb1+v39/ff8/Pz0/f398P39/en8/Pzi/Pz81/z8 - /Mv8/Py9/Pz8rfv7+5z7+/uJ/f39dvz8/GP8/PxR+/v7Qfr6+jL4+Pgm9fX1G/Ly8hPq6uoM39/fCL+/ - vwR/f38CAAAAAaqqqgPMzMwF39/fCOvr6w3x8fES9fX1G/j4+CX6+voy+/v7P/z8/FD8/Pxh/Pz8dPv7 - +4f9/f2Z/Pz8q/z8/Lv8/PzK/f391v39/eH8/Pzq/f398Pz8/PX9/f34/f39+/326/z97dX+/dyr/v3M - hP79wGf+/bhS/v21TP79tEn+/bRJ/v21Tf/9uFT//sBn//7Kf//+2qT//urM//715v/+/v7//v7+//7+ - /v/+/v7//v38//738//+6uD//tK9//65mf/+oHT//pNh//6NWv/+jFj//oxY//6MWP/+jFj//oxY//6M - WP/+jFj//oxY//6MWP/+jFj//otX//6PXf/+mWv//q+L//7Ouf/+5dr//vj1//79/P/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/++vj//urg//7Ww//+vJ7//qiA//6Za//+kV///o1a//6MWP/+jFj//oxY//6M - V//+iVT//ohT//6Yav/+rIj//dbE//zy7f748e/+7+Th/t7GwP7Utq7+0bGn/tm9tf3l08788efl+/z7 - +/n9/f32/Pz88vz8/O38/Pzo/Pz83/39/db8/PzJ/Pz8vPz8/Kz8/Pyb+/v7if39/Xb6+vpk/Pz8Uvv7 - +0H6+voz+Pj4Jvb29hzy8vIT6+vrDd/f3wjMzMwF////AgAAAAEAAAAAAAAAAX9/fwK/v78E39/fCOrq - 6gzy8vIT9fX1Gvj4+CX6+vow+/v7P/z8/E/8/Pxh/Pz8dPv7+4f7+/ua/Pz8q/z8/Lz8/PzK/Pz81/z8 - /OL8/Pzq/Pz88fz8/PX9/f35/fz6+/369f397NT+/d6x/v3Lgv79vFz+/bZP/v2zSP79tEn+/rdR/v28 - X//9yX3//tmk//7qzP/++/T//v37//7+/v/+/v7//v7+//7+/v/++/n//uzk//7Vw//+s5D//pxv//6R - YP/+jVn//oxY//6MWP/+jFj//oxY//6MWP/+jFj//oxY//6MWP/+jFj//oxY//6MWP/+jFj//oxY//6M - Wf/+l2j//qqD//7Ksf/+7+n//vr5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/f/+/Pr//vDp//7V - wv/+vJ7//qV8//6XaP/+jlz//oxY//6MWP/+jFj//oxY//6MV//+i1b//YlW//2SY//+w6n+/ejd/v31 - 8f78+vr++fb2/vj08/738/L++PTz/fr49/v7+vr5/f399vz8/PL8/Pzt/Pz85v39/d78/PzU/Pz8yfz8 - /Lv8/Pys+/v7mv39/Yj9/f12/Pz8Y/z8/FH7+/tB+vr6Mvj4+Cb19fUb8vLyFOrq6gzf398IzMzMBX9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9vb2HPj4+CX6+voy+/v7P/z8 - /FD8/Pxh/Pz8dPv7+4f9/f2Z/Pz8q/z8/Lv7+/vK/f391v39/eH8/Pzq/f397/z8/PX9/f34/fz7+/32 - 6/z97NT+/d2v/v3Pjf79xXL+/b9j/v2+Yf79w23+/cyF/v3Zpv/96cz//vTl//79+//+/v3//v7+//7+ - /v/+/f3//vbz//7r4f/+0bz//riZ//6hdv/+kmH//o5a//6MWP/+jFj//oxY//6MWP/+jFf//otX//6L - V//+i1b//oxX//6MV//+jFj//oxY//6MWP/+jFj//otX//6QXv/+mWr//rCM//7OuP/+5dn//vn3//79 - /P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/++fb//urg//7Ww//+vZ///qZ+//6QX//+i1f//oxY//6M - WP/+jFj//oxX//6LV//9iFT//Y9c/v2yj/790r7+/e7m/v39/f79/f3+/f39/f39/fz9/f37/f39+Pz8 - /PX8/Pzx+/v76/z8/OT9/f3b/Pz80fz8/MX8/Py4/Pz8qf39/Zj7+/uH+vr6dfz8/GP8/PxS+/v7Qfr6 - +jP4+Pgm9vb2HfLy8hPt7e0O39/fCMzMzAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwK/v78E39/fCOjo6Avy8vIT9fX1Gvj4+CX6+vow+/v7P/z8/E/8/Pxh/Pz8dPv7+4f7+/ua/Pz8rPz8 - /Lz8/PzL/Pz81/z8/OL9/f3p/f398Pz8/PX9/f35/f38+/369/398uD9/ebD/v3Wnf79zIT+/cl8/v3Q - jf793q/+/ezS/v369f79/f3+/f39/v39/f7+/v7+/v7+//78+//+7eX//tjG//60kf/+mmz//pFf//6M - WP/+jFj//oxY//6MWP/+jFj//oxY//6LV//+ilb//opV//6KVf/+i1b//oxX//6MV//+jFj//oxY//6M - WP/+jFj//oxX//6LV//+lmj//qiB//7Ltf/+9O///vv5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//vHq//7Xxf/+tpb//pNi//6KVf/+jFj//oxY//6MWP/9i1f//YtX/v2KVv79jlr+/aF1/v27 - nP795dn+/fz8/v38/P79/f39/f39+/39/fj8/Pz1/f398Pz8/Ov8/Pzj/Pz82vz8/M/8/PzE/Pz8tvv7 - +6f7+/uW+/v7hfr6+nP8/Pxh/Pz8UPv7+0D6+voy+Pj4JvX19Rvy8vIT6urqDN/f3wi/v78Ef39/AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9vb2HPj4 - +CX6+voy+/v7QPz8/FD8/Pxh/Pz8dPv7+4f9/f2Z/Pz8q/z8/Lv8/PzJ/Pz81/z8/OD9/f3p/f397/z8 - /PX9/f34/fz7+v337/z98uL9/OnO/v3lwv795L7+/efG/v3u2P799en+/fz6/v39/f79/f3+/f39/v39 - /f7+9vL//uzk//7RvP/+uJf//qJ3//6SYf/+jlv//oxY//6MWP/+jFj//oxY//6LV//+i1X//php//6n - gP/+so///rqa//6ngP/+l2j//pBe//6LV//+jFf//oxY//6MWP/+jFj//otX//6QXv/+mGr//rGN//7O - t//+5dn//vv5//79/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+8u3//trJ//65mv/+k2L//opV//6M - WP/+jFj//YtX//2KV//9i1f+/YpW/v2OWv79n3P+/bmZ/v3k2P79/Pv+/f38/f39/fv9/f35/Pz89f39 - /fD9/f3p/Pz84vz8/Nf8/PzM/Pz8v/z8/LL8/Pyj+/v7k/v7+4L6+vpx/Pz8X/z8/E/7+/tA+vr6M/j4 - +Cb29vYc8vLyFO3t7Q7f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH9/fwK/v78E39/fCOjo6Avy8vIT9fX1Gvj4+CX6+vox+/v7P/z8/E/8/Pxh/Pz8dPv7 - +4f7+/ua/Pz8rPz8/Lz8/PzL/Pz81/z8/OL9/f3p/f398Pz8/PT9/f33/f39+v38/Pz9/Pz9/fz7/v38 - +/79/fv+/f39/v39/f79/f3+/f39/v39/f79/f3+/fz7/v7s5P/+2sn//raU//6Za//+kV///oxY//6M - WP/+jFj//oxY//6MWP/+jFj//oxX//6MV//+pn3//sWr//7ZyP/+593//sSq//6lff/+lmb//otX//6M - V//+jFj//oxY//6MWP/+jFj//otX//6KVf/+mGj//qmB//7Ot//+9O///vn3//7+/v/+/v7//v7+//7+ - /v/+/v7//v38//7x6//+2sn//rma//6TY//+ilb//oxX//6LV//9i1f+/YtX/v2LV/79i1f+/Y5c/v2f - dP79uJn+/ePY/v38+/39/Pz8/f39+f39/fb8/Pzx/Pz86/z8/OL8/PzY/Pz8y/z8/L78/Pyv/Pz8oPv7 - +4/7+/t/+vr6bvz8/F37+/tN+/v7Pvr6+jH4+Pgl9fX1G/Ly8hPq6uoM39/fCL+/vwR/f38CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr - 6w3y8vIT9vb2HPj4+CX6+voy+/v7QPz8/FD8/Pxh/Pz8dPv7+4f9/f2Z/Pz8q/z8/Lv8/PzJ/f391vz8 - /N/8/Pzo/Pz87fz8/PL9/f32/fz8+f39/fr9/Pz8/fz8/f39/f39/f3+/f39/v39/f79/f3+/f39/v33 - 9P797+j+/dG+//22lv/+onj//pJg//6OW//+jFj//oxY//6MWP/+jFj//otX//6LVf/+lmb//qV8//7D - qP/+49f//u3l//707//+4NP//sqz//6sh//+lmX//o9c//6LV//+jFf//oxY//6MWP/+jFf//otX//6R - Xv/+mGj//rGN//7Ntf/+5dn//vv5//79/P/+/v7//v7+//76+P/+7eX//tnI//6+oP/+pn7//pBf//6L - V//9i1f//YpX//2LV/79i1f+/YxY/v2QXv79mWv+/bOS/v3Ouf797OT9/f39+/39/fn9/f32/Pz88vz8 - /Ov8/Pzj/Pz82Pz8/Mv8/Py8/Pz8rf39/Zz7+/uM+/v7e/z8/Gr8/Pxa/Pz8Svv7+zz5+fkv+Pj4JfX1 - 9Rvy8vIT6+vrDd/f3wjMzMwFf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E39/fCOrq6gzy8vIT9fX1G/j4+CX6+vox+/v7P/z8 - /FD8/Pxh/Pz8dPv7+4f7+/uZ/Pz8q/z8/Lr8/PzJ/Pz81fz8/N/8/Pzm/Pz87Pz8/PH8/Pz1/f399/39 - /fn9/f37/f39/P39/f39/f3+/f39/v39/f79/f3+/e/o/v3f0f79uZv+/Zdq//6RYP/+jFj//oxY//6M - WP/+jFj//oxY//6MWP/+jVn//o9b//6kev/+waT//t7P//78+//+/v3//v7+//739P/+6uH//sSp//6m - fP/+lmX//oxY//6MWP/+jFj//oxY//6MWP/+jFj//otX//6KVf/+mWr//qqC//7Puf/+8On//vj1//79 - /P/++/r//vLs//7by//+wqX//qV8//6WZv/+jlv//otY//2KV//9i1f+/YtX/v2MWf79j1z+/Zhq/v2n - gP79yLD+/eTY/f308Pz9/f36/f399/39/fL8/Pzt/Pz85Pz8/Nr8/PzN/Pz8vvz8/K37+/uc+/v7iv39 - /Xj8/Pxn/Pz8Vvv7+0f6+vo5+fn5Lff39yL19fUZ8fHxEurq6gzf398IzMzMBX9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwLMzMwF39/fCOvr6w3y8vIT9fX1G/j4+CX6+voy+/v7QPz8/FD8/Pxh/Pz8c/v7+4b7+/uY/Pz8qfz8 - /Ln8/PzG/Pz80v39/dv8/Pzj/f396f39/e78/Pzy/Pz89f39/fj9/f36/f39/P39/f39/f3+/f38/v38 - /P794NL+/cGl/v2mf/79jl7//o1a//6MWP/+jFj//oxY//6MWP/+jFf//otX//6WZ//+qIH//sOo//7i - 1P/+8er//v39//7+/v/+/v7//vz6//718f/+4tT//sqy//6rhP/+lmb//o5b//6LVv/+jFf//oxY//6M - WP/+jFf//otX//6RXv/+l2j//rGO//7MtP/+5dr//vby//7t5f/+3Mz//r+i//6pgf/+mWr//pBe//2M - Wf/9ilf//otX/v2LV/79jFf+/ZFf/v2Yaf79rYn+/cSq/v3f0f398+78/Pn3+/39/fj8/Pz0/f397vz8 - /Ob8/Pzc/Pz8z/z8/MD7+/uw+/v7nfv7+4r9/f13/Pz8ZPz8/FT7+/tE+vr6N/n5+Sv39/ch9PT0GPHx - 8RLr6+sN39/fCMzMzAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E39/fCOrq6gzy8vIT9fX1G/j4 - +CX6+vox+/v7QPz8/E/8/Pxh+vr6c/v7+4X7+/uW+/v7p/z8/LX8/PzD/Pz8zvz8/Nj8/Pzg/Pz85/z8 - /Oz8/Pzx/Pz89P39/ff9/f36/f39/P39/f39/Pv+/fv6/v3TwP79qID+/Zdp/v2IVf/9ilf//oxY//6M - WP/+jFj//oxY//6LV//+ilb//p5z//6/o//+3M3//vn2//7+/f/+/v7//v7+//7+/v/+/v7//v39//73 - 9P/+593//sSo//6of//+lmb//o1a//6MWP/+jFf//oxY//6MWP/+jFj//otX//6LVv/+mmz//qyG//7M - tf/+4NL//tTB//7Cpv/+p3///pZm//6PXP/+jFj//YpX//2LV/79i1f+/Y1Z/v2PXP79mmz+/aZ+/v3D - qf793tD+/fDq/f39/fv9/f34/Pz89f39/e/8/Pzo/Pz83/z8/NL8/PzE/Pz8svz8/KD9/f2M/f39ePz8 - /GX8/PxS+/v7Q/r6+jT5+fkp9vb2HvPz8xbv7+8Q6OjoC9/f3wjMzMwF////AgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9fX1G/j4+CX6+vox+/v7P/z8/E/8/Pxg/Pz8cf39 - /YL8/PyU/Pz8o/z8/LH8/Py+/Pz8yvz8/NP8/Pzc/Pz84/z8/Or9/f3v/Pz89P39/ff9/f36/f39/P38 - +/39+vj+/cu0/v2Za/79kV/+/opV/v2KVv/9i1f//oxY//6MWP/+jFj//otX//6KVf/+pHz//tC7//7p - 4P/++/r//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vz7//718P/+49b//suy//6qgv/+lmb//o1a//6L - Vv/+jFj//oxY//6MWP/+jFf//oxX//6RXv/+l2j//qR7//6shv/+pn7//p90//6WZv/+j13//YxZ//2L - V//9ilf//YtX/v2MV/79kV/+/Zdo/v2sh/79wab+/dvM/v3y7P39+Pb7/f39+Pz8/PX9/f3w/f396fz8 - /N/8/PzV/Pz8xvz8/Lb8/Pyj+/v7kP39/Xv8/Pxn/Pz8VPv7+0P6+vo0+fn5KPb29h7z8/MW7u7uD+Xl - 5Qrb29sHv7+/BH9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E39/fCOrq - 6gzy8vIT9fX1G/j4+CX6+vox+/v7Pvv7+078/Pxe+vr6b/v7+3/7+/uP/Pz8nvz8/Kz8/Py5/Pz8xPz8 - /M/8/PzZ/f394f39/en9/f3v/Pz89P39/fj9/f36/fz7/P37+f39zLX+/Ztt/v2RX/79iVT+/YpW/v2K - V//9i1f//oxY//6MWP/+i1f//opV//6jev/+zLX//uXZ//749f/+/Pz//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v38//738//+5dn//sOn//6pgv/+lmb//o5b//6MWP/+jFf//oxY//6MWP/+jFj//oxX//6L - V//+jVn//o5b//6MWP/+i1f//otY//6LWP/9ilf//YtX/v2LV/79jVr+/Y9d/v2abf79p37+/cGl/v3a - y/797ef9/f39+/39/fj8/Pz1/f398P39/en9/f3h/f391vz8/Mn8/Py5+/v7p/z8/JT7+/t/+vr6a/z8 - /Ff7+/tF+vr6NPn5+Sj29vYd8/PzFe3t7Q7j4+MJ1NTUBr+/vwR/f38CAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9fX1G/j4+CT6+vow+/v7Pfv7 - +0v8/Pxa/Pz8av39/Xn7+/uJ/f39l/z8/KX8/Pyz/Pz8v/z8/Mz8/PzX/Pz84P39/en9/f3w/Pz89f39 - /fj9/Pz7/fv7/f3Xxv79sY3+/Ztt/v2IU/79ilX+/YpX//2KV//9i1f//oxY//6MWP/+i1f//php//6t - iP/+y7T//u3m//749f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vz7//707//+5dn//sqy//6n - f//+lmb//o1Y//6MV//+jFj//oxY//6MWP/+jFj//oxX//6MWP/+jFj//oxY//6MWP/9i1f//YpX//6L - V/79i1f+/YxX/v2RX/79l2n+/aqF/v3Ao/792cn+/fLu/f349vv9/f35/Pz89f39/fD8/Pzq/Pz84vz8 - /Nf8/PzK/Pz8u/z8/Kr7+/uW/f39gvz8/G75+flb+/v7R/r6+jf5+fko9vb2HvPz8xXt7e0O4+PjCdTU - 1AaqqqoDf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwLMzMwF39/fCOrq6gzx8fES9fX1Gvj4+CP5+fku+vr6Ovv7+0j8/PxW/Pz8ZPz8/HP9/f2C+/v7kfz8 - /KD8/Pyu/Pz8vfz8/Mr8/PzX/f394fz8/Or8/Pzx/f399v39/fn9/Pz8/eXa/f3Mtf79rYn+/ZJh/v2O - W/79i1b+/YtW/v2KV//9i1f//otY//6LWP/+kV///plr//6zkP/+0r///ufc//759//+/Pv//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//vz7//738//+49b//sOo//6rhP/+lmX//o9c//6MWP/+jFj//oxY//6M - WP/+jFj//oxX//6LV//+i1f//otX//2KV//9i1f+/YtX/v2NWv79kF7+/Ztt/v2ogv79wKT+/dnI/v3r - 5P39/f37/f39+Pz8/PX9/f3w/Pz86vz8/OL8/PzX/Pz8y/z8/Lz8/Pys+/v7mf39/YX8/Pxx/Pz8Xfv7 - +0v6+vo5+fn5LPf39x/z8/MW7e3tDuPj4wnMzMwFqqqqA////wEAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOrq6gzx8fES9PT0GPf3 - 9yH5+fkr+vr6N/v7+0P8/PxQ/Pz8Xfz8/Gz9/f17/f39i/v7+5z8/Pyt/Pz8vfz8/Mz8/PzZ/Pz85Pz8 - /Oz8/Pzz/f399/z8/Pv99fL8/evk/v3Hrv79pXz+/ZVl/v2KVP79ilb+/YpX//2KV//9i1f//oxY//6N - Wf/+j1v//ptt//6rhf/+zbb//vHr//749v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v38//71 - 8P/+59z//sqy//6lfP/+lmb//oxX//6MV//+jFj//oxY//6MWP/+jFj//oxY//2LV//9ilf//otX/v2L - V/79jFf+/ZBe/v2Xaf79qoT+/cCk/v3Zyf798+/9/fn3+/39/fn8/Pz1/Pz88fz8/Or8/Pzi/Pz82Pz8 - /Mv8/Py9/Pz8rPv7+5r9/f2H+vr6dPz8/GD7+/tN+/v7PPn5+Sz39/ch8/PzFu7u7g/j4+MJ1NTUBqqq - qgN/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAX9/fwLMzMwF39/fCOrq6gzw8PAR9PT0GPf39x/5+fkp+vr6Mvv7+z78/PxK/Pz8Wfz8 - /Gf9/f14/f39ifv7+5z8/Pyu/Pz8v/z8/M78/Pzc/Pz85v39/e78/Pz0/f39+f37+vv9+Pb9/d/R/f3E - qv79qoP+/ZRj/v2OW/79ilb+/YtX/v2KV//9i1f//otX//6LV//+kV7//pdo//6zkP/+0r7//ufc//75 - 9//+/Pv//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vz6//738//+4dT//sOp//6rhf/+lWT//o9c//6M - V//+jFf//oxY//6MWP/+i1f//YpX//2LV/79i1f+/Y1a/v2QX/79m23+/amE/v2/pP792cj+/Ovj/f39 - /Pv9/f34/Pz89f39/fD8/Pzr/Pz84vz8/Nj8/PzL/Pz8vfr6+q38/Pyb/f39iPz8/HX8/Pxi/Pz8UPv7 - +z76+vow9/f3IvX19Rnv7+8Q6OjoC9TU1AaqqqoD////AQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E29vbB+Xl - 5Qru7u4P8/PzFfb29hz4+Pgj+fn5Lvb29jn7+/tG/Pz8VPz8/GX9/f13+/v7i/v7+5/8/Pyy/Pz8w/z8 - /NP8/Pzf/f396f39/fD9/f32/f39+f38/Pz99fH9/eng/v3Eqv79pXv+/ZRj/v2KVf79i1b+/otX/v2K - V//9i1f//oxY//6MWP/+jVn//ppr//6ogf/+zrj//vLs//759v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v39//718f/+6d///siv//6hd//+lWX//otW//6MV//+jFj//YtX//2KV//9ilf//YtX/v2M - V/79kF3+/Zdp/v2og/79v6T+/djI/v3z7v39+vj7/f39+fz8/PX8/Pzy+/v76/z8/OP8/PzY/Pz8zPz8 - /L38/Pyt+/v7nPv7+4n9/f12/Pz8Y/z8/FD7+/tA+vr6Mfj4+CX19fUZ8fHxEujo6Avb29sHv7+/BH9/ - fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E1NTUBuXl5Qrt7e0O8vLyE/X19Rn39/ch+fn5K/r6 - +jf7+/tE/Pz8Vfz8/Gb7+/t7/f39j/z8/KT8/Py3/Pz8yP39/db8/Pzi/Pz86/z8/PL8/Pz3/f39+v37 - +vz99vP9/d7P/v3Fq/79qYP+/ZVl/v2OW/79ilb+/YtX/v2KV//9i1f//otX//6LV//+kV7//pdo//6z - kf/+0Lv//ubb//759v/+/Pv//v7+//7+/v/+/v7//v7+//7+/v/+/v7//vv6//738//+4NL//sSq//6r - hv/+lGP//o9c//6KV//9ilf//YtX/v2LV/79jVn+/ZFf/v2abf79qoX+/b+k/v3YyP796uL9/fv5+/39 - /fj9/f32/f398Pz8/Ov8/Pzi/Pz82Pz8/Mv8/Py9/Pz8rfv7+5z7+/uJ/f39dvr6+mT8/PxS+/v7Qfr6 - +jP4+Pgl9vb2HPHx8RLr6+sN39/fCL+/vwR/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/ - fwKqqqoDzMzMBd/f3wjo6OgL7u7uD/Pz8xb29vYe+fn5Kfr6+jX7+/tF/Pz8Vv39/Wv9/f2A+/v7lvz8 - /Kr8/Py9/Pz8zf39/dv9/f3l/f397vz8/PT9/f35/f38+/38+/399/T+/erg/v3DqP79pHv+/ZJh/v2K - Vf79i1b+/YtX/v2KV//9i1f//oxY//6MWP/+jFf//phq//6ngP/+0Lv//vLs//759//+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//728v/+7eT//set//6fdP/9k2P//YhV//2KVv79i1f+/YxX/v2P - XP79l2n+/aeA/v2/pP792Mj+/fPu/f38+vv9/f35/Pz89vz8/PL8/Pzr/Pz84/z8/Nj8/PzM/Pz8vfz8 - /K77+/uc+/v7if39/Xb8/Pxj/Pz8Ufv7+0H6+voy+Pj4JvX19Rvy8vIT6urqDN/f3wi/v78Ef39/AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwKqqqoDv7+/BNvb2wfl5eUK7+/vEPPz - 8xb39/cf+fn5Kvr6+jj4+PhJ/Pz8XPz8/HH9/f2G/Pz8m/v7+7D8/PzB/Pz80fz8/N38/Pzn/f397vz8 - /PX9/f34/fz8+/37+vz99O/+/d7Q/v3GrP79qYP+/ZZm/v2NWv79ilb+/YtX/v2KV//9i1f//otX//6L - V//+kV///phq//60kv/+z7n//ufc//759v/+/Pv//v7+//7+/v/+/v7//v7+//7+/v/9/f3//fr5//32 - 8//939H//cWs//2sh//9lmf+/Y5c/v2KVv79j13+/Zlr/v2qhf79v6T+/dnJ/v3r4/39+ff7/f39+Pz8 - /PX9/f3w/Pz86/z8/OL8/PzY/Pz8y/z8/L38/Pyt+/v7nPv7+4n9/f12+vr6ZPz8/FL7+/tC+vr6M/j4 - +Cf29vYc8vLyE+vr6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAABqqqqA8zMzAXl5eUK7e3tDvPz8xb39/cf+fn5LPv7+zv7+/tO/Pz8Yvr6 - +nf7+/uM+/v7ovz8/LX8/PzG/Pz81Pz8/OD8/Pzo/f398Pz8/PX9/f35/f39+/38+/39+ff+/ejf/v3B - pv79pHv+/ZFf/v2KVf79i1b+/YtX/v2LV/79i1f//oxY//6LV//+jFf//php//6pg//+07///vLr//76 - 9//+/v7//v7+//7+/v/9/f3//f39/v39/f79/f3+/f39/v338/797uf+/civ/v2ke/79lGX+/YtY/v2U - Zf79pHz+/b+j/v3ayv398+79/f39+/39/fn8/Pz1/Pz88fz8/Or8/Pzj/Pz82Pz8/M38/Py+/Pz8rvv7 - +5z7+/uJ/f39dvz8/GP8/PxR+/v7Qfr6+jL4+Pgm9vb2HPLy8hPq6uoM39/fCL+/vwR/f38CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CqqqqA9TU - 1Abl5eUK7+/vEPT09Bj4+Pgj+vr6Mfv7+0H8/PxT+vr6aP39/Xz7+/uS/Pz8pfz8/Lj8/PzH/Pz81fz8 - /OD9/f3p/f397/z8/PX9/f34/fz8+/38+/z98u7+/d/R/v3Grf79qID+/ZZn/v2MWf79ilb+/YtX/v2K - V//9i1f//otX//6MWP/+kV///pps//6zkv/+zbf//uje//759v/+/fz//v7+//39/f/9/f3+/f39/v39 - /f79/f3+/fr5/v338/7949f+/dC8/v3Dqf79u57+/cKp/v3OuP393tD9/ezl/P359/r9/f34/Pz89f39 - /fD8/Pzq/f394fz8/Nj8/PzL/Pz8vfz8/K37+/uc+/v7if39/Xb8/Pxk/Pz8Uvv7+0L6+voz+Pj4J/b2 - 9h3y8vIU7e3tDt/f3wjMzMwFf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqqqqA9TU1Abo6OgL8PDwEfX19Rv4+Pgm+vr6Nfv7 - +0X8/PxY/Pz8bPv7+4L8/PyV/Pz8qfz8/Ln8/PzK/f391vz8/OL9/f3p/f398Pz8/PX9/f34/f39+/37 - +/39+ff+/eXa/v3ApP79pX3+/ZFf/v2LV/79i1f+/YtX/v2LV/79i1f//oxY//6LV//+jVn//pdp//6r - h//+1MD//u/n//759v/+/f3//f39//39/f79/f3+/f39/v39/f79/f3+/f39/v36+P799vL+/ezl/v3n - 3v397eX8/fLt/P35+Pv9/f36/f399/z8/PT9/f3w/Pz86vz8/OP8/PzY/Pz8zPz8/L38/Pyu+/v7nPv7 - +4n9/f12/Pz8Y/z8/FL7+/tB+vr6M/j4+Cb29vYc8vLyFOrq6gzf398ImZmZBX9/fwIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB/f38CqqqqA9vb2wfq6uoM8vLyFPb29h75+fkq+vr6Ofz8/Er8/Pxc/Pz8cPv7+4T9/f2X/Pz8qfz8 - /Lv8/PzJ/Pz81/z8/OD9/f3p/f398Pz8/PX9/f34/fz8+/38+/z98ez+/eDT/v3Grf79p37+/ZZn/v2L - V/79ilb+/YtX/v2KV//9i1f//otX//6MWP/+kF///ppu//6zkP/+zbb//unf//749f/9+/v//f39/v39 - /f79/f3+/f39/v39/f79/f3+/Pv6/v36+P399vP8/fTw+/328/r9+Pb5/fz79/z8/PX8/Pzy/Pz87fz8 - /Oj8/Pzg/Pz81/z8/Mr8/Py9/Pz8rPv7+5z7+/uJ/f39dvr6+mT8/PxS+/v7Qvr6+jP4+Pgn9vb2HfLy - 8hTb29sO39/fCMzMzAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38CzMzMBd/f3wjt7e0O8/PzFvf3 - 9yD5+fkt+/v7PPv7+0z6+vpf/Pz8cvv7+4b7+/uZ/Pz8q/z8/Lv8/PzL/f391vz8/OL8/Pzq/Pz88fz8 - /PX9/f34/f39+/z7+v39+Pb+/eLW/v3ApP79p37+/ZFf/v2MWf79i1b+/YtX/v2KV//9i1f//oxY//6L - V//+jlv//phq//6viv/+1cH//uzj//339P/9/Pz+/f39/v39/f79/f3+/f39/v39/f39/f39/f39/P39 - /fr9/f35/f399/z8/PX8/Pzz/f397/z8/Ov9/f3l/Pz83/z8/NX8/PzK/Pz8vPz8/K38/Pyb+/v7if39 - /Xb8/Pxj/Pz8Uvv7+0H6+voz+Pj4Jvb29hzy8vIU6+vrDd/f3wjMzMwFf39/AgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAGqqqoD1NTUBuXl5Qrv7+8Q9fX1Gfj4+CP5+fkv+/v7Pvv7+078/Pxg/Pz8c/39 - /Yb7+/uZ/Pz8q/z8/Lz7+/vK/Pz81/39/eH8/Pzq/f398Pz8/PX9/f34/fz8+/38+/z98ev+/eLW/v3G - rP79pXv+/ZZm/v2KVf79ilb+/YtX/v2KV//9i1f//otX//6MWf/+kF3//ptu//6yjv/+zLX//erh//33 - 9f79/Pz+/f39/v39/f79/f39/f39/f39/fv9/f35/f399/z8/PX8/Pzy/f397/z8/Ov8/Pzn/f394fz8 - /Nr8/PzS/Pz8xvz8/Lr8/Pyq+/v7mvv7+4j8/Px1/Pz8Y/z8/FL7+/tC+vr6M/j4+Cf29vYc8vLyFOvr - 6w3f398IzMzMBX9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E29vbB+jo - 6Avx8fES9fX1Gvj4+CT6+vow+/v7P/z8/E/8/Pxh/Pz8dPv7+4f9/f2Z/Pz8rPz8/Lv8/PzK/f391v39 - /eH9/f3p/f398Pz8/PX9/f34/f39+/38+/z9+Pb+/eDS/v2/ov79p3/+/ZFf/v2NWv79i1b+/YtX/v2K - V//9i1f//otX//6KVv/+jlv//phq//6wjf/908D//enh/v349v79/Pv+/f39/f39/fz9/f38/f39+f39 - /ff8/Pzz/f398Pz8/Ov8/Pzn/Pz84vz8/Nz8/PzV/Pz8zPz8/ML8/Py2/Pz8qPv7+5j7+/uH+vr6dfz8 - /GL8/PxS+/v7Qfr6+jP4+Pgm9vb2HPLy8hTr6+sN39/fCMzMzAX///8CAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E39/fCOrq6gzx8fES9fX1Gvj4+CX6+vox+/v7QPz8 - /FD8/Pxh/Pz8dPv7+4f7+/ua/Pz8q/z8/Lz8/PzK/Pz81/39/eH9/f3p/Pz88Pz8/PT9/f34/fz8+/z7 - +v398uz9/eTY/v3Fq/79o3n+/ZVl/v2KVf79ilb+/otX/v2KV//9ilf//YpX//2LWP/9jlz//Zpu//6v - jP79zbf+/e7o/v349v79/Pz9/f39+/39/fn9/f32/Pz88/39/e78/Pzo/Pz84vz8/Nz8/PzV/Pz8zvz8 - /MX8/Py7+/v7sPv7+6L8/PyU+/v7hPr6+nP8/Pxh/Pz8UPv7+0H6+voz+Pj4J/b29hzy8vIU6+vrDd/f - 3wjMzMwFf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwLMzMwF39/fCOrq6gzx8fES9fX1G/j4+CX6+voy+/v7P/z8/FD8/Pxh/Pz8dPv7+4f9/f2Z/Pz8q/z8 - /Lv8/PzK/f391v39/eH9/f3p/f397/z8/PT9/f34/f39+v37+vz9+Pb9/d7Q/f2/o/79qID+/ZFg/v2O - Wv79i1b+/YtX/v2LV/79i1f+/YtW/v2KVf79jlz+/Zdo/v22lv794NL+/fHr/f38+/z9/f35/f399/z8 - /PL8/Pzt/Pz85vz8/N/8/PzX/Pz8z/z8/Mb8/Py9/Pz8svv7+6f8/Pyb/f39jfv7+3/9/f1v/Pz8X/z8 - /E/7+/tA+vr6M/j4+Cb29vYc8vLyFOvr6w3f398IzMzMBf///wIAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOrq6gzy8vIT9fX1G/j4 - +CX6+vox+/v7QPz8/E/8/Pxh/Pz8dPv7+4f7+/ua/Pz8q/z8/Lz8/PzK+/v71/39/eH9/f3p/f398Pz8 - /PT9/f34/f39+f38+/v98u38/efc/f3Eqf39onj+/ZRk/v2KVf79ilb+/YtX/v2LV/79i1f+/YtW/v2L - V/79jFn+/aZ//f3Mtf395dr8/fv6+v39/ff8/Pzz/Pz87fz8/Of9/f3e/Pz81Pz8/Mr8/Py//Pz8tPz8 - /Kn8/Pye/f39kf39/YX9/f13/Pz8afz8/Fv7+/tM+/v7Pvr6+jH4+Pgm9fX1G/Ly8hTr6+sN39/fCMzM - zAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9fX1G/j4+CX6+voy+/v7P/z8/FD8/Pxh/Pz8dPv7 - +4f9/f2Z/Pz8q/z8/Lv8/PzJ/f391vz8/OD8/Pzo/f397vz8/PP8/Pz2/f39+P37+vn9+fb6/dzN+/3A - pfz9p4H9/ZJj/f2NW/39ilX+/YpW/v2LVv79i1b+/YtZ/f2MWv39pn78/cu1+/3k2fn9+/r3/Pz88/39 - /e/8/Pzn/f393vz8/NP8/PzI/Pz8u/z8/K39/f2g/Pz8lPv7+4j9/f17/Pz8bvz8/GL8/PxV+/v7SPv7 - +zv5+fkv+Pj4JPX19Rvy8vIT6+vrDd/f3wjMzMwF////AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E39/fCOrq - 6gzy8vIT9fX1G/j4+CX6+vox+/v7QPz8/E/8/Pxh/Pz8dPv7+4f7+/uZ/Pz8q/z8/Lv8/PzJ/Pz81fz8 - /N/8/Pzm/Pz87P39/fD8/Pz0/fz89v38/Pf98+35/efd+v3Dqfv9onr8/ZNj/P2IVP39iVb9/YpX/f2K - V/39j1z8/ZVm+/2wjvr918T4/evi9vz6+vT9/f3u/f396fz8/N/9/f3W/Pz8yPz8/Lr8/Pyr/Pz8m/39 - /Yz9/f1+/Pz8cfz8/GT8/PxY+/v7TPv7+0H6+vo2+fn5K/f39yL19fUZ8fHxEtjY2A3f398IzMzMBX9/ - fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9vb2HPj4+CX6+voy+/v7P/z8 - /FD8/Pxh+vr6dP39/Yb7+/uY/Pz8qfz8/Ln8/PzH/Pz80v39/dv8/Pzj/Pz86Pz8/Oz9/f3v/Pz88vz5 - +PT99fL2/dzN9/zBqPn9qYT5/ZZo+v2PXfr9jlv6/ZNj+v2dcvn9q4f4/cWs9vzk2vT88+3x/fz67vz8 - /Of8/Pzg/f391vz8/Mr8/Py7/Pz8rPv7+5r7+/uJ/f39efz8/Gr8/Pxd/Pz8UPv7+0X6+vo6+vr6Mfn5 - +Sj39/cf9PT0GPDw8BHq6uoM39/fCMzMzAX///8CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwK/v78E39/fCOrq6gzy8vIT9fX1Gvj4+CX6+vow+/v7P/z8/E/8/Pxh/Pz8c/39/YX7+/uX/Pz8qPz8 - /Lf8/PzE/Pz8z/z8/Nj9/f3e/Pz85Pz8/Oj8/Pzr/f387v38/PD89fHy/Onf9P3Grvb9qYP3/ZZn+P2R - X/j9nnP3/bCO9vzHr/T83tDy/fXy8Pz7++v8/Pzn/Pz83/z8/Nf8/PzL/Pz8vvz8/K77+/uc/f39if39 - /Xf8/Pxm/Pz8V/v7+0n7+/s9+vr6Mvn5+Sr39/ci9fX1G/Ly8hTu7u4P5eXlCtvb2wfMzMwFf39/AgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr6w3y8vIT9vb2HPj4 - +CX6+voy+/v7P/z8/FD8/Pxg+vr6cv39/YP8/PyU/Pz8pPz8/LL8/Py9/Pz8x/z8/M/9/f3W/f392/z8 - /OD8/Pzk+/v76Pz5+Ov99PDu/eDT8PzOufL8waby/L2g8/zGrfL90sDw/eDU7vzt5uv8+vnn/Pz84vz8 - /Nz8/PzT/Pz8y/z8/L77+/uw+/v7n/v7+439/f15/Pz8Z/z8/Fb7+/tH+vr6Ovn5+S/4+Pgl9vb2HvT0 - 9Bfx8fES6+vrDeXl5Qrb29sHv7+/BH9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH9/fwK/v78E39/fCOjo6Avy8vIT9fX1Gvj4+CX6+vow+/v7P/v7+078/Pxe/f39b/v7 - +4D7+/uQ/Pz8nvz8/Kv8/Py2/Pz8v/z8/Mf8/PzN/Pz80/z8/Nn9/f3e/Pz84vz8/Ob9/Prp/Pn37Pz1 - 8u389PHt/Pb07Pz49+r8+vrn/Pz84v39/d78/PzX/Pz80Pz8/Mf8/Py9/Pz8r/z8/KH7+/uP+/v7ffz8 - /Gn8/PxX+/v7Rvr6+jj5+fkr9/f3IfX19Rny8vIT7e3tDuXl5Qrb29sHzMzMBaqqqgN/f38CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwLMzMwF39/fCOvr - 6w3y8vIT9fX1G/j4+CX6+vox+/v7Pvv7+038/Pxc/f39a/v7+3r7+/uI/f39lPz8/KD8/Pyp/Pz8svz8 - /Lr8/PzC/Pz8yPz8/M/8/PzU/Pz82vz8/N38+/vg/Pn34vz59+L9+fnh/fr63vz7+9r8/PzU/Pz8z/z8 - /Mf8/Py//Pz8tfz8/Kv7+/ud+/v7j/v7+376+vpt/Pz8Wvv7+0n6+vo6+fn5Lff39yH19fUZ8fHxEuvr - 6w3j4+MJ1NTUBr+/vwSqqqoDf39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E39/fCOjo6Avx8fES9fX1Gfj4+CP5+fku+/v7O/v7 - +0n8/PxW/Pz8ZPz8/HL9/f1++/v7ivz8/JT8/Pye+/v7p/v7+7D8/Py4/Pz8v/z8/Mb8/PzN/Pz80fz8 - /NT9/f3W/f391vz8/NX8/PzR/Pz8zPz8/Mb8/Py//Pz8tvz8/K38/Pyj+/v7mP39/Yr9/f18/Pz8bPz8 - /Fz7+/tL+/v7O/n5+S739/ci9PT0GPDw8BHo6OgL29vbB8zMzAWqqqoDAAAAAQAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwLMzMwF39/fCOvr6w3x8fES9fX1Gvf39yL5+fkt+vr6OPv7+0T8/PxQ/Pz8XPz8/Gf6+vpz+/v7ffv7 - +4f9/f2Q+/v7mvz8/KP8/Pyr/Pz8s/z8/Lr8/Py//Pz8w/z8/MX8/PzF/Pz8xPz8/MD8/Py6/Pz8s/z8 - /Kv7+/ui+/v7mP39/Y37+/uC/Pz8dfz8/Gj8/Pxa+/v7S/v7+z35+fkv+Pj4JPX19Rrx8fES6urqDNvb - 2wfMzMwFf39/Av///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E39/fCOrq6gzw8PAR9PT0F/f3 - 9x/5+fko+vr6Mvv7+zz7+/tH/Pz8Ufz8/Fz8/Pxm/Pz8cP39/Xr7+/uE+/v7jvv7+5f7+/uf+/v7p/z8 - /K38/Pyx/Pz8s/z8/LT8/Pyx/Pz8rfz8/Kj8/Pyg+/v7l/v7+477+/uE/f39ePz8/Gz8/Pxg/Pz8VPv7 - +0j7+/s8+fn5L/j4+CT19fUb8vLyE+rq6gzf398Iv7+/BH9/fwIAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAX9/fwLMzMwF39/fCOjo6Avv7+8Q8/PzFvb29h34+Pgk+fn5Lfr6+jb7+/s++/v7R/z8 - /FH8/Pxa/Pz8ZPz8/G77+/t4+/v7gfv7+4n7+/uR+/v7lvz8/Jv7+/ud+/v7nfz8/Jv7+/uX+/v7kvv7 - +4r9/f2B/f39ePz8/G78/Pxj/Pz8WPv7+077+/tD+vr6OPn5+S74+Pgk9fX1G/Ly8hTr6+sN4+PjCczM - zAV/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwK/v78E29vbB+Xl - 5Qrt7e0O8vLyE/X19Rn39/cf+Pj4Jvn5+S36+vo1+/v7Pfv7+0b8/PxP/Pz8Wfz8/GL9/f1r+vr6c/v7 - +3r7+/t/+/v7g/v7+4X7+/uF+/v7g/v7+4D7+/t7/Pz8c/39/Wv8/Pxi/Pz8Wfz8/E/7+/tF+/v7PPr6 - +jP5+fkq9/f3IfX19Rry8vIT6+vrDePj4wnMzMwFqqqqAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/fwK/v78E1NTUBuPj4wnq6uoM8PDwEfPz8xX19fUa9/f3IPj4 - +Cb5+fku+vr6Nfv7+z37+/tF+/v7Tfz8/FX8/Pxc/Pz8Yvr6+mf8/Pxq+vr6bPz8/Gz8/Pxq/Pz8Z/z8 - /GL8/Pxc/Pz8Vvv7+077+/tF+/v7Pfr6+jX5+fkt+Pj4Jfb29h709PQY8fHxEuvr6w3j4+MJ1NTUBqqq - qgN/f38CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX9/ - fwK/v78E1NTUBuPj4wnq6uoM7+/vEPLy8hT19fUZ9vb2Hvj4+CX5+fks+vr6M/r6+jr7+/tC+/v7Sfz8 - /E/8/PxU/Pz8Wfz8/Fz8/Pxe/Pz8Xvz8/Fz8/PxZ/Pz8Vfz8/FD8/PxK+/v7Qvr6+jr6+voz+fn5K/j4 - +CT29vYe9PT0GPHx8RLr6+sN4+PjCdvb2we/v78Ef39/AgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// - ///////////////////////4H///////////////////4Af//////////////////wAA//////////// - //////wAAD/////////////////wAAAP////////////////4AAAA////////////////4AAAAH///// - //////////8AAAAAf//////////////+AAAAAD///////////////AAAAAAP//////////////gAAAAA - B//////////////wAAAAAAP/////////////4AAAAAAB/////////////8AAAAAAAP////////////+A - AAAAAAB/////////////AAAAAAAAP////////////gAAAAAAAB////////////wAAAAAAAAP//////// - ///4AAAAAAAAB///////////8AAAAAAAAAP//////////+AAAAAAAAAB//////////+AAAAAAAAAAP// - ////////AAAAAAAAAAB//////////gAAAAAAAAAAP/////////gAAAAAAAAAAB/////////wAAAAAAAA - AAAP////////4AAAAAAAAAAAB////////8AAAAAAAAAAAAP///////+AAAAAAAAAAAAB////////AAAA - AAAAAAAAAP///////gAAAAAAAAAAAAB///////wAAAAAAAAAAAAAf//////4AAAAAAAAAAAAAD////// - 8AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAD//////AAAAAAAAAAAAAAAf/////gAAAAAAAAAAAAAAH - /////wAAAAAAAAAAAAAAA/////8AAAAAAAAAAAAAAAH////+AAAAAAAAAAAAAAAA/////AAAAAAAAAAA - AAAAAH////wAAAAAAAAAAAAAAAA////8AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAA////gAAAAA - AAAAAAAAAAAH///wAAAAAAAAAAAAAAAAA///8AAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAA//+A - AAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAA - AD/4AAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAA - AAAAAAAf4AAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwAAAAAAA - AAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAB4AA - AAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAA - AA/AAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA - AAAAAAAf8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAB/+AAAAAAA - AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAB//8A - AAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA - H///8AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAB////8AAAAAAAAAAAAAAAA/////gAAAAAAAAAA - AAAAAf////8AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAH//////gAAAA - AAAAAAAAAD//////8AAAAAAAAAAAAAB///////gAAAAAAAAAAAAA///////8AAAAAAAAAAAAAf////// - /wAAAAAAAAAAAAP///////+AAAAAAAAAAAAD////////wAAAAAAAAAAAB/////////AAAAAAAAAAAA// - ///////4AAAAAAAAAAAf/////////AAAAAAAAAAAP/////////4AAAAAAAAAAH/////////+AAAAAAAA - AAD//////////wAAAAAAAAAB//////////+AAAAAAAAAA///////////wAAAAAAAAAf//////////8AA - AAAAAAAP///////////gAAAAAAAAH///////////8AAAAAAAAD////////////gAAAAAAAB///////// - ///8AAAAAAAA/////////////gAAAAAAAf////////////8AAAAAAAf/////////////gAAAAAAP//// - /////////8AAAAAAP//////////////gAAAAAP//////////////8AAAAAH///////////////gAAAAD - ///////////////8AAAAB////////////////gAAAA////////////////+AAAAf//////////////// - 4AAAP/////////////////gAAH/////////////////+AAH//////////////////4AH//////////// - ///////4P////////////////////////////////////////////////////w== - - - \ No newline at end of file diff --git a/tools/GSDumpGUI/GSDumpGUI.csproj b/tools/GSDumpGUI/GSDumpGUI.csproj deleted file mode 100644 index 9554cc03ca..0000000000 --- a/tools/GSDumpGUI/GSDumpGUI.csproj +++ /dev/null @@ -1,164 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {825E4311-652D-4A1E-8AA1-F6D81B186E33} - WinExe - Properties - GSDumpGUI - GSDumpGUI - v4.0 - 512 - Resources\AppIcon.ico - - - - - 3.5 - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x64 - 6 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - 6 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - - - Form - - - frmMain.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - frmMain.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - \ No newline at end of file diff --git a/tools/GSDumpGUI/GSDumpGUI.sln b/tools/GSDumpGUI/GSDumpGUI.sln deleted file mode 100644 index 244e2cd59d..0000000000 --- a/tools/GSDumpGUI/GSDumpGUI.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GSDumpGUI", "GSDumpGUI.csproj", "{825E4311-652D-4A1E-8AA1-F6D81B186E33}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Debug|x64.ActiveCfg = Debug|x64 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Debug|x64.Build.0 = Debug|x64 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Debug|x86.ActiveCfg = Debug|x86 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Debug|x86.Build.0 = Debug|x86 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Release|x64.ActiveCfg = Release|x64 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Release|x64.Build.0 = Release|x64 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Release|x86.ActiveCfg = Release|x86 - {825E4311-652D-4A1E-8AA1-F6D81B186E33}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {19DB287E-B866-4E97-B0AE-95CF54B00134} - EndGlobalSection -EndGlobal diff --git a/tools/GSDumpGUI/Library/GSDXWrapper.cs b/tools/GSDumpGUI/Library/GSDXWrapper.cs deleted file mode 100644 index b837c38d84..0000000000 --- a/tools/GSDumpGUI/Library/GSDXWrapper.cs +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.IO; -using TCPLibrary.MessageBased.Core; -using System.Threading; - -namespace GSDumpGUI -{ - public delegate void GSgifTransfer(IntPtr data, int size); - public delegate void GSgifTransfer1(IntPtr data, int size); - public delegate void GSgifTransfer2(IntPtr data, int size); - public delegate void GSgifTransfer3(IntPtr data, int size); - public delegate void GSVSync(byte field); - public delegate void GSreset(); - public delegate void GSreadFIFO2(IntPtr data, int size); - public delegate void GSsetGameCRC(int crc, int options); - public delegate int GSfreeze(int mode, IntPtr data); - public delegate int GSopen(IntPtr hwnd, String Title, int renderer); - public delegate void GSclose(); - public delegate void GSshutdown(); - public delegate void GSConfigure(); - public delegate void GSsetBaseMem(IntPtr data); - public delegate IntPtr PS2EgetLibName(); - public delegate void GSinit(); - public delegate UInt32 GSmakeSnapshot(string path); - - public class InvalidGSPlugin : Exception - { - public InvalidGSPlugin(string reason) : base(reason) {} - } - - public class GSDXWrapper - { - static public bool DumpTooOld = false; - - private GSConfigure gsConfigure; - private PS2EgetLibName Ps2egetLibName; - private GSgifTransfer GSgifTransfer; - private GSgifTransfer1 GSgifTransfer1; - private GSgifTransfer2 GSgifTransfer2; - private GSgifTransfer3 GSgifTransfer3; - private GSVSync GSVSync; - private GSreadFIFO2 GSreadFIFO2; - private GSsetGameCRC GSsetGameCRC; - private GSfreeze GSfreeze; - private GSopen GSopen; - private GSclose GSclose; - private GSshutdown GSshutdown; - private GSsetBaseMem GSsetBaseMem; - private GSinit GSinit; - private GSreset GSreset; - private GSmakeSnapshot GSmakeSnapshot; - private Boolean Loaded; - - private String DLL; - private IntPtr DLLAddr; - - private Boolean Running; - - public Queue QueueMessage; - public Boolean DebugMode; - public GSData CurrentGIFPacket; - public bool ThereIsWork; - public AutoResetEvent ExternalEvent; - public int RunTo; - - public void Load(String DLL) - { - var formerDirectory = Directory.GetCurrentDirectory(); - try - { - this.DLL = DLL; - NativeMethods.SetErrorMode(0x8007); - - if (Loaded) - Unload(); - - string dir = DLL; - dir = Path.GetDirectoryName(dir); - if (dir == null) return; - - Directory.SetCurrentDirectory(dir); - IntPtr hmod = NativeMethods.LoadLibrary(DLL); - if (hmod != IntPtr.Zero) - { - DLLAddr = hmod; - - IntPtr funcaddrLibName = NativeMethods.GetProcAddress(hmod, "PS2EgetLibName"); - IntPtr funcaddrConfig = NativeMethods.GetProcAddress(hmod, "GSconfigure"); - - IntPtr funcaddrGIF = NativeMethods.GetProcAddress(hmod, "GSgifTransfer"); - IntPtr funcaddrGIF1 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer1"); - IntPtr funcaddrGIF2 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer2"); - IntPtr funcaddrGIF3 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer3"); - IntPtr funcaddrVSync = NativeMethods.GetProcAddress(hmod, "GSvsync"); - IntPtr funcaddrSetBaseMem = NativeMethods.GetProcAddress(hmod, "GSsetBaseMem"); - IntPtr funcaddrGSReset = NativeMethods.GetProcAddress(hmod, "GSreset"); - IntPtr funcaddrOpen = NativeMethods.GetProcAddress(hmod, "GSopen"); - IntPtr funcaddrSetCRC = NativeMethods.GetProcAddress(hmod, "GSsetGameCRC"); - IntPtr funcaddrClose = NativeMethods.GetProcAddress(hmod, "GSclose"); - IntPtr funcaddrShutdown = NativeMethods.GetProcAddress(hmod, "GSshutdown"); - IntPtr funcaddrFreeze = NativeMethods.GetProcAddress(hmod, "GSfreeze"); - IntPtr funcaddrGSreadFIFO2 = NativeMethods.GetProcAddress(hmod, "GSreadFIFO2"); - IntPtr funcaddrinit = NativeMethods.GetProcAddress(hmod, "GSinit"); - IntPtr funcmakeSnapshot = NativeMethods.GetProcAddress(hmod, "GSmakeSnapshot"); - - if (!((funcaddrConfig.ToInt64() > 0) && (funcaddrLibName.ToInt64() > 0) && (funcaddrGIF.ToInt64() > 0))) - throw new InvalidGSPlugin(""); - - gsConfigure = (GSConfigure) Marshal.GetDelegateForFunctionPointer(funcaddrConfig, typeof(GSConfigure)); - Ps2egetLibName = (PS2EgetLibName) Marshal.GetDelegateForFunctionPointer(funcaddrLibName, typeof(PS2EgetLibName)); - - this.GSgifTransfer = (GSgifTransfer) Marshal.GetDelegateForFunctionPointer(funcaddrGIF, typeof(GSgifTransfer)); - this.GSgifTransfer1 = (GSgifTransfer1) Marshal.GetDelegateForFunctionPointer(funcaddrGIF1, typeof(GSgifTransfer1)); - this.GSgifTransfer2 = (GSgifTransfer2) Marshal.GetDelegateForFunctionPointer(funcaddrGIF2, typeof(GSgifTransfer2)); - this.GSgifTransfer3 = (GSgifTransfer3) Marshal.GetDelegateForFunctionPointer(funcaddrGIF3, typeof(GSgifTransfer3)); - this.GSVSync = (GSVSync) Marshal.GetDelegateForFunctionPointer(funcaddrVSync, typeof(GSVSync)); - this.GSsetBaseMem = (GSsetBaseMem) Marshal.GetDelegateForFunctionPointer(funcaddrSetBaseMem, typeof(GSsetBaseMem)); - this.GSopen = (GSopen) Marshal.GetDelegateForFunctionPointer(funcaddrOpen, typeof(GSopen)); - this.GSsetGameCRC = (GSsetGameCRC) Marshal.GetDelegateForFunctionPointer(funcaddrSetCRC, typeof(GSsetGameCRC)); - this.GSclose = (GSclose) Marshal.GetDelegateForFunctionPointer(funcaddrClose, typeof(GSclose)); - this.GSshutdown = (GSshutdown) Marshal.GetDelegateForFunctionPointer(funcaddrShutdown, typeof(GSshutdown)); - this.GSfreeze = (GSfreeze) Marshal.GetDelegateForFunctionPointer(funcaddrFreeze, typeof(GSfreeze)); - this.GSreset = (GSreset) Marshal.GetDelegateForFunctionPointer(funcaddrGSReset, typeof(GSreset)); - this.GSreadFIFO2 = (GSreadFIFO2) Marshal.GetDelegateForFunctionPointer(funcaddrGSreadFIFO2, typeof(GSreadFIFO2)); - this.GSinit = (GSinit) Marshal.GetDelegateForFunctionPointer(funcaddrinit, typeof(GSinit)); - this.GSmakeSnapshot = (GSmakeSnapshot)Marshal.GetDelegateForFunctionPointer(funcmakeSnapshot, typeof(GSmakeSnapshot)); - - Loaded = true; - } - - if (!Loaded) - { - Exception lasterror = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); - System.IO.File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "log.txt", DLL + " failed to load. Error " + lasterror.ToString() + Environment.NewLine); - NativeMethods.SetErrorMode(0x0000); - Unload(); - throw new InvalidGSPlugin(lasterror.ToString()); - } - - NativeMethods.SetErrorMode(0x0000); - } - finally - { - Directory.SetCurrentDirectory(formerDirectory); - } - } - - public void Unload() - { - NativeMethods.FreeLibrary(DLLAddr); - Loaded = false; - } - - public void GSConfig() - { - if (!Loaded) - throw new Exception("GSdx is not loaded"); - gsConfigure.Invoke(); - } - - public String PS2EGetLibName() - { - if (!Loaded) - throw new Exception("GSdx is not loaded"); - return Marshal.PtrToStringAnsi(Ps2egetLibName.Invoke()); - } - - public unsafe void Run(GSDump dump, int rendererOverride) - { - QueueMessage = new Queue(); - Running = true; - ExternalEvent = new AutoResetEvent(true); - - GSinit(); - byte[] tempregisters = new byte[8192]; - Array.Copy(dump.Registers, tempregisters, 8192); - fixed (byte* pointer = tempregisters) - { - GSsetBaseMem(new IntPtr(pointer)); - IntPtr hWnd = IntPtr.Zero; - - if (GSopen(new IntPtr(&hWnd), "", rendererOverride) != 0) - return; - - GSsetGameCRC(dump.CRC, 0); - - NativeMethods.SetClassLong(hWnd,/*GCL_HICON*/ -14, Program.hMainIcon); - - fixed (byte* freeze = dump.StateData) - { - byte[] GSFreez; - - if (Environment.Is64BitProcess) - { - GSFreez = new byte[16]; - Array.Copy(BitConverter.GetBytes((Int64)dump.StateData.Length), 0, GSFreez, 0, 8); - Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt64()), 0, GSFreez, 8, 8); - } - else - { - GSFreez = new byte[8]; - Array.Copy(BitConverter.GetBytes((Int32)dump.StateData.Length), 0, GSFreez, 0, 4); - Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt32()), 0, GSFreez, 4, 4); - } - - fixed (byte* fr = GSFreez) - { - int ris = GSfreeze(0, new IntPtr(fr)); - if (ris == -1) - { - DumpTooOld = true; - Running = false; - } - GSVSync(1); - - GSreset(); - Marshal.Copy(dump.Registers, 0, new IntPtr(pointer), 8192); - GSsetBaseMem(new IntPtr(pointer)); - GSfreeze(0, new IntPtr(fr)); - - GSData gsd_vsync = new GSData(); - gsd_vsync.id = GSType.VSync; - - int gs_idx = 0; - int debug_idx = 0; - NativeMessage msg; - - while (Running) - { - while (NativeMethods.PeekMessage(out msg, hWnd, 0, 0, 1)) // PM_REMOVE - { - NativeMethods.TranslateMessage(ref msg); - NativeMethods.DispatchMessage(ref msg); - - if(msg.msg == 0x0100) // WM_KEYDOWN - { - switch(msg.wParam.ToInt32() & 0xFF) - { - case 0x1B: Running = false; break; // VK_ESCAPE; - case 0x77: GSmakeSnapshot(""); break; // VK_F8; - } - } - } - - if (!Running || !NativeMethods.IsWindowVisible(hWnd)) - break; - - if (DebugMode) - { - if (QueueMessage.Count > 0) - { - TCPMessage Mess = QueueMessage.Dequeue(); - switch (Mess.MessageType) - { - case MessageType.Step: - if (debug_idx >= dump.Data.Count) - debug_idx = 0; - RunTo = debug_idx; - break; - case MessageType.RunToCursor: - RunTo = (int)Mess.Parameters[0]; - if(debug_idx > RunTo) - debug_idx = 0; - break; - case MessageType.RunToNextVSync: - if (debug_idx >= dump.Data.Count) - debug_idx = 1; - RunTo = dump.Data.FindIndex(debug_idx, a => a.id == GSType.VSync); - break; - default: - break; - } - } - - if (debug_idx <= RunTo) - { - while (debug_idx <= RunTo) - { - GSData itm = dump.Data[debug_idx]; - CurrentGIFPacket = itm; - Step(itm, pointer); - debug_idx++; - } - - int idxnextReg = dump.Data.FindIndex(debug_idx, a => a.id == GSType.Registers); - if (idxnextReg != -1) - Step(dump.Data[idxnextReg], pointer); - - TCPMessage Msg = new TCPMessage(); - Msg.MessageType = MessageType.RunToCursor; - Msg.Parameters.Add(debug_idx - 1); - Program.Client.Send(Msg); - - ExternalEvent.Set(); - } - - Step(gsd_vsync, pointer); - } - else - { - while (gs_idx < dump.Data.Count) - { - GSData itm = dump.Data[gs_idx++]; - CurrentGIFPacket = itm; - Step(itm, pointer); - - if (gs_idx < dump.Data.Count && dump.Data[gs_idx].id == GSType.VSync) - break; - } - - if (gs_idx >= dump.Data.Count) gs_idx = 0; - } - } - - GSclose(); - GSshutdown(); - } - } - } - } - - private unsafe void Step(GSData itm, byte* registers) - { - /*"C:\Users\Alessio\Desktop\Plugins\Dll\GSdx-SSE4.dll" "C:\Users\Alessio\Desktop\Plugins\Dumps\gsdx_20101222215004.gs" "GSReplay" 0*/ - switch (itm.id) - { - case GSType.Transfer: - switch (((GSTransfer)itm).Path) - { - case GSTransferPath.Path1Old: - byte[] data = new byte[16384]; - int addr = 16384 - itm.data.Length; - Array.Copy(itm.data, 0, data, addr, itm.data.Length); - fixed (byte* gifdata = data) - { - GSgifTransfer1(new IntPtr(gifdata), addr); - } - break; - case GSTransferPath.Path2: - fixed (byte* gifdata = itm.data) - { - GSgifTransfer2(new IntPtr(gifdata), (itm.data.Length) / 16); - } - break; - case GSTransferPath.Path3: - fixed (byte* gifdata = itm.data) - { - GSgifTransfer3(new IntPtr(gifdata), (itm.data.Length) / 16); - } - break; - case GSTransferPath.Path1New: - fixed (byte* gifdata = itm.data) - { - GSgifTransfer(new IntPtr(gifdata), (itm.data.Length) / 16); - } - break; - } - break; - case GSType.VSync: - GSVSync((*((int*)(registers + 4096)) & 0x2000) > 0 ? (byte)1 : (byte)0); - break; - case GSType.ReadFIFO2: - fixed (byte* FIFO = itm.data) - { - byte[] arrnew = new byte[*((int*)FIFO)]; - fixed (byte* arrn = arrnew) - { - GSreadFIFO2(new IntPtr(arrn), *((int*)FIFO)); - } - } - break; - case GSType.Registers: - Marshal.Copy(itm.data, 0, new IntPtr(registers), 8192); - break; - default: - break; - } - } - - public void Stop() - { - Running = false; - } - - internal List GetGifPackets(GSDump dump) - { - List Data = new List(); - for (int i = 0; i < dump.Data.Count; i++) - { - String act = i.ToString() + "|"; - act += dump.Data[i].id.ToString() + "|"; - if (dump.Data[i].GetType().IsSubclassOf(typeof(GSData))) - { - act += ((GSTransfer)dump.Data[i]).Path.ToString() + "|"; - act += ((GSTransfer)dump.Data[i]).data.Length; - } - else - { - act += ((GSData)dump.Data[i]).data.Length; - } - Data.Add(act); - } - return Data; - } - - internal object GetGifPacketInfo(GSDump dump, int i) - { - if (dump.Data[i].id == GSType.Transfer) - { - try - { - GIFTag val = GIFTag.ExtractGifTag(dump.Data[i].data, ((GSTransfer)dump.Data[i]).Path); - return val; - } - catch (Exception) - { - return new GIFTag(); - } - } - else - { - switch (dump.Data[i].id) - { - case GSType.VSync: - return dump.Data[i].data.Length + "|Field = " + dump.Data[i].data[0].ToString(); - case GSType.ReadFIFO2: - return dump.Data[i].data.Length + "|ReadFIFO2 : Size = " + BitConverter.ToInt32(dump.Data[i].data, 0).ToString() + " byte"; - case GSType.Registers: - return dump.Data[i].data.Length + "|Registers"; - default: - return ""; - } - } - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFPrim.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFPrim.cs deleted file mode 100644 index 01522151d4..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFPrim.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFPrim : GIFUtil - { - public GS_PRIM PrimitiveType; - public GSIIP IIP; - public bool TME; - public bool FGE; - public bool ABE; - public bool AA1; - public GSFST FST; - public GSCTXT CTXT; - public GSFIX FIX; - - static internal GIFPrim ExtractGIFPrim(UInt32 LowData) - { - GIFPrim pr = new GIFPrim(); - pr.PrimitiveType = (GS_PRIM)GetBit(LowData, 0, 3); - pr.IIP = (GSIIP)GetBit(LowData, 3, 1); - pr.TME = Convert.ToBoolean(GetBit(LowData, 4, 1)); - pr.FGE = Convert.ToBoolean(GetBit(LowData, 5, 1)); - pr.ABE = Convert.ToBoolean(GetBit(LowData, 6, 1)); - pr.AA1 = Convert.ToBoolean(GetBit(LowData, 7, 1)); - pr.FST = (GSFST)(GetBit(LowData, 8, 1)); - pr.CTXT = (GSCTXT)(GetBit(LowData, 9, 1)); - pr.FIX = (GSFIX)(GetBit(LowData, 10, 1)); - return pr; - } - - public override string ToString() - { - return "Primitive Type : " + PrimitiveType.ToString() + "@IIP : " + IIP.ToString() + "@TME : " + TME.ToString() + "@FGE : " + FGE.ToString() - + "@ABE : " + ABE.ToString() + "@AA1 : " + AA1.ToString() + "@FST : " + FST.ToString() + "@CTXT : " + CTXT.ToString() + "@FIX : " + FIX.ToString(); - } - } - - public enum GS_PRIM - { - GS_POINTLIST = 0, - GS_LINELIST = 1, - GS_LINESTRIP = 2, - GS_TRIANGLELIST = 3, - GS_TRIANGLESTRIP = 4, - GS_TRIANGLEFAN = 5, - GS_SPRITE = 6, - GS_INVALID = 7, - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFReg.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFReg.cs deleted file mode 100644 index e7475ed6ac..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFReg.cs +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - abstract public class GIFReg : GIFUtil, IGifData - { - public GIFRegDescriptor Descriptor; - public UInt64 LowData, HighData; - public bool PackedFormat; - - private GIFReg() { } - - public GIFReg(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - this.LowData = LowData; - this.HighData = HighData; - this.PackedFormat = PackedFormat; - } - - abstract public new String ToString(); - } - - public enum GIFRegDescriptor - { - PRIM = 0x00, - RGBAQ = 0x01, - ST = 0x02, - UV = 0x03, - XYZF2 = 0x04, - XYZ2 = 0x05, - TEX0_1 = 0x06, - TEX0_2 = 0x07, - CLAMP_1 = 0x08, - CLAMP_2 = 0x09, - FOG = 0x0a, - XYZF3 = 0x0c, - XYZ3 = 0x0d, - AD = 0x0e, - NOP = 0x0f, // actually, 0xf is the standard GIF NOP and 0x7f is the standard GS NOP, but all unregistered addresses act as NOPs... probably - TEX1_1 = 0x14, - TEX1_2 = 0x15, - TEX2_1 = 0x16, - TEX2_2 = 0x17, - XYOFFSET_1 = 0x18, - XYOFFSET_2 = 0x19, - PRMODECONT = 0x1a, - PRMODE = 0x1b, - TEXCLUT = 0x1c, - SCANMSK = 0x22, - MIPTBP1_1 = 0x34, - MIPTBP1_2 = 0x35, - MIPTBP2_1 = 0x36, - MIPTBP2_2 = 0x37, - TEXA = 0x3b, - FOGCOL = 0x3d, - TEXFLUSH = 0x3f, - SCISSOR_1 = 0x40, - SCISSOR_2 = 0x41, - ALPHA_1 = 0x42, - ALPHA_2 = 0x43, - DIMX = 0x44, - DTHE = 0x45, - COLCLAMP = 0x46, - TEST_1 = 0x47, - TEST_2 = 0x48, - PABE = 0x49, - FBA_1 = 0x4a, - FBA_2 = 0x4b, - FRAME_1 = 0x4c, - FRAME_2 = 0x4d, - ZBUF_1 = 0x4e, - ZBUF_2 = 0x4f, - BITBLTBUF = 0x50, - TRXPOS = 0x51, - TRXREG = 0x52, - TRXDIR = 0x53, - HWREG = 0x54, - SIGNAL = 0x60, - FINISH = 0x61, - LABEL = 0x62, - } - -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegAD.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegAD.cs deleted file mode 100644 index 3fba02f08e..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegAD.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public static class GIFRegAD - { - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - byte reg = (byte)GIFReg.GetBit(HighData, 0, 8); - if (reg == (byte)GIFRegDescriptor.AD) - return GIFRegNOP.Unpack(tag, reg, LowData, HighData, PackedFormat); - return GIFTag.GetUnpack(reg)(tag, reg, LowData, HighData, false); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegFOG.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegFOG.cs deleted file mode 100644 index f5b7486649..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegFOG.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegFOG : GIFReg - { - public double F; - - public GIFRegFOG(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegFOG u = new GIFRegFOG(addr, LowData, HighData, PackedFormat); - u.Descriptor = (GIFRegDescriptor)addr; - if (PackedFormat) - u.F = (UInt16)(GetBit(HighData, 36, 8)); - else - u.F = GetBit(LowData, 56, 8); - return u; - } - - public override string ToString() - { - return Descriptor.ToString() + "@F : " + F.ToString(); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegNOP.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegNOP.cs deleted file mode 100644 index f87c56089a..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegNOP.cs +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegNOP : GIFReg - { - public byte addr; - - public GIFRegNOP(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegNOP nop = new GIFRegNOP(addr, LowData, HighData, PackedFormat); - nop.Descriptor = GIFRegDescriptor.NOP; - - return nop; - } - - public override string ToString() - { - return Descriptor.ToString() + " (0x" + addr.ToString("X2") + ")"; - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegPrim.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegPrim.cs deleted file mode 100644 index 5de01aa2e6..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegPrim.cs +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegPRIM : GIFReg - { - public GS_PRIM PrimitiveType; - public GSIIP IIP; - public bool TME; - public bool FGE; - public bool ABE; - public bool AA1; - public GSFST FST; - public GSCTXT CTXT; - public GSFIX FIX; - - public GIFRegPRIM(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegPRIM pr = new GIFRegPRIM(addr, LowData, HighData, PackedFormat); - pr.Descriptor = (GIFRegDescriptor)addr; - pr.PrimitiveType = (GS_PRIM)GetBit(LowData, 0, 3); - pr.IIP = (GSIIP)GetBit(LowData, 3, 1); - pr.TME = Convert.ToBoolean(GetBit(LowData, 4, 1)); - pr.FGE = Convert.ToBoolean(GetBit(LowData, 5, 1)); - pr.ABE = Convert.ToBoolean(GetBit(LowData, 6, 1)); - pr.AA1 = Convert.ToBoolean(GetBit(LowData, 7, 1)); - pr.FST = (GSFST)(GetBit(LowData, 8, 1)); - pr.CTXT = (GSCTXT)(GetBit(LowData, 9, 1)); - pr.FIX = (GSFIX)(GetBit(LowData, 10, 1)); - return pr; - } - - public override string ToString() - { - return Descriptor.ToString() + "@Primitive Type : " + PrimitiveType.ToString() + "@IIP : " + IIP.ToString() + "@TME : " + TME.ToString() + "@FGE : " + FGE.ToString() - + "@ABE : " + ABE.ToString() + "@AA1 : " + AA1.ToString() + "@FST : " + FST.ToString() + "@CTXT : " + CTXT.ToString() + "@FIX : " + FIX.ToString(); - } - } - - public enum GSIIP - { - FlatShading=0, - Gouraud=1 - } - - public enum GSFST - { - STQValue=0, - UVValue=1 - } - - public enum GSCTXT - { - Context1 =0, - Context2 =1 - } - - public enum GSFIX - { - Unfixed =0, - Fixed = 1 - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegRGBAQ.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegRGBAQ.cs deleted file mode 100644 index 8f4fa5fad5..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegRGBAQ.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegRGBAQ : GIFReg - { - public byte R; - public byte G; - public byte B; - public byte A; - public float Q; - - public GIFRegRGBAQ(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegRGBAQ r = new GIFRegRGBAQ(addr, LowData, HighData, PackedFormat); - r.Descriptor = (GIFRegDescriptor)addr; - if (PackedFormat) - { - r.R = (byte)GetBit(LowData, 0, 8); - r.G = (byte)GetBit(LowData, 32, 8); - r.B = (byte)GetBit(HighData, 0, 8); - r.A = (byte)GetBit(HighData, 32, 8); - r.Q = tag.Q; - } - else - { - r.R = (byte)GetBit(LowData, 0, 8); - r.G = (byte)GetBit(LowData, 8, 8); - r.B = (byte)GetBit(LowData, 16, 8); - r.A = (byte)GetBit(LowData, 24, 8); - r.Q = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 4); - } - return r; - } - - public override string ToString() - { - return Descriptor.ToString() + "@Red : " + R.ToString() + "@Green : " + G.ToString() + "@Blue : " + B.ToString() + "@Alpha : " + A.ToString(); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegST.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegST.cs deleted file mode 100644 index 6acd642451..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegST.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegST : GIFReg - { - public float S; - public float T; - public float Q; - - public bool isSTQ; - - public GIFRegST(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegST st = new GIFRegST(addr, LowData, HighData, PackedFormat); - st.Descriptor = (GIFRegDescriptor)addr; - - st.S = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 0); - st.T = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 4); - if (PackedFormat) - { - st.Q = BitConverter.ToSingle(BitConverter.GetBytes(HighData), 0); - tag.Q = st.Q; - st.isSTQ = true; - } - else - st.isSTQ = false; - - return st; - } - - public override string ToString() - { - return Descriptor.ToString() + "@S : " + S.ToString("F8") + "@T : " + T.ToString("F8") + (isSTQ ? "@Q : " + Q.ToString("F8") : ""); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegTEX0.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegTEX0.cs deleted file mode 100644 index 6de4908043..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegTEX0.cs +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegTEX0 : GIFReg - { - public ushort TBP0; - public byte TBW; - public TEXPSM PSM; - public byte TW; - public byte TH; - public TEXTCC TCC; - public TEXTFX TFX; - public ushort CBP; - public TEXCPSM CPSM; - public TEXCSM CSM; - public byte CSA; - public byte CLD; - - public GIFRegTEX0(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegTEX0 tex0 = new GIFRegTEX0(addr, LowData, HighData, PackedFormat); - tex0.Descriptor = (GIFRegDescriptor)addr; - tex0.TBP0 = (ushort)GetBit(LowData, 0, 14); - tex0.TBW = (byte)GetBit(LowData, 14, 6); - tex0.PSM = (TEXPSM)GetBit(LowData, 20, 6); - tex0.TW = (byte)GetBit(LowData, 26, 4); - tex0.TH = (byte)GetBit(LowData, 30, 4); - tex0.TCC = (TEXTCC)GetBit(LowData, 34, 1); - tex0.TFX = (TEXTFX)GetBit(LowData, 35, 2); - tex0.CBP = (ushort)GetBit(LowData, 37, 14); - tex0.CPSM = (TEXCPSM)GetBit(LowData, 51, 4); - tex0.CSM = (TEXCSM)GetBit(LowData, 55, 1); - tex0.CSA = (byte)GetBit(LowData, 56, 5); - tex0.CLD = (byte)GetBit(LowData, 61, 3); - return tex0; - } - - public override string ToString() - { - return Descriptor.ToString() + "@TBP0 : " + TBP0.ToString() + "@TBW : " + TBW.ToString() + "@PSM : " + PSM.ToString() + "@TW : " + TW.ToString() + "@TH : " + TH.ToString() - + "@TCC : " + TCC.ToString() + "@TFX : " + TFX.ToString() + "@CBP : " + CBP.ToString() + "@CPSM : " + CPSM.ToString() + "@CSM : " + CSM.ToString() - + "@CSA : " + CSA.ToString() + "@CLD : " + CLD.ToString(); - } - } - - public enum TEXPSM - { - PSMCT32 = 0, - PSMCT24 = 1, - PSMCT16 = 2, - PSMCT16S = 10, - PSMT8 = 19, - PSMT4 = 20, - PSMT8H = 27, - PSMT4HL = 36, - PSMT4HH = 44, - PSMZ32 = 48, - PSMZ24 = 49, - PSMZ16 = 50, - PSMZ16S = 58 - } - - public enum TEXTCC - { - RGB = 0, - RGBA = 1 - } - - public enum TEXTFX - { - MODULATE = 0, - DECAL = 1, - HIGHLIGHT = 2, - HIGHLIGHT2 = 3 - } - - public enum TEXCPSM - { - PSMCT32 = 0, - PSMCT16 = 2, - PSMCT16S = 10 - } - - public enum TEXCSM - { - CSM1 = 0, - CSM2 = 1 - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUV.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUV.cs deleted file mode 100644 index a5539b862e..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUV.cs +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegUV : GIFReg - { - public double U; - public double V; - - public GIFRegUV(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegUV uv = new GIFRegUV(addr, LowData, HighData, PackedFormat); - uv.Descriptor = (GIFRegDescriptor)addr; - if (PackedFormat) - { - uv.U = GetBit(LowData, 0, 14) / 16d; - uv.V = GetBit(LowData, 32, 14) / 16d; - } - else - { - uv.U = GetBit(LowData, 0, 14) / 16d; - uv.V = GetBit(LowData, 16, 14) / 16d; - } - return uv; - } - - public override string ToString() - { - return Descriptor.ToString() + "@U : " + U.ToString("F4") + "@V : " + V.ToString("F4"); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUnimpl.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUnimpl.cs deleted file mode 100644 index c1da47c6f8..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegUnimpl.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegUnimpl : GIFReg - { - public GIFRegUnimpl(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegUnimpl u = new GIFRegUnimpl(addr, LowData, HighData, PackedFormat); - u.Descriptor = (GIFRegDescriptor)addr; - return u; - } - - public override string ToString() - { - return Descriptor.ToString(); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegXYZF.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegXYZF.cs deleted file mode 100644 index b6b0f22635..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GIFRegXYZF.cs +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFRegXYZF : GIFReg - { - public double X; - public double Y; - public UInt32 Z; - public UInt16 F; - - public bool IsXYZF; - - public GIFRegXYZF(byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) : base(addr, LowData, HighData, PackedFormat) { } - - static public GIFReg UnpackXYZ(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegXYZF xyzf = new GIFRegXYZF(addr, LowData, HighData, PackedFormat); - - xyzf.IsXYZF = false; - if (PackedFormat && addr == (int)GIFRegDescriptor.XYZ2 && GetBit(HighData, 47, 1) == 1) - xyzf.Descriptor = GIFRegDescriptor.XYZ3; - else - xyzf.Descriptor = (GIFRegDescriptor)addr; - - if (PackedFormat) - { - xyzf.X = GetBit(LowData, 0, 16) / 16d; - xyzf.Y = GetBit(LowData, 32, 16) / 16d; - xyzf.Z = (UInt32)(GetBit(HighData, 0, 32)); - } - else - { - xyzf.X = GetBit(LowData, 0, 16) / 16d; - xyzf.Y = GetBit(LowData, 16, 16) / 16d; - xyzf.Z = (UInt32)(GetBit(LowData, 32, 32)); - } - return xyzf; - } - - static public GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat) - { - GIFRegXYZF xyzf = new GIFRegXYZF(addr, LowData, HighData, PackedFormat); - - xyzf.IsXYZF = true; - if (PackedFormat && addr == (int)GIFRegDescriptor.XYZF2 && GetBit(HighData, 47, 1) == 1) - xyzf.Descriptor = GIFRegDescriptor.XYZF3; - else - xyzf.Descriptor = (GIFRegDescriptor)addr; - - if (PackedFormat) - { - xyzf.X = GetBit(LowData, 0, 16) / 16d; - xyzf.Y = GetBit(LowData, 32, 16) / 16d; - xyzf.Z = (UInt32)(GetBit(HighData, 4, 24)); - xyzf.F = (UInt16)(GetBit(HighData, 36, 8)); - } - else - { - xyzf.X = GetBit(LowData, 0, 16) / 16d; - xyzf.Y = GetBit(LowData, 16, 16) / 16d; - xyzf.Z = (UInt32)(GetBit(LowData, 32, 24)); - xyzf.F = (UInt16)(GetBit(LowData, 56, 8)); - } - return xyzf; - } - - public override string ToString() - { - return Descriptor.ToString() + "@X : " + X.ToString("F4") + "@Y : " + Y.ToString("F4") + "@Z : " + Z.ToString() + (IsXYZF ? "@F : " + F.ToString() : ""); - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GifImage.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GifImage.cs deleted file mode 100644 index c69970ee4f..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/GifImage.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GifImage : IGifData - { - public byte[] Data; - - public override string ToString() - { - return "IMAGE@" + Data.Length.ToString() + " bytes"; - } - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/IGifData.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/IGifData.cs deleted file mode 100644 index 6659a95c58..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFReg/IGifData.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - public interface IGifData - { - String ToString(); - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFTag.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFTag.cs deleted file mode 100644 index 8141e19119..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFTag.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFTag : GIFUtil - { - public delegate GIFReg Unpack(GIFTag tag, byte addr, UInt64 LowData, UInt64 HighData, bool PackedFormat); - static public Dictionary UnpackReg; - - private UInt64 TAG, REGS; - internal float Q; // GIF has an internal Q register which is reset to 1.0 at the tag and updated on packed ST(Q) for output at next RGBAQ - - public GSTransferPath path; - public UInt32 nloop; - public UInt32 eop; - public UInt32 pre; - public GIFPrim prim; - public GIFFLG flg; - public UInt32 nreg; - public List regs; - public int size; - - static GIFTag() - { - UnpackReg = new Dictionary(); - UnpackReg.Add((int)GIFRegDescriptor.PRIM, GIFRegPRIM.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.RGBAQ, GIFRegRGBAQ.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.ST, GIFRegST.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.UV, GIFRegUV.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYZF2, GIFRegXYZF.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYZ2, GIFRegXYZF.UnpackXYZ); - UnpackReg.Add((int)GIFRegDescriptor.TEX0_1, GIFRegTEX0.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEX0_2, GIFRegTEX0.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.CLAMP_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.CLAMP_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FOG, GIFRegFOG.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYZF3, GIFRegXYZF.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYZ3, GIFRegXYZF.UnpackXYZ); - UnpackReg.Add((int)GIFRegDescriptor.AD, GIFRegAD.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEX1_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEX1_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEX2_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEX2_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.PRMODECONT, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.PRMODE, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEXCLUT, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.SCANMSK, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEXA, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FOGCOL, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEXFLUSH, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.ALPHA_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.ALPHA_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.DIMX, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.DTHE, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.COLCLAMP, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEST_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TEST_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.PABE, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FBA_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FBA_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FRAME_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FRAME_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.ZBUF_1, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.ZBUF_2, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.BITBLTBUF, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TRXPOS, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TRXREG, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.TRXDIR, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.HWREG, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.SIGNAL, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.FINISH, GIFRegUnimpl.Unpack); - UnpackReg.Add((int)GIFRegDescriptor.LABEL, GIFRegUnimpl.Unpack); - } - - public static Unpack GetUnpack(int reg) - { - Unpack ret; - if (!UnpackReg.TryGetValue(reg, out ret)) - return GIFRegNOP.Unpack; - return ret; - } - - static internal GIFTag ExtractGifTag(byte[] data, GSTransferPath path) - { - GIFTag t = new GIFTag(); - t.size = data.Length; - t.path = path; - t.TAG = BitConverter.ToUInt64(data, 0); - t.REGS = BitConverter.ToUInt64(data, 8); - - t.Q = 1f; - t.nloop = (uint)GetBit(t.TAG, 0, 15); - t.eop = (uint)GetBit(t.TAG, 15, 1); - t.pre = (uint)GetBit(t.TAG, 46, 1); - t.prim = GIFPrim.ExtractGIFPrim((uint)GetBit(t.TAG, 47, 11)); - t.flg = (GIFFLG)GetBit(t.TAG, 58, 2); - t.nreg = (uint)GetBit(t.TAG, 60, 4); - if (t.nreg == 0) - t.nreg = 16; - - byte[] registers = new byte[t.nreg]; - Unpack[] regsunpack = new Unpack[t.nreg]; - - t.regs = new List(); - for (byte i = 0; i < t.nreg; i++) - { - byte reg = (byte)GetBit(t.REGS, i * 4, 4); - registers[i] = reg; - regsunpack[i] = GetUnpack(reg); - } - - int p = 16; - switch (t.flg) - { - case GIFFLG.GIF_FLG_PACKED: - for (int j = 0; j < t.nloop; j++) - for (int i = 0; i < t.nreg; i++) - { - UInt64 LowData = BitConverter.ToUInt64(data, p); - UInt64 HighData = BitConverter.ToUInt64(data, p + 8); - t.regs.Add(regsunpack[i](t, registers[i], LowData, HighData, true)); - p += 16; - } - break; - case GIFFLG.GIF_FLG_REGLIST: - for (int j = 0; j < t.nloop; j++) - for (int i = 0; i < t.nreg; i++) - { - UInt64 Data = BitConverter.ToUInt64(data, p); - t.regs.Add(regsunpack[i](t, registers[i], Data, 0, false)); - p += 8; - } - break; - case GIFFLG.GIF_FLG_IMAGE: - case GIFFLG.GIF_FLG_IMAGE2: - GifImage image = new GifImage(); - image.Data = new byte[t.nloop * 16]; - try - { - Array.Copy(data, 16, image.Data, 0, t.nloop * 16); - } - catch (ArgumentException) { } - t.regs.Add(image); - break; - default: - break; - } - return t; - } - } - - public enum GIFFLG - { - GIF_FLG_PACKED =0, - GIF_FLG_REGLIST =1, - GIF_FLG_IMAGE = 2, - GIF_FLG_IMAGE2 = 3 - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GIFUtil.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GIFUtil.cs deleted file mode 100644 index bea06b53d3..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GIFUtil.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; - -namespace GSDumpGUI -{ - [Serializable] - public class GIFUtil - { - public static UInt64 GetBit(UInt64 value, int lower, int count) - { - return (value >> lower) & (ulong)((1ul << count) - 1); - } - } -} \ No newline at end of file diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GSData.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GSData.cs deleted file mode 100644 index c517e065f0..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GSData.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - public class GSData - { - public GSType id; - public byte[] data; - } - - public enum GSType - { - Transfer = 0, - VSync = 1, - ReadFIFO2 = 2, - Registers = 3 - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSData/GSTransfer.cs b/tools/GSDumpGUI/Library/GSDump/GSData/GSTransfer.cs deleted file mode 100644 index ed28b50068..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSData/GSTransfer.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace GSDumpGUI -{ - public class GSTransfer : GSData - { - public GSTransferPath Path; - } - - public enum GSTransferPath - { - Path1Old = 0, - Path2 = 1, - Path3 = 2, - Path1New = 3 - } -} diff --git a/tools/GSDumpGUI/Library/GSDump/GSDump.cs b/tools/GSDumpGUI/Library/GSDump/GSDump.cs deleted file mode 100644 index 142584670a..0000000000 --- a/tools/GSDumpGUI/Library/GSDump/GSDump.cs +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace GSDumpGUI -{ - public class GSDump - { - public Int32 CRC; - public byte[] GSFreeze; - public byte[] StateData; - public byte[] Registers; // 8192 bytes - - public int Size - { - get - { - int size = 0; - size = 4; - size += StateData.Length; - size += Registers.Length; - foreach (var itm in Data) - { - size += itm.data.Length; - } - return size; - } - } - - public List Data; - - public GSDump() - { - Data = new List(); - } - - public GSDump Clone() - { - GSDump newDump = new GSDump(); - newDump.CRC = this.CRC; - - byte[] state = new byte[StateData.Length]; - Array.Copy(StateData,state, StateData.Length); - newDump.StateData = state; - - newDump.Registers = new byte[8192]; - Array.Copy(this.Registers, newDump.Registers, 8192); - - foreach (var itm in this.Data) - { - if (itm.GetType().IsInstanceOfType(typeof(GSTransfer))) - { - GSTransfer gt = new GSTransfer(); - gt.id = itm.id; - gt.Path = ((GSTransfer)itm).Path; - gt.data = new byte[itm.data.Length]; - Array.Copy(itm.data, gt.data, itm.data.Length); - newDump.Data.Add(gt); - } - else - { - GSData gt = new GSData(); - gt.id = itm.id; - gt.data = new byte[itm.data.Length]; - Array.Copy(itm.data, gt.data, itm.data.Length); - newDump.Data.Add(gt); - } - } - return newDump; - } - - static public GSDump LoadDump(String FileName) - { - GSDump dmp = new GSDump(); - - BinaryReader br = new BinaryReader(System.IO.File.Open(FileName, FileMode.Open)); - dmp.CRC = br.ReadInt32(); - - Int32 ss = br.ReadInt32(); - dmp.StateData = br.ReadBytes(ss); - - dmp.Registers = br.ReadBytes(8192); - - while (br.PeekChar() != -1) - { - GSType id = (GSType)br.ReadByte(); - switch (id) - { - case GSType.Transfer: - GSTransfer data = new GSTransfer(); - - byte index = br.ReadByte(); - - data.id = id; - data.Path = (GSTransferPath)index; - - Int32 size = br.ReadInt32(); - - List Data = new List(); - Data.AddRange(br.ReadBytes(size)); - data.data = Data.ToArray(); - dmp.Data.Add(data); - break; - case GSType.VSync: - GSData dataV = new GSData(); - dataV.id = id; - dataV.data = br.ReadBytes(1); - dmp.Data.Add(dataV); - break; - case GSType.ReadFIFO2: - GSData dataR = new GSData(); - dataR.id = id; - Int32 sF = br.ReadInt32(); - dataR.data = BitConverter.GetBytes(sF); - dmp.Data.Add(dataR); - break; - case GSType.Registers: - GSData dataRR = new GSData(); - dataRR.id = id; - dataRR.data = br.ReadBytes(8192); - dmp.Data.Add(dataRR); - break; - default: - break; - } - } - br.Close(); - - return dmp; - } - } -} diff --git a/tools/GSDumpGUI/Library/NativeMethods.cs b/tools/GSDumpGUI/Library/NativeMethods.cs deleted file mode 100644 index 4d8e287f92..0000000000 --- a/tools/GSDumpGUI/Library/NativeMethods.cs +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Security; -using System.Runtime.InteropServices; -using System.Drawing; - -namespace GSDumpGUI -{ - static public class NativeMethods - { - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)] - public extern static IntPtr LoadLibrary(string lpLibFileName); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public extern static bool FreeLibrary(IntPtr hLibModule); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] - public extern static IntPtr GetProcAddress(IntPtr hModule, string lpProcName); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32")] - public extern static UInt32 SetErrorMode(UInt32 uMode); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32")] - public extern static UInt32 GetLastError(); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public extern static bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32")] - public extern static UInt16 GetAsyncKeyState(Int32 vKey); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32", CharSet = CharSet.Auto, EntryPoint = "SetClassLong")] - public extern static UInt32 SetClassLong32(IntPtr hWnd, Int32 index, Int32 dwNewLong); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32", CharSet = CharSet.Auto, EntryPoint = "SetClassLongPtr")] - public extern static UIntPtr SetClassLong64(IntPtr hWnd, Int32 index, IntPtr dwNewLong); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32")] - public extern static bool IsWindowVisible(IntPtr hWnd); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32.dll", CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, UInt32 wMsgFilterMin, UInt32 wMsgFilterMax, UInt32 wRemoveMsg); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool TranslateMessage(ref NativeMessage lpMsg); - - [SuppressUnmanagedCodeSecurityAttribute] - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern UInt32 DispatchMessage(ref NativeMessage lpMsg); - - public static UIntPtr SetClassLong(IntPtr hWnd, Int32 index, IntPtr dwNewLong) - { - if (Environment.Is64BitProcess) return SetClassLong64(hWnd, index, dwNewLong); - else return new UIntPtr(SetClassLong32(hWnd, index, dwNewLong.ToInt32())); - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct NativeMessage - { - public IntPtr hWnd; - public uint msg; - public IntPtr wParam; - public IntPtr lParam; - public uint time; - public Point p; - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Base/CancelArgs.cs b/tools/GSDumpGUI/Library/TCPLibrary/Base/CancelArgs.cs deleted file mode 100644 index 28f8710563..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Base/CancelArgs.cs +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace TCPLibrary.Core -{ - /// - /// Class for containing information regarding the acceptance of a determinate situation. - /// - public class CancelArgs - { - /// - /// Whether the operation should be cancelled. - /// - private Boolean _cancel; - /// - /// Get/set the flag that determines if the operation should be cancelled. - /// - public Boolean Cancel - { - get { return _cancel; } - set { _cancel = value; } - } - - /// - /// Base constructor of the class. - /// - /// Whether the operation should be cancelled. - public CancelArgs(Boolean cancel) - { - this._cancel = cancel; - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Base/Client.cs b/tools/GSDumpGUI/Library/TCPLibrary/Base/Client.cs deleted file mode 100644 index 737bbdfff5..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Base/Client.cs +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Net.Sockets; -using System.Net; -using System.Threading; -using System.IO; -using System.ComponentModel; -using System.Text; -using System.Diagnostics; - -namespace TCPLibrary.Core -{ - /// - /// Base TCP client class wrapped around TcpClient. - /// - public class Client - { - /// - /// Lock object to assure that certain operation over the socket class are executed - /// in an exclusive way. - /// - private Object _lock; - - /// - /// Wrapper around the Network Stream of the socket. (Read-Only) - /// - private BinaryReader tr; - /// - /// Wrapper around the Network Stream of the socket. (Write-Only) - /// - private BinaryWriter tw; - /// - /// Address to which the client is connected. - /// - private IPEndPoint _address; - - /// - /// Flag to permit thread exit from the external. - /// - protected Boolean _active; - /// - /// Socket maintaining the connection. - /// - protected TcpClient _socket; - - /// - /// Get/set the address to which the client is connected. - /// - public IPEndPoint Address - { - get { return _address; } - } - - /// - /// Get the state of the connection. - /// - public Boolean Connected - { - get { return _socket != null; } - } - - /// - /// Delegate for the event of receiving/sending a line of data from/to the server. - /// - /// Sender of the event. - /// Line of data received. - public delegate void DataCommunicationHandler(Client sender, Data Data); - /// - /// Occurs when a line of data is received from the server. - /// - public event DataCommunicationHandler OnDataReceived; - /// - /// Occurs before the client send a line of data to the server. - /// - public event DataCommunicationHandler OnBeforeDataSent; - /// - /// Occurs after the client send a line of data to the server. - /// - public event DataCommunicationHandler OnAfterDataSent; - - /// - /// Delegate for the event of connection/disconnection to the server. - /// - /// Sender of the event. - public delegate void ConnectionStateHandler(Client sender); - /// - /// Occurs when the client successfully connect the server. - /// - public event ConnectionStateHandler OnConnected; - /// - /// Occurs when the client is disconnected from the server. - /// - public event ConnectionStateHandler OnDisconnected; - - /// - /// Delegate for the event of connection failed for rejection by the server. - /// - /// Sender of the event. - /// Message of fail sent by the server. - public delegate void ConnectionFailedHandler(Client sender, byte[] Message); - /// - /// Occurs when the client failed to connect to the server because the server rejected the connection. - /// - public event ConnectionFailedHandler OnConnectFailed; - - /// - /// Base constructor of the class. - /// - public Client() - { - _lock = new object(); - _address = null; - } - - /// - /// Try to connect to the server specified. - /// - /// Address of the server to connect. - /// Port of the server to connect. - /// True if the connection is successfull, false otherwise. - /// - /// - public virtual Boolean Connect(String Indirizzo, Int32 Port) - { - if (!Connected) - { - IPHostEntry addr = Dns.GetHostEntry(Indirizzo); - IPAddress ip = null; - - foreach (var itm in addr.AddressList) - { - if (itm.AddressFamily == AddressFamily.InterNetwork) - { - ip = itm; - break; - } - } - - if (ip != null) - { - _address = new IPEndPoint(ip, Port); - _socket = new TcpClient(); - - try - { - _socket.Connect(_address); - } - catch (SocketException) - { - _socket = null; - _address = null; - throw; - } - - tr = new BinaryReader(_socket.GetStream()); - tw = new BinaryWriter(_socket.GetStream()); - - // Receive the confirmation of the status of the connection to the server. - // Is CONNECTEDTCPSERVER if the connection is successfull, all other cases are wrong. - - Int32 Length = Convert.ToInt32(tr.ReadInt32()); - byte[] arr = new byte[Length]; - tr.Read(arr, 0, Length); - ASCIIEncoding ae = new ASCIIEncoding(); - String Accept = ae.GetString(arr, 0, arr.Length); - - if (Accept == "CONNECTEDTCPSERVER") - { - _active = true; - - Thread thd = new Thread(new ThreadStart(MainThread)); - thd.IsBackground = true; - thd.Name = "Client connected to " + Indirizzo + ":" + Port.ToString(); - thd.Start(); - - if (OnConnected != null) - OnConnected(this); - - return true; - } - else - { - Stop(); - if (OnConnectFailed != null) - OnConnectFailed(this, arr); - - return false; - } - } - else - return false; - } - else - throw new ArgumentException("The client is already connected!"); - } - - /// - /// Disconnect a Client if connected. - /// - public virtual void Disconnect() - { - lock (_lock) - { - _active = false; - tr.Close(); - tw.Close(); - } - } - - /// - /// Disconnect a Client if connected. - /// - protected virtual void Stop() - { - if (_socket != null) - { - tr.Close(); - tw.Close(); - _socket.Close(); - - _socket = null; - _address = null; - - if (OnDisconnected != null) - OnDisconnected(this); - } - } - - /// - /// Thread function that actually run the socket work. - /// - private void MainThread() - { - while (_active) - { - byte[] arr = null; - - try - { - int length = Convert.ToInt32(tr.ReadInt32()); - arr = new byte[length]; - int index = 0; - - while (length > 0) - { - - int receivedBytes = tr.Read(arr, index, length); - length -= receivedBytes; - index += receivedBytes; - } - } - catch (Exception) { } - - lock (_lock) - { - if (_active) - { - Boolean Stato = _socket.Client.Poll(100, SelectMode.SelectRead); - if ((arr == null) && (Stato == true)) - break; - else - if (OnDataReceived != null) - OnDataReceived(this, new Data(arr)); - } - else - break; - } - } - Stop(); - } - - /// - /// Send a line of data to the server. - /// - /// Data to send to the server. - /// - public void Send(Data msg) - { - if (_active) - { - if (OnBeforeDataSent != null) - OnBeforeDataSent(this, msg); - try - { - tw.Write(msg.Message.Length); - tw.Write(msg.Message); - tw.Flush(); - - if (OnAfterDataSent != null) - OnAfterDataSent(this, msg); - } - catch (IOException) - { - // Pensare a cosa fare quà. Questo è il caso in cui il server ha chiuso forzatamente - // la connessione mentre il client mandava roba. - } - } - else - throw new ArgumentException("The link is closed. Unable to send data."); - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Base/ClientS.cs b/tools/GSDumpGUI/Library/TCPLibrary/Base/ClientS.cs deleted file mode 100644 index c93c770376..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Base/ClientS.cs +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Net.Sockets; -using System.Threading; -using System.IO; -using System.Diagnostics; - -namespace TCPLibrary.Core -{ - /// - /// Base class that manages the single connection between a client and the server. - /// - public class ClientS - { - /// - /// Lock object to assure that certain operation over the socket class are executed - /// in an exclusive way. - /// - private Object _lock; - - /// - /// Wrapper around the Network Stream of the socket. (Read-Only) - /// - private BinaryReader tr; - /// - /// Wrapper around the Network Stream of the socket. (Write-Only) - /// - private BinaryWriter tw; - /// - /// Current IP address of the client. - /// - private String _ipaddress; - - /// - /// Flag to permit thread exit from the external. - /// - protected Boolean _active; - /// - /// Link to the server to which this client is connected. - /// - protected Server _server; - /// - /// Actual socket of the client. - /// - protected TcpClient _client; - - /// - /// Get the state of the connection. - /// - public Boolean Connected - { - get { return _client != null; } - } - - /// - /// IP Address of the client. - /// - public String IPAddress - { - get { return _ipaddress; } - } - - /// - /// Base class constructor. - /// - /// Server to which this client is linked to. - /// Socket of the client. - protected internal ClientS(Server server, TcpClient client) - { - _lock = new object(); - - _active = true; - _server = server; - _client = client; - _ipaddress = _client.Client.RemoteEndPoint.ToString(); - - NetworkStream ns = _client.GetStream(); - tr = new BinaryReader(ns); - tw = new BinaryWriter(ns); - } - - /// - /// Start up the thread managing this Client-Server connection. - /// - protected internal virtual void Start() - { - Thread _thread = new Thread(new ThreadStart(MainThread)); - _thread.IsBackground = true; - _thread.Name = "Thread Client " + _ipaddress; - _thread.Start(); - } - - /// - /// Thread function that actually run the socket work. - /// - private void MainThread() - { - while (_active) - { - byte[] arr = null; - - try - { - int length = Convert.ToInt32(tr.ReadInt32()); - arr = new byte[length]; - int index = 0; - - while (length > 0) - { - - int receivedBytes = tr.Read(arr, index, length); - length -= receivedBytes; - index += receivedBytes; - } - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); - } - - lock (_lock) - { - if (_active) - { - Boolean Stato = _client.Client.Poll(100, SelectMode.SelectRead); - if ((arr == null) && (Stato == true)) - break; - else - _server.RaiseDataReceivedEvent(this, new Data(arr)); - } - else - break; - } - } - Stop(); - } - - /// - /// Send a line of data to the client. - /// - /// Data to send to the client. - /// - public void Send(Data Data) - { - if (_active) - { - _server.RaiseBeforeDataSentEvent(this, Data); - - try - { - tw.Write(Data.Message.Length); - tw.Write(Data.Message); - tw.Flush(); - - _server.RaiseAfterDataSentEvent(this, Data); - } - catch (Exception ex) - { - Debug.Write(ex.ToString()); - // Pensare a cosa fare quà. Questo è il caso in cui il client ha chiuso forzatamente - // la connessione mentre il server mandava roba. - } - } - else - throw new ArgumentException("The link is closed. Unable to send data."); - } - - /// - /// Close the link between Client e Server. - /// - public void Disconnect() - { - lock (_lock) - { - _active = false; - tr.Close(); - tw.Close(); - } - } - - /// - /// Close the link between Client e Server. - /// - protected internal void Stop() - { - if (_client != null) - { - _server.RaiseClientBeforeDisconnectedEvent(this); - - tr.Close(); - tw.Close(); - - _client.Close(); - _client = null; - - lock (_server.Clients) - { - _server.Clients.Remove(this); - } - - _server.RaiseClientAfterDisconnectedEvent(this); - } - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Base/Data.cs b/tools/GSDumpGUI/Library/TCPLibrary/Base/Data.cs deleted file mode 100644 index 04c352e073..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Base/Data.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace TCPLibrary.Core -{ - /// - /// Structure for containing the data to be sent over a base client/server - /// - public class Data - { - /// - /// Data to be sent. - /// - private byte[] _message; - - /// - /// Get/set the data to be sent. - /// - public byte[] Message - { - get { return _message; } - set { _message = value; } - } - - /// - /// Base constructor of the class. - /// - /// Data to be sent. - public Data(byte[] msg) - { - this._message = msg; - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Base/Server.cs b/tools/GSDumpGUI/Library/TCPLibrary/Base/Server.cs deleted file mode 100644 index 031c65f15c..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Base/Server.cs +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Sockets; -using System.Threading; -using System.IO; -using System.ComponentModel; -using System.Text; - -namespace TCPLibrary.Core -{ - /// - /// Base TCP server class wrapped around TcpListener. - /// - public class Server - { - /// - /// Socket maintaining the connection. - /// - private TcpListener _socket; - /// - /// Whether the server is enabled or not. - /// - private Boolean _enabled; - /// - /// List of the clients connected to the server. - /// - private List _clients; - /// - /// Number of connection permitted in the backlog of the server. - /// - private Int32 _connectionbacklog; - - /// - /// Delegate for the event of the Enabled property change. - /// - /// Sender of the event. - public delegate void EnabledChangedHandler(Server sender); - /// - /// Occurs when the Enabled property is changed. - /// - public event EnabledChangedHandler OnEnabledChanged; - - /// - /// Delegate for the event of receiving a line of data from a client. - /// - /// Server raising the event. - /// Client involved in the communication. - /// Line of data received. - public delegate void DataCommunicationHandler(Server server, ClientS client, Data Data); - /// - /// Occurs when a client send a line of data to the server. - /// - public event DataCommunicationHandler OnClientDataReceived; - /// - /// Occurs before the server send a line of data to a client. - /// - public event DataCommunicationHandler OnClientBeforeDataSent; - /// - /// Occurs after the server send a line of data to a client. - /// - public event DataCommunicationHandler OnClientAfterDataSent; - - /// - /// Delegate for the event of a connection of a client. - /// - /// Server raising the event. - /// The new client connected. - public delegate void ConnectedHandler(Server server, ClientS sender); - /// - /// Occurs after a client is connected to the server. - /// - public event ConnectedHandler OnClientAfterConnect; - - /// - /// Delegate for the event of a connection of a client. - /// - /// Server raising the event. - /// The new client to be connected. - /// Specify if the client should be accepted into the server. - public delegate void BeforeConnectedHandler(Server server, ClientS client, CancelArgs args); - /// - /// Occurs before a client is allowed to connect to the server. - /// - public event BeforeConnectedHandler OnClientBeforeConnect; - - /// - /// Delegate for the event of disconnection of a client. - /// - /// Server raising the event. - /// The client disconnected. - public delegate void DisconnectedHandler(Server server, ClientS sender); - /// - /// Occurs right after a client disconnect from the server. - /// - public event DisconnectedHandler OnClientAfterDisconnected; - /// - /// Occurs before a client disconnect from the server. - /// - public event DisconnectedHandler OnClientBeforeDisconnected; - - /// - /// Get/set the port number to which the server will listen. Cannot be set while the server is active. - /// - /// - public Int32 Port - { - get - { - if (Enabled) - return ((IPEndPoint) _socket.LocalEndpoint).Port; - throw new NotSupportedException("Server is not running and hence has no port."); - } - } - - /// - /// Get/set the enabled state of the server. Setting this to true will actually activate the server. - /// - /// - public Boolean Enabled - { - get { return _enabled; } - set - { - if (value == true) - { - if (_enabled == false) - ActivateServer(); - } - else - { - if (_enabled == true) - DeactivateServer(); - } - } - } - - /// - /// Get/set the number of connection permitted in the backlog of the server. - /// - /// - public Int32 ConnectionBackLog - { - get { return _connectionbacklog; } - set - { - if (Enabled == false) - _connectionbacklog = value; - else - throw new ArgumentException("Impossibile eseguire l'operazione a server attivo"); - } - } - - /// - /// Get the list of the clients connected to the server. - /// - public List Clients - { - get { return _clients; } - } - - /// - /// Deactivate the server. - /// - protected virtual void DeactivateServer() - { - _enabled = false; - _socket.Stop(); - _socket = null; - - lock (_clients) - { - for (int i = 0; i < _clients.Count; i++) - _clients[i].Disconnect(); - } - - if (OnEnabledChanged != null) - OnEnabledChanged(this); - } - - /// - /// Activate the server. - /// - protected virtual void ActivateServer() - { - _socket = new TcpListener(IPAddress.Any, 0); - _socket.Start(ConnectionBackLog); - Thread thd = new Thread(new ThreadStart(MainThread)); - thd.Name = "Server on port " + ((IPEndPoint) _socket.LocalEndpoint).Port; - thd.IsBackground = true; - thd.Start(); - _enabled = true; - if (OnEnabledChanged != null) - OnEnabledChanged(this); - } - - /// - /// Broadcast a line of data to all the clients connected to the server. - /// - /// Line of data to be sent. - /// - public void Broadcast(Data Data) - { - if (Enabled) - { - lock (_clients) - { - foreach (var itm in _clients) - if (itm.Connected) - itm.Send(Data); - } - } - else - throw new ArgumentException("Unable to execute this operation when the server is inactive."); - } - - /// - /// Base constructor of the class. - /// - public Server() - { - _clients = new List(); - _connectionbacklog = 0; - _enabled = false; - } - - /// - /// Thread function that actually run the server socket work. - /// - private void MainThread() - { - try - { - while (Enabled == true) - { - TcpClient client = _socket.AcceptTcpClient(); - - CancelArgs args = new CancelArgs(false); - ClientS cl = CreateClient(client); - if (OnClientBeforeConnect != null) - OnClientBeforeConnect(this, cl, args); - - if (args.Cancel != true) - { - lock (_clients) - { - _clients.Add(cl); - } - - ASCIIEncoding ae = new ASCIIEncoding(); - byte[] arr = ae.GetBytes("CONNECTEDTCPSERVER"); - - cl.Send(new Data(arr)); - - if (OnClientAfterConnect != null) - OnClientAfterConnect(this, cl); - cl.Start(); - } - else - { - client.GetStream().Close(); - client.Close(); - } - } - } - catch (SocketException) - { - Enabled = false; - } - } - - /// - /// Overridable function that create the structure to memorize the client data. - /// - /// Socket of the client. - /// The structure in which memorize all the information of the client. - protected virtual ClientS CreateClient(TcpClient socket) - { - ClientS cl = new ClientS(this, socket); - return cl; - } - - /// - /// Raise the OnClientAfterDataSent event. - /// - /// Client that raised the event. - /// Line of data sent. - internal void RaiseAfterDataSentEvent(ClientS cl, Data data) - { - if (OnClientAfterDataSent != null) - OnClientAfterDataSent(this, cl, data); - } - - /// - /// Raise the OnClientBeforeDataSent event. - /// - /// Client that raised the event. - /// Line of data sent. - internal void RaiseBeforeDataSentEvent(ClientS cl, Data data) - { - if (OnClientBeforeDataSent != null) - OnClientBeforeDataSent(this, cl, data); - } - - /// - /// Raise the OnDataReceived event. - /// - /// Client that raised the event. - /// Line of data received. - internal void RaiseDataReceivedEvent(ClientS cl, Data data) - { - if (OnClientDataReceived != null) - OnClientDataReceived(this, cl, data); - } - - /// - /// Raise the OnClientAfterDisconnected event. - /// - /// Client that raised the event. - internal void RaiseClientAfterDisconnectedEvent(ClientS cl) - { - if (OnClientAfterDisconnected != null) - OnClientAfterDisconnected(this, cl); - } - - /// - /// Raise the OnClientBeforeDisconnected event. - /// - /// Client that raised the event. - internal void RaiseClientBeforeDisconnectedEvent(ClientS cl) - { - if (OnClientBeforeDisconnected != null) - OnClientBeforeDisconnected(this, cl); - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClient.cs b/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClient.cs deleted file mode 100644 index f43323ab7c..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClient.cs +++ /dev/null @@ -1,137 +0,0 @@ -/* -The MIT License - -Copyright (c) 2008 Ferreri Alessio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -using TCPLibrary.MessageBased.Core; -using TCPLibrary.Core; -using System; - -namespace TCPLibrary.MessageBased.Core -{ - /// - /// TCP Client Class that work with Message structures. - /// - public class BaseMessageClient : Client - { - /// - /// Delegate for the event of receiving a message structure from the server. - /// - /// Sender of the event. - /// Message received. - public delegate void MessageReceivedHandler(Client sender, TCPMessage Mess); - /// - /// Occurs when the client receive a message structure from the server. - /// - public event MessageReceivedHandler OnMessageReceived; - /// - /// Delegate for the event of sending a message structure to the server. - /// - /// Sender of the event. - /// Message sent. - public delegate void MessageSentHandler(Client sender, TCPMessage Mess); - /// - /// Occurs before the client send a message structure to the server. - /// - public event MessageSentHandler OnBeforeMessageSent; - /// - /// Occurs after the client send a message structure to the server. - /// - public event MessageSentHandler OnAfterMessageSent; - /// - /// Delegate for the event of connection fail for max users number reached. - /// - /// Sender of the event. - public delegate void MaxUsersReached(Client sender); - /// - /// Occurs when the connection fail as the server reached the maximum number of clients allowed. - /// - public event MaxUsersReached OnMaxUsersConnectionFail; - - /// - /// Base constructor of the class. - /// - public BaseMessageClient() - { - OnDataReceived += new DataCommunicationHandler(BaseMessageClient_OnDataReceived); - OnAfterDataSent += new DataCommunicationHandler(BaseMessageClient_OnDataSent); - OnConnectFailed += new ConnectionFailedHandler(BaseMessageClient_OnConnectFailed); - } - - /// - /// When the connection is rejected by the server raise the correct event. - /// - /// Sender of the event. - /// Message of the server. - void BaseMessageClient_OnConnectFailed(Client sender, byte[] Message) - { - if (TCPLibrary.MessageBased.Core.TCPMessage.FromByteArray(Message).MessageType == MessageType.MaxUsers) - if (OnMaxUsersConnectionFail != null) - OnMaxUsersConnectionFail(sender); - } - - /// - /// Parse the raw data sent to the server and create Message structures. - /// - /// Sender of the event. - /// Line of data sent. - void BaseMessageClient_OnDataSent(Client sender, Data Data) - { - TCPMessage msg = TCPMessage.FromByteArray(Data.Message); - if (OnAfterMessageSent != null) - OnAfterMessageSent(sender, msg); - } - - /// - /// Parse the raw data received from the server and create Message structures. - /// - /// Sender of the event. - /// Line of data received. - void BaseMessageClient_OnDataReceived(Client sender, Data Data) - { - TCPMessage msg = null; - try - { - msg = TCPMessage.FromByteArray(Data.Message); - } - catch (Exception) - { - - } - if (msg != null) - if (OnMessageReceived != null) - OnMessageReceived(sender, msg); - } - - /// - /// Send a message structure to the server. - /// - /// Message structure to be send. - /// - public void Send(TCPMessage msg) - { - if (OnBeforeMessageSent != null) - OnBeforeMessageSent(this, msg); - base.Send(new Data(msg.ToByteArray())); - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClientS.cs b/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClientS.cs deleted file mode 100644 index 83cd30b7b3..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageClientS.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* -The MIT License - -Copyright (c) 2008 Ferreri Alessio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -using System.Net.Sockets; -using TCPLibrary.Core; -using TCPLibrary.MessageBased.Core; - -namespace TCPLibrary.MessageBased.Core -{ - /// - /// Class that manages the single connection between a client and the server based - /// on Message structures. - /// - public class BaseMessageClientS : ClientS - { - /// - /// Base constructor of the class. - /// - /// Server to which this client is linked to. - /// Socket of the client. - protected internal BaseMessageClientS(Server server, TcpClient client) - : base(server, client) - { - - } - - /// - /// Send a Message structure to the client. - /// - /// Message to be sent. - /// - public void Send(TCPMessage msg) - { - ((BaseMessageServer)_server).RaiseBeforeMessageSentEvent(this, msg); - base.Send(new Data(msg.ToByteArray())); - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageServer.cs b/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageServer.cs deleted file mode 100644 index 44a6c1551f..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Message/BaseMessageServer.cs +++ /dev/null @@ -1,186 +0,0 @@ -/* -The MIT License - -Copyright (c) 2008 Ferreri Alessio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using TCPLibrary.MessageBased.Core; -using System.Net.Sockets; -using System.Threading; -using TCPLibrary.Core; - -namespace TCPLibrary.MessageBased.Core -{ - /// - /// TCP Server Class that work with Message structures. - /// - public class BaseMessageServer : Server - { - /// - /// Limit of user allowed inside the server. - /// - protected Int32 _userlimit; - - /// - /// Delegate for the event of receiving a Message from a client. - /// - /// Server raising the event. - /// Client sending the message. - /// Message received. - public delegate void MessageReceivedHandler(BaseMessageServer server, BaseMessageClientS sender, TCPMessage Mess); - /// - /// Occurs when a Message is received by the server. - /// - public event MessageReceivedHandler OnClientMessageReceived; - /// - /// Delegate for the event of sending a Message to a client. - /// - /// Server raising the event. - /// Client that will receive the message. - /// Message to be sent. - public delegate void MessageSentHandler(BaseMessageServer server, BaseMessageClientS receiver, TCPMessage Mess); - /// - /// Occurs when the server send a Message to a client. - /// - public event MessageSentHandler OnClientBeforeMessageSent; - /// - /// Occurs when the server send a Message to a client. - /// - public event MessageSentHandler OnClientAfterMessageSent; - - /// - /// Get/set the limit of users allowed inside the server. - /// - public Int32 UserLimit - { - get { return _userlimit; } - set { _userlimit = value; } - } - - /// - /// Base constructor of the class. - /// - public BaseMessageServer() : base() - { - OnClientBeforeConnect += new BeforeConnectedHandler(BaseMessageServer_OnClientBeforeConnect); - OnClientDataReceived += new DataCommunicationHandler(BaseMessageServer_OnDataReceived); - OnClientAfterDataSent += new DataCommunicationHandler(BaseMessageServer_OnDataSent); - _userlimit = 0; - } - - /// - /// Kick the client if the server reached the maximum allowed number of clients. - /// - /// Server raising the event. - /// Client connecting to the server. - /// Specify if the client should be accepted into the server. - void BaseMessageServer_OnClientBeforeConnect(Server server, ClientS client, CancelArgs args) - { - if ((Clients.Count >= UserLimit) && (UserLimit != 0)) - { - TCPMessage msg = new TCPMessage(); - msg.MessageType = MessageType.MaxUsers; - ((BaseMessageClientS)client).Send(msg); - - args.Cancel = true; - } - } - - /// - /// Trasform the line of data sent into a Message structure and raise - /// the event linked. - /// - /// Server raising the event. - /// Client that will receive the Message. - /// Line of data sent. - void BaseMessageServer_OnDataSent(Server server, ClientS receiver, Data Data) - { - TCPMessage msg = null; - try - { - msg = TCPMessage.FromByteArray(Data.Message); - } - catch (Exception) - { - - } - if (msg != null) - if (OnClientAfterMessageSent != null) - OnClientAfterMessageSent(this, (BaseMessageClientS)receiver, msg); - } - - /// - /// Raise the OnClientBeforeMessageSent event. - /// - /// Client that raised the event. - /// Message to be sent. - internal void RaiseBeforeMessageSentEvent(ClientS cl, TCPMessage msg) - { - if (OnClientBeforeMessageSent != null) - OnClientBeforeMessageSent(this, (BaseMessageClientS)cl, msg); - } - - /// - /// Trasform the line of data received into a Message structure and raise - /// the event linked. - /// - /// Server raising the event. - /// Client sending the data. - /// Line of data received. - void BaseMessageServer_OnDataReceived(Server server, ClientS sender, Data Data) - { - TCPMessage msg = null; - try - { - msg = TCPMessage.FromByteArray(Data.Message); - } - catch (Exception) - { - - } - if (msg != null) - if (OnClientMessageReceived != null) - OnClientMessageReceived(this, (BaseMessageClientS)sender, msg); - } - - /// - /// Function that create the structure to memorize the client data. - /// - /// Socket of the client. - /// The structure in which memorize all the information of the client. - protected override ClientS CreateClient(TcpClient socket) - { - return new BaseMessageClientS(this, socket); - } - - /// - /// Send a message to all clients in broadcast. - /// - /// Message to be sent. - public void Broadcast(TCPMessage Data) - { - base.Broadcast(new Data(Data.ToByteArray())); - } - } -} diff --git a/tools/GSDumpGUI/Library/TCPLibrary/Message/TCPMessage.cs b/tools/GSDumpGUI/Library/TCPLibrary/Message/TCPMessage.cs deleted file mode 100644 index ff26f09c8f..0000000000 --- a/tools/GSDumpGUI/Library/TCPLibrary/Message/TCPMessage.cs +++ /dev/null @@ -1,125 +0,0 @@ -/* -The MIT License - -Copyright (c) 2008 Ferreri Alessio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -using System; -using System.Collections.Generic; -using System.Xml.Serialization; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; - -namespace TCPLibrary.MessageBased.Core -{ - /// - /// Message structure that contains all the information of the message exchanged between - /// Message driven server/client. - /// - [Serializable] - public class TCPMessage - { - /// - /// Message Type. - /// - private MessageType _messageType; - /// - /// Messages parameters. - /// - private List _parameters; - - /// - /// Get/set the message type. - /// - public MessageType MessageType - { - get { return _messageType; } - set { _messageType = value; } - } - - /// - /// Get/set the message parameters. - /// - public List Parameters - { - get { return _parameters; } - } - - /// - /// Base constructor of the class. - /// - public TCPMessage() - { - _messageType = MessageType.Connect; - _parameters = new List(); - } - - /// - /// Parse a string and create a Message structure. - /// - /// Raw data. - /// Parsed message structure. - static public TCPMessage FromByteArray(byte[] data) - { - MemoryStream ms = new MemoryStream(); - BinaryWriter sw = new BinaryWriter(ms); - sw.Write(data, 0, data.Length); - sw.Flush(); - ms.Position = 0; - - BinaryFormatter formatter = new BinaryFormatter(); - TCPMessage msg = formatter.Deserialize(ms) as TCPMessage; - - return msg; - } - - /// - /// Trasform the structure into a String. - /// - /// The structure in a String format. - public byte[] ToByteArray() - { - MemoryStream ms = new MemoryStream(); - BinaryFormatter formatter = new BinaryFormatter(); - formatter.Serialize(ms, this); - ms.Position = 0; - return ms.ToArray(); - } - } - - public enum MessageType - { - Connect, - MaxUsers, - SizeDump, - Statistics, - StateOld, - - GetDebugMode, - SetDebugMode, - DebugState, - PacketInfo, - - Step, - RunToCursor, - RunToNextVSync - } -} diff --git a/tools/GSDumpGUI/Properties/AssemblyInfo.cs b/tools/GSDumpGUI/Properties/AssemblyInfo.cs deleted file mode 100644 index a5a715710a..0000000000 --- a/tools/GSDumpGUI/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2009-2011 Ferreri Alessio - * Copyright (C) 2009-2018 PCSX2 Dev Team - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GSDumpGUI")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("PCSX2 Team")] -[assembly: AssemblyProduct("GSDumpGUI")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("ff0f400c-a2cc-4d81-be4a-43c53eed5025")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tools/GSDumpGUI/Properties/Resources.Designer.cs b/tools/GSDumpGUI/Properties/Resources.Designer.cs deleted file mode 100644 index d05c3a159f..0000000000 --- a/tools/GSDumpGUI/Properties/Resources.Designer.cs +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GSDumpGUI.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GSDumpGUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon AppIcon { - get { - object obj = ResourceManager.GetObject("AppIcon", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} diff --git a/tools/GSDumpGUI/Properties/Resources.resx b/tools/GSDumpGUI/Properties/Resources.resx deleted file mode 100644 index effc4f3906..0000000000 --- a/tools/GSDumpGUI/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\AppIcon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/tools/GSDumpGUI/Properties/Settings.Designer.cs b/tools/GSDumpGUI/Properties/Settings.Designer.cs deleted file mode 100644 index e6a0a1daff..0000000000 --- a/tools/GSDumpGUI/Properties/Settings.Designer.cs +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GSDumpGUI.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string GSDXDir { - get { - return ((string)(this["GSDXDir"])); - } - set { - this["GSDXDir"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string DumpDir { - get { - return ((string)(this["DumpDir"])); - } - set { - this["DumpDir"] = value; - } - } - } -} diff --git a/tools/GSDumpGUI/Properties/Settings.settings b/tools/GSDumpGUI/Properties/Settings.settings deleted file mode 100644 index 0d76066bf4..0000000000 --- a/tools/GSDumpGUI/Properties/Settings.settings +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/GSDumpGUI/Resources/AppIcon.ico b/tools/GSDumpGUI/Resources/AppIcon.ico deleted file mode 100644 index 653ed3b85b..0000000000 Binary files a/tools/GSDumpGUI/Resources/AppIcon.ico and /dev/null differ diff --git a/tools/GSDumpGUI/app.config b/tools/GSDumpGUI/app.config deleted file mode 100644 index ad8663627a..0000000000 --- a/tools/GSDumpGUI/app.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - -
- - - - - - - - - - - - -