diff --git a/ComputerResourceConsole.csproj b/ComputerResourceConsole.csproj
index e43dc36f1f1714390933b628be8b52e4071a1ae7..16fe398d1e2027c33ef1cadad626c19e2c25ff28 100644
--- a/ComputerResourceConsole.csproj
+++ b/ComputerResourceConsole.csproj
@@ -106,6 +106,7 @@
+
@@ -114,6 +115,8 @@
+
+
@@ -126,6 +129,7 @@
+
diff --git a/ComputerResourceConsole.suo b/ComputerResourceConsole.suo
index f6402ae8443d459c8ce7722070edef10d5927e65..771fc59e247f40936513a7c9534ddb36fc08a2e2 100644
Binary files a/ComputerResourceConsole.suo and b/ComputerResourceConsole.suo differ
diff --git a/control/ModelServiceDebuggerControl.cs b/control/ModelServiceDebuggerControl.cs
index bcdca12673bbd97d7278744954a0fb4935618fe0..0bc378e5d82550360f404ef8c9e1433cd12dcb73 100644
--- a/control/ModelServiceDebuggerControl.cs
+++ b/control/ModelServiceDebuggerControl.cs
@@ -29,33 +29,33 @@ namespace ComputerResourceConsole.control
public class ModelServiceDebuggerControl : ComponentControl, IModelServiceDebuggerControl
{
- private IModelServiceDebuggerOpera _msDebuggerOpera = null;
+ private IModelServiceDebuggerOpera _pDebuggerOpera = null;
private ModelClass _mdl = null;
private List _dataConfig = null;
public ModelServiceDebuggerControl():base()
{
- this._msDebuggerOpera = ComponentOperaFactory.createModelServiceDebuggerOpera();
+ this._pDebuggerOpera = ComponentOperaFactory.createModelServiceDebuggerOpera();
this._dataConfig = new List();
- this._msDebuggerOpera.FilePath = _pConfig.NodejsPath;
+ this._pDebuggerOpera.FilePath = _pConfig.NodejsPath;
}
public int start(CommonMethod.CommonEvent exit)
{
this._status = "Started";
- return this._msDebuggerOpera.start(exit);
+ return this._pDebuggerOpera.start(exit);
}
public int stop()
{
this._status = "Stopped";
- return this._msDebuggerOpera.stop();
+ return this._pDebuggerOpera.stop();
}
public int restart(CommonMethod.CommonEvent exit)
{
- this._msDebuggerOpera.stop();
- int flag = this._msDebuggerOpera.start(exit);
+ this._pDebuggerOpera.stop();
+ int flag = this._pDebuggerOpera.start(exit);
this._status = "Started";
return flag;
}
@@ -66,7 +66,7 @@ namespace ComputerResourceConsole.control
{
this._mdl = new ModelClass();
this._mdl.LoadFromXmlFile(mdlPath);
- this._msDebuggerOpera.MDLPath = mdlPath;
+ this._pDebuggerOpera.MDLPath = mdlPath;
}
catch (Exception ex)
{
@@ -217,11 +217,11 @@ namespace ComputerResourceConsole.control
public bool formatToFile()
{
- if (this._msDebuggerOpera.DataConfigPath == "")
+ if (this._pDebuggerOpera.DataConfigPath == "")
{
return false;
}
- return this.formatToFile(this._msDebuggerOpera.DataConfigPath);
+ return this.formatToFile(this._pDebuggerOpera.DataConfigPath);
}
public bool MDLLoading
@@ -267,7 +267,7 @@ namespace ComputerResourceConsole.control
{
System.IO.Directory.CreateDirectory(path);
}
- this._msDebuggerOpera.DataConfigPath = path + "data.config";
+ this._pDebuggerOpera.DataConfigPath = path + "data.config";
return true;
}
catch (Exception ex)
@@ -282,11 +282,11 @@ namespace ComputerResourceConsole.control
{
get
{
- return this._msDebuggerOpera.Host;
+ return this._pDebuggerOpera.Host;
}
set
{
- this._msDebuggerOpera.Host = value;
+ this._pDebuggerOpera.Host = value;
}
}
@@ -294,11 +294,11 @@ namespace ComputerResourceConsole.control
{
get
{
- return this._msDebuggerOpera.Port;
+ return this._pDebuggerOpera.Port;
}
set
{
- this._msDebuggerOpera.Port = value;
+ this._pDebuggerOpera.Port = value;
}
}
@@ -307,11 +307,11 @@ namespace ComputerResourceConsole.control
{
get
{
- return this._msDebuggerOpera.InstanceID;
+ return this._pDebuggerOpera.InstanceID;
}
set
{
- this._msDebuggerOpera.InstanceID = value;
+ this._pDebuggerOpera.InstanceID = value;
}
}
}
diff --git a/control/PackingControl.cs b/control/PackingControl.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4b98b3c6965e0a90a170e64e7ff6be91a6e7dc81
--- /dev/null
+++ b/control/PackingControl.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using ComputerResourceConsole.lib;
+using ComputerResourceConsole.common;
+using ComputerResourceConsole.factory;
+using ComputerResourceConsole.control;
+using System.IO;
+
+public class PackingControl : ComponentControl, IPackingControl
+{
+ private IPackingOpera _pPackingOpera = null;
+
+ public PackingControl(): base()
+ {
+ this._pPackingOpera = ComponentOperaFactory.createPackingOpera();
+ this._pPackingOpera.FilePath = this._pConfig.NodejsPath;
+ }
+
+ public int start(CommonMethod.CommonEvent exit)
+ {
+ this._status = "Started";
+ return this._pPackingOpera.start(exit);
+ }
+
+ public int stop()
+ {
+ this._status = "Stopped";
+ return this._pPackingOpera.stop();
+ }
+
+ public int restart(CommonMethod.CommonEvent exit)
+ {
+ this._pPackingOpera.stop();
+ int flag = this._pPackingOpera.start(exit);
+ this._status = "Started";
+ return flag;
+ }
+
+ public string ConfigPath
+ {
+ get
+ {
+ return this._pPackingOpera.ConfigPath;
+ }
+ set
+ {
+ this._pPackingOpera.ConfigPath = value;
+ }
+ }
+}
\ No newline at end of file
diff --git a/factory/ComponentControlFactory.cs b/factory/ComponentControlFactory.cs
index 9135c011cdfa5b54551bc462c15eb8c982f3540e..2e00c5fe3ceb3e1d95126da5a550be5d44215f08 100644
--- a/factory/ComponentControlFactory.cs
+++ b/factory/ComponentControlFactory.cs
@@ -34,6 +34,10 @@ namespace ComputerResourceConsole.factory
{
return new ModelServiceDebuggerControl();
}
+ public static IPackingControl createPackingControl()
+ {
+ return new PackingControl();
+ }
public static IContainerAdvancedControl createContainerAdvancedControl()
{
diff --git a/factory/ComponentOperaFactory.cs b/factory/ComponentOperaFactory.cs
index 6ac60918488dad80bfb0f6d5dbedad27b0949831..723ba9738366bc1bff7c6b44dd759108633cb1d5 100644
--- a/factory/ComponentOperaFactory.cs
+++ b/factory/ComponentOperaFactory.cs
@@ -39,5 +39,10 @@ namespace ComputerResourceConsole.factory
{
return new ModelServiceDebuggerOpera();
}
+
+ public static IPackingOpera createPackingOpera()
+ {
+ return new PackingOpera();
+ }
}
}
diff --git a/lib/IPackingControl.cs b/lib/IPackingControl.cs
new file mode 100644
index 0000000000000000000000000000000000000000..319ed145f4763bdfc21fb9e71345305332567b3a
--- /dev/null
+++ b/lib/IPackingControl.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ComputerResourceConsole.lib
+{
+ public interface IPackingControl : IComponentControl
+ {
+ string ConfigPath
+ {
+ get;
+ set;
+ }
+ }
+}
diff --git a/lib/IPackingOpera.cs b/lib/IPackingOpera.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6261b80c1e6e43599ab30cf15fbf62e0e3c70e37
--- /dev/null
+++ b/lib/IPackingOpera.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ComputerResourceConsole.lib
+{
+ public interface IPackingOpera : IComponentOpera
+ {
+ string ConfigPath
+ {
+ get;
+ set;
+ }
+ }
+}
diff --git a/model/PackingOpera.cs b/model/PackingOpera.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4c855cd3d9e6b0976e6fdaed0f084e7d933fb1dd
--- /dev/null
+++ b/model/PackingOpera.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using ComputerResourceConsole.lib;
+using ComputerResourceConsole.common;
+
+namespace ComputerResourceConsole.model
+{
+ public class PackingOpera : ComponentOperaBase, IPackingOpera
+ {
+ private string _configpath;
+
+ public PackingOpera()
+ {
+ this._configpath = "";
+ }
+
+ public string ConfigPath
+ {
+ get
+ {
+ return this._configpath;
+ }
+ set
+ {
+ this._configpath = value;
+ }
+ }
+
+ public override string Arguments
+ {
+ get
+ {
+ return "5 " + this._configpath;
+ }
+ }
+ }
+}
diff --git a/view/frm_console.cs b/view/frm_console.cs
index 308191a22475237b550a166ffe177fb99a0cc475..46cb65bc71bb5ea87f134547e7e717850d2b3e92 100644
--- a/view/frm_console.cs
+++ b/view/frm_console.cs
@@ -234,10 +234,6 @@ namespace ComputerResourceConsole
this._frm_debugger.Show();
}
- private void containerVersionCheckToolStripMenuItem_Click(object sender, EventArgs e)
- {
- }
-
private void batchDeploymentToolStripMenuItem_Click(object sender, EventArgs e)
{
diff --git a/view/frm_packing.Designer.cs b/view/frm_packing.Designer.cs
index 20616b01d2986e5fc6523113f2cf41e8e5a3f881..02bd3716ff774af30b24affb506435e1b0b1a6da 100644
--- a/view/frm_packing.Designer.cs
+++ b/view/frm_packing.Designer.cs
@@ -28,6 +28,8 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frm_packing));
this.gb_programming = new System.Windows.Forms.GroupBox();
this.rb_programming_python = new System.Windows.Forms.RadioButton();
this.rb_programming_cs = new System.Windows.Forms.RadioButton();
@@ -39,17 +41,27 @@
this.bt_pickWrappingFile = new System.Windows.Forms.Button();
this.bt_packing = new System.Windows.Forms.Button();
this.bt_close = new System.Windows.Forms.Button();
- this.tb_wappingfilepath = new System.Windows.Forms.TextBox();
+ this.tb_wrappingfilepath = new System.Windows.Forms.TextBox();
this.gb_pick_wrappingfile = new System.Windows.Forms.GroupBox();
this.ss_packing = new System.Windows.Forms.StatusStrip();
this.gb_relatedfiles = new System.Windows.Forms.GroupBox();
- this.dgv_files = new System.Windows.Forms.DataGridView();
- this.bt_addFile = new System.Windows.Forms.Button();
this.bt_addFolder = new System.Windows.Forms.Button();
+ this.bt_addFile = new System.Windows.Forms.Button();
+ this.dgv_files = new System.Windows.Forms.DataGridView();
+ this.dgv_co_files = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.gb_mdl = new System.Windows.Forms.GroupBox();
this.tb_mdlpath = new System.Windows.Forms.TextBox();
this.bt_pickMDLFile = new System.Windows.Forms.Button();
- this.dgv_co_files = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.cms_delete = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.gb_information = new System.Windows.Forms.GroupBox();
+ this.tb_author = new System.Windows.Forms.TextBox();
+ this.tb_modelName = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.tb_savepath = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.bt_outputpath = new System.Windows.Forms.Button();
this.gb_programming.SuspendLayout();
this.gb_license.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit();
@@ -57,13 +69,15 @@
this.gb_relatedfiles.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgv_files)).BeginInit();
this.gb_mdl.SuspendLayout();
+ this.cms_delete.SuspendLayout();
+ this.gb_information.SuspendLayout();
this.SuspendLayout();
//
// gb_programming
//
this.gb_programming.Controls.Add(this.rb_programming_python);
this.gb_programming.Controls.Add(this.rb_programming_cs);
- this.gb_programming.Location = new System.Drawing.Point(10, 10);
+ this.gb_programming.Location = new System.Drawing.Point(10, 118);
this.gb_programming.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.gb_programming.Name = "gb_programming";
this.gb_programming.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
@@ -84,6 +98,7 @@
this.rb_programming_python.TabStop = true;
this.rb_programming_python.Text = "Python";
this.rb_programming_python.UseVisualStyleBackColor = true;
+ this.rb_programming_python.CheckedChanged += new System.EventHandler(this.rb_programming_python_CheckedChanged);
//
// rb_programming_cs
//
@@ -96,13 +111,14 @@
this.rb_programming_cs.TabStop = true;
this.rb_programming_cs.Text = "C#";
this.rb_programming_cs.UseVisualStyleBackColor = true;
+ this.rb_programming_cs.CheckedChanged += new System.EventHandler(this.rb_programming_python_CheckedChanged);
//
// gb_license
//
this.gb_license.Controls.Add(this.rb_license_gpl);
this.gb_license.Controls.Add(this.rb_license_apache);
this.gb_license.Controls.Add(this.rb_license_MIT);
- this.gb_license.Location = new System.Drawing.Point(10, 99);
+ this.gb_license.Location = new System.Drawing.Point(10, 207);
this.gb_license.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.gb_license.Name = "gb_license";
this.gb_license.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
@@ -166,7 +182,7 @@
//
// bt_packing
//
- this.bt_packing.Location = new System.Drawing.Point(192, 593);
+ this.bt_packing.Location = new System.Drawing.Point(197, 772);
this.bt_packing.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.bt_packing.Name = "bt_packing";
this.bt_packing.Size = new System.Drawing.Size(133, 30);
@@ -177,7 +193,7 @@
//
// bt_close
//
- this.bt_close.Location = new System.Drawing.Point(348, 593);
+ this.bt_close.Location = new System.Drawing.Point(353, 772);
this.bt_close.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.bt_close.Name = "bt_close";
this.bt_close.Size = new System.Drawing.Size(133, 30);
@@ -186,20 +202,20 @@
this.bt_close.UseVisualStyleBackColor = true;
this.bt_close.Click += new System.EventHandler(this.bt_close_Click);
//
- // tb_wappingfilepath
+ // tb_wrappingfilepath
//
- this.tb_wappingfilepath.Enabled = false;
- this.tb_wappingfilepath.Location = new System.Drawing.Point(5, 31);
- this.tb_wappingfilepath.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
- this.tb_wappingfilepath.Name = "tb_wappingfilepath";
- this.tb_wappingfilepath.Size = new System.Drawing.Size(539, 28);
- this.tb_wappingfilepath.TabIndex = 7;
+ this.tb_wrappingfilepath.Enabled = false;
+ this.tb_wrappingfilepath.Location = new System.Drawing.Point(5, 31);
+ this.tb_wrappingfilepath.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.tb_wrappingfilepath.Name = "tb_wrappingfilepath";
+ this.tb_wrappingfilepath.Size = new System.Drawing.Size(539, 28);
+ this.tb_wrappingfilepath.TabIndex = 7;
//
// gb_pick_wrappingfile
//
- this.gb_pick_wrappingfile.Controls.Add(this.tb_wappingfilepath);
+ this.gb_pick_wrappingfile.Controls.Add(this.tb_wrappingfilepath);
this.gb_pick_wrappingfile.Controls.Add(this.bt_pickWrappingFile);
- this.gb_pick_wrappingfile.Location = new System.Drawing.Point(10, 176);
+ this.gb_pick_wrappingfile.Location = new System.Drawing.Point(10, 284);
this.gb_pick_wrappingfile.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.gb_pick_wrappingfile.Name = "gb_pick_wrappingfile";
this.gb_pick_wrappingfile.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
@@ -210,7 +226,7 @@
//
// ss_packing
//
- this.ss_packing.Location = new System.Drawing.Point(0, 636);
+ this.ss_packing.Location = new System.Drawing.Point(0, 821);
this.ss_packing.Name = "ss_packing";
this.ss_packing.Padding = new System.Windows.Forms.Padding(1, 0, 11, 0);
this.ss_packing.Size = new System.Drawing.Size(673, 22);
@@ -222,7 +238,7 @@
this.gb_relatedfiles.Controls.Add(this.bt_addFolder);
this.gb_relatedfiles.Controls.Add(this.bt_addFile);
this.gb_relatedfiles.Controls.Add(this.dgv_files);
- this.gb_relatedfiles.Location = new System.Drawing.Point(11, 340);
+ this.gb_relatedfiles.Location = new System.Drawing.Point(11, 448);
this.gb_relatedfiles.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.gb_relatedfiles.Name = "gb_relatedfiles";
this.gb_relatedfiles.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
@@ -231,18 +247,16 @@
this.gb_relatedfiles.TabStop = false;
this.gb_relatedfiles.Text = "Related Files";
//
- // dgv_files
+ // bt_addFolder
//
- this.dgv_files.AllowUserToAddRows = false;
- this.dgv_files.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
- this.dgv_files.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
- this.dgv_co_files});
- this.dgv_files.Location = new System.Drawing.Point(5, 27);
- this.dgv_files.Name = "dgv_files";
- this.dgv_files.ReadOnly = true;
- this.dgv_files.RowTemplate.Height = 30;
- this.dgv_files.Size = new System.Drawing.Size(642, 164);
- this.dgv_files.TabIndex = 0;
+ this.bt_addFolder.Location = new System.Drawing.Point(487, 203);
+ this.bt_addFolder.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.bt_addFolder.Name = "bt_addFolder";
+ this.bt_addFolder.Size = new System.Drawing.Size(151, 33);
+ this.bt_addFolder.TabIndex = 9;
+ this.bt_addFolder.Text = "Add folder...";
+ this.bt_addFolder.UseVisualStyleBackColor = true;
+ this.bt_addFolder.Click += new System.EventHandler(this.bt_addFolder_Click);
//
// bt_addFile
//
@@ -255,22 +269,32 @@
this.bt_addFile.UseVisualStyleBackColor = true;
this.bt_addFile.Click += new System.EventHandler(this.bt_addFile_Click);
//
- // bt_addFolder
+ // dgv_files
//
- this.bt_addFolder.Location = new System.Drawing.Point(487, 203);
- this.bt_addFolder.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
- this.bt_addFolder.Name = "bt_addFolder";
- this.bt_addFolder.Size = new System.Drawing.Size(151, 33);
- this.bt_addFolder.TabIndex = 9;
- this.bt_addFolder.Text = "Add folder...";
- this.bt_addFolder.UseVisualStyleBackColor = true;
- this.bt_addFolder.Click += new System.EventHandler(this.bt_addFolder_Click);
+ this.dgv_files.AllowUserToAddRows = false;
+ this.dgv_files.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.dgv_files.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.dgv_co_files});
+ this.dgv_files.Location = new System.Drawing.Point(5, 27);
+ this.dgv_files.Name = "dgv_files";
+ this.dgv_files.ReadOnly = true;
+ this.dgv_files.RowTemplate.Height = 30;
+ this.dgv_files.Size = new System.Drawing.Size(642, 164);
+ this.dgv_files.TabIndex = 0;
+ this.dgv_files.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgv_files_CellMouseDown);
+ //
+ // dgv_co_files
+ //
+ this.dgv_co_files.HeaderText = "Files";
+ this.dgv_co_files.Name = "dgv_co_files";
+ this.dgv_co_files.ReadOnly = true;
+ this.dgv_co_files.Width = 550;
//
// gb_mdl
//
this.gb_mdl.Controls.Add(this.tb_mdlpath);
this.gb_mdl.Controls.Add(this.bt_pickMDLFile);
- this.gb_mdl.Location = new System.Drawing.Point(10, 258);
+ this.gb_mdl.Location = new System.Drawing.Point(10, 366);
this.gb_mdl.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.gb_mdl.Name = "gb_mdl";
this.gb_mdl.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
@@ -299,18 +323,107 @@
this.bt_pickMDLFile.UseVisualStyleBackColor = true;
this.bt_pickMDLFile.Click += new System.EventHandler(this.bt_pickMDLFile_Click);
//
- // dgv_co_files
- //
- this.dgv_co_files.HeaderText = "Files";
- this.dgv_co_files.Name = "dgv_co_files";
- this.dgv_co_files.ReadOnly = true;
- this.dgv_co_files.Width = 550;
+ // cms_delete
+ //
+ this.cms_delete.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.deleteToolStripMenuItem});
+ this.cms_delete.Name = "cms_delete";
+ this.cms_delete.Size = new System.Drawing.Size(137, 32);
+ //
+ // deleteToolStripMenuItem
+ //
+ this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
+ this.deleteToolStripMenuItem.Size = new System.Drawing.Size(136, 28);
+ this.deleteToolStripMenuItem.Text = "Delete";
+ this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);
+ //
+ // gb_information
+ //
+ this.gb_information.Controls.Add(this.tb_author);
+ this.gb_information.Controls.Add(this.tb_modelName);
+ this.gb_information.Controls.Add(this.label2);
+ this.gb_information.Controls.Add(this.label1);
+ this.gb_information.Location = new System.Drawing.Point(11, 7);
+ this.gb_information.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.gb_information.Name = "gb_information";
+ this.gb_information.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.gb_information.Size = new System.Drawing.Size(653, 105);
+ this.gb_information.TabIndex = 2;
+ this.gb_information.TabStop = false;
+ this.gb_information.Text = "Information";
+ //
+ // tb_author
+ //
+ this.tb_author.Location = new System.Drawing.Point(118, 63);
+ this.tb_author.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.tb_author.Name = "tb_author";
+ this.tb_author.Size = new System.Drawing.Size(520, 28);
+ this.tb_author.TabIndex = 9;
+ //
+ // tb_modelName
+ //
+ this.tb_modelName.Location = new System.Drawing.Point(118, 25);
+ this.tb_modelName.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.tb_modelName.Name = "tb_modelName";
+ this.tb_modelName.Size = new System.Drawing.Size(520, 28);
+ this.tb_modelName.TabIndex = 8;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(6, 66);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(71, 18);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "Author:";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(6, 28);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(107, 18);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Model Name:";
+ //
+ // tb_savepath
+ //
+ this.tb_savepath.Enabled = false;
+ this.tb_savepath.Location = new System.Drawing.Point(88, 723);
+ this.tb_savepath.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.tb_savepath.Name = "tb_savepath";
+ this.tb_savepath.Size = new System.Drawing.Size(466, 28);
+ this.tb_savepath.TabIndex = 11;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(12, 726);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(71, 18);
+ this.label3.TabIndex = 10;
+ this.label3.Text = "Output:";
+ //
+ // bt_outputpath
+ //
+ this.bt_outputpath.Location = new System.Drawing.Point(558, 721);
+ this.bt_outputpath.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.bt_outputpath.Name = "bt_outputpath";
+ this.bt_outputpath.Size = new System.Drawing.Size(100, 33);
+ this.bt_outputpath.TabIndex = 8;
+ this.bt_outputpath.Text = "Pick";
+ this.bt_outputpath.UseVisualStyleBackColor = true;
+ this.bt_outputpath.Click += new System.EventHandler(this.bt_outputpath_Click);
//
// frm_packing
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(673, 658);
+ this.ClientSize = new System.Drawing.Size(673, 843);
+ this.Controls.Add(this.bt_outputpath);
+ this.Controls.Add(this.tb_savepath);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.gb_information);
this.Controls.Add(this.gb_mdl);
this.Controls.Add(this.gb_relatedfiles);
this.Controls.Add(this.ss_packing);
@@ -319,6 +432,7 @@
this.Controls.Add(this.bt_packing);
this.Controls.Add(this.gb_license);
this.Controls.Add(this.gb_programming);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
this.Name = "frm_packing";
this.Text = "Packing";
@@ -334,6 +448,9 @@
((System.ComponentModel.ISupportInitialize)(this.dgv_files)).EndInit();
this.gb_mdl.ResumeLayout(false);
this.gb_mdl.PerformLayout();
+ this.cms_delete.ResumeLayout(false);
+ this.gb_information.ResumeLayout(false);
+ this.gb_information.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -353,7 +470,7 @@
private System.Windows.Forms.Button bt_close;
private System.Windows.Forms.Button bt_packing;
private System.Windows.Forms.GroupBox gb_pick_wrappingfile;
- private System.Windows.Forms.TextBox tb_wappingfilepath;
+ private System.Windows.Forms.TextBox tb_wrappingfilepath;
private System.Windows.Forms.StatusStrip ss_packing;
private System.Windows.Forms.GroupBox gb_relatedfiles;
private System.Windows.Forms.DataGridView dgv_files;
@@ -363,5 +480,15 @@
private System.Windows.Forms.Button bt_addFolder;
private System.Windows.Forms.Button bt_addFile;
private System.Windows.Forms.DataGridViewTextBoxColumn dgv_co_files;
+ private System.Windows.Forms.ContextMenuStrip cms_delete;
+ private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;
+ private System.Windows.Forms.TextBox tb_savepath;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.GroupBox gb_information;
+ private System.Windows.Forms.TextBox tb_author;
+ private System.Windows.Forms.TextBox tb_modelName;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button bt_outputpath;
}
}
\ No newline at end of file
diff --git a/view/frm_packing.cs b/view/frm_packing.cs
index d31ef073665ae23e4803be628dd4002e1869e8b5..60281608590d277cb0c4bd0b2a6ea8d5e14d028a 100644
--- a/view/frm_packing.cs
+++ b/view/frm_packing.cs
@@ -6,60 +6,87 @@ using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
+using System.IO;
+
+using ComputerResourceConsole.lib;
+using ComputerResourceConsole.factory;
+using ComputerResourceConsole.common;
namespace ComputerResourceConsole.view
{
public partial class frm_packing : Form
{
+ private string _strWrappingFiler = "python (*.py)|*.py";
+ private int _selectedColumnIndex = -1;
+ private IPackingControl _pPackingCtrl = null;
+
+
+ public List ModelFiles
+ {
+ get
+ {
+ List modelfilelist = new List();
+ for (int i = 0; i < this.dgv_files.Rows.Count; i++)
+ {
+ modelfilelist.Add(dgv_files.Rows[i].Cells[0].Value.ToString());
+ }
+ return modelfilelist;
+ }
+ }
+
public frm_packing()
{
+ this._pPackingCtrl = ComponentControlFactory.createPackingControl();
InitializeComponent();
+
+ //! For test!
+ this.dgv_files.Rows.Add("E:\\GitCode\\ogms\\python\\ogms\\context\\yolov5s.pt");
+ this.dgv_files.Rows.Add("E:\\GitCode\\ogms\\python\\ogms\\context\\yolov5\\");
}
- public int ProgrammingLanguage
+ public string ProgrammingLanguage
{
get
{
if (rb_programming_python.Checked)
{
- return 1;
+ return "Python";
}
else if (rb_programming_cs.Checked)
{
- return 2;
+ return "CSharp";
}
- return -1;
+ return "";
}
}
- public int License
+ public string License
{
get
{
if (rb_license_MIT.Checked)
{
- return 1;
+ return "MIT";
}
else if (rb_license_apache.Checked)
{
- return 2;
+ return "Apache";
}
else if (rb_license_gpl.Checked)
{
- return 3;
+ return "GPL";
}
- return -1;
+ return "";
}
}
private void bt_pickWrappingFile_Click(object sender, EventArgs e)
{
-
OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = "exe/python (*.exe;*.py)|*.exe;*.py";
+ ofd.Filter = this._strWrappingFiler;
if (ofd.ShowDialog() == DialogResult.OK)
{
- this.tb_wappingfilepath.Text = ofd.FileName;
+ this.tb_wrappingfilepath.Text = ofd.FileName;
}
}
@@ -75,9 +102,76 @@ namespace ComputerResourceConsole.view
private void bt_packing_Click(object sender, EventArgs e)
{
- this.setStatus("Packing start...");
- List modelfiles = new List();
-
+ //! Checking
+ if (this.tb_modelName.Text == "")
+ {
+ MessageBox.Show("Please fill model name!", "Warning");
+ return;
+ }
+ if (this.tb_author.Text == "")
+ {
+ MessageBox.Show("Please fill model author!", "Warning");
+ return;
+ }
+ if (this.tb_wrappingfilepath.Text == "")
+ {
+ MessageBox.Show("Please select wrapping file!", "Warning");
+ return;
+ }
+ if (this.tb_mdlpath.Text == "")
+ {
+ MessageBox.Show("Please select MDL file!", "Warning");
+ return;
+ }
+ if (this.tb_savepath.Text == "")
+ {
+ MessageBox.Show("Please select saving path!", "Warning");
+ return;
+ }
+ if (!Directory.Exists(this.tb_savepath.Text))
+ {
+ MessageBox.Show("Saving path is not existing!", "Warning");
+ return;
+ }
+ this.setStatusText("Packing start...");
+
+ string strConfig = this.tb_savepath.Text + "\\" + this.tb_modelName.Text + ".config";
+
+ FileStream fs = new FileStream(strConfig, FileMode.CreateNew, FileAccess.Write, FileShare.None);
+ StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
+ sw.Write("modelname||" + this.tb_modelName.Text + "\n");
+ sw.Write("author||" + this.tb_author.Text + "\n");
+ sw.Write("programming||" + this.ProgrammingLanguage + "\n");
+ sw.Write("license||" + this.License + "\n");
+ sw.Write("wrappingfile||" + this.tb_wrappingfilepath.Text + "\n");
+ sw.Write("mdlfile||" + this.tb_mdlpath.Text + "\n");
+ sw.Write("targetpath||" + this.tb_savepath.Text + "\n");
+ for (int i = 0; i < this.dgv_files.Rows.Count; i++)
+ {
+ sw.Write("modelfile||" + this.dgv_files.Rows[i].Cells[0].Value + "\n");
+ }
+ sw.Flush();
+ sw.Close();
+ fs.Close();
+ fs.Dispose();
+
+ //! Start process
+
+ this._pPackingCtrl.ConfigPath = strConfig;
+ this._pPackingCtrl.start(this.onPackingExit);
+ }
+
+ private void onPackingExit(object sender, EventArgs e)
+ {
+ if (this.bt_packing.InvokeRequired)
+ {
+ CommonMethod.CommonEvent stcb = new CommonMethod.CommonEvent(onPackingExit);
+ this.Invoke(stcb, new object[] { sender, e });
+ }
+ else
+ {
+ this.setStatusText("Finished!");
+ }
}
private void bt_close_Click(object sender, EventArgs e)
@@ -92,7 +186,7 @@ namespace ComputerResourceConsole.view
this.rb_license_MIT.Checked = true;
}
- private void setStatus(string status)
+ private void setStatusText(string status)
{
this.ss_packing.Text = status;
}
@@ -103,7 +197,14 @@ namespace ComputerResourceConsole.view
ofd.Filter = "All file (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
- this.dgv_files.Rows.Add(ofd.FileName);
+ if (this.existingFileOrFolder(ofd.FileName))
+ {
+ MessageBox.Show("This file has been appended!", "Warning");
+ }
+ else
+ {
+ this.dgv_files.Rows.Add(ofd.FileName);
+ }
}
}
@@ -112,7 +213,66 @@ namespace ComputerResourceConsole.view
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
- this.dgv_files.Rows.Add(fbd.SelectedPath);
+ if (this.existingFileOrFolder(fbd.SelectedPath))
+ {
+ MessageBox.Show("This folder has been appended!", "Warning");
+ }
+ else
+ {
+ this.dgv_files.Rows.Add(fbd.SelectedPath);
+ }
+ }
+ }
+
+ private void rb_programming_python_CheckedChanged(object sender, EventArgs e)
+ {
+ this.tb_wrappingfilepath.Text = "";
+ if (this.ProgrammingLanguage == "Python")
+ {
+ this._strWrappingFiler = "Python (*.py)|*.py";
+ }
+ else
+ {
+ this._strWrappingFiler = "Execuable file (*.exe)|*.exe";
+ }
+ }
+
+ private void dgv_files_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
+ {
+ if (e.RowIndex > -1 && e.Button == System.Windows.Forms.MouseButtons.Right)
+ {
+ this.cms_delete.Show(this, new Point(e.X + 50, e.Y + 30 * (e.RowIndex + 1) + 210));
+ this._selectedColumnIndex = e.ColumnIndex;
+ }
+ }
+
+ private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (this._selectedColumnIndex != -1)
+ {
+ this.dgv_files.Rows.RemoveAt(_selectedColumnIndex);
+ }
+ }
+
+ private bool existingFileOrFolder(string fileorfolder)
+ {
+ List list = this.ModelFiles;
+ for (int i = 0; i < list.Count; i++)
+ {
+ if (list[i] == fileorfolder)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void bt_outputpath_Click(object sender, EventArgs e)
+ {
+ FolderBrowserDialog fbd = new FolderBrowserDialog();
+ if (fbd.ShowDialog() == DialogResult.OK)
+ {
+ this.tb_savepath.Text = fbd.SelectedPath;
}
}
}
diff --git a/view/frm_packing.resx b/view/frm_packing.resx
index a5014d4d8fe42a8b8794ae357f5289e134f6b601..54de97f2c6781a74018c879f85af1dece289d74a 100644
--- a/view/frm_packing.resx
+++ b/view/frm_packing.resx
@@ -126,7 +126,295 @@
277, 17
-
- True
+
+
+
+ AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///yL///8+////Yv//
+ /4b///+e/v7+sP7+/pr///88////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///8U////VP//
+ /6b///7g/v78//v79f/59+7/+Pbq//f05v/59+7//v797v///0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av//
+ /yL+/v6M////2P7+/P/7+vL/7ObF/93Slf/PwG3/xLFL/72nNf+4oCT/0cJy//v79f////98AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////IP///5T////2/f36//Lu1//Yy4T/xLBF/7qjJv+1nRf/tZ0Z/7WcGv+1nBv/tZwb/9HC
+ c//7+vT/////fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////Mv///8L+/v3/8u7V/9TGdv+7pSf/tp8a/7adGf+1nRn/tZ0X/7Wd
+ GP+1nBn/tZwa/7WcGv/RwnP/+/r1/////3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4K////fv///+j5+O3/39WZ/8GtN/+3nxb/tp8W/7ae
+ Fv+2nhf/tp4Z/7WdGf+1nRf/tZ0Y/7WdGf+1nBr/0cJz//v69f////98AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4C/v7+hP7+/fTy7tT/0MFm/7ql
+ IP+3oBb/t58V/7efFP+2nxb/tp4X/7aeGP+2nhn/tp0Z/7WdF/+1nRf/tZ0Z/9HDc//7+vX/////fAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/v7+bP//
+ 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
+ EP+5oxH/uaMS/7mjEv+4ohP/uKEU/7iiFf/HtUb/6eK3//38+f/+/v76////pP///1z///8w/v7+GP//
+ /wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////uvj26P/MvEr/u6YN/7ql
+ D/+6pRD/uqUQ/7qlEf+6pBD/uaQQ/7mjEf+5oxL/uaMS/7mjFv/Ov17/9PHd//////j+/v6y////Yv//
+ /woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+EP//
+ //rq5Lf/v6wf/7umDf+6pQ3/uqUP/7qlEP+6pRH/uqUR/7mkEP+5pBD/uaMR/7mjEv/Ov1v/9/Xn////
+ /+j+/v5SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////Bv///57/////18ty/7yoEv+7pg//u6YO/7qlDf+6pQ//uqUQ/7qlEP+6pBH/uaQQ/7mk
+ EP/Bri//9PDa//7+/vb///9U/v7+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xD////6+vnv/8q6Q/+7pw//u6cP/7umD/+7pg3/u6YN/7ql
+ D/+6pRD/uqUQ/7qlEf+8qBr/4tqe//7+/P/+/v6M////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4S//////DszP/DsSn/u6cP/7un
+ D/+7pw//u6YP/7umDf+6pQ7/uqUP/7qlEP+6pRH/yLdB//v68v/+/v7Y////HAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Lv//
+ ///o4q//vqsY/7yoDv+7pw//u6cP/7unD/+7pg//u6YN/7umDf+6pQ//u6cW/93UjP//////////Rv//
+ /wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////AP///47+/v7/39eQ/7yqEv+8qA7/vKgO/7yoD/+7pw//u6cP/7umD/+7pg3/uqUN/7+r
+ If/v6sn/////7P///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gL///+e/f37/9nOef+9qRP/vKgP/7yoDv+8qA//u6cP/7un
+ D/+7pw//u6YP/7umDf/Htzv/9vPg/////6T///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8I////MP7+
+ /jD///8w////MP///zD///8w////MP///zD///8w/v7+Mv7+/goAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////oP38+f/Xy2//vakS/7yp
+ EP+8qA//vKgO/7yoDv+7pw//u6cP/7unD/+7pg//zb5O//n36/////+W////AgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///+I/v7+8P////j+/v74////+P////j////4////+P////j////4////+P////j+/v7w////aAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av//
+ /6D9/Pj/1spt/72qEv+9qRH/vKkQ/7yoD/+8qA7/vKgP/7unD/+7pw//u6cP/87AVv/6+O7/////kv//
+ /wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8C////4vf05//bz43/2c2J/9nNif/ZzYn/2c2K/9nNi//ZzIv/2cyL/9nM
+ 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
+ Ef+8qA//vaoU/82/Tv/n4Kr/9vPf//7+/f///////////////////////fz4//Ht0P/g15b/xbM3/7ql
+ Ev+5oxH/uaMS/7mjEv+4ohP/uKEU/7ihEv+4oRL/uKEU/7ihFf+3oRX/t6AW/7umJf/n4LP//v79/P//
+ /3L///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD+/v4y/v7+av//
+ /2z///9s////Zv///yoAAAAA////uvLv0v/EtSv/ybs8//Pw1f/+/v3//v79//7+/f/+/v3//v79/+jh
+ rP+/rBn/vaoR/72pEf+9qRH/vKkQ/7yoD/+8qA//vakU/8a1M//Nv1D/1Mdp/9jNeP/YzHT/0sRg/8q6
+ SP/Brij/u6YU/7qlEv+5pA//uaMQ/7mjEf+5oxL/uaMS/7iiE/+4oRT/uKES/7ihEv+4oRT/t6EV/7ei
+ Gf/Ux3X//Pv1/////7T+/v4SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8+/v7+4P7+/f/+/vv//v77//7+/fz////S////LP///7jz8NP/xLUq/7+uGP/XzG7/+/vz////
+ //D///88////SP///+Dn4av/v60Z/72qEf+9qRH/vakR/7ypEf+8qRD/vKgP/7yoDv+8qA//u6cP/7un
+ EP+8qBP/u6gS/7umDv+6pQ7/uqUP/7qlEP+6pRH/uqQR/7mkEP+5oxD/uaMR/7mjEv+4ohL/uKIT/7ih
+ FP+4oRL/uKES/7ehFP/GtUj/8+/Z/////97///8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8C////lP38+P/f14r/1Mli/9TJYv/o463//v38/////3j+/v648/DT/8S1
+ Kv+/rRb/w7Ml/+bfpv//////////cP///y7////c5+Gr/7+uGv+9qhH/vaoR/72qEf+9qRH/vakR/7yp
+ Ef+8qA//vKgO/7yoDv+7pw//u6cP/7unD/+7pg//u6YN/7qlDf+6pQ//uqUQ/7qlEP+6pBH/uaQQ/7mk
+ EP+5oxH/uaMS/7mjEv+4ohP/uKEU/7ihEv++qSj/6eK3//79+/z///94AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///5z8+/P/0MRT/8CwGf/AsBv/3dWG//39
+ +f////+A////uPPw0//EtSr/v64W/7+uFv/Gti//8e3M//7+/fj+/v6i////3ufhq//Arhr/vasS/72q
+ Ef+9qhH/vaoR/72pEf+9qRH/vKkQ/7yoD/+8qA7/vKgO/7yoD/+7pw//u6cP/7umD/+7pg3/uqUN/7ql
+ D/+6pRD/uqUQ/7qlEf+6pBD/uaQQ/7mjEf+5oxL/uaMS/7iiE/+8qCP/49qk//38+vz///+4/v7+HAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///+c/Pv0/9HF
+ Vf/BsRr/wbEb/97Vh//9/fn/////gP///7jz8NP/xbYq/7+uFv+/rhb/v64W/8m7Pf/y79P//v79+P//
+ //rn4av/wK4a/76rE/+9qhL/vaoR/72qEf+9qhH/vakR/72pEf+8qRH/vKgP/7yoDv+8qA7/u6cP/7un
+ D/+7pw//u6YP/7umDf+6pQ7/uqUP/7qlEP+6pRH/uqUR/7mkEP+5oxD/uaMR/7mjEv+8px7/4tme//79
+ /Pz///+0////IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8C////mP38+P/i25X/181t/9jNbv/r5bX//v78/////3z+/v648/DU/8W2K/+/rhX/v64W/7+u
+ Fv+/rhb/yrxA//Huzv//////5+Gr/8CuGv++rBP/vqsT/72rEv+9qhH/vaoR/72qEf+9qRH/vakR/7yp
+ Ef+8qA//vKgO/7yoDv+7pw//u6cP/7unD/+7pg//u6YN/7qlDf+6pQ//uqUQ/7qlEP+6pRH/uaQQ/7mk
+ EP++qiT/49ui//7+/f////+q////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///1D+/v7y/v7+//7+/f/+/v3//v7+//7+/uj///8+/v7+uPPw
+ 1P/Fti3/wK8V/7+uFv+/rhb/v64W/7+uFv/IuTf/7Oa6/+fgqf/Arhr/vqwT/76sE/++qxP/vasS/72q
+ Ef+9qhH/vaoR/72pEf+9qRH/vKkQ/7yoD/+8qA7/vKgP/7unD/+7pw//u6cP/7umD/+7pg3/uqUN/7ql
+ D/+6pRD/uqUR/7umFv/Kukj/7ujE//7+/v////++////GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////GP///zj///9K/v7+hP7+
+ /rD////Q/v7+uP///97z8NT/xbYt/8CvGP/Arxf/v64W/7+uFv+/rhb/v64W/8W1Lv/XzG3/x7cy/76s
+ FP++rBP/vqwT/76rE/+9qxL/vaoR/72qEf+9qhH/vakR/7ypEf+8qRH/vKgP/7yoDv+8qA//u6cP/7un
+ D/+7pw//u6YP/7qmDf+6pQ7/uqUQ/8CtKP/b0IT/9/Xl//7+/fT///+G////Dv///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////Pv7+/ur5+Or/8/DT//Px1f/08dX/6+a4/87CTv/Mv0f/zL9H/8y/Rf/Mv0X/zL5F/8y+
+ Rf/LvUP/29F8//HtzP/Vymn/xrYw/76sFf++rBP/vqsT/72rEv+9qhH/vaoR/72qEf+9qRH/vakR/7yp
+ EP+8qA//vKgO/7yoDv+7pw//u6cP/7unD/+7pxD/wrAp/9XHav/v68r//fz4+v///8b///9E////BgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///1j+/fz/4tqU/8a4Lv/GuC//xrgu/8u9P//w7Mn/+fjs//n4
+ 7P/5+Oz/+fjs//n47P/5+Oz/+fjr//v68v/+/v76+/vz//Huz//e1If/0MNV/8S0Kf/Arxz/v6wX/72q
+ Ev+9qhH/vaoR/72pEf+8qRH/vKkR/7ypD/+9qhL/vqsY/8GvIv/Nv07/29GD//Dsy//8+/T//v7+7v//
+ /6L///8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9a/v37/9/Xi//Csx//wbIb/8Gx
+ Gv/HuTL/8u/Q//7+/uj+/v6E////hP///4T///+E////hP///4T///90////VP///57+/v7m/v7++Pn4
+ 6//x7c7/5uCn/9rQef/Qw1f/yrtA/8e2NP/GtjL/xrY0/8m5P//OwFL/2M1z/+TcoP/v68j/+Pfp//7+
+ /vr////m////oP///z7///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Wv79
+ +//g2I3/wrMf/8GyG//Bshv/x7oz//Lv0P/+/v7W////DAAAAAAAAAAAAAAAAAAAAAD+/v4C////EP//
+ /yz///8q////OP///2r///+e///+9P7+/v/+/v3//v79//z89//6+e//+vjs//r57//8/Pb//v78//7+
+ /f/+/v7////+9v///6L+/v5c////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///1r+/vv/39eI/8KyHf/Cshv/wbIb/8e5Mf/x7s3/////1v///w4AAAAAAAAAAAAA
+ AAAAAAAA////fv////j////////////////////6////iP///1b///+G////hv///4j+/v6S////3v//
+ ///////k////kv///4j///+G////hv///1r///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9O/v79+vDsyP/g2Iz/4dmQ/+HZj//i25b/+Pfo////
+ /9L///8GAAAAAAAAAAAAAAAA////Dv///8z18tn/3tWF/93Ug//b0n//8e7O/////9L///8Y////AP//
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8U////Rv7+/nj///+I////Uv7+/iD///8CAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA/////////////////////////////////////w/////////wB////////4AH///////+AAf/
+ //////wAB///////+AAH///////gAAf//////+AAB///////wAAH//////+AAAf//////wAAB//////+
+ AAAH//////wAAAf//////AAAB//////8AAB///////gAAf//////+AAH///////wAA////////AAD///
+ ////8AAf///////wAD///////+AAP///////4AA////////gAD///AAf/+AAP//8AA//4AA///wAD//g
+ AD///AAP/+AAP//4AA//8AA///gAD//wAB//+AAf//AAD//wAB//+AAP/+AAH//4AAf/wAAf//gAAP8A
+ AD///AAAfAAAP//4AAAAAAB///gAAAAAAH/8CAwAAAAA//gIDAAAAAH/+AAAAAAAAf/4AAAAAAAD//gI
+ AAAAAAf//AgAAAAAD///gAAAAAAf//+AAAAAAH///4AAAAAA////gAGAAAP///+Af/AAH////4B+BAB/
+ ////gHwH//////+AfAf////////8B//////w//wH/////+B//Af/////4H/+D//////gf////////+B/
+ /////////f////////////////////////////////////////8=
+
+
+
+ 426, 17
\ No newline at end of file