Fixed unicode bug, fixed byte array create bug, improved dialogs, byte/int arrays are now editable.

This commit is contained in:
Justin Aquadro 2012-08-23 23:58:11 -04:00
parent 837bf206ec
commit 6781be7b2f
22 changed files with 1475 additions and 404 deletions

7
About.Designer.cs generated
View file

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

View file

@ -13,5 +13,10 @@ namespace NBTExplorer
{
InitializeComponent();
}
private void linkLabel1_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e)
{
}
}
}

View file

@ -121,7 +121,7 @@
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4Bd
YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4Bd
AAAGm0lEQVR4Xu2dS3LbQAwFvcpZcoDcJtscRIfIfZ2wJLkklVzToPCGpN0Lr/gEgDONh5Gsz9vpdHrz
j63B3z8/38mf63l6E6pCYxGoFo1gCVapsQSLOfvSWKWF/e6dKFiCFWkYwRIswSqcHROTKLIBiUL3EFPH
0rEiDSNYgiVYjkLeBVuPQx2L71Wks7cGIJVfsAQr0jCCJViC5RmLd0FqxNG4Ohbfq0hn0406mk6wBCvS

126
CreateNode.Designer.cs generated Normal file
View file

@ -0,0 +1,126 @@
namespace NBTExplorer
{
partial class CreateNode
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose (bool disposing)
{
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent ()
{
this._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;
}
}

182
CreateNode.cs Normal file
View file

@ -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<string> _invalidNames = new List<string>();
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<string> 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();
}
}
}

120
CreateNode.resx Normal file
View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

91
EditName.Designer.cs generated Normal file
View file

@ -0,0 +1,91 @@
namespace NBTExplorer
{
partial class EditName
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose (bool disposing)
{
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent ()
{
this._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;
}
}

71
EditName.cs Normal file
View file

@ -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<string> _invalidNames = new List<string>();
public EditName (String name)
{
InitializeComponent();
_name = name;
_nameField.Text = _name;
}
public String TagName
{
get { return _name; }
}
public List<string> 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();
}
}
}

120
EditName.resx Normal file
View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

92
EditString.Designer.cs generated Normal file
View file

@ -0,0 +1,92 @@
namespace NBTExplorer
{
partial class EditString
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose (bool disposing)
{
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent ()
{
this._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;
}
}

55
EditString.cs Normal file
View file

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

120
EditString.resx Normal file
View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

39
EditValue.Designer.cs generated
View file

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

View file

@ -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<string> _invalidNames = new List<string>();
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<string> 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();
}
}
}

View file

@ -112,9 +112,9 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

7
Form1.Designer.cs generated
View file

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

139
Form1.cs
View file

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

View file

@ -342,213 +342,212 @@
<value>
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=
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -603,15 +602,15 @@
<data name="_buttonCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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==
</value>
</data>
<data name="_buttonCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -631,17 +630,17 @@
<data name="_buttonPaste.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="_buttonRename.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -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
</value>
</data>
<data name="_buttonFindNext.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

40
HexEditor.Designer.cs generated
View file

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

View file

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

View file

@ -38,7 +38,7 @@
<ApplicationIcon>dead_bush.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="Substrate, Version=1.3.3.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Substrate\SubstrateCS\bin\Release\NET2\Substrate.dll</HintPath>
</Reference>
@ -55,6 +55,24 @@
<Compile Include="About.Designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Include="EditName.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="EditName.Designer.cs">
<DependentUpon>EditName.cs</DependentUpon>
</Compile>
<Compile Include="EditString.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="EditString.Designer.cs">
<DependentUpon>EditString.cs</DependentUpon>
</Compile>
<Compile Include="CreateNode.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="CreateNode.Designer.cs">
<DependentUpon>CreateNode.cs</DependentUpon>
</Compile>
<Compile Include="EditValue.cs">
<SubType>Form</SubType>
</Compile>
@ -84,6 +102,15 @@
<EmbeddedResource Include="About.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="EditName.resx">
<DependentUpon>EditName.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="EditString.resx">
<DependentUpon>EditString.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CreateNode.resx">
<DependentUpon>CreateNode.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="EditValue.resx">
<DependentUpon>EditValue.cs</DependentUpon>
</EmbeddedResource>

View file

@ -151,7 +151,7 @@ namespace Be.Windows.Forms
/// <summary>
/// Returns true
/// </summary>
public bool SupportsWriteByte()
public virtual bool SupportsWriteByte()
{
return true;
}
@ -159,7 +159,7 @@ namespace Be.Windows.Forms
/// <summary>
/// Returns true
/// </summary>
public bool SupportsInsertBytes()
public virtual bool SupportsInsertBytes()
{
return true;
}
@ -167,7 +167,7 @@ namespace Be.Windows.Forms
/// <summary>
/// Returns true
/// </summary>
public bool SupportsDeleteBytes()
public virtual bool SupportsDeleteBytes()
{
return true;
}