diff --git a/About.Designer.cs b/About.Designer.cs
index fe3a962..4e30769 100644
--- a/About.Designer.cs
+++ b/About.Designer.cs
@@ -42,9 +42,10 @@
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(245, 120);
this.linkLabel1.TabIndex = 0;
- this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEdit by" +
- " copyboy\r\nFugue icon set: p.yusukekamiyamane.com\r\n\r\nEmail: jaquadro@gmail.com\r\nN" +
- "BTExplorer Github Project Page";
+ this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011-2012 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEd" +
+ "it by copyboy\r\nFugue icon set: p.yusukekamiyamane.com\r\n\r\nEmail: jaquadro@gmail.c" +
+ "om\r\nNBTExplorer Github Project Page";
+ this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
//
// pictureBox1
//
diff --git a/About.cs b/About.cs
index 0853c5d..701e584 100644
--- a/About.cs
+++ b/About.cs
@@ -13,5 +13,10 @@ namespace NBTExplorer
{
InitializeComponent();
}
+
+ private void linkLabel1_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e)
+ {
+
+ }
}
}
diff --git a/About.resx b/About.resx
index c94e8d0..12983ad 100644
--- a/About.resx
+++ b/About.resx
@@ -121,7 +121,7 @@
iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4Bd
+ YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4Bd
AAAGm0lEQVR4Xu2dS3LbQAwFvcpZcoDcJtscRIfIfZ2wJLkklVzToPCGpN0Lr/gEgDONh5Gsz9vpdHrz
j63B3z8/38mf63l6E6pCYxGoFo1gCVapsQSLOfvSWKWF/e6dKFiCFWkYwRIswSqcHROTKLIBiUL3EFPH
0rEiDSNYgiVYjkLeBVuPQx2L71Wks7cGIJVfsAQr0jCCJViC5RmLd0FqxNG4Ohbfq0hn0406mk6wBCvS
diff --git a/CreateNode.Designer.cs b/CreateNode.Designer.cs
new file mode 100644
index 0000000..3d0e3cf
--- /dev/null
+++ b/CreateNode.Designer.cs
@@ -0,0 +1,126 @@
+namespace NBTExplorer
+{
+ partial class CreateNode
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent ()
+ {
+ this._sizeField = new System.Windows.Forms.TextBox();
+ this._sizeFieldLabel = new System.Windows.Forms.Label();
+ this._nameFieldLabel = new System.Windows.Forms.Label();
+ this._nameField = new System.Windows.Forms.TextBox();
+ this._buttonCancel = new System.Windows.Forms.Button();
+ this._buttonOK = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // _sizeField
+ //
+ this._sizeField.Location = new System.Drawing.Point(56, 26);
+ this._sizeField.Name = "_sizeField";
+ this._sizeField.Size = new System.Drawing.Size(67, 20);
+ this._sizeField.TabIndex = 7;
+ //
+ // _sizeFieldLabel
+ //
+ this._sizeFieldLabel.AutoSize = true;
+ this._sizeFieldLabel.Location = new System.Drawing.Point(12, 29);
+ this._sizeFieldLabel.Name = "_sizeFieldLabel";
+ this._sizeFieldLabel.Size = new System.Drawing.Size(30, 13);
+ this._sizeFieldLabel.TabIndex = 6;
+ this._sizeFieldLabel.Text = "Size:";
+ //
+ // _nameFieldLabel
+ //
+ this._nameFieldLabel.AutoSize = true;
+ this._nameFieldLabel.Location = new System.Drawing.Point(12, 9);
+ this._nameFieldLabel.Name = "_nameFieldLabel";
+ this._nameFieldLabel.Size = new System.Drawing.Size(38, 13);
+ this._nameFieldLabel.TabIndex = 5;
+ this._nameFieldLabel.Text = "Name:";
+ //
+ // _nameField
+ //
+ this._nameField.Location = new System.Drawing.Point(56, 6);
+ this._nameField.Name = "_nameField";
+ this._nameField.Size = new System.Drawing.Size(209, 20);
+ this._nameField.TabIndex = 4;
+ //
+ // _buttonCancel
+ //
+ this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this._buttonCancel.Location = new System.Drawing.Point(109, 57);
+ this._buttonCancel.Name = "_buttonCancel";
+ this._buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this._buttonCancel.TabIndex = 9;
+ this._buttonCancel.Text = "Cancel";
+ this._buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // _buttonOK
+ //
+ this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonOK.Location = new System.Drawing.Point(190, 57);
+ this._buttonOK.Name = "_buttonOK";
+ this._buttonOK.Size = new System.Drawing.Size(75, 23);
+ this._buttonOK.TabIndex = 8;
+ this._buttonOK.Text = "OK";
+ this._buttonOK.UseVisualStyleBackColor = true;
+ this._buttonOK.Click += new System.EventHandler(this._buttonOK_Click);
+ //
+ // CreateNode
+ //
+ this.AcceptButton = this._buttonOK;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this._buttonCancel;
+ this.ClientSize = new System.Drawing.Size(277, 92);
+ this.Controls.Add(this._buttonCancel);
+ this.Controls.Add(this._buttonOK);
+ this.Controls.Add(this._sizeField);
+ this.Controls.Add(this._sizeFieldLabel);
+ this.Controls.Add(this._nameFieldLabel);
+ this.Controls.Add(this._nameField);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "CreateNode";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.Text = "Create Tag...";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox _sizeField;
+ private System.Windows.Forms.Label _sizeFieldLabel;
+ private System.Windows.Forms.Label _nameFieldLabel;
+ private System.Windows.Forms.TextBox _nameField;
+ private System.Windows.Forms.Button _buttonCancel;
+ private System.Windows.Forms.Button _buttonOK;
+ }
+}
\ No newline at end of file
diff --git a/CreateNode.cs b/CreateNode.cs
new file mode 100644
index 0000000..c5b03f3
--- /dev/null
+++ b/CreateNode.cs
@@ -0,0 +1,182 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Substrate.Nbt;
+
+namespace NBTExplorer
+{
+ public partial class CreateNode : Form
+ {
+ private string _name;
+ private int _size;
+ private TagType _type;
+ private TagNode _tag;
+
+ private bool _hasName;
+
+ private List _invalidNames = new List();
+
+ public CreateNode (TagType tagType)
+ : this(tagType, true)
+ { }
+
+ public CreateNode (TagType tagType, bool hasName)
+ {
+ InitializeComponent();
+
+ _type = tagType;
+ _hasName = hasName;
+
+ SetNameBoxState();
+ SetSizeBoxState();
+ }
+
+ private void SetNameBoxState ()
+ {
+ if (HasName) {
+ _nameFieldLabel.Enabled = true;
+ _nameField.Enabled = true;
+ }
+ else {
+ _nameFieldLabel.Enabled = false;
+ _nameField.Enabled = false;
+ }
+ }
+
+ private void SetSizeBoxState ()
+ {
+ if (IsTagSizedType) {
+ _sizeFieldLabel.Enabled = true;
+ _sizeField.Enabled = true;
+ }
+ else {
+ _sizeFieldLabel.Enabled = false;
+ _sizeField.Enabled = false;
+ }
+ }
+
+ public string TagName
+ {
+ get { return _name; }
+ }
+
+ public TagNode TagNode
+ {
+ get { return _tag; }
+ }
+
+ public List InvalidNames
+ {
+ get { return _invalidNames; }
+ }
+
+ public bool HasName
+ {
+ get { return _hasName; }
+ }
+
+ private void Apply ()
+ {
+ if (ValidateInput()) {
+ _tag = CreateTag();
+
+ DialogResult = DialogResult.OK;
+ Close();
+ return;
+ }
+ }
+
+ private TagNode CreateTag ()
+ {
+ switch (_type) {
+ case TagType.TAG_BYTE:
+ return new TagNodeByte();
+ case TagType.TAG_BYTE_ARRAY:
+ return new TagNodeByteArray(new byte[_size]);
+ case TagType.TAG_COMPOUND:
+ return new TagNodeCompound();
+ case TagType.TAG_DOUBLE:
+ return new TagNodeDouble();
+ case TagType.TAG_FLOAT:
+ return new TagNodeFloat();
+ case TagType.TAG_INT:
+ return new TagNodeInt();
+ case TagType.TAG_INT_ARRAY:
+ return new TagNodeIntArray(new int[_size]);
+ case TagType.TAG_LIST:
+ return new TagNodeList(TagType.TAG_BYTE);
+ case TagType.TAG_LONG:
+ return new TagNodeLong();
+ case TagType.TAG_SHORT:
+ return new TagNodeShort();
+ case TagType.TAG_STRING:
+ return new TagNodeString();
+ default:
+ return new TagNodeByte();
+ }
+ }
+
+ private bool ValidateInput ()
+ {
+ return ValidateNameInput()
+ && ValidateSizeInput();
+ }
+
+ private bool ValidateNameInput ()
+ {
+ if (!HasName)
+ return true;
+
+ string text = _nameField.Text.Trim();
+ if (String.IsNullOrEmpty(text)) {
+ MessageBox.Show("You must provide a nonempty name.");
+ return false;
+ }
+
+ if (_invalidNames.Contains(text)) {
+ MessageBox.Show("Duplicate name provided.");
+ return false;
+ }
+
+ _name = _nameField.Text.Trim();
+ return true;
+ }
+
+ private bool ValidateSizeInput ()
+ {
+ if (!IsTagSizedType)
+ return true;
+
+ if (!Int32.TryParse(_sizeField.Text.Trim(), out _size)) {
+ MessageBox.Show("Size must be a valid integer value.");
+ return false;
+ }
+
+ _size = Math.Max(0, _size);
+ return true;
+ }
+
+ private bool IsTagSizedType
+ {
+ get
+ {
+ switch (_type) {
+ case TagType.TAG_BYTE_ARRAY:
+ case TagType.TAG_INT_ARRAY:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+
+ private void _buttonOK_Click (object sender, EventArgs e)
+ {
+ Apply();
+ }
+ }
+}
diff --git a/CreateNode.resx b/CreateNode.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/CreateNode.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/EditName.Designer.cs b/EditName.Designer.cs
new file mode 100644
index 0000000..b817f36
--- /dev/null
+++ b/EditName.Designer.cs
@@ -0,0 +1,91 @@
+namespace NBTExplorer
+{
+ partial class EditName
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent ()
+ {
+ this._nameField = new System.Windows.Forms.TextBox();
+ this._buttonCancel = new System.Windows.Forms.Button();
+ this._buttonOK = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // _nameField
+ //
+ this._nameField.Location = new System.Drawing.Point(12, 10);
+ this._nameField.Name = "_nameField";
+ this._nameField.Size = new System.Drawing.Size(196, 20);
+ this._nameField.TabIndex = 0;
+ //
+ // _buttonCancel
+ //
+ this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this._buttonCancel.Location = new System.Drawing.Point(52, 37);
+ this._buttonCancel.Name = "_buttonCancel";
+ this._buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this._buttonCancel.TabIndex = 11;
+ this._buttonCancel.Text = "Cancel";
+ this._buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // _buttonOK
+ //
+ this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonOK.Location = new System.Drawing.Point(133, 37);
+ this._buttonOK.Name = "_buttonOK";
+ this._buttonOK.Size = new System.Drawing.Size(75, 23);
+ this._buttonOK.TabIndex = 10;
+ this._buttonOK.Text = "OK";
+ this._buttonOK.UseVisualStyleBackColor = true;
+ this._buttonOK.Click += new System.EventHandler(this._buttonOK_Click);
+ //
+ // EditName
+ //
+ this.AcceptButton = this._buttonOK;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this._buttonCancel;
+ this.ClientSize = new System.Drawing.Size(220, 72);
+ this.Controls.Add(this._buttonCancel);
+ this.Controls.Add(this._buttonOK);
+ this.Controls.Add(this._nameField);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.KeyPreview = true;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "EditName";
+ this.Text = "Edit Name...";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox _nameField;
+ private System.Windows.Forms.Button _buttonCancel;
+ private System.Windows.Forms.Button _buttonOK;
+ }
+}
\ No newline at end of file
diff --git a/EditName.cs b/EditName.cs
new file mode 100644
index 0000000..6c5c485
--- /dev/null
+++ b/EditName.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Substrate.Nbt;
+
+namespace NBTExplorer
+{
+ public partial class EditName : Form
+ {
+ private string _name;
+
+ private List _invalidNames = new List();
+
+ public EditName (String name)
+ {
+ InitializeComponent();
+
+ _name = name;
+
+ _nameField.Text = _name;
+ }
+
+ public String TagName
+ {
+ get { return _name; }
+ }
+
+ public List InvalidNames
+ {
+ get { return _invalidNames; }
+ }
+
+ private void Apply ()
+ {
+ if (ValidateInput()) {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+ }
+
+ private bool ValidateInput ()
+ {
+ return ValidateNameInput();
+ }
+
+ private bool ValidateNameInput ()
+ {
+ string text = _nameField.Text.Trim();
+ if (String.IsNullOrEmpty(text)) {
+ MessageBox.Show("You must provide a nonempty name.");
+ return false;
+ }
+
+ if (_invalidNames.Contains(text)) {
+ MessageBox.Show("Duplicate name provided.");
+ return false;
+ }
+
+ _name = _nameField.Text.Trim();
+ return true;
+ }
+
+ private void _buttonOK_Click (object sender, EventArgs e)
+ {
+ Apply();
+ }
+ }
+}
diff --git a/EditName.resx b/EditName.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/EditName.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/EditString.Designer.cs b/EditString.Designer.cs
new file mode 100644
index 0000000..62a897f
--- /dev/null
+++ b/EditString.Designer.cs
@@ -0,0 +1,92 @@
+namespace NBTExplorer
+{
+ partial class EditString
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent ()
+ {
+ this._stringField = new System.Windows.Forms.TextBox();
+ this._buttonCancel = new System.Windows.Forms.Button();
+ this._buttonOK = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // _stringField
+ //
+ this._stringField.Location = new System.Drawing.Point(12, 12);
+ this._stringField.Multiline = true;
+ this._stringField.Name = "_stringField";
+ this._stringField.Size = new System.Drawing.Size(331, 116);
+ this._stringField.TabIndex = 4;
+ //
+ // _buttonCancel
+ //
+ this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this._buttonCancel.Location = new System.Drawing.Point(187, 134);
+ this._buttonCancel.Name = "_buttonCancel";
+ this._buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this._buttonCancel.TabIndex = 9;
+ this._buttonCancel.Text = "Cancel";
+ this._buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // _buttonOK
+ //
+ this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonOK.Location = new System.Drawing.Point(268, 134);
+ this._buttonOK.Name = "_buttonOK";
+ this._buttonOK.Size = new System.Drawing.Size(75, 23);
+ this._buttonOK.TabIndex = 8;
+ this._buttonOK.Text = "OK";
+ this._buttonOK.UseVisualStyleBackColor = true;
+ this._buttonOK.Click += new System.EventHandler(this._buttonOK_Click);
+ //
+ // EditString
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this._buttonCancel;
+ this.ClientSize = new System.Drawing.Size(355, 169);
+ this.Controls.Add(this._buttonCancel);
+ this.Controls.Add(this._buttonOK);
+ this.Controls.Add(this._stringField);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "EditString";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.Text = "Edit String...";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox _stringField;
+ private System.Windows.Forms.Button _buttonCancel;
+ private System.Windows.Forms.Button _buttonOK;
+ }
+}
\ No newline at end of file
diff --git a/EditString.cs b/EditString.cs
new file mode 100644
index 0000000..f61b976
--- /dev/null
+++ b/EditString.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Substrate.Nbt;
+
+namespace NBTExplorer
+{
+ public partial class EditString : Form
+ {
+ private string _string;
+
+ public EditString (string stringVal)
+ {
+ InitializeComponent();
+
+ _string = stringVal;
+
+ _stringField.Text = _string;
+ }
+
+ public string StringValue
+ {
+ get { return _string; }
+ }
+
+ private void Apply ()
+ {
+ if (ValidateInput()) {
+ DialogResult = DialogResult.OK;
+ Close();
+ return;
+ }
+ }
+
+ private bool ValidateInput ()
+ {
+ return ValidateStringInput();
+ }
+
+ private bool ValidateStringInput ()
+ {
+ _string = _stringField.Text.Trim();
+ return true;
+ }
+
+ private void _buttonOK_Click (object sender, EventArgs e)
+ {
+ Apply();
+ }
+ }
+}
diff --git a/EditString.resx b/EditString.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/EditString.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/EditValue.Designer.cs b/EditValue.Designer.cs
index b64fa14..eeb6d06 100644
--- a/EditValue.Designer.cs
+++ b/EditValue.Designer.cs
@@ -28,23 +28,50 @@
private void InitializeComponent ()
{
this.textBox1 = new System.Windows.Forms.TextBox();
+ this._buttonCancel = new System.Windows.Forms.Button();
+ this._buttonOK = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBox1
//
- this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.textBox1.Location = new System.Drawing.Point(0, 0);
+ this.textBox1.Location = new System.Drawing.Point(12, 10);
this.textBox1.Name = "textBox1";
- this.textBox1.Size = new System.Drawing.Size(246, 20);
+ this.textBox1.Size = new System.Drawing.Size(196, 20);
this.textBox1.TabIndex = 0;
//
+ // _buttonCancel
+ //
+ this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this._buttonCancel.Location = new System.Drawing.Point(52, 37);
+ this._buttonCancel.Name = "_buttonCancel";
+ this._buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this._buttonCancel.TabIndex = 11;
+ this._buttonCancel.Text = "Cancel";
+ this._buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // _buttonOK
+ //
+ this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonOK.Location = new System.Drawing.Point(133, 37);
+ this._buttonOK.Name = "_buttonOK";
+ this._buttonOK.Size = new System.Drawing.Size(75, 23);
+ this._buttonOK.TabIndex = 10;
+ this._buttonOK.Text = "OK";
+ this._buttonOK.UseVisualStyleBackColor = true;
+ this._buttonOK.Click += new System.EventHandler(this._buttonOK_Click);
+ //
// EditValue
//
+ this.AcceptButton = this._buttonOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(246, 20);
+ this.CancelButton = this._buttonCancel;
+ this.ClientSize = new System.Drawing.Size(220, 72);
+ this.Controls.Add(this._buttonCancel);
+ this.Controls.Add(this._buttonOK);
this.Controls.Add(this.textBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
@@ -58,5 +85,7 @@
#endregion
private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Button _buttonCancel;
+ private System.Windows.Forms.Button _buttonOK;
}
}
\ No newline at end of file
diff --git a/EditValue.cs b/EditValue.cs
index 6fe4888..f41cb2f 100644
--- a/EditValue.cs
+++ b/EditValue.cs
@@ -8,25 +8,14 @@ using Substrate.Nbt;
namespace NBTExplorer
{
- public enum EditValueType
- {
- Name,
- Value,
- }
-
public partial class EditValue : Form
{
- private string _name;
private TagNode _tag;
- private EditValueType _type;
-
- private List _invalidNames = new List();
public EditValue (TagNode tag)
{
InitializeComponent();
- _type = EditValueType.Value;
_tag = tag;
if (tag == null) {
@@ -35,78 +24,25 @@ namespace NBTExplorer
return;
}
- SetTitle();
-
textBox1.Text = _tag.ToString();
}
- public EditValue (string name)
- {
- InitializeComponent();
-
- _type = EditValueType.Name;
- _name = name ?? "";
-
- SetTitle();
-
- textBox1.Text = _name.ToString();
- }
-
- public string NodeName
- {
- get { return _name; }
- }
-
public TagNode NodeTag
{
get { return _tag; }
}
- public List InvalidNames
+ private void Apply ()
{
- get { return _invalidNames; }
- }
-
- private void SetTitle ()
- {
- switch (_type) {
- case EditValueType.Name:
- base.Text = "Edit Name...";
- break;
-
- case EditValueType.Value:
- base.Text = "Edit Value...";
- break;
+ if (ValidateInput()) {
+ DialogResult = DialogResult.OK;
+ Close();
}
}
private bool ValidateInput ()
{
- switch (_type) {
- case EditValueType.Name:
- return ValidateNameInput();
- case EditValueType.Value:
- return ValidateValueInput();
- }
-
- return false;
- }
-
- private bool ValidateNameInput ()
- {
- string text = textBox1.Text.Trim();
- if (String.IsNullOrEmpty(text)) {
- MessageBox.Show("You must provide a nonempty name.");
- return false;
- }
-
- if (_invalidNames.Contains(text)) {
- MessageBox.Show("Duplicate name provided.");
- return false;
- }
-
- _name = textBox1.Text.Trim();
- return true;
+ return ValidateValueInput();
}
private bool ValidateValueInput ()
@@ -157,23 +93,9 @@ namespace NBTExplorer
return true;
}
- protected override void OnKeyDown (KeyEventArgs e)
+ private void _buttonOK_Click (object sender, EventArgs e)
{
- switch (e.KeyCode) {
- case Keys.Escape:
- DialogResult = DialogResult.Cancel;
- Close();
- return;
-
- case Keys.Enter:
- if (ValidateInput()) {
- DialogResult = DialogResult.OK;
- Close();
- }
- return;
- }
-
- base.OnKeyDown(e);
+ Apply();
}
}
}
diff --git a/EditValue.resx b/EditValue.resx
index 1af7de1..7080a7d 100644
--- a/EditValue.resx
+++ b/EditValue.resx
@@ -112,9 +112,9 @@
2.0
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
\ No newline at end of file
diff --git a/Form1.Designer.cs b/Form1.Designer.cs
index 6002829..51cd208 100644
--- a/Form1.Designer.cs
+++ b/Form1.Designer.cs
@@ -259,7 +259,7 @@
this.findToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("findToolStripMenuItem.Image")));
this.findToolStripMenuItem.Name = "findToolStripMenuItem";
this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
- this.findToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.findToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.findToolStripMenuItem.Text = "Find...";
this.findToolStripMenuItem.Click += new System.EventHandler(this.findToolStripMenuItem_Click);
//
@@ -268,7 +268,7 @@
this.findNextToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("findNextToolStripMenuItem.Image")));
this.findNextToolStripMenuItem.Name = "findNextToolStripMenuItem";
this.findNextToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3;
- this.findNextToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.findNextToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.findNextToolStripMenuItem.Text = "Find Next";
this.findNextToolStripMenuItem.Click += new System.EventHandler(this.findNextToolStripMenuItem_Click);
//
@@ -285,7 +285,7 @@
this.aboutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("aboutToolStripMenuItem.Image")));
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1;
- this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.aboutToolStripMenuItem.Size = new System.Drawing.Size(126, 22);
this.aboutToolStripMenuItem.Text = "&About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
//
@@ -297,6 +297,7 @@
| System.Windows.Forms.AnchorStyles.Right)));
this._nodeTree.ImageIndex = 0;
this._nodeTree.ImageList = this.imageList1;
+ this._nodeTree.ItemHeight = 18;
this._nodeTree.Location = new System.Drawing.Point(0, 49);
this._nodeTree.Margin = new System.Windows.Forms.Padding(0);
this._nodeTree.Name = "_nodeTree";
diff --git a/Form1.cs b/Form1.cs
index 2d74828..b5bcce0 100644
--- a/Form1.cs
+++ b/Form1.cs
@@ -99,7 +99,7 @@ namespace NBTExplorer
case TagType.TAG_FLOAT:
case TagType.TAG_DOUBLE:
case TagType.TAG_STRING:
- return tag.ToString();
+ return tag.ToString().Replace('\n', (char)0x00B6);
case TagType.TAG_BYTE_ARRAY:
return tag.ToTagByteArray().Length + " bytes";
@@ -910,9 +910,28 @@ namespace NBTExplorer
tag.GetTagType() == TagType.TAG_COMPOUND)
return;
- if (tag.GetTagType() == TagType.TAG_BYTE_ARRAY) {
+ if (tag.GetTagType() == TagType.TAG_STRING) {
+ EditString form = new EditString(tag.ToTagString().Data);
+ if (form.ShowDialog() == DialogResult.OK) {
+ TreeNode baseNode = BaseNode(node);
+ if (baseNode != null) {
+ (baseNode.Tag as DataNode).Modified = true;
+ }
+
+ tag.ToTagString().Data = form.StringValue;
+ node.Text = GetNodeText(node);
+ }
+ }
+ else if (tag.GetTagType() == TagType.TAG_BYTE_ARRAY) {
HexEditor form = new HexEditor(GetTagNodeName(node), tag.ToTagByteArray().Data);
- form.ShowDialog();
+ if (form.ShowDialog() == DialogResult.OK && form.Modified) {
+ TreeNode baseNode = BaseNode(node);
+ if (baseNode != null) {
+ (baseNode.Tag as DataNode).Modified = true;
+ }
+
+ Array.Copy(form.Data, tag.ToTagByteArray().Data, tag.ToTagByteArray().Length);
+ }
}
else if (tag.GetTagType() == TagType.TAG_INT_ARRAY) {
TagNodeIntArray iatag = tag.ToTagIntArray();
@@ -923,7 +942,16 @@ namespace NBTExplorer
}
HexEditor form = new HexEditor(GetTagNodeName(node), data);
- form.ShowDialog();
+ if (form.ShowDialog() == DialogResult.OK && form.Modified) {
+ TreeNode baseNode = BaseNode(node);
+ if (baseNode != null) {
+ (baseNode.Tag as DataNode).Modified = true;
+ }
+
+ for (int i = 0; i < iatag.Length; i++) {
+ iatag.Data[i] = BitConverter.ToInt32(form.Data, i * 4);
+ }
+ }
}
else {
EditValue form = new EditValue(tag);
@@ -961,11 +989,12 @@ namespace NBTExplorer
if (name == null)
return;
- EditValue form = new EditValue(name);
+ EditName form = new EditName(name);
TagNode parentTag = GetParentTagNode(node);
foreach (string key in parentTag.ToTagCompound().Keys) {
- form.InvalidNames.Add(key);
+ if (key != name)
+ form.InvalidNames.Add(key);
}
if (form.ShowDialog() == DialogResult.OK) {
@@ -974,7 +1003,7 @@ namespace NBTExplorer
(baseNode.Tag as DataNode).Modified = true;
}
- SetTagNodeName(node, form.NodeName);
+ SetTagNodeName(node, form.TagName);
node.Text = GetNodeText(node);
}
}
@@ -1004,47 +1033,10 @@ namespace NBTExplorer
tag.ToTagList().Count > 0)
return;
- TagNode newNode = null;
- switch (type) {
- case TagType.TAG_BYTE:
- newNode = new TagNodeByte();
- break;
- case TagType.TAG_SHORT:
- newNode = new TagNodeShort();
- break;
- case TagType.TAG_INT:
- newNode = new TagNodeInt();
- break;
- case TagType.TAG_LONG:
- newNode = new TagNodeLong();
- break;
- case TagType.TAG_FLOAT:
- newNode = new TagNodeFloat();
- break;
- case TagType.TAG_DOUBLE:
- newNode = new TagNodeDouble();
- break;
- case TagType.TAG_BYTE_ARRAY:
- newNode = new TagNodeByteArray();
- break;
- case TagType.TAG_STRING:
- newNode = new TagNodeString();
- break;
- case TagType.TAG_LIST:
- newNode = new TagNodeList(TagType.TAG_BYTE);
- break;
- case TagType.TAG_COMPOUND:
- newNode = new TagNodeCompound();
- break;
- case TagType.TAG_INT_ARRAY:
- newNode = new TagNodeIntArray();
- break;
- }
-
if (tag is TagNodeCompound) {
TagNodeCompound ctag = tag as TagNodeCompound;
- EditValue form = new EditValue("");
+ CreateNode form = new CreateNode(type);
foreach (string key in ctag.Keys) {
form.InvalidNames.Add(key);
}
@@ -1052,15 +1044,27 @@ namespace NBTExplorer
if (form.ShowDialog() != DialogResult.OK)
return;
- ctag.Add(form.NodeName, newNode);
+ ctag.Add(form.TagName, form.TagNode);
- TreeNode tnode = NodeFromTag(newNode, form.NodeName);
+ TreeNode tnode = NodeFromTag(form.TagNode, form.TagName);
node.Nodes.Add(tnode);
_nodeTree.SelectedNode = tnode;
tnode.Expand();
}
else if (tag is TagNodeList) {
+ TagNode newNode;
+ if (TagIsSizedType(type)) {
+ CreateNode form = new CreateNode(type, false);
+ if (form.ShowDialog() != DialogResult.OK)
+ return;
+
+ newNode = form.TagNode;
+ }
+ else {
+ newNode = CreateDefaultTag(type);
+ }
+
TagNodeList ltag = tag as TagNodeList;
if (ltag.ValueType != type)
ltag.ChangeValueType(type);
@@ -1082,6 +1086,47 @@ namespace NBTExplorer
}
}
+ private TagNode CreateDefaultTag (TagType type)
+ {
+ switch (type) {
+ case TagType.TAG_BYTE:
+ return new TagNodeByte();
+ case TagType.TAG_SHORT:
+ return new TagNodeShort();
+ case TagType.TAG_INT:
+ return new TagNodeInt();
+ case TagType.TAG_LONG:
+ return new TagNodeLong();
+ case TagType.TAG_FLOAT:
+ return new TagNodeFloat();
+ case TagType.TAG_DOUBLE:
+ return new TagNodeDouble();
+ case TagType.TAG_BYTE_ARRAY:
+ return new TagNodeByteArray(new byte[0]);
+ case TagType.TAG_STRING:
+ return new TagNodeString();
+ case TagType.TAG_LIST:
+ return new TagNodeList(TagType.TAG_BYTE);
+ case TagType.TAG_COMPOUND:
+ return new TagNodeCompound();
+ case TagType.TAG_INT_ARRAY:
+ return new TagNodeIntArray(new int[0]);
+ default:
+ return new TagNodeByte();
+ }
+ }
+
+ private bool TagIsSizedType (TagType type)
+ {
+ switch (type) {
+ case TagType.TAG_BYTE_ARRAY:
+ case TagType.TAG_INT_ARRAY:
+ return true;
+ default:
+ return false;
+ }
+ }
+
private void _buttonAddTagByte_Click (object sender, EventArgs e)
{
AddTagToNode(_nodeTree.SelectedNode, TagType.TAG_BYTE);
diff --git a/Form1.resx b/Form1.resx
index 56fcd7b..828894b 100644
--- a/Form1.resx
+++ b/Form1.resx
@@ -342,213 +342,212 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAI
- MAAAAk1TRnQBSQFMAgEBDwEAAfgBAAH4AQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABQAMAAQEBAAEYBgABMBIAA/wD+SH4A/kD/AMAA/0D+SH4A/kD/WMAAZYBqQG8AVwBhAGuAVwBhAGu
- AVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGu
- AVwBhAGuAZYBqQG8AwACzwHLArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5
- AbACuQGwArkBsALPActjAAFsAZMBugFVAYgBuwFwAaMB1gFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFn
- AZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFwAaMB1gFVAYgBuwFsAZMBugMAAsEBuQL5AekC8wHi
- AvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvMB4gL5AekCwQG5YwABfgGiAccBcQGk
- AdcBVQGIAbsBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGk
- AdcBVQGIAbsBcQGkAdcBfgGiAccDAALLAcMC9AHkAXoBpwGbAYcBtwGnAYcBtQGjAYkBswGiAWgBoAGG
- AVcBlwF4AVgBkwF5AWgBkAF+AZIBpAGTAYYBlwGAAqgBjgL0AeQCywHDCQAD/gP8BvkD+gb8A/sG+QP8
- A/42AAGGAaoBzQFzAaYB2QFqAZ0B0AFIAXsBrgFfAZIBxQFMAX8BsgFfAZIBxQFMAX8BsgFfAZIBxQFM
- AX8BsgFfAZIBxQFIAXsBrgFqAZ0B0AFzAaYB2QGGAaoBzQMAAs8BxwL1AeYBhAG1AasBmAHXAccBkAHR
- Ab4BcwGwAZkBlwHLAbYBpwHOAb0BlwG9AawBlAG6AagBqQG/Aa8BjgGtAaEBtwGtAYsC9QHmAs8BxwkA
- A/4D/AP5A7MDXAb8A1wDtAP5A/wD/jYAAYsBrQHPAXUBqAHbAWwBnwHSAUoBfQGwAWwBnwHSAVIBhQG4
- AWwBnwHSAVIBhQG4AWwBnwHSAVIBhQG4AWwBnwHSAUoBfQGwAWwBnwHSAXUBqAHbAYsBrQHPAwAC0QHJ
- AvYB6QGQAbwBtQG5AeUB2wGmAd0B0AGIAcABsgGHAckBtQF+Ab4BpAGIAbkBowGuAdABvwGpAccBtQGU
- AboBqAG2AbUBkQL2AekC0QHJDwADywN1A/gGAAP4A3UDyzwAAY8BsQHSAXcBqgHdAW4BoQHUAUcBegGt
- AW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHUAUcBegGtAW4BoQHUAXcBqgHd
- AY8BsQHSAwAC0wHMAvcB6wHFAbgBhwH/Ad4BjAH4AecBrQHVAdEBsAHKAesB4gG9AeUB2QGgAcoBuwGq
- Ac4BrwGCAcEBpAF+AbYCmAGsAYQC9wHrAtMBzAwAA84DfwP5Ad0BswG5AcABSQFaAcABSQFaAd0BswG5
- A/kDfwPOOQABkwG0AdQBeAGrAd4BbwGiAdUBRAF3AaoBbwGiAdUBTAF/AbIBbwGiAdUBTAF/AbIBbwGi
- AdUBTAF/AbIBbwGiAdUBRAF3AaoBbwGiAdUBeAGrAd4BkwG0AdQDAALVAc0C+AHuAdEBrgFpAdsBugFx
- Ad4BvgF0AekByQF8Ab8BzQGoAZUBzAHCAaEBzwG+AZEBxAGvAX8BvQGmAXcBtwGdAagBqgF3AvgB7gLV
- Ac0JAAPQA4YD+QYAAeABtgG8AdEBewGHBgAD+QOGA9A2AAGYAbgB1wF6Aa0B4AFxAaQB1wFBAXQBpwFx
- AaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFBAXQBpwFxAaQB1wF6Aa0B4AGY
- AbgB1wMAAtcBzwL5AfEB0wGsAWYB/wHTAX4B/wHWAYIB4AG+AXQB9gHhAZkBsAHtAeQBrwHRAb8BogHg
- AdMBmAHYAcYBjgHQAboBuAGyAYAC+QHxAtcBzwYAA+8DbAPvCQAB4wG4Ab8B1wGBAY0JAAPvA2wD7zMA
- AZsBugHZAXwBrwHiAXMBpgHZAT8BcgGlAXMBpgHZAUcBegGtAXMBpgHZAUcBegGtAXMBpgHZAUcBegGt
- AXMBpgHZAT8BcgGlAXMBpgHZAXwBrwHiAZsBugHZAwAC2QHRAvsB9AHVAakBYgH/Ac4BeQH/AdIBfQHf
- AboBbwH/AdgBgwHmAeoBvQGmAdgBzQGzAewB4gG5AeQB0AG2AdwBxAGrAb4BlwL7AfQC2QHRCQAD1AOR
- A/kGAAHmAbsBwQHdAYcBkwYAA/kDkQPUNgABnQG9AdsBfgGxAeQBdQGoAdsBOAFrAZ4BUQGEAbcBOAFr
- AZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFrAZ4BdQGoAdsBfgGxAeQBnQG9AdsDAALa
- AdMC/AH3AdcBpwFfAdoBrAFkAdwBsAFnAecBvAFwAeABugFvAeMBvgFzAd8B0QGYAdsBzwGWAdUB0QGc
- AcQBzQGkAZ0B0QHDAvwB9wLaAdMMAAPVA5YD+QHoAb0BwwHdAWYBdwHdAWYBdwHoAb0BwwP5A5YD1TkA
- AaABvgHcAX8BsgHlAWYBmQHMAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHc
- AXYBqQHcAXYBqQHcAWYBmQHMAX8BsgHlAaABvgHcAwAC2wHUAv0B+QHZAaQBXAH/AcQBbwH/AcgBcwHe
- AbABZwH/Ac4BeQH/AdIBfQHkAb4BcgH/AdgBgwHtAeQBqAHiAeYBtgHQAdcBrQL9AfkC2wHUDwAD1wOZ
- A/oGAAP6A5kD1zwAAaMBwAHeAWsBngHRAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHd
- AXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAWsBngHRAaMBwAHeAwAC3QHVAv4B/AHaAaMBWgH/
- Ab8BawH/AcIBbgHeAawBYgH/AckBdAH/Ac0BeAHjAbkBbgH/AdMBfgH/AdcBgwH8Ad4BlQHsAcoBfAL+
- AfwC3QHVEgAD2AOdBgADnQPYPwABpgHDAeABoAHTAfoBmAHLAfUBkwHGAfMBkwHGAfMBkwHGAfMBkwHG
- AfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBmAHLAfUBoAHTAfoBpgHDAeADAALeAdcC/wH+
- AdsBoQFYAdsBogFZAdsBpAFbAdsBpQFdAdsBqQFgAdsBrAFjAdsBrwFmAdsBsQFoAdsBtAFrAdsBtwFu
- AdsBuQFxAv8B/gLeAddjAAHoAe0B8wGoAcQB4QGXAcoB9QGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGS
- AcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGXAcoB9QGoAcQB4QHoAe0B8wMAAt8B2Sf/At8B2WYA
- AegB7QHzAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHi
- AakBxQHiAakBxQHiAegB7QHzBgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
- AuAB2QLgAdkC4AHZAuAB2QLqAebDAAP7A/EBlQGvAbwBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGb
- AbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBlQGvAbwD8QP7FQAS+AP5A/0zAAP8A/kk+AP5
- A/wD/QP6AXcBqAHBAYYBzwHwAYEBywHtAYEBywHtAYEBywHtAYEBywHtAYEBywHtAYEBywHtAYYBzwHw
- AUsBjwGxAYYBzwHwAXcBqAHBAdwB4gHlBv0D+Qz4A/MBiQGlAY8BVQGLAV8BVQGLAV8BVQGLAV8BVQGL
- AV8BVQGLAV8BVQGLAV8BlAGtAZkGAAPAAywDwAMAA/sb+AP7A/cBkwGmAboBYAGIAa8BYAGIAa8BYAGI
- Aa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BkwGm
- AboD9wYAAYYBtQHNAYQBzgHuAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHoAYQBzgHu
- AVcBmwG9AYQBzgHuAfQBtgEuAYYBtQHNAwAClAG4AlUBowJVAaMCVQGjAlUBowJVAaMCVQGjAVUBegGJ
- ATUBvQF5AUMBywGHAT4BxgGCAT4BxgGCAT4BxgGCAUMBywGHAVUBoAFwBgADQAFnAlYDQAMAA/sDYQNe
- A1wDWQNUA0kDPAMvA2wD+wMAAXIBmAG/AXsBrgHgAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHf
- AXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXsBrgHgAXIBmAG/CQABkQG+AdQBhwHQAe8BfwHK
- AekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBhwHQAe8BXwGjAcUBhwHQAe8B/gHJAUEBkQG+
- AdQDAAJVAbQBLwEeAdwBJQETAdgBJQETAdgBJQETAdgBJQETAdgBJQETAdgBVQF+AZUBNwG/AXsBQgHK
- AYYBNwG/AXsBNwG/AXsBNwG/AXsBQgHKAYYBVQGnAXYGAAPLA1UDyycAAYQBpwHLAYEBtAHkAX0BsAHh
- AX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAYEBtAHk
- AYQBpwHLCQABlAHAAdYBigHTAfABggHNAesBggHNAesBggHNAesBggHNAesBggHNAesBggHNAesBigHT
- AfABYgGmAcgBigHTAfAC6QHbAZQBwAHWAwACVQG5AS0BHAHeARUBAAHVARUBAAHVARUBAAHVARUBAAHV
- ARUBAAHVAVUBgQGaATsBwwF/AUgBzwGMATsBwwF/ATsBwwF/ATsBwwF/AUgBzwGMAVUBrQF7NgABigGt
- Ac8BiAG7AeoBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1
- AeUBggG1AeUBiAG7AeoBigGtAc8JAAGYAcMB2AGOAdYB8gGHAdAB7QGHAdAB7QGHAdAB7QGHAdAB7QGH
- AdAB7QGHAdAB7QGOAdYB8gFmAaoBzAGOAdYB8gLwAeYBmAHDAdgDAAJVAb8BNgElAeQBGQEAAdsBGQEA
- AdsBGQEAAdsBGQEAAdsBGQEAAdsBVQGEAaABPgHGAYIBTQHVAZEBPgHGAYIBPgHGAYIBPgHGAYIBTQHV
- AZEBVQGzAYA2AAGOAbAB0QGPAcIB7gGHAboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGH
- AboB6QGHAboB6QGHAboB6QGHAboB6QGPAcIB7gGOAbAB0QkAAZsBxgHaAZIB2gH0AYsB1AHwAYsB1AHw
- AYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAZIB2gH0AWkBrQHPAZIB2gH0AvgB8wGbAcYB2gMAAlUBxAE+
- AS0B7AEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wFVAYYBpAFCAcoBhgFRAdkBlQFCAcoBhgFC
- AcoBhgFCAcoBhgFRAdkBlQFVAbkBhAYAA9ADZwPQJwABkwG0AdQBlgHJAfIBjAG/AewBjAG/AewBjAG/
- AewBRAF3AaoBjAG/AewBRAF3AaoBjAG/AewBjAG/AewBjAG/AewBjAG/AewBlgHJAfIBkwG0AdQJAAGf
- AcgB3QGXAd4B9gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGXAd4B9gF5Ab0B3AF4
- Ab0B3AL+Af0BnwHIAd0DAAJVAcgBRgE1AfIBIAEAAekBIAEAAekBIAEAAekBIAEAAekBIAEAAekBVQGJ
- AagBRAHMAYgBZQHtAakBZQHtAakBZQHtAakBZQHtAakBWAHWAZYBfwHLAaQGAANsAW8CaQNsBgADdQN0
- A3EDbgNsA2gDZQNjA2AGAAGYAbgB1wGbAc4B9gGRAcQB8AGRAcQB8AGRAcQB8AFVAYgBuwFEAXcBqgFV
- AYgBuwFAAXMBpgGRAcQB8AGRAcQB8AGRAcQB8AGbAc4B9gGYAbgB1wkAAaIBygHeAZsB4QH3AZQB2wH0
- AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZ4B5AH5AXwBwAHeAaIBygHeAe4B8wH1
- AwACfwHVAWIBYQHnAXYBdQH+AXYBdQH+AXkBYgGjAXsBUAFVAXsBUAFVAWoBWQE/AWoBbgEyAWoBbgEy
- AWEBiwFRAVUBwQGKAVUBwQGKAVUBwQGKAeIB7wHoBgAD0wNxA9MnAAGbAboB2QGfAdIB+QGVAcgB8wGV
- AcgB8wGVAcgB8wFVAYgBuwFVAYgBuwFVAYgBuwFNAYABswGVAcgB8wGVAcgB8wGVAcgB8wGfAdIB+QGb
- AboB2QkAAaUBzQHgAZ4B5QH5AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2
- AZgB3wH2AaEB6AH6AaUBzQHgBgAC4gHxAlUBzgJVAc4CVQHOAW0BUwF1AdwBqQEyAdcBpAEtAdcBpAEt
- AdcBpAEtAdwBqQEyAbABhgFIQgABnwG9AdsBqQHbAf4BqgHdAf8BqgHdAf8BqgHdAf8BdwGqAd0BdwGq
- Ad0BdwGqAd0BZgGZAcwBqgHdAf8BqgHdAf8BqgHdAf8BqQHbAf4BnwG9AdsJAAGoAc4B4gGjAegB+wGd
- AeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGjAegB+wGoAc4B4hIA
- AbYBiwFFAdwBqQEyAdEBngEnAdEBngEnAdEBngEnAdwBqQEyAbYBiwFFQgABxwHXAecBiAG2AeIBgAGz
- AeYBgAGzAeYBgAGzAeYBTgGBAbQBTgGBAbQBTgGBAbQBSAF7Aa4BgAGzAeYBgAGzAeYBgAGzAeYBiAG2
- AeIBxwHXAecJAAGrAdAB4wGmAesB/AGhAeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGh
- AeYB+wGhAeYB+wGmAesB/AGrAdAB4xIAAbsBkAFBAeEBrgE4AdYBowEsAdYBowEsAdYBowEsAeEBrgE4
- AbsBkAFBEgAD1wN9A9cnAAHjAeoB8QGOAbgB4QGJAbwB7wGIAbsB7gGIAbsB7gFBAXQBpwFBAXQBpwFB
- AXQBpwE+AXEBpAGIAbsB7gGIAbsB7gGJAbwB7wGOAbgB4QHjAeoB8QkAAa4B0gHkAakB7gH9AaQB6QH8
- AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AakB7gH9Aa4B0gHkEgABwAGV
- AT8B5wG0AT0B2gGnATAB2gGnATAB2gGnATAB5wG0AT0BwAGVAT8SAAN/A3cDfwYAA4IDgQN/A34DfAN6
- A3kDdgOrBgAB9QH3AfkBmwG+Ad8BiQG8Ae8BiAG7Ae4BiAG7Ae4BNQFoAZsBNQFoAZsBNQFoAZsBNQFo
- AZsBiAG7Ae4BiAG7Ae4BiQG8Ae8BmwG+Ad8B9QH3AfkJAAGwAdQB5gGsAfEB/wGnAewB/gGnAewB/gGn
- AewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGsAfEB/wGwAdQB5hIAAcYBmgE9AesBuAFB
- Ad0BqgEzAd0BqgEzAd0BqgEzAesBuAFBAcYBmgE9EgAD2AOCA9gnAAP+AcsB2gHqAakBxQHiAakBxQHi
- AakBxQHiAVUBfQGmAVUBfQGmAVUBfQGmAVUBfQGmAakBxQHiAakBxQHiAakBxQHiAcsB2gHqA/4JAAGy
- AdUB5gGxAfUB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGx
- AfUB/wGyAdUB5hIAAdQBswFsAecBuAFGAf4BywFUAf4BywFUAf4BywFUAecBuAFGAdQBswFsdQAB0AHk
- Ae4BswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHW
- AecB0AHkAe4SAAHwAesB3gHNAaABOQHNAaABOQHNAaABOQHNAaABOQHNAaABOQHwAesB3g8AA/sD8QLI
- AcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGw
- ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/tgAAP9A/oCwAG4C/8D/gH9
- Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5
- AsABuAP6A/1mAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+
- Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcFsAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6
- AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1
- As8BxwwAA/4D/Ab5A/oG/AP7BvkD/AP+BgAD/QP8A/oe+AP6A/wD/QYAAtAByAL/Af4C/QH8Av0B+wG/
- AUgBrgHsAc4B5QL6AfYC+AH0AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8AekBzwHrAa4BSAG/
- Aa4BSAG/Aa4BSAG/AdMBoQHaAvcB8gL2AfAC+gHzAtAByAwAA/4D/AP5A7MDXAb8A1wDtAP5A/wD/gYA
- A/0DhAM0A4QD+APiBjQDhAPiA3UDpAP4A4QDNAPpBgAC0gHLAv4D/QH7AvwB+QHGAU8BtQHsAc8B5QL4
- AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wHqAdEB7QG1AU8BxgL6AfYB5wHOAegBtQFP
- AcYB7gHhAesC9QHuAvoB8gLSAcsSAAPLA3UD+AYAA/gDdQPLEgADeQP1BgADqgN5BgADywO+A+4DqgPC
- CQAC1QHNAv4D/AH5AvsB+AHOAVcBvQHOAVcBvQHOAVcBvQHiAaYB1gL1Ae4C9AHsAvkB7wLVAc0MAALV
- Ac0C/gP8AfkB6wHSAe0BvQFXAc4C+AH0AvcB8gG9AVcBzgHnAc0B5QL0AewC+QHvAtUBzQ8AA84DfwP5
- DAAD+QN/A84PAAPGDGADxgYAA/UJYAPpCQAC1gHOAv0D+wH4AvoB9gHWAV8BxQHvAdEB5gL2AfAC9QHu
- AvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AHsAdMB7gHFAV8B1gL3AfIB6gHRAeoBxQFfAdYB7QHh
- AekC8QHnAvcB6gLWAc4MAAPQA4YD+RIAA/kDhgPQDAAD9QOUA+8D0QNoA/UJAAOTA+8DaAwAAtgB0AL9
- A/oB9gL4AfQB3AFlAcsB3AFlAcsB3AFlAcsB4gGJAdMC8QHnAuwB3wL0AeUC2AHQDAAC2AHQAv0D+gH2
- Ae0B0wHuAcsBZQHcAcsBZQHcAcsBZQHcAd8BrAHjAvEB5wLsAd8C9AHlAtgB0AkAA+8DbAPvGAAD7wNs
- A+8MAAOPA/YDtwOPDAADzAN9A8wMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
- AvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAAPU
- A5ED+RIAA/kDkQPUDwADzgPVA3cDzgwAA+wDdwPsDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
- Ad8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLy
- AeEC2wHTDwAD1QOWA/kMAAP5A5YD1RIAA/YDogN+A/YhAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHf
- AugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHU
- AvIB4QLcAdUSAAPXA5kD+gYAA/oDmQPXGAAGnCQAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLm
- AdUCpAGTAqQBkwKkAZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGT
- AqQBkwLJAcAVAAPYA50GAAOdA9hFAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/
- At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/At4B1wL3AfZsAALf
- AdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHq
- AvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9m8AAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
- AdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9mwAA/sD8QLI
- AcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGw
- ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGwArgBsAK4
- AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGwArgBsAK4AbACuAGw
- ArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/sD/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8
- AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4
- C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8
- AfgC/gH5AsABuAP6A/0GAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJ
- AcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5
- AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJ
- AcEMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9
- AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4
- AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7
- AfUCzwHHDAAC0AHIAv8B/gL9AfwB3AHPAesBewFIAb8BewFIAb8BewFIAb8BiwFeAcYB6AHhAesC9gHw
- AvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBggHCAbQBWQGuAZ0BWQGuAZ0BqQHTAcgC9wHyAvYB8AL6
- AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7Ad4BogGpAb8BSAFZAb8BSAFZAdwBoAGmAvcB8gL2AfAC+gHz
- AtAByAwAAtAByAL/Af4C/QH8Av0B+wG/AXsBSAG/AXsBSAG/AXsBSAHcAboBngL3AfIC9gHwAvoB8wLQ
- AcgMAALSAcsC/gP9AfsB3QHRAe0BggFPAcYC+gH2AvgB9AGCAU8BxgHZAcwB5QL1Ae4C+gHyAtIBywwA
- AtIBywL+A/0B+wL8AfkC+wH4AvoB9gHSAegB4AFgAbUBpAL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9
- AfsC/AH5AvsB+AHgAaUBqwHTAXoBhQL3AfIC9gHwAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7AvwB+QHG
- AYIBTwHsAdsBzAL4AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtUBzQL+A/wB+QHfAdIB7QGKAVcBzgGY
- AWwB0wGKAVcBzgGlAX8B1wHnAeEB6QL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgBsgHcAdIBaAG9
- AawBaAG9AawBrgHZAc0C9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5AvsB+AL6AfYB4wGoAa4B2QF/
- AYsC9gHwAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgBzgGKAVcB7gHdAcwC9wHyAvYB8AL1
- Ae4C9AHsAvkB7wLVAc0MAALWAc4C/QP7AfgB4AHTAe4BkgFfAdYC9wHyAd0B0AHpAZIBXwHWAvQB7ALx
- AecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYBcAHFAbQB1QHrAeIC9gHwAvUB7gL0AewC8QHnAvcB6gLW
- Ac4MAALWAc4C/QP7AfgC+gH2AvgB9AHnAasBsQHeAYUBkAL1Ae4C9AHsAvEB5wL3AeoC1gHODAAC1gHO
- Av0D+wH4AvoB9gHWAZIBXwHvAd4BzQL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtgB0AL9A/oB9gHg
- AdMB7gGYAWUB3AGYAWUB3AGYAWUB3AHFAawB4wLxAecC7AHfAvQB5QLYAdAMAALYAdAC/QP6AfYC+AH0
- AbcB4QHVAXYBywG6AXYBywG6AZUB1QHGAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4AfQB6gGv
- AbQB3AFlAXYB3AFlAXYB6AGsAbEC8QHnAuwB3wL0AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AHcAZgBZQHv
- Ad4BzQL1Ae4C9AHsAvEB5wLsAd8C9AHlAtgB0AwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHn
- AuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHi
- AtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8
- A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtsB0wL8A/cB8gL2AfAC9QHu
- AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAG
+ MAAAAk1TRnQBSQFMAgEBDwIAAQEBAAEBARABAAEQAQAE/wEZAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA
+ AUADAAEBAQABGAYAATASAAP8A/kh+AP5A/wDAAP9A/kh+AP5A/1jAAGWAakBvAFcAYQBrgFcAYQBrgFc
+ AYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFc
+ AYQBrgGWAakBvAMAAs8BywK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGw
+ ArkBsAK5AbACzwHLYwABbAGTAboBVQGIAbsBcAGjAdYBZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGa
+ Ac0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BcAGjAdYBVQGIAbsBbAGTAboDAALBAbkC+QHpAvMB4gLz
+ AeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC+QHpAsEBuWMAAX4BogHHAXEBpAHX
+ AVUBiAG7AXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHX
+ AVUBiAG7AXEBpAHXAX4BogHHAwACywHDAvQB5AF6AacBmwGHAbcBpwGHAbUBowGJAbMBogFoAaABhgFX
+ AZcBeAFYAZMBeQFoAZABfgGSAaQBkwGGAZcBgAKoAY4C9AHkAssBwwkAA/4D/Ab5A/oG/AP7BvkD/AP+
+ NgABhgGqAc0BcwGmAdkBagGdAdABSAF7Aa4BXwGSAcUBTAF/AbIBXwGSAcUBTAF/AbIBXwGSAcUBTAF/
+ AbIBXwGSAcUBSAF7Aa4BagGdAdABcwGmAdkBhgGqAc0DAALPAccC9QHmAYQBtQGrAZgB1wHHAZAB0QG+
+ AXMBsAGZAZcBywG2AacBzgG9AZcBvQGsAZQBugGoAakBvwGvAY4BrQGhAbcBrQGLAvUB5gLPAccJAAP+
+ A/wD+QOzA1wG/ANcA7QD+QP8A/42AAGLAa0BzwF1AagB2wFsAZ8B0gFKAX0BsAFsAZ8B0gFSAYUBuAFs
+ AZ8B0gFSAYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFKAX0BsAFsAZ8B0gF1AagB2wGLAa0BzwMAAtEByQL2
+ AekBkAG8AbUBuQHlAdsBpgHdAdABiAHAAbIBhwHJAbUBfgG+AaQBiAG5AaMBrgHQAb8BqQHHAbUBlAG6
+ AagBtgG1AZEC9gHpAtEByQ8AA8sDdQP4BgAD+AN1A8s8AAGPAbEB0gF3AaoB3QFuAaEB1AFHAXoBrQFu
+ AaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFHAXoBrQFuAaEB1AF3AaoB3QGP
+ AbEB0gMAAtMBzAL3AesBxQG4AYcB/wHeAYwB+AHnAa0B1QHRAbABygHrAeIBvQHlAdkBoAHKAbsBqgHO
+ Aa8BggHBAaQBfgG2ApgBrAGEAvcB6wLTAcwMAAPOA38D+QHdAbMBuQHAAUkBWgHAAUkBWgHdAbMBuQP5
+ A38DzjkAAZMBtAHUAXgBqwHeAW8BogHVAUQBdwGqAW8BogHVAUwBfwGyAW8BogHVAUwBfwGyAW8BogHV
+ AUwBfwGyAW8BogHVAUQBdwGqAW8BogHVAXgBqwHeAZMBtAHUAwAC1QHNAvgB7gHRAa4BaQHbAboBcQHe
+ Ab4BdAHpAckBfAG/Ac0BqAGVAcwBwgGhAc8BvgGRAcQBrwF/Ab0BpgF3AbcBnQGoAaoBdwL4Ae4C1QHN
+ CQAD0AOGA/kGAAHgAbYBvAHRAXsBhwYAA/kDhgPQNgABmAG4AdcBegGtAeABcQGkAdcBQQF0AacBcQGk
+ AdcBSQF8Aa8BcQGkAdcBSQF8Aa8BcQGkAdcBSQF8Aa8BcQGkAdcBQQF0AacBcQGkAdcBegGtAeABmAG4
+ AdcDAALXAc8C+QHxAdMBrAFmAf8B0wF+Af8B1gGCAeABvgF0AfYB4QGZAbAB7QHkAa8B0QG/AaIB4AHT
+ AZgB2AHGAY4B0AG6AbgBsgGAAvkB8QLXAc8GAAPvA2wD7wkAAeMBuAG/AdcBgQGNCQAD7wNsA+8zAAGb
+ AboB2QF8Aa8B4gFzAaYB2QE/AXIBpQFzAaYB2QFHAXoBrQFzAaYB2QFHAXoBrQFzAaYB2QFHAXoBrQFz
+ AaYB2QE/AXIBpQFzAaYB2QF8Aa8B4gGbAboB2QMAAtkB0QL7AfQB1QGpAWIB/wHOAXkB/wHSAX0B3wG6
+ AW8B/wHYAYMB5gHqAb0BpgHYAc0BswHsAeIBuQHkAdABtgHcAcQBqwG+AZcC+wH0AtkB0QkAA9QDkQP5
+ BgAB5gG7AcEB3QGHAZMGAAP5A5ED1DYAAZ0BvQHbAX4BsQHkAXUBqAHbATgBawGeAVEBhAG3ATgBawGe
+ AVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAXUBqAHbAX4BsQHkAZ0BvQHbAwAC2gHT
+ AvwB9wHXAacBXwHaAawBZAHcAbABZwHnAbwBcAHgAboBbwHjAb4BcwHfAdEBmAHbAc8BlgHVAdEBnAHE
+ Ac0BpAGdAdEBwwL8AfcC2gHTDAAD1QOWA/kB6AG9AcMB3QFmAXcB3QFmAXcB6AG9AcMD+QOWA9U5AAGg
+ Ab4B3AF/AbIB5QFmAZkBzAF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2
+ AakB3AF2AakB3AFmAZkBzAF/AbIB5QGgAb4B3AMAAtsB1AL9AfkB2QGkAVwB/wHEAW8B/wHIAXMB3gGw
+ AWcB/wHOAXkB/wHSAX0B5AG+AXIB/wHYAYMB7QHkAagB4gHmAbYB0AHXAa0C/QH5AtsB1A8AA9cDmQP6
+ BgAD+gOZA9c8AAGjAcAB3gFrAZ4B0QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3
+ AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QFrAZ4B0QGjAcAB3gMAAt0B1QL+AfwB2gGjAVoB/wG/
+ AWsB/wHCAW4B3gGsAWIB/wHJAXQB/wHNAXgB4wG5AW4B/wHTAX4B/wHXAYMB/AHeAZUB7AHKAXwC/gH8
+ At0B1RIAA9gDnQYAA50D2D8AAaYBwwHgAaAB0wH6AZgBywH1AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHz
+ AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZgBywH1AaAB0wH6AaYBwwHgAwAC3gHXAv8B/gHb
+ AaEBWAHbAaIBWQHbAaQBWwHbAaUBXQHbAakBYAHbAawBYwHbAa8BZgHbAbEBaAHbAbQBawHbAbcBbgHb
+ AbkBcQL/Af4C3gHXYwAB6AHtAfMBqAHEAeEBlwHKAfUBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHF
+ AfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBlwHKAfUBqAHEAeEB6AHtAfMDAALfAdkn/wLfAdlmAAHo
+ Ae0B8wGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGp
+ AcUB4gGpAcUB4gHoAe0B8wYAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
+ AdkC4AHZAuAB2QLgAdkC6gHmwwAD+wPxAZUBrwG8AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2
+ AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AZUBrwG8A/ED+xUAEvgD+QP9MwAD/AP5JPgD+QP8
+ A/0D+gF3AagBwQGGAc8B8AGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGGAc8B8AFL
+ AY8BsQGGAc8B8AF3AagBwQHcAeIB5Qb9A/kM+APzAYkBpQGPAVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFf
+ AVUBiwFfAVUBiwFfAZQBrQGZBgADwAMsA8ADAAP7G/gD+wP3AZMBpgG6AWABiAGvAWABiAGvAWABiAGv
+ AWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAZMBpgG6
+ A/cGAAGGAbUBzQGEAc4B7gF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8AccB6AGEAc4B7gFX
+ AZsBvQGEAc4B7gH0AbYBLgGGAbUBzQMAApQBuAJVAaMCVQGjAlUBowJVAaMCVQGjAlUBowFVAXoBiQE1
+ Ab0BeQFDAcsBhwE+AcYBggE+AcYBggE+AcYBggFDAcsBhwFVAaABcAYAA0ABZwJWA0ADAAP7A2EDXgNc
+ A1kDVANJAzwDLwNsA/sDAAFyAZgBvwF7Aa4B4AF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6
+ Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF7Aa4B4AFyAZgBvwkAAZEBvgHUAYcB0AHvAX8BygHp
+ AX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAYcB0AHvAV8BowHFAYcB0AHvAf4ByQFBAZEBvgHU
+ AwACVQG0AS8BHgHcASUBEwHYASUBEwHYASUBEwHYASUBEwHYASUBEwHYAVUBfgGVATcBvwF7AUIBygGG
+ ATcBvwF7ATcBvwF7ATcBvwF7AUIBygGGAVUBpwF2BgADywNVA8snAAGEAacBywGBAbQB5AF9AbAB4QF9
+ AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QGBAbQB5AGE
+ AacBywkAAZQBwAHWAYoB0wHwAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHrAYoB0wHw
+ AWIBpgHIAYoB0wHwAukB2wGUAcAB1gMAAlUBuQEtARwB3gEVAQAB1QEVAQAB1QEVAQAB1QEVAQAB1QEV
+ AQAB1QFVAYEBmgE7AcMBfwFIAc8BjAE7AcMBfwE7AcMBfwE7AcMBfwFIAc8BjAFVAa0BezYAAYoBrQHP
+ AYgBuwHqAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHl
+ AYIBtQHlAYgBuwHqAYoBrQHPCQABmAHDAdgBjgHWAfIBhwHQAe0BhwHQAe0BhwHQAe0BhwHQAe0BhwHQ
+ Ae0BhwHQAe0BjgHWAfIBZgGqAcwBjgHWAfIC8AHmAZgBwwHYAwACVQG/ATYBJQHkARkBAAHbARkBAAHb
+ ARkBAAHbARkBAAHbARkBAAHbAVUBhAGgAT4BxgGCAU0B1QGRAT4BxgGCAT4BxgGCAT4BxgGCAU0B1QGR
+ AVUBswGANgABjgGwAdEBjwHCAe4BhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6
+ AekBhwG6AekBhwG6AekBhwG6AekBjwHCAe4BjgGwAdEJAAGbAcYB2gGSAdoB9AGLAdQB8AGLAdQB8AGL
+ AdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGSAdoB9AFpAa0BzwGSAdoB9AL4AfMBmwHGAdoDAAJVAcQBPgEt
+ AewBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBVQGGAaQBQgHKAYYBUQHZAZUBQgHKAYYBQgHK
+ AYYBQgHKAYYBUQHZAZUBVQG5AYQGAAPQA2cD0CcAAZMBtAHUAZYByQHyAYwBvwHsAYwBvwHsAYwBvwHs
+ AUQBdwGqAYwBvwHsAUQBdwGqAYwBvwHsAYwBvwHsAYwBvwHsAYwBvwHsAZYByQHyAZMBtAHUCQABnwHI
+ Ad0BlwHeAfYBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBlwHeAfYBeQG9AdwBeAG9
+ AdwC/gH9AZ8ByAHdAwACVQHIAUYBNQHyASABAAHpASABAAHpASABAAHpASABAAHpASABAAHpAVUBiQGo
+ AUQBzAGIAWUB7QGpAWUB7QGpAWUB7QGpAWUB7QGpAVgB1gGWAX8BywGkBgADbAFvAmkDbAYAA3UDdANx
+ A24DbANoA2UDYwNgBgABmAG4AdcBmwHOAfYBkQHEAfABkQHEAfABkQHEAfABVQGIAbsBRAF3AaoBVQGI
+ AbsBQAFzAaYBkQHEAfABkQHEAfABkQHEAfABmwHOAfYBmAG4AdcJAAGiAcoB3gGbAeEB9wGUAdsB9AGU
+ AdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGeAeQB+QF8AcAB3gGiAcoB3gHuAfMB9QMA
+ An8B1QFiAWEB5wF2AXUB/gF2AXUB/gF5AWIBowF7AVABVQF7AVABVQFqAVkBPwFqAW4BMgFqAW4BMgFh
+ AYsBUQFVAcEBigFVAcEBigFVAcEBigHiAe8B6AYAA9MDcQPTJwABmwG6AdkBnwHSAfkBlQHIAfMBlQHI
+ AfMBlQHIAfMBVQGIAbsBVQGIAbsBVQGIAbsBTQGAAbMBlQHIAfMBlQHIAfMBlQHIAfMBnwHSAfkBmwG6
+ AdkJAAGlAc0B4AGeAeUB+QGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGY
+ Ad8B9gGhAegB+gGlAc0B4AYAAuIB8QJVAc4CVQHOAlUBzgFtAVMBdQHcAakBMgHXAaQBLQHXAaQBLQHX
+ AaQBLQHcAakBMgGwAYYBSEIAAZ8BvQHbAakB2wH+AaoB3QH/AaoB3QH/AaoB3QH/AXcBqgHdAXcBqgHd
+ AXcBqgHdAWYBmQHMAaoB3QH/AaoB3QH/AaoB3QH/AakB2wH+AZ8BvQHbCQABqAHOAeIBowHoAfsBnQHj
+ AfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBowHoAfsBqAHOAeISAAG2
+ AYsBRQHcAakBMgHRAZ4BJwHRAZ4BJwHRAZ4BJwHcAakBMgG2AYsBRUIAAccB1wHnAYgBtgHiAYABswHm
+ AYABswHmAYABswHmAU4BgQG0AU4BgQG0AU4BgQG0AUgBewGuAYABswHmAYABswHmAYABswHmAYgBtgHi
+ AccB1wHnCQABqwHQAeMBpgHrAfwBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHm
+ AfsBoQHmAfsBpgHrAfwBqwHQAeMSAAG7AZABQQHhAa4BOAHWAaMBLAHWAaMBLAHWAaMBLAHhAa4BOAG7
+ AZABQRIAA9cDfQPXJwAB4wHqAfEBjgG4AeEBiQG8Ae8BiAG7Ae4BiAG7Ae4BQQF0AacBQQF0AacBQQF0
+ AacBPgFxAaQBiAG7Ae4BiAG7Ae4BiQG8Ae8BjgG4AeEB4wHqAfEJAAGuAdIB5AGpAe4B/QGkAekB/AGk
+ AekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGpAe4B/QGuAdIB5BIAAcABlQE/
+ AecBtAE9AdoBpwEwAdoBpwEwAdoBpwEwAecBtAE9AcABlQE/EgADfwN3A38GAAOCA4EDfwN+A3wDegN5
+ A3YDqwYAAfUB9wH5AZsBvgHfAYkBvAHvAYgBuwHuAYgBuwHuATUBaAGbATUBaAGbATUBaAGbATUBaAGb
+ AYgBuwHuAYgBuwHuAYkBvAHvAZsBvgHfAfUB9wH5CQABsAHUAeYBrAHxAf8BpwHsAf4BpwHsAf4BpwHs
+ Af4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BrAHxAf8BsAHUAeYSAAHGAZoBPQHrAbgBQQHd
+ AaoBMwHdAaoBMwHdAaoBMwHrAbgBQQHGAZoBPRIAA9gDggPYJwAD/gHLAdoB6gGpAcUB4gGpAcUB4gGp
+ AcUB4gFVAX0BpgFVAX0BpgFVAX0BpgFVAX0BpgGpAcUB4gGpAcUB4gGpAcUB4gHLAdoB6gP+CQABsgHV
+ AeYBsQH1Af8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BsQH1
+ Af8BsgHVAeYSAAHUAbMBbAHnAbgBRgH+AcsBVAH+AcsBVAH+AcsBVAHnAbgBRgHUAbMBbHUAAdAB5AHu
+ AbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHn
+ AdAB5AHuEgAB8AHrAd4BzQGgATkBzQGgATkBzQGgATkBzQGgATkBzQGgATkB8AHrAd4PAAP7A/ECyAHD
+ ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4
+ AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7YAAD/QP6AsABuAv/A/4B/QL+
+ AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLA
+ AbgD+gP9ZgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9
+ AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBbAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
+ AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLP
+ AccMAAP+A/wG+QP6BvwD+wb5A/wD/gYAA/0D/AP6HvgD+gP8A/0GAALQAcgC/wH+Av0B/AL9AfsBvwFI
+ Aa4B7AHOAeUC+gH2AvgB9AL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AHpAc8B6wGuAUgBvwGu
+ AUgBvwGuAUgBvwHTAaEB2gL3AfIC9gHwAvoB8wLQAcgMAAP+A/wD+QOzA1wG/ANcA7QD+QP8A/4GAAP9
+ A4QDNAOEA/gD4gY0A4QD4gN1A6QD+AOEAzQD6QYAAtIBywL+A/0B+wL8AfkBxgFPAbUB7AHPAeUC+AH0
+ AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsB6gHRAe0BtQFPAcYC+gH2AecBzgHoAbUBTwHG
+ Ae4B4QHrAvUB7gL6AfIC0gHLEgADywN1A/gGAAP4A3UDyxIAA3kD9QYAA6oDeQYAA8sDvgPuA6oDwgkA
+ AtUBzQL+A/wB+QL7AfgBzgFXAb0BzgFXAb0BzgFXAb0B4gGmAdYC9QHuAvQB7AL5Ae8C1QHNDAAC1QHN
+ Av4D/AH5AesB0gHtAb0BVwHOAvgB9AL3AfIBvQFXAc4B5wHNAeUC9AHsAvkB7wLVAc0PAAPOA38D+QwA
+ A/kDfwPODwADxgxgA8YGAAP1CWAD6QkAAtYBzgL9A/sB+AL6AfYB1gFfAcUB7wHRAeYC9gHwAvUB7gL0
+ AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgB7AHTAe4BxQFfAdYC9wHyAeoB0QHqAcUBXwHWAe0B4QHp
+ AvEB5wL3AeoC1gHODAAD0AOGA/kSAAP5A4YD0AwAA/UDlAPvA9EDaAP1CQADkwPvA2gMAALYAdAC/QP6
+ AfYC+AH0AdwBZQHLAdwBZQHLAdwBZQHLAeIBiQHTAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9A/oB9gHt
+ AdMB7gHLAWUB3AHLAWUB3AHLAWUB3AHfAawB4wLxAecC7AHfAvQB5QLYAdAJAAPvA2wD7xgAA+8DbAPv
+ DAADjwP2A7cDjwwAA8wDfQPMDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLz
+ AeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAD1AOR
+ A/kSAAP5A5ED1A8AA84D1QN3A84MAAPsA3cD7AwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf
AugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHh
- AtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtwB1QL7
- A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHs
- AvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
- AuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHh
- AtwB1QwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHW
- AvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0
- AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHf
- AugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2
- AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2
- DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0
- AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLz
- AeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGx
- At8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZ
- AvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAuoB5gLgAdkC4AHZAuAB2QLg
- AdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
- AvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZ
- AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9gwAAUIBTQE+BwABPgMAASgDAAFAAwABQAMAAQEBAAEB
- BgABAhYAA/8CAAEBAQABAQL/AwABAQEAAQEC/wMAAQEBAAEBAv8DAAEBAQABAQHAAQMDAAEBAQABAQHA
- AQMDAAEBAQABAQHxAY8DAAEBAQABAQHgAQcDAAEBAQABAQHGAWMDAAEBAQABAQGOAXEDAAEBAQABAQHG
- AWMDAAEBAQABAQHgAQcDAAEBAQABAQHxAY8DAAEBAQABAQH5AZ8DAAEBAQABAQL/AwABAQEAAQEC/wIA
- AYABAwEAAQEC/wIABP8CAAH+AQEC/wUAAQEBiAMAAcABAQEAAQEBiAEAAYABAQHAAQEBAAEBAY8B/wGA
- AQEBwAEBAQABAQL/AYABAQHAAQEBAAEBAv8BgAEBAcABAQEAAQEBjwH/AYABAQHAAQEBAAEBAYwBAQGA
- AQEBwAEBAQABAQGPAf8BgAEBAcABAwEAAR8C/wGAAQEBwAEDAfABHwL/AYABAQHAAQMB8AEfAY8B/wGA
- AQEBwAEDAfABHwGMAQEBgAEBAcABAwHwAR8BjwH/AYABAQHAAQMB8AEfBP8BwAEDAfABHwQABP8EAAT/
- AcABAwHAAQME/wHAAQMBwAEDAcABAwIAAcABAwHAAQMBwAEDAgABwAEDAcABAwHxAY8BzAHBAcABAwHA
- AQMB4wHHAcABwQHAAQMBwAEDAccB4wHAAeMBwAEDAcABAwGPAfEB4QHjAcABAwHAAQMBxwHjAeEB4wHA
- AQMBwAEDAeMBxwHhAf8BwAEDAcABAwHxAY8B8wH/AcABAwHAAQMB+QGfAv8BwAEDAcABAwT/AcABBwHA
- AQcE/wHAAQ8BwAEPBP8QAAHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
- AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
- AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
- AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQcBwAEHAcABBwHAAQcBwAEPAcABDwHAAQ8BwAEP
- Cw==
+ AtsB0w8AA9UDlgP5DAAD+QOWA9USAAP2A6IDfgP2IQAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLo
+ AdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALy
+ AeEC3AHVEgAD1wOZA/oGAAP6A5kD1xgABpwkAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHV
+ AqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKk
+ AZMCyQHAFQAD2AOdBgADnQPYRQAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLe
+ AdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2bAAC3wHZ
+ AvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0
+ AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfZvAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
+ AuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfZsAAP7A/ECyAHD
+ ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4
+ AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGw
+ ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4
+ AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7A/0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4
+ Av4B+QLAAbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/
+ A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4
+ Av4B+QLAAbgD+gP9BgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHB
+ Bv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7
+ AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHB
+ DAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8
+ Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6
+ AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1
+ As8BxwwAAtAByAL/Af4C/QH8AdwBzwHrAXsBSAG/AXsBSAG/AXsBSAG/AYsBXgHGAegB4QHrAvYB8AL6
+ AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7AYIBwgG0AVkBrgGdAVkBrgGdAakB0wHIAvcB8gL2AfAC+gHz
+ AtAByAwAAtAByAL/Af4C/QH8Av0B+wHeAaIBqQG/AUgBWQG/AUgBWQHcAaABpgL3AfIC9gHwAvoB8wLQ
+ AcgMAALQAcgC/wH+Av0B/AL9AfsBvwF7AUgBvwF7AUgBvwF7AUgB3AG6AZ4C9wHyAvYB8AL6AfMC0AHI
+ DAAC0gHLAv4D/QH7Ad0B0QHtAYIBTwHGAvoB9gL4AfQBggFPAcYB2QHMAeUC9QHuAvoB8gLSAcsMAALS
+ AcsC/gP9AfsC/AH5AvsB+AL6AfYB0gHoAeABYAG1AaQC9gHwAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7
+ AvwB+QL7AfgB4AGlAasB0wF6AYUC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wL8AfkBxgGC
+ AU8B7AHbAcwC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALVAc0C/gP8AfkB3wHSAe0BigFXAc4BmAFs
+ AdMBigFXAc4BpQF/AdcB5wHhAekC9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4AbIB3AHSAWgBvQGs
+ AWgBvQGsAa4B2QHNAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgC+gH2AeMBqAGuAdkBfwGL
+ AvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4Ac4BigFXAe4B3QHMAvcB8gL2AfAC9QHu
+ AvQB7AL5Ae8C1QHNDAAC1gHOAv0D+wH4AeAB0wHuAZIBXwHWAvcB8gHdAdAB6QGSAV8B1gL0AewC8QHn
+ AvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AXABxQG0AdUB6wHiAvYB8AL1Ae4C9AHsAvEB5wL3AeoC1gHO
+ DAAC1gHOAv0D+wH4AvoB9gL4AfQB5wGrAbEB3gGFAZAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9
+ A/sB+AL6AfYB1gGSAV8B7wHeAc0C9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALYAdAC/QP6AfYB4AHT
+ Ae4BmAFlAdwBmAFlAdwBmAFlAdwBxQGsAeMC8QHnAuwB3wL0AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AG3
+ AeEB1QF2AcsBugF2AcsBugGVAdUBxgLxAecC7AHfAvQB5QLYAdAMAALYAdAC/QP6AfYC+AH0AeoBrwG0
+ AdwBZQF2AdwBZQF2AegBrAGxAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4AfQB3AGYAWUB7wHe
+ Ac0C9QHuAvQB7ALxAecC7AHfAvQB5QLYAdAMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
+ Ad8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLa
+ AdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4
+ AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALbAdMC/AP3AfIC9gHwAvUB7gL0
+ AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLo
+ AdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLb
+ AdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALcAdUC+wP2
+ AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALx
+ AecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLm
+ AdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLc
+ AdUMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6
+ AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHs
+ AvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLo
+ AdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGl
+ A/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwA
+ At4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHs
+ AvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHi
+ AvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLf
+ AdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8
+ AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALqAeYC4AHZAuAB2QLgAdkC4AHZ
+ AuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3
+ AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLg
+ AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYMAAFCAU0BPgcAAT4DAAEoAwABQAMAAUADAAEBAQABAQYA
+ AQIWAAP/AgABAQEAAQEC/wMAAQEBAAEBAv8DAAEBAQABAQL/AwABAQEAAQEBwAEDAwABAQEAAQEBwAED
+ AwABAQEAAQEB8QGPAwABAQEAAQEB4AEHAwABAQEAAQEBxgFjAwABAQEAAQEBjgFxAwABAQEAAQEBxgFj
+ AwABAQEAAQEB4AEHAwABAQEAAQEB8QGPAwABAQEAAQEB+QGfAwABAQEAAQEC/wMAAQEBAAEBAv8CAAGA
+ AQMBAAEBAv8CAAT/AgAB/gEBAv8FAAEBAYgDAAHAAQEBAAEBAYgBAAGAAQEBwAEBAQABAQGPAf8BgAEB
+ AcABAQEAAQEC/wGAAQEBwAEBAQABAQL/AYABAQHAAQEBAAEBAY8B/wGAAQEBwAEBAQABAQGMAQEBgAEB
+ AcABAQEAAQEBjwH/AYABAQHAAQMBAAEfAv8BgAEBAcABAwHwAR8C/wGAAQEBwAEDAfABHwGPAf8BgAEB
+ AcABAwHwAR8BjAEBAYABAQHAAQMB8AEfAY8B/wGAAQEBwAEDAfABHwT/AcABAwHwAR8EAAT/BAAE/wHA
+ AQMBwAEDBP8BwAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIAAcABAwHAAQMB8QGPAcwBwQHAAQMBwAED
+ AeMBxwHAAcEBwAEDAcABAwHHAeMBwAHjAcABAwHAAQMBjwHxAeEB4wHAAQMBwAEDAccB4wHhAeMBwAED
+ AcABAwHjAccB4QH/AcABAwHAAQMB8QGPAfMB/wHAAQMBwAEDAfkBnwL/AcABAwHAAQME/wHAAQcBwAEH
+ BP8BwAEPAcABDwT/EAABwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
+ AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
+ AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
+ AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEHAcABBwHAAQcBwAEHAcABDwHAAQ8BwAEPAcABDws=
@@ -603,15 +602,15 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHASURBVDhPrVI9SAJhGH5vlygi+jFIBBGH8CZBAkFwEWlQ
- WsIma1cKTG40AucajCJoixqkloiEcBCCEC7ilqTloDjiloYKEvLrfT68UDFpSHh4v/f5u+9Uov/4pFKp
- xWQyGfxLF3zw93gzmYwGJBKJoSXQHW9Pgc/n03RdF+l0WotGowNLwEOHD/7+2wZBGoYh+Iqaqqo9JdjB
- Q++EBz4k6Pf7tWazKeLxuMZGacLEDh46U0NfU5aYpikikYjmdruXMLH/JSxfa4GfEAgENMuyRCwWu6rV
- agI7+F9/pRci1zPR8pOi7DBOK4pS3fJ4DNu2Rd3lMu54Bw8dPvh/ygxeHhVl2w6HGx/Z7GurWGyLUknc
- 53LimugdZwA8dPjgR06W6EQrZiikw3Tm9T7sEjW+ikVxwfOSqIyJHTx0+OBHThbUFeWwO/yZz4tzNjOk
- ARM7+O4S5GRBhaj6ls+3IbYKBXHM88Rp77wodvDQ4YMfOSnvEe3fqqqFWxyxuNkXdr4s8NDhgx85qfmJ
- omWiAyZuVok2mJrH/4cxx3AzZhleRmCNaB0++JFzymf44GCaz5OMccYoY6SDMZ4TjKkuLzL0DSJE7Fvo
- PhlwAAAAAElFTkSuQmCC
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHBSURBVDhPrVI9SAJhGH5vlygi+rkgEUQc4pwECQTBRaRB
+ aQmbrFmkwOQ2jcC5BqMI2qIGqSUiIRyEIISLuCVpEQqJW4IoMMiv9/nwQsWkIeHh/d7n775Tif7jE4/H
+ F2OxmPaXLvjg7/Emk0kdiEajQ0ug296eArfbrRuGIRKJhB4KhQaWgIcOH/z9t9VAmqYp+Iq6z+frKcEO
+ HnonPPAhmsfj0ev1uohEIjobpQkTO3joTA19TVnSaDREMBjUVVVdwsT+l7B8rQV+gtfr1ZvNpgiHw1eV
+ SkVgB//rr/RC5HgmWn5SlB3GaUlRyltOp2lZlqg6HOYd7+Chwwf/T5nJy6OibFuBQO0jlXpt5XJtUSiI
+ +3RaXBO94wyAhw4f/MjJEoNopeH3GzCduVwPu0S1r3xeXPC8JCpiYgcPHT74kZMFVUU57A63MhlxzmaG
+ NGBiB99dgpwsKBGV3zKZNsTPbFYc8zyx2zsvih08dPjgR07Ke0T7t5rWxC2OWNzsC9tfFnjo8MGPnNQ8
+ RKEi0QETN6tEG0zN4//DmGOojFmGi+FdI1qHD37k7PIZPtiY5vMkY5wxyhjpYIznBGOqy4sMfQMNTOxL
+ rJWu9gAAAABJRU5ErkJggg==
@@ -631,17 +630,17 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJfSURBVDhPjZJdSJNRGMfPRQhdVRJd1GVNc1j5Tm3ah5oG
- y5EX6pxOXWo5tZlDG69JDlakhJB5saKitC/t+8uLFnQTSGAXb2gfUEkIUdZFMSi3tjn133ne2oFtXnTg
- x3s45zk/nvN/D2NLDHeFNqm8vLzMZDI1EzSntaVqxdqZfHbBk8cUokdik0Ny69epqY8gaE5r0X2qTZDR
- 5oez+zHatg3j468xMfEe09NfVGhOa7T3zlMPqk0QnN7JlDcDtbhel46LlRtw1arFzQMZuG3TYbh+E4aq
- UzHSsBmv+qtBtQmC/lymTJ6y4PmxEjxxFqicl0sxcMQiOOduwGBvM3p2r36bIOjLYcrLPjOede8ReLqt
- +L2wgF9zc/gRCmHG78fo2BjaK/WfylwuTYzkZBZTXvSU4mlnkaC/swqBSAS+QADfZ2fx2efDiNcLGntl
- 2V7c1ZUiJCcymULtP+7IU6HAjttLEJyfx89gUEg8w8OIojEYXELg3sIUav/+wa1qkJeqNJDrChHmV/CH
- wzES6mSGd1VktzuE4KiWKd7D+bhcsxGDlhQV575CRLggyDOIl1AmO2y2DiGQ05jysDUHV2rTBB3WXVhY
- XESYXyNeQsHqrVanELRrmPKAC67x9qM4agqwyAOb513ES/xcIJnNnULgWM8Fdr36WKK0mLeriZOEOqHr
- UCYUbIh/U43GbiFoWvdXcKtRErSV6lBVLMVgMUrI0Kz9tkKSelfpdI0kWM5ZU7GSKY8O5ap/4V5LNu42
- ZwnuNGWCoGdNUC2d+XeWJfNJevYydsOQxJT/gWrpDCf5D6Zt9cwWcc11AAAAAElFTkSuQmCC
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJfSURBVDhPjZJdSJNRGMfPRQhdVRJd1GVNc1j2Tm3ah5oG
+ y5EX6pxOXWr51UzRxmuSwoqUEFperKgo7Uv7/vKiBd0EEtjFCe0DKgkhyrooBuVsm9P9O89bO6DzogM/
+ 3sM5z/nxnP97GFtiuEr0ccXFxUUWi6WBoDmtLVUr185kswueLMaJboWND6hNXycmPoKgOa1F96k2Rkab
+ H87ux3DzNoyOvsbY2HtMTn7RoDmt0d47TzWoNkZweifjb/oqcb0qGRdLN+CqXY+bB7bgdp0Bg9WbMFCe
+ iKGazXjlLgfVxgjcmYyPn7Lh+bECPHHmaJxXC9F3xCY556pBf08Dunevfhsj6M1g/GWvFc8690g8nXb8
+ np/Hr9lZ/AgGMeX3Y3hkBK2lxk9FXV26BZKTaYy/6C7E0/Y8ibu9DDPhMHwzM/g+PY3PPh+GvF7Q2Kuq
+ jvyOjgQpOZHKOLX/uC1LgwI77ihAYG4OPwMBKfEMDiKKzmTqkgJXCuPU/v2DW7UgL5XpoFblIiSu4A+F
+ FkiokynRVZ7D0SIFR/WMew9n43LFRvTbEjSc+3IRFoKAyGCxhDLZUVfXJgVqEuMPmzJwpTJJ0mbfhflI
+ BCFxjcUSCtZotzuloFXH+AMhuCbaj9JSkYOICGxOdLFY4hcCxWptl4KW9ULgMGqPJUqjdbuWOEmoE7oO
+ ZULBBsU30WzulIL6dX8Ft2oVSXOhAWX5ygJsZgUpurXfVihKzyqDoZYEywVrSlYy/uhQpvYX7jWm425D
+ muROfSoIetYE1dKZf2dZvJgkpy9jN0xxjP8PVEtnBPF/AKXf9csr/2VyAAAAAElFTkSuQmCC
@@ -804,27 +803,27 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFySURBVDhPY2CgBthfz8CyP4kl40AiczcM19sxnEHGyHIg
tSA9cLv3xrErn6rWXPp+T+f/d7s7wHh2hikKhomD1IDUgvTADdiVwOx+c4r3EWQDlpc4/ofhJYV2cINB
- akBqQXrgBuyIZ8m9vyz7wbPNDf9heEuj338YXlftARcHyYPUgvTADdgawzz1/v7lf//fXfUfhu+uKgcy
+ akBqQXrgBuyIZ8m9vyz7wbPNDf9heEuj338YXlftARcHyYPUgvTADdgawzz13v7lf//fXfUfhu+uKgcy
IfjMzDS4OEgepBakB27A5ijmGT8vzf//+cRUON7dEfofhjc3+KLIgdSC9MAN2BDFPPvbudn/PxyZCMcg
zavKXcCGLCt2QJEDqQXpgRuwOoJ5/qeT0/6/2d8DxyDNID6MRpYDqQXpgRuwPIx58btD/f9f7monCoPU
gvTADVgSwrjsFTDun25tIgqD1IL0wA2YH8C4+smWxv8PN9QShUFqQXrgBkzxZNzxYF31//trq4jCILUg
- PTAD5FKNGee1uTAeJQWD9AANkAMZwg/E4kAsRSIG6QHppQwAAH683UYodOupAAAAAElFTkSuQmCC
+ PTAD5FKNGee1uTAeJQWD9AANkAMZwg/E4kAsRSIG6QHppQwAAHlk3UT14yZDAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJRSURBVDhPhVJdaJJRGFbRLhSnOGQQdVGDCOpOiOlANDVc
- oxT/Nz+XS5cm/v8kmWGjxEF3RYx1EQQFXWw3YzQCK0nqIhbZRTAYBdEPRbddRLt4Ou+H3/a1Rn3wcN7z
- Ps/7nPd7z5FIRJ9UKp1lWKRVnKf4X9yWlomWqtUq1Gp1e6cB5YgjzU6O3zPiql6vf2W320Erw21BSLGY
- I+1fJiy53Gw2USqVkMuVoNPpemIQV61eQDabpy6WdzNYaTQaiEQ4eL1hGAwG5PN5HhQTF4vF4PEEyGBl
- N4PVer2OyckJmEwmvkgMh8OBaDQKl8tLBqt/GLDEda1Wu07/LxS5XC6kUikeFFPebrfxK2mpRjz9dq1W
- Y/+ehc/ng9Fogkaj2RDD7/cjk8kgHo8zJKmL7Ztim065XMbUFMdOsWN83A+VSvWeXd0IgeJKpcJmcBZj
- Y044nW4y6Ig76BYKBYTDE7BarUzggVKp/CAIKC4Wi2wGZ2C79AC2mRYZdMUGL7LZLEKhAMxmMxwOF+Ry
- +SdBQHEul+NvyHStw/AMQ6OhDbHBy3Q6jenpKD+DYJCDQqH4QoIjzd7C/tzir9HZxzBeaePY5UeY/wwc
- TC79ONp8zQmvsGexWGCzHd+6BXbqNyKHL3bXbnwEUm+ByJttlNYB4oQu3iUSCXAcx67MzR5SCDKZ7DuR
- utNzC4OBm5uHz9/HoeQ9DM/cxchzQBe89XPQ3eI72MfwkOGrGGxIT9jeQOjHPK86ObdJUBywPO3XSgbo
- IIYhhr3/w55T83cUJ1rn+jUDvwF4CyfRYwLPWAAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPhVJdaJJRGFbRLhSnOGQQu6lBBHUnxHQgmp/h
+ GqX4v/m5XLo08f8nyQwbJQ66K2KsiyAo6GK7GaMRWElSF9HILoLBKIh+KLrtItrF03k/dPtaoz54OO95
+ n+d9zvu950gkok8qlc4xLNEqzlP8L25by0TLlUoFarW6tduAcsSRZjcn7BlxVa/Xr3McB1oZbveFFIs5
+ 0v5lwpIrjUYDxWIR2WwROp2uKwZxlcoFZDI56mJlL4PVer2OcJiHxxOCwWBALpcTQDFx0WgUbrefDFb3
+ Mlir1WqYmpqEyWQSisSw2+2IRCJwOj1ksPaHAUtc12q1G/T//SKn04lkMimAYspznE1YSUs14um3qtUq
+ +/cMvF4vjEYTNBrNphg+nw/pdBqxWIwhQV3s3BTbtEulEqaneXYKh4kJH1Qq1Xt2daMEisvlMpvBWYyP
+ O+BwuMigLe6gk8/nEQpNwmq1MoEbSqXyQ19AcaFQYDM4A9ulB7DNNsmgIzZ4kclkEAz6YTabYbc7IZfL
+ P/UFFGezWeGGTNfaDM8wNBbcFBu8TKVSmJmJCDMIBHgoFIovJDjS6C4OZ5d+jc09hvFKC8cuP8LCZ+Bg
+ YvnH0cZrvv8KuxaLBTbb8e1bYKd+I3LkYufVjY9A8i0QfrOD4gZAXL+Ld/F4HDzPsytzsYcUhEwm+06k
+ 7vT84qD/5tbh8/dxKHEPI7N3Mfoc0AVu/Rx0NYUOhhkeMnwVgw3pCdsbCL1Y4FUn57cIigOWp71ayQAd
+ xDDEsP9/2Hdq4Y7iRPNcr2bgN3brJ9Bul6m9AAAAAElFTkSuQmCC
diff --git a/HexEditor.Designer.cs b/HexEditor.Designer.cs
index a3345ba..0b0ce76 100644
--- a/HexEditor.Designer.cs
+++ b/HexEditor.Designer.cs
@@ -30,7 +30,8 @@
this.hexBox1 = new Be.Windows.Forms.HexBox();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this._curPositionLabel = new System.Windows.Forms.ToolStripStatusLabel();
- this._buttonClose = new System.Windows.Forms.Button();
+ this._buttonCancel = new System.Windows.Forms.Button();
+ this._buttonOK = new System.Windows.Forms.Button();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
@@ -67,24 +68,36 @@
this._curPositionLabel.Size = new System.Drawing.Size(100, 17);
this._curPositionLabel.Text = "0000";
//
- // _buttonClose
+ // _buttonCancel
//
- this._buttonClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this._buttonClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this._buttonClose.Location = new System.Drawing.Point(429, 307);
- this._buttonClose.Name = "_buttonClose";
- this._buttonClose.Size = new System.Drawing.Size(75, 23);
- this._buttonClose.TabIndex = 2;
- this._buttonClose.Text = "Close";
- this._buttonClose.UseVisualStyleBackColor = true;
+ this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this._buttonCancel.Location = new System.Drawing.Point(348, 307);
+ this._buttonCancel.Name = "_buttonCancel";
+ this._buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this._buttonCancel.TabIndex = 13;
+ this._buttonCancel.Text = "Cancel";
+ this._buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // _buttonOK
+ //
+ this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this._buttonOK.Location = new System.Drawing.Point(429, 307);
+ this._buttonOK.Name = "_buttonOK";
+ this._buttonOK.Size = new System.Drawing.Size(75, 23);
+ this._buttonOK.TabIndex = 12;
+ this._buttonOK.Text = "OK";
+ this._buttonOK.UseVisualStyleBackColor = true;
+ this._buttonOK.Click += new System.EventHandler(this._buttonOK_Click);
//
// HexEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this._buttonClose;
+ this.CancelButton = this._buttonCancel;
this.ClientSize = new System.Drawing.Size(516, 355);
- this.Controls.Add(this._buttonClose);
+ this.Controls.Add(this._buttonCancel);
+ this.Controls.Add(this._buttonOK);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.hexBox1);
this.Name = "HexEditor";
@@ -101,6 +114,7 @@
private Be.Windows.Forms.HexBox hexBox1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel _curPositionLabel;
- private System.Windows.Forms.Button _buttonClose;
+ private System.Windows.Forms.Button _buttonCancel;
+ private System.Windows.Forms.Button _buttonOK;
}
}
\ No newline at end of file
diff --git a/HexEditor.cs b/HexEditor.cs
index 50ec136..2acea4f 100644
--- a/HexEditor.cs
+++ b/HexEditor.cs
@@ -11,17 +11,51 @@ namespace NBTExplorer
{
public partial class HexEditor : Form
{
+ private byte[] _data;
+ private bool _modified;
+ DynamicByteProvider _byteProvider;
+
+ private class FixedByteProvider : DynamicByteProvider
+ {
+ public FixedByteProvider (byte[] data)
+ : base(data)
+ { }
+
+ public override bool SupportsInsertBytes ()
+ {
+ return false;
+ }
+ }
+
public HexEditor (string tagName, byte[] data)
{
InitializeComponent();
- this.Text = "Editing: " + tagName + " (Read Only)";
+ this.Text = "Editing: " + tagName;
- hexBox1.ByteProvider = new DynamicByteProvider(data);
+ _data = new byte[data.Length];
+ Array.Copy(data, _data, data.Length);
+
+ _byteProvider = new FixedByteProvider(_data);
+ _byteProvider.Changed += (o, e) => { _modified = true; };
+
+ hexBox1.ByteProvider = _byteProvider;
hexBox1.HorizontalByteCountChanged += HexBox_HorizontalByteCountChanged;
hexBox1.CurrentLineChanged += HexBox_CurrentLineChanged;
hexBox1.CurrentPositionInLineChanged += HexBox_CurrentPositionInLineChanged;
+
+ hexBox1.ReadOnly = false;
+ }
+
+ public byte[] Data
+ {
+ get { return _data; }
+ }
+
+ public bool Modified
+ {
+ get { return _modified; }
}
private void HexBox_HorizontalByteCountChanged (object sender, EventArgs e)
@@ -45,5 +79,22 @@ namespace NBTExplorer
_curPositionLabel.Text = pos.ToString();
}
+
+ private void Apply ()
+ {
+ long len = Math.Min(_data.Length, _byteProvider.Length);
+
+ for (int i = 0; i < len; i++) {
+ _data[i] = _byteProvider.Bytes[i];
+ }
+
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void _buttonOK_Click (object sender, EventArgs e)
+ {
+ Apply();
+ }
}
}
diff --git a/NBTExplorer.csproj b/NBTExplorer.csproj
index 8780080..87c2787 100644
--- a/NBTExplorer.csproj
+++ b/NBTExplorer.csproj
@@ -38,7 +38,7 @@
dead_bush.ico
-
+
False
..\Substrate\SubstrateCS\bin\Release\NET2\Substrate.dll
@@ -55,6 +55,24 @@
About.cs
+
+ Form
+
+
+ EditName.cs
+
+
+ Form
+
+
+ EditString.cs
+
+
+ Form
+
+
+ CreateNode.cs
+
Form
@@ -84,6 +102,15 @@
About.cs
+
+ EditName.cs
+
+
+ EditString.cs
+
+
+ CreateNode.cs
+
EditValue.cs
diff --git a/Vendor/Be.Windows.Forms.HexBox/DynamicByteProvider.cs b/Vendor/Be.Windows.Forms.HexBox/DynamicByteProvider.cs
index 1c5714c..83d01ee 100644
--- a/Vendor/Be.Windows.Forms.HexBox/DynamicByteProvider.cs
+++ b/Vendor/Be.Windows.Forms.HexBox/DynamicByteProvider.cs
@@ -151,7 +151,7 @@ namespace Be.Windows.Forms
///
/// Returns true
///
- public bool SupportsWriteByte()
+ public virtual bool SupportsWriteByte()
{
return true;
}
@@ -159,7 +159,7 @@ namespace Be.Windows.Forms
///
/// Returns true
///
- public bool SupportsInsertBytes()
+ public virtual bool SupportsInsertBytes()
{
return true;
}
@@ -167,7 +167,7 @@ namespace Be.Windows.Forms
///
/// Returns true
///
- public bool SupportsDeleteBytes()
+ public virtual bool SupportsDeleteBytes()
{
return true;
}