From ec10a15a3c8af7cd7aeafe14e1a2deec38bc4505 Mon Sep 17 00:00:00 2001 From: Miguel Terol Espino Date: Wed, 27 Sep 2023 18:01:12 +0200 Subject: [PATCH] Fixed Trainer names and added patch for it in Eng and Spa --- DS_Map/Main Window.cs | 19 ++++- DS_Map/ROMToolboxDialog.Designer.cs | 60 ++++++++++++++- DS_Map/ROMToolboxDialog.cs | 109 +++++++++++++++++++++++++++- DS_Map/ROMToolboxDialog.resx | 28 ++++--- 4 files changed, 200 insertions(+), 16 deletions(-) diff --git a/DS_Map/Main Window.cs b/DS_Map/Main Window.cs index 7609279..3e40120 100644 --- a/DS_Map/Main Window.cs +++ b/DS_Map/Main Window.cs @@ -9037,10 +9037,25 @@ namespace DSPRE { } private void trainerSaveCurrentButton_Click(object sender, EventArgs e) { - if (trainerNameTextBox.Text.Length > TrainerFile.maxNameLen) { - MessageBox.Show($"The length of this Trainer name exceeds {TrainerFile.maxNameLen} characters.", "Trainer data could not be saved!", MessageBoxButtons.OK, MessageBoxIcon.Error); + if (!ROMToolboxDialog.flag_TrainerNamesExpanded && trainerNameTextBox.Text.Length > TrainerFile.maxNameLen) { + DialogResult d; + MessageBox.Show($"The length of this Trainer name exceeds {TrainerFile.maxNameLen} characters.", + "Trainer data could not be saved!", MessageBoxButtons.OK, MessageBoxIcon.Error); + d = MessageBox.Show("Within the RomToolBox (found near the wild editor) you can expand this limit if you are working on an ENglish or Spanish rom (for now).", + "Do you wish to go there now?", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (d == DialogResult.Yes) + { + romToolBoxToolStripMenuItem_Click(null, null); + } return; } + if(trainerNameTextBox.Text.Length > ROMToolboxDialog.expandedTrainerNameLength) + { + MessageBox.Show($"The length of this Trainer name exceeds {ROMToolboxDialog.expandedTrainerNameLength} characters.", + "Trainer data could not be saved!", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + + } currentTrainerFile.trp.partyCount = (byte)partyCountUpDown.Value; currentTrainerFile.trp.chooseMoves = trainerMovesCheckBox.Checked; diff --git a/DS_Map/ROMToolboxDialog.Designer.cs b/DS_Map/ROMToolboxDialog.Designer.cs index 02ca2da..3d5abf9 100644 --- a/DS_Map/ROMToolboxDialog.Designer.cs +++ b/DS_Map/ROMToolboxDialog.Designer.cs @@ -68,6 +68,10 @@ this.disableTextureAnimationsTextLBL = new System.Windows.Forms.Label(); this.disableTextureAnimationsLBL = new System.Windows.Forms.Label(); this.disableTextureAnimationsButton = new System.Windows.Forms.Button(); + this.expandTrainerNamesCB = new System.Windows.Forms.PictureBox(); + this.expandTrainerNamesTextLBL = new System.Windows.Forms.Label(); + this.expandTrainerNamesLBL = new System.Windows.Forms.Label(); + this.expandTrainerNamesButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.arm9patchCB)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.overlay1CB)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.BDHCamCB)).BeginInit(); @@ -77,6 +81,7 @@ ((System.ComponentModel.ISupportInitialize)(this.repointScrcmdCB)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.dynamicHeadersPatchCB)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.disableTextureAnimationsCB)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.expandTrainerNamesCB)).BeginInit(); this.SuspendLayout(); // // applyItemStandardizeButton @@ -443,11 +448,11 @@ this.applyDynamicHeadersButton.UseVisualStyleBackColor = true; this.applyDynamicHeadersButton.Click += new System.EventHandler(this.dynamicHeadersButton_Click); // - // disableDynamicTexturesCB + // disableTextureAnimationsCB // - this.disableTextureAnimationsCB.Image = ((System.Drawing.Image)(resources.GetObject("disableDynamicTexturesCB.Image"))); + this.disableTextureAnimationsCB.Image = ((System.Drawing.Image)(resources.GetObject("disableTextureAnimationsCB.Image"))); this.disableTextureAnimationsCB.Location = new System.Drawing.Point(803, 238); - this.disableTextureAnimationsCB.Name = "disableDynamicTexturesCB"; + this.disableTextureAnimationsCB.Name = "disableTextureAnimationsCB"; this.disableTextureAnimationsCB.Size = new System.Drawing.Size(20, 20); this.disableTextureAnimationsCB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; this.disableTextureAnimationsCB.TabIndex = 39; @@ -484,12 +489,56 @@ this.disableTextureAnimationsButton.UseVisualStyleBackColor = true; this.disableTextureAnimationsButton.Click += new System.EventHandler(this.disableDynamicTexturesButton_Click); // + // expandTrainerNamesCB + // + this.expandTrainerNamesCB.Image = ((System.Drawing.Image)(resources.GetObject("expandTrainerNamesCB.Image"))); + this.expandTrainerNamesCB.Location = new System.Drawing.Point(803, 317); + this.expandTrainerNamesCB.Name = "expandTrainerNamesCB"; + this.expandTrainerNamesCB.Size = new System.Drawing.Size(20, 20); + this.expandTrainerNamesCB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.expandTrainerNamesCB.TabIndex = 43; + this.expandTrainerNamesCB.TabStop = false; + this.expandTrainerNamesCB.Visible = false; + // + // expandTrainerNamesTextLBL + // + this.expandTrainerNamesTextLBL.Location = new System.Drawing.Point(481, 320); + this.expandTrainerNamesTextLBL.Name = "expandTrainerNamesTextLBL"; + this.expandTrainerNamesTextLBL.Size = new System.Drawing.Size(288, 58); + this.expandTrainerNamesTextLBL.TabIndex = 42; + this.expandTrainerNamesTextLBL.Text = "Expands trainer names to be up to 12 characters long."; + this.expandTrainerNamesTextLBL.UseMnemonic = false; + // + // expandTrainerNamesLBL + // + this.expandTrainerNamesLBL.AutoSize = true; + this.expandTrainerNamesLBL.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.expandTrainerNamesLBL.Location = new System.Drawing.Point(481, 305); + this.expandTrainerNamesLBL.Name = "expandTrainerNamesLBL"; + this.expandTrainerNamesLBL.Size = new System.Drawing.Size(135, 13); + this.expandTrainerNamesLBL.TabIndex = 41; + this.expandTrainerNamesLBL.Text = "Expand Trainer Names"; + // + // expandTrainerNamesButton + // + this.expandTrainerNamesButton.Location = new System.Drawing.Point(829, 301); + this.expandTrainerNamesButton.Name = "expandTrainerNamesButton"; + this.expandTrainerNamesButton.Size = new System.Drawing.Size(100, 50); + this.expandTrainerNamesButton.TabIndex = 40; + this.expandTrainerNamesButton.Text = "Apply Patch"; + this.expandTrainerNamesButton.UseVisualStyleBackColor = true; + this.expandTrainerNamesButton.Click += new System.EventHandler(this.expandTrainerNamesButton_Click); + // // ROMToolboxDialog // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.ClientSize = new System.Drawing.Size(950, 513); + this.Controls.Add(this.expandTrainerNamesCB); + this.Controls.Add(this.expandTrainerNamesTextLBL); + this.Controls.Add(this.expandTrainerNamesLBL); + this.Controls.Add(this.expandTrainerNamesButton); this.Controls.Add(this.disableTextureAnimationsCB); this.Controls.Add(this.disableTextureAnimationsTextLBL); this.Controls.Add(this.disableTextureAnimationsLBL); @@ -544,6 +593,7 @@ ((System.ComponentModel.ISupportInitialize)(this.repointScrcmdCB)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.dynamicHeadersPatchCB)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.disableTextureAnimationsCB)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.expandTrainerNamesCB)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -591,5 +641,9 @@ private System.Windows.Forms.Label disableTextureAnimationsTextLBL; private System.Windows.Forms.Label disableTextureAnimationsLBL; private System.Windows.Forms.Button disableTextureAnimationsButton; + private System.Windows.Forms.PictureBox expandTrainerNamesCB; + private System.Windows.Forms.Label expandTrainerNamesTextLBL; + private System.Windows.Forms.Label expandTrainerNamesLBL; + private System.Windows.Forms.Button expandTrainerNamesButton; } } \ No newline at end of file diff --git a/DS_Map/ROMToolboxDialog.cs b/DS_Map/ROMToolboxDialog.cs index a4dda1f..0b3fb58 100644 --- a/DS_Map/ROMToolboxDialog.cs +++ b/DS_Map/ROMToolboxDialog.cs @@ -11,6 +11,7 @@ using DSPRE.Resources; using static DSPRE.RomInfo; using System.Threading.Tasks; using static DSPRE.Resources.ROMToolboxDB.ToolboxDB; +using static NSMBe4.ROM; namespace DSPRE { public partial class ROMToolboxDialog : Form { @@ -25,9 +26,12 @@ namespace DSPRE { public static bool flag_MainComboTableRepointed { get; set; } = false; public static bool flag_TrainerClassBattleTableRepointed { get; set; } = false; public static bool flag_PokemonBattleTableRepointed { get; set; } = false; - + public static bool flag_TrainerNamesExpanded { get; set; } = false; + public static bool overlay1MustBeRestoredFromBackup { get; private set; } = true; + public static int expandedTrainerNameLength = 12; + #region Constructor public ROMToolboxDialog() { InitializeComponent(); @@ -36,10 +40,12 @@ namespace DSPRE { if (RomInfo.gameLanguage == gLangEnum.English || RomInfo.gameLanguage == gLangEnum.Spanish) { CheckARM9ExpansionApplied(); + CheckExpandedTrainerNamespatchApplied(); } else { DisableARM9patch("Unsupported\nlanguage"); DisableBDHCamPatch("Unsupported\nlanguage"); DisableScrcmdRepointPatch("Unsupported\nlanguage"); + DisableTrainerNameExpansionPatch("Unsuported\nlanguage"); } switch (RomInfo.gameFamily) { @@ -132,6 +138,13 @@ namespace DSPRE { disableTextureAnimationsTextLBL.Enabled = false; disableTextureAnimationsButton.Text = reason; } + private void DisableTrainerNameExpansionPatch(string reason) + { + expandTrainerNamesButton.Enabled = false; + expandTrainerNamesLBL.Enabled = false; + expandTrainerNamesTextLBL.Enabled = false; + expandTrainerNamesButton.Text = reason; + } #endregion #endregion @@ -303,6 +316,29 @@ namespace DSPRE { public void CheckScrcmdRepointPatchApplied() { //throw new NotImplementedException(); } + + public void CheckExpandedTrainerNamespatchApplied() + { + uint position = 0x6AC32; + switch (RomInfo.gameFamily) + { + case gFamEnum.DP: + if (RomInfo.gameLanguage.Equals(gLangEnum.English)) position = 0x6AC32; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x6AC8E; + break; + case gFamEnum.Plat: + if (RomInfo.gameLanguage.Equals(gLangEnum.English)) position = 0x791DE; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x7927E; + break; + case gFamEnum.HGSS: + if (RomInfo.gameLanguage.Equals(gLangEnum.English) || RomInfo.gameVersion.Equals(gVerEnum.SoulSilver)) position = 0x7342E; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x73426; + break; + } + byte initValue = DSUtils.ARM9.ReadByte(position); + if(initValue == (byte)ROMToolboxDialog.expandedTrainerNameLength) DisableTrainerNameExpansionPatch("AlreadyApplied"); + + } #endregion #region Button Actions @@ -782,7 +818,74 @@ namespace DSPRE { } else { MessageBox.Show("No changes have been made.", "Operation canceled", MessageBoxButtons.OK, MessageBoxIcon.Information); } -} + } + + private void expandTrainerNamesButton_Click(object sender, EventArgs e) + { + // Pearl USA ARM9 at 0x6AC32 // TODO: Verify + // Pearl Spain ARM9 at 0x6AC8E // TODO: Verify + // Diamond USA ARM9 at 0x6AC32 + // Diamond Spain ARM9 at 0x6AC8E + // Platinum USA ARM9 at 0x791DE + // Platinum Spain ARM9 at 0x7927E + // HeartGold USA ARM9 at 0x7342E + // HeartGold Spain ARM9 at 0x73426 + // SoulSilver USA ARM9 at 0x7342E + // SoulSilver Spain ARM9 at 0x7342E // TODO: Verify + DialogResult d; + int position = 0x7342E; + bool gameFamGood = true; + d = MessageBox.Show($"Applying this patch will set the Trainer Name max length to { ROMToolboxDialog.expandedTrainerNameLength }.\n"+ + "Please note that if you have modified the ARM9 these offsets may be wrong.\n"+ + "If you have done so we encourage you to seek in your ARM9 for where to make the modification as your offset might change.\n\n" + + "Are you sure you want to proceed?", + "Confirm to proceed", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + + if (d == DialogResult.Yes) + { + switch (RomInfo.gameFamily) + { + case gFamEnum.DP: + if (RomInfo.gameLanguage.Equals(gLangEnum.English)) position = 0x6AC32; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x6AC8E; + else gameFamGood = false; + break; + case gFamEnum.Plat: + if (RomInfo.gameLanguage.Equals(gLangEnum.English)) position = 0x791DE; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x7927E; + else gameFamGood = false; + break; + case gFamEnum.HGSS: + if (RomInfo.gameLanguage.Equals(gLangEnum.English) || RomInfo.gameVersion.Equals(gVerEnum.SoulSilver)) position = 0x7342E; + else if (RomInfo.gameLanguage.Equals(gLangEnum.Spanish)) position = 0x73426; + else gameFamGood = false; + break; + } + if (gameFamGood) + { + using (DSUtils.ARM9.Writer wr = new DSUtils.ARM9.Writer()) + { + wr.BaseStream.Position = position; + wr.Write((byte)ROMToolboxDialog.expandedTrainerNameLength); + } + ROMToolboxDialog.flag_TrainerNamesExpanded = true; + DisableTrainerNameExpansionPatch("Already applied"); + expandTrainerNamesCB.Visible = true; + MessageBox.Show("Trainer Names have been expanded.", "Operation successful.", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Sorry this game language does not have a recorded offset for this patch.\n\n"+ + "Reach out in our discord if you want to help researching it!", + "Operation canceled", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + else + { + MessageBox.Show("No changes have been made.", "Operation canceled", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + #region Mikelan's custom commands private void applyCustomCommands(object sender, EventArgs e) { int expTableOffset = GetCommandTableOffset(); @@ -923,5 +1026,7 @@ namespace DSPRE { MessageBox.Show("This patch has already been applied.", "Can't reapply patch", MessageBoxButtons.OK, MessageBoxIcon.Information); } #endregion + + } } \ No newline at end of file diff --git a/DS_Map/ROMToolboxDialog.resx b/DS_Map/ROMToolboxDialog.resx index b2372a0..216bdbf 100644 --- a/DS_Map/ROMToolboxDialog.resx +++ b/DS_Map/ROMToolboxDialog.resx @@ -127,7 +127,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -137,7 +137,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -147,7 +147,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -157,7 +157,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -167,7 +167,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -177,7 +177,7 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb @@ -187,17 +187,27 @@ This patch is necessary to accomplish most ASM edits. iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb Ho2MhU9VbQAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + wAAADsABataJCQAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT + bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z + Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw + upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb + Ho2MhU9VbQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vwAADr8BOAVTJAAAAOFJREFUOE+tj8ERgkAMRddx0Js90ItFeJS7B3vxTDO04FiCdaxJ2ISwmywjcPiT bPLz+IQY464yh1s0Ne9LXK3rERAGkPt/hLDwPAt0WiTg7MtLYhgL3xaQZzUVsC1AD0Y7baK6AKzBaD8z Ya0APVi4NR/xFCZ481LLhbWHF4ToxecZ2UAmD/Y4kQ+Ag3hrB7VdSjZ6dEJpvENrBrAEguIBIb4J0FIw upmAncykgSX9hgfNYHyTqg2kaiXFN87xo5nSrQ+kXic1kuVygUkD6d58CYZ1nPWgzlMB3EvmcL1i+AEb