This commit is contained in:
kshman 2021-03-21 03:43:05 +09:00
parent 654f405a44
commit f731188c8f
16 changed files with 1127 additions and 419 deletions

View file

@ -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<ThirdParty.NativeMethods.TcpRow> Conns = new List<ThirdParty.NativeMethods.TcpRow>();
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<ThirdParty.NativeMethods.TcpTable>(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<ThirdParty.NativeMethods.TcpRow>(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

View file

@ -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();
}
}

View file

@ -96,6 +96,7 @@
<Compile Include="ThirdParty\Converter.cs" />
<Compile Include="ThirdParty\LineDb.cs" />
<Compile Include="ThirdParty\NativeMethods.cs" />
<Compile Include="ThirdParty\ThreadWorker.cs" />
<Compile Include="WorkerAct.cs" />
</ItemGroup>
<ItemGroup>
@ -166,6 +167,9 @@
<ItemGroup>
<Resource Include="Data\DcLang-Japanese.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\pix_tab_ping.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>if exist "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" copy $(TargetPath) "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" /y

View file

@ -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)

View file

@ -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;
}
}

View file

@ -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);
}));
}
}
}

View file

@ -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 {
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_tab_ping {
get {
object obj = ResourceManager.GetObject("pix_tab_ping", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>

View file

@ -133,6 +133,9 @@
<data name="pix_tab_content" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\pix_tab_content.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_ping" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_ping.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_setting" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

View file

@ -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}

BIN
Resources/pix_tab_ping.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

316
Tab/DutyForm.Designer.cs generated
View file

@ -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;
}
}

View file

@ -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<string> 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);
}
}
}

View file

@ -124,285 +124,307 @@
<value>
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==
</value>
</data>
</root>

View file

@ -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);
}
}
}

24
ThirdParty/LineDb.cs vendored
View file

@ -10,8 +10,6 @@ namespace DutyContent.ThirdParty
private Dictionary<string, string> _dbstr = new Dictionary<string, string>();
private Dictionary<int, string> _dbint = new Dictionary<int, string>();
public static string InvalidKey = "<invalid>";
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;
}
}
}

84
ThirdParty/ThreadWorker.cs vendored Normal file
View file

@ -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<T>
{
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);
}
}
}