Renamed Audio PCK members to in game names

This commit is contained in:
MayNL
2026-06-30 11:47:30 -04:00
parent 50ee8486db
commit ccd4b3cd02
7 changed files with 466 additions and 517 deletions
+3 -3
View File
@@ -981,9 +981,9 @@ namespace PckStudio.Controls
private static PckAudioFile CreateNewAudioFile()
{
PckAudioFile audioFile = new PckAudioFile();
audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld);
audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether);
audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.End);
audioFile.AddTrackList(PckAudioFile.AudioTrackList.EAudioType.Overworld);
audioFile.AddTrackList(PckAudioFile.AudioTrackList.EAudioType.Nether);
audioFile.AddTrackList(PckAudioFile.AudioTrackList.EAudioType.End);
return audioFile;
}
+41 -42
View File
@@ -32,25 +32,25 @@ namespace PckStudio.Forms.Editor
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AudioEditor));
this.trackListTreeView = new System.Windows.Forms.TreeView();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.trackListContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.addCategoryStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeCategoryStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.changeCategoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.catImages = new System.Windows.Forms.ImageList(this.components);
this.trackListIcons = new System.Windows.Forms.ImageList(this.components);
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.trackTreeView = new System.Windows.Forms.TreeView();
this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.trackContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.addEntryMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeEntryMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.playOverworldInCreative = new MetroFramework.Controls.MetroCheckBox();
this.compressionUpDown = new System.Windows.Forms.NumericUpDown();
this.metroLabel1 = new MetroFramework.Controls.MetroLabel();
this.contextMenuStrip1.SuspendLayout();
this.trackListContextMenuStrip.SuspendLayout();
this.menuStrip.SuspendLayout();
this.contextMenuStrip2.SuspendLayout();
this.trackContextMenuStrip.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.compressionUpDown)).BeginInit();
this.SuspendLayout();
//
@@ -58,54 +58,54 @@ namespace PckStudio.Forms.Editor
//
resources.ApplyResources(this.trackListTreeView, "trackListTreeView");
this.trackListTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.trackListTreeView.ContextMenuStrip = this.contextMenuStrip1;
this.trackListTreeView.ContextMenuStrip = this.trackListContextMenuStrip;
this.trackListTreeView.ForeColor = System.Drawing.Color.White;
this.trackListTreeView.ImageList = this.catImages;
this.trackListTreeView.ImageList = this.trackListIcons;
this.trackListTreeView.LabelEdit = true;
this.trackListTreeView.Name = "trackListTreeView";
this.trackListTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
this.trackListTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView1_KeyDown);
this.trackListTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.trackListTreeView_AfterSelect);
this.trackListTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.trackListTreeView_KeyDown);
//
// contextMenuStrip1
// trackListContextMenuStrip
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.trackListContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addCategoryStripMenuItem,
this.removeCategoryStripMenuItem,
this.changeCategoryToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1");
this.trackListContextMenuStrip.Name = "contextMenuStrip1";
resources.ApplyResources(this.trackListContextMenuStrip, "trackListContextMenuStrip");
//
// addCategoryStripMenuItem
//
resources.ApplyResources(this.addCategoryStripMenuItem, "addCategoryStripMenuItem");
this.addCategoryStripMenuItem.Name = "addCategoryStripMenuItem";
this.addCategoryStripMenuItem.Click += new System.EventHandler(this.addCategoryStripMenuItem_Click);
resources.ApplyResources(this.addCategoryStripMenuItem, "addCategoryStripMenuItem");
this.addCategoryStripMenuItem.Click += new System.EventHandler(this.addTrackListStripMenuItem_Click);
//
// removeCategoryStripMenuItem
//
this.removeCategoryStripMenuItem.Name = "removeCategoryStripMenuItem";
resources.ApplyResources(this.removeCategoryStripMenuItem, "removeCategoryStripMenuItem");
this.removeCategoryStripMenuItem.Click += new System.EventHandler(this.removeCategoryStripMenuItem_Click);
this.removeCategoryStripMenuItem.Click += new System.EventHandler(this.removeTrackListStripMenuItem_Click);
//
// changeCategoryToolStripMenuItem
//
this.changeCategoryToolStripMenuItem.Name = "changeCategoryToolStripMenuItem";
resources.ApplyResources(this.changeCategoryToolStripMenuItem, "changeCategoryToolStripMenuItem");
this.changeCategoryToolStripMenuItem.Click += new System.EventHandler(this.setCategoryToolStripMenuItem_Click);
this.changeCategoryToolStripMenuItem.Click += new System.EventHandler(this.setTrackListToolStripMenuItem_Click);
//
// catImages
// trackListIcons
//
this.catImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("catImages.ImageStream")));
this.catImages.TransparentColor = System.Drawing.Color.Transparent;
this.catImages.Images.SetKeyName(0, "0_overworld.png");
this.catImages.Images.SetKeyName(1, "1_nether.png");
this.catImages.Images.SetKeyName(2, "2_end.png");
this.catImages.Images.SetKeyName(3, "3_creative.png");
this.catImages.Images.SetKeyName(4, "4_menu.png");
this.catImages.Images.SetKeyName(5, "5_mg01.png");
this.catImages.Images.SetKeyName(6, "6_mg02.png");
this.catImages.Images.SetKeyName(7, "7_mg03.png");
this.catImages.Images.SetKeyName(8, "8_mg04.png");
this.trackListIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("trackListIcons.ImageStream")));
this.trackListIcons.TransparentColor = System.Drawing.Color.Transparent;
this.trackListIcons.Images.SetKeyName(0, "0_overworld.png");
this.trackListIcons.Images.SetKeyName(1, "1_nether.png");
this.trackListIcons.Images.SetKeyName(2, "2_end.png");
this.trackListIcons.Images.SetKeyName(3, "3_creative.png");
this.trackListIcons.Images.SetKeyName(4, "4_menu.png");
this.trackListIcons.Images.SetKeyName(5, "5_mg01.png");
this.trackListIcons.Images.SetKeyName(6, "6_mg02.png");
this.trackListIcons.Images.SetKeyName(7, "7_mg03.png");
this.trackListIcons.Images.SetKeyName(8, "8_mg04.png");
//
// menuStrip
//
@@ -134,27 +134,27 @@ namespace PckStudio.Forms.Editor
this.trackTreeView.AllowDrop = true;
resources.ApplyResources(this.trackTreeView, "trackTreeView");
this.trackTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.trackTreeView.ContextMenuStrip = this.contextMenuStrip2;
this.trackTreeView.ContextMenuStrip = this.trackContextMenuStrip;
this.trackTreeView.ForeColor = System.Drawing.Color.White;
this.trackTreeView.Name = "trackTreeView";
this.trackTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.Binka_DragDrop);
this.trackTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView2_DragEnter);
this.trackTreeView.DoubleClick += new System.EventHandler(this.trackTreeView_DoubleClick);
this.trackTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView2_KeyDown);
this.trackTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.trackTreeView_KeyDown);
//
// contextMenuStrip2
// trackContextMenuStrip
//
this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.trackContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addEntryMenuItem,
this.editEntryToolStripMenuItem,
this.removeEntryMenuItem});
this.contextMenuStrip2.Name = "contextMenuStrip1";
resources.ApplyResources(this.contextMenuStrip2, "contextMenuStrip2");
this.trackContextMenuStrip.Name = "contextMenuStrip1";
resources.ApplyResources(this.trackContextMenuStrip, "trackContextMenuStrip");
//
// addEntryMenuItem
//
resources.ApplyResources(this.addEntryMenuItem, "addEntryMenuItem");
this.addEntryMenuItem.Name = "addEntryMenuItem";
resources.ApplyResources(this.addEntryMenuItem, "addEntryMenuItem");
this.addEntryMenuItem.Click += new System.EventHandler(this.addEntryMenuItem_Click);
//
// editEntryToolStripMenuItem
@@ -224,11 +224,10 @@ namespace PckStudio.Forms.Editor
this.Style = MetroFramework.MetroColorStyle.Silver;
this.Theme = MetroFramework.MetroThemeStyle.Dark;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AudioEditor_FormClosing);
this.Shown += new System.EventHandler(this.AudioEditor_Shown);
this.contextMenuStrip1.ResumeLayout(false);
this.trackListContextMenuStrip.ResumeLayout(false);
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.contextMenuStrip2.ResumeLayout(false);
this.trackContextMenuStrip.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.compressionUpDown)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -242,13 +241,13 @@ namespace PckStudio.Forms.Editor
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem1;
private System.Windows.Forms.TreeView trackTreeView;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ContextMenuStrip trackListContextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem removeCategoryStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem addCategoryStripMenuItem;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip2;
private System.Windows.Forms.ContextMenuStrip trackContextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem addEntryMenuItem;
private System.Windows.Forms.ToolStripMenuItem removeEntryMenuItem;
private System.Windows.Forms.ImageList catImages;
private System.Windows.Forms.ImageList trackListIcons;
private MetroFramework.Controls.MetroCheckBox playOverworldInCreative;
private System.Windows.Forms.NumericUpDown compressionUpDown;
private MetroFramework.Controls.MetroLabel metroLabel1;
+74 -108
View File
@@ -24,9 +24,8 @@ namespace PckStudio.Forms.Editor
public partial class AudioEditor : EditorForm<PckAudioFile>
{
public string defaultType = "yes";
MainForm parent = null;
private static readonly List<string> Categories = new List<string>
private static readonly List<string> TrackLists = new List<string>
{
"Overworld",
"Nether",
@@ -40,7 +39,7 @@ namespace PckStudio.Forms.Editor
/* If the SetMusicID function within the game is ever set to 0x9,
* it actually plays a tracklist for MG04, with all of the Creative
* Tracks and the "MG04_01.binka" file in it. The 9th category is MG04 - May
* Tracks and the "MG04_01.binka" file in it. The 9th track list ID is MG04 - May
*/
};
@@ -52,15 +51,15 @@ namespace PckStudio.Forms.Editor
SetUpTree();
}
private string GetCategoryFromId(PckAudioFile.AudioCategory.EAudioType categoryId)
=> categoryId >= PckAudioFile.AudioCategory.EAudioType.Overworld &&
categoryId <= PckAudioFile.AudioCategory.EAudioType.BuildOff
? Categories[(int)categoryId]
private string GetTrackListFromId(PckAudioFile.AudioTrackList.EAudioType trackListID)
=> trackListID >= PckAudioFile.AudioTrackList.EAudioType.Overworld &&
trackListID <= PckAudioFile.AudioTrackList.EAudioType.BuildOff
? TrackLists[(int)trackListID]
: "Not valid";
private PckAudioFile.AudioCategory.EAudioType GetCategoryId(string category)
private PckAudioFile.AudioTrackList.EAudioType GetTrackListId(string trackList)
{
return (PckAudioFile.AudioCategory.EAudioType)Categories.IndexOf(category);
return (PckAudioFile.AudioTrackList.EAudioType)TrackLists.IndexOf(trackList);
}
public void SetUpTree()
@@ -68,60 +67,42 @@ namespace PckStudio.Forms.Editor
trackListTreeView.BeginUpdate();
trackListTreeView.Nodes.Clear();
foreach (PckAudioFile.AudioCategory category in EditorValue.Categories)
foreach (PckAudioFile.AudioTrackList trackList in EditorValue.TrackLists)
{
// fix songs with directories using backslash instead of forward slash
// Songs with a backslash instead of a forward slash would not play in RPCS3
foreach (string songname in category.SongNames.FindAll(s => s.Contains('\\')))
category.SongNames[category.SongNames.IndexOf(songname)] = songname.Replace('\\', '/');
// fix tracks with directories using backslash instead of forward slash
// Tracks with a backslash instead of a forward slash would not play in RPCS3
foreach (string trackName in trackList.TrackNames.FindAll(s => s.Contains('\\')))
trackList.TrackNames[trackList.TrackNames.IndexOf(trackName)] = trackName.Replace('\\', '/');
if (category.AudioType == PckAudioFile.AudioCategory.EAudioType.Creative)
if (trackList.AudioType == PckAudioFile.AudioTrackList.EAudioType.Creative)
{
if (category.Name == "include_overworld" &&
EditorValue.TryGetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld, out PckAudioFile.AudioCategory overworldCategory))
if (trackList.Name == "include_overworld" &&
EditorValue.TryGetTrackList(PckAudioFile.AudioTrackList.EAudioType.Overworld, out PckAudioFile.AudioTrackList overworldTrackList))
{
foreach (var name in category.SongNames.ToList())
foreach (var name in trackList.TrackNames.ToList())
{
if (overworldCategory.SongNames.Contains(name))
category.SongNames.Remove(name);
if (overworldTrackList.TrackNames.Contains(name))
trackList.TrackNames.Remove(name);
}
playOverworldInCreative.Checked = true;
}
playOverworldInCreative.Visible = true;
}
TreeNode treeNode = new TreeNode(GetCategoryFromId(category.AudioType), (int)category.AudioType, (int)category.AudioType);
treeNode.Tag = category;
TreeNode treeNode = new TreeNode(GetTrackListFromId(trackList.AudioType), (int)trackList.AudioType, (int)trackList.AudioType);
treeNode.Tag = trackList;
trackListTreeView.Nodes.Add(treeNode);
}
playOverworldInCreative.Enabled = EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Creative);
playOverworldInCreative.Enabled = EditorValue.HasTrackList(PckAudioFile.AudioTrackList.EAudioType.Creative);
trackListTreeView.EndUpdate();
}
private void verifyFileLocationToolStripMenuItem_Click(object sender, EventArgs e)
{
/*
if (treeView1.SelectedNode == null || treeView2.SelectedNode == null)
return;
TreeNode entry = treeView2.SelectedNode;
string fileName = Path.Combine(parent., entry.Text + ".binka");
if (File.Exists(fileName))
MessageBox.Show(this, $"\"{entry.Text}.binka\" exists in the \"Data\" folder", "File found");
else
MessageBox.Show(this, $"\"{entry.Text}.binka\" does not exist in the \"Data\" folder. The game will crash when attempting to load this track.", "File missing");
*/
// Disabling this for now until location stuff is fixed
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
private void trackListTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
trackTreeView.Nodes.Clear();
if (e.Node.Tag is PckAudioFile.AudioCategory category)
if (e.Node.Tag is PckAudioFile.AudioTrackList trackList)
{
foreach (var name in category.SongNames)
foreach (var name in trackList.TrackNames)
{
trackTreeView.Nodes.Add(name);
}
@@ -130,80 +111,80 @@ namespace PckStudio.Forms.Editor
trackTreeView.SelectedNode = trackTreeView.Nodes[0];
}
private void addCategoryStripMenuItem_Click(object sender, EventArgs e)
private void addTrackListStripMenuItem_Click(object sender, EventArgs e)
{
string[] available = Categories.FindAll(str => !EditorValue.HasCategory(GetCategoryId(str))).ToArray();
string[] available = TrackLists.FindAll(str => !EditorValue.HasTrackList(GetTrackListId(str))).ToArray(); // array needed for popup form down below
if (available.Length == 0)
{
MessageBox.Show(this, "There are no more categories that could be added", "All possible categories are used");
MessageBox.Show(this, "There are no more track lists that could be added", "All possible track lists are used");
}
using ItemSelectionPopUp add = new ItemSelectionPopUp(available);
if (add.ShowDialog(this) != DialogResult.OK)
return;
EditorValue.AddCategory(GetCategoryId(add.SelectedItem));
PckAudioFile.AudioCategory category = EditorValue.GetCategory(GetCategoryId(add.SelectedItem));
EditorValue.AddTrackList(GetTrackListId(add.SelectedItem));
PckAudioFile.AudioTrackList trackList = EditorValue.GetTrackList(GetTrackListId(add.SelectedItem));
if (GetCategoryId(add.SelectedItem) == PckAudioFile.AudioCategory.EAudioType.Creative)
if (GetTrackListId(add.SelectedItem) == PckAudioFile.AudioTrackList.EAudioType.Creative)
{
playOverworldInCreative.Visible = true;
playOverworldInCreative.Checked = false;
}
TreeNode treeNode = new TreeNode(GetCategoryFromId(category.AudioType), (int)category.AudioType, (int)category.AudioType);
treeNode.Tag = category;
TreeNode treeNode = new TreeNode(GetTrackListFromId(trackList.AudioType), (int)trackList.AudioType, (int)trackList.AudioType);
treeNode.Tag = trackList;
trackListTreeView.Nodes.Add(treeNode);
SetUpTree();
}
private void addTrack(PckAudioFile.AudioCategory category, String trackname)
private void addTrack(PckAudioFile.AudioTrackList trackList, String trackname)
{
category.SongNames.Add(trackname);
trackList.TrackNames.Add(trackname);
trackTreeView.Nodes.Add(trackname);
}
private void addEntryMenuItem_Click(object sender, EventArgs e)
{
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category)
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioTrackList trackList)
{
TextPrompt audioEntry = new TextPrompt();
audioEntry.contextLabel.Text = "Please enter the relative file path without an extension. (i.e; \"music/song\" => \"DLC/{Pack}/Data/music/song.binka\")";
audioEntry.contextLabel.Text = "Please enter the relative file path without an extension. (i.e; \"music/track\" => \"DLC/{Pack}/Data/music/track.binka\")";
audioEntry.LabelText = "Path";
audioEntry.OKButtonText = "Add";
if (audioEntry.ShowDialog() == DialogResult.OK)
{
addTrack(category, audioEntry.NewText);
addTrack(trackList, audioEntry.NewText);
}
}
}
private void editEntryToolStripMenuItem_Click(object sender, EventArgs e)
{
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category && trackTreeView.SelectedNode is TreeNode track)
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioTrackList trackList && trackTreeView.SelectedNode is TreeNode track)
{
TextPrompt audioEntry = new TextPrompt(track.Text);
audioEntry.contextLabel.Text = "Please enter the relative file path without an extension. (i.e; \"music/song\" => \"DLC/{Pack}/Data/music/song.binka\")";
audioEntry.contextLabel.Text = "Please enter the relative file path without an extension. (i.e; \"music/track\" => \"DLC/{Pack}/Data/music/track.binka\")";
audioEntry.LabelText = "Path";
audioEntry.OKButtonText = "Save";
if (audioEntry.ShowDialog() == DialogResult.OK)
{
int index = category.SongNames.IndexOf(track.Text);
int index = trackList.TrackNames.IndexOf(track.Text);
if (index != -1) // Check if the item was found
{
track.Text = category.SongNames[index] = audioEntry.NewText;
track.Text = trackList.TrackNames[index] = audioEntry.NewText;
}
}
}
}
private void removeCategoryStripMenuItem_Click(object sender, EventArgs e)
private void removeTrackListStripMenuItem_Click(object sender, EventArgs e)
{
if (trackListTreeView.SelectedNode is TreeNode main &&
EditorValue.RemoveCategory(GetCategoryId(trackListTreeView.SelectedNode.Text)))
EditorValue.RemoveTrackList(GetTrackListId(trackListTreeView.SelectedNode.Text)))
{
if(GetCategoryId(trackListTreeView.SelectedNode.Text) == PckAudioFile.AudioCategory.EAudioType.Creative)
if(GetTrackListId(trackListTreeView.SelectedNode.Text) == PckAudioFile.AudioTrackList.EAudioType.Creative)
{
playOverworldInCreative.Visible = false;
playOverworldInCreative.Checked = false;
@@ -213,13 +194,13 @@ namespace PckStudio.Forms.Editor
}
}
private void treeView1_KeyDown(object sender, KeyEventArgs e)
private void trackListTreeView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
removeCategoryStripMenuItem_Click(sender, e);
removeTrackListStripMenuItem_Click(sender, e);
}
public void treeView2_KeyDown(object sender, KeyEventArgs e)
public void trackTreeView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
removeEntryMenuItem_Click(sender, e);
@@ -227,66 +208,59 @@ namespace PckStudio.Forms.Editor
private void removeEntryMenuItem_Click(object sender, EventArgs e)
{
if (trackTreeView.SelectedNode != null && trackListTreeView.SelectedNode.Tag is PckAudioFile.AudioCategory category)
if (trackTreeView.SelectedNode != null && trackListTreeView.SelectedNode.Tag is PckAudioFile.AudioTrackList trackList)
{
category.SongNames.Remove(trackTreeView.SelectedNode.Text);
trackList.TrackNames.Remove(trackTreeView.SelectedNode.Text);
trackTreeView.SelectedNode.Remove();
}
}
private void Binka_DragDrop(object sender, DragEventArgs e)
{
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category)
if (trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioTrackList trackList)
{
foreach(String s in (string[])e.Data.GetData(DataFormats.FileDrop, false))
{
addTrack(category, Path.GetFileNameWithoutExtension(s));
addTrack(trackList, Path.GetFileNameWithoutExtension(s));
}
}
}
private void saveToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (!EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Overworld) ||
!EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Nether) ||
!EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.End))
if (!EditorValue.HasTrackList(PckAudioFile.AudioTrackList.EAudioType.Overworld) ||
!EditorValue.HasTrackList(PckAudioFile.AudioTrackList.EAudioType.Nether) ||
!EditorValue.HasTrackList(PckAudioFile.AudioTrackList.EAudioType.End))
{
MessageBox.Show(this, "Your changes were not saved. The game will crash when loading your pack if the Overworld, Nether and End categories don't all exist with at least one valid song.", "Mandatory Categories Missing");
MessageBox.Show(this, "Your changes were not saved. The game will crash when loading your pack if an Overworld, Nether and End track list don't all exist with at least one valid track.", "Mandatory Track Lists Missing");
return;
}
PckAudioFile.AudioCategory overworldCategory = EditorValue.GetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld);
PckAudioFile.AudioTrackList overworldTrackList = EditorValue.GetTrackList(PckAudioFile.AudioTrackList.EAudioType.Overworld);
bool songs_missing = false;
foreach (PckAudioFile.AudioCategory category in EditorValue.Categories)
foreach (PckAudioFile.AudioTrackList trackList in EditorValue.TrackLists)
{
if (category.SongNames.Count < 1)
if (trackList.TrackNames.Count < 1)
{
MessageBox.Show(this, "The game will crash upon loading your pack if any of the categories are empty. Please remove or occupy the category.", "Empty Category");
MessageBox.Show(this, "The game will crash upon loading your pack if any of the track lists are empty. Please remove or occupy the track list.", "Empty Track List");
return;
}
category.Name = "";
if (playOverworldInCreative.Checked && category.AudioType == PckAudioFile.AudioCategory.EAudioType.Creative)
trackList.Name = "";
if (playOverworldInCreative.Checked && trackList.AudioType == PckAudioFile.AudioTrackList.EAudioType.Creative)
{
foreach (var name in overworldCategory.SongNames)
foreach (var name in overworldTrackList.TrackNames)
{
if (!category.SongNames.Contains(name))
if (!trackList.TrackNames.Contains(name))
{
category.SongNames.Add(name);
trackList.TrackNames.Add(name);
Console.WriteLine(name);
}
}
category.Name = "include_overworld";
trackList.Name = "include_overworld";
}
}
if (songs_missing)
{
MessageBox.Show(this, "Failed to save AudioData file because there are missing song entries", "Error");
return;
}
Save();
DialogResult = DialogResult.OK;
}
@@ -296,20 +270,12 @@ namespace PckStudio.Forms.Editor
e.Effect = DragDropEffects.All;
}
private void AudioEditor_Shown(object sender, EventArgs e)
private void setTrackListToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Owner.Owner is MainForm p)
parent = p;
else
Close();
}
private void setCategoryToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!(trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category))
if (!(trackListTreeView.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioTrackList trackList))
return;
string[] available = Categories.FindAll(str => !EditorValue.HasCategory(GetCategoryId(str))).ToArray();
string[] available = TrackLists.FindAll(str => !EditorValue.HasTrackList(GetTrackListId(str))).ToArray();
if (available.Length > 0)
{
using ItemSelectionPopUp add = new ItemSelectionPopUp(available);
@@ -317,19 +283,19 @@ namespace PckStudio.Forms.Editor
if (add.ShowDialog(this) != DialogResult.OK)
return;
EditorValue.RemoveCategory(category.AudioType);
EditorValue.RemoveTrackList(trackList.AudioType);
EditorValue.AddCategory(category.parameterType, GetCategoryId(add.SelectedItem), category.AudioType == PckAudioFile.AudioCategory.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : "");
EditorValue.AddTrackList(trackList.parameterType, GetTrackListId(add.SelectedItem), trackList.AudioType == PckAudioFile.AudioTrackList.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : "");
PckAudioFile.AudioCategory newCategory = EditorValue.GetCategory(GetCategoryId(add.SelectedItem));
PckAudioFile.AudioTrackList newTrackList = EditorValue.GetTrackList(GetTrackListId(add.SelectedItem));
category.SongNames.ForEach(c => newCategory.SongNames.Add(c));
trackList.TrackNames.ForEach(c => newTrackList.TrackNames.Add(c));
SetUpTree();
}
else
{
MessageBox.Show(this, "There are no categories that aren't already used", "All possible categories are used");
MessageBox.Show(this, "There are no track lists that aren't already used", "All possible track lists are used");
}
}
+300 -316
View File
@@ -121,256 +121,274 @@
<data name="trackListTreeView.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="trackListContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>127, 8</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>169, 70</value>
<data name="addCategoryStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>169, 22</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">
<value>contextMenuStrip1</value>
<data name="addCategoryStripMenuItem.Text" xml:space="preserve">
<value>Add Track List</value>
</data>
<data name="&gt;&gt;contextMenuStrip1.Type" xml:space="preserve">
<data name="removeCategoryStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>169, 22</value>
</data>
<data name="removeCategoryStripMenuItem.Text" xml:space="preserve">
<value>Remove Track List</value>
</data>
<data name="changeCategoryToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>169, 22</value>
</data>
<data name="changeCategoryToolStripMenuItem.Text" xml:space="preserve">
<value>Set Track List</value>
</data>
<data name="trackListContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>170, 70</value>
</data>
<data name="&gt;&gt;trackListContextMenuStrip.Name" xml:space="preserve">
<value>trackListContextMenuStrip</value>
</data>
<data name="&gt;&gt;trackListContextMenuStrip.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="trackListTreeView.ImageIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<metadata name="catImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="trackListIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>437, 8</value>
</metadata>
<data name="catImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<data name="trackListIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI
NAAAAk1TRnQBSQFMAgEBCQIAAQEBAAEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA
ATADAAEBAQABIAYAATASAAE5AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wE+AWIBfAH/ATMBVAFpAf8BMwFU
AWkB/wE+AWIBfAH/ATMBVAFpAf8BOQFeAXMB/wE5AV4BcwH/ATkBXgFzAf8BMwFUAWkB/wEmAT0BTAH/
ATMBVAFpAf8BMwFUAWkB/wE5AV4BcwH/wAABYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf8BTQGEAZ8B/wFN
AYQBnwH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/AVoBkAG0
Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/8AAAVoBkAG0Af8BTQGEAZ8B/wE5AV4BcwH/
AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/wFiAZgBvAH/AVoBkAG0Af8BWgGQ
AbQB/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AVoBkAG0Af/AAAFiAZgBvAH/AWIBmAG8
Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/wFiAZgBvAH/AU0BhAGfAf8BTQGEAZ8B/wE5
AV4BcwH/AU0BhAGfAf8BTQGEAZ8B/wFaAZABtAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/wAABOQFe
AXMB/wEzAVQBaQH/ATkBXgFzAf8BOQFeAXMB/wEzAVQBaQH/ATMBVAFpAf8BMwFUAWkB/wE5AV4BcwH/
ATkBXgFzAf8BOQFeAXMB/wE5AV4BcwH/ATkBXgFzAf8BMwFUAWkB/wEzAVQBaQH/ATMBVAFpAf8BOQFe
AXMB/8AAAWIBmAG8Af8BWgGQAbQB/wFaAZABtAH/AVoBkAG0Af8BYgGYAbwB/wFiAZgBvAH/AU0BhAGf
Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BWgGQAbQB/wFaAZABtAH/AVoBkAG0Af8BWgGQAbQB/wFa
AZABtAH/AU0BhAGfAf/AAAFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BYgGY
AbwB/wFaAZABtAH/AVoBkAG0Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BOQFeAXMB/wFiAZgBvAH/
AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/wAABYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFi
AZgBvAH/ATkBXgFzAf8BTQGEAZ8B/wFiAZgBvAH/AWIBmAG8Af8BWgGQAbQB/wFaAZABtAH/AVoBkAG0
Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/8AAATkBXgFzAf8BOQFeAXMB/wEzAVQBaQH/
ATMBVAFpAf8BMwFUAWkB/wEzAVQBaQH/ATMBVAFpAf8BOQFeAXMB/wE5AV4BcwH/ATkBXgFzAf8BMwFU
AWkB/wEzAVQBaQH/ATMBVAFpAf8BMwFUAWkB/wE5AV4BcwH/ATkBXgFzAf/AAAFiAZgBvAH/AWIBmAG8
Af8BYgGYAbwB/wFaAZABtAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf8BTQGEAZ8B/wFN
AYQBnwH/ATkBXgFzAf8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/wAABTQGE
AZ8B/wFNAYQBnwH/ATkBXgFzAf8BWgGQAbQB/wFaAZABtAH/AVoBkAG0Af8BYgGYAbwB/wFNAYQBnwH/
AVoBkAG0Af8BWgGQAbQB/wFaAZABtAH/AVoBkAG0Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGE
AZ8B/8AAAWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFiAZgBvAH/AWIBmAG8
Af8BTQGEAZ8B/wFiAZgBvAH/AU0BhAGfAf8BTQGEAZ8B/wE5AV4BcwH/AVoBkAG0Af8BWgGQAbQB/wFa
AZABtAH/AWIBmAG8Af/AAAEzAVQBaQH/ATMBVAFpAf8BMwFUAWkB/wE5AV4BcwH/ATkBXgFzAf8BOQFe
AXMB/wE5AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wE5AV4BcwH/ATMBVAFpAf8BMwFUAWkB/wEzAVQBaQH/
ATMBVAFpAf8BOQFeAXMB/wE5AV4BcwH/wAABYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf8BTQGEAZ8B/wFN
AYQBnwH/AU0BhAGfAf8BWgGQAbQB/wFaAZABtAH/ATkBXgFzAf8BYgGYAbwB/wFiAZgBvAH/AVoBkAG0
Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/8AAAWIBmAG8Af8BYgGYAbwB/wFaAZABtAH/
ATkBXgFzAf8BWgGQAbQB/wFaAZABtAH/AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGE
AZ8B/wFaAZABtAH/AU0BhAGfAf8BWgGQAbQB/wFiAZgBvAH/AU0BhAGfAf/AAAFiAZgBvAH/AU0BhAGf
Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BYgGYAbwB/wFiAZgBvAH/AVoBkAG0Af8BTQGEAZ8B/wFi
AZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH//wABAAEg
ASUBCAH/ASABJQEIAf8BIAElAQgB/ygAAygB/wMoAf8DKAH/lAABBQEQARYB/wEFARABFgH/AQUBEAEW
Af8gAAEgASUBCAH/AXcBigEeAf8BIAElAQgB/ygAAygB/wOWAf8DKAH/CAABFQE2AUkB/wELAR4BKAH/
IAABCwEeASgB/wEVATYBSQH/WAABBQEQARYB/wETAT4BVAH/AQwBKAE4Af8BDAEoATgB/wEFARABFgH/
AQUBEAEWAf8YAAEgASUBCAH/ASABJQEIAf8BHgFOAWgB/wELAR4BKAH/CAADKAH/AygB/xAAAQsBHgEo
Af8BHgFOAWgB/wMoAf8DKAH/BAABFQE2AUkB/wEnAWcBiQH/AQsBHgEoAf8gAAELAR4BKAH/AScBZwGJ
Af8BFQE2AUkB/xAAAzUB/wM1Af8YAAM1Af8DNQH/GAABBQEQARYB/wETAT4BVAH/A9YB/wOZAf8DmQH/
AQwBKAE4Af8BDAEoATgB/wEFARABFgH/AQUBEAEWAf8YAAEVATYBSQH/AScBZwGJAf8BCwEeASgB/wQA
AygB/wNrAf8DKAH/AygB/wQAAQsBHgEoAf8BJwFnAYkB/wEVATYBSQH/DAABCwEeASgB/wEVATYBSQH/
AScBZwGJAf8BCwEeASgB/xgAAQsBHgEoAf8BJwFnAYkB/wEVATYBSQH/AQsBHgEoAf8QAAM1Af8DwQH/
AzUB/xAAAzUB/wGaAbIBJwH/AzUB/xQAAQUBEAEWAf8BEwE+AVQB/wPWAf8DtwH/A7cB/wO3Af8DmQH/
A7cB/wEMASgBOAH/AQwBKAE4Af8BBQEQARYB/wEFARABFgH/FAABFQE2AUkB/wEeAU4BaAH/ASABJQEI
Af8BdwGKAR4B/wMoAf8DawH/A5YB/wMoAf8BHgFOAWgB/wEVATYBSQH/GAABFQE2AUkB/wEeAU4BaAH/
AQsBHgEoAf8QAAELAR4BKAH/AR4BTgFoAf8BFQE2AUkB/xQAAzUB/wPBAf8DwQH/A9gB/wM1Af8IAAM1
Af8BrAHHASsB/wGaAbIBJwH/AZoBsgEnAf8DNQH/DAABBQEQARYB/wETAT4BVAH/A9YB/wO3Af8BEwE+
AVQB/wEMASgBOAH/AQwBKAE4Af8DtwH/A5kB/wOZAf8DtwH/AQwBKAE4Af8BDAEoATgB/wEFARABFgH/
AQUBEAEWAf8QAAEgASUBCAH/AXcBigEeAf8BIAElAQgB/wEgASUBCAH/AygB/wMoAf8DlgH/AygB/yAA
ARUBNgFJAf8BJwFnAYkB/wELAR4BKAH/CAABCwEeASgB/wEnAWcBiQH/ARUBNgFJAf8YAAM1Af8D2AH/
A9gF/wM1Af8IAAM1Af8BywHrATMB/wGsAccBKwH/AawBxwErAf8DNQH/CAABBQEQARYB/wETAT4BVAH/
A9YB/wO3Af8BEwE+AVQB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEMASgBOAH/AQwBKAE4Af8DtwH/
A5kB/wO3Af8DmQH/AQwBKAE4Af8BBQEQARYB/wwAASABJQEIAf8BdwGKAR4B/wEgASUBCAH/AawBxwEr
Af8DRAX/A9gB/wMoAf8DlgH/AygB/yAAARUBNgFJAf8BJwFnAYkB/wELAR4BKAH/AQsBHgEoAf8BHgFO
AWgB/wEVATYBSQH/HAADNQH/A8EJ/wM1Af8IAAM1Af8BywHrATMB/wHLAesBMwH/AZoBsgEnAf8DNQH/
CAABCAEbASYB/wETAT4BVAH/A7cB/wETAT4BVAH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFl
Af8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BDAEoATgB/wOZAf8DtwH/A5kB/wNbAf8MAAEgASUBCAH/
AXcBigEeAf8BIAElAQgB/wNEBf8D2AX/AygB/wOWAf8DKAH/JAABFQE2AUkB/wELAR4BKAH/AScBZwGJ
Af8BFQE2AUkB/xwAAzUB/wPBAf8D2AH/A9gF/wM1Af8IAAM1Af8BywHrATMB/wGsAccBKwH/AawBxwEr
Af8BmgGyAScB/wM1Af8EAAEIARsBJgH/ARMBPgFUAf8BEwE+AVQB/wEXAUsBZQH/ARcBSwFlAf8BFwFL
AWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEMASgBOAH/
AQwBKAE4Af8DtwH/A1sB/wgAASABJQEIAf8BVQFjARUB/wEgASUBCAH/A0QF/wPYBf8DRAH/ATYBPwEO
Af8DKAH/A2sB/wMoAf8gAAELAR4BKAH/AScBZwGJAf8BFQE2AUkB/wELAR4BKAH/HAADNQH/A8EB/wPB
Af8DwQX/AzUB/wgAAzUB/wHLAesBMwH/AZoBsgEnAf8BmgGyAScB/wGaAbIBJwH/AzUB/wQAAQgBGwEm
Af8BEwE+AVQB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BFwFLAWUB/wEX
AUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEMASgBOAH/AQUBEAEW
Af8IAAEgASUBCAH/ASABJQEIAf8DRAX/A9gF/wNEAf8BrAHHASsB/wHLAesBMwH/ATYBPwEOAf8DKAH/
AygB/xQAA0QB/wQAAQsBHgEoAf8BJwFnAYkB/wEVATYBSQH/ARUBNgFJAf8BJwFnAYkB/wELAR4BKAH/
BAABNgE/AQ4B/xAAAzUB/wPBAf8D2AH/A9gF/wM1Af8IAAM1Af8BywHrATMB/wGsAccBKwH/AawBxwEr
Af8BmgGyAScB/wM1Af8EAAEIARsBJgH/AQgBGwEmAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BDAEo
ATgB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEMASgBOAH/AQwBKAE4Af8BDAEoATgB/wEXAUsBZQH/
ARcBSwFlAf8BCAEbASYB/xAAA0QF/wPYBf8DRAH/ATYBPwEOAf8BywHrATMB/wGsAccBKwH/AcsB6wEz
Af8BNgE/AQ4B/xQAA0QF/wELAR4BKAH/AScBZwGJAf8BFQE2AUkB/wgAARUBNgFJAf8BJwFnAYkB/wEL
AR4BKAH/AcsB6wEzAf8BNgE/AQ4B/wwAAzUB/wPBAf8DwQH/A8EF/wM1Af8IAAM1Af8BywHrATMB/wGa
AbIBJwH/AZoBsgEnAf8BmgGyAScB/wM1Af8MAAEIARsBJgH/AQgBGwEmAf8BFwFLAWUB/wEXAUsBZQH/
ARcBSwFlAf8BFwFLAWUB/wEMASgBOAH/AQwBKAE4Af8BDAEoATgB/wEXAUsBZQH/ARcBSwFlAf8BCAEb
ASYB/xAAA0QF/wPYBf8DRAH/CAABNgE/AQ4B/wHLAesBMwH/AawBxwErAf8BywHrATMB/wE2AT8BDgH/
DAADRAX/A9gB/wPBAf8BFQE2AUkB/xAAARUBNgFJAf8BmgGyAScB/wGsAccBKwH/AcsB6wEzAf8BNgE/
AQ4B/wgAAzUB/wPBAf8D2AH/A9gF/wM1Af8IAAM1Af8BywHrATMB/wGsAccBKwH/AawBxwErAf8BmgGy
AScB/wM1Af8UAAEIARsBJgH/AQgBGwEmAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BFwFLAWUB/wEX
AUsBZQH/ARcBSwFlAf8BCAEbASYB/xAAA0QF/wPYBf8DRAH/EAABNgE/AQ4B/wHLAesBMwH/AawBxwEr
Af8BywHrATMB/wE2AT8BDgH/BAADRAX/A9gB/wPBAf8D2AX/A0QB/wgAATYBPwEOAf8BywHrATMB/wGs
AccBKwH/AZoBsgEnAf8BrAHHASsB/wHLAesBMwH/ATYBPwEOAf8IAAM1Af8DNQH/A9gF/wM1Af8DNQH/
AzUB/wM1Af8BywHrATMB/wGsAccBKwH/AzUB/wM1Af8gAAEIARsBJgH/AQgBGwEmAf8BFwFLAWUB/wEX
AUsBZQH/ARcBSwFlAf8BCAEbASYB/xAAA0QF/wPYBf8DRAH/GAABNgE/AQ4B/wHLAesBMwH/AawBxwEr
Af8BywHrATMB/wE2AT8BDgH/A0QF/wPBAf8D2AX/A0QB/xAAATYBPwEOAf8BywHrATMB/wGsAccBKwH/
AZoBsgEnAf8BywHrATMB/wE2AT8BDgH/EAADNQH/AzUB/wM1Af8DNQH/AzUB/wM1Af8DNQH/AzUB/zAA
AQgBGwEmAf8BCAEbASYB/wEIARsBJgH/FAADRAH/A9gF/wNEAf8gAAE2AT8BDgH/AcsB6wEzAf8BrAHH
ASsB/wE2AT8BDgH/A0QB/wPBCf8DRAH/GAABNgE/AQ4B/wHLAesBMwH/AcsB6wEzAf8BmgGyAScB/wE2
AT8BDgH/gAADRAH/A0QB/wNEAf8oAAE2AT8BDgH/ATYBPwEOAf8BNgE/AQ4B/wQAA0QB/wNEAf8DRAH/
IAABNgE/AQ4B/wE2AT8BDgH/ATYBPwEOAf9EAAFKAWwBlgH/AToBVQF5Af8BXAGFAbkB/wFKAWwBlgH/
AUoBbAGWAf8BOgFVAXkB/wOHAf8BOgFVAXkB/wFKAWwBlgH/AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/
AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/ASkBPQFZAf8CWQGmAf8CWQGmAf8CTAGDAf8CHgE/Af8BFgEe
AV0B/wIJARkB/wIRASkB/wIIATwB/wJYAaQB/wFZAXIBrwH/AiQBSQH/AUABUgGQAf8CGgE4Af8CHAE8
Af8CHQE4Af8CcwHCAf8BmQLVAf8BxQL5Af8BpgHmAd8B/wGZAtUB/wGeAdwB2QH/AcUC+QH/AbUB9wHo
Af8BiQG9AcMB/wGeAdwB2QH/AZ4B3AHZAf8B0AL6Af8BtQH3AegB/wGJAb0BwwH/AYkBvQHDAf8BtgH4
AesB/wGeAdwB2QH/AU8BfgHHAf8BTwF+AccB/wFKAXcBvAH/ATYBVAGAAf8BdAGWAcwB/wE2AVQBgAH/
AWYBjQHJAf8BTwF+AccB/wFPAX4BxwH/AU8BfgHHAf8BSgF3AbwB/wE2AVQBgAH/AXQBlgHMAf8BNgFU
AYAB/wFmAY0ByQH/AU8BfgHHAf8BSgFsAZYB/wE6AVUBeQH/ASkBPQFZAf8BXAGFAbkB/wE6AVUBeQH/
ASkBPQFZAf8BOgFVAXkB/wEpAT0BWQH/AVwBhQG5Af8BXAGFAbkB/wE6AVUBeQH/AUoBbAGWAf8BOgFV
AXkB/wE6AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wI1AWgB/wIRASkB/wIJASYB/wJnAa8B/wIGAV4B/wI4
AWwB/wIGAVkB/wIIATwB/wInAU4B/wIIATwB/wFZAXIBrwH/AggBaAH/AlgBlQH/AkgBiAH/AhQBLwH/
AhkBMgH/AbUB9wHoAf8BlAHQAdQB/wGJAb0BwwH/AZ4B3AHZAf8BpgHmAd4B/wGeAdwB2QH/AZ4B3gHZ
Af8BvQH5AfQB/wG8AfgB8gH/Ab0B+QH0Af8BngHcAdkB/wG2AfgB6wH/Aa0B7QHgAf8BxQL5Af8BxQL5
Af8BtAH4AewB/wFPAX4BxwH/AUoBdwG8Af8BNgFUAYAB/wGLAaYBzwH/AYsBpgHPAf8BdAGWAcwB/wE2
AVQBgAH/AVcBewGyAf8BRwFxAbEB/wFDAWwBqQH/ATYBVAGAAf8BiwGmAc8B/wGLAaYBzwH/AXQBlgHM
Af8BNgFUAYAB/wFmAY0ByQH/AToBVQF5Af8BSgFsAZYB/wE6AVUBeQH/AToBVQF5Af8BRAFYAXQB/wE6
AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/ASkBPQFZAf8BXAGFAbkB/wEpAT0BWQH/AToBVQF5
Af8BXAGFAbkB/wFKAWwBlgH/AUoBbAGWAf8CeAHKAf8CTAGDAf8CMgFjAf8CdwHJAf8CDAF8Af8CXAGq
Af8CNgFfAf8CCQEcAf8COgFnAf8CEwGaAf8CaQGyAf8CBgFaAf8CXQGeAf8CBgFaAf8CQQF8Af8CGQEx
Af8BiQG9AcMB/wGJAb0BwwH/AZUBzQHTAf8BmQLVAf8BtQH3AegB/wG2AfgB6wH/AdAC+gH/AbUB9wHo
Af8BpgHmAd4B/wGZAtcB/wGeAd4B2QH/AbYB+AHrAf8BngHeAdkB/wGUAdMB1AH/AZ4B3AHZAf8BxQL5
Af8BZgGNAckB/wE2AVQBgAH/AYsBpgHPAf8BeQGRAbUB/wE8AUgBWgH/ATwBSAFaAf8BMgFBAVkB/wEX
ASQBNwH/ASYBNQFNAf8BFwEkATcB/wE8AUgBWgH/ATwBSAFaAf8BPAFIAVoB/wF5AZEBtQH/AXQBlgHM
Af8BNgFUAYAB/wE6AVUBeQH/ASkBPQFZAf8BSgFsAZYB/wE6AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wFc
AYUBuQH/AToBVQF5Af8BOgFVAXkB/wE6AVUBeQH/AToBVQF5Af8BOgFVAXkB/wE6AVUBeQH/AToBVQF5
Af8BXAGFAbkB/wFcAYUBuQH/AnMBwgH/AlkBpgH/AhEBKQH/AhkBMgH/AhEBKQH/AgkBHAH/AjoBZwH/
AgYBWgH/AiUBRQH/AgkBGwH/AnMBwgH/AgsBdQH/Ak8BiAH/AjwBcwH/AT4BUAGNAf8CNgFfAf8BtgH4
AesB/wGJAb0BwwH/AYwBwAHGAf8BjAHAAcYB/wHFAvkB/wGeAd4B2QH/AYkBvQHDAf8BlQHNAdMB/wGJ
Ab0BwwH/AYkBvQHDAf8BtgH4AesB/wG2AfgB6wH/AYkBvQHDAf8BmQLXAf8BmQLXAf8BxQL5Af8BNgFU
AYAB/wGLAaYBzwH/AYsBpgHPAf8BPAFIAVoB/wHNAcIBxQH/Aa8BpQGoAf8BpwGdAZ8B/wGZAY8BkQH/
AYABdAF3Af8BgAF0AXcB/wGAAXQBdwH/AYABdAF3Af8BgAF0AXcB/wE8AUgBWgH/AYsBpgHPAf8BdAGW
AcwB/wFKAWwBlgH/AToBVQF5Af8BOgFVAXkB/wFKAWwBlgH/AUoBbAGWAf8BXAGFAbkB/wE6AVUBeQH/
AUoBbAGWAf8DbAH/AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/ASkBPQFZAf8BSgFsAZYB/wE6AVUBeQH/
ASkBPQFZAf8CNgFfAf8CCAE8Af8CZgGtAf8CTgGGAf8CMAFgAf8CCQEcAf8CTwGIAf8CPAFzAf8CXQGe
Af8CPAFzAf8CEQEpAf8CCAEyAf8CbwG8Af8CJwFOAf8CCAE8Af8CGQEyAf8BxQL5Af8BtgH4AesB/wHF
AvkB/wHFAvkB/wG2AfgB6wH/AYkBvQHDAf8BiQG9AcMB/wGeAdwB2QH/AaYB5gHeAf8BxgH6AfkB/wG2
AfgB6wH/AbYB+AHrAf8BiQG9AcMB/wGZAtUB/wGTAckBzwH/AZ4B3AHZAf8BPwFjAZoB/wE2AVQBgAH/
AYsBpgHPAf8BPAFIAVoB/wHNAcIBxQH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGw
AbMB/wG5AbABswH/AbkBsAGzAf8BgAF0AXcB/wE8AUgBWgH/AYsBpgHPAf8BNgFUAYAB/wE6AVUBeQH/
AUoBbAGWAf8BOgFVAXkB/wFcAYUBuQH/AVwBhQG5Af8BOgFVAXkB/wFcAYUBuQH/AUoBbAGWAf8BKQE9
AVkB/wFcAYUBuQH/AVwBhQG5Af8BKQE9AVkB/wFKAWwBlgH/AUoBbAGWAf8DhwH/AToBVQF5Af8CJwFO
Af8CDAF7Af8BUwFrAagB/wJPAYgB/wI8AXMB/wIJARcB/wJZAaYB/wI8AXMB/wJPAYgB/wI8AXMB/wJA
AXoB/wIJARwB/wI3AWIB/wInAU4B/wIKAXIB/wI/AXgB/wHFAvkB/wG9AfkB9AH/AZQB0wHUAf8BngHc
AdkB/wHQAvoB/wG2AfgB6wH/AbYB+AHrAf8BtQH3AegB/wHFAvkB/wGeAdwB2QH/AZ4B3AHZAf8B0AL6
Af8BtgH4AesB/wGJAb0BwwH/AYkBvQHDAf8BngHcAdkB/wFPAX4BxwH/AT8BYwGaAf8BNgFUAYAB/wE8
AUgBWgH/Ac0BwgHFAf8BuQGwAbMB/wEjASUBggH/AbkBsAGzAf8BdwF6Ac4B/wG5AbABswH/AWcBaQGs
Af8BuQGwAbMB/wGAAXQBdwH/ATwBSAFaAf8BNgFUAYAB/wFKAXcBvAH/AToBVQF5Af8BSgFsAZYB/wEp
AT0BWQH/AToBVQF5Af8BOgFVAXkB/wEpAT0BWQH/ASkBPQFZAf8BOgFVAXkB/wE6AVUBeQH/AToBVQF5
Af8BOgFVAXkB/wE6AVUBeQH/AVwBhQG5Af8BXAGFAbkB/wE6AVUBeQH/AUoBbAGWAf8CQgF+Af8CJwFO
Af8CcwHCAf8CDwGHAf8CBgFgAf8CHAE3Af8CWQGmAf8CBwFGAf8BhgGqAeUB/wJFAYMB/wFmAYIBvwH/
AjYBXwH/AigBUAH/An0B0wH/AgYBWgH/AgYBWgH/AbYB+AHrAf8BngHcAdkB/wGZAtUB/wGeAdwB2QH/
AZUBzQHTAf8B0AL6Af8BtQH3AegB/wGmAeYB3gH/AYkBvQHDAf8BiQG9AcMB/wGtAe0B4AH/AZ4B3AHZ
Af8B0AL6Af8BtgH4AesB/wGJAb0BwwH/AYkBvQHDAf8BTwF+AccB/wFPAX4BxwH/AT8BYwGaAf8BFwEk
ATcB/wHVAcoBzQH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/
AbkBsAGzAf8BgAF0AXcB/wEXASQBNwH/AUoBdwG8Af8BTwF+AccB/wFKAWwBlgH/AToBVQF5Af8BOgFV
AXkB/wFKAWwBlgH/AToBVQF5Af8BSgFsAZYB/wE6AVUBeQH/ASkBPQFZAf8BOgFVAXkB/wFKAWwBlgH/
AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/AToBVQF5Af8BKQE9AVkB/wE6AVUBeQH/AjoBcAH/AgoBFAH/
AjYBXwH/Ag8BigH/Ag0BgwH/AVkBcgGvAf8BSwFhAZ4B/wJZAaYB/wJrAbYB/wI6AXEB/wIoAVEB/wIm
AUcB/wIVAS8B/wMKAf8CggHZAf8BfwGiAd4B/wG2AfgB6wH/AYkBvQHDAf8BiQG9AcMB/wGJAb0BwwH/
AZ4B3AHZAf8BvQH5AfQB/wGJAb0BwwH/AYwBwAHGAf8BiQG9AcMB/wGJAb0BwwH/AZMBywHTAf8BrQHt
AeAB/wGJAb0BwwH/AZQB0AHUAf8BtAH4AewB/wG2AfgB6wH/AU8BfgHHAf8BTwF+AccB/wFPAX4BxwH/
ARoBKQE/Af8B1QHKAc0B/wG5AbABswH/AT4BhwHCAf8BuQGwAbMB/wF3AXoBzgH/AbkBsAGzAf8BNgE6
Ac0B/wG5AbABswH/AYABdAF3Af8BJgE1AU0B/wFPAX4BxwH/AU8BfgHHAf8BOgFVAXkB/wE6AVUBeQH/
AVwBhQG5Af8BXAGFAbkB/wFKAWwBlgH/AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/AUoBbAGWAf8BKQE9
AVkB/wFKAWwBlgH/AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wI8AXMB/wJP
AYgB/wITASkB/wIuAVQB/wJVAZ8B/wJzAcIB/wInAU4B/wIgAUMB/wI3AWEB/wIIAS0B/wIZATIB/wJW
AZIB/wIGAVoB/wIZATIB/wIHAUAB/wIRAZEB/wGiAeIB2QH/AaYB5gHfAf8BpgHmAd4B/wHFAvkB/wHQ
AvoB/wHQAvoB/wHFAvkB/wGUAdMB1AH/AYkBvQHDAf8BngHcAdkB/wG9AfkB9AH/AbQB+AHsAf8BpgHm
Ad4B/wHFAvkB/wG9AfkB9AH/AbUB9wHoAf8BTwF+AccB/wFPAX4BxwH/AU8BfgHHAf8BFwEkATcB/wHa
Ac8B0gH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGz
Af8BmQGPAZEB/wEXASQBNwH/AWYBjQHJAf8BTwF+AccB/wFcAYUBuQH/AToBVQF5Af8BOgFVAXkB/wE6
AVUBeQH/A4cB/wE6AVUBeQH/AToBVQF5Af8BXAGFAbkB/wFcAYUBuQH/AToBVQF5Af8BXAGFAbkB/wFc
AYUBuQH/AToBVQF5Af8BSgFsAZYB/wE6AVUBeQH/AUoBbAGWAf8CBgFaAf8CTwGIAf8CPAFzAf8CNgFf
Af8CLgFbAf8CCQEcAf8CGQEyAf8CKAFSAf8COAFkAf8CCAFnAf8CZwGwAf8CTwGIAf8CNAFlAf8CTwGI
Af8CBgFZAf8CCAE3Af8BpgHmAd8B/wGZAtUB/wG8AfgB8gH/AYkBvQHDAf8BngHcAdkB/wGeAd4B2QH/
AZ4B3gHZAf8BtgH4AesB/wG2AfgB6wH/AbYB+AHrAf8BngHcAdkB/wGVAc0B0wH/AZQB0wHUAf8BkwHJ
Ac8B/wG8AfgB8gH/AcUC+QH/AU8BfgHHAf8BTwF+AccB/wE2AVQBgAH/ATwBSAFaAf8B1gHLAc4B/wG5
AbABswH/AVEBVAGoAf8BuQGwAbMB/wEsAS4BogH/AbkBsAGzAf8BMgFsAU4B/wG5AbABswH/AacBnQGf
Af8BMgFBAVkB/wE2AVQBgAH/AWYBjQHJAf8BOgFVAXkB/wEpAT0BWQH/AUoBbAGWAf8BSgFsAZYB/wE6
AVUBeQH/AUoBbAGWAf8BKQE9AVkB/wEpAT0BWQH/ASkBPQFZAf8BOgFVAXkB/wE6AVUBeQH/ASkBPQFZ
Af8BOgFVAXkB/wE6AVUBeQH/AToBVQF5Af8BXAGFAbkB/wIHAU8B/wJUAY8B/wI6AXAB/wI2AV8B/wI4
AWwB/wIHAWMB/wJPAYgB/wIZATIB/wJtAbgB/wKCAdkB/wJKAYEB/wJWAZIB/wFEAVcBlQH/AjQBXQH/
AgoBFAH/AhIBKwH/AYkBvQHDAf8BngHeAdkB/wGmAeYB3gH/AYkBvQHDAf8BiQG9AcMB/wGJAb0BwwH/
AbYB+AHrAf8BxQL5Af8BtQH3AegB/wGJAb0BwwH/AYkBvQHDAf8BngHcAdkB/wGVAc0B0wH/AZ4B3AHZ
Af8BmQLVAf8BtQH3AegB/wFmAY0ByQH/ATYBVAGAAf8BiwGmAc8B/wE8AUgBWgH/AdYBywHOAf8BuQGw
AbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wGvAaUBqAH/
ATwBSAFaAf8BdAGWAcwB/wE2AVQBgAH/AUoBbAGWAf8BOgFVAXkB/wFKAWwBlgH/AVwBhQG5Af8BKQE9
AVkB/wFKAWwBlgH/AToBVQF5Af8BOgFVAXkB/wEpAT0BWQH/ASkBPQFZAf8BKQE9AVkB/wNsAf8BOgFV
AXkB/wFKAWwBlgH/ASkBPQFZAf8BOgFVAXkB/wGBAaUB4QH/AnMBwgH/AT4BUAGNAf8CNgFfAf8CcwHC
Af8CVAGPAf8CVAGPAf8CCQEhAf8CNgFfAf8CUQGXAf8CTgGSAf8CYwGoAf8CIAFEAf8BVQFtAaoB/wIN
AX4B/wI2AV8B/wGMAcABxgH/AYkBvQHDAf8BxQL5Af8BxQL5Af8BxQL5Af8BxQL5Af8BtQH3AegB/wGe
AdwB2QH/AdAC+gH/AcUC+QH/AYkBvQHDAf8BiQG9AcMB/wGeAdwB2QH/AZ4B3AHZAf8BtgH4AesB/wGr
Ae0B3gH/ATYBVAGAAf8BiwGmAc8B/wGLAaYBzwH/ATwBSAFaAf8B3QHSAdUB/wHaAc8B0gH/AdoBzwHS
Af8B2gHPAdIB/wHVAcoBzQH/Ac0BwgHFAf8BzQHCAcUB/wHNAcIBxQH/Ac0BwgHFAf8BPAFIAVoB/wGL
AaYBzwH/AXQBlgHMAf8BKQE9AVkB/wNsAf8BKQE9AVkB/wEpAT0BWQH/AUcBsQFxAf8BKQE9AVkB/wEp
AT0BWQH/ASkBPQFZAf8BNQGfAV8B/wEpAT0BWQH/AUMBrQFtAf8BKQE9AVkB/wE6AVUBeQH/ASkBPQFZ
Af8BKQE9AVkB/wE6AVUBeQH/AkQBdwH/AiYBRgH/AgkBFwH/AjYBXwH/AlwBrAH/Aj0BawH/Al4BoAH/
AVkBcgGvAf8CGQEyAf8CJAFLAf8CEQEpAf8CHQE5Af8CJwFOAf8CbQG4Af8CDwGJAf8CNAFdAf8BtgH4
AesB/wG2AfgB6wH/AYkBvQHDAf8BngHeAdkB/wGpAekB3gH/AcUC+QH/AZ4B3AHZAf8BngHcAdkB/wGV
Ac0B0wH/AZ4B3AHZAf8BxQL5Af8BxQL5Af8BiQG9AcMB/wG2AfgB6wH/AbYB+AHrAf8BxQL5Af8BPwFj
AZoB/wE2AVQBgAH/AYsBpgHPAf8BeQGRAbUB/wE8AUgBWgH/ATwBSAFaAf8BPAFIAVoB/wEXASQBNwH/
ARsBKwFDAf8BFwEkATcB/wE8AUgBWgH/ATwBSAFaAf8BPAFIAVoB/wF5AZEBtQH/AYsBpgHPAf8BNgFU
AYAB/wFdAbwBjQH/ASkBPQFZAf8BbAHLAZwB/wE6AaQBZAH/AT8BqQFpAf8BKQE9AVkB/wFGAbABcAH/
ASkBPQFZAf8BSgG0AXQB/wFVAb8BfwH/AWIBwQGSAf8BZwHGAZcB/wEpAT0BWQH/AS0BlwFXAf8BNgGg
AWAB/wEpAT0BWQH/AjIBWwH/AjwBcwH/Ak8BiAH/AhMBKAH/AiUBTQH/Ag0BgwH/AnMBwgH/AgYBXgH/
Ag4BJAH/AgoBFwH/AkIBfgH/AgYBWgH/AhEBKQH/AjYBXwH/AggBPAH/AlIBjQH/AbYB+AHrAf8BiQG9
AcMB/wGeAd4B2QH/AZ4B3AHZAf8BngHcAdkB/wHFAvkB/wGJAb0BwwH/AZMByQHPAf8BngHcAdkB/wGe
AdwB2QH/AZkC1QH/AcUC+QH/AbQB+AHsAf8BtgH4AesB/wGMAcABxgH/AZkC1wH/AU8BfgHHAf8BPwFj
AZoB/wE2AVQBgAH/AYsBpgHPAf8BiwGmAc8B/wGLAaYBzwH/ATYBVAGAAf8BSgF3AbwB/wFPAX4BxwH/
AT8BYwGaAf8BNgFUAYAB/wGLAaYBzwH/AYsBpgHPAf8BiwGmAc8B/wE2AVQBgAH/AUoBdwG8Af8BSwG1
AXUB/wFCAawBbAH/AVoBuQGKAf8BUQGwAYEB/wFTAbIBgwH/ASkBPQFZAf8BPgGoAWgB/wE4AaIBYgH/
ATUBnwFfAf8BYwHCAZMB/wFgAb8BkAH/AUkBswFzAf8BNwGhAWEB/wFCAawBbAH/AT0BpwFnAf8BQQGr
AWsB/wJzAcIB/wJZAaYB/wIHAUUB/wJPAYgB/wIKAR0B/wInAU4B/wJzAcIB/wINAYMB/wInAU4B/wIG
AVoB/wJWAZIB/wIGAVoB/wIIAWgB/wEjAS8BbQH/AjIBYgH/AmMBqQH/AZQB0wHUAf8BtgH4AesB/wGJ
Ab0BwwH/AYkBvQHDAf8BmQLVAf8BtQH3AegB/wGJAb0BwwH/AZkC1QH/AYkBvQHDAf8BlQHNAdMB/wGV
Ac0B0wH/AbYB+AHrAf8BtAH4AewB/wGJAb0BwwH/AZ4B3AHZAf8BngHcAdkB/wFPAX4BxwH/AU8BfgHH
Af8BPwFjAZoB/wE2AVQBgAH/AYsBpgHPAf8BNgFUAYAB/wFKAXcBvAH/AU8BfgHHAf8BTwF+AccB/wFP
AX4BxwH/AT8BYwGaAf8BNgFUAYAB/wGLAaYBzwH/ATYBVAGAAf8BSgF3AbwB/wFPAX4BxwH/AUoBtAF0
Af8BTAG2AXYB/wFJAbMBcwH/ATwBpgFmAf8BPAGmAWYB/wFFAa8BbwH/ATUBnwFfAf8BQgGsAWwB/wFU
Ab4BfgH/AUwBtgF2Af8BQAGqAWoB/wE9AacBZwH/AT8BqQFpAf8BNwGhAWEB/wEmAZABUAH/AUMBrQFt
Af8CcwHCAf8CWQGmAf8CWQGmAf8CUwGaAf8BaQGGAcIB/wI8AXMB/wIoAVIB/wInAU4B/wInAU4B/wIN
AYMB/wJzAcIB/wJZAaYB/wI9AXQB/wInAU4B/wJcAakB/wJzAcIB/wGeAd4B2QH/AbQB+AHsAf8BtgH4
AesB/wGJAb0BwwH/AYkBvQHDAf8BngHcAdkB/wGpAekB3gH/AYkBvQHDAf8BiQG9AcMB/wGeAd4B2QH/
AbQB+AHsAf8BxQL5Af8BxQL5Af8BrQHtAeAB/wGJAb0BwwH/AYkBvQHDAf8BTwF+AccB/wFPAX4BxwH/
AU8BfgHHAf8BPwFjAZoB/wE2AVQBgAH/AWYBjQHJAf8BTwF+AccB/wFPAX4BxwH/AU8BfgHHAf8BTwF+
AccB/wFPAX4BxwH/AT8BYwGaAf8BNgFUAYAB/wFmAY0ByQH/AU8BfgHHAf8BTwF+AccB/wFCAU0BPgcA
AT4DAAEoAwABQAMAATADAAEBAQABAQUAAYABARYAA/+BAAL/AR8B+AT/AfgB/wEfAfgBzwHzAv8B8AE/
AQwB8AGPAfEC5wHgAQ8BxAEjAYcB4QHjAccBwAEDAeABBwHjAccBwQGDAYABAAHwAQ8B8QGPAcEBgwIA
AeABBwH4AR8BwQGDAgAB4AEHAfwBPwKBAgABwAEDAfwBPwKBAgABwAEDAegBFwKBAQABAQHgAQcBwQGD
AoEBwAEDAcECgwHBAoEB8AEHAYMBwQEBAYABwAEDAfwBDwEHAeABAwHAAfABDwH/AR8BDwHwAQcB4AT/
AR8B+AGPAfEC/4AACw==
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACK
NAAAAk1TRnQBSQFMAgEBCQEAARgBAQEYAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABMAMAAQEBAAEgBgABMBIAATkBXgFzAf8BOQFeAXMB/wE5AV4BcwH/AT4BYgF8Af8BMwFUAWkB/wEz
AVQBaQH/AT4BYgF8Af8BMwFUAWkB/wE5AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wEzAVQBaQH/ASYBPQFM
Af8BMwFUAWkB/wEzAVQBaQH/ATkBXgFzAf/AAAFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/
AU0BhAGfAf8BYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf8BYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf8BWgGQ
AbQB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/wAABWgGQAbQB/wFNAYQBnwH/ATkBXgFz
Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/AWIBmAG8Af8BWgGQAbQB/wFa
AZABtAH/AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BWgGQAbQB/8AAAWIBmAG8Af8BYgGY
AbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/AWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/
ATkBXgFzAf8BTQGEAZ8B/wFNAYQBnwH/AVoBkAG0Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af/AAAE5
AV4BcwH/ATMBVAFpAf8BOQFeAXMB/wE5AV4BcwH/ATMBVAFpAf8BMwFUAWkB/wEzAVQBaQH/ATkBXgFz
Af8BOQFeAXMB/wE5AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wEzAVQBaQH/ATMBVAFpAf8BMwFUAWkB/wE5
AV4BcwH/wAABYgGYAbwB/wFaAZABtAH/AVoBkAG0Af8BWgGQAbQB/wFiAZgBvAH/AWIBmAG8Af8BTQGE
AZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFaAZABtAH/AVoBkAG0Af8BWgGQAbQB/wFaAZABtAH/
AVoBkAG0Af8BTQGEAZ8B/8AAAU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFi
AZgBvAH/AVoBkAG0Af8BWgGQAbQB/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wE5AV4BcwH/AWIBmAG8
Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf/AAAFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/
AWIBmAG8Af8BOQFeAXMB/wFNAYQBnwH/AWIBmAG8Af8BYgGYAbwB/wFaAZABtAH/AVoBkAG0Af8BWgGQ
AbQB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/wAABOQFeAXMB/wE5AV4BcwH/ATMBVAFp
Af8BMwFUAWkB/wEzAVQBaQH/ATMBVAFpAf8BMwFUAWkB/wE5AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wEz
AVQBaQH/ATMBVAFpAf8BMwFUAWkB/wEzAVQBaQH/ATkBXgFzAf8BOQFeAXMB/8AAAWIBmAG8Af8BYgGY
AbwB/wFiAZgBvAH/AVoBkAG0Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/
AU0BhAGfAf8BOQFeAXMB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af/AAAFN
AYQBnwH/AU0BhAGfAf8BOQFeAXMB/wFaAZABtAH/AVoBkAG0Af8BWgGQAbQB/wFiAZgBvAH/AU0BhAGf
Af8BWgGQAbQB/wFaAZABtAH/AVoBkAG0Af8BWgGQAbQB/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFN
AYQBnwH/wAABYgGYAbwB/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFNAYQBnwH/AWIBmAG8Af8BYgGY
AbwB/wFNAYQBnwH/AWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/ATkBXgFzAf8BWgGQAbQB/wFaAZABtAH/
AVoBkAG0Af8BYgGYAbwB/8AAATMBVAFpAf8BMwFUAWkB/wEzAVQBaQH/ATkBXgFzAf8BOQFeAXMB/wE5
AV4BcwH/ATkBXgFzAf8BOQFeAXMB/wE5AV4BcwH/ATkBXgFzAf8BMwFUAWkB/wEzAVQBaQH/ATMBVAFp
Af8BMwFUAWkB/wE5AV4BcwH/ATkBXgFzAf/AAAFiAZgBvAH/AWIBmAG8Af8BTQGEAZ8B/wFNAYQBnwH/
AU0BhAGfAf8BTQGEAZ8B/wFaAZABtAH/AVoBkAG0Af8BOQFeAXMB/wFiAZgBvAH/AWIBmAG8Af8BWgGQ
AbQB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFNAYQBnwH/wAABYgGYAbwB/wFiAZgBvAH/AVoBkAG0
Af8BOQFeAXMB/wFaAZABtAH/AVoBkAG0Af8BTQGEAZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFN
AYQBnwH/AVoBkAG0Af8BTQGEAZ8B/wFaAZABtAH/AWIBmAG8Af8BTQGEAZ8B/8AAAWIBmAG8Af8BTQGE
AZ8B/wFNAYQBnwH/AU0BhAGfAf8BTQGEAZ8B/wFiAZgBvAH/AWIBmAG8Af8BWgGQAbQB/wFNAYQBnwH/
AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AWIBmAG8Af8BYgGYAbwB/wFiAZgBvAH/AU0BhAGfAf//AAEA
ASABJQEIAf8BIAElAQgB/wEgASUBCAH/KAADKAH/AygB/wMoAf+UAAEFARABFgH/AQUBEAEWAf8BBQEQ
ARYB/yAAASABJQEIAf8BdwGKAR4B/wEgASUBCAH/KAADKAH/A5YB/wMoAf8IAAEVATYBSQH/AQsBHgEo
Af8gAAELAR4BKAH/ARUBNgFJAf9YAAEFARABFgH/ARMBPgFUAf8BDAEoATgB/wEMASgBOAH/AQUBEAEW
Af8BBQEQARYB/xgAASABJQEIAf8BIAElAQgB/wEeAU4BaAH/AQsBHgEoAf8IAAMoAf8DKAH/EAABCwEe
ASgB/wEeAU4BaAH/AygB/wMoAf8EAAEVATYBSQH/AScBZwGJAf8BCwEeASgB/yAAAQsBHgEoAf8BJwFn
AYkB/wEVATYBSQH/EAADNQH/AzUB/xgAAzUB/wM1Af8YAAEFARABFgH/ARMBPgFUAf8D1gH/A5kB/wOZ
Af8BDAEoATgB/wEMASgBOAH/AQUBEAEWAf8BBQEQARYB/xgAARUBNgFJAf8BJwFnAYkB/wELAR4BKAH/
BAADKAH/A2sB/wMoAf8DKAH/BAABCwEeASgB/wEnAWcBiQH/ARUBNgFJAf8MAAELAR4BKAH/ARUBNgFJ
Af8BJwFnAYkB/wELAR4BKAH/GAABCwEeASgB/wEnAWcBiQH/ARUBNgFJAf8BCwEeASgB/xAAAzUB/wPB
Af8DNQH/EAADNQH/AZoBsgEnAf8DNQH/FAABBQEQARYB/wETAT4BVAH/A9YB/wO3Af8DtwH/A7cB/wOZ
Af8DtwH/AQwBKAE4Af8BDAEoATgB/wEFARABFgH/AQUBEAEWAf8UAAEVATYBSQH/AR4BTgFoAf8BIAEl
AQgB/wF3AYoBHgH/AygB/wNrAf8DlgH/AygB/wEeAU4BaAH/ARUBNgFJAf8YAAEVATYBSQH/AR4BTgFo
Af8BCwEeASgB/xAAAQsBHgEoAf8BHgFOAWgB/wEVATYBSQH/FAADNQH/A8EB/wPBAf8D2AH/AzUB/wgA
AzUB/wGsAccBKwH/AZoBsgEnAf8BmgGyAScB/wM1Af8MAAEFARABFgH/ARMBPgFUAf8D1gH/A7cB/wET
AT4BVAH/AQwBKAE4Af8BDAEoATgB/wO3Af8DmQH/A5kB/wO3Af8BDAEoATgB/wEMASgBOAH/AQUBEAEW
Af8BBQEQARYB/xAAASABJQEIAf8BdwGKAR4B/wEgASUBCAH/ASABJQEIAf8DKAH/AygB/wOWAf8DKAH/
IAABFQE2AUkB/wEnAWcBiQH/AQsBHgEoAf8IAAELAR4BKAH/AScBZwGJAf8BFQE2AUkB/xgAAzUB/wPY
Af8D2AX/AzUB/wgAAzUB/wHLAesBMwH/AawBxwErAf8BrAHHASsB/wM1Af8IAAEFARABFgH/ARMBPgFU
Af8D1gH/A7cB/wETAT4BVAH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BDAEoATgB/wO3
Af8DmQH/A7cB/wOZAf8BDAEoATgB/wEFARABFgH/DAABIAElAQgB/wF3AYoBHgH/ASABJQEIAf8BrAHH
ASsB/wNEBf8D2AH/AygB/wOWAf8DKAH/IAABFQE2AUkB/wEnAWcBiQH/AQsBHgEoAf8BCwEeASgB/wEe
AU4BaAH/ARUBNgFJAf8cAAM1Af8DwQn/AzUB/wgAAzUB/wHLAesBMwH/AcsB6wEzAf8BmgGyAScB/wM1
Af8IAAEIARsBJgH/ARMBPgFUAf8DtwH/ARMBPgFUAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFL
AWUB/wEXAUsBZQH/ARcBSwFlAf8BDAEoATgB/wEMASgBOAH/A5kB/wO3Af8DmQH/A1sB/wwAASABJQEI
Af8BdwGKAR4B/wEgASUBCAH/A0QF/wPYBf8DKAH/A5YB/wMoAf8kAAEVATYBSQH/AQsBHgEoAf8BJwFn
AYkB/wEVATYBSQH/HAADNQH/A8EB/wPYAf8D2AX/AzUB/wgAAzUB/wHLAesBMwH/AawBxwErAf8BrAHH
ASsB/wGaAbIBJwH/AzUB/wQAAQgBGwEmAf8BEwE+AVQB/wETAT4BVAH/ARcBSwFlAf8BFwFLAWUB/wEX
AUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4
Af8BDAEoATgB/wO3Af8DWwH/CAABIAElAQgB/wFVAWMBFQH/ASABJQEIAf8DRAX/A9gF/wNEAf8BNgE/
AQ4B/wMoAf8DawH/AygB/yAAAQsBHgEoAf8BJwFnAYkB/wEVATYBSQH/AQsBHgEoAf8cAAM1Af8DwQH/
A8EB/wPBBf8DNQH/CAADNQH/AcsB6wEzAf8BmgGyAScB/wGaAbIBJwH/AZoBsgEnAf8DNQH/BAABCAEb
ASYB/wETAT4BVAH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BDAEoATgB/wEXAUsBZQH/
ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BBQEQ
ARYB/wgAASABJQEIAf8BIAElAQgB/wNEBf8D2AX/A0QB/wGsAccBKwH/AcsB6wEzAf8BNgE/AQ4B/wMo
Af8DKAH/FAADRAH/BAABCwEeASgB/wEnAWcBiQH/ARUBNgFJAf8BFQE2AUkB/wEnAWcBiQH/AQsBHgEo
Af8EAAE2AT8BDgH/EAADNQH/A8EB/wPYAf8D2AX/AzUB/wgAAzUB/wHLAesBMwH/AawBxwErAf8BrAHH
ASsB/wGaAbIBJwH/AzUB/wQAAQgBGwEmAf8BCAEbASYB/wEXAUsBZQH/ARcBSwFlAf8BFwFLAWUB/wEM
ASgBOAH/ARcBSwFlAf8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BDAEoATgB/wEMASgBOAH/ARcBSwFl
Af8BFwFLAWUB/wEIARsBJgH/EAADRAX/A9gF/wNEAf8BNgE/AQ4B/wHLAesBMwH/AawBxwErAf8BywHr
ATMB/wE2AT8BDgH/FAADRAX/AQsBHgEoAf8BJwFnAYkB/wEVATYBSQH/CAABFQE2AUkB/wEnAWcBiQH/
AQsBHgEoAf8BywHrATMB/wE2AT8BDgH/DAADNQH/A8EB/wPBAf8DwQX/AzUB/wgAAzUB/wHLAesBMwH/
AZoBsgEnAf8BmgGyAScB/wGaAbIBJwH/AzUB/wwAAQgBGwEmAf8BCAEbASYB/wEXAUsBZQH/ARcBSwFl
Af8BFwFLAWUB/wEXAUsBZQH/AQwBKAE4Af8BDAEoATgB/wEMASgBOAH/ARcBSwFlAf8BFwFLAWUB/wEI
ARsBJgH/EAADRAX/A9gF/wNEAf8IAAE2AT8BDgH/AcsB6wEzAf8BrAHHASsB/wHLAesBMwH/ATYBPwEO
Af8MAANEBf8D2AH/A8EB/wEVATYBSQH/EAABFQE2AUkB/wGaAbIBJwH/AawBxwErAf8BywHrATMB/wE2
AT8BDgH/CAADNQH/A8EB/wPYAf8D2AX/AzUB/wgAAzUB/wHLAesBMwH/AawBxwErAf8BrAHHASsB/wGa
AbIBJwH/AzUB/xQAAQgBGwEmAf8BCAEbASYB/wEXAUsBZQH/ARcBSwFlAf8BDAEoATgB/wEXAUsBZQH/
ARcBSwFlAf8BFwFLAWUB/wEIARsBJgH/EAADRAX/A9gF/wNEAf8QAAE2AT8BDgH/AcsB6wEzAf8BrAHH
ASsB/wHLAesBMwH/ATYBPwEOAf8EAANEBf8D2AH/A8EB/wPYBf8DRAH/CAABNgE/AQ4B/wHLAesBMwH/
AawBxwErAf8BmgGyAScB/wGsAccBKwH/AcsB6wEzAf8BNgE/AQ4B/wgAAzUB/wM1Af8D2AX/AzUB/wM1
Af8DNQH/AzUB/wHLAesBMwH/AawBxwErAf8DNQH/AzUB/yAAAQgBGwEmAf8BCAEbASYB/wEXAUsBZQH/
ARcBSwFlAf8BFwFLAWUB/wEIARsBJgH/EAADRAX/A9gF/wNEAf8YAAE2AT8BDgH/AcsB6wEzAf8BrAHH
ASsB/wHLAesBMwH/ATYBPwEOAf8DRAX/A8EB/wPYBf8DRAH/EAABNgE/AQ4B/wHLAesBMwH/AawBxwEr
Af8BmgGyAScB/wHLAesBMwH/ATYBPwEOAf8QAAM1Af8DNQH/AzUB/wM1Af8DNQH/AzUB/wM1Af8DNQH/
MAABCAEbASYB/wEIARsBJgH/AQgBGwEmAf8UAANEAf8D2AX/A0QB/yAAATYBPwEOAf8BywHrATMB/wGs
AccBKwH/ATYBPwEOAf8DRAH/A8EJ/wNEAf8YAAE2AT8BDgH/AcsB6wEzAf8BywHrATMB/wGaAbIBJwH/
ATYBPwEOAf+AAANEAf8DRAH/A0QB/ygAATYBPwEOAf8BNgE/AQ4B/wE2AT8BDgH/BAADRAH/A0QB/wNE
Af8gAAE2AT8BDgH/ATYBPwEOAf8BNgE/AQ4B/0QAAUoBbAGWAf8BOgFVAXkB/wFcAYUBuQH/AUoBbAGW
Af8BSgFsAZYB/wE6AVUBeQH/A4cB/wE6AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/AToBVQF5
Af8BSgFsAZYB/wFKAWwBlgH/AToBVQF5Af8BKQE9AVkB/wJZAaYB/wJZAaYB/wJMAYMB/wIeAT8B/wEW
AR4BXQH/AgkBGQH/AhEBKQH/AggBPAH/AlgBpAH/AVkBcgGvAf8CJAFJAf8BQAFSAZAB/wIaATgB/wIc
ATwB/wIdATgB/wJzAcIB/wGZAtUB/wHFAvkB/wGmAeYB3wH/AZkC1QH/AZ4B3AHZAf8BxQL5Af8BtQH3
AegB/wGJAb0BwwH/AZ4B3AHZAf8BngHcAdkB/wHQAvoB/wG1AfcB6AH/AYkBvQHDAf8BiQG9AcMB/wG2
AfgB6wH/AZ4B3AHZAf8BTwF+AccB/wFPAX4BxwH/AUoBdwG8Af8BNgFUAYAB/wF0AZYBzAH/ATYBVAGA
Af8BZgGNAckB/wFPAX4BxwH/AU8BfgHHAf8BTwF+AccB/wFKAXcBvAH/ATYBVAGAAf8BdAGWAcwB/wE2
AVQBgAH/AWYBjQHJAf8BTwF+AccB/wFKAWwBlgH/AToBVQF5Af8BKQE9AVkB/wFcAYUBuQH/AToBVQF5
Af8BKQE9AVkB/wE6AVUBeQH/ASkBPQFZAf8BXAGFAbkB/wFcAYUBuQH/AToBVQF5Af8BSgFsAZYB/wE6
AVUBeQH/AToBVQF5Af8BSgFsAZYB/wFKAWwBlgH/AjUBaAH/AhEBKQH/AgkBJgH/AmcBrwH/AgYBXgH/
AjgBbAH/AgYBWQH/AggBPAH/AicBTgH/AggBPAH/AVkBcgGvAf8CCAFoAf8CWAGVAf8CSAGIAf8CFAEv
Af8CGQEyAf8BtQH3AegB/wGUAdAB1AH/AYkBvQHDAf8BngHcAdkB/wGmAeYB3gH/AZ4B3AHZAf8BngHe
AdkB/wG9AfkB9AH/AbwB+AHyAf8BvQH5AfQB/wGeAdwB2QH/AbYB+AHrAf8BrQHtAeAB/wHFAvkB/wHF
AvkB/wG0AfgB7AH/AU8BfgHHAf8BSgF3AbwB/wE2AVQBgAH/AYsBpgHPAf8BiwGmAc8B/wF0AZYBzAH/
ATYBVAGAAf8BVwF7AbIB/wFHAXEBsQH/AUMBbAGpAf8BNgFUAYAB/wGLAaYBzwH/AYsBpgHPAf8BdAGW
AcwB/wE2AVQBgAH/AWYBjQHJAf8BOgFVAXkB/wFKAWwBlgH/AToBVQF5Af8BOgFVAXkB/wFEAVgBdAH/
AToBVQF5Af8BSgFsAZYB/wFKAWwBlgH/AToBVQF5Af8BKQE9AVkB/wFcAYUBuQH/ASkBPQFZAf8BOgFV
AXkB/wFcAYUBuQH/AUoBbAGWAf8BSgFsAZYB/wJ4AcoB/wJMAYMB/wIyAWMB/wJ3AckB/wIMAXwB/wJc
AaoB/wI2AV8B/wIJARwB/wI6AWcB/wITAZoB/wJpAbIB/wIGAVoB/wJdAZ4B/wIGAVoB/wJBAXwB/wIZ
ATEB/wGJAb0BwwH/AYkBvQHDAf8BlQHNAdMB/wGZAtUB/wG1AfcB6AH/AbYB+AHrAf8B0AL6Af8BtQH3
AegB/wGmAeYB3gH/AZkC1wH/AZ4B3gHZAf8BtgH4AesB/wGeAd4B2QH/AZQB0wHUAf8BngHcAdkB/wHF
AvkB/wFmAY0ByQH/ATYBVAGAAf8BiwGmAc8B/wF5AZEBtQH/ATwBSAFaAf8BPAFIAVoB/wEyAUEBWQH/
ARcBJAE3Af8BJgE1AU0B/wEXASQBNwH/ATwBSAFaAf8BPAFIAVoB/wE8AUgBWgH/AXkBkQG1Af8BdAGW
AcwB/wE2AVQBgAH/AToBVQF5Af8BKQE9AVkB/wFKAWwBlgH/AToBVQF5Af8BSgFsAZYB/wFKAWwBlgH/
AVwBhQG5Af8BOgFVAXkB/wE6AVUBeQH/AToBVQF5Af8BOgFVAXkB/wE6AVUBeQH/AToBVQF5Af8BOgFV
AXkB/wFcAYUBuQH/AVwBhQG5Af8CcwHCAf8CWQGmAf8CEQEpAf8CGQEyAf8CEQEpAf8CCQEcAf8COgFn
Af8CBgFaAf8CJQFFAf8CCQEbAf8CcwHCAf8CCwF1Af8CTwGIAf8CPAFzAf8BPgFQAY0B/wI2AV8B/wG2
AfgB6wH/AYkBvQHDAf8BjAHAAcYB/wGMAcABxgH/AcUC+QH/AZ4B3gHZAf8BiQG9AcMB/wGVAc0B0wH/
AYkBvQHDAf8BiQG9AcMB/wG2AfgB6wH/AbYB+AHrAf8BiQG9AcMB/wGZAtcB/wGZAtcB/wHFAvkB/wE2
AVQBgAH/AYsBpgHPAf8BiwGmAc8B/wE8AUgBWgH/Ac0BwgHFAf8BrwGlAagB/wGnAZ0BnwH/AZkBjwGR
Af8BgAF0AXcB/wGAAXQBdwH/AYABdAF3Af8BgAF0AXcB/wGAAXQBdwH/ATwBSAFaAf8BiwGmAc8B/wF0
AZYBzAH/AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/AUoBbAGWAf8BSgFsAZYB/wFcAYUBuQH/AToBVQF5
Af8BSgFsAZYB/wNsAf8BSgFsAZYB/wFKAWwBlgH/AToBVQF5Af8BKQE9AVkB/wFKAWwBlgH/AToBVQF5
Af8BKQE9AVkB/wI2AV8B/wIIATwB/wJmAa0B/wJOAYYB/wIwAWAB/wIJARwB/wJPAYgB/wI8AXMB/wJd
AZ4B/wI8AXMB/wIRASkB/wIIATIB/wJvAbwB/wInAU4B/wIIATwB/wIZATIB/wHFAvkB/wG2AfgB6wH/
AcUC+QH/AcUC+QH/AbYB+AHrAf8BiQG9AcMB/wGJAb0BwwH/AZ4B3AHZAf8BpgHmAd4B/wHGAfoB+QH/
AbYB+AHrAf8BtgH4AesB/wGJAb0BwwH/AZkC1QH/AZMByQHPAf8BngHcAdkB/wE/AWMBmgH/ATYBVAGA
Af8BiwGmAc8B/wE8AUgBWgH/Ac0BwgHFAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5
AbABswH/AbkBsAGzAf8BuQGwAbMB/wGAAXQBdwH/ATwBSAFaAf8BiwGmAc8B/wE2AVQBgAH/AToBVQF5
Af8BSgFsAZYB/wE6AVUBeQH/AVwBhQG5Af8BXAGFAbkB/wE6AVUBeQH/AVwBhQG5Af8BSgFsAZYB/wEp
AT0BWQH/AVwBhQG5Af8BXAGFAbkB/wEpAT0BWQH/AUoBbAGWAf8BSgFsAZYB/wOHAf8BOgFVAXkB/wIn
AU4B/wIMAXsB/wFTAWsBqAH/Ak8BiAH/AjwBcwH/AgkBFwH/AlkBpgH/AjwBcwH/Ak8BiAH/AjwBcwH/
AkABegH/AgkBHAH/AjcBYgH/AicBTgH/AgoBcgH/Aj8BeAH/AcUC+QH/Ab0B+QH0Af8BlAHTAdQB/wGe
AdwB2QH/AdAC+gH/AbYB+AHrAf8BtgH4AesB/wG1AfcB6AH/AcUC+QH/AZ4B3AHZAf8BngHcAdkB/wHQ
AvoB/wG2AfgB6wH/AYkBvQHDAf8BiQG9AcMB/wGeAdwB2QH/AU8BfgHHAf8BPwFjAZoB/wE2AVQBgAH/
ATwBSAFaAf8BzQHCAcUB/wG5AbABswH/ASMBJQGCAf8BuQGwAbMB/wF3AXoBzgH/AbkBsAGzAf8BZwFp
AawB/wG5AbABswH/AYABdAF3Af8BPAFIAVoB/wE2AVQBgAH/AUoBdwG8Af8BOgFVAXkB/wFKAWwBlgH/
ASkBPQFZAf8BOgFVAXkB/wE6AVUBeQH/ASkBPQFZAf8BKQE9AVkB/wE6AVUBeQH/AToBVQF5Af8BOgFV
AXkB/wE6AVUBeQH/AToBVQF5Af8BXAGFAbkB/wFcAYUBuQH/AToBVQF5Af8BSgFsAZYB/wJCAX4B/wIn
AU4B/wJzAcIB/wIPAYcB/wIGAWAB/wIcATcB/wJZAaYB/wIHAUYB/wGGAaoB5QH/AkUBgwH/AWYBggG/
Af8CNgFfAf8CKAFQAf8CfQHTAf8CBgFaAf8CBgFaAf8BtgH4AesB/wGeAdwB2QH/AZkC1QH/AZ4B3AHZ
Af8BlQHNAdMB/wHQAvoB/wG1AfcB6AH/AaYB5gHeAf8BiQG9AcMB/wGJAb0BwwH/Aa0B7QHgAf8BngHc
AdkB/wHQAvoB/wG2AfgB6wH/AYkBvQHDAf8BiQG9AcMB/wFPAX4BxwH/AU8BfgHHAf8BPwFjAZoB/wEX
ASQBNwH/AdUBygHNAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGz
Af8BuQGwAbMB/wGAAXQBdwH/ARcBJAE3Af8BSgF3AbwB/wFPAX4BxwH/AUoBbAGWAf8BOgFVAXkB/wE6
AVUBeQH/AUoBbAGWAf8BOgFVAXkB/wFKAWwBlgH/AToBVQF5Af8BKQE9AVkB/wE6AVUBeQH/AUoBbAGW
Af8BSgFsAZYB/wE6AVUBeQH/AToBVQF5Af8BOgFVAXkB/wEpAT0BWQH/AToBVQF5Af8COgFwAf8CCgEU
Af8CNgFfAf8CDwGKAf8CDQGDAf8BWQFyAa8B/wFLAWEBngH/AlkBpgH/AmsBtgH/AjoBcQH/AigBUQH/
AiYBRwH/AhUBLwH/AwoB/wKCAdkB/wF/AaIB3gH/AbYB+AHrAf8BiQG9AcMB/wGJAb0BwwH/AYkBvQHD
Af8BngHcAdkB/wG9AfkB9AH/AYkBvQHDAf8BjAHAAcYB/wGJAb0BwwH/AYkBvQHDAf8BkwHLAdMB/wGt
Ae0B4AH/AYkBvQHDAf8BlAHQAdQB/wG0AfgB7AH/AbYB+AHrAf8BTwF+AccB/wFPAX4BxwH/AU8BfgHH
Af8BGgEpAT8B/wHVAcoBzQH/AbkBsAGzAf8BPgGHAcIB/wG5AbABswH/AXcBegHOAf8BuQGwAbMB/wE2
AToBzQH/AbkBsAGzAf8BgAF0AXcB/wEmATUBTQH/AU8BfgHHAf8BTwF+AccB/wE6AVUBeQH/AToBVQF5
Af8BXAGFAbkB/wFcAYUBuQH/AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/AToBVQF5Af8BSgFsAZYB/wEp
AT0BWQH/AUoBbAGWAf8BSgFsAZYB/wE6AVUBeQH/AToBVQF5Af8BSgFsAZYB/wFKAWwBlgH/AjwBcwH/
Ak8BiAH/AhMBKQH/Ai4BVAH/AlUBnwH/AnMBwgH/AicBTgH/AiABQwH/AjcBYQH/AggBLQH/AhkBMgH/
AlYBkgH/AgYBWgH/AhkBMgH/AgcBQAH/AhEBkQH/AaIB4gHZAf8BpgHmAd8B/wGmAeYB3gH/AcUC+QH/
AdAC+gH/AdAC+gH/AcUC+QH/AZQB0wHUAf8BiQG9AcMB/wGeAdwB2QH/Ab0B+QH0Af8BtAH4AewB/wGm
AeYB3gH/AcUC+QH/Ab0B+QH0Af8BtQH3AegB/wFPAX4BxwH/AU8BfgHHAf8BTwF+AccB/wEXASQBNwH/
AdoBzwHSAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGw
AbMB/wGZAY8BkQH/ARcBJAE3Af8BZgGNAckB/wFPAX4BxwH/AVwBhQG5Af8BOgFVAXkB/wE6AVUBeQH/
AToBVQF5Af8DhwH/AToBVQF5Af8BOgFVAXkB/wFcAYUBuQH/AVwBhQG5Af8BOgFVAXkB/wFcAYUBuQH/
AVwBhQG5Af8BOgFVAXkB/wFKAWwBlgH/AToBVQF5Af8BSgFsAZYB/wIGAVoB/wJPAYgB/wI8AXMB/wI2
AV8B/wIuAVsB/wIJARwB/wIZATIB/wIoAVIB/wI4AWQB/wIIAWcB/wJnAbAB/wJPAYgB/wI0AWUB/wJP
AYgB/wIGAVkB/wIIATcB/wGmAeYB3wH/AZkC1QH/AbwB+AHyAf8BiQG9AcMB/wGeAdwB2QH/AZ4B3gHZ
Af8BngHeAdkB/wG2AfgB6wH/AbYB+AHrAf8BtgH4AesB/wGeAdwB2QH/AZUBzQHTAf8BlAHTAdQB/wGT
AckBzwH/AbwB+AHyAf8BxQL5Af8BTwF+AccB/wFPAX4BxwH/ATYBVAGAAf8BPAFIAVoB/wHWAcsBzgH/
AbkBsAGzAf8BUQFUAagB/wG5AbABswH/ASwBLgGiAf8BuQGwAbMB/wEyAWwBTgH/AbkBsAGzAf8BpwGd
AZ8B/wEyAUEBWQH/ATYBVAGAAf8BZgGNAckB/wE6AVUBeQH/ASkBPQFZAf8BSgFsAZYB/wFKAWwBlgH/
AToBVQF5Af8BSgFsAZYB/wEpAT0BWQH/ASkBPQFZAf8BKQE9AVkB/wE6AVUBeQH/AToBVQF5Af8BKQE9
AVkB/wE6AVUBeQH/AToBVQF5Af8BOgFVAXkB/wFcAYUBuQH/AgcBTwH/AlQBjwH/AjoBcAH/AjYBXwH/
AjgBbAH/AgcBYwH/Ak8BiAH/AhkBMgH/Am0BuAH/AoIB2QH/AkoBgQH/AlYBkgH/AUQBVwGVAf8CNAFd
Af8CCgEUAf8CEgErAf8BiQG9AcMB/wGeAd4B2QH/AaYB5gHeAf8BiQG9AcMB/wGJAb0BwwH/AYkBvQHD
Af8BtgH4AesB/wHFAvkB/wG1AfcB6AH/AYkBvQHDAf8BiQG9AcMB/wGeAdwB2QH/AZUBzQHTAf8BngHc
AdkB/wGZAtUB/wG1AfcB6AH/AWYBjQHJAf8BNgFUAYAB/wGLAaYBzwH/ATwBSAFaAf8B1gHLAc4B/wG5
AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/AbkBsAGzAf8BuQGwAbMB/wG5AbABswH/Aa8BpQGo
Af8BPAFIAVoB/wF0AZYBzAH/ATYBVAGAAf8BSgFsAZYB/wE6AVUBeQH/AUoBbAGWAf8BXAGFAbkB/wEp
AT0BWQH/AUoBbAGWAf8BOgFVAXkB/wE6AVUBeQH/ASkBPQFZAf8BKQE9AVkB/wEpAT0BWQH/A2wB/wE6
AVUBeQH/AUoBbAGWAf8BKQE9AVkB/wE6AVUBeQH/AYEBpQHhAf8CcwHCAf8BPgFQAY0B/wI2AV8B/wJz
AcIB/wJUAY8B/wJUAY8B/wIJASEB/wI2AV8B/wJRAZcB/wJOAZIB/wJjAagB/wIgAUQB/wFVAW0BqgH/
Ag0BfgH/AjYBXwH/AYwBwAHGAf8BiQG9AcMB/wHFAvkB/wHFAvkB/wHFAvkB/wHFAvkB/wG1AfcB6AH/
AZ4B3AHZAf8B0AL6Af8BxQL5Af8BiQG9AcMB/wGJAb0BwwH/AZ4B3AHZAf8BngHcAdkB/wG2AfgB6wH/
AasB7QHeAf8BNgFUAYAB/wGLAaYBzwH/AYsBpgHPAf8BPAFIAVoB/wHdAdIB1QH/AdoBzwHSAf8B2gHP
AdIB/wHaAc8B0gH/AdUBygHNAf8BzQHCAcUB/wHNAcIBxQH/Ac0BwgHFAf8BzQHCAcUB/wE8AUgBWgH/
AYsBpgHPAf8BdAGWAcwB/wEpAT0BWQH/A2wB/wEpAT0BWQH/ASkBPQFZAf8BRwGxAXEB/wEpAT0BWQH/
ASkBPQFZAf8BKQE9AVkB/wE1AZ8BXwH/ASkBPQFZAf8BQwGtAW0B/wEpAT0BWQH/AToBVQF5Af8BKQE9
AVkB/wEpAT0BWQH/AToBVQF5Af8CRAF3Af8CJgFGAf8CCQEXAf8CNgFfAf8CXAGsAf8CPQFrAf8CXgGg
Af8BWQFyAa8B/wIZATIB/wIkAUsB/wIRASkB/wIdATkB/wInAU4B/wJtAbgB/wIPAYkB/wI0AV0B/wG2
AfgB6wH/AbYB+AHrAf8BiQG9AcMB/wGeAd4B2QH/AakB6QHeAf8BxQL5Af8BngHcAdkB/wGeAdwB2QH/
AZUBzQHTAf8BngHcAdkB/wHFAvkB/wHFAvkB/wGJAb0BwwH/AbYB+AHrAf8BtgH4AesB/wHFAvkB/wE/
AWMBmgH/ATYBVAGAAf8BiwGmAc8B/wF5AZEBtQH/ATwBSAFaAf8BPAFIAVoB/wE8AUgBWgH/ARcBJAE3
Af8BGwErAUMB/wEXASQBNwH/ATwBSAFaAf8BPAFIAVoB/wE8AUgBWgH/AXkBkQG1Af8BiwGmAc8B/wE2
AVQBgAH/AV0BvAGNAf8BKQE9AVkB/wFsAcsBnAH/AToBpAFkAf8BPwGpAWkB/wEpAT0BWQH/AUYBsAFw
Af8BKQE9AVkB/wFKAbQBdAH/AVUBvwF/Af8BYgHBAZIB/wFnAcYBlwH/ASkBPQFZAf8BLQGXAVcB/wE2
AaABYAH/ASkBPQFZAf8CMgFbAf8CPAFzAf8CTwGIAf8CEwEoAf8CJQFNAf8CDQGDAf8CcwHCAf8CBgFe
Af8CDgEkAf8CCgEXAf8CQgF+Af8CBgFaAf8CEQEpAf8CNgFfAf8CCAE8Af8CUgGNAf8BtgH4AesB/wGJ
Ab0BwwH/AZ4B3gHZAf8BngHcAdkB/wGeAdwB2QH/AcUC+QH/AYkBvQHDAf8BkwHJAc8B/wGeAdwB2QH/
AZ4B3AHZAf8BmQLVAf8BxQL5Af8BtAH4AewB/wG2AfgB6wH/AYwBwAHGAf8BmQLXAf8BTwF+AccB/wE/
AWMBmgH/ATYBVAGAAf8BiwGmAc8B/wGLAaYBzwH/AYsBpgHPAf8BNgFUAYAB/wFKAXcBvAH/AU8BfgHH
Af8BPwFjAZoB/wE2AVQBgAH/AYsBpgHPAf8BiwGmAc8B/wGLAaYBzwH/ATYBVAGAAf8BSgF3AbwB/wFL
AbUBdQH/AUIBrAFsAf8BWgG5AYoB/wFRAbABgQH/AVMBsgGDAf8BKQE9AVkB/wE+AagBaAH/ATgBogFi
Af8BNQGfAV8B/wFjAcIBkwH/AWABvwGQAf8BSQGzAXMB/wE3AaEBYQH/AUIBrAFsAf8BPQGnAWcB/wFB
AasBawH/AnMBwgH/AlkBpgH/AgcBRQH/Ak8BiAH/AgoBHQH/AicBTgH/AnMBwgH/Ag0BgwH/AicBTgH/
AgYBWgH/AlYBkgH/AgYBWgH/AggBaAH/ASMBLwFtAf8CMgFiAf8CYwGpAf8BlAHTAdQB/wG2AfgB6wH/
AYkBvQHDAf8BiQG9AcMB/wGZAtUB/wG1AfcB6AH/AYkBvQHDAf8BmQLVAf8BiQG9AcMB/wGVAc0B0wH/
AZUBzQHTAf8BtgH4AesB/wG0AfgB7AH/AYkBvQHDAf8BngHcAdkB/wGeAdwB2QH/AU8BfgHHAf8BTwF+
AccB/wE/AWMBmgH/ATYBVAGAAf8BiwGmAc8B/wE2AVQBgAH/AUoBdwG8Af8BTwF+AccB/wFPAX4BxwH/
AU8BfgHHAf8BPwFjAZoB/wE2AVQBgAH/AYsBpgHPAf8BNgFUAYAB/wFKAXcBvAH/AU8BfgHHAf8BSgG0
AXQB/wFMAbYBdgH/AUkBswFzAf8BPAGmAWYB/wE8AaYBZgH/AUUBrwFvAf8BNQGfAV8B/wFCAawBbAH/
AVQBvgF+Af8BTAG2AXYB/wFAAaoBagH/AT0BpwFnAf8BPwGpAWkB/wE3AaEBYQH/ASYBkAFQAf8BQwGt
AW0B/wJzAcIB/wJZAaYB/wJZAaYB/wJTAZoB/wFpAYYBwgH/AjwBcwH/AigBUgH/AicBTgH/AicBTgH/
Ag0BgwH/AnMBwgH/AlkBpgH/Aj0BdAH/AicBTgH/AlwBqQH/AnMBwgH/AZ4B3gHZAf8BtAH4AewB/wG2
AfgB6wH/AYkBvQHDAf8BiQG9AcMB/wGeAdwB2QH/AakB6QHeAf8BiQG9AcMB/wGJAb0BwwH/AZ4B3gHZ
Af8BtAH4AewB/wHFAvkB/wHFAvkB/wGtAe0B4AH/AYkBvQHDAf8BiQG9AcMB/wFPAX4BxwH/AU8BfgHH
Af8BTwF+AccB/wE/AWMBmgH/ATYBVAGAAf8BZgGNAckB/wFPAX4BxwH/AU8BfgHHAf8BTwF+AccB/wFP
AX4BxwH/AU8BfgHHAf8BPwFjAZoB/wE2AVQBgAH/AWYBjQHJAf8BTwF+AccB/wFPAX4BxwH/AUIBTQE+
BwABPgMAASgDAAFAAwABMAMAAQEBAAEBBQABgAEBFgAD/4EAAv8BHwH4BP8B+AH/AR8B+AHPAfMC/wHw
AT8BDAHwAY8B8QLnAeABDwHEASMBhwHhAeMBxwHAAQMB4AEHAeMBxwHBAYMBgAEAAfABDwHxAY8BwQGD
AgAB4AEHAfgBHwHBAYMCAAHgAQcB/AE/AoECAAHAAQMB/AE/AoECAAHAAQMB6AEXAoEBAAEBAeABBwHB
AYMCgQHAAQMBwQKDAcECgQHwAQcBgwHBAQEBgAHAAQMB/AEPAQcB4AEDAcAB8AEPAf8BHwEPAfABBwHg
BP8BHwH4AY8B8QL/gAAL
</value>
</data>
<data name="trackListTreeView.Location" type="System.Drawing.Point, System.Drawing">
@@ -400,38 +418,34 @@
<data name="&gt;&gt;trackListTreeView.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="addCategoryStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABPSURBVDhP5ZAx
DgAgCAMZ/f+HMcbYYOmg0UmHY2ibGzB3txNSgMKsHcD9ksBL5wcBPwyPCwLFJBjjVe4LFHGsgEDBAu6x
4+AxAT9MkYJdKi90axNkwjxWAAAAAElFTkSuQmCC
</value>
</data>
<data name="addCategoryStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>168, 22</value>
</data>
<data name="addCategoryStripMenuItem.Text" xml:space="preserve">
<value>Add Category</value>
</data>
<data name="removeCategoryStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>168, 22</value>
</data>
<data name="removeCategoryStripMenuItem.Text" xml:space="preserve">
<value>Remove Category</value>
</data>
<data name="changeCategoryToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>168, 22</value>
</data>
<data name="changeCategoryToolStripMenuItem.Text" xml:space="preserve">
<value>Set Category</value>
</data>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>19, 8</value>
</metadata>
<data name="menuStrip.AutoSize" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="saveToolStripMenuItem1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADdSURBVDhPzZJB
CoJQEIa9jy0iPFAnCDpAtG3ZooUE4b6oVtIuClpJIAgqZEVlKpqEHUAm5pGPmhTbRA18G//5P5iHgvA3
I7ZniiQ7aVM9QZzcOKYbwVDbw8I6A2YAICBvg2VJdtjSs2Cse1Dt6tCYbliGO0UCFlLBxAj590yA0D4X
1Ec7CK8JF9j+lUmWzoVlpYJaz4JKZ5ULZqWCT6F9Jhhowcv9eeBOoQBvPXoBrA0zF8yyR6V9LvCjGLYH
NxfMvipIMaQ3Ux6ClPYFsaUq/bmd0rspuIO/Pe3/bu5p+sr3gTvFEQAAAABJRU5ErkJggg==
</value>
</data>
<data name="saveToolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
<value>98, 22</value>
</data>
<data name="saveToolStripMenuItem1.Text" xml:space="preserve">
<value>Save</value>
</data>
<data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>37, 20</value>
</data>
<data name="fileToolStripMenuItem.Text" xml:space="preserve">
<value>File</value>
</data>
<data name="menuStrip.Location" type="System.Drawing.Point, System.Drawing">
<value>20, 60</value>
</data>
@@ -456,41 +470,37 @@
<data name="&gt;&gt;menuStrip.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>37, 20</value>
</data>
<data name="fileToolStripMenuItem.Text" xml:space="preserve">
<value>File</value>
</data>
<data name="saveToolStripMenuItem1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADdSURBVDhPzZJB
CoJQEIa9jy0iPFAnCDpAtG3ZooUE4b6oVtIuClpJIAgqZEVlKpqEHUAm5pGPmhTbRA18G//5P5iHgvA3
I7ZniiQ7aVM9QZzcOKYbwVDbw8I6A2YAICBvg2VJdtjSs2Cse1Dt6tCYbliGO0UCFlLBxAj590yA0D4X
1Ec7CK8JF9j+lUmWzoVlpYJaz4JKZ5ULZqWCT6F9Jhhowcv9eeBOoQBvPXoBrA0zF8yyR6V9LvCjGLYH
NxfMvipIMaQ3Ux6ClPYFsaUq/bmd0rspuIO/Pe3/bu5p+sr3gTvFEQAAAABJRU5ErkJggg==
</value>
</data>
<data name="saveToolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
<value>98, 22</value>
</data>
<data name="saveToolStripMenuItem1.Text" xml:space="preserve">
<value>Save</value>
</data>
<data name="trackTreeView.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<metadata name="contextMenuStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="trackContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>282, 8</value>
</metadata>
<data name="contextMenuStrip2.Size" type="System.Drawing.Size, System.Drawing">
<data name="addEntryMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="addEntryMenuItem.Text" xml:space="preserve">
<value>Add Track</value>
</data>
<data name="editEntryToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="editEntryToolStripMenuItem.Text" xml:space="preserve">
<value>Edit Track</value>
</data>
<data name="removeEntryMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="removeEntryMenuItem.Text" xml:space="preserve">
<value>Remove Track</value>
</data>
<data name="trackContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>149, 70</value>
</data>
<data name="&gt;&gt;contextMenuStrip2.Name" xml:space="preserve">
<value>contextMenuStrip2</value>
<data name="&gt;&gt;trackContextMenuStrip.Name" xml:space="preserve">
<value>trackContextMenuStrip</value>
</data>
<data name="&gt;&gt;contextMenuStrip2.Type" xml:space="preserve">
<data name="&gt;&gt;trackContextMenuStrip.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="trackTreeView.Location" type="System.Drawing.Point, System.Drawing">
@@ -514,32 +524,6 @@
<data name="&gt;&gt;trackTreeView.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="addEntryMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABPSURBVDhP5ZAx
DgAgCAMZ/f+HMcbYYOmg0UmHY2ibGzB3txNSgMKsHcD9ksBL5wcBPwyPCwLFJBjjVe4LFHGsgEDBAu6x
4+AxAT9MkYJdKi90axNkwjxWAAAAAElFTkSuQmCC
</value>
</data>
<data name="addEntryMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="addEntryMenuItem.Text" xml:space="preserve">
<value>Add Track</value>
</data>
<data name="editEntryToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="editEntryToolStripMenuItem.Text" xml:space="preserve">
<value>Edit Track</value>
</data>
<data name="removeEntryMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value>
</data>
<data name="removeEntryMenuItem.Text" xml:space="preserve">
<value>Remove Track</value>
</data>
<data name="playOverworldInCreative.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@@ -3166,10 +3150,10 @@
<data name="&gt;&gt;changeCategoryToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;catImages.Name" xml:space="preserve">
<value>catImages</value>
<data name="&gt;&gt;trackListIcons.Name" xml:space="preserve">
<value>trackListIcons</value>
</data>
<data name="&gt;&gt;catImages.Type" xml:space="preserve">
<data name="&gt;&gt;trackListIcons.Type" xml:space="preserve">
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;fileToolStripMenuItem.Name" xml:space="preserve">
+37 -37
View File
@@ -7,20 +7,20 @@ namespace PckStudio.Core.FileFormats
{
public class PckAudioFile
{
public class InvalidCategoryException : Exception
public class InvalidTrackListException : Exception
{
public InvalidCategoryException(string message) : base(message)
public InvalidTrackListException(string message) : base(message)
{ }
}
public readonly int type = 1;
public AudioCategory[] Categories => Array.FindAll(_categories, c => c is not null);
private AudioCategory[] _categories { get; } = new AudioCategory[9];
public AudioTrackList[] TrackLists => Array.FindAll(_trackLists, c => c is not null);
private AudioTrackList[] _trackLists { get; } = new AudioTrackList[9];
public Dictionary<string, string> Credits { get; } = new Dictionary<string, string>();
public class AudioCategory
public class AudioTrackList
{
public enum EAudioType : int
{
@@ -43,10 +43,10 @@ namespace PckStudio.Core.FileFormats
public string Name { get; set; } = string.Empty;
public EAudioType AudioType { get; }
public List<string> SongNames { get; } = new List<string>();
public List<string> TrackNames { get; } = new List<string>();
public EAudioParameterType parameterType { get; }
public AudioCategory(string name, EAudioParameterType parameterType, EAudioType audioType)
public AudioTrackList(string name, EAudioParameterType parameterType, EAudioType audioType)
{
this.Name = name;
this.parameterType = parameterType;
@@ -101,55 +101,55 @@ namespace PckStudio.Core.FileFormats
public void AddCreditId(string creditId) => Credits.Add(creditId, string.Empty);
/// <exception cref="InvalidCategoryException"></exception>
public bool HasCategory(AudioCategory.EAudioType category) => GetCategory(category) is AudioCategory;
/// <exception cref="InvalidTrackListException"></exception>
public bool HasTrackList(AudioTrackList.EAudioType trackList) => GetTrackList(trackList) is AudioTrackList;
/// <exception cref="InvalidCategoryException"></exception>
public AudioCategory GetCategory(AudioCategory.EAudioType category)
/// <exception cref="InvalidTrackListException"></exception>
public AudioTrackList GetTrackList(AudioTrackList.EAudioType trackList)
{
if (category < AudioCategory.EAudioType.Overworld ||
category > AudioCategory.EAudioType.BuildOff)
throw new InvalidCategoryException(nameof(category));
return _categories[(int)category];
if (trackList < AudioTrackList.EAudioType.Overworld ||
trackList > AudioTrackList.EAudioType.BuildOff)
throw new InvalidTrackListException(nameof(trackList));
return _trackLists[(int)trackList];
}
/// <exception cref="InvalidCategoryException"></exception>
public bool TryGetCategory(AudioCategory.EAudioType category, out AudioCategory audioCategory)
/// <exception cref="InvalidTrackListException"></exception>
public bool TryGetTrackList(AudioTrackList.EAudioType trackList, out AudioTrackList audioTrackList)
{
if (GetCategory(category) is AudioCategory a)
if (GetTrackList(trackList) is AudioTrackList a)
{
audioCategory = a;
audioTrackList = a;
return true;
}
audioCategory = null;
audioTrackList = null;
return false;
}
/// <returns>True when category was created, otherwise false</returns>
/// <exception cref="InvalidCategoryException"></exception>
public bool AddCategory(AudioCategory.EAudioParameterType parameterType, AudioCategory.EAudioType category, string name = "")
/// <returns>True when track list was created, otherwise false</returns>
/// <exception cref="InvalidTrackListException"></exception>
public bool AddTrackList(AudioTrackList.EAudioParameterType parameterType, AudioTrackList.EAudioType trackList, string name = "")
{
if (category < AudioCategory.EAudioType.Overworld ||
category > AudioCategory.EAudioType.BuildOff)
throw new InvalidCategoryException(nameof(category));
bool exists = HasCategory(category);
if (trackList < AudioTrackList.EAudioType.Overworld ||
trackList > AudioTrackList.EAudioType.BuildOff)
throw new InvalidTrackListException(nameof(trackList));
bool exists = HasTrackList(trackList);
if (!exists)
_categories[(int)category] = new AudioCategory(name, parameterType, category);
_trackLists[(int)trackList] = new AudioTrackList(name, parameterType, trackList);
return !exists;
}
/// <returns>True when category was created, otherwise false</returns>
/// <exception cref="InvalidCategoryException"></exception>
public bool AddCategory(AudioCategory.EAudioType category)
=> AddCategory(AudioCategory.EAudioParameterType.unk0, category);
/// <returns>True when track list was created, otherwise false</returns>
/// <exception cref="InvalidTrackListException"></exception>
public bool AddTrackList(AudioTrackList.EAudioType trackList)
=> AddTrackList(AudioTrackList.EAudioParameterType.unk0, trackList);
/// <returns>True when category was removed, otherwise false</returns>
/// <exception cref="InvalidCategoryException"></exception>
public bool RemoveCategory(AudioCategory.EAudioType category)
/// <returns>True when track list was removed, otherwise false</returns>
/// <exception cref="InvalidTrackListException"></exception>
public bool RemoveTrackList(AudioTrackList.EAudioType trackList)
{
bool exists = HasCategory(category);
bool exists = HasTrackList(trackList);
if (exists)
_categories[(int)category] = null;
_trackLists[(int)trackList] = null;
return exists;
}
@@ -21,7 +21,7 @@ namespace PckStudio.Core.IO.PckAudio
private PckAudioFile _file;
private ByteOrder _endianness;
private List<string> LUT = new List<string>();
private List<PckAudioFile.AudioCategory.EAudioType> _OriginalAudioTypeOrder = new List<PckAudioFile.AudioCategory.EAudioType>();
private List<PckAudioFile.AudioTrackList.EAudioType> _OriginalAudioTypeOrder = new List<PckAudioFile.AudioTrackList.EAudioType>();
public PckAudioFileReader(ByteOrder endianness)
{
@@ -80,13 +80,13 @@ namespace PckStudio.Core.IO.PckAudio
int categoryEntryCount = reader.ReadInt32();
for (; 0 < categoryEntryCount; categoryEntryCount--)
{
var parameterType = (PckAudioFile.AudioCategory.EAudioParameterType)reader.ReadInt32();
var audioType = (PckAudioFile.AudioCategory.EAudioType)reader.ReadInt32();
var parameterType = (PckAudioFile.AudioTrackList.EAudioParameterType)reader.ReadInt32();
var audioType = (PckAudioFile.AudioTrackList.EAudioType)reader.ReadInt32();
string name = ReadString(reader);
// AddCategory puts the file's categories out of order and causes some songs to be put in the wrong categories
// This is my simple fix for the issue.
_OriginalAudioTypeOrder.Add(audioType);
_file.AddCategory(parameterType, audioType, name);
_file.AddTrackList(parameterType, audioType, name);
}
}
@@ -94,7 +94,7 @@ namespace PckStudio.Core.IO.PckAudio
{
List<string> credits = new List<string>();
List<string> creditIds = new List<string>();
foreach (PckAudioFile.AudioCategory.EAudioType c in _OriginalAudioTypeOrder)
foreach (PckAudioFile.AudioTrackList.EAudioType c in _OriginalAudioTypeOrder)
{
int audioCount = reader.ReadInt32();
for (; 0 < audioCount; audioCount--)
@@ -104,7 +104,7 @@ namespace PckStudio.Core.IO.PckAudio
switch (key)
{
case "CUENAME":
_file.GetCategory(c).SongNames.Add(value);
_file.GetTrackList(c).TrackNames.Add(value);
break;
case "CREDIT":
credits.Add(value);
@@ -67,8 +67,8 @@ namespace PckStudio.Core.IO.PckAudio
private void WriteCategories(EndiannessAwareBinaryWriter writer)
{
writer.Write(_file.Categories.Length);
foreach (PckAudioFile.AudioCategory category in _file.Categories)
writer.Write(_file.TrackLists.Length);
foreach (PckAudioFile.AudioTrackList category in _file.TrackLists)
{
writer.Write((int)category.parameterType);
writer.Write((int)category.AudioType);
@@ -79,10 +79,10 @@ namespace PckStudio.Core.IO.PckAudio
private void WriteCategorySongs(EndiannessAwareBinaryWriter writer)
{
bool addCredit = true;
foreach (PckAudioFile.AudioCategory category in _file.Categories)
foreach (PckAudioFile.AudioTrackList category in _file.TrackLists)
{
writer.Write(category.SongNames.Count + (addCredit ? _file.Credits.Count * 2 : 0));
foreach (var name in category.SongNames)
writer.Write(category.TrackNames.Count + (addCredit ? _file.Credits.Count * 2 : 0));
foreach (var name in category.TrackNames)
{
writer.Write(LUT.IndexOf("CUENAME"));
WriteString(writer, name);