From 232c44a605007d9330c8f8cce6f43bd1a6e551cf Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Sun, 16 Aug 2020 11:42:39 -0400 Subject: [PATCH] Major KCL update. KCL support has been greatly improved. - High poly collisions can now be created (even higher than 65k+). Collision should still be made with the game limitations and performance in mind! - Support for all KCL versions (GC, Wii, DS, 3DS, etc). Keep in mind for various games to work, you must create a preset and configure the settings used for individual games. I will be adding many more soon to support a wide range of games. - KCL files can now have the endianness switched and saved back allowing for direct conversion. - OBJ importing will auto map materials by name COL_## (## being hex value). This allows to export and reimport collisions with all the data intact. - File sizes are more optmized and improved. - Speed signifcantly improved and is much faster for both exporting and replacing. -Materials are now split in the node view for a KCL. This is to select and easily see all the material types and so they can be highlighted. --- .../FileFormats/Collision/KCL.cs | 398 +++++------------- .../File_Format_Library.csproj | 19 +- File_Format_Library/GL/KCL_Render.cs | 53 --- .../KCL/CollisionMaterialEditor.Designer.cs | 193 --------- .../GUI/KCL/CollisionMaterialEditor.cs | 77 ---- .../GUI/KCL/CollisionMaterialEditor.resx | 123 ------ .../Generics/Texture/GenericTexture.cs | 14 + Toolbox/KclMaterialPresets/3D World.json | 8 + Toolbox/KclMaterialPresets/Default.json | 16 + .../Mario Kart 8 Deluxe.json | 46 ++ Toolbox/KclMaterialPresets/Mario Kart 8.json | 5 +- .../KclMaterialPresets/Mario Kart Wii.json | 15 + Toolbox/KclMaterialPresets/Mario Odyssey.json | 1 + Toolbox/KclMaterialPresets/Splatoon 1.json | 3 +- Toolbox/KclMaterialPresets/Splatoon 2.json | 3 +- Toolbox/Lib/KCLExt.dll | Bin 76288 -> 0 bytes Toolbox/Lib/KclLibrary.dll | Bin 0 -> 50688 bytes Toolbox/Lib/KclLibraryGUI.dll | Bin 0 -> 46592 bytes Toolbox/Toolbox.csproj | 19 +- 19 files changed, 237 insertions(+), 756 deletions(-) delete mode 100644 File_Format_Library/GUI/KCL/CollisionMaterialEditor.Designer.cs delete mode 100644 File_Format_Library/GUI/KCL/CollisionMaterialEditor.cs delete mode 100644 File_Format_Library/GUI/KCL/CollisionMaterialEditor.resx create mode 100644 Toolbox/KclMaterialPresets/3D World.json create mode 100644 Toolbox/KclMaterialPresets/Default.json create mode 100644 Toolbox/KclMaterialPresets/Mario Kart 8 Deluxe.json create mode 100644 Toolbox/KclMaterialPresets/Mario Kart Wii.json delete mode 100644 Toolbox/Lib/KCLExt.dll create mode 100644 Toolbox/Lib/KclLibrary.dll create mode 100644 Toolbox/Lib/KclLibraryGUI.dll diff --git a/File_Format_Library/FileFormats/Collision/KCL.cs b/File_Format_Library/FileFormats/Collision/KCL.cs index 11b29ddb..a70b2bad 100644 --- a/File_Format_Library/FileFormats/Collision/KCL.cs +++ b/File_Format_Library/FileFormats/Collision/KCL.cs @@ -7,11 +7,14 @@ using GL_EditorFramework.Interfaces; using OpenTK.Graphics.OpenGL; using OpenTK; using Toolbox.Library.Rendering; -using System.Drawing; +using System.Threading; using Toolbox.Library.IO; using Toolbox.Library.Forms; using FirstPlugin.Forms; using ByamlExt.Byaml; +using KclLibrary; +using KclLibraryGUI; +using Syroot.NintenTools.MarioKart8.Collisions; namespace FirstPlugin { @@ -28,10 +31,9 @@ namespace FirstPlugin public bool Identify(System.IO.Stream stream) { - using (var reader = new Toolbox.Library.IO.FileReader(stream, true)) - { + using (var reader = new Toolbox.Library.IO.FileReader(stream, true)) { reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; - return reader.ReadUInt32() == 0x02020000; + return reader.ReadUInt32() == 0x02020000 || Utils.GetExtension(FileName) == ".kcl"; } } @@ -45,7 +47,7 @@ namespace FirstPlugin } } - private byte[] data; + public KCLFile KclFile { get; set; } public ToolStripItem[] GetContextMenuItems() { @@ -55,9 +57,8 @@ namespace FirstPlugin new ToolStripMenuItem("Export", null, Export, Keys.Control | Keys.E), new ToolStripMenuItem("Replace", null, Replace, Keys.Control | Keys.R), new ToolStripSeparator(), - new ToolStripMenuItem("Open Material Editor", null, OpenMaterialEditor, Keys.Control | Keys.M), new ToolStripMenuItem("Big Endian Mode", null, SwapEndianess, Keys.Control | Keys.B) - { Checked = (Endianness == Syroot.BinaryData.ByteOrder.BigEndian), }, + { Checked = (KclFile.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian), }, }; } @@ -70,9 +71,7 @@ namespace FirstPlugin if (!Directory.Exists(path)) Directory.CreateDirectory(path); - MarioKart.MK7.KCL.CollisionPresets.Clear(); - MarioKart.MK7.KCL.LoadPresets(Directory.GetFiles(path)); - MarioKart.MK7.KCL.LoadDefaultPresets(); + CollisionPresetData.LoadPresets(Directory.GetFiles("KclMaterialPresets")); } public bool UseOverlay @@ -87,17 +86,6 @@ namespace FirstPlugin set { Renderer.Visible = value; } } - private void OpenMaterialEditor(object sender, EventArgs args) - { - CollisionMaterialEditor editor = new CollisionMaterialEditor(); - editor.LoadCollisionValues(kcl, Renderer); - - if (editor.ShowDialog() == DialogResult.OK) - { - - } - } - public DrawableContainer DrawableContainer = new DrawableContainer(); public BymlFileData AttributeByml = null; @@ -114,8 +102,8 @@ namespace FirstPlugin }; stream.Position = 0; - data = stream.ToArray(); - Read(data); + KclFile = new KCLFile(stream); + ReloadData(); } class MenuExt : IFileMenuExtension @@ -207,38 +195,48 @@ namespace FirstPlugin public void CreateNew(object sender, EventArgs args) { - var ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; - + bool isBigEndian = false; if (sender.ToString() == "KCL (Wii U)") - ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; + isBigEndian = true; - OpenFileDialog opn = new OpenFileDialog(); - opn.Filter = "Supported Formats|*.obj"; - if (opn.ShowDialog() != DialogResult.OK) return; + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Filter = "Supported Formats|*.obj"; + if (ofd.ShowDialog() != DialogResult.OK) return; - var mod = EditorCore.Common.OBJ.Read(new MemoryStream(File.ReadAllBytes(opn.FileName)), null); + var form = Runtime.MainForm; - var f = MarioKart.MK7.KCL.FromOBJ(mod); - - string name = System.IO.Path.GetFileNameWithoutExtension(opn.FileName); - - KCL kcl = new KCL(); - kcl.Text = name; - kcl.IFileInfo = new IFileInfo(); - kcl.FileName = name; - kcl.Renderer = new KCLRendering(); - - kcl.DrawableContainer = new DrawableContainer() + var thread = new Thread(() => { - Name = kcl.FileName, - Drawables = new List() { kcl.Renderer }, - }; + var result = CollisionLoader.CreateCollisionFromObject(form, ofd.FileName); + CollisionLoader.CloseConsole(form); - kcl.Read(f.Write(ByteOrder)); + if (result.KclFie == null) return; - ObjectEditor editor = new ObjectEditor(kcl); - editor.Text = name; - LibraryGUI.CreateMdiWindow(editor); + form.Invoke((MethodInvoker)delegate + { + string name = Path.GetFileNameWithoutExtension(ofd.FileName); + + KCL kcl = new KCL(); + kcl.KclFile = result.KclFie; + kcl.AttributeByml = result.AttributeByml; + kcl.Text = name; + kcl.IFileInfo = new IFileInfo(); + kcl.FileName = name; + kcl.Renderer = new KCLRendering(); + kcl.ReloadData(); + + kcl.DrawableContainer = new DrawableContainer() + { + Name = kcl.FileName, + Drawables = new List() { kcl.Renderer }, + }; + + ObjectEditor editor = new ObjectEditor(kcl); + editor.Text = name; + LibraryGUI.CreateMdiWindow(editor); + }); + }); + thread.Start(); } } @@ -249,11 +247,7 @@ namespace FirstPlugin public void Save(System.IO.Stream stream) { - using (var writer = new FileWriter(stream)) - { - writer.Write(data); - } - + KclFile.Save(stream); SaveAttributeByml(); } @@ -380,22 +374,9 @@ namespace FirstPlugin } } - private Syroot.BinaryData.ByteOrder endianness; - public Syroot.BinaryData.ByteOrder Endianness - { - get - { - return endianness; - } - set - { - endianness = value; - } - } - private void Export(object sender, EventArgs args) { - if (kcl == null) + if (KclFile == null) return; SaveFileDialog sfd = new SaveFileDialog(); @@ -405,7 +386,8 @@ namespace FirstPlugin if (sfd.ShowDialog() == DialogResult.OK) { - kcl.ToOBJ().toWritableObj().WriteObj(sfd.FileName + ".obj"); + var obj = KclFile.CreateGenericModel(); + obj.Save(sfd.FileName, true); } } @@ -416,27 +398,34 @@ namespace FirstPlugin if (ofd.ShowDialog() == DialogResult.OK) { - var mod = EditorCore.Common.OBJ.Read(new MemoryStream(File.ReadAllBytes(ofd.FileName)), null); - if (mod.Faces.Count > 65535) + var form = Runtime.MainForm; + + var thread = new Thread(() => { - MessageBox.Show("this model has too many faces, only models with less than 65535 triangles can be converted"); - return; - } - kcl = MarioKart.MK7.KCL.FromOBJ(mod); - AttributeByml = kcl.AttributeByml; - data = kcl.Write(Endianness); - Read(data); - Renderer.UpdateVertexData(); - SaveAttributeByml(true); + var result = CollisionLoader.CreateCollisionFromObject(form, ofd.FileName); + CollisionLoader.CloseConsole(form); + + if (result.KclFie == null) return; + + form.Invoke((MethodInvoker)delegate + { + KclFile = result.KclFie; + AttributeByml = result.AttributeByml; + ReloadData(); + Renderer.UpdateVertexData(); + SaveAttributeByml(true); + }); + }); + thread.Start(); } } private void SwapEndianess(object sender, EventArgs args) { - if (Endianness == Syroot.BinaryData.ByteOrder.BigEndian) - Endianness = Syroot.BinaryData.ByteOrder.LittleEndian; + if (KclFile.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian) + KclFile.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; else - Endianness = Syroot.BinaryData.ByteOrder.BigEndian; + KclFile.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; } private Viewport viewport @@ -478,236 +467,61 @@ namespace FirstPlugin } } - private MarioKart.MK7.KCL kcl; - private void Read(byte[] file_data) - { - data = file_data; - - try - { - Endianness = Syroot.BinaryData.ByteOrder.LittleEndian; - kcl = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.LittleEndian); - } - catch - { - Endianness = Syroot.BinaryData.ByteOrder.BigEndian; - kcl = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.BigEndian); - } - - - Read(kcl); - } - - public float DropToGround(Vector3 position) - { - List found = new List(); - - foreach (var model in kcl.Models) { - for (int p = 0; p < model.Planes.Length; p++) { - var triangle = model.GetTriangle(model.Planes[p]); - Vector3 a = Vec3D_To_Vec3(triangle.PointA); - Vector3 b = Vec3D_To_Vec3(triangle.PointB); - Vector3 c = Vec3D_To_Vec3(triangle.PointC); - if (PointInTriangle(position.Xz, a.Xz, b.Xz, c.Xz)) - found.Add(barryCentric(a, b, c, position)); - } - } - - if (found.Count == 0) - return position.Y; - - int closest_index = 0; - float closest_abs = 9999999.0f; - for (int i = 0; i < found.Count; i++) - { - float abs = Math.Abs(position.Y - found[i]); - if (abs < closest_abs) - { - closest_abs = abs; - closest_index = i; - } - } - - Console.WriteLine($"found closest Y {found[closest_index]}"); - - return found[closest_index]; - } - - public static float barryCentric(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 pos) - { - float det = (p2.Z - p3.Z) * (p1.X - p3.X) + (p3.X - p2.X) * (p1.Z - p3.Z); - float l1 = ((p2.Z - p3.Z) * (pos.X - p3.X) + (p3.X - p2.X) * (pos.Z - p3.Z)) / det; - float l2 = ((p3.Z - p1.Z) * (pos.X - p3.X) + (p1.X - p3.X) * (pos.Z - p3.Z)) / det; - float l3 = 1.0f - l1 - l2; - return l1 * p1.Y + l2 * p2.Y + l3 * p3.Y; - } - - public static bool PointInTriangle(Vector2 p, Vector2 p0, Vector2 p1, Vector2 p2) - { - var s = p0.Y * p2.X - p0.X * p2.Y + (p2.Y - p0.Y) * p.X + (p0.X - p2.X) * p.Y; - var t = p0.X * p1.Y - p0.Y * p1.X + (p0.Y - p1.Y) * p.X + (p1.X - p0.X) * p.Y; - - if ((s < 0) != (t < 0)) - return false; - - var A = -p1.Y * p2.X + p0.Y * (p2.X - p1.X) + p0.X * (p1.Y - p2.Y) + p1.X * p2.Y; - if (A < 0.0) - { - s = -s; - t = -t; - A = -A; - } - return s > 0 && t > 0 && (s + t) <= A; - } - - private void LoadModelTree(TreeNode parent, MarioKart.ModelOctree[] modelOctrees) - { - if (modelOctrees == null) - return; - - foreach (var model in modelOctrees) - { - OctreeNode modelNode = new OctreeNode(model, model.Key.ToString("X")); - parent.Nodes.Add(modelNode); - LoadModelTree(modelNode, model.Children); - } - } - - public class OctreeNode : TreeNodeCustom - { - public List Children - { - get - { - List trees = new List(); - foreach (var node in Nodes) - trees.Add((OctreeNode)node); - return trees; - } - } - - MarioKart.ModelOctree Octree; - - public OctreeNode(MarioKart.ModelOctree octree, string name) - { - Octree = octree; - Text = name; - } - - public override void OnClick(TreeView treeview) - { - - } - } - - public List GetKclModels() - { + public List GetKclModels() { return Renderer.models; } - private void Read(MarioKart.MK7.KCL kcl) + private void ReloadData() { - Vector3 min = new Vector3(); - Vector3 max = new Vector3(); + //Split collision triangles by materials between all the models + Dictionary> triangleList = new Dictionary>(); + + foreach (var model in KclFile.Models) { + foreach (var prisim in model.Prisims) + { + var triangle = model.GetTriangle(prisim); + if (!triangleList.ContainsKey(prisim.CollisionFlags)) + triangleList.Add(prisim.CollisionFlags, new List()); + + triangleList[prisim.CollisionFlags].Add(triangle); + } + } - Nodes.Clear(); - Renderer.OctreeNodes.Clear(); Renderer.models.Clear(); - Renderer.KclFile = kcl; + Nodes.Clear(); - TreeNode modelTree = new TreeNode("Model Octree"); - LoadModelTree(modelTree, kcl.GlobalHeader.ModelOctrees); - foreach (var node in modelTree.Nodes) - Renderer.OctreeNodes.Add((OctreeNode)node); - Nodes.Add(modelTree); - - int CurModelIndx = 0; - foreach (MarioKart.MK7.KCL.KCLModel mdl in kcl.Models) + //Load the vertex data for rendering + foreach (var triGroup in triangleList) { KCLModel kclmodel = new KCLModel(); + kclmodel.Text = $"COL_{triGroup.Key.ToString("X")}"; - kclmodel.Text = "Model " + CurModelIndx; + int faceIndex = 0; - int ft = 0; - foreach (var plane in mdl.Planes) + var triangles = triGroup.Value; + for (int i = 0; i < triangles.Count; i++) { - var triangle = mdl.GetTriangle(plane); - var normal = triangle.Normal; - var pointA = triangle.PointA; - var pointB = triangle.PointB; - var pointC = triangle.PointC; + for (int v = 0; v < triangles[i].Vertices.Length; v++) { + var positon = triangles[i].Vertices[v]; + var normal = triangles[i].Normal; + var attribute = triGroup.Key; - Vertex vtx = new Vertex(); - Vertex vtx2 = new Vertex(); - Vertex vtx3 = new Vertex(); - - vtx.pos = new Vector3(Vec3D_To_Vec3(pointA)); - vtx2.pos = new Vector3(Vec3D_To_Vec3(pointB)); - vtx3.pos = new Vector3(Vec3D_To_Vec3(pointC)); - vtx.nrm = new Vector3(Vec3D_To_Vec3(normal)); - vtx2.nrm = new Vector3(Vec3D_To_Vec3(normal)); - vtx3.nrm = new Vector3(Vec3D_To_Vec3(normal)); - - KCLModel.Face face = new KCLModel.Face(); - face.Text = triangle.Collision.ToString(); - face.MaterialFlag = triangle.Collision; - - var col = MarioKart.MK7.KCLColors.GetMaterialColor(plane.CollisionType); - Vector3 ColorSet = new Vector3(col.R, col.G, col.B); - - vtx.col = new Vector4(ColorSet, 1); - vtx2.col = new Vector4(ColorSet, 1); - vtx3.col = new Vector4(ColorSet, 1); - - kclmodel.faces.Add(ft); - kclmodel.faces.Add(ft + 1); - kclmodel.faces.Add(ft + 2); - - ft += 3; - - kclmodel.vertices.Add(vtx); - kclmodel.vertices.Add(vtx2); - kclmodel.vertices.Add(vtx3); - - #region FindMaxMin - if (triangle.PointA.X < min.X) min.X = (float)triangle.PointA.X; - if (triangle.PointA.Y < min.Y) min.Y = (float)triangle.PointA.Y; - if (triangle.PointA.Z < min.Z) min.Z = (float)triangle.PointA.Z; - if (triangle.PointA.X > max.X) max.X = (float)triangle.PointA.X; - if (triangle.PointA.Y > max.Y) max.Y = (float)triangle.PointA.Y; - if (triangle.PointA.Z > max.Z) max.Z = (float)triangle.PointA.Z; - - if (triangle.PointB.X < min.X) min.X = (float)triangle.PointB.X; - if (triangle.PointB.Y < min.Y) min.Y = (float)triangle.PointB.Y; - if (triangle.PointB.Z < min.Z) min.Z = (float)triangle.PointB.Z; - if (triangle.PointB.X > max.X) max.X = (float)triangle.PointB.X; - if (triangle.PointB.Y > max.Y) max.Y = (float)triangle.PointB.Y; - if (triangle.PointB.Z > max.Z) max.Z = (float)triangle.PointB.Z; - - if (triangle.PointC.X < min.X) min.X = (float)triangle.PointC.X; - if (triangle.PointC.Y < min.Y) min.Y = (float)triangle.PointC.Y; - if (triangle.PointC.Z < min.Z) min.Z = (float)triangle.PointC.Z; - if (triangle.PointC.X > max.X) max.X = (float)triangle.PointC.X; - if (triangle.PointC.Y > max.Y) max.Y = (float)triangle.PointC.Y; - if (triangle.PointC.Z > max.Z) max.Z = (float)triangle.PointC.Z; - #endregion + kclmodel.vertices.Add(new Vertex() + { + pos = new Vector3(positon.X, positon.Y, positon.Z), + nrm = new Vector3(normal.X, normal.Y, normal.Z), + col = new Vector4(1,1,1,1), + }); + kclmodel.faces.Add(faceIndex + v); + } + faceIndex += 3; } - Renderer.Max = max; - Renderer.Min = min; Renderer.models.Add(kclmodel); Nodes.Add(kclmodel); - - CurModelIndx++; } } - //Convert KCL lib vec3 to opentk one so i can use the cross and dot methods - public static Vector3 Vec3D_To_Vec3(System.Windows.Media.Media3D.Vector3D v) - { - return new Vector3((float)v.X, (float)v.Y, (float)v.Z); - } - public struct DisplayVertex { // Used for rendering. diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index 7807995e..38c76953 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -81,9 +81,13 @@ ..\Toolbox\Gl_EditorFramework.dll False - - False - ..\Toolbox\Lib\KCLExt.dll + + ..\Toolbox\Lib\KclLibrary.dll + False + + + ..\Toolbox\Lib\KclLibraryGUI.dll + False ..\Toolbox\Lib\LibHac.dll @@ -1250,12 +1254,6 @@ EffectTableEditor.cs - - Form - - - CollisionMaterialEditor.cs - UserControl @@ -2138,9 +2136,6 @@ VisibiltyAnimEditor.cs - - CollisionMaterialEditor.cs - ByamlEditor.cs diff --git a/File_Format_Library/GL/KCL_Render.cs b/File_Format_Library/GL/KCL_Render.cs index ca4c150b..ba7e7e1f 100644 --- a/File_Format_Library/GL/KCL_Render.cs +++ b/File_Format_Library/GL/KCL_Render.cs @@ -16,9 +16,6 @@ namespace FirstPlugin { public bool DrawGlobalOctrees = false; - public List OctreeNodes = new List(); - - public MarioKart.MK7.KCL KclFile; public Vector3 Max = new Vector3(0); public Vector3 Min = new Vector3(0); @@ -96,52 +93,6 @@ namespace FirstPlugin LibraryGUI.UpdateViewport(); } - public void DrawGlobalOctree(ref Matrix4 mvp) - { - var octreeMax = KclFile.GlobalHeader.OctreeMax; - var octreeOrigin = KclFile.GlobalHeader.OctreeOrigin; - Vector3 max = new Vector3((float)octreeMax.X, (float)octreeMax.Y, (float)octreeMax.Z); - Vector3 min = new Vector3((float)octreeOrigin.X, (float)octreeOrigin.Y, (float)octreeOrigin.Z); - - Console.WriteLine("DrawGlobalOctree " + min + " " + max); - - var size = max - min; - var BoxSize = size / 2f; - var QuarterSize = BoxSize / 2f; - - // DrawableBoundingBox.DrawBoundingBox(mvp, min, max, new Vector3(0)); - DrawSubdivision(ref mvp, min, size, OctreeNodes, 0); - } - - private void DrawSubdivision(ref Matrix4 mvp, Vector3 min, Vector3 size, List modelOctrees, int subdiv) - { - var BoxSize = size / 2f; - var QuarterSize = BoxSize / 2f; - - int index = 0; - for (int z = 0; z < 2; z++) - { - for (int y = 0; y < 2; y++) - { - for (int x = 0; x < 2; x++) - { - var Boxmin = min + BoxSize * new Vector3(x,y,z); - var pos = BoxSize * new Vector3(x, y, z); - - if (modelOctrees[index].IsSelected) - DrawableBoundingBox.DrawBoundingBox(mvp, QuarterSize, Boxmin + QuarterSize, System.Drawing.Color.Red); - else - DrawableBoundingBox.DrawBoundingBox(mvp, QuarterSize, Boxmin + QuarterSize, System.Drawing.Color.Green); - - if (modelOctrees[index].Nodes.Count > 0) - DrawSubdivision(ref mvp, Boxmin, BoxSize, modelOctrees[index].Children, subdiv++); - - index++; - } - } - } - } - public GLShaderGeneric Shader; public ShaderProgram defaultShaderProgram; @@ -262,10 +213,6 @@ namespace FirstPlugin CheckBuffers(); Matrix4 camMat = control.ModelMatrix * control.CameraMatrix * control.ProjectionMatrix; - - if (DrawGlobalOctrees) - DrawGlobalOctree(ref camMat); - control.CurrentShader = defaultShaderProgram; if (UseOverlay) diff --git a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.Designer.cs b/File_Format_Library/GUI/KCL/CollisionMaterialEditor.Designer.cs deleted file mode 100644 index d371182f..00000000 --- a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.Designer.cs +++ /dev/null @@ -1,193 +0,0 @@ -namespace FirstPlugin.Forms -{ - partial class CollisionMaterialEditor - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.stListView1 = new Toolbox.Library.Forms.STListView(); - this.olvColumn1 = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); - this.olvColumn2 = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); - this.numericUpDownUint1 = new Toolbox.Library.Forms.NumericUpDownUint(); - this.stMenuStrip1 = new Toolbox.Library.Forms.STMenuStrip(); - this.selectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.byMaterialToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.stButton1 = new Toolbox.Library.Forms.STButton(); - this.stButton2 = new Toolbox.Library.Forms.STButton(); - this.stPanel1 = new Toolbox.Library.Forms.STPanel(); - this.contentContainer.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.stListView1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUint1)).BeginInit(); - this.stMenuStrip1.SuspendLayout(); - this.stPanel1.SuspendLayout(); - this.SuspendLayout(); - // - // contentContainer - // - this.contentContainer.Controls.Add(this.stPanel1); - this.contentContainer.Size = new System.Drawing.Size(235, 393); - this.contentContainer.Controls.SetChildIndex(this.stPanel1, 0); - // - // stListView1 - // - this.stListView1.AllColumns.Add(this.olvColumn1); - this.stListView1.AllColumns.Add(this.olvColumn2); - this.stListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.stListView1.CellEditUseWholeCell = false; - this.stListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.olvColumn1, - this.olvColumn2}); - this.stListView1.Cursor = System.Windows.Forms.Cursors.Default; - this.stListView1.Location = new System.Drawing.Point(-3, 53); - this.stListView1.Name = "stListView1"; - this.stListView1.Size = new System.Drawing.Size(235, 277); - this.stListView1.TabIndex = 0; - this.stListView1.UseCompatibleStateImageBehavior = false; - this.stListView1.View = System.Windows.Forms.View.Details; - this.stListView1.SelectedIndexChanged += new System.EventHandler(this.stListView1_SelectedIndexChanged); - // - // olvColumn1 - // - this.olvColumn1.AspectName = "ID"; - this.olvColumn1.CellEditUseWholeCell = true; - this.olvColumn1.Text = "ID"; - this.olvColumn1.Width = 92; - // - // olvColumn2 - // - this.olvColumn2.AspectName = "Type"; - this.olvColumn2.Text = "Type"; - this.olvColumn2.Width = 131; - // - // numericUpDownUint1 - // - this.numericUpDownUint1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.numericUpDownUint1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.numericUpDownUint1.Location = new System.Drawing.Point(2, 27); - this.numericUpDownUint1.Maximum = new decimal(new int[] { - 2147483647, - 0, - 0, - 0}); - this.numericUpDownUint1.Name = "numericUpDownUint1"; - this.numericUpDownUint1.Size = new System.Drawing.Size(230, 20); - this.numericUpDownUint1.TabIndex = 1; - // - // stMenuStrip1 - // - this.stMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.selectToolStripMenuItem}); - this.stMenuStrip1.Location = new System.Drawing.Point(0, 0); - this.stMenuStrip1.Name = "stMenuStrip1"; - this.stMenuStrip1.Size = new System.Drawing.Size(235, 24); - this.stMenuStrip1.TabIndex = 2; - this.stMenuStrip1.Text = "stMenuStrip1"; - // - // selectToolStripMenuItem - // - this.selectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.byMaterialToolStripMenuItem}); - this.selectToolStripMenuItem.Name = "selectToolStripMenuItem"; - this.selectToolStripMenuItem.Size = new System.Drawing.Size(50, 20); - this.selectToolStripMenuItem.Text = "Select"; - // - // byMaterialToolStripMenuItem - // - this.byMaterialToolStripMenuItem.Name = "byMaterialToolStripMenuItem"; - this.byMaterialToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.byMaterialToolStripMenuItem.Text = "By Material"; - // - // stButton1 - // - this.stButton1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.stButton1.Location = new System.Drawing.Point(72, 336); - this.stButton1.Name = "stButton1"; - this.stButton1.Size = new System.Drawing.Size(77, 26); - this.stButton1.TabIndex = 3; - this.stButton1.Text = "Ok"; - this.stButton1.UseVisualStyleBackColor = false; - // - // stButton2 - // - this.stButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.stButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.stButton2.Location = new System.Drawing.Point(155, 336); - this.stButton2.Name = "stButton2"; - this.stButton2.Size = new System.Drawing.Size(77, 26); - this.stButton2.TabIndex = 4; - this.stButton2.Text = "Cancel"; - this.stButton2.UseVisualStyleBackColor = false; - // - // stPanel1 - // - this.stPanel1.Controls.Add(this.stListView1); - this.stPanel1.Controls.Add(this.stButton1); - this.stPanel1.Controls.Add(this.numericUpDownUint1); - this.stPanel1.Controls.Add(this.stButton2); - this.stPanel1.Controls.Add(this.stMenuStrip1); - this.stPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.stPanel1.Location = new System.Drawing.Point(0, 25); - this.stPanel1.Name = "stPanel1"; - this.stPanel1.Size = new System.Drawing.Size(235, 368); - this.stPanel1.TabIndex = 11; - // - // CollisionMaterialEditor - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(238, 398); - this.MainMenuStrip = this.stMenuStrip1; - this.Name = "CollisionMaterialEditor"; - this.Text = "Collision Materials"; - this.contentContainer.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.stListView1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUint1)).EndInit(); - this.stMenuStrip1.ResumeLayout(false); - this.stMenuStrip1.PerformLayout(); - this.stPanel1.ResumeLayout(false); - this.stPanel1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private Toolbox.Library.Forms.STListView stListView1; - private BrightIdeasSoftware.OLVColumn olvColumn1; - private BrightIdeasSoftware.OLVColumn olvColumn2; - private Toolbox.Library.Forms.NumericUpDownUint numericUpDownUint1; - private Toolbox.Library.Forms.STMenuStrip stMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem selectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem byMaterialToolStripMenuItem; - private Toolbox.Library.Forms.STButton stButton1; - private Toolbox.Library.Forms.STButton stButton2; - private Toolbox.Library.Forms.STPanel stPanel1; - } -} \ No newline at end of file diff --git a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.cs b/File_Format_Library/GUI/KCL/CollisionMaterialEditor.cs deleted file mode 100644 index d642a119..00000000 --- a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using FirstPlugin; -using Toolbox.Library.Forms; - -namespace FirstPlugin.Forms -{ - public partial class CollisionMaterialEditor : STForm - { - public CollisionMaterialEditor() - { - InitializeComponent(); - } - - public KCL.GameSet GameMaterialSet = KCL.GameSet.MarioKart8D; - - public class CollisionMaterial - { - public ushort ID { get; set; } - public string Type { get; set; } - } - - KCLRendering Render; - - public void LoadCollisionValues(MarioKart.MK7.KCL kcl, KCLRendering renderer) - { - Render = renderer; - - List Materials = new List(); - - foreach (var model in kcl.Models) - { - foreach (var plane in model.Planes) - { - string type = "Unknown"; - - switch (GameMaterialSet) - { - case KCL.GameSet.MarioKart8D: - type = ((KCL.CollisionType_MK8D)plane.CollisionType).ToString(); - break; - case KCL.GameSet.MarioOdyssey: - type = ((KCL.CollisionType_MarioOdssey)plane.CollisionType).ToString(); - break; - } - - Materials.Add(new CollisionMaterial() - { - ID = plane.CollisionType, - Type = type, - }); - } - - stListView1.SetObjects(Materials); - } - - stListView1.SetTheme(); - } - - private void stListView1_SelectedIndexChanged(object sender, EventArgs e) - { - Render.SelectedTypes.Clear(); - foreach (var collision in stListView1.SelectedObjects) - { - var coll = (CollisionMaterial)collision; - Render.SelectedTypes.Add(coll.ID); - } - } - } -} diff --git a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.resx b/File_Format_Library/GUI/KCL/CollisionMaterialEditor.resx deleted file mode 100644 index 3db3609f..00000000 --- a/File_Format_Library/GUI/KCL/CollisionMaterialEditor.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs b/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs index fd9b8ef2..d6be8a85 100644 --- a/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs +++ b/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs @@ -1041,6 +1041,20 @@ namespace Toolbox.Library dds.header.ddspf.ABitMask = components[(int)AlphaChannel];*/ } + /* if (Runtime.ImageEditor.PreviewGammaFix) + { + foreach (var surface in surfaces) + { + Bitmap bitMap = GetBitmap(surfaces.IndexOf(surface), 0); + bitMap = BitmapExtension.AdjustGamma(bitMap, 1.0f / 2.2f); + if (Runtime.ImageEditor.UseComponetSelector) + bitMap = BitmapExtension.SetChannel(bitMap, RedChannel, GreenChannel, BlueChannel, AlphaChannel); + + var reEncoded = GenerateMipsAndCompress(bitMap, MipCount, Format); + //surface.mipmaps = reEncoded; + } + }*/ + bool isCubeMap = ArrayCount == 6; if (surfaces.Count > 1) //Use DX10 format for array surfaces as it can do custom amounts diff --git a/Toolbox/KclMaterialPresets/3D World.json b/Toolbox/KclMaterialPresets/3D World.json new file mode 100644 index 00000000..a9162648 --- /dev/null +++ b/Toolbox/KclMaterialPresets/3D World.json @@ -0,0 +1,8 @@ +{ + "GameTitle": "Mario 3D World", + "PrismThickness": 40.0, + "SphereRadius": 0.0, + "Comments": "This game uses byml to customize presets.", + "MaterialPresets": { + } +} \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Default.json b/Toolbox/KclMaterialPresets/Default.json new file mode 100644 index 00000000..d251936e --- /dev/null +++ b/Toolbox/KclMaterialPresets/Default.json @@ -0,0 +1,16 @@ +{ + "GameTitle": "Default", + "Platform": "SWITCH", + "PrismThickness": 30.0, + "SphereRadius": 25.0, + "PaddingMin": -50.0, + "PaddingMax": 50.0, + "MaxRootSize": 2048, + "MinRootSize": 128, + "MinCubeSize": 32, + "MaxTrianglesInCube": 10, + "Comments": "", + "MaterialPresets": { + "0": "Unknown" + } +} \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Mario Kart 8 Deluxe.json b/Toolbox/KclMaterialPresets/Mario Kart 8 Deluxe.json new file mode 100644 index 00000000..ca73fa1c --- /dev/null +++ b/Toolbox/KclMaterialPresets/Mario Kart 8 Deluxe.json @@ -0,0 +1,46 @@ +{ + "GameTitle": "Mario Kart 8 Deluxe", + "Platform": "SWITCH", + "PrismThickness": 30.0, + "SphereRadius": 25.0, + "Comments": "KCL Flag list by Divengerss from https://docs.google.com/spreadsheets/d/1muupGKuNDDe4ckRN_Wv6xd0L0FqA8tsvZUJNJs-4Sgs/edit#gid=0", + "MaterialPresets": { + "0": "Road", + "1": "Road_2", + "2": "Road (Bumpy)", + "3": "Road_3", + "4": "Road (Slippery)", + "5": "Road (Offroad Sand / No Particles", + "6": "Road (Offroad Sand)", + "7": "Road (Sticky Sound / No Particles)", + "8": "Road (Offroad)", + "9": "Road (Ice Particles Only)", + "10": "Road (Booster)", + "11": "Road (Anti-G-Panel)", + "12": "Road_4", + "13": "Road (Wet Road / Sound & particles)", + "14": "Road_5", + "15": "Road (Semi-solid)", + "16": "Lakitu Boundry", + "17": "Wall (Invisible / No sound & particles", + "18": "Wall (Water Wave on collide / No sound)", + "19": "Wall (Default particles / No sound)", + "31": "Glider", + "32": "Road (Foamy Sound)", + "40": "Road (Offroad, clicking Sound)", + "56": "Unsolid", + "60": "Water (Drown reset)", + "64": "Road (Rocky Sound)", + "81": "Wall (Metal sounds on impact)", + "129": "Road (3DS MP Piano)", + "134": "Road (RoyalR Offroad Grass)", + "161": "Road (3DS MP Xylophone)", + "193": "Road (3DS MP Vibraphone)", + "227": "Road (SNES RR road)", + "297": "Road (MKS Offroad Grass)", + "500": "Road (Water Wall)", + "4096": "Road (Stunt)", + "4106": "Road (Booster + Stunt)", + "4108": "Road (Stunt + Glider)" + } +} \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Mario Kart 8.json b/Toolbox/KclMaterialPresets/Mario Kart 8.json index 154f0146..7966916c 100644 --- a/Toolbox/KclMaterialPresets/Mario Kart 8.json +++ b/Toolbox/KclMaterialPresets/Mario Kart 8.json @@ -1,5 +1,6 @@ { - "GameTitle": "Mario Kart 8 Wii U / Deluxe", + "GameTitle": "Mario Kart 8 Wii U", + "Platform": "WII U", "PrismThickness": 30.0, "SphereRadius": 25.0, "Comments": "KCL Flag list by Divengerss from https://docs.google.com/spreadsheets/d/1muupGKuNDDe4ckRN_Wv6xd0L0FqA8tsvZUJNJs-4Sgs/edit#gid=0", @@ -40,6 +41,6 @@ "500": "Road (Water Wall)", "4096": "Road (Stunt)", "4106": "Road (Booster + Stunt)", - "4108": "Road (Stunt + Glider)", + "4108": "Road (Stunt + Glider)" } } \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Mario Kart Wii.json b/Toolbox/KclMaterialPresets/Mario Kart Wii.json new file mode 100644 index 00000000..e8928625 --- /dev/null +++ b/Toolbox/KclMaterialPresets/Mario Kart Wii.json @@ -0,0 +1,15 @@ +{ + "GameTitle": "Mario Kart Wii", + "Platform": "WII", + "PrismThickness": 300.0, + "SphereRadius": 250.0, + "PaddingMin": -250.0, + "PaddingMax": 250.0, + "MaxRootSize": 2048, + "MinRootSize": 128, + "MinCubeSize": 512, + "MaxTrianglesInCube": 60, + "Comments": "", + "MaterialPresets": { + } +} \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Mario Odyssey.json b/Toolbox/KclMaterialPresets/Mario Odyssey.json index a41d2129..d303bc41 100644 --- a/Toolbox/KclMaterialPresets/Mario Odyssey.json +++ b/Toolbox/KclMaterialPresets/Mario Odyssey.json @@ -1,5 +1,6 @@ { "GameTitle": "Mario Odyssey", + "Platform": "SWITCH", "PrismThickness": 40.0, "SphereRadius": 0.0, "Comments": "This game uses byml to customize presets.", diff --git a/Toolbox/KclMaterialPresets/Splatoon 1.json b/Toolbox/KclMaterialPresets/Splatoon 1.json index af87fa2e..bca9f77e 100644 --- a/Toolbox/KclMaterialPresets/Splatoon 1.json +++ b/Toolbox/KclMaterialPresets/Splatoon 1.json @@ -1,9 +1,10 @@ { "GameTitle": "Splatoon 1", + "Platform": "WII U", "PrismThickness": 30.0, "SphereRadius": 25.0, "Comments": "", "MaterialPresets": { - "0": "Unknown", + "0": "Unknown" } } \ No newline at end of file diff --git a/Toolbox/KclMaterialPresets/Splatoon 2.json b/Toolbox/KclMaterialPresets/Splatoon 2.json index f2a40861..6c269ac1 100644 --- a/Toolbox/KclMaterialPresets/Splatoon 2.json +++ b/Toolbox/KclMaterialPresets/Splatoon 2.json @@ -1,9 +1,10 @@ { "GameTitle": "Splatoon 2", + "Platform": "SWITCH", "PrismThickness": 30.0, "SphereRadius": 25.0, "Comments": "", "MaterialPresets": { - "0": "Unknown", + "0": "Unknown" } } \ No newline at end of file diff --git a/Toolbox/Lib/KCLExt.dll b/Toolbox/Lib/KCLExt.dll deleted file mode 100644 index 06cfe211ffc60fae0b7e285b31b04d18de1e599b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76288 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 z 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%0An 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 JyY)a0{0%AhqUZns literal 0 HcmV?d00001 diff --git a/Toolbox/Lib/KclLibraryGUI.dll b/Toolbox/Lib/KclLibraryGUI.dll new file mode 100644 index 0000000000000000000000000000000000000000..7b3dba096813fd2d130b97e883c9bb46c27bda92 GIT binary patch literal 46592 zcmeIb33yz^l|Nd2yZd&lwRUT>yr8y??Y3nLZ-8x9S@I%~R~Z`!8M`gDZDC1Q?rvc_ zLPUZ<;sla-5=clO2@sNy4HC$kFxeo1Y~UnJHb{a4f#eO7l}wh&WMba$ck0&ddnK94 z``-Nj-+SNp1YNhzsZ*y;ojP@@>fGw~rYqmB!b+(KKCir@)MxSJ-^G%?dNPLMs^)*L zQV*4#nElyM*NNFX4)hh$LwRR^K0A=^$qo)W#q{1>IzK#^?i);ZZ0Sx9IK8>n%F4u< zF6*u9lfKbtq`#1=0PcHFDz$1-*{dMZO2vJ}aljjWaBDGl zqzL%MPar{=^wpIcko={U+S8gZ#Y|kOXfqDQR-`~X;uGW06-vJ?IRm#=DLjrio z#Y(O905|hR>J@*K%~Dad@fxLOUM3s_-}{78Ltyv!{?#rGt2Pj$O0tl}xFl?AbdX|S z2UKKng*==_r4lWn#`4(W>B=5qxqZss3-ZD=lsHXD=Bq{ELw+z34r$V5QC(uua4OUi zYDn0NGs?Pd2wdhZX`FwZgUl&AXSmH9V@ZIgrFMZQhC8Xkh3RN4VLLPMD7T%NcvQsV zg(aw7S?0_F*mx?0hH9h9=;E@%9^h;3mKjzC{jpVQ03#;)|C+S|al+z#)GD*(@Xo zX@@dUc_NZ&L7G{N1dT45V`ZR=gj#e)-545;XnB^S2y-r3I4FG!kG>8?${ML+PfpqW zz!qA`1_Repo(g4_0;p(FakNmoG@`CX{TTaWWtO1?`o$>5tPJ=j<~NkLT%@i;%}C6F zl!?a7O4hdWuZ4_0{0K%clFw4`vq2EgoP!j68!s=937K;)5T_!QWlJ8AcEf5l+Ksba zU5+W8Pz{NeGc;`3@5z87kpbft=RDzNH(rjhdu!jRNO^3@(_kZG3+s|U3&Zidwo#}e z!tB@EM$s$DZv65n8q(Rdqh-vd+4LwRM0O0-N6VRQPLE>N;+Yt&>@eFy$Xv|v@ncvV7&s+!=4W}$UUsh;3 zA+Rzv7%d0mpMcR!E7f!hE=EB`O9~@Jy2?~I(P^3nLk^)pd{solLsoD=VBq zZ)_FL5764yq7;KY&xNmR2P`I7ZpG4JbTZQcOeV=Ho(}*@{;axD6hJd*1Z`LucoG|S zmjZH{v!2N7HXyZ5*>xx>Y$U5rB*oXjDUGpc5$6+(MnU_@0z{IzIRXZlo7dt2u9tug z%4oz4I%Pw*+An3aUus!|25U(_Lh|A!aL!{=>*?cMin_{jy7*9w-aLgos1TILQZ0}N zU57tfTyBl9i_@MZDx*Ak6esoYg+*$naErv>>4w02@pL^f0+J-VUYO; z!De>jp@+)ZpP(8-}6y5qWP+$C!GYm|kC5@%<8ssn? zJYuXPhgs(clKCh>#8l&G}I!f^+4JHhpqj>1!S znS;rTT}Hg|@``xaf!SlFpmvr#hW_jRo~@SbRn_b-*YhoS!jWN)I@f{Pc|8&pjyPlP zlY`@o3m^m$8K?y0Y$N&gNapLR5eH0djiIi>>T&P}&ePQmtnmgU4a?%z2vi;sXR!JM zpo6w`H-zX$5S6#=KCRWb>br>y--x6(QYID&6M)KW2d;&Bf%+rbvNCTX=`keAikE4< z88f=wGb8SX;>oD1aaW)&RuZ4B^>?m1c(=9}>JNs?~-tCYni z7=uSL=bb2mQ`jyKvDVTOAye>Hlr-J45;JXHgEhhi@1ECajgax(^QKuNZ1-;Gwo?5@ z=UpYB!FhKHnAvk-ctgwBFx5I zku8PuUX7>D8l5{zfUH4H0dYu^Z}*8qMEXUHLUVmU7R~I65;L@z_FBACQc z36Xvh+?@Ao1T~lM^HC6y{<@EXBhk7x;{b8iQ_9^fh|Vg45Yfc*waRYK%Gef`{`VCR|)9Y+cYWu^^uRD`omHXqLp| znUCPv5*0hs8yS6Q)0Lh3$nK*^U;sdKnSt&llrYd&2-O(qDMHN#`YEBbfudnR83VNwT4kVa zLgyO@$JC+biw$%ap=}2G7@+hxI%E*vB?61JhbWH#ahDHq9ubfF5CcTK;6vO>#6oDw zF#Q@4fAArGNdy;TLlKPvk?vOt6qqKZ3Wj^ z8i*dsPjGl}%D&i-opuYD!`Xyw*`LYQ7E6EuQE1C%_HO5ss6JoGIo#~ia1?)V(Hg_< zeiE?#iRUOv8(0^Km~vgb2g;E@tMCB0jZ%24@F`}`EM@00t2-84;7H!!d>Z7gObrgs z6(s=Mj}q{i5-`pAKT3e}PsmTZW!PO4*{-aKZ1rvj9?Gzo;XGUd8X5xbk&@(hWAM!4 zM@0I|=w5mjl7N$Bk#~$^bNLZg{AbNv5bq-5a~eT8@*nn52;yrc3TXGg_jhd6_^BVF zuJKbr5sjY`>JLi$uAkyjYZZBX9@s@Q;1hn0e$~R}uq&I70;})^l#IeQO?EM}GjG`> zip~E8jY6;akj>|`e3?9(^0o4uo}VGl8Tkc#j;>(cx>0OYNiS7q5Yl$e5UPuk+SO;lHlDy()Vyi0li2zLT+(Cy_`ub!IK{GtM9o1t1p2a z+~Jj}Nahh{qbeDdFjyUy+H=sLY)=Z0vJAfXTyS>23?OMcU%_Mkbyox9RuOMp8%xF( zCve7d9z!{%060I6+>$$Stcsj!C@&qWVA|A1ZM>njtYt?so-BJ$Eovs%^x46tu}?qW zYr5QR`XHN5=vFI|6>PQKw3;kyyu7w7S(c2ywQu4zgD1!`@ zxo5P0Q~S4taCFjVwAbNTNB?tOD_Sd$;aqV5!BPyRUVGYY8E*}&v1O1ou*??A&_Ko( zbI?GuEjFQnhL&jL$Wb4ZW4m9Dh5pvg^tU#{FJVK= z%rq9eP({m3wu(H00xdP}GtM$gTBYwhfqBrNeeZcx{%&Z``5ILy2foE~t&ugvV=I_g z+@RxpVIcBn8};abQqX8$#)bm4La~iLww_0@(1p059 z-sWo>0k&VBYZxhR`dr;L_d7Z zP^Iz?&F&i%wgsF^s$;BGv=7g2V{&ES@aS_g-{ds1GEeZqF=2e`Hau~*N`kKB?VKk; zl4z;3brcT*;#Ew8bAlCZ9gBPMWXhIU9J&&VyAhP|FiG`5w5xEDP@}G<0q0v_!J!zV zXVWd_A4NaJ)8&829(@}m&Ue@ph179_T9sbG?YoxwGE7PA{Y7SParhsQdG#x7;q+qr zm#=8crHC{>!tU7E*C%aRz{I`EYP1-u(HMsdB@sO24MFB9(#MnW#T71E^nmp$s@JQJ zW4($7)+=|&!(3Mu&(n)x{>Ri9nd_HF6VxWUq{%0eiN)#vPRYTQN$es7leMrLF*>)@ zsJi_7I)(_#!T)cCwXBvA^mZ|L`(>88WwbY;VX3B+oz5g0&aaR{b2<)Wjd1S+>#l*B z!sB=groy>t;=Y)>8T7LBeu0S6zIY2QNXLtQiUE*6tMD(tj$)n1uIjtYo>R)wlB~k_ zh!wGQR(e_ZKCxVPtilhN#l{}k)H9oMDLmP)bBgIsQRP6qH8Y8U@gjpx{V@)AhD z8D=y=Wa9JB`a~w8xiCRwBE3)!0Z(M9|5u;Ly3`e!07OPNf+D+km}F37+NdWof%H4+ zECZ)2qVu!kB_$KlymNxYM0!CXsnW?Ru3m{~bX*|`KuAmqSD5Ft{y0lY5mQ19&1VNh zAugZui9&>!cX~bK4vadBW|$}y=S{xAiqGh_h-mJZV1YvQVNz*>e)Y4RZgpOjG1)eiyf0NmW@kzAcZ5|Gv7lNht(oXX_by(fC5|}!s+?H zLSiO{e=Gq66NA7pZYa;hAQlqA#2_vrf{8&~K?DV1;CZ_fcL@+Ukw-Ld_Al^#^6N7k=2qp&c z4I-Er#0x|)F^Ins!Nee96+kdCh5J05ljrCjR+^Vh}SbfnZ_~%ZOlN5Sxf#Vi2z( zf{8&Okck_RKEwzSObo?wBA6J&y+klEhzE&aVh~>=f{8)=ln5pU@oOTO7{s56U}6xV zDj=8`L?aPQ3}PV>Obp^YBA6J&r9?0>h|7pzVi5a@U}6x5h+tw6HxR+ZAZ{mui9y^; z1QUb!91%-yG9Z-F|`*G z!NedgB7%uQ>>`4RLEr^3tj33U3lU5V#l1u@F^JC*!NeebOav2y_#+Wa3}S8#5KIh$ zFC+3yG-4D19!7mS`0#FaY{KHln;l%;m-7oGiI(ZO;P8JUhnU|bEW(jL z5%aES{41a(&+020h{2dE8sJ0!SK?CvK9=x7R0anS&8N)eV`V%()~SXdAIeh$I5gtUSbswu+mD+b4%d71s#Cms2#nqx(IeskD`m9sM?{p2sYT@yu|v8 zR0x{4)Jc0mG**o*4)XJ33pSa&6I=LhlmF+~!WT?F8eiBN7ka)EOoWs=L-s}^>%d!I zV9IOxXa)a+0$UmA5_j|#U!w5pafQCvQ(?ue4EkZm-cxY!;C(SA8#8d<9WVL1mGf74*-qEp>k<)O4^;}EqLAU~OY6M|4Jvr9eNqfm>c=)GYJ}&x1 zd}Zo8LL;M8);RU#-UJ%Cj+pDo++besVIm_SjmVBs;vZ1LnTASAF2G!ljEsRu$9{xQ z%M3%qf_Y2q`TCk~pb-FWvvMEu4#?e%@hl8M4GCO?yaDB^@NbZ-yl@D(inu*`BXIGC z(Kq1H(xqbYQ#MB2F8mTinFwyoB1VBQVlzrcNIF6u@ez_czXpx-8zg8)qiQ3#h1Phv zaMKuHE$6o&g>G@nXvu9c_Y&F+#4%or`f1voh{oAaGQR_;Q{Hlh|E7-ZUeT$AmFwo+ z+crNsnbP;+AaJbAjlr20&1gf%&YIMsb{#w8ozeS&pG_UX!`TV_HoV-nG8+Jn-h^IS z_6Q%D_0(6Ph_tfI9(@x~WeuZm#G_@CikF?Thfz}a9X0YYlG;eDY=lHoxom`lqAxL) zWaKIL4Y@9&P#dW<##h;>jV5_(tTu+%<_N?xR(XC%sW~!VMcjmCiw+Arp$letpH! z305pYzGl=qD7Dt=TC``!SIf>Hm*O^EJT|HLV^U1-k2b}eOSR*8pYK@%dG7hIMB%^IM$>ec&Y0G$>$A6@XECiz7jvm#L=!Hi zTQH(J7sIt6rq!V_jdJ*;f8sqjbW5E%rM$cccL6HvdxlR_a5KB4Q<%|-@>R!y^-nN! zL6yCz#L9LFI5_CFz78@E#elea+Q%6I~E2ct7!;AD!+_T?d*7#7K!K#Yo>uRyszyAWmK3&%IMekL2Ey+fmBG zDHtpqhRJR$W%23)*tdi4D7ENjsU)lL4q_p_$zn@pvYSh^RI^LFwS=YWTr9$?$VwAb zvlnlr#HDBxA?H@KIK#W2$9_okmA#PYEBkQwye4aeJ-B<`bZdn2dpGvT!@IFZz`LvQaocsD;HJ%-UV7t+{Mad3u$2nlBz3aUW7m7yR)U*dVcZkD>q(_tA3BAPEU3^?91 z%?)}2-km}M&F81rPz{jXyQ)uo{wXrtsaqf-{Y8j9;ZmXI=IV<8v;v!QwQ{GfOe6E! zC*ZYDApIJ&K3N17<$viDL1?ECfp{IQF<`0Em2 z!0R*tbei9840M|KJic+`shWtXI!*j6(=dUlI!%}BwNJq7Gy!d5lSZ3G`Qttjh-mJb z&~ZT~i~v&S{l1>l!+R|g@On-_PwGh{&Z7LIzLte{ib+j8E>XIUh0qkepQHYc3t<%8 z*&`FueLX;KK@5jAh@rlN7}|RfLqiN=I1z)Gu1Oers2~m9W)Q>W#l_@*32m86Z13fo zbqg(O7dqr#Vw>=;VdA?5PN14g zJlm8pT;1$-#ai-8!hZeC;{2B(|L4fHNjwi<}>;bu=; zj0HDWm@)=}vDNxG?R}oaXqtNr#CUG$N-<-%_{yG3$)Ia<%0LXTmM$&d$JSSvGKN;0 zml%j~)#geAJxa>7ff!M3UTUE4vTUJ&ULv&IKn%5(u0=D>+MG0He4o9UdiwY<*aX6K+ zP-3EtjivJ)_|OVVd~}qNd=O>aXZV;PoK@n3C}WThWiIh?ql{$4DB}Uc$roi5k=!U_ zkQH_0W2K{v!U|Ewy&fymJ6lUdR){kCSZPfJB5mwaAT&tH0--_j_k{-GUQ}o$jxOq7 ztp(NLYJkWu4KLVb@<+o9?>70z!V7<`^Ne-zEO~}LOI}5(_j9!JH0=Kg$*c@q{FGro zxOIm8uE8UNJu$<6Ui%Zmek6VMupd?y3HwdSZHllT>4RZE_;X7gq~iFeLvItm8#r=| z3L2+wOlOZo;|~gal82#gTi6R#kk#DL7)m@&XmFt;25`i zJ8+2Gy$ugHZg&(Vg$Rf;(O}$;q$A`JA0fFD1&w1PK|2~{;&v?7nD~fS%ZY*XbaA@{ zv=tGJ7UB(=`@PpG<95?vjk@{&hjF_Mb@V#ws1&z@r?E$mqZ^3Z@sYtwin!efQpWAx z0Tcp3|A>bhx4RZ4g*Y`*hD73aB$CQyBP0}k$zc2Ab}TV*JLWZQ*@#!!sBL20E-G>M zg)+yu#jqK-qm-q%9Rl%?WEGCL40V+gniRLw-V{+X+FSAnOy$WfBexe@&@ZyA{?NJohoq>}~oCeX=uwnk|cz*1~qh>f-YtgJ^RT3P_G6yHb7 zac4MAys`UT;We*&wQ!uw{w|1sVKd)veeG59M$&pp+1^q%SE8jhU0T?l;Xu84Q8&s~ zin@tLZbgfws2e4gs2k;#s2in~s2gRKs2e5qqHg5jMcoK^Q8xk;qHaV5qHaW-ChDen z!3!AA?M2;K;zivE;1~#R5RAI9BY~(JI~0hz5fO;Gv8REk8xeu18&wd9x)BkGx=}ZQ zs2dTbs2fMtJ0KJA4#)(iinL#>bRFeXK#CuUU0#k`VGxkIv;6*10Oc8Y>IuLauVp7yiDx27VRPjgMIAOd-33!bX zI8D@zMS-Xr5tE{BM0!y-sp5~iae8_U6Yv@)Fh$gj=s?tsh)Gd5BE6`aRPjgM=m@+< z33#JSV5+Da@qwrt5mQ+i@m|!8z*Iv_@8h*k!0R-D^qdeP7Lx){EDA*4h?o?4Bhrh! zNfm$OjlRxnn1I)D0;h>Tu_zFH6WS@vn|LqyMqrA*&-r`8Pn6q%V}NIK!%yTE#Bfl9 z7-~C+p|u4uH2ffj(=dpkZwO-OLtRY1y!QWIXvzDnuATX_QFZKU@RF~%jU7a8(UmxK z_alSH03Vqp>~`rFzOGS)S~#gOm_$T=WX+PFW^)h+2U%+YU9`s>a`GD5tbdfvd4inW z9|-db;gn|JJHcx$rO*<;6MTrxj^vS!WRPfSG`s*XzQ)8drxguhYbE)!kgvE7^&^#q zY6vo~Y$V32H9BuIpVav>@uOhk)>Mjvs+>*$!I)QSHKVACB$C2Ic}SY zCZO)esdL!roFkH4VZg%wU}3YL_#Mv53j+?}ynqO0BrLW@6SV2|Q>3}e(Oj{lKS zj-Wx{JRKS3;6oOY6!x%+wqL@hY&Z_PfN$C3_mYq}El4VGg>5mOOD?t=<|X83{jB)t zQIK1emi~P|3%{QRn{81i9czRo71p(UoT{IP4q5eXH88@fPwuwZm}sN?U zwoZ#LOp}oee(ofpPR^XNIF`X>c1&RIv+=TAedU{K_IxyE`=)WV{$(X=1ZU)kd=;xy z_%D!Rgi^pcKtI#0!BK!EnfznTILHZU1>qODLSdEeA6cdQM^YqxTm1o$hvja?X-FxZkS;zF z9ufJbX2~K=w>2!+Tu#G}{nB)qu-wi#4IMizbU5Bk)!SfSMTe!kLzeIEkk7wsV#&jP}f3kmaLe?EzFk8;uydw z6h%GVjX~yLSWf3wDN1FPVp}>S@?kh14z#p5H64q*ffjM5rel#e&?4*9bS!$6fey;A z<$4FINUX{7#hOZTL4HwQDXiqDW6=cpr{p(<{8Q2e1 zEM2i|H8D}ukMsz9_gom;i+Fyp3Hk0~zHe}UffR2#N2#CG0(V)r>b*q&M(^AWmvwfa ztO)oc36!nvclMGPe-`}LuEx8|%gO=#XJ`e#WX#rY#0TsZWLDSWgNTIS;Q=K^g!KRc zWBG1AzfUb|NwZ6XCIn96NgAaNBWT4xTfMdHnv|{nD(SBHnpCw~0BLRYp7>9yY;~xN z>2^tfCg~?7{hFjN3C&IMUEt6u>Dhvhlzl8=tHTW^DiiA8D<7$=Qrj!mH`(f=u@jZH z`c#}PK8dz$RSeBV>HF;Ue2*4>Penq_EPtfVR;{2(sQF3emsk&ktJFzk_77i-Dq zogrdwMXlGX@1j#xs=b`04@6mdAV&VXl1yKzW{V>s=4X|$#aZBn{>GR;2pJkwSMoJz z_fX9vbqUqj#1{XfmXiOvmY5$@Fuijc(<+oE)D1$pP|_}x+Ul`nx;~*kho0K%n0=zM zAW|jN*;S-}z0}<*`7KiGK2Ro9ljNhq^APwH)HkuFPQ=S7WOyp)u&BiTHDC z_Jz+-{f%WcXCTg3hSE=f(pIMM<{!1TYD85415y?QE#in<{RWS7OwjP;1Z^TRjVH*s2EnzpZWr<^|c*AgxsD3AJ2k zF0MFH*`VH(cumCh6!2tT_BbXG!d#s*9bj0?UL|191Us(`ZMZ1j^FQ?CeY0& zdmOit=Lz(^N>a{8RFw6qlPtRczp+f{XHxGnwOODa)Ut)E)jy!k8kNK}Z-f8Yqr%t# z!A$@fR9O|CU86o8Cgi9dDI1ouLu#KuwH}P5z-`~&7N3;dSCtin5}+p--w?*v8tHfU(d9?{vO*_-;}hmiutcjV|s1k z0i;8cZj|)SC^2uX=X;4aMsEy-loQ>LS3#exKMc%QLf0bwdd)b}Wa=iQ-wt2xmHt=g z&A`~!+mL=I^iHI07SsDewx&&me87 zVEQApVyjH!Kcjd5RPkk`y>(wj+F8r=3yt4I`Z1&p>g^5xg7iNsDf#QC{Qz~VlRrZG zvzn7g|6KDkP<|hEO7R{3Fu4L;s0%P)c=wDY>m) zOud3MUd!}%lCPEgDdY`*trNdCv>pngjc?NNIM@~Jp2?E^K<0elGmCO`(qx9-ql;O~#odYkHcQ0o&l1F(TE!8`)XwAJ&H zJ|XEZC4E}b>uZ;xZlRp~Pli?_AH-Y$%<1?T4sAXTox;J7*%aTJ#)QW2fIMk$gR~!T zp{D^^>JKi|+psGhR+rBv<#F|Zy*nON9~9^|b$Pfy9#eDXus3rU+KwC8gIpKfR2R#TYm->T1<0=!qC0?Vl zILj(Eu1+Ryji=Nb1bR$88>@$J|GZmvR-=vAJ?AaZ?X9WX4QQhaol{HbG8fudw+7H& z7rLwA&Un4*ccDKv+zn_|Mz}z-j{&+|L+VK5r(k)Rg<6)~m7j|@syDdM2O_t`o790t zx@;WK4E3T5?Eo}OJw%tUwA9V&R|1VIN}X1zr7XKCPRY_L?Lw3#tv;?HktMCVmJ6lG zGFyG#g`RA%@okJJ1=20dQIQp-)Gf?a53ZDY(!yNzh=#!PvG`o|B=*W|eS7^Htc^R) z)zCjyJsF>;zAn(XdIh#LPkm5!-#4LkLaWx0@;3F`%BMhil|bWaH`e$C>L)Jrwenly z3)HIfNI9B zpch@}zKXvBI)9t4N9#FX{mO-QR^Af7P{q4hru%oXx>z7Rw%AkPO%TVAJ!(@oyAXTS zrfzp3_NYyL$c5OWHuaE(q(^OP)gIv@W4l&$WC^iHs%)+LybJBBEi3C#y?b@pVC}TB zb?P~RbdT1lJ9;!1_Gq1YtXETJn`VRZKU|3Y+o;}|(`D@6CF-5~2nnZOucghloz{{mk8yKK-nI*?CVnY zazjpF}GegbY9t3b!UMsXr9~DhXT+80^OiqR_B#%Q^$&ivPNxJ zU-ckcb*pa&pr-}80sF$XvTk(~H?(dGJJj0((7Od<3vFdPKo!Dj9ZW5Caf}$dil^d7 zaUc$1{bru{Fm_zebK!;U5l?)iz7&FoClp)YQ?K+ zM)P@#=zNw?YW?f{RG1pD*5b;+aU7(g(CzGvewbc||qn-ifg~%VaJ0KTj zIIiB+xEtvkksed4%6k!8`eVZ(>>_>{y8-FG##@lisd$h2hP1NH8bqxttgEX&sUH^P!))R-biVLyNU6yfd~OrI~4KP>cFp9j0cE ziTn%0)a~uyv&m|c{7UtmWVh9!E@|9vovE4<1>m0u9|49O9+g^MGF}UTe}mN}JRc3c zt?szhDI6XR-II71B%%DBpt-|39=fCMLFU(A`f1(o ztV7}b_Mg!1bq%cb%_^pEz??cBx@Oub;J*}!hR4Idi`1j<%--1N&r=M~}m zLgiJDK!zcduC{h0FdxI;1OMkkzo|Ggd@S4qJ@;AHH!Tj+u9k{} z9Wn~XMJLChhYrv@*#PSjXyRaZQ;AnmtByd zsbY8dzVLo%^}aBzD`Y(#S);n7tuC1ni!pZBhp)oe9a4V*|96HT4S%xk{o!w*^?Sol zg)0!9yGq6}WW9*KH;HUz!snUrqtl)aBkbS!Q=~tHwLdQ-^_LJSp9(LV#@V#8;Sb=$ zk?phIioU-ry6s4y{>Ct%jB<9z(Liq-y zm^Ie9O`nfkE4F&A=;vCo)tjaCTJ^hW$>=+U{#w!79m4H{g6S0>@^NYLol^G>ZU0jG zsQO~f-sq$1_Nx6zE9$OBdbvFi-666)B(i;8xP4w~JtnoDM0z3icJy_R3D3twp6|JM z%JY~=@)N216REpHBsr!Yop#86S@^sxv8I>R3PhZmA}5m{0{*MhK8CchiYenxFDpiz zURI1ay(}@PD%5zXbCzqzc7mLy`;C!pOXu=GekWPcjo*7}^bATBkNfTalju zKUt^#tGX>#r{*!!XFQRI{a|>OW`NO-wppF{MYcjNNeOxk=r8Q zkNi3^GddK#CVFG^v(Xo#e~mWVTkNasz4j4YRfu3GW8;;247-jv^je09LqdLFp)0nb zOySK3)3d^tBJHi)g0!=iX;}SQaump7M#4XH^q+2QrlopHR@l0uTkFv{%Y9Bk5nu) zC$uM2VePg?tqa08hp&kAN5&!_k31MDi>`}a8tsl=8U0A~f#|oQ-;Xxh8|*LGkK0e% zf3YKD+%@|DE(zlepbxPzb`LNUagSiPJhA3_>?J4Snx_#LYB zQH)X<=5-mysSIxc$}m!87+Jhu!e=@@Gw_*-Pn)_`?Z$UohSg=EXF}hJJQF$@eT}u6 z{W$-^p541U`U*q+*`w|K*+OC2?xmBF%cnvvTOruhyLU^bz27P1+MU6I)1SL=uZx_- zedSb~&YlXn>>Oe@avj4%{e3+sST~4QxH(feMF*Bm)(>PQcGYfq z4D->sZg6-2E$!{k?OCR_=5xKm9r+#E!a+RR3P%TfnBSBu9&mcs4)^u<=JF`$>MIoS z=+ExW^)FLH*+D*pSzpg(LmkfH!DVV7H#p2!%|jsIzfGGf6xL?*%T$lkKRhtFF_#6a zWvadVOc4tIjB2*OuuMT=*$w%=-kp89!)O5Q=v#TCod`r*NzJ2+>|RE$Q4donk`N$3!3U~ zF(K13g$W=$Bi!AcW0!KhorAr(BZl6y%&CjXZpwNbH@DL=aQ^&yClA{w;+n>~K~B$J z8RgEwYn+3*?YTq4eVD5nRiI;pSL;;)m!q}}cI5UB`<#$!JDlw+UN%_B?#pc%YR_xI-torCSedvgj7 zZhf{Vr?%(du<>m7EM6HmNgGzXTx(bBjjem-B}*60v<(-XZn%dWCQ(l7%I8B08*_d8 z4-{$QQcjCB9t1|{`I?Dz+hN3;$*^-EyFW+U+)mTuEJ2UqW~gjca*=c{R5iy#nNBOr zAWjy{nyj8SU>9`r%JDot#>n&a%D)(?4N%gKz9JZL4tE!iBG=*c9Mrk3CI6`rv>lFz zP)mjw3gTfsV4uN4`%*f{io5cC#avh4AjSutmCsJ`_T5GJq)pkL14MP_iUGLbFQlNG zhWm?s{Ul}kv>a7r;(C*IClAdG7mLo|+H3(@!@s@_A1-<6zH+TsZO!IU-k#5)b=84s zwqIwo39rpNhehuq4ZO^<-Md8=)o~QP>Fa4LVxiePjJh;rbT}_A2RwR9MH`0ue2|_V z9Ly4hnKE8`r6Ta%36CBiZ-aXp*xP?p2ChUpNspx>(?EAIH?-qG-WlG1pj7CwgI~)H zWb+40MLV*2D0n^oefQj9$6sI=ZtUyr%?*|+7+$o3ow+=hqREBWb?ocgKa8!$l*Jvn zLJyYjV4>Ep)YzWu&mNInVKQ%+Z0~SSadJVsGjuf12|HEM0JaiGO9k792aA0J*s%d$ z?Ar@VEBZ=la^k3E7UF64S z4(`p%cXkgCab|Z8_7$nWUi4=$v!OO z2h=`?`?#&y;sFtTS6?r3m|OW`VOJlreIh1w(sNKelV1FHI8MK8=r&!Io`)5PJ1WWOGYT6K&s#Wz{ppTj;UC(717e z$V2^-rP)fR4V%Yna$FdJ^wB|Y1_DLyg5;KL zfHdx6$!XvW7cscGK{`+6bEINkpmnFWNY#bo3mv5~sSUU@OCO<;>$X}@}V(hAdU~wme0#Z zeO-SJ2R(m@pZ#{{u&)jdYd(nD5TCOZo>26|VGm+pAM1|vT^g3DE#d6+flPwXu6kl4u|?Ht_a!2i0wOVOUii^*{8$nNbfIzwjIupv5x zgRpm6#U?G6&C{=VN)aa`XFEB(h%1O z;;~+i1VF=>O_rkqTSquU^wT!ja{xasLM%L%S%~{{7$(FgxN%;aJCMDmuSA1g(r^~* z1a`1IKR`~DnMec1gN?bHYC^3XBc$@cq0e1JyfYv7phgw?6v(|Iy5s`J=^|EQ2GO+x z55^+6f6yru`+5p8b=Tum;uV^;8t3*Lyk&PTe@)*M#q2q^m0o$^EZu4(gs?Q?R;;ql zaGrdEbb;00M^!o_6?_BVi~8o2R45&jN+hLoQb8NketJYKZMviST&%oxRF27r%kZ@9 zZjUC0lsGz`X|2;?CIxLX+=NMFjy(lVw!KgXhq<7%mAHVMEZX|}IR^@**`kj{P!LbG zr7q}=kB6rA{D#|>2kky+o|_d6n%;tG;QR|$?%rKI(C3XMcGQR}fqg5D+tmT=l#w|N z!G^UbGXnRo0d1Ms?10#V%li0$#Cy+4Y3e9WAu7hXrMpG|d7Uhkq&P z8Q0(M9Omv|hqFCbz%DaTXimZ%*cQvemZvM<$h5iMYsY4S!>2KJ1lgc#t0P(WbJ-BlITx+Bua{Nj+m~RP=ZfM}Se5$(tp()_?S{Q$%i33De%%o_zizOXehX0r z#E|e@o5PHi-1@$Jp|~aAk=vKWnObYvw032WV&jFGUKqk!>O$-r+SNtwA;5*qCR}a8X>T(E4ALoX z>_l^t!5jxK$!>>-fOC?(@l+nM4oZ6?&S~oBR9R8Mdk^tZG2j-7ia+A`oLJ=-TNZEqdSOiee|pIl#(~I%;S~PEPmsoh?;$BFZi&2 zD{@EiO%IfZ&r+(q6>sJW;D>95W$k!_*M+x5Dq4v*N2+NEH667dDNgqIZ!KEPt7Z7Q zbdS_vy?&H+3Dth&a3ydCp)BO=1JC_xmpprcJB*)rY!_aXTbHI)yYT1-T);=YCVe|$yqn&_MWj|`|1x-J3G2(FH*oR$? zZ#-?4z7{}LWa(KG+nn6UKIi)BCh|$Eby712olx&vP^(|_pXIMd9Xl8w z+FG7mE4$DF$NL~;R+Sq>zFsL+^ZYew)mdo%D7becKWyZ>z)uyFe=%rj>)Kw7O$BOK zUj{zfQv0aK1-nEZZCe?PTpn$4bkoSuvN&FlJ0Ke+phZrSt&H6I@t+E4c?I}(gX1Q= z4Nv1kD;orliCQM#qrzc3=z@Jqs|}DS3yBJ>ca~oZLH?J6M?W|X;oDuDK{?VdJ3T#T z$6nzbs1fKvH{R*5lRj+6EnVtHTg*hxn{dB^J$+T#=lW&w>)&V(Tm$yqjWOW(%SbHo z*ACiO8n+B+Ek0`eYbeIHGrkf{>9;<#IinZ)E#gB>(>i>9W5&e!nua{IPxy#xUAEc4 z&6DSH8h1`;8N)(v%6AG*&7R16V*4t#0iJO)e9LCBB!yesddyX9m+HiSs$4(Q@KCC< z8-BJE-wtk98__FrXMY?SmtI&0Z77GQn&mGe$24kkZRzLS*v3-&-8ATjfn^RmEu=kS zTb$X%W%1dMl-i&VF3p@YyhI;hdVtyZV)9mSrjGYXD+BO^xb`1@Eu`Gw)$axut|Rm; zQeIEK^uruk_GE~Dc1ae`Ay6JgPw8b4X!OcAxivb0$w4kv-sVxObB(P2mi`VNjZ@30 znm8}H!f{P0LQ*}RxaQuXbETCfE$eL>5>X2!JZNW4=0g8-08}WQcY01fss$XEgYYn= z5il#+I+2j0$5q)+L0?Yk-LlFd$VRUrtJw-_*gs-_hn{LDkFsi>C_i}-3eu}wdfJ%WqCXLn3Z{@>f6zBANsl%)~~%jJW_p! z^dJjuVdQ-^} z$s?OXSfG3As;HP3wirVdN1-L>)a}!N1X8 zvK8f7t=)32ReJT;Xr(u`Nh&2vU;ALD?&? zpPV^dJ-BL+!sI#oT#sD212w420dQ8e+-0yPJ)GXHt7H&IYoq7(=?8tF-{W|T;VZI}f-S4eN`^%!XXW&D|H^ka2DD3ie(KWe;+nxW~9_n>w23@dxMCYJ4h{y9JK zDqPy;nLtU~l$vsSZ8vX0UG7y($wtUp#0=1<4eoby(6HI}`1oPJJ9P;qFx+UL*zIj)1fm0#ZSV#>?XfkEGV?w7 zm{7Q7Hg6oG5Y8(@X;#_R?$k%L*qY6YY6MgT=4w4x2iOD!-wmc z5%6j7C&o9pbGM$eO79@FSL7*=)^j#==ktcu#yhz67ItH0x7OG zsj+wL1cFBr?JUyRTBLDoZAYgWOks$s50~9};BJ>E5ATHak!vAx17KEwpxn;$$fJWl zoXVvD)et(y317g$hlZdb9pci5S$@6V4PzARxz;%r#9J4$By%n9J`OWSynV=rB+&~0~#wda~cX~rp9N7V`q|HU`ou@s@T#{C{%L> zzTAQ0cv`VWE&iQ?a4Kh6_})WR6&eLQtE#FBUob$5FCxu~rn2~rmQdBKXay)c!0TQs zRu!wPPmQ-(E@ai!gsd~baJ(}lk2XM7St4Yp-KQPHZ*W(!EsMNUU^W6ONXiUcw7TV^<$JceC3PdG(N5$$DsJs z_$>rdo=?@J#(o~x7?G7iqSmcU$DW10XU4#}R@H`V6|Sn9 zITN}GRn^C$(AZ0m*;QN|ykHKfc~?0Gj%BRFF(#G9-77fQL~RKDj?dJpt%;{$V$b7$ zSdec0URvNxNSqqKuc|s`TSnL_NGq*;0;7{0|5Qx(^ixoem8xNdvFGFHf>%M)gA(*H zJf!l&F|ePN8hc9D{sJG+H%Dw1e!?@V)d4%u87Lq%{&*a}If4PJLjPkl>D2f)w8G-3 z7oSCGA<+pbc}h1h{(X&nW=5R* zN{v4&BB7n1gG)R${!%oC0kAL~s;ZL104&R@ps+B{8st%8VcMl>SC*(}UX^ZtUS%vQ z8vGm7LBj@zs;cR+av#!@jhtNZU((h87LSFrCKkmK^~v!hXWoDJ)Vh&@PmNc)#=u;a zHU@BU4Mg}=#xQ?qLz2|Pjck>Ub)|MtaqMH4HkU3~D<*cT%c{kkMp0l&bLw?9x?1US z&1UT9n!$`%JaxJ5iOc+|IGJ-gU{+iYE9go<*OIMOnOK=7E2T42S*@t9R2N#Vhc~cN zSs8M@SX`?!?y7b2liZ-YI2xh8;?z*D z$h9YRz-VZX*3ceTLwhW0V~^3so}f1NP#gU|ZR|-6P1MGo1(1xo-&0CG73?8aRFKNL zecw|Nld+mfa^2TGzP>^N+Hxp$ec7T|wQkx<4r4wX75-!6TDfD#Qe(&BmX#d4h1O_S z&>d7zk(HJm=Y*k5W5=Krc|v=fIAh1$BGi*2KHD-ElVi80E>4Zzj-OjgT@Q0eVp;>2SZY~ZplZ$t#S#z?MA9D+{?qHO+S#=7 zxnuFApV;z?Pk-o>zm7j}(eBqLzn@qWwo`R6Ju(%1ay@{5ANv%O&oFryBxz>8!Q=#! zrnO^qcm^$P5O^wuRs~|336Jki=MnOD_i+YSB9OGckOpSfPeLjknB2^*# z0M1al=Ty23sf-tv4U6tRRYP*_IY5rzdqT@;LZ-N@Dy=JE!eW@agda2Ho;6f^43%r? zh6;FN(U2it1@~a~6p#mANYXvwjH<#X7Rg}0gN%g?M9;udDLNoX7Q**6`G+5{4yheh z!>)XGXtOiu-HGEJ^23D?=*jSkyc_9@-OG>{;1@{GX4^S56lbR3_4b35DI&1%K10=cEdI{~@;;YdL7j6aH>U5hn>KM_Lu7?u{M*{r!T%}q|5xQ^Hx~Wt^FQK~UBge#s)`f%+)qsD zucnlh-1hE{?vC70Zh88Vt~d6swU?iK@_QV!_BB`W8dTw`&A9rN9lQ!xy>SNwH;b;? z&{y0zy!WaNUF!yMeI|F+r6qIeldrd36|knOoV{0HCHF0Z_|_r(MAN4sq4|4~`Luz8 z&oBDul)|N%d`Ex(CS15sVl}y(ToKoGUYQ3j6T2B?7l8O%nhM{FRbv4(?3jAMben`H z-9~&ae-2-dmGA2k!~9C5J5@JsN9;trcRO;O@@8T;o|_Sal%LX4Ux@tnl%6MSfq(jW zkp|=&#(wi8xC-KPbJpmry(qxdTk``+~sp zZ5d-$lQ|s`nx*Ks{%<7?vCsj&Elhnd-Y|gw7z^O768$&FSEk<*9Yt?-M9C$A{8gYb z?ddpWkH|3;kn>VRAn;8A$fw^u^LD}pyuIuMqowf2B_6@!I@?)>dn-%54|SFTJ+-7G zMtn2d@00BGZM90Y6_HMiGkGxX!MB6>DgiXW8x_6m$4s4!i_fZ&3|cgi`xcAiY*)65#k6a1Sd|XtCIZZi{2SeVqBFGm7-4r zuf{{Em7?!p-HBSCsPk1)hjAyyq51xa!HzWMgFm=3d92W#|9yXt@LTgrJtx1%_rI^% M|G%aGcWB`M0{O|o!~g&Q literal 0 HcmV?d00001 diff --git a/Toolbox/Toolbox.csproj b/Toolbox/Toolbox.csproj index cc7b36cb..acf30702 100644 --- a/Toolbox/Toolbox.csproj +++ b/Toolbox/Toolbox.csproj @@ -10,7 +10,7 @@ Toolbox v4.6.2 512 - true + false true @@ -184,9 +184,21 @@ Resources.resx True + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest + + PreserveNewest + PreserveNewest @@ -446,7 +458,10 @@ PreserveNewest - + + PreserveNewest + + PreserveNewest