From f731188c8f732f5b31ce35b0a5623d9f8b434946 Mon Sep 17 00:00:00 2001 From: kshman Date: Sun, 21 Mar 2021 03:43:05 +0900 Subject: [PATCH] ping --- DcConfig.cs | 83 ++++- DcControl.cs | 56 ++- DutyContent.csproj | 4 + MesgLog.cs | 4 +- Overlay/DutyOvForm.Designer.cs | 20 +- Overlay/DutyOvForm.cs | 27 +- Properties/Resources.Designer.cs | 12 +- Properties/Resources.resx | 3 + Resources/mesg.txt | 10 +- Resources/pix_tab_ping.png | Bin 0 -> 206 bytes Tab/DutyForm.Designer.cs | 316 ++++++++++++++--- Tab/DutyForm.cs | 265 +++++++++++--- Tab/DutyForm.resx | 578 ++++++++++++++++--------------- ThirdParty/Converter.cs | 60 +++- ThirdParty/LineDb.cs | 24 +- ThirdParty/ThreadWorker.cs | 84 +++++ 16 files changed, 1127 insertions(+), 419 deletions(-) create mode 100644 Resources/pix_tab_ping.png create mode 100644 ThirdParty/ThreadWorker.cs diff --git a/DcConfig.cs b/DcConfig.cs index 5e1a689..8967054 100644 --- a/DcConfig.cs +++ b/DcConfig.cs @@ -151,24 +151,37 @@ namespace DutyContent public int ActiveFate { get; set; } = 0; public string LogFontFamily { get; set; } = "Microsoft Sans Serif"; public float LogFontSize { get; set; } = 12.0f; + public bool EnableOverlay { get; set; } + public Point OverlayLocation { get; set; } = new Point(0, 0); + public bool OverlayClickThru { get; set; } + public bool EnableSound { get; set; } public string SoundInstanceFile { get; set; } public int SoundInstanceVolume { get; set; } = 100; public string SoundFateFile { get; set; } public int SoundFateVolume { get; set; } = 100; + public bool UseNotifyLine { get; set; } public string NotifyLineToken { get; set; } public bool UseNotifyTelegram { get; set; } public string NotifyTelegramId { get; set; } public string NotifyTelegramToken { get; set; } - public Point OverlayLocation { get; set; } = new Point(0, 0); + + public bool UsePing { get; set; } + public Color[] PingColors { get; set; } = new Color[4] + { + Color.FromArgb(0xFF, 0x00, 0x00, 0x40), + Color.FromArgb(0xFF, 0x40, 0x00, 0x80), + Color.FromArgb(0xFF, 0x80, 0x40, 0x00), + Color.FromArgb(0xFF, 0xDD, 0xA0, 0xDD), + }; // public bool EnableNotify => UseNotifyLine || UseNotifyTelegram; // - public FateSelection[] Fates = new FateSelection[4] + public FateSelection[] Fates { get; set; } = new FateSelection[4] { new FateSelection(0), new FateSelection(1), @@ -186,21 +199,32 @@ namespace DutyContent sw.WriteLine("DutyFate1={0}", Fates[1].Line); sw.WriteLine("DutyFate2={0}", Fates[2].Line); sw.WriteLine("DutyFate3={0}", Fates[3].Line); + sw.WriteLine("DutyLogFontFamily={0}", LogFontFamily); sw.WriteLine("DutyLogFontSize={0}", LogFontSize); + sw.WriteLine("DutyEnableOverlay={0}", EnableOverlay); + sw.WriteLine("DutyOverlayLocationX={0}", OverlayLocation.X); + sw.WriteLine("DutyOverlayLocationY={0}", OverlayLocation.Y); + sw.WriteLine("DutyOverlayClickThru={0}", OverlayClickThru); + sw.WriteLine("DutyEnableSound={0}", EnableSound); sw.WriteLine("DutySoundInstanceFile={0}", SoundInstanceFile); sw.WriteLine("DutySoundInstanceVolume={0}", SoundInstanceVolume); sw.WriteLine("DutySoundFateFile={0}", SoundFateFile); sw.WriteLine("DutySoundFateVolume={0}", SoundFateVolume); + sw.WriteLine("DutyUseNotifyLine={0}", UseNotifyLine); sw.WriteLine("DutyNotifyLineToken={0}", NotifyLineToken); sw.WriteLine("DutyUseNotifyTelegram={0}", UseNotifyTelegram); sw.WriteLine("DutyNotifyTelegramId={0}", NotifyTelegramId); sw.WriteLine("DutyNotifyTelegramToken={0}", NotifyTelegramToken); - sw.WriteLine("DutyOverlayLocationX={0}", OverlayLocation.X); - sw.WriteLine("DutyOverlayLocationY={0}", OverlayLocation.Y); + + sw.WriteLine("DutyUsePing={0}", UsePing); + sw.WriteLine("DutyPingColor0={0:X}", PingColors[0].ToArgb()); + sw.WriteLine("DutyPingColor1={0:X}", PingColors[1].ToArgb()); + sw.WriteLine("DutyPingColor2={0:X}", PingColors[2].ToArgb()); + sw.WriteLine("DutyPingColor3={0:X}", PingColors[3].ToArgb()); sw.WriteLine(); } @@ -213,20 +237,33 @@ namespace DutyContent Fates[1].Line = db["DutyFate1"]; Fates[2].Line = db["DutyFate2"]; Fates[3].Line = db["DutyFate3"]; - LogFontFamily = db["DutyLogFontFamily"]; + + LogFontFamily = db.Get("DutyLogFontFamily", LogFontFamily); LogFontSize = ThirdParty.Converter.ToFloat(db["DutyLogFontSize"], LogFontSize); + EnableOverlay = ThirdParty.Converter.ToBool(db["DutyEnableOverlay"]); + OverlayLocation = new Point( + ThirdParty.Converter.ToInt(db["DutyOverlayLocationX"]), + ThirdParty.Converter.ToInt(db["DutyOverlayLocationY"])); + OverlayClickThru = ThirdParty.Converter.ToBool(db["DutyOverlayClickThru"]); + EnableSound = ThirdParty.Converter.ToBool(db["DutyEnableSound"]); SoundInstanceFile = db["DutySoundInstanceFile"]; SoundFateFile = db["DutySoundFateFile"]; SoundInstanceVolume = ThirdParty.Converter.ToInt(db["DutySoundInstanceVolume"], 100); SoundFateVolume = ThirdParty.Converter.ToInt(db["DutySoundFateVolume"], 100); + UseNotifyLine = ThirdParty.Converter.ToBool(db["DutyUseNotifyLine"]); NotifyLineToken = db["DutyNotifyLineToken"]; UseNotifyTelegram = ThirdParty.Converter.ToBool(db["DutyUseNotifyTelegram"]); NotifyTelegramId = db["DutyNotifyTelegramId"]; NotifyTelegramToken = db["DutyNotifyTelegramToken"]; - OverlayLocation = new Point(ThirdParty.Converter.ToInt(db["DutyOverlayLocationX"]), ThirdParty.Converter.ToInt(db["DutyOverlayLocationY"])); + + UsePing = ThirdParty.Converter.ToBool(db["DutyUsePing"]); + PingColors[0] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor0"], PingColors[0]); + PingColors[1] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor1"], PingColors[1]); + PingColors[2] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor2"], PingColors[2]); + PingColors[3] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor3"], PingColors[3]); } } @@ -266,32 +303,56 @@ namespace DutyContent { public List Conns = new List(); + public ThirdParty.NativeMethods.TcpRow[] CopyConnection() + { + ThirdParty.NativeMethods.TcpRow[] ret; + + lock (Conns) + ret = Conns.ToArray(); + + return ret; + } + public void GetConnections(Process process) { - Conns.Clear(); - var size = 0; - var ret = ThirdParty.NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref size, true, AddressFamily.InterNetwork, 4); + ThirdParty.NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref size, true, AddressFamily.InterNetwork, 4); + var buff = Marshal.AllocHGlobal(size); try { - ret = ThirdParty.NativeMethods.GetExtendedTcpTable(buff, ref size, true, AddressFamily.InterNetwork, 4); + var ret = ThirdParty.NativeMethods.GetExtendedTcpTable(buff, ref size, true, AddressFamily.InterNetwork, 4); if (ret == 0) { var tbl = Marshal.PtrToStructure(buff); var ptr = (IntPtr)((long)buff + Marshal.SizeOf(tbl.entries)); + var rows = new ThirdParty.NativeMethods.TcpRow[tbl.entries]; + var rcnt = 0; + for (var i = 0; i < tbl.entries; i++) { var row = Marshal.PtrToStructure(ptr); if (!IPAddress.IsLoopback(row.RemoteAddress) && process.Id == row.owningPid) - Conns.Add(row); + rows[rcnt++] = row; ptr = (IntPtr)((long)ptr + Marshal.SizeOf(row)); } + + lock (Conns) + { + Conns.Clear(); + for (var i = 0; i < rcnt; i++) + Conns.Add(rows[i]); + } + } + else + { + lock (Conns) + Conns.Clear(); } } finally diff --git a/DcControl.cs b/DcControl.cs index e907ecf..595364e 100644 --- a/DcControl.cs +++ b/DcControl.cs @@ -24,8 +24,10 @@ namespace DutyContent private TabPage _act_tab; private Label _act_label; - private Timer _update_and_check; + private System.Timers.Timer _save_timer; + private System.Timers.Timer _update_timer; private ThirdParty.NativeMethods.ProcessHandle _game_process; + private long _game_connection_tick = DateTime.Now.Ticks; private bool _game_exist; private bool _game_active; private string _game_zone; @@ -104,22 +106,27 @@ namespace DutyContent MesgLog.I(6, System.Diagnostics.FileVersionInfo.GetVersionInfo(_ffxiv_plugin_data.pluginFile.FullName).FileVersion, _ffxiv_plugin_data.pluginFile.FullName); } - _update_and_check = new Timer() - { - Interval = 300, - }; - _update_and_check.Tick += (sender, e) => + _save_timer = new System.Timers.Timer() { Interval = 5000 }; + _save_timer.Elapsed += (sender, e) => + { + DcConfig.SaveConfig(); + _save_timer.Enabled = false; + }; + + _update_timer = new System.Timers.Timer() { Interval = 300 }; + _update_timer.Elapsed += (sender, e) => { UpdateAndCheckProc(); - _update_and_check.Interval = _game_exist ? _game_active ? 50 : 300 : 500; + _update_timer.Interval = _game_exist ? _game_active ? 50 : 300 : 500; }; - _update_and_check.Start(); + _update_timer.Start(); } // public void DeInitPlugin() { - _update_and_check.Stop(); + _update_timer.Stop(); + _save_timer.Stop(); DcConfig.PluginEnable = false; @@ -157,6 +164,8 @@ namespace DutyContent MesgLog.SetTextBox(txtMesg); MesgLog.Initialize(Properties.Resources.DefaultMessage); + MesgLog.C(Color.Aquamarine, 4); + DcConfig.Load(); DcConfig.ReadLanguage(true); DcContent.ReadContent(); @@ -220,6 +229,14 @@ namespace DutyContent g.DrawString(p.Text, f, b, r, new StringFormat(s)); } + // + public void RefreshSaveConfig(int interval=5000) + { + _save_timer.Enabled = false; + _save_timer.Interval = interval; + _save_timer.Start(); + } + // private void UpdateAndCheckProc() { @@ -239,21 +256,26 @@ namespace DutyContent { _game_process = p != null ? new ThirdParty.NativeMethods.ProcessHandle(p) : null; } - - if (_game_process != null) - { - // - DcConfig.Connections.GetConnections(_game_process.Process); - //MesgLog.L("count: {0}", DcConfig.Connections.Conns.Count); - } } else { _game_exist = true; + // var fgw = ThirdParty.NativeMethods.GetForegroundWindow(); ThirdParty.NativeMethods.GetWindowThreadProcessId(fgw, out int id); _game_active = _game_process.Process.Id == id; + + // + var now = DateTime.Now.Ticks; + var delta = now - _game_connection_tick; + var span = new TimeSpan(delta); + + if (span.TotalSeconds > 2) + { + _game_connection_tick = now; + DcConfig.Connections.GetConnections(_game_process.Process); + } } var zone = ActGlobals.oFormActMain.CurrentZone; @@ -292,7 +314,7 @@ namespace DutyContent tabPageDuty.Text = MesgLog.Text(300); Tab.DutyForm.Self?.UpdateUiLocale(); - tabPageConfig.Text= MesgLog.Text(200); + tabPageConfig.Text = MesgLog.Text(200); Tab.ConfigForm.Self?.UpdateUiLocale(); } } diff --git a/DutyContent.csproj b/DutyContent.csproj index a1ee3d9..9eb06ad 100644 --- a/DutyContent.csproj +++ b/DutyContent.csproj @@ -96,6 +96,7 @@ + @@ -166,6 +167,9 @@ + + + if exist "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" copy $(TargetPath) "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" /y diff --git a/MesgLog.cs b/MesgLog.cs index 895a976..d17c76a 100644 --- a/MesgLog.cs +++ b/MesgLog.cs @@ -53,12 +53,12 @@ namespace DutyContent public static string Text(int key) { - return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : v; + return _lines == null || !_lines.Try(key, out string v) ? $"<{key}>" : v; } public static string Text(int key, params object[] prms) { - return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : string.Format(v, prms); + return _lines == null || !_lines.Try(key, out string v) ? $"<{key}>" : string.Format(v, prms); } public static void Write(Color color, string format, params object[] prms) diff --git a/Overlay/DutyOvForm.Designer.cs b/Overlay/DutyOvForm.Designer.cs index d7b21eb..1b85c46 100644 --- a/Overlay/DutyOvForm.Designer.cs +++ b/Overlay/DutyOvForm.Designer.cs @@ -30,6 +30,7 @@ namespace DutyContent.Overlay private void InitializeComponent() { this.lblText = new System.Windows.Forms.Label(); + this.lblStat = new System.Windows.Forms.Label(); this.SuspendLayout(); // // lblText @@ -37,21 +38,33 @@ namespace DutyContent.Overlay this.lblText.AutoEllipsis = true; this.lblText.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblText.ForeColor = System.Drawing.Color.White; - this.lblText.Location = new System.Drawing.Point(0, 0); + this.lblText.Location = new System.Drawing.Point(41, 0); this.lblText.Name = "lblText"; - this.lblText.Size = new System.Drawing.Size(300, 20); + this.lblText.Size = new System.Drawing.Size(319, 32); this.lblText.TabIndex = 0; this.lblText.Text = "Duty Content"; this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblText.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseDown); // + // lblStat + // + this.lblStat.AutoEllipsis = true; + this.lblStat.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblStat.ForeColor = System.Drawing.Color.White; + this.lblStat.Location = new System.Drawing.Point(0, 0); + this.lblStat.Name = "lblStat"; + this.lblStat.Size = new System.Drawing.Size(40, 32); + this.lblStat.TabIndex = 1; + this.lblStat.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // // DutyOvForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.Black; - this.ClientSize = new System.Drawing.Size(300, 25); + this.ClientSize = new System.Drawing.Size(360, 32); this.ControlBox = false; + this.Controls.Add(this.lblStat); this.Controls.Add(this.lblText); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "DutyOvForm"; @@ -68,5 +81,6 @@ namespace DutyContent.Overlay #endregion private System.Windows.Forms.Label lblText; + private System.Windows.Forms.Label lblStat; } } \ No newline at end of file diff --git a/Overlay/DutyOvForm.cs b/Overlay/DutyOvForm.cs index 1b5ec94..28d3841 100644 --- a/Overlay/DutyOvForm.cs +++ b/Overlay/DutyOvForm.cs @@ -56,6 +56,9 @@ namespace DutyContent.Overlay private void DoMoveDown(MouseEventArgs e) { + if (DcConfig.Duty.OverlayClickThru) + return; + if (e.Button == MouseButtons.Left) { ThirdParty.NativeMethods.ReleaseCapture(); @@ -65,6 +68,9 @@ namespace DutyContent.Overlay protected override void OnMouseDown(MouseEventArgs e) { + if (DcConfig.Duty.OverlayClickThru) + return; + base.OnMouseDown(e); DoMoveDown(e); } @@ -131,7 +137,7 @@ namespace DutyContent.Overlay })); } - public void PlayMatch(string name, bool blink = true) // PlayEnter + public void PlayMatch(string name, bool blink = true) // PlayEnter { Invoke((MethodInvoker)(() => { @@ -141,5 +147,24 @@ namespace DutyContent.Overlay StartBlink(); })); } + + public void ResetStat() + { + lblStat.BackColor = Color.Transparent; + lblStat.Text = string.Empty; + } + + public void SetStatPing(Color color, long rtt, double loss) + { + Invoke((MethodInvoker)(() => + { + if (rtt > 999) + rtt = 999; + + lblStat.Text = string.Format("{0}{1}{2:0.#}%", rtt, Environment.NewLine, loss); + lblStat.BackColor = color; + //lblStat.ForeColor = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B); + })); + } } } diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 0efe0c8..d980534 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -79,7 +79,7 @@ namespace DutyContent.Properties { ///12=Unknown FATE: {0} ///13=Data reading failed! ///14=Data file not found! {0} - ///20=Duty contents info: {0}({1}) / A:{2} / R:{3} / I:{4} / F:{5} ({6}) + ///20=Duty contents info: {1}({0}) / A:{2} / R:{3} / I:{4} / F:{5} ({6}) ///21=Roulette ///22=Instance ///23=FATE @@ -132,6 +132,16 @@ namespace DutyContent.Properties { } } + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap pix_tab_ping { + get { + object obj = ResourceManager.GetObject("pix_tab_ping", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index f727112..0bd3315 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -133,6 +133,9 @@ ..\resources\pix_tab_content.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\pix_tab_ping.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\pix_tab_setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Resources/mesg.txt b/Resources/mesg.txt index b678256..a45534f 100644 --- a/Resources/mesg.txt +++ b/Resources/mesg.txt @@ -29,10 +29,11 @@ LANG=English 101=Select wave file 102=Wave (*.wav)|*.wav|All (*.*)|*.* 103=Notify test!! +104=Clickthrough 200=Config 201=Display Language -202=Hide overlays when FFXIV client is in the background +202=Automatically hide overlay when client is in the background 300=Duty 301=Contents @@ -61,6 +62,13 @@ LANG=English 324=Status 325=Member 326=Progress +327=Ping +328=Use ping +329=Colors +330=Excellent +331=Good +332=Normal +333=Bad 10001="{0}" spawned! 10002=Entry: {0} diff --git a/Resources/pix_tab_ping.png b/Resources/pix_tab_ping.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8088c5168d159eaf807ec5085d167dbc8dce75 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!V6vx+V@QPi+bM>842m2qAOHPN-?~6S{ZXaj z!kL*G9chzgMOQ3)`N!#c=1$A^pI+!RGq8A6vlj1s^ZZkVy{Nzg-A?r=7mbH}+Uh{g vk6=lglTMs#bF5c1Fk}k-Yvtl#INHGz@4{_R93Z$BXdQ#6tDnm{r-UW|ru;$| literal 0 HcmV?d00001 diff --git a/Tab/DutyForm.Designer.cs b/Tab/DutyForm.Designer.cs index 07f3d05..b6e2daa 100644 --- a/Tab/DutyForm.Designer.cs +++ b/Tab/DutyForm.Designer.cs @@ -57,7 +57,7 @@ namespace DutyContent.Tab ""}, -1); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DutyForm)); this.tabContent = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPageContent = new System.Windows.Forms.TabPage(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.rdoFatePreset4 = new System.Windows.Forms.RadioButton(); this.rdoFatePreset3 = new System.Windows.Forms.RadioButton(); @@ -65,7 +65,7 @@ namespace DutyContent.Tab this.rdoFatePreset1 = new System.Windows.Forms.RadioButton(); this.treeFates = new System.Windows.Forms.TreeView(); this.txtContentLog = new System.Windows.Forms.RichTextBox(); - this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tabPageSetting = new System.Windows.Forms.TabPage(); this.panel4 = new System.Windows.Forms.Panel(); this.lblTelegramToken = new System.Windows.Forms.Label(); this.txtTelegramToken = new System.Windows.Forms.TextBox(); @@ -94,11 +94,24 @@ namespace DutyContent.Tab this.chkEnableSound = new System.Windows.Forms.CheckBox(); this.lblSoundInstance = new System.Windows.Forms.Label(); this.panel1 = new System.Windows.Forms.Panel(); + this.chkOverlayClickThru = new System.Windows.Forms.CheckBox(); this.progbOverlayTransparent = new System.Windows.Forms.ProgressBar(); this.btnOverlayDimming = new System.Windows.Forms.Button(); this.lblOverlayTransparent = new System.Windows.Forms.Label(); this.chkEnableOverlay = new System.Windows.Forms.CheckBox(); - this.tabPage3 = new System.Windows.Forms.TabPage(); + this.tabPagePing = new System.Windows.Forms.TabPage(); + this.panel6 = new System.Windows.Forms.Panel(); + this.btnPingColor2 = new System.Windows.Forms.Button(); + this.lblPingStat4 = new System.Windows.Forms.Label(); + this.lblPingStat2 = new System.Windows.Forms.Label(); + this.lblPingStat3 = new System.Windows.Forms.Label(); + this.btnPingColor4 = new System.Windows.Forms.Button(); + this.btnPingColor1 = new System.Windows.Forms.Button(); + this.btnPingColor3 = new System.Windows.Forms.Button(); + this.lblPingStat1 = new System.Windows.Forms.Label(); + this.lblPingColors = new System.Windows.Forms.Label(); + this.chkUsePing = new System.Windows.Forms.CheckBox(); + this.tabPagePacket = new System.Windows.Forms.TabPage(); this.panel5 = new System.Windows.Forms.Panel(); this.txtPacketDescription = new System.Windows.Forms.TextBox(); this.lblPacketDesc = new System.Windows.Forms.Label(); @@ -118,26 +131,31 @@ namespace DutyContent.Tab this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.lblPacketFinder = new System.Windows.Forms.Label(); this.ilTabContent = new System.Windows.Forms.ImageList(this.components); + this.tlpnPingColors = new System.Windows.Forms.TableLayoutPanel(); this.tabContent.SuspendLayout(); - this.tabPage1.SuspendLayout(); + this.tabPageContent.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); - this.tabPage2.SuspendLayout(); + this.tabPageSetting.SuspendLayout(); this.panel4.SuspendLayout(); this.panel3.SuspendLayout(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); - this.tabPage3.SuspendLayout(); + this.tabPagePing.SuspendLayout(); + this.panel6.SuspendLayout(); + this.tabPagePacket.SuspendLayout(); this.panel5.SuspendLayout(); + this.tlpnPingColors.SuspendLayout(); this.SuspendLayout(); // // tabContent // - this.tabContent.Controls.Add(this.tabPage1); - this.tabContent.Controls.Add(this.tabPage2); - this.tabContent.Controls.Add(this.tabPage3); + this.tabContent.Controls.Add(this.tabPageContent); + this.tabContent.Controls.Add(this.tabPageSetting); + this.tabContent.Controls.Add(this.tabPagePing); + this.tabContent.Controls.Add(this.tabPagePacket); this.tabContent.Dock = System.Windows.Forms.DockStyle.Fill; this.tabContent.ImageList = this.ilTabContent; this.tabContent.Location = new System.Drawing.Point(0, 0); @@ -146,17 +164,17 @@ namespace DutyContent.Tab this.tabContent.Size = new System.Drawing.Size(800, 502); this.tabContent.TabIndex = 0; // - // tabPage1 + // tabPageContent // - this.tabPage1.Controls.Add(this.splitContainer1); - this.tabPage1.ImageIndex = 0; - this.tabPage1.Location = new System.Drawing.Point(4, 39); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(792, 459); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "301"; - this.tabPage1.UseVisualStyleBackColor = true; + this.tabPageContent.Controls.Add(this.splitContainer1); + this.tabPageContent.ImageIndex = 0; + this.tabPageContent.Location = new System.Drawing.Point(4, 39); + this.tabPageContent.Name = "tabPageContent"; + this.tabPageContent.Padding = new System.Windows.Forms.Padding(3); + this.tabPageContent.Size = new System.Drawing.Size(792, 459); + this.tabPageContent.TabIndex = 0; + this.tabPageContent.Text = "301"; + this.tabPageContent.UseVisualStyleBackColor = true; // // splitContainer1 // @@ -257,20 +275,20 @@ namespace DutyContent.Tab this.txtContentLog.TabIndex = 0; this.txtContentLog.Text = ""; // - // tabPage2 + // tabPageSetting // - this.tabPage2.Controls.Add(this.panel4); - this.tabPage2.Controls.Add(this.panel3); - this.tabPage2.Controls.Add(this.panel2); - this.tabPage2.Controls.Add(this.panel1); - this.tabPage2.ImageIndex = 1; - this.tabPage2.Location = new System.Drawing.Point(4, 39); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(792, 459); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "302"; - this.tabPage2.UseVisualStyleBackColor = true; + this.tabPageSetting.Controls.Add(this.panel4); + this.tabPageSetting.Controls.Add(this.panel3); + this.tabPageSetting.Controls.Add(this.panel2); + this.tabPageSetting.Controls.Add(this.panel1); + this.tabPageSetting.ImageIndex = 1; + this.tabPageSetting.Location = new System.Drawing.Point(4, 39); + this.tabPageSetting.Name = "tabPageSetting"; + this.tabPageSetting.Padding = new System.Windows.Forms.Padding(3); + this.tabPageSetting.Size = new System.Drawing.Size(792, 459); + this.tabPageSetting.TabIndex = 1; + this.tabPageSetting.Text = "302"; + this.tabPageSetting.UseVisualStyleBackColor = true; // // panel4 // @@ -287,7 +305,7 @@ namespace DutyContent.Tab this.panel4.Controls.Add(this.lblLineToken); this.panel4.Controls.Add(this.txtLineToken); this.panel4.Controls.Add(this.chkUseNotifyLine); - this.panel4.Location = new System.Drawing.Point(6, 273); + this.panel4.Location = new System.Drawing.Point(6, 234); this.panel4.Name = "panel4"; this.panel4.Size = new System.Drawing.Size(778, 143); this.panel4.TabIndex = 3; @@ -429,7 +447,7 @@ namespace DutyContent.Tab // this.lblDataSet.AutoSize = true; this.lblDataSet.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblDataSet.Location = new System.Drawing.Point(22, 4); + this.lblDataSet.Location = new System.Drawing.Point(21, 7); this.lblDataSet.Name = "lblDataSet"; this.lblDataSet.Size = new System.Drawing.Size(39, 20); this.lblDataSet.TabIndex = 10; @@ -449,7 +467,7 @@ namespace DutyContent.Tab // this.lblLogFont.AutoSize = true; this.lblLogFont.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblLogFont.Location = new System.Drawing.Point(381, 4); + this.lblLogFont.Location = new System.Drawing.Point(380, 7); this.lblLogFont.Name = "lblLogFont"; this.lblLogFont.Size = new System.Drawing.Size(39, 20); this.lblLogFont.TabIndex = 9; @@ -469,9 +487,9 @@ namespace DutyContent.Tab this.panel2.Controls.Add(this.txtSoundInstance); this.panel2.Controls.Add(this.chkEnableSound); this.panel2.Controls.Add(this.lblSoundInstance); - this.panel2.Location = new System.Drawing.Point(6, 135); + this.panel2.Location = new System.Drawing.Point(6, 136); this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(778, 132); + this.panel2.Size = new System.Drawing.Size(778, 92); this.panel2.TabIndex = 1; // // btnSoundPlayFate @@ -579,15 +597,28 @@ namespace DutyContent.Tab this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.chkOverlayClickThru); this.panel1.Controls.Add(this.progbOverlayTransparent); this.panel1.Controls.Add(this.btnOverlayDimming); this.panel1.Controls.Add(this.lblOverlayTransparent); this.panel1.Controls.Add(this.chkEnableOverlay); this.panel1.Location = new System.Drawing.Point(6, 68); this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(778, 61); + this.panel1.Size = new System.Drawing.Size(778, 62); this.panel1.TabIndex = 0; // + // chkOverlayClickThru + // + this.chkOverlayClickThru.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.chkOverlayClickThru.AutoSize = true; + this.chkOverlayClickThru.Location = new System.Drawing.Point(672, 8); + this.chkOverlayClickThru.Name = "chkOverlayClickThru"; + this.chkOverlayClickThru.Size = new System.Drawing.Size(44, 17); + this.chkOverlayClickThru.TabIndex = 4; + this.chkOverlayClickThru.Text = "104"; + this.chkOverlayClickThru.UseVisualStyleBackColor = true; + this.chkOverlayClickThru.CheckedChanged += new System.EventHandler(this.ChkOverlayClickThru_CheckedChanged); + // // progbOverlayTransparent // this.progbOverlayTransparent.Enabled = false; @@ -632,17 +663,150 @@ namespace DutyContent.Tab this.chkEnableOverlay.UseVisualStyleBackColor = true; this.chkEnableOverlay.CheckedChanged += new System.EventHandler(this.ChkEnableOverlay_CheckedChanged); // - // tabPage3 + // tabPagePing // - this.tabPage3.Controls.Add(this.panel5); - this.tabPage3.ImageIndex = 2; - this.tabPage3.Location = new System.Drawing.Point(4, 39); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.Padding = new System.Windows.Forms.Padding(3); - this.tabPage3.Size = new System.Drawing.Size(792, 459); - this.tabPage3.TabIndex = 2; - this.tabPage3.Text = "303"; - this.tabPage3.UseVisualStyleBackColor = true; + this.tabPagePing.Controls.Add(this.panel6); + this.tabPagePing.ImageIndex = 3; + this.tabPagePing.Location = new System.Drawing.Point(4, 39); + this.tabPagePing.Name = "tabPagePing"; + this.tabPagePing.Size = new System.Drawing.Size(792, 459); + this.tabPagePing.TabIndex = 3; + this.tabPagePing.Text = "327"; + this.tabPagePing.UseVisualStyleBackColor = true; + // + // panel6 + // + this.panel6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel6.Controls.Add(this.tlpnPingColors); + this.panel6.Controls.Add(this.lblPingColors); + this.panel6.Controls.Add(this.chkUsePing); + this.panel6.Location = new System.Drawing.Point(6, 8); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(778, 353); + this.panel6.TabIndex = 1; + // + // btnPingColor2 + // + this.btnPingColor2.BackColor = System.Drawing.Color.Aqua; + this.btnPingColor2.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnPingColor2.Location = new System.Drawing.Point(97, 28); + this.btnPingColor2.Name = "btnPingColor2"; + this.btnPingColor2.Size = new System.Drawing.Size(85, 28); + this.btnPingColor2.TabIndex = 10; + this.btnPingColor2.UseVisualStyleBackColor = false; + this.btnPingColor2.Click += new System.EventHandler(this.BtnPingColor2_Click); + // + // lblPingStat4 + // + this.lblPingStat4.AutoSize = true; + this.lblPingStat4.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPingStat4.Location = new System.Drawing.Point(279, 3); + this.lblPingStat4.Name = "lblPingStat4"; + this.lblPingStat4.Size = new System.Drawing.Size(86, 22); + this.lblPingStat4.TabIndex = 3; + this.lblPingStat4.Text = "333"; + this.lblPingStat4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPingStat2 + // + this.lblPingStat2.AutoSize = true; + this.lblPingStat2.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPingStat2.Location = new System.Drawing.Point(97, 3); + this.lblPingStat2.Name = "lblPingStat2"; + this.lblPingStat2.Size = new System.Drawing.Size(85, 22); + this.lblPingStat2.TabIndex = 5; + this.lblPingStat2.Text = "331"; + this.lblPingStat2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPingStat3 + // + this.lblPingStat3.AutoSize = true; + this.lblPingStat3.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPingStat3.Location = new System.Drawing.Point(188, 3); + this.lblPingStat3.Name = "lblPingStat3"; + this.lblPingStat3.Size = new System.Drawing.Size(85, 22); + this.lblPingStat3.TabIndex = 4; + this.lblPingStat3.Text = "332"; + this.lblPingStat3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnPingColor4 + // + this.btnPingColor4.BackColor = System.Drawing.Color.Plum; + this.btnPingColor4.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnPingColor4.Location = new System.Drawing.Point(279, 28); + this.btnPingColor4.Name = "btnPingColor4"; + this.btnPingColor4.Size = new System.Drawing.Size(86, 28); + this.btnPingColor4.TabIndex = 8; + this.btnPingColor4.UseVisualStyleBackColor = false; + this.btnPingColor4.Click += new System.EventHandler(this.BtnPingColor4_Click); + // + // btnPingColor1 + // + this.btnPingColor1.BackColor = System.Drawing.Color.RoyalBlue; + this.btnPingColor1.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnPingColor1.Location = new System.Drawing.Point(6, 28); + this.btnPingColor1.Name = "btnPingColor1"; + this.btnPingColor1.Size = new System.Drawing.Size(85, 28); + this.btnPingColor1.TabIndex = 7; + this.btnPingColor1.UseVisualStyleBackColor = false; + this.btnPingColor1.Click += new System.EventHandler(this.BtnPingColor1_Click); + // + // btnPingColor3 + // + this.btnPingColor3.BackColor = System.Drawing.Color.LawnGreen; + this.btnPingColor3.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnPingColor3.Location = new System.Drawing.Point(188, 28); + this.btnPingColor3.Name = "btnPingColor3"; + this.btnPingColor3.Size = new System.Drawing.Size(85, 28); + this.btnPingColor3.TabIndex = 9; + this.btnPingColor3.UseVisualStyleBackColor = false; + this.btnPingColor3.Click += new System.EventHandler(this.BtnPingColor3_Click); + // + // lblPingStat1 + // + this.lblPingStat1.AutoSize = true; + this.lblPingStat1.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPingStat1.Location = new System.Drawing.Point(6, 3); + this.lblPingStat1.Name = "lblPingStat1"; + this.lblPingStat1.Size = new System.Drawing.Size(85, 22); + this.lblPingStat1.TabIndex = 6; + this.lblPingStat1.Text = "330"; + this.lblPingStat1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPingColors + // + this.lblPingColors.AutoSize = true; + this.lblPingColors.Location = new System.Drawing.Point(23, 35); + this.lblPingColors.Name = "lblPingColors"; + this.lblPingColors.Size = new System.Drawing.Size(25, 13); + this.lblPingColors.TabIndex = 2; + this.lblPingColors.Text = "329"; + // + // chkUsePing + // + this.chkUsePing.AutoSize = true; + this.chkUsePing.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkUsePing.Location = new System.Drawing.Point(3, 3); + this.chkUsePing.Name = "chkUsePing"; + this.chkUsePing.Size = new System.Drawing.Size(58, 24); + this.chkUsePing.TabIndex = 0; + this.chkUsePing.Text = "328"; + this.chkUsePing.UseVisualStyleBackColor = true; + this.chkUsePing.CheckedChanged += new System.EventHandler(this.ChkUsePing_CheckedChanged); + // + // tabPagePacket + // + this.tabPagePacket.Controls.Add(this.panel5); + this.tabPagePacket.ImageIndex = 2; + this.tabPagePacket.Location = new System.Drawing.Point(4, 39); + this.tabPagePacket.Name = "tabPagePacket"; + this.tabPagePacket.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePacket.Size = new System.Drawing.Size(792, 459); + this.tabPagePacket.TabIndex = 2; + this.tabPagePacket.Text = "303"; + this.tabPagePacket.UseVisualStyleBackColor = true; // // panel5 // @@ -833,6 +997,31 @@ namespace DutyContent.Tab this.ilTabContent.Images.SetKeyName(0, "pix_tab_content.png"); this.ilTabContent.Images.SetKeyName(1, "pix_tab_setting.png"); this.ilTabContent.Images.SetKeyName(2, "pix_tab_tool.png"); + this.ilTabContent.Images.SetKeyName(3, "pix_tab_ping.png"); + // + // tlpnPingColors + // + this.tlpnPingColors.ColumnCount = 4; + this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tlpnPingColors.Controls.Add(this.lblPingStat1, 0, 0); + this.tlpnPingColors.Controls.Add(this.btnPingColor4, 3, 1); + this.tlpnPingColors.Controls.Add(this.btnPingColor2, 1, 1); + this.tlpnPingColors.Controls.Add(this.btnPingColor3, 2, 1); + this.tlpnPingColors.Controls.Add(this.lblPingStat2, 1, 0); + this.tlpnPingColors.Controls.Add(this.lblPingStat4, 3, 0); + this.tlpnPingColors.Controls.Add(this.btnPingColor1, 0, 1); + this.tlpnPingColors.Controls.Add(this.lblPingStat3, 2, 0); + this.tlpnPingColors.Location = new System.Drawing.Point(36, 51); + this.tlpnPingColors.Name = "tlpnPingColors"; + this.tlpnPingColors.Padding = new System.Windows.Forms.Padding(3); + this.tlpnPingColors.RowCount = 2; + this.tlpnPingColors.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tlpnPingColors.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); + this.tlpnPingColors.Size = new System.Drawing.Size(371, 62); + this.tlpnPingColors.TabIndex = 11; // // DutyForm // @@ -845,13 +1034,13 @@ namespace DutyContent.Tab this.Text = "Duty"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DutyTabForm_FormClosing); this.tabContent.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); + this.tabPageContent.ResumeLayout(false); this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel1.PerformLayout(); this.splitContainer1.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); + this.tabPageSetting.ResumeLayout(false); this.panel4.ResumeLayout(false); this.panel4.PerformLayout(); this.panel3.ResumeLayout(false); @@ -860,9 +1049,14 @@ namespace DutyContent.Tab this.panel2.PerformLayout(); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); - this.tabPage3.ResumeLayout(false); + this.tabPagePing.ResumeLayout(false); + this.panel6.ResumeLayout(false); + this.panel6.PerformLayout(); + this.tabPagePacket.ResumeLayout(false); this.panel5.ResumeLayout(false); this.panel5.PerformLayout(); + this.tlpnPingColors.ResumeLayout(false); + this.tlpnPingColors.PerformLayout(); this.ResumeLayout(false); } @@ -870,9 +1064,9 @@ namespace DutyContent.Tab #endregion private System.Windows.Forms.TabControl tabContent; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPageContent; + private System.Windows.Forms.TabPage tabPageSetting; + private System.Windows.Forms.TabPage tabPagePacket; private System.Windows.Forms.ImageList ilTabContent; private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.TreeView treeFates; @@ -931,5 +1125,19 @@ namespace DutyContent.Tab private System.Windows.Forms.TextBox txtPacketDescription; private System.Windows.Forms.Label lblPacketDesc; private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.CheckBox chkOverlayClickThru; + private System.Windows.Forms.TabPage tabPagePing; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Label lblPingColors; + private System.Windows.Forms.CheckBox chkUsePing; + private System.Windows.Forms.Button btnPingColor2; + private System.Windows.Forms.Label lblPingStat4; + private System.Windows.Forms.Label lblPingStat2; + private System.Windows.Forms.Label lblPingStat3; + private System.Windows.Forms.Button btnPingColor4; + private System.Windows.Forms.Button btnPingColor1; + private System.Windows.Forms.Button btnPingColor3; + private System.Windows.Forms.Label lblPingStat1; + private System.Windows.Forms.TableLayoutPanel tlpnPingColors; } } \ No newline at end of file diff --git a/Tab/DutyForm.cs b/Tab/DutyForm.cs index 3201f69..85d6ad2 100644 --- a/Tab/DutyForm.cs +++ b/Tab/DutyForm.cs @@ -10,6 +10,8 @@ using System.Net; using System.Net.Http; using System.Text; using System.IO; +using System.Threading; +using System.Net.NetworkInformation; namespace DutyContent.Tab { @@ -24,9 +26,12 @@ namespace DutyContent.Tab private bool _is_packet_finder; private DcConfig.PacketConfig _new_packet; - private Timer _save_timer; private Overlay.DutyOvForm _overlay; + private System.Timers.Timer _ping_timer; + private long _ping_last; + private Color _ping_color = Color.Transparent; + public DutyForm() { _self = this; @@ -38,8 +43,7 @@ namespace DutyContent.Tab private void DutyTabForm_FormClosing(object sender, FormClosingEventArgs e) { - if (_save_timer != null) - _save_timer.Stop(); + } public void PluginInitialize() @@ -68,6 +72,7 @@ namespace DutyContent.Tab progbOverlayTransparent.Enabled = DcConfig.Duty.EnableOverlay; btnOverlayDimming.Enabled = DcConfig.Duty.EnableOverlay; + chkOverlayClickThru.Checked = DcConfig.Duty.OverlayClickThru; // _overlay.SetText(MesgLog.Text(99, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())); @@ -104,6 +109,13 @@ namespace DutyContent.Tab btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; + // + chkUsePing.Checked = DcConfig.Duty.UsePing; + btnPingColor1.BackColor = DcConfig.Duty.PingColors[0]; + btnPingColor2.BackColor = DcConfig.Duty.PingColors[1]; + btnPingColor3.BackColor = DcConfig.Duty.PingColors[2]; + btnPingColor4.BackColor = DcConfig.Duty.PingColors[3]; + // switch (DcConfig.Duty.ActiveFate) { @@ -115,25 +127,28 @@ namespace DutyContent.Tab UpdateFates(); // - _save_timer = new Timer() { Interval = 5000 }; - _save_timer.Tick += (sender, e) => - { - DcConfig.SaveConfig(); - _save_timer.Enabled = false; - }; + _ping_timer = new System.Timers.Timer() { Interval = 5000 }; + _ping_timer.Elapsed += (sender, e) => PingOnce(); + + if (DcConfig.Duty.UsePing) + _ping_timer.Start(); } public void PluginDeinitialize() { + if (_ping_timer != null) + { + _ping_timer.Stop(); + _ping_timer = null; + } + _overlay.Hide(); _overlay = null; } - private void RefreshSaveFile(int interval = 5000) + private void SaveConfig(int interval = 5000) { - _save_timer.Enabled = false; - _save_timer.Interval = interval; - _save_timer.Start(); + DcControl.Self.RefreshSaveConfig(interval); } public static List MakeDutyLangList() @@ -158,15 +173,17 @@ namespace DutyContent.Tab public void UpdateUiLocale() { - tabContent.TabPages[0].Text = MesgLog.Text(301); - tabContent.TabPages[1].Text = MesgLog.Text(302); - tabContent.TabPages[2].Text = MesgLog.Text(303); + tabPageContent.Text = MesgLog.Text(301); + tabPageSetting.Text = MesgLog.Text(302); + tabPagePacket.Text = MesgLog.Text(303); + tabPagePing.Text = MesgLog.Text(327); lblDataSet.Text = MesgLog.Text(304); lblLogFont.Text = MesgLog.Text(305); chkEnableOverlay.Text = MesgLog.Text(306); lblOverlayTransparent.Text = MesgLog.Text(307); + chkOverlayClickThru.Text = MesgLog.Text(104); chkEnableSound.Text = MesgLog.Text(308); lblSoundInstance.Text = MesgLog.Text(309); @@ -195,6 +212,13 @@ namespace DutyContent.Tab btnPacketStart.Text = MesgLog.Text(10007); btnPacketApply.Text = MesgLog.Text(10009); + + chkUsePing.Text = MesgLog.Text(328); + lblPingColors.Text = MesgLog.Text(329); + lblPingStat1.Text = MesgLog.Text(330); + lblPingStat2.Text = MesgLog.Text(331); + lblPingStat3.Text = MesgLog.Text(332); + lblPingStat4.Text = MesgLog.Text(333); } public void PacketHandler(string pid, byte[] message) @@ -518,7 +542,7 @@ namespace DutyContent.Tab lblCurrentDataSet.Text = DcContent.Language; - RefreshSaveFile(); + SaveConfig(); } } @@ -543,7 +567,7 @@ namespace DutyContent.Tab DcConfig.Duty.LogFontFamily = ret.Name; DcConfig.Duty.LogFontSize = ret.Size; - RefreshSaveFile(); + SaveConfig(); btnLogFont.Font = ret; btnLogFont.Text = $"{DcConfig.Duty.LogFontFamily}, {DcConfig.Duty.LogFontSize}"; @@ -579,7 +603,7 @@ namespace DutyContent.Tab } MakeFatesSelection(true); - RefreshSaveFile(); + SaveConfig(); _is_lock_fate = false; } @@ -595,7 +619,7 @@ namespace DutyContent.Tab DcConfig.Duty.ActiveFate = index; UpdateFates(); - RefreshSaveFile(); + SaveConfig(); } } @@ -634,7 +658,7 @@ namespace DutyContent.Tab DcConfig.Duty.EnableOverlay = chkEnableOverlay.Checked; - RefreshSaveFile(); + SaveConfig(); } private void ProgbOverlayTransparent_Click(object sender, EventArgs e) @@ -647,6 +671,16 @@ namespace DutyContent.Tab _overlay.StartBlink(); } + private void ChkOverlayClickThru_CheckedChanged(object sender, EventArgs e) + { + if (!DcConfig.PluginEnable) + return; + + DcConfig.Duty.OverlayClickThru = chkOverlayClickThru.Checked; + + SaveConfig(); + } + private void ChkEnableSound_CheckedChanged(object sender, EventArgs e) { if (!DcConfig.PluginEnable) @@ -661,7 +695,7 @@ namespace DutyContent.Tab DcConfig.Duty.EnableSound = chkEnableSound.Checked; - RefreshSaveFile(); + SaveConfig(); } // @@ -722,7 +756,7 @@ namespace DutyContent.Tab DcConfig.Duty.SoundInstanceFile = string.IsNullOrEmpty(filename) ? string.Empty : filename; txtSoundInstance.Text = DcConfig.Duty.SoundInstanceFile; - RefreshSaveFile(); + SaveConfig(); } private void BtnSoundFindFate_Click(object sender, EventArgs e) @@ -735,7 +769,7 @@ namespace DutyContent.Tab DcConfig.Duty.SoundFateFile = string.IsNullOrEmpty(filename) ? string.Empty : filename; txtSoundFate.Text = DcConfig.Duty.SoundFateFile; - RefreshSaveFile(); + SaveConfig(); } private async void BtnTestNotify_Click(object sender, EventArgs e) @@ -792,7 +826,7 @@ namespace DutyContent.Tab btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; - RefreshSaveFile(); + SaveConfig(); } private void LblLineNotifyBotLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) @@ -811,7 +845,7 @@ namespace DutyContent.Tab if (e.KeyCode == Keys.Enter) { DcConfig.Duty.NotifyLineToken = txtLineToken.Text; - RefreshSaveFile(); + SaveConfig(); } } @@ -824,7 +858,7 @@ namespace DutyContent.Tab if (!txtLineToken.Text.Equals(DcConfig.Duty.NotifyLineToken)) { DcConfig.Duty.NotifyLineToken = txtLineToken.Text; - RefreshSaveFile(); + SaveConfig(); } var hc = new HttpClient(); @@ -851,7 +885,7 @@ namespace DutyContent.Tab btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; - RefreshSaveFile(); + SaveConfig(); } private void TxtTelegramId_KeyDown(object sender, KeyEventArgs e) @@ -862,7 +896,7 @@ namespace DutyContent.Tab if (e.KeyCode == Keys.Enter) { DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text; - RefreshSaveFile(); + SaveConfig(); } } @@ -874,7 +908,7 @@ namespace DutyContent.Tab if (e.KeyCode == Keys.Enter) { DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text; - RefreshSaveFile(); + SaveConfig(); } } @@ -899,13 +933,13 @@ namespace DutyContent.Tab if (!txtTelegramId.Text.Equals(DcConfig.Duty.NotifyTelegramId)) { DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text; - RefreshSaveFile(); + SaveConfig(); } if (!txtTelegramToken.Text.Equals(DcConfig.Duty.NotifyTelegramToken)) { DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text; - RefreshSaveFile(); + SaveConfig(); } // https://codingman.tistory.com/41 @@ -1123,10 +1157,10 @@ namespace DutyContent.Tab var data = message.Skip(32).ToArray(); // fate - if (data.Length > 4 && data[0] == 0x3E) + if (_new_packet.OpFate == 0 && data.Length > 4 && data[0] == 0x3E) { var cc = BitConverter.ToInt16(data, 4); - if (_packet_target_fates.Contains(cc)) + if (_packet_target_fates.Contains(cc) && _new_packet.OpFate != opcode) { _new_packet.OpFate = opcode; @@ -1141,14 +1175,14 @@ namespace DutyContent.Tab } // duty - if (data.Length > 12) + if (_new_packet.OpDuty == 0 && data.Length > 12) { var rcode = data[8]; if (rcode == 0) { // The Steps of Fath (83) short m = BitConverter.ToInt16(data, 12); - if (m == 83) + if (m == 83 && _new_packet.OpDuty != opcode) { _new_packet.OpDuty = opcode; @@ -1164,14 +1198,14 @@ namespace DutyContent.Tab } // match - if (data.Length > 20) + if (_new_packet.OpMatch == 0 && data.Length > 20) { var rcode = data[2]; if (rcode == 0) { // The Steps of Fath (83) short m = BitConverter.ToInt16(data, 20); - if (m == 83) + if (m == 83 && _new_packet.OpMatch != opcode) { _new_packet.OpMatch = opcode; @@ -1187,12 +1221,12 @@ namespace DutyContent.Tab } // instance - if (data.Length >= 16) + if (_new_packet.OpInstance == 0 && data.Length >= 16) { // The Steps of Fath (83) short m = BitConverter.ToInt16(data, 0); short u = BitConverter.ToInt16(data, 2); - if (m == 83 && u == 0) + if (m == 83 && u == 0 && _new_packet.OpInstance != opcode) { _new_packet.OpInstance = opcode; @@ -1279,5 +1313,156 @@ namespace DutyContent.Tab } } } + + private void ChkUsePing_CheckedChanged(object sender, EventArgs e) + { + if (!DcConfig.PluginEnable) + return; + + DcConfig.Duty.UsePing = chkUsePing.Checked; + + SaveConfig(); + + if (chkUsePing.Checked) + _ping_timer.Start(); + else + { + _ping_timer.Stop(); + _overlay.ResetStat(); + } + } + + private Color PingColorSelectDialog(Color current) + { + Color color = (Color)WorkerAct.Invoker(new WorkerAct.ObjectReturnerDelegate(() => + { + var dg = new ColorDialog() + { + AnyColor = true, + Color = current, + }; + + return dg.ShowDialog() == DialogResult.OK ? dg.Color : current; + })); + + return color; + } + + private void BtnPingColor1_Click(object sender, EventArgs e) + { + var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[0]); + if (DcConfig.Duty.PingColors[0] != ret) + { + btnPingColor1.BackColor = ret; + DcConfig.Duty.PingColors[0] = ret; + SaveConfig(); + } + } + + private void BtnPingColor2_Click(object sender, EventArgs e) + { + var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[1]); + if (DcConfig.Duty.PingColors[1] != ret) + { + btnPingColor2.BackColor = ret; + DcConfig.Duty.PingColors[1] = ret; + SaveConfig(); + } + } + + private void BtnPingColor3_Click(object sender, EventArgs e) + { + var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[2]); + if (DcConfig.Duty.PingColors[2] != ret) + { + btnPingColor3.BackColor = ret; + DcConfig.Duty.PingColors[2] = ret; + SaveConfig(); + } + } + + private void BtnPingColor4_Click(object sender, EventArgs e) + { + var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[2]); + if (DcConfig.Duty.PingColors[2] != ret) + { + btnPingColor4.BackColor = ret; + DcConfig.Duty.PingColors[2] = ret; + SaveConfig(); + } + } + + // + private void PingOnce() + { + if (!DcConfig.PluginEnable) + return; + + var conns = DcConfig.Connections.CopyConnection(); + if (conns.Length == 0) + return; + + long rtt = 0; + double loss = 0.0; + + foreach (var row in conns) + { + var p = CalcPing(row.RemoteAddress); + + if (rtt < p.Rtt) + rtt = p.Rtt; + + if (loss < p.Loss) + loss = p.Loss; + } + + //MesgLog.L("Ping: {0}, {1}%", rtt, loss); + + Color color; + if (loss > 0.0 || rtt > 150) + color = DcConfig.Duty.PingColors[3]; + else if (rtt > 100) + color = DcConfig.Duty.PingColors[2]; + else if (rtt > 50) + color = DcConfig.Duty.PingColors[1]; + else + color = DcConfig.Duty.PingColors[0]; + + if (_ping_last != rtt || loss > 0.0 || _ping_color != color) + { + _ping_last = rtt; + _ping_color = color; + + _overlay.SetStatPing(color, rtt, loss); + } + } + + private static PingOptions _ping_options = new PingOptions { DontFragment = true }; + private static byte[] _ping_buffers = Encoding.ASCII.GetBytes("01234567890123456789012345678901"); + private static int _ping_timerout = 120; + + // + private (long Rtt, double Loss) CalcPing(IPAddress host, int amount = 6) + { + var ps = new Ping(); + + int failed = 0; + long rtt = 0; + + for (var i = 0; i < amount; i++) + { + PingReply pr = ps.Send(host, _ping_timerout, _ping_buffers, _ping_options); + + if (pr.Status != IPStatus.Success) + failed++; + + if (rtt < pr.RoundtripTime) + rtt = pr.RoundtripTime; + } + + double loss = (failed / amount) * 100; + + return (rtt, loss); + } } } diff --git a/Tab/DutyForm.resx b/Tab/DutyForm.resx index c666ff9..368fba3 100644 --- a/Tab/DutyForm.resx +++ b/Tab/DutyForm.resx @@ -124,285 +124,307 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAA - QQAAAk1TRnQBSQFMAgEBAwEAAdABAAHQAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA - AwABIAMAAQEBAAEgBgABQBoAAzYEWQHEA1UB6gMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/ - Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DXQHi - A1QBrgMpAT8IAAMHAQoDSAGFAh0BqgH/AhgBqgH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/ - AhcBpAH/AhcBowH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/ - AhcBogH/AhcBogH/AhcBowH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhgBqgH/ - Ah0BqgH/A0gBhQMHAQr/AAUAA04BlwM+Af8DsgH/A80B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAW + RgAAAk1TRnQBSQFMAgEBBAEAARABAQEQAQEBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA + AwABQAMAAQEBAAEgBgABgP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AWgADNgRZAcQDVQHqAxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/ + AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/ + AxUB/wNdAeIDVAGuAykBPwgAAwcBCgNIAYUCFQGqAf8CEAGqAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGk + Af8CDwGkAf8CDwGkAf8CDwGjAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGi + Af8CDwGiAf8CDwGiAf8CDwGiAf8CDwGjAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGk + Af8CEAGqAf8CFQGqAf8DSAGFAwcBCv8ABQADTgGXAzYB/wOyAf8DzQH/A90B/wPdAf8D3QH/A90B/wPd Af8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd - Af8DyAH/A6IB/wMvAf8DRgGBBAADSAGFAhcBpAH/AhcBogH/AhcBoQH/AhcBoQH/AhcBoQH/AhcBoQH/ - AhcBoQH/AhQBoAH/AhQBngH/AhQBmwH/AhQBmQH/AhQBmQH/AhQBlwH/AhQBlQH/AhQBlQH/AhQBlQH/ - AhQBlQH/AhQBlwH/AhQBmQH/AhQBmQH/AhQBmwH/AhQBngH/AhQBoAH/AhcBoQH/AhcBoQH/AhcBoQH/ - AhcBoQH/AhcBoQH/AhcBogH/AhcBpAH/A0gBhVcAAQEDAgQDBAQBBgMEAQYDAwEEAwEBAgMAAQGMAAM3 - AVoDSgH/A9sB/wOLAf8DNAH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd - Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wM0Af8DhwH/A80B/wM2 - Af8DKwFCAhcBpAH/AhcBogH/AhQBnQH/AhIBmAH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/Ag8BkQH/ - Ag8BjwH/Ag8BjAH/Ag8BigH/Ag8BigH/Ag0BiAH/AgoBhgH/AgoBhgH/AgoBhgH/AgwBhgH/Ag8BiAH/ - Ag8BigH/Ag8BigH/Ag8BjAH/Ag8BjwH/Ag8BlQH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBmAH/ - AhQBnQH/AhcBogH/AhcBpAH/UAADAgEDAwYBCAMNARIDGgEkAyMBMwMhATADFgEeAwoBDgMEAQYDAAEB - iAADWQHDA7IB/wOKAf8BWgFIAS4B/wG5AZMBQAH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG - Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BvQGVAT4B/wGj - AYABMgH/Ab0BlQE+Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG - Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BuQGTAUAB/wFlAVABMQH/A4UB/wOjAf8DVAGrAhcBowH/ - AhQBmgH/AhABkQH/AgkBjQH/AggBjQH/AggBigH/AggBhgH/AggBgQH/AggBZAH/AggBYgH/AggBXQH/ - AggBXAH/AggBXAH/AgcBXAH/AgYBWAH/AgYBVQH/AgYBVQH/AgcBWAH/AggBXAH/AggBXAH/AggBXAH/ - AggBXQH/AggBYgH/AggBgAH/AggBhgH/AggBhgH/AggBigH/AggBjQH/AgkBjQH/AhABkQH/AhQBmgH/ - AhcBowH/TAADAgEDAwcBCgMXASADMAFMAUUCRgF+AU8CUQGcAU0CTgGWA0EBcgMqAUEDEgEZAwUBBwMA - AQGEAANBAfkDygH/AzIB/wG5AY8BPwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi - AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8BxAGVAT8B/wGJAVEBKwH/ - ASYBNQE7Af8BlAFWASoB/wHTAaEBRgH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi - AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AcABkwFBAf8DKwH/A8UB/wNOAfACFQGZ - Af8CCwGLAf8CBgFiAf8CBgFeAf8CBgFWAf8CBgFWAf8CBgFRAf8CBgFOAf8CBgFNAf8CBgFKAf8CBgFG - Af8CBgFGAf8CBgFFAf8CBgFCAf8CBgE+Af8CBgE+Af8CBgE+Af8CBgE+Af8CBgFCAf8CBgFFAf8CBgFG - Af8CBgFGAf8CBgFKAf8CBgFNAf8CBgFQAf8CBgFWAf8CBgFWAf8CBgFWAf8CBgFeAf8CBgFiAf8CCwGL - Af8CFQGZAf9IAAMBAQIDBwEJAxgBIgM4AV4BUwJVAa0BXQJhAeIBbQF/AYIB9wJlAWYB9AFeAmEB2gNQ - AZoDLQFGAw4BEwMDAQSEAAMdAf8DwgH/Ax8B/wHMAZUBRAH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/ - AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/Ab8BiwE8Af8BkwFR - ASkB/wElATMBPAH/AQABOwGOAf8BVAFBAS0B/wGVAVIBKQH/Ac8BlwFDAf8B1QGbAUYB/wHVAZsBRgH/ - AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AcUBkAFCAf8DJQH/ - A8IB/wMdAf8CEwGRAf8BDQESAYIB/wENASkBhAH/ARMBMgGFAf8BEwEyAYAB/wETATQBgwH/ARMBNAGD - Af8BEwE0AYMB/wETATQBZAH/ARMBNAFkAf8BEwE0AWQB/wETATQBZAH/ARMBNAFfAf8BEwExAVwB/wET - ATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBYQH/ARMBMQFh - Af8BEwExAWEB/wETATEBYQH/ARMBMgGDAf8BEwE0AYMB/wETATQBgwH/ARMBNAGDAf8BEwE0AYgB/wEP - ASkBhwH/AQ0BEgGDAf8CEwGRAf9HAAEBAwYBCAMWAR4DOAFdA1UBtQNkAfEB8wH4AfwB/wHtA/8B8wP/ - AagBuAHCAf4DXwHgA0gBhQMfASwDBQEHhAADHQH/A7QB/wMdAf8BzgGQAUMB/wHVAZQBRQH/AdUBlAFF - Af8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHUAZMBRQH/AdABkQFDAf8BtAFjATYB/wGK - AUkBKQH/ARsBMQFBAf8BAAEfAV4B/wEAAR8BWQH/AQABJgFfAf8BPgE3ATEB/wGSAUwBKAH/AbkBgAE4 - Af8B0gGSAUQB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHF - AYsBQQH/AyQB/wO0Af8DHQH/Ag4BigH/ARIBKwGHAf8BJAGFAakB/wE7AasB1AH/AVQB0QHeAf8BWQHU - AeEB/wFcAdQB4QH/AV4B1AHhAf8BXgHUAeEB/wFcAdQB4QH/AVkB1AHhAf8BWQHUAeEB/wFZAdMB4AH/ - AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHR - Ad4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB4QH/AVkB1AHhAf8BWQHUAeEB/wFUAdQB4QH/ - ATwBsgHYAf8BJgGFAa8B/wESASsBiwH/Ag4BigH/QwABAQMFAQcDFAEbAzUBVgNUAa8BWgJdAfAB8wH4 - AfwB/wHUA/8BxAH8Av8BxgH+Av8B6AP/AYcBjwGTAfsBVQJWAbEDLQFFAwcBCoQAAx0B/wOnAf8DHQH/ - Ac4BhwFCAf8B1QGLAUQB/wHVAYsBRAH/AcsBhAFAAf8BvQFhATkB/wHEAYABPQH/AcABYwE7Af8BlQFH - ASgB/wGNAUQBKQH/AUIBNQExAf8BAAEpAVYB/wEAAQ4BTAH/ASQBkQGyAf8BWQHVAeYB/wEBAUIBiQH/ - AQABFAFSAf8BBwEtAU0B/wFYATsBLAH/AZIBRgEoAf8BsQFaATQB/wHDAYABPAH/AcMBgAE8Af8BugFg - ATgB/wHTAYoBQwH/AdUBiwFEAf8BxQGCAUAB/wMkAf8DpwH/Ax0B/wINAYEB/wEWATcBkAH/ATcBoQHC - Af8BKAFhAaQB/wEcATMBYgH/AR0BMwGEAf8BHgEzAYgB/wEfATMBiAH/AR8BMwGBAf8BHgEzAYEB/wEd - ATMBgQH/AR0BMwFiAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFhAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFh - Af8BHQEzAWEB/wEdATMBYQH/AR0BMwGBAf8BHQEzAYEB/wEdATMBgQH/AR0BMwGBAf8BHwE0AYgB/wEi - ATcBiAH/AR0BMwGEAf8BHAEzAWIB/wEoAWMBpAH/ATcBoQHDAf8BFgE3AZEB/wINAYEB/z8AAQEDBAEG - AxIBGAMyAVADUgGpAVkCZAHsAagBuAHCAf4B2QP/AcQB/AL/AcMB+wL/AcMB+wL/AdcD/wGrAbIBtgH9 - AVcCWQG/AzIBUAMIAQuEAAMdAf8DmwH/Ax0B/wHOAWUBQAH/AdUBgwFCAf8BywFjAT4B/wGDATwBKQH/ - AU4BNAEsAf8BXAE3ASoB/wFUATUBKwH/ASUBMgE9Af8BAAEsAVoB/wEAARQBVgH/AQABMQFgAf8BUwHQ - AecB/wFeAd0B8QH/AUMBpwGxAf8BZAHhAfcB/wE6AakBxQH/AQABFQFMAf8BAAEgAV0B/wEAAS8BUgH/ - ATYBMgE0Af8BWgE2ASoB/wFbATYBKgH/AUkBNAEwAf8BlAFBASYB/wHTAYIBQQH/AcUBYQE+Af8DIwH/ - A5sB/wMdAf8CDQFkAf8BFwE4AYsB/wEwAZwBvQH/AQ4BHwFPAf8BCQESAVsB/wETATkBmAH/ARIBPAGd - Af8BEgE6AZ0B/wESATkBnAH/ARIBOQGWAf8BEQE4AZUB/wEUATYBkQH/AQYBEAFbAf8CCAFSAf8CCAFS - Af8CCAFSAf8CCAFSAf8CCAFSAf8BBwEOAVkB/wETATIBkgH/ARIBNAGUAf8BDAEqAY0B/wEWAUABmAH/ - AQgBIwGOAf8BFgFAAZ8B/wESATABkwH/AQ4BEwFbAf8CCAFMAf8BDgEdAU0B/wEwAZcBtAH/ARcBNwGI - Af8CDQFkAf87AAEBAwQBBgMQARUDLAFDAU8CUAGbAVgCYgHpAagBuAHCAf4B3gP/AcYB/gL/AcMB+wL/ - AcMB+wL/AcgD/wHsA/8BhwGQAZMB+wFVAlYBsQMtAUUDBwEKhAADHQH/A5MB/wMdAf8BzAFdAT4B/wHT - AWABQAH/Ac4BXQE+Af8BigE5ASYB/wEGAUEBhAH/AQABOQGNAf8BAAExAYgB/wEAAScBgQH/ARUBXAGf - Af8BVwHVAeYB/wGQAe8B/gH/AToBmwG8Af8BRgEcATMB/wGRARgBMQH/ATUBMgFKAf8BUQHKAeYB/wGQ - Ae0B+gH/AUEBtAHKAf8BAQFCAZIB/wEAASkBgQH/AQABMgGHAf8BAAFDAZYB/wEjATMBRgH/AZMBOwEl - Af8B0gFgAUAB/wHDAVkBPAH/AyIB/wOTAf8DHQH/Ag0BZAH/ARcBOQGLAf8BMAGdAb0B/wEOAR8BVgH/ - AREBOAGVAf8BTQHWAekB/wFOAdcB8AH/AU0B0gHwAf8BTQHRAfAB/wFNAdEB7gH/AUoBzQHrAf8BRwHF - AecB/wEIARwBigH/Ag8BXAH/Ag8BXAH/Ag8BXAH/Ag8BXAH/AQ4BEAFdAf8BBgEeAYwB/wFIAcEB4gH/ - AUIBxAHoAf8BIAGKAc8B/wFWAeEB9QH/AQ0BVgHDAf8BWAHhAfUB/wEzAaIB1QH/AQgBHQGSAf8BBwEM - AVgB/wEOAR0BVQH/AS4BlAG0Af8BFwE0AYgB/wINAWQB/zgAAwQBBQMNARIDKAE8A0oBigFeAmEB2gGo - Aa8BtQH9AeID/wHGAf4C/wHDAfsC/wHDAfsC/wHJA/8B6QP/AagBrwG1Af0BXAJhAdwDRwGCAx0BKgMF - AQeEAAMdAf8DjwH/Ax0B/wHJAVoBPQH/AdABXQE/Af8B0AFdAT8B/wGmAUUBLQH/ASsBLwE9Af8BEQFb - AaMB/wFDAasB0gH/AZIB6wH4Af8BiQHqAfcB/wFCAaIBvAH/AUIBLwFIAf8BmgEjAUkB/wG/ATYBiwH/ - AcEBOwGTAf8BuwE0AYIB/wGCARwBOwH/AToBSwFlAf8BUQHDAdsB/wGTAfAB/AH/AYYB4QHzAf8BMAGR - AbkB/wEKAVYBnwH/AVgBMAEoAf8BvAFSATcB/wHQAV0BPwH/AcABVgE7Af8DIgH/A48B/wMdAf8CDQFk - Af8BFwE5AYsB/wEwAZ0BvQH/AQ4BHwFaAf8BDgE6AZ8B/wFUAeIB9QH/AVsB7AL/AWAB7gL/AWEB7gL/ - AWEB7gL/AWEB7gL/AUABwAHrAf8BCAEcAY8B/wIPAWEB/wIPAV4B/wIPAVwB/wIPAV0B/wELARQBggH/ - ASIBYAG+Af8BUgHaAfgB/wEiAZgB3wH/AUEBxAHxAf8BNQG2AeoB/wEtAawB5QH/AU0B1gH5Af8BJwGf - AeEB/wEwAZ8B0wH/AQ4BKQGMAf8BDQEdAVgB/wErAZQBtAH/ARcBNAGIAf8CDQFkAf8kAAMBAQIDAwQE - BAYECAELAw8BFAMkATYBRgJHAYABWAJcAdEBhwGQAZQB+wHpA/8ByAP/AcMB+wL/AcMB+wL/AcwD/wHw - A/8BhwGQAZQB+wFZAl0B1wNMAZIDKwFCAw0BEgMDAQSEAAMdAf8DjwH/Ax0B/wHHAVgBPQH/Ac4BWwE/ - Af8BzgFbAT8B/wGmAUUBLgH/AisBOQH/AQcBSwGQAf8BKgGHAakB/wEdATIBSgH/AVEBFQEsAf8BpQEk - AUwB/wHCATcBjAH/AcsBRgGkAf8B0gFOAbEB/wHUAU8BtAH/AdEBTAGwAf8BygFFAaIB/wG+ATUBhAH/ - AZIBHgFCAf8BQwEaASwB/wEVAUUBYwH/AS8BigGsAf8BAAFAAYgB/wFXATABKAH/Ab0BUQE4Af8BzgFb - AT8B/wG/AVUBOwH/AyIB/wOPAf8DHQH/Ag0BZAH/ARcBOAGLAf8BMAGcAbkB/wEOAR8BVAH/AQ4BOgGf - Af8BVAHhAfUB/wFZAecC/wFaAegC/wFbAegC/wFdAeoC/wFhAe4C/wFAAcAB6wH/AQgBHAGOAf8CDwFb - Af8CDwFaAf8CDwFZAf8CDwFZAf8BCwEVAYEB/wE4AaEB1AH/AVkB5gL/AQ8BUgHBAf8BWQHmAv8BIQGP - AdQB/wFGAckB8QH/AUYByQHxAf8BIQGPAdUB/wFPAdwB9QH/ARMBOAGYAf8BDgEdAVMB/wEvAZQBtAH/ - ARcBNAGIAf8CDQFkAf8cAAMCAQMDBgEIAw0BEQMXASADIgEyAyoBQAMsAUMDMQFOA0cBggFZAlwBzAF2 - AYABjAH6Ae0D/wHJA/8BwwH7Av8BwwH7Av8BzQP/AfgD/wFtAXoBfgH4AVwCXgHOAUgCSQGHAysBQgMR - ARcDBAEGAwABAYQAAx0B/wOQAf8DHQH/AcUBVgE8Af8BzAFZAT4B/wHMAVkBPgH/AaQBQgEtAf8BKAEr - ATsB/wEDAUUBiQH/AQUBSgGNAf8BNAEkAT4B/wG8AS0BYgH/AcQBPQGcAf8B0QFNAa8B/wHcAVkBwQH/ - AeYBYgHNAf8B6QFlAdIB/wHmAWMBzQH/Ad0BWgHBAf8B0AFNAa8B/wHFAT4BmwH/AbMBKQFRAf8BBAEy - AVMB/wEWAVEBkAH/AQABOgGDAf8BVgEvASgB/wG7AVABNwH/AcwBWQE+Af8BvQFTAToB/wMiAf8DkAH/ - Ax0B/wINAWQB/wEXATgBiwH/ATABmwG4Af8BDgEeAVIB/wERATIBkgH/AT0BuwHgAf8BQQG8AeYB/wFB - Ab8B5gH/AUgBvwHkAf8BSAHBAecB/wFIAcUB6wH/AUMBvwHkAf8BCAEZAYQB/wIOAVkB/wINAVkB/wIH - AVkB/wIHAVkB/wEKAQ0BXAH/AQcBFgGFAf8BCAEcAY0B/wEIARcBiAH/AQgBHAGPAf8BCAEYAYsB/wEI - ARsBlAH/AQkBHAGWAf8BDAEcAZMB/wEIARwBkgH/AQYBEAFdAf8BDgEdAVIB/wEwAZQBtAH/ARcBNAGI - Af8CDQFkAf8XAAEBAwQBBQMKAQ4DGgElAzEBTQNEAXkBTwJQAZsBUwJUAawDVAGuA1UBtQFaAl4B2AFt - AXoBggH3AfQD/wHKA/8BwwH7Av8BxAH8Av8B0Qf/AW0BegGCAfcBWAJbAcYDQwF4AyYBOAMQARUDBAEG - AwABAYgAAx0B/wOSAf8DHQH/AcMBUwE7Af8BygFWAT0B/wHIAVUBPAH/AYwBNAEjAf8BEQEqAUcB/wEM - AUoBjAH/AQwBVgGdAf8BUQEiAT4B/wHCATcBkAH/Ac0BSAGrAf8B3gFcAcQB/wHvAYcB2gH/AfsBkwHs - Af8B/QGYAfQB/wH7AZMB7AH/Ae8BhwHaAf8B3gFcAcQB/wHOAUgBrAH/Ab0BNAGEAf8BIAE0AVQB/wEe - AV0BnQH/AQABOQGEAf8BRAErAS0B/wGwAUgBMgH/AcoBVgE9Af8BuwFQATkB/wMiAf8DkgH/Ax0B/wIN - AWQB/wEXATgBigH/ATABlwG2Af8BDgEdAVIB/wEHAQ4BWwH/AQoBGwGPAf8BCgEdAZcB/wEKAR0BlwH/ - AQoBHQGPAf8BCgEdAY8B/wEKAR0BjwH/AQoBGgGIAf8BCgEOAV0B/wIJAVkB/wIGAVkB/wIGAVkB/wIG - AVkB/wIGAVkB/wIJAVkB/wIOAVkB/wIPAVsB/wIPAWEB/wIPAWEB/wIPAWUB/wIPAYMB/wIPAYMB/wIP - AWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wINAWQB/xMAAQEDBAEGAw8BFAMkATUBPwJA - AW8DVgGzAVsCYQHhAmUBZgH0AXEBfQGKAfoBbQF6AX4B+AFZAWYBawH1AWgBegGGAvoD/wHNA/8BwwH7 - Av8BxAH8Av8B1AP/AfMB+AH8Af8BWQFnAWwB9QFWAlgBwQNAAXADIAEuAwsBDwMEAQUDAAEBjAADHQH/ - A5YB/wMdAf8BwQFQATsB/wHIAVMBPAH/AcQBUQE6Af8BhwExASMB/wEAATABWgH/AR4BWAGXAf8BEAFT - AZcB/wGAASEBQgH/AcYBPQGaAf8B1QFRAbcB/wHqAYAB0gH/AfwBlgHxAv8BqAH+Av8BrwP/AagB/gH/ - AfwBlgHxAf8B6gGAAdIB/wHWAVEBtwH/AcUBOwGTAf8BNwEtAUkB/wEcAV8BoAH/AQQBRQGNAf8BIgEq - AT4B/wGMATIBIgH/AccBUwE8Af8BuQFNATkB/wMjAf8DlgH/Ax0B/wINAWMB/wEXATYBhQH/AS0BlQG0 - Af8BDQEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAV4B/wIPAVoB/wIJ - AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wINAVkB/wIPAVsB/wIPAWEB/wIP - AWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wIN - AWQB/xAAAwIBAwMLAQ8DIwE0AUQCRQF8AVcCWgHFAW0BfQGDAfcB8wH4AfwB/wHxA/8B5wP/AeoD/wHv - A/8B5AP/Ac0D/wHDAfsC/wHGAf4C/wHaA/8B8wH4AfwB/wFkAWUBZgH0AVYCWAG8Az0BaQMdASoDCgEN - AwMBBJQAAx0B/wOaAf8DHQH/Ab4BTwE6Af8BxQFRATsB/wGvAUUBMgH/AVEBKwEmAf8BAAE6AYsB/wE1 - AYkBqwH/AQ4BQgFlAf8BqQEpAVMB/wHIAUEBoQH/AdoBVgG8Af8B8AGIAdwB/wH+AZ8B+gL/AbQD/wHC - A/8BtAL/Af4BnwH6Af8B8AGIAdwB/wHbAVYBvQH/AckBQAGdAf8BXQEiAUEB/wEYAVwBnQH/ASQBYQGi - Af8BAAEvAVoB/wGGATABIgH/AcMBUAE6Af8BtgFMATgB/wMjAf8DmgH/Ax0B/wINAWIB/wEXATQBgwH/ - AS8BlAG0Af8BDgEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAVwB/wIP - AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIHAVkB/wIPAVkB/wIP - AV0B/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0 - AYgB/wINAWQB/xAAAwMBBAMYASEDPQFpAVcCWQG/AXkBgQGMAfoB8QP/Ac4D/wHEAfwC/wHDAfsC/wHD - AfsC/wHDAfsC/wHDAfsC/wHDAfsC/wHGAf4C/wHeA/8BqAG4AcIB/gFOAl0B8AFVAlcBtwM7AWMDGgEl - AwkBDAMDAQSYAAMdAf8DnwH/Ax0B/wG7AUwBOQH/AcABTQE5Af8BhgEvASEB/wEUASkBQgH/AQUBSAGU - Af8BPAGVAbkB/wEsATMBTgH/AbgBLAFgAf8BxwFBAaAB/wHZAVUBuwH/Ae8BhQHaAf8B/gGdAfoC/wGx - A/8BvAP/AbEC/wH+AZ0B+gH/Ae8BhQHaAf8B2QFVAbwB/wHHAUABnwH/AaQBJgFPAf8BFwFMAYkB/wFC - AZcBuAH/AQABOAGKAf8BUAEqAScB/wGtAUMBMQH/AbMBSQE3Af8DIwH/A58B/wMdAf8CDQFiAf8BFwE0 - AYMB/wEwAZQBtAH/AQ4BHQFSAf8BCQEaAWQB/wEWAUQBrAH/ARcBSQG2Af8BFQFHAbAB/wEPATYBogH/ - AQsBIAGOAf8BDAETAWQB/wIPAVsB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIG - AVkB/wIHAVkB/wIPAVkB/wIPAVwB/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEO - AR0BUgH/AS8BlAG0Af8BFwE0AYgB/wINAWQB/xAAAwQBBgMjATMBTQJOAZUCZQFmAfQE/wHaA/8B2QP/ - AeAD/wHdA/8BzwP/AcUB/QL/AcMB+wL/AcMB+wL/AdMD/wGoAbgBwgH+AU4CXQHwAVUCVwG3AzoBYAMY - ASIDCAELAwIBA5wAAx0B/wOkAf8DHQH/AbkBSQE3Af8BoAE7ASsB/wFLAScBJQH/AQABKQFhAf8BKwFg - AaIB/wETAVEBkgH/AVkBGQEqAf8BtwEsAWMB/wHCAT0BmwH/AdMBTwGzAf8B5gFkAc8B/wH6AZEB6wL/ - AaAB/AL/AagB/gL/AaAB/AH/AfoBkQHrAf8B5gFkAc8B/wHTAU8BtAH/AcMBPAGaAf8BtgEqAVcB/wEt - ASUBOQH/AScBYgGkAf8BCAFGAZEB/wEPASEBPQH/AYQBLQEfAf8BqQFCATIB/wMjAf8DpAH/Ax0B/wIN - AWMB/wEXATQBhQH/ATABlAG0Af8BDgEdAVIB/wEVAToBkgH/AVQB5AH1Af8BWQHpAv8BUgHgAfgB/wE1 - AbEB3wH/AR0BUgG1Af8BDwEhAYoB/wEPAREBWwH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/ - AgYBWQH/AgYBWQH/Ag0BWQH/Ag8BWgH/Ag8BXgH/Ag8BYwH/AQwBFAGEAf8BCwEZAY0B/wELARcBjAH/ - AQ4BEgGDAf8CCAFUAf8BDQEdAVIB/wEtAZUBtAH/ARcBNgGIAf8CDQFkAf8QAAMEAQYDIgEyAUwCTQGR - AmQBZQHxAasBsQG0Af0BnAGxAb8B/gGoAa8BtQH9AYEBjQGTAfsBcAGIAZoB/AHnAfEB+AH/AdUD/wHD - AfsC/wHDAfsC/wHgA/8BXwGIAZEB+wFaAl0B0wNCAXQDGgElAwYBCAMBAQKgAAMdAf8DqgH/Ax0B/wGp - AT8BMAH/AVMBKAElAf8BRAGWAbUB/wFdAcEB5AH/AZQB2AHrAf8BAAE3AYgB/wEGASoBSwH/AaEBIgFK - Af8BvwE1AY4B/wHKAUUBpgH/AdoBVgG8Af8B6AGBAdIB/wH0AYoB4QH/AfkBkAHoAf8B9AGKAeEB/wHo - AYEB0gH/AdoBVgG9Af8BywFFAaUB/wHAATQBigH/AWMBIQE+Af8BAAEoAVgB/wEkAWIBqQH/AZwB4QHv - Af8BTwGwAdYB/wE3ATABOAH/AZABNAEnAf8DJAH/A6oB/wMdAf8CDQFkAf8BFwE0AYgB/wEwAZQBtAH/ - AQ4BHQFSAf8BCwEkAYoB/wEeAYwBzwH/AR4BkwHcAf8BHwGPAdUB/wEVAVwBwwH/AQ8BNgGlAf8BCgEa - AYkB/wEKARABYAH/Ag4BWQH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgkBWQH/Ag4BWQH/ - Ag8BWwH/Ag8BYwH/AQ8BHgGOAf8BHAFUAbgB/wEyAZoB0gH/ASkBjQHLAf8BEwE7AaUB/wEIARABXAH/ - AQ4BHQFSAf8BMAGXAbYB/wEXATgBigH/Ag0BZAH/EAADAwEEAxYBHgM2AVkBTwJRAZwBVwJZAb8BWQJc - AckBWgJdAcoBXAJeAc4BWAJfAeMBVwFiAWUB9gHwA/8BwwH7Av8BwwH7Av8B3QP/AXoBlAGgAfwDWQHH - AzcBWwMPARQDAAEBpAADHQH/A7AB/wMdAf8BrwFAATMB/wFiAScBHwH/AUUBIgEkAf8BQAFcAYUB/wGw - Ae4B9wH/AZsB4wHvAf8BAAE6AZEB/wEPATYBTwH/AaUBJgFSAf8BwAE5AZUB/wHLAUcBqQH/AdYBUgG3 - Af8B3gFcAcIB/wHhAV4BxgH/Ad4BXAHCAf8B1gFSAbcB/wHLAUcBqAH/AcMBOAGRAf8BgQEiAUQB/wEA - AUABgAH/ARcBWgGlAf8BtwHzAfoB/wGWAdoB5AH/ATgBLQE1Af8BWAEmASEB/wGjATsBMAH/AyQB/wOw - Af8DHQH/Ag0BZAH/ARcBNAGIAf8BMAGUAbQB/wEOAR0BUgH/AQsBMgGPAf8BPgHHAegB/wFFAdAB8wH/ - AUYBywHyAf8BPAG7AeYB/wEmAY0BzAH/ARIBPQGlAf8BDQEZAYEB/wEIAQ4BWQH/AgcBWQH/AgYBWQH/ - AgYBWQH/AgYBWQH/AgYBWQH/AgcBWQH/AggBWQH/Ag8BWQH/AQwBEgFjAf8BGAFSAbUB/wFHAdAB8QH/ - AVcB6QH9Af8BVAHlAfsB/wEwAakB3AH/AQoBIQGEAf8BDgEeAVIB/wEwAZsBuAH/ARcBOAGLAf8CDQFk - Af8QAAMCAQMDCgENAxwBJwMvAUkDPAFmA0QBegNIAYQBTgJPAZcBWQJcAcwBUwJkAfEE/wHDAfsC/wHD - AfsC/wHXA/8BqwGyAbYB/QNbAcgDNwFaAwsBD6gAAx0B/wO2Af8DHQH/AbABPwEzAf8BsgE/ATIB/wGf - ATYBKgH/AWMBJgEdAf8BKgEiATEB/wGTAdQB6AH/AZYB3gHvAf8BAAFJAZYB/wEiAS0BRAH/AbgBKgFd - Af8BvwE3AZMB/wHGAUABoAH/AcsBRgGmAf8BzQFIAaoB/wHLAUYBpgH/AcYBQAGgAf8BwAE3AZEB/wGd - ASUBTgH/AQUBQgFcAf8BFwFZAagB/wGvAesB+AH/AVYBoAHDAf8BSAIhAf8BZQEmARwB/wGtAT0BMAH/ - AakBPQEyAf8DJAH/A7YB/wMdAf8CDQFkAf8BFwE0AYgB/wEvAZQBtAH/AQ4BHQFSAf8BCQEtAY4B/wE3 - AcMB5wH/AT4BzgHyAf8BPgHIAfIB/wE0AbQB5gH/ASEBigHKAf8BEQE7AZ8B/wEHARUBXwH/AgYBUAH/ - AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTwH/AQUBDwFdAf8BKAGV - AcsB/wFMAekB/QH/AU4B7gL/AU4B7gL/AUAB1QHwAf8BCQEuAZAB/wEOAR8BUgH/ATABnAG5Af8BFwE4 - AYsB/wINAWQB/xMAAQEDBwEJAxYBHwMvAUkBQQJCAXMBTAJNAZEBUAJSAaMBVQJXAboDXwHgAUkBYgFl - AfYB8wP/AcMB+wL/AcMB+wL/Ad0D/wF6AZQBoAH8AVcCWgG9AzEBTwMJAQyoAAMdAf8DuwH/Ax0B/wGt - ATwBMgH/AbMBPgEzAf8BswE+ATMB/wGoATkBLgH/AWIBIwEcAf8BKgEiATEB/wGRAdEB6gH/AWEBugHd - Af8BAgFSAZMB/wFLAR8BOgH/AbgBKAFgAf8BvAEwAYcB/wHAATIBigH/Ab8BMwGMAf8BwAEyAYoB/wG8 - AS8BhgH/AbQBJwFYAf8BHgEwAUUB/wEMAVgBogH/AZ0B3gHxAf8BVgGgAcYB/wFKASABIQH/AZYBMAEn - Af8BsgE+ATMB/wGzAT4BMwH/AaYBOgExAf8DJQH/A7sB/wMdAf8CDQFkAf8BFwE0AYgB/wErAZQBtAH/ - AQ0BHQFSAf8BAwEfAYUB/wEVAYIBygH/ARQBjgHXAf8BFAGKAdcB/wEUAYYBzwH/ARQBXAHAAf8BDgFD - AaoB/wEKASQBjAH/AgYBSwH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRwH/ - AgYBSQH/AQMBDAFZAf8BHgGAAcEB/wFBAeMB+wH/AUUB7gL/AUUB7gL/ATIBxgHqAf8BBgEmAYwB/wEO - AR8BVAH/ATABnQG9Af8BFwE5AYsB/wINAWQB/xMAAQEDCgENAyoBQAFOAk8BlwFYAlwB0QNcAeoDZwHy - AVkBZwFsAfUBgQGNAZMB+wHaAeoB9QH/AdgD/wHDAfsC/wHFAf0C/wHvA/8CYgFoAfYBUAJSAaMDJwE6 - AwcBCagAAx0B/wPAAf8DHQH/AakBOgEwAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BpQE2AS0B/wFe - ASEBGgH/ASsBNAFJAf8BmAHaAfEB/wE3AY8BvAH/AQgBPQFZAf8BWgEVASsB/wFOASEBPAH/AT0BJwFC - Af8BPQEnAUIB/wFBASYBQQH/AVYBHQE4Af8BRAEYASkB/wECAU0BkAH/AWUBvAHgAf8BhAG7AeEB/wE8 - AR4BJAH/AZEBLQEkAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BogE4AS8B/wMlAf8DwAH/Ax0B/wIN - AWUB/wEXATQBiwH/AS4BlAG0Af8BCgEZAU4B/wEJAS0BjAH/ATYB2gHrAf8BOwHkAfUB/wE7AeIB9QH/ - ATYB2QHzAf8BMAHCAekB/wEhAZMB0QH/AREBPQGjAf8BAQEFAUIB/wIBATsB/wIBATsB/wIBATsB/wIB - ATsB/wIBATsB/wIBATsB/wIBAT4B/wIBAT4B/wEAAQUBRgH/AQYBLAGQAf8BIgGeAdYB/wE2AdEB8AH/ - ATABwwHqAf8BFwFdAb0B/wEBARABWwH/AQsBGwFUAf8BMAGdAb0B/wEXATkBjgH/Ag0BZQH/EwABAQMP - ARQDOwFjA14B2AT/AfsD/wHzA/8B7gP/AeID/wHRA/8BxgH+Av8BxAH8Av8B1gP/AecB8QH4Af8BVwJc - Ad8DRAF5AxgBIgMEAQaoAAMdAf8DxwH/Ax0B/wGmATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/ - AawBNwEwAf8BmgEvASgB/wFVAR8BHQH/AUgBkAGyAf8BlgHSAfEB/wENAVABogH/AQIBSQGLAf8BBQFR - AZMB/wELAVcBmgH/AQ0BWQGcAf8BCgFWAZcB/wEEAVEBkwH/AQEBRAGLAf8BMgGJAbsB/wGYAdgB8wH/ - ASwBOgFQAf8BXQEfARoB/wGrATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/AZ8BNQEuAf8DJQH/ - A8cB/wMdAf8CDwGFAf8BGwE7AY0B/wEwAZcBtAH/AQgBFwFMAf8BAAEOAU0B/wEJATEBjAH/AQoBMwGS - Af8BCgEzAZIB/wEIATEBkAH/AQcBLAGGAf8BBAEfAV8B/wECARABTwH/AgABOAH/AgABMgH/AgABMgH/ - AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABOAH/AQABAQE5Af8BAAEJAUQB/wECARcBXwH/ - AQgBLQGKAf8BBgElAYUB/wEFARABWAH/AQUBBwFFAf8BCAEYAU0B/wEwAZwBuQH/ARsBPAGRAf8CDwGF - Af8TAAEBAw0BEgM4AVwBWAJbAcsBqAG1Ab4B/gHqA/8BzQP/AcQB/AL/AcMB+wL/AcMB+wL/AcYB/gL/ - AdgD/wHzAfgB/AH/A10B8ANSAakDLgFHAwwBEAMCAQOoAAMdAf8DzwH/Ax0B/wGjATMBLQH/AagBNAEu - Af8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BqAE0AS4B/wGNAScBIgH/ATABIgEtAf8BjAHSAfMB/wHD - AfAB+AH/AdUB7gH3Af8B4AH3AfwB/wHnA/8B6AP/AeYB/gL/Ad0B8gH6Af8BzQHtAfcB/wG1Ae8B+wH/ - AVYBqwHPAf8BSwEbAR0B/wGWASwBJgH/AagBNAEuAf8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BnQEy - ASwB/wMmAf8DzwH/Ax0B/wIVAYoB/wEcAT4BmAH/ATEBlQG2Af8BGwFCAYgB/wENARsBSwH/AQ0BGwFQ - Af8BDQEbAVAB/wENARsBUAH/AQ0BGwFKAf8BDQEbAUoB/wENARsBSgH/AQ0BGwFFAf8BBgEVAUQB/wEG - ARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQ0BGwFF - Af8BDQEcAUsB/wENAR0BTAH/AQ0BHQFMAf8BDQEdAVIB/wENAR0BUgH/AQ0BHAFRAf8BDQEbAUsB/wEZ - AUIBhwH/ATABlAG1Af8BHAE+AZgB/wIVAYoB/xMAAQEDBwEKAyYBOANKAYsBWQJcAc8BcgF6AX4B+AHz - AfgB/AH/AfID/wHmA/8B6AP/AfoD/wGoAbgBwgH+A2EB7gNVAbIDOAFcAxUBHQMFAQcDAAEBqAADHQH/ - A9cB/wMdAf8BnwEwASwB/wGkATEBLQH/AaQBMQEtAf8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEs - ASgB/wFFARkBHQH/Aa8B3AHkAf8B4gHwAfIB/wGNAaQBrwH/AUkBTwFbAf8BNwEzAUEB/wE4ATQBQgH/ - AToBNwFEAf8BVAFgAYYB/wGlAcABxQH/Ae8C+wH/AUABggGXAf8BVgEaARkB/wGjATABLAH/AaQBMQEt - Af8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEvASsB/wMmAf8D1wH/Ax0B/wIWAZQB/wEbATkBmwH/ - ATwBogHDAf8BTwG3Ac0B/wFLAbkBzQH/AUsBuQHNAf8BSQG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5 - Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/ - AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUsBuQHNAf8BSwG8Ac8B/wFLAb8B0gH/AUsBvwHSAf8BSwG/ - AdIB/wFLAb8B0gH/AUkBvAHPAf8BSAG5Ac0B/wFHAbYByAH/ATcBngHAAf8BGwE4AZsB/wIWAZQB/xQA - AwQBBQMRARcDKQE/A0QBeQFVAlYBtAFcAmEB3AFfAWQBagHzAXEBfQGKAfoBcQF9AYoB+gJdAV8B7QFb - Al4B0AFQAlEBnwM2AVkDGAEhAwcBCgMBAQKsAAMdAf8D3wH/Ax0B/wGcAS0BKwH/AaEBLgEsAf8BoQEu - ASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGbASsBKQH/AUsBGAEbAf8BjwGWAaEB/wE5ARYBHgH/ - AVMCGAH/AVYBGAEXAf8BgQEgAR4B/wGBASABHgH/AYEBIAEeAf8BVQEYARcB/wFQARgBGQH/AS0BIQEw - Af8BXQFhAYgB/wFVARgBFwH/AaABLQErAf8BoQEuASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGW - ASwBKgH/AycB/wPfAf8DHQH/AhcBngH/ARgBHwGUAf8BJwFBAZ8B/wE6AWEBrgH/AT0BZQGrAf8BPQFl - AasB/wE7AWUBqwH/AToBZQGnAf8BOgFlAaYB/wE4AWIBpgH/ATQBXwGmAf8BNAFfAaIB/wE0AV8BoQH/ - ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BOAFf - AaIB/wE4AV8BpgH/ATsBYgGmAf8BPQFlAaYB/wE9AWUBpwH/AT0BZQGrAf8BOwFlAasB/wE6AWUBqwH/ - ATcBYQGuAf8BJQFBAZ8B/wEYAR8BlAH/AhcBngH/FwABAQMEAQYDDAEQAxwBKAMxAU0DQgF1A04BmQFT - AlUBrQNSAakDSwGOATwCPQFnAykBPgMUARsDBwEJAwIBA7AAA0wB8wPfAf8DNAH/AYoCJwH/AZsBKQEq - Af8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGaASgBKQH/AVABFQEWAf8BSgEVARgB/wFS - AhUB/wGZASgBKQH/AZoBKQEqAf8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmgEoASkB/wGSASUBJgH/ - AVECFQH/AUcBFQEZAf8BUgIVAf8BmgEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGbASkBKgH/ - AWIBJQEmAf8DPAH/A90B/wNOAfACHAGkAf8CFwGeAf8CFgGUAf8CFQGPAf8CFQGMAf8CFQGGAf8CFQGC - Af8CEAFkAf8CDwFkAf8CDgFhAf8CDQFeAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFc - Af8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFeAf8CDgFhAf8CDwFkAf8CEAFkAf8CFQGCAf8CFQGG - Af8CFQGMAf8CFQGPAf8CFgGUAf8CFwGeAf8CHAGkAf8bAAEBAwIBAwMGAQgDDAEQAxYBHgMiATIDKgFA - AykBPgMfASwDEgEZAwoBDQMEAQYDAQECtAADVwG9A78B/wOUAf8BSAEmASgB/wGKASUBKwH/AZMBIwEq - Af8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGSASMBKQH/AY4BIQEoAf8BkgEjASoB/wGT - ASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZIBIwEp - Af8BjQEhAScB/wGSASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BgAEmASsB/wE9 - ASUBJwH/A7QB/wO0Af8DVAGuAh8BrAH/Ah8BqQH/Ah8BpgH/AhoBpgH/AhkBpgH/AhkBowH/AhkBnwH/ - AhcBngH/AhcBlwH/AhcBlwH/AhcBlgH/AhcBlgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/ - AhcBjgH/AhcBjgH/AhcBjgH/AhcBlgH/AhcBlgH/AhcBlwH/AhcBlwH/AhcBngH/AhkBnwH/AhkBowH/ - AhkBpgH/AhoBpgH/Ah8BpgH/Ah8BqQH/Ah8BrAH/JAADAQECAwMEBAQGAQgDBgEIAwQBBgMDAQQDAAEB - vAADNAFUA0wB/wPuAf8DkwH/AzMB/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd - Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DPAH/A7IB/wPq - Af8DPAH/Ay0BRQIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIbAagB/wIa - AaQB/wIXAaIB/wIXAZ8B/wIXAZ8B/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIX - AZwB/wIXAZwB/wIXAZ8B/wIXAZ8B/wIXAaIB/wIaAacB/wIbAagB/wIfAawB/wIfAawB/wIfAawB/wIf - AawB/wIfAawB/wIfAawB/wIfAawB//8ABQADSgGNA0sB/wPNAf8D+QH/A/sB/wP7Af8D+wH/A/sB/wP7 - Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7 - Af8D+wH/A/sB/wPrAf8DvQH/AzYB/wNIAYcEAANIAYUCHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGs - Af8CHwGsAf8CHwGsAf8CHgGpAf8CHAGpAf8CHAGmAf8CGAGkAf8CFwGhAf8CFwGhAf8CFwGhAf8CFwGh - Af8CFwGhAf8CFwGhAf8CFwGhAf8CFwGhAf8CGAGkAf8CHAGmAf8CHAGpAf8CHgGrAf8CHwGsAf8CHwGs - Af8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8DSAGF/wAJAAM3AVoDWQHDAysB/AMdAf8DHQH/ - Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/ - Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DVQHqA1QBrgMtAUUIAAMHAQoDSAGFAh8BrAH/Ah8BrAH/Ah8BrAH/ - Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BqwH/Ah4BqgH/Ah0BqgH/Ah0BqAH/Ah0BpAH/ - Ah0BpAH/Ah0BpAH/Ah0BpAH/Ah0BqAH/Ah0BqgH/Ah4BqgH/Ah8BqwH/Ah8BrAH/Ah8BrAH/Ah8BrAH/ - Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/A0gBhQMHAQr/AAEAAUIBTQE+BwABPgMAASgDAAGA - AwABIAMAAQEBAAEBBgABAhYAA/8BAAHAAgABAwQABP8EAAGAAgABAQQAAv8B+AEHDAAC/wHwAQMMAAL/ - AeABAQwAAv8BwAEBDAAC/wGAAQEMAAL/AQABAQwAAf8B/gEAAQEMAAH/AfwBAAEBDAAB/wH8AQABAQwA - Af8BgAEAAQEMAAH+AgABAQwAAfgCAAEDDAAB8AIAAQcMAAHwAgABHwwAAfACAAE/DAAB8AIAAX8MAAHw - AgAB/wwAAfABAAEBAf8MAAHwAQABAwH/DAAB8AEAAQMB/wwAAfABAAEDAf8MAAHwAQABAwH/DAAB8AEA - AQMB/wwAAfABAAEDAf8MAAH4AQABBwH/DAAB+AEAAQ8B/wwAAfwBAAEfAf8MAAH/AYABfwH/DAAE/wQA - AYACAAEBBAAE/wQAAcACAAEDBAAE/wQACw== + Af8D3QH/A90B/wPIAf8DogH/AycB/wNGAYEEAANIAYUCDwGkAf8CDwGiAf8CDwGhAf8CDwGhAf8CDwGh + Af8CDwGhAf8CDwGhAf8CDAGgAf8CDAGeAf8CDAGbAf8CDAGZAf8CDAGZAf8CDAGXAf8CDAGVAf8CDAGV + Af8CDAGVAf8CDAGVAf8CDAGXAf8CDAGZAf8CDAGZAf8CDAGbAf8CDAGeAf8CDAGgAf8CDwGhAf8CDwGh + Af8CDwGhAf8CDwGhAf8CDwGhAf8CDwGiAf8CDwGkAf8DSAGFVwABAQMCBAMEBAEGAwQBBgMDAQQDAQEC + AwABAYwAAzcBWgNCAf8D2wH/A4sB/wMsAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMV + Af8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AywB/wOH + Af8DzQH/Ay4B/wMrAUICDwGkAf8CDwGiAf8CDAGdAf8CCgGYAf8CCgGXAf8CCgGXAf8CCgGXAf8CCgGX + Af8CBwGRAf8CBwGPAf8CBwGMAf8CBwGKAf8CBwGKAf8CBQGIAf8CAgGGAf8CAgGGAf8CAgGGAf8CBAGG + Af8CBwGIAf8CBwGKAf8CBwGKAf8CBwGMAf8CBwGPAf8CBwGVAf8CCgGXAf8CCgGXAf8CCgGXAf8CCgGX + Af8CCgGYAf8CDAGdAf8CDwGiAf8CDwGkAf9QAAMCAQMDBgEIAw0BEgMaASQDIwEzAyEBMAMWAR4DCgEO + AwQBBgMAAQGIAANZAcMDsgH/A4oB/wFSAUABJgH/AbkBkwE4Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+ + Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wG9 + AZUBNgH/AaMBgAEqAf8BvQGVATYB/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+ + Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wG5AZMBOAH/AV0BSAEpAf8DhQH/A6MB/wNU + AasCDwGjAf8CDAGaAf8CCAGRAf8CAQGNAf8CAAGNAf8CAAGKAf8CAAGGAf8CAAGBAf8CAAFcAf8CAAFa + Af8CAAFVAf8CAAFUAf8CAAFUAf8CAAFUAf8CAAFQAf8CAAFNAf8CAAFNAf8CAAFQAf8CAAFUAf8CAAFU + Af8CAAFUAf8CAAFVAf8CAAFaAf8CAAGAAf8CAAGGAf8CAAGGAf8CAAGKAf8CAAGNAf8CAQGNAf8CCAGR + Af8CDAGaAf8CDwGjAf9MAAMCAQMDBwEKAxcBIAMwAUwBRQJGAX4BTwJRAZwBTQJOAZYDQQFyAyoBQQMS + ARkDBQEHAwABAS8AAf8DAAH/AwAB/wMAAf8DAAH/RAADQQH5A8oB/wMqAf8BuQGPATcB/wHVAaIBPwH/ + AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGi + AT8B/wHVAaIBPwH/AcQBlQE3Af8BiQFJASMB/wEeAS0BMwH/AZQBTgEiAf8B0wGhAT4B/wHVAaIBPwH/ + AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGi + AT8B/wHAAZMBOQH/AyMB/wPFAf8DTgHwAg0BmQH/AgMBiwH/AgABWgH/AgABVgH/AgABTgH/AgABTgH/ + AgABSQH/AgABRgH/AgABRQH/AgABQgH/AgABPgH/AgABPgH/AgABPQH/AgABOgH/AgABNgH/AgABNgH/ + AgABNgH/AgABNgH/AgABOgH/AgABPQH/AgABPgH/AgABPgH/AgABQgH/AgABRQH/AgABSAH/AgABTgH/ + AgABTgH/AgABTgH/AgABVgH/AgABWgH/AgMBiwH/Ag0BmQH/SAADAQECAwcBCQMYASIDOAFeAVMCVQGt + AV0CYQHiAm0BcQH3A2UB9AFeAmEB2gNQAZoDLQFGAw4BEwMDAQQvAAH/AwAB/wMAAf8DAAH/AwAB/0QA + AxUB/wPCAf8DFwH/AcwBlQE8Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/ + AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8BvwGLATQB/wGTAUkBIQH/AR0BKwE0Af8BAAEz + AY4B/wFMATkBJQH/AZUBSgEhAf8BzwGXATsB/wHVAZsBPgH/AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/ + AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8BxQGQAToB/wMdAf8DwgH/AxUB/wILAZEB/wEF + AQoBggH/AQUBIQGEAf8BCwEqAYUB/wELASoBgAH/AQsBLAGDAf8BCwEsAYMB/wELASwBgwH/AQsBLAFc + Af8BCwEsAVwB/wELASwBXAH/AQsBLAFcAf8BCwEsAVcB/wELASkBVAH/AQsBKQFUAf8BCwEpAVQB/wEL + ASkBVAH/AQsBKQFUAf8BCwEpAVQB/wELASkBVAH/AQsBKQFZAf8BCwEpAVkB/wELASkBWQH/AQsBKQFZ + Af8BCwEqAYMB/wELASwBgwH/AQsBLAGDAf8BCwEsAYMB/wELASwBiAH/AQcBIQGHAf8BBQEKAYMB/wIL + AZEB/0cAAQEDBgEIAxYBHgM4AV0DVQG1A2QB8QHzAfgB/AH/Ae0D/wHzA/8BmAGoAbIB/gNfAeADSAGF + Ax8BLAMFAQcvAAH/AwAB/wMAAf8DAAH/AwAB/0QAAxUB/wO0Af8DFQH/Ac4BkAE7Af8B1QGUAT0B/wHV + AZQBPQH/AdUBlAE9Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9Af8B1AGTAT0B/wHQAZEBOwH/AbQBWwEu + Af8BigFBASEB/wETASkBOQH/AQABFwFWAf8BAAEXAVEB/wEAAR4BVwH/ATYBLwEpAf8BkgFEASAB/wG5 + AYABMAH/AdIBkgE8Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9 + Af8BxQGLATkB/wMcAf8DtAH/AxUB/wIGAYoB/wEKASMBhwH/ARwBhQGpAf8BMwGrAdQB/wFMAdEB3gH/ + AVEB1AHhAf8BVAHUAeEB/wFWAdQB4QH/AVYB1AHhAf8BVAHUAeEB/wFRAdQB4QH/AVEB1AHhAf8BUQHT + AeAB/wFRAdEB3gH/AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/ + AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/AVEB0QHeAf8BUQHRAeEB/wFRAdQB4QH/AVEB1AHhAf8BTAHU + AeEB/wE0AbIB2AH/AR4BhQGvAf8BCgEjAYsB/wIGAYoB/0MAAQEDBQEHAxQBGwM1AVYDVAGvAVoCXQHw + AfMB+AH8Af8B1AP/AcQB/AL/AcYB/gL/AegD/wF/AYcBiwH7AVUCVgGxAy0BRQMHAQovAAH/AwAB/wMA + Af8DAAH/AwAB/0QAAxUB/wOnAf8DFQH/Ac4BhwE6Af8B1QGLATwB/wHVAYsBPAH/AcsBhAE4Af8BvQFZ + ATEB/wHEAYABNQH/AcABWwEzAf8BlQE/ASAB/wGNATwBIQH/AToBLQEpAf8BAAEhAU4B/wEAAQYBRAH/ + ARwBkQGyAf8BUQHVAeYB/wEAAToBiQH/AQABDAFKAf8BAAElAUUB/wFQATMBJAH/AZIBPgEgAf8BsQFS + ASwB/wHDAYABNAH/AcMBgAE0Af8BugFYATAB/wHTAYoBOwH/AdUBiwE8Af8BxQGCATgB/wMcAf8DpwH/ + AxUB/wIFAYEB/wEOAS8BkAH/AS8BoQHCAf8BIAFZAaQB/wEUASsBWgH/ARUBKwGEAf8BFgErAYgB/wEX + ASsBiAH/ARcBKwGBAf8BFgErAYEB/wEVASsBgQH/ARUBKwFaAf8BFQErAVkB/wEVASsBWQH/ARUBKwFZ + Af8BFQErAVkB/wEVASsBWQH/ARUBKwFZAf8BFQErAVkB/wEVASsBWQH/ARUBKwGBAf8BFQErAYEB/wEV + ASsBgQH/ARUBKwGBAf8BFwEsAYgB/wEaAS8BiAH/ARUBKwGEAf8BFAErAVoB/wEgAVsBpAH/AS8BoQHD + Af8BDgEvAZEB/wIFAYEB/z8AAQEDBAEGAxIBGAMyAVADUgGpAVkCZAHsAZgBqAGyAf4B2QP/AcQB/AL/ + AcMB+wL/AcMB+wL/AdcD/wGoAaoBrgH9AVcCWQG/AzIBUAMIAQsvAAH/AwAB/wMAAf8DAAH/AwAB/0QA + AxUB/wObAf8DFQH/Ac4BXQE4Af8B1QGDAToB/wHLAVsBNgH/AYMBNAEhAf8BRgEsASQB/wFUAS8BIgH/ + AUwBLQEjAf8BHQEqATUB/wEAASQBUgH/AQABDAFOAf8BAAEpAVgB/wFLAdAB5wH/AVYB3QHxAf8BOwGn + AbEB/wFcAeEB9wH/ATIBqQHFAf8BAAENAUQB/wEAARgBVQH/AQABJwFKAf8BLgEqASwB/wFSAS4BIgH/ + AVMBLgEiAf8BQQEsASgB/wGUATkBHgH/AdMBggE5Af8BxQFZATYB/wMbAf8DmwH/AxUB/wIFAVwB/wEP + ATABiwH/ASgBnAG9Af8BBgEXAUcB/wEBAQoBUwH/AQsBMQGYAf8BCgE0AZ0B/wEKATIBnQH/AQoBMQGc + Af8BCgExAZYB/wEJATABlQH/AQwBLgGRAf8BAAEIAVMB/wIAAUoB/wIAAUoB/wIAAUoB/wIAAUoB/wIA + AUoB/wEAAQYBUQH/AQsBKgGSAf8BCgEsAZQB/wEEASIBjQH/AQ4BOAGYAf8BAAEbAY4B/wEOATgBnwH/ + AQoBKAGTAf8BBgELAVMB/wIAAUQB/wEGARUBRQH/ASgBlwG0Af8BDwEvAYgB/wIFAVwB/zsAAQEDBAEG + AxABFQMsAUMBTwJQAZsBWAJiAekBmAGoAbIB/gHeA/8BxgH+Av8BwwH7Av8BwwH7Av8ByAP/AewD/wF/ + AYgBiwH7AVUCVgGxAy0BRQMHAQovAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/ + JAADFQH/A5MB/wMVAf8BzAFVATYB/wHTAVgBOAH/Ac4BVQE2Af8BigExAR4B/wEAATkBhAH/AQABMQGN + Af8BAAEpAYgB/wEAAR8BgQH/AQ0BVAGfAf8BTwHVAeYB/wGQAe8B/gH/ATIBmwG8Af8BPgEUASsB/wGR + ARABKQH/AS0BKgFCAf8BSQHKAeYB/wGQAe0B+gH/ATkBtAHKAf8BAAE6AZIB/wEAASEBgQH/AQABKgGH + Af8BAAE7AZYB/wEbASsBPgH/AZMBMwEdAf8B0gFYATgB/wHDAVEBNAH/AxoB/wOTAf8DFQH/AgUBXAH/ + AQ8BMQGLAf8BKAGdAb0B/wEGARcBTgH/AQkBMAGVAf8BRQHWAekB/wFGAdcB8AH/AUUB0gHwAf8BRQHR + AfAB/wFFAdEB7gH/AUIBzQHrAf8BPwHFAecB/wEAARQBigH/AgcBVAH/AgcBVAH/AgcBVAH/AgcBVAH/ + AQYBCAFVAf8BAAEWAYwB/wFAAcEB4gH/AToBxAHoAf8BGAGKAc8B/wFOAeEB9QH/AQUBTgHDAf8BUAHh + AfUB/wErAaIB1QH/AQABFQGSAf8BAAEEAVAB/wEGARUBTQH/ASYBlAG0Af8BDwEsAYgB/wIFAVwB/zgA + AwQBBQMNARIDKAE8A0oBigFeAmEB2gKoAa0B/QHiA/8BxgH+Av8BwwH7Av8BwwH7Av8ByQP/AekD/wKo + Aa0B/QFcAmEB3ANHAYIDHQEqAwUBBy8AAf8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIA + Av8kAAMVAf8DjwH/AxUB/wHJAVIBNQH/AdABVQE3Af8B0AFVATcB/wGmAT0BJQH/ASMBJwE1Af8BCQFT + AaMB/wE7AasB0gH/AZIB6wH4Af8BiQHqAfcB/wE6AaIBvAH/AToBJwFAAf8BmgEbAUEB/wG/AS4BiwH/ + AcEBMwGTAf8BuwEsAYIB/wGCARQBMwH/ATIBQwFdAf8BSQHDAdsB/wGTAfAB/AH/AYYB4QHzAf8BKAGR + AbkB/wECAU4BnwH/AVABKAEgAf8BvAFKAS8B/wHQAVUBNwH/AcABTgEzAf8DGgH/A48B/wMVAf8CBQFc + Af8BDwExAYsB/wEoAZ0BvQH/AQYBFwFSAf8BBgEyAZ8B/wFMAeIB9QH/AVMB7AL/AVgB7gL/AVkB7gL/ + AVkB7gL/AVkB7gL/ATgBwAHrAf8BAAEUAY8B/wIHAVkB/wIHAVYB/wIHAVQB/wIHAVUB/wEDAQwBggH/ + ARoBWAG+Af8BSgHaAfgB/wEaAZgB3wH/ATkBxAHxAf8BLQG2AeoB/wElAawB5QH/AUUB1gH5Af8BHwGf + AeEB/wEoAZ8B0wH/AQYBIQGMAf8BBQEVAVAB/wEjAZQBtAH/AQ8BLAGIAf8CBQFcAf8kAAMBAQIDAwQE + BAYECAELAw8BFAMkATYBRgJHAYABWAJcAdEBfwGIAYwB+wHpA/8ByAP/AcMB+wL/AcMB+wL/AcwD/wHw + A/8BfwGIAYwB+wFZAl0B1wNMAZIDKwFCAw0BEgMDAQQvAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/ + AgAC/wIAAv8CAAL/JAADFQH/A48B/wMVAf8BxwFQATUB/wHOAVMBNwH/Ac4BUwE3Af8BpgE9ASYB/wIj + ATEB/wEAAUMBkAH/ASIBhwGpAf8BFQEqAUIB/wFJAQ0BJAH/AaUBHAFEAf8BwgEvAYwB/wHLAT4BpAH/ + AdIBRgGxAf8B1AFHAbQB/wHRAUQBsAH/AcoBPQGiAf8BvgEtAYQB/wGSARYBOgH/ATsBEgEkAf8BDQE9 + AVsB/wEnAYoBrAH/AQABOAGIAf8BTwEoASAB/wG9AUkBMAH/Ac4BUwE3Af8BvwFNATMB/wMaAf8DjwH/ + AxUB/wIFAVwB/wEPATABiwH/ASgBnAG5Af8BBgEXAUwB/wEGATIBnwH/AUwB4QH1Af8BUQHnAv8BUgHo + Av8BUwHoAv8BVQHqAv8BWQHuAv8BOAHAAesB/wEAARQBjgH/AgcBUwH/AgcBUgH/AgcBUQH/AgcBUQH/ + AQMBDQGBAf8BMAGhAdQB/wFRAeYC/wEHAUoBwQH/AVEB5gL/ARkBjwHUAf8BPgHJAfEB/wE+AckB8QH/ + ARkBjwHVAf8BRwHcAfUB/wELATABmAH/AQYBFQFLAf8BJwGUAbQB/wEPASwBiAH/AgUBXAH/HAADAgED + AwYBCAMNAREDFwEgAyIBMgMqAUADLAFDAzEBTgNHAYIBWQJcAcwBbgF3AXsB+gHtA/8ByQP/AcMB+wL/ + AcMB+wL/Ac0D/wH4A/8BXQFyAXYB+AFcAl4BzgFIAkkBhwMrAUIDEQEXAwQBBgMAAQEvAAH/AwAB/wMA + Af8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/JAADFQH/A5AB/wMVAf8BxQFOATQB/wHMAVEBNgH/ + AcwBUQE2Af8BpAE6ASUB/wEgASMBMwH/AQABPQGJAf8BAAFCAY0B/wEsARwBNgH/AbwBJQFaAf8BxAE1 + AZwB/wHRAUUBrwH/AdwBUQHBAf8B5gFaAc0B/wHpAV0B0gH/AeYBWwHNAf8B3QFSAcEB/wHQAUUBrwH/ + AcUBNgGbAf8BswEhAUkB/wEAASoBSwH/AQ4BSQGQAf8BAAEyAYMB/wFOAScBIAH/AbsBSAEvAf8BzAFR + ATYB/wG9AUsBMgH/AxoB/wOQAf8DFQH/AgUBXAH/AQ8BMAGLAf8BKAGbAbgB/wEGARYBSgH/AQkBKgGS + Af8BNQG7AeAB/wE5AbwB5gH/ATkBvwHmAf8BQAG/AeQB/wFAAcEB5wH/AUABxQHrAf8BOwG/AeQB/wEA + AREBhAH/AgYBUQH/AgUBUQH/AgABUQH/AgABUQH/AQIBBQFUAf8BAAEOAYUB/wEAARQBjQH/AQABDwGI + Af8BAAEUAY8B/wEAARABiwH/AQABEwGUAf8BAQEUAZYB/wEEARQBkwH/AQABFAGSAf8BAAEIAVUB/wEG + ARUBSgH/ASgBlAG0Af8BDwEsAYgB/wIFAVwB/xcAAQEDBAEFAwoBDgMaASUDMQFNA0QBeQFPAlABmwFT + AlQBrANUAa4DVQG1AVoCXgHYAm0BcQH3AfQD/wHKA/8BwwH7Av8BxAH8Av8B0Qf/Am0BcQH3AVgCWwHG + A0MBeAMmATgDEAEVAwQBBgMAAQEzAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/ + JAADFQH/A5IB/wMVAf8BwwFLATMB/wHKAU4BNQH/AcgBTQE0Af8BjAEsARsB/wEJASIBPwH/AQQBQgGM + Af8BBAFOAZ0B/wFJARoBNgH/AcIBLwGQAf8BzQFAAasB/wHeAVQBxAH/Ae8BhwHaAf8B+wGTAewB/wH9 + AZgB9AH/AfsBkwHsAf8B7wGHAdoB/wHeAVQBxAH/Ac4BQAGsAf8BvQEsAYQB/wEYASwBTAH/ARYBVQGd + Af8BAAExAYQB/wE8ASMBJQH/AbABQAEqAf8BygFOATUB/wG7AUgBMQH/AxoB/wOSAf8DFQH/AgUBXAH/ + AQ8BMAGKAf8BKAGXAbYB/wEGARUBSgH/AQABBgFTAf8BAgETAY8B/wECARUBlwH/AQIBFQGXAf8BAgEV + AY8B/wECARUBjwH/AQIBFQGPAf8BAgESAYgB/wECAQYBVQH/AgEBUQH/AgABUQH/AgABUQH/AgABUQH/ + AgABUQH/AgEBUQH/AgYBUQH/AgcBUwH/AgcBWQH/AgcBWQH/AgcBXQH/AgcBgwH/AgcBgwH/AgcBXAH/ + AgABSwH/AQYBFQFKAf8BKAGUAbQB/wEPASwBiAH/AgUBXAH/EwABAQMEAQYDDwEUAyQBNQE/AkABbwNW + AbMBWwJhAeEDZQH0AWkBdQF6AfoBXQFyAXYB+AJZAWAB9QFaAXIBeQL6A/8BzQP/AcMB+wL/AcQB/AL/ + AdQD/wHzAfgB/AH/AlkBYgH1AVYCWAHBA0ABcAMgAS4DCwEPAwQBBQMAAQEbAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/ + AgAC/wIAAv8CAAL/AgAC/wwAAxUB/wOWAf8DFQH/AcEBSAEzAf8ByAFLATQB/wHEAUkBMgH/AYcBKQEb + Af8BAAEoAVIB/wEWAVABlwH/AQgBSwGXAf8BgAEZAToB/wHGATUBmgH/AdUBSQG3Af8B6gGAAdIB/wH8 + AZYB8QL/AagB/gL/Aa8D/wGoAf4B/wH8AZYB8QH/AeoBgAHSAf8B1gFJAbcB/wHFATMBkwH/AS8BJQFB + Af8BFAFXAaAB/wEAAT0BjQH/ARoBIgE2Af8BjAEqARoB/wHHAUsBNAH/AbkBRQExAf8DGwH/A5YB/wMV + Af8CBQFbAf8BDwEuAYUB/wElAZUBtAH/AQUBFQFKAf8CAAFLAf8CBwFcAf8CBwGDAf8CBwGDAf8CBwFZ + Af8CBwFZAf8CBwFWAf8CBwFSAf8CAQFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFR + Af8CBQFRAf8CBwFTAf8CBwFZAf8CBwFZAf8CBwFZAf8CBwGDAf8CBwGDAf8CBwFcAf8CAAFLAf8BBgEV + AUoB/wEoAZQBtAH/AQ8BLAGIAf8CBQFcAf8QAAMCAQMDCwEPAyMBNAFEAkUBfAFXAloBxQJtAXQB9wHz + AfgB/AH/AfED/wHnA/8B6gP/Ae8D/wHkA/8BzQP/AcMB+wL/AcYB/gL/AdoD/wHzAfgB/AH/AWQCZQH0 + AVYCWAG8Az0BaQMdASoDCgENAwMBBCMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/DAADFQH/ + A5oB/wMVAf8BvgFHATIB/wHFAUkBMwH/Aa8BPQEqAf8BSQEjAR4B/wEAATIBiwH/AS0BiQGrAf8BBgE6 + AV0B/wGpASEBSwH/AcgBOQGhAf8B2gFOAbwB/wHwAYgB3AH/Af4BnwH6Av8BtAP/AcID/wG0Av8B/gGf + AfoB/wHwAYgB3AH/AdsBTgG9Af8ByQE4AZ0B/wFVARoBOQH/ARABVAGdAf8BHAFZAaIB/wEAAScBUgH/ + AYYBKAEaAf8BwwFIATIB/wG2AUQBMAH/AxsB/wOaAf8DFQH/AgUBWgH/AQ8BLAGDAf8BJwGUAbQB/wEG + ARUBSgH/AgABSwH/AgcBXAH/AgcBgwH/AgcBgwH/AgcBWQH/AgcBWQH/AgcBVAH/AgcBUQH/AgABUQH/ + AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgcBUQH/AgcBVQH/AgcBWQH/ + AgcBWQH/AgcBgwH/AgcBgwH/AgcBXAH/AgABSwH/AQYBFQFKAf8BKAGUAbQB/wEPASwBiAH/AgUBXAH/ + EAADAwEEAxgBIQM9AWkBVwJZAb8BcQF3AXsB+gHxA/8BzgP/AcQB/AL/AcMB+wL/AcMB+wL/AcMB+wL/ + AcMB+wL/AcMB+wL/AcYB/gL/Ad4D/wGYAagBsgH+AU4CXQHwAVUCVwG3AzsBYwMaASUDCQEMAwMBBCcA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIA + Av8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/DAADFQH/A58B/wMVAf8BuwFEATEB/wHAAUUBMQH/ + AYYBJwEZAf8BDAEhAToB/wEAAUABlAH/ATQBlQG5Af8BJAErAUYB/wG4ASQBWAH/AccBOQGgAf8B2QFN + AbsB/wHvAYUB2gH/Af4BnQH6Av8BsQP/AbwD/wGxAv8B/gGdAfoB/wHvAYUB2gH/AdkBTQG8Af8BxwE4 + AZ8B/wGkAR4BRwH/AQ8BRAGJAf8BOgGXAbgB/wEAATABigH/AUgBIgEfAf8BrQE7ASkB/wGzAUEBLwH/ + AxsB/wOfAf8DFQH/AgUBWgH/AQ8BLAGDAf8BKAGUAbQB/wEGARUBSgH/AQEBEgFcAf8BDgE8AawB/wEP + AUEBtgH/AQ0BPwGwAf8BBwEuAaIB/wEDARgBjgH/AQQBCwFcAf8CBwFTAf8CAAFRAf8CAAFRAf8CAAFR + Af8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CBwFRAf8CBwFUAf8CBwFZAf8CBwFZAf8CBwGD + Af8CBwGDAf8CBwFcAf8CAAFLAf8BBgEVAUoB/wEnAZQBtAH/AQ8BLAGIAf8CBQFcAf8QAAMEAQYDIwEz + AU0CTgGVA2UB9AT/AdoD/wHZA/8B4AP/Ad0D/wHPA/8BxQH9Av8BwwH7Av8BwwH7Av8B0wP/AZgBqAGy + Af4BTgJdAfABVQJXAbcDOgFgAxgBIgMIAQsDAgEDKwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIA + Av8MAAMVAf8DpAH/AxUB/wG5AUEBLwH/AaABMwEjAf8BQwEfAR0B/wEAASEBWQH/ASMBWAGiAf8BCwFJ + AZIB/wFRAREBIgH/AbcBJAFbAf8BwgE1AZsB/wHTAUcBswH/AeYBXAHPAf8B+gGRAesC/wGgAfwC/wGo + Af4C/wGgAfwB/wH6AZEB6wH/AeYBXAHPAf8B0wFHAbQB/wHDATQBmgH/AbYBIgFPAf8BJQEdATEB/wEf + AVoBpAH/AQABPgGRAf8BBwEZATUB/wGEASUBFwH/AakBOgEqAf8DGwH/A6QB/wMVAf8CBQFbAf8BDwEs + AYUB/wEoAZQBtAH/AQYBFQFKAf8BDQEyAZIB/wFMAeQB9QH/AVEB6QL/AUoB4AH4Af8BLQGxAd8B/wEV + AUoBtQH/AQcBGQGKAf8BBwEJAVMB/wIBAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIA + AVEB/wIFAVEB/wIHAVIB/wIHAVYB/wIHAVsB/wEEAQwBhAH/AQMBEQGNAf8BAwEPAYwB/wEGAQoBgwH/ + AgABTAH/AQUBFQFKAf8BJQGVAbQB/wEPAS4BiAH/AgUBXAH/EAADBAEGAyIBMgFMAk0BkQNkAfEBqAGp + AawB/QGMAaEBrwH+AqgBrQH9AW0BhQGLAfsBaAF6AYIB/AHnAfEB+AH/AdUD/wHDAfsC/wHDAfsC/wHg + A/8BXwGAAYkB+wFaAl0B0wNCAXQDGgElAwYBCAMBAQIvAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/ + AgAC/wwAAxUB/wOqAf8DFQH/AakBNwEoAf8BSwEgAR0B/wE8AZYBtQH/AVUBwQHkAf8BlAHYAesB/wEA + AS8BiAH/AQABIgFDAf8BoQEaAUIB/wG/AS0BjgH/AcoBPQGmAf8B2gFOAbwB/wHoAYEB0gH/AfQBigHh + Af8B+QGQAegB/wH0AYoB4QH/AegBgQHSAf8B2gFOAb0B/wHLAT0BpQH/AcABLAGKAf8BWwEZATYB/wEA + ASABUAH/ARwBWgGpAf8BnAHhAe8B/wFHAbAB1gH/AS8BKAEwAf8BkAEsAR8B/wMcAf8DqgH/AxUB/wIF + AVwB/wEPASwBiAH/ASgBlAG0Af8BBgEVAUoB/wEDARwBigH/ARYBjAHPAf8BFgGTAdwB/wEXAY8B1QH/ + AQ0BVAHDAf8BBwEuAaUB/wECARIBiQH/AQIBCAFYAf8CBgFRAf8CAQFRAf8CAAFRAf8CAAFRAf8CAAFR + Af8CAAFRAf8CAQFRAf8CBgFRAf8CBwFTAf8CBwFbAf8BBwEWAY4B/wEUAUwBuAH/ASoBmgHSAf8BIQGN + AcsB/wELATMBpQH/AQABCAFUAf8BBgEVAUoB/wEoAZcBtgH/AQ8BMAGKAf8CBQFcAf8QAAMDAQQDFgEe + AzYBWQFPAlEBnAFXAlkBvwFZAlwByQFaAl0BygFcAl4BzgFYAl8B4wFXAmIB9gHwA/8BwwH7Av8BwwH7 + Av8B3QP/AXIBfgGIAfwDWQHHAzcBWwMPARQDAAEBTwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIA + Av8CAAL/AgAC/yQAAxUB/wOwAf8DFQH/Aa8BOAErAf8BWgEfARcB/wE9ARoBHAH/ATgBVAGFAf8BsAHu + AfcB/wGbAeMB7wH/AQABMgGRAf8BBwEuAUcB/wGlAR4BSgH/AcABMQGVAf8BywE/AakB/wHWAUoBtwH/ + Ad4BVAHCAf8B4QFWAcYB/wHeAVQBwgH/AdYBSgG3Af8BywE/AagB/wHDATABkQH/AYEBGgE8Af8BAAE4 + AYAB/wEPAVIBpQH/AbcB8wH6Af8BlgHaAeQB/wEwASUBLQH/AVABHgEZAf8BowEzASgB/wMcAf8DsAH/ + AxUB/wIFAVwB/wEPASwBiAH/ASgBlAG0Af8BBgEVAUoB/wEDASoBjwH/ATYBxwHoAf8BPQHQAfMB/wE+ + AcsB8gH/ATQBuwHmAf8BHgGNAcwB/wEKATUBpQH/AQUBEQGBAf8BAAEGAVEB/wIAAVEB/wIAAVEB/wIA + AVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIHAVEB/wEEAQoBWwH/ARABSgG1Af8BPwHQAfEB/wFP + AekB/QH/AUwB5QH7Af8BKAGpAdwB/wECARkBhAH/AQYBFgFKAf8BKAGbAbgB/wEPATABiwH/AgUBXAH/ + EAADAgEDAwoBDQMcAScDLwFJAzwBZgNEAXoDSAGEAU4CTwGXAVkCXAHMAVMCZAHxBP8BwwH7Av8BwwH7 + Av8B1wP/AagBqgGuAf0DWwHIAzcBWgMLAQ9TAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIA + Av8CAAL/JAADFQH/A7YB/wMVAf8BsAE3ASsB/wGyATcBKgH/AZ8BLgEiAf8BWwEeARUB/wEiARoBKQH/ + AZMB1AHoAf8BlgHeAe8B/wEAAUEBlgH/ARoBJQE8Af8BuAEiAVUB/wG/AS8BkwH/AcYBOAGgAf8BywE+ + AaYB/wHNAUABqgH/AcsBPgGmAf8BxgE4AaAB/wHAAS8BkQH/AZ0BHQFGAf8BAAE6AVQB/wEPAVEBqAH/ + Aa8B6wH4Af8BTgGgAcMB/wFAAhkB/wFdAR4BFAH/Aa0BNQEoAf8BqQE1ASoB/wMcAf8DtgH/AxUB/wIF + AVwB/wEPASwBiAH/AScBlAG0Af8BBgEVAUoB/wEBASUBjgH/AS8BwwHnAf8BNgHOAfIB/wE2AcgB8gH/ + ASwBtAHmAf8BGQGKAcoB/wEJATMBnwH/AQABDQFXAf8CAAFIAf8CAAFGAf8CAAFGAf8CAAFGAf8CAAFG + Af8CAAFGAf8CAAFGAf8CAAFGAf8CAAFHAf8BAAEHAVUB/wEgAZUBywH/AUQB6QH9Af8BRgHuAv8BRgHu + Av8BOAHVAfAB/wEBASYBkAH/AQYBFwFKAf8BKAGcAbkB/wEPATABiwH/AgUBXAH/EwABAQMHAQkDFgEf + Ay8BSQFBAkIBcwFMAk0BkQFQAlIBowFVAlcBugNfAeABSQJiAfYB8wP/AcMB+wL/AcMB+wL/Ad0D/wFy + AX4BiAH8AVcCWgG9AzEBTwMJAQxTAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/ + JAADFQH/A7sB/wMVAf8BrQE0ASoB/wGzATYBKwH/AbMBNgErAf8BqAExASYB/wFaARsBFAH/ASIBGgEp + Af8BkQHRAeoB/wFZAboB3QH/AQABSgGTAf8BQwEXATIB/wG4ASABWAH/AbwBKAGHAf8BwAEqAYoB/wG/ + ASsBjAH/AcABKgGKAf8BvAEnAYYB/wG0AR8BUAH/ARYBKAE9Af8BBAFQAaIB/wGdAd4B8QH/AU4BoAHG + Af8BQgEYARkB/wGWASgBHwH/AbIBNgErAf8BswE2ASsB/wGmATIBKQH/Ax0B/wO7Af8DFQH/AgUBXAH/ + AQ8BLAGIAf8BIwGUAbQB/wEFARUBSgH/AQABFwGFAf8BDQGCAcoB/wEMAY4B1wH/AQwBigHXAf8BDAGG + Ac8B/wEMAVQBwAH/AQYBOwGqAf8BAgEcAYwB/wIAAUMB/wIAAT0B/wIAAT0B/wIAAT0B/wIAAT0B/wIA + AT0B/wIAAT0B/wIAAT8B/wIAAUEB/wEAAQQBUQH/ARYBgAHBAf8BOQHjAfsB/wE9Ae4C/wE9Ae4C/wEq + AcYB6gH/AQABHgGMAf8BBgEXAUwB/wEoAZ0BvQH/AQ8BMQGLAf8CBQFcAf8TAAEBAwoBDQMqAUABTgJP + AZcBWAJcAdEDXAHqA2cB8gJZAWIB9QFtAYUBiwH7AdoB6gH1Af8B2AP/AcMB+wL/AcUB/QL/Ae8D/wNi + AfYBUAJSAaMDJwE6AwcBCVMAAf8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIAAv8kAAMV + Af8DwAH/AxUB/wGpATIBKAH/Aa8BMwEpAf8BrwEzASkB/wGvATMBKQH/AaUBLgElAf8BVgEZARIB/wEj + ASwBQQH/AZgB2gHxAf8BLwGPAbwB/wEAATUBUQH/AVIBDQEjAf8BRgEZATQB/wE1AR8BOgH/ATUBHwE6 + Af8BOQEeATkB/wFOARUBMAH/ATwBEAEhAf8BAAFFAZAB/wFdAbwB4AH/AYQBuwHhAf8BNAEWARwB/wGR + ASUBHAH/Aa8BMwEpAf8BrwEzASkB/wGvATMBKQH/AaIBMAEnAf8DHQH/A8AB/wMVAf8CBQFdAf8BDwEs + AYsB/wEmAZQBtAH/AQIBEQFGAf8BAQElAYwB/wEuAdoB6wH/ATMB5AH1Af8BMwHiAfUB/wEuAdkB8wH/ + ASgBwgHpAf8BGQGTAdEB/wEJATUBowH/AgABOgH/AgABMwH/AgABMwH/AgABMwH/AgABMwH/AgABMwH/ + AgABMwH/AgABNgH/AgABNgH/AgABPgH/AQABJAGQAf8BGgGeAdYB/wEuAdEB8AH/ASgBwwHqAf8BDwFV + Ab0B/wEAAQgBUwH/AQMBEwFMAf8BKAGdAb0B/wEPATEBjgH/AgUBXQH/EwABAQMPARQDOwFjA14B2AT/ + AfsD/wHzA/8B7gP/AeID/wHRA/8BxgH+Av8BxAH8Av8B1gP/AecB8QH4Af8BVwJcAd8DRAF5AxgBIgME + AQZTAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/JAADFQH/A8cB/wMVAf8BpgEu + AScB/wGsAS8BKAH/AawBLwEoAf8BrAEvASgB/wGsAS8BKAH/AZoBJwEgAf8BTQEXARUB/wFAAZABsgH/ + AZYB0gHxAf8BBQFIAaIB/wEAAUEBiwH/AQABSQGTAf8BAwFPAZoB/wEFAVEBnAH/AQIBTgGXAf8BAAFJ + AZMB/wEAATwBiwH/ASoBiQG7Af8BmAHYAfMB/wEkATIBSAH/AVUBFwESAf8BqwEuAScB/wGsAS8BKAH/ + AawBLwEoAf8BrAEvASgB/wGfAS0BJgH/Ax0B/wPHAf8DFQH/AgcBhQH/ARMBMwGNAf8BKAGXAbQB/wEA + AQ8BRAH/AQABBgFFAf8BAQEpAYwB/wECASsBkgH/AQIBKwGSAf8BAAEpAZAB/wEAASQBhgH/AQABFwFX + Af8BAAEIAUcB/wIAATAB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIA + ATAB/wIAATEB/wEAAQEBPAH/AQABDwFXAf8BAAElAYoB/wEAAR0BhQH/AQABCAFQAf8CAAE9Af8BAAEQ + AUUB/wEoAZwBuQH/ARMBNAGRAf8CBwGFAf8TAAEBAw0BEgM4AVwBWAJbAcsBmAGlAa4B/gHqA/8BzQP/ + AcQB/AL/AcMB+wL/AcMB+wL/AcYB/gL/AdgD/wHzAfgB/AH/A10B8ANSAakDLgFHAwwBEAMCAQNTAAH/ + AwAB/wMAAf8DAAH/AwAB/0QAAxUB/wPPAf8DFQH/AaMBKwElAf8BqAEsASYB/wGoASwBJgH/AagBLAEm + Af8BqAEsASYB/wGoASwBJgH/AY0BHwEaAf8BKAEaASUB/wGMAdIB8wH/AcMB8AH4Af8B1QHuAfcB/wHg + AfcB/AH/AecD/wHoA/8B5gH+Av8B3QHyAfoB/wHNAe0B9wH/AbUB7wH7Af8BTgGrAc8B/wFDARMBFQH/ + AZYBJAEeAf8BqAEsASYB/wGoASwBJgH/AagBLAEmAf8BqAEsASYB/wGdASoBJAH/Ax4B/wPPAf8DFQH/ + Ag0BigH/ARQBNgGYAf8BKQGVAbYB/wETAToBiAH/AQUBEwFDAf8BBQETAUgB/wEFARMBSAH/AQUBEwFI + Af8BBQETAUIB/wEFARMBQgH/AQUBEwFCAf8BBQETAT0B/wEAAQ0BPAH/AQABDQE8Af8BAAENATwB/wEA + AQ0BPAH/AQABDQE8Af8BAAENATwB/wEAAQ0BPAH/AQABDQE8Af8BBQETAT0B/wEFARQBQwH/AQUBFQFE + Af8BBQEVAUQB/wEFARUBSgH/AQUBFQFKAf8BBQEUAUkB/wEFARMBQwH/AREBOgGHAf8BKAGUAbUB/wEU + ATYBmAH/Ag0BigH/EwABAQMHAQoDJgE4A0oBiwFZAlwBzwFnAXIBdgH4AfMB+AH8Af8B8gP/AeYD/wHo + A/8B+gP/AZgBqAGyAf4DYQHuA1UBsgM4AVwDFQEdAwUBBwMAAQFTAAH/AwAB/wMAAf8DAAH/AwAB/0QA + AxUB/wPXAf8DFQH/AZ8BKAEkAf8BpAEpASUB/wGkASkBJQH/AaQBKQElAf8BpAEpASUB/wGkASkBJQH/ + AZkBJAEgAf8BPQERARUB/wGvAdwB5AH/AeIB8AHyAf8BjQGkAa8B/wFBAUcBUwH/AS8BKwE5Af8BMAEs + AToB/wEyAS8BPAH/AUwBWAGGAf8BpQHAAcUB/wHvAvsB/wE4AYIBlwH/AU4BEgERAf8BowEoASQB/wGk + ASkBJQH/AaQBKQElAf8BpAEpASUB/wGkASkBJQH/AZkBJwEjAf8DHgH/A9cB/wMVAf8CDgGUAf8BEwEx + AZsB/wE0AaIBwwH/AUcBtwHNAf8BQwG5Ac0B/wFDAbkBzQH/AUEBuQHNAf8BQAG5Ac0B/wFAAbkBzQH/ + AUABuQHNAf8BQAG5Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5 + Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5Ac0B/wFDAbkBzQH/AUMBvAHPAf8BQwG/AdIB/wFDAb8B0gH/ + AUMBvwHSAf8BQwG/AdIB/wFBAbwBzwH/AUABuQHNAf8BPwG2AcgB/wEvAZ4BwAH/ARMBMAGbAf8CDgGU + Af8UAAMEAQUDEQEXAykBPwNEAXkBVQJWAbQBXAJhAdwDXwHzAWkBdQF6AfoBaQF1AXoB+gNdAe0BWwJe + AdABUAJRAZ8DNgFZAxgBIQMHAQoDAQECVwAB/wMAAf8DAAH/AwAB/wMAAf9EAAMVAf8D3wH/AxUB/wGc + ASUBIwH/AaEBJgEkAf8BoQEmASQB/wGhASYBJAH/AaEBJgEkAf8BoQEmASQB/wGbASMBIQH/AUMBEAET + Af8BjwGWAaEB/wExAQ4BFgH/AUsCEAH/AU4BEAEPAf8BgQEYARYB/wGBARgBFgH/AYEBGAEWAf8BTQEQ + AQ8B/wFIARABEQH/ASUBGQEoAf8BVQFZAYgB/wFNARABDwH/AaABJQEjAf8BoQEmASQB/wGhASYBJAH/ + AaEBJgEkAf8BoQEmASQB/wGWASQBIgH/Ax8B/wPfAf8DFQH/Ag8BngH/ARABFwGUAf8BHwE5AZ8B/wEy + AVkBrgH/ATUBXQGrAf8BNQFdAasB/wEzAV0BqwH/ATIBXQGnAf8BMgFdAaYB/wEwAVoBpgH/ASwBVwGm + Af8BLAFXAaIB/wEsAVcBoQH/ASwBVwGhAf8BLAFXAaEB/wEsAVcBoQH/ASwBVwGhAf8BLAFXAaEB/wEs + AVcBoQH/ASwBVwGhAf8BMAFXAaIB/wEwAVcBpgH/ATMBWgGmAf8BNQFdAaYB/wE1AV0BpwH/ATUBXQGr + Af8BMwFdAasB/wEyAV0BqwH/AS8BWQGuAf8BHQE5AZ8B/wEQARcBlAH/Ag8BngH/FwABAQMEAQYDDAEQ + AxwBKAMxAU0DQgF1A04BmQFTAlUBrQNSAakDSwGOATwCPQFnAykBPgMUARsDBwEJAwIBA1sAAf8DAAH/ + AwAB/wMAAf8DAAH/RAADTAHzA98B/wMsAf8BigIfAf8BmwEhASIB/wGbASEBIgH/AZsBIQEiAf8BmwEh + ASIB/wGbASEBIgH/AZoBIAEhAf8BSAENAQ4B/wFCAQ0BEAH/AUoCDQH/AZkBIAEhAf8BmgEhASIB/wGb + ASEBIgH/AZsBIQEiAf8BmwEhASIB/wGaASABIQH/AZIBHQEeAf8BSQINAf8BPwENAREB/wFKAg0B/wGa + ASEBIgH/AZsBIQEiAf8BmwEhASIB/wGbASEBIgH/AZsBIQEiAf8BWgEdAR4B/wM0Af8D3QH/A04B8AIU + AaQB/wIPAZ4B/wIOAZQB/wINAY8B/wINAYwB/wINAYYB/wINAYIB/wIIAVwB/wIHAVwB/wIGAVkB/wIF + AVYB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIF + AVQB/wIFAVYB/wIGAVkB/wIHAVwB/wIIAVwB/wINAYIB/wINAYYB/wINAYwB/wINAY8B/wIOAZQB/wIP + AZ4B/wIUAaQB/xsAAQEDAgEDAwYBCAMMARADFgEeAyIBMgMqAUADKQE+Ax8BLAMSARkDCgENAwQBBgMB + AQJfAAH/AwAB/wMAAf8DAAH/AwAB/0QAA1cBvQO/Af8DlAH/AUABHgEgAf8BigEdASMB/wGTARsBIgH/ + AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AZMBGwEiAf8BkgEbASEB/wGOARkBIAH/AZIBGwEiAf8BkwEb + ASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGSARsBIQH/ + AY0BGQEfAf8BkgEbASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AYABHgEjAf8BNQEd + AR8B/wO0Af8DtAH/A1QBrgIXAawB/wIXAakB/wIXAaYB/wISAaYB/wIRAaYB/wIRAaMB/wIRAZ8B/wIP + AZ4B/wIPAZcB/wIPAZcB/wIPAZYB/wIPAZYB/wIPAY4B/wIPAY4B/wIPAY4B/wIPAY4B/wIPAY4B/wIP + AY4B/wIPAY4B/wIPAY4B/wIPAZYB/wIPAZYB/wIPAZcB/wIPAZcB/wIPAZ4B/wIRAZ8B/wIRAaMB/wIR + AaYB/wISAaYB/wIXAaYB/wIXAakB/wIXAawB/yQAAwEBAgMDBAQEBgEIAwYBCAMEAQYDAwEEAwABAWcA + Af8DAAH/AwAB/wMAAf8DAAH/RAADNAFUA0QB/wPuAf8DkwH/AysB/wMVAf8DFQH/AxUB/wMVAf8DFQH/ + AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/ + AxUB/wMVAf8DNAH/A7IB/wPqAf8DNAH/Ay0BRQIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIX + AawB/wIXAawB/wITAagB/wISAaQB/wIPAaIB/wIPAZ8B/wIPAZ8B/wIPAZwB/wIPAZwB/wIPAZwB/wIP + AZwB/wIPAZwB/wIPAZwB/wIPAZwB/wIPAZwB/wIPAZ8B/wIPAZ8B/wIPAaIB/wISAacB/wITAagB/wIX + AawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB//8ABQADSgGNA0MB/wPNAf8D+QH/ + A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/ + A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wPrAf8DvQH/Ay4B/wNIAYcEAANIAYUCFwGsAf8CFwGs + Af8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFgGpAf8CFAGpAf8CFAGmAf8CEAGkAf8CDwGh + Af8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CEAGkAf8CFAGmAf8CFAGp + Af8CFgGrAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8DSAGF/wAJAAM3 + AVoDWQHDAysB/AMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMV + Af8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DVQHqA1QBrgMtAUUIAAMHAQoDSAGF + AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBqwH/AhYBqgH/ + AhUBqgH/AhUBqAH/AhUBpAH/AhUBpAH/AhUBpAH/AhUBpAH/AhUBqAH/AhUBqgH/AhYBqgH/AhcBqwH/ + AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/A0gBhQMHAQr/AAEA + AUIBTQE+BwABPgMAASgDAAGAAwABQAMAAQEBAAEBBgABBBYAA///AP8AAwABwAIAAQMEAAj/AYACAAEB + BAAC/wH4AQcE/wgAAv8B8AEDBP8IAAL/AeABAQH/AcEC/wgAAv8BwAEBAf8BwQL/CAAC/wGAAQEB/wHB + Av8IAAL/AQABAQH/AcEC/wgAAf8B/gEAAQEB/wHBAv8IAAH/AfwBAAEBAf8CwQH/CAAB/wH8AQABAQH/ + AsEB/wgAAf8BgAEAAQEB/wLBAf8IAAH+AgABAQH/AsEB/wgAAfgCAAEDAf8CwQH/CAAB8AIAAQcB4AEB + AcABBwgAAfACAAEfAeABAQHAAQcIAAHwAgABPwHgAQEBwAEHCAAB8AIAAX8B4AEBAcABBwgAAfACAAH/ + AeABAQHAAQcIAAHwAQABAQL/AsEB/wgAAfABAAEDAv8CwQH/CAAB8AEAAQMC/wLBAf8IAAHwAQABAwL/ + AsEB/wgAAfABAAEDAv8CwQH/CAAB8AEAAQMC/wHBAv8IAAHwAQABAwL/AcEC/wgAAfgBAAEHAv8BwQL/ + CAAB+AEAAQ8C/wHBAv8IAAH8AQABHwL/AcEC/wgAAf8BgAF/Av8BwQL/CAAI/wGAAgABAQQACP8BwAIA + AQMEAAj/Cw== \ No newline at end of file diff --git a/ThirdParty/Converter.cs b/ThirdParty/Converter.cs index 21ff000..d64caa6 100644 --- a/ThirdParty/Converter.cs +++ b/ThirdParty/Converter.cs @@ -1,7 +1,42 @@ -namespace DutyContent.ThirdParty +using System; +using System.Drawing; + +namespace DutyContent.ThirdParty { static class Converter { + public static bool TryLong(string s, out long ret) + { + ret = 0; + + for (int i = 0; i < s.Length; i++) + { + var n = s[i] - '0'; + if (n < 0 || n > 9) + return false; + + ret = ret * 10 + n; + } + + return true; + } + + public static long ToLong(string s, long failret = 0) + { + long ret = 0; + + for (int i = 0; i < s.Length; i++) + { + var n = s[i] - '0'; + if (n < 0 || n > 9) + return failret; + + ret = ret * 10 + n; + } + + return ret; + } + public static bool TryInt(string s, out int ret) { ret = 0; @@ -50,7 +85,7 @@ return true; } - public static ushort ToUshort(string s, ushort failret=0) + public static ushort ToUshort(string s, ushort failret = 0) { int ret = 0; @@ -71,9 +106,28 @@ return s.ToUpper().Equals("TRUE"); } - public static float ToFloat(string s, float failret=0.0f) + public static float ToFloat(string s, float failret = 0.0f) { return float.TryParse(s, out float v) ? v : failret; } + + public static Color ToColorArgb(string s, Color failret) + { + try + { + var i = Convert.ToInt32(s, 16); + var r = Color.FromArgb(i); + return r; + } + catch + { + return failret; + } + } + + public static Color ToColorArgb(string s) + { + return ToColorArgb(s, Color.Transparent); + } } } diff --git a/ThirdParty/LineDb.cs b/ThirdParty/LineDb.cs index 9935f2a..3b8467f 100644 --- a/ThirdParty/LineDb.cs +++ b/ThirdParty/LineDb.cs @@ -10,8 +10,6 @@ namespace DutyContent.ThirdParty private Dictionary _dbstr = new Dictionary(); private Dictionary _dbint = new Dictionary(); - public static string InvalidKey = ""; - public LineDb(string ctx, bool useintdb) { LoadString(ctx, useintdb, false); @@ -140,15 +138,25 @@ namespace DutyContent.ThirdParty public string Get(string name) { - if (!_dbstr.TryGetValue(name, out string value)) - return name; - return value; + return Get(name, string.Empty); } public string Get(int key) + { + return Get(key, string.Empty); + } + + public string Get(string name, string defvalue) + { + if (!_dbstr.TryGetValue(name, out string value)) + return defvalue; + return value; + } + + public string Get(int key, string defvalue) { if (!_dbint.TryGetValue(key, out string value)) - return InvalidKey; + return defvalue; return value; } @@ -208,7 +216,7 @@ namespace DutyContent.ThirdParty { get { - return Try(index, out string v) ? v : ""; + return Try(index, out string v) ? v : string.Empty; } } @@ -216,7 +224,7 @@ namespace DutyContent.ThirdParty { get { - return Try(key, out string v) ? v : ""; + return Try(key, out string v) ? v : string.Empty; } } } diff --git a/ThirdParty/ThreadWorker.cs b/ThirdParty/ThreadWorker.cs new file mode 100644 index 0000000..c8b0323 --- /dev/null +++ b/ThirdParty/ThreadWorker.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DutyContent.ThirdParty +{ + public abstract class ThreadWorker + { + protected readonly object _thread_lock = new object(); + protected readonly object _sleep_lock = new object(); + private Thread _thread_ptr; + + protected bool IsBreak { get; private set; } = false; + + protected abstract void RunThread(T context); + + public void StartThread(T context, string name = null) + { + lock (_thread_lock) + { + StopThread(); + _thread_ptr = CreateThread(name); + _thread_ptr.Start(context); + } + } + + public void StopThread() + { + lock (_thread_lock) + { + while (_thread_ptr!=null && _thread_ptr.IsAlive) + { + IsBreak = true; + lock (_sleep_lock) + Monitor.Pulse(_sleep_lock); + Monitor.Wait(_thread_lock, 100); + } + + _thread_ptr = null; + IsBreak = false; + } + } + + protected virtual Thread CreateThread(string name = null) + { + var thd = new Thread(new ParameterizedThreadStart((context) => + { + try + { + RunThread((T)context); + } + finally + { + lock (_thread_lock) + { + _thread_ptr = null; + Monitor.PulseAll(_thread_lock); + } + } + })) + { + IsBackground = true, + Name = !string.IsNullOrEmpty(name) ? name : GetType().FullName + }; + + return thd; + } + + protected void SafeSleep(TimeSpan ts) + { + lock (_sleep_lock) + Monitor.Wait(_sleep_lock, ts); + } + + protected void SafeSleep(int milliseconds) + { + lock (_sleep_lock) + Monitor.Wait(_sleep_lock, milliseconds); + } + } +}