1、增加单独Job的保存、添加和创建

2、每个Job单独绑定一个图像窗体
3、支持通过以job的方式外部调用
This commit is contained in:
liu.wenjie
2022-05-09 16:17:41 +08:00
parent 7ca84a8720
commit 9dcba19b67
36 changed files with 1022 additions and 113 deletions

Binary file not shown.

View File

@@ -44,6 +44,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.9.0.0, Culture=neutral, PublicKeyToken=null" />
</ItemGroup>
<ItemGroup>
<Compile Include="Caliper.cs" />

View File

@@ -30,10 +30,10 @@ namespace CaliperTool
{
public class CaliperRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> 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;
}
}

View File

@@ -22,6 +22,6 @@ namespace CommonMethods.Interface
{
public interface IToolRun
{
void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList);
void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList, IVisionJob runJob, Form myHalconWindow);
}
}

View File

@@ -11,9 +11,10 @@ namespace EyeHandCalibTool
{
public class EyeHandCalibRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
// throw new NotImplementedException();
}
}
}

View File

@@ -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);

View File

@@ -47,6 +47,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.9.0.0, Culture=neutral, PublicKeyToken=null" />
</ItemGroup>
<ItemGroup>
<Compile Include="FindLine.cs" />

View File

@@ -31,10 +31,10 @@ namespace FindLineTool
{
public class FindLineRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> 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;
}
}
}

View File

@@ -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);

65
FormLib/FormHalconWindow.Designer.cs generated Normal file
View File

@@ -0,0 +1,65 @@
namespace FormLib
{
partial class FormHalconWindow
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -0,0 +1,569 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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==
</value>
</data>
</root>

View File

@@ -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);

View File

@@ -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();

View File

@@ -60,6 +60,12 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="FormHalconWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormHalconWindow.Designer.cs">
<DependentUpon>FormHalconWindow.cs</DependentUpon>
</Compile>
<Compile Include="FormImageWindow.cs.cs">
<SubType>Form</SubType>
</Compile>
@@ -87,6 +93,9 @@
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FormHalconWindow.resx">
<DependentUpon>FormHalconWindow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormImageWindow.cs.resx">
<DependentUpon>FormImageWindow.cs.cs</DependentUpon>
</EmbeddedResource>

View File

@@ -121,6 +121,7 @@ namespace HDevEngineTool
if(myHDevEngine.ProgramCall != null)
{
myHDevEngine.ProgramCall.Execute();
// HTuple a = myHDevEngine.ProgramCall.GetCtrlVarTuple("RunTime");
}
}

View File

@@ -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");
}
}
}

View File

@@ -11,7 +11,7 @@ namespace HDevEngineTool
{
public class HDevEngineToolRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
}

View File

@@ -50,6 +50,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.9.0.0, Culture=neutral, PublicKeyToken=null" />
</ItemGroup>
<ItemGroup>
<Compile Include="FormHalconTool.cs">

View File

@@ -27,11 +27,11 @@ namespace HalconTool
{
public class HalconToolRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> 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;
}
}
}

View File

@@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk
CAAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@@ -24,7 +24,7 @@ namespace PMAlignTool
private HDrawingObject serachRegion_drawing_object = new HDrawingObject();
public List<HDrawingObject> templateModelListAdd = new List<HDrawingObject>() { };
public List<HDrawingObject> templateModelListSub = new List<HDrawingObject>() { };
public List<HDrawingObject> templateModelList = new List<HDrawingObject>() { };
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)
{

View File

@@ -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);

View File

@@ -55,6 +55,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.9.0.0, Culture=neutral, PublicKeyToken=null" />
</ItemGroup>
<ItemGroup>
<Compile Include="FormPMAlignTool.cs">

View File

@@ -31,11 +31,10 @@ namespace PMAlignTool
{
public class PMAlignToolRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> 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;
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}
}
}

View File

@@ -118,6 +118,40 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="picNewJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="picDeleteJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABGdBTUEAALGPC/xhBQAACJNJREFUeF7t
@@ -160,38 +194,63 @@
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAWfPr0H/jQ1+arHDMPAAAAAElFTkSuQmCC
</value>
</data>
<data name="picNewJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="picSaveJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="picOpenJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAP5SURBVGhD7ZnbTxNBFMZ58d1H/wrffPeFthSIipoQLcao8RYTHjAxUWMU0HZpbQEFBCFAQI0g
eOViTEDlsrullAJaoGnBpggCFcELi73scWYZCWq5rN3t9qFf8iVNd5P5ftuzM2emSQnFs9QUbVBTTIOU
VlFMi9pA+5INjI4MI5/2mllnTv07KGr3SObc5jFAAJBiZHiNnj5KhpJHGKBlYAaklGv6uwCQ99QD2gIG
ZIWQE2BigQdz+wdIQRBqPX2CDCmt5AaQHSIWACsQXnkgYgUgG0QsAbAtL73Ciy0ZRKwBsCWFUAIAu1Aq
CKUAsCWBkBMgq9S+oXUldtCg+9KM7BKJI15yAHzjgvB2xL8lF7V5IN3Iekkc8ZIDQIzw2DgDiSNeCYAo
lQBIAESpBIDSAM/tn2CPmR0jccRLaQBTixu12HR8rcRiRD1zg4aiORJHvBIAUaq+exIO3bYFSZwkFcUk
owbPjJrBi9oC6w7y9fpSGsD3eQnu9fgCJ8tt21JN1mq05Qyeqh5Z1pUNLqPPixojs5NEjSylAbDGZ39w
WoqZwHuDOz1foNXNCz7f4AlqTSxNokaW0gChMA9XGkdD+yzW0JnqYdhfZIPG4WUBoIJewIcAG89QSgJw
wTDoSvsh81Y/2HwcuD+HIee+E/ZZbPBgiIPclkk+1bjJGqEUQJjn4XLDCKRQDJjR1vL3NtPlD0F2/Xu0
OvfhayE0Q2WQqJGlBAAum7zmMThQ3A/GVzOAnjJUdk2tQjQP+IWtpkbP1pCY6yvWAGvD33csCbV+l1mE
dJMVSjt88Njhx3UfQhv9CyTixoolAKoaML5wQ0ahDersP1ZnG+yy7nnhhAKXlJpiLCTe5ooVgPDkH7v+
ePJrbemYxWXDI9eRaFtTLABw+PyNwnfOQYqBCWuo3uMk1tYlN8Bm4W+98aPSYVE/9B/hseQECITCcK3p
zxf27/B4Bqrv9gVIHPGSC+AnWqTw6dte9MJGDP92JXybYwa8c0vx1Y2iqoETFQ600+r7Z7bBxjNOGgrf
ZJ0S7o87gLouH6TftMLBYjs0OwMRwz9iV8JjxR3A6apBqHj9EbLKHEJLUMUuroTvmRfKpnFNeKy4Aphe
WBbagP5JDsZRW5D/zAOZJQNwo31K+HsJ9z9/K2qAczVDkP/EJcqXUBAdekkPI5tbPcAFwkKY609dcKxi
cLWvYb0cnK0dFo7bI4XHigpARdGX0BxcLtZqQ+9DlYF2qinaefGhc75r1D/W55kfSTOxPO5ranqmIe+J
Gw4U2XitkeGza4e/4uuR/Nrpf0XiKCuN3roLP2liHvU17Qj0yG5L53ZyS3wL1X6lSt/rQb9M3u6rUoVO
SvoFejOUQZmsukoAAAAASUVORK5CYII=
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View File

@@ -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);

View File

@@ -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<TreeNode, TreeNode> 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();
}
}

View File

@@ -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<VisionJob>(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);
}
}
}
}

View File

@@ -190,7 +190,6 @@ namespace VisionJobFactory
FormTool = null;
toolInput = new List<ToolIO>() { inputImage };
toolOutput = new List<ToolIO>() { outPose, outPoseX, outPoseY, outPoseR, outPoseScore };
}
/// <summary>
/// 只获取选择工具的描述信息

View File

@@ -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
/// <param name="e"></param>
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)
{

View File

@@ -11,7 +11,7 @@ namespace VisionEdit
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
[STAThreadAttribute]
static void Main()
{
Application.EnableVisualStyles();