From 9dcba19b67258163c59f56157482825b56ae215f Mon Sep 17 00:00:00 2001 From: "liu.wenjie" <783789228@qq.com> Date: Mon, 9 May 2022 16:17:41 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=8D=95=E7=8B=ACJ?= =?UTF-8?q?ob=E7=9A=84=E4=BF=9D=E5=AD=98=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=92=8C=E5=88=9B=E5=BB=BA=202=E3=80=81=E6=AF=8F=E4=B8=AAJob?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=BB=91=E5=AE=9A=E4=B8=80=E4=B8=AA=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E7=AA=97=E4=BD=93=203=E3=80=81=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E4=BB=A5job=E7=9A=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/VisionEdit/v14/.suo | Bin 721408 -> 753664 bytes CaliperTool/CaliperTool.csproj | 1 + CaliperTool/CaliperToolRun.cs | 7 +- CommonMethods/Interface/ToolRun.cs | 2 +- EyeHandCalibTool/EyeHandCalibRun.cs | 3 +- FindLine/FindLine.cs | 14 +- FindLine/FindLineTool.csproj | 1 + FindLine/FindLineToolRun.cs | 7 +- FindLine/FormFindLine.cs | 2 +- FormLib/FormHalconWindow.Designer.cs | 65 +++ FormLib/FormHalconWindow.cs | 35 ++ FormLib/FormHalconWindow.resx | 569 ++++++++++++++++++++ FormLib/FormImageWindow.cs.Designer.cs | 2 + FormLib/FormImageWindow.cs.cs | 2 + FormLib/FormLib.csproj | 9 + HDevEngineTool/FormHDevEngineTool.cs | 1 + HDevEngineTool/HDevEngineCode.cs | 2 + HDevEngineTool/HDevEngineToolRun.cs | 2 +- HalconTool/HalconTool.csproj | 1 + HalconTool/HalconToolRun.cs | 7 +- ImageWindow/HWindow_Final.resx | 2 +- PMAlignTool/FormPMAlignTool.cs | 4 +- PMAlignTool/PMAlign.cs | 20 +- PMAlignTool/PMAlignTool.csproj | 1 + PMAlignTool/PMAlignToolRun.cs | 8 +- ToolLib.Log/Logger/UserLogger.cs | 17 +- ToolLib.VisionJob/FormJobManage.Designer.cs | 64 ++- ToolLib.VisionJob/FormJobManage.cs | 30 ++ ToolLib.VisionJob/FormJobManage.resx | 121 +++-- ToolLib.VisionJob/OperateProject.cs | 31 ++ ToolLib.VisionJob/VisionJob.cs | 22 +- ToolLib.VisionJob/VisionProject.cs | 46 +- ToolLib.VisionToolList/VisionToolList.cs | 1 - VisionEdit/FormMain.cs | 34 +- VisionEdit/Program.cs | 2 +- VisionEdit/bin/Debug/DockPanel.config | Bin 5352 -> 6308 bytes 36 files changed, 1022 insertions(+), 113 deletions(-) create mode 100644 FormLib/FormHalconWindow.Designer.cs create mode 100644 FormLib/FormHalconWindow.cs create mode 100644 FormLib/FormHalconWindow.resx diff --git a/.vs/VisionEdit/v14/.suo b/.vs/VisionEdit/v14/.suo index 37388b01aef8af49e31b82fefe98238b40ba04a8..7a038c5be67c3d61166f425b2c2f90895410d531 100644 GIT binary patch delta 27004 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 KwrWw(?*0d}NI75t diff --git a/CaliperTool/CaliperTool.csproj b/CaliperTool/CaliperTool.csproj index c880084..4d97414 100644 --- a/CaliperTool/CaliperTool.csproj +++ b/CaliperTool/CaliperTool.csproj @@ -44,6 +44,7 @@ + diff --git a/CaliperTool/CaliperToolRun.cs b/CaliperTool/CaliperToolRun.cs index 58d8fc7..4308cc3 100644 --- a/CaliperTool/CaliperToolRun.cs +++ b/CaliperTool/CaliperToolRun.cs @@ -30,10 +30,10 @@ namespace CaliperTool { public class CaliperRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { Caliper myCaliper = (Caliper)L_toolList[toolIndex].tool; - VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName]; + VisionJob myJob = (VisionJob)runJob; for (int j = 0; j < inputItemNum; j++) { if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage" && L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null) @@ -73,13 +73,14 @@ namespace CaliperTool myCaliper.Run(SoftwareRunState.Release); if (myCaliper.toolRunStatu == ToolRunStatu.Succeed) { - myCaliper.DispMainWindow(FormImageWindow.Instance.myHWindow); + myCaliper.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow); myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行成功", Color.Green, selectNode); } else { myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行失败", Color.Red, selectNode); } + L_toolList[toolIndex].toolRunStatu = myCaliper.toolRunStatu; } } diff --git a/CommonMethods/Interface/ToolRun.cs b/CommonMethods/Interface/ToolRun.cs index 09e4df5..f0f1dd8 100644 --- a/CommonMethods/Interface/ToolRun.cs +++ b/CommonMethods/Interface/ToolRun.cs @@ -22,6 +22,6 @@ namespace CommonMethods.Interface { public interface IToolRun { - void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList); + void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindow); } } diff --git a/EyeHandCalibTool/EyeHandCalibRun.cs b/EyeHandCalibTool/EyeHandCalibRun.cs index 31d5ff5..854cbbd 100644 --- a/EyeHandCalibTool/EyeHandCalibRun.cs +++ b/EyeHandCalibTool/EyeHandCalibRun.cs @@ -11,9 +11,10 @@ namespace EyeHandCalibTool { public class EyeHandCalibRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { // throw new NotImplementedException(); + } } } diff --git a/FindLine/FindLine.cs b/FindLine/FindLine.cs index 1682b4a..5315c73 100644 --- a/FindLine/FindLine.cs +++ b/FindLine/FindLine.cs @@ -227,11 +227,15 @@ namespace FindLineTool public void UpdateModelLineLocation() { // 计算新的位置线和转换之后位置线之间的差异,再将差异补偿到模板位置线中 - HOperatorSet.VectorToSimilarity(new HTuple(newExpectLineStartRow, newExpectLineEndRow), new HTuple(newExpectLineStartCol, newExpectLineEndCol), + if(newExpectLineStartRow.Type != HTupleType.EMPTY) + { + HOperatorSet.VectorToSimilarity(new HTuple(newExpectLineStartRow, newExpectLineEndRow), new HTuple(newExpectLineStartCol, newExpectLineEndCol), new HTuple(expectLineStartRow, expectLineEndRow), new HTuple(expectLineStartCol, expectLineEndCol), out changePoseHomMat2D); - // 更新位置 - HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelStartRow, modelStartCol, out modelStartRow, out modelStartCol); - HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelEndRow, modelEndCol, out modelEndRow, out modelEndCol); + // 更新位置 + HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelStartRow, modelStartCol, out modelStartRow, out modelStartCol); + HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelEndRow, modelEndCol, out modelEndRow, out modelEndCol); + } + } public override void Run(SoftwareRunState softwareRunState) @@ -253,7 +257,7 @@ namespace FindLineTool { UpdateImage(); } - if (inputPoseHomMat2D != null) + if (inputPoseHomMat2D.Type != HTupleType.EMPTY) { //对预期线的起始点做放射变换 HOperatorSet.AffineTransPixel(inputPoseHomMat2D, modelStartRow, modelStartCol, out newExpectLineStartRow, out newExpectLineStartCol); diff --git a/FindLine/FindLineTool.csproj b/FindLine/FindLineTool.csproj index 5b451a7..6e5d676 100644 --- a/FindLine/FindLineTool.csproj +++ b/FindLine/FindLineTool.csproj @@ -47,6 +47,7 @@ + diff --git a/FindLine/FindLineToolRun.cs b/FindLine/FindLineToolRun.cs index 1511e39..2b72051 100644 --- a/FindLine/FindLineToolRun.cs +++ b/FindLine/FindLineToolRun.cs @@ -31,10 +31,10 @@ namespace FindLineTool { public class FindLineRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { FindLine myFindLine = (FindLine)L_toolList[toolIndex].tool; - VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName]; + VisionJob myJob = (VisionJob)runJob; for (int j = 0; j < inputItemNum; j++) { if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null) @@ -74,8 +74,9 @@ namespace FindLineTool else { myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myFindLine.runTime}", Color.Green, selectNode); - myFindLine.DispMainWindow(FormImageWindow.Instance.myHWindow); + myFindLine.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow); } + L_toolList[toolIndex].toolRunStatu = myFindLine.toolRunStatu; } } } diff --git a/FindLine/FormFindLine.cs b/FindLine/FormFindLine.cs index 65befc5..6f01142 100644 --- a/FindLine/FormFindLine.cs +++ b/FindLine/FormFindLine.cs @@ -87,7 +87,7 @@ namespace FindLineTool chBDispRec.Checked = myFindLine.dispRec; chBDispCross.Checked = myFindLine.dispCross; //// 将要编辑的线显示 - selected_drawing_object = myFindLine.inputPoseHomMat2D != null? HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] { myFindLine.newExpectLineStartRow, myFindLine.newExpectLineStartCol, myFindLine.newExpectLineEndRow, myFindLine.newExpectLineEndCol }) + selected_drawing_object = myFindLine.inputPoseHomMat2D.Length != 0? HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] { myFindLine.newExpectLineStartRow, myFindLine.newExpectLineStartCol, myFindLine.newExpectLineEndRow, myFindLine.newExpectLineEndCol }) :HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] {myFindLine.modelStartRow, myFindLine.modelStartCol, myFindLine.modelEndRow, myFindLine.modelEndCol }); GC.KeepAlive(selected_drawing_object); selected_drawing_object.OnSelect(OnSelectDrawingObject); diff --git a/FormLib/FormHalconWindow.Designer.cs b/FormLib/FormHalconWindow.Designer.cs new file mode 100644 index 0000000..142670a --- /dev/null +++ b/FormLib/FormHalconWindow.Designer.cs @@ -0,0 +1,65 @@ +namespace FormLib +{ + partial class FormHalconWindow + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormHalconWindow)); + this.panel1 = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(831, 549); + this.panel1.TabIndex = 0; + // + // FormHalconWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(831, 549); + this.Controls.Add(this.panel1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FormHalconWindow"; + this.Text = "图像显示"; + this.Load += new System.EventHandler(this.FormHalconWindow_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + } +} \ No newline at end of file diff --git a/FormLib/FormHalconWindow.cs b/FormLib/FormHalconWindow.cs new file mode 100644 index 0000000..6f6f839 --- /dev/null +++ b/FormLib/FormHalconWindow.cs @@ -0,0 +1,35 @@ +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 ViewROI; + +namespace FormLib +{ + public partial class FormHalconWindow : Form + { + public HWindowTool_Smart myHWindow = new HWindowTool_Smart(); + public string WindowName { get; set; } + + public FormHalconWindow(string inputName) + { + InitializeComponent(); + WindowName = inputName; + } + + private void FormHalconWindow_Load(object sender, EventArgs e) + { + panel1.Controls.Add(myHWindow); + myHWindow.Dock = DockStyle.Fill; + } + public void ClearWindow() + { + myHWindow.DispHWindow.ClearWindow(); + } + } +} diff --git a/FormLib/FormHalconWindow.resx b/FormLib/FormHalconWindow.resx new file mode 100644 index 0000000..34500af --- /dev/null +++ b/FormLib/FormHalconWindow.resx @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAIAMDAAAAEAIACoJQAAJgAAAEBAAAABACAAKEIAAM4lAAAoAAAAMAAAAGAAAAABACAAAAAAAFAl + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACogIE83LCu6Mykn5DMp + JugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMp + JugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSfkNywruSshHk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5HBwJNSoou0c7 + OvGSg4T/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66d + nv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/koOD/0Y7OfE1Kii4ORwcCQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA0KimwZFhX98Cwsf+hkY//ZFpO/1lOQP9ZTkD/WU5A/1lOQP9ZTkD/TEIz/0U8Lf9FPC3/RTwt/0U8 + Lf9FPC3/RTwt/0U8Lf9FPC3/RTwt/0U8Lf9FPC3/RTwt/0U8Lf9NRTn/WFBE/1hQRP9kW1L/o5OQ/8Gv + sP9iV1b2NCsprQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACsjH0I/NTPywK+v/3NpWf9YUiL/k5ME/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/o6MB/2FgHv+TrUv/oL5S/6C+ + Uv+PpUv/Vlc3/3VsYP+/r7D/PzQz8i0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUqKamJeXn+qpuY/1ZQJP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+jowH/YmAe/5Ot + S/+gvlL/oL5S/6C+Uv+gvlL/oL5S/1NTN/+snZz/h3d3/jUrKqUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADctK9SklJX/dmtf/4N/Cf+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6Sk + Af9iYB7/k6xM/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32PRP92a2P/o5SU/zgtK9IAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OT + BP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/paQA/2VkHP+QqEn/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/42nSv9kXFD/qpqa/zUr + KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr + Ktyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+lpAD/ZWQc/5CoSf+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/42n + Sv9kXFD/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6WkAP9lZB3/kKhJ/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/n71R/2tvRv+Bd23/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/paQA/15ZG/+QqEn/oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/6C+Uv+fvVL/cnZJ/723mf+QhHv/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+lpAD/cGov/6ymh/9zekj/oL5S/6C+ + Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/5+9Uv9ydkn/ysOk/93Yt/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZVtM/5CP + Bf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6SkAP9waTL/1M6u/+3n + xP/CvJz/c3pI/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/n71S/3F2Sf/JxKX/7efE/93Yt/+QhHv/qpqa/zUr + KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr + Ktyqmpr/iH10/2diMf+goAH/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pKQA/25p + L//Tza3/7efE/+3nxP/t58T/wryc/3N6SP+gvlL/oL5S/6C+Uv+fvVL/cHVI/8rFpf/t58T/7efE/93Y + t/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADUrKtyqmpr/kIR7/8zFp/9vaDT/oqIB/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+lpQD/cGov/9DKqf/t58T/7efE/+3nxP/t58T/7efE/8K8nP9zekj/oL5S/5+9Uv9wdUj/ysWl/+3n + xP/t58T/7efE/+fiwP+1qJ7/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//b1LT/cGk0/6KiAf+mpgD/pqYA/6am + AP+mpgD/pqYA/6WlAP9vaS//zMWm/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/Jw6P/amxI/2ts + Sv/Sy6v/7efE/+3nxP/t58T/7efE/+jjwP+6raL/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/2tOz/3Bp + Nf+jowH/pqYA/6amAP+mpgD/paUA/29pL//Mxab/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/93Yt/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Y + t//t58T/7efE/9rTs/9waTX/o6MB/6amAP+lpQD/dG4w/8zFpv/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+Lbuv+ckYf/qpqa/zUr + KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr + Ktyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/d2Lf/cWk7/4yKBv9wajP/08yt/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/SxLf/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/5t+9/7Coif/g2rn/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/xcOp/3qIfv98iX3/19Kz/+3n + xP/t58T/7efE/97Yt/+RhXz/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/AvqT/U4yR/1zl + +P9a4fP/Vn1+/9nTtP/t58T/7efE/+vkwv/FuKz/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP9yhX3/XOb5/1zm+f9c5vn/Wt3u/4aQgv/t58T/7efE/+3nxP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Y + t//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP9yhn7/XOb5/1zm+f9c5vn/Wt3u/4eQg//t58T/7efE/+3nxP/Txrn/qpqa/zUr + KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr + Ktyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP+8uqL/UYqO/1zl+P9a4fP/U3h5/9jSs//t58T/7efE/+3n + xP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/wsCl/3qIfv98iX3/08+x/+3n + xP/t58T/7efE/+3nxP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADctK9SklJX/m4+H/8/Iqv/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/Pwbf/o5SU/zgtK9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUqKamJeXn+t6il/5aPe//t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+vkw//FtrT/h3d3/jUrKqUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkiHkRCNzbywLCx/5uP + hf+ak37/1tCx/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7OXD/9HEuf/Br7D/QDY08isf + H0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA0Kym6ZllY9sCwsf+zo6D/kIN7/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xy + af98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf9/dGv/18y5/9nOvP/Ux7n/yLi0/8Gv + sP9lWFf2NSoptgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAzGhoKNSoou0c7OvGSg4T/r56f/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7in + qP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7in + qP+vnp//koOD/0Y7OfE1Kii4ORwcCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACogIE83LCu6Mykn5C8lI/UvJSP1LyUj9S8l + I/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8l + I/UvJSP1LyUj9S8lI/UzKSfkNywruSshHk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA/+AAAAf/AAD/gAAAAf8AAP8AAAAA/wAA/wAAAAD/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/ + AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4A + AAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/ + AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP8AAAAA/wAA/wAAAAD/AAD/gAAAAf8AAP/g + AAAH/wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAAKAAAAEAAAACAAAAAAQAgAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABKSIfSi0gHp8vJSTJLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8l + JNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8l + JNMvJSTTLyUk0y8lJNMvJSTTLyUkyS0gHp8pIh9KAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAsHx8pLyUjziwiIf1RRkX5dWhn/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3tt + bf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3tt + bf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3VoZ/9RRUT5KyIg/jAmI8wuISEnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsIx86LSQh9FNHRvusnJz/wrGy/8Kxsv/CsbL/wrGy/8Kx + sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx + sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/6uc + nP9RRkX7LSQi8y0fHzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHx8ZLiQi7mRYWP3AsLH/wrGy/4J4 + cP9KQTb/RTwx/0U8Mf9FPDH/RTwx/0U8Mf9FPDH/RTwx/z40Kv84LyT/OC8k/zgvJP84LyT/OC8k/zgv + JP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP8/Ni//RT00/0U9 + NP9FPTT/SkI5/4R4c//CsbL/wLCx/2RWVvwuJSLtLCEhFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCIgnT81 + M/m+ra7/wa6u/0M5Lv9NRR3/jIoI/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/4+N + Bv9PTSX/mrZQ/6C+Uv+gvlL/oL5S/4ecSP9LSjD/RDw0/8Gurv+9rK3/PjMx+S0jIJkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAMxoaCiwjIfmNf37/wrGy/1RKPv9mYRT/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/4+NBv9PTSX/mbZP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/2NrOv9WTUP/wrGy/4x9 + ff8tIyH4ORwcCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACsjH0IsIiD+uqqr/7ysrf87MiT/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/5COBv9QTiX/mbZP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/OzMp/72urv+6qar/KyEf/y0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsIR5dNSsp+cKxsv+Zi4f/T0kf/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5COBv9PTiX/mbZP/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/05NMv+bjYr/wrGy/zQqKPksIR5cAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjou + LPjCsbL/koV//1RNHf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+ + Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv9SVDP/koV//8Kxsv86Liz4KyEeZgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACshHmY6Liz4wrGy/5KFf/9UTR3/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OS + Bf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/UlQz/5KF + f//CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+ShX//VE0d/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/01MMv+ThoH/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/koV//1RN + Hf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/3yLRf9UTUD/qZ2W/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsh + HmY6Liz4wrGy/5KFf/9UTR3/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBP9NSSP/l7JO/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32MRv90b1n/lo96/6udl//CsbL/Oi4s+Csh + HmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+ShX//VE0d/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5STBf9WTjP/V1Q8/5m0 + T/+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32MRv90b1n/6+XC/5eQ + e/+rnZf/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/koV//1RNHf+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5ST + Bf9bUjb/3ti3/9LMrP9bWT//mrVP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32N + Rv91b1n/6+XC/+3nxP+XkHv/q52X/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/5KF + gP9RSh7/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/5KQB/9dVTr/4tu6/+3nxP/t58T/0sys/1tZP/+atU//oL5S/6C+Uv+gvlL/oL5S/6C+ + Uv+gvlL/oL5S/36NRv92cFr/7ObD/+3nxP/t58T/l5B7/6udl//CsbL/Oi4s+CshHmYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAArIR5mOi4s+MKxsv+qnJX/UUk3/4eDDP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/5KQBv9dVDj/4tu6/+3nxP/t58T/7efE/+3nxP/SzKz/XFo//5q1 + T/+gvlL/oL5S/6C+Uv+gvlL/oL5S/36NRv92cFr/7ObD/+3nxP/t58T/7efE/5eQe/+rnZf/wrGy/zou + LPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5WNef9rZEb/i4gL/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5STBf9bUzf/3di3/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/9LMrP9cWj//mrVP/6C+Uv+gvlL/oL5S/3+NR/93cVv/7ObD/+3nxP/t58T/7efE/+3n + xP+akXz/rZ+a/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/6ePB/2pj + R/+LiAv/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5WUBf9bUjf/3di3/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/0sys/1xaP/+atU//oL5S/4GTSP93c1z/7ObD/+3n + xP/t58T/7efE/+3nxP/t58T/6uTB/8q8tf/CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKx + sv+rnZf/l5B7/+3nxP/n4sD/ZV5D/4uIC/+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5WU + Bf9bUzf/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/X0bL/ZWFJ/2Bg + Qv+OiW7/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/721m/+5rKb/wrGy/zouLPgrIR5mAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAKyEeZjouLPjCsbL/q52X/5eQe//t58T/7efE/+fiwP9lXkP/jIkL/6amAP+mpgD/pqYA/6am + AP+mpgD/pqYA/5aVBf9dVTn/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP+XkHv/q52X/8Kx + sv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/5+LA/2Vd + RP+MiQv/pqYA/6amAP+mpgD/pqYA/5eWBf9dVTn/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/l5B7/6udl//CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3n + xP/t58T/7efE/+3nxP/n4b//ZVxD/4yJC/+mpgD/pqYA/5eWBf9dVTn/3di3/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/8K7oP+8rqj/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjou + LPjCsbL/q52X/5eQe//t58T/7efE/+3nxP/t58T/7efE/+njwf9qYUj/fnoT/4SADf9eVjv/4Nq5/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/m373/yLu0/8Kxsv86Liz4KyEeZgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/6+XC/7Cp + jP+ooYT/5+G//+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/r5cL/sq6V/4yPfv+tqJH/6OPA/+3nxP/t58T/7efE/+3nxP/t58T/mZB8/6ue + mP/CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/j3bz/WGBa/02Zov9UxdX/TqKt/1JeWf/Z0rL/7efE/+3n + xP/t58T/7efE/7Gpkf+2qKL/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5eQ + e//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/dXpu/1XC0P9c5vn/XOb5/1zm + +f9X0OH/ZGtk/+3nxP/t58T/7efE/+3nxP/t58T/yry1/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsh + HmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/1Rn + ZP9c5vn/XOb5/1zm+f9c5vn/XOb5/1Bsav/q5MH/7efE/+3nxP/t58T/7efE/8q8tf/CsbL/Oi4s+Csh + HmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP9UaGX/XOb5/1zm+f9c5vn/XOb5/1zm+f9QbGr/6uTB/+3nxP/t58T/7efE/+3n + xP/KvLX/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5eQe//t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/dXpu/1XC0P9c5vn/XOb5/1zm+f9X0OH/ZGtk/+3n + xP/t58T/7efE/+3nxP/t58T/yry1/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6ud + l/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+PdvP9YYFr/TZmi/1TF + 1f9Ooq3/Ul5Z/9nSsv/t58T/7efE/+3nxP/t58T/7efE/8q8tf/CsbL/Oi4s+CshHmYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/6+XC/7Kulf+Mj37/raiR/+jjwP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/KvLX/wrGy/zou + LPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAALCEeXTUrKfnCsbL/r6Cc/5GKd//t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/ybq1/8Kxsv80Kij5LCEeXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsjH0IsIiD+uqqr/7+vr/9rY1f/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/6+TD/8Sysv+6qar/KyEf/y0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzGhoKLCMh+Y1/ + f//CsbL/fnJp/7Gpkf/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/9jNvP/CsbL/jH19/y0jIfg5HBwJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAC0kIp5EODb5wK+v/8Gwr/9vZFv/jYVy/9bQsf/p48H/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n + xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/97Uvv/DsrL/v6+w/0I2 + NfouJCGbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHx8ZLiQi72hbWv3BsLH/wrGy/6KWjv93bWT/al9X/2dd + VP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2dd + VP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9qX1b/1cu2/9/Vvv/d077/2s+8/82/ + t//CsbL/wbCx/2ZaWf0vJSLtLCEhFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwjHzouJCL1Wk5N/K+f + oP/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx + sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx + sv/CsbL/wrGy/8Kxsv/CsbL/r56f/1lNTPwuJSL0LR8fOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAALB8fKTEmJM8sIiH9UUZF+XVoZ/+DdXT/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3 + d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3 + d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4N1dP91aGf/UUVE+SsiIP4wJiTOLiEhJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKSIfSi0gHp8vJSTJLyYj3y8mJOQvJiTkLyYk5C8m + JOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8m + JOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiPfLyUkyS0gHp8pIh9KAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////gAAAAB////4AAAAAB////AAAAAA + D///4AAAAAAH///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///A + AAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAA + A///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///A + AAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAA + A///wAAAAAAD///AAAAAAAP//8AAAAAAA///4AAAAAAH///wAAAAAA////gAAAAAH////gAAAAB///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////w== + + + \ No newline at end of file diff --git a/FormLib/FormImageWindow.cs.Designer.cs b/FormLib/FormImageWindow.cs.Designer.cs index 77cd2cb..2da60cd 100644 --- a/FormLib/FormImageWindow.cs.Designer.cs +++ b/FormLib/FormImageWindow.cs.Designer.cs @@ -65,6 +65,8 @@ namespace FormLib this.Controls.Add(this.panel1); this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; this.Name = "FormImageWindow"; this.Text = "图像"; this.Load += new System.EventHandler(this.FormImageWindow_Load); diff --git a/FormLib/FormImageWindow.cs.cs b/FormLib/FormImageWindow.cs.cs index 9f1848f..bbc195b 100644 --- a/FormLib/FormImageWindow.cs.cs +++ b/FormLib/FormImageWindow.cs.cs @@ -14,9 +14,11 @@ using WeifenLuo.WinFormsUI.Docking; namespace FormLib { + [Serializable] public partial class FormImageWindow : DockContent { public HWindowTool_Smart myHWindow = new HWindowTool_Smart(); + public string WindowName { get; set; } public FormImageWindow() { InitializeComponent(); diff --git a/FormLib/FormLib.csproj b/FormLib/FormLib.csproj index 9dcda7f..d7f952b 100644 --- a/FormLib/FormLib.csproj +++ b/FormLib/FormLib.csproj @@ -60,6 +60,12 @@ + + Form + + + FormHalconWindow.cs + Form @@ -87,6 +93,9 @@ + + FormHalconWindow.cs + FormImageWindow.cs.cs diff --git a/HDevEngineTool/FormHDevEngineTool.cs b/HDevEngineTool/FormHDevEngineTool.cs index 7c174e7..91b2c5b 100644 --- a/HDevEngineTool/FormHDevEngineTool.cs +++ b/HDevEngineTool/FormHDevEngineTool.cs @@ -121,6 +121,7 @@ namespace HDevEngineTool if(myHDevEngine.ProgramCall != null) { myHDevEngine.ProgramCall.Execute(); + // HTuple a = myHDevEngine.ProgramCall.GetCtrlVarTuple("RunTime"); } } diff --git a/HDevEngineTool/HDevEngineCode.cs b/HDevEngineTool/HDevEngineCode.cs index 0f8dcda..0d061ae 100644 --- a/HDevEngineTool/HDevEngineCode.cs +++ b/HDevEngineTool/HDevEngineCode.cs @@ -54,8 +54,10 @@ namespace HDevEngineTool MyProgram.LoadProgram(CodeFilePath); ProgramCall = new HDevProgramCall(MyProgram); MyEngine.SetHDevOperators(new HDevOpMultiWindowImpl(FormHDevEngineTool.Instance.myHwindow.SmartWindow.HalconWindow)); + } ProgramCall.Execute(); + // HTuple a = MyEngine.GetGlobalCtrlVarTuple("RunTime"); } } } diff --git a/HDevEngineTool/HDevEngineToolRun.cs b/HDevEngineTool/HDevEngineToolRun.cs index dd9e327..7ef80f5 100644 --- a/HDevEngineTool/HDevEngineToolRun.cs +++ b/HDevEngineTool/HDevEngineToolRun.cs @@ -11,7 +11,7 @@ namespace HDevEngineTool { public class HDevEngineToolRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { } diff --git a/HalconTool/HalconTool.csproj b/HalconTool/HalconTool.csproj index be28bfd..9daba0d 100644 --- a/HalconTool/HalconTool.csproj +++ b/HalconTool/HalconTool.csproj @@ -50,6 +50,7 @@ + diff --git a/HalconTool/HalconToolRun.cs b/HalconTool/HalconToolRun.cs index cd3dc4a..9acfafa 100644 --- a/HalconTool/HalconToolRun.cs +++ b/HalconTool/HalconToolRun.cs @@ -27,11 +27,11 @@ namespace HalconTool { public class HalconToolRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { Type a = this.GetType(); HalconTool myHalconTool = (HalconTool)L_toolList[toolIndex].tool; - VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName]; + VisionJob myJob = (VisionJob)runJob; myHalconTool.Run(SoftwareRunState.Release); if (myHalconTool.toolRunStatu != ToolRunStatu.Succeed) { @@ -40,9 +40,10 @@ namespace HalconTool else { myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myHalconTool.runTime}", Color.Green, selectNode); - FormImageWindow.Instance.myHWindow.DispImage(myHalconTool.outputImage); + ((FormImageWindow)myHalconWindowForm).myHWindow.DispImage(myHalconTool.outputImage); L_toolList[toolIndex].toolOutput[0] = new ToolIO("OutputImage", myHalconTool.outputImage, DataType.Image); } + L_toolList[toolIndex].toolRunStatu = myHalconTool.toolRunStatu; } } } diff --git a/ImageWindow/HWindow_Final.resx b/ImageWindow/HWindow_Final.resx index 589e3e9..faac048 100644 --- a/ImageWindow/HWindow_Final.resx +++ b/ImageWindow/HWindow_Final.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk - CAAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/PMAlignTool/FormPMAlignTool.cs b/PMAlignTool/FormPMAlignTool.cs index 27e3768..198c79d 100644 --- a/PMAlignTool/FormPMAlignTool.cs +++ b/PMAlignTool/FormPMAlignTool.cs @@ -24,7 +24,7 @@ namespace PMAlignTool private HDrawingObject serachRegion_drawing_object = new HDrawingObject(); public List templateModelListAdd = new List() { }; public List templateModelListSub = new List() { }; - public List templateModelList = new List() { }; + public FormPMAlignTool(ref object pmalign) { InitializeComponent(); @@ -191,7 +191,7 @@ namespace PMAlignTool { if(myPMAlign.inputImage != null) { - if(myPMAlign.CreateModelTemplate() == 0) + if(myPMAlign.CreateModelTemplate(false, null) == 0) { if (myPMAlign.matchMode == MatchMode.BasedShape) { diff --git a/PMAlignTool/PMAlign.cs b/PMAlignTool/PMAlign.cs index 68b743b..e8c81d2 100644 --- a/PMAlignTool/PMAlign.cs +++ b/PMAlignTool/PMAlign.cs @@ -276,17 +276,25 @@ namespace PMAlignTool maxScale = FormPMAlignTool.Instance.nud_ScaleRange.Value; } - public int CreateModelTemplate() + public int CreateModelTemplate(bool setInputModelRegion, HObject inputModelRegion) { HObject template; oldTrainImage = inputImage; - if (FormPMAlignTool.Instance.templateModelListAdd.Count == 0) + // 判断是否从外部输入模板 + if(setInputModelRegion) { - LoggerClass.WriteLog($"{toolName}未划定模板建立区域", MsgLevel.Exception); - isCreateModel = false; - return -1; + templateRegion = inputModelRegion; + } + else + { + if (FormPMAlignTool.Instance.templateModelListAdd.Count == 0) + { + LoggerClass.WriteLog($"{toolName}未划定模板建立区域", MsgLevel.Exception); + isCreateModel = false; + return -1; + } + CreateModelRegion(); } - CreateModelRegion(); HObject createModelImg; HOperatorSet.GenEmptyObj(out createModelImg); createModelImg = ProcessImage(inputImage); diff --git a/PMAlignTool/PMAlignTool.csproj b/PMAlignTool/PMAlignTool.csproj index f76ce52..c491556 100644 --- a/PMAlignTool/PMAlignTool.csproj +++ b/PMAlignTool/PMAlignTool.csproj @@ -55,6 +55,7 @@ + diff --git a/PMAlignTool/PMAlignToolRun.cs b/PMAlignTool/PMAlignToolRun.cs index 2e07664..1f7908e 100644 --- a/PMAlignTool/PMAlignToolRun.cs +++ b/PMAlignTool/PMAlignToolRun.cs @@ -31,11 +31,10 @@ namespace PMAlignTool { public class PMAlignToolRun : IToolRun { - public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList) + public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm) { PMAlign myPMAlign = (PMAlign)L_toolList[toolIndex].tool; - - VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName]; + VisionJob myJob = (VisionJob)runJob; for (int j = 0; j < inputItemNum; j++) { if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null) @@ -64,7 +63,7 @@ namespace PMAlignTool else { myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myPMAlign.runTime}", Color.Green, selectNode); - myPMAlign.DispMainWindow(FormImageWindow.Instance.myHWindow); + myPMAlign.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow); // 将输出值赋值到界面输出中 if (myPMAlign.L_resultList.Count > 0) { @@ -75,6 +74,7 @@ namespace PMAlignTool L_toolList[toolIndex].toolOutput[4] = new ToolIO("GetPose.Score", myPMAlign.L_resultList[0].Socre, DataType.DoubleValue); } } + L_toolList[toolIndex].toolRunStatu = myPMAlign.toolRunStatu; } } } diff --git a/ToolLib.Log/Logger/UserLogger.cs b/ToolLib.Log/Logger/UserLogger.cs index 1ba61ca..b31aecf 100644 --- a/ToolLib.Log/Logger/UserLogger.cs +++ b/ToolLib.Log/Logger/UserLogger.cs @@ -176,14 +176,17 @@ namespace Logger { lock(myObject) { - LogInfo log = LoggerClass.logQueue.Dequeue(); - if (log.ex != null) + if(LoggerClass.logQueue.Count > 0) { - AddLog(log.logLevel, log.message, log.ex); - } - else - { - AddLog(log.logLevel, log.message); + LogInfo log = LoggerClass.logQueue.Dequeue(); + if (log.ex != null) + { + AddLog(log.logLevel, log.message, log.ex); + } + else + { + AddLog(log.logLevel, log.message); + } } } } diff --git a/ToolLib.VisionJob/FormJobManage.Designer.cs b/ToolLib.VisionJob/FormJobManage.Designer.cs index b1706cb..4b603b8 100644 --- a/ToolLib.VisionJob/FormJobManage.Designer.cs +++ b/ToolLib.VisionJob/FormJobManage.Designer.cs @@ -32,10 +32,14 @@ namespace ToolLib.VisionJob this.tabJobUnion = new System.Windows.Forms.TabControl(); this.btnCycleRun = new System.Windows.Forms.Button(); this.btnSignael = new System.Windows.Forms.Button(); - this.picDeleteJob = new System.Windows.Forms.PictureBox(); this.picNewJob = new System.Windows.Forms.PictureBox(); - ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).BeginInit(); + this.picDeleteJob = new System.Windows.Forms.PictureBox(); + this.picSaveJob = new System.Windows.Forms.PictureBox(); + this.picOpenJob = new System.Windows.Forms.PictureBox(); ((System.ComponentModel.ISupportInitialize)(this.picNewJob)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picSaveJob)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picOpenJob)).BeginInit(); this.SuspendLayout(); // // tabJobUnion @@ -70,17 +74,6 @@ namespace ToolLib.VisionJob this.btnSignael.UseVisualStyleBackColor = true; this.btnSignael.Click += new System.EventHandler(this.btnSignael_Click); // - // picDeleteJob - // - this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.picDeleteJob.Image = ((System.Drawing.Image)(resources.GetObject("picDeleteJob.Image"))); - this.picDeleteJob.Location = new System.Drawing.Point(53, 595); - this.picDeleteJob.Name = "picDeleteJob"; - this.picDeleteJob.Size = new System.Drawing.Size(35, 40); - this.picDeleteJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.picDeleteJob.TabIndex = 2; - this.picDeleteJob.TabStop = false; - // // picNewJob // this.picNewJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -93,11 +86,48 @@ namespace ToolLib.VisionJob this.picNewJob.TabStop = false; this.picNewJob.Click += new System.EventHandler(this.picNewJob_Click); // + // picDeleteJob + // + this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.picDeleteJob.Image = ((System.Drawing.Image)(resources.GetObject("picDeleteJob.Image"))); + this.picDeleteJob.Location = new System.Drawing.Point(53, 595); + this.picDeleteJob.Name = "picDeleteJob"; + this.picDeleteJob.Size = new System.Drawing.Size(35, 40); + this.picDeleteJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picDeleteJob.TabIndex = 2; + this.picDeleteJob.TabStop = false; + // + // picSaveJob + // + this.picSaveJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.picSaveJob.Image = ((System.Drawing.Image)(resources.GetObject("picSaveJob.Image"))); + this.picSaveJob.Location = new System.Drawing.Point(94, 595); + this.picSaveJob.Name = "picSaveJob"; + this.picSaveJob.Size = new System.Drawing.Size(35, 40); + this.picSaveJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picSaveJob.TabIndex = 2; + this.picSaveJob.TabStop = false; + this.picSaveJob.Click += new System.EventHandler(this.picSaveJob_Click); + // + // picOpenJob + // + this.picOpenJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.picOpenJob.Image = ((System.Drawing.Image)(resources.GetObject("picOpenJob.Image"))); + this.picOpenJob.Location = new System.Drawing.Point(135, 595); + this.picOpenJob.Name = "picOpenJob"; + this.picOpenJob.Size = new System.Drawing.Size(35, 40); + this.picOpenJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picOpenJob.TabIndex = 2; + this.picOpenJob.TabStop = false; + this.picOpenJob.Click += new System.EventHandler(this.picOpenJob_Click); + // // FormJobManage // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(372, 636); + this.Controls.Add(this.picOpenJob); + this.Controls.Add(this.picSaveJob); this.Controls.Add(this.picDeleteJob); this.Controls.Add(this.picNewJob); this.Controls.Add(this.btnSignael); @@ -108,8 +138,10 @@ namespace ToolLib.VisionJob this.Name = "FormJobManage"; this.Text = "JobManage"; this.Load += new System.EventHandler(this.FormJobManage_Load); - ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.picNewJob)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picSaveJob)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picOpenJob)).EndInit(); this.ResumeLayout(false); } @@ -117,8 +149,10 @@ namespace ToolLib.VisionJob #endregion private System.Windows.Forms.Button btnCycleRun; private System.Windows.Forms.Button btnSignael; + public System.Windows.Forms.TabControl tabJobUnion; private System.Windows.Forms.PictureBox picNewJob; private System.Windows.Forms.PictureBox picDeleteJob; - public System.Windows.Forms.TabControl tabJobUnion; + private System.Windows.Forms.PictureBox picSaveJob; + private System.Windows.Forms.PictureBox picOpenJob; } } \ No newline at end of file diff --git a/ToolLib.VisionJob/FormJobManage.cs b/ToolLib.VisionJob/FormJobManage.cs index d7870d9..dd8b4ae 100644 --- a/ToolLib.VisionJob/FormJobManage.cs +++ b/ToolLib.VisionJob/FormJobManage.cs @@ -62,5 +62,35 @@ namespace ToolLib.VisionJob } } } + + private void picSaveJob_Click(object sender, EventArgs e) + { + SaveFileDialog myDia = new SaveFileDialog(); + string jobName = tabJobUnion.SelectedTab.Text; + myDia.Title = "保存job文件"; + myDia.Filter = "job文件(*.job)|*.job"; + myDia.FilterIndex = 1; + myDia.FileName = jobName;//这里是key + if (myDia.ShowDialog() == DialogResult.OK) + { + VisionJobParams.pVisionProject.SaveJob(jobName, myDia.FileName); + } + } + + private void picOpenJob_Click(object sender, EventArgs e) + { + UIInputForm myUIInputForm = new UIInputForm(); + myUIInputForm.Label.Text = "输入新建Job名称"; + if (myUIInputForm.ShowDialog() == DialogResult.OK) + { + OpenFileDialog myDia = new OpenFileDialog(); + if (myDia.ShowDialog() == DialogResult.OK) + { + string newJobName = myUIInputForm.Editor.Text; + VisionJobParams.pVisionProject.LoadJob(newJobName, myDia.FileName); + } + } + + } } } diff --git a/ToolLib.VisionJob/FormJobManage.resx b/ToolLib.VisionJob/FormJobManage.resx index bbbe73c..5236d57 100644 --- a/ToolLib.VisionJob/FormJobManage.resx +++ b/ToolLib.VisionJob/FormJobManage.resx @@ -118,6 +118,40 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 @@ -160,38 +194,63 @@ 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 + SvoFejOUQZmsukoAAAAASUVORK5CYII= diff --git a/ToolLib.VisionJob/OperateProject.cs b/ToolLib.VisionJob/OperateProject.cs index 3ca1f71..5767d5d 100644 --- a/ToolLib.VisionJob/OperateProject.cs +++ b/ToolLib.VisionJob/OperateProject.cs @@ -12,6 +12,7 @@ * ============================================================================== */ using CommonMethods; +using FormLib; using Logger; using System; using System.Collections.Generic; @@ -25,6 +26,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; +using WeifenLuo.WinFormsUI.Docking; namespace ToolLib.VisionJob { @@ -67,6 +69,35 @@ namespace ToolLib.VisionJob InitJob(VisionJobParams.pVisionProject.Project[jobName]); } + public void CreateNewJob(string jobName, VisionJob newJob, bool newAddJob = true) + { + TabPage newTab = new TabPage(jobName); + newTab.Controls.Add(new TreeView()); + FormJobManage.Instance.tabJobUnion.TabPages.Add(newTab); + if (newAddJob) + { + VisionJobParams.pVisionProject.Project.Add(jobName, newJob); + FormJobManage.Instance.tabJobUnion.SelectedTab = newTab; + // newTab.Select(); + } + newJob.JobName = jobName; + InitJob(VisionJobParams.pVisionProject.Project[jobName]); + } + + public void AddDispImageindow(DockPanel myPanel, DockState myState, string windowName) + { + if(VisionJobParams.pVisionProject.Project.ContainsKey(windowName)) + { + FormImageWindow myImageWindow = VisionJobParams.pVisionProject.Project[windowName].myHalconWindow; + if(myImageWindow == null) + { + myImageWindow = new FormImageWindow(); + } + myImageWindow.Text = windowName + "-图像"; + myImageWindow.Show(myPanel, myState); + } + } + public void SaveJob() { // Serialize.BinarySerialize($"{VisionJobParams.sSysConfigPath}Vision.prj" , VisionJobParams.myProject); diff --git a/ToolLib.VisionJob/VisionJob.cs b/ToolLib.VisionJob/VisionJob.cs index 8e235cc..92d8467 100644 --- a/ToolLib.VisionJob/VisionJob.cs +++ b/ToolLib.VisionJob/VisionJob.cs @@ -11,6 +11,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using ViewROI; namespace ToolLib.VisionJob { @@ -257,6 +258,10 @@ namespace ToolLib.VisionJob { if (!isDrawing) { + TreeView tree = GetJobTree(); + graph = tree.CreateGraphics(); + tree.CreateGraphics().Dispose(); + isDrawing = true; Thread th = new Thread(() => { @@ -265,9 +270,7 @@ namespace ToolLib.VisionJob colValueAndColor.Clear(); startNodeAndColor.Clear(); list.Clear(); - TreeView tree = GetJobTree(); - graph = tree.CreateGraphics(); - tree.CreateGraphics().Dispose(); + foreach (KeyValuePair item in D_itemAndSource) { // 将此划线线程委托到JOB管理界面 @@ -886,14 +889,21 @@ namespace ToolLib.VisionJob string assemblyName = $"{L_toolList[i].FormToolName.Split('.')[0]}.{L_toolList[i].toolType.ToString()}Run,{L_toolList[i].FormToolName.Split('.')[0]}"; Type classType = Type.GetType(assemblyName); IToolRun myTool = (IToolRun)Activator.CreateInstance(classType); - myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList); + myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList, this, myHalconWindow); } } public void FormLogDisp(string mes, Color color, TreeNode treeNode, Logger.MsgLevel msgLevel = Logger.MsgLevel.Info) { - Logger.LoggerClass.WriteLog(mes, msgLevel); - treeNode.ForeColor = color; + LoggerClass.WriteLog(mes, msgLevel); + if(treeNode != null) + { + treeNode.ForeColor = color; + } + } + [NonSerialized] + public FormImageWindow myHalconWindow = new FormImageWindow(); + } } diff --git a/ToolLib.VisionJob/VisionProject.cs b/ToolLib.VisionJob/VisionProject.cs index 4350eb1..60d3303 100644 --- a/ToolLib.VisionJob/VisionProject.cs +++ b/ToolLib.VisionJob/VisionProject.cs @@ -18,6 +18,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Forms; namespace ToolLib.VisionJob { @@ -50,11 +51,6 @@ namespace ToolLib.VisionJob foreach (var item in Project) { OperateProject.Instance.CreateNewJob(item.Key, false); - //foreach (var tool in item.Value.L_toolList) - //{ - // OperateTreeView.Instance.Add_Tool((ToolType)Enum.Parse(typeof(ToolType), tool.toolType.ToString()), false); - //} - // OperateProject.Instance.InitJob(item.Value); } return true; } @@ -71,5 +67,45 @@ namespace ToolLib.VisionJob { Serialize.BinarySerialize(prjFilePath, Project); } + + public bool LoadJob(string jobName,string path) + { + if (!File.Exists(path)) + { + Logger.LoggerClass.WriteLog("job路径不存在!", true); + return false; + } + else if(Project.ContainsKey(jobName)) + { + Logger.LoggerClass.WriteLog("项目中已存在该JOB名称,请更换!", true); + return false; + } + else + { + try + { + VisionJob myNewJob = Serialize.BinaryDeserialize(path); + OperateProject.Instance.CreateNewJob(jobName, myNewJob, true); // 新添加job + return true; + } + catch (Exception ex) + { + Logger.LoggerClass.WriteLog("载入项目工程时出现异常!", ex); + return false; + } + } + } + + public void SaveJob(string jobName,string filePath) + { + if(Project.ContainsKey(jobName)) + { + Serialize.BinarySerialize(filePath, Project[jobName]); + } + else + { + Logger.LoggerClass.WriteLog("保存时出现异常,未找到Job", true); + } + } } } diff --git a/ToolLib.VisionToolList/VisionToolList.cs b/ToolLib.VisionToolList/VisionToolList.cs index 909d399..ca95ca1 100644 --- a/ToolLib.VisionToolList/VisionToolList.cs +++ b/ToolLib.VisionToolList/VisionToolList.cs @@ -190,7 +190,6 @@ namespace VisionJobFactory FormTool = null; toolInput = new List() { inputImage }; toolOutput = new List() { outPose, outPoseX, outPoseY, outPoseR, outPoseScore }; - } /// /// 只获取选择工具的描述信息 diff --git a/VisionEdit/FormMain.cs b/VisionEdit/FormMain.cs index cf42d49..51530c9 100644 --- a/VisionEdit/FormMain.cs +++ b/VisionEdit/FormMain.cs @@ -45,7 +45,7 @@ namespace VisionEdit InitDockPanel(); _instance = this; } - + bool configLoadFlag = false; private void InitDockPanel() { try @@ -66,33 +66,38 @@ namespace VisionEdit { return myFormLog; } - if (persistString == typeof(FormImageWindow).ToString()) - { - return myFormImageWindow; - } + //if (persistString == typeof(FormImageWindow).ToString()) + //{ + // return new FormImageWindow(); + //} //主框架之外的窗体不显示 return null; }); + configLoadFlag = true; } - catch (Exception) + catch (Exception ex) { //配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体 myFormToolBox.Show(this.dockPanel1, DockState.DockLeft); myFormJobManage.Show(this.dockPanel1, DockState.DockRight); myFormLog.Show(this.dockPanel1, DockState.DockBottom); - myFormImageWindow.Show(this.dockPanel1, DockState.Document); } } private void FormMain2_Load(object sender, EventArgs e) { - // 窗体加载到主窗体 - myFormToolBox.Show(this.dockPanel1, DockState.DockLeft); - myFormJobManage.Show(this.dockPanel1, DockState.DockRight); - myFormImageWindow.Show(this.dockPanel1, DockState.Document); - myFormLog.Show(this.dockPanel1, DockState.DockBottom); // 初始化JOB VisionJobParams.pVisionProject.LoadProject(); + // 窗体加载到主窗体 + foreach (var item in VisionJobParams.pVisionProject.Project) + { + if (item.Value.myHalconWindow == null) + { + item.Value.myHalconWindow = new FormImageWindow(); + } + item.Value.myHalconWindow.Text = item.Value.JobName + "-图像"; + item.Value.myHalconWindow.Show(this.dockPanel1, DockState.Document); + } } private void timer1_Tick(object sender, EventArgs e) @@ -107,10 +112,7 @@ namespace VisionEdit /// private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { - if (File.Exists(m_DockPath)) - { - dockPanel1.SaveAsXml(this.m_DockPath); - } + dockPanel1.SaveAsXml(this.m_DockPath); DialogResult dr = MessageBox.Show("是否要进行保存?", "提示", MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) { diff --git a/VisionEdit/Program.cs b/VisionEdit/Program.cs index d80bb41..05b7b47 100644 --- a/VisionEdit/Program.cs +++ b/VisionEdit/Program.cs @@ -11,7 +11,7 @@ namespace VisionEdit /// /// 应用程序的主入口点。 /// - [STAThread] + [STAThreadAttribute] static void Main() { Application.EnableVisualStyles(); diff --git a/VisionEdit/bin/Debug/DockPanel.config b/VisionEdit/bin/Debug/DockPanel.config index 0c5b3988e8210be491a3021e90021e1d461acf88..7de7575daf900b3d9661e81dbf8a166e07d8e59a 100644 GIT binary patch delta 344 zcmaE%xx{e8ImStB9Fvm-geEgFNlZ>);+yQm6ab{zCU0WWU^JP0n@M)E8ZX~uHfAMe zQwF8Ujx3s!Lzp`zv6W2DV(9}b|jfl)qx~0oE-*&Dku4NK@6!3X$+nWE)2FnzRBc|T!EYGcr+M+ zMywY;x;ck0jBRoOrx3Rd1Jp8xlF9l4;+6(r-A+L3OBwPQQW%QC`ppo!cY?D`rFPc0-*lDs2r^@CI P0Y0|L5h8q(dn6