[성현모] MiddleWare.Log 프로젝트 추가

This commit is contained in:
SHM
2024-06-26 11:34:28 +09:00
parent edf0aedc6b
commit d463bfa084
39 changed files with 7357 additions and 3 deletions

6
.gitignore vendored
View File

@ -4,9 +4,6 @@
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
#======================Custom
.svn
# User-specific files
*.rsuser
*.suo
@ -401,3 +398,6 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml
#======================Custom
.svn
!SystemX.Net.CP.Middleware.Log

View File

@ -0,0 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30225.117
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemX.Net.CP.Middleware.Log", "SystemX.Net.Middleware.UI\SystemX.Net.CP.Middleware.Log.csproj", "{3658FBE5-9A84-4F76-8E19-867DB9F4484D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.ActiveCfg = Debug|x64
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.Build.0 = Debug|x64
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.Build.0 = Release|Any CPU
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.ActiveCfg = Release|x64
{3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {68CD108D-837F-47FF-A153-70C328D18A84}
VisualSVNWorkingCopyRoot = .
EndGlobalSection
EndGlobal

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System">
<section name="DevExpress.LookAndFeel.Design.AppSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<DevExpress.LookAndFeel.Design.AppSettings>
<setting name="DPIAwarenessMode" serializeAs="String">
<value>System</value>
</setting>
</DevExpress.LookAndFeel.Design.AppSettings>
</applicationSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Caching.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Options" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.32.0" newVersion="3.1.32.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,547 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using System.Security.Cryptography;
using System.Data;
using System.Text.RegularExpressions;
using System.Net.Sockets;
using System.Globalization;
using System.Threading;
using System.Diagnostics;
using System.Net;
using SystemX.Net.BaseProtocol;
using System.Xml.Linq;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Data.SqlClient;
namespace SystemX.Net.Middleware.Log.Commons
{
using ParamElement = Tuple<SqlDbType, int, byte, byte>;
public class HISTTesterSummary
{
public string StationName { set; get; }
public string TestType { set; get; }
public string Version { set; get; }
public string ProdCode { set; get; }
public int TestListFileNo { set; get; }
public int TestListVariantNo { set; get; }
public string TestListCntID { set; get; }
public int StepVersion { set; get; }
public string Host { set; get; }
public string Section { set; get; }
public string ProdNoC { set; get; }
public string ProdNoP { set; get; }
public string TestCode { set; get; }
public string TestListFileName { set; get; }
public string ProductID { set; get; }
public string Result { set; get; }
public string Duration { set; get; }
public DateTime TestDT { set; get; }
}
public class HISTLogSummary
{
public string StationName { set; get; }
public string TestType { set; get; }
public string Version { set; get; }
public string ProdCode { set; get; }
public int TestListFileNo { set; get; }
public int TestListVariantNo { set; get; }
public string TestListCntID { set; get; }
public int StepVersion { set; get; }
public string Host { set; get; }
public string Section { set; get; }
public string ProdNoC { set; get; }
public string ProdNoP { set; get; }
public string TestCode { set; get; }
public string TestListFileName { set; get; }
public string ProductID { set; get; }
public string Result { set; get; }
public string Duration { set; get; }
public DateTime TestDT { set; get; }
}
public static class ShortLogParamInfo
{
public static readonly int MessageLength = 4096;
public static readonly int MessageValLength = 2024;
public static string STEP = "";
public static string POSITION = "";
public static string MO = "";
public static string FNC_NAME = "";
public static string MIN = "";
public static string MEASURE = "";
public static string MAX = "";
public static string DIM = "";
public static string CHECK = "";
public static string SPENT_TIME = "";
public static string INFO = "";
public static bool GLOBAL_SPEC = false;
public static string VRFY_MIN = "";
public static string VRFY_MAX = "";
}
public static class LongLogParamInfo
{
public static readonly int MessageLength = 4096;
public static readonly int MessageValLength = 2024;
public static string STEP = "";
public static string POSITION = "";
public static string MO = "";
public static string FNC_NAME = "";
public static string MIN = "";
public static string MEASURE = "";
public static string MAX = "";
public static string DIM = "";
public static string CHECK = "";
public static string SPENT_TIME = "";
public static string INFO = "";
public static bool GLOBAL_SPEC = false;
public static string VRFY_MIN = "";
public static string VRFY_MAX = "";
}
public static class ParamSet
{
public static Dictionary<string, ParamElement> fParam = new Dictionary<string, ParamElement>();
public static void TestResultField()
{
fParam.Clear();
fParam = new Dictionary<string, ParamElement>();
fParam.Add("No", new ParamElement(SqlDbType.BigInt, 0, 0, 0));
fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
fParam.Add("LogData", new ParamElement(SqlDbType.NVarChar, -1, 0, 0));
}
public static void TesterSummaryField()
{
fParam.Clear();
fParam = new Dictionary<string, ParamElement>();
fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0));
fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0));
fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
}
public static void LogSummaryField()
{
fParam.Clear();
fParam = new Dictionary<string, ParamElement>();
fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0));
fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0));
fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0));
fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
}
public static SqlParameter GetMakeSqlParameterInfo(Dictionary<string, ParamElement> refField, string strSetName, object objValue)
{
if (refField.ContainsKey(strSetName))
{
SqlParameter param = null;
if (refField[strSetName].Item2 != 0)
param = new SqlParameter("@" + strSetName, refField[strSetName].Item1, refField[strSetName].Item2);
else
param = new SqlParameter("@" + strSetName, refField[strSetName].Item1);
if (refField[strSetName].Item1 == SqlDbType.Decimal)
{
param.Precision = refField[strSetName].Item3;
param.Scale = refField[strSetName].Item4;
}
param.Value = objValue;
return param;
}
else
return null;
}
}
public class CommonProtocol
{
public SqlCommand LogDataResultInsert(string strTableName, DataRow itemData)
{
string columns = string.Empty;
columns = "No,TestDT,LogData";
string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c)));
string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values);
ParamSet.TestResultField();
SqlCommand cmd = new SqlCommand(sqlCommand);
SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()];
setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "No", Convert.ToInt64(itemData["No"]));
setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", Convert.ToDateTime(itemData["TestDT"]));
setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "LogData", Convert.ToString(itemData["LogData"]));
cmd.Parameters.AddRange(setParams);
return cmd;
}
public SqlCommand LogDataSummaryInsert(string strTableName, HISTLogSummary itemSummary)
{
string columns = string.Empty;
if (itemSummary.TestListCntID == string.Empty)
columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT";
else
columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,TestListCntID,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT";
string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c)));
string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values);
ParamSet.LogSummaryField();
SqlCommand cmd = new SqlCommand(sqlCommand);
SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()];
if (itemSummary.TestListCntID == string.Empty)
{
setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName);
setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType);
setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version);
setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode);
setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo);
setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo);
setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion);
setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host);
setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section);
setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC);
setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP);
setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode);
setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName);
setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID);
setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result);
setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration);
setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT);
}
else
{
setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName);
setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType);
setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version);
setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode);
setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo);
setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo);
setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListCntID", itemSummary.TestListCntID);
setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion);
setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host);
setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section);
setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC);
setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP);
setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode);
setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName);
setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID);
setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result);
setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration);
setParams[17] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT);
}
cmd.Parameters.AddRange(setParams);
return cmd;
}
}
public static class COMMON
{
[DllImport("winmm.dll")]
public static extern uint timeGetTime();
public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png";
public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif";
public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp";
public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff";
public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif";
public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif";
public const string AllFiles = "All files (*.*)" + "|*.*";
public static string[] mediaExtensions = {
".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc
".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc
".AVI", ".MP4", ".DIVX", ".WMV", //etc
};
public static DataTable ConvertCSVtoDataTable(string strFilePath, string strSetHeader)
{
DataTable dt = null;
try
{
using (StreamReader sr = new StreamReader(strFilePath))
{
string[] headers = null;
if (strSetHeader.Length > 0)
headers = strSetHeader.Split(',');
else
headers = sr.ReadLine().Split(',');
dt = new DataTable();
foreach (string header in headers)
{
dt.Columns.Add(header);
}
while (!sr.EndOfStream)
{
string strReadData = sr.ReadLine().Trim();
if (strReadData.Length <= 0)
break;
string[] rows = Regex.Split(strReadData, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
}
}
catch (Exception e)
{
dt = null;
}
return dt;
}
public static T ConvertTextToTryValue<T>(string strText, object objFailValue)
{
object obj;
obj = typeof(T);
int iGetValue = 0;
uint uiGetValue = 0;
double dGetValue = 0;
if (obj.ToString().IndexOf("Int") >= 0)
{
if (!int.TryParse(strText, out iGetValue))
obj = objFailValue;
else
obj = iGetValue;
}
if (obj.ToString().IndexOf("UInt") >= 0)
{
if (!uint.TryParse(strText, out uiGetValue))
obj = objFailValue;
else
obj = uiGetValue;
}
else if (obj.ToString().IndexOf("Double") >= 0)
{
if (!double.TryParse(strText, out dGetValue))
obj = objFailValue;
else
obj = dGetValue;
}
return (T)Convert.ChangeType(obj, typeof(T));
}
public static T FindByName<T>(this object targetClass, string name) where T : class
{
System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
return fi.GetValue(targetClass) as T;
}
public static T FindByName<T>(this string name, object targetClass) where T : class
{
System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
return fi.GetValue(targetClass) as T;
}
public class LogProcessInfo
{
public bool READ_INFO_STATE { set; get; }
private string strInfoFilePos;
public string TITLE;
public string SERVER_SAVE_POS;
public string MES_SAVE_POS;
//TODO : Server ALIS FTP
public bool FTP_Use;
public string FTP_IPAddress;
public string FTP_Port;
public string FTP_Account;
public string FTP_Password;
public long FTP_ScanTime_ms;
public long BULK_ProcessTime_ms;
public LogProcessInfo(string strGetInfoPath)
{
strInfoFilePos = strGetInfoPath;
}
public bool Load()
{
READ_INFO_STATE = true;
try
{
XDocument xDoc = XDocument.Load(strInfoFilePos);
var xElement = xDoc.Element("ROOT");
if (xElement != null)
{
var xGetElement = xElement.Element("Configure");
TITLE = xGetElement.Element("Title").Value;
SERVER_SAVE_POS = @xGetElement.Element("LogFileSavePos").Value;
MES_SAVE_POS = @xGetElement.Element("MESFileSavePos").Value;
//TODO : Server ALIS FTP
XElement xEle = xGetElement.Element("UseFTP");
bool bValue;
long lValue;
//string strValue;
if (xEle?.IsEmpty == false)
{
if (bool.TryParse(xEle.Value, out bValue))
FTP_Use = bValue;
}
else
FTP_Use = false;
xEle = xGetElement.Element("IPAddressFTP");
if (xEle?.IsEmpty == false)
FTP_IPAddress = xEle.Value;
else
FTP_IPAddress = "0.0.0.0";
xEle = xGetElement.Element("PortFTP");
if (xEle?.IsEmpty == false)
FTP_Port = xEle.Value;
else
FTP_Port = "21";
xEle = xGetElement.Element("AccountFTP");
if (xEle?.IsEmpty == false)
FTP_Account = xEle.Value;
else
FTP_Account = "";
xEle = xGetElement.Element("PasswordFTP");
if (xEle?.IsEmpty == false)
FTP_Password = xEle.Value;
else
FTP_Password = "";
xEle = xGetElement.Element("ScanTimeFTPms");
if (xEle?.IsEmpty == false)
{
if (long.TryParse(xEle.Value, out lValue))
FTP_ScanTime_ms = lValue;
}
else
FTP_ScanTime_ms = 30000;
xEle = xGetElement.Element("ScanTimeBULKms");
if (xEle?.IsEmpty == false)
{
if (long.TryParse(xEle.Value, out lValue))
BULK_ProcessTime_ms = lValue;
}
else
BULK_ProcessTime_ms = 30000;
if (Base.CheckPath(SERVER_SAVE_POS))
{
if (Directory.Exists(SERVER_SAVE_POS) == false)
Directory.CreateDirectory(SERVER_SAVE_POS);
}
else
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(SERVER SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
throw new Exception();
}
if (Base.CheckPath(MES_SAVE_POS))
{
if (Directory.Exists(MES_SAVE_POS) == false)
Directory.CreateDirectory(MES_SAVE_POS);
}
else
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(MES SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
throw new Exception();
}
}
}
catch (Exception e)
{
READ_INFO_STATE = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"LogProcessInfo read failed. [LogProcessInfo : SystemX.Net.Middleware.Commons]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
return READ_INFO_STATE;
}
}
}
}

View File

@ -0,0 +1,169 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using System.Security.Cryptography;
using System.Data;
using System.Text.RegularExpressions;
using System.Net.Sockets;
using System.Globalization;
using System.Threading;
using System.Diagnostics;
using System.Net;
using SystemX.Net.BaseProtocol;
using System.Xml.Linq;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Data.SqlClient;
namespace SystemX.Net.Middleware.Log.DeleteProc
{
public class DeleteProcSystem
{
public Stopwatch stDeleteLogScanTimer;
public DeleteProcSystem()
{
stDeleteLogScanTimer = new Stopwatch();
}
protected void ScanTimerStart()
{
stDeleteLogScanTimer.Start();
}
protected void ScanTimerRestart()
{
stDeleteLogScanTimer.Restart();
}
protected long GetTimerTime()
{
return stDeleteLogScanTimer.ElapsedMilliseconds;
}
protected bool GetTimeOverState(long lLimitTime)
{
return (stDeleteLogScanTimer.ElapsedMilliseconds >= lLimitTime) ? true : false;
}
}
public class DeleteProcOption
{
public enum eLogCheckItem
{
Summary = 0,
ShortTerm = 1,
LongTerm = 2
}
//Option
public eLogCheckItem ProcChkItem;
public long lLogScanTimeVal;
public int nSummaryScanItemCnt;
public int nShortLogScanItemCnt;
public int nLongLogScanItemCnt;
public int nSummaryDeleteNum;
public DeleteProcOption()
{
ProcChkItem = eLogCheckItem.Summary;
//3 Minute
//Test 10000
lLogScanTimeVal = 10000; //180000;
nSummaryScanItemCnt = 100;
nShortLogScanItemCnt = 100;
nLongLogScanItemCnt = 100;
nSummaryDeleteNum = 5;
}
}
public class DeleteProcInfo : DeleteProcSystem
{
public int[] nHistSummaryDeleteList;
public int nHistSummaryDeleteSize;
public int nHistSummaryDeletePos;
//
public int[] nShortLogSummaryDeleteListNo;
public int[] nShortLogSummaryDeleteListAccessSt;
public int[] nShortLogSummaryDeleteListAccessEn;
public int nShortLogSummaryDeleteSize;
public int nShortLogSummaryDeletePos;
public bool bShortLogDataCheckResult;
public int nShortLogDeleteProcPos;
public bool bShortLogDataDeleteResult;
//
public int[] nLongLogSummaryDeleteListNo;
public int[] nLongLogSummaryDeleteListAccessSt;
public int[] nLongLogSummaryDeleteListAccessEn;
public int nLongLogSummaryDeleteSize;
public int nLongLogSummaryDeletePos;
public bool bLongLogDataCheckResult;
public int nLongLogDeleteProcPos;
public bool bLongLogDataDeleteResult;
//
//Option
public DeleteProcOption DeleteProcOp;
public DeleteProcInfo()
{
ScanTimerStart();
InitMember();
}
private void InitMember()
{
nHistSummaryDeleteList = new int[1];
nHistSummaryDeleteSize = 0;
nHistSummaryDeletePos = 0;
nShortLogSummaryDeleteListNo = new int[1];
nShortLogSummaryDeleteListAccessSt = new int[1];
nShortLogSummaryDeleteListAccessEn = new int[1];
nShortLogSummaryDeleteSize = 0;
nShortLogSummaryDeletePos = 0;
bShortLogDataCheckResult = false;
nShortLogDeleteProcPos = 0;
bShortLogDataDeleteResult = false;
nLongLogSummaryDeleteListNo = new int[1];
nLongLogSummaryDeleteListAccessSt = new int[1];
nLongLogSummaryDeleteListAccessEn = new int[1];
nLongLogSummaryDeleteSize = 0;
nLongLogSummaryDeletePos = 0;
bLongLogDataCheckResult = false;
nLongLogDeleteProcPos = 0;
bLongLogDataDeleteResult = false;
DeleteProcOp = new DeleteProcOption();
}
public bool GetScanTimeState()
{
return GetTimeOverState(DeleteProcOp.lLogScanTimeVal);
}
public void ResetScanTimeState()
{
ScanTimerRestart();
}
}
}

View File

@ -0,0 +1,849 @@
using DevExpress.XtraBars;
using DevExpress.XtraBars.Ribbon;
namespace SystemX.Net.MiddlewareUI
{
partial class MainForm
{
/// <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()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.fluentDesignFormContainer1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer();
this.panel2 = new System.Windows.Forms.Panel();
this.panelMain = new System.Windows.Forms.Panel();
this.panelProcess = new System.Windows.Forms.Panel();
this.richTextBoxProcess = new System.Windows.Forms.RichTextBox();
this.panelRecv = new System.Windows.Forms.Panel();
this.richTextBoxRecv = new System.Windows.Forms.RichTextBox();
this.paneldDBConn = new System.Windows.Forms.Panel();
this.panelDBPath = new System.Windows.Forms.Panel();
this.labelDBPath = new System.Windows.Forms.Label();
this.panelFTP = new System.Windows.Forms.Panel();
this.panel4 = new System.Windows.Forms.Panel();
this.labelFTP = new System.Windows.Forms.Label();
this.panelDBLongTerm2 = new System.Windows.Forms.Panel();
this.panelDBLongTerm1 = new System.Windows.Forms.Panel();
this.labelDBLongTerm = new System.Windows.Forms.Label();
this.panel7 = new System.Windows.Forms.Panel();
this.panel8 = new System.Windows.Forms.Panel();
this.labelShortTermLogTableName = new System.Windows.Forms.Label();
this.panel5 = new System.Windows.Forms.Panel();
this.panel6 = new System.Windows.Forms.Panel();
this.labelShortTermSummaryTableName = new System.Windows.Forms.Label();
this.panelDBShortTerm2 = new System.Windows.Forms.Panel();
this.panelDBShortTerm1 = new System.Windows.Forms.Panel();
this.labelDBShortTerm = new System.Windows.Forms.Label();
this.panelDBMain2 = new System.Windows.Forms.Panel();
this.panelDBMain1 = new System.Windows.Forms.Panel();
this.labelDBMain = new System.Windows.Forms.Label();
this.progressBarProgram = new System.Windows.Forms.ProgressBar();
this.panelSubFunc = new System.Windows.Forms.Panel();
this.buttonDbConnect = new System.Windows.Forms.Button();
this.panel3 = new System.Windows.Forms.Panel();
this.labelFTPTime = new System.Windows.Forms.Label();
this.labelBulkTime = new System.Windows.Forms.Label();
this.labelBulkCntInfo1 = new System.Windows.Forms.Label();
this.labelBulkCntInfo2 = new System.Windows.Forms.Label();
this.labelBulkCntInfo3 = new System.Windows.Forms.Label();
this.buttonBulkInsertStart = new System.Windows.Forms.Button();
this.panelSub1 = new System.Windows.Forms.Panel();
this.panelSub2 = new System.Windows.Forms.Panel();
this.panel1 = new System.Windows.Forms.Panel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.pictureBox3 = new System.Windows.Forms.PictureBox();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.Title_label = new System.Windows.Forms.Label();
this.AlisPictureBox = new System.Windows.Forms.PictureBox();
this.fluentDesignFormControl1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl();
this.barCheckItemShowCpLogTime = new DevExpress.XtraBars.BarCheckItem();
this.Chktimer = new System.Windows.Forms.Timer(this.components);
this.UItimer = new System.Windows.Forms.Timer(this.components);
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuSubStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemExit = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox();
this.fluentDesignFormContainer1.SuspendLayout();
this.panel2.SuspendLayout();
this.panelMain.SuspendLayout();
this.panelProcess.SuspendLayout();
this.panelRecv.SuspendLayout();
this.paneldDBConn.SuspendLayout();
this.panelDBPath.SuspendLayout();
this.panelFTP.SuspendLayout();
this.panel4.SuspendLayout();
this.panelDBLongTerm2.SuspendLayout();
this.panelDBLongTerm1.SuspendLayout();
this.panel7.SuspendLayout();
this.panel8.SuspendLayout();
this.panel5.SuspendLayout();
this.panel6.SuspendLayout();
this.panelDBShortTerm2.SuspendLayout();
this.panelDBShortTerm1.SuspendLayout();
this.panelDBMain2.SuspendLayout();
this.panelDBMain1.SuspendLayout();
this.panelSubFunc.SuspendLayout();
this.panel3.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).BeginInit();
this.contextMenuSubStrip.SuspendLayout();
this.SuspendLayout();
//
// fluentDesignFormContainer1
//
this.fluentDesignFormContainer1.Controls.Add(this.panel2);
this.fluentDesignFormContainer1.Controls.Add(this.panel1);
this.fluentDesignFormContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.fluentDesignFormContainer1.Location = new System.Drawing.Point(0, 46);
this.fluentDesignFormContainer1.Name = "fluentDesignFormContainer1";
this.fluentDesignFormContainer1.Size = new System.Drawing.Size(1979, 958);
this.fluentDesignFormContainer1.TabIndex = 0;
//
// panel2
//
this.panel2.Controls.Add(this.panelMain);
this.panel2.Controls.Add(this.panelSubFunc);
this.panel2.Controls.Add(this.panelSub1);
this.panel2.Controls.Add(this.panelSub2);
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(0, 74);
this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(1979, 884);
this.panel2.TabIndex = 3;
//
// panelMain
//
this.panelMain.Controls.Add(this.panelProcess);
this.panelMain.Controls.Add(this.panelRecv);
this.panelMain.Controls.Add(this.paneldDBConn);
this.panelMain.Controls.Add(this.progressBarProgram);
this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelMain.Location = new System.Drawing.Point(0, 0);
this.panelMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelMain.Name = "panelMain";
this.panelMain.Size = new System.Drawing.Size(1979, 592);
this.panelMain.TabIndex = 18;
//
// panelProcess
//
this.panelProcess.Controls.Add(this.richTextBoxProcess);
this.panelProcess.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelProcess.Location = new System.Drawing.Point(433, 306);
this.panelProcess.Margin = new System.Windows.Forms.Padding(20);
this.panelProcess.Name = "panelProcess";
this.panelProcess.Padding = new System.Windows.Forms.Padding(20);
this.panelProcess.Size = new System.Drawing.Size(1546, 286);
this.panelProcess.TabIndex = 23;
//
// richTextBoxProcess
//
this.richTextBoxProcess.BackColor = System.Drawing.Color.White;
this.richTextBoxProcess.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.richTextBoxProcess.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBoxProcess.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.richTextBoxProcess.Location = new System.Drawing.Point(20, 20);
this.richTextBoxProcess.Margin = new System.Windows.Forms.Padding(10);
this.richTextBoxProcess.Name = "richTextBoxProcess";
this.richTextBoxProcess.ReadOnly = true;
this.richTextBoxProcess.Size = new System.Drawing.Size(1506, 246);
this.richTextBoxProcess.TabIndex = 1;
this.richTextBoxProcess.Text = "";
//
// panelRecv
//
this.panelRecv.Controls.Add(this.richTextBoxRecv);
this.panelRecv.Dock = System.Windows.Forms.DockStyle.Top;
this.panelRecv.Location = new System.Drawing.Point(433, 60);
this.panelRecv.Margin = new System.Windows.Forms.Padding(20);
this.panelRecv.Name = "panelRecv";
this.panelRecv.Padding = new System.Windows.Forms.Padding(20);
this.panelRecv.Size = new System.Drawing.Size(1546, 233);
this.panelRecv.TabIndex = 22;
//
// richTextBoxRecv
//
this.richTextBoxRecv.BackColor = System.Drawing.Color.White;
this.richTextBoxRecv.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.richTextBoxRecv.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBoxRecv.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.richTextBoxRecv.Location = new System.Drawing.Point(20, 20);
this.richTextBoxRecv.Margin = new System.Windows.Forms.Padding(10);
this.richTextBoxRecv.Name = "richTextBoxRecv";
this.richTextBoxRecv.ReadOnly = true;
this.richTextBoxRecv.Size = new System.Drawing.Size(1506, 193);
this.richTextBoxRecv.TabIndex = 0;
this.richTextBoxRecv.Text = "";
//
// paneldDBConn
//
this.paneldDBConn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
this.paneldDBConn.Controls.Add(this.panelDBPath);
this.paneldDBConn.Controls.Add(this.panelFTP);
this.paneldDBConn.Controls.Add(this.panelDBLongTerm2);
this.paneldDBConn.Controls.Add(this.panel7);
this.paneldDBConn.Controls.Add(this.panel5);
this.paneldDBConn.Controls.Add(this.panelDBShortTerm2);
this.paneldDBConn.Controls.Add(this.panelDBMain2);
this.paneldDBConn.Dock = System.Windows.Forms.DockStyle.Left;
this.paneldDBConn.Location = new System.Drawing.Point(0, 60);
this.paneldDBConn.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.paneldDBConn.Name = "paneldDBConn";
this.paneldDBConn.Size = new System.Drawing.Size(433, 532);
this.paneldDBConn.TabIndex = 21;
//
// panelDBPath
//
this.panelDBPath.Controls.Add(this.labelDBPath);
this.panelDBPath.Dock = System.Windows.Forms.DockStyle.Top;
this.panelDBPath.Location = new System.Drawing.Point(0, 228);
this.panelDBPath.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBPath.Name = "panelDBPath";
this.panelDBPath.Size = new System.Drawing.Size(433, 39);
this.panelDBPath.TabIndex = 33;
//
// labelDBPath
//
this.labelDBPath.BackColor = System.Drawing.Color.White;
this.labelDBPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelDBPath.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelDBPath.Location = new System.Drawing.Point(0, 0);
this.labelDBPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelDBPath.Name = "labelDBPath";
this.labelDBPath.Size = new System.Drawing.Size(433, 39);
this.labelDBPath.TabIndex = 23;
this.labelDBPath.Text = "Path";
this.labelDBPath.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// panelFTP
//
this.panelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panelFTP.Controls.Add(this.panel4);
this.panelFTP.Dock = System.Windows.Forms.DockStyle.Top;
this.panelFTP.Location = new System.Drawing.Point(0, 190);
this.panelFTP.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelFTP.Name = "panelFTP";
this.panelFTP.Size = new System.Drawing.Size(433, 38);
this.panelFTP.TabIndex = 32;
this.panelFTP.Visible = false;
//
// panel4
//
this.panel4.Controls.Add(this.labelFTP);
this.panel4.Dock = System.Windows.Forms.DockStyle.Left;
this.panel4.Location = new System.Drawing.Point(0, 0);
this.panel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(408, 36);
this.panel4.TabIndex = 26;
//
// labelFTP
//
this.labelFTP.BackColor = System.Drawing.Color.White;
this.labelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelFTP.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelFTP.Location = new System.Drawing.Point(0, 0);
this.labelFTP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelFTP.Name = "labelFTP";
this.labelFTP.Size = new System.Drawing.Size(408, 36);
this.labelFTP.TabIndex = 23;
this.labelFTP.Text = "FTP";
this.labelFTP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panelDBLongTerm2
//
this.panelDBLongTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panelDBLongTerm2.Controls.Add(this.panelDBLongTerm1);
this.panelDBLongTerm2.Dock = System.Windows.Forms.DockStyle.Top;
this.panelDBLongTerm2.Location = new System.Drawing.Point(0, 152);
this.panelDBLongTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBLongTerm2.Name = "panelDBLongTerm2";
this.panelDBLongTerm2.Size = new System.Drawing.Size(433, 38);
this.panelDBLongTerm2.TabIndex = 31;
//
// panelDBLongTerm1
//
this.panelDBLongTerm1.Controls.Add(this.labelDBLongTerm);
this.panelDBLongTerm1.Dock = System.Windows.Forms.DockStyle.Left;
this.panelDBLongTerm1.Location = new System.Drawing.Point(0, 0);
this.panelDBLongTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBLongTerm1.Name = "panelDBLongTerm1";
this.panelDBLongTerm1.Size = new System.Drawing.Size(408, 36);
this.panelDBLongTerm1.TabIndex = 26;
//
// labelDBLongTerm
//
this.labelDBLongTerm.BackColor = System.Drawing.Color.White;
this.labelDBLongTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelDBLongTerm.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelDBLongTerm.Location = new System.Drawing.Point(0, 0);
this.labelDBLongTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelDBLongTerm.Name = "labelDBLongTerm";
this.labelDBLongTerm.Size = new System.Drawing.Size(408, 36);
this.labelDBLongTerm.TabIndex = 23;
this.labelDBLongTerm.Text = "LongTerm";
this.labelDBLongTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panel7
//
this.panel7.BackColor = System.Drawing.Color.WhiteSmoke;
this.panel7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel7.Controls.Add(this.panel8);
this.panel7.Dock = System.Windows.Forms.DockStyle.Top;
this.panel7.Location = new System.Drawing.Point(0, 114);
this.panel7.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel7.Name = "panel7";
this.panel7.Size = new System.Drawing.Size(433, 38);
this.panel7.TabIndex = 29;
//
// panel8
//
this.panel8.Controls.Add(this.labelShortTermLogTableName);
this.panel8.Dock = System.Windows.Forms.DockStyle.Left;
this.panel8.Location = new System.Drawing.Point(0, 0);
this.panel8.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel8.Name = "panel8";
this.panel8.Size = new System.Drawing.Size(408, 36);
this.panel8.TabIndex = 26;
//
// labelShortTermLogTableName
//
this.labelShortTermLogTableName.BackColor = System.Drawing.Color.White;
this.labelShortTermLogTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelShortTermLogTableName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelShortTermLogTableName.Location = new System.Drawing.Point(0, 0);
this.labelShortTermLogTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelShortTermLogTableName.Name = "labelShortTermLogTableName";
this.labelShortTermLogTableName.Size = new System.Drawing.Size(408, 36);
this.labelShortTermLogTableName.TabIndex = 23;
this.labelShortTermLogTableName.Text = "ShortTermLogTableName";
this.labelShortTermLogTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panel5
//
this.panel5.BackColor = System.Drawing.Color.WhiteSmoke;
this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel5.Controls.Add(this.panel6);
this.panel5.Dock = System.Windows.Forms.DockStyle.Top;
this.panel5.Location = new System.Drawing.Point(0, 76);
this.panel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel5.Name = "panel5";
this.panel5.Size = new System.Drawing.Size(433, 38);
this.panel5.TabIndex = 28;
//
// panel6
//
this.panel6.Controls.Add(this.labelShortTermSummaryTableName);
this.panel6.Dock = System.Windows.Forms.DockStyle.Left;
this.panel6.Location = new System.Drawing.Point(0, 0);
this.panel6.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel6.Name = "panel6";
this.panel6.Size = new System.Drawing.Size(408, 36);
this.panel6.TabIndex = 26;
//
// labelShortTermSummaryTableName
//
this.labelShortTermSummaryTableName.BackColor = System.Drawing.Color.White;
this.labelShortTermSummaryTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelShortTermSummaryTableName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelShortTermSummaryTableName.Location = new System.Drawing.Point(0, 0);
this.labelShortTermSummaryTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelShortTermSummaryTableName.Name = "labelShortTermSummaryTableName";
this.labelShortTermSummaryTableName.Size = new System.Drawing.Size(408, 36);
this.labelShortTermSummaryTableName.TabIndex = 23;
this.labelShortTermSummaryTableName.Text = "ShortTermSummaryTableName";
this.labelShortTermSummaryTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panelDBShortTerm2
//
this.panelDBShortTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panelDBShortTerm2.Controls.Add(this.panelDBShortTerm1);
this.panelDBShortTerm2.Dock = System.Windows.Forms.DockStyle.Top;
this.panelDBShortTerm2.Location = new System.Drawing.Point(0, 38);
this.panelDBShortTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBShortTerm2.Name = "panelDBShortTerm2";
this.panelDBShortTerm2.Size = new System.Drawing.Size(433, 38);
this.panelDBShortTerm2.TabIndex = 23;
//
// panelDBShortTerm1
//
this.panelDBShortTerm1.Controls.Add(this.labelDBShortTerm);
this.panelDBShortTerm1.Dock = System.Windows.Forms.DockStyle.Left;
this.panelDBShortTerm1.Location = new System.Drawing.Point(0, 0);
this.panelDBShortTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBShortTerm1.Name = "panelDBShortTerm1";
this.panelDBShortTerm1.Size = new System.Drawing.Size(408, 36);
this.panelDBShortTerm1.TabIndex = 26;
//
// labelDBShortTerm
//
this.labelDBShortTerm.BackColor = System.Drawing.Color.White;
this.labelDBShortTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelDBShortTerm.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelDBShortTerm.Location = new System.Drawing.Point(0, 0);
this.labelDBShortTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelDBShortTerm.Name = "labelDBShortTerm";
this.labelDBShortTerm.Size = new System.Drawing.Size(408, 36);
this.labelDBShortTerm.TabIndex = 23;
this.labelDBShortTerm.Text = "ShortTerm";
this.labelDBShortTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panelDBMain2
//
this.panelDBMain2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panelDBMain2.Controls.Add(this.panelDBMain1);
this.panelDBMain2.Dock = System.Windows.Forms.DockStyle.Top;
this.panelDBMain2.Location = new System.Drawing.Point(0, 0);
this.panelDBMain2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBMain2.Name = "panelDBMain2";
this.panelDBMain2.Size = new System.Drawing.Size(433, 38);
this.panelDBMain2.TabIndex = 22;
//
// panelDBMain1
//
this.panelDBMain1.Controls.Add(this.labelDBMain);
this.panelDBMain1.Dock = System.Windows.Forms.DockStyle.Left;
this.panelDBMain1.Location = new System.Drawing.Point(0, 0);
this.panelDBMain1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelDBMain1.Name = "panelDBMain1";
this.panelDBMain1.Size = new System.Drawing.Size(408, 36);
this.panelDBMain1.TabIndex = 25;
//
// labelDBMain
//
this.labelDBMain.BackColor = System.Drawing.Color.White;
this.labelDBMain.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.labelDBMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelDBMain.Location = new System.Drawing.Point(0, 0);
this.labelDBMain.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.labelDBMain.Name = "labelDBMain";
this.labelDBMain.Size = new System.Drawing.Size(408, 36);
this.labelDBMain.TabIndex = 22;
this.labelDBMain.Text = "Information";
this.labelDBMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// progressBarProgram
//
this.progressBarProgram.Dock = System.Windows.Forms.DockStyle.Top;
this.progressBarProgram.ForeColor = System.Drawing.SystemColors.HotTrack;
this.progressBarProgram.Location = new System.Drawing.Point(0, 0);
this.progressBarProgram.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.progressBarProgram.Name = "progressBarProgram";
this.progressBarProgram.Size = new System.Drawing.Size(1979, 60);
this.progressBarProgram.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
this.progressBarProgram.TabIndex = 20;
//
// panelSubFunc
//
this.panelSubFunc.BackColor = System.Drawing.Color.MidnightBlue;
this.panelSubFunc.Controls.Add(this.buttonDbConnect);
this.panelSubFunc.Controls.Add(this.panel3);
this.panelSubFunc.Controls.Add(this.buttonBulkInsertStart);
this.panelSubFunc.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelSubFunc.Location = new System.Drawing.Point(0, 592);
this.panelSubFunc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelSubFunc.Name = "panelSubFunc";
this.panelSubFunc.Size = new System.Drawing.Size(1979, 58);
this.panelSubFunc.TabIndex = 17;
//
// buttonDbConnect
//
this.buttonDbConnect.BackColor = System.Drawing.SystemColors.Control;
this.buttonDbConnect.Dock = System.Windows.Forms.DockStyle.Right;
this.buttonDbConnect.Location = new System.Drawing.Point(683, 0);
this.buttonDbConnect.Name = "buttonDbConnect";
this.buttonDbConnect.Size = new System.Drawing.Size(229, 58);
this.buttonDbConnect.TabIndex = 2;
this.buttonDbConnect.Text = "Database Connect Try";
this.buttonDbConnect.UseVisualStyleBackColor = false;
this.buttonDbConnect.Visible = false;
this.buttonDbConnect.Click += new System.EventHandler(this.buttonDbConnect_Click);
//
// panel3
//
this.panel3.Controls.Add(this.labelFTPTime);
this.panel3.Controls.Add(this.labelBulkTime);
this.panel3.Controls.Add(this.labelBulkCntInfo1);
this.panel3.Controls.Add(this.labelBulkCntInfo2);
this.panel3.Controls.Add(this.labelBulkCntInfo3);
this.panel3.Dock = System.Windows.Forms.DockStyle.Right;
this.panel3.Location = new System.Drawing.Point(912, 0);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(851, 58);
this.panel3.TabIndex = 1;
//
// labelFTPTime
//
this.labelFTPTime.BackColor = System.Drawing.Color.WhiteSmoke;
this.labelFTPTime.Dock = System.Windows.Forms.DockStyle.Right;
this.labelFTPTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelFTPTime.Location = new System.Drawing.Point(121, 0);
this.labelFTPTime.Name = "labelFTPTime";
this.labelFTPTime.Size = new System.Drawing.Size(146, 58);
this.labelFTPTime.TabIndex = 4;
this.labelFTPTime.Text = "-";
this.labelFTPTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.labelFTPTime.Visible = false;
//
// labelBulkTime
//
this.labelBulkTime.BackColor = System.Drawing.Color.Snow;
this.labelBulkTime.Dock = System.Windows.Forms.DockStyle.Right;
this.labelBulkTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelBulkTime.Location = new System.Drawing.Point(267, 0);
this.labelBulkTime.Name = "labelBulkTime";
this.labelBulkTime.Size = new System.Drawing.Size(146, 58);
this.labelBulkTime.TabIndex = 3;
this.labelBulkTime.Text = "-";
this.labelBulkTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelBulkCntInfo1
//
this.labelBulkCntInfo1.BackColor = System.Drawing.Color.Silver;
this.labelBulkCntInfo1.Dock = System.Windows.Forms.DockStyle.Right;
this.labelBulkCntInfo1.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelBulkCntInfo1.Location = new System.Drawing.Point(413, 0);
this.labelBulkCntInfo1.Name = "labelBulkCntInfo1";
this.labelBulkCntInfo1.Size = new System.Drawing.Size(146, 58);
this.labelBulkCntInfo1.TabIndex = 2;
this.labelBulkCntInfo1.Text = "-";
this.labelBulkCntInfo1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelBulkCntInfo2
//
this.labelBulkCntInfo2.BackColor = System.Drawing.Color.Silver;
this.labelBulkCntInfo2.Dock = System.Windows.Forms.DockStyle.Right;
this.labelBulkCntInfo2.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelBulkCntInfo2.Location = new System.Drawing.Point(559, 0);
this.labelBulkCntInfo2.Name = "labelBulkCntInfo2";
this.labelBulkCntInfo2.Size = new System.Drawing.Size(146, 58);
this.labelBulkCntInfo2.TabIndex = 1;
this.labelBulkCntInfo2.Text = "-";
this.labelBulkCntInfo2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// labelBulkCntInfo3
//
this.labelBulkCntInfo3.BackColor = System.Drawing.Color.Silver;
this.labelBulkCntInfo3.Dock = System.Windows.Forms.DockStyle.Right;
this.labelBulkCntInfo3.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelBulkCntInfo3.Location = new System.Drawing.Point(705, 0);
this.labelBulkCntInfo3.Name = "labelBulkCntInfo3";
this.labelBulkCntInfo3.Size = new System.Drawing.Size(146, 58);
this.labelBulkCntInfo3.TabIndex = 0;
this.labelBulkCntInfo3.Text = "-";
this.labelBulkCntInfo3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// buttonBulkInsertStart
//
this.buttonBulkInsertStart.BackColor = System.Drawing.SystemColors.Control;
this.buttonBulkInsertStart.Dock = System.Windows.Forms.DockStyle.Right;
this.buttonBulkInsertStart.Location = new System.Drawing.Point(1763, 0);
this.buttonBulkInsertStart.Name = "buttonBulkInsertStart";
this.buttonBulkInsertStart.Size = new System.Drawing.Size(216, 58);
this.buttonBulkInsertStart.TabIndex = 0;
this.buttonBulkInsertStart.Text = "Direct Bulk Insert Try";
this.buttonBulkInsertStart.UseVisualStyleBackColor = false;
this.buttonBulkInsertStart.Click += new System.EventHandler(this.buttonBulkInsertStart_Click);
//
// panelSub1
//
this.panelSub1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelSub1.Location = new System.Drawing.Point(0, 650);
this.panelSub1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelSub1.Name = "panelSub1";
this.panelSub1.Size = new System.Drawing.Size(1979, 94);
this.panelSub1.TabIndex = 14;
//
// panelSub2
//
this.panelSub2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelSub2.Location = new System.Drawing.Point(0, 744);
this.panelSub2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panelSub2.Name = "panelSub2";
this.panelSub2.Size = new System.Drawing.Size(1979, 140);
this.panelSub2.TabIndex = 2;
//
// panel1
//
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.pictureBox1);
this.panel1.Controls.Add(this.pictureBox3);
this.panel1.Controls.Add(this.pictureBox2);
this.panel1.Controls.Add(this.Title_label);
this.panel1.Controls.Add(this.AlisPictureBox);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(1979, 74);
this.panel1.TabIndex = 2;
//
// pictureBox1
//
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left;
this.pictureBox1.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon;
this.pictureBox1.Location = new System.Drawing.Point(353, 0);
this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(60, 72);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 5;
this.pictureBox1.TabStop = false;
//
// pictureBox3
//
this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Left;
this.pictureBox3.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.ALIS;
this.pictureBox3.Location = new System.Drawing.Point(220, 0);
this.pictureBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.pictureBox3.Name = "pictureBox3";
this.pictureBox3.Size = new System.Drawing.Size(133, 72);
this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox3.TabIndex = 4;
this.pictureBox3.TabStop = false;
//
// pictureBox2
//
this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Right;
this.pictureBox2.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.CI;
this.pictureBox2.Location = new System.Drawing.Point(1770, 0);
this.pictureBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.pictureBox2.Name = "pictureBox2";
this.pictureBox2.Size = new System.Drawing.Size(207, 72);
this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox2.TabIndex = 3;
this.pictureBox2.TabStop = false;
//
// Title_label
//
this.Title_label.BackColor = System.Drawing.Color.White;
this.Title_label.Dock = System.Windows.Forms.DockStyle.Fill;
this.Title_label.Font = new System.Drawing.Font("Times New Roman", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Title_label.Location = new System.Drawing.Point(220, 0);
this.Title_label.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.Title_label.Name = "Title_label";
this.Title_label.Size = new System.Drawing.Size(1757, 72);
this.Title_label.TabIndex = 2;
this.Title_label.Text = "CP ALIS";
this.Title_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.Title_label.DoubleClick += new System.EventHandler(this.label1_DoubleClick);
//
// AlisPictureBox
//
this.AlisPictureBox.Dock = System.Windows.Forms.DockStyle.Left;
this.AlisPictureBox.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.Kefico_CI;
this.AlisPictureBox.Location = new System.Drawing.Point(0, 0);
this.AlisPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.AlisPictureBox.Name = "AlisPictureBox";
this.AlisPictureBox.Size = new System.Drawing.Size(220, 72);
this.AlisPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.AlisPictureBox.TabIndex = 1;
this.AlisPictureBox.TabStop = false;
//
// fluentDesignFormControl1
//
this.fluentDesignFormControl1.FluentDesignForm = this;
this.fluentDesignFormControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
this.barCheckItemShowCpLogTime});
this.fluentDesignFormControl1.Location = new System.Drawing.Point(0, 0);
this.fluentDesignFormControl1.Name = "fluentDesignFormControl1";
this.fluentDesignFormControl1.Size = new System.Drawing.Size(1979, 46);
this.fluentDesignFormControl1.TabIndex = 2;
this.fluentDesignFormControl1.TabStop = false;
this.fluentDesignFormControl1.TitleItemLinks.Add(this.barCheckItemShowCpLogTime);
//
// barCheckItemShowCpLogTime
//
this.barCheckItemShowCpLogTime.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
this.barCheckItemShowCpLogTime.Id = 0;
this.barCheckItemShowCpLogTime.Name = "barCheckItemShowCpLogTime";
this.barCheckItemShowCpLogTime.CheckedChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.barCheckItemShowCpLogTime_CheckedChanged);
//
// Chktimer
//
this.Chktimer.Interval = 1000;
this.Chktimer.Tick += new System.EventHandler(this.Chktimer_Tick);
//
// UItimer
//
this.UItimer.Interval = 500;
this.UItimer.Tick += new System.EventHandler(this.UItimer_Tick);
//
// notifyIcon
//
this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
this.notifyIcon.BalloonTipText = "v20230510 Middleware Log Process";
this.notifyIcon.BalloonTipTitle = "For [ALIS] Middleware Program.";
this.notifyIcon.ContextMenuStrip = this.contextMenuSubStrip;
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
this.notifyIcon.Text = "Middleware Log";
this.notifyIcon.Visible = true;
this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick);
//
// contextMenuSubStrip
//
this.contextMenuSubStrip.Font = new System.Drawing.Font("Times New Roman", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.contextMenuSubStrip.ImageScalingSize = new System.Drawing.Size(24, 24);
this.contextMenuSubStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripSeparator1,
this.toolStripMenuItemExit});
this.contextMenuSubStrip.Name = "contextMenuSubStrip";
this.contextMenuSubStrip.Size = new System.Drawing.Size(207, 42);
this.contextMenuSubStrip.Text = "Menu";
this.contextMenuSubStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuSubStrip_ItemClicked);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(203, 6);
//
// toolStripMenuItemExit
//
this.toolStripMenuItemExit.BackColor = System.Drawing.Color.Khaki;
this.toolStripMenuItemExit.Name = "toolStripMenuItemExit";
this.toolStripMenuItemExit.Size = new System.Drawing.Size(206, 32);
this.toolStripMenuItemExit.Text = "Program Exit";
//
// toolStripComboBox1
//
this.toolStripComboBox1.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0);
this.toolStripComboBox1.Name = "toolStripComboBox1";
this.toolStripComboBox1.Size = new System.Drawing.Size(121, 23);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1979, 1004);
this.ControlContainer = this.fluentDesignFormContainer1;
this.Controls.Add(this.fluentDesignFormContainer1);
this.Controls.Add(this.fluentDesignFormControl1);
this.FluentDesignFormControl = this.fluentDesignFormControl1;
this.IconOptions.Icon = ((System.Drawing.Icon)(resources.GetObject("MainForm.IconOptions.Icon")));
this.IconOptions.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon1;
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "SystemX.Net.Middleware.UI - Log CPX v240529";
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);
this.fluentDesignFormContainer1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panelMain.ResumeLayout(false);
this.panelProcess.ResumeLayout(false);
this.panelRecv.ResumeLayout(false);
this.paneldDBConn.ResumeLayout(false);
this.panelDBPath.ResumeLayout(false);
this.panelFTP.ResumeLayout(false);
this.panel4.ResumeLayout(false);
this.panelDBLongTerm2.ResumeLayout(false);
this.panelDBLongTerm1.ResumeLayout(false);
this.panel7.ResumeLayout(false);
this.panel8.ResumeLayout(false);
this.panel5.ResumeLayout(false);
this.panel6.ResumeLayout(false);
this.panelDBShortTerm2.ResumeLayout(false);
this.panelDBShortTerm1.ResumeLayout(false);
this.panelDBMain2.ResumeLayout(false);
this.panelDBMain1.ResumeLayout(false);
this.panelSubFunc.ResumeLayout(false);
this.panel3.ResumeLayout(false);
this.panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).EndInit();
this.contextMenuSubStrip.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer fluentDesignFormContainer1;
private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl fluentDesignFormControl1;
private System.Windows.Forms.PictureBox AlisPictureBox;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label Title_label;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Timer Chktimer;
private System.Windows.Forms.Timer UItimer;
private System.Windows.Forms.Panel panelSub2;
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.PictureBox pictureBox2;
private System.Windows.Forms.PictureBox pictureBox3;
private System.Windows.Forms.ContextMenuStrip contextMenuSubStrip;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExit;
private System.Windows.Forms.ToolStripComboBox toolStripComboBox1;
private System.Windows.Forms.Panel panelSub1;
private System.Windows.Forms.Panel panelSubFunc;
private BarCheckItem barCheckItemShowCpLogTime;
private System.Windows.Forms.Panel panelMain;
private System.Windows.Forms.ProgressBar progressBarProgram;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Panel paneldDBConn;
private System.Windows.Forms.Panel panelDBShortTerm2;
private System.Windows.Forms.Panel panelDBShortTerm1;
private System.Windows.Forms.Label labelDBShortTerm;
private System.Windows.Forms.Panel panelDBMain2;
private System.Windows.Forms.Panel panelDBMain1;
private System.Windows.Forms.Label labelDBMain;
private System.Windows.Forms.Panel panelProcess;
private System.Windows.Forms.RichTextBox richTextBoxProcess;
private System.Windows.Forms.Panel panelRecv;
private System.Windows.Forms.RichTextBox richTextBoxRecv;
private System.Windows.Forms.Button buttonBulkInsertStart;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label labelBulkCntInfo1;
private System.Windows.Forms.Label labelBulkCntInfo2;
private System.Windows.Forms.Label labelBulkCntInfo3;
private System.Windows.Forms.Label labelBulkTime;
private System.Windows.Forms.Panel panelDBPath;
private System.Windows.Forms.Label labelDBPath;
private System.Windows.Forms.Panel panelFTP;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Label labelFTP;
private System.Windows.Forms.Panel panelDBLongTerm2;
private System.Windows.Forms.Panel panelDBLongTerm1;
private System.Windows.Forms.Label labelDBLongTerm;
private System.Windows.Forms.Panel panel7;
private System.Windows.Forms.Panel panel8;
private System.Windows.Forms.Label labelShortTermLogTableName;
private System.Windows.Forms.Panel panel5;
private System.Windows.Forms.Panel panel6;
private System.Windows.Forms.Label labelShortTermSummaryTableName;
private System.Windows.Forms.Button buttonDbConnect;
private System.Windows.Forms.Label labelFTPTime;
}
}

View File

@ -0,0 +1,604 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Data.SqlTypes;
using DevExpress.Utils.DPI;
using DevExpress.Utils.Helpers;
using DevExpress.Data;
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using SystemX.Net.Platform.Common.Util;
using SystemX.Net.Platform.Common.ExtensionMethods;
//using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
using SystemX.Net.Middleware.Log.Commons;
using SystemX.Net.Platform.SystemX.Common;
using System.Collections.Concurrent;
using SystemX.Net.Comm.IIS_FTP;
using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
using SystemX.Net.Platform.SystemX.Net.XEFCore;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
internal class ConnectInfoStore : ICloneable
{
/// <summary>
/// Last Query Info
/// </summary>
public int nLastQueryTLStepVersion;
public int nLastQueryTLFileNumber;
public int nLastQueryTLVariantNumber;
public bool bQueryVRFYLoaded;
public DataSet getLatestStepVer;
public DataSet geyLatestTestListInfo;
public DataSet dsLatestVRFYRel;
public DataSet dsLongTermLatestVRFYRel;
public object Clone()
{
return this;
}
public void Initialize()
{
nLastQueryTLStepVersion = int.MinValue;
nLastQueryTLFileNumber = int.MinValue;
nLastQueryTLVariantNumber = int.MinValue;
bQueryVRFYLoaded = false;
getLatestStepVer = null;
geyLatestTestListInfo = null;
dsLatestVRFYRel = null;
dsLongTermLatestVRFYRel = null;
}
public void InitVRFYStatus()
{
nLastQueryTLStepVersion = int.MinValue;
nLastQueryTLFileNumber = int.MinValue;
nLastQueryTLVariantNumber = int.MinValue;
bQueryVRFYLoaded = false;
getLatestStepVer = null;
geyLatestTestListInfo = null;
dsLatestVRFYRel = null;
dsLongTermLatestVRFYRel = null;
}
public ConnectInfoStore()
{
nLastQueryTLStepVersion = int.MinValue;
nLastQueryTLFileNumber = int.MinValue;
nLastQueryTLVariantNumber = int.MinValue;
bQueryVRFYLoaded = false;
getLatestStepVer = null;
geyLatestTestListInfo = null;
dsLatestVRFYRel = null;
dsLongTermLatestVRFYRel = null;
}
}
private const int SC_CLOSE = 0xF060;
private const int MF_ENABLED = 0x0;
private const int MF_GRAYED = 0x1;
private const int MF_DISABLED = 0x2;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);
private const int MF_BYCOMMAND = 0x00000000;
[DllImport("user32.dll")]
public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
[DllImport("kernel32.dll", ExactSpelling = true)]
private static extern IntPtr GetConsoleWindow();
/// <summary>
/// Base Variable
/// </summary>
private const int ALL_MANAGE_NUM = 110;
private const int PORT_DISTRIBUTION_NUM = 10;
private COMMON.LogProcessInfo LoadInfo;
private bool MiddlewareLogStartState { set; get; }
private bool bShowCpLogProcessTime { set; get; } = false;
//RecvCommandQueue Task
private Stopwatch stCheckReleaseTime;
private Task taskRecvCommandProcess;
private bool m_bTaskCommandBlock;
//RecvStreamQueue Task
private Task taskRecvStreamProcess;
private bool m_bTaskStreamBlock;
//
CancellationTokenSource CTS;
CancellationToken CT;
//
private static bool bTaskCommandWaitLock = false;
private static bool bTaskStreamWaitLock = false;
//
//DataBase
private XLogDBConnManager MngDBLogConn;
private ConnectInfoStore[] thisConnInfo;
public ConcurrentQueue<LogMappedPacket>[] LogDataQueue;
public ConcurrentQueue<StringBuilder> LogDataRecvText;
public ConcurrentQueue<StringBuilder> LogDataProcessText;
private MapLogOption OptionMapLog;
private CMapParameter ParamterMapLog;
private CMapParameter ParamterMapInfoLog;
Int64 nEnqueueCount;
Int64 nDequeueCount;
private static object objMappedLogDataInOutLock = new object();
private static object objMappedLogTextInOutLock = new object();
private static object objMappedProcessTextInOutLock = new object();
private bool[] bBeforeLogReadyState;
private bool[] bCompareLogReadyState;
// TODO : for Bulk Insert Log
private Stopwatch stCheckTermBulkWaitTime;
private List<string> lstBulkTermLogInfo;
private List<DataRow> lstBulkShortTermLog;
private List<DataRow> lstBulkLongTermLog;
private bool bTryBulkInsertBuffer { set; get; } = false;
private int nBulkLogCount { set; get; } = 0;
private int nBulkShortTermCount { set; get; } = 0;
private int nBulkLongTermCount { set; get; } = 0;
private long nBulkTimeValue { set; get; } = 0;
private long nFTPTimeValue { set; get; } = 0;
private bool bDatabaseConnResult { set; get; } = false;
public object GetConnectInfo(int iPos)
{
return thisConnInfo[iPos];
}
public XLogDBConnManager GetDBConn()
{
return MngDBLogConn;
}
/// <summary>
/// TimerLock
/// </summary>
private enum TIMER_LOCK
{
CHK_TIMER = 0,
UI_TIMER = 1,
}
private bool[] m_bTimerLock;
//
private static object objMainCommandWait = new object();
private static object objShortTermCommandWait = new object();
private static object objLongTermCommandWait = new object();
private static object objMainStreamWait = new object();
private static object objShortTermStreamWait = new object();
private static object objLongTermStreamWait = new object();
private static object objExcuteMainCommandWait = new object();
private static object objExcuteShortTermCommandWait = new object();
private static object objExcuteLongTermCommandWait = new object();
private static object objExcuteMainStreamWait = new object();
private static object objExcuteShortTermStreamWait = new object();
private static object objExcuteLongTermStreamWait = new object();
//
//private static object objSingleTransactionDataAccessWait = new object();
private static object objClearServerInstanceWait = new object();
// TODO : FTP ALIS
public eFTPServiceStatus StateFTP { set; get; } = eFTPServiceStatus.None;
private CtrlFTP ControlFTP;
private Stopwatch stProcessCheckFTPTime;
// TODO : SHM JSON
//private XEFCore<CPXV2ShortTermLogJson> CpxShorTermLogJson;
public MainForm()//(XEFCore<CPXV2ShortTermLogJson> cpxShorTermLogJson)
{
//CpxShorTermLogJson = cpxShorTermLogJson;
InitializeComponent();
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"Use CP-Server[X] Middleware [LOG] Version for [CPXV2][v240529] " +
"[SystemX.Net.Middleware.Log : MainForm]", ConsoleColor.Green, LogMessageLevel.FATAL);
//
EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED);
IntPtr hMenu = GetSystemMenu(GetConsoleWindow(), false);
//EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
ConsoleUtil.ConsoleHide();
MessageOutput.PrintLogLevel = LogMessageLevel.INFO;
nEnqueueCount = 0;
nDequeueCount = 0;
bBeforeLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize];
bCompareLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize];
CTS = new CancellationTokenSource();
CT = CTS.Token;
//
string strExcutePos = Environment.CurrentDirectory;
string strServerInfoPos = strExcutePos + @"\Configure\LogInformation.xml";
string strDBInfoPos = strExcutePos + @"\Configure\DBConnInfo.xml";
string strMapLogOptionPos = strExcutePos + @"\Configure\MapLogOption.xml";
LoadInfo = new COMMON.LogProcessInfo(strServerInfoPos);
MiddlewareLogStartState = true;
OptionMapLog = new MapLogOption(strMapLogOptionPos);
if (OptionMapLog.Load() == false)
{
MiddlewareLogStartState = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load map-log option information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
return;
}
else
{
ParamterMapLog = new CMapParameter();
ParamterMapInfoLog = new CMapParameter();
ParamterMapLog.strSetEnterMutexName = OptionMapLog.strMapLogEnterMutexName;
ParamterMapLog.strSetAccessMutexName = OptionMapLog.strMapLogAccessMutexName;
ParamterMapLog.strSetPath = OptionMapLog.strMapLogPath;
ParamterMapLog.strSetFileName = OptionMapLog.strMapLogFileName;
ParamterMapLog.strSetMapName = OptionMapLog.strMapLogName;
ParamterMapInfoLog.strSetEnterMutexName = OptionMapLog.strMapInfoLogEnterMutexName;
ParamterMapInfoLog.strSetAccessMutexName = OptionMapLog.strMapInfoLogAccessMutexName;
ParamterMapInfoLog.strSetPath = OptionMapLog.strMapInfoLogPath;
ParamterMapInfoLog.strSetFileName = OptionMapLog.strMapInfoLogFileName;
ParamterMapInfoLog.strSetMapName = OptionMapLog.strMapInfoLogName;
}
if (LoadInfo.Load() == false)
{
MiddlewareLogStartState = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load server information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
return;
}
else
{
string strGetTitle = this.Text;
//this.Text = strGetTitle + " " + (LoadInfo.LOOP_BACK ? " [LocalHost]" : " [" + LoadInfo.SERVER_IP + "]");
Title_label.Text = "CP ALIS" + ((LoadInfo.TITLE.Length > 0) ? " [" + LoadInfo.TITLE + "]" : "");
}
thisConnInfo = new ConnectInfoStore[ALL_MANAGE_NUM];
LogDataQueue = new ConcurrentQueue<LogMappedPacket>[ALL_MANAGE_NUM];
LogDataRecvText = new ConcurrentQueue<StringBuilder>();
LogDataProcessText = new ConcurrentQueue<StringBuilder>();
for (int i = 0; i < ALL_MANAGE_NUM; i++)
{
thisConnInfo[i] = new ConnectInfoStore();
LogDataQueue[i] = new ConcurrentQueue<LogMappedPacket>();
}
MngDBLogConn = new XLogDBConnManager();
MngDBLogConn.SetConfigFilePath(strDBInfoPos, true);
string strGetFileName = Path.GetFileName(MngDBLogConn.GetConfigFilePath());
string strGetFilePath = Path.GetDirectoryName(MngDBLogConn.GetConfigFilePath()).Split('\\').Last();
labelDBPath.Text = @"\" + strGetFilePath + @"\" + strGetFileName;
bDatabaseConnResult = MngDBLogConn.OpenConnection();
if (bDatabaseConnResult)
{
labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]";
labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]";
labelShortTermSummaryTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]";
labelShortTermLogTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]";
labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]";
panelDBMain2.BackColor = Color.LimeGreen;
panelDBShortTerm2.BackColor = Color.LimeGreen;
panelDBLongTerm2.BackColor = Color.LimeGreen;
//옵션 확인 및 ON
//DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;
string strGetQuery1 = "DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;";
string strGetQuery2 = "DECLARE @ARITHIGNORE VARCHAR(3) = 'OFF'; IF ( (128 & @@OPTIONS) = 128 ) SET @ARITHIGNORE = 'ON'; SELECT @ARITHIGNORE AS ARITHIGNORE;";
/*
SET ARITHIGNORE ON
- 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어
  오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를
  발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다!
SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료
  트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에
  발생한 오류에는 영향을 주지 않는다.
*/
DataSet ds1 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery1);
DataSet ds2 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery2);
if (XCommons.isHasRow(ds1))
{
bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHABORT ON");
}
if (XCommons.isHasRow(ds2))
{
bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHIGNORE ON");
}
//
ds1 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery1);
ds2 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery2);
if (XCommons.isHasRow(ds1))
{
bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHABORT ON");
}
if (XCommons.isHasRow(ds2))
{
bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHIGNORE ON");
}
//
ds1 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery1);
ds2 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery2);
if (XCommons.isHasRow(ds1))
{
bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHABORT ON");
}
if (XCommons.isHasRow(ds2))
{
bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
if (bOptionState == false)
MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHIGNORE ON");
}
if (MiddlewareLogStartState == false)
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"The table registered in the configuration file does not exist in the actual database. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
else
{
panelDBMain2.BackColor = Color.Red;
panelDBShortTerm2.BackColor = Color.Red;
panelDBLongTerm2.BackColor = Color.Red;
MiddlewareLogStartState = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to connect to DB and to get table information. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
return;
}
m_bTimerLock = new bool[10];
Array.Clear(m_bTimerLock, 0, 10);
if (LoadInfo.FTP_Use)
{
panelFTP.Visible = true;
labelFTP.Text = "FTP " + IPAddress.Parse(LoadInfo.FTP_IPAddress).ToString() + "@" + LoadInfo.FTP_Port + "@" + LoadInfo.FTP_Account;
labelFTPTime.Visible = true;
StateFTP = StartFTPService();
if (StateFTP == eFTPServiceStatus.Connected)
{
stProcessCheckFTPTime = new Stopwatch();
stProcessCheckFTPTime.Start();
panelFTP.BackColor = Color.LimeGreen;
}
else
{
if (MessageBox.Show("FTP server connection is not confirmed. Do you still want to proceed with running the middleware log handler?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
MiddlewareLogStartState = false;
panelFTP.BackColor = Color.Red;
}
}
else
StateFTP = eFTPServiceStatus.Unused;
if (MiddlewareLogStartState)
{
stCheckTermBulkWaitTime = new Stopwatch();
lstBulkTermLogInfo = new List<string>();
lstBulkShortTermLog = new List<DataRow>();
lstBulkLongTermLog = new List<DataRow>();
stCheckReleaseTime = new Stopwatch();
stCheckReleaseTime.Start();
taskRecvCommandProcess = null;
m_bTaskCommandBlock = false;
taskRecvCommandProcess = new Task(new Action(WatchRecvCommandQueue), CT);
taskRecvCommandProcess.Start();
//
taskRecvStreamProcess = null;
m_bTaskStreamBlock = false;
taskRecvStreamProcess = new Task(new Action(WatchRecvStreamQueue), CT);
taskRecvStreamProcess.Start();
//
UItimer.Enabled = true;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"MiddlewareUI start success. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.White, LogMessageLevel.INFO);
}
Chktimer.Enabled = true;
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MiddlewareLogStartState == true)
{
if (MessageBox.Show("You want to program exit?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
e.Cancel = true;
else
e.Cancel = false;
}
else
e.Cancel = false;
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
CTS.Cancel();
if (taskRecvCommandProcess != null)
{
m_bTaskCommandBlock = true;
taskRecvCommandProcess.Wait();
taskRecvCommandProcess.ContinueWith(t => {
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"taskRecvCommandProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]",
ConsoleColor.White,
LogMessageLevel.DEBUG);
});
}
if (taskRecvStreamProcess != null)
{
m_bTaskStreamBlock = true;
taskRecvStreamProcess.Wait();
taskRecvStreamProcess.ContinueWith(t => {
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"taskRecvStreamProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]",
ConsoleColor.White,
LogMessageLevel.DEBUG);
});
}
}
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.Visible)
this.Visible = false;
else
this.Visible = true;
}
private void label1_DoubleClick(object sender, EventArgs e)
{
ConsoleUtil.ConsoleVisibleControl();
}
private void contextMenuSubStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ToolStripItem tsi = e.ClickedItem;
this.Close();
}
private void barCheckItemShowCpLogTime_CheckedChanged(object sender, ItemClickEventArgs e)
{
bShowCpLogProcessTime = barCheckItemShowCpLogTime.Checked;
}
private void buttonBulkInsertStart_Click(object sender, EventArgs e)
{
if (bTryBulkInsertBuffer == false)
bTryBulkInsertBuffer = true;
}
private void buttonDbConnect_Click(object sender, EventArgs e)
{
bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection();
}
}
}

View File

@ -0,0 +1,973 @@
<?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="MainForm.IconOptions.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAAQUMAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAA
AAQAAAAEAAAABAAAAAQAAAACAAAAAQAAABIAAAAmAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAA
AC0AAAAtAAAALQAAAC0AAAAqAAAAGwAAAAfQz8+MsK+uo6urq6urq6urrKysq6ysrKusrKyrrKysq6ys
rKusrKyrrKysq6usrKusrKysoKCgoC4uLk0AAAAS+vj4/76onf/p4t7//Pr6//Pv7v/28/H/9fLw//Pu
7P/z7+3/8+7s//Lu7P/39PP//////+/v7+9NTU1mAAAAF//////BrKL/tp6S/9bIwv+RbVv/rpOG/5t6
av+ggXL/nXxs/6GBcv+lhnj/o4V2/9fJw//w8PDvTExMZwAAABf/////7+rn/5x7bP/bz8n/m3lp/8i2
rf+beWn/6eLf/6qOgP/Vx8H/4dfT/6qOgP+vlIb/7/Dw701NTWcAAAAX//////////+8pZv/jmhW/6uP
gf/o4d3/nXxs//Tx7/+1nZH/x7Wr/5t5af+0m4//6ODc//Dw8O9MTExnAAAAF///////////6+Th/4lh
Tv/Zzcb/7ujl/6KCc//18vH/uLTg/8m/yv+cemn/uKGW/7ylmv/Uy8buUlNUYwAAABX///////////38
/P/e087/+fj3//v5+P/o4Nz//Pz8/+Hg9v/z8vr/5dzX/9HCuv/Sw7z/493Z6WxtbkoAAAAN////Y///
/2P///9j////Y////2P///9j////Y////2P///9j////Y////2P///9j////ZPr6+lmbm5sUAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD//wAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
AAQAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA
AAYAAAAGAAAABgAAAAYAAAAFAAAABAAAAAIAAAAAAAAACwAAABYAAAAeAAAAIQAAACEAAAAhAAAAIQAA
ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAeAAAAFgAA
AAoAAAADDg4OHwcHBzsFBgZQBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUF
BVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVQAQEBOgAAABsAAAAH6+vrstnZ2cDPz8/KzMzMzcvL
y83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzczM
zM6/v7+/NDQ0ZAAAACkAAAAL/////+Tb1v+4n5P/8u3r////////////////////////////////////
///////////////////////////////////////////////////v7+/vRkZGdQAAAC8AAAAN/////+zm
4/+EW0f/wKug///////g1dD/xrOq/8i1rP/azcj/0MC4/8azqv/Gs6r/xrOq/8ezq//Gs6r/xrOq/8az
qv/Zzcb/+ff2///////u7u7vREREdwAAADAAAAAO//////////+5oZb/imNQ/+/q5/+2npL/gVdD/3BB
Kv+8ppv/gFZB/4NZRv+Qa1r/i2VS/4piUP+Qaln/kGpa/5BrWf+DWkb/spiL//38/P/v7+/vREREdwAA
ADAAAAAO///////////r5OH/glhF/8Swp//6+fj/poh6/5FsW//j2tX/gVVB/8y6sv/8+vr/u6Sa/6WI
ef/28/H/+fj3//by8f+3n5P/g1lF//Pv7P/v8PDvREREdwAAADAAAAAO////////////////r5WI/49p
V//c0Mr/gVdD/8u6sv/u6Ob/gFVB/9DAuf//////rZOG/5FuXP/08O//vqid/5ZzY/9/Uz//pYd4//z7
+v/v7+/vREREdwAAADAAAAAO////////////////5NvX/39UP/+EW0b/jWZU//Xx8P/t5+T/gFVB/9DA
uf//////wayg/62Rgf/SxLz/e1A6/7Sajv/Sw7v/9fHw///////u7u7vREREdwAAADAAAAAO////////
/////////v39/6uOgf9nNRz/wq2k///////s5uP/f1M//9C/uP//////y8jm/7+64v/UxsD/f1VA/8e0
q//XysP/1Ma//9rNx//o5uXuRkZGdQAAAC4AAAAN/////////////////////93SzP+Vc2H/8Ovo////
///y7ev/o4R1/93SzP//////s7Hm/5mX3v/18vL/tZyQ/41nVP+LZFL/imRR/5p4Z//f2dbsT1BRaQAA
ACgAAAAL//////////////////////r5+P/q5OD//v7+///////+/v7/+/n4//39/P//////+/v+//r6
/f///////v39//bz8f/08O7/9PDu//bz8f/19PToampqTQAAABgAAAAH////jv///47///+O////jv//
/47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv//
/4/7+/t+lpaWHgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8AKAAAACAA
AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAFAAAABwAAAAcAAAAHAAAABwAA
AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA
AAcAAAAHAAAABwAAAAcAAAAHAAAABgAAAAUAAAADAAAAAQAAAAAAAAAIAAAADwAAABUAAAAZAAAAGwAA
ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAA
ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABoAAAAYAAAAEwAAAAwAAAAFAAAAAgAAABIAAAAiAAAAMwAA
ADwAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA
AD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPgAAADoAAAAvAAAAHQAAAA0AAAAEZmZmLkND
Q0cxMTFgKysrbikpKXIpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykp
KXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMqKipxJycnaQgICE8AAAAwAAAAFQAA
AAf39/fU8PDw2urr6+Dn6Ojk5eXl5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk
5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5ebm5ubX19fVOzs7cAAA
AD0AAAAbAAAACf/////8+vr/zr61/8e0qv/39PP/////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////+/v
7+5DQ0N8AAAAQwAAAB4AAAAK//////7+/v+0m4//bz8n/86+tv////////////v6+f/49fT/+PX0//j1
9P/6+Pf/+ff2//j29P/49vT/+Pb0//j19P/49fT/+Pb0//j29P/49fT/+PX0//j29f/+/f3/////////
////////7u7u7kFBQX4AAABEAAAAHgAAAAr//////////+ff3P99UT3/lHFf//f08//59/b/rpOF/45o
Vv+Ra1r/lHBf/8e0q/+ihHT/j2tY/49pWP+PaVf/j2lY/5BqWP+Qaln/kGlY/49pWP+PaVj/kWxa/7KX
iv/o4N3////////////u7u7vQUFBfgAAAEQAAAAeAAAACv///////////v7+/7KYjf9wQCn/08S9//Ht
6/+jhXb/jGZU/2k3H/+AV0L/18rD/3xQO/90RjD/k29f/5RwYP+SbVz/jWhV/5JtXP+UcWD/lHBg/5Vw
YP+SbVz/dUcw/49pV//v6uf//////+7u7u9BQUF+AAAARAAAAB4AAAAK////////////////5dzY/3lN
OP+YdmX/+PX0//38+//EsKf/bTwl/7efk//s5uP/e086/5p3Z//49vT//Pv7/9HCu/+Palj/1Ma///z7
+//7+vr//fz8//z7+v+zmY3/bTwk/9TGvv//////7u7u70FBQX4AAABEAAAAHgAAAAr/////////////
///9/Pz/qIt9/3FBKv/ZzMb/9vPx/49qWP9/VED/6uPg/+3o5f97Tjr/nHlq//z7+///////xbOq/2o5
If/KubD///////Hs6v/Yy8X/vqmf/41mVP91Ri//4NXQ///////u7u7vQUFBfgAAAEQAAAAeAAAACv//
///////////////////e087/dEUv/55+bv/Jt67/bz8o/7WckP//////7Obj/3tPOv+beWr//Pv7////
///Fs6n/ajkg/8q6sf/s5uP/kW1b/3FBKv9xQSr/fFA7/7efk//6+fj//////+7u7u9BQUF+AAAARAAA
AB4AAAAK//////////////////////r5+P+ff3D/bz8n/3tPN/95TDb/49rV///////s5uP/e086/5t5
av/8+/v//////9TGvv+Ra1X/2c3F/8e2rf9tPCT/sJWI/9zQyv/r5OH//fz8////////////7u7u70FB
QX4AAABEAAAAHgAAAAr//////////////////////////9nMxv9zRC7/ZDEY/6mMfv/9/Pv//////+zm
4/97Tzr/m3lq//z7+///////6ujz/8C63v/y8fn/yLWs/29AKP/Esaf/8Ovp/+/q5//u6OX/7ejk//Tx
7//u7u7uQkJCfAAAAEMAAAAeAAAACv//////////////////////////+vj3/5p5aP91SDL/4NbR////
////////7ebk/31RPP+ce2v//Pv7//////+6uOj/QTzA/8bE7f/s5N//jGZT/3JELf98UT3/fVI9/31S
Pf98UDr/qY19/+zr6u1GRkZ2AAAAPwAAABwAAAAJ////////////////////////////////zb20/6+V
h//8+/r////////////49fT/zLuz/9jMxf/+/v3//////+bm9/+tq+T/6ur4///////r5eL/wq6k/7GY
iv+xl4v/sZiL/7CWif/NvbT/8PDv61FRUWYAAAAzAAAAFwAAAAf/////////////////////////////
///6+Pf/9vPx////////////////////////////////////////////////////////////////////
///////////////////////////////////39/fnbGxsTQAAAB8AAAAOAAAABf///7b///+2////tv//
/7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv//
/7b///+2////tv///7b///+2////tv///7b///+2////t/v7+6KUlJQoAAAACwAAAAYAAAAC////Bv//
/wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv//
/wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G/v7+BdPT0wEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
////////////////////////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////////////////////////ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA
AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAABAAA
AAUAAAAHAAAACAAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA
AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA
AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAgAAAAHAAAABQAAAAQAAAACAAAAAQAA
AAAAAAAFAAAACQAAAA0AAAARAAAAEwAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA
ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA
ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABMAAAARAAAADQAA
AAkAAAAFAAAAAwAAAAEAAAAKAAAAEQAAABoAAAAhAAAAJgAAACkAAAAqAAAAKwAAACsAAAArAAAAKwAA
ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAA
ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAAqAAAAKQAA
ACYAAAAhAAAAGgAAABEAAAAKAAAABQAAAAIAAAARAAAAHAAAACsAAAA3AAAAPwAAAEQAAABGAAAARwAA
AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA
AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA
AEcAAABGAAAARAAAAD8AAAA3AAAAKwAAAB0AAAAQAAAACAAAAAMAAAAVAAAAJQAAADkAAABLAAAAVwAA
AF4AAABhAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA
AGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA
AGIAAABiAAAAYgAAAGIAAABhAAAAXgAAAFgAAABNAAAAPAAAACkAAAAXAAAACwAAAATW1tZswMDAeaur
q4ibm5uVkpKSn42OjqSMjIymi4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL
i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL
i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eMjIymjo6OpIWFhZgfHx9mAAAASgAAADIAAAAdAAAADQAA
AAb+/v78/v7+/P7+/vz+///9/////f7+//39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/v7+/u3t7etFRUV9AAAAUwAA
ADkAAAAgAAAADwAAAAb///////////z7+//j2tX/2MvE/+Xc2P/9/Pz/////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////+7u
7u1DQ0OCAAAAWAAAADwAAAAiAAAAEAAAAAf///////////v6+v+1nJD/dUcw/4ZeSf/f1M//////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf////////////////bz8n/eEo1/2Y0
G/+zmYz//fz8//////////////7+//v5+f/6+Pf/+vj3//r49//6+Pf/+vj3//z7+//7+fn/+vj3//r4
9//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf//Pv7////
/////////////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////
///59/b/pod5/2czG/+BVkL/5NvW////////////7ejl/6uPgf+efW7/n35w/59+cP+efW//p4p9/9jL
xf+wl4n/nn9u/5+AcP+ff2//nn5v/59+b/+ffm//n35v/59+b/+ff3D/oH9w/6B/cP+ffnD/n35w/59+
cP+efm7/r5SH/9fJw//28/H//////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA
AAf/////////////////////2s7I/3hLNv9oNh3/s5mM//38+///////wa6j/2s6Iv9lMRn/ZTMa/2Yz
G/9lMhn/lHFf/9zRy/+AVkH/ZTEY/2YyGv9lMhr/ZTEZ/2UxGf9lMhr/ZjIa/2YyGv9mMhr/ZjIa/2Uy
Gv9lMhr/ZjEa/2YxGv9lMhn/aDUc/3RFL/+ninz/8Ozp/////////////////+3t7e5BQUGFAAAAWgAA
AD4AAAAjAAAAEQAAAAf/////////////////////+ff2/6WHef9mMxv/hFtI/+nh3v/+/v7/zLyz/6aJ
ev+ninz/hl5L/2c0G/9uPyf/yLat/+vl4v+BVkL/ZjIa/4ZeSv+niXz/p4l8/6eKe/+miXv/o4R1/6KD
dP+khnn/p4p8/6eKfP+ninz/p4l8/6eKfP+ninz/lXFg/207JP9qOSD/tp6R//38+////////////+3t
7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf//////////////////////////9fJxP90RjD/aTcf/7ig
lf/+/f3//v79//7+/f/r5eL/jmZV/2UxGP+Qa1n/8Ozq/+zl4v+BVkL/ZjIZ/7CVif/8/Pv//f38//79
/f/u6OX/qY1//5t7av/Ov7f//f39//39/P/9/fz//fz8//39/P/+/v3/8ezq/5l2Zv9kMRf/jmhV//Lu
7P///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////bz
8v+ce2z/ZTAY/4ZcSf/r5eH////////////Fsaj/bTwk/209Jv/Fsqn//////+vk4f+AVUL/ZjEZ/7GW
iv/+/v7////////////m39v/e1A7/2UzGv+2n5P////////////////////////////8+/v/9PDu/59+
bv9kMBf/imRQ//Ht6v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////
///////////////////Mu7P/cUAo/2w6Iv/DrqX//////+/q5/+Palj/ZTIZ/49qWP/v6uj//////+vk
4f+AVkL/ZjIa/7GWiv/+/v7////////////m39v/fFE7/2Y1G/+2n5T////////////28/H/28/J/8e1
rP+qjoH/lXJh/3NDLf9mMxr/qo1///v6+v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA
AAf////////////////////////////////z7+3/lHFf/2UwF/+MZVL/7Obk/86+t/9vPyj/bz4m/8Wy
qP///////////+vk4f+AVkL/ZjIa/7GWi//+/v7////////////m39v/fFE7/2Y1G/+2oJT///////Lu
7P+qjX7/dkkx/2o5Iv9lMRj/ZTEY/2k2Hv+JYU3/3tTO/////////////////+3t7e5BQUGFAAAAWgAA
AD4AAAAjAAAAEQAAAAf/////////////////////////////////////xbGo/207JP9sOiL/sZaJ/5d1
Y/9lMRj/iWFP/+3n5f///////////+vk4f+AVkL/ZjIZ/7GWiv/+/v7////////////m3tr/ek85/2Qy
GP+2npL//////8Kvpf9tPCT/ZzUc/35TP/+Tblz/oYBw/7qjmP/n4Nz//v79/////////////////+3t
7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////////////7ujl/4xl
U/9lMxn/c0Mq/2s6If9pNx7/tJuP//38+////////////+vk4f+BVkL/ZjIZ/7GWiv/+/v7/////////
///u6eb/pYZ1/5ZyXv/NvLP//f39/6yShf9lMhj/imJP/9/V0P/18vD/+vj4///+/v//////////////
/////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////
/////////////8OupP9uOyT/ZjIa/2UyGv+BV0P/5dzY/////////////////+vk4f+BVkL/ZjIa/7GW
iv/+/v7////////////9/f3/6+jv/+Xh6//6+Pj//v39/62Thv9kMRj/lnNj//Pv7f//////////////
/////////////////////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf/////////////
/////////////////////////////+7n5f+MZFP/ZTIa/2g3H/+zmY3//Pz7/////////////////+vk
4f+BVkP/ZjIZ/7GWiv/+/v7////////////t7fn/f3vU/2ZhzP/Qz/D//////8Owpv9rOyL/bj4m/55+
bv+6o5j/uqSZ/7qkmf+6pJj/u6SZ/7qkmP/Dr6X/9PDu/+7u7+1DQ0OBAAAAVwAAADsAAAAiAAAAEAAA
AAf////////////////////////////////////////////+/v+6o5f/aDYe/39WQf/k3Nf/////////
/////////////+vk4f+BVkL/ZjIZ/7GXiv/+/v7////////////g3/T/SUTC/ygit/+in+D///////Dq
6P+ignT/bT0l/2YzGv9lMxr/ZTIa/2YyGv9mMxr/ZjMa/2UxGP94SzP/49rU//Dx8exHR0d7AAAAUQAA
ADgAAAAgAAAADwAAAAb////////////////////////////////////////////////i2dP/f1ZA/66U
h//8+/v///////////////////////Tx7/+7pJn/rJGD/9THv////v7////////////39/z/pKLh/4aC
1//f3vT////////////y7uz/yLas/6SGdf+Vc2D/lXNh/5ZzYv+Vc2H/lXNh/5RyYP+kh3b/7ujl//Hy
8upOTk5wAAAARwAAADEAAAAcAAAADQAAAAX/////////////////////////////////////////////
///7+fj/ybiu/+be2f/////////////////////////////////+/v7//v7+///+/v//////////////
/////////Pv+//r6/f////////////////////////////r5+P/29PL/9vTy//b08v/29PL/9vTy//b0
8v/49vX////+//T09OdbW1tfAAAANwAAACYAAAAWAAAACgAAAAT/////////////////////////////
/////////////////////////f39//7+/v//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////f39+Rzc3NMAAAAJQAAABoAAAAPAAAABwAAAAP////v////7///
/+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7///
/+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7///
/+/////v////7////+/////v////7////+/////v////8fr6+tOVlZU3AAAAFAAAAA8AAAAJAAAABAAA
AAL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv//
/zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv//
/zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mvv7+yyrq6sKAAAAAwAA
AAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAP///////wAA////////AAD///////8AAIAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAQAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
AQAIBgAAAFxyqGYAAEMISURBVHja7b3ZdhtJmuf5N9+xryS4SJQUERmZVVk1PefMe9SD1HNNv0df1Nz1
nJrpqsrMyAiFJO7Yd9/NrC/MHXA4HRtJkRRlPx0IgNPhMHe4ffbZtxkgkUgkEolEIpFIJBKJRCKRSCQS
iUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKR
SCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJ
RCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFI
JBLJU0I45/y5GyGRfG9wzn3Hcf7Hx48f//u//uu//o9/+7d/GwHQAZB4l9SDZWyLH1jzOvl+5evjF9pz
XwiJ5DuGMMbAGCMQHT9+pOFrtif/jmifvQZ0KQAkkmeCc44wDJUgCBQAavSIO3Fy5FdS79ceMvGaZGy7
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
</value>
</data>
<metadata name="Chktimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="UItimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>123, 21</value>
</metadata>
<metadata name="notifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>220, 24</value>
</metadata>
<metadata name="contextMenuSubStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>329, 28</value>
</metadata>
<data name="notifyIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyexsbsnsbq7J7G+eyexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb57J7G6uyexsbAAAAALJ7Gyqyexvtsnsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexvtsnsbKrJ7
G66yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsbrrJ7G/C3fxz/z5Yi/9mgJf/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
Jv/dpCb/2aAl/8+WIv+3fxz/snsb87mCHf/boSX/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/boSX/uYId/9CYI//epSb/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/0Jgj/9ujJv/epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3KMm/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/3aUn//Xl
wv//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////15cL/3aUn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+Cm
J//gpif/26Im////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////26Im/+Cm
J//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CnKP/gpyj/4Kco/+Cn
KP/gpyj/4Kco/+CnKP/gpyj/2KEn////////////////////////////////////////////////////
////////////////////////////////////////////////////////xpQj/8mWJP/JliT/yZYk/8iV
JP/my5H/2aIn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn
KP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/2KEn////////////////////////////////////
////////////////////////////////////////////////////////////////////////0pwl/9ih
J//YoSf/2KEn/9agJv/WoCb/3KQn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn
KP/gpyj/4Kco/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hpyj/2aEn////////////////////
////////////////////////////////////////////////////////////////////////////////
////////2aEn/+CmKP/u0pT////////////t0pT/36Yo/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+Gn
KP/hpyj/4aco/+GnKP/hpyj/4aco/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/2aIn////
////////////////////////////////////////////////////////////////////////////////
////////////////////////2KEm/+3SlP//////////////////////7dKU/+CnKP/hqCj/4ago/+Go
KP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+Ko
Kf/iqCn/2qIn////////////////////////////////////////////////////////////////////
////////////////////////////////////////6s+U/////////////////8ucM//w4sH//////+7S
lf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KpKf/iqSn/4qkp/+Kp
Kf/iqSn/4qkp/+KpKf/iqSn/2qMn////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////Pn
zP/RoTT/8eLB///////u05X/4agp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+Op
Kf/jqSn/46kp/+OpKf/jqSn/46kp/+OpKf/jqSn/2qMn////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///LnDP/8OHB///////06Mz/0qI0//Hiwf//////7tOV/+KoKf/jqSn/46kp/+OpKf/jqSn/46kp/+Op
Kf/jqSn/46kp/+OqKv/jqir/46oq/+OqKv/jqir/46oq/+OqKv/jqir/2qQo////////////////////
///////////////////9+/f/7d26/97AfP/Uq1H/06tO/8qYJf/KmCX/06tO/9SrUf/ewHz/7d26//37
9//////////////////58+X/0aE1//Diwf//////9OjM/9KiNf/x4sL//////+7Tlf/iqSr/46oq/+Oq
Kv/jqir/46oq/+OqKv/jqir/46oq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+SqKv/kqir/26Qo////
////////////////////////+/fw/96/ev/OnTD/0Jsm/9WfJ//YoSj/2qIo/9ukKP/bpCj/2qIo/9ih
KP/Vnyf/0Jsm/86dMP/ev3r/+/fw////////////+vPm/9KiNf/w4sH///////XozP/TojX/8eLC////
///v05X/46kq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+WqKv/lqir/5aoq/+WqKv/lqir/5aoq/+Wq
Kv/lqir/3KQo///////////////////////38OD/06RA/9afJ//coyj/36Yp/+KnKf/jqSr/5Kkq/+Wq
Kv/lqir/5Kkq/+OpKv/ipyn/36Yp/9yjKP/Wnyf/06RA//fw4P////////////rz5v/TojX/8eLB////
///16Mz/1KI1//Hiwv//////79OV/+SpKv/lqir/5aoq/+WqKv/lqir/5aoq/+WrKv/lqyr/5asq/+Wr
Kv/lqyr/5asq/+WrKv/lqyr/3KUo///////////////////////btWH/2aIo/+GoKf/kqir/5asq/+Wr
Kv/lqyr/5asq/+WrKv/lqyr/5asq/+WrKv/lqyr/5asq/+SqKv/hqCn/2aIo/9u0Xv//////////////
///69Ob/06M1//Hiwf//////9ejM/9SjNf/x4sL//////+/Ulf/kqir/5asq/+WrKv/lqyr/5asq/+ar
K//mqyv/5qsr/+arK//mqyv/5qsr/+arK//mqyv/3aUp///////////////////////YoSj/46gq/+ar
K//mrjX/7MRu//Ter//57dT/+vDc////////////+vDc//nt1P/03q//7MRu/+auNf/mqyv/46gq/9ih
KP//////////////////////9ejM/9SjNv/x4sL///////XozP/Uozb////////////w1Jb/5aor/+ar
K//mqyv/5qsr/+asK//mrCv/5qwr/+asK//mrCv/5qwr/+asK//mrCv/3aYp////////////////////
///dpSn/5Ksr/+/Oh//9+/X///////////////////////////////////////////////////////37
9f/vzof/5Ksr/92lKf////////////////////////////XozP/UpDb/8eLC////////////////////
////////8NSW/+WrK//mrCv/5qwr/+esK//nrCv/56wr/+esK//nrCv/56wr/+esK//nrCv/3qYp////
///////////////////dpSn/892s////////////////////////////////////////////////////
////////////////////////892s/92lKf//////////////////////5cuR///////16Mz/1KM2////
/////////////////////////////+OpKv/nrCv/56wr/+etLP/nrSz/560s/+etLP/nrSz/560s/+et
LP/nrSz/3qcq///////////////////////cpzT//Pjw////////////////////////////5cyU/82a
J//Pmyf/z5sn/8+bJ//Pmyf/z5sn/9CcKP/Vnyn/3aUq/92nL///////////////////////0Jwo/+fN
kv//////////////////////////////////////6M6S/+GoK//nrSz/560s/+itLP/orSz/6K0s/+it
LP/orSz/6K0s/+itLP/orSz/36cq///////////////////////iumP/7tms////////////////////
/////////////+zRlf/epir/36cq/9+nKv/fpyr/36cq/9+nKv/gpyv/46kr/+a9ZP//////////////
////////2aIp/9ihKf/nzJL////////////////////////////my5L/2KEp/+SqK//orSz/6K0s/+iu
LP/oriz/6K4s/+iuLP/oriz/6K4s/+iuLP/oriz/36gq///////////////////////68+P/3LFQ/+LF
gv/8+vX////////////////////////////x1Zb/560s/+iuLP/oriz/6K4s/+iuLP/oriz/6rtT//rz
4///////////////////////3qcq/+KpK//Xoin/5syS/////////////////+bMkv/Xoin/4qkr/+et
LP/oriz/6K4s/+muLf/pri3/6a4t/+muLf/pri3/6a4t/+muLf/pri3/4Kgr////////////////////
/////////vz3/+jKif/Wpj7/3blq/+rWqf/06tT/9evW////////////78yD/+itLf/pri3/6a4t/+my
Of/w0Ir//vz3////////////////////////////4Kgr/+itLf/jqSz/2KIq/+bMkv//////5syS/9ii
Kv/jqSz/6K0t/+muLf/pri3/6a4t/+mvLf/pry3/6a8t/+mvLf/pry3/6a8t/+mvLf/pry3/4Kgr////
///////////////////////////////////+/fr/8uK+/+XHgf/cs1b/2rFT/9KeK//Woiz/5blV/+u+
Wf/wzoP/9uW+//79+v//////////////////////////////////////4Kgr/+mvLf/ori3/46os/9mj
Kv/Unyn/2aMq/+OqLP/ori3/6a8t/+mvLf/pry3/6a8t/+qvLf/qry3/6q8t/+qvLf/qry3/6q8t/+qv
Lf/qry3/4agr////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////4agr/+qv
Lf/qry3/6a4t/+asLP/kqiz/5qws/+muLf/qry3/6q8t/+qvLf/qry3/6q8t/+uwLv/rsC7/67Au/+uw
Lv/rsC7/67Au/+uwLv/rsC7/4qks////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw
Lv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/4qks////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw
Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////46os/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yx
Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////
////////////////////////////////////////////////////////////////////////////////
///////////////////btFz/0p4p/9OfKf/Tnyn/058p/9OfKf/Zoyr/5qwt/+yxLv/ssS7/7LEu/+yx
Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2x
L//tsS//5Kot////////////////////////////////////////////////////////////////////
///////////////////////////////////aoyv////////////////////////////w05X/6a4u/+2x
L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2yL//tsi//7bIv/+2y
L//tsi//7bIv/+2yL//tsi//5Kst////////////////////////////////////////////////////
///////////////////////////////////////////////////dpiz//////////////////////+zR
lP/jqy3/67Ev/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6y
L//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//5ast////////////////////////////////////
///////////////////////////////////////////////////////////////////dpSz/////////
////////6M2T/92lLP/orS7/7bEv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6y
L//usi//7rIv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//5awt////////////////////
////////////////////////////////////////////////////////////////////////////////
///dpiz////////////ozpP/3aYs/+iuLv/tsi//7rMv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6z
L//usy//7rMv/+6zL//usy//7rMv/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/5awu////
////////////////////////////////////////////////////////////////////////////////
///////////////////dpi3//////+jOlP/dpi3/6K4v/+2yMP/uszD/7rMw/+6zMP/uszD/7rMw/+6z
MP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++z
MP/vszD/560u//XnyP//////////////////////////////////////////////////////////////
///////////////////////////////////fpy3/7dGU/96mLf/pri//7rIw/++zMP/vszD/77Mw/++z
MP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++0MP/vtDD/77Qw/++0
MP/vtDD/77Qw/++0MP/vtDD/6rAv/96nLf/Xoiv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ah
K//WoSv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ymLP/krC7/5a0u/+mvL//uszD/77Qw/++0
MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0
MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/7rMw/+uwL//ori7/560u/+etLv/nrS7/560u/+et
Lv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+qvL//ssS//7rMw/++z
MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0
MP/wtDD/8LQw//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C1MfDwtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx8/C1MavwtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUxrvG1MSfxtTHt8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTHt8bUxKgAA
AADxtTEb8bUxqPG1MeTxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1
MajxtTEbAAAAAIAAAAAAAaiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIyAAAAAAAGojCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACyexsGsnsbjbJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G+eyexuNsnsbBrJ7G4eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexuKs3wb6sqSIf/ZoCX/3aQm/92kJv/dpCb/3aQm/92k
Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/ZoCX/ypIh/7N8G+rJkSH/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/ypIh/9qiJv/epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//aoib/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/9+mJ//fpif/36Yn/92lJ//15cL/////////////////////////////////////////
//////////////////////////////////////////////Xlwv/dpSf/36Yn/9+mJ//fpif/36Yn/9+m
J//fpif/36Yn/+CnKP/gpyj/4Kco/+CnKP/gpyj/26Mn////////////////////////////////////
/////////////////////////////////////////////////////////////9ujJ//gpyj/4Kco/+Cn
KP/gpyj/4Kco/+CnKP/gpyj/4aco/+GnKP/hpyj/4aco/+GnKP/ZoSf/////////////////////////
/////////////////////////////////////////////8eUI//JliT/yZYk/8mVJP/my5H/2qIn/+Gn
KP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hqCj/4ago/+GoKP/hqCj/4ago/9miJ///////////////
////////////////////////////////////////////////////////050l/9ihJv/q0JT//////+nP
k//cpCf/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/2qIn////
///////////////////////////////////////////////////////////////////ZoSf/7tKV////
/////////Pjw/+3Slf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/46kp/+OpKf/jqSn/46kp/+Op
Kf/aoyf//////////////////////////////////////////////////////////////////////+rP
lP////////////jy5P/RoDT/+fHh/+7Tlf/iqCn/46kp/+OpKf/jqSn/46kp/+OpKf/kqir/5Koq/+Sq
Kv/kqir/5Koq/9ukKP//////////////////////////////////////////////////////////////
///////////////////8+fL/0aA1//Xpz//WpDb/+fLh/+/Tlf/jqSr/5Koq/+SqKv/kqir/5Koq/+Wq
Kv/lqir/5aoq/+WqKv/lqir/3KQo////////////////////////////8OLE/9u5bf/VrFH/zZoq/82a
Kv/VrFH/27lt//DixP/////////////////68+b/2aY2//bqz//XpDb/+fLh/+/Tlf/kqSr/5aoq/+Wq
Kv/lqir/5asr/+WrK//lqyv/5asr/+WrK//cpSn/////////////////+vbt/9auVP/RnCf/1qAo/9qj
Kf/cpCn/3KQp/9qjKf/WoCj/0Zwn/9exXP/8+fL////////////69Ob/2ac3//bqz//XpTf/+fLh/+/U
lv/kqiv/5asr/+WrK//mrCv/5qwr/+asK//mrCv/5qwr/92mKf/////////////////duWj/2KIo/9+n
Kv/jqSr/5Ksr/+WrK//lqyv/5Ksr/+OpKv/fpyr/2KIo/9y4Zv/////////////////69Ob/2qg3//bq
z//Ypjf//Pjw//DUlv/lqyv/5qwr/+etLP/nrSz/560s/+etLP/nrSz/3qcq/////////////////9ii
Kf/jqiv/6r9e//Terf/579f////////////579f/9N6t/+q/Xv/jqiv/2KIp/////////////////+jN
kv/69Ob/26k4//rz5f///////////+OqK//nrSz/6K0s/+itLP/orSz/6K0s/+itLP/fpyr/////////
////////3qUq//DSkf////////////////////////////////////////////DSkf/epSr/////////
////////054o/+vPk//9+fL////////////pzpL/4qgr/+itLP/priz/6a4s/+muLP/priz/6a4s/+Co
Kv////////////7+/P/dpSr//fv1/////////////////+fPmf/Qmyf/0Z0o/9SeKP/Yoin/4Kgq/9+m
Kv/////////////////bpCn/26Qp/+nOkv//////5syS/9miKf/lqyv/6a4s/+mvLf/pry3/6a8t/+mv
Lf/pry3/4Kgr/////////////////+O6X//pzZD//////////////////////+7Um//fqCv/4Kgr/+Kq
LP/lrCz/6MFp/////////////////9+oK//jqiz/2qQq/9SfKf/Zoyr/46os/+iuLf/pry3/6q8t/+qv
Lf/qry3/6q8t/+qvLf/hqCv//////////////////Pjw/+K4Xv/cs1v/69er//Xq1P/+/fr//v36/+/O
hf/pri3/6a4t/+zBYP/8+fD/////////////////4agr/+muLf/mrCz/5Kos/+asLP/pri3/6q8t/+qv
Lf/rsC7/67Au/+uwLv/rsC7/67Au/+KpLP////////////////////////////TkwP/jvm7/3LFS/9Oe
Kf/Yoir/5rhU/+7GcP/35sH////////////////////////////iqSz/67Au/+uwLv/rsC7/67Au/+uw
Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////////////////////////////////////
/////////////////////////////////////////////////////////////+OqLP/ssS7/7LEu/+yx
Lv/ssS7/7LEu/+yxLv/ssS7/7bEv/+2xL//tsS//7bEv/+2xL//kqi3/////////////////////////
////////////////////////////////////////////////////////////////////////5Kot/+2x
L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsi//7bIv/+2yL//tsi//7bIv/+SrLf//////////////
/////////////////////////////////////////////////////////////9y0XP/Tnyr/1J8q/9qk
K//nrS7/7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6zL//usy//7rMv/+6zL//usy//5awt////
////////////////////////////////////////////////////////////////////////3aYs/+Ss
Lf/lrC3/6K4u/+yyL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//77Mw/++zMP/vszD/77Mw/++z
MP/mrC7/////////////////////////////////////////////////////////////////////////
///lrC7/7rIw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vtDD/77Qw/++0
MP/vtDD/77Qw/+euLv/158j/////////////////////////////////////////////////////////
/////////////+atLv/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0
MP/wtDD/8LQw//C0MP/wtDD/67Av/9+nLf/Yoiv/16Er/9ehK//XoSv/16Er/9ehK//XoSv/16Er/9eh
K//XoSv/16Er/9ehK//dpiz/6q8v//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0
MP/wtDD/8LUx6vC1Mf/wtTH/8LUx//C1Mf/utDH/67Ew/+ivL//nri//564v/+euL//nri//564v/+eu
L//nri//564v/+euL//nri//564v/+qwMP/utDH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
Mf/wtTH/8LUx//C1MerxtTGH8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUxh/G1MQbxtTGE8bUx5PG1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1MYTxtTEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABACAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAsnsbSLJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
G/+yexv/snsb/7J7G/+yexvnsnsbSL+IHuzaoSX/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
Jv/epSb/3qUm/96lJv/epSb/2qEl/7+IHuzaoSb/36Yn//79+///////////////////////////////
///////////////////fpif/36Yn/9+mJ//aoSb/4Kco/+CnKP/+/fv/////////////////////////
///KlyT/ypck/8qXJP/kypD/4Kco/+CnKP/gpyj/4Kco/+GoKP/hqCj//v37////////////////////
////////4ago/+GoKP/pvl//1qAm/+GoKP/hqCj/4ago/+GoKP/jqSn/46kp//79+///////////////
/////////////+OpKf/x1ZX///////HVlf/jqSn/46kp/+OpKf/jqSn/5aoq/+WqKv/+/fv/////////
////////////////////////////////////////8tWW/+WqKv/lqir/5aoq/+asK//mrCv//v37////
///r06H/2K1N/9CbJ//YrU3/69Oh///////////////////////z1pb/5qwr/+asK//orSz/6K0s//79
+//p0Jr/4rVV//ns0P//////+ezQ/+K1Vf/ozZL///////////////////////TWl//orSz/6a8t/+mv
Lf/+/fv/4K08//z05P/////////////////89OT/4a48////////////////////////////6a8t/+uw
Lv/rsC7//v37/+u2P//68+P//////9SfKv/Unyr/16Eq/+u2P////////////+nOk///////6c6T/+uw
Lv/tsS//7bEv//79+//23KL/4LJQ//Hguf/tsS//7bEv/+2xL//12Jj////////////hqC3/1qAr/+Go
Lf/tsS//7rMv/+6zL//+/fv///////bepv/luFT/7rMv//HBVv/436f/////////////////7rMv/+6z
L//usy//7rMv/++0MP/vtDD//v37/////////////////////////////////////////////////++0
MP/vtDD/77Qw/++0MP/vtDDt8LUx/9mkLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mj
LP/wtTH/8LUx//C1Mf/vtDDt8bUxP/G1McnxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
Mf/xtTH/8bUx//G1Mf/xtTHJ8bUxPwAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA
rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE=
</value>
</data>
</root>

View File

@ -0,0 +1,57 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using SystemX.Net.Platform.SystemX.Net.XEFCore;
using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log;
using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
namespace SystemX.Net.MiddlewareUI
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
bool bCreateProgram = false;
Mutex SetMutex = new Mutex(true, "SystemX.Net.Middleware.UI.Log CPXV2", out bCreateProgram);
if (bCreateProgram)
{
//종속성 주입
/*
ServiceCollection collection = new ServiceCollection();
collection.AddSingleton<XEFCore<CPXV2ShortTermLogJson>>();
collection.AddSingleton<MainForm>();
ServiceProvider provider = collection.BuildServiceProvider();
var shortTermJson = provider.GetService<XEFCore<CPXV2ShortTermLogJson>>();
shortTermJson.SetConnectionString("Server=127.0.0.1;Database=CPXV2ShortTermLogJson;User Id=Alis;Password=Kefico!@34;");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(provider.GetService<MainForm>());
*/
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
SetMutex.ReleaseMutex();
}
else
{
MessageBox.Show("[SystemX.Net.Middleware.UI.Log CPXV2] Already this program excute now. Check the process.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
}

View File

@ -0,0 +1,32 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SystemX.Net.MiddlewareUI")]
[assembly: AssemblyDescription("SystemX")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("SystemX")]
[assembly: AssemblyProduct("SystemX.Net.MiddlewareUI")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("CP-ServerX")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("83f9d8f8-1fc1-4c57-bef0-9b0f33d4ff9e")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("20.22.11.29")]
[assembly: AssemblyFileVersion("20.22.11.29")]

View File

@ -0,0 +1,193 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SystemX.Net.MiddlewareUI.Log.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemX.Net.MiddlewareUI.Log.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap ALIS {
get {
object obj = ResourceManager.GetObject("ALIS", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap AppIcon {
get {
object obj = ResourceManager.GetObject("AppIcon", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap AppIcon1 {
get {
object obj = ResourceManager.GetObject("AppIcon1", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Bubble_16x16 {
get {
object obj = ResourceManager.GetObject("Bubble_16x16", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Bubble_32x32 {
get {
object obj = ResourceManager.GetObject("Bubble_32x32", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Cancel_16x16 {
get {
object obj = ResourceManager.GetObject("Cancel_16x16", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Cancel_32x32 {
get {
object obj = ResourceManager.GetObject("Cancel_32x32", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap CI {
get {
object obj = ResourceManager.GetObject("CI", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Database_16x16 {
get {
object obj = ResourceManager.GetObject("Database_16x16", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Database_32x32 {
get {
object obj = ResourceManager.GetObject("Database_32x32", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Kefico_CI {
get {
object obj = ResourceManager.GetObject("Kefico_CI", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Publish_16x16 {
get {
object obj = ResourceManager.GetObject("Publish_16x16", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap Publish_32x32 {
get {
object obj = ResourceManager.GetObject("Publish_32x32", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,160 @@
<?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.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Bubble_32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Bubble_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Database_16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Database_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ALIS" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ALIS.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Cancel_16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Cancel_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AppIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\AppIcon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Cancel_32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Cancel_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Publish_32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Publish_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Kefico_CI" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Kefico CI.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Publish_16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Publish_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="CI" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\CI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Bubble_16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Bubble_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Database_32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Database_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AppIcon1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\AppIcon1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SystemX.Net.MiddlewareUI.Log.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles />
<Settings />
</SettingsFile>

View File

@ -0,0 +1 @@
DevExpress.XtraEditors.ProgressBarControl, DevExpress.XtraEditors.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,268 @@
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
//using SystemX.Common.Protocol.SIA;
using DevExpress.Utils.Extensions;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
using SystemX.Net.Platform.SystemX.Common;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private async void WatchRecvCommandQueue()
{
await Task.Delay(250);
while (!m_bTaskCommandBlock)
{
try
{
CT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (bTaskCommandWaitLock == false)
QueryRecvCommandQueue();
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[1] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
await Task.Delay(500);
}
}
private bool LogMemoryPushProcess(int nPos, int nStPos)
{
int nSetSize = int.MaxValue;
byte[] ucSetLogArray = null;
bool bProcResult = false;
using (LogSharedMemory memLog = new LogSharedMemory(ParamterMapLog))
{
if (memLog.CheckFile(nPos))
{
LogMappedPacket LogMapFile = new LogMappedPacket();
nSetSize = Marshal.SizeOf(LogMapFile);
ucSetLogArray = new byte[nSetSize];
LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType());
bool bFindLogResult = false;
LogMapFile = memLog.Get(nPos, nStPos, out bFindLogResult, nSetSize).Value;
if (bFindLogResult == false)
return false;
if (LogMapFile.bLogFileReadComplete == false)
{
LogMapFile.bLogFileReadComplete = true;
memLog.Set(nPos, LogMapFile);
StringBuilder sb = new StringBuilder();
sb.Append("[" + (++nEnqueueCount).ToString() + "][Enqueue]");
sb.Append("[");
sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
sb.Append("], ");
sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], ");
sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], ");
sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], ");
sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], ");
sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], ");
sb.Append("Host [" + LogMapFile.objHost[0].Data + "], ");
sb.Append("Section [" + LogMapFile.objSection[0].Data + "], ");
sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], ");
sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], ");
sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], ");
sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] ");
/*
sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], ");
sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], ");
sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], ");
sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], ");
sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], ");
sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], ");
sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], ");
sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "] ");
*/
sb.AppendLine();
if (nEnqueueCount >= Int64.MaxValue)
nEnqueueCount = 0;
LogDataRecvText.Enqueue(sb);
LogDataQueue[nPos].Enqueue(LogMapFile);
bProcResult = true;
}
}
}
return bProcResult;
}
private bool QueryRecvCommandQueue()
{
bool bState = true;
string strProcessDebugInfo = string.Empty;
long l1 = long.MinValue;
long l2 = long.MinValue;
try
{
bTaskCommandWaitLock = true;
Stopwatch stProcessTimeChk = new Stopwatch();
stProcessTimeChk.Start();
using (InfoLogSharedMemory memInfoLog = new InfoLogSharedMemory(ParamterMapInfoLog))
{
InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket();
int nSetSize = Marshal.SizeOf(InfoLogMapFile);
byte[] ucSetLogArray = new byte[nSetSize];
InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType());
if (memInfoLog.CheckFile())
{
bool bFindInfoLogResult = false;
//로그 처리가 필요한 위치 조회
bool[] bGetStationReadyLog = memInfoLog.Get(out bFindInfoLogResult, nSetSize);
if (bFindInfoLogResult == false)
return bState;
//Array.Copy(bGetStationReadyLog, 0, InfoLogMapFile.bLogDataReady, 0, SharedMemory.nMaxInfoFullAccessSize);
Array.Clear(bCompareLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize);
for (int i = 0; i < SharedMemory.nMaxInfoFullAccessSize; i++)
{
if (bGetStationReadyLog[i] != bBeforeLogReadyState[i])
bCompareLogReadyState[i] = true;
}
//존재할 경우
if (bCompareLogReadyState.Any(x => x == true))
{
//존재하는 개수 파악
bool[] arrCheckNum = Array.FindAll(bCompareLogReadyState, x => x == true);
//개수 확인
int nFindCount = arrCheckNum.Count();
//개수 만큼 Index 확인
for (int i = 0; i < nFindCount; i++)
{
Stopwatch stItemTimeChk = new Stopwatch();
stItemTimeChk.Start();
int nIdx = Array.FindIndex(bCompareLogReadyState, x => x == true);
//Index 포트 변환 및 Station(최대 8) 확인
int nPos = (nIdx / SharedMemory.nMaxStationSize) + PORT_DISTRIBUTION_NUM;
int nAccessPart = nIdx / SharedMemory.nMaxStationSize;
int nSubPos = nIdx % SharedMemory.nMaxStationSize;
if (bCompareLogReadyState[nIdx])
{
LogMemoryPushProcess(nPos, nSubPos);
bCompareLogReadyState[nIdx] = false;
}
l2 = stItemTimeChk.ElapsedMilliseconds;
}
/*for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskStreamBlock; i++)
{
for (int j = (i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize;
j < ((i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize) + SharedMemory.nMaxStationSize; j++)
{
if (bGetStationReadyLog[j])
{
LogMemoryProcess(i, j);
bGetStationReadyLog[j] = false;
}
}
Thread.Sleep(10);
}*/
//memInfoLog.Set(bGetStationReadyLog);
Array.Copy(bGetStationReadyLog, 0, bBeforeLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize);
}
}
}
l1 = stProcessTimeChk.ElapsedMilliseconds;
if (l1 != long.MinValue && l2 != long.MinValue)
{
LogDataRecvText.Enqueue(new StringBuilder(">>[Enqueue-Process][" + l1.ToString() + "][Enqueue-Item][" + l2.ToString() + "]\r\n"));
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
finally
{
bTaskCommandWaitLock = false;
}
return bState;
}
}
}

View File

@ -0,0 +1,73 @@
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
//using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using SystemX.Net.Platform.Common.ExtensionMethods;
using SystemX.Net.Platform.SystemX.Common;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
/*
private string GetFileName(int iPos, LogMappedPacket GetMappedInfo, string strCreateName, string strSubName)
{
Random randNumber = new Random();
string strFileName = strCreateName;
if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
else
strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data;
if (File.Exists(strFileName) == true)
{
while (true)
{
strFileName = strCreateName;
if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
else
strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
if (File.Exists(strFileName) == false)
break;
}
}
return strFileName;
}
*/
}
}

View File

@ -0,0 +1,214 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
//using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.Platform.Common.ExtensionMethods;
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
using System.Net.NetworkInformation;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
public bool CPX_ReadVRFYList(int nConnId, int nTestListNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true)
{
nReadStepVersion = int.MaxValue;
try
{
string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE;
string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE;
try
{
//해당 테스트리스 정보 마지막 업데이트 번호 가져오기
thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WHERE TestlistNo = " + nTestListNo + ";");
nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]);
}
catch
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
@" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
throw new Exception();
}
//이전 버전 사용 일시
if (nLoadPosition > 0)
nReadStepVersion -= nLoadPosition;
/* Changed
* 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리)
* > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경
* > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP
* > INDEX 사용
*/
if (bForceRead ||
(thisConnInfo[nConnId].bQueryVRFYLoaded == false ||
thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListNo ||
thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion))
{
try
{
thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, "SELECT * FROM ( " +
"SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " +
"AS RN FROM [" + strGetVRFYTableName + "] WITH (INDEX=[CSK_VRFY_Release_1]) WHERE TestlistNo = " + nTestListNo + " " +
"AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;");
thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy();
DataColumn[] keys1 = new DataColumn[1];
keys1[0] = new DataColumn();
keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"];
thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1;
DataColumn[] keys2 = new DataColumn[1];
keys2[0] = new DataColumn();
keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"];
thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2;
thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListNo;
thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion;
thisConnInfo[nConnId].bQueryVRFYLoaded = true;
}
catch
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
@" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
throw new Exception();
}
}
}
catch
{
return false;
}
return true;
}
public bool CPXV2_ReadVRFYList(int nConnId, int nTestListFileNo, int nTestListVariantNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true)
{
nReadStepVersion = int.MaxValue;
try
{
//HIST_TestListFileLatestStepVersion
//VRFY_TestListFileRelease
string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE;
string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE;
try
{
//해당 테스트리스 정보 마지막 업데이트 번호 가져오기
thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WITH(NOLOCK) WHERE TestListFileNo = " + nTestListFileNo + ";");
nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]);
}
catch
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
@" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
throw new Exception();
}
//이전 버전 사용 일시
if (nLoadPosition > 0)
nReadStepVersion -= nLoadPosition;
/* Changed
* 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리)
* > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경
* > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP
* > INDEX 사용
*/
if (bForceRead ||
(thisConnInfo[nConnId].bQueryVRFYLoaded == false ||
thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListFileNo ||
thisConnInfo[nConnId].nLastQueryTLVariantNumber != nTestListVariantNo ||
thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion))
{
try
{
string strQueryVRFY = "SELECT * FROM ( " +
"SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " +
"AS RN FROM [" + strGetVRFYTableName + "] WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = " + nTestListFileNo + " " +
"AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;";
thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, strQueryVRFY);
thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy();
DataColumn[] keys1 = new DataColumn[1];
keys1[0] = new DataColumn();
keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"];
thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1;
DataColumn[] keys2 = new DataColumn[1];
keys2[0] = new DataColumn();
keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"];
thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2;
thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListFileNo;
thisConnInfo[nConnId].nLastQueryTLVariantNumber = nTestListVariantNo;
thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion;
thisConnInfo[nConnId].bQueryVRFYLoaded = true;
}
catch
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
@" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
throw new Exception();
}
}
}
catch
{
return false;
}
return true;
}
}
}

View File

@ -0,0 +1,456 @@
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
//using SystemX.Common.Protocol.SIA;
using SystemX.Net.Middleware.Log.Commons;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private bool IsImageExtension(string strFileNameInfo, bool bOnlyExtension = true)
{
if (bOnlyExtension)
return -1 != Array.IndexOf(COMMON.mediaExtensions, strFileNameInfo.ToUpperInvariant());
else
return -1 != Array.IndexOf(COMMON.mediaExtensions, Path.GetExtension(strFileNameInfo).ToUpperInvariant());
}
public List<byte[]> QueryStreamProcess(string strGetQuery, out byte[] ucQueryByteArray, out DataSet setResultDataSet)
{
SqlDataReader xSqlReader = null;
int iFieldCnt = 0;
int iRecordsAffectedCnt = 0;
bool bHasRow = false;
ucQueryByteArray = null;
setResultDataSet = null;
DataSet ds = new DataSet();
DataTable dt = new DataTable();
DataSet getDS = Task.Run(() =>
{
try
{
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
return ds;
}).Result;
if(XCommons.isHasRow(ds))
setResultDataSet = ds.Copy();
List<byte[]> getStreamList = XCommons.ObjectToByteStreamList(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE), getDS);
return getStreamList;
}
public void QueryResultRemake(DataSet dsResult, int iSetFieldCnt, int iSetRecordsAffectedCnt, bool bSetHasRow, out byte[] ucQueryByteArray, params string[] strParameters)
{
int iFieldCnt = iSetFieldCnt;
int iRecordsAffectedCnt = iSetRecordsAffectedCnt;
bool bHasRow = bSetHasRow;
ucQueryByteArray = null;
ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER),
dsResult,
null,
0,
iRecordsAffectedCnt,
bHasRow,
iFieldCnt,
strParameters);
}
public Tuple<DataSet, int, int, bool> QueryProcess(string strGetQuery, out byte[] ucQueryByteArray, params string[] strParameters)
{
SqlDataReader xSqlReader = null;
int iFieldCnt = 0;
int iRecordsAffectedCnt = 0;
bool bHasRow = false;
ucQueryByteArray = null;
DataSet getDS = Task.Run(() =>
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
return ds;
}).Result;
ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER),
getDS,
null,
0,
iRecordsAffectedCnt,
bHasRow,
iFieldCnt,
strParameters);
return new Tuple<DataSet, int, int, bool>(getDS, iRecordsAffectedCnt, iFieldCnt, bHasRow);
}
private bool ExcuteNonQueryCommandProcess(SqlCommand cmd)
{
return Task.Run(() =>
{
bool bExcuteResult = true;
try
{
try
{
bExcuteResult = MngDBLogConn.CurrentConnection(eConnCategory.Main).ExecuteNonCommandQuery(cmd);
}
catch (Exception e)
{
bExcuteResult = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
;
}
return bExcuteResult;
}).Result;
}
private bool ExcuteNonQueryStreamProcess(eConnCategory eConnType, SqlCommand cmd)
{
return Task.Run(() =>
{
bool bExcuteResult = true;
try
{
try
{
bExcuteResult = MngDBLogConn.CurrentConnection(eConnType).ExecuteNonStreamQuery(cmd);
}
catch (Exception e)
{
bExcuteResult = false;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
;
}
return bExcuteResult;
}).Result;
}
private DataSet QueryCommandProcess(eConnCategory eConnType, string strGetQuery, bool bUseTransaction = false)
{
return Task.Run(() =>
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
SqlDataReader xSqlReader = null;
try
{
int iFieldCnt = 0;
int iRecordsAffectedCnt = 0;
bool bHasRow = false;
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryCommandDatabase(strGetQuery, bUseTransaction);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
}
finally
{
;
}
return ds;
}).Result;
}
private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery)
{
return Task.Run(() =>
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
SqlDataReader xSqlReader = null;
try
{
int iFieldCnt = 0;
int iRecordsAffectedCnt = 0;
bool bHasRow = false;
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
}
finally
{
;
}
return ds;
}).Result;
}
private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery, ref int nRecAffectedCnt)
{
nRecAffectedCnt = -2;
int iFieldCnt = 0;
int iRecordsAffectedCnt = -2;
bool bHasRow = false;
DataSet dsResult = null;
dsResult = Task.Run(() =>
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
SqlDataReader xSqlReader = null;
try
{
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
//Default -2 Fail 0 Select -1
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
}
finally
{
;
}
return ds;
}).Result;
nRecAffectedCnt = iRecordsAffectedCnt;
return dsResult;
}
private DataSet QueryProcess(string strGetQuery)
{
return Task.Run(() =>
{
SqlDataReader xSqlReader = null;
DataSet ds = new DataSet();
DataTable dt = new DataTable();
int iFieldCnt = 0;
int iRecordsAffectedCnt = 0;
bool bHasRow = false;
try
{
try
{
xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabaseSub(strGetQuery);
if (xSqlReader != null)
{
iFieldCnt = xSqlReader.FieldCount;
iRecordsAffectedCnt = xSqlReader.RecordsAffected;
bHasRow = xSqlReader.HasRows;
dt.Load(xSqlReader);
ds.Tables.Add(dt);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
finally
{
if (xSqlReader != null)
xSqlReader.Close();
xSqlReader = null;
}
return ds;
}).Result;
}
}
}

View File

@ -0,0 +1,701 @@
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.IO.Compression;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
//using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.Middleware.Log.Commons;
using SystemX.Net.Platform.SystemX.Common;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
using SystemX.Net.Middleware.Log.DeleteProc;
using SystemX.Net.Comm.IIS_FTP;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private async void WatchRecvStreamQueue()
{
await Task.Delay(250);
stCheckTermBulkWaitTime.Start();
while (!m_bTaskStreamBlock)
{
try
{
CT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (bDatabaseConnResult == false)
continue;
if (MngDBLogConn.GetMainDBAccessTime() >= 120000)
QueryStreamProcess(eConnCategory.Main, "SELECT GETDATE() AS 'CHECK PING';");
if (MngDBLogConn.GetShortTermDBAccessTime() >= 120000)
QueryStreamProcess(eConnCategory.ShortTerm, "SELECT GETDATE() AS 'CHECK PING';");
if (MngDBLogConn.GetLongTermDBAccessTime() >= 120000)
QueryStreamProcess(eConnCategory.LongTerm, "SELECT GETDATE() AS 'CHECK PING';");
nBulkLogCount = lstBulkTermLogInfo.Count;
nBulkLongTermCount = lstBulkShortTermLog.Count;
nBulkShortTermCount = lstBulkLongTermLog.Count;
nBulkTimeValue = stCheckTermBulkWaitTime.ElapsedMilliseconds;
if (stCheckTermBulkWaitTime.ElapsedMilliseconds >= LoadInfo.BULK_ProcessTime_ms || bTryBulkInsertBuffer)
{
Stopwatch stMeasProcTime = new Stopwatch();
if (lstBulkTermLogInfo.Count > 0)
{
stMeasProcTime.Start();
foreach (string str in lstBulkTermLogInfo.ToArray())
{
LogDataRecvText.Enqueue(new StringBuilder(str));
LogDataRecvText.Enqueue(new StringBuilder("\r\n"));
}
lstBulkTermLogInfo.Clear();
}
//
if(lstBulkShortTermLog.Count > 0)
SetLogDataInsertProc(eConnCategory.ShortTerm);
if (lstBulkLongTermLog.Count > 0)
SetLogDataInsertProc(eConnCategory.LongTerm);
BULK_INSERT_EXIT:
if (stMeasProcTime.IsRunning)
{
LogDataRecvText.Enqueue(new StringBuilder(">>[BulkInsert-Process][" + stMeasProcTime.ElapsedMilliseconds.ToString() + "]\r\n"));
//Check Server Time And Db Change
bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection();
}
bTryBulkInsertBuffer = false;
stCheckTermBulkWaitTime.Restart();
}
//Map Log File Check
if (bTaskStreamWaitLock == false)
QueryRecvStreamQueue();
// TODO : FTP ALIS
if (StateFTP != eFTPServiceStatus.Connected)
goto ROUTINE_END;
//FTP Server Check
nFTPTimeValue = stProcessCheckFTPTime.ElapsedMilliseconds;
if (stProcessCheckFTPTime.ElapsedMilliseconds >= LoadInfo.FTP_ScanTime_ms)
{
List<string> lstFile = ControlFTP.PositionRootCheckList();
List<string> lstDownlaodFile = new List<string>();
List<string> lstDeleteFailedFile = new List<string>();
if (lstFile.Count == 0)
goto BRANCH_EXIT;
string strGetDownloadPath = GetFTPDownloadPath();
foreach (string f in lstFile)
lstDownlaodFile.Add(await ControlFTP.FileDownload(f, strGetDownloadPath));
foreach (string f in lstDownlaodFile)
{
string strGetFileName = Path.GetFileName(f);
if (ControlFTP.DeleteFile(strGetFileName) == false)
lstDeleteFailedFile.Add(strGetFileName);
}
BRANCH_EXIT:
ProcFTPCheckLogFiles();
foreach (string f in lstDeleteFailedFile)
{
string strGetFileName = Path.GetFileName(f);
if (ControlFTP.DeleteFile(strGetFileName) == false)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"FTP > file delete process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
stProcessCheckFTPTime.Restart();
}
ROUTINE_END:;
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
await Task.Delay(100);
}
}
private void SetLogDataInsertProc(eConnCategory SetCategory)
{
bool bBulkCopyResult = true;
string strSetLogTable = string.Empty;
string strAddText = string.Empty;
if (SetCategory == eConnCategory.ShortTerm)
{
strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE;
strAddText = "ShortTerm";
}
else if (SetCategory == eConnCategory.LongTerm)
{
strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.LOG_TABLE;
strAddText = "LongTerm";
}
try
{
//LogData Set Bulk
using (SqlTransaction sqlTran = MngDBLogConn.CurrentConnection(SetCategory).getConnection().BeginTransaction())
{
//Sql Bulk Insert 준비 - Short Log
//Make Result Command
SqlBulkCopy sbc = new SqlBulkCopy(sqlTran.Connection,
SqlBulkCopyOptions.CheckConstraints |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls, sqlTran);
sbc.BatchSize = 5000;
sbc.DestinationTableName = "dbo." + strSetLogTable;
sbc.BulkCopyTimeout = 120;
try
{
// Write from the source to the destination.
//생성된 DataRow 들을 Bulk Copy 실시
if (SetCategory == eConnCategory.ShortTerm)
sbc.WriteToServer(lstBulkShortTermLog.ToArray());
else if (SetCategory == eConnCategory.LongTerm)
sbc.WriteToServer(lstBulkLongTermLog.ToArray());
//if (MngDBConn.InfoConnection.UTSI_STATE)
//{
// //Long Log
// SqlBulkCopy sbcL = new SqlBulkCopy(sqlTran.Connection,
// SqlBulkCopyOptions.CheckConstraints |
// SqlBulkCopyOptions.FireTriggers |
// SqlBulkCopyOptions.KeepNulls, sqlTran);
// sbcL.BatchSize = 5000;
// sbcL.DestinationTableName = "dbo.HIST_TestResultLongTerm";
// sbcL.BulkCopyTimeout = 120;
//
// sbcL.WriteToServer(SetMakeLogRows);
//}
}
catch (Exception ex)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + $@" CPXV2 CpLogProcess fail.({strAddText} - Bulk Upload) [SystemX.Net.MiddlewareUI : MainForm.SetLogDataInsertProc]\r\n" + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
bBulkCopyResult = false;
}
finally
{
// Close the SqlDataReader. The SqlBulkCopy
// object is automatically closed at the end
// of the using block.
if (bBulkCopyResult)
{
sqlTran.Commit();
if (SetCategory == eConnCategory.ShortTerm)
lstBulkShortTermLog.Clear();
else if (SetCategory == eConnCategory.LongTerm)
lstBulkLongTermLog.Clear();
LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [OK]>\r\n"));
}
else
{
sqlTran.Rollback();
LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [NOK]>\r\n"));
//throw new Exception();
}
}
}
}
catch
{
;//
}
finally
{
;//
}
if (bBulkCopyResult == false)
{
CommonProtocol cp = new CommonProtocol();
List<DataRow> lstRefRow = null;
if (SetCategory == eConnCategory.ShortTerm)
lstRefRow = lstBulkShortTermLog;
else if (SetCategory == eConnCategory.LongTerm)
lstRefRow = lstBulkLongTermLog;
foreach (DataRow dr in lstRefRow)
{
if (Convert.ToInt64(dr["No"]) == Int64.MinValue)
continue;
//Summary 객체를 이용해 DB 삽입할 SqlCommand 생성
SqlCommand cmd = cp.LogDataResultInsert(strSetLogTable, dr);
//Summary 삽입 > 실패시 처리
bool bProcessResult = ExcuteNonQueryStreamProcess(SetCategory, cmd);
if (bProcessResult == false)
{
LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [NOK]>\r\n"));
continue;
}
else
LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [OK]>\r\n"));
}
if (SetCategory == eConnCategory.ShortTerm)
lstBulkShortTermLog.Clear();
else if (SetCategory == eConnCategory.LongTerm)
lstBulkLongTermLog.Clear();
}
}
private bool QueryRecvStreamQueue()
{
//StackTrace st = new StackTrace(true);
bool bState = true;
string strProcessDebugInfo = string.Empty;
long l1 = long.MinValue;
long l2 = long.MinValue;
try
{
bTaskStreamWaitLock = true;
//Log Process
Stopwatch stProcessTimeChk = new Stopwatch();
stProcessTimeChk.Start();
for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskCommandBlock; i++)
{
Stopwatch stItemTimeChk = new Stopwatch();
stItemTimeChk.Start();
if (LogDataQueue[i].Count <= 0)
continue;
LogMappedPacket LogMapFile = new LogMappedPacket();
int nSetSize = Marshal.SizeOf(LogMapFile);
byte[] ucSetLogArray = new byte[nSetSize];
LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType());
int iPos = LogMapFile.nNumber;
strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" +
"[" + LogMapFile.nCommandPort + "]" +
"[" + LogMapFile.objHost[0].Data + "]" +
"[" + LogMapFile.objSection[0].Data + "]";
//
if (LogDataQueue[i].TryPeek(out LogMapFile)) //LogDataQueue[i].TryDequeue(out LogMapFile))
{
if (bShowCpLogProcessTime)
LogMapFile.bShowCpLogProcessTime = true;
StringBuilder sb = new StringBuilder();
sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]");
sb.Append("[");
sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
sb.Append("], ");
sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], ");
sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], ");
sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], ");
sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], ");
sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], ");
sb.Append("Host [" + LogMapFile.objHost[0].Data + "], ");
sb.Append("Section [" + LogMapFile.objSection[0].Data + "], ");
sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], ");
sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], ");
sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], ");
sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] ");
sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], ");
sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], ");
sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], ");
sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], ");
sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], ");
sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], ");
sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], ");
sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "], ");
if (nDequeueCount >= Int64.MaxValue)
nDequeueCount = 0;
bool bProcResult = false;
if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPX)
{
sb.Append("!Use Log Process Version [CPX] - No longer supported.");
//bProcResult = CPX_CpLogProcess(LogMapFile);
bProcResult = false;
}
else if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPXV2)
{
bProcResult = CPXV2_CpLogProcess(LogMapFile);
if(bProcResult == true)
lstBulkTermLogInfo.Add(sb.ToString());
sb.Append("!Use Log Process Version [CPXV2] ");
}
if (bProcResult)
sb.Append("<CpLogProcess Make Log Result [OK]>");
else
sb.Append("<CpLogProcess Make Log Result [NOK]>");
sb.AppendLine();
LogDataProcessText.Enqueue(sb);
if (LogDataQueue[i].TryDequeue(out LogMapFile) == false)
{
if (LogDataQueue[i].TryDequeue(out LogMapFile) == false)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue try-dequeue failed. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
}
l2 = stItemTimeChk.ElapsedMilliseconds;
}
l1 = stProcessTimeChk.ElapsedMilliseconds;
if (l1 != long.MinValue && l2 != long.MinValue)
{
LogDataProcessText.Enqueue(new StringBuilder(">>[TryDequeue-Process][" + l1.ToString() + "][TryDequeue-Item][" + l2.ToString() + "]\r\n"));
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue stream process unknown fail. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
finally
{
bTaskStreamWaitLock = false;
}
return bState;
}
// TODO : FTP ALIS
internal eFTPServiceStatus StartFTPService()
{
ControlFTP = new CtrlFTP(LoadInfo.FTP_Use,
IPAddress.Parse(LoadInfo.FTP_IPAddress), Convert.ToInt32(LoadInfo.FTP_Port),
LoadInfo.FTP_Account, LoadInfo.FTP_Password);
if (ControlFTP.FTPConnState)
return eFTPServiceStatus.Connected;
else
return eFTPServiceStatus.Disconnected;
}
private string GetFTPDownloadPath()
{
string strYYYY = DateTime.Today.ToString("yyyy");
string strMM = DateTime.Today.ToString("MM");
string strdd = DateTime.Today.ToString("dd");
string strHHmmssfff = DateTime.Now.ToString("HHmmssfff");
string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory);
string DirPath = @strGetRoot + $@"\XProc\FTP\CpLog\{strYYYY}\{strMM}\{strdd}\";
//string CpLogDirPath = @strGetRoot + $@"XProcCpLog\Temp\{strYYYY}\{strMM}\{strdd}\{strHHmmssfff}\";
DirectoryInfo di1 = new DirectoryInfo(@DirPath);
if (!di1.Exists) Directory.CreateDirectory(@DirPath);
//DirectoryInfo di2 = new DirectoryInfo(@CpLogDirPath);
//if (!di2.Exists) Directory.CreateDirectory(@CpLogDirPath);
return DirPath;
}
private void ProcFTPCheckLogFiles()
{
//Scan And Send File
string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory);
//오늘 포함 -6일전까지 검색
string[] strScanYYYY = new string[7];
string[] strScanMM = new string[7];
string[] strScandd = new string[7];
for (int n = 6; n >= 0; n--)
{
DateTime dtSet = DateTime.Today.AddDays(-n);
strScanYYYY[n] = dtSet.ToString("yyyy");
strScanMM[n] = dtSet.ToString("MM");
strScandd[n] = dtSet.ToString("dd");
}
//
// 7일치 위치 확인
//
for (int n = 0; n < 7; n++)
{
string DirPath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\";
string DirMovePath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\History\";
//생성 폴더가 없을경우 SKIP
if (Directory.Exists(DirPath) == false)
continue;
if (Directory.Exists(DirMovePath) == false)
Directory.CreateDirectory(DirMovePath);
string fileExtension = "zip";
string[] dirs = Directory.GetDirectories(DirPath);
string[] files = Directory.GetFiles(DirPath, $"*.{fileExtension}", SearchOption.TopDirectoryOnly);
if (files.Length <= 0)
continue;
ProcFTPLogFiles(files, DirPath, DirMovePath);
}
}
private void ProcFTPLogFiles(string[] strArrFiles, string strReadDirPath, string strMoveDirPath)
{
string strExtractFilePos = string.Empty;
string strOrgRemoveFilePos = string.Empty;
string strHeaderInfo = string.Empty;
string strLogFileNameInfo = string.Empty;
long l1 = long.MinValue;
//Log Process
Stopwatch stProcessTimeChk = new Stopwatch();
stProcessTimeChk.Start();
foreach (string f in strArrFiles)
{
strOrgRemoveFilePos = f;
strHeaderInfo = string.Empty;
strLogFileNameInfo = string.Empty;
string[] strInfos = f.Split(';');
//파일정보 확인(로그 저장관련 정보)
/*
string strSetDateTime = strInfos[1];
string strSetStationName = strInfos[2];
int nSetTestListVariantNo = int.Parse(strInfos[3]);
string strSetProcNoP = strInfos[4];
string strSetProcNoC = strInfos[5];
string strSetTestType = strInfos[6];
string strSetTestCode = strInfos[7];
string strSetVersion = strInfos[8];
string strSetProdCode = strInfos[9];
string strSetTestListCntID = strInfos[10];
string strHost = strInfos[11];
string strSection = strInfos[12];
*/
int nSetTryNo = int.Parse(strInfos[13]);
Dictionary<string, string> dicSetLogInfo = new Dictionary<string, string>();
dicSetLogInfo.Add("DATE_TIME", strInfos[1]);
dicSetLogInfo.Add("STATION_NAME", strInfos[2]);
dicSetLogInfo.Add("VARIANT_NO", strInfos[3]);
dicSetLogInfo.Add("P_TTNR", strInfos[4]);
dicSetLogInfo.Add("TTNR", strInfos[5]);
dicSetLogInfo.Add("TEST_TYPE", strInfos[6]);
dicSetLogInfo.Add("TEST_CODE", strInfos[7]);
dicSetLogInfo.Add("VERSION", strInfos[8]);
dicSetLogInfo.Add("PROD_CODE", strInfos[9]);
dicSetLogInfo.Add("TESTLIST_ID", strInfos[10]);
dicSetLogInfo.Add("HOST", strInfos[11]);
dicSetLogInfo.Add("SECTION", strInfos[12]);
for (int m = 1; m < 12; m++)
strHeaderInfo += (strInfos[m + 1] + ";");
strHeaderInfo = strHeaderInfo.Remove(strHeaderInfo.Length - 1, 1);
//압축해제 하여 로그 파일 추출
using (FileStream fs = new FileStream(f, FileMode.Open))
using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Update, false))
{
foreach (ZipArchiveEntry zae in zip.Entries)
{
strLogFileNameInfo = zae.FullName;
if (strLogFileNameInfo.IndexOf(".txt") >= 0)
continue;
strExtractFilePos = strReadDirPath + strLogFileNameInfo;
//ZipFileExtensions
zae.ExtractToFile(strExtractFilePos, true);
}
}
//Sometihing Procee
LogMappedPacket EmptyLogMapFile = new LogMappedPacket();
StringBuilder sb = new StringBuilder();
sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]");
sb.Append("[");
sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
sb.Append("], ");
sb.Append("Type [FTP], ");
sb.Append("Host [" + dicSetLogInfo["HOST"] + "], ");
sb.Append("Section [" + dicSetLogInfo["SECTION"] + "], ");
sb.Append("St Name [" + dicSetLogInfo["STATION_NAME"] + "], ");
sb.Append("File Name [" + Path.GetFileName(strExtractFilePos) + "], ");
sb.Append("File Extension [" + Path.GetExtension(strExtractFilePos) + "] ");
sb.Append("TL ID[" + dicSetLogInfo["TESTLIST_ID"] + "], ");
sb.Append("V[" + dicSetLogInfo["P_TTNR"] + "], ");
sb.Append("PN[" + dicSetLogInfo["TTNR"] + "], ");
sb.Append("TT[" + dicSetLogInfo["TEST_TYPE"] + "], ");
sb.Append("TC[" + dicSetLogInfo["TEST_CODE"] + "], ");
sb.Append("Ver[" + dicSetLogInfo["VERSION"] + "], ");
sb.Append("PC[" + dicSetLogInfo["PROD_CODE"] + "], ");
sb.Append("DB V No[" + dicSetLogInfo["VARIANT_NO"] + "], ");
if (nDequeueCount >= Int64.MaxValue)
nDequeueCount = 0;
bool bGetLogProcResult = CPXV2_CpLogProcess(EmptyLogMapFile, dicSetLogInfo, strExtractFilePos);
if (bGetLogProcResult == true)
lstBulkTermLogInfo.Add(sb.ToString());
sb.Append("!Use Log Process Version [FTP-CPXV2] ");
if (bGetLogProcResult)
sb.Append("<CpLogProcess Make Log Result [OK]>");
else
sb.Append("<CpLogProcess Make Log Result [NOK]>");
sb.AppendLine();
LogDataProcessText.Enqueue(sb);
l1 = stProcessTimeChk.ElapsedMilliseconds;
if (l1 != long.MinValue)
{
LogDataProcessText.Enqueue(new StringBuilder(">>[FTP-Process][" + l1.ToString() + "]\r\n"));
}
//Failed
if (bGetLogProcResult == false)
{
//실패시
nSetTryNo++;
string strTryNo = string.Empty;
string strCopyPos = string.Empty;
//재시도 3회 초과 일시 히스토리로 이동
if (nSetTryNo > 3)
{
strCopyPos = strMoveDirPath;
strTryNo = "X";
}
else
{
strCopyPos = strReadDirPath;
strTryNo = nSetTryNo.ToString();
}
for (int m = 0; m < 12; m++)
strCopyPos += (";" + strInfos[m + 1]);
strCopyPos += (";" + strTryNo + ";.zip");
File.Copy(f, strCopyPos, true);
}
//압축해제 파일 삭제
if (File.Exists(strExtractFilePos))
File.Delete(strExtractFilePos);
//성공시나 실패시 새로운 파일생성 되기 때문에 기존 파일 삭제
if (strOrgRemoveFilePos != string.Empty)
{
if (File.Exists(strOrgRemoveFilePos))
File.Delete(strOrgRemoveFilePos);
}
stProcessTimeChk.Restart();
}
}
}
}

View File

@ -0,0 +1,166 @@
using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB.LogProcess;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
//using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.Platform.Common.Util;
using SystemX.Net.Platform.Common.ExtensionMethods;
using SystemX.Net.Middleware.Log.Commons;
using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private void Chktimer_Tick(object sender, EventArgs e)
{
Chktimer.Enabled = false;
if (MiddlewareLogStartState == false)
{
ConsoleUtil.ConsoleVisibleControl();
//The program is automatically terminated.
MessageBox.Show("Server information could not be retrieved. Check the console error text.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Error);
// TODO : FTP ALIS
this.Close();
}
}
private void UItimer_Tick(object sender, EventArgs e)
{
if (m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] == false)
{
m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = true;
if (bTryBulkInsertBuffer)
{
if (buttonBulkInsertStart.BackColor != Color.Yellow)
buttonBulkInsertStart.BackColor = Color.Yellow;
}
else
{
if (buttonBulkInsertStart.BackColor != Color.Silver)
buttonBulkInsertStart.BackColor = Color.Silver;
}
labelBulkCntInfo1.Text = nBulkLogCount.ToString();
labelBulkCntInfo2.Text = nBulkShortTermCount.ToString();
labelBulkCntInfo3.Text = nBulkLongTermCount.ToString();
labelBulkTime.Text = nBulkTimeValue.ToString();
labelFTPTime.Text = nFTPTimeValue.ToString();
labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]";
labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]";
labelShortTermSummaryTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]";
labelShortTermLogTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]";
labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]";
if (bDatabaseConnResult)
{
if (panelDBMain2.BackColor != Color.LimeGreen) panelDBMain2.BackColor = Color.LimeGreen;
if (panelDBShortTerm2.BackColor != Color.LimeGreen) panelDBShortTerm2.BackColor = Color.LimeGreen;
if (panelDBLongTerm2.BackColor != Color.LimeGreen) panelDBLongTerm2.BackColor = Color.LimeGreen;
if (buttonDbConnect.Visible) buttonDbConnect.Visible = false;
}
else
{
if (panelDBMain2.BackColor != Color.Red) panelDBMain2.BackColor = Color.Red;
if (panelDBShortTerm2.BackColor != Color.Red) panelDBShortTerm2.BackColor = Color.Red;
if (panelDBLongTerm2.BackColor != Color.Red) panelDBLongTerm2.BackColor = Color.Red;
if (buttonDbConnect.Visible == false) buttonDbConnect.Visible = true;
}
if (progressBarProgram.Value + 20 <= 100)
progressBarProgram.Value += 20;
else
progressBarProgram.Value = 0;
int nPanelHeight = panelMain.Height / 2;
panelRecv.Height = nPanelHeight - 20;
panelProcess.Height = nPanelHeight - 20;
int n1 = richTextBoxRecv.Lines.Count();
int n2 = richTextBoxProcess.Lines.Count();
if (richTextBoxRecv.Lines.Count() > 8192)
richTextBoxRecv.Clear();
if (richTextBoxProcess.Lines.Count() > 8192)
richTextBoxProcess.Clear();
if (LogDataRecvText.Count > 0)
{
StringBuilder sb = null;
if (LogDataRecvText.TryDequeue(out sb))
{
//richTextBoxRecv.SuspendLayout();
richTextBoxRecv.AppendText(sb.ToString());
richTextBoxRecv.ScrollToCaret();
//richTextBoxRecv.ResumeLayout();
}
}
if (LogDataProcessText.Count > 0)
{
StringBuilder sb = null;
if (LogDataProcessText.TryDequeue(out sb))
{
//richTextBoxProcess.SuspendLayout();
richTextBoxProcess.AppendText(sb.ToString());
richTextBoxProcess.ScrollToCaret();
//richTextBoxProcess.ResumeLayout();
}
}
m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = false;
}
}
private string MakeInfoConnectProcessText(int nPos, int nCommandPort, int nStreamPort)
{
string strSetProcessInfo = nPos.ToString("D2") + ":" +
nCommandPort.ToString("D4") + ":" +
nStreamPort.ToString("D4");
return strSetProcessInfo;
}
}
}

View File

@ -0,0 +1,343 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3658FBE5-9A84-4F76-8E19-867DB9F4484D}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SystemX.Net.MiddlewareUI.Log</RootNamespace>
<AssemblyName>SystemX.Net.MiddlewareUI.Log</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>AppIcon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Common.Logging, Version=3.4.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
<HintPath>..\packages\Common.Logging.3.4.1\lib\net40\Common.Logging.dll</HintPath>
</Reference>
<Reference Include="Common.Logging.Core, Version=3.4.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
<HintPath>..\packages\Common.Logging.Core.3.4.1\lib\net40\Common.Logging.Core.dll</HintPath>
</Reference>
<Reference Include="CpApplciationIntrf">
<HintPath>..\..\Output.SystemX\CpApplciationIntrf.dll</HintPath>
</Reference>
<Reference Include="CpApplication">
<HintPath>..\..\Output.SystemX\CpApplication.dll</HintPath>
</Reference>
<Reference Include="CpCommon">
<HintPath>..\..\Output.SystemX\CpCommon.dll</HintPath>
</Reference>
<Reference Include="DevExpress.Data.Desktop.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Data.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Utils.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraBars.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraEditors.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="log4net">
<HintPath>..\..\Output.SystemX\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.HashCode, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.SqlClient, Version=1.13.20136.2, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.SqlClient.1.1.3\lib\net46\Microsoft.Data.SqlClient.dll</HintPath>
</Reference>
<Reference Include="Microsoft.EntityFrameworkCore, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll</HintPath>
</Reference>
<Reference Include="Microsoft.EntityFrameworkCore.Abstractions, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.EntityFrameworkCore.Relational, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.Relational.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll</HintPath>
</Reference>
<Reference Include="Microsoft.EntityFrameworkCore.SqlServer, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.SqlServer.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.SqlServer.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Caching.Abstractions, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Caching.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Caching.Memory, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Caching.Memory.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Binder, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Binder.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.32\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Options, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Options.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Primitives, Version=3.1.32.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Primitives.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Identity.Client, Version=3.0.8.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Identity.Client.3.0.8\lib\net45\Microsoft.Identity.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Logging, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IdentityModel.Protocols.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Tokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Data.Common, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.IdentityModel" />
<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="SystemX.Net.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Output.SystemX\SystemX.Net.Platform.dll</HintPath>
</Reference>
<Reference Include="SystemX.XEFCore">
<HintPath>..\..\Output.SystemX\SystemX.XEFCore.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="DeleteProc.cs" />
<Compile Include="Sub\CPXV2_CpLogProcess.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\UI.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\Function.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\Query.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\FileProcess.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\Stream-LogProcess.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sub\Command-LogScan.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Commons.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SystemX.Net.DB.Log\ConnInfo.cs" />
<Compile Include="SystemX.Net.DB.Log\ConnManager.cs" />
<Compile Include="SystemX.Net.DB.Log\DBType\DBTMSSQL - Query.cs" />
<Compile Include="SystemX.Net.DB.Log\DBType\DBTMSSQL.cs" />
<Compile Include="SystemX.Net.DB.Log\DBType\IDBControl.cs" />
<Compile Include="SystemX.Net.DB.Log\DBType\MariaDB.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\licenses.licx" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="App.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="Resources\ALIS.PNG" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Bubble_16x16.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Bubble_32x32.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Cancel_16x16.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Cancel_32x32.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Database_16x16.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Database_32x32.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Publish_16x16.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Publish_32x32.png" />
</ItemGroup>
<ItemGroup>
<Content Include="ALIS ICON.ico" />
<Content Include="AppIcon.ico" />
<None Include="Resources\AppIcon1.ico" />
<None Include="Resources\AppIcon.ico" />
<None Include="Resources\CI.png" />
<None Include="Resources\Kefico CI.PNG" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<Import Project="..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets" Condition="Exists('..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Common.Logging" version="3.4.1" targetFramework="net452" />
<package id="Common.Logging.Core" version="3.4.1" targetFramework="net452" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.1" targetFramework="net48" />
<package id="Microsoft.Bcl.HashCode" version="1.1.1" targetFramework="net48" />
<package id="Microsoft.CSharp" version="4.0.1" targetFramework="net452" />
<package id="Microsoft.Data.SqlClient" version="1.1.3" targetFramework="net48" />
<package id="Microsoft.Data.SqlClient.SNI" version="1.1.0" targetFramework="net48" />
<package id="Microsoft.EntityFrameworkCore" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.EntityFrameworkCore.Abstractions" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.EntityFrameworkCore.Analyzers" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.EntityFrameworkCore.Relational" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.EntityFrameworkCore.SqlServer" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Caching.Abstractions" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Caching.Memory" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Configuration" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Configuration.Abstractions" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Configuration.Binder" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.DependencyInjection" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Logging" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Options" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Extensions.Primitives" version="3.1.32" targetFramework="net48" />
<package id="Microsoft.Identity.Client" version="3.0.8" targetFramework="net48" />
<package id="Microsoft.IdentityModel.JsonWebTokens" version="5.5.0" targetFramework="net48" />
<package id="Microsoft.IdentityModel.Logging" version="5.5.0" targetFramework="net48" />
<package id="Microsoft.IdentityModel.Protocols" version="5.5.0" targetFramework="net48" />
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.5.0" targetFramework="net48" />
<package id="Microsoft.IdentityModel.Tokens" version="5.5.0" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net452" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Collections.Immutable" version="1.7.1" targetFramework="net48" />
<package id="System.ComponentModel.Annotations" version="4.7.0" targetFramework="net48" />
<package id="System.Data.Common" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.DiagnosticSource" version="4.7.1" targetFramework="net48" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.5.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="Win32.TokenPrivileges" version="1.0.19073.2" targetFramework="net452" />
</packages>