Compare commits

...

42 commits

Author SHA1 Message Date
Justin Aquadro
15b1b2891f Missing a check in nbtutil 2017-11-24 03:05:29 -05:00
Justin Aquadro
e26a29580a forgot to update typeprinter 2017-11-24 03:02:59 -05:00
Justin Aquadro
d29f249d7e Add support for long array tags 2017-11-24 02:42:34 -05:00
Justin Aquadro
931ac752f5 Fix InnerException reporting 2015-08-10 23:19:56 -04:00
Justin Aquadro
97386a4e5f Updated sln 2015-08-10 23:19:43 -04:00
Justin Aquadro
9d640079b8 Add JSON exporter to NBTUtil 2015-06-16 01:16:31 -04:00
Justin Aquadro
2882fcde17 Add a few more known NBT extensions to the file pattern for directory enumeration. Closes #21. File-based open can already handle all extensions, from #31. 2015-04-18 16:41:58 -04:00
Justin Aquadro
60a7bbf8e9 Add read/modify/delete support for short array tags. As this is nonstandard NBT, creation will not be supported. Will be changed in the future if Mojang updates their specification. 2015-04-18 16:37:10 -04:00
Justin Aquadro
27110539a8 Allow deleting chunks from region files. 2015-04-18 14:23:41 -04:00
Justin Aquadro
5d456cf743 Merge pull request #32 from codewarrior0/open-unknown-as-nbt
When opening files directly, try opening as NBT if no registered filetypes were able to open them.
2015-04-14 02:02:10 -04:00
David Vierra
a279bb281e When opening files directly, try opening as NBT if no registered filetypes were able to open them.
Allows associating *.bpt, *.rs, *.thaum, and other extensions with NBTExplorer.
2015-04-10 21:29:12 -10:00
Justin Aquadro
a9f40fc596 Merge pull request #29 from maruohon/paste-into-empty-list
Allow pasting tags to an empty List. Converts the list's type.
2015-03-18 01:48:55 -04:00
Justin Aquadro
3916b8d362 Merge pull request #28 from codewarrior0/unsort-lists
When sorting the children of a TAG_LIST, preserve the original order.
2015-03-18 01:46:56 -04:00
Matti Ruohonen
26780b841d Allow pasting tags to an empty List. Converts the list's type. 2015-03-17 12:11:34 +02:00
David Vierra
f2688a8f9f When sorting the children of a TAG_LIST, preserve the original order. Order matters for TAG_LISTs. 2015-03-06 00:51:58 -10:00
Justin Aquadro
abde7d87c9 Merge pull request #27 from TepigMC/master
Fixed Typo
2015-03-03 08:02:05 -05:00
Andrew Archibald
3dc86b8b7c Fixed Typo 2015-03-02 21:22:05 -08:00
Justin Aquadro
1fd6ec2680 Add absolute world chunk coordinate to chunk names. 2015-02-28 14:50:42 -05:00
Justin Aquadro
975c11d3d8 Merge pull request #26 from codewarrior0/natural-sort
Change natural comparer to respect negative numbers
2015-02-27 00:11:55 -05:00
David Vierra
7a151d3e6f Change natural comparer to respect negative numbers 2015-02-26 18:53:55 -10:00
Justin Aquadro
db5d2a05c0 Change string compare to natural compare 2015-02-26 23:21:44 -05:00
David Vierra
5c32832281 Make directories sort before files in sort order.
Change identifiers to match existing style.
2015-02-25 23:32:57 -10:00
David Vierra
d8229f7ec5 Add new sort order to NBT Tree view.
Compounds first, then lists, then plain old data, then array types.
2015-02-25 23:23:18 -10:00
Justin Aquadro
fc63457d8e Fix key collision crash in some searches. Add version to About dialog. 2014-09-16 02:04:27 -04:00
Justin Aquadro
d3e53ac559 Update version info 2014-04-01 22:30:08 -04:00
Justin Aquadro
c9014d8b1f Change checkbox behavior on Basic Find 2014-04-01 22:26:05 -04:00
Justin Aquadro
2a043ba09c Fix crash when refreshing nodes with list tag on modified path. 2014-04-01 22:21:38 -04:00
Justin Aquadro
6412629678 Make logging actually succeed 2014-04-01 21:41:45 -04:00
Justin Aquadro
f3304f51a1 Fix crash when refreshing an unexpanded node. Improve error logging. 2014-03-31 20:53:41 -04:00
Justin Aquadro
3e6240d895 Fix array editor disabled 2014-03-31 00:10:39 -04:00
Justin Aquadro
e1096e29ca fix absolute path crash 2014-02-20 02:23:38 -05:00
Justin Aquadro
b303551fa0 Update installer version 2014-02-20 02:03:45 -05:00
Justin Aquadro
16ec47a411 File organization; added wildcard and glob matching to NBTUtil paths 2014-02-20 01:58:40 -05:00
Justin Aquadro
c5debf12d4 Fix bugs in search rule matching 2014-02-19 20:29:22 -05:00
Justin Aquadro
d4ad1bd99a Restructuring project to support separate command-line utility 2014-02-16 02:56:27 -05:00
Justin Aquadro
a03537bb99 Add Open in Explorer to context menu 2013-12-18 23:12:42 -05:00
Justin Aquadro
2d70d2af10 Merge branch 'master' of https://github.com/flarn2006/NBTExplorer 2013-12-18 22:47:27 -05:00
Justin Aquadro
5d51967501 Try to improve control flicker 2013-12-18 22:45:05 -05:00
flarn2006
ab4e789114 Added a menu item to open a directory in Explorer 2013-12-17 19:39:21 -05:00
flarn2006
b642b3aee4 Don't want to mess with the keyboard shortcut
See previous commit/added comments
2013-12-17 19:24:15 -05:00
flarn2006
400eb1f80a Hold down Ctrl to avoid using folder browse dlg
That dialog just plain sucks...you can't type in a path, for instance.
2013-12-17 19:17:15 -05:00
Justin Aquadro
366ec3fe9e More rigorous startup failure checking and reporting 2013-11-17 13:26:19 -05:00
90 changed files with 4259 additions and 1186 deletions

1
.gitignore vendored
View file

@ -5,3 +5,4 @@ obj
*.cache
*.userprefs
Staging/
UpgradeLog*.htm

Binary file not shown.

View file

@ -3,7 +3,7 @@
<Product Id="*"
Name="NBTExplorer"
Language="1033"
Version="2.6.0.0"
Version="2.8.0.0"
Manufacturer="Justin Aquadro"
UpgradeCode="0bfb1026-21f2-4552-ad71-ca90aae10a25">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
@ -81,6 +81,15 @@
<Component Id="C.NBTExplorer.visualelementsmanifest.xml" Guid="*">
<File Source="../Staging/Windows/NBTExplorer.visualelementsmanifest.xml" KeyPath="yes" />
</Component>
<Component Id="C.NBTUtil.exe" Guid="*">
<File Source="../Staging/NBTUtil.exe" KeyPath="yes" />
</Component>
<Component Id="C.NBTUtil.exe.config" Guid="*">
<File Source="../Staging/NBTUtil.exe.config" KeyPath="yes" />
</Component>
<Component Id="C.NBTModel.dll" Guid="*">
<File Source="../Staging/NBTModel.dll" KeyPath="yes" />
</Component>
<Component Id="C.Substrate.dll" Guid="*">
<File Source="../Staging/Substrate.dll" KeyPath="yes" />
</Component>

View file

@ -1,81 +1,123 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorer", "NBTExplorer\NBTExplorer.csproj", "{8A458245-8176-4599-95CD-3CA39F2435CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorerMac", "NBTExplorer\NBTExplorerMac.csproj", "{01F9A296-C477-4CBF-A0D0-41E697048257}"
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "NBTExplorer.Installer", "NBTExplorer.Installer\NBTExplorer.Installer.wixproj", "{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
AppStore|Any CPU = AppStore|Any CPU
AppStore|Mixed Platforms = AppStore|Mixed Platforms
AppStore|x86 = AppStore|x86
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Any CPU.ActiveCfg = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Any CPU.Build.0 = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Mixed Platforms.Build.0 = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|x86.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|x86.Build.0 = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|x86.ActiveCfg = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|x86.Build.0 = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Any CPU.Build.0 = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.Build.0 = Release|x86
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Mixed Platforms.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|x86.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|x86.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|x86.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Any CPU.Build.0 = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|x86.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|x86.Build.0 = Release|Any CPU
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Any CPU.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|x86.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Any CPU.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Mixed Platforms.Build.0 = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|x86.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|x86.Build.0 = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Any CPU.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = NBTExplorerMac.csproj
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorer", "NBTExplorer\NBTExplorer.csproj", "{8A458245-8176-4599-95CD-3CA39F2435CE}"
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "NBTExplorer.Installer", "NBTExplorer.Installer\NBTExplorer.Installer.wixproj", "{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}"
ProjectSection(ProjectDependencies) = postProject
{8A458245-8176-4599-95CD-3CA39F2435CE} = {8A458245-8176-4599-95CD-3CA39F2435CE}
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC} = {20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF} = {BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTUtil", "NBTUtil\NBTUtil.csproj", "{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTModel", "NBTModel\NBTModel.csproj", "{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Substrate (NET2)", "..\Substrate\SubstrateCS\Substrate (NET2).csproj", "{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
AppStore|Any CPU = AppStore|Any CPU
AppStore|Mixed Platforms = AppStore|Mixed Platforms
AppStore|x86 = AppStore|x86
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Any CPU.ActiveCfg = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Any CPU.Build.0 = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|Mixed Platforms.Build.0 = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|x86.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.AppStore|x86.Build.0 = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|x86.ActiveCfg = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Debug|x86.Build.0 = Debug|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Any CPU.Build.0 = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Any CPU.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|x86.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Any CPU.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|Mixed Platforms.Build.0 = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|x86.ActiveCfg = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Debug|x86.Build.0 = Debug|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Any CPU.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.Build.0 = Release|x86
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|x86.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|x86.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|x86.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|x86.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Any CPU.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|x86.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|x86.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|x86.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|x86.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Any CPU.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|x86.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = NBTExplorerMac.csproj
EndGlobalSection
EndGlobal

View file

@ -6,6 +6,8 @@ using NBTExplorer.Model;
using NBTExplorer.Vendor.MultiSelectTreeView;
using NBTExplorer.Windows;
using Substrate.Nbt;
using System.Collections;
using NBTExplorer.Utility;
namespace NBTExplorer.Controllers
{
@ -20,6 +22,87 @@ namespace NBTExplorer.Controllers
}
}
public class NodeTreeComparer : IComparer
{
private NaturalComparer _comparer = new NaturalComparer();
public int OrderForTag(TagType tagID)
{
switch (tagID)
{
case TagType.TAG_COMPOUND:
return 0;
case TagType.TAG_LIST:
return 1;
case TagType.TAG_BYTE:
case TagType.TAG_SHORT:
case TagType.TAG_INT:
case TagType.TAG_LONG:
case TagType.TAG_FLOAT:
case TagType.TAG_DOUBLE:
case TagType.TAG_STRING:
return 2;
default:
return 3;
}
}
public int OrderForNode(object node)
{
if (node is DirectoryDataNode)
{
return 0;
}
else
{
return 1;
}
}
public int Compare(object x, object y)
{
TreeNode tx = x as TreeNode;
TreeNode ty = y as TreeNode;
TagDataNode dx = tx.Tag as TagDataNode;
TagDataNode dy = ty.Tag as TagDataNode;
if (dx == null || dy == null)
{
int nodeOrder = this.OrderForNode(tx.Tag).CompareTo(this.OrderForNode(ty.Tag));
if (nodeOrder != 0)
{
return nodeOrder;
}
else
{
return _comparer.Compare(tx.Text, ty.Text);
}
}
TagDataNode px = dx.Parent as TagDataNode;
TagDataNode py = dy.Parent as TagDataNode;
if (px != null && py != null)
{
if (px.Tag.GetTagType() == TagType.TAG_LIST || py.Tag.GetTagType() == TagType.TAG_LIST)
{
return 0;
}
}
TagType idx = dx.Tag.GetTagType();
TagType idy = dy.Tag.GetTagType();
int tagOrder = this.OrderForTag(idx).CompareTo(this.OrderForTag(idy));
if (tagOrder != 0)
{
return tagOrder;
}
else
{
return _comparer.Compare(dx.NodeDisplay, dy.NodeDisplay);
}
}
}
public class NodeTreeController
{
private TreeView _nodeTree;
@ -33,6 +116,7 @@ namespace NBTExplorer.Controllers
public NodeTreeController (TreeView nodeTree)
{
_nodeTree = nodeTree;
nodeTree.TreeViewNodeSorter = new NodeTreeComparer();
_multiTree = nodeTree as MultiSelectTreeView;
InitializeIconRegistry();
@ -147,6 +231,8 @@ namespace NBTExplorer.Controllers
node = item.Value.NodeCreate(path);
}
if (node == null)
node = NbtFileDataNode.TryCreateFrom(path);
if (node != null)
_nodeTree.Nodes.Add(CreateUnexpandedNode(node));
else
@ -676,7 +762,9 @@ namespace NBTExplorer.Controllers
_iconRegistry.Register(typeof(CubicRegionDataNode), 11);
_iconRegistry.Register(typeof(NbtFileDataNode), 12);
_iconRegistry.Register(typeof(TagIntArrayDataNode), 14);
_iconRegistry.Register(typeof(RootDataNode), 16);
_iconRegistry.Register(typeof(TagShortArrayDataNode), 16);
_iconRegistry.Register(typeof(TagLongArrayDataNode), 17);
_iconRegistry.Register(typeof(RootDataNode), 18);
}
private void UpdateNodeText (TreeNode node)
@ -729,8 +817,8 @@ namespace NBTExplorer.Controllers
ToolStripMenuItem itemExpandTree = new ToolStripMenuItem("Expand &Tree", null, _contextExpandTree_Click);
menu.Items.AddRange(new ToolStripItem[] {
itemCollapse, new ToolStripSeparator(), itemExpandChildren, itemExpandTree,
});
itemCollapse, new ToolStripSeparator(), itemExpandChildren, itemExpandTree,
});
}
else {
ToolStripMenuItem itemExpand = new ToolStripMenuItem("&Expand", null, _contextExpand_Click);
@ -751,6 +839,14 @@ namespace NBTExplorer.Controllers
menu.Items.Add(itemDn);
}
if (node is DirectoryDataNode) {
if (menu.Items.Count > 0)
menu.Items.Add(new ToolStripSeparator());
ToolStripMenuItem itemOpenExplorer = new ToolStripMenuItem("Open in E&xplorer", null, _contextOpenInExplorer_Click);
menu.Items.Add(itemOpenExplorer);
}
return (menu.Items.Count > 0) ? menu : null;
}
@ -791,6 +887,20 @@ namespace NBTExplorer.Controllers
MoveSelectionDown();
}
private void _contextOpenInExplorer_Click (object sender, EventArgs e)
{
if (_multiTree.SelectedNode != null && _multiTree.SelectedNode.Tag is DirectoryDataNode) {
DirectoryDataNode ddNode = _multiTree.SelectedNode.Tag as DirectoryDataNode;
try {
string path = (!Interop.IsWindows ? "file://" : "") + ddNode.NodeDirPath;
System.Diagnostics.Process.Start(path);
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Can't open directory", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
#region Capability Checking
#region Capability Predicates
@ -847,6 +957,12 @@ namespace NBTExplorer.Controllers
return (dataNode != null) && dataNode.CanCreateTag(TagType.TAG_INT_ARRAY);
}
public static bool CreateLongArrayNodePred (DataNode dataNode, out GroupCapabilities caps)
{
caps = GroupCapabilities.Single;
return (dataNode != null) && dataNode.CanCreateTag(TagType.TAG_LONG_ARRAY);
}
public static bool CreateStringNodePred (DataNode dataNode, out GroupCapabilities caps)
{
caps = GroupCapabilities.Single;

View file

@ -30,10 +30,10 @@ namespace NBTExplorer.Controllers
_iconRegistry = new IconRegistry();
_iconRegistry.DefaultIcon = 15;
_iconRegistry.Register(typeof(RootRule), 16);
_iconRegistry.Register(typeof(UnionRule), 19);
_iconRegistry.Register(typeof(IntersectRule), 18);
_iconRegistry.Register(typeof(WildcardRule), 17);
_iconRegistry.Register(typeof(RootRule), 18);
_iconRegistry.Register(typeof(UnionRule), 21);
_iconRegistry.Register(typeof(IntersectRule), 20);
_iconRegistry.Register(typeof(WildcardRule), 19);
_iconRegistry.Register(typeof(ByteTagRule), 0);
_iconRegistry.Register(typeof(ShortTagRule), 1);
_iconRegistry.Register(typeof(IntTagRule), 2);

60
NBTExplorer/Interop.cs Normal file
View file

@ -0,0 +1,60 @@
using System;
using System.Runtime.InteropServices;
namespace NBTExplorer
{
internal static class Interop
{
public static bool WinInteropAvailable
{
get { return IsWindows && Type.GetType("Mono.Runtime") == null; }
}
public static bool IsWindows
{
get { return Environment.OSVersion.Platform == PlatformID.Win32NT; }
}
public static bool IsWinXP
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) &&
((OS.Version.Major > 5) || ((OS.Version.Major == 5) && (OS.Version.Minor == 1)));
}
}
public static bool IsWinVista
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= 6);
}
}
public static IntPtr SendMessage (IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
if (WinInteropAvailable)
return NativeInterop.SendMessage(hWnd, msg, wParam, lParam);
else
return IntPtr.Zero;
}
}
internal static class NativeInterop
{
public const int WM_PRINTCLIENT = 0x0318;
public const int PRF_CLIENT = 0x00000004;
public const int TV_FIRST = 0x1100;
public const int TVM_SETBKCOLOR = TV_FIRST + 29;
public const int TVM_SETEXTENDEDSTYLE = TV_FIRST + 44;
public const int TVS_EX_DOUBLEBUFFER = 0x0004;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage (IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
}
}

View file

@ -1,24 +0,0 @@
using Substrate.Core;
namespace NBTExplorer.Model
{
public class CubicRegionFile : RegionFile
{
private const int _sectorBytes = 256;
private static byte[] _emptySector = new byte[_sectorBytes];
public CubicRegionFile (string path)
: base(path)
{ }
protected override int SectorBytes
{
get { return _sectorBytes; }
}
protected override byte[] EmptySector
{
get { return _emptySector; }
}
}
}

View file

@ -1,38 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
public ListTagContainer (TagNodeList tag)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
return _tag.Remove(tag);
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
_tag.Insert(index, tag);
return true;
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -12,6 +12,7 @@
<AssemblyName>NBTExplorer</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
@ -24,7 +25,6 @@
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -84,10 +84,12 @@
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate, Version=1.3.8.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>References\Substrate.dll</HintPath>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
@ -98,11 +100,8 @@
<ItemGroup>
<Compile Include="Controllers\ExplorerBarController.cs" />
<Compile Include="Controllers\NodeTreeController.cs" />
<Compile Include="FormRegistry.cs" />
<Compile Include="Controllers\RuleTreeController.cs" />
<Compile Include="Model\Search\SearchRule.cs" />
<Compile Include="NbtClipboardController.cs" />
<Compile Include="SnapshotList.cs" />
<Compile Include="Interop.cs" />
<Compile Include="Vendor\MultiSelectTreeView\MultiSelectTreeview.cs">
<SubType>Component</SubType>
</Compile>
@ -173,32 +172,6 @@
<Compile Include="Windows\EditHex.Designer.cs">
<DependentUpon>EditHex.cs</DependentUpon>
</Compile>
<Compile Include="Model\CompoundTagContainer.cs" />
<Compile Include="Model\CubicRegionDataNode.cs" />
<Compile Include="Model\CubicRegionFile.cs" />
<Compile Include="Model\DataNode.cs" />
<Compile Include="Model\DataNodeCollection.cs" />
<Compile Include="Model\DirectoryDataNode.cs" />
<Compile Include="Model\FileTypeRegistry.cs" />
<Compile Include="Model\ListTagContainer.cs" />
<Compile Include="Model\NbtFileDataNode.cs" />
<Compile Include="Model\NodeCapabilities.cs" />
<Compile Include="Model\RegionChunkDataNode.cs" />
<Compile Include="Model\RegionFileDataNode.cs" />
<Compile Include="Model\TagByteArrayDataNode.cs" />
<Compile Include="Model\TagByteDataNode.cs" />
<Compile Include="Model\TagCompoundDataNode.cs" />
<Compile Include="Model\TagContainerInterface.cs" />
<Compile Include="Model\TagDataNode.cs" />
<Compile Include="Model\TagDoubleDataNode.cs" />
<Compile Include="Model\TagFloatDataNode.cs" />
<Compile Include="Model\TagIntArrayDataNode.cs" />
<Compile Include="Model\TagIntDataNode.cs" />
<Compile Include="Model\TagListDataNode.cs" />
<Compile Include="Model\TagLongDataNode.cs" />
<Compile Include="Model\TagShortDataNode.cs" />
<Compile Include="Model\TagStringDataNode.cs" />
<Compile Include="NbtClipboardData.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
@ -207,7 +180,6 @@
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="SearchWorker.cs" />
<Compile Include="Model\TagKey.cs" />
<Compile Include="Vendor\Be.Windows.Forms.HexBox\BuiltInContextMenu.cs">
<SubType>Component</SubType>
</Compile>
@ -336,6 +308,12 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -1,4 +1,8 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using NBTExplorer.Windows;
@ -10,8 +14,13 @@ namespace NBTExplorer
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main ()
static void Main (string[] args)
{
Application.ThreadException += AppThreadFailureHandler;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += AppDomainFailureHandler;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
@ -31,5 +40,107 @@ namespace NBTExplorer
MessageBox.Show("Application failed during static initialization: " + original.Message);
Application.Exit();
}
private static void AppThreadFailureHandler (object sender, ThreadExceptionEventArgs e)
{
ProcessException(e.Exception);
}
private static void AppDomainFailureHandler (object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is Exception)
ProcessException(e.ExceptionObject as Exception);
else if (e.IsTerminating) {
MessageBox.Show("NBTExplorer encountered an unknown exception object: " + e.ExceptionObject.GetType().FullName,
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
private static void ProcessException (Exception ex)
{
if (IsMissingSubstrate(ex)) {
MessageBox.Show("NBTExplorer could not find required assembly \"Substrate.dll\".\n\nIf you obtained NBTExplorer from a ZIP distribution, make sure you've extracted NBTExplorer and all of its supporting files into another directory before running it.",
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
return;
}
if (IsMissingNBTModel(ex)) {
MessageBox.Show("NBTExplorer could not find required assembly \"NBTModel.dll\".\n\nIf you obtained NBTExplorer from a ZIP distribution, make sure you've extracted NBTExplorer and all of its supporting files into another directory before running it.",
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
return;
}
StringBuilder errorText = new StringBuilder();
errorText.AppendLine("NBTExplorer encountered the following exception while trying to run: " + ex.GetType().Name);
errorText.AppendLine("Message: " + ex.Message);
Exception ix = ex;
while (ix.InnerException != null) {
ix = ix.InnerException;
errorText.AppendLine();
errorText.AppendLine("Caused by Inner Exception: " + ix.GetType().Name);
errorText.AppendLine("Message: " + ix.Message);
}
try {
string logDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NBTExplorer");
if (!Directory.Exists(logDir))
Directory.CreateDirectory(logDir);
string logPath = Path.Combine(logDir, "error.log");
using (var writer = new StreamWriter(logPath, true)) {
writer.WriteLine("NBTExplorer Error Report");
writer.WriteLine(DateTime.Now);
writer.WriteLine("-------");
writer.WriteLine(errorText);
writer.WriteLine("-------");
ix = ex;
while (ix != null) {
writer.WriteLine(ex.StackTrace);
writer.WriteLine("-------");
ix = ix.InnerException;
}
writer.WriteLine();
}
errorText.AppendLine();
errorText.AppendLine("Additional error detail has been written to:\n" + logPath);
}
catch { }
MessageBox.Show(errorText.ToString(), "NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
private static bool IsMissingSubstrate (Exception ex)
{
if (ex is TypeInitializationException && ex.InnerException != null)
ex = ex.InnerException;
if (ex is FileNotFoundException) {
FileNotFoundException fileEx = ex as FileNotFoundException;
if (fileEx.FileName.Contains("Substrate"))
return true;
}
return false;
}
private static bool IsMissingNBTModel (Exception ex)
{
if (ex is TypeInitializationException && ex.InnerException != null)
ex = ex.InnerException;
if (ex is FileNotFoundException) {
FileNotFoundException fileEx = ex as FileNotFoundException;
if (fileEx.FileName.Contains("NBTModel"))
return true;
}
return false;
}
}
}

View file

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTExplorer")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2012")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.6.0.0")]
[assembly: AssemblyFileVersion("2.6.0.0")]
[assembly: AssemblyVersion("2.8.0.0")]
[assembly: AssemblyFileVersion("2.8.0.0")]

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

View file

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using NBTExplorer.Model;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using NBTExplorer.Model;
namespace NBTExplorer
{
@ -53,12 +53,12 @@ namespace NBTExplorer
if (SearchName != null) {
string tagName = node.NodeName;
if (tagName != null)
mName = tagName.Contains(SearchName);
mName = CultureInfo.InvariantCulture.CompareInfo.IndexOf(tagName, SearchName, CompareOptions.IgnoreCase) >= 0;
}
if (SearchValue != null) {
string tagValue = node.NodeDisplay;
if (tagValue != null)
mValue = tagValue.Contains(SearchValue);
mValue = CultureInfo.InvariantCulture.CompareInfo.IndexOf(tagValue, SearchValue, CompareOptions.IgnoreCase) >= 0;
}
if (mName && mValue) {

View file

@ -11,7 +11,6 @@ namespace NBTExplorer.Vendor.MultiSelectTreeView
{
public class MultiSelectTreeView : TreeView
{
#region Selected Node(s) Properties
private List<TreeNode> m_SelectedNodes = null;
@ -57,14 +56,40 @@ namespace NBTExplorer.Vendor.MultiSelectTreeView
public MultiSelectTreeView()
{
DoubleBuffered = true;
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
m_SelectedNodes = new List<TreeNode>();
base.SelectedNode = null;
}
private void UpdateExtendedStyles ()
{
if (Interop.WinInteropAvailable) {
int style = 0;
if (DoubleBuffered)
style |= NativeInterop.TVS_EX_DOUBLEBUFFER;
if (style != 0)
Interop.SendMessage(Handle, NativeInterop.TVM_SETEXTENDEDSTYLE, (IntPtr)NativeInterop.TVS_EX_DOUBLEBUFFER, (IntPtr)style);
}
}
#region Overridden Events
protected override void OnHandleCreated (EventArgs e)
{
base.OnHandleCreated(e);
if (Interop.WinInteropAvailable) {
UpdateExtendedStyles();
if (!Interop.IsWinXP)
Interop.SendMessage(Handle, NativeInterop.TVM_SETBKCOLOR, IntPtr.Zero, (IntPtr)ColorTranslator.ToWin32(BackColor));
}
}
protected override void OnGotFocus( EventArgs e )
{
// Make sure at least one node has a selection

View file

@ -35,17 +35,14 @@
//
// linkLabel1
//
this.linkLabel1.AutoSize = true;
this.linkLabel1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(165, 31);
this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(171, 32);
this.linkLabel1.Location = new System.Drawing.Point(96, 12);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(256, 133);
this.linkLabel1.Size = new System.Drawing.Size(272, 133);
this.linkLabel1.TabIndex = 0;
this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011-2013 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEd" +
"it by copyboy\r\nFugue icon set: p.yusukekamiyamane.com\r\n\r\nEmail: jaquadro@gmail.c" +
"om\r\nNBTExplorer Github Project Page";
this.linkLabel1.Text = resources.GetString("linkLabel1.Text");
this.linkLabel1.UseCompatibleTextRendering = true;
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
//
@ -63,7 +60,7 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(350, 144);
this.ClientSize = new System.Drawing.Size(380, 144);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
@ -73,7 +70,6 @@
this.Text = "About NBTExplorer";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}

View file

@ -7,6 +7,14 @@ namespace NBTExplorer.Windows
public About ()
{
InitializeComponent();
int len = linkLabel1.Text.Length;
System.Version version = typeof(About).Assembly.GetName().Version;
linkLabel1.Text = linkLabel1.Text.Replace("{ver}", version.Major + "." + version.Minor + "." + version.Build);
int adj = linkLabel1.Text.Length - len;
linkLabel1.LinkArea = new LinkArea(linkLabel1.LinkArea.Start + adj, linkLabel1.LinkArea.Length);
}
private void linkLabel1_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e)

View file

@ -117,6 +117,16 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="linkLabel1.Text" xml:space="preserve">
<value>NBTExplorer {ver}
Copyright ©2011-2017 Justin Aquadro
NBTExplorer is based on NBTEdit by copygirl
Fugue icon set: p.yusukekamiyamane.com
Email: jaquadro@gmail.com
NBTExplorer Github Project Page</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

View file

@ -107,6 +107,8 @@ namespace NBTExplorer.Windows
return new TagNodeList(TagType.TAG_BYTE);
case TagType.TAG_LONG:
return new TagNodeLong();
case TagType.TAG_LONG_ARRAY:
return new TagNodeLongArray(new long[_size]);
case TagType.TAG_SHORT:
return new TagNodeShort();
case TagType.TAG_STRING:
@ -163,6 +165,8 @@ namespace NBTExplorer.Windows
switch (_type) {
case TagType.TAG_BYTE_ARRAY:
case TagType.TAG_INT_ARRAY:
case TagType.TAG_SHORT_ARRAY:
case TagType.TAG_LONG_ARRAY:
return true;
default:
return false;

View file

@ -38,8 +38,6 @@
// _cbName
//
this._cbName.AutoSize = true;
this._cbName.Checked = true;
this._cbName.CheckState = System.Windows.Forms.CheckState.Checked;
this._cbName.Location = new System.Drawing.Point(13, 13);
this._cbName.Name = "_cbName";
this._cbName.Size = new System.Drawing.Size(57, 17);
@ -65,6 +63,7 @@
this._textName.Name = "_textName";
this._textName.Size = new System.Drawing.Size(273, 20);
this._textName.TabIndex = 2;
this._textName.TextChanged += new System.EventHandler(this._textName_TextChanged);
//
// _textValue
//
@ -74,6 +73,7 @@
this._textValue.Name = "_textValue";
this._textValue.Size = new System.Drawing.Size(273, 20);
this._textValue.TabIndex = 3;
this._textValue.TextChanged += new System.EventHandler(this._textValue_TextChanged);
//
// _buttonFind
//

View file

@ -41,5 +41,15 @@ namespace NBTExplorer.Windows
DialogResult = DialogResult.Cancel;
Close();
}
private void _textName_TextChanged (object sender, EventArgs e)
{
_cbName.Checked = true;
}
private void _textValue_TextChanged (object sender, EventArgs e)
{
_cbValue.Checked = true;
}
}
}

View file

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

View file

@ -64,6 +64,7 @@
this._tbReplaceDouble = new System.Windows.Forms.ToolStripButton();
this._tbReplaceByteArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceIntArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceLongArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceString = new System.Windows.Forms.ToolStripButton();
this._tbReplaceList = new System.Windows.Forms.ToolStripButton();
this._tbReplaceCompound = new System.Windows.Forms.ToolStripButton();
@ -90,7 +91,7 @@
this.groupBox1.Controls.Add(this.panel1);
this.groupBox1.Location = new System.Drawing.Point(3, 3);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(324, 211);
this.groupBox1.Size = new System.Drawing.Size(341, 211);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Find";
@ -104,7 +105,7 @@
this.panel1.Controls.Add(this.toolStrip1);
this.panel1.Location = new System.Drawing.Point(6, 19);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(312, 186);
this.panel1.Size = new System.Drawing.Size(329, 186);
this.panel1.TabIndex = 0;
//
// treeView1
@ -118,7 +119,7 @@
this.treeView1.SelectedImageIndex = 0;
this.treeView1.ShowPlusMinus = false;
this.treeView1.ShowRootLines = false;
this.treeView1.Size = new System.Drawing.Size(312, 161);
this.treeView1.Size = new System.Drawing.Size(329, 161);
this.treeView1.TabIndex = 1;
//
// imageList1
@ -141,10 +142,12 @@
this.imageList1.Images.SetKeyName(13, "map.png");
this.imageList1.Images.SetKeyName(14, "edit-code-i.png");
this.imageList1.Images.SetKeyName(15, "question-white.png");
this.imageList1.Images.SetKeyName(16, "arrow-315.png");
this.imageList1.Images.SetKeyName(17, "asterisk-yellow.png");
this.imageList1.Images.SetKeyName(18, "sql-join-inner.png");
this.imageList1.Images.SetKeyName(19, "sql-join-outer.png");
this.imageList1.Images.SetKeyName(16, "edit-code-s.png");
this.imageList1.Images.SetKeyName(17, "edit-code-l.png");
this.imageList1.Images.SetKeyName(18, "arrow-315.png");
this.imageList1.Images.SetKeyName(19, "asterisk-yellow.png");
this.imageList1.Images.SetKeyName(20, "sql-join-inner.png");
this.imageList1.Images.SetKeyName(21, "sql-join-outer.png");
//
// toolStrip1
//
@ -166,7 +169,7 @@
this._tbFindString});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(312, 25);
this.toolStrip1.Size = new System.Drawing.Size(329, 25);
this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1";
//
@ -307,9 +310,9 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.Controls.Add(this._deleteTagsCheckbox);
this.groupBox2.Controls.Add(this.panel2);
this.groupBox2.Location = new System.Drawing.Point(333, 3);
this.groupBox2.Location = new System.Drawing.Point(350, 3);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(324, 211);
this.groupBox2.Size = new System.Drawing.Size(341, 211);
this.groupBox2.TabIndex = 1;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Replace";
@ -334,7 +337,7 @@
this.panel2.Controls.Add(this.toolStrip2);
this.panel2.Location = new System.Drawing.Point(6, 19);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(312, 163);
this.panel2.Size = new System.Drawing.Size(329, 163);
this.panel2.TabIndex = 0;
//
// treeView2
@ -348,7 +351,7 @@
this.treeView2.SelectedImageIndex = 0;
this.treeView2.ShowPlusMinus = false;
this.treeView2.ShowRootLines = false;
this.treeView2.Size = new System.Drawing.Size(312, 138);
this.treeView2.Size = new System.Drawing.Size(329, 138);
this.treeView2.TabIndex = 1;
//
// toolStrip2
@ -366,12 +369,13 @@
this._tbReplaceDouble,
this._tbReplaceByteArray,
this._tbReplaceIntArray,
this._tbReplaceLongArray,
this._tbReplaceString,
this._tbReplaceList,
this._tbReplaceCompound});
this.toolStrip2.Location = new System.Drawing.Point(0, 0);
this.toolStrip2.Name = "toolStrip2";
this.toolStrip2.Size = new System.Drawing.Size(312, 25);
this.toolStrip2.Size = new System.Drawing.Size(329, 25);
this.toolStrip2.TabIndex = 0;
this.toolStrip2.Text = "toolStrip2";
//
@ -480,6 +484,16 @@
this._tbReplaceIntArray.Text = "Add Int Array Tag";
this._tbReplaceIntArray.Click += new System.EventHandler(this._tbReplaceIntArray_Click);
//
// _tbReplaceLongArray
//
this._tbReplaceLongArray.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this._tbReplaceLongArray.Image = ((System.Drawing.Image)(resources.GetObject("_tbReplaceLongArray.Image")));
this._tbReplaceLongArray.ImageTransparentColor = System.Drawing.Color.Magenta;
this._tbReplaceLongArray.Name = "_tbReplaceLongArray";
this._tbReplaceLongArray.Size = new System.Drawing.Size(23, 22);
this._tbReplaceLongArray.Text = "Add Long Array Tag";
this._tbReplaceLongArray.Click += new System.EventHandler(this._tbReplaceLongArray_Click);
//
// _tbReplaceString
//
this._tbReplaceString.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -513,7 +527,7 @@
// _buttonFind
//
this._buttonFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonFind.Location = new System.Drawing.Point(516, 251);
this._buttonFind.Location = new System.Drawing.Point(550, 251);
this._buttonFind.Name = "_buttonFind";
this._buttonFind.Size = new System.Drawing.Size(75, 23);
this._buttonFind.TabIndex = 2;
@ -524,7 +538,7 @@
// _buttonReplace
//
this._buttonReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonReplace.Location = new System.Drawing.Point(597, 251);
this._buttonReplace.Location = new System.Drawing.Point(631, 251);
this._buttonReplace.Name = "_buttonReplace";
this._buttonReplace.Size = new System.Drawing.Size(75, 23);
this._buttonReplace.TabIndex = 3;
@ -535,7 +549,7 @@
// _buttonReplaceAll
//
this._buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonReplaceAll.Location = new System.Drawing.Point(597, 280);
this._buttonReplaceAll.Location = new System.Drawing.Point(631, 280);
this._buttonReplaceAll.Name = "_buttonReplaceAll";
this._buttonReplaceAll.Size = new System.Drawing.Size(75, 23);
this._buttonReplaceAll.TabIndex = 4;
@ -558,7 +572,7 @@
//
this._explorerStrip.Location = new System.Drawing.Point(0, 0);
this._explorerStrip.Name = "_explorerStrip";
this._explorerStrip.Size = new System.Drawing.Size(684, 25);
this._explorerStrip.Size = new System.Drawing.Size(718, 25);
this._explorerStrip.TabIndex = 7;
this._explorerStrip.Text = "toolStrip3";
//
@ -576,14 +590,14 @@
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(660, 217);
this.tableLayoutPanel1.Size = new System.Drawing.Size(694, 217);
this.tableLayoutPanel1.TabIndex = 8;
//
// FindReplace
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(684, 314);
this.ClientSize = new System.Drawing.Size(718, 314);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this._explorerStrip);
this.Controls.Add(this._buttonCancel);
@ -658,5 +672,6 @@
private System.Windows.Forms.ToolStrip _explorerStrip;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.CheckBox _deleteTagsCheckbox;
private System.Windows.Forms.ToolStripButton _tbReplaceLongArray;
}
}

View file

@ -162,6 +162,11 @@ namespace NBTExplorer.Windows
_replaceController.CreateNode(TagType.TAG_INT_ARRAY);
}
private void _tbReplaceLongArray_Click(object sender, EventArgs e)
{
_replaceController.CreateNode(TagType.TAG_LONG_ARRAY);
}
private void _tbReplaceString_Click (object sender, EventArgs e)
{
_replaceController.CreateNode(TagType.TAG_STRING);

View file

@ -117,9 +117,6 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>235, 17</value>
</metadata>
@ -127,290 +124,300 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABA
QgAAAk1TRnQBSQFMAgEBFAEAAcABAQHAAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABYAMAAQEBAAEYBgABSP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AOEAA/8D/AP6GPgD+QP6A/wMAAP9
A/oS+AP5A/0D/2kAA/4D+QPxAboBogGKAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFW
AbYBhgFWAbYBhgFWAbwBpAGNA/cMAAP8A/YD8wG8AcoBzQFVAZUBowFVAZUBowHQAdcB2QPzA/UD+wP/
BgAD/wP9A/oD+AP5A/oD+wb8A/sD+gP5A/gD+gP9Bv8D/QP6A/gD+QP6A/sG/AP7A/oD+QP4A/oD/QP/
DAAB6AHfAdQBuQGJAVkB/AG4ARwB/AGzAQ4B/AGzAQ0B/AGzAQwB/AGyAQsB/AGyAQsB/AGzAQ4BuQGJ
AVkPAAH4AvkGAAFeAZkBpgFHAdQB5QFIAcwB3gFZAZYBpAYAAfgC+QkAA/4D+gHvAe4B7QHiAdsB1AHf
AdIBxQHcAcwBvAHgAdMBxQHfAdUBzgHfAdUBzgHgAdMBxQHcAcwBvAHfAdIBxQHiAdsB1AHvAe4B7QP6
Bv4D+gHpAeYB5QHcAagBnAHmAYABZQHmAWgBSAHnAYEBaAHgAasBngHgAasBngHnAYEBZwHmAWgBSAHm
AYABZQHcAagBnAHpAeYB5QP6A/4PAAHpAd8B1QG+AY4BXQH3AbYBKAH1AasBDgH1AasBDgH1AasBDgH1
AasBDgH2Aa4BFAG+AY4BXQwAAc0B3gHiAVwBnwGtAX4BsQG8AeAB6gHsAX4BsQG8AUQBzwHgAUwB1AHl
AVwBnwGtAeAB6gHsAX4BsQG8AVwBnwGtAc0B3gHiCQAB9gH1AfMB4QHUAcYB4gHVAccB6QHeAdMB6gHf
AdQB5AG8AasB4gFvAU8B4gFvAU8B5AG8AasB6gHfAdQB6QHeAdMB4gHVAccB4QHUAcYB9gH1AfMGAAHs
AeIB3wHcAXYBWQHkAZYBfAHnAbYBoQHpAcEBrgHjAbABmQHbAY8BcgHbAY8BcgHjAbABmQHpAcEBrgHn
AbYBogHkAZYBfAHcAXYBWQHsAeIB3xUAAdoBwgGqAcMBkwFgAfEBtAE2AewBpgEZAewBpgEZAewBpgEZ
Ae4BqgEjAcMBkwFgDAABYQGoAbUBRAHLAdwBRgHFAdQBVQGqAbkBfQG2AcABRwHGAdYBUQHPAd8BYQGo
AbUBVQGqAbkBRgHFAdQBRAHLAdwBYQGoAbUGAAP7AeMB1wHKAekB3wHVAekB3wHUAekB3wHUAeYB0QHD
AdMBaQFJAeYBsQGcAeYBsQGcAdMBaQFJAeYB0QHDAekB3wHUAekB3wHUAekB3wHVAeMB1wHKA/sB+AH1
AfQBzwFtAVEB5QGuAZkB6QHDAbEB6AHDAbEB6AHBAa4B3wG0AZ0B6QHAAawB6QHAAawB3wG0AZ0B6AHB
Aa4B6AHDAbEB6QHDAbEB5QGuAZkBzwFvAVMB+AH1AfQPAAHsAeIB1wHJAZkBZAHsAbYBSgHjAaABJQHj
AaABJQHjAaABJQHjAaABJQHmAacBMQHJAZkBZAwAAWIBrQG6AWkBzwHeAUsByQHaAUQBxgHXAVcBrgG7
AUkBvgHOAVYBzgHeAVcBrgG7AUQBxgHXAUgByAHYAVUByAHXAWIBrQG6BgAB8AHqAeUB5gHaAc0B6wHh
AdcB6gHgAdYB6gHgAdYB0QGSAXoB2AGPAXYB6QHEAbIB6QHEAbIB2AGPAXYB0QGSAXoB6gHgAdYB6gHg
AdYB6gHgAdUB5QHaAc0B8AHqAeUB2QGuAaEB1gGQAXcB6wHEAbMB6QHEAbEB6gHEAbIB4gG5AaQB5QG8
AacB6QHEAbIB6QHEAbIB5QG8AacB4gG5AaQB6gHEAbIB6QHEAbIB6QHEAbIB1wGQAXgB2QGuAaEMAAHt
AeMB2AHNAZ4BaQHqAbkBXAHbAZoBMQHbAZoBMQHbAZoBMQHmAbIBUgHbAZoBMQHgAaQBPwHNAZ4BaQwA
AekB8QHyAYQBvwHJAWYBuwHIAV0BvwHPAUQBwwHUAUQBwwHUAU8ByAHYAUQBwwHUAVgBvAHMAV8BuAHG
AYQBvwHJAekB8QHyBgAB6QHgAdcB7QHlAd0B7QHlAd0B7AHjAdoB6wHiAdkBtgFcAT0B5AG1AaIB6QHF
AbMB6QHFAbMB5AG1AaIBtgFcAT0B6wHhAdgB6gHhAdgB6gHhAdgB6wHiAdgB6QHgAdcBuwFqAVEB5gG1
AaMB7QHGAbUB7AHFAbQB6wHFAbMB4AG2AZ8B6gHEAbEB6QHFAbMB6QHFAbMB6gHEAbEB4AG2AZ8B6wHF
AbMB6QHFAbMB6QHFAbMB5AG2AaIBuwFqAVEJAAHuAeQB2QHTAaMBbQHuAcIBcQHUAZYBPQHTAZUBOwHT
AZUBOwHlAbYBYQHTAaMBbQHjAbIBXQHaAaIBSwHTAaMBbRIAAeUB7gHwAWUBtAHBAU4BvgHOAUgBxQHW
AUgBxQHWAU4BvgHOAWUBtAHBAeUB7gHwDAAB6AHdAdIB8QHqAeMB7wHnAd8B7wHnAd8B8AHoAeIBrAFK
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACC
RAAAAk1TRnQBSQFMAgEBFgEAAdgBAQHYAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABYAMAAQEBAAEYBgABSP8AkwAD/wP9A/oD+AP5A/oD+wb8A/sD+gP5A/gD+gP9Bv8D/QP6A/gD+QP6
A/sG/AP7A/oD+QP4A/oD/QP/YAAD/gP6Ae8B7gHtAeIB2wHUAd8B0gHFAdwBzAG8AeAB0wHFAd8B1QHO
Ad8B1QHOAeAB0wHFAdwBzAG8Ad8B0gHFAeIB2wHUAe8B7gHtA/oG/gP6AekB5gHlAdwBqAGcAeYBgAFl
AeYBaAFIAecBgQFoAeABqwGeAeABqwGeAecBgQFnAeYBaAFIAeYBgAFlAdwBqAGcAekB5gHlA/oD/mMA
AfYB9QHzAeEB1AHGAeIB1QHHAekB3gHTAeoB3wHUAeQBvAGrAeIBbwFPAeIBbwFPAeQBvAGrAeoB3wHU
AekB3gHTAeIB1QHHAeEB1AHGAfYB9QHzBgAB7AHiAd8B3AF2AVkB5AGWAXwB5wG2AaEB6QHBAa4B4wGw
AZkB2wGPAXIB2wGPAXIB4wGwAZkB6QHBAa4B5wG2AaIB5AGWAXwB3AF2AVkB7AHiAd9jAAP7AeMB1wHK
AekB3wHVAekB3wHUAekB3wHUAeYB0QHDAdMBaQFJAeYBsQGcAeYBsQGcAdMBaQFJAeYB0QHDAekB3wHU
AekB3wHUAekB3wHVAeMB1wHKA/sB+AH1AfQBzwFtAVEB5QGuAZkB6QHDAbEB6AHDAbEB6AHBAa4B3wG0
AZ0B6QHAAawB6QHAAawB3wG0AZ0B6AHBAa4B6AHDAbEB6QHDAbEB5QGuAZkBzwFvAVMB+AH1AfRgAAHw
AeoB5QHmAdoBzQHrAeEB1wHqAeAB1gHqAeAB1gHRAZIBegHYAY8BdgHpAcQBsgHpAcQBsgHYAY8BdgHR
AZIBegHqAeAB1gHqAeAB1gHqAeAB1QHlAdoBzQHwAeoB5QHZAa4BoQHWAZABdwHrAcQBswHpAcQBsQHq
AcQBsgHiAbkBpAHlAbwBpwHpAcQBsgHpAcQBsgHlAbwBpwHiAbkBpAHqAcQBsgHpAcQBsgHpAcQBsgHX
AZABeAHZAa4BoWAAAekB4AHXAe0B5QHdAe0B5QHdAewB4wHaAesB4gHZAbYBXAE9AeQBtQGiAekBxQGz
AekBxQGzAeQBtQGiAbYBXAE9AesB4QHYAeoB4QHYAeoB4QHYAesB4gHYAekB4AHXAbsBagFRAeYBtQGj
Ae0BxgG1AewBxQG0AesBxQGzAeABtgGfAeoBxAGxAekBxQGzAekBxQGzAeoBxAGxAeABtgGfAesBxQGz
AekBxQGzAekBxQGzAeQBtgGiAbsBagFRYAAB6AHdAdIB8QHqAeMB7wHnAd8B7wHnAd8B8AHoAeIBrAFK
ASkB6wHGAbYB6gHGAbYB6gHGAbYB6wHHAbUBrAFKASkB6wHiAdkB7AHjAdoB7AHjAdoB7AHjAdoB6AHd
AdIBrgFNASsB7gHFAbQB7gHIAbgB7gHIAbgB7wHIAbgB3wG3AaAB6wHGAbYB6gHGAbYB6gHGAbYB6wHH
AbUB3wG3AaAB6wHFAbUB6gHGAbYB6gHGAbYB6gHDAbEBrgFNASsGAAHvAeUC2QGpAXEB+QHQAYQB7gGy
AWYB6QGtAWEB3wGjAVUB6wHAAXIB2QGpAXEB5QHOAbIB2QGpAXEB5AG1AWgB2QGpAXEMAAHqAfIB8wGG
AcQBzwFaAboByQFXAb8BzwFlAdIB4gFlAdIB4gFTAcsB3AFjAdEB4QFXAb8BzwFaAboByQGGAcQBzwHq
AfIB8wYAAewB5AHbAe8B6AHiAe8B6AHhAe8B6AHhAfIB6wHkAb0BaQFKAecBuAGmAewBxwG2AesBxwG2
AeUBuAGmAbwBaAFJAewB5AHbAewB5AHcAewB5AHbAe0B5gHeAewB5AHbAb8BcgFYAegBuQGnAe8ByQG4
Ae8ByQG4AfAByQG4AeIBugGkAe4BxwG4AewBxwG2AesBxwG2AeoBxQG0AeIBuQGkAewBxwG3AeoBxwG2
AesBxwG2AeYBuQGmAb8BcgFYBgAB3gGuAXUB+gHVAYkB8QG2AWoB8QG2AWoB8QG2AWoB+QHSAYYB3gGu
AXUB7wHmAdoDAAHvAeYB2gHeAa4BdQHeAa4BdQwAAWgBugHHAWABzgHgAWEB1AHlAXMB2gHqAWsBwAHO
AYMB4QHvAWEBzQHdAWoBwAHNAXAB2QHpAWEB1AHlAWABzgHgAWgBugHHBgAB8wHvAesB6QHfAdUB8QHr
AeUB8QHqAeQB8QHrAeUB2QGhAYwB3QGdAYQB8AHJAbkB8AHJAbkB3QGdAYQB2QGhAYwB8QHrAeUB8QHq
AeQB8QHrAeUB6QHfAdUB8wHvAesB3AG2AakB3AGaAYIB8AHJAbkB7wHKAboB8AHKAboB5wG/AawB6QHB
Aa4B8AHJAbkB8AHJAbkB6QHBAa4B5wG/AawB8AHKAboB7wHKAboB8AHJAbkB3AGaAYIB3AG2AakGAAHx
AecB2wHjAbMBeAH9AdsBjwH3AcQBeAH8AdoBjgHjAbMBeAHxAecB2wkAAfEB5wHbAegBzQGsDAABaQG+
AcsBkwHqAfcBjgHiAfABbwHFAdEBaQG+AcsBjwHoAfYBbAHYAeoBhAHIAdIBbgHEAdEBhwHgAe4BigHm
AfQBaQG+AcsGAAP8AewB4wHbAe8B6QHjAfIB7AHmAfEB6wHlAe8B3QHVAd4BhwFoAe0BuwGoAe0BuwGo
Ad4BhwFoAe8B3QHVAfEB6wHlAfIB7AHmAe8B6QHjAewB4wHbA/wB+AH2AfUB1gGGAWoB6gG3AaQB8AHK
AboB8AHKAboB7wHJAbkB5gG/AasB7wHHAbgB7wHHAbgB5gG/AasB7wHJAbkB8AHKAboB8AHKAboB6gG3
AaQB1gGGAWoB+AH2AfUJAAHxAegB3AHnAbcBewH/Ad8BkwHnAbcBewHxAegB3B4AAdEB5wHqAWsBwAHM
AYkBywHUAeIB7gHwAWsBwAHMAZkB7gH7AXsB5AH1AYkBywHUAeIB7gHwAYkBywHUAWsBwAHMAdEB5wHq
CQAC+QH4AewB5AHcAesB4AHWAfIB7AHmAfUB8AHsAe0B0AHCAeoBkgFzAeoBkgFzAe0B0AHCAfUB8AHs
AfIB7AHmAesB4AHWAewB5AHcAvkB+AYAAfIB6AHkAeMBkAF0AeoBqQGQAe8BwQGwAfIByQG6AewBvAGq
AeQBpQGLAeQBpQGLAewBvAGqAfIByQG6Ae8BwQGwAeoBqQGQAeMBkAF0AfIB6AHkDwAB8gHoAdwB6QG5
AX0B8gHoAdwkAAH5AfoB+wYAAWsBwgHPAZ4B7AH2AZkB7QH7AXABxAHQBgAB+QH6AfsPAAP8AfQB8QHu
Ae8B6QHiAe0B5AHcAe8B6QHiAfEB6gHkAfEB6gHkAe8B6QHiAe0B5AHcAe8B6QHiAfQB8QHuA/wMAAH5
AfYB9QHtAcYBuQHrAZ0BgwHrAYkBaQHrAZ0BgwHtAcQBtwHtAcQBtwHrAZ0BgwHrAYkBaQHrAZ0BgwHt
AcYBuQH5AfYB9UgAAeUB8AHyAWwBxAHRAWwBxAHRAdIB6AHr/wAzAAP8A/kh+AP5A/wDAAP9A/kh+AP5
A/05AAP/A/wD+RL4A/kD+wP+BgABlgGpAbwBXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGE
Aa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BlgGpAbwDAALPAcsCuQGw
ArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwAs8ByzkAA/4D+AHo
AuUB2QG0AasB6gGOAXcB7gFwAVAB7gFwAVAB6gGOAXcB2QG0AasB6AHlAeQD9gP+BgABbAGTAboBVQGI
AbsBcAGjAdYBZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGa
Ac0BcAGjAdYBVQGIAbsBbAGTAboDAALBAbkC+QHpAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLz
AeIC8wHiAvMB4gLzAeIC+QHpAsEBuTwAAeoB3AHYAe4BggFnAfUBogGPAfoB0QHKAfwB5wHlAfwB5gHl
AfkB0QHJAfQBoQGOAe4BgQFmAeoB3AHYCQABfgGiAccBcQGkAdcBVQGIAbsBcQGkAdcBcQGkAdcBcQGk
AdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBVQGIAbsBcQGkAdcBfgGiAccDAALL
AcMC9AHkAXoBpwGbAYcBtwGnAYcBtQGjAYkBswGiAWgBoAGGAVcBlwF4AVgBkwF5AWgBkAF+AZIBpAGT
AYYBlwGAAqgBjgL0AeQCywHDCQAD/gP8BvkD+gb8A/sG+QP8A/4MAAHzAd8B2gHuAXsBYAH3AdQBzgH3
AukB9wLoAfwC9AH8AvQB9wLoAfcC6QH2AdEBygHuAXsBXwHzAd8B2gYAAYYBqgHNAXMBpgHZAWoBnQHQ
AUgBewGuAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUgBewGuAWoBnQHQ
AXMBpgHZAYYBqgHNAwACzwHHAvUB5gGEAbUBqwGYAdcBxwGQAdEBvgFzAbABmQGXAcsBtgGnAc4BvQGX
Ab0BrAGUAboBqAGpAb8BrwGOAa0BoQG3Aa0BiwL1AeYCzwHHCQAD/gP8A/kDswNcBvwDXAO0A/kD/AP+
CQAB+gH4AfcB5wF+AWIB8wHTAc0B8ALlAe8C5AHvAuQB5QFhAT8B5QFhAT8B7wLkAe8C5AHvAuQB7wHN
AccB5wF+AWIB+gH4AfcDAAGLAa0BzwF1AagB2wFsAZ8B0gFKAX0BsAFsAZ8B0gFSAYUBuAFsAZ8B0gFS
AYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFKAX0BsAFsAZ8B0gF1AagB2wGLAa0BzwMAAtEByQL2AekBkAG8
AbUBuQHlAdsBpgHdAdABiAHAAbIBhwHJAbUBfgG+AaQBiAG5AaMBrgHQAb8BqQHHAbUBlAG6AagBtgG1
AZEC9gHpAtEByQ8AA8sDdQP4BgAD+AN1A8sPAAHoAcUBvAHlAZ0BigHqAuIB5wLfAecC3wHnAt8B1gFZ
ATcB1gFZATcB5wLfAecC3wHnAt8B6ALgAeEBlwGEAegBxQG8AwABjwGxAdIBdwGqAd0BbgGhAdQBRwF6
Aa0BbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBRwF6Aa0BbgGhAdQBdwGq
Ad0BjwGxAdIDAALTAcwC9wHrAcUBuAGHAf8B3gGMAfgB5wGtAdUB0QGwAcoB6wHiAb0B5QHZAaABygG7
AaoBzgGvAYIBwQGkAX4BtgKYAawBhAL3AesC0wHMDAADzgN/A/kB3QGzAbkBwAFJAVoBwAFJAVoB3QGz
AbkD+QN/A84MAAHSAYQBbgHqAdAByAHhAtoB4ALZAeAC2QHgAtkB8QLtAfEC7QHgAtkB4ALZAeAC2QHg
AtkB4QHEAb0B0gGEAW4DAAGTAbQB1AF4AasB3gFvAaIB1QFEAXcBqgFvAaIB1QFMAX8BsgFvAaIB1QFM
AX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFEAXcBqgFvAaIB1QF4AasB3gGTAbQB1AMAAtUBzQL4Ae4B0QGu
AWkB2wG6AXEB3gG+AXQB6QHJAXwBvwHNAagBlQHMAcIBoQHPAb4BkQHEAa8BfwG9AaYBdwG3AZ0BqAGq
AXcC+AHuAtUBzQkAA9ADhgP5BgAB4AG2AbwB0QF7AYcGAAP5A4YD0AkAAbsBVAE1AfQB7gHtAecC5QHa
AtYB2ALUAdgC1AG3AUgBJgG3AUgBJgHjAt8B2ALUAdgC1AHYAtQB4QHYAdYBuwFUATUDAAGYAbgB1wF6
Aa0B4AFxAaQB1wFBAXQBpwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFB
AXQBpwFxAaQB1wF6Aa0B4AGYAbgB1wMAAtcBzwL5AfEB0wGsAWYB/wHTAX4B/wHWAYIB4AG+AXQB9gHh
AZkBsAHtAeQBrwHRAb8BogHgAdMBmAHYAcYBjgHQAboBuAGyAYAC+QHxAtcBzwYAA+8DbAPvCQAB4wG4
Ab8B1wGBAY0JAAPvA2wD7wYAAbEBUAExAfQB7wHtA+4D6gHcAtsB0wLRAccBpgGcAa4BRwElAcEBcwFa
Ad4C3AHSAtAB0gLQAd8B2AHXAbEBUAExAwABmwG6AdkBfAGvAeIBcwGmAdkBPwFyAaUBcwGmAdkBRwF6
Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBPwFyAaUBcwGmAdkBfAGvAeIBmwG6AdkDAALZ
AdEC+wH0AdUBqQFiAf8BzgF5Af8B0gF9Ad8BugFvAf8B2AGDAeYB6gG9AaYB2AHNAbMB7AHiAbkB5AHQ
AbYB3AHEAasBvgGXAvsB9ALZAdEJAAPUA5ED+QYAAeYBuwHBAd0BhwGTBgAD+QORA9QJAAHAAX0BZgHq
AdUBzQnwA+sD4AHIAZwBjQGrAUYBJAG9AYoBeQPOAdIC0QHcAccCwAF9AWYDAAGdAb0B2wF+AbEB5AF1
AagB2wE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngF1
AagB2wF+AbEB5AGdAb0B2wMAAtoB0wL8AfcB1wGnAV8B2gGsAWQB3AGwAWcB5wG8AXAB4AG6AW8B4wG+
AXMB3wHRAZgB2wHPAZYB1QHRAZwBxAHNAaQBnQHRAcMC/AH3AtoB0wwAA9UDlgP5AegBvQHDAd0BZgF3
Ad0BZgF3AegBvQHDA/kDlgPVDAAB3wHDAbkB1AGdAYoD9QbzAdoBqQGYAdoBqQGYAc8BjgF4AbMBTwEt
AdMBoQGQA/MD9QHUAZwBiQHfAcMBuQMAAaABvgHcAX8BsgHlAWYBmQHMAXYBqQHcAXYBqQHcAXYBqQHc
AXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAWYBmQHMAX8BsgHlAaABvgHcAwAC2wHU
Av0B+QHZAaQBXAH/AcQBbwH/AcgBcwHeAbABZwH/Ac4BeQH/AdIBfQHkAb4BcgH/AdgBgwHtAeQBqAHi
AeYBtgHQAdcBrQL9AfkC2wHUDwAD1wOZA/oGAAP6A5kD1w8AAfkB+AH3AcsBewFgAfIB3wHZA/gD9wHB
AV0BOwHBAV0BOwHBAV0BOwHBAV0BOwHpAdAByAP4AfIB3wHZAcsBewFgAfkB+AH3AwABowHAAd4BawGe
AdEBdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGq
Ad0BdwGqAd0BawGeAdEBowHAAd4DAALdAdUC/gH8AdoBowFaAf8BvwFrAf8BwgFuAd4BrAFiAf8ByQF0
Af8BzQF4AeMBuQFuAf8B0wF+Af8B1wGDAfwB3gGVAewBygF8Av4B/ALdAdUSAAPYA50GAAOdA9gVAAHu
AeAB2wHYAYQBaAH2AeMB3AP8DPsD/AH2AeMB3AHYAYQBaAHuAeAB2wYAAaYBwwHgAaAB0wH6AZgBywH1
AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZgBywH1
AaAB0wH6AaYBwwHgAwAC3gHXAv8B/gHbAaEBWAHbAaIBWQHbAaQBWwHbAaUBXQHbAakBYAHbAawBYwHb
Aa8BZgHbAbEBaAHbAbQBawHbAbcBbgHbAbkBcQL/Af4C3gHXPAAB8AHiAd0B5AGUAXgB7wG3AaQB+gHk
Ad0B/gH5AfcB/gH5AfcB+gHkAd0B7wG3AaQB5AGUAXgB8AHiAd0JAAHoAe0B8wGoAcQB4QGXAcoB9QGS
AcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGXAcoB9QGo
AcQB4QHoAe0B8wMAAt8B2Sf/At8B2T8AAfoC+AHvAdIByAHsAagBkgHsAY4BbgHsAY4BbgHsAagBkgHv
AdIByAH6AvgPAAHoAe0B8wGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGp
AcUB4gGpAcUB4gGpAcUB4gGpAcUB4gHoAe0B8wYAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC6gHmwwAD+wPxAZUBrwG8AWgBmwG2AWgBmwG2AWgBmwG2
AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AZUBrwG8A/ED+xUAEvgD+QP9
MwAD/AP5JPgD+QP8A/0D+gF3AagBwQGGAc8B8AGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGB
AcsB7QGGAc8B8AFLAY8BsQGGAc8B8AF3AagBwQHcAeIB5Qb9A/kM+APzAYkBpQGPAVUBiwFfAVUBiwFf
AVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAZQBrQGZBgADwAMsA8ADAAP7G/gD+wP3AZMBpgG6AWABiAGv
AWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGv
AWABiAGvAZMBpgG6A/cGAAGGAbUBzQGEAc4B7gF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8
AccB6AGEAc4B7gFXAZsBvQGEAc4B7gH0AbYBLgGGAbUBzQMAApQBuAJVAaMCVQGjAlUBowJVAaMCVQGj
AlUBowFVAXoBiQE1Ab0BeQFDAcsBhwE+AcYBggE+AcYBggE+AcYBggFDAcsBhwFVAaABcAYAA0ABZwJW
A0ADAAP7A2EDXgNcA1kDVANJAzwDLwNsA/sDAAFyAZgBvwF7Aa4B4AF6Aa0B3wF6Aa0B3wF6Aa0B3wF6
Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF7Aa4B4AFyAZgBvwkAAZEBvgHU
AYcB0AHvAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAYcB0AHvAV8BowHFAYcB0AHv
Af4ByQFBAZEBvgHUAwACVQG0AS8BHgHcASUBEwHYASUBEwHYASUBEwHYASUBEwHYASUBEwHYAVUBfgGV
ATcBvwF7AUIBygGGATcBvwF7ATcBvwF7ATcBvwF7AUIBygGGAVUBpwF2BgADywNVA8snAAGEAacBywGB
AbQB5AF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9
AbAB4QGBAbQB5AGEAacBywkAAZQBwAHWAYoB0wHwAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHr
AYIBzQHrAYoB0wHwAWIBpgHIAYoB0wHwAukB2wGUAcAB1gMAAlUBuQEtARwB3gEVAQAB1QEVAQAB1QEV
AQAB1QEVAQAB1QEVAQAB1QFVAYEBmgE7AcMBfwFIAc8BjAE7AcMBfwE7AcMBfwE7AcMBfwFIAc8BjAFV
Aa0BezYAAYoBrQHPAYgBuwHqAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHl
AYIBtQHlAYIBtQHlAYIBtQHlAYgBuwHqAYoBrQHPCQABmAHDAdgBjgHWAfIBhwHQAe0BhwHQAe0BhwHQ
Ae0BhwHQAe0BhwHQAe0BhwHQAe0BjgHWAfIBZgGqAcwBjgHWAfIC8AHmAZgBwwHYAwACVQG/ATYBJQHk
ARkBAAHbARkBAAHbARkBAAHbARkBAAHbARkBAAHbAVUBhAGgAT4BxgGCAU0B1QGRAT4BxgGCAT4BxgGC
AT4BxgGCAU0B1QGRAVUBswGANgABjgGwAdEBjwHCAe4BhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6
AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBjwHCAe4BjgGwAdEJAAGbAcYB2gGSAdoB9AGL
AdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGSAdoB9AFpAa0BzwGSAdoB9AL4AfMBmwHG
AdoDAAJVAcQBPgEtAewBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBVQGGAaQBQgHKAYYBUQHZ
AZUBQgHKAYYBQgHKAYYBQgHKAYYBUQHZAZUBVQG5AYQGAAPQA2cD0CcAAZMBtAHUAZYByQHyAYwBvwHs
AYwBvwHsAYwBvwHsAUQBdwGqAYwBvwHsAUQBdwGqAYwBvwHsAYwBvwHsAYwBvwHsAYwBvwHsAZYByQHy
AZMBtAHUCQABnwHIAd0BlwHeAfYBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBlwHe
AfYBeQG9AdwBeAG9AdwC/gH9AZ8ByAHdAwACVQHIAUYBNQHyASABAAHpASABAAHpASABAAHpASABAAHp
ASABAAHpAVUBiQGoAUQBzAGIAWUB7QGpAWUB7QGpAWUB7QGpAWUB7QGpAVgB1gGWAX8BywGkBgADbAFv
AmkDbAYAA3UDdANxA24DbANoA2UDYwNgBgABmAG4AdcBmwHOAfYBkQHEAfABkQHEAfABkQHEAfABVQGI
AbsBRAF3AaoBVQGIAbsBQAFzAaYBkQHEAfABkQHEAfABkQHEAfABmwHOAfYBmAG4AdcJAAGiAcoB3gGb
AeEB9wGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGeAeQB+QF8AcAB3gGi
AcoB3gHuAfMB9QMAAn8B1QFiAWEB5wF2AXUB/gF2AXUB/gF5AWIBowF7AVABVQF7AVABVQFqAVkBPwFq
AW4BMgFqAW4BMgFhAYsBUQFVAcEBigFVAcEBigFVAcEBigHiAe8B6AYAA9MDcQPTJwABmwG6AdkBnwHS
AfkBlQHIAfMBlQHIAfMBlQHIAfMBVQGIAbsBVQGIAbsBVQGIAbsBTQGAAbMBlQHIAfMBlQHIAfMBlQHI
AfMBnwHSAfkBmwG6AdkJAAGlAc0B4AGeAeUB+QGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGY
Ad8B9gGYAd8B9gGYAd8B9gGhAegB+gGlAc0B4AYAAuIB8QJVAc4CVQHOAlUBzgFtAVMBdQHcAakBMgHX
AaQBLQHXAaQBLQHXAaQBLQHcAakBMgGwAYYBSEIAAZ8BvQHbAakB2wH+AaoB3QH/AaoB3QH/AaoB3QH/
AXcBqgHdAXcBqgHdAXcBqgHdAWYBmQHMAaoB3QH/AaoB3QH/AaoB3QH/AakB2wH+AZ8BvQHbCQABqAHO
AeIBowHoAfsBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBowHo
AfsBqAHOAeISAAG2AYsBRQHcAakBMgHRAZ4BJwHRAZ4BJwHRAZ4BJwHcAakBMgG2AYsBRUIAAccB1wHn
AYgBtgHiAYABswHmAYABswHmAYABswHmAU4BgQG0AU4BgQG0AU4BgQG0AUgBewGuAYABswHmAYABswHm
AYABswHmAYgBtgHiAccB1wHnCQABqwHQAeMBpgHrAfwBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHm
AfsBoQHmAfsBoQHmAfsBoQHmAfsBpgHrAfwBqwHQAeMSAAG7AZABQQHhAa4BOAHWAaMBLAHWAaMBLAHW
AaMBLAHhAa4BOAG7AZABQRIAA9cDfQPXJwAB4wHqAfEBjgG4AeEBiQG8Ae8BiAG7Ae4BiAG7Ae4BQQF0
AacBQQF0AacBQQF0AacBPgFxAaQBiAG7Ae4BiAG7Ae4BiQG8Ae8BjgG4AeEB4wHqAfEJAAGuAdIB5AGp
Ae4B/QGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGpAe4B/QGu
AdIB5BIAAcABlQE/AecBtAE9AdoBpwEwAdoBpwEwAdoBpwEwAecBtAE9AcABlQE/EgADfwN3A38GAAOC
A4EDfwN+A3wDegN5A3YDqwYAAfUB9wH5AZsBvgHfAYkBvAHvAYgBuwHuAYgBuwHuATUBaAGbATUBaAGb
ATUBaAGbATUBaAGbAYgBuwHuAYgBuwHuAYkBvAHvAZsBvgHfAfUB9wH5CQABsAHUAeYBrAHxAf8BpwHs
Af4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BrAHxAf8BsAHUAeYSAAHG
AZoBPQHrAbgBQQHdAaoBMwHdAaoBMwHdAaoBMwHrAbgBQQHGAZoBPRIAA9gDggPYJwAD/gHLAdoB6gGp
AcUB4gGpAcUB4gGpAcUB4gFVAX0BpgFVAX0BpgFVAX0BpgFVAX0BpgGpAcUB4gGpAcUB4gGpAcUB4gHL
AdoB6gP+CQABsgHVAeYBsQH1Af8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHy
Af8BrgHyAf8BsQH1Af8BsgHVAeYSAAHUAbMBbAHnAbgBRgH+AcsBVAH+AcsBVAH+AcsBVAHnAbgBRgHU
AbMBbHUAAdAB5AHuAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHn
AbMB1gHnAbMB1gHnAdAB5AHuEgAB8AHrAd4BzQGgATkBzQGgATkBzQGgATkBzQGgATkBzQGgATkB8AHr
Ad4PAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7
A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7YAAD/QP6
AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9
AfoC/AH4Av4B+QLAAbgD+gP9ZgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHB
DAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBbAACzwHHA/8D/gL9AfwC/QH7
AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4
AfQC9wHyAvsB9QLPAccMAAP+A/wG+QP6BvwD+wb5A/wD/gYAA/0D/AP6HvgD+gP8A/0GAALQAcgC/wH+
Av0B/AL9AfsBvwFIAa4B7AHOAeUC+gH2AvgB9AL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AHp
Ac8B6wGuAUgBvwGuAUgBvwGuAUgBvwHTAaEB2gL3AfIC9gHwAvoB8wLQAcgMAAP+A/wD+QOzA1wG/ANc
A7QD+QP8A/4GAAP9A4QDNAOEA/gD4gY0A4QD4gN1A6QD+AOEAzQD6QYAAtIBywL+A/0B+wL8AfkBxgFP
AbUB7AHPAeUC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsB6gHRAe0BtQFPAcYC+gH2
AecBzgHoAbUBTwHGAe4B4QHrAvUB7gL6AfIC0gHLEgADywN1A/gGAAP4A3UDyxIAA3kD9QYAA6oDeQYA
A8sDvgPuA6oDwgkAAtUBzQL+A/wB+QL7AfgBzgFXAb0BzgFXAb0BzgFXAb0B4gGmAdYC9QHuAvQB7AL5
Ae8C1QHNDAAC1QHNAv4D/AH5AesB0gHtAb0BVwHOAvgB9AL3AfIBvQFXAc4B5wHNAeUC9AHsAvkB7wLV
Ac0PAAPOA38D+QwAA/kDfwPODwADxgxgA8YGAAP1CWAD6QkAAtYBzgL9A/sB+AL6AfYB1gFfAcUB7wHR
AeYC9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgB7AHTAe4BxQFfAdYC9wHyAeoB0QHq
AcUBXwHWAe0B4QHpAvEB5wL3AeoC1gHODAAD0AOGA/kSAAP5A4YD0AwAA/UDlAPvA9EDaAP1CQADkwPv
A2gMAALYAdAC/QP6AfYC+AH0AdwBZQHLAdwBZQHLAdwBZQHLAeIBiQHTAvEB5wLsAd8C9AHlAtgB0AwA
AtgB0AL9A/oB9gHtAdMB7gHLAWUB3AHLAWUB3AHLAWUB3AHfAawB4wLxAecC7AHfAvQB5QLYAdAJAAPv
A2wD7xgAA+8DbAPvDAADjwP2A7cDjwwAA8wDfQPMDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx
AecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLz
AeIC2gHSDAAD1AORA/kSAAP5A5ED1A8AA84D1QN3A84MAAPsA3cD7AwAAtsB0wL8A/cB8gL2AfAC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf
AugB2QLmAdUC8gHhAtsB0w8AA9UDlgP5DAAD+QOWA9USAAP2A6IDfgP2IQAC3AHVAvsD9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLo
AdkC5gHVAuUB1ALyAeEC3AHVEgAD1wOZA/oGAAP6A5kD1xgABpwkAALdAdYC+gH0AvUB7gL0AewC8QHn
AuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLm
AdUCpAGTAqQBkwKkAZMCyQHAFQAD2AOdBgADnQPYRQAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHV
AuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLe
AdcC9wH2bAAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8
AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfZvAALqAeYC4AHZAuAB2QLgAdkC4AHZ
AuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3
AfZsAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7
A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHD
ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4
AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7A/0D+gLAAbgL/wP+Af0C/gH8
Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4
A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8
Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9BgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7
AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9
AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
AvgB9AL7AfYCyQHBDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwA
As8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
AvgB9AL3AfIC+wH1As8BxwwAAtAByAL/Af4C/QH8AdwBzwHrAXsBSAG/AXsBSAG/AXsBSAG/AYsBXgHG
AegB4QHrAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7AYIBwgG0AVkBrgGdAVkBrgGdAakB0wHI
AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wHeAaIBqQG/AUgBWQG/AUgBWQHcAaABpgL3
AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBvwF7AUgBvwF7AUgBvwF7AUgB3AG6AZ4C9wHy
AvYB8AL6AfMC0AHIDAAC0gHLAv4D/QH7Ad0B0QHtAYIBTwHGAvoB9gL4AfQBggFPAcYB2QHMAeUC9QHu
AvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AvsB+AL6AfYB0gHoAeABYAG1AaQC9gHwAvUB7gL6AfIC0gHL
DAAC0gHLAv4D/QH7AvwB+QL7AfgB4AGlAasB0wF6AYUC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+
A/0B+wL8AfkBxgGCAU8B7AHbAcwC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALVAc0C/gP8AfkB3wHS
Ae0BigFXAc4BmAFsAdMBigFXAc4BpQF/AdcB5wHhAekC9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4
AbIB3AHSAWgBvQGsAWgBvQGsAa4B2QHNAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgC+gH2
AeMBqAGuAdkBfwGLAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4Ac4BigFXAe4B3QHM
AvcB8gL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1gHOAv0D+wH4AeAB0wHuAZIBXwHWAvcB8gHdAdAB6QGS
AV8B1gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AXABxQG0AdUB6wHiAvYB8AL1Ae4C9AHs
AvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gL4AfQB5wGrAbEB3gGFAZAC9QHuAvQB7ALxAecC9wHq
AtYBzgwAAtYBzgL9A/sB+AL6AfYB1gGSAV8B7wHeAc0C9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALY
AdAC/QP6AfYB4AHTAe4BmAFlAdwBmAFlAdwBmAFlAdwBxQGsAeMC8QHnAuwB3wL0AeUC2AHQDAAC2AHQ
Av0D+gH2AvgB9AG3AeEB1QF2AcsBugF2AcsBugGVAdUBxgLxAecC7AHfAvQB5QLYAdAMAALYAdAC/QP6
AfYC+AH0AeoBrwG0AdwBZQF2AdwBZQF2AegBrAGxAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4
AfQB3AGYAWUB7wHeAc0C9QHuAvQB7ALxAecC7AHfAvQB5QLYAdAMAALaAdIC/AP4AfQC9wHyAvYB8AL1
AbUB3wG3AaAB6wHFAbUB6gHGAbYB6gHGAbYB6gHDAbEBrgFNAStgAAHsAeQB2wHvAegB4gHvAegB4QHv
AegB4QHyAesB5AG9AWkBSgHnAbgBpgHsAccBtgHrAccBtgHlAbgBpgG8AWgBSQHsAeQB2wHsAeQB3AHs
AeQB2wHtAeYB3gHsAeQB2wG/AXIBWAHoAbkBpwHvAckBuAHvAckBuAHwAckBuAHiAboBpAHuAccBuAHs
AccBtgHrAccBtgHqAcUBtAHiAbkBpAHsAccBtwHqAccBtgHrAccBtgHmAbkBpgG/AXIBWGAAAfMB7wHr
AekB3wHVAfEB6wHlAfEB6gHkAfEB6wHlAdkBoQGMAd0BnQGEAfAByQG5AfAByQG5Ad0BnQGEAdkBoQGM
AfEB6wHlAfEB6gHkAfEB6wHlAekB3wHVAfMB7wHrAdwBtgGpAdwBmgGCAfAByQG5Ae8BygG6AfABygG6
AecBvwGsAekBwQGuAfAByQG5AfAByQG5AekBwQGuAecBvwGsAfABygG6Ae8BygG6AfAByQG5AdwBmgGC
AdwBtgGpYAAD/AHsAeMB2wHvAekB4wHyAewB5gHxAesB5QHvAd0B1QHeAYcBaAHtAbsBqAHtAbsBqAHe
AYcBaAHvAd0B1QHxAesB5QHyAewB5gHvAekB4wHsAeMB2wP8AfgB9gH1AdYBhgFqAeoBtwGkAfABygG6
AfABygG6Ae8ByQG5AeYBvwGrAe8BxwG4Ae8BxwG4AeYBvwGrAe8ByQG5AfABygG6AfABygG6AeoBtwGk
AdYBhgFqAfgB9gH1YwAC+QH4AewB5AHcAesB4AHWAfIB7AHmAfUB8AHsAe0B0AHCAeoBkgFzAeoBkgFz
Ae0B0AHCAfUB8AHsAfIB7AHmAesB4AHWAewB5AHcAvkB+AYAAfIB6AHkAeMBkAF0AeoBqQGQAe8BwQGw
AfIByQG6AewBvAGqAeQBpQGLAeQBpQGLAewBvAGqAfIByQG6Ae8BwQGwAeoBqQGQAeMBkAF0AfIB6AHk
aQAD/AH0AfEB7gHvAekB4gHtAeQB3AHvAekB4gHxAeoB5AHxAeoB5AHvAekB4gHtAeQB3AHvAekB4gH0
AfEB7gP8DAAB+QH2AfUB7QHGAbkB6wGdAYMB6wGJAWkB6wGdAYMB7QHEAbcB7QHEAbcB6wGdAYMB6wGJ
AWkB6wGdAYMB7QHGAbkB+QH2AfX/AP8A/wAMAAP/A/wD+hj4A/kD+gP8DAAD/QP6EvgD+QP9A/9pAAP+
A/kD8QG6AaIBigG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG8
AaQBjQP3DAAD/AP2A/MBvAHKAc0BVQGVAaMBVQGVAaMB0AHXAdkD8wP1A/sD/wwAA/4D/Ab5A/oG/AP7
BvkD/AP+DAAD/gP8BvkD+gb8A/sG+QP8A/4SAAHoAd8B1AG5AYkBWQH8AbgBHAH8AbMBDgH8AbMBDQH8
AbMBDAH8AbIBCwH8AbIBCwH8AbMBDgG5AYkBWQ8AAfgC+QYAAV4BmQGmAUcB1AHlAUgBzAHeAVkBlgGk
BgAB+AL5DwAD/gP8A/kDswNcBvwDXAO0A/kD/AP+DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+FQAB6QHf
AdUBvgGOAV0B9wG2ASgB9QGrAQ4B9QGrAQ4B9QGrAQ4B9QGrAQ4B9gGuARQBvgGOAV0MAAHNAd4B4gFc
AZ8BrQF+AbEBvAHgAeoB7AF+AbEBvAFEAc8B4AFMAdQB5QFcAZ8BrQHgAeoB7AF+AbEBvAFcAZ8BrQHN
Ad4B4hIAA8sDdQP4BgAD+AN1A8sYAAPLA3UD+AYAA/gDdQPLHgAB2gHCAaoBwwGTAWAB8QG0ATYB7AGm
ARkB7AGmARkB7AGmARkB7gGqASMBwwGTAWAMAAFhAagBtQFEAcsB3AFGAcUB1AFVAaoBuQF9AbYBwAFH
AcYB1gFRAc8B3wFhAagBtQFVAaoBuQFGAcUB1AFEAcsB3AFhAagBtQ8AA84DfwP5AYIBwgG0AVkBrgGd
AVkBrgGdAakB0wHIA/kDfwPOEgADzgN/A/kBvwF9AUoBvwF9AUoBwAF+AU0B4gHOAb8D+QN/A84YAAHs
AeIB1wHJAZkBZAHsAbYBSgHjAaABJQHjAaABJQHjAaABJQHjAaABJQHmAacBMQHJAZkBZAwAAWIBrQG6
AWkBzwHeAUsByQHaAUQBxgHXAVcBrgG7AUkBvgHOAVYBzgHeAVcBrgG7AUQBxgHXAUgByAHYAVUByAHX
AWIBrQG6DAAD0AOGA/kJAAHSAegB4AFgAbUBpAMAA/kDhgPQDAAD0AOGA/kDAAHGAYIBUQHiAcsBuQkA
A/kDhgPQEgAB7QHjAdgBzQGeAWkB6gG5AVwB2wGaATEB2wGaATEB2wGaATEB5gGyAVIB2wGaATEB4AGk
AT8BzQGeAWkMAAHpAfEB8gGEAb8ByQFmAbsByAFdAb8BzwFEAcMB1AFEAcMB1AFPAcgB2AFEAcMB1AFY
AbwBzAFfAbgBxgGEAb8ByQHpAfEB8gkAA+8DbAPvBgABsgHcAdIBaAG9AawBaAG9AawBrgHZAc0GAAPv
A2wD7wYAA+8DbAPvBgABzgGKAVkB5AHNAboMAAPvA2wD7wwAAe4B5AHZAdMBowFtAe4BwgFxAdQBlgE9
AdMBlQE7AdMBlQE7AeUBtgFhAdMBowFtAeMBsgFdAdoBogFLAdMBowFtEgAB5QHuAfABZQG0AcEBTgG+
Ac4BSAHFAdYBSAHFAdYBTgG+Ac4BZQG0AcEB5QHuAfASAAPUA5ED+QMAAXABxQG0AdUB6wHiCQAD+QOR
A9QMAAPUA5ED+QMAAdYBkgFhAecBzwG8CQAD+QORA9QMAAHvAeUC2QGpAXEB+QHQAYQB7gGyAWYB6QGt
AWEB3wGjAVUB6wHAAXIB2QGpAXEB5QHOAbIB2QGpAXEB5AG1AWgB2QGpAXEMAAHqAfIB8wGGAcQBzwFa
AboByQFXAb8BzwFlAdIB4gFlAdIB4gFTAcsB3AFjAdEB4QFXAb8BzwFaAboByQGGAcQBzwHqAfIB8w8A
A9UDlgP5AbcB4QHVAXYBywG6AXYBywG6AZUB1QHGA/kDlgPVEgAD1QOWA/kB3QGhAXUB6QHRAb4GAAP5
A5YD1Q8AAd4BrgF1AfoB1QGJAfEBtgFqAfEBtgFqAfEBtgFqAfkB0gGGAd4BrgF1Ae8B5gHaAwAB7wHm
AdoB3gGuAXUB3gGuAXUMAAFoAboBxwFgAc4B4AFhAdQB5QFzAdoB6gFrAcABzgGDAeEB7wFhAc0B3QFq
AcABzQFwAdkB6QFhAdQB5QFgAc4B4AFoAboBxxIAA9cDmQP6BgAD+gOZA9cYAAPXA5kD+gYAA/oDmQPX
EgAB8QHnAdsB4wGzAXgB/QHbAY8B9wHEAXgB/AHaAY4B4wGzAXgB8QHnAdsJAAHxAecB2wHoAc0BrAwA
AWkBvgHLAZMB6gH3AY4B4gHwAW8BxQHRAWkBvgHLAY8B6AH2AWwB2AHqAYQByAHSAW4BxAHRAYcB4AHu
AYoB5gH0AWkBvgHLFQAD2AOdBgADnQPYHgAD2AOdBgADnQPYGAAB8QHoAdwB5wG3AXsB/wHfAZMB5wG3
AXsB8QHoAdweAAHRAecB6gFrAcABzAGJAcsB1AHiAe4B8AFrAcABzAGZAe4B+wF7AeQB9QGJAcsB1AHi
Ae4B8AGJAcsB1AFrAcABzAHRAecB6nIAAfIB6AHcAekBuQF9AfIB6AHcJAAB+QH6AfsGAAFrAcIBzwGe
AewB9gGZAe0B+wFwAcQB0AYAAfkB+gH7qwAB5QHwAfIBbAHEAdEBbAHEAdEB0gHoAevSAAP8A/kh+AP5
A/wDAAP9A/kh+AP5A/05AAP/A/wD+RL4A/kD+wP+BgABlgGpAbwBXAGEAa4BXAGEAa4BXAGEAa4BXAGE
Aa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BlgGp
AbwDAALPAcsCuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGw
As8ByzkAA/4D+AHoAuUB2QG0AasB6gGOAXcB7gFwAVAB7gFwAVAB6gGOAXcB2QG0AasB6AHlAeQD9gP+
BgABbAGTAboBVQGIAbsBcAGjAdYBZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGa
Ac0BZwGaAc0BZwGaAc0BcAGjAdYBVQGIAbsBbAGTAboDAALBAbkC+QHpAvMB4gLzAeIC8wHiAvMB4gLz
AeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC+QHpAsEBuTwAAeoB3AHYAe4BggFnAfUBogGPAfoB0QHK
AfwB5wHlAfwB5gHlAfkB0QHJAfQBoQGOAe4BgQFmAeoB3AHYCQABfgGiAccBcQGkAdcBVQGIAbsBcQGk
AdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBVQGIAbsBcQGk
AdcBfgGiAccDAALLAcMC9AHkAXoBpwGbAYcBtwGnAYcBtQGjAYkBswGiAWgBoAGGAVcBlwF4AVgBkwF5
AWgBkAF+AZIBpAGTAYYBlwGAAqgBjgL0AeQCywHDCQAD/gP8BvkD+gb8A/sG+QP8A/4MAAHzAd8B2gHu
AXsBYAH3AdQBzgH3AukB9wLoAfwC9AH8AvQB9wLoAfcC6QH2AdEBygHuAXsBXwHzAd8B2gYAAYYBqgHN
AXMBpgHZAWoBnQHQAUgBewGuAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHF
AUgBewGuAWoBnQHQAXMBpgHZAYYBqgHNAwACzwHHAvUB5gGEAbUBqwGYAdcBxwGQAdEBvgFzAbABmQGX
AcsBtgGnAc4BvQGXAb0BrAGUAboBqAGpAb8BrwGOAa0BoQG3Aa0BiwL1AeYCzwHHCQAD/gP8A/kDswNc
BvwDXAO0A/kD/AP+CQAB+gH4AfcB5wF+AWIB8wHTAc0B8ALlAe8C5AHvAuQB5QFhAT8B5QFhAT8B7wLk
Ae8C5AHvAuQB7wHNAccB5wF+AWIB+gH4AfcDAAGLAa0BzwF1AagB2wFsAZ8B0gFKAX0BsAFsAZ8B0gFS
AYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFKAX0BsAFsAZ8B0gF1AagB2wGLAa0BzwMA
AtEByQL2AekBkAG8AbUBuQHlAdsBpgHdAdABiAHAAbIBhwHJAbUBfgG+AaQBiAG5AaMBrgHQAb8BqQHH
AbUBlAG6AagBtgG1AZEC9gHpAtEByQ8AA8sDdQP4BgAD+AN1A8sPAAHoAcUBvAHlAZ0BigHqAuIB5wLf
AecC3wHnAt8B1gFZATcB1gFZATcB5wLfAecC3wHnAt8B6ALgAeEBlwGEAegBxQG8AwABjwGxAdIBdwGq
Ad0BbgGhAdQBRwF6Aa0BbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBRwF6
Aa0BbgGhAdQBdwGqAd0BjwGxAdIDAALTAcwC9wHrAcUBuAGHAf8B3gGMAfgB5wGtAdUB0QGwAcoB6wHi
Ab0B5QHZAaABygG7AaoBzgGvAYIBwQGkAX4BtgKYAawBhAL3AesC0wHMDAADzgN/A/kB3QGzAbkBwAFJ
AVoBwAFJAVoB3QGzAbkD+QN/A84MAAHSAYQBbgHqAdAByAHhAtoB4ALZAeAC2QHgAtkB8QLtAfEC7QHg
AtkB4ALZAeAC2QHgAtkB4QHEAb0B0gGEAW4DAAGTAbQB1AF4AasB3gFvAaIB1QFEAXcBqgFvAaIB1QFM
AX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFEAXcBqgFvAaIB1QF4AasB3gGTAbQB1AMA
AtUBzQL4Ae4B0QGuAWkB2wG6AXEB3gG+AXQB6QHJAXwBvwHNAagBlQHMAcIBoQHPAb4BkQHEAa8BfwG9
AaYBdwG3AZ0BqAGqAXcC+AHuAtUBzQkAA9ADhgP5BgAB4AG2AbwB0QF7AYcGAAP5A4YD0AkAAbsBVAE1
AfQB7gHtAecC5QHaAtYB2ALUAdgC1AG3AUgBJgG3AUgBJgHjAt8B2ALUAdgC1AHYAtQB4QHYAdYBuwFU
ATUDAAGYAbgB1wF6Aa0B4AFxAaQB1wFBAXQBpwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFJ
AXwBrwFxAaQB1wFBAXQBpwFxAaQB1wF6Aa0B4AGYAbgB1wMAAtcBzwL5AfEB0wGsAWYB/wHTAX4B/wHW
AYIB4AG+AXQB9gHhAZkBsAHtAeQBrwHRAb8BogHgAdMBmAHYAcYBjgHQAboBuAGyAYAC+QHxAtcBzwYA
A+8DbAPvCQAB4wG4Ab8B1wGBAY0JAAPvA2wD7wYAAbEBUAExAfQB7wHtA+4D6gHcAtsB0wLRAccBpgGc
Aa4BRwElAcEBcwFaAd4C3AHSAtAB0gLQAd8B2AHXAbEBUAExAwABmwG6AdkBfAGvAeIBcwGmAdkBPwFy
AaUBcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBPwFyAaUBcwGmAdkBfAGv
AeIBmwG6AdkDAALZAdEC+wH0AdUBqQFiAf8BzgF5Af8B0gF9Ad8BugFvAf8B2AGDAeYB6gG9AaYB2AHN
AbMB7AHiAbkB5AHQAbYB3AHEAasBvgGXAvsB9ALZAdEJAAPUA5ED+QYAAeYBuwHBAd0BhwGTBgAD+QOR
A9QJAAHAAX0BZgHqAdUBzQnwA+sD4AHIAZwBjQGrAUYBJAG9AYoBeQPOAdIC0QHcAccCwAF9AWYDAAGd
Ab0B2wF+AbEB5AF1AagB2wE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFR
AYQBtwE4AWsBngF1AagB2wF+AbEB5AGdAb0B2wMAAtoB0wL8AfcB1wGnAV8B2gGsAWQB3AGwAWcB5wG8
AXAB4AG6AW8B4wG+AXMB3wHRAZgB2wHPAZYB1QHRAZwBxAHNAaQBnQHRAcMC/AH3AtoB0wwAA9UDlgP5
AegBvQHDAd0BZgF3Ad0BZgF3AegBvQHDA/kDlgPVDAAB3wHDAbkB1AGdAYoD9QbzAdoBqQGYAdoBqQGY
Ac8BjgF4AbMBTwEtAdMBoQGQA/MD9QHUAZwBiQHfAcMBuQMAAaABvgHcAX8BsgHlAWYBmQHMAXYBqQHc
AXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAWYBmQHMAX8BsgHl
AaABvgHcAwAC2wHUAv0B+QHZAaQBXAH/AcQBbwH/AcgBcwHeAbABZwH/Ac4BeQH/AdIBfQHkAb4BcgH/
AdgBgwHtAeQBqAHiAeYBtgHQAdcBrQL9AfkC2wHUDwAD1wOZA/oGAAP6A5kD1w8AAfkB+AH3AcsBewFg
AfIB3wHZA/gD9wHBAV0BOwHBAV0BOwHBAV0BOwHBAV0BOwHpAdAByAP4AfIB3wHZAcsBewFgAfkB+AH3
AwABowHAAd4BawGeAdEBdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGq
Ad0BdwGqAd0BdwGqAd0BdwGqAd0BawGeAdEBowHAAd4DAALdAdUC/gH8AdoBowFaAf8BvwFrAf8BwgFu
Ad4BrAFiAf8ByQF0Af8BzQF4AeMBuQFuAf8B0wF+Af8B1wGDAfwB3gGVAewBygF8Av4B/ALdAdUSAAPY
A50GAAOdA9gVAAHuAeAB2wHYAYQBaAH2AeMB3AP8DPsD/AH2AeMB3AHYAYQBaAHuAeAB2wYAAaYBwwHg
AaAB0wH6AZgBywH1AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHz
AZMBxgHzAZgBywH1AaAB0wH6AaYBwwHgAwAC3gHXAv8B/gHbAaEBWAHbAaIBWQHbAaQBWwHbAaUBXQHb
AakBYAHbAawBYwHbAa8BZgHbAbEBaAHbAbQBawHbAbcBbgHbAbkBcQL/Af4C3gHXPAAB8AHiAd0B5AGU
AXgB7wG3AaQB+gHkAd0B/gH5AfcB/gH5AfcB+gHkAd0B7wG3AaQB5AGUAXgB8AHiAd0JAAHoAe0B8wGo
AcQB4QGXAcoB9QGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGS
AcUB8wGXAcoB9QGoAcQB4QHoAe0B8wMAAt8B2Sf/At8B2T8AAfoC+AHvAdIByAHsAagBkgHsAY4BbgHs
AY4BbgHsAagBkgHvAdIByAH6AvgPAAHoAe0B8wGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGp
AcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gHoAe0B8wYAAuoB5gLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC6gHmwwAD+wPxAZUBrwG8AWgBmwG2
AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AZUBrwG8
A/ED+xUAEvgD+QP9MwAD/AP5JPgD+QP8A/0D+gF3AagBwQGGAc8B8AGBAcsB7QGBAcsB7QGBAcsB7QGB
AcsB7QGBAcsB7QGBAcsB7QGGAc8B8AFLAY8BsQGGAc8B8AF3AagBwQHcAeIB5Qb9A/kM+APzAYkBpQGP
AVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAZQBrQGZBgADwAMsA8ADAAP7G/gD+wP3
AZMBpgG6AWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGv
AWABiAGvAWABiAGvAWABiAGvAZMBpgG6A/cGAAGGAbUBzQGEAc4B7gF8AccB6AF8AccB6AF8AccB6AF8
AccB6AF8AccB6AF8AccB6AGEAc4B7gFXAZsBvQGEAc4B7gH0AbYBLgGGAbUBzQMAApQBuAJVAaMCVQGj
AlUBowJVAaMCVQGjAlUBowFVAXoBiQE1Ab0BeQFDAcsBhwE+AcYBggE+AcYBggE+AcYBggFDAcsBhwFV
AaABcAYAA0ABZwJWA0ADAAP7A2EDXgNcA1kDVANJAzwDLwNsA/sDAAFyAZgBvwF7Aa4B4AF6Aa0B3wF6
Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF7Aa4B4AFy
AZgBvwkAAZEBvgHUAYcB0AHvAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAYcB0AHv
AV8BowHFAYcB0AHvAf4ByQFBAZEBvgHUAwACVQG0AS8BHgHcASUBEwHYASUBEwHYASUBEwHYASUBEwHY
ASUBEwHYAVUBfgGVATcBvwF7AUIBygGGATcBvwF7ATcBvwF7ATcBvwF7AUIBygGGAVUBpwF2BgADywNV
A8snAAGEAacBywGBAbQB5AF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9
AbAB4QF9AbAB4QF9AbAB4QGBAbQB5AGEAacBywkAAZQBwAHWAYoB0wHwAYIBzQHrAYIBzQHrAYIBzQHr
AYIBzQHrAYIBzQHrAYIBzQHrAYoB0wHwAWIBpgHIAYoB0wHwAukB2wGUAcAB1gMAAlUBuQEtARwB3gEV
AQAB1QEVAQAB1QEVAQAB1QEVAQAB1QEVAQAB1QFVAYEBmgE7AcMBfwFIAc8BjAE7AcMBfwE7AcMBfwE7
AcMBfwFIAc8BjAFVAa0BezYAAYoBrQHPAYgBuwHqAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHl
AYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYgBuwHqAYoBrQHPCQABmAHDAdgBjgHWAfIBhwHQ
Ae0BhwHQAe0BhwHQAe0BhwHQAe0BhwHQAe0BhwHQAe0BjgHWAfIBZgGqAcwBjgHWAfIC8AHmAZgBwwHY
AwACVQG/ATYBJQHkARkBAAHbARkBAAHbARkBAAHbARkBAAHbARkBAAHbAVUBhAGgAT4BxgGCAU0B1QGR
AT4BxgGCAT4BxgGCAT4BxgGCAU0B1QGRAVUBswGANgABjgGwAdEBjwHCAe4BhwG6AekBhwG6AekBhwG6
AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBjwHCAe4BjgGwAdEJAAGb
AcYB2gGSAdoB9AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGSAdoB9AFpAa0BzwGS
AdoB9AL4AfMBmwHGAdoDAAJVAcQBPgEtAewBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBVQGG
AaQBQgHKAYYBUQHZAZUBQgHKAYYBQgHKAYYBQgHKAYYBUQHZAZUBVQG5AYQGAAPQA2cD0CcAAZMBtAHU
AZYByQHyAYwBvwHsAYwBvwHsAYwBvwHsAUQBdwGqAYwBvwHsAUQBdwGqAYwBvwHsAYwBvwHsAYwBvwHs
AYwBvwHsAZYByQHyAZMBtAHUCQABnwHIAd0BlwHeAfYBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHY
AfIBkAHYAfIBlwHeAfYBeQG9AdwBeAG9AdwC/gH9AZ8ByAHdAwACVQHIAUYBNQHyASABAAHpASABAAHp
ASABAAHpASABAAHpASABAAHpAVUBiQGoAUQBzAGIAWUB7QGpAWUB7QGpAWUB7QGpAWUB7QGpAVgB1gGW
AX8BywGkBgADbAFvAmkDbAYAA3UDdANxA24DbANoA2UDYwNgBgABmAG4AdcBmwHOAfYBkQHEAfABkQHE
AfABkQHEAfABVQGIAbsBRAF3AaoBVQGIAbsBQAFzAaYBkQHEAfABkQHEAfABkQHEAfABmwHOAfYBmAG4
AdcJAAGiAcoB3gGbAeEB9wGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGe
AeQB+QF8AcAB3gGiAcoB3gHuAfMB9QMAAn8B1QFiAWEB5wF2AXUB/gF2AXUB/gF5AWIBowF7AVABVQF7
AVABVQFqAVkBPwFqAW4BMgFqAW4BMgFhAYsBUQFVAcEBigFVAcEBigFVAcEBigHiAe8B6AYAA9MDcQPT
JwABmwG6AdkBnwHSAfkBlQHIAfMBlQHIAfMBlQHIAfMBVQGIAbsBVQGIAbsBVQGIAbsBTQGAAbMBlQHI
AfMBlQHIAfMBlQHIAfMBnwHSAfkBmwG6AdkJAAGlAc0B4AGeAeUB+QGYAd8B9gGYAd8B9gGYAd8B9gGY
Ad8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGhAegB+gGlAc0B4AYAAuIB8QJVAc4CVQHOAlUBzgFt
AVMBdQHcAakBMgHXAaQBLQHXAaQBLQHXAaQBLQHcAakBMgGwAYYBSEIAAZ8BvQHbAakB2wH+AaoB3QH/
AaoB3QH/AaoB3QH/AXcBqgHdAXcBqgHdAXcBqgHdAWYBmQHMAaoB3QH/AaoB3QH/AaoB3QH/AakB2wH+
AZ8BvQHbCQABqAHOAeIBowHoAfsBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHj
AfkBnQHjAfkBowHoAfsBqAHOAeISAAG2AYsBRQHcAakBMgHRAZ4BJwHRAZ4BJwHRAZ4BJwHcAakBMgG2
AYsBRUIAAccB1wHnAYgBtgHiAYABswHmAYABswHmAYABswHmAU4BgQG0AU4BgQG0AU4BgQG0AUgBewGu
AYABswHmAYABswHmAYABswHmAYgBtgHiAccB1wHnCQABqwHQAeMBpgHrAfwBoQHmAfsBoQHmAfsBoQHm
AfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBpgHrAfwBqwHQAeMSAAG7AZABQQHhAa4BOAHW
AaMBLAHWAaMBLAHWAaMBLAHhAa4BOAG7AZABQRIAA9cDfQPXJwAB4wHqAfEBjgG4AeEBiQG8Ae8BiAG7
Ae4BiAG7Ae4BQQF0AacBQQF0AacBQQF0AacBPgFxAaQBiAG7Ae4BiAG7Ae4BiQG8Ae8BjgG4AeEB4wHq
AfEJAAGuAdIB5AGpAe4B/QGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGk
AekB/AGpAe4B/QGuAdIB5BIAAcABlQE/AecBtAE9AdoBpwEwAdoBpwEwAdoBpwEwAecBtAE9AcABlQE/
EgADfwN3A38GAAOCA4EDfwN+A3wDegN5A3YDqwYAAfUB9wH5AZsBvgHfAYkBvAHvAYgBuwHuAYgBuwHu
ATUBaAGbATUBaAGbATUBaAGbATUBaAGbAYgBuwHuAYgBuwHuAYkBvAHvAZsBvgHfAfUB9wH5CQABsAHU
AeYBrAHxAf8BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BrAHx
Af8BsAHUAeYSAAHGAZoBPQHrAbgBQQHdAaoBMwHdAaoBMwHdAaoBMwHrAbgBQQHGAZoBPRIAA9gDggPY
JwAD/gHLAdoB6gGpAcUB4gGpAcUB4gGpAcUB4gFVAX0BpgFVAX0BpgFVAX0BpgFVAX0BpgGpAcUB4gGp
AcUB4gGpAcUB4gHLAdoB6gP+CQABsgHVAeYBsQH1Af8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHy
Af8BrgHyAf8BrgHyAf8BrgHyAf8BsQH1Af8BsgHVAeYSAAHUAbMBbAHnAbgBRgH+AcsBVAH+AcsBVAH+
AcsBVAHnAbgBRgHUAbMBbHUAAdAB5AHuAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHn
AbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAdAB5AHuEgAB8AHrAd4BzQGgATkBzQGgATkBzQGgATkBzQGg
ATkBzQGgATkB8AHrAd4PAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALI
AcMD8QP7YAAD/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+
Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9ZgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBbAACzwHH
A/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8
AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAAP+A/wG+QP6BvwD+wb5A/wD/gYAA/0D/AP6HvgD+gP8
A/0GAALQAcgC/wH+Av0B/AL9AfsBvwFIAa4B7AHOAeUC+gH2AvgB9AL3AfIC9gHwAvoB8wLQAcgMAALQ
AcgC/wH+Av0B/AHpAc8B6wGuAUgBvwGuAUgBvwGuAUgBvwHTAaEB2gL3AfIC9gHwAvoB8wLQAcgMAAP+
A/wD+QOzA1wG/ANcA7QD+QP8A/4GAAP9A4QDNAOEA/gD4gY0A4QD4gN1A6QD+AOEAzQD6QYAAtIBywL+
A/0B+wL8AfkBxgFPAbUB7AHPAeUC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsB6gHR
Ae0BtQFPAcYC+gH2AecBzgHoAbUBTwHGAe4B4QHrAvUB7gL6AfIC0gHLEgADywN1A/gGAAP4A3UDyxIA
A3kD9QYAA6oDeQYAA8sDvgPuA6oDwgkAAtUBzQL+A/wB+QL7AfgBzgFXAb0BzgFXAb0BzgFXAb0B4gGm
AdYC9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5AesB0gHtAb0BVwHOAvgB9AL3AfIBvQFXAc4B5wHN
AeUC9AHsAvkB7wLVAc0PAAPOA38D+QwAA/kDfwPODwADxgxgA8YGAAP1CWAD6QkAAtYBzgL9A/sB+AL6
AfYB1gFfAcUB7wHRAeYC9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgB7AHTAe4BxQFf
AdYC9wHyAeoB0QHqAcUBXwHWAe0B4QHpAvEB5wL3AeoC1gHODAAD0AOGA/kSAAP5A4YD0AwAA/UDlAPv
A9EDaAP1CQADkwPvA2gMAALYAdAC/QP6AfYC+AH0AdwBZQHLAdwBZQHLAdwBZQHLAeIBiQHTAvEB5wLs
Ad8C9AHlAtgB0AwAAtgB0AL9A/oB9gHtAdMB7gHLAWUB3AHLAWUB3AHLAWUB3AHfAawB4wLxAecC7AHf
AvQB5QLYAdAJAAPvA2wD7xgAA+8DbAPvDAADjwP2A7cDjwwAA8wDfQPMDAAC2gHSAvwD+AH0AvcB8gL2
AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx
AecC7AHfAugB2QLzAeIC2gHSDAAD1AORA/kSAAP5A5ED1A8AA84D1QN3A84MAAPsA3cD7AwAAtsB0wL8
A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0w8AA9UDlgP5DAAD+QOWA9USAAP2A6IDfgP2IQAC3AHV
AvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVEgAD1wOZA/oGAAP6A5kD1xgABpwkAALdAdYC+gH0
AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALx
AecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHAFQAD2AOdBgADnQPYRQAC3gHXAvoB8wL0AewC8QHn
AuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHV
AuUB1AK2AaUD/wLeAdcC9wH2bAAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZ
AvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfZvAALqAeYC4AHZ
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QL3AfZsAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALI
AcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7
A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7A/0D+gLA
AbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6
AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLA
AbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9BgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7
AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHB
DAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7
AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3
AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALP
AccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7
AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAtAByAL/Af4C/QH8AdwBzwHrAXsBSAG/AXsBSAG/
AXsBSAG/AYsBXgHGAegB4QHrAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7AYIBwgG0AVkBrgGd
AVkBrgGdAakB0wHIAvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wHeAaIBqQG/AUgBWQG/
AUgBWQHcAaABpgL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBvwF7AUgBvwF7AUgBvwF7
AUgB3AG6AZ4C9wHyAvYB8AL6AfMC0AHIDAAC0gHLAv4D/QH7Ad0B0QHtAYIBTwHGAvoB9gL4AfQBggFP
AcYB2QHMAeUC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AvsB+AL6AfYB0gHoAeABYAG1AaQC9gHw
AvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7AvwB+QL7AfgB4AGlAasB0wF6AYUC9wHyAvYB8AL1Ae4C+gHy
AtIBywwAAtIBywL+A/0B+wL8AfkBxgGCAU8B7AHbAcwC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALV
Ac0C/gP8AfkB3wHSAe0BigFXAc4BmAFsAdMBigFXAc4BpQF/AdcB5wHhAekC9AHsAvkB7wLVAc0MAALV
Ac0C/gP8AfkC+wH4AbIB3AHSAWgBvQGsAWgBvQGsAa4B2QHNAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+
A/wB+QL7AfgC+gH2AeMBqAGuAdkBfwGLAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4
Ac4BigFXAe4B3QHMAvcB8gL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1gHOAv0D+wH4AeAB0wHuAZIBXwHW
AvcB8gHdAdAB6QGSAV8B1gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AXABxQG0AdUB6wHi
AvYB8AL1Ae4C9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gL4AfQB5wGrAbEB3gGFAZAC9QHu
AvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYB1gGSAV8B7wHeAc0C9gHwAvUB7gL0AewC8QHn
AvcB6gLWAc4MAALYAdAC/QP6AfYB4AHTAe4BmAFlAdwBmAFlAdwBmAFlAdwBxQGsAeMC8QHnAuwB3wL0
AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AG3AeEB1QF2AcsBugF2AcsBugGVAdUBxgLxAecC7AHfAvQB5QLY
AdAMAALYAdAC/QP6AfYC+AH0AeoBrwG0AdwBZQF2AdwBZQF2AegBrAGxAvEB5wLsAd8C9AHlAtgB0AwA
AtgB0AL9A/oB9gL4AfQB3AGYAWUB7wHeAc0C9QHuAvQB7ALxAecC7AHfAvQB5QLYAdAMAALaAdIC/AP4
AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
Ad8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLa
AdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALbAdMC/AP3
AdIMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3
AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLo
AdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLb
AdMMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2
AdkC5gHVAvIB4QLbAdMMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLc
AdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2
AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALx
AecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLm
AdUC5QHUAvIB4QLcAdUMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGT
AskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHW
AvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ
AecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHV
AqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKk
AZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALd
AdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt4B1wL6AfMC9AHs
AvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGl
A/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwA
At4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt8B2QL8AfUC+QHv
AvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLy
AeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZ
AvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALqAeYC4AHZ
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALq
AeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYMAAFCAU0BPgcAAT4DAAEoAwABQAMA
AWADAAEBAQABAQYAAQMWAAP/gQAI/wGAAQEB4AEDBP8BgAEBAeABAwQAAfABAwHsATcEAAH4AQMBwAED
AYABAQGAAQEB/AEDAcABAwQAAfgBAwHAAQMEAAHwAQMBwAEDBAAB4AEDAfABDwQAAcABAwHAAQMEAAHA
ASMBwAEDBAABwAFzAcABAwQAAeAB/wHAAQMBgAEBAYABAQHxAf8B7AE3AcABAwHAAQMC/wH8AT8M/wEA
AQEBAAEBAv8BwAEDAQABAQEAAQEC/wHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAcABAwHAAQMBAAEB
AQABAQHAAQMBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHGAWMBgAEB
AQABAQEAAQEBjgFxAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEBAQABAQHgAQcBgAEBAQABAQEAAQEB8QGP
AYABAQEAAQEBAAEBAfkBnwHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAv8B8AEPAYABAwEAAQEI/wIA
Af4BAQL/BQABAQGIAwABwAEBAQABAQGIAQABgAEBAcABAQEAAQEBjwH/AYABAQHAAQEBAAEBAv8BgAEB
AcABAQEAAQEC/wGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEAAQEBjAEBAYABAQHAAQEBAAEBAY8B/wGA
AQEBwAEDAQABHwL/AYABAQHAAQMB8AEfAv8BgAEBAcABAwHwAR8BjwH/AYABAQHAAQMB8AEfAYwBAQGA
AQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8E/wHAAQMB8AEfBAAE/wQABP8BwAEDAcABAwT/AcABAwHA
AQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAfEBjwHMAcEBwAEDAcABAwHjAccBwAHBAcABAwHA
AQMBxwHjAcAB4wHAAQMBwAEDAY8B8QHhAeMBwAEDAcABAwHHAeMB4QHjAcABAwHAAQMB4wHHAeEB/wHA
AQMBwAEDAfEBjwHzAf8BwAEDAcABAwH5AZ8C/wHAAQMBwAEDBP8BwAEHAcABBwT/AcABDwHAAQ8E/xAA
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABBwHAAQcBwAEHAcABBwHAAQ8BwAEPAcABDwHAAQ8L
At8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2
AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHh
AvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3
AfYPAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYMAAFCAU0BPgcA
AT4DAAEoAwABQAMAAWADAAEBAQABAQYAAQMWAAP/AQAE/wQABP8UAAGAAQEBgAEBPAABgAEBAYABAQQA
AcABAwHAAQMEAAT/BAAE/wQADP8BgAEBAeABAwT/AYABAQHgAQMBwAEDAcABAwHwAQMB7AE3AcABAwHA
AQMB+AEDAcABAwHxAY8B8QGPAfwBAwHAAQMB4AEHAeABBwH4AQMBwAEDAccBIwHEAeMB8AEDAcABAwGM
ATEBjAHxAeABAwHwAQ8BxAHjAcQB4wHAAQMBwAEDAeABBwHgAccBwAEjAcABAwHxAY8B8QGPAcABcwHA
AQMB+QGfAfkBnwHgAf8BwAEDBP8B8QH/AewBNwb/AfwBPwj/AQABAQEAAQEC/wHAAQMBAAEBAQABAQL/
AcABAwEAAQEBAAEBAv8B4AEHAQABAQEAAQEBwAEDAcABAwEAAQEBAAEBAcABAwGAAQEBAAEBAQABAQHx
AY8BgAEBAQABAQEAAQEB4AEHAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEBAQABAQGOAXEBgAEBAQABAQEA
AQEBxgFjAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHxAY8BgAEBAQABAQEAAQEB+QGfAcABAwEA
AQEBAAEBAv8B4AEHAQABAQEAAQEC/wHwAQ8BgAEDAQABAQj/AgAB/gEBAv8FAAEBAYgDAAHAAQEBAAEB
AYgBAAGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEAAQEC/wGAAQEBwAEBAQABAQL/AYABAQHAAQEBAAEB
AY8B/wGAAQEBwAEBAQABAQGMAQEBgAEBAcABAQEAAQEBjwH/AYABAQHAAQMBAAEfAv8BgAEBAcABAwHw
AR8C/wGAAQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8BjAEBAYABAQHAAQMB8AEfAY8B/wGAAQEBwAED
AfABHwT/AcABAwHwAR8EAAT/BAAE/wHAAQMBwAEDBP8BwAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIA
AcABAwHAAQMB8QGPAcwBwQHAAQMBwAEDAeMBxwHAAcEBwAEDAcABAwHHAeMBwAHjAcABAwHAAQMBjwHx
AeEB4wHAAQMBwAEDAccB4wHhAeMBwAEDAcABAwHjAccB4QH/AcABAwHAAQMB8QGPAfMB/wHAAQMBwAED
AfkBnwL/AcABAwHAAQME/wHAAQcBwAEHBP8BwAEPAcABDwT/EAABwAEDAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEHAcABBwHA
AQcBwAEHAcABDwHAAQ8BwAEPAcABDws=
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -446,48 +453,48 @@
<data name="_tbFindGroupAnd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJOSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbW9CZl66ab
WnrRlmu9jLbUrTVrsVW4wF4ssOYs0F6Ul8awqWkJwiCgcAfDWGhIRlmRogcBDyCCmmDUTRedh05b/0H9
ts/Od8/zfDY2iP/nlTU4OLvF5B7mW1V2mTyBb6Vk4hD4O2M3HFb7/Zhga+Wt4er+EVoVTn0fTKV/+PqG
lt2nW+g0wI0MHTbYwvkjcw5InbX+SNoQWcw6Q8ksOfJx2cNvpDIK40IE4EaGDhts4eR+SelF697HrlkV
Uzqo+Yx9NpkdEsg/hS7IphK9jq9fAG5k6LDBFg5cgnvezJ+MZmyfWYIL2eHSw/b0nZ745H1jyt38JOm4
rgm95fEtKzZfvKP3dbjZ6KFbRwOLPXAJrsBURyW+uT6EV0xgis6QO8oHfrbpU65rnXELkOtTr5BZx2MP
lSR1QzVISV68m9fAJbaf0deMB5fMYzNLBvv7hNbkjam5B41pUXvI26CNWQFuZPpRWnHveUAKDB5aCZfY
duppxQObX2P20lq5JXBTTQZlVUL39BGxb+5qZ9QOcCNDJ3sWaFLYZ25L+n134RLF1d2FJQJdfbeT6miz
BlqaBvzSVgOl450cWxW1RycAbmTosMF21zmdEG7uryysuMLdWdcnEnd52h85g2rDm7kukWL6Ja82tApw
I0OHDbZwcjLz1jJsXFdUUp63/1JN/lFlfcFxTWPBMbWwaJ/kLMCNDB022MJhXWINw3o2KGbYwrCJIY9h
A0s+w2YGdNhgCwfuP30E8QtHOZOg6MLdcgAAAABJRU5ErkJggg==
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJPSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbW9KKMrZtu
aulFW671MtpSt9asxVbpAnuxwJqzQHtBXhrDpqYlCIOAwh0MY6EhGWVFih4EPIAIaoJRN110Hjpt/Qf1
2z473z3P89nYIP6fV9bg4OwSkXuYb2XZZfIEvhXi8UPg74zdcFjt92OCzRW3hqr6hmlVOPV9IJX+4esd
XHKfbqHTADcydNhgC+ePzDkgcdb4I2lDZCHrDCWz5PDHJQ+/kcoojPMRgBsZOmywhZP7JaUXrXsfu2ZU
TOmg5jL2mWR2UCD7FLognUz0OL5+AbiRocMGWzhwCe55M38imrF9ZgnOZ4dKD9vTd7rjE/eNKXfzk6Tj
uib0lse3LNt88fae1+Fmo4duHQksdMMluAJTLZX45voQXjaBSTpDbtvZ/7NNn3Jd64hbgEyfeoXMOhZ7
qCSpG6oBSvzi3ZwGLrH1jL56LLhoHp1eNNjfJ7Qmb0zNPWhMC+Uhb4M2ZgW4kelHaMW95wEJMHhoJVxi
y6mn5Q9sfo3ZS2tllsBNNRmUVta5p46IfLNXO6J2gBsZOumzQJPCPn1b3Oe7C5coruoqLBHo6rucVHub
NdDS1O+XtBooHe/k6IpQHh0HuJGhwwbbHed0dXBzf2Vh+RXu9tpeoajTI3/kDKoNb2Y7hYqpl7ya0ArA
jQwdNtjCycnMW82wfk1Rye68/Zeq848q6wuOaxoLjqnrivaJzwLcyNBhgy0c1iVWMaxlg2KGTQwbGPIY
1rHkM2xkQIcNtnDg/tNHEL8AOkOTmpr+SJIAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbFindGroupOr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI+SURBVDhPzZHvaxJxHMePetaDKGjBehgRwoLoUbCI6AcS
jVhp0Vq/GO1B4CBi6UgZK6dWzo0e1BimzsxdqISkbtecbXNpsViclnO2svPEu3OeQ9tDH3VvM6K/oL7w
4t68P+/XoyP+n3fNKMq6DaLj+qDInB3gavh2G8ou8HcnOrBtaL/ehTuMolPLClprSXgaKH/zvfmRv+8S
6Uv6XBIgo8MNG2zh1GV5z5Ls9E1aMJOlLBneyLgjlbRzurLcZc767aFqCiCjww0bbOHAJVo75x0qQ0Zw
z1TSz8PVFBmprPRZ2VmDm4+jA8jocMMGHRy4REtbgBkm+VXn6+on4I5sfOkwrARtr8r0o5dizEiWZiye
4sI5/XJgyLM2q3cVp0zuUnhwnE3AJZrlvtp4aP2rbbJMAxdVSZ/SJvzDXjGqs/MBMOQV59FZPH+6B6QQ
g0vsPu5jTE42M+pf/2jxirGHpBhV3v08aSSL0T4bFwTI9W5ibe531/uYWYRL7D055bisS/LmF6W3aisX
6ncI0zdGViO3nmTntPYCBZDR4aYZ44LozqsTObjEPkVcdkC5WOyxsLTGWqB6x/JBvZNfaO9PUvecfBwg
o8NNYytQ2O5vjwlw67+y5cQzxaErmeJFHcveHi18ME1w71Uj35eOqVIZgIxOLd2wwRZOXZbeZokdTXuU
8oPKd74jXSx79AxXO3w1n2vtoL0AGR1u2GALp+ESmyS2NIpdEs0STRLbJLY22C6xUwI3bLCFA/efPoL4
CcCwqZ4FAx1nAAAAAElFTkSuQmCC
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI9SURBVDhPzZHda1JxHMYPdddFFLRgXUaEsCC6ChYRvSDR
WAMtWuuN0S4CBxFLR8qonFo5N7qoMUydmTuhEpK62Zxtc2mxWBxdztnK9IjnZR7HsV161XnMiP6C+sGH
8/B8n8/VIf6fd80oyHoMguP6oJA/e5ep4dtjqLjA353gwLah/XoX7uQVXVqa01rL3LNA5Zvv7Y/iA5dA
XdIXUgAZHW7YYAunLst7l2TtNynOTJZzZGQz646KGee0uNJtzvntoWoaIKPDDRts4cAlWrvmHSpDlnPP
iJkXkWqajIqr/VZ61uBmE+gAMjrcsEEHBy7R0hbID5PsmvNNdRm4o5tfOg2rQdvrCvX4lRA3kuUZi4df
OKdfCQx51mf1Ln7K5C5HBsfpJFyiWe6rjYc2vtomKxRwhcXMGW3SP+wVYjo7GwBDXmEencXzp3tIcnG4
xN6TvrzJSWdH/RufLF4h/ogUYsp7nyeNJB/rtzFBgFzvJtbnfnd9T/KLcIn9p6ccl3Up1vyy/E5tZUID
Dm76xsha9NbT3JzWXgoDZHS4acaYILrz6mQBLnFAkZAdUi7yvRaa0lhL4b6xYlDvZBc6BlLh+042AZDR
4aaxlcLYHuyIc3Drv7Ll1HPFkStZ/qKOpm+Plj6aJpgPqpHvSydU6SxARqeWbthgC6cuS2+rxK6mfUr5
YeV737Fumj7eztSOXi0WWjspL0BGhxs22MJpuMQWiW2NYo9Es0STxA6J7Q12SuyWwA0bbOHA/aePIH4C
pr6pkmHLOpUAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbFindAny.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIGSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK
ZNg2j3Hf+9f931/ebv2zbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/jy6m/UWIMS8HiYPU
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK
ZNg2j3Hf+9f935/daPqzbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/988l/0WIMS8HiYPU
QrUhwIaZjPu/v5r8//3D9u8HN+ieB/G/vej///JE9I91MxlXH1yjc/7t+YbvX551/QfJQbUhwOrJTAfu
nwj/8fRK4v9Xt4r/71+lceH9w+b/t08GftoHZL+8WfAfJAdSA1IL1YYAyycyWC3vZ1y5Z4XyzZPbLF48
upT6H4TvnA7+//Bi8n+QGEgOpAakFqoNEyzsYnZZ0M106PAmqw/Xjnr8B2EQGyQGkoMqwwSzWxms57Qx
rt6x0ujmyc32L68cdvkPwjdO+IPpY5utX+5YonUTpAakFqoNAabWMx25CwywWye9/18/5vJ/6SThyye3
mH6+dy4MzAaJ3Tjh8f/EUZ8fILVQbQjQV8F09M5pl/8nDpn9WNQtdKW/knHDicNmP+6fD/wPkgOJgeRA
akB8qDYEaC9gSGnJYTzRksu4Hsj2BtFn99v/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8dilg/Z/7+63
/1mZxHgKKoyiBhvgBWJFIFb3s2eoqMvkuADC9iYMiSAxIFYGYgEgZgRirIADiMWAGGQLNiwOxFxAjNMA
EgEDAwA7NBxCd851BwAAAABJRU5ErkJggg==
akB8qDYEaC9gSGnJYTzRksu4Hsj2BtGn9tv/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8dh5oAF399v/
rExiPAUVRlGDDfACsSIQq/vZM1TUZXJcAGF7E4ZEkBgQKwOxABAzAjFWwAHEYkAMsgUbFgdiLiDGaQCJ
gIEBAPfdHChaYCrPAAAAAElFTkSuQmCC
</value>
</data>
<data name="_tbFindByte.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -716,6 +723,16 @@
1OygebHD1uVKsedMdz6DUVQRmKFmxRrTr51sLzid1RIeYaYq9kkBixWrWKHrHW2ncggfIJFZEmAxR3XF
GlMv7WxQ2oYPuJoJxL7SQGCB6nrFtfWLmyvFnjPdNRj8RBvBJWpe7J28ztpio4lBcYifOIb2UAJKaj+C
cuqZfSF8gP+Qhh4HUjr7eOAnMeYGV3014C2A0QAAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbReplaceLongArray.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADxSURBVDhPYxi+IIyRkXEalM0AZYdBeIRBBFDDTCAtBuGC
gRhULALCxQ2igArnAGnx1Om33s/c+XQ/RBgMxKFyURAuJogBKlgApMVBnPgJV/5N3fEQ2QAQABkCUhMD
4SKAAVBiD4iGcBkYwjvO/Ju06e4+KBcZYKiFgUSgxEogLQni+Dcc+de7/uZeEBsJSELVJEK4mCAZqGAd
kJb0qN77D4wr9/4umnluHkgMKpcMUogPpAMVbgPS0hAuGEhDxdIhXOyABYh5gRgUiI1AfByI+YCYH8pu
AGIJKB+kFgMgGwAKBxEghhkgDBXDa8CQBAwMAFHnNaGM/318AAAAAElFTkSuQmCC
</value>
</data>
<data name="_tbReplaceString.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -739,13 +756,13 @@
<data name="_tbReplaceCompound.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFzSURBVDhPrdE/SAJhHMbx33FCY2PQ0NLUHK1SIFRE0VAR
Ev2DQoiGKBCSUBvKKIhAoxByyE5QEkEF0cIIAwtpaGsQDSroDxYFQUO8+ch7L3fbSR18OXjf53PL0b88
WSeZstMm29mUvKnmNFNBm/YOWxjOiU7HG1qvHG1HbycbrJLx1PLbOnSp59hgC8M5UXpS7r719uW0Hwgt
dYmCC2bdB7CF4ZwoNWGaLylz5ce4i6kl3AOiqKNHnCNsYTgnSo7Jvpd86IcVw0ytGLaLCvuz4hxhC8M5
Udwq733fBNhn3ifKeIZFcVe/7g5bGM6JYlbZ/3XtZ++5HRFg2G6pvZXFTt0dtjCcE0VG5cDH5S57zW6J
gLVvbdjCcE4UGpEPK+fb7Cm9bihsYTgnCg5JynP1Fz0kVw2FLQznRIFBKXKfcLO72IqhsIXhnMjbK6XK
UQcrHS8bClsYzqllpl06WLNIF/UEA4sPNFZrqtZcZzCwf3mIfgHu4t1w+i+rTAAAAABJRU5ErkJggg==
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFySURBVDhPrdE/SAJhHMbx33FCY2PQ0NLUHK1SIFRE0VAR
Ev2DQoiGKBCSUBvKKIhAoxByyE5QEkEF0cIIhQppaGsQDSoqwqIgaIg3H3nv5W47qYMvB+/7fG45+pcn
6yRTdtpkO5uSN9WcZipo095hC8M50el4Q+uVo+3o7WSDVTKeWn5bhy71HBtsYTgnSk/K3bfevpz2A6Gl
LlFwwaz7ALYwnBOlJkzzJWWu/Bh3MbWEe0AUdfSIc4QtDOdEyTHZ95QP/bBimKkVw3ZRYX9WnCNsYTgn
ilvlve+bAPu88IkynmFR3NWvu8MWhnOimFX2f1372XtuRwQYtltqb2WxU3eHLQznRJFROfBxuctes1si
YO1bG7YwnBOFRuTDyvk2e06vGwpbGM6JgkOS8lL9RQ/JVUNhC8M5UWBQitwn3OwutmIobGE4J/L2Sqly
1MFKx8uGwhaGc2qZaZcO1ixSvp5gYPGBxmpN1ZrrDAb2Lw/RL87Y3WT+gOBKAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="_explorerStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View file

@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using NBTModel.Interop;
namespace NBTExplorer.Windows
{

View file

@ -31,42 +31,54 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpen = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpenFolder = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpenMinecraftSaveFolder = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemOpenInExplorer = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemSave = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRefresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemRecentFiles = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRecentFolders = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemExit = new System.Windows.Forms.ToolStripMenuItem();
this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCut = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCopy = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemPaste = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemRename = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemEditValue = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemDelete = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemMoveUp = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveDown = new System.Windows.Forms.ToolStripMenuItem();
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFind = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFindNext = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.findBlockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemAbout = new System.Windows.Forms.ToolStripMenuItem();
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this.BottomToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.TopToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.RightToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.LeftToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.ContentPanel = new System.Windows.Forms.ToolStripContentPanel();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._buttonOpen = new System.Windows.Forms.ToolStripButton();
this._buttonOpenFolder = new System.Windows.Forms.ToolStripButton();
this._buttonSave = new System.Windows.Forms.ToolStripButton();
this._buttonRefresh = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this._buttonCut = new System.Windows.Forms.ToolStripButton();
this._buttonCopy = new System.Windows.Forms.ToolStripButton();
this._buttonPaste = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this._buttonRename = new System.Windows.Forms.ToolStripButton();
this._buttonEdit = new System.Windows.Forms.ToolStripButton();
this._buttonDelete = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this._buttonAddTagByte = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagShort = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagInt = new System.Windows.Forms.ToolStripButton();
@ -78,26 +90,17 @@
this._buttonAddTagString = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagList = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagCompound = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this._buttonFindNext = new System.Windows.Forms.ToolStripButton();
this._menuItemOpen = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpenFolder = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemSave = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRefresh = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemExit = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCut = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCopy = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemPaste = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRename = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemEditValue = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemDelete = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveUp = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveDown = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFind = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFindNext = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.findBlockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.BottomToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.TopToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.RightToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.LeftToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.ContentPanel = new System.Windows.Forms.ToolStripContentPanel();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._nodeTree = new NBTExplorer.Vendor.MultiSelectTreeView.MultiSelectTreeView();
this._buttonAddTagLongArray = new System.Windows.Forms.ToolStripButton();
this.menuStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.contextMenuStrip1.SuspendLayout();
@ -122,6 +125,8 @@
this._menuItemOpen,
this._menuItemOpenFolder,
this._menuItemOpenMinecraftSaveFolder,
this.toolStripSeparator12,
this._menuItemOpenInExplorer,
this.toolStripSeparator3,
this._menuItemSave,
this._menuItemRefresh,
@ -134,38 +139,94 @@
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "&File";
//
// _menuItemOpen
//
this._menuItemOpen.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpen.Image")));
this._menuItemOpen.Name = "_menuItemOpen";
this._menuItemOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this._menuItemOpen.Size = new System.Drawing.Size(233, 22);
this._menuItemOpen.Text = "&Open...";
//
// _menuItemOpenFolder
//
this._menuItemOpenFolder.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpenFolder.Image")));
this._menuItemOpenFolder.Name = "_menuItemOpenFolder";
this._menuItemOpenFolder.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.O)));
this._menuItemOpenFolder.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenFolder.Text = "Open &Folder...";
//
// _menuItemOpenMinecraftSaveFolder
//
this._menuItemOpenMinecraftSaveFolder.Name = "_menuItemOpenMinecraftSaveFolder";
this._menuItemOpenMinecraftSaveFolder.Size = new System.Drawing.Size(223, 22);
this._menuItemOpenMinecraftSaveFolder.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenMinecraftSaveFolder.Text = "Open &Minecraft Save Folder";
//
// toolStripSeparator12
//
this.toolStripSeparator12.Name = "toolStripSeparator12";
this.toolStripSeparator12.Size = new System.Drawing.Size(230, 6);
//
// _menuItemOpenInExplorer
//
this._menuItemOpenInExplorer.Enabled = false;
this._menuItemOpenInExplorer.Name = "_menuItemOpenInExplorer";
this._menuItemOpenInExplorer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.E)));
this._menuItemOpenInExplorer.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenInExplorer.Text = "Open in &Explorer";
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(220, 6);
this.toolStripSeparator3.Size = new System.Drawing.Size(230, 6);
//
// _menuItemSave
//
this._menuItemSave.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemSave.Image")));
this._menuItemSave.Name = "_menuItemSave";
this._menuItemSave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
this._menuItemSave.Size = new System.Drawing.Size(233, 22);
this._menuItemSave.Text = "&Save";
//
// _menuItemRefresh
//
this._menuItemRefresh.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRefresh.Image")));
this._menuItemRefresh.Name = "_menuItemRefresh";
this._menuItemRefresh.ShortcutKeys = System.Windows.Forms.Keys.F5;
this._menuItemRefresh.Size = new System.Drawing.Size(233, 22);
this._menuItemRefresh.Text = "Refresh";
this._menuItemRefresh.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(220, 6);
this.toolStripSeparator4.Size = new System.Drawing.Size(230, 6);
//
// _menuItemRecentFiles
//
this._menuItemRecentFiles.Name = "_menuItemRecentFiles";
this._menuItemRecentFiles.Size = new System.Drawing.Size(223, 22);
this._menuItemRecentFiles.Size = new System.Drawing.Size(233, 22);
this._menuItemRecentFiles.Text = "Recent Files";
//
// _menuItemRecentFolders
//
this._menuItemRecentFolders.Name = "_menuItemRecentFolders";
this._menuItemRecentFolders.Size = new System.Drawing.Size(223, 22);
this._menuItemRecentFolders.Size = new System.Drawing.Size(233, 22);
this._menuItemRecentFolders.Text = "Recent Folders";
//
// toolStripSeparator8
//
this.toolStripSeparator8.Name = "toolStripSeparator8";
this.toolStripSeparator8.Size = new System.Drawing.Size(220, 6);
this.toolStripSeparator8.Size = new System.Drawing.Size(230, 6);
//
// _menuItemExit
//
this._menuItemExit.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemExit.Image")));
this._menuItemExit.Name = "_menuItemExit";
this._menuItemExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this._menuItemExit.Size = new System.Drawing.Size(233, 22);
this._menuItemExit.Text = "E&xit";
//
// editToolStripMenuItem
//
@ -185,16 +246,82 @@
this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
this.editToolStripMenuItem.Text = "&Edit";
//
// _menuItemCut
//
this._menuItemCut.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCut.Image")));
this._menuItemCut.Name = "_menuItemCut";
this._menuItemCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X)));
this._menuItemCut.Size = new System.Drawing.Size(203, 22);
this._menuItemCut.Text = "Cu&t";
//
// _menuItemCopy
//
this._menuItemCopy.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCopy.Image")));
this._menuItemCopy.Name = "_menuItemCopy";
this._menuItemCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
this._menuItemCopy.Size = new System.Drawing.Size(203, 22);
this._menuItemCopy.Text = "&Copy";
//
// _menuItemPaste
//
this._menuItemPaste.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemPaste.Image")));
this._menuItemPaste.Name = "_menuItemPaste";
this._menuItemPaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
this._menuItemPaste.Size = new System.Drawing.Size(203, 22);
this._menuItemPaste.Text = "&Paste";
//
// toolStripSeparator7
//
this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(200, 6);
//
// _menuItemRename
//
this._menuItemRename.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRename.Image")));
this._menuItemRename.Name = "_menuItemRename";
this._menuItemRename.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
this._menuItemRename.Size = new System.Drawing.Size(203, 22);
this._menuItemRename.Text = "&Rename";
//
// _menuItemEditValue
//
this._menuItemEditValue.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemEditValue.Image")));
this._menuItemEditValue.Name = "_menuItemEditValue";
this._menuItemEditValue.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
this._menuItemEditValue.Size = new System.Drawing.Size(203, 22);
this._menuItemEditValue.Text = "&Edit Value";
//
// _menuItemDelete
//
this._menuItemDelete.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemDelete.Image")));
this._menuItemDelete.Name = "_menuItemDelete";
this._menuItemDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete;
this._menuItemDelete.Size = new System.Drawing.Size(203, 22);
this._menuItemDelete.Text = "&Delete";
//
// toolStripSeparator10
//
this.toolStripSeparator10.Name = "toolStripSeparator10";
this.toolStripSeparator10.Size = new System.Drawing.Size(200, 6);
//
// _menuItemMoveUp
//
this._menuItemMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveUp.Image")));
this._menuItemMoveUp.Name = "_menuItemMoveUp";
this._menuItemMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
this._menuItemMoveUp.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveUp.Text = "Move &Up";
this._menuItemMoveUp.Click += new System.EventHandler(this._menuItemMoveUp_Click);
//
// _menuItemMoveDown
//
this._menuItemMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveDown.Image")));
this._menuItemMoveDown.Name = "_menuItemMoveDown";
this._menuItemMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
this._menuItemMoveDown.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveDown.Text = "Move Do&wn";
this._menuItemMoveDown.Click += new System.EventHandler(this._menuItemMoveDown_Click);
//
// searchToolStripMenuItem
//
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -208,6 +335,22 @@
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "&Search";
//
// _menuItemFind
//
this._menuItemFind.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFind.Image")));
this._menuItemFind.Name = "_menuItemFind";
this._menuItemFind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this._menuItemFind.Size = new System.Drawing.Size(167, 22);
this._menuItemFind.Text = "&Find...";
//
// _menuItemFindNext
//
this._menuItemFindNext.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFindNext.Image")));
this._menuItemFindNext.Name = "_menuItemFindNext";
this._menuItemFindNext.ShortcutKeys = System.Windows.Forms.Keys.F3;
this._menuItemFindNext.Size = new System.Drawing.Size(167, 22);
this._menuItemFindNext.Text = "Find &Next";
//
// toolStripSeparator9
//
this.toolStripSeparator9.Name = "toolStripSeparator9";
@ -221,6 +364,18 @@
this.replaceToolStripMenuItem.Text = "&Replace...";
this.replaceToolStripMenuItem.Click += new System.EventHandler(this.replaceToolStripMenuItem_Click);
//
// toolStripSeparator11
//
this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(164, 6);
//
// findBlockToolStripMenuItem
//
this.findBlockToolStripMenuItem.Name = "findBlockToolStripMenuItem";
this.findBlockToolStripMenuItem.Size = new System.Drawing.Size(167, 22);
this.findBlockToolStripMenuItem.Text = "&Chunk Finder...";
this.findBlockToolStripMenuItem.Click += new System.EventHandler(this.findBlockToolStripMenuItem_Click);
//
// helpToolStripMenuItem
//
this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -229,6 +384,14 @@
this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.helpToolStripMenuItem.Text = "&Help";
//
// _menuItemAbout
//
this._menuItemAbout.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemAbout.Image")));
this._menuItemAbout.Name = "_menuItemAbout";
this._menuItemAbout.ShortcutKeys = System.Windows.Forms.Keys.F1;
this._menuItemAbout.Size = new System.Drawing.Size(126, 22);
this._menuItemAbout.Text = "&About";
//
// imageList1
//
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
@ -249,6 +412,8 @@
this.imageList1.Images.SetKeyName(13, "map.png");
this.imageList1.Images.SetKeyName(14, "edit-code-i.png");
this.imageList1.Images.SetKeyName(15, "question-white.png");
this.imageList1.Images.SetKeyName(16, "edit-code-s.png");
this.imageList1.Images.SetKeyName(17, "edit-code-l.png");
//
// toolStrip1
//
@ -274,6 +439,7 @@
this._buttonAddTagDouble,
this._buttonAddTagByteArray,
this._buttonAddTagIntArray,
this._buttonAddTagLongArray,
this._buttonAddTagString,
this._buttonAddTagList,
this._buttonAddTagCompound,
@ -285,75 +451,6 @@
this.toolStrip1.Stretch = true;
this.toolStrip1.TabIndex = 0;
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
//
// BottomToolStripPanel
//
this.BottomToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.BottomToolStripPanel.Name = "BottomToolStripPanel";
this.BottomToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.BottomToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.BottomToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// TopToolStripPanel
//
this.TopToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.TopToolStripPanel.Name = "TopToolStripPanel";
this.TopToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.TopToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.TopToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// RightToolStripPanel
//
this.RightToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.RightToolStripPanel.Name = "RightToolStripPanel";
this.RightToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.RightToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.RightToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// LeftToolStripPanel
//
this.LeftToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.LeftToolStripPanel.Name = "LeftToolStripPanel";
this.LeftToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.LeftToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.LeftToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// ContentPanel
//
this.ContentPanel.Size = new System.Drawing.Size(562, 376);
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.testToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(97, 26);
//
// testToolStripMenuItem
//
this.testToolStripMenuItem.Name = "testToolStripMenuItem";
this.testToolStripMenuItem.Size = new System.Drawing.Size(96, 22);
this.testToolStripMenuItem.Text = "Test";
//
// _buttonOpen
//
this._buttonOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -391,6 +488,11 @@
this._buttonRefresh.Text = "Refresh Content From Disk";
this._buttonRefresh.Click += new System.EventHandler(this._buttonRefresh_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
//
// _buttonCut
//
this._buttonCut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -418,6 +520,11 @@
this._buttonPaste.Size = new System.Drawing.Size(23, 22);
this._buttonPaste.Text = "Paste";
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
//
// _buttonRename
//
this._buttonRename.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -445,6 +552,11 @@
this._buttonDelete.Size = new System.Drawing.Size(23, 22);
this._buttonDelete.Text = "Delete Tag";
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// _buttonAddTagByte
//
this._buttonAddTagByte.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -545,6 +657,11 @@
this._buttonAddTagCompound.Size = new System.Drawing.Size(23, 22);
this._buttonAddTagCompound.Text = "Add Compound Tag";
//
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
//
// _buttonFindNext
//
this._buttonFindNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -554,149 +671,54 @@
this._buttonFindNext.Size = new System.Drawing.Size(23, 22);
this._buttonFindNext.Text = "Find / Find Next";
//
// _menuItemOpen
// BottomToolStripPanel
//
this._menuItemOpen.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpen.Image")));
this._menuItemOpen.Name = "_menuItemOpen";
this._menuItemOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this._menuItemOpen.Size = new System.Drawing.Size(223, 22);
this._menuItemOpen.Text = "&Open...";
this.BottomToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.BottomToolStripPanel.Name = "BottomToolStripPanel";
this.BottomToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.BottomToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.BottomToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// _menuItemOpenFolder
// TopToolStripPanel
//
this._menuItemOpenFolder.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpenFolder.Image")));
this._menuItemOpenFolder.Name = "_menuItemOpenFolder";
this._menuItemOpenFolder.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.O)));
this._menuItemOpenFolder.Size = new System.Drawing.Size(223, 22);
this._menuItemOpenFolder.Text = "Open &Folder...";
this.TopToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.TopToolStripPanel.Name = "TopToolStripPanel";
this.TopToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.TopToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.TopToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// _menuItemSave
// RightToolStripPanel
//
this._menuItemSave.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemSave.Image")));
this._menuItemSave.Name = "_menuItemSave";
this._menuItemSave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
this._menuItemSave.Size = new System.Drawing.Size(223, 22);
this._menuItemSave.Text = "&Save";
this.RightToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.RightToolStripPanel.Name = "RightToolStripPanel";
this.RightToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.RightToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.RightToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// _menuItemRefresh
// LeftToolStripPanel
//
this._menuItemRefresh.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRefresh.Image")));
this._menuItemRefresh.Name = "_menuItemRefresh";
this._menuItemRefresh.ShortcutKeys = System.Windows.Forms.Keys.F5;
this._menuItemRefresh.Size = new System.Drawing.Size(223, 22);
this._menuItemRefresh.Text = "Refresh";
this._menuItemRefresh.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
this.LeftToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.LeftToolStripPanel.Name = "LeftToolStripPanel";
this.LeftToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.LeftToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.LeftToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// _menuItemExit
// ContentPanel
//
this._menuItemExit.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemExit.Image")));
this._menuItemExit.Name = "_menuItemExit";
this._menuItemExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this._menuItemExit.Size = new System.Drawing.Size(223, 22);
this._menuItemExit.Text = "E&xit";
this.ContentPanel.Size = new System.Drawing.Size(562, 376);
//
// _menuItemCut
// contextMenuStrip1
//
this._menuItemCut.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCut.Image")));
this._menuItemCut.Name = "_menuItemCut";
this._menuItemCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X)));
this._menuItemCut.Size = new System.Drawing.Size(203, 22);
this._menuItemCut.Text = "Cu&t";
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.testToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(96, 26);
//
// _menuItemCopy
// testToolStripMenuItem
//
this._menuItemCopy.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCopy.Image")));
this._menuItemCopy.Name = "_menuItemCopy";
this._menuItemCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
this._menuItemCopy.Size = new System.Drawing.Size(203, 22);
this._menuItemCopy.Text = "&Copy";
//
// _menuItemPaste
//
this._menuItemPaste.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemPaste.Image")));
this._menuItemPaste.Name = "_menuItemPaste";
this._menuItemPaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
this._menuItemPaste.Size = new System.Drawing.Size(203, 22);
this._menuItemPaste.Text = "&Paste";
//
// _menuItemRename
//
this._menuItemRename.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRename.Image")));
this._menuItemRename.Name = "_menuItemRename";
this._menuItemRename.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
this._menuItemRename.Size = new System.Drawing.Size(203, 22);
this._menuItemRename.Text = "&Rename";
//
// _menuItemEditValue
//
this._menuItemEditValue.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemEditValue.Image")));
this._menuItemEditValue.Name = "_menuItemEditValue";
this._menuItemEditValue.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
this._menuItemEditValue.Size = new System.Drawing.Size(203, 22);
this._menuItemEditValue.Text = "&Edit Value";
//
// _menuItemDelete
//
this._menuItemDelete.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemDelete.Image")));
this._menuItemDelete.Name = "_menuItemDelete";
this._menuItemDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete;
this._menuItemDelete.Size = new System.Drawing.Size(203, 22);
this._menuItemDelete.Text = "&Delete";
//
// _menuItemMoveUp
//
this._menuItemMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveUp.Image")));
this._menuItemMoveUp.Name = "_menuItemMoveUp";
this._menuItemMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
this._menuItemMoveUp.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveUp.Text = "Move &Up";
this._menuItemMoveUp.Click += new System.EventHandler(this._menuItemMoveUp_Click);
//
// _menuItemMoveDown
//
this._menuItemMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveDown.Image")));
this._menuItemMoveDown.Name = "_menuItemMoveDown";
this._menuItemMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
this._menuItemMoveDown.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveDown.Text = "Move Do&wn";
this._menuItemMoveDown.Click += new System.EventHandler(this._menuItemMoveDown_Click);
//
// _menuItemFind
//
this._menuItemFind.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFind.Image")));
this._menuItemFind.Name = "_menuItemFind";
this._menuItemFind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this._menuItemFind.Size = new System.Drawing.Size(167, 22);
this._menuItemFind.Text = "&Find...";
//
// _menuItemFindNext
//
this._menuItemFindNext.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFindNext.Image")));
this._menuItemFindNext.Name = "_menuItemFindNext";
this._menuItemFindNext.ShortcutKeys = System.Windows.Forms.Keys.F3;
this._menuItemFindNext.Size = new System.Drawing.Size(167, 22);
this._menuItemFindNext.Text = "Find &Next";
//
// _menuItemAbout
//
this._menuItemAbout.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemAbout.Image")));
this._menuItemAbout.Name = "_menuItemAbout";
this._menuItemAbout.ShortcutKeys = System.Windows.Forms.Keys.F1;
this._menuItemAbout.Size = new System.Drawing.Size(126, 22);
this._menuItemAbout.Text = "&About";
//
// toolStripSeparator11
//
this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(164, 6);
//
// findBlockToolStripMenuItem
//
this.findBlockToolStripMenuItem.Name = "findBlockToolStripMenuItem";
this.findBlockToolStripMenuItem.Size = new System.Drawing.Size(167, 22);
this.findBlockToolStripMenuItem.Text = "&Chunk Finder...";
this.findBlockToolStripMenuItem.Click += new System.EventHandler(this.findBlockToolStripMenuItem_Click);
this.testToolStripMenuItem.Name = "testToolStripMenuItem";
this.testToolStripMenuItem.Size = new System.Drawing.Size(95, 22);
this.testToolStripMenuItem.Text = "Test";
//
// _nodeTree
//
@ -715,6 +737,16 @@
this._nodeTree.Size = new System.Drawing.Size(619, 374);
this._nodeTree.TabIndex = 0;
//
// _buttonAddTagLongArray
//
this._buttonAddTagLongArray.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this._buttonAddTagLongArray.Image = ((System.Drawing.Image)(resources.GetObject("_buttonAddTagLongArray.Image")));
this._buttonAddTagLongArray.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this._buttonAddTagLongArray.ImageTransparentColor = System.Drawing.Color.Magenta;
this._buttonAddTagLongArray.Name = "_buttonAddTagLongArray";
this._buttonAddTagLongArray.Size = new System.Drawing.Size(23, 22);
this._buttonAddTagLongArray.Text = "Add Long Array Tag";
//
// MainForm
//
this.AllowDrop = true;
@ -809,6 +841,9 @@
private System.Windows.Forms.ToolStripMenuItem _menuItemMoveDown;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
private System.Windows.Forms.ToolStripMenuItem findBlockToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
private System.Windows.Forms.ToolStripMenuItem _menuItemOpenInExplorer;
private System.Windows.Forms.ToolStripButton _buttonAddTagLongArray;
}
}

View file

@ -13,6 +13,7 @@ using NBTExplorer.Controllers;
namespace NBTExplorer.Windows
{
using Predicates = NodeTreeController.Predicates;
using NBTModel.Interop;
public partial class MainForm : Form
{
@ -38,6 +39,8 @@ namespace NBTExplorer.Windows
_tagIconIndex[TagType.TAG_LIST] = 8;
_tagIconIndex[TagType.TAG_COMPOUND] = 9;
_tagIconIndex[TagType.TAG_INT_ARRAY] = 14;
_tagIconIndex[TagType.TAG_SHORT_ARRAY] = 16;
_tagIconIndex[TagType.TAG_LONG_ARRAY] = 17;
}
catch (Exception e) {
Program.StaticInitFailure(e);
@ -83,6 +86,7 @@ namespace NBTExplorer.Windows
_buttonAddTagIntArray.Click += _buttonAddTagIntArray_Click;
_buttonAddTagList.Click += _buttonAddTagList_Click;
_buttonAddTagLong.Click += _buttonAddTagLong_Click;
_buttonAddTagLongArray.Click += _buttonAddTagLongArray_Click;
_buttonAddTagShort.Click += _buttonAddTagShort_Click;
_buttonAddTagString.Click += _buttonAddTagString_Click;
_buttonFindNext.Click += _buttonFindNext_Click;
@ -101,6 +105,7 @@ namespace NBTExplorer.Windows
_menuItemFind.Click += _menuItemFind_Click;
_menuItemFindNext.Click += _menuItemFindNext_Click;
_menuItemAbout.Click += _menuItemAbout_Click;
_menuItemOpenInExplorer.Click += _menuItemOpenInExplorer_Click;
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1) {
@ -115,6 +120,19 @@ namespace NBTExplorer.Windows
UpdateOpenMenu();
}
void _menuItemOpenInExplorer_Click(object sender, EventArgs e)
{
if (_nodeTree.SelectedNode.Tag is DirectoryDataNode) {
DirectoryDataNode ddNode = _nodeTree.SelectedNode.Tag as DirectoryDataNode;
try {
string path = (!Interop.IsWindows ? "file://" : "") + ddNode.NodeDirPath;
System.Diagnostics.Process.Start(path);
} catch (Win32Exception ex) {
MessageBox.Show(ex.Message, "Can't open directory", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void InitializeIconRegistry ()
{
_iconRegistry = new IconRegistry();
@ -136,6 +154,7 @@ namespace NBTExplorer.Windows
_iconRegistry.Register(typeof(CubicRegionDataNode), 11);
_iconRegistry.Register(typeof(NbtFileDataNode), 12);
_iconRegistry.Register(typeof(TagIntArrayDataNode), 14);
_iconRegistry.Register(typeof(TagShortArrayDataNode), 16);
}
private void OpenFile ()
@ -162,13 +181,31 @@ namespace NBTExplorer.Windows
if (!ConfirmAction("Open new folder anyway?"))
return;
using (FolderBrowserDialog ofd = new FolderBrowserDialog()) {
if (_openFolderPath != null)
ofd.SelectedPath = _openFolderPath;
if ((ModifierKeys & Keys.Control) > 0 && (ModifierKeys & Keys.Shift) == 0) {
// If the user is holding Control, use a file open dialog and open whichever directory has the selected file.
// But not if the user is also holding Shift, as Ctrl+Shift+O is the keyboard shortcut for this menu item.
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Title = "Select any file in the directory to open";
ofd.Filter = "All files (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK) {
_openFolderPath = ofd.SelectedPath;
OpenPaths(new string[] { ofd.SelectedPath });
if (_openFolderPath != null)
ofd.InitialDirectory = _openFolderPath;
if (ofd.ShowDialog() == DialogResult.OK) {
_openFolderPath = Path.GetDirectoryName(ofd.FileName);
OpenPaths(new string[] { _openFolderPath });
}
}
} else {
// Otherwise, use the standard folder browser dialog.
using (FolderBrowserDialog ofd = new FolderBrowserDialog()) {
if (_openFolderPath != null)
ofd.SelectedPath = _openFolderPath;
if (ofd.ShowDialog() == DialogResult.OK) {
_openFolderPath = ofd.SelectedPath;
OpenPaths(new string[] { ofd.SelectedPath });
}
}
}
@ -394,7 +431,7 @@ namespace NBTExplorer.Windows
}
else {
DisableButtons(_buttonAddTagByte, _buttonAddTagByteArray, _buttonAddTagCompound, _buttonAddTagDouble, _buttonAddTagFloat,
_buttonAddTagInt, _buttonAddTagIntArray, _buttonAddTagList, _buttonAddTagLong, _buttonAddTagShort,
_buttonAddTagInt, _buttonAddTagIntArray, _buttonAddTagList, _buttonAddTagLong, _buttonAddTagLongArray, _buttonAddTagShort,
_buttonAddTagString, _buttonCopy, _buttonCut, _buttonDelete, _buttonEdit, _buttonPaste, _buttonRefresh,
_buttonRename);
@ -436,6 +473,7 @@ namespace NBTExplorer.Windows
_buttonAddTagIntArray.Enabled = node.CanCreateTag(TagType.TAG_INT_ARRAY);
_buttonAddTagList.Enabled = node.CanCreateTag(TagType.TAG_LIST);
_buttonAddTagLong.Enabled = node.CanCreateTag(TagType.TAG_LONG);
_buttonAddTagLongArray.Enabled = node.CanCreateTag(TagType.TAG_LONG_ARRAY);
_buttonAddTagShort.Enabled = node.CanCreateTag(TagType.TAG_SHORT);
_buttonAddTagString.Enabled = node.CanCreateTag(TagType.TAG_STRING);
@ -462,6 +500,7 @@ namespace NBTExplorer.Windows
_menuItemFindNext.Enabled = _searchState != null;
_menuItemMoveUp.Enabled = node.CanMoveNodeUp;
_menuItemMoveDown.Enabled = node.CanMoveNodeDown;
_menuItemOpenInExplorer.Enabled = node is DirectoryDataNode;
UpdateUI(_nodeTree.SelectedNodes);
}
@ -480,6 +519,7 @@ namespace NBTExplorer.Windows
_buttonAddTagDouble.Enabled = _controller.CanOperateOnSelection(Predicates.CreateDoubleNodePred);
_buttonAddTagByteArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateByteArrayNodePred);
_buttonAddTagIntArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateIntArrayNodePred);
_buttonAddTagLongArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateLongArrayNodePred);
_buttonAddTagString.Enabled = _controller.CanOperateOnSelection(Predicates.CreateStringNodePred);
_buttonAddTagList.Enabled = _controller.CanOperateOnSelection(Predicates.CreateListNodePred);
_buttonAddTagCompound.Enabled = _controller.CanOperateOnSelection(Predicates.CreateCompoundNodePred);
@ -718,6 +758,11 @@ namespace NBTExplorer.Windows
_controller.CreateNode(TagType.TAG_LONG);
}
private void _buttonAddTagLongArray_Click (object sender, EventArgs e)
{
_controller.CreateNode(TagType.TAG_LONG_ARRAY);
}
private void _buttonAddTagShort_Click (object sender, EventArgs e)
{
_controller.CreateNode(TagType.TAG_SHORT);
@ -749,7 +794,7 @@ namespace NBTExplorer.Windows
{
OpenFile();
}
private void _menuItemOpenFolder_Click (object sender, EventArgs e)
{
OpenFolder();

View file

@ -369,229 +369,239 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADQ
MwAAAk1TRnQBSQFMAgEBEAEAATgBAgE4AQIBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AB4AA/wD+SH4A/kD/AMAA/0D+SH4
A/kD/TkAA/8D/AP5EvgD+QP7A/4GAAGWAakBvAFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFc
AYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgGWAakBvAMAAs8BywK5
AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACzwHLOQAD/gP4
AegC5QHZAbQBqwHqAY4BdwHuAXABUAHuAXABUAHqAY4BdwHZAbQBqwHoAeUB5AP2A/4GAAFsAZMBugFV
AYgBuwFwAaMB1gFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFn
AZoBzQFwAaMB1gFVAYgBuwFsAZMBugMAAsEBuQL5AekC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHi
AvMB4gLzAeIC8wHiAvMB4gL5AekCwQG5PAAB6gHcAdgB7gGCAWcB9QGiAY8B+gHRAcoB/AHnAeUB/AHm
AeUB+QHRAckB9AGhAY4B7gGBAWYB6gHcAdgJAAF+AaIBxwFxAaQB1wFVAYgBuwFxAaQB1wFxAaQB1wFx
AaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFVAYgBuwFxAaQB1wF+AaIBxwMA
AssBwwL0AeQBegGnAZsBhwG3AacBhwG1AaMBiQGzAaIBaAGgAYYBVwGXAXgBWAGTAXkBaAGQAX4BkgGk
AZMBhgGXAYACqAGOAvQB5ALLAcMJAAP+A/wG+QP6BvwD+wb5A/wD/gwAAfMB3wHaAe4BewFgAfcB1AHO
AfcC6QH3AugB/AL0AfwC9AH3AugB9wLpAfYB0QHKAe4BewFfAfMB3wHaBgABhgGqAc0BcwGmAdkBagGd
AdABSAF7Aa4BXwGSAcUBTAF/AbIBXwGSAcUBTAF/AbIBXwGSAcUBTAF/AbIBXwGSAcUBSAF7Aa4BagGd
AdABcwGmAdkBhgGqAc0DAALPAccC9QHmAYQBtQGrAZgB1wHHAZAB0QG+AXMBsAGZAZcBywG2AacBzgG9
AZcBvQGsAZQBugGoAakBvwGvAY4BrQGhAbcBrQGLAvUB5gLPAccJAAP+A/wD+QOzA1wG/ANcA7QD+QP8
A/4JAAH6AfgB9wHnAX4BYgHzAdMBzQHwAuUB7wLkAe8C5AHlAWEBPwHlAWEBPwHvAuQB7wLkAe8C5AHv
Ac0BxwHnAX4BYgH6AfgB9wMAAYsBrQHPAXUBqAHbAWwBnwHSAUoBfQGwAWwBnwHSAVIBhQG4AWwBnwHS
AVIBhQG4AWwBnwHSAVIBhQG4AWwBnwHSAUoBfQGwAWwBnwHSAXUBqAHbAYsBrQHPAwAC0QHJAvYB6QGQ
AbwBtQG5AeUB2wGmAd0B0AGIAcABsgGHAckBtQF+Ab4BpAGIAbkBowGuAdABvwGpAccBtQGUAboBqAG2
AbUBkQL2AekC0QHJDwADywN1A/gGAAP4A3UDyw8AAegBxQG8AeUBnQGKAeoC4gHnAt8B5wLfAecC3wHW
AVkBNwHWAVkBNwHnAt8B5wLfAecC3wHoAuAB4QGXAYQB6AHFAbwDAAGPAbEB0gF3AaoB3QFuAaEB1AFH
AXoBrQFuAaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFHAXoBrQFuAaEB1AF3
AaoB3QGPAbEB0gMAAtMBzAL3AesBxQG4AYcB/wHeAYwB+AHnAa0B1QHRAbABygHrAeIBvQHlAdkBoAHK
AbsBqgHOAa8BggHBAaQBfgG2ApgBrAGEAvcB6wLTAcwMAAPOA38D+QHdAbMBuQHAAUkBWgHAAUkBWgHd
AbMBuQP5A38DzgwAAdIBhAFuAeoB0AHIAeEC2gHgAtkB4ALZAeAC2QHxAu0B8QLtAeAC2QHgAtkB4ALZ
AeAC2QHhAcQBvQHSAYQBbgMAAZMBtAHUAXgBqwHeAW8BogHVAUQBdwGqAW8BogHVAUwBfwGyAW8BogHV
AUwBfwGyAW8BogHVAUwBfwGyAW8BogHVAUQBdwGqAW8BogHVAXgBqwHeAZMBtAHUAwAC1QHNAvgB7gHR
Aa4BaQHbAboBcQHeAb4BdAHpAckBfAG/Ac0BqAGVAcwBwgGhAc8BvgGRAcQBrwF/Ab0BpgF3AbcBnQGo
AaoBdwL4Ae4C1QHNCQAD0AOGA/kGAAHgAbYBvAHRAXsBhwYAA/kDhgPQCQABuwFUATUB9AHuAe0B5wLl
AdoC1gHYAtQB2ALUAbcBSAEmAbcBSAEmAeMC3wHYAtQB2ALUAdgC1AHhAdgB1gG7AVQBNQMAAZgBuAHX
AXoBrQHgAXEBpAHXAUEBdAGnAXEBpAHXAUkBfAGvAXEBpAHXAUkBfAGvAXEBpAHXAUkBfAGvAXEBpAHX
AUEBdAGnAXEBpAHXAXoBrQHgAZgBuAHXAwAC1wHPAvkB8QHTAawBZgH/AdMBfgH/AdYBggHgAb4BdAH2
AeEBmQGwAe0B5AGvAdEBvwGiAeAB0wGYAdgBxgGOAdABugG4AbIBgAL5AfEC1wHPBgAD7wNsA+8JAAHj
AbgBvwHXAYEBjQkAA+8DbAPvBgABsQFQATEB9AHvAe0D7gPqAdwC2wHTAtEBxwGmAZwBrgFHASUBwQFz
AVoB3gLcAdIC0AHSAtAB3wHYAdcBsQFQATEDAAGbAboB2QF8Aa8B4gFzAaYB2QE/AXIBpQFzAaYB2QFH
AXoBrQFzAaYB2QFHAXoBrQFzAaYB2QFHAXoBrQFzAaYB2QE/AXIBpQFzAaYB2QF8Aa8B4gGbAboB2QMA
AtkB0QL7AfQB1QGpAWIB/wHOAXkB/wHSAX0B3wG6AW8B/wHYAYMB5gHqAb0BpgHYAc0BswHsAeIBuQHk
AdABtgHcAcQBqwG+AZcC+wH0AtkB0QkAA9QDkQP5BgAB5gG7AcEB3QGHAZMGAAP5A5ED1AkAAcABfQFm
AeoB1QHNCfAD6wPgAcgBnAGNAasBRgEkAb0BigF5A84B0gLRAdwBxwLAAX0BZgMAAZ0BvQHbAX4BsQHk
AXUBqAHbATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGe
AXUBqAHbAX4BsQHkAZ0BvQHbAwAC2gHTAvwB9wHXAacBXwHaAawBZAHcAbABZwHnAbwBcAHgAboBbwHj
Ab4BcwHfAdEBmAHbAc8BlgHVAdEBnAHEAc0BpAGdAdEBwwL8AfcC2gHTDAAD1QOWA/kB6AG9AcMB3QFm
AXcB3QFmAXcB6AG9AcMD+QOWA9UMAAHfAcMBuQHUAZ0BigP1BvMB2gGpAZgB2gGpAZgBzwGOAXgBswFP
AS0B0wGhAZAD8wP1AdQBnAGJAd8BwwG5AwABoAG+AdwBfwGyAeUBZgGZAcwBdgGpAdwBdgGpAdwBdgGp
AdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBZgGZAcwBfwGyAeUBoAG+AdwDAALb
AdQC/QH5AdkBpAFcAf8BxAFvAf8ByAFzAd4BsAFnAf8BzgF5Af8B0gF9AeQBvgFyAf8B2AGDAe0B5AGo
AeIB5gG2AdAB1wGtAv0B+QLbAdQPAAPXA5kD+gYAA/oDmQPXDwAB+QH4AfcBywF7AWAB8gHfAdkD+AP3
AcEBXQE7AcEBXQE7AcEBXQE7AcEBXQE7AekB0AHIA/gB8gHfAdkBywF7AWAB+QH4AfcDAAGjAcAB3gFr
AZ4B0QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3
AaoB3QF3AaoB3QFrAZ4B0QGjAcAB3gMAAt0B1QL+AfwB2gGjAVoB/wG/AWsB/wHCAW4B3gGsAWIB/wHJ
AXQB/wHNAXgB4wG5AW4B/wHTAX4B/wHXAYMB/AHeAZUB7AHKAXwC/gH8At0B1RIAA9gDnQYAA50D2BUA
Ae4B4AHbAdgBhAFoAfYB4wHcA/wM+wP8AfYB4wHcAdgBhAFoAe4B4AHbBgABpgHDAeABoAHTAfoBmAHL
AfUBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBmAHL
AfUBoAHTAfoBpgHDAeADAALeAdcC/wH+AdsBoQFYAdsBogFZAdsBpAFbAdsBpQFdAdsBqQFgAdsBrAFj
AdsBrwFmAdsBsQFoAdsBtAFrAdsBtwFuAdsBuQFxAv8B/gLeAdc8AAHwAeIB3QHkAZQBeAHvAbcBpAH6
AeQB3QH+AfkB9wH+AfkB9wH6AeQB3QHvAbcBpAHkAZQBeAHwAeIB3QkAAegB7QHzAagBxAHhAZcBygH1
AZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZcBygH1
AagBxAHhAegB7QHzAwAC3wHZJ/8C3wHZPwAB+gL4Ae8B0gHIAewBqAGSAewBjgFuAewBjgFuAewBqAGS
Ae8B0gHIAfoC+A8AAegB7QHzAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHi
AakBxQHiAakBxQHiAakBxQHiAakBxQHiAegB7QHzBgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLqAebDAAP7A/EBlQGvAbwBaAGbAbYBaAGbAbYBaAGb
AbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBlQGvAbwD8QP7FQAS+AP5
A/0zAAP8A/kk+AP5A/wD/QP6AXcBqAHBAYYBzwHwAYEBywHtAYEBywHtAYEBywHtAYEBywHtAYEBywHt
AYEBywHtAYYBzwHwAUsBjwGxAYYBzwHwAXcBqAHBAdwB4gHlBv0D+Qz4A/MBiQGlAY8BVQGLAV8BVQGL
AV8BVQGLAV8BVQGLAV8BVQGLAV8BVQGLAV8BlAGtAZkGAAPAAywDwAMAA/sb+AP7A/cBkwGmAboBYAGI
Aa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGI
Aa8BYAGIAa8BkwGmAboD9wYAAYYBtQHNAYQBzgHuAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHo
AXwBxwHoAYQBzgHuAVcBmwG9AYQBzgHuAfQBtgEuAYYBtQHNAwAClAG4AlUBowJVAaMCVQGjAlUBowJV
AaMCVQGjAVUBegGJATUBvQF5AUMBywGHAT4BxgGCAT4BxgGCAT4BxgGCAUMBywGHAVUBoAFwBgADQAFn
AlYDQAMAA/sDYQNeA1wDWQNUA0kDPAMvA2wD+wMAAXIBmAG/AXsBrgHgAXoBrQHfAXoBrQHfAXoBrQHf
AXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXsBrgHgAXIBmAG/CQABkQG+
AdQBhwHQAe8BfwHKAekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBhwHQAe8BXwGjAcUBhwHQ
Ae8B/gHJAUEBkQG+AdQDAAJVAbQBLwEeAdwBJQETAdgBJQETAdgBJQETAdgBJQETAdgBJQETAdgBVQF+
AZUBNwG/AXsBQgHKAYYBNwG/AXsBNwG/AXsBNwG/AXsBQgHKAYYBVQGnAXYGAAPLA1UDyycAAYQBpwHL
AYEBtAHkAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHh
AX0BsAHhAYEBtAHkAYQBpwHLCQABlAHAAdYBigHTAfABggHNAesBggHNAesBggHNAesBggHNAesBggHN
AesBggHNAesBigHTAfABYgGmAcgBigHTAfAC6QHbAZQBwAHWAwACVQG5AS0BHAHeARUBAAHVARUBAAHV
ARUBAAHVARUBAAHVARUBAAHVAVUBgQGaATsBwwF/AUgBzwGMATsBwwF/ATsBwwF/ATsBwwF/AUgBzwGM
AVUBrQF7NgABigGtAc8BiAG7AeoBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1
AeUBggG1AeUBggG1AeUBggG1AeUBiAG7AeoBigGtAc8JAAGYAcMB2AGOAdYB8gGHAdAB7QGHAdAB7QGH
AdAB7QGHAdAB7QGHAdAB7QGHAdAB7QGOAdYB8gFmAaoBzAGOAdYB8gLwAeYBmAHDAdgDAAJVAb8BNgEl
AeQBGQEAAdsBGQEAAdsBGQEAAdsBGQEAAdsBGQEAAdsBVQGEAaABPgHGAYIBTQHVAZEBPgHGAYIBPgHG
AYIBPgHGAYIBTQHVAZEBVQGzAYA2AAGOAbAB0QGPAcIB7gGHAboB6QGHAboB6QGHAboB6QGHAboB6QGH
AboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGPAcIB7gGOAbAB0QkAAZsBxgHaAZIB2gH0
AYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAZIB2gH0AWkBrQHPAZIB2gH0AvgB8wGb
AcYB2gMAAlUBxAE+AS0B7AEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wFVAYYBpAFCAcoBhgFR
AdkBlQFCAcoBhgFCAcoBhgFCAcoBhgFRAdkBlQFVAbkBhAYAA9ADZwPQJwABkwG0AdQBlgHJAfIBjAG/
AewBjAG/AewBjAG/AewBRAF3AaoBjAG/AewBRAF3AaoBjAG/AewBjAG/AewBjAG/AewBjAG/AewBlgHJ
AfIBkwG0AdQJAAGfAcgB3QGXAd4B9gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGX
Ad4B9gF5Ab0B3AF4Ab0B3AL+Af0BnwHIAd0DAAJVAcgBRgE1AfIBIAEAAekBIAEAAekBIAEAAekBIAEA
AekBIAEAAekBVQGJAagBRAHMAYgBZQHtAakBZQHtAakBZQHtAakBZQHtAakBWAHWAZYBfwHLAaQGAANs
AW8CaQNsBgADdQN0A3EDbgNsA2gDZQNjA2AGAAGYAbgB1wGbAc4B9gGRAcQB8AGRAcQB8AGRAcQB8AFV
AYgBuwFEAXcBqgFVAYgBuwFAAXMBpgGRAcQB8AGRAcQB8AGRAcQB8AGbAc4B9gGYAbgB1wkAAaIBygHe
AZsB4QH3AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZ4B5AH5AXwBwAHe
AaIBygHeAe4B8wH1AwACfwHVAWIBYQHnAXYBdQH+AXYBdQH+AXkBYgGjAXsBUAFVAXsBUAFVAWoBWQE/
AWoBbgEyAWoBbgEyAWEBiwFRAVUBwQGKAVUBwQGKAVUBwQGKAeIB7wHoBgAD0wNxA9MnAAGbAboB2QGf
AdIB+QGVAcgB8wGVAcgB8wGVAcgB8wFVAYgBuwFVAYgBuwFVAYgBuwFNAYABswGVAcgB8wGVAcgB8wGV
AcgB8wGfAdIB+QGbAboB2QkAAaUBzQHgAZ4B5QH5AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2
AZgB3wH2AZgB3wH2AZgB3wH2AaEB6AH6AaUBzQHgBgAC4gHxAlUBzgJVAc4CVQHOAW0BUwF1AdwBqQEy
AdcBpAEtAdcBpAEtAdcBpAEtAdwBqQEyAbABhgFIQgABnwG9AdsBqQHbAf4BqgHdAf8BqgHdAf8BqgHd
Af8BdwGqAd0BdwGqAd0BdwGqAd0BZgGZAcwBqgHdAf8BqgHdAf8BqgHdAf8BqQHbAf4BnwG9AdsJAAGo
Ac4B4gGjAegB+wGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGj
AegB+wGoAc4B4hIAAbYBiwFFAdwBqQEyAdEBngEnAdEBngEnAdEBngEnAdwBqQEyAbYBiwFFQgABxwHX
AecBiAG2AeIBgAGzAeYBgAGzAeYBgAGzAeYBTgGBAbQBTgGBAbQBTgGBAbQBSAF7Aa4BgAGzAeYBgAGz
AeYBgAGzAeYBiAG2AeIBxwHXAecJAAGrAdAB4wGmAesB/AGhAeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGh
AeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGmAesB/AGrAdAB4xIAAbsBkAFBAeEBrgE4AdYBowEsAdYBowEs
AdYBowEsAeEBrgE4AbsBkAFBEgAD1wN9A9cnAAHjAeoB8QGOAbgB4QGJAbwB7wGIAbsB7gGIAbsB7gFB
AXQBpwFBAXQBpwFBAXQBpwE+AXEBpAGIAbsB7gGIAbsB7gGJAbwB7wGOAbgB4QHjAeoB8QkAAa4B0gHk
AakB7gH9AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AakB7gH9
Aa4B0gHkEgABwAGVAT8B5wG0AT0B2gGnATAB2gGnATAB2gGnATAB5wG0AT0BwAGVAT8SAAN/A3cDfwYA
A4IDgQN/A34DfAN6A3kDdgOrBgAB9QH3AfkBmwG+Ad8BiQG8Ae8BiAG7Ae4BiAG7Ae4BNQFoAZsBNQFo
AZsBNQFoAZsBNQFoAZsBiAG7Ae4BiAG7Ae4BiQG8Ae8BmwG+Ad8B9QH3AfkJAAGwAdQB5gGsAfEB/wGn
AewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGsAfEB/wGwAdQB5hIA
AcYBmgE9AesBuAFBAd0BqgEzAd0BqgEzAd0BqgEzAesBuAFBAcYBmgE9EgAD2AOCA9gnAAP+AcsB2gHq
AakBxQHiAakBxQHiAakBxQHiAVUBfQGmAVUBfQGmAVUBfQGmAVUBfQGmAakBxQHiAakBxQHiAakBxQHi
AcsB2gHqA/4JAAGyAdUB5gGxAfUB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGu
AfIB/wGuAfIB/wGxAfUB/wGyAdUB5hIAAdQBswFsAecBuAFGAf4BywFUAf4BywFUAf4BywFUAecBuAFG
AdQBswFsdQAB0AHkAe4BswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHW
AecBswHWAecBswHWAecB0AHkAe4SAAHwAesB3gHNAaABOQHNAaABOQHNAaABOQHNAaABOQHNAaABOQHw
AesB3g8AA/sD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPx
BvsD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/tgAAP9
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA6
NgAAAk1TRnQBSQFMAgEBEgEAAVABAgFQAQIBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABUAMAAQEBAAEYBgABPP8A/wBaAAP+A/wG+QP6BvwD+wb5A/wD/gwAA/4D/Ab5A/oG/AP7BvkD/AP+
bAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+cgADywN1A/gGAAP4
A3UDyxgAA8sDdQP4BgAD+AN1A8t1AAPOA38D+QGCAcIBtAFZAa4BnQFZAa4BnQGpAdMByAP5A38DzhIA
A84DfwP5Ab8BfQFKAb8BfQFKAcABfgFNAeIBzgG/A/kDfwPObwAD0AOGA/kJAAHSAegB4AFgAbUBpAMA
A/kDhgPQDAAD0AOGA/kDAAHGAYIBUQHiAcsBuQkAA/kDhgPQaQAD7wNsA+8GAAGyAdwB0gFoAb0BrAFo
Ab0BrAGuAdkBzQYAA+8DbAPvBgAD7wNsA+8GAAHOAYoBWQHkAc0BugwAA+8DbAPvaQAD1AORA/kDAAFw
AcUBtAHVAesB4gkAA/kDkQPUDAAD1AORA/kDAAHWAZIBYQHnAc8BvAkAA/kDkQPUbwAD1QOWA/kBtwHh
AdUBdgHLAboBdgHLAboBlQHVAcYD+QOWA9USAAPVA5YD+QHdAaEBdQHpAdEBvgYAA/kDlgPVdQAD1wOZ
A/oGAAP6A5kD1xgAA9cDmQP6BgAD+gOZA9d7AAPYA50GAAOdA9geAAPYA50GAAOdA9j/AP8AsQAD/AP5
IfgD+QP8AwAD/QP5IfgD+QP9OQAD/wP8A/kS+AP5A/sD/gYAAZYBqQG8AVwBhAGuAVwBhAGuAVwBhAGu
AVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGu
AZYBqQG8AwACzwHLArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGw
ArkBsALPAcs5AAP+A/gB6ALlAdkBtAGrAeoBjgF3Ae4BcAFQAe4BcAFQAeoBjgF3AdkBtAGrAegB5QHk
A/YD/gYAAWwBkwG6AVUBiAG7AXABowHWAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHN
AWcBmgHNAWcBmgHNAWcBmgHNAXABowHWAVUBiAG7AWwBkwG6AwACwQG5AvkB6QLzAeIC8wHiAvMB4gLz
AeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvkB6QLBAbk8AAHqAdwB2AHuAYIBZwH1AaIBjwH6
AdEBygH8AecB5QH8AeYB5QH5AdEByQH0AaEBjgHuAYEBZgHqAdwB2AkAAX4BogHHAXEBpAHXAVUBiAG7
AXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAVUBiAG7
AXEBpAHXAX4BogHHAwACywHDAvQB5AF6AacBmwGHAbcBpwGHAbUBowGJAbMBogFoAaABhgFXAZcBeAFY
AZMBeQFoAZABfgGSAaQBkwGGAZcBgAKoAY4C9AHkAssBwwkAA/4D/Ab5A/oG/AP7BvkD/AP+DAAB8wHf
AdoB7gF7AWAB9wHUAc4B9wLpAfcC6AH8AvQB/AL0AfcC6AH3AukB9gHRAcoB7gF7AV8B8wHfAdoGAAGG
AaoBzQFzAaYB2QFqAZ0B0AFIAXsBrgFfAZIBxQFMAX8BsgFfAZIBxQFMAX8BsgFfAZIBxQFMAX8BsgFf
AZIBxQFIAXsBrgFqAZ0B0AFzAaYB2QGGAaoBzQMAAs8BxwL1AeYBhAG1AasBmAHXAccBkAHRAb4BcwGw
AZkBlwHLAbYBpwHOAb0BlwG9AawBlAG6AagBqQG/Aa8BjgGtAaEBtwGtAYsC9QHmAs8BxwkAA/4D/AP5
A7MDXAb8A1wDtAP5A/wD/gkAAfoB+AH3AecBfgFiAfMB0wHNAfAC5QHvAuQB7wLkAeUBYQE/AeUBYQE/
Ae8C5AHvAuQB7wLkAe8BzQHHAecBfgFiAfoB+AH3AwABiwGtAc8BdQGoAdsBbAGfAdIBSgF9AbABbAGf
AdIBUgGFAbgBbAGfAdIBUgGFAbgBbAGfAdIBUgGFAbgBbAGfAdIBSgF9AbABbAGfAdIBdQGoAdsBiwGt
Ac8DAALRAckC9gHpAZABvAG1AbkB5QHbAaYB3QHQAYgBwAGyAYcByQG1AX4BvgGkAYgBuQGjAa4B0AG/
AakBxwG1AZQBugGoAbYBtQGRAvYB6QLRAckPAAPLA3UD+AYAA/gDdQPLDwAB6AHFAbwB5QGdAYoB6gLi
AecC3wHnAt8B5wLfAdYBWQE3AdYBWQE3AecC3wHnAt8B5wLfAegC4AHhAZcBhAHoAcUBvAMAAY8BsQHS
AXcBqgHdAW4BoQHUAUcBegGtAW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHU
AUcBegGtAW4BoQHUAXcBqgHdAY8BsQHSAwAC0wHMAvcB6wHFAbgBhwH/Ad4BjAH4AecBrQHVAdEBsAHK
AesB4gG9AeUB2QGgAcoBuwGqAc4BrwGCAcEBpAF+AbYCmAGsAYQC9wHrAtMBzAwAA84DfwP5Ad0BswG5
AcABSQFaAcABSQFaAd0BswG5A/kDfwPODAAB0gGEAW4B6gHQAcgB4QLaAeAC2QHgAtkB4ALZAfEC7QHx
Au0B4ALZAeAC2QHgAtkB4ALZAeEBxAG9AdIBhAFuAwABkwG0AdQBeAGrAd4BbwGiAdUBRAF3AaoBbwGi
AdUBTAF/AbIBbwGiAdUBTAF/AbIBbwGiAdUBTAF/AbIBbwGiAdUBRAF3AaoBbwGiAdUBeAGrAd4BkwG0
AdQDAALVAc0C+AHuAdEBrgFpAdsBugFxAd4BvgF0AekByQF8Ab8BzQGoAZUBzAHCAaEBzwG+AZEBxAGv
AX8BvQGmAXcBtwGdAagBqgF3AvgB7gLVAc0JAAPQA4YD+QYAAeABtgG8AdEBewGHBgAD+QOGA9AJAAG7
AVQBNQH0Ae4B7QHnAuUB2gLWAdgC1AHYAtQBtwFIASYBtwFIASYB4wLfAdgC1AHYAtQB2ALUAeEB2AHW
AbsBVAE1AwABmAG4AdcBegGtAeABcQGkAdcBQQF0AacBcQGkAdcBSQF8Aa8BcQGkAdcBSQF8Aa8BcQGk
AdcBSQF8Aa8BcQGkAdcBQQF0AacBcQGkAdcBegGtAeABmAG4AdcDAALXAc8C+QHxAdMBrAFmAf8B0wF+
Af8B1gGCAeABvgF0AfYB4QGZAbAB7QHkAa8B0QG/AaIB4AHTAZgB2AHGAY4B0AG6AbgBsgGAAvkB8QLX
Ac8GAAPvA2wD7wkAAeMBuAG/AdcBgQGNCQAD7wNsA+8GAAGxAVABMQH0Ae8B7QPuA+oB3ALbAdMC0QHH
AaYBnAGuAUcBJQHBAXMBWgHeAtwB0gLQAdIC0AHfAdgB1wGxAVABMQMAAZsBugHZAXwBrwHiAXMBpgHZ
AT8BcgGlAXMBpgHZAUcBegGtAXMBpgHZAUcBegGtAXMBpgHZAUcBegGtAXMBpgHZAT8BcgGlAXMBpgHZ
AXwBrwHiAZsBugHZAwAC2QHRAvsB9AHVAakBYgH/Ac4BeQH/AdIBfQHfAboBbwH/AdgBgwHmAeoBvQGm
AdgBzQGzAewB4gG5AeQB0AG2AdwBxAGrAb4BlwL7AfQC2QHRCQAD1AORA/kGAAHmAbsBwQHdAYcBkwYA
A/kDkQPUCQABwAF9AWYB6gHVAc0J8APrA+AByAGcAY0BqwFGASQBvQGKAXkDzgHSAtEB3AHHAsABfQFm
AwABnQG9AdsBfgGxAeQBdQGoAdsBOAFrAZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFr
AZ4BUQGEAbcBOAFrAZ4BdQGoAdsBfgGxAeQBnQG9AdsDAALaAdMC/AH3AdcBpwFfAdoBrAFkAdwBsAFn
AecBvAFwAeABugFvAeMBvgFzAd8B0QGYAdsBzwGWAdUB0QGcAcQBzQGkAZ0B0QHDAvwB9wLaAdMMAAPV
A5YD+QHoAb0BwwHdAWYBdwHdAWYBdwHoAb0BwwP5A5YD1QwAAd8BwwG5AdQBnQGKA/UG8wHaAakBmAHa
AakBmAHPAY4BeAGzAU8BLQHTAaEBkAPzA/UB1AGcAYkB3wHDAbkDAAGgAb4B3AF/AbIB5QFmAZkBzAF2
AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AFmAZkBzAF/
AbIB5QGgAb4B3AMAAtsB1AL9AfkB2QGkAVwB/wHEAW8B/wHIAXMB3gGwAWcB/wHOAXkB/wHSAX0B5AG+
AXIB/wHYAYMB7QHkAagB4gHmAbYB0AHXAa0C/QH5AtsB1A8AA9cDmQP6BgAD+gOZA9cPAAH5AfgB9wHL
AXsBYAHyAd8B2QP4A/cBwQFdATsBwQFdATsBwQFdATsBwQFdATsB6QHQAcgD+AHyAd8B2QHLAXsBYAH5
AfgB9wMAAaMBwAHeAWsBngHRAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHd
AXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAWsBngHRAaMBwAHeAwAC3QHVAv4B/AHaAaMBWgH/Ab8BawH/
AcIBbgHeAawBYgH/AckBdAH/Ac0BeAHjAbkBbgH/AdMBfgH/AdcBgwH8Ad4BlQHsAcoBfAL+AfwC3QHV
EgAD2AOdBgADnQPYFQAB7gHgAdsB2AGEAWgB9gHjAdwD/Az7A/wB9gHjAdwB2AGEAWgB7gHgAdsGAAGm
AcMB4AGgAdMB+gGYAcsB9QGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGT
AcYB8wGTAcYB8wGYAcsB9QGgAdMB+gGmAcMB4AMAAt4B1wL/Af4B2wGhAVgB2wGiAVkB2wGkAVsB2wGl
AV0B2wGpAWAB2wGsAWMB2wGvAWYB2wGxAWgB2wG0AWsB2wG3AW4B2wG5AXEC/wH+At4B1zwAAfAB4gHd
AeQBlAF4Ae8BtwGkAfoB5AHdAf4B+QH3Af4B+QH3AfoB5AHdAe8BtwGkAeQBlAF4AfAB4gHdCQAB6AHt
AfMBqAHEAeEBlwHKAfUBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHF
AfMBkgHFAfMBlwHKAfUBqAHEAeEB6AHtAfMDAALfAdkn/wLfAdk/AAH6AvgB7wHSAcgB7AGoAZIB7AGO
AW4B7AGOAW4B7AGoAZIB7wHSAcgB+gL4DwAB6AHtAfMBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHF
AeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIB6AHtAfMGAALqAeYC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuoB5sMAA/sD8QGVAa8BvAFo
AZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgGV
Aa8BvAPxA/sVABL4A/kD/TMAA/wD+ST4A/kD/AP9A/oBdwGoAcEBhgHPAfABgQHLAe0BgQHLAe0BgQHL
Ae0BgQHLAe0BgQHLAe0BgQHLAe0BhgHPAfABSwGPAbEBhgHPAfABdwGoAcEB3AHiAeUG/QP5DPgD8wGJ
AaUBjwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwGUAa0BmQYAA8ADLAPAAwAD+xv4
A/sD9wGTAaYBugFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFg
AYgBrwFgAYgBrwFgAYgBrwFgAYgBrwGTAaYBugP3BgABhgG1Ac0BhAHOAe4BfAHHAegBfAHHAegBfAHH
AegBfAHHAegBfAHHAegBfAHHAegBhAHOAe4BVwGbAb0BhAHOAe4B9AG2AS4BhgG1Ac0DAAKUAbgCVQGj
AlUBowJVAaMCVQGjAlUBowJVAaMBVQF6AYkBNQG9AXkBQwHLAYcBPgHGAYIBPgHGAYIBPgHGAYIBQwHL
AYcBVQGgAXAGAANAAWcCVgNAAwAD+wNhA14DXANZA1QDSQM8Ay8DbAP7AwABcgGYAb8BewGuAeABegGt
Ad8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BewGu
AeABcgGYAb8JAAGRAb4B1AGHAdAB7wF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QGH
AdAB7wFfAaMBxQGHAdAB7wH+AckBQQGRAb4B1AMAAlUBtAEvAR4B3AElARMB2AElARMB2AElARMB2AEl
ARMB2AElARMB2AFVAX4BlQE3Ab8BewFCAcoBhgE3Ab8BewE3Ab8BewE3Ab8BewFCAcoBhgFVAacBdgYA
A8sDVQPLJwABhAGnAcsBgQG0AeQBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGw
AeEBfQGwAeEBfQGwAeEBfQGwAeEBgQG0AeQBhAGnAcsJAAGUAcAB1gGKAdMB8AGCAc0B6wGCAc0B6wGC
Ac0B6wGCAc0B6wGCAc0B6wGCAc0B6wGKAdMB8AFiAaYByAGKAdMB8ALpAdsBlAHAAdYDAAJVAbkBLQEc
Ad4BFQEAAdUBFQEAAdUBFQEAAdUBFQEAAdUBFQEAAdUBVQGBAZoBOwHDAX8BSAHPAYwBOwHDAX8BOwHD
AX8BOwHDAX8BSAHPAYwBVQGtAXs2AAGKAa0BzwGIAbsB6gGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGC
AbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGIAbsB6gGKAa0BzwkAAZgBwwHYAY4B1gHy
AYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAY4B1gHyAWYBqgHMAY4B1gHyAvAB5gGY
AcMB2AMAAlUBvwE2ASUB5AEZAQAB2wEZAQAB2wEZAQAB2wEZAQAB2wEZAQAB2wFVAYQBoAE+AcYBggFN
AdUBkQE+AcYBggE+AcYBggE+AcYBggFNAdUBkQFVAbMBgDYAAY4BsAHRAY8BwgHuAYcBugHpAYcBugHp
AYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAY8BwgHuAY4BsAHR
CQABmwHGAdoBkgHaAfQBiwHUAfABiwHUAfABiwHUAfABiwHUAfABiwHUAfABiwHUAfABkgHaAfQBaQGt
Ac8BkgHaAfQC+AHzAZsBxgHaAwACVQHEAT4BLQHsARwBAAHjARwBAAHjARwBAAHjARwBAAHjARwBAAHj
AVUBhgGkAUIBygGGAVEB2QGVAUIBygGGAUIBygGGAUIBygGGAVEB2QGVAVUBuQGEBgAD0ANnA9AnAAGT
AbQB1AGWAckB8gGMAb8B7AGMAb8B7AGMAb8B7AFEAXcBqgGMAb8B7AFEAXcBqgGMAb8B7AGMAb8B7AGM
Ab8B7AGMAb8B7AGWAckB8gGTAbQB1AkAAZ8ByAHdAZcB3gH2AZAB2AHyAZAB2AHyAZAB2AHyAZAB2AHy
AZAB2AHyAZAB2AHyAZcB3gH2AXkBvQHcAXgBvQHcAv4B/QGfAcgB3QMAAlUByAFGATUB8gEgAQAB6QEg
AQAB6QEgAQAB6QEgAQAB6QEgAQAB6QFVAYkBqAFEAcwBiAFlAe0BqQFlAe0BqQFlAe0BqQFlAe0BqQFY
AdYBlgF/AcsBpAYAA2wBbwJpA2wGAAN1A3QDcQNuA2wDaANlA2MDYAYAAZgBuAHXAZsBzgH2AZEBxAHw
AZEBxAHwAZEBxAHwAVUBiAG7AUQBdwGqAVUBiAG7AUABcwGmAZEBxAHwAZEBxAHwAZEBxAHwAZsBzgH2
AZgBuAHXCQABogHKAd4BmwHhAfcBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHb
AfQBngHkAfkBfAHAAd4BogHKAd4B7gHzAfUDAAJ/AdUBYgFhAecBdgF1Af4BdgF1Af4BeQFiAaMBewFQ
AVUBewFQAVUBagFZAT8BagFuATIBagFuATIBYQGLAVEBVQHBAYoBVQHBAYoBVQHBAYoB4gHvAegGAAPT
A3ED0ycAAZsBugHZAZ8B0gH5AZUByAHzAZUByAHzAZUByAHzAVUBiAG7AVUBiAG7AVUBiAG7AU0BgAGz
AZUByAHzAZUByAHzAZUByAHzAZ8B0gH5AZsBugHZCQABpQHNAeABngHlAfkBmAHfAfYBmAHfAfYBmAHf
AfYBmAHfAfYBmAHfAfYBmAHfAfYBmAHfAfYBmAHfAfYBoQHoAfoBpQHNAeAGAALiAfECVQHOAlUBzgJV
Ac4BbQFTAXUB3AGpATIB1wGkAS0B1wGkAS0B1wGkAS0B3AGpATIBsAGGAUhCAAGfAb0B2wGpAdsB/gGq
Ad0B/wGqAd0B/wGqAd0B/wF3AaoB3QF3AaoB3QF3AaoB3QFmAZkBzAGqAd0B/wGqAd0B/wGqAd0B/wGp
AdsB/gGfAb0B2wkAAagBzgHiAaMB6AH7AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5
AZ0B4wH5AZ0B4wH5AaMB6AH7AagBzgHiEgABtgGLAUUB3AGpATIB0QGeAScB0QGeAScB0QGeAScB3AGp
ATIBtgGLAUVCAAHHAdcB5wGIAbYB4gGAAbMB5gGAAbMB5gGAAbMB5gFOAYEBtAFOAYEBtAFOAYEBtAFI
AXsBrgGAAbMB5gGAAbMB5gGAAbMB5gGIAbYB4gHHAdcB5wkAAasB0AHjAaYB6wH8AaEB5gH7AaEB5gH7
AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaYB6wH8AasB0AHjEgABuwGQAUEB4QGu
ATgB1gGjASwB1gGjASwB1gGjASwB4QGuATgBuwGQAUESAAPXA30D1ycAAeMB6gHxAY4BuAHhAYkBvAHv
AYgBuwHuAYgBuwHuAUEBdAGnAUEBdAGnAUEBdAGnAT4BcQGkAYgBuwHuAYgBuwHuAYkBvAHvAY4BuAHh
AeMB6gHxCQABrgHSAeQBqQHuAf0BpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHp
AfwBpAHpAfwBqQHuAf0BrgHSAeQSAAHAAZUBPwHnAbQBPQHaAacBMAHaAacBMAHaAacBMAHnAbQBPQHA
AZUBPxIAA38DdwN/BgADggOBA38DfgN8A3oDeQN2A6sGAAH1AfcB+QGbAb4B3wGJAbwB7wGIAbsB7gGI
AbsB7gE1AWgBmwE1AWgBmwE1AWgBmwE1AWgBmwGIAbsB7gGIAbsB7gGJAbwB7wGbAb4B3wH1AfcB+QkA
AbAB1AHmAawB8QH/AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+
AawB8QH/AbAB1AHmEgABxgGaAT0B6wG4AUEB3QGqATMB3QGqATMB3QGqATMB6wG4AUEBxgGaAT0SAAPY
A4ID2CcAA/4BywHaAeoBqQHFAeIBqQHFAeIBqQHFAeIBVQF9AaYBVQF9AaYBVQF9AaYBVQF9AaYBqQHF
AeIBqQHFAeIBqQHFAeIBywHaAeoD/gkAAbIB1QHmAbEB9QH/Aa4B8gH/Aa4B8gH/Aa4B8gH/Aa4B8gH/
Aa4B8gH/Aa4B8gH/Aa4B8gH/Aa4B8gH/AbEB9QH/AbIB1QHmEgAB1AGzAWwB5wG4AUYB/gHLAVQB/gHL
AVQB/gHLAVQB5wG4AUYB1AGzAWx1AAHQAeQB7gGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGz
AdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wHQAeQB7hIAAfAB6wHeAc0BoAE5Ac0BoAE5Ac0BoAE5
Ac0BoAE5Ac0BoAE5AfAB6wHeDwAD+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsAK4AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4
AbACyAHDA/ED+2AAA/0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4
C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oD/WYAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4
AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwWwA
As8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAAD/gP8BvkD+gb8A/sG+QP8A/4GAAP9A/wD+h74
A/oD/AP9BgAC0AHIAv8B/gL9AfwC/QH7Ab8BSAGuAewBzgHlAvoB9gL4AfQC9wHyAvYB8AL6AfMC0AHI
DAAC0AHIAv8B/gL9AfwB6QHPAesBrgFIAb8BrgFIAb8BrgFIAb8B0wGhAdoC9wHyAvYB8AL6AfMC0AHI
DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+BgAD/QOEAzQDhAP4A+IGNAOEA+IDdQOkA/gDhAM0A+kGAALS
AcsC/gP9AfsC/AH5AcYBTwG1AewBzwHlAvgB9AL3AfIC9gHwAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7
AeoB0QHtAbUBTwHGAvoB9gHnAc4B6AG1AU8BxgHuAeEB6wL1Ae4C+gHyAtIByxIAA8sDdQP4BgAD+AN1
A8sSAAN5A/UGAAOqA3kGAAPLA74D7gOqA8IJAALVAc0C/gP8AfkC+wH4Ac4BVwG9Ac4BVwG9Ac4BVwG9
AeIBpgHWAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QHrAdIB7QG9AVcBzgL4AfQC9wHyAb0BVwHO
AecBzQHlAvQB7AL5Ae8C1QHNDwADzgN/A/kMAAP5A38Dzg8AA8YMYAPGBgAD9QlgA+kJAALWAc4C/QP7
AfgC+gH2AdYBXwHFAe8B0QHmAvYB8AL1Ae4C9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AewB0wHu
AcUBXwHWAvcB8gHqAdEB6gHFAV8B1gHtAeEB6QLxAecC9wHqAtYBzgwAA9ADhgP5EgAD+QOGA9AMAAP1
A5QD7wPRA2gD9QkAA5MD7wNoDAAC2AHQAv0D+gH2AvgB9AHcAWUBywHcAWUBywHcAWUBywHiAYkB0wLx
AecC7AHfAvQB5QLYAdAMAALYAdAC/QP6AfYB7QHTAe4BywFlAdwBywFlAdwBywFlAdwB3wGsAeMC8QHn
AuwB3wL0AeUC2AHQCQAD7wNsA+8YAAPvA2wD7wwAA48D9gO3A48MAAPMA30DzAwAAtoB0gL8A/gB9AL3
AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAA9QDkQP5EgAD+QORA9QPAAPOA9UDdwPODAAD7AN3A+wMAALb
AdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHw
AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMPAAPVA5YD+QwAA/kDlgPVEgAD9gOiA34D9iEA
AtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1RIAA9cDmQP6BgAD+gOZA9cYAAacJAAC3QHW
AvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwBUAA9gDnQYAA50D2EUAAt4B1wL6AfMC9AHs
AvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQCtgGlA/8C3gHXAvcB9mwAAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGx
At8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2bwAC6gHm
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC9wH2bAAD+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsAK4AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4
AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACyAHD
A/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACyAHDA/ED+wP9
A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7
Av0B+gL8AfgC/gH5AsABuAP6A/1mAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJ
AcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcFsAALPAccD/wP+Av0B/AL9
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
AvgB9AL3AfIC+wH1As8BxwwAA/4D/Ab5A/oG/AP7BvkD/AP+BgAD/QP8A/oe+AP6A/wD/QYAAtAByAL/
Af4C/QH8Av0B+wG/AUgBrgHsAc4B5QL6AfYC+AH0AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8
AekBzwHrAa4BSAG/Aa4BSAG/Aa4BSAG/AdMBoQHaAvcB8gL2AfAC+gHzAtAByAwAA/4D/AP5A7MDXAb8
A1wDtAP5A/wD/gYAA/0DhAM0A4QD+APiBjQDhAPiA3UDpAP4A4QDNAPpBgAC0gHLAv4D/QH7AvwB+QHG
AU8BtQHsAc8B5QL4AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wHqAdEB7QG1AU8BxgL6
AfYB5wHOAegBtQFPAcYB7gHhAesC9QHuAvoB8gLSAcsSAAPLA3UD+AYAA/gDdQPLEgADeQP1BgADqgN5
BgADywO+A+4DqgPCCQAC1QHNAv4D/AH5AvsB+AHOAVcBvQHOAVcBvQHOAVcBvQHiAaYB1gL1Ae4C9AHs
AvkB7wLVAc0MAALVAc0C/gP8AfkB6wHSAe0BvQFXAc4C+AH0AvcB8gG9AVcBzgHnAc0B5QL0AewC+QHv
AtUBzQ8AA84DfwP5DAAD+QN/A84PAAPGDGADxgYAA/UJYAPpCQAC1gHOAv0D+wH4AvoB9gHWAV8BxQHv
AdEB5gL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AHsAdMB7gHFAV8B1gL3AfIB6gHR
AeoBxQFfAdYB7QHhAekC8QHnAvcB6gLWAc4MAAPQA4YD+RIAA/kDhgPQDAAD9QOUA+8D0QNoA/UJAAOT
A+8DaAwAAtgB0AL9A/oB9gL4AfQB3AFlAcsB3AFlAcsB3AFlAcsB4gGJAdMC8QHnAuwB3wL0AeUC2AHQ
DAAC2AHQAv0D+gH2Ae0B0wHuAcsBZQHcAcsBZQHcAcsBZQHcAd8BrAHjAvEB5wLsAd8C9AHlAtgB0AkA
A+8DbAPvGAAD7wNsA+8MAAOPA/YDtwOPDAADzAN9A8wMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHs
AvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AvMB4gLaAdIMAAPUA5ED+RIAA/kDkQPUDwADzgPVA3cDzgwAA+wDdwPsDAAC2wHTAvwD9wHyAvYB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
Ad8C6AHZAuYB1QLyAeEC2wHTDwAD1QOWA/kMAAP5A5YD1RIAA/YDogN+A/YhAALcAdUC+wP2AfAC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHf
AugB2QLmAdUC5QHUAvIB4QLcAdUSAAPXA5kD+gYAA/oDmQPXGAAGnCQAAt0B1gL6AfQC9QHuAvQB7ALx
AecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AuYB1QKkAZMCpAGTAqQBkwLJAcAVAAPYA50GAAOdA9hFAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLm
AdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/
At4B1wL3AfZsAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZ
AvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9m8AAuoB5gLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AvcB9mwAA/sD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPx
BvsD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLI
AcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGw
ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/sD/QP6AsABuAv/A/4B/QL+
AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLA
AbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+
AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6A/0GAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0
AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+
Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6
AfYC+AH0AvsB9gLJAcEMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHH
Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9
A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oD/QYAAskBwQb/A/4C/QH8Av0B+wL8
AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2
AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8
Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4
AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHH
DAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8
Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6
AfYC+AH0AvcB8gL7AfUCzwHHDAAC0AHIAv8B/gL9AfwB3AHPAesBewFIAb8BewFIAb8BewFIAb8BiwFe
AcYB6AHhAesC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBggHCAbQBWQGuAZ0BWQGuAZ0BqQHT
AcgC9wHyAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7Ad4BogGpAb8BSAFZAb8BSAFZAdwBoAGm
AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wG/AXsBSAG/AXsBSAG/AXsBSAHcAboBngL3
AfIC9gHwAvoB8wLQAcgMAALSAcsC/gP9AfsB3QHRAe0BggFPAcYC+gH2AvgB9AGCAU8BxgHZAcwB5QL1
Ae4C+gHyAtIBywwAAtIBywL+A/0B+wL8AfkC+wH4AvoB9gHSAegB4AFgAbUBpAL2AfAC9QHuAvoB8gLS
AcsMAALSAcsC/gP9AfsC/AH5AvsB+AHgAaUBqwHTAXoBhQL3AfIC9gHwAvUB7gL6AfIC0gHLDAAC0gHL
Av4D/QH7AvwB+QHGAYIBTwHsAdsBzAL4AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtUBzQL+A/wB+QHf
AdIB7QGKAVcBzgGYAWwB0wGKAVcBzgGlAX8B1wHnAeEB6QL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7
AfgBsgHcAdIBaAG9AawBaAG9AawBrgHZAc0C9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5AvsB+AL6
AfYB4wGoAa4B2QF/AYsC9gHwAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgBzgGKAVcB7gHd
AcwC9wHyAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALWAc4C/QP7AfgB4AHTAe4BkgFfAdYC9wHyAd0B0AHp
AZIBXwHWAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYBcAHFAbQB1QHrAeIC9gHwAvUB7gL0
AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AvgB9AHnAasBsQHeAYUBkAL1Ae4C9AHsAvEB5wL3
AeoC1gHODAAC1gHOAv0D+wH4AvoB9gHWAZIBXwHvAd4BzQL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwA
AtgB0AL9A/oB9gHgAdMB7gGYAWUB3AGYAWUB3AGYAWUB3AHFAawB4wLxAecC7AHfAvQB5QLYAdAMAALY
AdAC/QP6AfYC+AH0AbcB4QHVAXYBywG6AXYBywG6AZUB1QHGAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9
A/oB9gL4AfQB6gGvAbQB3AFlAXYB3AFlAXYB6AGsAbEC8QHnAuwB3wL0AeUC2AHQDAAC2AHQAv0D+gH2
AvgB9AHcAZgBZQHvAd4BzQL1Ae4C9AHsAvEB5wLsAd8C9AHlAtgB0AwAAtoB0gL8A/gB9AL3AfIC9gHw
AvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHn
AuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHi
AtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtsB0wL8
A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf
AugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHh
AtsB0wwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7
A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHs
AvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQC8gHhAtwB1QwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKk
AZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALd
AdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3gHXAvoB8wL0AewC8QHnAuwB3wLo
AdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2
AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2
DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3wHZAvwB9QL5
Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALQAcgC/wH+Av0B/AHcAc8B6wF7AUgBvwF7
AUgBvwF7AUgBvwGLAV4BxgHoAeEB6wL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wGCAcIBtAFZ
Aa4BnQFZAa4BnQGpAdMByAL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsB3gGiAakBvwFI
AVkBvwFIAVkB3AGgAaYC9wHyAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7Ab8BewFIAb8BewFI
Ab8BewFIAdwBugGeAvcB8gL2AfAC+gHzAtAByAwAAtIBywL+A/0B+wHdAdEB7QGCAU8BxgL6AfYC+AH0
AYIBTwHGAdkBzAHlAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7AvwB+QL7AfgC+gH2AdIB6AHgAWABtQGk
AvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wL8AfkC+wH4AeABpQGrAdMBegGFAvcB8gL2AfAC9QHu
AvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AcYBggFPAewB2wHMAvgB9AL3AfIC9gHwAvUB7gL6AfIC0gHL
DAAC1QHNAv4D/AH5Ad8B0gHtAYoBVwHOAZgBbAHTAYoBVwHOAaUBfwHXAecB4QHpAvQB7AL5Ae8C1QHN
DAAC1QHNAv4D/AH5AvsB+AGyAdwB0gFoAb0BrAFoAb0BrAGuAdkBzQL1Ae4C9AHsAvkB7wLVAc0MAALV
Ac0C/gP8AfkC+wH4AvoB9gHjAagBrgHZAX8BiwL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5
AvsB+AHOAYoBVwHuAd0BzAL3AfIC9gHwAvUB7gL0AewC+QHvAtUBzQwAAtYBzgL9A/sB+AHgAdMB7gGS
AV8B1gL3AfIB3QHQAekBkgFfAdYC9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gFwAcUBtAHV
AesB4gL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYC+AH0AecBqwGxAd4BhQGQ
AvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AdYBkgFfAe8B3gHNAvYB8AL1Ae4C9AHs
AvEB5wL3AeoC1gHODAAC2AHQAv0D+gH2AeAB0wHuAZgBZQHcAZgBZQHcAZgBZQHcAcUBrAHjAvEB5wLs
Ad8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4AfQBtwHhAdUBdgHLAboBdgHLAboBlQHVAcYC8QHnAuwB3wL0
AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AHqAa8BtAHcAWUBdgHcAWUBdgHoAawBsQLxAecC7AHfAvQB5QLY
AdAMAALYAdAC/QP6AfYC+AH0AdwBmAFlAe8B3gHNAvUB7gL0AewC8QHnAuwB3wL0AeUC2AHQDAAC2gHS
AvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2
AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx
AecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLz
AeIC2gHSDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHT
AvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
Ad8C6AHZAuYB1QLyAeEC2wHTDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALy
AeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHV
AvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKk
AZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHA
DAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALeAdcC+gHz
AvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHf
AugB2QLmAdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHU
ArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/At4B1wL3
AfYMAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5
Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHi
AvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLf
AdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAuoB5gLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZ
AuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIA
AuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9gwAAUIBTQE+BwABPgMAASgDAAFA
AwABUAMAAQEBAAEBBQABgAECFgAD/4IAAQEBAAEBAv8BwAEDAQABAQEAAQEC/wHAAQMBAAEBAQABAQL/
AeABBwEAAQEBAAEBAcABAwHAAQMBAAEBAQABAQHAAQMBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEB
AeABBwGAAQEBAAEBAQABAQHGAWMBgAEBAQABAQEAAQEBjgFxAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEB
AQABAQHgAQcBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAfkBnwHAAQMBAAEBAQABAQL/AeABBwEA
AQEBAAEBAv8B8AEPAYABAwEAAQEI/wIAAf4BAQL/BQABAQGIAwABwAEBAQABAQGIAQABgAEBAcABAQEA
AQEBjwH/AYABAQHAAQEBAAEBAv8BgAEBAcABAQEAAQEC/wGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEA
AQEBjAEBAYABAQHAAQEBAAEBAY8B/wGAAQEBwAEDAQABHwL/AYABAQHAAQMB8AEfAv8BgAEBAcABAwHw
AR8BjwH/AYABAQHAAQMB8AEfAYwBAQGAAQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8E/wHAAQMB8AEf
BAAE/wQABP8BwAEDAcABAwT/AcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAfEBjwHM
AcEBwAEDAcABAwHjAccBwAHBAcABAwHAAQMBxwHjAcAB4wHAAQMBwAEDAY8B8QHhAeMBwAEDAcABAwHH
AeMB4QHjAcABAwHAAQMB4wHHAeEB/wHAAQMBwAEDAfEBjwHzAf8BwAEDAcABAwH5AZ8C/wHAAQMBwAED
BP8BwAEHAcABBwT/AcABDwHAAQ8E/xAAAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABBwHAAQcBwAEHAcABBwHAAQ8BwAEP
AcABDwHAAQ8L
AdkC9wH2DwAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2DAABQgFN
AT4HAAE+AwABKAMAAUADAAFQAwABAQEAAQEFAAGAAQIWAAP/AQAE/wQABP8EAAT/BAABwAEDAcABAwQA
AcABAwHAAQMEAAHxAY8B8QGPBAAB4AEHAeABBwQAAccBIwHEAeMEAAGMATEBjAHxBAABxAHjAcQB4wQA
AeABBwHgAccEAAHxAY8B8QGPBAAB+QGfAfkBnwQABP8EAAT/BAAE/wUAAQEBAAEBAv8BwAEDAQABAQEA
AQEC/wHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAcABAwHAAQMBAAEBAQABAQHAAQMBgAEBAQABAQEA
AQEB8QGPAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHGAWMBgAEBAQABAQEAAQEBjgFxAYABAQEA
AQEBAAEBAcYBYwGAAQEBAAEBAQABAQHgAQcBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAfkBnwHA
AQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAv8B8AEPAYABAwEAAQEI/wIAAf4BAQL/BQABAQGIAwABwAEB
AQABAQGIAQABgAEBAcABAQEAAQEBjwH/AYABAQHAAQEBAAEBAv8BgAEBAcABAQEAAQEC/wGAAQEBwAEB
AQABAQGPAf8BgAEBAcABAQEAAQEBjAEBAYABAQHAAQEBAAEBAY8B/wGAAQEBwAEDAQABHwL/AYABAQHA
AQMB8AEfAv8BgAEBAcABAwHwAR8BjwH/AYABAQHAAQMB8AEfAYwBAQGAAQEBwAEDAfABHwGPAf8BgAEB
AcABAwHwAR8E/wHAAQMB8AEfBAAE/wQABP8BwAEDAcABAwT/AcABAwHAAQMBwAEDAgABwAEDAcABAwHA
AQMCAAHAAQMBwAEDAfEBjwHMAcEBwAEDAcABAwHjAccBwAHBAcABAwHAAQMBxwHjAcAB4wHAAQMBwAED
AY8B8QHhAeMBwAEDAcABAwHHAeMB4QHjAcABAwHAAQMB4wHHAeEB/wHAAQMBwAEDAfEBjwHzAf8BwAED
AcABAwH5AZ8C/wHAAQMBwAEDBP8BwAEHAcABBwT/AcABDwHAAQ8E/xAAAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABBwHA
AQcBwAEHAcABBwHAAQ8BwAEPAcABDwHAAQ8L
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -665,15 +675,15 @@
<data name="_buttonCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHASURBVDhPrZI/SEJhFMXv2yWKiP4YJIKIQzwnQQJBcBFp
UFrCJmsWKTB5i2AEzjUYRdAWNUgtEQnhIAQhvJC3JC1CIeHSUlCQX/d8foaVSUMXDp/nnN+9Okj/MrFY
bD4ajerKDhxw4JXtTCKRMKBIJDLwCPouq6LOuFwuwzRNEY/HjWAw2PcIcvTgwKv4c3SElmUJ/omG1+v9
cgQeOXq13PdLdLfbbdTrdREOhw0GJYQXHjl6cMh/G3mk0WiIQCBg2O32Bbzwf1mWM8eQx+Mxms2mCIVC
F+VyWcAjV8jPeSSyPRAt3mvaFuu4qGmlDYfDarVaomKzWTfskaMHB16tElls7jRts+X3V1+SyadaNtsW
+byopVLikugZn6XnHD048NiTB0yipYbPZwI6cTpvt4mq77mcOOP3nKiAFx45enDgsScPVDRtv3f5NZ0W
p/yyJIAXHnnvEezJA0WiUjWdbqN8y2TEIb9H3etq4JGjBwcee7LcIdq91vUmrh5wuf5tuTvI0YMDjz1Z
uPlfWiDa4+BqmWiNo1mWizXDsrOmWU6WZ4VoFRx47HEmZ6pHk6xx1ihrmDWkNMIaY02weniiDzfL66dM
bAjUAAAAAElFTkSuQmCC
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHBSURBVDhPrZI/SEJhFMXv2yWKiP4YJIKIQzwnQQJBcBFp
UFrCJmsWKTB5i2AEzjUYRdAWNUgtEQnhIEQhvIi3JC1CIeHSUlCQX/d8foaVSUMXDvfdc373vjc8+peK
xWKz0WhUV2PfAgdeje1KJBIGFIlE+h5B3mGV1S6Xy2WYpini8bgRDAZ7HoGPHBx4ZX+WDtOyLMGfaHi9
3i9HMMNHrpZ7vkR3u91GrVYT4XDYYFBC6JjhIwcH/7eSR+r1uggEAobdbp9Dx/yXZVkzDHk8HqPRaIhQ
KHRWLpcFZvgK+VmPRLYHovl7TdtgHRY1rbTmcFjNZlNUbDbrmmf4yMGBV6tEFg93mrbe9PurL8nkk5nN
tkQ+L25SKXFO9IxnCD5ycOCxJw+YRAt1n88EdOR03m4SVd9zOXHC/ZSogI4ZPnJw4LEnD1Q0bbd7+TWd
FsfcWRJAxwy/+wj25IEiUekynW4hfMtkxD73g851VZjhIwcHHnsy3CLavtL1Bq7ucbj6bblT8JGDA489
Gbj5Ly0Q7bBxsUi0wtY0y8WaYtlZkywny7NEtAwOPPbYkzXRpXHWKGuYNcgaUBpijbDGWF080QcoZeub
/rhQAgAAAABJRU5ErkJggg==
</value>
</data>
<data name="_buttonCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -906,6 +916,16 @@
AgAAAAkEAAAAAAAAAAEAAAAMBQAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkHBAAAAAABAAAA
AAAAAAQdU3lzdGVtLldpbmRvd3MuRm9ybXMuVHJlZU5vZGUFAAAACw==
</value>
</data>
<data name="_buttonAddTagLongArray.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADxSURBVDhPYxi+IIyRkXEalM0AZYdBeIRBBFDDTCAtBuGC
gRhULALCxQ2igArnAGnx1Om338/c9XQ/RBgMxKFyURAuJogBKlgApMVBnPiJV/9N3fEI2QAQABkCUhMD
4SKAAVBiD4iGcBkYwjvP/pu0+e4+KBcZYKiFgUSgxEogLQni+Dce/de7/uZeEBsJSELVJEK4mCAZqGAd
kJb0qN73D4yr9v0umnVuHkgMKpcMUogPpAMVbgPS0hAuGEhDxdIhXOyABYh5gRgUiI1AfByI+YCYH8pu
AGIJKB+kFgMgGwAKBxEghhkgDBXDa8CQBAwMAHEvNbCJ+DaqAAAAAElFTkSuQmCC
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View file

@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Windows

View file

@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
using System.Windows.Forms;
using NBTExplorer.Model;
namespace NBTExplorer.Windows
{

View file

@ -0,0 +1,44 @@
using System;
using System.Text.RegularExpressions;
using Substrate.Core;
namespace NBTExplorer.Model
{
public class CubicRegionFile : RegionFile
{
private static Regex _namePattern = new Regex("r2\\.(-?[0-9]+)\\.(-?[0-9]+)\\.(-?[0-9]+)\\.mc[ar]$");
private const int _sectorBytes = 256;
private static byte[] _emptySector = new byte[_sectorBytes];
public CubicRegionFile (string path)
: base(path)
{ }
protected override int SectorBytes
{
get { return _sectorBytes; }
}
protected override byte[] EmptySector
{
get { return _emptySector; }
}
public override RegionKey parseCoordinatesFromName ()
{
int x = 0;
int z = 0;
Match match = _namePattern.Match(fileName);
if (!match.Success) {
return RegionKey.InvalidRegion;
}
x = Convert.ToInt32(match.Groups[1].Value);
z = Convert.ToInt32(match.Groups[3].Value);
return new RegionKey(x, z);
}
}
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTExplorer.Utility;
namespace NBTExplorer.Model
{

View file

@ -0,0 +1,66 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
private Action<bool> _modifyHandler;
public ListTagContainer (TagNodeList tag, Action<bool> modifyHandler)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
bool result = _tag.Remove(tag);
if (result)
SetModified();
return result;
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Insert(index, tag);
SetModified();
return true;
}
public bool AppendTag (TagNode tag)
{
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Add(tag);
SetModified();
return true;
}
private void SetModified ()
{
if (_modifyHandler != null)
_modifyHandler(true);
}
}
}

View file

@ -1,6 +1,7 @@
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using NBTModel.Interop;
namespace NBTExplorer.Model
{
@ -90,7 +91,7 @@ namespace NBTExplorer.Model
Release();
RestoreExpandSet(this, expandSet);
return true;
return expandSet != null;
}
}
}

View file

@ -65,6 +65,11 @@ namespace NBTExplorer.Model
internal set { _parent = value; }
}
public DataNode Root
{
get { return (_parent == null) ? this : _parent.Root; }
}
public DataNodeCollection Nodes
{
get { return _children; }
@ -214,10 +219,7 @@ namespace NBTExplorer.Model
foreach (DataNode child in node.Nodes) {
Dictionary<string, object> childDict = BuildExpandSet(child);
if (childDict != null) {
if (!String.IsNullOrEmpty(child.NodeName))
dict[child.NodeName] = childDict;
else
dict[child.NodeDisplay] = childDict;
dict[child.NodePathName] = childDict;
}
}
@ -226,16 +228,14 @@ namespace NBTExplorer.Model
protected void RestoreExpandSet (DataNode node, Dictionary<string, object> expandSet)
{
if (expandSet == null)
return;
node.Expand();
foreach (DataNode child in node.Nodes) {
if (expandSet.ContainsKey(child.NodeName)) {
Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodeName];
if (childDict != null)
RestoreExpandSet(child, childDict);
}
else if (expandSet.ContainsKey(child.NodeDisplay)) {
Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodeDisplay];
if (expandSet.ContainsKey(child.NodePathName)) {
Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodePathName];
if (childDict != null)
RestoreExpandSet(child, childDict);
}

View file

@ -22,13 +22,18 @@ namespace NBTExplorer.Model
}
}
public string NodeDirPath
{
get { return _path; }
}
public override string NodePathName
{
get
{
string path = (_path.EndsWith("/") || _path.EndsWith("\\")) ? _path : _path + '/';
string name = Path.GetDirectoryName(path);
string name = Path.GetDirectoryName(path) ?? path.Substring(0, path.Length - 1);
int sepIndex = Math.Max(name.LastIndexOf('/'), name.LastIndexOf('\\'));
return (sepIndex > 0) ? name.Substring(sepIndex + 1) : name;
@ -79,7 +84,7 @@ namespace NBTExplorer.Model
Release();
RestoreExpandSet(this, expandSet);
return true;
return expandSet != null;
}
}
}

View file

@ -4,6 +4,7 @@ using Substrate.Core;
using Substrate.Nbt;
using System.Collections.Generic;
using System;
using NBTModel.Interop;
namespace NBTExplorer.Model
{
@ -15,7 +16,7 @@ namespace NBTExplorer.Model
private CompoundTagContainer _container;
private static Regex _namePattern = new Regex(@"\.(dat|nbt|schematic)$");
private static Regex _namePattern = new Regex(@"\.(dat|nbt|schematic|dat_mcr|dat_old|bpt|rc)$");
private NbtFileDataNode (string path, CompressionType compressionType)
{
@ -144,7 +145,7 @@ namespace NBTExplorer.Model
Release();
RestoreExpandSet(this, expandSet);
return true;
return expandSet != null;
}
public override bool CanRenameNode

View file

@ -31,13 +31,19 @@ namespace NBTExplorer.Model
get { return _z; }
}
protected RegionFileDataNode RegionParent
{
get { return Parent as RegionFileDataNode; }
}
protected override NodeCapabilities Capabilities
{
get
{
return NodeCapabilities.CreateTag
| NodeCapabilities.PasteInto
| NodeCapabilities.Search;
| NodeCapabilities.Search
| NodeCapabilities.Delete;
}
}
@ -53,7 +59,15 @@ namespace NBTExplorer.Model
public override string NodeDisplay
{
get { return "Chunk [" + _x + ", " + _z + "]"; }
get
{
RegionKey key = _regionFile.parseCoordinatesFromName();
string absChunk = "";
if (key != RegionKey.InvalidRegion)
absChunk = " in world at (" + (key.X * 32 + _x) + ", " + (key.Z * 32 + _z) + ")";
return "Chunk [" + _x + ", " + _z + "]" + absChunk;
}
}
protected override void ExpandCore ()
@ -91,6 +105,17 @@ namespace NBTExplorer.Model
get { return true; }
}
public override bool DeleteNode ()
{
if (CanDeleteNode && _regionFile.HasChunk(_x, _z)) {
RegionParent.QueueDeleteChunk(_x, _z);
IsParentModified = true;
return Parent.Nodes.Remove(this);
}
return false;
}
public bool IsNamedContainer
{
get { return true; }

View file

@ -2,6 +2,8 @@
using System.Text.RegularExpressions;
using Substrate.Core;
using System.Collections.Generic;
using NBTModel.Interop;
using System;
namespace NBTExplorer.Model
{
@ -9,6 +11,7 @@ namespace NBTExplorer.Model
{
private string _path;
private RegionFile _region;
private List<RegionKey> _deleteQueue = new List<RegionKey>();
private static Regex _namePattern = new Regex(@"^r\.(-?\d+)\.(-?\d+)\.(mcr|mca)$");
@ -85,7 +88,7 @@ namespace NBTExplorer.Model
}
}
}
catch {
catch (Exception e) {
if (FormRegistry.MessageBox != null)
FormRegistry.MessageBox("Not a valid region file.");
}
@ -99,13 +102,30 @@ namespace NBTExplorer.Model
Nodes.Clear();
}
protected override void SaveCore ()
{
foreach (RegionKey key in _deleteQueue) {
if (_region.HasChunk(key.X, key.Z))
_region.DeleteChunk(key.X, key.Z);
}
_deleteQueue.Clear();
}
public override bool RefreshNode ()
{
Dictionary<string, object> expandSet = BuildExpandSet(this);
Release();
RestoreExpandSet(this, expandSet);
return true;
return expandSet != null;
}
public void QueueDeleteChunk (int rx, int rz)
{
RegionKey key = new RegionKey(rx, rz);
if (!_deleteQueue.Contains(key))
_deleteQueue.Add(key);
}
}
}

View file

@ -13,6 +13,18 @@ namespace NBTExplorer.Model
get { return base.Tag as TagNodeByte; }
}
public override bool Parse (string value)
{
byte data;
if (!byte.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model
@ -44,6 +45,9 @@ namespace NBTExplorer.Model
return false;
}
public virtual void Clear ()
{ }
#endregion
protected override NodeCapabilities Capabilities
@ -91,7 +95,9 @@ namespace NBTExplorer.Model
_tagRegistry[TagType.TAG_INT_ARRAY] = typeof(TagIntArrayDataNode);
_tagRegistry[TagType.TAG_LIST] = typeof(TagListDataNode);
_tagRegistry[TagType.TAG_LONG] = typeof(TagLongDataNode);
_tagRegistry[TagType.TAG_LONG_ARRAY] = typeof(TagLongArrayDataNode);
_tagRegistry[TagType.TAG_SHORT] = typeof(TagShortDataNode);
_tagRegistry[TagType.TAG_SHORT_ARRAY] = typeof(TagShortArrayDataNode);
_tagRegistry[TagType.TAG_STRING] = typeof(TagStringDataNode);
}
@ -124,8 +130,12 @@ namespace NBTExplorer.Model
return new TagNodeList(TagType.TAG_BYTE);
case TagType.TAG_LONG:
return new TagNodeLong(0);
case TagType.TAG_LONG_ARRAY:
return new TagNodeLongArray(new long[0]);
case TagType.TAG_SHORT:
return new TagNodeShort(0);
case TagType.TAG_SHORT_ARRAY:
return new TagNodeShortArray(new short[0]);
case TagType.TAG_STRING:
return new TagNodeString("");
default:
@ -155,6 +165,11 @@ namespace NBTExplorer.Model
}
}
public virtual bool Parse (string value)
{
return false;
}
protected override NodeCapabilities Capabilities
{
get
@ -348,6 +363,36 @@ namespace NBTExplorer.Model
return false;
}
protected bool EditShortHexValue (TagNode tag)
{
if (FormRegistry.EditByteArray != null) {
TagNodeShortArray iatag = tag.ToTagShortArray();
byte[] byteData = new byte[iatag.Length * 2];
for (int i = 0; i < iatag.Length; i++) {
byte[] buf = BitConverter.GetBytes(iatag.Data[i]);
Array.Copy(buf, 0, byteData, 2 * i, 2);
}
ByteArrayFormData data = new ByteArrayFormData() {
NodeName = NodeName,
BytesPerElement = 2,
Data = byteData,
};
if (FormRegistry.EditByteArray(data)) {
iatag.Data = new short[data.Data.Length / 2];
for (int i = 0; i < iatag.Length; i++) {
iatag.Data[i] = BitConverter.ToInt16(data.Data, i * 2);
}
IsDataModified = true;
return true;
}
}
return false;
}
protected bool EditIntHexValue (TagNode tag)
{
if (FormRegistry.EditByteArray != null) {
@ -378,6 +423,41 @@ namespace NBTExplorer.Model
return false;
}
protected bool EditLongHexValue(TagNode tag)
{
if (FormRegistry.EditByteArray != null)
{
TagNodeLongArray latag = tag.ToTagLongArray();
byte[] byteData = new byte[latag.Length * 8];
for (int i = 0; i < latag.Length; i++)
{
byte[] buf = BitConverter.GetBytes(latag.Data[i]);
Array.Copy(buf, 0, byteData, 8 * i, 8);
}
ByteArrayFormData data = new ByteArrayFormData()
{
NodeName = NodeName,
BytesPerElement = 8,
Data = byteData,
};
if (FormRegistry.EditByteArray(data))
{
latag.Data = new long[data.Data.Length / 8];
for (int i = 0; i < latag.Length; i++)
{
latag.Data[i] = BitConverter.ToInt64(data.Data, i * 8);
}
IsDataModified = true;
return true;
}
}
return false;
}
public virtual void SyncTag ()
{
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
protected new TagNodeDouble Tag
{
get { return base.Tag as TagNodeDouble; }
}
public override bool Parse (string value)
{
double data;
if (!double.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
protected new TagNodeFloat Tag
{
get { return base.Tag as TagNodeFloat; }
}
public override bool Parse (string value)
{
float data;
if (!float.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
protected new TagNodeInt Tag
{
get { return base.Tag as TagNodeInt; }
}
public override bool Parse (string value)
{
int data;
if (!int.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,4 +1,5 @@
using System;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model
@ -10,10 +11,10 @@ namespace NBTExplorer.Model
public TagListDataNode (TagNodeList tag)
: base(tag)
{
_container = new ListTagContainer(tag);
_container = new ListTagContainer(tag, res => IsDataModified = true);
}
protected new TagNodeList Tag
public new TagNodeList Tag
{
get { return base.Tag as TagNodeList; }
set { base.Tag = value; }
@ -45,7 +46,7 @@ namespace NBTExplorer.Model
if (data == null)
return false;
if (data.Node != null && data.Node.GetTagType() == Tag.ValueType)
if (data.Node != null && (data.Node.GetTagType() == Tag.ValueType || Tag.Count == 0))
return true;
}
@ -75,6 +76,10 @@ namespace NBTExplorer.Model
if (clipboard == null || clipboard.Node == null)
return false;
if (Tag.Count == 0) {
Tag.ChangeValueType(clipboard.Node.GetTagType());
}
AppendTag(clipboard.Node);
return true;
}
@ -99,8 +104,22 @@ namespace NBTExplorer.Model
return _container.DeleteTag(tag);
}
private void AppendTag (TagNode tag)
public override void Clear ()
{
if (TagCount == 0)
return;
Nodes.Clear();
Tag.Clear();
IsDataModified = true;
}
public bool AppendTag (TagNode tag)
{
if (tag == null || !CanCreateTag(tag.GetTagType()))
return false;
_container.InsertTag(tag, _container.TagCount);
IsDataModified = true;
@ -109,6 +128,8 @@ namespace NBTExplorer.Model
if (node != null)
Nodes.Add(node);
}
return true;
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongArrayDataNode : TagDataNode
{
public TagLongArrayDataNode(TagNodeLongArray tag)
: base(tag)
{ }
protected new TagNodeLongArray Tag
{
get { return base.Tag as TagNodeLongArray; }
}
public override bool CanEditNode
{
#if WINDOWS
get { return true; }
#else
get { return false; }
#endif
}
public override bool EditNode()
{
return EditLongHexValue(Tag);
}
public override string NodeDisplay
{
get { return NodeDisplayPrefix + Tag.Data.Length + " long integers"; }
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
protected new TagNodeLong Tag
{
get { return base.Tag as TagNodeLong; }
}
public override bool Parse (string value)
{
long data;
if (!long.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortArrayDataNode : TagDataNode
{
public TagShortArrayDataNode (TagNodeShortArray tag)
: base(tag)
{ }
protected new TagNodeShortArray Tag
{
get { return base.Tag as TagNodeShortArray; }
}
public override bool CanEditNode
{
#if WINDOWS
get { return true; }
#else
get { return false; }
#endif
}
public override bool EditNode ()
{
return EditShortHexValue(Tag);
}
public override string NodeDisplay
{
get { return NodeDisplayPrefix + Tag.Data.Length + " shorts"; }
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
protected new TagNodeShort Tag
{
get { return base.Tag as TagNodeShort; }
}
public override bool Parse (string value)
{
short data;
if (!short.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -8,6 +8,19 @@ namespace NBTExplorer.Model
: base(tag)
{ }
protected new TagNodeString Tag
{
get { return base.Tag as TagNodeString; }
}
public override bool Parse (string value)
{
Tag.Data = value;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditStringValue(Tag);

View file

@ -36,5 +36,6 @@ namespace NBTExplorer.Model
{
int GetTagIndex (TagNode tag);
bool InsertTag (TagNode tag, int index);
bool AppendTag (TagNode tag);
}
}

View file

@ -22,7 +22,7 @@ namespace NBTExplorer.Model
if (typeDiff != 0)
return typeDiff;
return String.Compare(x.Name, y.Name, true);
return String.Compare(x.Name, y.Name, false);
}
#endregion

View file

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NBTExplorer.Model
{
class FilterExpressionParser
{
private Stack<string> argStack = new Stack<string>();
/*public bool Parse (DataNode targetNode, List<string> tokens)
{
Queue<string> tokenQueue = new Queue<string>(FilterExpressionConverter.Convert(tokens));
while (tokenQueue.Count > 0) {
string token = tokenQueue.Dequeue();
switch (token) {
case "equal":
}
}
}*/
}
static class FilterExpressionConverter
{
private static List<List<string>> OperatorGroups = new List<List<string>> {
new List<string> { "equal", "greater", "less", "contains", "begins", "ends" },
new List<string> { "not" },
new List<string> { "and", "or" },
};
public static List<string> Convert (List<string> tokens)
{
Queue<string> tokenQueue = new Queue<string>(tokens);
List<string> output = new List<string>();
Stack<string> opStack = new Stack<string>();
while (tokenQueue.Count > 0) {
string token = tokenQueue.Dequeue();
if (IsGroupStart(token)) {
opStack.Push(token);
}
else if (IsGroupEnd(token)) {
while (opStack.Count > 0 && !IsGroupStart(opStack.Peek()))
output.Add(opStack.Pop());
if (opStack.Count == 0)
throw new Exception("Mismatched grouping");
opStack.Pop();
}
else if (IsOperator(token)) {
while (opStack.Count > 0 && IsOperator(opStack.Peek())) {
if (Precedence(token) > Precedence(opStack.Peek()))
output.Add(opStack.Pop());
}
opStack.Push(token);
}
else {
output.Add(token);
}
}
while (opStack.Count > 0) {
if (IsGroupStart(opStack.Peek()))
throw new Exception("Mismatched grouping");
output.Add(opStack.Pop());
}
return output;
}
private static bool IsGroupStart (string token)
{
return token == "(";
}
private static bool IsGroupEnd (string token)
{
return token == ")";
}
private static bool IsOperator (string token)
{
foreach (var group in OperatorGroups) {
if (group.Contains(token))
return true;
}
return false;
}
private static int Precedence (string op) {
for (int i = 0; i < OperatorGroups.Count; i++) {
if (OperatorGroups[i].Contains(op))
return i;
}
return int.MaxValue;
}
}
}

View file

@ -2,7 +2,7 @@
using System.Collections.Generic;
using Substrate.Nbt;
namespace NBTExplorer
namespace NBTModel.Interop
{
public static class FormRegistry
{

View file

@ -1,6 +1,6 @@
using System;
namespace NBTExplorer
namespace NBTModel.Interop
{
public static class NbtClipboardController
{

View file

@ -2,7 +2,7 @@
using System.IO;
using Substrate.Nbt;
namespace NBTExplorer
namespace NBTModel.Interop
{
public class NbtClipboardData
{

88
NBTModel/NBTModel.csproj Normal file
View file

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTExplorer.Model</RootNamespace>
<AssemblyName>NBTModel</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Data\CompoundTagContainer.cs" />
<Compile Include="Data\Nodes\CubicRegionDataNode.cs" />
<Compile Include="Data\CubicRegionFile.cs" />
<Compile Include="Data\Nodes\DataNode.cs" />
<Compile Include="Data\DataNodeCollection.cs" />
<Compile Include="Data\Nodes\DirectoryDataNode.cs" />
<Compile Include="Data\FileTypeRegistry.cs" />
<Compile Include="Data\Nodes\TagLongArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagShortArrayDataNode.cs" />
<Compile Include="FilterExpressionParser.cs" />
<Compile Include="Interop\FormRegistry.cs" />
<Compile Include="Interop\NbtClipboardController.cs" />
<Compile Include="Interop\NbtClipboardData.cs" />
<Compile Include="Data\ListTagContainer.cs" />
<Compile Include="Data\Nodes\NbtFileDataNode.cs" />
<Compile Include="Data\Nodes\NodeCapabilities.cs" />
<Compile Include="NbtPath.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Data\Nodes\RegionChunkDataNode.cs" />
<Compile Include="Data\Nodes\RegionFileDataNode.cs" />
<Compile Include="Search\SearchRule.cs" />
<Compile Include="Data\Nodes\TagByteArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagByteDataNode.cs" />
<Compile Include="Data\Nodes\TagCompoundDataNode.cs" />
<Compile Include="Data\TagContainerInterface.cs" />
<Compile Include="Data\Nodes\TagDataNode.cs" />
<Compile Include="Data\Nodes\TagDoubleDataNode.cs" />
<Compile Include="Data\Nodes\TagFloatDataNode.cs" />
<Compile Include="Data\Nodes\TagIntArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagIntDataNode.cs" />
<Compile Include="Data\TagKey.cs" />
<Compile Include="Data\Nodes\TagListDataNode.cs" />
<Compile Include="Data\Nodes\TagLongDataNode.cs" />
<Compile Include="Data\Nodes\TagShortDataNode.cs" />
<Compile Include="Data\Nodes\TagStringDataNode.cs" />
<Compile Include="Utility\NaturalComparer.cs" />
<Compile Include="Utility\SnapshotList.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

147
NBTModel/NbtPath.cs Normal file
View file

@ -0,0 +1,147 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace NBTExplorer.Model
{
public class NbtPathEnumerator : IEnumerable<DataNode>
{
private class PathPartDesc
{
public string Name;
public DataNode Node;
}
private string _pathRoot;
private List<string> _pathParts = new List<string>();
public NbtPathEnumerator (string path)
{
_pathRoot = Path.GetPathRoot(path);
_pathParts = new List<string>(path.Substring(_pathRoot.Length).Split('/', '\\'));
if (string.IsNullOrEmpty(_pathRoot))
_pathRoot = Directory.GetCurrentDirectory();
}
public IEnumerator<DataNode> GetEnumerator ()
{
DataNode dataNode = new DirectoryDataNode(_pathRoot);
dataNode.Expand();
foreach (DataNode childNode in EnumerateNodes(dataNode, _pathParts))
yield return childNode;
}
IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator();
}
private IEnumerable<DataNode> EnumerateNodes (DataNode containerNode, List<string> nextLevels)
{
containerNode.Expand();
if (nextLevels.Count == 0) {
yield return containerNode;
yield break;
}
if (containerNode.Nodes.Count == 0)
yield break;
string part = nextLevels[0];
List<string> remainingLevels = nextLevels.GetRange(1, nextLevels.Count - 1);
if (part == "*") {
foreach (DataNode childNode in containerNode.Nodes) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
}
}
else if (part == "**") {
foreach (DataNode childNode in containerNode.Nodes) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
foreach (DataNode grandChildNode in EnumerateNodes(childNode, nextLevels))
yield return grandChildNode;
}
}
else {
foreach (var childNode in containerNode.Nodes) {
if (childNode.NodePathName == part) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
}
}
}
}
}
public class NbtPath
{
private class PathPart
{
public string Name;
public DataNode Node;
}
//private List<PathPart> _pathParts = new List<PathPart>();
private List<DataNode> _nodes;
internal NbtPath (List<DataNode> nodes)
{
_nodes = nodes;
}
/*public NbtPath (string path)
{
Path = path;
string[] parts = path.Split('/', '\\');
foreach (var p in parts) {
_pathParts.Add(new PathPart() {
Name = p,
});
}
}
public string Path { get; private set; }
public DataNode RootNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[0].Node; }
}
public DataNode TargetNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[_pathParts.Count - 1].Node; }
}
public DataNode Open ()
{
DataNode dataNode = new DirectoryDataNode(Directory.GetCurrentDirectory());
dataNode.Expand();
foreach (var part in _pathParts) {
DataNode match = null;
foreach (var child in dataNode.Nodes) {
if (child.NodePathName == part.Name)
match = child;
}
if (match == null)
return null;
part.Node = match;
dataNode = match;
dataNode.Expand();
}
return dataNode;
}*/
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTModel")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTModel")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0dd78c98-e4af-4898-a0f5-4ea5675933c8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View file

@ -169,26 +169,30 @@ namespace NBTExplorer.Model.Search
{
TagDataNode childNode = GetChild(container, Name);
T data = LookupTag<T>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) {
case NumericOperator.Equals:
if (data.ToTagLong() != Value)
return false;
break;
case NumericOperator.NotEquals:
if (data.ToTagLong() == Value)
return false;
break;
case NumericOperator.GreaterThan:
if (data.ToTagLong() <= Value)
return false;
break;
case NumericOperator.LessThan:
if (data.ToTagLong() >= Value)
return false;
break;
}
switch (Operator) {
case NumericOperator.Equals:
if (data.ToTagLong() != Value)
return false;
break;
case NumericOperator.NotEquals:
if (data.ToTagLong() == Value)
return false;
break;
case NumericOperator.GreaterThan:
if (data.ToTagLong() <= Value)
return false;
break;
case NumericOperator.LessThan:
if (data.ToTagLong() >= Value)
return false;
break;
case NumericOperator.Any:
break;
default:
return false;
}
if (!matchedNodes.Contains(childNode))
@ -226,26 +230,30 @@ namespace NBTExplorer.Model.Search
{
TagDataNode childNode = GetChild(container, Name);
T data = LookupTag<T>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) {
case NumericOperator.Equals:
if (data.ToTagDouble() != Value)
return false;
break;
case NumericOperator.NotEquals:
if (data.ToTagDouble() == Value)
return false;
break;
case NumericOperator.GreaterThan:
if (data.ToTagDouble() <= Value)
return false;
break;
case NumericOperator.LessThan:
if (data.ToTagDouble() >= Value)
return false;
break;
}
switch (Operator) {
case NumericOperator.Equals:
if (data.ToTagDouble() != Value)
return false;
break;
case NumericOperator.NotEquals:
if (data.ToTagDouble() == Value)
return false;
break;
case NumericOperator.GreaterThan:
if (data.ToTagDouble() <= Value)
return false;
break;
case NumericOperator.LessThan:
if (data.ToTagDouble() >= Value)
return false;
break;
case NumericOperator.Any:
break;
default:
return false;
}
if (!matchedNodes.Contains(childNode))
@ -276,34 +284,38 @@ namespace NBTExplorer.Model.Search
{
TagDataNode childNode = GetChild(container, Name);
TagNodeString data = LookupTag<TagNodeString>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) {
case StringOperator.Equals:
if (data.ToTagString().Data != Value)
return false;
break;
case StringOperator.NotEquals:
if (data.ToTagString().Data == Value)
return false;
break;
case StringOperator.Contains:
if (!data.ToTagString().Data.Contains(Value))
return false;
break;
case StringOperator.NotContains:
if (data.ToTagString().Data.Contains(Value))
return false;
break;
case StringOperator.StartsWith:
if (!data.ToTagString().Data.StartsWith(Value))
return false;
break;
case StringOperator.EndsWith:
if (!data.ToTagString().Data.EndsWith(Value))
return false;
break;
}
switch (Operator) {
case StringOperator.Equals:
if (data.ToTagString().Data != Value)
return false;
break;
case StringOperator.NotEquals:
if (data.ToTagString().Data == Value)
return false;
break;
case StringOperator.Contains:
if (!data.ToTagString().Data.Contains(Value))
return false;
break;
case StringOperator.NotContains:
if (data.ToTagString().Data.Contains(Value))
return false;
break;
case StringOperator.StartsWith:
if (!data.ToTagString().Data.StartsWith(Value))
return false;
break;
case StringOperator.EndsWith:
if (!data.ToTagString().Data.EndsWith(Value))
return false;
break;
case StringOperator.Any:
break;
default:
return false;
}
if (!matchedNodes.Contains(childNode))

View file

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace NBTExplorer.Utility
{
// NaturalComparer implementation by Justin.Jones
// Licensed under The Code Project Open License (CPOL) (http://www.codeproject.com/info/cpol10.aspx)
public class NaturalComparer : Comparer<string>, IDisposable
{
private Dictionary<string, string[]> table;
public NaturalComparer ()
{
table = new Dictionary<string, string[]>();
}
public void Dispose ()
{
table.Clear();
table = null;
}
public override int Compare (string x, string y)
{
if (x == y) {
return 0;
}
string[] x1, y1;
if (!table.TryGetValue(x, out x1)) {
x1 = Regex.Split(x.Replace(" ", ""), "(-?[0-9]+)");
table.Add(x, x1);
}
if (!table.TryGetValue(y, out y1)) {
y1 = Regex.Split(y.Replace(" ", ""), "(-?[0-9]+)");
table.Add(y, y1);
}
for (int i = 0; i < x1.Length && i < y1.Length; i++) {
if (x1[i] != y1[i]) {
return PartCompare(x1[i], y1[i]);
}
}
if (y1.Length > x1.Length) {
return 1;
}
else if (x1.Length > y1.Length) {
return -1;
}
else {
return 0;
}
}
private static int PartCompare (string left, string right)
{
int x, y;
if (!int.TryParse(left, out x)) {
return left.CompareTo(right);
}
if (!int.TryParse(right, out y)) {
return left.CompareTo(right);
}
return x.CompareTo(y);
}
}
}

View file

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
namespace NBTExplorer
namespace NBTExplorer.Utility
{
public class SnapshotState<T> : IDisposable
{

6
NBTUtil/App.config Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/></startup>
</configuration>

81
NBTUtil/ConsoleOptions.cs Normal file
View file

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Text;
using NDesk.Options;
namespace NBTUtil
{
public enum ConsoleCommand
{
None,
Print,
PrintTree,
SetValue,
SetList,
Json,
Help,
}
class ConsoleOptions
{
private OptionSet _options;
private string _currentKey;
//public string FilePath { get; private set; }
//public string TagPath { get; private set; }
public string Path { get; private set; }
public ConsoleCommand Command { get; private set; }
public List<string> Values { get; private set; }
public bool ShowTypes { get; private set; }
public ConsoleOptions ()
{
Command = ConsoleCommand.None;
Values = new List<string>();
_options = new OptionSet() {
{ "path=", "Path to NBT tag from current directory", v => Path = v },
{ "print", "Print the value(s) of a tag", v => Command = ConsoleCommand.Print },
{ "printtree", "Print the NBT tree rooted at a tag", v => Command = ConsoleCommand.PrintTree },
{ "types", "Show data types when printing tags", v => ShowTypes = true },
{ "json=", "Export the NBT tree rooted at a tag as JSON", v => {
Command = ConsoleCommand.Json;
Values.Add(v);
}},
{ "setvalue=", "Set a single tag value", v => {
Command = ConsoleCommand.SetValue;
_currentKey = "setvalue";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "setlist=", "Replace a list tag's contents with one or more values.", v => {
Command = ConsoleCommand.SetList;
_currentKey = "setlist";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "help", "Print this help message", v => Command = ConsoleCommand.Help },
{ "<>", v => {
switch (_currentKey) {
case "setvalue":
case "setlist":
Values.Add(v);
break;
}
}},
};
}
public void Parse (string[] args)
{
_options.Parse(args);
}
public void PrintUsage ()
{
Console.WriteLine("Program Options:");
_options.WriteOptionDescriptions(Console.Out);
}
}
}

130
NBTUtil/ConsoleRunner.cs Normal file
View file

@ -0,0 +1,130 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using NBTExplorer.Model;
using NBTUtil.Ops;
using Substrate.Nbt;
namespace NBTUtil
{
class ConsoleRunner
{
private static readonly Dictionary<ConsoleCommand, ConsoleOperation> _commandTable = new Dictionary<ConsoleCommand, ConsoleOperation>() {
{ ConsoleCommand.SetValue, new EditOperation() },
{ ConsoleCommand.SetList, new SetListOperation() },
{ ConsoleCommand.Print, new PrintOperation() },
{ ConsoleCommand.PrintTree, new PrintTreeOperation() },
{ ConsoleCommand.Json, new JsonOperation() },
};
private ConsoleOptions _options;
public ConsoleRunner ()
{
_options = new ConsoleOptions();
}
public bool Run (string[] args)
{
_options.Parse(args);
if (_options.Command == ConsoleCommand.Help)
return PrintHelp();
if (_options.Path == null)
return PrintUsage("Error: You must specify a path");
if (!_commandTable.ContainsKey(_options.Command))
return PrintUsage("Error: No command specified");
ConsoleOperation op = _commandTable[_options.Command];
if (!op.OptionsValid(_options))
return PrintError("Error: Invalid options specified for the given command");
int successCount = 0;
int failCount = 0;
foreach (var targetNode in new NbtPathEnumerator(_options.Path)) {
if (!op.CanProcess(targetNode)) {
Console.WriteLine(targetNode.NodePath + ": ERROR (invalid command)");
failCount++;
}
if (!op.Process(targetNode, _options)) {
Console.WriteLine(targetNode.NodePath + ": ERROR (apply)");
failCount++;
}
targetNode.Root.Save();
Console.WriteLine(targetNode.NodePath + ": OK");
successCount++;
}
Console.WriteLine("Operation complete. Nodes succeeded: {0} Nodes failed: {1}", successCount, failCount);
return true;
}
private DataNode OpenFile (string path)
{
DataNode node = null;
foreach (var item in FileTypeRegistry.RegisteredTypes) {
if (item.Value.NamePatternTest(path))
node = item.Value.NodeCreate(path);
}
return node;
}
private DataNode ExpandDataNode (DataNode dataNode, string tagPath)
{
string[] pathParts = tagPath.Split('/');
DataNode curTag = dataNode;
curTag.Expand();
foreach (var part in pathParts) {
TagDataNode.Container container = curTag as TagDataNode.Container;
if (curTag == null)
throw new Exception("Invalid tag path");
DataNode childTag = null;
foreach (var child in curTag.Nodes) {
if (child.NodePathName == part)
childTag = child;
}
if (childTag == null)
throw new Exception("Invalid tag path");
curTag.Expand();
}
return curTag;
}
private bool PrintHelp ()
{
Console.WriteLine("NBTUtil - Copyright 2014 Justin Aquadro");
_options.PrintUsage();
return true;
}
private bool PrintUsage (string error)
{
Console.WriteLine(error);
_options.PrintUsage();
return false;
}
private bool PrintError (string error)
{
Console.WriteLine(error);
return false;
}
}
}

82
NBTUtil/NBTUtil.csproj Normal file
View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTUtil</RootNamespace>
<AssemblyName>NBTUtil</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ConsoleOptions.cs" />
<Compile Include="ConsoleRunner.cs" />
<Compile Include="NDesk\Options.cs" />
<Compile Include="Ops\ConsoleOperation.cs" />
<Compile Include="Ops\EditOperation.cs" />
<Compile Include="Ops\JsonOperation.cs" />
<Compile Include="Ops\PrintOperation.cs" />
<Compile Include="Ops\PrintTreeOperation.cs" />
<Compile Include="Ops\SetListOperation.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TypePrinter.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="AfterBuild">
<ItemGroup>
<Staging Include="$(OutputPath)\**\*.dll" />
<Staging Include="$(OutputPath)\**\*.exe" />
<Staging Include="$(OutputPath)\**\*.exe.config" />
</ItemGroup>
<Copy SourceFiles="@(Staging)" DestinationFolder="..\Staging\%(RecursiveDir)" />
</Target>
</Project>

1123
NBTUtil/NDesk/Options.cs Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
abstract class ConsoleOperation
{
public virtual bool OptionsValid (ConsoleOptions options)
{
return true;
}
public abstract bool CanProcess (DataNode dataNode);
public abstract bool Process (DataNode dataNode, ConsoleOptions options);
}
}

View file

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class EditOperation : ConsoleOperation
{
public override bool OptionsValid (ConsoleOptions options)
{
if (options.Values.Count == 0)
return false;
return true;
}
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagDataNode) || !dataNode.CanEditNode)
return false;
if (dataNode is TagByteArrayDataNode || dataNode is TagIntArrayDataNode || dataNode is TagShortArrayDataNode || dataNode is TagLongArrayDataNode)
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
string value = options.Values[0];
TagDataNode tagDataNode = dataNode as TagDataNode;
return tagDataNode.Parse(value);
}
}
}

View file

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using NBTExplorer.Model;
using Substrate.Nbt;
namespace NBTUtil.Ops
{
class JsonOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return dataNode is NbtFileDataNode || dataNode is TagDataNode;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
if (options.Values.Count == 0)
return false;
string jsonPath = options.Values[0];
using (FileStream stream = File.OpenWrite(jsonPath)) {
using (StreamWriter writer = new StreamWriter(stream)) {
if (dataNode is TagDataNode) {
TagDataNode tagNode = dataNode as TagDataNode;
WriteNbtTag(writer, tagNode.Tag);
}
else if (dataNode is NbtFileDataNode) {
dataNode.Expand();
TagNodeCompound root = new TagNodeCompound();
foreach (DataNode child in dataNode.Nodes) {
TagDataNode childTagNode = child as TagDataNode;
if (childTagNode == null)
continue;
if (childTagNode.Tag != null)
root.Add(childTagNode.NodeName, childTagNode.Tag);
}
WriteNbtTag(writer, root);
}
}
}
return true;
}
private void WriteNbtTag (StreamWriter writer, TagNode tag)
{
if (tag == null)
return;
writer.Write(JSONSerializer.Serialize(tag));
}
}
}

View file

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
Console.WriteLine(TypePrinter.Print(dataNode, options.ShowTypes));
if (dataNode.IsContainerType) {
foreach (var child in dataNode.Nodes)
Console.WriteLine(" | " + TypePrinter.Print(child, options.ShowTypes));
}
return true;
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintTreeOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
PrintSubTree(dataNode, options, "", true);
return true;
}
private void PrintSubTree (DataNode dataNode, ConsoleOptions options, string indent, bool last)
{
Console.WriteLine(indent + " + " + TypePrinter.Print(dataNode, options.ShowTypes));
indent += last ? " " : " |";
int cnt = 0;
dataNode.Expand();
foreach (DataNode child in dataNode.Nodes) {
cnt++;
PrintSubTree(child, options, indent, cnt == dataNode.Nodes.Count);
}
}
}
}

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
using Substrate.Nbt;
namespace NBTUtil.Ops
{
class SetListOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagListDataNode))
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
TagListDataNode listNode = dataNode as TagListDataNode;
listNode.Clear();
foreach (string value in options.Values) {
TagNode tag = TagDataNode.DefaultTag(listNode.Tag.ValueType);
TagDataNode tagData = TagDataNode.CreateFromTag(tag);
if (!tagData.Parse(value))
return false;
if (!listNode.AppendTag(tagData.Tag))
return false;
}
return true;
}
}
}

15
NBTUtil/Program.cs Normal file
View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NBTUtil
{
class Program
{
static void Main (string[] args)
{
ConsoleRunner runner = new ConsoleRunner();
runner.Run(args);
}
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTUtil")]
[assembly: AssemblyDescription("A command-line utility to inspect and modify NBT data.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTUtil")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("14c36789-324a-4cbf-8cb4-1f2bd711a631")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]

42
NBTUtil/TypePrinter.cs Normal file
View file

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil
{
static class TypePrinter
{
private static Dictionary<Type, string> _key = new Dictionary<Type, string>() {
{ typeof(TagByteDataNode), "b" },
{ typeof(TagShortDataNode), "s" },
{ typeof(TagIntDataNode), "i" },
{ typeof(TagLongDataNode), "l" },
{ typeof(TagFloatDataNode), "f" },
{ typeof(TagDoubleDataNode), "d" },
{ typeof(TagStringDataNode), "T" },
{ typeof(TagByteArrayDataNode), "B" },
{ typeof(TagIntArrayDataNode), "I" },
{ typeof(TagShortArrayDataNode), "S" },
{ typeof(TagLongArrayDataNode), "L" },
{ typeof(TagListDataNode), "L" },
{ typeof(TagCompoundDataNode), "C" },
{ typeof(NbtFileDataNode), "N" },
{ typeof(RegionFileDataNode), "R" },
{ typeof(RegionChunkDataNode), "r" },
{ typeof(CubicRegionDataNode), "R" },
{ typeof(DirectoryDataNode), "/" },
};
public static string Print (DataNode node, bool showType)
{
if (!_key.ContainsKey(node.GetType()))
return "";
if (showType)
return "<" + _key[node.GetType()] + "> " + node.NodeDisplay;
else
return node.NodeDisplay;
}
}
}

Binary file not shown.