Added special button re-mapping system

This commit is contained in:
David Khachaturov 2020-04-03 15:53:04 +01:00
parent 1708d13926
commit ca406a99b6
9 changed files with 1249 additions and 41 deletions

View file

@ -170,6 +170,12 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Reassign.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reassign.Designer.cs">
<DependentUpon>Reassign.cs</DependentUpon>
</Compile>
<Compile Include="UpdServer.cs" />
</ItemGroup>
<ItemGroup>
@ -204,6 +210,9 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Reassign.resx">
<DependentUpon>Reassign.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">

View file

@ -8,23 +8,36 @@ using System.Threading.Tasks;
namespace BetterJoyForCemu {
public static class Config { // stores dynamic configuration, including
const string PATH = "settings";
static Dictionary<string, bool> variables = new Dictionary<string, bool>();
static Dictionary<string, string> variables = new Dictionary<string, string>();
const int settingsNum = 2; // currently - ProgressiveScan, StartInTray
const int settingsNum = 9; // currently - ProgressiveScan, StartInTray + special buttons
public static string GetDefaultValue(string s) {
switch(s) {
case "ProgressiveScan":
return "1";
case "capture":
return "key_" + ((int)WindowsInput.Events.KeyCode.PrintScreen);
case "reset_mouse":
return "joy_" + ((int)Joycon.Button.STICK);
}
return "0";
}
public static void Init(List<KeyValuePair<string, float[]>> caliData) {
variables["ProgressiveScan"] = true;
variables["StartInTray"] = false;
foreach (string s in new string[] { "ProgressiveScan", "StartInTray", "capture", "home", "sl_l", "sl_r", "sr_l", "sr_r", "reset_mouse" })
variables[s] = GetDefaultValue(s);
if (File.Exists(PATH)) {
int lineNO = 0;
using (StreamReader file = new StreamReader(PATH)) {
string line = String.Empty;
int lineNO = 0;
while ((line = file.ReadLine()) != null) {
string[] vs = line.Split();
try {
if (lineNO < settingsNum) { // load in basic settings
variables[vs[0]] = Boolean.Parse(vs[1]);
variables[vs[0]] = vs[1];
} else { // load in calibration presets
caliData.Clear();
for (int i = 0; i < vs.Length; i++) {
@ -42,6 +55,14 @@ namespace BetterJoyForCemu {
} catch { }
lineNO++;
}
}
// if old settings
if (lineNO < settingsNum) {
File.Delete(PATH);
Init(caliData);
}
} else {
using (StreamWriter file = new StreamWriter(PATH)) {
@ -58,13 +79,27 @@ namespace BetterJoyForCemu {
}
}
public static bool Value(string key) {
if (!variables.ContainsKey("ProgressiveScan") && !variables.ContainsKey("StartInTray")) {
return false;
public static int IntValue(string key) {
if (!variables.ContainsKey(key)) {
return 0;
}
return Int32.Parse(variables[key]);
}
public static string Value(string key) {
if (!variables.ContainsKey(key)) {
return "";
}
return variables[key];
}
public static bool SetValue(string key, string value) {
if (!variables.ContainsKey(key))
return false;
variables[key] = value;
return true;
}
public static void SaveCaliData(List<KeyValuePair<string, float[]>> caliData) {
string[] txt = File.ReadAllLines(PATH);
if (txt.Length < settingsNum + 1) // no custom calibrations yet
@ -80,8 +115,7 @@ namespace BetterJoyForCemu {
File.WriteAllLines(PATH, txt);
}
public static void Save(string key, bool value) {
variables[key] = value;
public static void Save() {
string[] txt = File.ReadAllLines(PATH);
int NO = 0;
foreach (string k in variables.Keys) {

View file

@ -299,7 +299,7 @@ namespace BetterJoyForCemu {
public void DebugPrint(String s, DebugType d) {
if (debug_type == DebugType.NONE) return;
if (d == DebugType.ALL || d == debug_type || debug_type == DebugType.ALL) {
form.console.Text += s + "\r\n";
form.AppendTextBox(s + "\r\n");
}
}
public bool GetButtonDown(Button b) {
@ -470,8 +470,6 @@ namespace BetterJoyForCemu {
state = state_.NOT_ATTACHED;
}
string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
int GyroMouseSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivity"]);
// TODO: Improve this loop, make USB not laggy
private byte ts_en;
private int ReceiveRaw() {
@ -501,28 +499,14 @@ namespace BetterJoyForCemu {
Program.server.NewReportIncoming(this);
if (xin != null)
xin.SendReport(report);
try {
xin.SendReport(report);
} catch (Exception e) {
// ignore /shrug
}
}
// Link capture button to print screen
if (buttons[(int)Button.CAPTURE])
WindowsInput.Simulate.Events().Click(WindowsInput.Events.KeyCode.PrintScreen).Invoke();
if (extraGyroFeature == "joy") {
// TODO
} else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
float dt = 0.015f; // 15ms
// gyro data is in degrees/s
int dx = (int)(GyroMouseSensitivity * (gyr_g.Z * dt) * (Math.Abs(gyr_g.Z) < 1 ? 0 : 1));
int dy = (int)-(GyroMouseSensitivity * (gyr_g.Y * dt) * (Math.Abs(gyr_g.Y) < 1 ? 0 : 1));
WindowsInput.Simulate.Events().MoveBy(dx, dy).Invoke();
// reset mouse position to centre of primary monitor
if (buttons[(int)Button.STICK] || buttons[(int)Button.STICK2])
WindowsInput.Simulate.Events().MoveTo(Screen.PrimaryScreen.Bounds.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2).Invoke();
}
DoThingsWithButtons();
if (ts_en == raw_buf[1] && !isSnes) {
form.AppendTextBox("Duplicate timestamp enqueued.\r\n");
@ -534,6 +518,46 @@ namespace BetterJoyForCemu {
return ret;
}
private void Simulate(string s) {
if (s.StartsWith("key_"))
WindowsInput.Simulate.Events().Click((WindowsInput.Events.KeyCode) Int32.Parse(s.Substring(4))).Invoke();
else if (s.StartsWith("mse_"))
WindowsInput.Simulate.Events().Click((WindowsInput.Events.ButtonCode) Int32.Parse(s.Substring(4))).Invoke();
}
string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
int GyroMouseSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivity"]);
private void DoThingsWithButtons() {
if (buttons_down[(int)Button.CAPTURE])
Simulate(Config.Value("capture"));
if (buttons_down[(int)Button.HOME])
Simulate(Config.Value("home"));
if (isLeft && buttons_down[(int)Button.SL])
Simulate(Config.Value("sl_l"));
if (isLeft && buttons_down[(int)Button.SR])
Simulate(Config.Value("sr_l"));
if (!isLeft && buttons_down[(int)Button.SL])
Simulate(Config.Value("sl_r"));
if (!isLeft && buttons_down[(int)Button.SR])
Simulate(Config.Value("sr_r"));
if (extraGyroFeature == "joy") {
// TODO
} else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
float dt = 0.015f; // 15ms
// gyro data is in degrees/s
int dx = (int)(GyroMouseSensitivity * (gyr_g.Z * dt) * (Math.Abs(gyr_g.Z) < 1 ? 0 : 1));
int dy = (int)-(GyroMouseSensitivity * (gyr_g.Y * dt) * (Math.Abs(gyr_g.Y) < 1 ? 0 : 1));
WindowsInput.Simulate.Events().MoveBy(dx, dy).Invoke();
// reset mouse position to centre of primary monitor
if (buttons_down[(int)Button.STICK] || buttons_down[(int)Button.STICK2])
WindowsInput.Simulate.Events().MoveTo(Screen.PrimaryScreen.Bounds.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2).Invoke();
}
}
// TODO: Fix?
private Thread PollThreadObj; // pro times out over time randomly if it was USB and then bluetooth??
private void Poll() {
@ -727,6 +751,10 @@ namespace BetterJoyForCemu {
}
}
// overwrite guide button if it's custom-mapped
if (Config.Value("home") != "0")
report.SetButtonState(Xbox360Buttons.Guide, false);
lock (buttons_up) {
lock (buttons_down) {
for (int i = 0; i < buttons.Length; ++i) {

View file

@ -51,6 +51,7 @@
this.rightPanel = new System.Windows.Forms.Panel();
this.settingsApply = new System.Windows.Forms.Button();
this.AutoCalibrate = new System.Windows.Forms.Button();
this.btn_reassign_open = new System.Windows.Forms.Button();
this.contextMenu.SuspendLayout();
this.conCntrls.SuspendLayout();
this.groupBox1.SuspendLayout();
@ -333,6 +334,16 @@
this.AutoCalibrate.UseVisualStyleBackColor = true;
this.AutoCalibrate.Click += new System.EventHandler(this.StartCalibrate);
//
// btn_reassign_open
//
this.btn_reassign_open.Location = new System.Drawing.Point(107, 112);
this.btn_reassign_open.Name = "btn_reassign_open";
this.btn_reassign_open.Size = new System.Drawing.Size(75, 20);
this.btn_reassign_open.TabIndex = 13;
this.btn_reassign_open.Text = "Map Buttons";
this.btn_reassign_open.UseVisualStyleBackColor = true;
this.btn_reassign_open.Click += new System.EventHandler(this.btn_reassign_open_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -340,6 +351,7 @@
this.AutoSize = true;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.ClientSize = new System.Drawing.Size(284, 261);
this.Controls.Add(this.btn_reassign_open);
this.Controls.Add(this.foldLbl);
this.Controls.Add(this.rightPanel);
this.Controls.Add(this.AutoCalibrate);
@ -396,5 +408,6 @@
private System.Windows.Forms.Button settingsApply;
private System.Windows.Forms.Label foldLbl;
private System.Windows.Forms.Button AutoCalibrate;
}
private System.Windows.Forms.Button btn_reassign_open;
}
}

View file

@ -93,10 +93,10 @@ namespace BetterJoyForCemu {
Program.Start();
passiveScanBox.Checked = Config.Value("ProgressiveScan");
startInTrayBox.Checked = Config.Value("StartInTray");
passiveScanBox.Checked = Config.IntValue("ProgressiveScan") == 1;
startInTrayBox.Checked = Config.IntValue("StartInTray") == 1;
if (Config.Value("StartInTray")) {
if (Config.IntValue("StartInTray") == 1) {
HideToTray();
} else {
ShowFromTray();
@ -124,7 +124,8 @@ namespace BetterJoyForCemu {
}
private void passiveScanBox_CheckedChanged(object sender, EventArgs e) {
Config.Save("ProgressiveScan", passiveScanBox.Checked);
Config.SetValue("ProgressiveScan", passiveScanBox.Checked ? "1" : "0");
Config.Save();
}
public void AppendTextBox(string value) { // https://stackoverflow.com/questions/519233/writing-to-a-textbox-from-another-thread
@ -224,7 +225,8 @@ namespace BetterJoyForCemu {
}
private void startInTrayBox_CheckedChanged(object sender, EventArgs e) {
Config.Save("StartInTray", startInTrayBox.Checked);
Config.SetValue("StartInTray", startInTrayBox.Checked ? "1" : "0");
Config.Save();
}
private void btn_open3rdP_Click(object sender, EventArgs e) {
@ -330,6 +332,11 @@ namespace BetterJoyForCemu {
countDown.Enabled = true;
}
private void btn_reassign_open_Click(object sender, EventArgs e) {
Reassign mapForm = new Reassign();
mapForm.ShowDialog();
}
private void CountDown(object sender, EventArgs e) {
if (this.count == 0) {
this.console.Text = "Calibrating...";

View file

@ -95,7 +95,7 @@ namespace BetterJoyForCemu {
}
void CheckForNewControllersTime(Object source, ElapsedEventArgs e) {
if (Config.Value("ProgressiveScan")) {
if (Config.IntValue("ProgressiveScan") == 1) {
CheckForNewControllers();
}
}

248
BetterJoyForCemu/Reassign.Designer.cs generated Normal file
View file

@ -0,0 +1,248 @@
namespace BetterJoyForCemu {
partial class Reassign {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Reassign));
this.btn_capture = new System.Windows.Forms.Button();
this.lbl_capture = new System.Windows.Forms.Label();
this.lbl_home = new System.Windows.Forms.Label();
this.btn_home = new System.Windows.Forms.Button();
this.lbl_sl_l = new System.Windows.Forms.Label();
this.btn_sl_l = new System.Windows.Forms.Button();
this.lbl_sr_l = new System.Windows.Forms.Label();
this.btn_sr_l = new System.Windows.Forms.Button();
this.lbl_sl_r = new System.Windows.Forms.Label();
this.btn_sl_r = new System.Windows.Forms.Button();
this.lbl_sr_r = new System.Windows.Forms.Label();
this.btn_sr_r = new System.Windows.Forms.Button();
this.btn_close = new System.Windows.Forms.Button();
this.btn_apply = new System.Windows.Forms.Button();
this.tip_reassign = new System.Windows.Forms.ToolTip(this.components);
this.lbl_reset_mouse = new System.Windows.Forms.Label();
this.btn_reset_mouse = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btn_capture
//
this.btn_capture.Location = new System.Drawing.Point(105, 12);
this.btn_capture.Name = "btn_capture";
this.btn_capture.Size = new System.Drawing.Size(75, 23);
this.btn_capture.TabIndex = 0;
this.btn_capture.UseVisualStyleBackColor = true;
//
// lbl_capture
//
this.lbl_capture.AutoSize = true;
this.lbl_capture.Location = new System.Drawing.Point(15, 17);
this.lbl_capture.Name = "lbl_capture";
this.lbl_capture.Size = new System.Drawing.Size(44, 13);
this.lbl_capture.TabIndex = 2;
this.lbl_capture.Text = "Capture";
this.lbl_capture.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// lbl_home
//
this.lbl_home.AutoSize = true;
this.lbl_home.Location = new System.Drawing.Point(15, 46);
this.lbl_home.Name = "lbl_home";
this.lbl_home.Size = new System.Drawing.Size(35, 13);
this.lbl_home.TabIndex = 4;
this.lbl_home.Text = "Home";
this.lbl_home.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_home
//
this.btn_home.Location = new System.Drawing.Point(105, 41);
this.btn_home.Name = "btn_home";
this.btn_home.Size = new System.Drawing.Size(75, 23);
this.btn_home.TabIndex = 3;
this.btn_home.UseVisualStyleBackColor = true;
//
// lbl_sl_l
//
this.lbl_sl_l.AutoSize = true;
this.lbl_sl_l.Location = new System.Drawing.Point(15, 75);
this.lbl_sl_l.Name = "lbl_sl_l";
this.lbl_sl_l.Size = new System.Drawing.Size(78, 13);
this.lbl_sl_l.TabIndex = 6;
this.lbl_sl_l.Text = "SL Left Joycon";
this.lbl_sl_l.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_sl_l
//
this.btn_sl_l.Location = new System.Drawing.Point(105, 70);
this.btn_sl_l.Name = "btn_sl_l";
this.btn_sl_l.Size = new System.Drawing.Size(75, 23);
this.btn_sl_l.TabIndex = 5;
this.btn_sl_l.UseVisualStyleBackColor = true;
//
// lbl_sr_l
//
this.lbl_sr_l.AutoSize = true;
this.lbl_sr_l.Location = new System.Drawing.Point(15, 104);
this.lbl_sr_l.Name = "lbl_sr_l";
this.lbl_sr_l.Size = new System.Drawing.Size(80, 13);
this.lbl_sr_l.TabIndex = 8;
this.lbl_sr_l.Text = "SR Left Joycon";
this.lbl_sr_l.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_sr_l
//
this.btn_sr_l.Location = new System.Drawing.Point(105, 99);
this.btn_sr_l.Name = "btn_sr_l";
this.btn_sr_l.Size = new System.Drawing.Size(75, 23);
this.btn_sr_l.TabIndex = 7;
this.btn_sr_l.UseVisualStyleBackColor = true;
//
// lbl_sl_r
//
this.lbl_sl_r.AutoSize = true;
this.lbl_sl_r.Location = new System.Drawing.Point(15, 133);
this.lbl_sl_r.Name = "lbl_sl_r";
this.lbl_sl_r.Size = new System.Drawing.Size(85, 13);
this.lbl_sl_r.TabIndex = 10;
this.lbl_sl_r.Text = "SL Right Joycon";
this.lbl_sl_r.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_sl_r
//
this.btn_sl_r.Location = new System.Drawing.Point(105, 128);
this.btn_sl_r.Name = "btn_sl_r";
this.btn_sl_r.Size = new System.Drawing.Size(75, 23);
this.btn_sl_r.TabIndex = 9;
this.btn_sl_r.UseVisualStyleBackColor = true;
//
// lbl_sr_r
//
this.lbl_sr_r.AutoSize = true;
this.lbl_sr_r.Location = new System.Drawing.Point(15, 162);
this.lbl_sr_r.Name = "lbl_sr_r";
this.lbl_sr_r.Size = new System.Drawing.Size(87, 13);
this.lbl_sr_r.TabIndex = 12;
this.lbl_sr_r.Text = "SR Right Joycon";
this.lbl_sr_r.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_sr_r
//
this.btn_sr_r.Location = new System.Drawing.Point(105, 157);
this.btn_sr_r.Name = "btn_sr_r";
this.btn_sr_r.Size = new System.Drawing.Size(75, 23);
this.btn_sr_r.TabIndex = 11;
this.btn_sr_r.UseVisualStyleBackColor = true;
//
// btn_close
//
this.btn_close.Location = new System.Drawing.Point(15, 231);
this.btn_close.Name = "btn_close";
this.btn_close.Size = new System.Drawing.Size(75, 23);
this.btn_close.TabIndex = 13;
this.btn_close.Text = "Okay";
this.btn_close.UseVisualStyleBackColor = true;
this.btn_close.Click += new System.EventHandler(this.btn_close_Click);
//
// btn_apply
//
this.btn_apply.Location = new System.Drawing.Point(105, 231);
this.btn_apply.Name = "btn_apply";
this.btn_apply.Size = new System.Drawing.Size(75, 23);
this.btn_apply.TabIndex = 14;
this.btn_apply.Text = "Apply";
this.btn_apply.UseVisualStyleBackColor = true;
this.btn_apply.Click += new System.EventHandler(this.btn_apply_Click);
//
// lbl_reset_mouse
//
this.lbl_reset_mouse.AutoSize = true;
this.lbl_reset_mouse.Location = new System.Drawing.Point(15, 191);
this.lbl_reset_mouse.Name = "lbl_reset_mouse";
this.lbl_reset_mouse.Size = new System.Drawing.Size(80, 13);
this.lbl_reset_mouse.TabIndex = 16;
this.lbl_reset_mouse.Text = "Re-Centre Gyro";
this.lbl_reset_mouse.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btn_reset_mouse
//
this.btn_reset_mouse.Enabled = false;
this.btn_reset_mouse.Location = new System.Drawing.Point(105, 186);
this.btn_reset_mouse.Name = "btn_reset_mouse";
this.btn_reset_mouse.Size = new System.Drawing.Size(75, 23);
this.btn_reset_mouse.TabIndex = 15;
this.btn_reset_mouse.UseVisualStyleBackColor = true;
//
// Reassign
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(192, 266);
this.Controls.Add(this.lbl_reset_mouse);
this.Controls.Add(this.btn_reset_mouse);
this.Controls.Add(this.btn_apply);
this.Controls.Add(this.btn_close);
this.Controls.Add(this.lbl_sr_r);
this.Controls.Add(this.btn_sr_r);
this.Controls.Add(this.lbl_sl_r);
this.Controls.Add(this.btn_sl_r);
this.Controls.Add(this.lbl_sr_l);
this.Controls.Add(this.btn_sr_l);
this.Controls.Add(this.lbl_sl_l);
this.Controls.Add(this.btn_sl_l);
this.Controls.Add(this.lbl_home);
this.Controls.Add(this.btn_home);
this.Controls.Add(this.lbl_capture);
this.Controls.Add(this.btn_capture);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Reassign";
this.Text = "Map Special Buttons";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Reassign_FormClosing);
this.Load += new System.EventHandler(this.Reassign_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btn_capture;
private System.Windows.Forms.Label lbl_capture;
private System.Windows.Forms.Label lbl_home;
private System.Windows.Forms.Button btn_home;
private System.Windows.Forms.Label lbl_sl_l;
private System.Windows.Forms.Button btn_sl_l;
private System.Windows.Forms.Label lbl_sr_l;
private System.Windows.Forms.Button btn_sr_l;
private System.Windows.Forms.Label lbl_sl_r;
private System.Windows.Forms.Button btn_sl_r;
private System.Windows.Forms.Label lbl_sr_r;
private System.Windows.Forms.Button btn_sr_r;
private System.Windows.Forms.Button btn_close;
private System.Windows.Forms.Button btn_apply;
private System.Windows.Forms.ToolTip tip_reassign;
private System.Windows.Forms.Label lbl_reset_mouse;
private System.Windows.Forms.Button btn_reset_mouse;
}
}

View file

@ -0,0 +1,107 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BetterJoyForCemu {
public partial class Reassign : Form {
private WindowsInput.Events.Sources.IKeyboardEventSource keyboard;
private WindowsInput.Events.Sources.IMouseEventSource mouse;
private Control curAssignment;
public Reassign() {
InitializeComponent();
foreach (Control c in new Control[] { btn_capture, btn_home, btn_sl_l, btn_sl_r, btn_sr_l, btn_sr_r, btn_reset_mouse }) {
c.Tag = c.Name.Substring(4);
GetPrettyName(c);
tip_reassign.SetToolTip(c, "Left-click to detect input.\r\nMiddle-click to clear to default.\r\nRight-click to see more options.");
c.MouseDown += Remap;
}
}
private void Remap(object sender, MouseEventArgs e) {
Button c = sender as Button;
Debug.WriteLine(e.Button);
switch (e.Button) {
case MouseButtons.Left:
c.Text = "...";
curAssignment = c;
break;
case MouseButtons.Middle:
Config.SetValue((string) c.Tag, Config.GetDefaultValue((string) c.Tag));
GetPrettyName(c);
break;
case MouseButtons.Right:
break;
}
}
private void Reassign_Load(object sender, EventArgs e) {
keyboard = WindowsInput.Capture.Global.KeyboardAsync();
keyboard.KeyEvent += Keyboard_KeyEvent;
mouse = WindowsInput.Capture.Global.MouseAsync();
mouse.MouseEvent += Mouse_MouseEvent;
}
private void Mouse_MouseEvent(object sender, WindowsInput.Events.Sources.EventSourceEventArgs<WindowsInput.Events.Sources.MouseEvent> e) {
if (curAssignment != null && e.Data.ButtonDown != null) {
Config.SetValue((string)curAssignment.Tag, "mse_" + ((int)e.Data.ButtonDown.Button));
AsyncPrettyName(curAssignment);
curAssignment = null;
}
}
private void Keyboard_KeyEvent(object sender, WindowsInput.Events.Sources.EventSourceEventArgs<WindowsInput.Events.Sources.KeyboardEvent> e) {
if (curAssignment != null && e.Data.KeyDown != null) {
Config.SetValue((string)curAssignment.Tag, "key_" + ((int)e.Data.KeyDown.Key));
AsyncPrettyName(curAssignment);
curAssignment = null;
}
}
private void Reassign_FormClosing(object sender, FormClosingEventArgs e) {
keyboard.Dispose();
mouse.Dispose();
}
private void AsyncPrettyName(Control c) {
if (InvokeRequired) {
this.Invoke(new Action<Control>(AsyncPrettyName), new object[] { c });
return;
}
GetPrettyName(c);
}
private void GetPrettyName(Control c) {
string val;
switch (val = Config.Value((string)c.Tag)) {
case "0":
if (c == btn_home)
c.Text = "Guide";
break;
default:
Type t = val.StartsWith("joy_") ? typeof(Joycon.Button) : (val.StartsWith("key_") ? typeof(WindowsInput.Events.KeyCode) : typeof(WindowsInput.Events.ButtonCode));
c.Text = Enum.GetName(t, Int32.Parse(val.Substring(4)));
break;
}
}
private void btn_apply_Click(object sender, EventArgs e) {
Config.Save();
}
private void btn_close_Click(object sender, EventArgs e) {
btn_apply_Click(sender, e);
Close();
}
}
}

View file

@ -0,0 +1,762 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="tip_reassign.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAA6E8AAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAPDwwRDhI7XgoNMEwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJ
EgAAABYELicITTcvB2QLCwwUFBlTjSg1x/siLKjtBwkkQQoNNAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9
RQAqJAUAIR0KQJN5AuyzlAH9TkEGlhsjhNgzQ/z/Lz7s/xMaYpsAAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAFBQUAAAAPA1ZIA5nSrQD/5LwA/3pmBOEeJondMkL8/zFB//9ETbjuYWFgnmJiYo1eXl6OXl5ejl5e
Xo5iYmKPZWVljmJjZJ6okint5LwA/+K6AP96ZQLkGyOA0S8/+v9aZ///1Nf9/+rq6f+9vb3/6urq/+zs
7P/q6ur/vr6+/66urv/o6On/+fHL/+nJMv/ftwD/cF0D2TI4dL6OlvT/4+X///z8/P+cnJz/NjY2/7Gx
sf//////39/f/2RkZP9dXV3/s7Oz///////79dn/59Jy/2dbIMdeXmCh6uvr//b29v/e3t7/oKCg/z8/
P/+5ubn//////+Hh4f9kZGT/XFxc/6Ojo/+9vb3//Pz8/+zs6/9eXVysRUVFeNLS0v6Ojo7/YGBg/56e
nv/Z2dn/7e3t//n5+f/39/f/y8vL/6qqqv+urq7/j4+P/8bGxv/Kysr/RUVGgR8fH0KoqKjvb29v/15e
Xv9+fn7/+vr6/9TU1P/u7u7/6urq/9jY2P+xsbH/lpaW/9PT0/+CgoL/jo6O8icnJ0kAAAAOcHBws7W1
tf+ZmZn/3Nzc/93d3f/j4+P////////////d3d3/4eHh/9vb2/99fX3/2dnZ/29vb7cAAAASHx8fABQU
FDxPT0/jiIiI/6SkpP+vr6/7t7e38rq6uvK6urrytra2862trfyenp7/eXl5/1FRUdUZGRk0KCgoAAMD
AwAEBAQBAgICOAMDA4IICAibEBAQZhcXFzcVFRU4FRUVNxYWFjkODg51CAgInAMDA3gBAQErFBQUAAAA
AAAAAAAAAAAAAAAAAAD6+voA/Pz8APv7+wD7+/sAAAAAAAAAAADz8/MA9PT0APf39wD09PQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AAD//wAAD/AAAA/wAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAB
AACAAwAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8OBgsBAQA0AAAAJwAA
AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA8eAAsP
IwIHCBEqCAkPPAQFFQ4BAxAADg0AExEUNJsaIoHxFBpl4QMED1gUGmQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQADQQAABIRC1dXSAPjdWEC9TApBqQDBhQZCgsZdyEr
ovo0RP//Lz7s/xEWVdAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAWFhcAAAAZGEc8Bc7PqwD/6L8A/5d9Af0dGgqFDBA6vS084f8zQ///NET//yAqofsCAghcBAYWAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTgANCgEADQ0MWYpyAvrnvwD/5b0A/86q
AP88MwbMEBRFzC896f8zQ///M0P//y074f8MDz68AAAAHwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAA
AA0AAAAOAAAADgAAAA4AAAIeNi0CuMajAP/mvQD/5b0A/9KtAP9EOgjaExdDyC485f8zQ///M0P//zND
//9cY7b8Xl5b2VJSUshTU1PIUlJSyFJSUshSUlLIUlJSyFJSUshTU1PJVVVVyVZWVspeX2HYqZhG++S8
Av/kvAD/5b0A/86qAP85LwLQDhE4uCw63v8zQ///MUH//3F9///r7f//+Pj3/+jo6P/k5OT/8fHx//Hx
8f/x8fH/8fHx//Pz8//j4+P/2dnZ//Hx8f/4+fn//Pnn/+3RUf/kuwD/5b0A/8ilAP8zKwbIEBMxqCg2
1P89Tf//hI3//+rs/////////////56env9qamr/+/v7/////////////////87Ozv9dXV3/UVFR/5CQ
kP/5+fn///////z45v/u1mL/58AL/76cAP8pIgW1FRYmj3B2xf/L0P//+fn////////9/f3/k5OT/y4u
Lv8ZGRn/b29v/+zs7P///////v7+/3R0dP9dXV3/dXV1/0lJSf/Q0ND////////////+/fb/+u+5/7qp
WP8iHw+fGBgYcrCwsP3////////////////9/f3/paWl/zw8PP8gICD/hISE/+/v7////////////3h4
eP9WVlb/bm5u/0dHR//Ozs7/4eHh//n5+f///////////7Kysv8aGhqEBgYGUJSUlPb/////6Ojo/5OT
k/+Hh4f/29vb/6mpqf94eHj/+/v7/////////////////9jY2P9lZWX/U1NT/6Ojo/++vr7/Jycn/8DA
wP///////////5eXl/kHBwheAAAALXJycuT6+vr/enp6/05OTv9aWlr/XFxc/+np6f/7+/v/8/Pz/+bm
5v///////v7+/+rq6v/x8fH/4ODg/6ioqP/FxcX/kZGR/8rKyv+np6f/6enp/3V1deoAAAA2AAAADkpK
SsDg4OD/W1tb/21tbf96enr/SkpK/9nZ2f//////1NTU/6SkpP///////Pz8/5mZmf/e3t7/zs7O/x4e
Hv+pqan//////7e3t/8dHR3/ra2t/09PT8kAAAATTU1NACEhIYK7u7v/np6e/0VFRf9GRkb/cXFx//f3
9//f39//5ubm//z8/P////////////n5+f/e3t7/3d3d/9HR0f/MzMz/YmJi/76+vv/U1NT/tLS0/yQk
JI3BwcEADg4OAAICAilZWVna39/f/8rKyv+7u7v/8PDw//////+5ubn/zs7O////////////////////
//++vr7/xsbG///////U1NT/S0tL/8bGxv/q6ur/W1tb3wUFBTENDQ0AGhoaAAAAAAAMDAxqQ0ND+p+f
n//Nzc3/3t7e/+fn5//o6Oj/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/6Ojo/+bm5v/c3Nz/vb29/5eX
l/9GRkbwDg4OWQAAAAAnJycAAAAAAA8PDwAREREMBQUFhwUFBegQEBD9Hh4e/ykpKf04ODjSQEBAsj8/
P7I/Pz+yPz8/sj8/P7I/Pz+0MzMz4ScnJ/8dHR3/EBAQ+gUFBdkGBgZnGRkZBBMTEwAAAAAAAAAAAAAA
AAAmJiYANjY2BRISEiwICAhYCQkJcgYGBmYEBAQdAAAABAAAAAUAAAAFAAAABQAAAAUBAQEFBQUFMAYG
BnEKCgpvCQkJThMTEx42NjYBJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8Ah//hAAf/4AAD/8AAA//AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEAwAADAMAAAwDgAAcA////AP///wD///8AKAAAACAA
AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAQDAAAGBQADAAAAEwAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5gaADIydEAFBYiDhIU
HxkTFSEFDg8cAP///wAcGxYAHx4XGgsMEo0JDC3QBggevQAAAE0AAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQAWVlYAQoK
Dk0eGgfCLSYG2hIRCZkKCxEgAwQKABsaDg8LDBmlHCSF/y074v8nM8P/Cw855AAAADsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2NjAA0N
DgALDBQ4LicE46eKAP/MqAD/fmgB/xkWCLMUFiAWBwYAXBYcZfYyQvj/M0T//zRE//8iLan/AwMNnQAA
AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAvLy8AUVh3AhEQC5qMdAD/6cAA/+a+AP/iuwD/ZFIC+gkKD24CAwieIi2q/zRE//8zQ///M0P//y8+
6f8MEDzhAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABQUFAAGCRYlMioF38yoAP/mvQD/5LwA/+i/AP+ghAD/ERAHsgQFErYmMr7/NET//zND
//8zQ///M0T//xsjhv8AAAB4AwQSAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAPDw8AAAAAAAgJDXRwXAH/5b0A/+S8AP/kvAD/574A/6+QAP8gHA7NCwwXtyUx
uv80RP//M0P//zND//8zRP//KzjY/wkML90EBABbAAAAMgAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAA
ADMAAAAzAAAAMwAAADQAAAA0AAAANQAAADYAAAFXKCEC2LybAP/mvgD/5LwA/+S8AP/nvwD/q40A/xcU
B8UPEBiwJC+y/zRE//8zQ///M0P//zJC//86Sf//foPB/2dnZflSUlLwUlJS8FJSUvBSUlLwUlJS8FJS
UvBSUlLwUlJS8FJSUvBSUlLwUlJS8FNTU/BXV1fwWFhY8WlpbPm4q23/5b4K/+S8AP/kvAD/5LwA/+e/
AP+jhgD/DgwDvAMECJsiLKn/NET//zND//8yQv//NUX//5Ka///5+f///f38//j4+P/6+vr/+fn5//j4
+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//r6+v/6+vr/+Pj4//39/f/7+/v//f3+//79+P/x3Hv/5L0G/+S8
AP/kvAD/6L8A/5p/AP8REAu1Dg4PkSApmv8zRP//MED//zpJ//+Vnf//9vb/////////////9fX1/4qK
iv+oqKj/////////////////////////////////39/f/4SEhP9qamr/o6Oj//X19f////////////78
9f/x3Hv/5b4K/+S7AP/ovwD/jHMA/wYGBJ4MCwd4GySJ/jlI//9fa///t73///n6//////////////j4
+P/b29v/JCQk/1VVVf/v7+//+/v7/////////////////+3t7f9TU1P/QUFB/1dXV/80NDT/kJCQ////
//////////////79+P/15qD/6ckx/+jABf98ZgH/CgoOjgwMCWFFSXX6wMX//+/w////////////////
////////hoaG/yoqKv8ICAj/EhIS/zMzM/+3t7f/////////////////vLy8/zc3N/94eHj/fHx8/2Zm
Zv9ISEj/8PDw///////////////////////9+ej/+Oqs/29lN/4HBwp0BwcHSF9fX/P8/Pv/////////
//////////////////+ZmZn/RkZG/wwMDP8cHBz/UVFR/8LCwv/////////////////AwMD/MzMz/3V1
df98fHz/X19f/0pKSv/y8vL/+vr6//39/f/////////////////9/f3/YWFh+QsLC1wAAAAtRUVF5fHx
8f////////////T09P/V1dX/39/f//39/f/n5+f/JiYm/1paWv/6+vr//v7+//////////////////Ly
8v9gYGD/MzMz/0VFRf8uLi7/oaGh/9LS0v9QUFD/np6e//////////////////T09P9ISEjuBQUFPgMD
AxYuLi7P3Nzc///////h4eH/Xl5e/zg4OP88PDz/jY2N//Hx8f+oqKj/vr6+////////////////////
/////////////+vr6/+bm5v/f39//7u7u///////pqam/wEBAf9cXFz//Pz8////////////4eHh/y8v
L9oAAAAgJSUlBRoaGqu6urr//////3d3d/8+Pj7/dHR0/2xsbP8zMzP/ubm5////////////+/v7/9vb
2//19fX////////////09PT/5OTk//7+/v/9/f3/qqqq/5GRkf/h4eH/rKys/9jY2P+9vb3/hISE/+fn
5//BwcH/HBwcuR0dHQoAAAAACQkJd4qKiv/8/Pz/U1NT/15eXv97e3v/fHx8/0NDQ/+SkpL/////////
///s7Oz/X19f/8/Pz////////////7y8vP9iYmL/9vb2/+vr6/8vLy//DQ0N/8jIyP//////+vr6/1FR
Uf8AAAD/qKio/5KSkv8LCwuGAAAAABAQEAAEBARAVVVV8/f39/9+fn7/OTk5/3BwcP9mZmb/Ly8v/7y8
vP////////////z8/P/k5OT/9/f3////////////8fHx/9zc3P/9/f3/+/v7/52dnf+EhIT/5eXl/7q6
uv/W1tb/tLS0/3h4eP/a2tr/WFhY+QgICE0PDw8AGBgYAAcHBxAgICDAwMDA/+np6f9nZ2f/NTU1/zg4
OP+Ojo7/+fn5//7+/v+cnJz/vb29/////////////////////////////////6SkpP+wsLD/////////
//+2trb/BwcH/01NTf/39/f//////8LCwv8hISHMFRUVFyEhIQAsLCwAAAAAAAgICFFHR0fx3t7e//r6
+v/d3d3/4+Pj//z8/P///////v7+/6urq//Hx8f/////////////////////////////////srKy/7y8
vP///////////9XV1f9OTk7/kZGR///////g4OD/S0tL9AsLC14AAAAAKioqAAAAAAAmJiYAODg4BQoK
Cpo6Ojr/p6en/9/f3//09PT//Pz8////////////////////////////////////////////////////
///////////////////+/v7/+/v7/+rq6v/Y2Nj/pKSk/z09PfwLCwuDMTExBSYmJgAAAAAAAAAAAP//
/wAPDw8AFBQUJQMDA8kGBgb/HR0d/zo6Ov9TU1P/ZWVl/29vb/9zc3P+dHR0/HR0dPx0dHT8dHR0/HR0
dPx0dHT8dHR0/HR0dP1ycnL+bm5u/2NjY/9QUFD/ODg4/xsbG/8GBgb8BgYGoRwcHBAXFxcAAAAAAAAA
AAAAAAAAAAAAACIiIgAXFxcAGhoaJg8PD48EBATVAQEB7gAAAPgAAAD7AQEB3wUFBXsAAABVAAAAVgAA
AFYAAABWAAAAVgAAAFYAAABWAQEBVwQEBJ4AAADyAAAA/AAAAPcBAQHnBQUFwg4ODmsmJiYRHx8fANDQ
0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoASUlJAhcXFxcSEhIyFxcXRxMTE08TExMoMjIyAioq
KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIAFhYWCRQUFDwTExNQGRkZRBISEikgICANxsbGAFdX
VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
////////x///44H//4EB//+AAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAIAAAAGAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4D/A//////////////////////ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAf3+EAAAAAAAkJCQMBQUEQAAAAGcAAABSAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUAAAAAAAJCQlGxAQE1sUFBh7Dw8SUiUl
JRMeHyAABAQEAAAAAAADAwMAHx8fACwsLCoODgytBgcV8woNMv8GCB/6AAECyAAAAEIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIyAAAAAAAQEBE/CQkKzBoW
A/wuJgL/FxMD+gkJCrwUFBQ1CwsMAB8fHwAQEBAAExMTHgkJCMIOEkH/JjK+/zA+7v8rONb/Exle/wEB
A9gAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgACIi
Ii0ICAnXRjkA/7mYAP/VsAD/spIA/0M3AP8ICAfSGhsbLhEREQBeXl8EDw8MkgsPNv8sOtv/NET//zND
//80RP//Lz7q/w0SQ/8AAACdAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA3NzcAaWlpAwsLD5YuJgH/yKUA/+i/AP/lvQD/6L8A/82pAP87MQH/DQ0Qp0JCQgoHBwQqBQYL3iAq
ov80RP//M0P//zND//8zQ///NET//yEsqP8BAgjkAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAjIyMAJCUmKAsLCeKEbQD/578A/+S8AP/kvAD/5LwA/+i/AP+ghAD/EQ8G7BUV
GD8AAABfCAol+C074P8zRP//M0P//zND//8zQ///M0P//y495/8JDDD/AAAAdgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEgACAgIADxATbyMdA//FowD/5r4A/+S8AP/kvAD/5LwA/+W9
AP/QrAD/KyQC/gkKD3wAAACCDhI//jFA8v8zQ///M0P//zND//8zQ///M0P//zND//8YIHv/AAAAxwAA
ABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAwMDARBwgLwl9OAP/juwD/5LwA/+S8
AP/kvAD/5LwA/+S8AP/dtgD/QjYB/wgJDp8AAACLDhNF/zFA9f8zQ///M0P//zND//8zQ///M0P//zRE
//8pNsz/BQYZ+AAAAFcAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYABQUFAATFBdRFBEF96yN
AP/nvgD/5LwA/+S8AP/kvAD/5LwA/+S8AP/fuAD/RjoB/xobILMHBwKKDRFB/zFA8/8zQ///M0P//zND
//8zQ///M0P//zND//8yQvr/Exlg/wEBAMQZGRguMDAwBDs7OwI5OTkCOTk5Ajk5OQI5OTkCOTk5Ajk5
OQI5OTkCOTk5Ajk5OQI5OTkCOTk5Ajk5OQI3NzcCNDQ0AzAwMAMsLCwDKCgoAyMjIwQdHR0EERERBwEB
AScAAAO7Sz4A/9y2AP/lvAD/5LwA/+S8AP/kvAD/5LwA/+S8AP/dtgD/QDUB/w4PFKYbGhWLDhE8/zA/
8P8zQ///M0P//zND//8zQ///M0P//zND//8zRP//KjjS/xocOP8ICAbhAQEBsgAAAKsBAQGrAQEBqwEB
AasBAQGrAQEBqwEBAasBAQGrAQEBqwEBAasBAQGrAQEBqwEBAasBAQGrAQEBrAAAAKwAAACsAAAArQAA
AK4AAACvAAAAtgICBNwyLBH+uJgB/+a+AP/kvAD/5LwA/+S8AP/kvAD/5LwA/+W9AP/ZswD/OS8A/wAA
AJUYFxJ9DA8z/i8+7P8zQ///M0P//zND//8zQ///M0P//zND//8wQf//YG3//8bI3/+SkpH/ampq/2Vl
Zf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2Vl
Zf9mZmb/a2tr/25ubv9wcHD/dHR0/5eYmf/d2MD/68w5/+S7AP/kvAD/5LwA/+S8AP/kvAD/5LwA/+W9
AP/WsAD/MSkB/wECBpIAAABjCAsq+i496P8zQ///M0P//zND//8zQ///M0P//zBB//9SYP//09f/////
//////////////7+/v/////////////////+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
/v/+/v7//v7+////////////////////////////////////////////+fLM/+jHLf/kuwD/5LwA/+S8
AP/kvAD/5LwA/+W9AP/RrQD/KiMC/xESFo0MCwZaCQsk+Sw63v8zRP//M0P//zND//8zQ///MEH//1Fe
///Lz//////////////////////////////29vb/8vLy//v7+///////////////////////////////
/////////////////////////v7+//Dw8P/j4+P/8fHx//7+/v////////////////////////////jv
w//oxin/5LsA/+S8AP/kvAD/5LwA/+a9AP/KpwD/IhwC/g8QFHojIx9SCwwe9io30v80RP//M0P//zJC
//8xQf//XGn//9HV//////////////////////////////Pz8/9lZWX/NjY2/6ampv//////////////
///////////////////////////////////x8fH/kJCQ/zs7O/8qKir/Pj4+/5eXl//09PT/////////
///////////////////58Mf/6cky/+S7AP/kvAD/5LwA/+a+AP++nQD/FxMA+gAAA18SEg44BwgT6ycz
xP8yQv//MED//z5O//+Djf//4+X//////////////////////////////////+7u7v8yMjL/AAAA/4OD
g/////////////////////////////////////////////r6+v93d3f/EhIS/z4+Pv9UVFT/PT09/xQU
FP+BgYH//Pz8////////////////////////////+/XZ/+3UXP/lvwv/5LsA/+e+AP+ykwD/ExAF+Bsc
HlcoJyUqCgoR5Ccxsf9OXP//goz//8rO///6+v/////////////////////////////h4eH/rq6u/6Gh
of8iIiL/AAAA/1paWv+urq7/u7u7//f39////////////////////////////8nJyf8bGxv/UFBQ/3t7
e/97e3v/e3t7/0xMTP8gICD/0dHR//////////////////////////////////789f/367T/7dNa/+rG
Hv+jhwT/DQsF7hcXGT8sKysaCgsM1HR3mf/n6v///Pz/////////////////////////////////////
//+SkpL/AwMD/wMDA/8BAQH/AAAA/wICAv8CAgL/JCQk/97e3v///////////////////////////5yc
nP8YGBj/cHBw/3p6ev95eXn/enp6/25ubv8XFxf/paWl////////////////////////////////////
/////////v76///53P+ZkGr/CgoI5ygoKS1HR0cOCwsLw4GBgP//////////////////////////////
//////////////////+enp7/GRkZ/xcXF/8FBQX/AAAA/w0NDf8XFxf/ODg4/+Li4v//////////////
/////////////6Ghof8WFhb/bGxs/3p6ev95eXn/enp6/2pqav8VFRX/qqqq////////////////////
//////////////////////////////////+Hh4n/CgoK2DU1NR5YWFgEBwcHp2JiYv/+/v7/////////
///////////////////////////////////x8fH/19fX/8fHx/8qKir/AAAA/29vb//Y2Nj/3t7e//z8
/P///////////////////////////9XV1f8hISH/PDw8/3V1df96enr/dHR0/zg4OP8nJyf/3Nzc//39
/f/Q0ND/z8/P//r6+v////////////////////////////////9ra2v/CgoKxUlJSQ8AAAAABQUFiUVF
Rf/19fX///////////////////////T09P/T09P/y8vL/+Xl5f/+/v7//////+7u7v8yMjL/AAAA/4SE
hP////////////////////////////////////////////7+/v+Tk5P/ExMT/yIiIv82Njb/ICAg/xcX
F/+dnZ3//////6ysrP8ZGRn/GRkZ/6mpqf////////////////////////////n5+f9OTk7/BgYGpVhY
WAMEBAQADAwMaCoqKv/k5OT/////////////////zc3N/1FRUf8eHh7/Gxsb/y8vL/+UlJT/9/f3//j4
+P+Li4v/ZmZm/76+vv/////////////////////////////////////////////////6+vr/tLS0/11d
Xf9CQkL/YGBg/7q6uv/8/Pz//////29vb/8AAAD/AAAA/2tra////////////////////////////+rq
6v8wMDD/BgYGfwAAAAAaGhoAGBgYQxYWFvbHx8f////////////e3t7/NTU1/yEhIf9ZWVn/ZGRk/0RE
RP8UFBT/kJCQ////////////////////////////////////////////////////////////////////
//////////////v7+//19fX//Pz8//r6+v/19fX//////7e3t/8pKSn/KSkp/7e3t///////9vb2//f3
9////////////8/Pz/8ZGRn8EBAQVxAQEAApKSkAJycnIQsLC+Cbm5v///////////+Li4v/FRUV/2lp
af97e3v/enp6/3t7e/9CQkL/LS0t/+Tk5P//////////////////////6+vr/8zMzP/y8vL/////////
//////////////Pz8//X19f/+fn5////////////4uLi/2FhYf9FRUX/t7e3//7+/v/i4uL/4uLi////
///Jycn/TExM/1RUVP/T09P//////6Wlpf8NDQ3tJycnMigoKAAtLS0APDw8CQcHB7hmZmb//v7+//7+
/v9gYGD/Jycn/3l5ef95eXn/eXl5/3t7e/9gYGD/GBgY/8nJyf//////////////////////mpqa/xUV
Ff+6urr//////////////////////5qamv8aGhr/ubm5////////////lpaW/wEBAf8AAAD/SEhI//b2
9v////////////7+/v9mZmb/AAAA/wAAAP93d3f//////25ubv8HBwfKMjIyES8vLwAiIiIAAAAAAAsL
C4E1NTX/7Ozs//////90dHT/HR0d/3R0dP96enr/eXl5/3t7e/9SUlL/Hh4e/9TU1P//////////////
////////ysrK/35+fv/b29v//////////////////////8HBwf9iYmL/1NTU////////////sbGx/w8P
D/8AAAD/aGho//v7+/////////////////+FhYX/AwMD/wcHB/+ampr/8fHx/zo6Ov8KCgqW////ACoq
KgAAAAAAFxcXABgYGEcUFBT2wMDA//////++vr7/GBgY/0JCQv9ycnL/d3d3/2RkZP8bGxv/V1dX//f3
9//////////////////////////////////////////////////////////////////9/f3/////////
////////+Pj4/7Ozs/+dnZ3/5+fn//b29v+lpaX/kpKS/+Xl5f/v7+//o6Oj/6qqqv/39/f/xsbG/xYW
FvwbGxtbExMTAAAAAAAAAAAAHBwcAB8fHxMGBgbGa2tr//z8/P/7+/v/j4+P/xkZGf8ZGRn/IiIi/xAQ
EP88PDz/09PT////////////9fX1/6Kiov/ExMT/////////////////////////////////////////
////////+fn5/6mpqf+2trb//v7+/////////////////6Kiov8ICAj/AAAA/2tra//8/Pz/////////
///9/f3/cXFx/wgICNgvLy8gLi4uAAAAAAAAAAAAODg4AAAAAAAUFBRlGRkZ+rm5uf//////+/v7/8LC
wv97e3v/bGxs/5aWlv/k5OT/////////////////3Nzc/yAgIP9mZmb//v7+////////////////////
////////////////////////6enp/y8vL/9JSUn/9vb2/////////////////46Ojv8AAAD/AAAA/11d
Xf/7+/v///////////+/v7//Gxsb/hAQEHoAAAAAKCgoAAAAAAAAAAAAAAAAAB8fHwAoKCgNCAgIqDEx
Mf/MzMz/////////////////////////////////////////////////+vr6/7+/v//Y2Nj/////////
/////////////////////////////////////////Pz8/8bGxv/Ozs7//////////////////////+Pj
4/9sbGz/Xl5e/9HR0f///////////9DQ0P81NTX/CgoKui4uLhcmJiYAAAAAAAAAAAAAAAAAAAAAAF5e
XgAiIiIAJSUlMwgICOQrKyv/p6en/+3t7f/+/v7/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////+/v7//v7+//7+/v/r6+v/pqam/y4uLv8ICAjOJCQkKw8PDwBdXV0AAAAAAAAA
AAAAAAAAAAAAAAAAAAA/Pz8A////ARMTE30CAgL9CgoK/zc3N/9ubm7/nJyc/729vf/T09P/4ODg/+rq
6v/w8PD/8vLy//Ly8v/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx
8f/x8fH/8fHx/+7u7v/o6Oj/3t7e/9HR0f+5ubn/lpaW/2hoaP8zMzP/CAgI/wUFBekXFxdHBAQEABoa
GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgACMjIxILCwulAwMD/gAAAP8AAAD/AgIC/wsL
C/8WFhb/IyMj/y8vL/82Njb/OTk5/zk5Of85OTn/OTk5/zk5Of85OTn/OTk5/zk5Of85OTn/OTk5/zk5
Of85OTn/OTk5/zk5Of84ODj/ODg4/zU1Nf8sLCz/ICAg/xQUFP8JCQn/AQEB/wAAAP8AAAD/CAgI6xYW
FmGEhIQBOjo6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaACgoKAAlJSUUGhoafAwM
DNsDAwP8AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE5gcHB40AAAB3AAAAeAAAAHgAAAB4AAAAeAAA
AHgAAAB4AAAAeAAAAHgAAAB4AAAAeAEBAXgICAi5AQEB/AAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wYG
BvEMDAyvICAgQ2FhYQM/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABTU1MAcnJyAS8vLyEVFRVcCgoKjQwMDLANDQ3GDAwM0wsLC9QLCwulFhYWPF5eXgIxMTEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2NjAA0NDQAnJycUDg4OdgwMDMkKCgrWDg4O0Q8P
D8EKCgqeDw8PdB0dHTszMzMKJycnANXV1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+fn4Al5eXADo6OgVDQ0MNMTExFCoqKhU9PT0GPz8/AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT0ASkpKATMz
MxAlJSUWOzs7E01NTQtSUlICTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAOD/////BwAAwH////4DAACAP////AEAAAAf///4AAAAAB////gAAAAAH///+AAAAAAP
///wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAEAAIAA
AAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAH
AADwAAAAAA8AAPAAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AP/wA/wAA/+D//gf/AAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
AQAIBgAAAFxyqGYAAE+vSURBVHja7Z13eBzV2bfv2a7ee7XlIhfhXsDgBtiADQQMJIATwDRDqHlprxMI
pJDyvUmAJIRAcCCAcejVYKppxk0W7nKTLVtWs9pqtVptPd8fuytsaXallbRF1tzXNcHRzM6emZ3zm3Oe
8xRJCIGCgsLQRBXuBigoKIQPRQAUFIYwigAoKAxhFAFQUBjCKAKgoDCEUQRAQWEIowiAgsIQRhEABYUh
jCIACgpDGEUAFBSGMIoAKCgMYRQBUFAYwigCoKAwhFEEQEFhCKMIgILCEEYRAAWFIYwiAAoKQxhFABQU
hjCKACgoDGEUAVBQGMIoAqCgMIRRBEBBYQijCICCwhBGEQAFhSGMIgAKCkMYRQAUFIYwigAoKAxhFAFQ
UBjCKAKgoDCEUQRAQWEIowiAgsIQRhEABYUhjCIACgpDGEUAFBSGMIoAKCgMYRQBUFAYwmjC3YBIQ5Ik
DZAAJAKxQDRgAHS475cKcACtQKUQoircbR5qSJKUC+Th/p20nj8LwIn7t7ECFsAMmACjEKI13O2ORCQh
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
</value>
</data>
</root>