diff --git a/RCM/Config.cs b/RCM/Config.cs
index beda2f5..3089e36 100644
--- a/RCM/Config.cs
+++ b/RCM/Config.cs
@@ -11,9 +11,8 @@ using System.Windows.Forms;
namespace RCM {
public static class Config {
- private static readonly char[] _equals = new char[] { '=' };
- private static readonly char[] _brackets = new char[] { '[', ']' };
- private static readonly string _fileName = "RCM.conf";
+ private static readonly string _dirName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RCM");
+ private static readonly string _fileName = Path.Combine(_dirName, "RCM.conf");
private static Icon _emptyIcon;
public static ImageList IconList { get; } = new ImageList() { ColorDepth = ColorDepth.Depth32Bit, ImageSize = new Size(20, 20) };
@@ -76,6 +75,9 @@ namespace RCM {
JArray json = new JArray(DataSources.Select(dataSource => ConfigSerializer.ObjToJson(dataSource))
.Union(ConfigSections.Values.Select(configSection => ConfigSerializer.ObjToJson(configSection)))
.Union(_uknownSections));
+ if (!Directory.Exists(_dirName)) {
+ Directory.CreateDirectory(_dirName);
+ }
File.WriteAllText(_fileName, ConfigSerializer.JsonToString(json));
}
}
diff --git a/RCM/ConfigForm.Designer.cs b/RCM/ConfigForm.Designer.cs
index e87dfde..102c2e5 100644
--- a/RCM/ConfigForm.Designer.cs
+++ b/RCM/ConfigForm.Designer.cs
@@ -23,6 +23,7 @@
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigForm));
this.treeView = new System.Windows.Forms.TreeView();
this.tabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
@@ -103,7 +104,7 @@
this.panelDataSource.Location = new System.Drawing.Point(10, 53);
this.panelDataSource.Name = "panelDataSource";
this.panelDataSource.Size = new System.Drawing.Size(307, 373);
- this.panelDataSource.TabIndex = 19;
+ this.panelDataSource.TabIndex = 2;
//
// buttonSave
//
@@ -112,7 +113,7 @@
this.buttonSave.Location = new System.Drawing.Point(131, 432);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(175, 23);
- this.buttonSave.TabIndex = 18;
+ this.buttonSave.TabIndex = 3;
this.buttonSave.Text = "Save changes";
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
@@ -123,7 +124,7 @@
this.textBoxTitle.Location = new System.Drawing.Point(130, 9);
this.textBoxTitle.Name = "textBoxTitle";
this.textBoxTitle.Size = new System.Drawing.Size(175, 20);
- this.textBoxTitle.TabIndex = 17;
+ this.textBoxTitle.TabIndex = 1;
//
// labelTitle
//
@@ -140,6 +141,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(574, 496);
this.Controls.Add(this.tabControl);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ConfigForm";
this.Text = "Configuration - Remote Connection Manager";
this.tabControl.ResumeLayout(false);
diff --git a/RCM/ConfigForm.cs b/RCM/ConfigForm.cs
index c18fb9e..a379f82 100644
--- a/RCM/ConfigForm.cs
+++ b/RCM/ConfigForm.cs
@@ -1,11 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM {
@@ -24,7 +17,6 @@ namespace RCM {
treeView.ImageList = Config.IconList;
treeView.ContextMenuStrip = GetNewDataSourceContextMenu();
foreach (IDataSource dataSource in Config.DataSources) {
- string dataSourceType = dataSource.GetType().FullName;
treeView.Nodes.Add(CreateTreeNodeFromDataSource(dataSource));
SortTreeAndSelectNode(null);
}
@@ -39,7 +31,7 @@ namespace RCM {
#region TreeView display
private TreeNode CreateTreeNodeFromDataSource(IDataSource dataSource) {
string imageKey = dataSource.GetType().FullName;
- return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu(dataSource) };
+ return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu() };
}
private void SortTreeAndSelectNode(TreeNode node) {
@@ -107,7 +99,8 @@ namespace RCM {
IDataSource dataSource = (IDataSource)e.Node.Tag;
dataSource.Title = e.Label;
Config.Save();
- BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
+ // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
+ BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node });
}
private void ButtonSave_Click(object sender, EventArgs e) {
@@ -117,6 +110,7 @@ namespace RCM {
dataSource.Title = selectedNode.Text = textBoxTitle.Text;
Config.Save();
SortTreeAndSelectNode(selectedNode);
+ MessageBox.Show("Data source changes saved", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void NewDataSourceContextMenuItem_Click(object sender, EventArgs e) {
@@ -159,7 +153,7 @@ namespace RCM {
ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem menuItem = new ToolStripMenuItem("New item");
foreach (Type type in Config.DataSourceTypes) {
- ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type };
+ ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] };
item.Click += NewDataSourceContextMenuItem_Click;
menuItem.DropDownItems.Add(item);
}
@@ -167,7 +161,7 @@ namespace RCM {
return menu;
}
- private ContextMenuStrip GetContextMenu(IDataSource dataSource) {
+ private ContextMenuStrip GetContextMenu() {
ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem duplicateItem = new ToolStripMenuItem("Duplicate item");
duplicateItem.Click += DuplicateDataSourceContextMenuItem_Click;
diff --git a/RCM/ConfigForm.resx b/RCM/ConfigForm.resx
index 1af7de1..f6c64fb 100644
--- a/RCM/ConfigForm.resx
+++ b/RCM/ConfigForm.resx
@@ -117,4 +117,467 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA
+ BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ
+ AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm
+ AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA
+ AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP//////////
+ /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
+ AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
+ AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
+ //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
+ eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
+ AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
+ /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
+ AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
+ AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
+ /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
+ AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
+ //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
+ AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
+ AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
+ ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
+ AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
+ cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
+ AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
+ AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
+ AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
+ AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
+ AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
+ AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
+ /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
+ BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
+ wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
+ ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
+ iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
+ AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
+ cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
+ AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
+ wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
+ AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+ AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
+ AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
+ AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
+ AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
+ AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
+ HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
+ WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
+ tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
+ ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
+ ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
+ AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
+ BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
+ ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
+ //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
+ JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
+ GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
+ AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
+ BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
+ BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
+ GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
+ AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
+ ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
+ BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
+ /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
+ AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
+ JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
+ AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
+ AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
+ PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
+ hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
+ BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
+ KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
+ ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
+ BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
+ KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
+ KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
+ AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
+ JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
+ CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
+ AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
+ AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
+ AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
+ HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
+ ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
+ BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
+ /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
+ BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
+ AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
+ SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
+ owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
+ KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
+ AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
+ JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
+ FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
+ AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
+ CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
+ EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
+ AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
+ DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
+ wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
+ KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
+ aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
+ 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
+ AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
+ AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
+ AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
+ AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
+ AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
+ AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
+ AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
+ S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
+ AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
+ /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
+ S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
+ sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
+ /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
+ AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
+ AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
+ AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
+ AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
+ AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
+ AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
+ AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
+ AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
+ //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
+ Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
+ /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
+ 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
+ AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
+ ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
+ sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
+ j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
+ AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
+ xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA
+ AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho
+ aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ
+ Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3
+ 9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7
+ +/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3
+ 9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
+ AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA
+ AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
+ ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
+ S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
+ AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
+ 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
+ Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
+ S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
+ sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
+ ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
+ AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
+ AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
+ /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
+ AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
+ AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
+ AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
+ ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
+ AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
+ AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
+ AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
+ AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
+ //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
+ AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
+ AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
+ AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
+ h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
+ dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
+ AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
+ ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
+ AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
+ Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
+ AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
+ AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
+ hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
+ hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
+ 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
+ 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
+
+
\ No newline at end of file
diff --git a/RCM/ConfigFormTab.cs b/RCM/ConfigFormTab.cs
index 9b3d8d1..49a127f 100644
--- a/RCM/ConfigFormTab.cs
+++ b/RCM/ConfigFormTab.cs
@@ -1,11 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM {
@@ -22,6 +15,7 @@ namespace RCM {
private void ButtonSave_Click(object sender, EventArgs e) {
_configSection.UpdateFromControl();
Config.Save();
+ MessageBox.Show(string.Format("{0} changes saved", _configSection.GetType().GetDisplayName()), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
diff --git a/RCM/ConfigSerializer.cs b/RCM/ConfigSerializer.cs
index 854df2f..f99b672 100644
--- a/RCM/ConfigSerializer.cs
+++ b/RCM/ConfigSerializer.cs
@@ -24,7 +24,7 @@ namespace RCM {
public static string JsonToString(JToken json) {
var stringWriter = new StringWriter();
- var jsonWriter = new JsonTextWriter(stringWriter) { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii };
+ var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented };
new JsonSerializer().Serialize(jsonWriter, json);
return stringWriter.ToString();
}
@@ -50,7 +50,7 @@ namespace RCM {
Array.Copy(cipherbytes, salt, 16);
Array.Copy(cipherbytes, 16, iv, 0, 16);
using (AesManaged aes = new AesManaged() { KeySize = 128 })
- using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 1024))
+ using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 16))
using (ICryptoTransform decryptor = aes.CreateDecryptor(pbkdf2.GetBytes(16), iv))
using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
@@ -62,7 +62,7 @@ namespace RCM {
}
public static object DecryptObject(byte[] cipherbytes, string password) {
- return StringToObj(Encoding.ASCII.GetString(Decrypt(cipherbytes, password)));
+ return StringToObj(Encoding.Unicode.GetString(Decrypt(cipherbytes, password)));
}
public static byte[] Encrypt(byte[] plaintext, string password) {
@@ -71,7 +71,7 @@ namespace RCM {
}
using (AesManaged aes = new AesManaged() { KeySize = 128 }) {
aes.GenerateIV();
- using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 1024))
+ using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 16))
using (ICryptoTransform encryptor = aes.CreateEncryptor(pbkdf2.GetBytes(16), aes.IV))
using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
@@ -84,7 +84,7 @@ namespace RCM {
}
public static byte[] EncryptObject(object obj, string password) {
- return Encrypt(Encoding.ASCII.GetBytes(ObjToString(obj)), password);
+ return Encrypt(Encoding.Unicode.GetBytes(ObjToString(obj)), password);
}
}
}
diff --git a/RCM/DataSource/MySQL/MySQLControl.Designer.cs b/RCM/DataSource/MySQL/MySQLControl.Designer.cs
index a266287..ff35212 100644
--- a/RCM/DataSource/MySQL/MySQLControl.Designer.cs
+++ b/RCM/DataSource/MySQL/MySQLControl.Designer.cs
@@ -103,7 +103,7 @@
this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 104);
this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword";
this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22);
- this.buttonUnmaskEncPassword.TabIndex = 17;
+ this.buttonUnmaskEncPassword.TabIndex = 7;
this.buttonUnmaskEncPassword.Text = "●";
this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true;
this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click);
@@ -113,7 +113,7 @@
this.textBoxEncPassword.Location = new System.Drawing.Point(120, 105);
this.textBoxEncPassword.Name = "textBoxEncPassword";
this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20);
- this.textBoxEncPassword.TabIndex = 16;
+ this.textBoxEncPassword.TabIndex = 6;
this.textBoxEncPassword.UseSystemPasswordChar = true;
//
// textBoxDatabase
@@ -121,7 +121,7 @@
this.textBoxDatabase.Location = new System.Drawing.Point(120, 79);
this.textBoxDatabase.Name = "textBoxDatabase";
this.textBoxDatabase.Size = new System.Drawing.Size(175, 20);
- this.textBoxDatabase.TabIndex = 15;
+ this.textBoxDatabase.TabIndex = 5;
//
// label1
//
@@ -146,7 +146,7 @@
this.buttonTestConnection.Location = new System.Drawing.Point(120, 132);
this.buttonTestConnection.Name = "buttonTestConnection";
this.buttonTestConnection.Size = new System.Drawing.Size(175, 23);
- this.buttonTestConnection.TabIndex = 20;
+ this.buttonTestConnection.TabIndex = 8;
this.buttonTestConnection.Text = "Test connection";
this.buttonTestConnection.UseVisualStyleBackColor = true;
this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click);
@@ -156,7 +156,7 @@
this.buttonCreateSchema.Location = new System.Drawing.Point(120, 161);
this.buttonCreateSchema.Name = "buttonCreateSchema";
this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23);
- this.buttonCreateSchema.TabIndex = 21;
+ this.buttonCreateSchema.TabIndex = 9;
this.buttonCreateSchema.Text = "Create schema";
this.buttonCreateSchema.UseVisualStyleBackColor = true;
this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click);
diff --git a/RCM/DataSource/MySQL/MySQLControl.resx b/RCM/DataSource/MySQL/MySQLControl.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RCM/DataSource/MySQL/MySQLControl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/RCM/DataSource/SQLite/SQLiteControl.Designer.cs b/RCM/DataSource/SQLite/SQLiteControl.Designer.cs
index 664563d..74f0da4 100644
--- a/RCM/DataSource/SQLite/SQLiteControl.Designer.cs
+++ b/RCM/DataSource/SQLite/SQLiteControl.Designer.cs
@@ -39,7 +39,7 @@
this.buttonSelectDatabase.Location = new System.Drawing.Point(273, -1);
this.buttonSelectDatabase.Name = "buttonSelectDatabase";
this.buttonSelectDatabase.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectDatabase.TabIndex = 4;
+ this.buttonSelectDatabase.TabIndex = 2;
this.buttonSelectDatabase.Text = "⋯";
this.buttonSelectDatabase.UseVisualStyleBackColor = true;
this.buttonSelectDatabase.Click += new System.EventHandler(this.ButtonSelectDatabase_Click);
@@ -49,7 +49,7 @@
this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 25);
this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword";
this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22);
- this.buttonUnmaskEncPassword.TabIndex = 17;
+ this.buttonUnmaskEncPassword.TabIndex = 4;
this.buttonUnmaskEncPassword.Text = "●";
this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true;
this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click);
@@ -59,7 +59,7 @@
this.textBoxEncPassword.Location = new System.Drawing.Point(120, 26);
this.textBoxEncPassword.Name = "textBoxEncPassword";
this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20);
- this.textBoxEncPassword.TabIndex = 16;
+ this.textBoxEncPassword.TabIndex = 3;
this.textBoxEncPassword.UseSystemPasswordChar = true;
//
// textBoxDatabase
@@ -67,7 +67,7 @@
this.textBoxDatabase.Location = new System.Drawing.Point(120, 0);
this.textBoxDatabase.Name = "textBoxDatabase";
this.textBoxDatabase.Size = new System.Drawing.Size(147, 20);
- this.textBoxDatabase.TabIndex = 15;
+ this.textBoxDatabase.TabIndex = 1;
//
// labelEncPassword
//
@@ -92,7 +92,7 @@
this.buttonTestConnection.Location = new System.Drawing.Point(120, 53);
this.buttonTestConnection.Name = "buttonTestConnection";
this.buttonTestConnection.Size = new System.Drawing.Size(175, 23);
- this.buttonTestConnection.TabIndex = 20;
+ this.buttonTestConnection.TabIndex = 5;
this.buttonTestConnection.Text = "Test connection";
this.buttonTestConnection.UseVisualStyleBackColor = true;
this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click);
@@ -102,7 +102,7 @@
this.buttonCreateSchema.Location = new System.Drawing.Point(120, 82);
this.buttonCreateSchema.Name = "buttonCreateSchema";
this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23);
- this.buttonCreateSchema.TabIndex = 21;
+ this.buttonCreateSchema.TabIndex = 6;
this.buttonCreateSchema.Text = "Create schema";
this.buttonCreateSchema.UseVisualStyleBackColor = true;
this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click);
diff --git a/RCM/DataSource/SQLite/SQLiteControl.resx b/RCM/DataSource/SQLite/SQLiteControl.resx
new file mode 100644
index 0000000..5e7f0a6
--- /dev/null
+++ b/RCM/DataSource/SQLite/SQLiteControl.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/RCM/DisplayName.cs b/RCM/DisplayName.cs
index 6e03a83..11854f5 100644
--- a/RCM/DisplayName.cs
+++ b/RCM/DisplayName.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
namespace RCM {
public class DisplayName : Attribute {
diff --git a/RCM/Group.cs b/RCM/Group.cs
index 56fcb10..4de27d0 100644
--- a/RCM/Group.cs
+++ b/RCM/Group.cs
@@ -1,11 +1,10 @@
-using Newtonsoft.Json;
-using System;
+using System;
using System.Windows.Forms;
namespace RCM {
[Serializable]
[DisplayName("Group")]
- public class Group : IRecord { // TODO: Prvni v poradi new items
+ public class Group : IRecord {
public Guid Id { get; set; }
public string Title { get; set; }
public Guid GroupId { get; set; }
diff --git a/RCM/IConfigSection.cs b/RCM/IConfigSection.cs
index 592458d..30c4bbd 100644
--- a/RCM/IConfigSection.cs
+++ b/RCM/IConfigSection.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.Windows.Forms;
+using System.Windows.Forms;
namespace RCM {
public interface IConfigSection {
diff --git a/RCM/IRecord.cs b/RCM/IRecord.cs
index 65aed6f..10c115d 100644
--- a/RCM/IRecord.cs
+++ b/RCM/IRecord.cs
@@ -6,8 +6,6 @@ namespace RCM {
Guid Id { get; set; }
string Title { get; set; }
Guid GroupId { get; set; }
- // DateTime LastUpdate { get; set; }
-
IAction[] GetActions();
UserControl GetControl();
void UpdateFromControl();
diff --git a/RCM/MainForm.Designer.cs b/RCM/MainForm.Designer.cs
index cb4117d..3df8b5a 100644
--- a/RCM/MainForm.Designer.cs
+++ b/RCM/MainForm.Designer.cs
@@ -29,6 +29,7 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.treeView = new System.Windows.Forms.TreeView();
this.splitContainer = new System.Windows.Forms.SplitContainer();
this.buttonConfig = new System.Windows.Forms.Button();
@@ -42,12 +43,17 @@
this.timerDataSourceRefresh = new System.Windows.Forms.Timer(this.components);
this.statusStrip = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolStripStatusLastRefresh = new System.Windows.Forms.ToolStripStatusLabel();
+ this.toolStripStatusFailedFlag = new System.Windows.Forms.ToolStripStatusLabel();
+ this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
+ this.contextMenuNotifyIcon = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.toolStripMenuShowMainForm = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuCloseMainForm = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout();
this.splitContainer.SuspendLayout();
this.statusStrip.SuspendLayout();
+ this.contextMenuNotifyIcon.SuspendLayout();
this.SuspendLayout();
//
// treeView
@@ -62,7 +68,7 @@
this.treeView.Location = new System.Drawing.Point(3, 30);
this.treeView.Name = "treeView";
this.treeView.Size = new System.Drawing.Size(244, 440);
- this.treeView.TabIndex = 0;
+ this.treeView.TabIndex = 3;
this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.TreeView_AfterLabelEdit);
this.treeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterCollapse);
this.treeView.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterExpand);
@@ -105,7 +111,7 @@
this.buttonConfig.Location = new System.Drawing.Point(3, 1);
this.buttonConfig.Name = "buttonConfig";
this.buttonConfig.Size = new System.Drawing.Size(24, 24);
- this.buttonConfig.TabIndex = 2;
+ this.buttonConfig.TabIndex = 1;
this.buttonConfig.UseVisualStyleBackColor = true;
this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click);
//
@@ -118,7 +124,7 @@
this.comboBoxDatabase.Location = new System.Drawing.Point(33, 3);
this.comboBoxDatabase.Name = "comboBoxDatabase";
this.comboBoxDatabase.Size = new System.Drawing.Size(214, 21);
- this.comboBoxDatabase.TabIndex = 1;
+ this.comboBoxDatabase.TabIndex = 2;
this.comboBoxDatabase.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDatabase_SelectedIndexChanged);
//
// panelRecord
@@ -129,7 +135,7 @@
this.panelRecord.Location = new System.Drawing.Point(11, 82);
this.panelRecord.Name = "panelRecord";
this.panelRecord.Size = new System.Drawing.Size(306, 350);
- this.panelRecord.TabIndex = 15;
+ this.panelRecord.TabIndex = 3;
//
// buttonSave
//
@@ -138,7 +144,7 @@
this.buttonSave.Location = new System.Drawing.Point(131, 438);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(175, 23);
- this.buttonSave.TabIndex = 14;
+ this.buttonSave.TabIndex = 4;
this.buttonSave.Text = "Save changes";
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
@@ -160,7 +166,7 @@
this.comboBoxGroup.Location = new System.Drawing.Point(131, 39);
this.comboBoxGroup.Name = "comboBoxGroup";
this.comboBoxGroup.Size = new System.Drawing.Size(175, 21);
- this.comboBoxGroup.TabIndex = 12;
+ this.comboBoxGroup.TabIndex = 2;
//
// textBoxTitle
//
@@ -181,14 +187,14 @@
//
// timerDataSourceRefresh
//
- this.timerDataSourceRefresh.Interval = 30000;
+ this.timerDataSourceRefresh.Interval = 120000;
this.timerDataSourceRefresh.Tick += new System.EventHandler(this.TimerDataSourceRefresh_Tick);
//
// statusStrip
//
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel,
- this.toolStripStatusLastRefresh});
+ this.toolStripStatusFailedFlag});
this.statusStrip.Location = new System.Drawing.Point(0, 474);
this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(574, 22);
@@ -197,15 +203,47 @@
//
// toolStripStatusLabel
//
+ this.toolStripStatusLabel.ForeColor = System.Drawing.SystemColors.ControlDark;
this.toolStripStatusLabel.Name = "toolStripStatusLabel";
- this.toolStripStatusLabel.Size = new System.Drawing.Size(134, 17);
- this.toolStripStatusLabel.Text = "Last data source refresh:";
+ this.toolStripStatusLabel.Size = new System.Drawing.Size(166, 17);
+ this.toolStripStatusLabel.Text = "Last data source refresh: never";
//
- // toolStripStatusLastRefresh
+ // toolStripStatusFailedFlag
//
- this.toolStripStatusLastRefresh.Name = "toolStripStatusLastRefresh";
- this.toolStripStatusLastRefresh.Size = new System.Drawing.Size(36, 17);
- this.toolStripStatusLastRefresh.Text = "never";
+ this.toolStripStatusFailedFlag.ForeColor = System.Drawing.SystemColors.ControlDark;
+ this.toolStripStatusFailedFlag.Name = "toolStripStatusFailedFlag";
+ this.toolStripStatusFailedFlag.Size = new System.Drawing.Size(136, 17);
+ this.toolStripStatusFailedFlag.Text = "(data source not loaded)";
+ //
+ // notifyIcon
+ //
+ this.notifyIcon.ContextMenuStrip = this.contextMenuNotifyIcon;
+ this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
+ this.notifyIcon.Text = "Remote Connection Manager";
+ this.notifyIcon.Visible = true;
+ this.notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseClick);
+ //
+ // contextMenuNotifyIcon
+ //
+ this.contextMenuNotifyIcon.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripMenuShowMainForm,
+ this.toolStripMenuCloseMainForm});
+ this.contextMenuNotifyIcon.Name = "contextMenuNotifyIcon";
+ this.contextMenuNotifyIcon.Size = new System.Drawing.Size(179, 48);
+ //
+ // toolStripMenuShowMainForm
+ //
+ this.toolStripMenuShowMainForm.Name = "toolStripMenuShowMainForm";
+ this.toolStripMenuShowMainForm.Size = new System.Drawing.Size(178, 22);
+ this.toolStripMenuShowMainForm.Text = "Show main window";
+ this.toolStripMenuShowMainForm.Click += new System.EventHandler(this.ToolStripMenuShowMainForm_Click);
+ //
+ // toolStripMenuCloseMainForm
+ //
+ this.toolStripMenuCloseMainForm.Name = "toolStripMenuCloseMainForm";
+ this.toolStripMenuCloseMainForm.Size = new System.Drawing.Size(178, 22);
+ this.toolStripMenuCloseMainForm.Text = "Exit application";
+ this.toolStripMenuCloseMainForm.Click += new System.EventHandler(this.ToolStripMenuCloseMainForm_Click);
//
// MainForm
//
@@ -214,8 +252,11 @@
this.ClientSize = new System.Drawing.Size(574, 496);
this.Controls.Add(this.statusStrip);
this.Controls.Add(this.splitContainer);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "MainForm";
this.Text = "Remote Connection Manager";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+ this.Resize += new System.EventHandler(this.MainForm_Resize);
this.splitContainer.Panel1.ResumeLayout(false);
this.splitContainer.Panel2.ResumeLayout(false);
this.splitContainer.Panel2.PerformLayout();
@@ -223,6 +264,7 @@
this.splitContainer.ResumeLayout(false);
this.statusStrip.ResumeLayout(false);
this.statusStrip.PerformLayout();
+ this.contextMenuNotifyIcon.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -243,7 +285,11 @@
private System.Windows.Forms.Button buttonConfig;
private System.Windows.Forms.StatusStrip statusStrip;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
- private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLastRefresh;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusFailedFlag;
+ private System.Windows.Forms.NotifyIcon notifyIcon;
+ private System.Windows.Forms.ContextMenuStrip contextMenuNotifyIcon;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuShowMainForm;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuCloseMainForm;
}
}
diff --git a/RCM/MainForm.cs b/RCM/MainForm.cs
index 9b3f854..79aa6c9 100644
--- a/RCM/MainForm.cs
+++ b/RCM/MainForm.cs
@@ -3,12 +3,14 @@ using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Linq;
-using System.Collections.Specialized;
namespace RCM {
public partial class MainForm : Form {
#region Form
- protected override CreateParams CreateParams { // Workaround for control flickering reduction
+ private bool allowClose = false;
+
+ protected override CreateParams CreateParams {
+ // Workaround for control flickering reduction
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
@@ -24,6 +26,31 @@ namespace RCM {
LoadDataSources(0);
}
+ private void MainForm_Resize(object sender, EventArgs e) {
+ if (WindowState == FormWindowState.Minimized) {
+ ShowInTaskbar = false;
+ return;
+ }
+ Config.Save();
+ }
+
+ private void NotifyIcon_MouseClick(object sender, MouseEventArgs e) {
+ if (e.Button == MouseButtons.Left) {
+ WindowState = FormWindowState.Normal;
+ ShowInTaskbar = true;
+ }
+ }
+
+ private void ToolStripMenuShowMainForm_Click(object sender, EventArgs e) {
+ WindowState = FormWindowState.Normal;
+ ShowInTaskbar = true;
+ }
+
+ private void ToolStripMenuCloseMainForm_Click(object sender, EventArgs e) {
+ allowClose = true;
+ Close();
+ }
+
private void LoadDataSources(int selectedIndex) {
comboBoxDatabase.Items.Clear();
comboBoxDatabase.Items.AddRange(Config.DataSources.ToArray());
@@ -43,9 +70,18 @@ namespace RCM {
configForm.Dispose();
LoadDataSources(selectedIndex);
}
+
+ private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
+ if (e.CloseReason == CloseReason.UserClosing && !allowClose) {
+ e.Cancel = true;
+ WindowState = FormWindowState.Minimized;
+ }
+ }
#endregion
#region ComboBox & DataSource
+ private IDataSource previouslySelectedDataSource = null;
+
private void RebuildGroupCombobox(IRecord record) {
List groupPaths = new List() { new GroupPath(null) };
groupPaths.AddRange(RebuildGroupCombobox(treeView.Nodes));
@@ -65,31 +101,66 @@ namespace RCM {
return groupPaths;
}
- private void ReloadDataSource() {
- RebuildTreeView();
- timerDataSourceRefresh.Stop();
- timerDataSourceRefresh.Start();
+ private void ShowDataSourceException(string failedAction, Exception ex) {
+ IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
+ string message = String.Format("{0}\n\nData source \"{1}\" exception:\n{2}\n{3}", failedAction, dataSource.Title, ex.GetType().ToString(), ex.Message);
+ MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
- private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) => ReloadDataSource();
+ private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) {
+ if (comboBoxDatabase.SelectedIndex == -1) {
+ return;
+ }
+ try {
+ treeView.Enabled = true;
+ ReloadTreeView(true);
+ previouslySelectedDataSource = (IDataSource)comboBoxDatabase.SelectedItem;
+ treeView.SelectedNode = null;
+ ChangeSelectedRecord();
+ } catch (Exception ex) {
+ ShowDataSourceException("Failed to load data source.", ex);
+ if (previouslySelectedDataSource == null) {
+ treeView.Enabled = false;
+ treeView.Nodes.Clear();
+ comboBoxDatabase.SelectedIndex = -1;
+ toolStripStatusLabel.Text = "Last data source refresh: never";
+ toolStripStatusFailedFlag.Text = "(data source not loaded)";
+ } else {
+ comboBoxDatabase.SelectedItem = previouslySelectedDataSource;
+ }
+ }
+ }
- private void RefreshContextMenuItem_Click(object sender, EventArgs e) => ReloadDataSource();
+ private void RefreshContextMenuItem_Click(object sender, EventArgs e) {
+ try {
+ ReloadTreeView(true);
+ } catch (Exception ex) {
+ ShowDataSourceException("Failed to refresh data source.", ex);
+ toolStripStatusFailedFlag.Text = "(failed to refresh since then)";
+ }
+ }
private void TimerDataSourceRefresh_Tick(object sender, EventArgs e) {
- RebuildTreeView();
+ try {
+ ReloadTreeView();
+ } catch (Exception ex) {
+ if (toolStripStatusFailedFlag.Text == String.Empty) {
+ ShowDataSourceException("Failed to refresh data source.", ex);
+ toolStripStatusFailedFlag.Text = "(failed to refresh since then)";
+ }
+ }
}
#endregion
#region TreeView display
- /* test */
- private void RebuildTreeView() {
+ private void ReloadTreeView(bool restartTimer = false) {
// Select all records from database
IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
Dictionary dataSourceRecords = dataSource.SelectAll();
Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id;
- // Flatten tree nodes
+ // Flatten existing tree nodes
List flattenedTreeList = new List();
int lastProcessPosition = 0;
flattenedTreeList.AddRange(treeView.Nodes.Cast());
@@ -99,11 +170,13 @@ namespace RCM {
Dictionary flattenedTree = flattenedTreeList.ToDictionary(n => ((IRecord)n.Tag).Id, n => n);
// Iterate over existing nodes
+ HashSet removeFromFlattenedTree = new HashSet();
foreach (TreeNode node in flattenedTree.Values) {
IRecord record = (IRecord)node.Tag;
// Delete node if record no longer present in database
if (!dataSourceRecords.ContainsKey(record.Id)) {
node.Remove();
+ removeFromFlattenedTree.Add(record.Id);
continue;
}
// Update existing record if it has changed since the last refresh
@@ -123,17 +196,17 @@ namespace RCM {
// Remove processed record
dataSourceRecords.Remove(record.Id);
}
+ // Remove deleted records from flattened tree
+ foreach (Guid removedId in removeFromFlattenedTree) {
+ flattenedTree.Remove(removedId);
+ }
// Create nodes from unprocessed (new) records
foreach (IRecord record in dataSourceRecords.Values) {
- TreeNode node = CreateTreeNodeFromRecord(record);
- if (dataSource.ExpandedNodes.Contains(record.Id)) {
- node.Expand();
- }
- flattenedTree.Add(record.Id, node);
+ flattenedTree.Add(record.Id, CreateTreeNodeFromRecord(record));
}
- // Assign nodes to tree structure
+ // Assign nodes to tree structure (all nodes have to exist first)
foreach (IRecord record in dataSourceRecords.Values) {
TreeNode node = flattenedTree[record.Id];
if (record.GroupId == Guid.Empty) {
@@ -142,48 +215,41 @@ namespace RCM {
flattenedTree[record.GroupId].Nodes.Add(node);
}
}
-
- TreeNode selectedNode = flattenedTree.ContainsKey(selectedGuid) ? flattenedTree[selectedGuid] : null;
- SortTreeAndSelectNode(selectedNode);
- toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- }
- /* test end */
-
- /*private void RebuildTreeView() {
- IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem;
- Dictionary nodes = new Dictionary();
-
- try {
- foreach (IRecord record in dataSource.SelectAll()) {
- nodes.Add(record.Id, CreateTreeNodeFromRecord(record));
- }
- } catch {
- MessageBox.Show("Failed to retieve records from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
-
- Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id;
- TreeNode selectedNode = null;
- treeView.Nodes.Clear();
- foreach (TreeNode node in nodes.Values) {
- IRecord record = (IRecord)node.Tag;
- if (record.GroupId == Guid.Empty) {
- treeView.Nodes.Add(node);
- } else {
- nodes[record.GroupId].Nodes.Add(node);
- }
- if (record.Id == selectedGuid) {
- selectedNode = node;
- }
- }
- SortTreeAndSelectNode(selectedNode);
- foreach (TreeNode node in nodes.Values) {
- if (dataSource.ExpandedNodes.Contains(((IRecord)node.Tag).Id)) {
+ // Expand nodes (all nodes have to be placed in tree first)
+ foreach (IRecord record in dataSourceRecords.Values) {
+ if (dataSource.ExpandedNodes.Contains(record.Id)) {
+ TreeNode node = flattenedTree[record.Id];
node.Expand();
}
}
- toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- }*/
+
+ // Remove controls if selected node has been deleted
+ if (!flattenedTree.ContainsKey(selectedGuid)) {
+ SortTreeAndSelectNode(null);
+ }
+
+ // Restart timer
+ toolStripStatusLabel.Text = String.Format("Last data source refresh: {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
+ toolStripStatusFailedFlag.Text = String.Empty;
+ if (restartTimer) {
+ timerDataSourceRefresh.Stop();
+ timerDataSourceRefresh.Start();
+ }
+
+ // Delete expanded nodes which no longer exist
+ HashSet removeFromExpandedNodes = new HashSet();
+ foreach (Guid recordId in dataSource.ExpandedNodes) {
+ if (!flattenedTree.ContainsKey(recordId)) {
+ removeFromExpandedNodes.Add(recordId);
+ }
+ }
+ foreach (Guid recordId in removeFromExpandedNodes) {
+ dataSource.ExpandedNodes.Remove(recordId);
+ }
+
+ // Save expanded nodes
+ Config.Save();
+ }
private TreeNode CreateTreeNodeFromRecord(IRecord record) {
string imageKey = record.GetType().FullName;
@@ -191,6 +257,9 @@ namespace RCM {
}
private void SortTreeAndSelectNode(TreeNode node) {
+ /*if (node == null) {
+ return;
+ }*/
treeView.Sort();
if (treeView.SelectedNode == node) {
ChangeSelectedRecord();
@@ -253,7 +322,11 @@ namespace RCM {
}
private void TreeView_KeyDown(object sender, KeyEventArgs e) {
- if (e.KeyCode == Keys.Delete) {
+ if (e.KeyCode == Keys.Return) {
+ if (treeView.SelectedNode != null) {
+ RunDefaultNodeAction(treeView.SelectedNode);
+ }
+ } else if (e.KeyCode == Keys.Delete) {
if (treeView.SelectedNode != null) {
DeleteSelectedNode();
}
@@ -262,18 +335,22 @@ namespace RCM {
treeView.SelectedNode.BeginEdit();
}
} else if (e.KeyCode == Keys.F5) {
- ReloadDataSource();
+ ReloadTreeView(true);
}
}
- private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
- IAction[] actions = ((IRecord)e.Node.Tag).GetActions();
+ private void RunDefaultNodeAction(TreeNode node) {
+ IAction[] actions = ((IRecord)node.Tag).GetActions();
if (actions.Length == 0) {
return;
}
actions[0].Run();
}
+ private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
+ RunDefaultNodeAction(e.Node);
+ }
+
private void ChangeSelectedRecord() {
bool isSelected = treeView.SelectedNode != null;
textBoxTitle.Enabled = isSelected;
@@ -291,6 +368,8 @@ namespace RCM {
}
if (treeView.SelectedNode != null) {
IRecord record = (IRecord)treeView.SelectedNode.Tag;
+ // Prevent refresh of currently selected node (which is possibly being edited)
+ //if (record.Id == panelRecord.
textBoxTitle.Text = record.Title;
RebuildGroupCombobox(record);
panelRecord.Controls.Add(record.GetControl());
@@ -315,9 +394,10 @@ namespace RCM {
record.Title = e.Label;
try {
((IDataSource)comboBoxDatabase.SelectedItem).Update(record);
- BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
+ // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6
+ BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node });
} catch {
- MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} else {
e.CancelEdit = true;
@@ -335,7 +415,7 @@ namespace RCM {
try {
((IDataSource)comboBoxDatabase.SelectedItem).Update(record);
} catch {
- MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (groupChanged) {
@@ -359,8 +439,8 @@ namespace RCM {
try {
TreeNode node = InsertNewRecord(record, parentNode);
SortTreeAndSelectNode(node);
- } catch {
- MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ } catch (Exception ex) {
+ ShowDataSourceException("Failed to insert record into data source.", ex);
}
}
@@ -368,8 +448,8 @@ namespace RCM {
try {
TreeNode node = DuplicateRecord(treeView.SelectedNode, treeView.SelectedNode.Parent);
SortTreeAndSelectNode(node);
- } catch {
- MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ } catch (Exception ex) {
+ ShowDataSourceException("Failed to insert record into data source.", ex);
}
}
@@ -405,8 +485,8 @@ namespace RCM {
if (MessageBox.Show(message, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) {
try {
((IDataSource)comboBoxDatabase.SelectedItem).Delete(record);
- } catch {
- MessageBox.Show("Failed to remove record from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ } catch (Exception ex) {
+ ShowDataSourceException("Failed to remove record from data source.", ex);
return;
}
treeView.SelectedNode.Remove();
@@ -421,8 +501,18 @@ namespace RCM {
private ContextMenuStrip GetNewRecordContextMenu() {
ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem menuItemNew = new ToolStripMenuItem("New item");
+ // Add group as the first type
+ Type groupType = typeof(Group);
+ ToolStripMenuItem groupItem = new ToolStripMenuItem(groupType.GetDisplayName()) { Tag = groupType, Image = Config.IconList.Images[groupType.FullName] };
+ groupItem.Click += NewRecordContextMenuItem_Click;
+ menuItemNew.DropDownItems.Add(groupItem);
+ menuItemNew.DropDownItems.Add(new ToolStripSeparator());
+ // Add all the rest
foreach (Type type in Config.RecordTypes) {
- ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type };
+ if (type == groupType) {
+ continue;
+ }
+ ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] };
item.Click += NewRecordContextMenuItem_Click;
menuItemNew.DropDownItems.Add(item);
}
@@ -459,5 +549,13 @@ namespace RCM {
((IAction)((ToolStripMenuItem)sender).Tag).Run();
}
#endregion
+
+ /*private void button1_Click(object sender, EventArgs e) {
+ List records = Importer.GetRecordsFromRDM();
+ IDataSource dataSource = ((IDataSource)comboBoxDatabase.SelectedItem);
+ foreach (IRecord record in records) {
+ dataSource.Insert(record);
+ }
+ }*/
}
}
diff --git a/RCM/MainForm.resx b/RCM/MainForm.resx
index 30722eb..5ffbb11 100644
--- a/RCM/MainForm.resx
+++ b/RCM/MainForm.resx
@@ -123,7 +123,938 @@
201, 17
+
+ 310, 17
+
+
+ 416, 17
+
+
+
+
+ AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA
+ BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ
+ AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm
+ AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA
+ AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP//////////
+ /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
+ AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
+ AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
+ //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
+ eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
+ AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
+ /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
+ AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
+ AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
+ /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
+ AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
+ //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
+ AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
+ AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
+ ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
+ AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
+ cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
+ AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
+ AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
+ AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
+ AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
+ AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
+ AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
+ /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
+ BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
+ wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
+ ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
+ iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
+ AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
+ cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
+ AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
+ wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
+ AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+ AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
+ AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
+ AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
+ AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
+ AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
+ HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
+ WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
+ tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
+ ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
+ ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
+ AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
+ BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
+ ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
+ //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
+ JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
+ GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
+ AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
+ BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
+ BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
+ GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
+ AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
+ ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
+ BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
+ /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
+ AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
+ JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
+ AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
+ AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
+ PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
+ hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
+ BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
+ KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
+ ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
+ BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
+ KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
+ KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
+ AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
+ JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
+ CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
+ AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
+ AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
+ AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
+ HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
+ ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
+ BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
+ /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
+ BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
+ AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
+ SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
+ owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
+ KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
+ AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
+ JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
+ FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
+ AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
+ CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
+ EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
+ AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
+ DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
+ wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
+ KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
+ aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
+ 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
+ AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
+ AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
+ AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
+ AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
+ AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
+ AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
+ AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
+ S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
+ AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
+ /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
+ S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
+ sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
+ /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
+ AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
+ AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
+ AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
+ AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
+ AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
+ AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
+ AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
+ AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
+ //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
+ Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
+ /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
+ 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
+ AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
+ ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
+ sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
+ j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
+ AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
+ xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA
+ AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho
+ aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ
+ Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3
+ 9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7
+ +/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3
+ 9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
+ AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA
+ AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
+ ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
+ S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
+ AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
+ 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
+ Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
+ S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
+ sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
+ ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
+ AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
+ AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
+ /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
+ AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
+ AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
+ AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
+ ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
+ AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
+ AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
+ AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
+ AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
+ //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
+ AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
+ AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
+ AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
+ h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
+ dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
+ AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
+ ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
+ AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
+ Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
+ AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
+ AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
+ hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
+ hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
+ 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
+ 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
+ /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA
+ AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA
+ AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI
+ //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI
+ eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA
+ AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP
+ /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA
+ AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP
+ /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA
+ AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP
+ /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA
+ AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP
+ //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA
+ AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA
+ AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP//
+ ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA
+ AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/
+ cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA
+ AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA
+ AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/
+ AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3
+ AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA
+ AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A
+ AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/
+ /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA
+ BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
+ wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA////
+ ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI
+ iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA
+ AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn
+ cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA
+ AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA//
+ wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA
+ AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+ AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH
+ AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w
+ AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn
+ AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA
+ AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d
+ HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY
+ WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1
+ tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/
+ ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7/////////////////
+ ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f
+ AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n
+ BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH
+ ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP//////////////
+ //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk
+ JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA
+ GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA
+ AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA
+ BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA
+ BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd////
+ GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA
+ AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY
+ ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA
+ BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK///
+ /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE
+ AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj
+ JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL
+ AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/
+ AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA
+ AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH
+ AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/
+ ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf
+ AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP//
+ ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB
+ AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09
+ PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG
+ hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF
+ BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp
+ KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE
+ ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF
+ BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp
+ KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA
+ KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk
+ AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK
+ JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA
+ CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA
+ AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA
+ AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA
+ AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d
+ HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF
+ ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV
+ BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/
+ /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA
+ BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA
+ AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK
+ SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj
+ owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq
+ KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA
+ AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl
+ JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q
+ FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA
+ AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp
+ CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP
+ EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG
+ AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA
+ DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA
+ wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp
+ KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho
+ aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo
+ 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA
+ AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA
+ AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA
+ AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA
+ AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j
+ AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
+ AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA
+ AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL
+ S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA
+ AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+
+ /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL
+ S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx
+ sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+
+ /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA
+ AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA
+ AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA
+ AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA
+ AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA
+ AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA
+ AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA
+ AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA
+ AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v//
+ //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER
+ Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8
+ /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3
+ 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA
+ AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA
+ ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky
+ sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P
+ j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA
+ AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF
+ 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
+ APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL
+ S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL
+ S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA
+ AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+
+ /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3
+ 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ
+ Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL
+ S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy
+ sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA
+ ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA
+ AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA
+ AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA
+ AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA
+ AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA
+ AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+
+ /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA
+ AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA
+ AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA
+ AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
+ ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A
+ AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/
+ AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA
+ AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA
+ AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/
+ //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA
+ AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA
+ AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
+ AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA
+ AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH
+ h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2
+ dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA
+ AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA
+ ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA
+ AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O
+ Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA
+ AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA
+ AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG
+ hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG
+ hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2
+ 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA
+ AHYFBQX++fn5//v7+/96enr/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3
+ d/93d3f/d3d3/3d3d/93d3f/RUVF/gAAAOoAAAA2AAAAvgkJCf64uLj//v7+/+bm5v8pKSn+AAAA5QAA
+ ADwAAAAAAAAAeAUFBf75+fn/9/f3/wYGBv4AAADvAAAA3QAAAN0AAADdAAAA3QAAAN0AAADdAAAA3QAA
+ AN0AAADdAAAA3QAAAN0AAADdAAAA3AAAANcAAAC0AAAASgAAAAEAAAAWAAAAvgkJCf64uLj//v7+/+bm
+ 5v8pKSn+AAAA2gAAABYAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGsAAAAFAAAABQAAAAUAAAAFAAAABQAA
+ AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAYAAAA1AkJ
+ Cf6/v7///v7+/97e3v8BAQH+AAAAQgAAAHgFBQX++fn5//f39/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ADsAAADqKSkp/+bm5v/+/v7/srKy/wAAAPwAAAA3AAAAeAUFBf75+fn/9/f3/wYGBv4AAABmAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAA7AAAA5ikpKf/m5ub//v7+/7i4uP8JCQn+AAAAtAAAAAoAAAB4BQUF/vn5+f/39/f/BgYG/gAA
+ AGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAOgAAAOYpKSn/5ubm//7+/v+5ubn/CQkJ/gAAAMAAAAAYAAAAAAAAAHgFBQX++fn5//f3
+ 9/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAABMAAADZKSkp/+bm5v/+/v7/uLi4/wgICP4AAAD+AAAAxwAAAFIAAAACAAAAeAUF
+ Bf75+fn/9/f3/wYGBv4AAABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAOwICAv7f39///v7+/7i4uP8JCQn+AAAA/k1NTf9MTEz/AAAA8AAA
+ ACcAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/KWlpf+mpqb/CQkJ/gAAAP9oaGj//Pz8//Hx
+ 8f8BAQH+AAAASAAAAHgFBQX++fn5//f39/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAACdAAAA9QAAAP4AAAD/aGho//39
+ /f/9/f3/a2tr/wAAAPMAAAAoAAAAeAUFBf75+fn/9/f3/wYGBv4AAABmAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAACXAAAA/2dn
+ Z//8/Pz//f39/21tbf8AAAD7AAAAeAAAAAMAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAcwAA
+ APpoaGj//f39//39/f9sbGz/AAAA+wAAAHwAAAAFAAAAAAAAAHgFBQX++fn5//f39/8GBgb+AAAAbgAA
+ AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAGAAAAAgAA
+ ACIAAADxZmZm//39/f/9/f3/bW1t/wAAAPsAAAB8AAAABQAAAAAAAAAAAAAAeAUFBf75+fn/9/f3/wYG
+ Bv4AAAD1AAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAA
+ AOMAAADDAAAAmwMDA/7y8vL//v7+/6ampv8AAAD+AAAAxAAAAAoAAAAAAAAAAAAAAAAAAAB1BQUF/vn5
+ +f/7+/v/ioqK/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aG
+ hv+Ghob/hoaG/1JSUv8AAAD+AAAA/nBwcP/+/v7//Pz8/2NjY/8AAAD6AAAAdQAAAAQAAAAAAAAAAAAA
+ AGMDAwP+9PT0//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+//7+/v/+/v7/7e3t/wEBAf4AAAC5AAAA/HJycv/9/f3//Pz8/2NjY/8AAAD6AAAAdAAA
+ AAQAAAAAAAAAKgAAAO9HR0f+d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3
+ d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/9FRUX+AAAA6gAAACMAAACCAAAA/HJycv/9/f3//Pz8/2Nj
+ Y/8AAAD6AAAAcQAAAAIAAAACAAAATQAAALYAAADXAAAA3AAAAN0AAADdAAAA3QAAAN0AAADdAAAA3QAA
+ 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
+
+
\ No newline at end of file
diff --git a/RCM/Program.cs b/RCM/Program.cs
index def660c..ac10cd8 100644
--- a/RCM/Program.cs
+++ b/RCM/Program.cs
@@ -1,9 +1,9 @@
-using Newtonsoft.Json.Linq;
-using System;
-using System.ComponentModel;
-using System.Drawing;
-using System.IO;
+using System;
using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security.AccessControl;
+using System.Security.Principal;
+using System.Threading;
using System.Windows.Forms;
namespace RCM {
@@ -13,9 +13,30 @@ namespace RCM {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
- Config.LoadModules();
- Config.LoadConfiguration();
- Application.Run(new MainForm());
+ string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
+ string mutexId = string.Format("Local\\{{{0}}}", appGuid);
+
+ using (Mutex mutex = new Mutex(false, mutexId)) {
+ bool hasHandle = false;
+ try {
+ try {
+ hasHandle = mutex.WaitOne(0, false);
+ if (hasHandle == false) {
+ MessageBox.Show("An instance of the application is already running", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ return;
+ }
+ } catch (AbandonedMutexException) {
+ hasHandle = true;
+ }
+ Config.LoadModules();
+ Config.LoadConfiguration();
+ Application.Run(new MainForm());
+ } finally {
+ if (hasHandle) {
+ mutex.ReleaseMutex();
+ }
+ }
+ }
}
}
}
diff --git a/RCM/Program.ico b/RCM/Program.ico
new file mode 100644
index 0000000..86bb861
Binary files /dev/null and b/RCM/Program.ico differ
diff --git a/RCM/RCM.csproj b/RCM/RCM.csproj
index 504a591..63f00db 100644
--- a/RCM/RCM.csproj
+++ b/RCM/RCM.csproj
@@ -54,16 +54,20 @@
MinimumRecommendedRules.ruleset
true
+
+ Program.ico
+
-
- ..\packages\CredentialManagement.1.0.2\lib\net35\CredentialManagement.dll
+
+ ..\packages\Google.Protobuf.3.10.1\lib\net45\Google.Protobuf.dll
-
- ..\packages\MySql.Data.8.0.16\lib\net452\MySql.Data.dll
+
+
+ ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll
- ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll
+ ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll
@@ -71,7 +75,8 @@
..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net46\System.Data.SQLite.dll
-
+
+
@@ -96,9 +101,17 @@
SQLiteControl.cs
+
+
+ UserControl
+
+
+ RDPConfigControl.cs
+
+
@@ -137,10 +150,16 @@
MySQL.cs
Designer
+
+ MySQLControl.cs
+
SQLite.cs
Designer
+
+ SQLiteControl.cs
+
MainForm.cs
@@ -191,10 +210,16 @@
RDP.cs
Designer
+
+ RDPConfigControl.cs
+
SSH.cs
Designer
+
+ SSHConfigControl.cs
+
WebSite.cs
Designer
@@ -215,9 +240,12 @@
+
-
+
+
+
diff --git a/RCM/Record/RDP/RDP.cs b/RCM/Record/RDP/RDP.cs
index 446a022..a913cc8 100644
--- a/RCM/Record/RDP/RDP.cs
+++ b/RCM/Record/RDP/RDP.cs
@@ -1,10 +1,5 @@
using System;
using System.Windows.Forms;
-using System.Diagnostics;
-using CredentialManagement;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
namespace RCM {
[Serializable]
diff --git a/RCM/Record/RDP/RDPAction.cs b/RCM/Record/RDP/RDPAction.cs
index ea70d21..8abfa3f 100644
--- a/RCM/Record/RDP/RDPAction.cs
+++ b/RCM/Record/RDP/RDPAction.cs
@@ -1,20 +1,22 @@
-using CredentialManagement;
-using System;
-using System.Collections.Generic;
+using System;
+using System.ComponentModel;
using System.Diagnostics;
using System.IO;
-using System.Linq;
+using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using System.Windows.Forms;
namespace RCM {
- [DisplayName("Start Remote Desktop")]
+ [@DisplayName("Start Remote Desktop")]
public class RDPAction : IAction {
private RDP _rdp;
+ private RDPConfig _config;
public RDPAction(RDP rdp) {
_rdp = rdp;
+ _config = (RDPConfig)Config.ConfigSections[typeof(RDPConfig)];
}
public async void Run() {
@@ -27,29 +29,104 @@ namespace RCM {
});
}
- private void RunWin() {
- string[] host = _rdp.Host.Split(new char[] { ':' });
- string[] username = _rdp.Username.Split(new char[] { '\\' });
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ private struct DATA_BLOB {
+ public int cbData;
+ public IntPtr pbData;
+ }
+ [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ private static extern bool CryptProtectData(ref DATA_BLOB pDataIn, string szDataDescr, IntPtr pOptionalEntropy, IntPtr pvReserved, IntPtr pPromptStruct, int dwFlags, ref DATA_BLOB pDataOut);
+
+ public static string EncryptPassword(string plainText) {
+ if (plainText == null) {
+ plainText = String.Empty;
+ }
+ byte[] plainBytes = Encoding.Unicode.GetBytes(plainText);
+
+ DATA_BLOB plainBlob = new DATA_BLOB();
+ DATA_BLOB cipherBlob = new DATA_BLOB();
+
+ try {
+ plainBlob.pbData = Marshal.AllocHGlobal(plainBytes.Length);
+ if (plainBlob.pbData == IntPtr.Zero) {
+ throw new Exception("Plaintext DATA_BLOB allocation exception");
+ }
+ plainBlob.cbData = plainBytes.Length;
+ Marshal.Copy(plainBytes, 0, plainBlob.pbData, plainBytes.Length);
+
+ bool result = CryptProtectData(ref plainBlob, String.Empty, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 1, ref cipherBlob);
+ if (!result) {
+ throw new Exception("CryptProtectData exception", new Win32Exception(Marshal.GetLastWin32Error()));
+ }
+ byte[] cipherBytes = new byte[cipherBlob.cbData];
+ Marshal.Copy(cipherBlob.pbData, cipherBytes, 0, cipherBlob.cbData);
+ return BitConverter.ToString(cipherBytes).Replace("-", "");
+ } catch (Exception ex) {
+ throw new Exception("DPAPI encryption exception", ex);
+ } finally {
+ if (plainBlob.pbData != IntPtr.Zero) {
+ Marshal.FreeHGlobal(plainBlob.pbData);
+ }
+
+ if (cipherBlob.pbData != IntPtr.Zero) {
+ Marshal.FreeHGlobal(cipherBlob.pbData);
+ }
+ }
+ }
+
+ private string CreateRdpFile() {
+ string domain = null;
+ string username;
+ string[] splitname = _rdp.Username.Split("\\".ToCharArray());
+ if (splitname.Length == 2) {
+ domain = splitname[0];
+ username = splitname[1];
+ } else {
+ username = _rdp.Username;
+ }
+
+ string rdpName = string.Format("{0}.{1}", _rdp.Title, Guid.NewGuid().ToString());
+ foreach (var c in Path.GetInvalidFileNameChars()) {
+ rdpName = rdpName.Replace(c, '_');
+ }
+ string rdpFile = Path.Combine(Path.GetTempPath(), string.Format("{0}.rdp", rdpName));
// https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff393699(v%3dws.10)
- string rdpFile = Path.GetTempPath() + Guid.NewGuid().ToString() + ".rdp";
using (StreamWriter sw = new StreamWriter(rdpFile)) {
sw.Write("drivestoredirect:s:*\r\nredirectprinters:i:0\r\nredirectcomports:i:0\r\nredirectsmartcards:i:0\r\nredirectposdevices:i:0\r\nnetworkautodetect:i:0\r\nauthentication level:i:0\r\nprompt for credentials:i:0\r\nnegotiate security layer:i:1\r\npromptcredentialonce:i:0\r\nsmart sizing:i:0\r\nuse multimon:i:0\r\nbandwidthautodetect:i:1\r\n");
sw.Write(string.Format("full address:s:{0}\r\n", _rdp.Host));
- sw.Write(string.Format("username:s:{0}\r\n", _rdp.Username));
- if (username.Length == 2) {
- sw.Write(string.Format("domain:s:{0}\r\n", username[0]));
+ sw.Write(string.Format("username:s:{0}\r\n", username));
+ if (!string.IsNullOrEmpty(domain)) {
+ sw.Write(string.Format("domain:s:{0}\r\n", domain));
+ }
+ if (Environment.OSVersion.Platform == PlatformID.Unix) {
+ sw.Write(string.Format("password:s:{0}\r\n", _rdp.Password));
+ } else {
+ sw.Write(string.Format("password 51:b:{0}\r\n", EncryptPassword(_rdp.Password)));
}
}
- Credential credential = new Credential(_rdp.Username, _rdp.Password, string.Format("TERMSRV/{0}", host[0]));
- credential.Save();
- Process p = Process.Start("mstsc", string.Format("\"{0}\"", rdpFile));
+ return rdpFile;
+ }
+
+ private void RunWin() {
+ string rdpFile = CreateRdpFile();
+ Process.Start("mstsc", string.Format("\"{0}\"", rdpFile));
Thread.Sleep(1000);
File.Delete(rdpFile);
}
private void RunUnix() {
- // TODO
+ string rdpFile = CreateRdpFile();
+ string[] cmd = _config.LinuxRDPCommand.Replace("$RDP", rdpFile).Split(" ".ToCharArray(), 2);
+ if (cmd.Length == 0) {
+ MessageBox.Show("No RDP command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ } else if (cmd.Length == 1) {
+ Process.Start(cmd[0]);
+ } else {
+ Process.Start(cmd[0], cmd[1]);
+ }
+ Thread.Sleep(1000);
+ File.Delete(rdpFile);
}
}
}
diff --git a/RCM/Record/RDP/RDPConfig.cs b/RCM/Record/RDP/RDPConfig.cs
new file mode 100644
index 0000000..e29b6af
--- /dev/null
+++ b/RCM/Record/RDP/RDPConfig.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Windows.Forms;
+
+namespace RCM {
+ [DisplayName("RDP")]
+ [Serializable]
+ public class RDPConfig : IConfigSection {
+ public string LinuxRDPCommand { get; set; }
+ [NonSerialized]
+ private RDPConfigControl _control;
+
+ public UserControl GetControl() {
+ if (_control == null || _control.IsDisposed) {
+ _control = new RDPConfigControl(this);
+ }
+ return _control;
+ }
+
+ public void UpdateFromControl() {
+ LinuxRDPCommand = _control.textBoxLinuxRDPCommand.Text;
+ }
+ }
+}
diff --git a/RCM/Record/RDP/RDPConfigControl.Designer.cs b/RCM/Record/RDP/RDPConfigControl.Designer.cs
new file mode 100644
index 0000000..c92e46c
--- /dev/null
+++ b/RCM/Record/RDP/RDPConfigControl.Designer.cs
@@ -0,0 +1,89 @@
+namespace RCM {
+ partial class RDPConfigControl {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.labelLinuxRDPCommandHelp = new System.Windows.Forms.Label();
+ this.textBoxLinuxRDPCommand = new System.Windows.Forms.TextBox();
+ this.labelLinuxSSHCommand = new System.Windows.Forms.Label();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.labelLinuxRDPCommandHelp);
+ this.groupBox1.Controls.Add(this.textBoxLinuxRDPCommand);
+ this.groupBox1.Controls.Add(this.labelLinuxSSHCommand);
+ this.groupBox1.Location = new System.Drawing.Point(3, 6);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(487, 68);
+ this.groupBox1.TabIndex = 10;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Linux";
+ //
+ // labelLinuxRDPCommandHelp
+ //
+ this.labelLinuxRDPCommandHelp.AutoSize = true;
+ this.labelLinuxRDPCommandHelp.Location = new System.Drawing.Point(129, 42);
+ this.labelLinuxRDPCommandHelp.Name = "labelLinuxRDPCommandHelp";
+ this.labelLinuxRDPCommandHelp.Size = new System.Drawing.Size(194, 13);
+ this.labelLinuxRDPCommandHelp.TabIndex = 7;
+ this.labelLinuxRDPCommandHelp.Text = "Use $RDP to inject the path to RDP file";
+ //
+ // textBoxLinuxRDPCommand
+ //
+ this.textBoxLinuxRDPCommand.Location = new System.Drawing.Point(132, 19);
+ this.textBoxLinuxRDPCommand.Name = "textBoxLinuxRDPCommand";
+ this.textBoxLinuxRDPCommand.Size = new System.Drawing.Size(342, 20);
+ this.textBoxLinuxRDPCommand.TabIndex = 1;
+ //
+ // labelLinuxSSHCommand
+ //
+ this.labelLinuxSSHCommand.AutoSize = true;
+ this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22);
+ this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand";
+ this.labelLinuxSSHCommand.Size = new System.Drawing.Size(113, 13);
+ this.labelLinuxSSHCommand.TabIndex = 0;
+ this.labelLinuxSSHCommand.Text = "Command to run RDP:";
+ //
+ // RDPConfigControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.groupBox1);
+ this.Name = "RDPConfigControl";
+ this.Size = new System.Drawing.Size(499, 99);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label labelLinuxRDPCommandHelp;
+ public System.Windows.Forms.TextBox textBoxLinuxRDPCommand;
+ private System.Windows.Forms.Label labelLinuxSSHCommand;
+ }
+}
diff --git a/RCM/Record/RDP/RDPConfigControl.cs b/RCM/Record/RDP/RDPConfigControl.cs
new file mode 100644
index 0000000..14b1b24
--- /dev/null
+++ b/RCM/Record/RDP/RDPConfigControl.cs
@@ -0,0 +1,10 @@
+using System.Windows.Forms;
+
+namespace RCM {
+ public partial class RDPConfigControl : UserControl {
+ public RDPConfigControl(RDPConfig rdpConfig) {
+ InitializeComponent();
+ textBoxLinuxRDPCommand.Text = rdpConfig.LinuxRDPCommand;
+ }
+ }
+}
diff --git a/RCM/Record/RDP/RDPConfigControl.resx b/RCM/Record/RDP/RDPConfigControl.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RCM/Record/RDP/RDPConfigControl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/RCM/Record/RDP/SMBAction.cs b/RCM/Record/RDP/SMBAction.cs
index 51dd495..b204b46 100644
--- a/RCM/Record/RDP/SMBAction.cs
+++ b/RCM/Record/RDP/SMBAction.cs
@@ -1,9 +1,6 @@
using System;
-using System.Collections.Generic;
using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Windows.Forms;
namespace RCM {
[DisplayName("Browse via SMB")]
@@ -15,12 +12,19 @@ namespace RCM {
}
public void Run() {
- string[] host = _rdp.Host.Split(new char[] { ':' });
+ string[] host = _rdp.Host.Split(":".ToCharArray());
if (Environment.OSVersion.Platform == PlatformID.Unix) {
- // TODO
+ MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ // TODO: Implement
} else {
- Process.Start("explorer.exe", string.Format("\\\\{0}", host[0])); // TODO: net use credentials?
+ Process netUse = Process.Start("net", string.Format("use \\\\{0} \"/USER:{1}\" \"{2}\"", host[0], _rdp.Username, _rdp.Password));
+ netUse.WaitForExit();
+ if (netUse.ExitCode == 0) {
+ Process.Start("explorer.exe", string.Format("\\\\{0}", host[0]));
+ } else {
+ MessageBox.Show("Unable to open the SMB share path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
}
}
}
diff --git a/RCM/Record/SSH/SCPAction.cs b/RCM/Record/SSH/SCPAction.cs
index c275a1e..509ea63 100644
--- a/RCM/Record/SSH/SCPAction.cs
+++ b/RCM/Record/SSH/SCPAction.cs
@@ -1,7 +1,6 @@
using System;
using System.Diagnostics;
using System.IO;
-using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -36,11 +35,11 @@ namespace RCM {
MessageBox.Show("WinSCP path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
- if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) {
+ if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) {
MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
- if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) {
+ if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
if (string.IsNullOrWhiteSpace(_config.PageantPath)) {
MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
@@ -52,16 +51,23 @@ namespace RCM {
}
StringBuilder scpParams = new StringBuilder();
- if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) {
- Process.Start(_config.PageantPath, _config.SSHKeys);
- scpParams.Append(string.Format("/privatekey={0} ", _config.SSHKeys)); //TODO: Zvlada vic klicu?
+ if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
+ StringBuilder pageantParams = new StringBuilder();
+ foreach (string sshKey in _config.SSHKeys) {
+ pageantParams.AppendFormat("\"{0}\" ", sshKey);
+ }
+ Process.Start(_config.PageantPath, pageantParams.ToString());
+ }
+ scpParams.AppendFormat("sftp://{0}@{1}", _ssh.Username, _ssh.Host);
+ if (!string.IsNullOrWhiteSpace(_ssh.Password)) {
+ scpParams.AppendFormat(" \"/password={0}\"", _ssh.Password);
}
- scpParams.AppendFormat("scp://{0}@{1}", _ssh.Username, _ssh.Host); // TODO: password?
Process.Start(_config.WinSCPPath, scpParams.ToString());
}
private void RunUnix() {
- // TOOD
+ MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ // TODO: Implement
}
}
}
diff --git a/RCM/Record/SSH/SSH.cs b/RCM/Record/SSH/SSH.cs
index b8144cb..61f8eee 100644
--- a/RCM/Record/SSH/SSH.cs
+++ b/RCM/Record/SSH/SSH.cs
@@ -1,9 +1,4 @@
using System;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM {
diff --git a/RCM/Record/SSH/SSHAction.cs b/RCM/Record/SSH/SSHAction.cs
index 966a5ad..928bfb2 100644
--- a/RCM/Record/SSH/SSHAction.cs
+++ b/RCM/Record/SSH/SSHAction.cs
@@ -35,11 +35,11 @@ namespace RCM {
MessageBox.Show("PuTTY path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
- if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) {
+ if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) {
MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
- if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) {
+ if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
if (string.IsNullOrWhiteSpace(_config.PageantPath)) {
MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
@@ -50,23 +50,47 @@ namespace RCM {
}
}
- string[] host = _ssh.Host.Split(new char[] { ':' });
+ string[] host = _ssh.Host.Split(":".ToCharArray());
StringBuilder puttyParams = new StringBuilder();
- if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) {
- Process.Start(_config.PageantPath, _config.SSHKeys);
- puttyParams.AppendFormat("-i {0} ", _config.SSHKeys);
- } else {
+ if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) {
+ StringBuilder pageantParams = new StringBuilder();
+ foreach (string sshKey in _config.SSHKeys) {
+ pageantParams.AppendFormat("\"{0}\" ", sshKey);
+ }
+ Process.Start(_config.PageantPath, pageantParams.ToString());
+ }
+ if (!string.IsNullOrWhiteSpace(_ssh.Password)) {
puttyParams.AppendFormat("-pw {0} ", _ssh.Password);
}
if (host.Length > 1) {
puttyParams.AppendFormat("-P {0} ", host[1]);
}
- puttyParams.AppendFormat("{0}@{1}", _ssh.Username, host[0]);
+ if (!string.IsNullOrWhiteSpace(_ssh.Username)) {
+ puttyParams.AppendFormat("{0}@", _ssh.Username);
+ }
+ puttyParams.Append(host[0]);
Process.Start(_config.PuttyPath, puttyParams.ToString());
}
private void RunUnix() {
- // TODO
+ string[] host = _ssh.Host.Split(":".ToCharArray());
+ StringBuilder sshParams = new StringBuilder("ssh ");
+ if (host.Length > 1) {
+ sshParams.AppendFormat("-p {0} ", host[1]);
+ }
+ if (!string.IsNullOrWhiteSpace(_ssh.Username)) {
+ sshParams.AppendFormat("{0}@", _ssh.Username);
+ }
+ sshParams.Append(host[0]);
+
+ string[] cmd = _config.LinuxSSHCommand.Replace("$SSH", sshParams.ToString()).Split(" ".ToCharArray(), 2);
+ if (cmd.Length == 0) {
+ MessageBox.Show("No SSH command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ } else if (cmd.Length == 1) {
+ Process.Start(cmd[0]);
+ } else {
+ Process.Start(cmd[0], cmd[1]);
+ }
}
}
}
diff --git a/RCM/Record/SSH/SSHConfig.cs b/RCM/Record/SSH/SSHConfig.cs
index f12da7c..05b2bb6 100644
--- a/RCM/Record/SSH/SSHConfig.cs
+++ b/RCM/Record/SSH/SSHConfig.cs
@@ -1,18 +1,15 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace RCM {
[DisplayName("SSH")]
[Serializable]
public class SSHConfig : IConfigSection {
- public string SSHKeys { get; set; }
+ public string[] SSHKeys { get; set; }
public string PuttyPath { get; set; }
public string PageantPath { get; set; }
public string WinSCPPath { get; set; }
+ public string LinuxSSHCommand { get; set; }
[NonSerialized]
private SSHConfigControl _control;
@@ -24,10 +21,11 @@ namespace RCM {
}
public void UpdateFromControl() {
- SSHKeys = _control.textBoxSshKeys.Text;
+ SSHKeys = _control.SSHKeys;
PuttyPath = _control.textBoxPutty.Text;
PageantPath = _control.textBoxPageant.Text;
WinSCPPath = _control.textBoxWinSCP.Text;
+ LinuxSSHCommand = _control.textBoxLinuxSSHCommand.Text;
}
}
}
diff --git a/RCM/Record/SSH/SSHConfigControl.Designer.cs b/RCM/Record/SSH/SSHConfigControl.Designer.cs
index b6fd4eb..dc28f73 100644
--- a/RCM/Record/SSH/SSHConfigControl.Designer.cs
+++ b/RCM/Record/SSH/SSHConfigControl.Designer.cs
@@ -25,6 +25,9 @@
private void InitializeComponent() {
this.labelPutty = new System.Windows.Forms.Label();
this.groupBoxWindows = new System.Windows.Forms.GroupBox();
+ this.buttonSelectWinSCP = new System.Windows.Forms.Button();
+ this.textBoxWinSCP = new System.Windows.Forms.TextBox();
+ this.labelWinSCP = new System.Windows.Forms.Label();
this.buttonSelectPageant = new System.Windows.Forms.Button();
this.buttonSelectPutty = new System.Windows.Forms.Button();
this.textBoxPageant = new System.Windows.Forms.TextBox();
@@ -36,11 +39,13 @@
this.openFileDialogSshKeys = new System.Windows.Forms.OpenFileDialog();
this.openFileDialogPutty = new System.Windows.Forms.OpenFileDialog();
this.openFileDialogPageant = new System.Windows.Forms.OpenFileDialog();
- this.buttonSelectWinSCP = new System.Windows.Forms.Button();
- this.textBoxWinSCP = new System.Windows.Forms.TextBox();
- this.labelWinSCP = new System.Windows.Forms.Label();
this.openFileDialogWinSCP = new System.Windows.Forms.OpenFileDialog();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.labelLinuxSSHCommandHelp = new System.Windows.Forms.Label();
+ this.textBoxLinuxSSHCommand = new System.Windows.Forms.TextBox();
+ this.labelLinuxSSHCommand = new System.Windows.Forms.Label();
this.groupBoxWindows.SuspendLayout();
+ this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// labelPutty
@@ -55,27 +60,56 @@
// groupBoxWindows
//
this.groupBoxWindows.Controls.Add(this.buttonSelectWinSCP);
+ this.groupBoxWindows.Controls.Add(this.buttonSelectSshKeys);
this.groupBoxWindows.Controls.Add(this.textBoxWinSCP);
+ this.groupBoxWindows.Controls.Add(this.textBoxSshKeys);
this.groupBoxWindows.Controls.Add(this.labelWinSCP);
+ this.groupBoxWindows.Controls.Add(this.labelSshKey);
this.groupBoxWindows.Controls.Add(this.buttonSelectPageant);
this.groupBoxWindows.Controls.Add(this.buttonSelectPutty);
this.groupBoxWindows.Controls.Add(this.textBoxPageant);
this.groupBoxWindows.Controls.Add(this.textBoxPutty);
this.groupBoxWindows.Controls.Add(this.labelPageant);
this.groupBoxWindows.Controls.Add(this.labelPutty);
- this.groupBoxWindows.Location = new System.Drawing.Point(3, 39);
+ this.groupBoxWindows.Location = new System.Drawing.Point(3, 3);
this.groupBoxWindows.Name = "groupBoxWindows";
- this.groupBoxWindows.Size = new System.Drawing.Size(487, 108);
+ this.groupBoxWindows.Size = new System.Drawing.Size(487, 130);
this.groupBoxWindows.TabIndex = 1;
this.groupBoxWindows.TabStop = false;
this.groupBoxWindows.Text = "Windows";
//
+ // buttonSelectWinSCP
+ //
+ this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70);
+ this.buttonSelectWinSCP.Name = "buttonSelectWinSCP";
+ this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22);
+ this.buttonSelectWinSCP.TabIndex = 6;
+ this.buttonSelectWinSCP.Text = "⋯";
+ this.buttonSelectWinSCP.UseVisualStyleBackColor = true;
+ this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click);
+ //
+ // textBoxWinSCP
+ //
+ this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71);
+ this.textBoxWinSCP.Name = "textBoxWinSCP";
+ this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20);
+ this.textBoxWinSCP.TabIndex = 5;
+ //
+ // labelWinSCP
+ //
+ this.labelWinSCP.AutoSize = true;
+ this.labelWinSCP.Location = new System.Drawing.Point(19, 74);
+ this.labelWinSCP.Name = "labelWinSCP";
+ this.labelWinSCP.Size = new System.Drawing.Size(107, 13);
+ this.labelWinSCP.TabIndex = 7;
+ this.labelWinSCP.Text = "Path to WinSCP.exe:";
+ //
// buttonSelectPageant
//
this.buttonSelectPageant.Location = new System.Drawing.Point(452, 44);
this.buttonSelectPageant.Name = "buttonSelectPageant";
this.buttonSelectPageant.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectPageant.TabIndex = 6;
+ this.buttonSelectPageant.TabIndex = 4;
this.buttonSelectPageant.Text = "⋯";
this.buttonSelectPageant.UseVisualStyleBackColor = true;
this.buttonSelectPageant.Click += new System.EventHandler(this.ButtonSelectPageant_Click);
@@ -85,7 +119,7 @@
this.buttonSelectPutty.Location = new System.Drawing.Point(452, 18);
this.buttonSelectPutty.Name = "buttonSelectPutty";
this.buttonSelectPutty.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectPutty.TabIndex = 6;
+ this.buttonSelectPutty.TabIndex = 2;
this.buttonSelectPutty.Text = "⋯";
this.buttonSelectPutty.UseVisualStyleBackColor = true;
this.buttonSelectPutty.Click += new System.EventHandler(this.ButtonSelectPutty_Click);
@@ -102,7 +136,7 @@
this.textBoxPutty.Location = new System.Drawing.Point(132, 19);
this.textBoxPutty.Name = "textBoxPutty";
this.textBoxPutty.Size = new System.Drawing.Size(314, 20);
- this.textBoxPutty.TabIndex = 2;
+ this.textBoxPutty.TabIndex = 1;
//
// labelPageant
//
@@ -116,7 +150,7 @@
// labelSshKey
//
this.labelSshKey.AutoSize = true;
- this.labelSshKey.Location = new System.Drawing.Point(8, 10);
+ this.labelSshKey.Location = new System.Drawing.Point(19, 100);
this.labelSshKey.Name = "labelSshKey";
this.labelSshKey.Size = new System.Drawing.Size(99, 13);
this.labelSshKey.TabIndex = 4;
@@ -124,24 +158,24 @@
//
// textBoxSshKeys
//
- this.textBoxSshKeys.Location = new System.Drawing.Point(135, 7);
+ this.textBoxSshKeys.Location = new System.Drawing.Point(132, 97);
this.textBoxSshKeys.Name = "textBoxSshKeys";
this.textBoxSshKeys.Size = new System.Drawing.Size(314, 20);
- this.textBoxSshKeys.TabIndex = 4;
+ this.textBoxSshKeys.TabIndex = 7;
//
// buttonSelectSshKeys
//
- this.buttonSelectSshKeys.Location = new System.Drawing.Point(455, 6);
+ this.buttonSelectSshKeys.Location = new System.Drawing.Point(452, 96);
this.buttonSelectSshKeys.Name = "buttonSelectSshKeys";
this.buttonSelectSshKeys.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectSshKeys.TabIndex = 5;
+ this.buttonSelectSshKeys.TabIndex = 8;
this.buttonSelectSshKeys.Text = "⋯";
this.buttonSelectSshKeys.UseVisualStyleBackColor = true;
this.buttonSelectSshKeys.Click += new System.EventHandler(this.ButtonSelectSshKeys_Click);
//
// openFileDialogSshKeys
//
- this.openFileDialogSshKeys.Filter = "OpenSSH keys (*.pub)|*.pub|PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*";
+ this.openFileDialogSshKeys.Filter = "PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*";
this.openFileDialogSshKeys.Multiselect = true;
//
// openFileDialogPutty
@@ -152,50 +186,60 @@
//
this.openFileDialogPageant.Filter = "Pageant.exe|Pageant.exe";
//
- // buttonSelectWinSCP
- //
- this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70);
- this.buttonSelectWinSCP.Name = "buttonSelectWinSCP";
- this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectWinSCP.TabIndex = 9;
- this.buttonSelectWinSCP.Text = "⋯";
- this.buttonSelectWinSCP.UseVisualStyleBackColor = true;
- this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click);
- //
- // textBoxWinSCP
- //
- this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71);
- this.textBoxWinSCP.Name = "textBoxWinSCP";
- this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20);
- this.textBoxWinSCP.TabIndex = 8;
- //
- // labelWinSCP
- //
- this.labelWinSCP.AutoSize = true;
- this.labelWinSCP.Location = new System.Drawing.Point(19, 74);
- this.labelWinSCP.Name = "labelWinSCP";
- this.labelWinSCP.Size = new System.Drawing.Size(107, 13);
- this.labelWinSCP.TabIndex = 7;
- this.labelWinSCP.Text = "Path to WinSCP.exe:";
- //
// openFileDialogWinSCP
//
this.openFileDialogWinSCP.Filter = "WinSCP.exe|WinSCP.exe";
//
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.labelLinuxSSHCommandHelp);
+ this.groupBox1.Controls.Add(this.textBoxLinuxSSHCommand);
+ this.groupBox1.Controls.Add(this.labelLinuxSSHCommand);
+ this.groupBox1.Location = new System.Drawing.Point(3, 139);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(487, 68);
+ this.groupBox1.TabIndex = 10;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Linux";
+ //
+ // labelLinuxSSHCommandHelp
+ //
+ this.labelLinuxSSHCommandHelp.AutoSize = true;
+ this.labelLinuxSSHCommandHelp.Location = new System.Drawing.Point(129, 42);
+ this.labelLinuxSSHCommandHelp.Name = "labelLinuxSSHCommandHelp";
+ this.labelLinuxSSHCommandHelp.Size = new System.Drawing.Size(189, 13);
+ this.labelLinuxSSHCommandHelp.TabIndex = 7;
+ this.labelLinuxSSHCommandHelp.Text = "Use $SSH to inject the SSH command";
+ //
+ // textBoxLinuxSSHCommand
+ //
+ this.textBoxLinuxSSHCommand.Location = new System.Drawing.Point(132, 19);
+ this.textBoxLinuxSSHCommand.Name = "textBoxLinuxSSHCommand";
+ this.textBoxLinuxSSHCommand.Size = new System.Drawing.Size(342, 20);
+ this.textBoxLinuxSSHCommand.TabIndex = 9;
+ //
+ // labelLinuxSSHCommand
+ //
+ this.labelLinuxSSHCommand.AutoSize = true;
+ this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22);
+ this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand";
+ this.labelLinuxSSHCommand.Size = new System.Drawing.Size(112, 13);
+ this.labelLinuxSSHCommand.TabIndex = 0;
+ this.labelLinuxSSHCommand.Text = "Command to run SSH:";
+ //
// SSHConfigControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.buttonSelectSshKeys);
- this.Controls.Add(this.textBoxSshKeys);
- this.Controls.Add(this.labelSshKey);
+ this.Controls.Add(this.groupBox1);
this.Controls.Add(this.groupBoxWindows);
this.Name = "SSHConfigControl";
- this.Size = new System.Drawing.Size(499, 172);
+ this.Size = new System.Drawing.Size(499, 220);
this.groupBoxWindows.ResumeLayout(false);
this.groupBoxWindows.PerformLayout();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
this.ResumeLayout(false);
- this.PerformLayout();
}
@@ -218,5 +262,9 @@
public System.Windows.Forms.TextBox textBoxWinSCP;
private System.Windows.Forms.Label labelWinSCP;
private System.Windows.Forms.OpenFileDialog openFileDialogWinSCP;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label labelLinuxSSHCommandHelp;
+ public System.Windows.Forms.TextBox textBoxLinuxSSHCommand;
+ private System.Windows.Forms.Label labelLinuxSSHCommand;
}
}
diff --git a/RCM/Record/SSH/SSHConfigControl.cs b/RCM/Record/SSH/SSHConfigControl.cs
index 5957b9c..de1410c 100644
--- a/RCM/Record/SSH/SSHConfigControl.cs
+++ b/RCM/Record/SSH/SSHConfigControl.cs
@@ -3,15 +3,22 @@ using System.Windows.Forms;
namespace RCM {
public partial class SSHConfigControl : UserControl {
+ public string[] SSHKeys { get; private set; }
+
public SSHConfigControl(SSHConfig sshConfig) {
InitializeComponent();
textBoxPutty.Text = sshConfig.PuttyPath;
textBoxPageant.Text = sshConfig.PageantPath;
- textBoxSshKeys.Text = sshConfig.SSHKeys;
+ SSHKeys = sshConfig.SSHKeys;
+ if (SSHKeys != null) {
+ textBoxSshKeys.Text = string.Join(",", SSHKeys);
+ }
+ textBoxLinuxSSHCommand.Text = sshConfig.LinuxSSHCommand;
}
private void ButtonSelectSshKeys_Click(object sender, EventArgs e) {
if (openFileDialogSshKeys.ShowDialog() == DialogResult.OK) {
+ SSHKeys = openFileDialogSshKeys.FileNames;
textBoxSshKeys.Text = string.Join(",", openFileDialogSshKeys.FileNames);
}
}
diff --git a/RCM/Record/SSH/SSHConfigControl.resx b/RCM/Record/SSH/SSHConfigControl.resx
new file mode 100644
index 0000000..bdac2b8
--- /dev/null
+++ b/RCM/Record/SSH/SSHConfigControl.resx
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 194, 17
+
+
+ 356, 17
+
+
+ 534, 17
+
+
\ No newline at end of file
diff --git a/RCM/Record/WebSite/BrowserAction.cs b/RCM/Record/WebSite/BrowserAction.cs
index 008de85..81e613e 100644
--- a/RCM/Record/WebSite/BrowserAction.cs
+++ b/RCM/Record/WebSite/BrowserAction.cs
@@ -1,8 +1,5 @@
using System;
-using System.Collections.Generic;
using System.Diagnostics;
-using System.Linq;
-using System.Text;
using System.Threading.Tasks;
namespace RCM {
@@ -16,8 +13,13 @@ namespace RCM {
public async void Run() {
await Task.Run(() => {
- if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://"))
- Process.Start(_website.URL); // TODO: vyplnovat hesla
+ if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://")) {
+ if (Environment.OSVersion.Platform == PlatformID.Unix) {
+ Process.Start("xdg-open", _website.URL);
+ } else {
+ Process.Start(_website.URL); // TODO: vyplnovat hesla
+ }
+ }
});
}
}
diff --git a/RCM/Record/WebSite/WebSite.cs b/RCM/Record/WebSite/WebSite.cs
index 4855693..28b7a32 100644
--- a/RCM/Record/WebSite/WebSite.cs
+++ b/RCM/Record/WebSite/WebSite.cs
@@ -1,5 +1,4 @@
using System;
-using System.Diagnostics;
using System.Windows.Forms;
namespace RCM {
diff --git a/RCM/Record/WinBox/WinBoxAction.cs b/RCM/Record/WinBox/WinBoxAction.cs
index 37ff5eb..000d26a 100644
--- a/RCM/Record/WinBox/WinBoxAction.cs
+++ b/RCM/Record/WinBox/WinBoxAction.cs
@@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Forms;
namespace RCM {
[DisplayName("Start WinBox")]
@@ -19,6 +20,14 @@ namespace RCM {
public async void Run() {
await Task.Run(() => {
+ if (string.IsNullOrWhiteSpace(_config.WinBoxPath)) {
+ MessageBox.Show("WinBox path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ if (!File.Exists(_config.WinBoxPath)) {
+ MessageBox.Show("WinBox path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
if (Environment.OSVersion.Platform == PlatformID.Unix) {
RunUnix();
} else {
@@ -28,12 +37,12 @@ namespace RCM {
}
private void RunWin() {
- string winboxParam = string.Format("{0} \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password);
+ string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password);
Process.Start(_config.WinBoxPath, winboxParam);
}
private void RunUnix() {
- string winboxParam = string.Format("{0} {1} \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password);
+ string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password);
Process.Start("wine", winboxParam);
}
}
diff --git a/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs b/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs
index 83b1b4c..70f4f05 100644
--- a/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs
+++ b/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs
@@ -34,7 +34,7 @@
this.buttonSelectWinBox.Location = new System.Drawing.Point(455, 6);
this.buttonSelectWinBox.Name = "buttonSelectWinBox";
this.buttonSelectWinBox.Size = new System.Drawing.Size(22, 22);
- this.buttonSelectWinBox.TabIndex = 9;
+ this.buttonSelectWinBox.TabIndex = 2;
this.buttonSelectWinBox.Text = "⋯";
this.buttonSelectWinBox.UseVisualStyleBackColor = true;
this.buttonSelectWinBox.Click += new System.EventHandler(this.ButtonSelectWinBox_Click);
@@ -44,7 +44,7 @@
this.textBoxWinBox.Location = new System.Drawing.Point(135, 7);
this.textBoxWinBox.Name = "textBoxWinBox";
this.textBoxWinBox.Size = new System.Drawing.Size(314, 20);
- this.textBoxWinBox.TabIndex = 8;
+ this.textBoxWinBox.TabIndex = 1;
//
// labelWinBox
//
@@ -57,7 +57,7 @@
//
// openFileDialogWinBox
//
- this.openFileDialogWinBox.Filter = "WinBox.exe|WinBox.exe";
+ this.openFileDialogWinBox.Filter = "WinBox*.exe|WinBox*.exe";
//
// WinBoxConfigControl
//
diff --git a/RCM/RecordNodeSorter.cs b/RCM/RecordNodeSorter.cs
index 234066b..261074f 100644
--- a/RCM/RecordNodeSorter.cs
+++ b/RCM/RecordNodeSorter.cs
@@ -7,7 +7,7 @@ namespace RCM {
IRecord record1 = (IRecord)((TreeNode)o1).Tag;
IRecord record2 = (IRecord)((TreeNode)o2).Tag;
- int result = 0;
+ int result;
if (record1 is Group) {
if (record2 is Group) {
diff --git a/RCM/TypeExtensions.cs b/RCM/TypeExtensions.cs
index 0c7102a..7a42ec3 100644
--- a/RCM/TypeExtensions.cs
+++ b/RCM/TypeExtensions.cs
@@ -1,8 +1,5 @@
using System;
-using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace RCM {
public static class TypeExtensions {
diff --git a/RCM/ZZImporter.cs b/RCM/ZZImporter.cs
new file mode 100644
index 0000000..1115d02
--- /dev/null
+++ b/RCM/ZZImporter.cs
@@ -0,0 +1,82 @@
+/*using Microsoft.VisualBasic.FileIO;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace RCM {
+ public static class Importer {
+ public static List GetRecordsFromRDM() {
+ Dictionary groups = new Dictionary();
+ List records = new List();
+ string previousGroup = null;
+
+ using (TextFieldParser parser = new TextFieldParser("EntryList.csv", Encoding.UTF8)) {
+ parser.TextFieldType = FieldType.Delimited;
+ parser.SetDelimiters(",");
+ parser.ReadFields(); // Skip headers
+ while (!parser.EndOfData) {
+ string[] fields = parser.ReadFields();
+ string type = fields[0];
+ string name = fields[3];
+ string group = fields[4];
+ string parent = fields[7];
+ string host = fields[8];
+ string port = fields[9];
+ string username = fields[10];
+ string domain = fields[11];
+ string password = fields[12];
+ string url = fields[14];
+
+ if (!string.IsNullOrWhiteSpace(parent)) {
+ // Naive identification of subconnections ownership
+ group = previousGroup;
+ }
+ if (!string.IsNullOrWhiteSpace(port)) {
+ host = string.Format("{0}:{1}", host, port);
+ }
+ if (!string.IsNullOrWhiteSpace(domain)) {
+ username = string.Format("{0}\\{1}", domain, username);
+ }
+
+ IRecord record = null;
+ if (type == "Folder" || type == "Site") {
+ string[] splitGroup = group.Split("\\".ToCharArray());
+ group = string.Join("\\", splitGroup.Take(splitGroup.Length - 1));
+ } else if (type == "Winbox") {
+ record = new WinBox() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
+ } else if (type == "Microsoft Remote Desktop (RDP)") {
+ record = new RDP() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
+ } else if (type == "Putty") {
+ record = new SSH() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password };
+ } else if (type == "Web Browser (http/https)") {
+ record = new WebSite() { Id = Guid.NewGuid(), Title = name, URL = url, Username = username, Password = password };
+ } else if (type == "FTP (Third Party)") {
+ // skip
+ } else {
+ MessageBox.Show(string.Format("Type: {0}, Title: {1}", type, name));
+ }
+ if (record != null) {
+ string[] splitGroup = group.Split("\\".ToCharArray());
+ for (int i = 0; i < splitGroup.Length; i++) {
+ string level = string.Join("\\", splitGroup.Take(i+1));
+ if (!groups.ContainsKey(level)) {
+ Group g = new Group() { Id = Guid.NewGuid(), Title = splitGroup[i], GroupId = i == 0 ? Guid.Empty : groups[string.Join("\\", splitGroup.Take(i))] };
+ records.Add(g);
+ groups.Add(level, g.Id);
+ }
+ }
+ record.GroupId = groups[group];
+ records.Add(record);
+ }
+ previousGroup = group;
+ }
+ }
+
+ return records;
+ }
+ }
+}
+*/
\ No newline at end of file
diff --git a/RCM/app.config b/RCM/app.config
new file mode 100644
index 0000000..68b2176
--- /dev/null
+++ b/RCM/app.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RCM/packages.config b/RCM/packages.config
index e6fef98..9d73f3e 100644
--- a/RCM/packages.config
+++ b/RCM/packages.config
@@ -1,9 +1,7 @@
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/Resources/Program.ico b/Resources/Program.ico
new file mode 100644
index 0000000..86bb861
Binary files /dev/null and b/Resources/Program.ico differ
diff --git a/mono.txt b/mono.txt
new file mode 100644
index 0000000..5b87824
--- /dev/null
+++ b/mono.txt
@@ -0,0 +1,4 @@
+apt-get install mono-runtime \
+libmono-system-management4.0-cil \
+libmono-system-runtime-serialization4.0-cil \
+libmono-system-windows-forms4.0-cil