Ver 2025.03.19.0

FrmEqSelector 로그파일 목록수집 개선(2회 to 1회)
FrmServerLog 파일명 중복에 따른 다운로드 파일명 수정
This commit is contained in:
2025-03-19 13:12:53 +09:00
parent 0c12d15092
commit fe76ce56d4
8 changed files with 103 additions and 193 deletions

View File

@@ -5,6 +5,7 @@ using System.Configuration;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using Telerik.WinControls.UI; using Telerik.WinControls.UI;
using static DDUtilityApp.GlobalVariable;
namespace DDUtilityApp namespace DDUtilityApp
{ {
@@ -50,12 +51,7 @@ namespace DDUtilityApp
{ {
try try
{ {
bool isAdmin = false; eUserLevel userLevel = GlobalVariable.Instance.UserLevel;
string adminPWD = ConfigurationManager.AppSettings["ADMIN"];
if (adminPWD != null && adminPWD == "daeduck!1") isAdmin = true;
#if DEBUG
isAdmin = true;
#endif
int btnWidth = 200; int btnWidth = 200;
int btnHeight = 32; int btnHeight = 32;
@@ -70,7 +66,8 @@ namespace DDUtilityApp
button.Dock = DockStyle.Top; button.Dock = DockStyle.Top;
button.TabIndex = tabIndex++; button.TabIndex = tabIndex++;
button.Tag = obj.Value; button.Tag = obj.Value;
button.Visible = obj.Visible | isAdmin; button.Visible = obj.Visible;
if (obj.Visible == false && userLevel > eUserLevel.Normal) button.Visible = true;
button.Click += Button_Click; button.Click += Button_Click;
lstControls.Add(button); lstControls.Add(button);
} }

View File

@@ -1,4 +1,5 @@
using JWH; using JWH;
using log4net.Core;
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.Configuration; using System.Configuration;
@@ -56,6 +57,14 @@ namespace DDUtilityApp
public Size FormSize { get; set; } = new Size(1300, 750); public Size FormSize { get; set; } = new Size(1300, 750);
private eUserLevel m_UserLevel = eUserLevel.None;
public eUserLevel UserLevel { get { return this.m_UserLevel; } set { this.m_UserLevel = value; } }
public string SetUserLevel {
set { Enum.TryParse<eUserLevel>(value, out this.m_UserLevel); }
}
#region [ LogParser ] #region [ LogParser ]
public string EisParser_GridHeader { get; set; } = string.Empty; public string EisParser_GridHeader { get; set; } = string.Empty;
@@ -218,6 +227,14 @@ namespace DDUtilityApp
} }
} }
public enum eUserLevel
{
None = 0,
Normal = 1,
Admin = 16,
SupperAdmin = 128
}
} }
} }

View File

@@ -20,6 +20,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Text; using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting; using System.Windows.Forms.DataVisualization.Charting;
using Telerik.WinControls.UI; using Telerik.WinControls.UI;
@@ -55,6 +56,8 @@ namespace DDUtilityApp.LOGPARSER
public SECSDefine SECSDefine { get; set; } = null; public SECSDefine SECSDefine { get; set; } = null;
private int InitializeStatus { get; set; } = 0;
#endregion #endregion
#region [ FrmEqSelector ] --------------------------------------------- #region [ FrmEqSelector ] ---------------------------------------------
@@ -82,17 +85,11 @@ namespace DDUtilityApp.LOGPARSER
this.chkUseSMB.Visible = false; this.chkUseSMB.Visible = false;
this.tabControl1.SelectedIndex = 0; this.tabControl1.SelectedIndex = 0;
this.tboxModelDescription.Font = font; this.tboxModelDescription.Font = font;
this.GridEquipments_Setting();
this.GridLogFiles_Setting(this.gridLogFiles); //jhlim 20250202
this.GridLogFiles_Setting(this.gridHsms); //jhlim 20250202
this.GridLogFiles_Setting(this.gridWorkflow); //jhlim 20250202
this.GridModelDetail_Setting();
} }
protected void SetEventHandler() protected void SetEventHandler()
{ {
this.Load += FrmEquipments_Load; this.Shown += this.FrmEqSelector_Shown;
this.FormClosing += FrmEqSelector_FormClosing; this.FormClosing += FrmEqSelector_FormClosing;
this.FormClosed += this.FrmEqSelector_FormClosed; this.FormClosed += this.FrmEqSelector_FormClosed;
this.Disposed += this.FrmEqSelector_Disposed; this.Disposed += this.FrmEqSelector_Disposed;
@@ -113,12 +110,44 @@ namespace DDUtilityApp.LOGPARSER
this.gridLogFiles.CellDoubleClick += GridLogFiles_CellDoubleClick; this.gridLogFiles.CellDoubleClick += GridLogFiles_CellDoubleClick;
this.gridLogFiles.KeyDown += GridLogFiles_KeyDown; this.gridLogFiles.KeyDown += GridLogFiles_KeyDown;
//jhlim 20250202 start
this.gridWorkflow.CellDoubleClick += Grid_CellDoubleClick; this.gridWorkflow.CellDoubleClick += Grid_CellDoubleClick;
this.gridWorkflow.KeyDown += Grid_KeyDown; this.gridWorkflow.KeyDown += Grid_KeyDown;
this.gridHsms.CellDoubleClick += Grid_CellDoubleClick; this.gridHsms.CellDoubleClick += Grid_CellDoubleClick;
this.gridHsms.KeyDown += Grid_KeyDown; this.gridHsms.KeyDown += Grid_KeyDown;
//jhlim 20250202 end }
private async void FrmEqSelector_Shown(object sender, EventArgs e)
{
await Task.Delay(500);
try
{
this.SuspendLayout();
this.GridEquipments_Setting();
this.GridLogFiles_Setting(this.gridLogFiles);
this.GridLogFiles_Setting(this.gridHsms);
this.GridLogFiles_Setting(this.gridWorkflow);
this.GridModelDetail_Setting();
this.InitializeStatus = 1;
this.SetLogServer();
if (this.Equipment != null) this.SetEquipment(this.Equipment);
else this.SetEquipment(this.ServerName, this.Equipment?.EquipmentID);
this.InitializeStatus = 0;
this.GridEquipments_SelectionChanged(this.gridEquipments, null);
this.SetSelectedLogFiles(this.SelectedLogFiles);
}
catch (Exception ex)
{
XLogger.Instance.Fatal(ex, true);
}
finally
{
this.InitializeStatus = 0;
this.ResumeLayout();
}
} }
private void FrmEqSelector_Disposed(object sender, EventArgs e) private void FrmEqSelector_Disposed(object sender, EventArgs e)
@@ -157,14 +186,6 @@ namespace DDUtilityApp.LOGPARSER
return base.ProcessCmdKey(ref msg, keyData); return base.ProcessCmdKey(ref msg, keyData);
} }
private void FrmEquipments_Load(object sender, EventArgs e)
{
this.SetLogServer();
if (this.Equipment != null) this.SetEquipment(this.Equipment);
else this.SetEquipment(this.ServerName, this.Equipment?.EquipmentID);
this.SetSelectedLogFiles(this.SelectedLogFiles);
}
private void FrmEqSelector_FormClosing(object sender, FormClosingEventArgs e) private void FrmEqSelector_FormClosing(object sender, FormClosingEventArgs e)
{ {
} }
@@ -356,7 +377,7 @@ namespace DDUtilityApp.LOGPARSER
{ {
GridViewEx grid = this.gridEquipments; GridViewEx grid = this.gridEquipments;
grid.TableElement.RowHeight = 20; grid.TableElement.RowHeight = 20;
grid.MultiSelect = true; grid.MultiSelect = false;
Dictionary<string, string> dicColumnText = new Dictionary<string, string>(); Dictionary<string, string> dicColumnText = new Dictionary<string, string>();
dicColumnText.Add("Facility", ""); dicColumnText.Add("Facility", "");
@@ -424,12 +445,13 @@ namespace DDUtilityApp.LOGPARSER
{ {
try try
{ {
if (this.InitializeStatus > 0) return;
if (this.gridEquipments.SelectedRows.Count < 1) return; if (this.gridEquipments.SelectedRows.Count < 1) return;
this.gridLogFiles.DataSource = null; this.gridLogFiles.DataSource = null;
this.gridModelDetail.DataSource = null; this.gridModelDetail.DataSource = null;
this.gridWorkflow.DataSource = null; this.gridWorkflow.DataSource = null;
this.gridHsms.DataSource = null; this.gridHsms.DataSource = null;
//if (this.tabControl1.TabPages.Contains(this.tabHSMS)) this.tabControl1.TabPages.Remove(this.tabHSMS);
EisEquipment equipment = this.gridEquipments.SelectedRows[0].DataBoundItem as EisEquipment; EisEquipment equipment = this.gridEquipments.SelectedRows[0].DataBoundItem as EisEquipment;
if (equipment == null) return; if (equipment == null) return;
@@ -570,165 +592,6 @@ namespace DDUtilityApp.LOGPARSER
} }
} }
/// <summary>
/// [CheckPoint] 선택된 설비의 로그파일 목록을 표시한다.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void xGridEquipments_SelectionChanged(object sender, EventArgs e)
{
try
{
if (this.gridEquipments.SelectedRows.Count < 1) return;
this.gridLogFiles.DataSource = null;
this.gridModelDetail.DataSource = null;
EisEquipment equipment = this.gridEquipments.SelectedRows[0].DataBoundItem as EisEquipment;
if (equipment == null) return;
this.Cursor = Cursors.WaitCursor;
this.Equipment = equipment;
LogServer logServer = this.cboxServer.SelectedItem as LogServer;
string path = string.Empty;
#region [ Model Details ]
// 모델 버전 정보
EisModelDetails[] modelDetails = this.GetModelDetails(equipment);
this.gridModelDetail.AutoBinding(modelDetails);
this.gridModelDetail.SetRowForeColor("LockState", $"LockState = 'BLOCKED'", Color.LightGray);
foreach (GridViewRowInfo row in this.gridModelDetail.Rows)
{
EisModelDetails item = row.DataBoundItem as EisModelDetails;
if (item == null) continue;
if (item.Version == equipment.Version)
{
row.IsSelected = true;
row.IsCurrent = true;
break;
}
}
// 모델 정보
EisModelInfo[] modelInfo = this.GetModelInfo(equipment);
if (modelInfo?.Length > 0)
{
this.tboxModelDescription.Text = modelInfo[0].Description;
}
#endregion
#region [ LogFiles ]
if (logServer.NetworkAccount.ContainsKey(equipment.LogServerIP)) //jhlim 20250202 jj
{
// Checking Local IP-Address
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (UnicastIPAddressInformation ip in nic.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
if (ip.Address.ToString() == equipment.LogServerIP)
{
path = $@"{equipment.LogPath}\{equipment.EquipmentID}";
break;
}
}
}
}
// SMB (Server Message Block)
//if (string.IsNullOrEmpty(path) && this.chkUseSMB.Checked)
//{
// Account account = logServer.NetworkAccount[equipment.LogServerIP];
// int result = ExtensionAPI.ConnectRemoteServer(account.IPAddress, account.UserID, account.Password);
// if (result != 0 && result != 1219) { MessageBox.Show($@"네트워크 접근에 실패하였습니다. (Code:{result})"); return; }
// path = logServer.GetLogPath(equipment.LogServerIP, equipment.EquipmentID);
//}
if (string.IsNullOrEmpty(path) && this.chkUseSMB.Checked) //jhlim 20250202
{
Account account = logServer.NetworkAccount[equipment.LogServerIP];
object rtnObj = null;
// StpClientWrap 사용
//StpClientWrap.Initialize(equipment?.LogServerIP, "test", "daeduck!1");
//StpClientWrap.Connect();
var svrInfo = (DDUtilityApp.DATA.Account)GetNetworkAccount(equipment?.LogServerIP);
FtpsClient.Initialize(equipment?.LogServerIP, svrInfo.UserID, svrInfo.Password);
FtpsClient.Connect();
var remotePath = $"/{svrInfo.DefaultPath}/{equipment.EquipmentID}";
//var remotePath = $"{equipment.EquipmentID}";
// SFTP 파일 목록 가져오기
//rtnObj = StpClientWrap.GetSftpList(remotePath);
rtnObj = FtpsClient.GetFtpsList(remotePath);
if (rtnObj == null) return;
//StpClientWrap.IsDirectory( "/302304/THiRA_SECSGEM/HSMS")
//var hsmsEnabled = (StpClientWrap.IsDirExists( $"{remotePath}/THiRA_SECSGEM/HSMS"));
var hsmsEnabled = (FtpsClient.IsDirExists($"{remotePath}/THiRA_SECSGEM/HSMS"));
if (hsmsEnabled == false)
{
if (tabControl1.TabPages.Contains(tabHSMS))
{
tabControl1.TabPages.Remove(tabHSMS);
}
}
else
{
if (!tabControl1.TabPages.Contains(tabHSMS))
{
tabControl1.TabPages.Add(tabHSMS);
}
}
this.gridLogFiles.AutoBinding(GetFtpslogFiles(rtnObj));
// 연결 종료 //jhlim 20250202
//StpClientWrap.Disconnect();
FtpsClient.Disconnect();
}
else if (string.IsNullOrEmpty(path) == false)
{
// 로그 파일 목록
DirectoryInfo directory = new DirectoryInfo(path);
if (directory.Exists == false)
{
MessageBox.Show($@"폴더가 존재하지 않습니다" + Environment.NewLine + Environment.NewLine + $@"Path: {path}");
return;
}
LogFile[] logFiles = directory.GetFiles().ToClass<LogFile>().OrderByDescending(x => x.Name).ToArray();
this.gridLogFiles.AutoBinding(logFiles);
}
}
else
{
path = $@"{equipment.LogPath}\{equipment.EquipmentID}";
}
this.rstatus1.Text = path;
if (string.IsNullOrEmpty(path)) return;
#endregion
//// 로그 파일 목록
//DirectoryInfo directory = new DirectoryInfo(path);
//if (directory.Exists == false)
//{
// MessageBox.Show($@"폴더가 존재하지 않습니다" + Environment.NewLine + Environment.NewLine + $@"Path: {path}");
// return;
//}
//LogFile[] logFiles = directory.GetFiles().ToClass<LogFile>().OrderByDescending(x => x.Name).ToArray();
//this.gridLogFiles.AutoBinding(logFiles);
}
catch (Exception ex)
{
XLogger.Instance.Fatal(ex, true);
}
finally
{
this.Cursor = Cursors.Default;
}
}
private void GridEquipments_CellDoubleClick(object sender, GridViewCellEventArgs e) private void GridEquipments_CellDoubleClick(object sender, GridViewCellEventArgs e)
{ {
try try

View File

@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http.Headers;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
@@ -378,8 +379,13 @@ namespace DDUtilityApp.LOGPARSER.PARSER
dlg = new FrmEqSelector(); dlg = new FrmEqSelector();
dlg.Owner = sender; dlg.Owner = sender;
dlg.Size = new System.Drawing.Size(sender.Width - 10, sender.Height - 60); dlg.StartPosition = FormStartPosition.Manual;
dlg.StartPosition = FormStartPosition.CenterParent; int nWidth = sender.Width - 10;
int nHeight = sender.Height - 48;
int nLeft = sender.Left + ((sender.Width - nWidth) / 2);
int nTop = Math.Max(0, sender.Top) + ((sender.Height - nHeight)) - 10;
dlg.Size = new System.Drawing.Size(nWidth, nHeight);
dlg.Location = new System.Drawing.Point(nLeft, nTop);
dlg.ServerName = this.ServerName; dlg.ServerName = this.ServerName;
dlg.Equipment = sender.Equipment == null ? new EisEquipment() { EquipmentID = this.EquipmentID, Server = new LogServer(this.ServerName)} : sender.Equipment; dlg.Equipment = sender.Equipment == null ? new EisEquipment() { EquipmentID = this.EquipmentID, Server = new LogServer(this.ServerName)} : sender.Equipment;
dlg.SelectedLogFiles = lstLogFile.ToArray(); dlg.SelectedLogFiles = lstLogFile.ToArray();

View File

@@ -260,7 +260,8 @@ namespace DDUtilityApp.MESDOWNLOADER
{ {
try try
{ {
Process.Start("explorer.exe", this.tboxDownPath.Text); string path = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text);
Process.Start("explorer.exe", path);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -312,6 +313,11 @@ namespace DDUtilityApp.MESDOWNLOADER
} }
} }
/// <summary>
/// FileDownload
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void GridFiles_CellDoubleClick(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e) private async void GridFiles_CellDoubleClick(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
{ {
try try
@@ -352,23 +358,25 @@ namespace DDUtilityApp.MESDOWNLOADER
foreach(DataRow row in rows) foreach(DataRow row in rows)
{ {
string nameap = row["nameap"] as string;
string fileName = row["FileName"] as string; string fileName = row["FileName"] as string;
string url = row["url"] as string; string url = row["url"] as string;
string dir = row["dir"] as string; string dir = row["dir"] as string;
string subpath = row["subpath"] as string; string subpath = row["subpath"] as string;
string userId = row["userId"] as string; string userId = row["userId"] as string;
string password = row["password"] as string; string password = row["password"] as string;
string fileNameDST = $"{nameap}_{fileName}";
string extension = System.IO.Path.GetExtension(fileName); string extension = System.IO.Path.GetExtension(fileNameDST);
if (string.Compare(extension, ".Zip", true) == 0) hasZip = true; if (string.Compare(extension, ".Zip", true) == 0) hasZip = true;
else if (string.Compare(extension, ".Log", false) == 0) fileName += ".Log"; else if (string.Compare(extension, ".Log", false) != 0) fileNameDST += ".Log";
List<string> paths = new List<string>(); List<string> paths = new List<string>();
if (!string.IsNullOrEmpty(dir)) paths.Add(dir); if (!string.IsNullOrEmpty(dir)) paths.Add(dir);
if (!string.IsNullOrEmpty(subpath)) paths.Add(subpath); if (!string.IsNullOrEmpty(subpath)) paths.Add(subpath);
if (!string.IsNullOrEmpty(fileName)) paths.Add(fileName); if (!string.IsNullOrEmpty(fileName)) paths.Add(fileName);
string pathSRC = System.IO.Path.Combine(paths.ToArray()); string pathSRC = System.IO.Path.Combine(paths.ToArray());
string pathDST = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text, fileName); string pathDST = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text, fileNameDST);
frmProgress.UpdateProgress($"{fileName}", countDown); frmProgress.UpdateProgress($"{fileName}", countDown);
FtpsClient.Disconnect(); FtpsClient.Disconnect();

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로
// 지정되도록 할 수 있습니다. // 지정되도록 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2025.03.18.5")] [assembly: AssemblyVersion("2025.03.19.0")]
[assembly: AssemblyFileVersion("2025.03.18.5")] [assembly: AssemblyFileVersion("2025.03.19.0")]

View File

@@ -294,8 +294,13 @@
this.lviewSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.lviewSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left))); | System.Windows.Forms.AnchorStyles.Left)));
this.lviewSubject.AutoScroll = true; this.lviewSubject.AutoScroll = true;
this.lviewSubject.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.lviewSubject.Location = new System.Drawing.Point(112, 46); this.lviewSubject.Location = new System.Drawing.Point(112, 46);
this.lviewSubject.Name = "lviewSubject"; this.lviewSubject.Name = "lviewSubject";
//
//
//
this.lviewSubject.RootElement.ControlBounds = new System.Drawing.Rectangle(0, 0, 120, 95);
this.lviewSubject.Size = new System.Drawing.Size(350, 89); this.lviewSubject.Size = new System.Drawing.Size(350, 89);
this.lviewSubject.TabIndex = 13; this.lviewSubject.TabIndex = 13;
// //
@@ -1201,6 +1206,7 @@
// //
// gridValue // gridValue
// //
this.gridValue.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.gridValue.ColumnResizeKey = System.Windows.Forms.Keys.F6; this.gridValue.ColumnResizeKey = System.Windows.Forms.Keys.F6;
this.gridValue.Dock = System.Windows.Forms.DockStyle.Fill; this.gridValue.Dock = System.Windows.Forms.DockStyle.Fill;
this.gridValue.Location = new System.Drawing.Point(0, 0); this.gridValue.Location = new System.Drawing.Point(0, 0);
@@ -1209,6 +1215,10 @@
// //
this.gridValue.MasterTemplate.ViewDefinition = tableViewDefinition1; this.gridValue.MasterTemplate.ViewDefinition = tableViewDefinition1;
this.gridValue.Name = "gridValue"; this.gridValue.Name = "gridValue";
//
//
//
this.gridValue.RootElement.ControlBounds = new System.Drawing.Rectangle(0, 0, 240, 150);
this.gridValue.Size = new System.Drawing.Size(402, 420); this.gridValue.Size = new System.Drawing.Size(402, 420);
this.gridValue.TabIndex = 2; this.gridValue.TabIndex = 2;
// //

View File

@@ -117,6 +117,15 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="lviewSubject.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="gridValue.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>138, 17</value>
</metadata>
<metadata name="radStatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>243, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <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"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>