Commit 9bd03d45 by zonevg

init

parents
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
build/
bld/
[Bb]in/
[Oo]bj/
# Roslyn cache directories
*.ide/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
#NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding addin-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
## TODO: Comment the next line if you want to checkin your
## web deploy settings but do note that will include unencrypted
## passwords
*.pubxml
# NuGet Packages
packages/*
*.nupkg
## TODO: If the tool you use requires repositories.config
## uncomment the next line
#!packages/repositories.config
# Enable "build/" folder in the NuGet Packages folder since
# NuGet packages use it for MSBuild targets.
# This line needs to be after the ignore of the build folder
# (and the packages folder if the line above has been uncommented)
!packages/build/
# Windows Azure Build Output
csx/
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
/.vs
/JmpModel/CodeTemplates
/JunmpPoliceStation/appsettings.json
/JunmpPoliceStation/internal-nlog.txt
/JunmpPoliceStation/JunmpPoliceStation.xml
using System;
namespace JmpCommon
{
public class Analyzingepc
{
/*---------以下为1.0、2.0版本公共参数-----------*/
public byte Header; // 标头(8bits): JY物资专用标头 0x11(00010001b)
public byte IssuerId; // 发行机构标识符(6bits):GA组织机构: 0x01(000001b) 国家组织机构:0x02(000010b)
public string OrganizationCode; // 组织机构代码(54bits):JY物资生产厂商使用GA或国家组织机构代码, 英文字母及数字的每一个字符转换为六位二进制
public byte WzdmLen; // 物资代码长度(4bits): 指定物资代码的长度(N*8bits), 此处为0x7
public UInt64 Wzdm; // 物资代码(56bits): 使用警用物资编目数据的物资代码,按十进制转换成十六进制存储
public UInt64 Hxdm;
public byte SerialLen; // 序列号长度(4bits): 指定序列号长度(N*8bits), 此处为0xD
public byte Ver; // 版本号(8bits): 0x01
public byte TagType; // 标签类型(8bits): 0x00 件标 0x01 箱标
public byte PackingType; // 包装类型(4bits): 0x1 单品, 0x2 外包装, 0x3 内包装, 0xF 零头配箱
public UInt32 ProductionDate; // 生产日期(24bits): 0x161201
public byte ExpiryDate; // 有效期值(6bits): 0-63
public byte ExpiryDateUnit; // 有效期时间单位(2bits): 1:01b-日, 2:10b-月, 3:11b-年
public byte SubPackageNum; // 下级包装内数量(8bits):最大255
public UInt16 WzCount; // 包装数量(12bits): MAX:4095, 每箱内产品总数
public UInt32 BoxNo; // 包装箱序列号(20bits): MAX:65535 redis设置保存
public UInt16 NoInBox; // 箱内序列号(12bits): 每箱内产品序号, MAX4095
/*---------以下为2.0版本新增参数,以下参数用于替换生产日期之后的字段,确保真唯一-----------*/
public ulong TimeSpan { get; set; } //当前日期时间戳,精确到毫秒
public byte MachineNum { get; set; } //服务器识别码(4bits),用于区分测试服务器与正式服务器生成的数据,实际1b就够了,其他3b做保留
}
public static class EpcConvert
{
private readonly static string strKeyWords = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 无源标签6位字段对应表
/// <summary>
/// 此方法用于将普通字符串转换成16进制的字符串。
/// </summary>
/// <param name="_str">要转换的字符串。</param>
/// <returns></returns>
public static string StringToHex16String(string _str)
{
//将字符串转换成字节数组。
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(_str);
//定义一个string类型的变量,用于存储转换后的值。
string result = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
//将每一个字节数组转换成16进制的字符串,以空格相隔开。
result += Convert.ToString(buffer[i], 16) + " ";
}
return result;
}
/// <summary>
/// 此方法用于将16进制的字节数组转换成16进制的字符串。
/// </summary>
/// <param name="_hex16Byte">要转换的16进制的字节数组。</param>
/// <returns></returns>
public static string Hex16ByteToHex16String(byte[] _hex16Byte)
{
string result = string.Empty;
//如果字节数组不为空。
if (_hex16Byte != null)
{
for (int i = 0; i < _hex16Byte.Length; i++)
{
//将每一个字节数组转换成16进制string类型的字符串,用空格分隔开。
result += _hex16Byte[i].ToString("X2") + " ";
}
}
return result;
}
public static byte[] ToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
{
hexString = hexString + " ";
}
byte[] buffer = new byte[hexString.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 0x10);
}
return buffer;
}
/// <summary>
/// 生成1.0EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static byte[] Epc1Gen(Analyzingepc epc)
{
byte[] buf = new byte[40];
int pos = 0;
SetData(ref buf, pos, 8, epc.Header);
pos += 8;
SetData(ref buf, pos, 6, epc.IssuerId);
pos += 6;
SetData(ref buf, pos, 54, OrganizationCodeTo6Bin(epc.OrganizationCode.ToUpper()));
pos += 54;
SetData(ref buf, pos, 4, epc.WzdmLen);
pos += 4;
var wzlen = ((epc.WzdmLen - 1) % 8) * 8;
SetData(ref buf, pos, wzlen, epc.Wzdm); // 物资代码暂时定义最长为64bits
pos += wzlen;
SetData(ref buf, pos, 8, epc.Hxdm); // 物资代码暂时定义最长为64bits
pos += 8;
SetData(ref buf, pos, 4, epc.SerialLen);
pos += 4;
SetData(ref buf, pos, 8, epc.Ver);
pos += 8;
SetData(ref buf, pos, 8, epc.TagType);
pos += 8;
SetData(ref buf, pos, 4, epc.PackingType);
pos += 4;
SetData(ref buf, pos, 24, epc.ProductionDate);
pos += 24;
SetData(ref buf, pos, 6, epc.ExpiryDate);
pos += 6;
SetData(ref buf, pos, 2, epc.ExpiryDateUnit);
pos += 2;
SetData(ref buf, pos, 8, epc.SubPackageNum);
pos += 8;
SetData(ref buf, pos, 12, epc.WzCount);
pos += 12;
SetData(ref buf, pos, 20, epc.BoxNo);
pos += 20;
SetData(ref buf, pos, 12, epc.NoInBox);
pos += 12;
// 双字节对齐, 剩余保留区
if (pos % 16 != 0)
{
pos += 16 - pos % 16;
}
// 数据体长度
var len = pos / 8;
var crc = Crc16(buf, len);
SetData(ref buf, pos, 16, crc);
byte[] rtn = new byte[len + 2];
Array.Copy(buf, rtn, len + 2);
return rtn;
}
/// <summary>
/// 生成2.0EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static byte[] Epc2Gen(Analyzingepc epc)
{
byte[] buf = new byte[40];
int pos = 0;
SetData(ref buf, pos, 8, epc.Header);
pos += 8;
SetData(ref buf, pos, 6, epc.IssuerId);
pos += 6;
SetData(ref buf, pos, 54, OrganizationCodeTo6Bin(epc.OrganizationCode.ToUpper()));
pos += 54;
SetData(ref buf, pos, 4, epc.WzdmLen);
pos += 4;
var wzlen = ((epc.WzdmLen - 1) % 8) * 8;
SetData(ref buf, pos, wzlen, epc.Wzdm); // 物资代码暂时定义最长为64bits
pos += wzlen;
SetData(ref buf, pos, 8, epc.Hxdm); // 物资代码暂时定义最长为64bits
pos += 8;
SetData(ref buf, pos, 4, epc.SerialLen);
pos += 4;
/*----------------2.0版本字段-------------*/
SetData(ref buf, pos, 8, epc.Ver);
pos += 8;
SetData(ref buf, pos, 24, epc.ProductionDate);
pos += 24;
SetData(ref buf, pos, 6, epc.ExpiryDate);
pos += 6;
SetData(ref buf, pos, 2, epc.ExpiryDateUnit);
pos += 2;
SetData(ref buf, pos, 48, epc.TimeSpan);
pos += 48;
SetData(ref buf, pos, 12, epc.NoInBox);
pos += 12;
SetData(ref buf, pos, 4, epc.MachineNum);
// 双字节对齐, 剩余保留区
if (pos % 16 != 0)
{
pos += 16 - pos % 16;
}
// 数据体长度
var len = pos / 8;
var crc = Crc16(buf, len);
SetData(ref buf, pos, 16, crc);
byte[] rtn = new byte[len + 2];
Array.Copy(buf, rtn, len + 2);
return rtn;
}
/// <summary>
/// 解析EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static Analyzingepc EpcAnlysing(byte[] epc)
{
// CRC 校验
var crc_chk = Crc16(epc, epc.Length - 2);
var crc_src = epc[epc.Length - 2] << 8 | epc[epc.Length - 1];
if (crc_src != crc_chk)
{
throw new Exception("CRC校验失败");
}
// 数据解析
Analyzingepc rtn = new Analyzingepc();
int pos = 0;
rtn.Header = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.IssuerId = (byte)GetData(epc, pos, 6);
pos += 6;
var oc = GetData(epc, pos, 54);
rtn.OrganizationCode = OrganizationCodeToStr(oc);
pos += 54;
rtn.WzdmLen = (byte)(GetData(epc, pos, 4));
pos += 4;
var wzlen = ((rtn.WzdmLen - 1) % 8) * 8;
rtn.Wzdm = GetData(epc, pos, wzlen);
pos += wzlen;
rtn.Hxdm = GetData(epc, pos, 8);
pos += 8;
rtn.SerialLen = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.Ver = (byte)GetData(epc, pos, 8);
pos += 8;
//2.0版本解析
if (rtn.Ver == 0x02)
{
rtn.ProductionDate = (byte)GetData(epc, pos, 24);
pos += 24;
rtn.ExpiryDate = (byte)GetData(epc, pos, 6);
pos += 6;
rtn.ExpiryDateUnit = (byte)GetData(epc, pos, 2);
pos += 2;
rtn.TimeSpan = (byte)GetData(epc, pos, 48);
pos += 48;
rtn.NoInBox = (byte)GetData(epc, pos, 12);
pos += 12;
rtn.MachineNum = (byte)GetData(epc, pos, 4);
pos += 4;
}
else
{
rtn.TagType = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.PackingType = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.ProductionDate = (UInt32)GetData(epc, pos, 24);
pos += 24;
rtn.ExpiryDate = (byte)GetData(epc, pos, 6);
pos += 6;
rtn.ExpiryDateUnit = (byte)GetData(epc, pos, 2);
pos += 2;
rtn.SubPackageNum = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.WzCount = (UInt16)GetData(epc, pos, 12);
pos += 12;
rtn.BoxNo = (UInt32)GetData(epc, pos, 20);
pos += 20;
rtn.NoInBox = (UInt16)GetData(epc, pos, 12);
pos += 12;
}
return rtn;
}
/// <summary>
/// 向目标数组指定位置插入数据
/// </summary>
/// <param name="data">待操作数组</param>
/// <param name="pos">起始位置</param>
/// <param name="len">写入长度bits</param>
/// <param name="value">写入的值</param>
private static void SetData(ref byte[] data, int pos, int len, UInt64 value)
{
int p = pos;
while (--len >= 0)
{
var bitPos = 7 - p % 8;
data[p++ / 8] |= (byte)(((value >> len) & 1) << bitPos);
}
}
/// <summary>
/// 从目标数组获取成员变量
/// </summary>
/// <param name="data"></param>
/// <param name="pos"></param>
/// <param name="len"></param>
/// <returns></returns>
private static UInt64 GetData(byte[] data, int pos, int len)
{
UInt64 rtn = 0;
int p = pos;
while (len-- > 0)
{
var bitPos = 7 - p % 8;
rtn <<= 1;
rtn |= (byte)((data[p++ / 8] >> bitPos) & 1);
}
return rtn;
}
/// <summary>
/// 转换成字符串
/// </summary>
/// <param name="icode"></param>
/// <returns></returns>
private static string OrganizationCodeToStr(UInt64 icode)
{
string code = "";
for (int i = 0; i < 9; i++)
{
var v = (byte)((icode >> (i * 6)) & 0x3f);
code = strKeyWords[v] + code;
}
return code;
}
/// <summary>
/// 生成十六进制组织代码, 6Bin
/// </summary>
/// <param name="code"></param>
/// <returns>0 失败, 其它:正常的组织代码编号</returns>
private static UInt64 OrganizationCodeTo6Bin(string code)
{
UInt64 iCode = 0;
if (code.Length == 9)
{
for (int i = 0; i < code.Length; i++)
{
var index = strKeyWords.IndexOf(code[i]);
if (index == -1)
{
throw new Exception("输入字符非法!");
}
iCode <<= 6;
iCode |= (byte)index;
}
}
else
{
throw new Exception("输入长度非法!");
}
return iCode;
}
/// <summary>
/// CRC运算
/// </summary>
/// <param name="data"></param>
/// <param name="len">必须是偶数</param>
/// <returns></returns>
public static UInt16 Crc16(byte[] data, int lenth)
{
ushort crc = 0x8791;
for (int i = 0; i < lenth; ++i)
{
ushort temp = 0;
ushort a = (ushort)(((crc >> 8) ^ (0xff & data[i])) << 8);
for (int j = 0; j < 8; ++j)
{
if (((temp ^ a) & 0x8000) != 0)
{
temp = (ushort)((temp << 1) ^ 0x1021);
}
else
{
temp <<= 1;
}
a <<= 1;
}
crc = (ushort)((crc << 8) ^ temp);
}
return crc;
}
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public class BaseCamera : ICamera
{
public string Address { get; protected set; }
public string UserName { get; protected set; }
public string UserPwd { get; protected set; }
public int Port { get; protected set; }
public int Channel { get; protected set; }
public virtual bool CaptureFile(string fileName)
{
return default;
}
public virtual byte[] CaptureBuffer(string fileName="")
{
return default;
}
public virtual bool Initial(string addr, int port, int channel, string userName, string userPwd)
{
Address = addr;
Port = port;
UserName = userName;
UserPwd = userPwd;
Channel = channel;
return true;
}
public virtual bool Login()
{
return default;
}
public virtual bool Logout()
{
return default;
}
public virtual void Cleanup() { }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public static class ConstStr
{
public static string SNAP_PATH = "Snap";
public static string UPLOAD_PATH = $"/SnapPic/Channel/";
}
}
using NetSDKCS;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public class DahuaCamera : BaseCamera
{
private NET_DEVICEINFO_Ex deviceInfo;
private DahuaCameraControlSettings settings = new DahuaCameraControlSettings();
private IntPtr Hwnd { get; set; }
public DahuaCamera()
{
settings.fileEvent = new ManualResetEvent(true);
settings.bufferEvent = new ManualResetEvent(true);
DahuaCameraControl.Init();
}
public override bool Login()
{
if (string.IsNullOrEmpty(Address))
{
Log.WorkLog("视频设备地址不正确");
return false;
}
else if (string.IsNullOrEmpty(UserName))
{
Log.WorkLog("视频设备登录用户不正确");
return false;
}
else if (string.IsNullOrEmpty(UserPwd))
{
Log.WorkLog("视频设备登录密码不正确");
return false;
}
else if (Port <= 0)
{
Log.WorkLog("视频设备端口不正确");
return false;
}
else if (Channel < 0)
{
Log.WorkLog("视频设备通道号不正确");
return false;
}
else
{
return test();
}
}
public bool test()
{
Hwnd = DahuaCameraControl.LoginWithHighLevelSecurity(settings, Address, (ushort)Port, UserName, UserPwd, EM_LOGIN_SPAC_CAP_TYPE.TCP, IntPtr.Zero, ref deviceInfo);
if (Hwnd == IntPtr.Zero)
{
Log.WorkLog($"视频设备登录失败,错误代码:{DahuaCameraControl.GetLastError()}");
return false;
}
else
{
return true;
}
}
public override bool Logout()
{
if (Hwnd == IntPtr.Zero)
{
return true;
}
else
{
var res = DahuaCameraControl.Logout((IntPtr)Hwnd);
Hwnd = IntPtr.Zero;
return res;
}
}
public override bool CaptureFile(string fileName)
{
try
{
if (Hwnd == IntPtr.Zero)
{
return false;
}
else
{
settings.fileName = fileName;
settings.fileEvent.Reset();
NET_SNAP_PARAMS options = new NET_SNAP_PARAMS();
options.Channel = (uint)Channel;
options.Quality = 6;
options.ImageSize = 2;
options.mode = 0;
options.InterSnap = 0;
options.CmdSerial = 1;
bool ret = DahuaCameraControl.SnapPictureEx((IntPtr)Hwnd, options, IntPtr.Zero);
if (!ret)
{
return false;
}
else
{
settings.fileEvent.WaitOne(15000);
return fileName == string.Empty;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
public override byte[] CaptureBuffer(string fileName = "")
{
try
{
if (Hwnd == IntPtr.Zero)
{
return default;
}
else
{
settings.isBuffer = true;
settings.bufferEvent.Reset();
NET_SNAP_PARAMS options = new NET_SNAP_PARAMS();
options.Channel = (uint)Channel;
options.Quality = 6;
options.ImageSize = 2;
options.mode = 0;
options.InterSnap = 0;
options.CmdSerial = 1;
bool ret = DahuaCameraControl.SnapPictureEx((IntPtr)Hwnd, options, IntPtr.Zero);
if (!ret)
{
return default;
}
else
{
settings.bufferEvent.WaitOne(15000);
return settings.fileBuffer;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
finally
{
settings.fileBuffer = default;
settings.isBuffer = false;
}
}
public override void Cleanup()
{
Logout();
DahuaCameraControl.Cleanup();
}
}
}
using NetSDKCS;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public static class DahuaCameraControl
{
private static fSnapRevCallBack m_SnapRevCallBack;
private static fDisConnectCallBack m_DisConnectCallBack;
private static fHaveReConnectCallBack m_ReConnectCallBack;
private static bool _isInit = false;
private static readonly Dictionary<IntPtr, DahuaCameraControlSettings> Dictionary = new Dictionary<IntPtr, DahuaCameraControlSettings>();
public static void Init()
{
if (!_isInit)
{
_isInit = true;
m_SnapRevCallBack = new fSnapRevCallBack(SnapRevCallBack);
m_DisConnectCallBack = new fDisConnectCallBack(DisConnectCallBack);
m_ReConnectCallBack = new fHaveReConnectCallBack(ReConnectCallBack);
NETClient.Init(m_DisConnectCallBack, IntPtr.Zero, default);
NETClient.SetAutoReconnect(m_ReConnectCallBack, IntPtr.Zero);
NETClient.SetSnapRevCallBack(m_SnapRevCallBack, IntPtr.Zero);
}
}
private static void DisConnectCallBack(IntPtr lLoginID, IntPtr pchDVRIP, int nDVRPort, IntPtr dwUser)
{
}
private static void ReConnectCallBack(IntPtr lLoginID, IntPtr pchDVRIP, int nDVRPort, IntPtr dwUser)
{
}
public static void SnapRevCallBack(IntPtr lLoginID, IntPtr pBuf, uint RevLen, uint EncodeType, uint CmdSerial, IntPtr dwUser)
{
string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + ConstStr.SNAP_PATH + "\\" + DateTime.Now.ToString("yyyyMMdd");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (EncodeType == 10) //.jpg
{
if (Dictionary.TryGetValue(lLoginID, out var settings))
{
if (settings.isBuffer)
{
byte[] buffer = new byte[RevLen];
Marshal.Copy(pBuf, buffer, 0, (int)RevLen);
settings.fileBuffer = buffer;
settings.bufferEvent.Set();
}
else
{
string filePath = $"{path}\\{settings.fileName}.jpg";
byte[] buffer = new byte[RevLen];
Marshal.Copy(pBuf, buffer, 0, (int)RevLen);
using (FileStream stream = new FileStream(filePath, FileMode.OpenOrCreate))
{
stream.Write(buffer, 0, (int)RevLen);
stream.Flush();
stream.Dispose();
}
settings.fileEvent.Set();
settings.fileName = string.Empty;
}
}
}
}
public static bool SnapPictureEx(IntPtr lLoginID, NET_SNAP_PARAMS par, IntPtr reserved)
{
return NETClient.SnapPictureEx(lLoginID, par, reserved);
}
public static IntPtr LoginWithHighLevelSecurity(DahuaCameraControlSettings settings, string pchDVRIP, ushort wDVRPort, string pchUserName, string pchPassword, EM_LOGIN_SPAC_CAP_TYPE emSpecCap, IntPtr pCapParam, ref NET_DEVICEINFO_Ex deviceInfo)
{
var res = NETClient.LoginWithHighLevelSecurity(pchDVRIP, wDVRPort, pchUserName, pchPassword, emSpecCap, pCapParam, ref deviceInfo);
if (res != IntPtr.Zero)
{
if (Dictionary.ContainsKey(res))
{
Dictionary.Remove(res);
}
Dictionary.Add(res, settings);
}
return res;
}
public static bool Logout(IntPtr lLoginID)
{
Dictionary.Remove(lLoginID);
return NETClient.Logout(lLoginID);
}
public static string GetLastError()
{
return NETClient.GetLastError();
}
public static void Cleanup()
{
NETClient.Cleanup();
}
}
}
using NetSDKCS;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public class DahuaCameraControlSettings
{
public uint Channel { get; set; }
public uint Quality { get; set; }
public uint ImageSize { get; set; }
public uint mode { get; set; }
public uint InterSnap { get; set; }
public uint CmdSerial { get; set; }
public bool isBuffer { get; set; }
public string fileName { get; set; }
public byte[] fileBuffer { get; set; }
public ManualResetEvent fileEvent { get; set; }
public ManualResetEvent bufferEvent { get; set; }
}
}
using NetSDKCS;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public class HikCamera : BaseCamera
{
private int Hwnd { get; set; }
public CHCNetSDK.NET_DVR_IPCHANINFO struChanInfo;
private CHCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo;
public CHCNetSDK.NET_DVR_IPPARACFG_V40 deviceCfg;
public CHCNetSDK.NET_DVR_PU_STREAM_URL struStreamURL;
public CHCNetSDK.NET_DVR_IPCHANINFO_V40 struChanInfoV40;
private int[] channelNums = new int[96];
private uint channelTotalNum = 0;
private uint dChannelTotalNum = 0;
public HikCamera()
{
}
public override bool Login()
{
if (string.IsNullOrEmpty(Address))
{
Log.WorkLog("视频设备地址不正确");
return false;
}
else if (string.IsNullOrEmpty(UserName))
{
Log.WorkLog("视频设备登录用户不正确");
return false;
}
else if (string.IsNullOrEmpty(UserPwd))
{
Log.WorkLog("视频设备登录密码不正确");
return false;
}
else if (Port <= 0)
{
Log.WorkLog("视频设备端口不正确");
return false;
}
else if (Channel < 0)
{
Log.WorkLog("视频设备通道号不正确");
return false;
}
else
{
return HikLogin();
}
}
public override bool Logout()
{
if (Hwnd > 0)
{
return true;
}
else
{
var res = CHCNetSDK.NET_DVR_Logout(Hwnd);
if (!res)
{ }
Hwnd = 0;
return res;
}
}
public override bool CaptureFile(string fileName)
{
if (Hwnd < 0)
{
return false;
}
else
{
CHCNetSDK.NET_DVR_JPEGPARA jpegOptions = new CHCNetSDK.NET_DVR_JPEGPARA();
jpegOptions.wPicQuality = 0; //图像质量 Image quality
jpegOptions.wPicSize = 0xff; //抓图分辨率 Picture size: 0xff-Auto(使用当前码流分辨率)
//抓图分辨率需要设备支持,更多取值请参考SDK文档
string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + ConstStr.SNAP_PATH + "\\" + DateTime.Now.ToString("yyyyMMdd");
if (!Directory.Exists(path)) { Directory.CreateDirectory(path); }
//JPEG抓图保存成文件
string sJpegPicFileName = $"{path}\\{fileName}.jpg";//图片保存路径和文件名
if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(Hwnd, channelNums[Channel], ref jpegOptions, sJpegPicFileName))
{
var _errCode = CHCNetSDK.NET_DVR_GetLastError();
Log.WorkLog($"抓屏失败,错误代码:{_errCode}");
return false;
}
else
{
return true;
}
}
}
public override byte[] CaptureBuffer(string fileName="")
{
CHCNetSDK.NET_DVR_JPEGPARA jpegOptions = new CHCNetSDK.NET_DVR_JPEGPARA();
jpegOptions.wPicQuality = 0; //图像质量 Image quality
jpegOptions.wPicSize = 0xff; //抓图分辨率 Picture size: 0xff-Auto(使用当前码流分辨率)
//JEPG抓图,数据保存在缓冲区中 Capture a JPEG picture and save in the buffer
uint buffSize = 1048576; //1M,缓冲区大小需要不小于一张图片数据的大小 The buffer size should not be less than the picture size
byte[] jpegBuffer = new byte[buffSize];
uint dwSizeReturned = 0;
if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(Hwnd, channelNums[Channel], ref jpegOptions, jpegBuffer, buffSize, ref dwSizeReturned))
{
var _errCode = CHCNetSDK.NET_DVR_GetLastError();
Log.WorkLog($"抓屏失败,错误代码:{_errCode}");
return default;
}
else
{
//将缓冲区里的JPEG图片数据写入文件 save the data into a file
//string str = "buffertest.jpg";
//FileStream fs = new FileStream(str, FileMode.Create);
//int iLen = (int)dwSizeReturned;
//fs.Write(jpegBuffer, 0, iLen);
//fs.Close();
var buffer = new byte[dwSizeReturned];
Array.Copy(jpegBuffer, 0, buffer, 0, dwSizeReturned);
return buffer;
}
}
private bool HikLogin()
{
//登录设备 Login the device
Hwnd = CHCNetSDK.NET_DVR_Login_V30(Address, Port, UserName, UserPwd, ref deviceInfo);
if (Hwnd < 0)
{
var _errCode = CHCNetSDK.NET_DVR_GetLastError();
Log.WorkLog($"视频设备登录失败,错误代码:{_errCode}");
return false;
}
else
{
//登录成功
channelTotalNum = (uint)deviceInfo.byChanNum;
dChannelTotalNum = (uint)deviceInfo.byIPChanNum + 256 * (uint)deviceInfo.byHighDChanNum;
if (dChannelTotalNum > 0)
{
InitialChannel();
}
else
{
for (int i = 0; i < channelTotalNum; i++)
{
channelNums[i] = i + (int)deviceInfo.byStartChan;
}
}
return true;
}
}
private void InitialChannel()
{
uint dwSize = (uint)Marshal.SizeOf(deviceCfg);
IntPtr tmpCfg = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(deviceCfg, tmpCfg, false);
uint dwReturn = 0;
int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
if (!CHCNetSDK.NET_DVR_GetDVRConfig(Hwnd, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, tmpCfg, dwSize, ref dwReturn))
{
var _errCode = CHCNetSDK.NET_DVR_GetLastError(); //System.Windows.MessageBox.Show(str1);
Log.WorkLog($"视频通道初始化失败,错误代码:{_errCode}");
}
else
{
deviceCfg = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(tmpCfg, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
for (int i = 0; i < channelTotalNum; i++)
{
//ListAnalogChannel(i + 1, deviceCfg.byAnalogChanEnable[i]);
channelNums[i] = i + (int)deviceInfo.byStartChan;
}
byte byStreamType = 0;
uint iDChanNum = 64;
if (dChannelTotalNum < 64)
{
iDChanNum = dChannelTotalNum; //如果设备IP通道小于64路,按实际路数获取
}
for (int i = 0; i < iDChanNum; i++)
{
channelNums[i + channelTotalNum] = i + (int)deviceCfg.dwStartDChan;
byStreamType = deviceCfg.struStreamMode[i].byGetStreamType;
dwSize = (uint)Marshal.SizeOf(deviceCfg.struStreamMode[i].uGetStream);
switch (byStreamType)
{
//目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly
case 0:
IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(deviceCfg.struStreamMode[i].uGetStream, ptrChanInfo, false);
struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
//列出IP通道 List the IP channel
//ListIPChannel(i + 1, struChanInfo.byEnable, struChanInfo.byIPID);
//iIPDevID[i] = struChanInfo.byIPID + struChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1;
Marshal.FreeHGlobal(ptrChanInfo);
break;
case 4:
IntPtr ptrStreamURL = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(deviceCfg.struStreamMode[i].uGetStream, ptrStreamURL, false);
struStreamURL = (CHCNetSDK.NET_DVR_PU_STREAM_URL)Marshal.PtrToStructure(ptrStreamURL, typeof(CHCNetSDK.NET_DVR_PU_STREAM_URL));
//列出IP通道 List the IP channel
//ListIPChannel(i + 1, struStreamURL.byEnable, struStreamURL.wIPID);
//iIPDevID[i] = struStreamURL.wIPID - iGroupNo * 64 - 1;
Marshal.FreeHGlobal(ptrStreamURL);
break;
case 6:
IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(deviceCfg.struStreamMode[i].uGetStream, ptrChanInfoV40, false);
struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));
//列出IP通道 List the IP channel
//ListIPChannel(i + 1, m_struChanInfoV40.byEnable, m_struChanInfoV40.wIPID);
//iIPDevID[i] = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1;
Marshal.FreeHGlobal(ptrChanInfoV40);
break;
default:
break;
}
}
}
Marshal.FreeHGlobal(tmpCfg);
}
public override void Cleanup()
{
base.Cleanup();
Logout();
CHCNetSDK.NET_DVR_Cleanup();
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public interface ICamera
{
bool Initial(string addr,int port, int channel, string userName,string userPwd);
bool Login();
bool Logout();
bool CaptureFile(string fileName);
byte[] CaptureBuffer(string fileName="");
void Cleanup();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Camera
{
public class ResponeUpload
{
public int code { get; set; }
public string msg { get; set; }
public int timestamp { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class HotKey
{
//如果函数执行成功,返回值不为0。
//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID(不能与其它ID重复)
KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
int vk //定义热键的内容
);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd, //要取消热键的窗口的句柄
int id //要取消热键的ID
);
//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}
using JmpCommon.Camera;
using JmpCommon.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json.Linq;
namespace JmpCommon
{
/// <summary>
/// 接口调用类
/// </summary>
public class HttpHelper
{
public static string GetHttpRqst(string strUrl, string json = "")
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Method = "POST";
if (!string.IsNullOrEmpty(json))
{
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(json);
request.ContentLength = data.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
response.Close();
return retString;
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n" + strUrl);
return string.Empty;
}
}
public static string GetHttpRqst(string strUrl)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
response.Close();
return retString;
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n" + strUrl);
return string.Empty;
}
}
/// <summary>
/// 获取软件更新
/// </summary>
/// <param name="appCode"></param>
/// <returns></returns>
public static respone_update GetUpdate(string appCode)
{
try
{
var parame = JsonConvert.SerializeObject(new
{
appCode = appCode
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.SoftUpdate, parame);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取更新信息失败", "更新失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<respone_update>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取更新信息失败", "更新失败");
return default;
}
else
{
Log.WorkLog("获取更新信息成功", "更新成功");
return res_data.data;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 与服务器同步时间
/// </summary>
/// <returns></returns>
public static bool SetLocalTime()
{
try
{
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetServerime);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("服务器时间获取失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<DateTime>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("服务器时间获取失败", "获取失败");
return default;
}
else
{
Log.WorkLog("服务器时间获取成功", "获取成功");
if (res_data.data != null && res_data.data != default)
{
SYSTEMTIME _time = new SYSTEMTIME();
_time.FromDateTime(res_data.data);
var res = Win32API.SetLocalTime(ref _time);
if (res)
{
Log.WorkLog("时间同步成功", "同步成功");
}
else
{
Log.WorkLog($"时间同步失败,时间:{res_data.data.ToString("yyyy-MM-dd HH:mm:ss")}", "同步失败");
}
return res;
}
else
{
return false;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 上报通道监控epc(本次出入库读取到的所有epc)
/// </summary>
/// <param name="data">出入库数据</param>
/// <returns></returns>
public static bool ApplyMonitorEpcList(request_head data)
{
try
{
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.ApplyMonitorEpcList, param);
if (string.IsNullOrEmpty(json))
{
Log.ErrorLog("监控数据上报失败");
return false;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<object>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.ErrorLog("监控数据上报失败:" + res_data?.msg);
return false;
}
else
{
return true;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog("监控数据上报异常" + ex.ToString() + "\r\n");
return false;
}
}
/// <summary>
/// 上报出入库信息
/// </summary>
/// <param name="data">出入库数据</param>
/// <returns></returns>
public static Tuple<bool, List<request_epc>, string> ApplyWzList(request_head data)
{
try
{
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return null;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
Log.WorkLog($"数据提交上报数据:\r\n{body_par}");
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.ApplyUrl, param);
if (string.IsNullOrEmpty(json))
{
XfVioceMsc.Text2Voice("数据上传失败");
return new Tuple<bool, List<request_epc>, string>(false, default, "数据上传失败");
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<request_epc>>>(json);
if (res_data == null || res_data.code != 10000)
{
//锁库 10036
if (res_data is { code: 10036 })
{
XfVioceMsc.Text2Voice("盘库中,库房已锁");
return new Tuple<bool, List<request_epc>, string>(false, default, "盘库中,库房已锁");
}
else
{
XfVioceMsc.Text2Voice("数据上传失败");
return new Tuple<bool, List<request_epc>, string>(false, default, "数据上传失败");
}
}
else
{
if (res_data.data == null || res_data.data.Count == 0)
{
return new Tuple<bool, List<request_epc>, string>(true, new List<request_epc>(), "上报成功,但被后台过滤。");
}
else
{
var bagList = res_data.data.Where(x => x.type == "bag").ToList();
var singleList = res_data.data.Where(x => x.type == "single").ToList();
var successInList = singleList.Where(x => x.currentState == 0).ToList();
var failInList = singleList.Where(x => x.currentState == 10).ToList();
var successOutList = singleList.Where(x => !new[] { 0, 6, 9, 10, 11 }.Contains(x.currentState)).ToList();
var failOutList = singleList.Where(x => x.currentState == 9).ToList();
var errorList = singleList.Where(x => x.currentState == 11).ToList();
var scrapList = singleList.Where(x => x.currentState == 6).ToList();
string _word = string.Empty;
if (successInList.Count > 0)
{
_word += $"入库成功{successInList.Count}件,";
}
if (failInList.Count > 0)
{
_word += $"异常入库{failInList.Count}件,";
}
if (successOutList.Count > 0)
{
_word += $"出库成功{successOutList.Count}件,";
}
if (failOutList.Count > 0)
{
_word += $"异常出库{failOutList.Count}件,";
}
if (errorList.Count > 0)
{
_word += $"未知的物资{errorList.Count}件,";
}
if (scrapList.Count > 0)
{
_word += $"已报废物资{scrapList.Count}件,";
}
//装备包处理
if (bagList.Count > 0)
{
var successInBagList = bagList.Where(x => x.currentState == 0).ToList();
var successOutBagList = bagList.Where(x => x.currentState == 1).ToList();
if (successInBagList.Count > 0)
{
_word += $"装备包入库成功{successInBagList.Count}件,";
}
if (successOutBagList.Count > 0)
{
_word += $"装备包出库成功{successOutBagList.Count}件,";
}
}
var safeWarringList = successOutList.Where(x => x.safeLevel == 1 && x.currentState != 6).ToList();
var safeDangerList = successOutList.Where(x => x.safeLevel == 2 && x.currentState != 6).ToList();
if (safeDangerList.Count > 0)
{
_word += $"警告:存在已过期装备{safeDangerList.Count}件。装备名:{string.Join(",", safeDangerList.Select(x => x.name).Distinct())},请立即联系仓管员处理,";
}
if (safeWarringList.Count > 0)
{
_word += $"提醒:存在即将过期装备{safeWarringList.Count}件。装备名:{string.Join(",", safeWarringList.Select(x => x.name).Distinct())}";
}
_word = _word.TrimEnd(',');
Log.WorkLog($"数据提交:\r\n{json}");
if (successInList.Count > 0)
{
var successEpcList = successInList
.Select(x => x.epc)
.ToList();
if (MyCache.SysConfig.IsEnabledShelf)
{
//推送货架
var epcListRes = GetInvListByEpc(successEpcList);
if (epcListRes.Item1)
{
//直接推送
var shelfRes = GetHttpRqst(MyCache.SysConfig.ShelfAddress, epcListRes.Item2);
if (string.IsNullOrEmpty(shelfRes))
{
Log.WorkLog("智能货架推送响应失败", "智能货架推送失败");
_word += ",智能货架推送响应失败。";
}
else
{
var shelfRes_data = JsonConvert.DeserializeObject<respone_head<object>>(shelfRes);
if (shelfRes_data == null || shelfRes_data.code != 1000)
{
Log.WorkLog($"智能货架推送响应失败,{shelfRes}", "智能货架推送失败");
_word += ",智能货架推送响应失败。";
}
else
{
_word += ",智能货架推送成功。";
}
}
}
}
}
XfVioceMsc.Text2Voice(_word);
return new Tuple<bool, List<request_epc>, string>(true, res_data.data, _word);
}
}
}
}
}
catch (Exception ex)
{
XfVioceMsc.Text2Voice("数据上传失败");
Log.ErrorLog(ex.ToString() + "\r\n");
return new Tuple<bool, List<request_epc>, string>(false, default, "数据上传失败");
}
}
/// <summary>
/// 获取箱标内epc信息
/// </summary>
/// <param name="boxMarkEpcList"></param>
/// <returns></returns>
public static List<response_BoxMarkModel> GetEpcListByBoxMarkEpc(List<string> boxMarkEpcList)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
epcList = boxMarkEpcList.Select(x => new
{
epc = x
})
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetEpcListByBoxMarkEpc, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<response_BoxMarkModel>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"箱标获取失败,JSON\r\n {json} ");
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取装备包内epc信息
/// </summary>
/// <param name="bagInvEpcList"></param>
/// <returns></returns>
public static List<response_BagInvModel> GetEpcListByBagInvEpc(List<string> bagInvEpcList)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
epcList = bagInvEpcList
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetEpcListByBagInvEpc, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<response_BagInvModel>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"装备包获取失败,JSON\r\n {json} ");
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取当前仓库开启的单据(库存调拨限定)
/// </summary>
/// <param name="appCode"></param>
/// <returns></returns>
public static response_TransformInfo GetOpenOrderInfo()
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
warehouseId = MyCache.ChannelCfg.warehouseId,
orderType = "库存调拨"
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetOpenOrderInfo, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<response_TransformInfo>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"获取当前仓库开启的单据失败,JSON\r\n {json} ");
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取当前仓库开启的单据包含的物资(全部订单)
/// </summary>
/// <returns></returns>
public static List<EquipmentInventory> GetOpenOrderInfoInvData()
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
warehouseId = MyCache.ChannelCfg.warehouseId,
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetOpenOrderInfo, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<dynamic>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"获取当前仓库开启的单据失败,JSON\r\n {json} ");
return default;
}
else
{
var data = res_data.data;
if (data == null)
{
//无单据
return default;
}
var list = new List<EquipmentInventory>();
if (data.type == 2 || data.type == 3)
{
//借用领用
foreach (var obj in data.applyResult.resultList)
{
var count = obj.quantity - obj.realCount;
if (count == 0)
{
continue;
}
list.Add(new EquipmentInventory
{
Name = obj.equipmentName,
Count = count
});
}
}
else
{
//调拨
foreach (var obj in data.realityDetailList)
{
var count = obj.quantity - obj.realCount;
if (count == 0)
{
continue;
}
list.Add(new EquipmentInventory
{
Name = obj.equipmentDetailName,
Count = count
});
}
}
return list;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 上传抓拍图片
/// </summary>
/// <param name="buffer"></param>
/// <param name="fileName"></param>
/// <param name="directoy"></param>
/// <returns></returns>
public static bool UploadPic(byte[] buffer, string fileName, string directoy)
{
try
{
if (buffer == null || buffer.Length == 0)
{
return false;
}
else if (string.IsNullOrEmpty(MyCache.ChannelCfg.warehouseId))
{
return false;
}
else if (string.IsNullOrEmpty(fileName))
{
return false;
}
else
{
var _url = MyCache.SysConfig.UploadPic;
using (HttpClient client = new HttpClient())
{
var postContent = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
postContent.Add(new ByteArrayContent(buffer), "picture", fileName);
postContent.Add(new StringContent("0"), "type");
postContent.Add(new StringContent(directoy), "directoy");
postContent.Add(new StringContent(MyCache.ChannelCfg.warehouseId), "id");
using (HttpResponseMessage response = client.PostAsync(_url, postContent).Result)
{
var str = response.Content.ReadAsStringAsync().Result;
var res = JsonConvert.DeserializeObject<ResponeUpload>(str);
if (res.code == 10000)
{
Log.WorkLog("抓拍图片上传成功", "图片上传");
return true;
}
else
{
Log.WorkLog($"抓拍图片上传失败,JSON {str}", "图片上传");
return false;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 上传人脸照片
/// </summary>
/// <param name="buffer"></param>
/// <param name="fileName"></param>
/// <param name="directoy"></param>
/// <returns></returns>
public static bool UploadFace(byte[] buffer, string fileName, string id)
{
try
{
if (buffer == null || buffer.Length == 0)
{
return false;
}
else if (string.IsNullOrEmpty(id))
{
return false;
}
else
{
var _url = MyCache.SysConfig.DomainUrl + LocalConfig.UploadFace;
if (_url.Contains(":18761/api/service"))
{
_url = _url.Remove(_url.IndexOf(":18761/api/service", StringComparison.Ordinal)) + ":5000" + LocalConfig.UploadFace;
}
using (HttpClient client = new HttpClient())
{
var postContent = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
postContent.Add(new ByteArrayContent(buffer), "picture", fileName);
postContent.Add(new StringContent(id), "id");
using (HttpResponseMessage response = client.PostAsync(_url, postContent).Result)
{
var str = response.Content.ReadAsStringAsync().Result;
var res = JsonConvert.DeserializeObject<ResponeUpload>(str);
if (res.code == 10000)
{
Log.WorkLog("人脸图片上传成功", "图片上传");
return true;
}
else
{
Log.WorkLog(res.msg);
return false;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 更新指纹信息
/// </summary>
/// <param name="fingerList"></param>
/// <param name="policeId"></param>
/// <returns></returns>
public static bool UpdateFinger(string policeId, List<FingerInfo> fingerList)
{
try
{
if (fingerList == null || fingerList.Count == 0)
{
return false;
}
else if (string.IsNullOrEmpty(policeId))
{
return false;
}
else
{
var body_par = JsonConvert.SerializeObject(new
{
policeId = policeId,
fingerList = fingerList
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.UpdateFinger, param);
if (string.IsNullOrEmpty(json))
{
return false;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<request_epc>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"指纹数据更新失败,JSON\r\n {json} ");
return false;
}
else
{
return true;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 根据卡号获取警员信息
/// </summary>
/// <param name="cardNo"></param>
/// <returns></returns>
public static police_info GetPoliceInfo(string cardNo)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
cardNo = cardNo,
orgId = MyCache.ChannelCfg.orgId
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return null;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetPoliceUrl, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<police_info>>(json);
if (res_data == null || res_data.code != 10000)
{
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 更新警员卡号(批量)
/// </summary>
/// <param name="updateData"></param>
/// <returns></returns>
public static bool UpdatePoliceCard(List<Tuple<string, string>> updateData)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
list = updateData.Select(x => new
{
policeCode = x.Item1,
cardNo = x.Item2,
})
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.BatchUpdateCardNo, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("更新警员卡号失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<request_epc>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("更新警员卡号失败:" + res_data?.msg);
return false;
}
else
{
return true;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 根据通道编号获取配置
/// </summary>
/// <returns></returns>
public static RemoteConfig GetCurrentCfg(string code)
{
try
{
var body_par = JsonConvert.SerializeObject(new { code = code });
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return null;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg?.orgId ?? "",
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetCurrentCfg, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<RemoteConfig>>(json);
if (res_data == null || res_data.code != 10000)
{
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 获取平台警员信息
/// </summary>
/// <returns></returns>
public static List<sync_police> GetPoliceInfo()
{
try
{
if (string.IsNullOrEmpty(MyCache.ChannelCfg?.orgId ?? ""))
{
Log.WorkLog($"平台人员同步信息获取失败,组织机构为空");
return default;
}
else
{
var body_par = JsonConvert.SerializeObject(new { orgId = MyCache.ChannelCfg.orgId });
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<sync_police>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetPolices, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<sync_police>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"平台人员同步信息获取失败,{json}");
return default;
}
else
{
return res_data.data;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 获取警员图片
/// </summary>
/// <returns></returns>
public static byte[] GetPoliceImg(string url)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(MyCache.SysConfig.DomainUrl + url);
request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream st = response.GetResponseStream())
{
using (MemoryStream ms = new MemoryStream())
{
st.CopyTo(ms);
var buffer = ms.GetBuffer();
st.Close();
ms.Close();
response.Close();
return buffer;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 根据EPC集合获取物资信息
/// </summary>
/// <param name="type"></param>
/// <param name="eps"></param>
/// <returns></returns>
public static Tuple<bool, string> GetInvListByEpc(List<string> eps)
{
try
{
var data = new
{
EPCList = new List<dynamic>()
};
foreach (var epc in eps)
{
data.EPCList.Add(new { epc = epc });
}
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new Tuple<bool, string>(false, "签名值生成失败");
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetInvListByEpc, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("根据EPC集合获取物资信息失败", "入库失败");
return new Tuple<bool, string>(false, "根据EPC集合获取物资信息失败");
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<dynamic>>>(json);
if (res_data == null || res_data.code != 10000
|| res_data.data == null || res_data.data.Count == 0)
{
Log.WorkLog($"根据EPC集合获取物资信息失败,{json}", "入库失败");
return new Tuple<bool, string>(false, "根据EPC集合获取物资信息失败");
}
else
{
//返回json
return new Tuple<bool, string>(true, json);
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取物资信息
/// </summary>
/// <returns></returns>
public static List<equ_info> GetEquInfos()
{
try
{
var body_par = string.Empty;
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<equ_info>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetEquInfo, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取获取装备基础信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<equ_info>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取获取装备基础信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取获取装备基础信息成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取当前组织机构下所有仓库
/// </summary>
/// <returns></returns>
public static List<warehouse_info> GetWarehouseListByOrgId(string orgId)
{
try
{
var data = new
{
orgizationId = orgId
};
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<warehouse_info>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetListOrgWarehouse, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取仓库信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<warehouse_info>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取仓库信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取仓库信息成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取指定仓库全部货架(智能)+物资
/// </summary>
/// <returns></returns>
public static List<response_ShelfPrint> GetListShelfAndInventory(string warehouseId)
{
try
{
var data = new
{
warehouseId = warehouseId
};
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = MyCache.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = MyCache.SysConfig.ApiVersion,
orgId = MyCache.ChannelCfg.orgId,
});
var json = GetHttpRqst(MyCache.SysConfig.DomainUrl + LocalConfig.GetListShelfAndInventory, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取货架物资失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone_head<List<response_ShelfPrint>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取货架物资失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取货架物资成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// http下载文件
/// </summary>
/// <param name="url">下载文件地址</param>
/// <param name="path">文件存放地址,包含文件名</param>
/// <returns></returns>
public static bool HttpDownload(string url, string path)
{
string tempPath = System.IO.Path.GetDirectoryName(path) + @"\temp";
System.IO.Directory.CreateDirectory(tempPath); //创建临时文件目录
string tempFile = tempPath + @"\" + System.IO.Path.GetFileName(path) + ".temp"; //临时文件
if (System.IO.File.Exists(tempFile))
{
System.IO.File.Delete(tempFile); //存在则删除
}
try
{
FileStream fs = new FileStream(tempFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//创建本地文件写入流
//Stream stream = new FileStream(tempFile, FileMode.Create);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
//stream.Write(bArr, 0, size);
fs.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
//stream.Close();
fs.Close();
responseStream.Close();
System.IO.File.Move(tempFile, path);
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 获取文件的MD5码
/// </summary>
/// <param name="fileName">传入的文件名(含路径及后缀名)</param>
/// <returns></returns>
public static string GetMD5HashFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, System.IO.FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception ex)
{
throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
private static Tuple<string, string, string> GetBody(string json)
{
try
{
var timespan = GetTimeStamp();
var body = System.Web.HttpUtility.UrlEncode(json);
var content = $"{MyCache.SysConfig.SecretKey}{timespan}{MyCache.SysConfig.ApiVersion}{body}";
var sign = GetMd5(content);
return new Tuple<string, string, string>(body, sign, timespan);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return null;
}
}
private static string GetMd5(string txt)
{
//初始化MD5对象
using (MD5 md5 = MD5.Create())
{
//将源字符串转化为byte数组
byte[] soucebyte = Encoding.UTF8.GetBytes(txt);
//soucebyte转化为mf5的byte数组
byte[] md5bytes = md5.ComputeHash(soucebyte);
//将md5的byte数组再转化为MD5数组
StringBuilder sb = new StringBuilder();
foreach (byte b in md5bytes)
{
//x表示16进制,2表示2位
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
}
private static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{8662BAF0-5206-4472-84AF-2E44669C3E2C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>JmpCommon</RootNamespace>
<AssemblyName>JmpCommon</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Programe\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Programe\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8.0</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="LiteDB, Version=5.0.8.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.5.0.8\lib\net45\LiteDB.dll</HintPath>
</Reference>
<Reference Include="NetSDKCS">
<HintPath>..\Lib\NetSDKCS.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Management" />
<Reference Include="System.Runtime" />
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Analyzingepc.cs" />
<Compile Include="Camera\BaseCamera.cs" />
<Compile Include="Camera\ConstStr.cs" />
<Compile Include="Camera\DahuaCamera.cs" />
<Compile Include="Camera\DahuaCameraControlSettings.cs" />
<Compile Include="Camera\DahuaCameraControl.cs" />
<Compile Include="Camera\HikCamera.cs" />
<Compile Include="Camera\ICamera.cs" />
<Compile Include="Camera\ResponeUpload.cs" />
<Compile Include="CHCNetSDK.cs" />
<Compile Include="HotKey.cs" />
<Compile Include="HttpHelper.cs" />
<Compile Include="JmpDes.cs" />
<Compile Include="LiteDBHelper.cs" />
<Compile Include="Log.cs" />
<Compile Include="MachineIdentity.cs" />
<Compile Include="Model\ChannelReadEquType.cs" />
<Compile Include="Model\DoorCardInfo.cs" />
<Compile Include="Model\equ_info.cs" />
<Compile Include="Model\FingerInfo.cs" />
<Compile Include="Model\GpiTrigger.cs" />
<Compile Include="Model\response_BagInvModel.cs" />
<Compile Include="Model\response_Shelf.cs" />
<Compile Include="Model\EquipmentInventory.cs" />
<Compile Include="Model\response_ShelfPrint.cs" />
<Compile Include="Model\response_TransformInfo.cs" />
<Compile Include="Model\response_BoxMarkModel.cs" />
<Compile Include="Model\request_sign.cs" />
<Compile Include="Model\sync_police.cs" />
<Compile Include="Model\respone_update.cs" />
<Compile Include="Model\LocalConfig.cs" />
<Compile Include="Model\RemoteConfig.cs" />
<Compile Include="Model\request_head.cs" />
<Compile Include="Model\respone_head.cs" />
<Compile Include="Model\warehouse_info.cs" />
<Compile Include="MyCache.cs" />
<Compile Include="SessionUtility.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TtsEnum.cs" />
<Compile Include="TtsStruct.cs" />
<Compile Include="Win32API.cs" />
<Compile Include="XfVioceMsc.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class JmpDes
{
/// <summary> 加密字符串
/// </summary>
/// <param name="strText">需被加密的字符串</param>
/// <param name="strEncrKey">密钥</param>
/// <returns></returns>
public static string Encrypt(string strText, string strKey = "jMp838668")
{
try
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byKey = Encoding.UTF8.GetBytes(strKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch
{
return "";
}
}
/// <summary> 解密字符串
/// </summary>
/// <param name="strText">需被解密的字符串</param>
/// <param name="sDecrKey">密钥</param>
/// <returns></returns>
public static string Decrypt(string strText, string strKey = "jMp838668")
{
try
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = new Byte[strText.Length];
byKey = Encoding.UTF8.GetBytes(strKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
Encoding encoding = new UTF8Encoding();
return encoding.GetString(ms.ToArray());
}
catch
{
return string.Empty;
}
}
}
}
using JmpCommon;
using JmpCommon.Model;
using LiteDB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public static class LiteDBHelper
{
public static bool AddOrUpdate(TagCacheInfo entity)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<TagCacheInfo>(nameof(TagCacheInfo));
if (entity.Id == null || entity.Id == 0)
{
var res = col.Insert(entity).AsInt32 > 0;
if (!res) { Log.WorkLog("EPC缓存写入失败", "写入失败"); }
else { Log.WorkLog("EPC缓存写入成功", "写入成功"); }
return res;
}
else
{
entity.LastDate = DateTime.Now;
var res = col.Update(entity);
if (!res) { Log.WorkLog("EPC缓存更新失败", "更新失败"); }
else { Log.WorkLog("EPC缓存更新成功", "更新成功"); }
return res;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
public static TagCacheInfo FindByEpc(string epc, string warehouseId, int state = -1)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<TagCacheInfo>(nameof(TagCacheInfo));
if (state == -1)
{
return col.FindOne(x => x.Epc.Contains(epc) && x.WarehouseId == warehouseId);
}
else
{
return col.FindOne(x => x.Epc.Contains(epc) && x.CurrentState == state && x.WarehouseId == warehouseId);
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
public static TagCacheInfo FindByEpc(string epc, string warehouseId)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<TagCacheInfo>(nameof(TagCacheInfo));
return col.FindOne(x => x.Epc.Contains(epc) && x.WarehouseId == warehouseId);
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
public static bool DeleteAll()
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<TagCacheInfo>(nameof(TagCacheInfo));
return col.DeleteAll() >= 0;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
public static void RefreshAll()
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<TagCacheInfo>(nameof(TagCacheInfo));
var list = col.FindAll().ToList();
list.ForEach(s =>
{
s.LastDate = DateTime.Now.Date;
col.Update(s);
});
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
}
}
public static List<SyncCardInfo> FindAll()
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<SyncCardInfo>(nameof(SyncCardInfo));
return col.FindAll().ToList();
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
public static bool AddOrUpdate(SyncCardInfo entity)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<SyncCardInfo>(nameof(SyncCardInfo));
if (entity == null || entity.Id == 0)
{
var res = col.Insert(entity).AsInt32 > 0;
if (!res) { Log.WorkLog("人员数据写入失败", "写入失败"); }
else { Log.WorkLog("人员数据写入成功", "写入成功"); }
return res;
}
else
{
var res = col.Update(entity);
if (!res) { Log.WorkLog("人员数据更新失败", "更新失败"); }
else { Log.WorkLog("人员数据更新成功", "更新成功"); }
return res;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
public static bool DeleteByCard(string cardNo)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<SyncCardInfo>(nameof(SyncCardInfo));
return col.DeleteMany(t => t.CardNo == cardNo) >= 0;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
public static bool DeleteByCard(Expression<Func<SyncCardInfo, bool>> predicate)
{
try
{
using (var db = new LiteDatabase($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}epcs.db"))
{
var col = db.GetCollection<SyncCardInfo>(nameof(SyncCardInfo));
var res = col.DeleteMany(predicate) >= 0;
return res;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
}
public class TagCacheInfo
{
public string WarehouseId { get; set; }
public int Id { get; set; }
public string Epc { get; set; }
public DateTime LastDate { get; set; }
public int CurrentState { get; set; }
}
public class SyncCardInfo
{
public string orgId { get; set; }
public int Id { get; set; }
public string PoliceId { get; set; }
public string CardNo { get; set; }
public string OrgId { get; set; }
public string FacePic { get; set; }
public DateTime SyncDate { get; set; }
public bool IsSyncCard { get; set; }
public bool IsSyncFace { get; set; }
public bool IsSyncFinger { get; set; }
public bool IsPushedPic { get; set; }
public List<FingerInfo> FingerList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class Log
{
//private static
private static StreamWriter sr;
private static readonly object syncWorkObj = new object();
private static readonly object syncErrorObj = new object();
private static readonly object syncDebugObj = new object();
private static bool bEnableWorkLog = true;
private static bool bEnableErrorLog = true;
private static bool bEnableDebugLog = true;
public Log()
{
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableWorkLog(bool enable)
{
bEnableWorkLog = enable;
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableErrorLog(bool enable)
{
bEnableErrorLog = enable;
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableDebugLog(bool enable)
{
bEnableDebugLog = enable;
}
/// <summary>
/// 工作日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void WorkLog(string logTxt, [CallerMemberName] string ModuleName = default)
{
lock (syncWorkObj)
{
if (bEnableWorkLog)
{
WriteLine(logTxt, ModuleName, "WorkLog/");
}
}
}
/// <summary>
/// 异常日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void ErrorLog(string logTxt, [CallerMemberName] string ModuleName = default)
{
lock (syncErrorObj)
{
if (bEnableErrorLog)
{
WriteLine(logTxt, ModuleName, "ErrorLog/");
}
}
}
/// <summary>
/// 异常日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void DebugLog(string logTxt, [CallerMemberName] string ModuleName = null)
{
lock (syncDebugObj)
{
if (bEnableDebugLog)
{
WriteLine(logTxt, ModuleName, "WorkLog/");
}
}
}
/// <summary>
/// 写日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
/// <param name="pathName"></param>
private static void WriteLine(string logTxt, string ModuleName, string pathName)
{
try
{
string logPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + pathName
+ DateTime.Now.ToString("yyyyMMdd") + ".log";
ClearFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + pathName);
logTxt = string.Format(" {0}|{1}|{2}",
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
ModuleName,
logTxt);
sr = new StreamWriter(logPath, true, Encoding.Default);
sr.WriteLine(logTxt);
sr.Close();
}
catch { }
}
/// <summary>
/// 日志清除文件
/// </summary>
/// <param name="FilePath"></param>
private static void ClearFile(string FilePath)
{
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
String[] Files = Directory.GetFiles(FilePath);
if (Files.Length > 30)
{
for (int i = 0; i < 1; i++)
{
try
{
File.Delete(Files[i]);
}
catch
{
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management;
using System.Security.Cryptography;
using System.Text;
namespace JmpCommon
{
/// <summary>
/// 根据机器的硬件ID生成唯一标识
/// </summary>
public class MachineIdentity
{
/// <summary>
/// 机器的唯一硬件ID。
/// </summary>
public String UniqueId { get; set; }
/// <summary>
/// 获取此机器的硬件ID。
/// </summary>
/// <returns></returns>
public static string GetCurrentIdentity()
{
return GetSha1Hash(GetVolumeSerialId(GetPrimaryDriveLetter()) + GetCpuId(), Encoding.ASCII);
}
/// <summary>
/// 获取主驱动器号
/// </summary>
/// <returns></returns>
private static string GetPrimaryDriveLetter()
{
string drive = String.Empty;
//发现第一个磁盘驱动器
foreach (var compDrive in DriveInfo.GetDrives())
{
if (compDrive.IsReady && compDrive.DriveType == DriveType.Fixed)
{
drive = compDrive.RootDirectory.ToString();
break;
}
}
if (drive.EndsWith(":\\"))
{
//C:\ -> C
drive = drive.Substring(0, drive.Length - 2);
}
return drive;
}
/// <summary>
/// 获取卷序列号
/// </summary>
/// <param name="drive"></param>
/// <returns></returns>
private static string GetVolumeSerialId(string drive)
{
var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""" + drive + @":""");
disk.Get();
string volumeSerial = disk["VolumeSerialNumber"].ToString();
disk.Dispose();
return volumeSerial;
}
/// <summary>
/// 获取CPU序列号
/// </summary>
/// <returns></returns>
private static string GetCpuId()
{
string cpuInfo = "";
var managClass = new ManagementClass("win32_processor");
var managCollec = managClass.GetInstances();
foreach (ManagementObject managObj in managCollec)
{
if (cpuInfo == "")
{
//只获取第一个CPU的ID
cpuInfo = managObj.Properties["processorID"].Value.ToString();
break;
}
}
return cpuInfo;
}
/// <summary>
/// 计算SHA1哈希
/// </summary>
/// <param name="text">字符串</param>
/// <param name="enc">编码格式</param>
/// <returns>哈希值</returns>
private static string GetSha1Hash(string text, Encoding enc)
{
var buffer = enc.GetBytes(text);
var cryptoTransformSHA1 =
new SHA1CryptoServiceProvider();
string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
return hash;
}
/// <summary>
/// 获取通道唯一编码
/// </summary>
/// <returns></returns>
public static string GetFileIdentity()
{
try
{
var appCfg = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData) + "\\Junmp";
if (!Directory.Exists(appCfg)) { Directory.CreateDirectory(appCfg); }
var cfgFile = appCfg + "\\tdunique.txt";
if (File.Exists(cfgFile))
{
return File.ReadAllText(cfgFile.Replace(" ", ""), Encoding.UTF8);
}
else
{
string unique = GetSha1Hash(Guid.NewGuid().ToString() + DateTime.Now.ToString("yyyyMMddHHmmssfff"), Encoding.ASCII);
File.WriteAllText(cfgFile, unique, Encoding.UTF8);
return unique;
}
}
catch
{
return string.Empty;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class ChannelReadEquType
{
public string equipmentName { get; set; }
public string code { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class DoorCardInfo
{
/// <summary>
/// 0普通用户,1管理员
/// </summary>
public int UserType { get; set; }
public string CardNo { get; set; }
public string EmployeeNo { get; set; }
public string Name { get; set; }
public bool IsValid { get; set; }
public string Password { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class EquipmentInventory
{
public string Name { get; set; }
public string Count { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class FingerInfo
{
public int fingerNum { get; set; }
public string fingerInfo { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class GpiTrigger
{
public string StatusStr
{
get
{
return Gpi1Str + Gpi2Str;
}
}
public string Gpi1Str { get; set; }
public string Gpi2Str { get; set; }
public DateTime LastTime { get; set; }
public void SetEmpty()
{
Gpi1Str = string.Empty;
Gpi2Str = string.Empty;
}
}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace JmpCommon
{
public class LocalConfig
{
public const string GetPolices = "/api/ChannelCfg/GetOrgStaff";
public const string UpdateFinger = "/api/ChannelCfg/UpdateFinger";
public const string ApplyUrl = "/api/Inventory/UploadRFIDNew";
public const string GetPoliceUrl = "/api/Common/GetPoliceByCardNo";
public const string GetCurrentCfg = "/api/ChannelCfg/GetCfgByNumV2";
public const string SoftUpdate = "/api/SoftUpdate/GetLastUpdate";
public const string GetServerime = "/api/ChannelCfg/GetServerTime";
public const string UploadFace = "/api/ChannelCfg/UploadFace";
public const string BatchUpdateCardNo = "/api/Policeman/BatchUpdateCardNo";
public const string GetInvListByEpc = "/api/Inventory/GetInvListByEpc";
public const string GetEpcListByBoxMarkEpc = "/api/EquipmentBoxMark/GetEpcListByBoxMarkEpc";
public const string GetEpcListByBagInvEpc = "/api/Mission/GetEpcListByBagInvEpc";
public const string GetOpenOrderInfo = "/api/Inventory/GetOpenOrderInfo";
public const string GetEquInfo = "/api/EquipmentDetail/GetListEquipmentDetail";
public const string GetListOrgWarehouse = "/api/Warehouse/GetListOrgWarehouse";
public const string GetListShelfAndInventory = "/api/Shelf/GetListShelfAndInventory";
public const string ApplyMonitorEpcList = "/api/ChannelCfg/ApplyMonitorEpcList";
public LocalConfig()
{
AppTitle = "通道服务v" + FileVersionInfo.GetVersionInfo(Process.GetCurrentProcess().MainModule.FileName).FileVersion;
AppVersion = FileVersionInfo.GetVersionInfo(Process.GetCurrentProcess().MainModule.FileName).FileVersion;
AppCode = "10001";
UploadPic = "http://41.190.20.132:5000/api/ChannelCfg/UploadPic";
DomainUrl = "http://41.190.20.132:18761/api/service";
UserID = "";
TestModel = false;
SpecialModel = false;
ApiVersion = "1.0";
SyncUserInfo = true;
SyncCfgInfo = false;
AppKey = "q6t0lEKOmMg5Tm+dg3XdZQ==";
SecretKey = "ba4d855b3b83eab441a51ea9bd9d9671";
IsEnabledShelf = false;
ShelfAddress = "http://192.168.3.128:38080/api/BoundDocuments";
IsAutoUpdate = true;
AutoUpdateTime = 0;
IsSyncFaces = true;
IsSyncFinger = true;
IsSyncCard = true;
ChooseWarehouseId = "";
MQTTAddress = "41.190.20.132";
MQTTPort = 17777;
MQTTUserName = "test";
MQTTPassword = "junmp123";
IsPushShelfPrint = false;
PushShelfPrintCom = "";
}
public string UploadPic { get; set; }
public string DomainUrl { get; set; }
public string UserID { get; set; }
public bool TestModel { get; set; }
public bool SpecialModel { get; set; }
[JsonIgnore]
public string AppTitle { get; set; }
[JsonIgnore]
public string AppCode { get; set; }
[JsonIgnore]
public string AppVersion { get; set; }
public string ApiVersion { get; set; }
public bool SyncUserInfo { get; set; }
public bool SyncCfgInfo { get; set; }
public string AppKey { get; set; }
public string SecretKey { get; set; }
public bool IsEnabledShelf { get; set; }
public string ShelfAddress { get; set; }
public bool IsAutoUpdate { get; set; }
public int AutoUpdateTime { get; set; }
public bool IsSyncFaces { get; set; }
public bool IsSyncFinger { get; set; }
public bool IsSyncCard { get; set; }
public bool IsChangeWarehouse { get; set; }
public string ChooseWarehouseId { get; set; }
public string MQTTAddress { get; set; }
public int MQTTPort { get; set; }
public string MQTTUserName { get; set; }
public string MQTTPassword { get; set; }
public bool IsPushShelfPrint { get; set; }
public string PushShelfPrintCom { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class RemoteConfig
{
public string orgId { get; set; }
public string warehouseId { get; set; }
public int filterTime { get; set; } = 3;
public List<FaceConfig> faceConfig { get; set; }
public List<ReaderConfig> readerConfig { get; set; }
public string showText { get; set; } = "位置:未获取云端配置";
public string channelReadEquTypeJson { get; set; }
}
public class FaceConfig
{
/// <summary>
/// 人脸识别登录地址
/// </summary>
public string faceAddress { get; set; }
/// <summary>
/// 人脸识别登录端口
/// </summary>
public int facePort { get; set; }
/// <summary>
/// 人脸识别登录用户
/// </summary>
public string faceUser { get; set; }
/// <summary>
/// 读写器端口
/// </summary>
public string facePwd { get; set; }
/// <summary>
/// 启用禁用人脸识别
/// </summary>
public bool faceEnable { get; set; }
}
public class ReaderConfig
{
/// <summary>
/// 读写器类型
/// 英频杰:0
/// 索立得401:1
/// 索立得401X(新版):2
/// </summary>
public int type { get; set; }
/// <summary>
/// 读写器名(不能重复,涉及到配置文件命名)
/// </summary>
public string name { get; set; }
/// <summary>
/// 读写器地址
/// </summary>
public string address { get; set; }
/// <summary>
/// 读写器端口
/// </summary>
public int port { get; set; }
/// <summary>
/// 读写时间(毫秒)
/// </summary>
public int readerTime { get; set; }
/// <summary>
/// gpio地址
/// </summary>
public string gpioAddr { get; set; }
/// <summary>
/// gpio端口
/// </summary>
public int gpioPort { get; set; }
/// <summary>
/// 是否出入库分离
/// </summary>
public bool isCameraSeparate { get; set; }
/// <summary>
/// 是否抓拍(出库)
/// </summary>
public bool useSnapshot { get; set; }
/// <summary>
/// 视频厂商(出库)
/// 大华:0
/// 海康:1
/// </summary>
public int camType { get; set; }
/// <summary>
/// 视频地址(出库)
/// </summary>
public string camAddress { get; set; }
/// <summary>
/// 视频端口(出库)
/// </summary>
public int camPort { get; set; }
/// <summary>
/// 视频用户(出库)
/// </summary>
public string camUser { get; set; }
/// <summary>
/// 视频密码(出库)
/// </summary>
public string camPwd { get; set; }
/// <summary>
/// 视频通道(出库)
/// </summary>
public int camChannel { get; set; }
/// <summary>
/// 是否抓拍(入库)
/// </summary>
public bool useSnapshot2 { get; set; }
/// <summary>
/// 视频厂商(入库)
/// 大华:0
/// 海康:1
/// </summary>
public int camType2 { get; set; }
/// <summary>
/// 视频地址(入库)
/// </summary>
public string camAddress2 { get; set; }
/// <summary>
/// 视频端口(入库)
/// </summary>
public int camPort2 { get; set; }
/// <summary>
/// 视频用户(入库)
/// </summary>
public string camUser2 { get; set; }
/// <summary>
/// 视频密码(入库)
/// </summary>
public string camPwd2 { get; set; }
/// <summary>
/// 视频通道(入库)
/// </summary>
public int camChannel2 { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class equ_info
{
public string id { get; set; }
public string code { get; set; }
public string name { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class request_head
{
public request_head()
{
RFIDList = new List<EpcInfo>();
BagRFIDList = new List<EpcInfo>();
}
public string orgId { get; set; }
public string warehouseId { get; set; }
public string policeId { get; set; }
public int currentState { get; set; }
public string picUrl { get; set; }
public List<EpcInfo> RFIDList { get; set; }
public List<EpcInfo> BagRFIDList { get; set; }
}
public class EpcInfo
{
public string RFID { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class request_sign
{
public string appKey { get; set; } = string.Empty;
public string orgId { get; set; } = string.Empty;
public string version { get; set; } = "1.0";
public string timestamp { get; set; }
public string body { get; set; }
public string sign { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class respone_head<T>
{
public int code { get; set; }
public string msg { get; set; }
public T data { get; set; }
}
public class police_info
{
public string policeName { get; set; }
public string policeId { get; set; }
public string orgId { get; set; }
}
public class request_epc
{
public string epc { get; set; }
public string type { get; set; }
public string name { get; set; }
public string Size { get; set; }
public int currentState { get; set; }
public int safeLevel { get; set; }
public string shelfAddress { get; set; }
}
}
namespace JmpCommon.Model
{
public class respone_update
{
public int version { get; set; }
public string version2 { get; set; }
public string name { get; set; }
public string appCode { get; set; }
public string note { get; set; }
public string address { get; set; }
public string updateTime { get; set; }
public string fileMd5 { get; set; }
public bool isAutoUpdate { get; set; }
public string autoUpdateAddress { get; set; }
public string autoUpdateFileMd5 { get; set; }
public string autoUpdateVersion2 { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class response_BagInvModel
{
public response_BagInvModel()
{
epcList = new List<string>();
}
public string id { get; set; }
public string createTime { get; set; }
public string epc { get; set; }
public string warehouseId { get; set; }
public string warehouseName { get; set; }
public string orgizationId { get; set; }
public List<string> epcList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class response_BoxMarkModel
{
public string id { get; set; }
public string createTime { get; set; }
public string epc { get; set; }
public int oneBoxNum { get; set; }
public string warehouseId { get; set; }
public string warehouseName { get; set; }
public string orgizationId { get; set; }
public string equipmentInfoId { get; set; }
public string equipmentDetailId { get; set; }
public string equipmentDetailName { get; set; }
public string equipmentDetailCode { get; set; }
public string sizeId { get; set; }
public string sizeName { get; set; }
public string sizeCode { get; set; }
public string sizeEpcType { get; set; }
public string supplierId { get; set; }
public string supplierCode { get; set; }
public string supplierName { get; set; }
public List<string> epcList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class response_Shelf
{
public string Name { get; set; }
public string Url { get; set; }
public string Type { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class response_ShelfPrint
{
public string Name { get; set; }
public string Url { get; set; }
public string OrganizationName { get; set; }
public List<response_ShelfPrintInfo> InfoList { get; set; }
}
public class response_ShelfPrintInfo
{
public string Name { get; set; }
public List<response_ShelfPrintDetail> InventoryList { get; set; }
}
public class response_ShelfPrintDetail
{
public string Name { get; set; }
public int Count { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class response_TransformInfo
{
public int type { get; set; }
public string orgId { get; set; }
public DateTime? updateTime { get; set; }
public DateTime? expectedReturnTime { get; set; }
public string id { get; set; }
public string applyId { get; set; }
public string applyName { get; set; }
public string note { get; set; }
public DateTime? createTime { get; set; }
public string warehouseName { get; set; }
public string warehouseId { get; set; }
public string order { get; set; }
public string transferName { get; set; }
public string transferId { get; set; }
public string targetName { get; set; }
public string targetId { get; set; }
public List<response_TransformRealityDetail> realityDetailList { get; set; }
}
public class response_TransformRealityDetail
{
public string targetId { get; set; }
public string equipmentSizeId { get; set; }
public string equipmentSizeName { get; set; }
public string equipmentDetailId { get; set; }
public string equipmentDetailCode { get; set; }
public string warehouseId { get; set; }
public string warehouseName { get; set; }
public string equipmentDetailName { get; set; }
public int quantity { get; set; }
public int realCount { get; set; }
public int insideRealCount { get; set; }
public int state { get; set; }
public string supplierId { get; set; }
public string supplierName { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class sync_police
{
public string orgId { get; set; }
public string id { get; set; }
public string name { get; set; }
public string policeCode { get; set; }
public string photo { get; set; }
public string cardNo { get; set; }
public DateTime udateTime { get; set; }
public DateTime createTime { get; set; }
public List<FingerInfo> fingerList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon.Model
{
public class warehouse_info
{
public string id { get; set; }
public string name { get; set; }
public string location { get; set; }
public string locationDetail { get; set; }
public string orgizationId { get; set; }
public bool? isEnableChannelReadEqu { get; set; }
public string channelReadEquTypeJson { get; set; }
}
}
using JmpCommon.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public static class MyCache
{
public static List<warehouse_info> WarehouseList { get; set; }
public static List<sync_police> PoliceList { get; set; }
public static List<equ_info> EquInfos { get; set; }
public static LocalConfig SysConfig { get; set; }
public static RemoteConfig ChannelCfg { get; set; }
public static LocalConfig LoadSystemStep()
{
try
{
var path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "config.json";
if (!File.Exists(path))
{
return default;
}
else
{
string json = File.ReadAllText(path, Encoding.Default);
var des_str = JmpDes.Decrypt(json);
if (string.IsNullOrEmpty(des_str))
{
return default;
}
else
{
var cfg = JsonConvert.DeserializeObject<LocalConfig>(des_str);
if (cfg == null)
{
return default;
}
else
{
//预处理替换
if (cfg.DomainUrl == "http://41.204.7.134:18761/api/service")
{
cfg.DomainUrl = "http://41.190.20.132:18761/api/service";
}
if (cfg.UploadPic == "http://41.204.7.134:5000/api/ChannelCfg/UploadPic")
{
cfg.UploadPic = "http://41.190.20.132:5000/api/ChannelCfg/UploadPic";
}
return cfg;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
public static void SetSystemSetp()
{
if (SysConfig != null)
{
var json = JsonConvert.SerializeObject(SysConfig, Formatting.Indented);
if (string.IsNullOrEmpty(json)) { return; }
else
{
File.WriteAllText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "config.json", JmpDes.Encrypt(json), Encoding.UTF8);
}
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("JmpCommon")]
[assembly: AssemblyDescription("钧普公共调用库")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Junmp")]
[assembly: AssemblyProduct("JmpCommon")]
[assembly: AssemblyCopyright("Copyright © Junmp 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("8662baf0-5206-4472-84af-2e44669c3e2c")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.21")]
[assembly: AssemblyFileVersion("1.0.0.21")]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
/// <summary>
/// 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离
/// 用于windows服务 启动外部程序 或者截取图片等
/// 默认windows服务的权限是在session0中
/// </summary>
public class SessionUtility
{
#region 如果服务只是简单的向桌面用户Session 发送消息窗口,则可以使用WTSSendMessage 函数实现
public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
public static void ShowMessageBox(string message, string title)
{
int resp = 0;
WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE,
WTSGetActiveConsoleSessionId(),
title, title.Length,
message, message.Length,
0, 0, out resp, false);
}
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int WTSGetActiveConsoleSessionId();
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSSendMessage(
IntPtr hServer,
int SessionId,
String pTitle,
int TitleLength,
String pMessage,
int MessageLength,
int Style,
int Timeout,
out int pResponse,
bool bWait);
//在ShowMessageBox 函数中调用了WTSSendMessage 来发送信息窗口,这样我们就可以在Service 的OnStart 函数中使用,打开Service1.cs 加入下面代码:
//protected override void OnStart(string[] args)
//{
// Interop.ShowMessageBox("This a message from AlertService.",
// "AlertService Message");
//}
#endregion
/*
* 如果想通过服务向桌面用户Session 创建一个复杂UI 程序界面,
* 则需要使用CreateProcessAsUser 函数为用户创建一个新进程用来运行相应的程序。
*/
#region 复杂进程
public static void CreateProcess(string app, string para, int sessionID)
{
if (!string.IsNullOrEmpty(para))
{
para = app + @"\" + para;
app = null;
}
bool result;
IntPtr hToken = WindowsIdentity.GetCurrent().Token;
IntPtr hDupedToken = IntPtr.Zero;
var pi = new PROCESS_INFORMATION();
var sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
var si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
int dwSessionID = sessionID;
if (sessionID < 0)
dwSessionID = WTSGetActiveConsoleSessionId();
result = WTSQueryUserToken(dwSessionID, out hToken);
if (!result)
{
ShowMessageBox("WTSQueryUserToken failed", "AlertService Message");
}
result = DuplicateTokenEx(
hToken,
GENERIC_ALL_ACCESS,
ref sa,
(int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
(int)TOKEN_TYPE.TokenPrimary,
ref hDupedToken
);
if (!result)
{
ShowMessageBox("DuplicateTokenEx failed", "AlertService Message");
}
IntPtr lpEnvironment = IntPtr.Zero;
result = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);
if (!result)
{
ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
}
result = CreateProcessAsUser(
hDupedToken,
app,
para,
ref sa, ref sa,
false, 0, IntPtr.Zero,
null, ref si, ref pi);
if (!result)
{
int error = Marshal.GetLastWin32Error();
string message = String.Format("CreateProcessAsUser Error: {0}", error);
ShowMessageBox(message, "AlertService Message");
}
if (pi.hProcess != IntPtr.Zero)
CloseHandle(pi.hProcess);
if (pi.hThread != IntPtr.Zero)
CloseHandle(pi.hThread);
if (hDupedToken != IntPtr.Zero)
CloseHandle(hDupedToken);
}
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFO
{
public Int32 cb;
public string lpReserved;
public string lpDesktop;
public string lpTitle;
public Int32 dwX;
public Int32 dwY;
public Int32 dwXSize;
public Int32 dwXCountChars;
public Int32 dwYCountChars;
public Int32 dwFillAttribute;
public Int32 dwFlags;
public Int16 wShowWindow;
public Int16 cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public Int32 dwProcessID;
public Int32 dwThreadID;
}
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public Int32 Length;
public IntPtr lpSecurityDescriptor;
public bool bInheritHandle;
}
public enum SECURITY_IMPERSONATION_LEVEL
{
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
}
public enum TOKEN_TYPE
{
TokenPrimary = 1,
TokenImpersonation
}
public const int GENERIC_ALL_ACCESS = 0x10000000;
[DllImport("kernel32.dll", SetLastError = true,
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", SetLastError = true,
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool CreateProcessAsUser(
IntPtr hToken,
string lpApplicationName,
string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
bool bInheritHandle,
Int32 dwCreationFlags,
IntPtr lpEnvrionment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool DuplicateTokenEx(
IntPtr hExistingToken,
Int32 dwDesiredAccess,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
Int32 ImpersonationLevel,
Int32 dwTokenType,
ref IntPtr phNewToken);
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSQueryUserToken(
Int32 sessionId,
out IntPtr Token);
[DllImport("userenv.dll", SetLastError = true)]
private static extern bool CreateEnvironmentBlock(
out IntPtr lpEnvironment,
IntPtr hToken,
bool bInherit);
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public enum ErrorCode
{
MSP_SUCCESS = 0,
MSP_ERROR_FAIL = -1,
MSP_ERROR_EXCEPTION = -2,
/* General errors 10100(0x2774) */
MSP_ERROR_GENERAL = 10100, /* 0x2774 */
MSP_ERROR_OUT_OF_MEMORY = 10101, /* 0x2775 */
MSP_ERROR_FILE_NOT_FOUND = 10102, /* 0x2776 */
MSP_ERROR_NOT_SUPPORT = 10103, /* 0x2777 */
MSP_ERROR_NOT_IMPLEMENT = 10104, /* 0x2778 */
MSP_ERROR_ACCESS = 10105, /* 0x2779 */
MSP_ERROR_INVALID_PARA = 10106, /* 0x277A */
MSP_ERROR_INVALID_PARA_VALUE = 10107, /* 0x277B */
MSP_ERROR_INVALID_HANDLE = 10108, /* 0x277C */
MSP_ERROR_INVALID_DATA = 10109, /* 0x277D */
MSP_ERROR_NO_LICENSE = 10110, /* 0x277E */
MSP_ERROR_NOT_INIT = 10111, /* 0x277F */
MSP_ERROR_NULL_HANDLE = 10112, /* 0x2780 */
MSP_ERROR_OVERFLOW = 10113, /* 0x2781 */
MSP_ERROR_TIME_OUT = 10114, /* 0x2782 */
MSP_ERROR_OPEN_FILE = 10115, /* 0x2783 */
MSP_ERROR_NOT_FOUND = 10116, /* 0x2784 */
MSP_ERROR_NO_ENOUGH_BUFFER = 10117, /* 0x2785 */
MSP_ERROR_NO_DATA = 10118, /* 0x2786 */
MSP_ERROR_NO_MORE_DATA = 10119, /* 0x2787 */
MSP_ERROR_SKIPPED = 10120, /* 0x2788 */
MSP_ERROR_ALREADY_EXIST = 10121, /* 0x2789 */
MSP_ERROR_LOAD_MODULE = 10122, /* 0x278A */
MSP_ERROR_BUSY = 10123, /* 0x278B */
MSP_ERROR_INVALID_CONFIG = 10124, /* 0x278C */
MSP_ERROR_VERSION_CHECK = 10125, /* 0x278D */
MSP_ERROR_CANCELED = 10126, /* 0x278E */
MSP_ERROR_INVALID_MEDIA_TYPE = 10127, /* 0x278F */
MSP_ERROR_CONFIG_INITIALIZE = 10128, /* 0x2790 */
MSP_ERROR_CREATE_HANDLE = 10129, /* 0x2791 */
MSP_ERROR_CODING_LIB_NOT_LOAD = 10130, /* 0x2792 */
/* Error codes of network 10200(0x27D8)*/
MSP_ERROR_NET_GENERAL = 10200, /* 0x27D8 */
MSP_ERROR_NET_OPENSOCK = 10201, /* 0x27D9 */ /* Open socket */
MSP_ERROR_NET_CONNECTSOCK = 10202, /* 0x27DA */ /* Connect socket */
MSP_ERROR_NET_ACCEPTSOCK = 10203, /* 0x27DB */ /* Accept socket */
MSP_ERROR_NET_SENDSOCK = 10204, /* 0x27DC */ /* Send socket data */
MSP_ERROR_NET_RECVSOCK = 10205, /* 0x27DD */ /* Recv socket data */
MSP_ERROR_NET_INVALIDSOCK = 10206, /* 0x27DE */ /* Invalid socket handle */
MSP_ERROR_NET_BADADDRESS = 10207, /* 0x27EF */ /* Bad network address */
MSP_ERROR_NET_BINDSEQUENCE = 10208, /* 0x27E0 */ /* Bind after listen/connect */
MSP_ERROR_NET_NOTOPENSOCK = 10209, /* 0x27E1 */ /* Socket is not opened */
MSP_ERROR_NET_NOTBIND = 10210, /* 0x27E2 */ /* Socket is not bind to an address */
MSP_ERROR_NET_NOTLISTEN = 10211, /* 0x27E3 */ /* Socket is not listenning */
MSP_ERROR_NET_CONNECTCLOSE = 10212, /* 0x27E4 */ /* The other side of connection is closed */
MSP_ERROR_NET_NOTDGRAMSOCK = 10213, /* 0x27E5 */ /* The socket is not datagram type */
/* Error codes of mssp message 10300(0x283C) */
MSP_ERROR_MSG_GENERAL = 10300, /* 0x283C */
MSP_ERROR_MSG_PARSE_ERROR = 10301, /* 0x283D */
MSP_ERROR_MSG_BUILD_ERROR = 10302, /* 0x283E */
MSP_ERROR_MSG_PARAM_ERROR = 10303, /* 0x283F */
MSP_ERROR_MSG_CONTENT_EMPTY = 10304, /* 0x2840 */
MSP_ERROR_MSG_INVALID_CONTENT_TYPE = 10305, /* 0x2841 */
MSP_ERROR_MSG_INVALID_CONTENT_LENGTH = 10306, /* 0x2842 */
MSP_ERROR_MSG_INVALID_CONTENT_ENCODE = 10307, /* 0x2843 */
MSP_ERROR_MSG_INVALID_KEY = 10308, /* 0x2844 */
MSP_ERROR_MSG_KEY_EMPTY = 10309, /* 0x2845 */
MSP_ERROR_MSG_SESSION_ID_EMPTY = 10310, /* 0x2846 */
MSP_ERROR_MSG_LOGIN_ID_EMPTY = 10311, /* 0x2847 */
MSP_ERROR_MSG_SYNC_ID_EMPTY = 10312, /* 0x2848 */
MSP_ERROR_MSG_APP_ID_EMPTY = 10313, /* 0x2849 */
MSP_ERROR_MSG_EXTERN_ID_EMPTY = 10314, /* 0x284A */
MSP_ERROR_MSG_INVALID_CMD = 10315, /* 0x284B */
MSP_ERROR_MSG_INVALID_SUBJECT = 10316, /* 0x284C */
MSP_ERROR_MSG_INVALID_VERSION = 10317, /* 0x284D */
MSP_ERROR_MSG_NO_CMD = 10318, /* 0x284E */
MSP_ERROR_MSG_NO_SUBJECT = 10319, /* 0x284F */
MSP_ERROR_MSG_NO_VERSION = 10320, /* 0x2850 */
MSP_ERROR_MSG_MSSP_EMPTY = 10321, /* 0x2851 */
MSP_ERROR_MSG_NEW_RESPONSE = 10322, /* 0x2852 */
MSP_ERROR_MSG_NEW_CONTENT = 10323, /* 0x2853 */
MSP_ERROR_MSG_INVALID_SESSION_ID = 10324, /* 0x2854 */
/* Error codes of DataBase 10400(0x28A0)*/
MSP_ERROR_DB_GENERAL = 10400, /* 0x28A0 */
MSP_ERROR_DB_EXCEPTION = 10401, /* 0x28A1 */
MSP_ERROR_DB_NO_RESULT = 10402, /* 0x28A2 */
MSP_ERROR_DB_INVALID_USER = 10403, /* 0x28A3 */
MSP_ERROR_DB_INVALID_PWD = 10404, /* 0x28A4 */
MSP_ERROR_DB_CONNECT = 10405, /* 0x28A5 */
MSP_ERROR_DB_INVALID_SQL = 10406, /* 0x28A6 */
MSP_ERROR_DB_INVALID_APPID = 10407, /* 0x28A7 */
/* Error codes of Resource 10500(0x2904)*/
MSP_ERROR_RES_GENERAL = 10500, /* 0x2904 */
MSP_ERROR_RES_LOAD = 10501, /* 0x2905 */ /* Load resource */
MSP_ERROR_RES_FREE = 10502, /* 0x2906 */ /* Free resource */
MSP_ERROR_RES_MISSING = 10503, /* 0x2907 */ /* Resource File Missing */
MSP_ERROR_RES_INVALID_NAME = 10504, /* 0x2908 */ /* Invalid resource file name */
MSP_ERROR_RES_INVALID_ID = 10505, /* 0x2909 */ /* Invalid resource ID */
MSP_ERROR_RES_INVALID_IMG = 10506, /* 0x290A */ /* Invalid resource image pointer */
MSP_ERROR_RES_WRITE = 10507, /* 0x290B */ /* Write read-only resource */
MSP_ERROR_RES_LEAK = 10508, /* 0x290C */ /* Resource leak out */
MSP_ERROR_RES_HEAD = 10509, /* 0x290D */ /* Resource head currupt */
MSP_ERROR_RES_DATA = 10510, /* 0x290E */ /* Resource data currupt */
MSP_ERROR_RES_SKIP = 10511, /* 0x290F */ /* Resource file skipped */
/* Error codes of TTS 10600(0x2968)*/
MSP_ERROR_TTS_GENERAL = 10600, /* 0x2968 */
MSP_ERROR_TTS_TEXTEND = 10601, /* 0x2969 */ /* Meet text end */
MSP_ERROR_TTS_TEXT_EMPTY = 10602, /* 0x296A */ /* no synth text */
/* Error codes of Recognizer 10700(0x29CC) */
MSP_ERROR_REC_GENERAL = 10700, /* 0x29CC */
MSP_ERROR_REC_INACTIVE = 10701, /* 0x29CD */
MSP_ERROR_REC_GRAMMAR_ERROR = 10702, /* 0x29CE */
MSP_ERROR_REC_NO_ACTIVE_GRAMMARS = 10703, /* 0x29CF */
MSP_ERROR_REC_DUPLICATE_GRAMMAR = 10704, /* 0x29D0 */
MSP_ERROR_REC_INVALID_MEDIA_TYPE = 10705, /* 0x29D1 */
MSP_ERROR_REC_INVALID_LANGUAGE = 10706, /* 0x29D2 */
MSP_ERROR_REC_URI_NOT_FOUND = 10707, /* 0x29D3 */
MSP_ERROR_REC_URI_TIMEOUT = 10708, /* 0x29D4 */
MSP_ERROR_REC_URI_FETCH_ERROR = 10709, /* 0x29D5 */
/* Error codes of Speech Detector 10800(0x2A30) */
MSP_ERROR_EP_GENERAL = 10800, /* 0x2A30 */
MSP_ERROR_EP_NO_SESSION_NAME = 10801, /* 0x2A31 */
MSP_ERROR_EP_INACTIVE = 10802, /* 0x2A32 */
MSP_ERROR_EP_INITIALIZED = 10803, /* 0x2A33 */
/* Error codes of TUV */
MSP_ERROR_TUV_GENERAL = 10900, /* 0x2A94 */
MSP_ERROR_TUV_GETHIDPARAM = 10901, /* 0x2A95 */ /* Get Busin Param huanid*/
MSP_ERROR_TUV_TOKEN = 10902, /* 0x2A96 */ /* Get Token */
MSP_ERROR_TUV_CFGFILE = 10903, /* 0x2A97 */ /* Open cfg file */
MSP_ERROR_TUV_RECV_CONTENT = 10904, /* 0x2A98 */ /* received content is error */
MSP_ERROR_TUV_VERFAIL = 10905, /* 0x2A99 */ /* Verify failure */
/* Error codes of IMTV */
MSP_ERROR_IMTV_SUCCESS = 11000, /* 0x2AF8 */ /* 成功 */
MSP_ERROR_IMTV_NO_LICENSE = 11001, /* 0x2AF9 */ /* 试用次数结束,用户需要付费 */
MSP_ERROR_IMTV_SESSIONID_INVALID = 11002, /* 0x2AFA */ /* SessionId失效,需要重新登录通行证 */
MSP_ERROR_IMTV_SESSIONID_ERROR = 11003, /* 0x2AFB */ /* SessionId为空,或者非法 */
MSP_ERROR_IMTV_UNLOGIN = 11004, /* 0x2AFC */ /* 未登录通行证 */
MSP_ERROR_IMTV_SYSTEM_ERROR = 11005, /* 0x2AFD */ /* 系统错误 */
/* Error codes of HCR */
MSP_ERROR_HCR_GENERAL = 11100,
MSP_ERROR_HCR_RESOURCE_NOT_EXIST = 11101,
/* Error codes of http 12000(0x2EE0) */
MSP_ERROR_HTTP_BASE = 12000, /* 0x2EE0 */
/*Error codes of ISV */
MSP_ERROR_ISV_NO_USER = 13000, /* 32C8 */ /* the user doesn't exist */
}
/// <summary>
/// vol参数的枚举常量
/// </summary>
public enum EnuVol
{
x_soft,
soft,
medium,
loud,
x_loud
}
/// <summary>
/// speed语速参数的枚举常量
/// </summary>
public enum EnuSpeed
{
x_slow,
slow,
medium,
fast,
x_fast
}
/// <summary>
/// speeker朗读者枚举常量
/// </summary>
public enum EnuSpeeker
{
小燕_青年女声_中英文_普通话 = 0,
小宇_青年男声_中英文_普通话,
凯瑟琳_青年女声_英语,
亨利_青年男声_英语,
玛丽_青年女声_英语,
小研_青年女声_中英文_普通话,
小琪_青年女声_中英文_普通话,
小峰_青年男声_中英文_普通话,
小梅_青年女声_中英文_粤语,
小莉_青年女声_中英文_台普,
小蓉_青年女声_汉语_四川话,
小芸_青年女声_汉语_东北话,
小坤_青年男声_汉语_河南话,
小强_青年男声_汉语_湖南话,
小莹_青年女声_汉语_陕西话,
小新_童年男声_汉语_普通话,
楠楠_童年女声_汉语_普通话,
老孙_老年男声_汉语_普通话
}
public enum SynthStatus
{
MSP_TTS_FLAG_STILL_HAVE_DATA = 1,
MSP_TTS_FLAG_DATA_END = 2,
MSP_TTS_FLAG_CMD_CANCELED = 0
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
/// <summary>
/// WAV语音音频头
/// </summary>
public struct WAVE_Header
{
public int RIFF_ID;
public int File_Size;
public int RIFF_Type;
public int FMT_ID;
public int FMT_Size;
public short FMT_Tag;
public ushort FMT_Channel;
public int FMT_SamplesPerSec;
public int AvgBytesPerSec;
public ushort BlockAlign;
public ushort BitsPerSample;
public int DATA_ID;
public int DATA_Size;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace JmpCommon
{
public class Win32API
{
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SYSTEMTIME Time);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SYSTEMTIME Time);
}
/// <summary>
///
/// </summary>
public struct SYSTEMTIME
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
/// <summary>
/// 从System.DateTime转换。
/// </summary>
/// <param name="time">System.DateTime类型的时间。</param>
public void FromDateTime(DateTime time)
{
wYear = (ushort)time.Year;
wMonth = (ushort)time.Month;
wDayOfWeek = (ushort)time.DayOfWeek;
wDay = (ushort)time.Day;
wHour = (ushort)time.Hour;
wMinute = (ushort)time.Minute;
wSecond = (ushort)time.Second;
wMilliseconds = (ushort)time.Millisecond;
}
/// <summary>
/// 转换为System.DateTime类型。
/// </summary>
/// <returns></returns>
public DateTime ToDateTime()
{
return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
}
/// <summary>
/// 静态方法。转换为System.DateTime类型。
/// </summary>
/// <param name="time">SYSTEMTIME类型的时间。</param>
/// <returns></returns>
public static DateTime ToDateTime(SYSTEMTIME time)
{
return time.ToDateTime();
}
}
}
using JmpCommon;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Media;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JmpCommon
{
/// <summary>
/// 讯飞语音离线生成
/// </summary>
public class XfVioceMsc
{
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int MSPLogin(string user, string password, string configs);
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int MSPLogout();
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern IntPtr QTTSSessionBegin(string _params, ref int errorCode);
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int QTTSTextPut(string sessionID, string textString, uint textLen, string _params);
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern IntPtr QTTSAudioGet(string sessionID, ref uint audioLen, ref SynthStatus synthStatus, ref int errorCode);
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern IntPtr QTTSAudioInfo(string sessionID);
[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int QTTSSessionEnd(string sessionID, string hints);
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int memcpy(IntPtr dst, IntPtr src, uint count);
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe int memcpy(void* dst, void* src, uint count);
private static int _ret = 0;
private static IntPtr _sessionId;
private static object syncObj = new object();
/// <summary>
/// 文字转语音
/// </summary>
/// <param name="text">文本</param>
/// <param name="online">是否在线生成</param>
public static void Text2Voice(string text, bool online = false)
{
try
{
lock (syncObj)
{
if (string.IsNullOrEmpty(text))
{
return;
}
else
{
//校验资源文件是否存在
if (!File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "msc.dll"))
{
Log.WorkLog("\"msc.dll\"文件不存在", "文件丢失");
return;
}
//校验资源文件是否存在
if (!File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "msc_x64.dll"))
{
Log.WorkLog("\"msc_x64.dll\"文件不存在", "文件丢失");
return;
}
//校验资源文件是否存在
if (!File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "tts\\common.jet"))
{
Log.WorkLog("\"common.jet\"文件不存在", "文件丢失");
return;
}
//校验资源文件是否存在
if (!File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "tts\\xiaofeng.jet"))
{
Log.WorkLog("\"xiaofeng.jet\"文件不存在", "文件丢失");
return;
}
//校验资源文件是否存在
if (!File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "tts\\xiaoyan.jet"))
{
Log.WorkLog("\"xiaoyan.jet\"文件不存在", "文件丢失");
return;
}
///APPID请勿随意改动
string login_configs = "appid =5f6abdf9 ";//登录参数,自己注册后获取的appid
//string filename = "D:\\p.wav"; //合成的语音文件
uint audio_len = 0;
SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
_ret = MSPLogin(string.Empty, string.Empty, login_configs);//第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在http://open.voicecloud.cn
//MSPLogin方法返回失败
if (_ret != (int)ErrorCode.MSP_SUCCESS)
{
Log.WorkLog($"MSPLogin失败,错误码\"{_ret}\"", "MSPLogin");
return;
}
string _params = string.Empty;
if (online)
{
_params = "ssm=1,ent=sms16k,vcn=xiaoyan,spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000";
}
else
{
var dir = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
_params = $"aue=speex-wb;7,auf=audio/L16,ssm=1,ent=sms16k,vol=10,engine_type = local, voice_name=xiaoyan, tts_res_path =fo|{dir}\\tts\\xiaoyan.jet;fo|{dir}\\tts\\common.jet";
}
//string _params = "ssm=1,ent=sms16k,vcn=xiaoyan,spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000";
//string _params = "ssm=1,ent=sms16k,engine_type = local,vcn=xiaoyan,spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000";
_sessionId = QTTSSessionBegin(_params, ref _ret);
//QTTSSessionBegin方法返回失败
if (_ret != (int)ErrorCode.MSP_SUCCESS)
{
Log.WorkLog($"QTTSSessionBegin失败,错误码\"{_ret}\"", "QTTSSessionBegin");
return;
}
_ret = QTTSTextPut(Ptr2Str(_sessionId), text, (uint)Encoding.Default.GetByteCount(text), string.Empty);
//QTTSTextPut方法返回失败
if (_ret != (int)ErrorCode.MSP_SUCCESS)
{
Log.WorkLog($"QTTSTextPut失败,错误码\"{_ret}\"", "QTTSTextPut");
return;
}
using (MemoryStream memoryStream = new MemoryStream())
{
memoryStream.Write(new byte[44], 0, 44);
var _ptr = Ptr2Str(_sessionId);
var _arrList = new List<byte>();
while (true)
{
IntPtr _src_ptr = QTTSAudioGet(_ptr, ref audio_len, ref synth_status, ref _ret);
byte[] array = new byte[audio_len];
if (audio_len > 0 && _src_ptr != IntPtr.Zero)
{
unsafe
{
fixed (byte* _dest_ptr = array)
{
memcpy(_dest_ptr, _src_ptr.ToPointer(), audio_len);
}
}
_arrList.AddRange(array);
}
if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || _ret != 0)
{
memoryStream.Write(_arrList.ToArray(), 0, _arrList.Count);
break;
}
}
WAVE_Header wave_Header = GetWaveHeader((int)memoryStream.Length - 44);
byte[] array2 = StructToBytes(wave_Header);
memoryStream.Position = 0L;
memoryStream.Write(array2, 0, array2.Length);
memoryStream.Position = 0L;
using (SoundPlayer soundPlayer = new SoundPlayer(memoryStream))
{
soundPlayer.Stop();
soundPlayer.Play();
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
}
finally
{
_ret = QTTSSessionEnd(Ptr2Str(_sessionId), "");
_ret = MSPLogout();//退出登录
}
}
/// <summary>
/// 结构体初始化赋值
/// </summary>
/// <param name="data_len"></param>
/// <returns></returns>
private static WAVE_Header GetWaveHeader(int data_len)
{
return new WAVE_Header
{
RIFF_ID = 1179011410,
File_Size = data_len + 36,
RIFF_Type = 1163280727,
FMT_ID = 544501094,
FMT_Size = 16,
FMT_Tag = 1,
FMT_Channel = 1,
FMT_SamplesPerSec = 16000,
AvgBytesPerSec = 32000,
BlockAlign = 2,
BitsPerSample = 16,
DATA_ID = 1635017060,
DATA_Size = data_len
};
}
/// <summary>
/// 结构体转字符串
/// </summary>
/// <param name="structure"></param>
/// <returns></returns>
private static byte[] StructToBytes(object structure)
{
int num = Marshal.SizeOf(structure);
IntPtr intPtr = Marshal.AllocHGlobal(num);
byte[] result;
try
{
Marshal.StructureToPtr(structure, intPtr, false);
byte[] array = new byte[num];
Marshal.Copy(intPtr, array, 0, num);
result = array;
}
finally
{
Marshal.FreeHGlobal(intPtr);
}
return result;
}
/// 指针转字符串
/// </summary>
/// <param name="p">指向非托管代码字符串的指针</param>
/// <returns>返回指针指向的字符串</returns>
private static string Ptr2Str(IntPtr p)
{
if (p == IntPtr.Zero) { return string.Empty; }
List<byte> lb = new List<byte>();
while (Marshal.ReadByte(p) != 0)
{
lb.Add(Marshal.ReadByte(p));
p = p + 1;
}
byte[] bs = lb.ToArray();
return Encoding.Default.GetString(lb.ToArray());
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="LiteDB" version="5.0.8" targetFramework="net45" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net45" />
<package id="System.Management" version="4.7.0" targetFramework="net45" />
</packages>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2D595EED-41D5-48DF-8121-600E08F2C273}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>JmpRestart</RootNamespace>
<AssemblyName>JmpRestart</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Programe\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>..\Programe\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>restart.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="restart.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace JmpRestart
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}] 参数为空...");
Console.ReadKey();
return;
}
else
{
var path = HttpUtility.UrlDecode(args[0], Encoding.UTF8);
if (!File.Exists(path))
{
Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}] 程序文件不存在...");
Console.ReadKey();
}
else
{
Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}] 重启软件中...");
var process = Process.GetProcessesByName("JmpServiceMgr");
if (process.Length > 0)
{
Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}] 关闭已有进程...");
foreach (var item in process)
{
item.Kill();
}
}
Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}] - 启动通道程序...");
Process.Start(path);
}
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("JmpReset")]
[assembly: AssemblyDescription("钧普通道服务启动器")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Junmp")]
[assembly: AssemblyProduct("JmpReset")]
[assembly: AssemblyCopyright("Copyright © Junmp 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("2d595eed-41d5-48df-8121-600e08f2c273")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]

namespace JmpServiceMgr
{
partial class AutoClosingMessageBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AutoClosingMessageBox));
this.btnClose = new DevComponents.DotNetBar.ButtonX();
this.btnOk = new DevComponents.DotNetBar.ButtonX();
this.lb_msg = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// btnClose
//
this.btnClose.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnClose.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnClose.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnClose.Location = new System.Drawing.Point(202, 159);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(96, 40);
this.btnClose.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnClose.TabIndex = 8;
this.btnClose.Text = "取消";
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
//
// btnOk
//
this.btnOk.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnOk.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnOk.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnOk.Location = new System.Drawing.Point(74, 159);
this.btnOk.Name = "btnOk";
this.btnOk.Size = new System.Drawing.Size(96, 40);
this.btnOk.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnOk.TabIndex = 7;
this.btnOk.Text = "确定";
this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
//
// lb_msg
//
this.lb_msg.BackColor = System.Drawing.Color.White;
this.lb_msg.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lb_msg.ForeColor = System.Drawing.Color.Black;
this.lb_msg.Location = new System.Drawing.Point(71, 58);
this.lb_msg.Name = "lb_msg";
this.lb_msg.Size = new System.Drawing.Size(242, 49);
this.lb_msg.TabIndex = 11;
this.lb_msg.Text = "msg";
this.lb_msg.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// AutoClosingMessageBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(384, 211);
this.Controls.Add(this.lb_msg);
this.Controls.Add(this.btnClose);
this.Controls.Add(this.btnOk);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AutoClosingMessageBox";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.AutoClosingMessageBox_FormClosed);
this.ResumeLayout(false);
}
#endregion
private DevComponents.DotNetBar.ButtonX btnClose;
private DevComponents.DotNetBar.ButtonX btnOk;
private System.Windows.Forms.Label lb_msg;
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar.Metro;
namespace JmpServiceMgr
{
public partial class AutoClosingMessageBox : MetroForm
{
private int _count = 0;
private System.Threading.Timer _timer;
private Action _callBack;
public AutoClosingMessageBox(Form form, string content, string title, int count, Action callback)
{
InitializeComponent();
Owner = form;
this.Text = title;
lb_msg.Text = content;
_count = count;
_callBack = callback;
_timer = new System.Threading.Timer(TimerFunction, null, 0, 1000);
}
private void TimerFunction(object state)
{
if (this.IsHandleCreated)
this.Invoke(new Action(() => btnOk.Text = $"确定({_count})"));
if (_count < 0)
{
_timer.Dispose();
if (this.IsHandleCreated)
this.Invoke(new Action(() => this.btnOk_Click(null, null)));
}
_count--;
}
private void btnOk_Click(object sender, EventArgs e)
{
//执行
_timer.Dispose();
_callBack.BeginInvoke(null, null);
this.Close();
}
private void btnClose_Click(object sender, EventArgs e)
{
_timer.Dispose();
this.Close();
}
private void AutoClosingMessageBox_FormClosed(object sender, FormClosedEventArgs e)
{
btnClose_Click(null, null);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAMMOAADDDgAAAAAAAAAA
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
AACASRMAekYSAH9JFgCLTxkAmFYdAJxYHgCdWSAAnlofAJ5aHgCeWyAAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IACeWh4AnloeAJ1ZHwCcWB4AmFYeAIxOGwCBRhYAekISAIBDEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhEcZAHpAFwCWVR0Ao10gALlqJgDbfy4A//9zAE8tCQR8RhYKkVIbD5dVHRKaVx8UmlgeFZtY
HRabWR8Wm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZHxabWB0Wm1geFZlXHhSXVR0SkVIdD31GGApRKQkE//9zANt/
LgC5aiUAo10gAJhWHQB2RBQAgUoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRHGABnNREAolwgANqALQB7RRYIolwfJK1jIkq1aCRwumslj7xs
JqjAbie2wm8nwsJvJ8rDcCjOw3Ao0MNwJ9HEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLDcCfRw3Ao0MNw
KM7DbyfKwm8nw8BuJ7a8ayaoumolj7ZoJHCuYyNKolwgJX9IFwjegC8Aol0gAF42EgB/SRkAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiNAkA/6VDAJ9bHgD/u0UAn1ofHbRn
JGS+bSetxXEo3slzKfbLdSr/zXYq/812Kv/Ndir/zXYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/zXYq/812Kv/Ndir/zXYq/8t1Kv/JdCn2xXEo375t
Jq+0ZyRln1sfHf+xQACfWx8A/6JHAFpECQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJVU
HQB/SBcAwG8oAJdWHBW1aCRxw3Ao0st0KfvNdir/znYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/LdSn8w3Ao0bVoJHCWVRwVwm4oAH5IFwCUVB0AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABmMxEAmVgfAJFTHQD//24AqWEhO79uJ7vKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0
Kfy/bie7qGAhPP//dgCSUhwAm1ceAGYzEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACaVx4AmVgeACgXAwKwZSNaxHEo4M12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4bBlI1osFgICmVceAJpXHgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJRT
HACRUhwAMRcGArVoJGXIcynszXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8hz
Ke21aCRlMBYGApFTHACUVBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAg0QIAIJJFgD//3oAsWUjW8hzKe3Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/IcynssGUjWv//eQCASBYAg0QJAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6NMAL1tKACoYCE8xHAo4c12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4ahg
ITy9bSgA/6FIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACQUxcAolwfAJdVHBW/bia7zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/79uJruXVhwVoVwfAI5UFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzQRAA/79KALRnJHLKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy1ZyRx/7RHAHFF
EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRMGACjXR8An1seHsNw
KNLNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/852Kv/DcCjSn1sfHaJdIACBRxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHtHFQDbfi0As2ckZcp1KfzNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/KdSn7s2ckZNp/LgB2QBQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJdWHQB9RxcIvm0mrs12Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/811Kf/NdSn/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/vm0mrnxFFgiWVR0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNd
IAChXCAkxXEo3s52Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdSj/zXUp/9OFQv/ThUL/zXUp/8x1
KP/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Odir/xXEo36JcHySjXSAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALlrJgCuYyJLyXQp9s12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQo/812
Kv/VjE3/5ruV//bn2v/259r/5ruV/9WMTf/Ndir/zHQo/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/yXMp9q5j
Ikq5aiYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk1QWAN2ALgC2aCRxy3Uq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/811KP/Ndir/1Y1O/+jAnf/57uT///////////////////////nu5P/owJ3/1Y1O/812
Kv/NdSj/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/y3Uq/7ZoJXDcfy0AlE4XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAdEMRAP//gwC5aiWQzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/zHQo/9OHRf/nvJf/+e7k////////////////////
////////////////////////+e7k/+e8l//Th0X/zHQo/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/7pqJY///3kAeEESAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEgVAFIsCQW8bCaozXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//QfTb/4ax///bn
2f/////////////////////////////////////////////////////////////////259n/4ax//9B9
Nv/MdCf/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/7xsJqhRKwsFgEcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjE4aAH1F
FgrAbie2zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/NdSn/zXYp/9iUWf/w1b7//vz6////////////////////////////////////////////////////
/////////////////////////vz6//DVvv/YlFn/zXYp/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8BuJ7Z7RhYKik4aAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAmFYdAJFRGw/CbyfCzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//Qfjb/5LWM//rw6P//////////////////////////////
///////////////////////////////////////////////////////////////////68Oj/5LWM/9B+
Nv/MdCf/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8Jv
J8KRURsPmFYdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnFgeAJhVHRLCbyfKznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQn/9WMTf/v0rr//v38////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////v38/+/Suv/VjE3/zHQn/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8JvJ8qYVR0SnFgeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnFkfAJlXHhTDcCjOznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kf/Ndir/3J5o//bn2v//////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////259r/3J5o/812
Kv/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8NwKM6ZVx4UnFkfAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpYHRXDcCfQznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXUp/854LP/hrH7/+/Ps////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////+/Ps/+Gsfv/OeCz/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8NwJ9CaWB0VnVkeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpX
HRbDcCfRznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/znku/+S1jP/8+PT/////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////z49P/ktYz/znku/811
Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RwKNKbWB4WnlofAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlogAJtZHxbEcCjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kf/OeC7/5beP//369///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////9+vf/5beP/854Lv/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/813K//jsYb//fn2////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////fn2/+Oxhv/Ndyv/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQo/92ib//79fD/////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////v18P/dom//zHQo/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdSj/1o5Q//fq3v//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////36t7/1o5Q/8x1KP/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/811Kf/PfDT/7tG4////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////7tG4/898NP/NdSn/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//gqXr//vv5////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////vv5/+Cpev/MdCf/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXUp/9GCPf/04dH/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////Th
0f/Rgj3/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQn/+Cpef/+/Pv/////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////78+//gqXn/zHQn/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znow/+/U
vf//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////v1L3/znow/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/NdSj/1YxM//rw6P//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////68Oj/1YxM/811KP/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/3qNx//78+v//////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////+/Pr/3qNx/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/47OJ////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////47OJ/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LWL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LWL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlogAJtZHxbEcCjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpXHRbDcCfRznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RwKNKbWB4WnlofAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnVkeAJpYHRXDcCfQznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8NwJ9CaWB0VnVkeAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnFkfAJhXHhTDcCjOznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8NwKM6YVx4UnFkfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm1geAJdV
HRLCbyfKznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8JvJ8qXVR0Sm1geAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAmFYdAJFRGw/CbyfCzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LWM////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LWM/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8Jv
J8KRUhwPmFYdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAik4aAHpFFgq/bie2zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/4rCE//369///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///9+vf/4rCE/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8BuJ7Z8RhYKi08aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgEcXAFErCwW8bCaozXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndin/0YI8/9ubZf/isYb/68eo//Lcyf/47OL//Pj0///+
/f//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////v3//Pj0//js4v/y3Mn/68eo/+Kxhv/bm2X/0YI8/812Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/7xsJqhRKwsFf0YWAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEESAP//eQC6aiWPzXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXUp/8x0
J//MdCf/zXYq/898M//Th0X/2Zhf/+Gsfv/pw6H/8djC//fq3v/89vH//v79////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////v79//z28f/36t7/8djC/+nDof/hrH7/2Zhf/9OHRf/PfDP/zXYq/8x0J//MdCf/zXUp/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/7pqJZD//4sAdj0RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlE4XANx/
LQC2aCVwy3Uq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kf/NdSj/zHQn/8x0J//NdSn/z3sx/9KE
Qf/YlFj/36h4/+e+mv/v07z/9ubY//v07v/+/Pr/////////////////////////////////////////
//////////////78+v/79O7/9ubY/+/TvP/nvpr/36h4/9iUWP/ShEH/z3sx/811Kf/MdCf/zHQn/811
KP/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/y3Uq/7ZoJXHdgC4AkEwWAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALlqJgCuYyJKyXMp9s12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYp/811KP/MdCf/zHQm/811KP/OeS//0YI9/9aQUv/do2//5bmS/+7P
tf/149P/+vLr//77+f/++/n/+vLr//Xj0//uz7X/5bmS/92jb//WkFL/0YI9/855L//NdSj/zHQm/8x0
J//NdSj/zXYp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/yXQp9q5j
I0u5ayUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNdIACiXR8kxXEo3s52
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXUp/8x0J//MdCb/zHQn/854Lf/Qfzj/1o5P/9yhbP/coWz/1o5P/9B/OP/OeC3/zHQn/8x0
Jv/MdCf/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Odir/xXEo3qFdHySjXR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJdWHQB8RhcIvm0mrs12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/zHUo/8x0
Jv/MdCb/zHUo/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/vm0nr39JFwiYVx0AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZAFADbfy4As2YkZMp1KfvNdir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/KdSn8s2ckZdt+LQB5RhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFH
FwChXR8AnVseHcNwKNHOdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/DcCjSn1seHqNdIACETBgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRA0A/7hKALRnJHHKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy0aCRx/7ZHAHNC
EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOVBYAoVweAJZW
HBW/bia7zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/79uJruYVhsVoVweAI1RFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/59GAL9tJwCoYCE7xHAo4M12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4ahgIDy+bScA/6JKAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbkQJAH9IFgD//3QAsGUjWshz
KezNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/IcynssGUjWv//
fgCBSBUAg0QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJRUGwCRUhsALxgGArVoJGXIcynszXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/8hzKey1aCRlMRYGApFTHACTVBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZVx4AmVcdACoVAAKwZSNaxHEo4c12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4LBlI1ooFwICmVgeAJpXHgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABmMxEAmVcdAJFTHAD//3MAqGAgPL9uJrvKdCn8zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy/bie7qWEhO///
bgCRUx0AmVgfAGYzEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJNUHQB9RxcAwW8oAJdVGxW1aCRxw3Ao0ct0
KfzNdir/znYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/812
Kv/LdCn7w3Ao0rVoJHGWVhwVv24nAH5HFwCTVB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABaMAkA/7BHAJ9aHgD/tD8An1sfHbRnJGW+bSetxXEo38lzKfbLdSr/zXYq/812Kv/Ndir/zXYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/zXYq/812
Kv/Ndir/zXYq/8t1Kv/Jcyn2xXEo3r5tJq20ZyRkn1ofHf+2QgCfWx4A/6FBAGE0CgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBKGgBgNhMAo10gANx/LQB8RBgIolwfJa1j
Ikq2aCVwumsmj7xsJqjAbie2wW8nwsJvJ8rDcCjOw3Ao0MNwJ9HEcCjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRw
KNLDcCfRw3Ao0MNwKM7CbyjJwm8nwsBuJ7a7bCanumolj7ZoJHCtYyJKol0fJHtFFQjcfy4AolwfAGE3
EQCASRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgUkYAHZEFgCXVB4Ao10fALpqJQDbfi0A//9xAFEpDAR7RRcKkVIcD5ZVHRKaVx8UmlgeFZtY
HRabWR8Wm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZHxabWB0WmlgeFZpXHxSXVR4SkVEbD3tEFgpNKwkE//9pANp+
LQC5aiYAo14gAJZVHAB0QBQAgEcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQxQAekISAIBG
FwCLThoAl1YdAJtYHgCdWSAAnlofAJ5aHgCeWiAAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5aIACeWh4AnlofAJ5Z
IACcWB8AmFUdAIpNGgB+SBYAdT8TAHxEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////
//////////////////////gAAAAAAAAf/////wAAAAAAAAAA/////AAAAAAAAAAAP///8AAAAAAAAAAA
D///4AAAAAAAAAAAB///gAAAAAAAAAAAAf//gAAAAAAAAAAAAf//AAAAAAAAAAAAAP/+AAAAAAAAAAAA
AH/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/4AAAAAAAAAAAAAB/4AAAAAAAAAAAA
AB/4AAAAAAAAAAAAAB/4AAAAAAAAAAAAAB/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/4AAAAAAAAAAAAAB/4AAAAAAAAAAAA
AB/4AAAAAAAAAAAAAB/4AAAAAAAAAAAAAB/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/8AAAAAAAAAAAA
AD/+AAAAAAAAAAAAAH//AAAAAAAAAAAAAP//gAAAAAAAAAAAAf//gAAAAAAAAAAAAf//4AAAAAAAAAAA
B///8AAAAAAAAAAAD////AAAAAAAAAAAP////wAAAAAAAAAA//////gAAAAAAAAf////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
using DevComponents.DotNetBar;
namespace JmpServiceMgr
{
partial class FrmConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmConfig));
this.btnSave = new DevComponents.DotNetBar.ButtonX();
this.btnColse = new DevComponents.DotNetBar.ButtonX();
this.labelX1 = new DevComponents.DotNetBar.LabelX();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.tb_mqttPort = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label3 = new System.Windows.Forms.Label();
this.tb_mqttIp = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label2 = new System.Windows.Forms.Label();
this.cbb_textUser = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.tb_shelf = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label13 = new System.Windows.Forms.Label();
this.txt_upload = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label9 = new System.Windows.Forms.Label();
this.txt_secretkey = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label12 = new System.Windows.Forms.Label();
this.txt_appkey = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label11 = new System.Windows.Forms.Label();
this.txtDomain = new DevComponents.DotNetBar.Controls.TextBoxX();
this.label10 = new System.Windows.Forms.Label();
this.groupBox5 = new System.Windows.Forms.GroupBox();
this.cbb_shelfPrintCom = new System.Windows.Forms.ComboBox();
this.chk_pushShelfPrint = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_changeWarehouse = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_syncFinger = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_syncFace = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.cbb_autoUpdate = new System.Windows.Forms.ComboBox();
this.cb_autoUpdate = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_shelf = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_face = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chk_ts = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.chkTest = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.labelX2 = new DevComponents.DotNetBar.LabelX();
this.superTabControl1 = new DevComponents.DotNetBar.SuperTabControl();
this.superTabControlPanel2 = new DevComponents.DotNetBar.SuperTabControlPanel();
this.superTabItem2 = new DevComponents.DotNetBar.SuperTabItem();
this.superTabControlPanel1 = new DevComponents.DotNetBar.SuperTabControlPanel();
this.superTabItem1 = new DevComponents.DotNetBar.SuperTabItem();
this.chk_syncCard = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.groupBox4.SuspendLayout();
this.groupBox5.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.superTabControl1)).BeginInit();
this.superTabControl1.SuspendLayout();
this.SuspendLayout();
//
// btnSave
//
this.btnSave.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnSave.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnSave.Location = new System.Drawing.Point(464, 701);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(96, 40);
this.btnSave.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnSave.TabIndex = 5;
this.btnSave.Text = "保存配置";
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
//
// btnColse
//
this.btnColse.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnColse.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnColse.Location = new System.Drawing.Point(592, 701);
this.btnColse.Name = "btnColse";
this.btnColse.Size = new System.Drawing.Size(96, 40);
this.btnColse.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnColse.TabIndex = 6;
this.btnColse.Text = "关闭";
this.btnColse.Click += new System.EventHandler(this.btnColse_Click);
//
// labelX1
//
this.labelX1.BackColor = System.Drawing.Color.White;
//
//
//
this.labelX1.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX1.ForeColor = System.Drawing.Color.Black;
this.labelX1.Location = new System.Drawing.Point(11, 692);
this.labelX1.Name = "labelX1";
this.labelX1.Size = new System.Drawing.Size(445, 23);
this.labelX1.TabIndex = 7;
this.labelX1.Text = "<font color=\"#008000\">(1)功率参数在10至30.5</font>";
//
// groupBox4
//
this.groupBox4.BackColor = System.Drawing.Color.White;
this.groupBox4.Controls.Add(this.tb_mqttPort);
this.groupBox4.Controls.Add(this.label3);
this.groupBox4.Controls.Add(this.tb_mqttIp);
this.groupBox4.Controls.Add(this.label2);
this.groupBox4.Controls.Add(this.cbb_textUser);
this.groupBox4.Controls.Add(this.label1);
this.groupBox4.Controls.Add(this.tb_shelf);
this.groupBox4.Controls.Add(this.label13);
this.groupBox4.Controls.Add(this.txt_upload);
this.groupBox4.Controls.Add(this.label9);
this.groupBox4.Controls.Add(this.txt_secretkey);
this.groupBox4.Controls.Add(this.label12);
this.groupBox4.Controls.Add(this.txt_appkey);
this.groupBox4.Controls.Add(this.label11);
this.groupBox4.Controls.Add(this.txtDomain);
this.groupBox4.Controls.Add(this.label10);
this.groupBox4.ForeColor = System.Drawing.Color.Black;
this.groupBox4.Location = new System.Drawing.Point(12, 340);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(387, 346);
this.groupBox4.TabIndex = 8;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "接口配置";
//
// tb_mqttPort
//
this.tb_mqttPort.BackColor = System.Drawing.Color.White;
//
//
//
this.tb_mqttPort.Border.Class = "TextBoxBorder";
this.tb_mqttPort.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.tb_mqttPort.DisabledBackColor = System.Drawing.Color.White;
this.tb_mqttPort.ForeColor = System.Drawing.Color.Black;
this.tb_mqttPort.Location = new System.Drawing.Point(303, 275);
this.tb_mqttPort.Name = "tb_mqttPort";
this.tb_mqttPort.PreventEnterBeep = true;
this.tb_mqttPort.Size = new System.Drawing.Size(56, 28);
this.tb_mqttPort.TabIndex = 29;
//
// label3
//
this.label3.AutoSize = true;
this.label3.BackColor = System.Drawing.Color.White;
this.label3.ForeColor = System.Drawing.Color.Black;
this.label3.Location = new System.Drawing.Point(245, 277);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(66, 19);
this.label3.TabIndex = 28;
this.label3.Text = "端口:";
//
// tb_mqttIp
//
this.tb_mqttIp.BackColor = System.Drawing.Color.White;
//
//
//
this.tb_mqttIp.Border.Class = "TextBoxBorder";
this.tb_mqttIp.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.tb_mqttIp.DisabledBackColor = System.Drawing.Color.White;
this.tb_mqttIp.ForeColor = System.Drawing.Color.Black;
this.tb_mqttIp.Location = new System.Drawing.Point(110, 275);
this.tb_mqttIp.Name = "tb_mqttIp";
this.tb_mqttIp.PreventEnterBeep = true;
this.tb_mqttIp.Size = new System.Drawing.Size(129, 28);
this.tb_mqttIp.TabIndex = 27;
//
// label2
//
this.label2.AutoSize = true;
this.label2.BackColor = System.Drawing.Color.White;
this.label2.ForeColor = System.Drawing.Color.Black;
this.label2.Location = new System.Drawing.Point(34, 277);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(88, 19);
this.label2.TabIndex = 26;
this.label2.Text = "MQTTIP:";
//
// cbb_textUser
//
this.cbb_textUser.BackColor = System.Drawing.Color.White;
this.cbb_textUser.ForeColor = System.Drawing.Color.Black;
this.cbb_textUser.FormattingEnabled = true;
this.cbb_textUser.Location = new System.Drawing.Point(136, 242);
this.cbb_textUser.Name = "cbb_textUser";
this.cbb_textUser.Size = new System.Drawing.Size(222, 26);
this.cbb_textUser.TabIndex = 25;
//
// label1
//
this.label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.White;
this.label1.ForeColor = System.Drawing.Color.Black;
this.label1.Location = new System.Drawing.Point(18, 245);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(142, 19);
this.label1.TabIndex = 23;
this.label1.Text = "演示模式用户:";
//
// tb_shelf
//
this.tb_shelf.BackColor = System.Drawing.Color.White;
//
//
//
this.tb_shelf.Border.Class = "TextBoxBorder";
this.tb_shelf.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.tb_shelf.DisabledBackColor = System.Drawing.Color.White;
this.tb_shelf.ForeColor = System.Drawing.Color.Black;
this.tb_shelf.Location = new System.Drawing.Point(135, 200);
this.tb_shelf.Name = "tb_shelf";
this.tb_shelf.PreventEnterBeep = true;
this.tb_shelf.Size = new System.Drawing.Size(223, 28);
this.tb_shelf.TabIndex = 22;
//
// label13
//
this.label13.AutoSize = true;
this.label13.BackColor = System.Drawing.Color.White;
this.label13.ForeColor = System.Drawing.Color.Black;
this.label13.Location = new System.Drawing.Point(47, 202);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(104, 19);
this.label13.TabIndex = 21;
this.label13.Text = "货架地址:";
//
// txt_upload
//
this.txt_upload.BackColor = System.Drawing.Color.White;
//
//
//
this.txt_upload.Border.Class = "TextBoxBorder";
this.txt_upload.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.txt_upload.DisabledBackColor = System.Drawing.Color.White;
this.txt_upload.ForeColor = System.Drawing.Color.Black;
this.txt_upload.Location = new System.Drawing.Point(135, 158);
this.txt_upload.Name = "txt_upload";
this.txt_upload.PreventEnterBeep = true;
this.txt_upload.Size = new System.Drawing.Size(223, 28);
this.txt_upload.TabIndex = 20;
//
// label9
//
this.label9.AutoSize = true;
this.label9.BackColor = System.Drawing.Color.White;
this.label9.ForeColor = System.Drawing.Color.Black;
this.label9.Location = new System.Drawing.Point(47, 160);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(104, 19);
this.label9.TabIndex = 19;
this.label9.Text = "抓拍上传:";
//
// txt_secretkey
//
this.txt_secretkey.BackColor = System.Drawing.Color.White;
//
//
//
this.txt_secretkey.Border.Class = "TextBoxBorder";
this.txt_secretkey.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.txt_secretkey.DisabledBackColor = System.Drawing.Color.White;
this.txt_secretkey.ForeColor = System.Drawing.Color.Black;
this.txt_secretkey.Location = new System.Drawing.Point(136, 116);
this.txt_secretkey.Name = "txt_secretkey";
this.txt_secretkey.PreventEnterBeep = true;
this.txt_secretkey.Size = new System.Drawing.Size(223, 28);
this.txt_secretkey.TabIndex = 18;
//
// label12
//
this.label12.AutoSize = true;
this.label12.BackColor = System.Drawing.Color.White;
this.label12.ForeColor = System.Drawing.Color.Black;
this.label12.Location = new System.Drawing.Point(59, 119);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(88, 19);
this.label12.TabIndex = 17;
this.label12.Text = "Secret:";
//
// txt_appkey
//
this.txt_appkey.BackColor = System.Drawing.Color.White;
//
//
//
this.txt_appkey.Border.Class = "TextBoxBorder";
this.txt_appkey.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.txt_appkey.DisabledBackColor = System.Drawing.Color.White;
this.txt_appkey.ForeColor = System.Drawing.Color.Black;
this.txt_appkey.Location = new System.Drawing.Point(135, 74);
this.txt_appkey.Name = "txt_appkey";
this.txt_appkey.PreventEnterBeep = true;
this.txt_appkey.Size = new System.Drawing.Size(223, 28);
this.txt_appkey.TabIndex = 16;
//
// label11
//
this.label11.AutoSize = true;
this.label11.BackColor = System.Drawing.Color.White;
this.label11.ForeColor = System.Drawing.Color.Black;
this.label11.Location = new System.Drawing.Point(59, 83);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(88, 19);
this.label11.TabIndex = 15;
this.label11.Text = "AppKey:";
//
// txtDomain
//
this.txtDomain.BackColor = System.Drawing.Color.White;
//
//
//
this.txtDomain.Border.Class = "TextBoxBorder";
this.txtDomain.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.txtDomain.DisabledBackColor = System.Drawing.Color.White;
this.txtDomain.ForeColor = System.Drawing.Color.Black;
this.txtDomain.Location = new System.Drawing.Point(135, 32);
this.txtDomain.Name = "txtDomain";
this.txtDomain.PreventEnterBeep = true;
this.txtDomain.Size = new System.Drawing.Size(223, 28);
this.txtDomain.TabIndex = 11;
//
// label10
//
this.label10.AutoSize = true;
this.label10.BackColor = System.Drawing.Color.White;
this.label10.ForeColor = System.Drawing.Color.Black;
this.label10.Location = new System.Drawing.Point(47, 34);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(104, 19);
this.label10.TabIndex = 10;
this.label10.Text = "网关地址:";
//
// groupBox5
//
this.groupBox5.BackColor = System.Drawing.Color.White;
this.groupBox5.Controls.Add(this.chk_syncCard);
this.groupBox5.Controls.Add(this.cbb_shelfPrintCom);
this.groupBox5.Controls.Add(this.chk_pushShelfPrint);
this.groupBox5.Controls.Add(this.chk_changeWarehouse);
this.groupBox5.Controls.Add(this.chk_syncFinger);
this.groupBox5.Controls.Add(this.chk_syncFace);
this.groupBox5.Controls.Add(this.cbb_autoUpdate);
this.groupBox5.Controls.Add(this.cb_autoUpdate);
this.groupBox5.Controls.Add(this.chk_shelf);
this.groupBox5.Controls.Add(this.chk_face);
this.groupBox5.Controls.Add(this.chk_ts);
this.groupBox5.Controls.Add(this.chkTest);
this.groupBox5.ForeColor = System.Drawing.Color.Black;
this.groupBox5.Location = new System.Drawing.Point(405, 340);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Size = new System.Drawing.Size(316, 346);
this.groupBox5.TabIndex = 9;
this.groupBox5.TabStop = false;
this.groupBox5.Text = "其他设置";
//
// cbb_shelfPrintCom
//
this.cbb_shelfPrintCom.BackColor = System.Drawing.Color.White;
this.cbb_shelfPrintCom.ForeColor = System.Drawing.Color.Black;
this.cbb_shelfPrintCom.FormattingEnabled = true;
this.cbb_shelfPrintCom.Location = new System.Drawing.Point(227, 317);
this.cbb_shelfPrintCom.Name = "cbb_shelfPrintCom";
this.cbb_shelfPrintCom.Size = new System.Drawing.Size(56, 26);
this.cbb_shelfPrintCom.TabIndex = 24;
//
// chk_pushShelfPrint
//
this.chk_pushShelfPrint.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_pushShelfPrint.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_pushShelfPrint.ForeColor = System.Drawing.Color.Black;
this.chk_pushShelfPrint.Location = new System.Drawing.Point(29, 317);
this.chk_pushShelfPrint.Name = "chk_pushShelfPrint";
this.chk_pushShelfPrint.Size = new System.Drawing.Size(192, 23);
this.chk_pushShelfPrint.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_pushShelfPrint.TabIndex = 23;
this.chk_pushShelfPrint.Text = "启用推送智能货架显示屏";
this.chk_pushShelfPrint.CheckedChanged += new System.EventHandler(this.chk_pushShelfPrint_CheckedChanged);
//
// chk_changeWarehouse
//
this.chk_changeWarehouse.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_changeWarehouse.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_changeWarehouse.ForeColor = System.Drawing.Color.Black;
this.chk_changeWarehouse.Location = new System.Drawing.Point(29, 291);
this.chk_changeWarehouse.Name = "chk_changeWarehouse";
this.chk_changeWarehouse.Size = new System.Drawing.Size(156, 23);
this.chk_changeWarehouse.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_changeWarehouse.TabIndex = 22;
this.chk_changeWarehouse.Text = "启用手动切换仓库";
//
// chk_syncFinger
//
this.chk_syncFinger.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_syncFinger.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_syncFinger.ForeColor = System.Drawing.Color.Black;
this.chk_syncFinger.Location = new System.Drawing.Point(29, 240);
this.chk_syncFinger.Name = "chk_syncFinger";
this.chk_syncFinger.Size = new System.Drawing.Size(156, 23);
this.chk_syncFinger.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_syncFinger.TabIndex = 21;
this.chk_syncFinger.Text = "启用门禁指纹同步";
//
// chk_syncFace
//
this.chk_syncFace.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_syncFace.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_syncFace.ForeColor = System.Drawing.Color.Black;
this.chk_syncFace.Location = new System.Drawing.Point(29, 211);
this.chk_syncFace.Name = "chk_syncFace";
this.chk_syncFace.Size = new System.Drawing.Size(156, 23);
this.chk_syncFace.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_syncFace.TabIndex = 20;
this.chk_syncFace.Text = "启用门禁人脸同步";
//
// cbb_autoUpdate
//
this.cbb_autoUpdate.BackColor = System.Drawing.Color.White;
this.cbb_autoUpdate.ForeColor = System.Drawing.Color.Black;
this.cbb_autoUpdate.FormattingEnabled = true;
this.cbb_autoUpdate.Items.AddRange(new object[] {
"0:00",
"1:00",
"2:00",
"3:00",
"4:00",
"5:00",
"6:00",
"7:00",
"8:00",
"9:00",
"10:00",
"11:00",
"12:00",
"13:00",
"14:00",
"15:00",
"16:00",
"17:00",
"18:00",
"19:00",
"20:00",
"21:00",
"22:00",
"23:00"});
this.cbb_autoUpdate.Location = new System.Drawing.Point(227, 182);
this.cbb_autoUpdate.Name = "cbb_autoUpdate";
this.cbb_autoUpdate.Size = new System.Drawing.Size(56, 26);
this.cbb_autoUpdate.TabIndex = 19;
//
// cb_autoUpdate
//
this.cb_autoUpdate.BackColor = System.Drawing.Color.White;
//
//
//
this.cb_autoUpdate.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.cb_autoUpdate.ForeColor = System.Drawing.Color.Black;
this.cb_autoUpdate.Location = new System.Drawing.Point(29, 182);
this.cb_autoUpdate.Name = "cb_autoUpdate";
this.cb_autoUpdate.Size = new System.Drawing.Size(208, 23);
this.cb_autoUpdate.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.cb_autoUpdate.TabIndex = 18;
this.cb_autoUpdate.Text = "启用自动更新,检查时间:";
//
// chk_shelf
//
this.chk_shelf.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_shelf.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_shelf.ForeColor = System.Drawing.Color.Black;
this.chk_shelf.Location = new System.Drawing.Point(29, 147);
this.chk_shelf.Name = "chk_shelf";
this.chk_shelf.Size = new System.Drawing.Size(122, 23);
this.chk_shelf.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_shelf.TabIndex = 17;
this.chk_shelf.Text = "智能货架推送";
//
// chk_face
//
this.chk_face.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_face.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_face.ForeColor = System.Drawing.Color.Black;
this.chk_face.Location = new System.Drawing.Point(29, 75);
this.chk_face.Name = "chk_face";
this.chk_face.Size = new System.Drawing.Size(122, 23);
this.chk_face.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_face.TabIndex = 16;
this.chk_face.Text = "启用人员同步";
//
// chk_ts
//
this.chk_ts.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_ts.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_ts.ForeColor = System.Drawing.Color.Black;
this.chk_ts.Location = new System.Drawing.Point(29, 111);
this.chk_ts.Name = "chk_ts";
this.chk_ts.Size = new System.Drawing.Size(122, 23);
this.chk_ts.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_ts.TabIndex = 15;
this.chk_ts.Text = "通道在门禁外";
//
// chkTest
//
this.chkTest.BackColor = System.Drawing.Color.White;
//
//
//
this.chkTest.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chkTest.ForeColor = System.Drawing.Color.Black;
this.chkTest.Location = new System.Drawing.Point(29, 39);
this.chkTest.Name = "chkTest";
this.chkTest.Size = new System.Drawing.Size(122, 23);
this.chkTest.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chkTest.TabIndex = 14;
this.chkTest.Text = "启用演示模式";
this.chkTest.CheckedChanged += new System.EventHandler(this.chkTest_CheckedChanged);
//
// labelX2
//
this.labelX2.BackColor = System.Drawing.Color.White;
//
//
//
this.labelX2.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX2.ForeColor = System.Drawing.Color.Black;
this.labelX2.Location = new System.Drawing.Point(11, 718);
this.labelX2.Name = "labelX2";
this.labelX2.Size = new System.Drawing.Size(445, 23);
this.labelX2.TabIndex = 10;
this.labelX2.Text = "<font color=\"#008000\">(2)灵敏度参数在30至80(负号会默认加上)。</font>";
//
// superTabControl1
//
this.superTabControl1.BackColor = System.Drawing.Color.White;
//
//
//
//
//
//
this.superTabControl1.ControlBox.CloseBox.Name = "";
//
//
//
this.superTabControl1.ControlBox.MenuBox.AutoHide = true;
this.superTabControl1.ControlBox.MenuBox.Name = "";
this.superTabControl1.ControlBox.MenuBox.Visible = false;
this.superTabControl1.ControlBox.Name = "";
this.superTabControl1.ControlBox.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] {
this.superTabControl1.ControlBox.MenuBox,
this.superTabControl1.ControlBox.CloseBox});
this.superTabControl1.Controls.Add(this.superTabControlPanel2);
this.superTabControl1.Controls.Add(this.superTabControlPanel1);
this.superTabControl1.ForeColor = System.Drawing.Color.Black;
this.superTabControl1.Location = new System.Drawing.Point(11, 2);
this.superTabControl1.Name = "superTabControl1";
this.superTabControl1.ReorderTabsEnabled = true;
this.superTabControl1.SelectedTabFont = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Bold);
this.superTabControl1.SelectedTabIndex = 0;
this.superTabControl1.Size = new System.Drawing.Size(710, 332);
this.superTabControl1.TabFont = new System.Drawing.Font("宋体", 11F);
this.superTabControl1.TabIndex = 11;
this.superTabControl1.Tabs.AddRange(new DevComponents.DotNetBar.BaseItem[] {
this.superTabItem2});
this.superTabControl1.TabStyle = DevComponents.DotNetBar.eSuperTabStyle.VisualStudio2008Dock;
this.superTabControl1.Text = "superTabControl1";
//
// superTabControlPanel2
//
this.superTabControlPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.superTabControlPanel2.Location = new System.Drawing.Point(0, 33);
this.superTabControlPanel2.Name = "superTabControlPanel2";
this.superTabControlPanel2.Size = new System.Drawing.Size(710, 299);
this.superTabControlPanel2.TabIndex = 0;
this.superTabControlPanel2.TabItem = this.superTabItem2;
//
// superTabItem2
//
this.superTabItem2.AttachedControl = this.superTabControlPanel2;
this.superTabItem2.GlobalItem = false;
this.superTabItem2.Name = "superTabItem2";
this.superTabItem2.Text = "superTabItem2";
//
// superTabControlPanel1
//
this.superTabControlPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.superTabControlPanel1.Location = new System.Drawing.Point(0, 0);
this.superTabControlPanel1.Name = "superTabControlPanel1";
this.superTabControlPanel1.Size = new System.Drawing.Size(710, 332);
this.superTabControlPanel1.TabIndex = 1;
this.superTabControlPanel1.TabItem = this.superTabItem1;
//
// superTabItem1
//
this.superTabItem1.AttachedControl = this.superTabControlPanel1;
this.superTabItem1.GlobalItem = false;
this.superTabItem1.Name = "superTabItem1";
this.superTabItem1.Text = "superTabItem1";
//
// chk_syncCard
//
this.chk_syncCard.BackColor = System.Drawing.Color.White;
//
//
//
this.chk_syncCard.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.chk_syncCard.ForeColor = System.Drawing.Color.Black;
this.chk_syncCard.Location = new System.Drawing.Point(29, 265);
this.chk_syncCard.Name = "chk_syncCard";
this.chk_syncCard.Size = new System.Drawing.Size(156, 23);
this.chk_syncCard.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.chk_syncCard.TabIndex = 25;
this.chk_syncCard.Text = "启用门禁卡号同步";
//
// FrmConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(732, 753);
this.Controls.Add(this.superTabControl1);
this.Controls.Add(this.labelX2);
this.Controls.Add(this.groupBox5);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.labelX1);
this.Controls.Add(this.btnColse);
this.Controls.Add(this.btnSave);
this.DoubleBuffered = true;
this.Font = new System.Drawing.Font("宋体", 11F);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(4);
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(750, 800);
this.MinimumSize = new System.Drawing.Size(750, 800);
this.Name = "FrmConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "系统参数配置";
this.Load += new System.EventHandler(this.FrmConfig_Load);
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox5.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.superTabControl1)).EndInit();
this.superTabControl1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private DevComponents.DotNetBar.ButtonX btnSave;
private DevComponents.DotNetBar.ButtonX btnColse;
private DevComponents.DotNetBar.LabelX labelX1;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.Label label10;
private DevComponents.DotNetBar.Controls.TextBoxX txtDomain;
private DevComponents.DotNetBar.Controls.TextBoxX txt_secretkey;
private System.Windows.Forms.Label label12;
private DevComponents.DotNetBar.Controls.TextBoxX txt_appkey;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.GroupBox groupBox5;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_face;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_ts;
private DevComponents.DotNetBar.Controls.CheckBoxX chkTest;
private DevComponents.DotNetBar.Controls.TextBoxX txt_upload;
private System.Windows.Forms.Label label9;
private DevComponents.DotNetBar.LabelX labelX2;
private DevComponents.DotNetBar.Controls.TextBoxX tb_shelf;
private System.Windows.Forms.Label label13;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_shelf;
private SuperTabControl superTabControl1;
private SuperTabControlPanel superTabControlPanel1;
private SuperTabItem superTabItem1;
private SuperTabControlPanel superTabControlPanel2;
private SuperTabItem superTabItem2;
private System.Windows.Forms.ComboBox cbb_textUser;
private System.Windows.Forms.Label label1;
private DevComponents.DotNetBar.Controls.CheckBoxX cb_autoUpdate;
private System.Windows.Forms.ComboBox cbb_autoUpdate;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_syncFinger;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_syncFace;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_changeWarehouse;
private DevComponents.DotNetBar.Controls.TextBoxX tb_mqttPort;
private System.Windows.Forms.Label label3;
private DevComponents.DotNetBar.Controls.TextBoxX tb_mqttIp;
private System.Windows.Forms.Label label2;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_pushShelfPrint;
private System.Windows.Forms.ComboBox cbb_shelfPrintCom;
private DevComponents.DotNetBar.Controls.CheckBoxX chk_syncCard;
}
}
\ No newline at end of file
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using JmpCommon;
using Org.LLRP.LTK.LLRPV1;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar.Controls;
using JmpCommon.Model;
using JmpServiceMgr.Helper;
namespace JmpServiceMgr
{
public partial class FrmConfig : MetroForm
{
private List<RFIDReaderHelper> _helperList;
public FrmConfig(List<RFIDReaderHelper> helperList)
{
InitializeComponent();
this.TopMost = true;
_helperList = helperList;
//装填当前仓库对应组织机构下警员
if (MyCache.PoliceList != null)
{
cbb_textUser.DataSource = new List<sync_police>(MyCache.PoliceList);
cbb_textUser.DisplayMember = "name";
cbb_textUser.ValueMember = "id";
}
}
private void FrmConfig_Load(object sender, EventArgs e)
{
superTabControl1.Tabs.Clear();
//装载读写器
if (_helperList is { Count: > 0 })
{
for (var i = 0; i < _helperList.Count; i++)
{
var rfidConfig = new RfidConfig
{
TopLevel = false,
Visible = true,
Left = 3
};
var type = "";
switch (MyCache.ChannelCfg.readerConfig[i].type)
{
case 0:
{
type = "英频杰";
break;
}
case 1:
{
type = "索立得401";
break;
}
case 2:
{
type = "索立得401X";
break;
}
}
var tim = this.superTabControl1.CreateTab($"{MyCache.ChannelCfg.readerConfig[i].name}{type}");
if (_helperList[i].Reader.IsConnected)
{
//载入配置
rfidConfig.ant1use.Checked = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0]?.IsEnabled ?? false;
rfidConfig.ant2use.Checked = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1]?.IsEnabled ?? false;
rfidConfig.ant1power.Value = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0]?.TxPower ?? 30;
rfidConfig.ant2power.Value = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1]?.TxPower ?? 30;
rfidConfig.ant1db.Value = (int)Math.Abs(_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0]?.RxSensitivity ?? 80.00);
rfidConfig.ant2db.Value = (int)Math.Abs(_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1]?.RxSensitivity ?? 80.00);
if (_helperList[i].Reader.RFIDReaderSettings.Antennas.Length > 2)
{
rfidConfig.ant3use.Checked = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2]?.IsEnabled ?? false;
rfidConfig.ant4use.Checked = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3]?.IsEnabled ?? false;
rfidConfig.ant3power.Value = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2]?.TxPower ?? 30;
rfidConfig.ant4power.Value = _helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3]?.TxPower ?? 30;
rfidConfig.ant3db.Value = (int)Math.Abs(_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2]?.RxSensitivity ?? 80.00);
rfidConfig.ant4db.Value = (int)Math.Abs(_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3]?.RxSensitivity ?? 80.00);
}
rfidConfig.Name = "RfidConfig";
tim.AttachedControl.Controls.Add(rfidConfig);
}
else
{
var label = new Label
{
Text = "读写器未连接,无法获取配置信息",
Dock = DockStyle.Fill,
AutoSize = false,
TextAlign = ContentAlignment.MiddleCenter,
BackColor = Color.Transparent
};
tim.AttachedControl.Controls.Add(label);
}
}
}
else
{
var tim = this.superTabControl1.CreateTab("无读写器配置");
var label = new Label
{
Text = "无读写器配置,请到后台添加配置信息",
Dock = DockStyle.Fill,
AutoSize = false,
TextAlign = ContentAlignment.MiddleCenter,
BackColor = Color.Transparent
};
tim.AttachedControl.Controls.Add(label);
}
txtDomain.Text = MyCache.SysConfig.DomainUrl;
chkTest.Checked = MyCache.SysConfig.TestModel;
if (!string.IsNullOrEmpty(MyCache.SysConfig.UserID))
{
if (MyCache.PoliceList is { Count: > 0 })
{
var index = MyCache.PoliceList.FindIndex(x => x.id == MyCache.SysConfig.UserID);
cbb_textUser.SelectedIndex = index == -1 ? 0 : index;
}
}
if (chkTest.Checked)
{
label1.Visible = true;
cbb_textUser.Visible = true;
}
else
{
label1.Visible = false;
cbb_textUser.Visible = false;
}
chk_ts.Checked = MyCache.SysConfig.SpecialModel;
txt_appkey.Text = MyCache.SysConfig.AppKey;
txt_secretkey.Text = MyCache.SysConfig.SecretKey;
chk_face.Checked = MyCache.SysConfig.SyncUserInfo;
txt_upload.Text = MyCache.SysConfig.UploadPic;
chk_shelf.Checked = MyCache.SysConfig.IsEnabledShelf;
tb_shelf.Text = MyCache.SysConfig.ShelfAddress;
cb_autoUpdate.Checked = MyCache.SysConfig.IsAutoUpdate;
cbb_autoUpdate.SelectedIndex = MyCache.SysConfig.AutoUpdateTime;
chk_syncFace.Checked = MyCache.SysConfig.IsSyncFaces;
chk_syncFinger.Checked = MyCache.SysConfig.IsSyncFinger;
chk_syncCard.Checked = MyCache.SysConfig.IsSyncCard;
chk_changeWarehouse.Checked = MyCache.SysConfig.IsChangeWarehouse;
tb_mqttIp.Text = MyCache.SysConfig.MQTTAddress;
tb_mqttPort.Text = MyCache.SysConfig.MQTTPort.ToString();
chk_pushShelfPrint.Checked = MyCache.SysConfig.IsPushShelfPrint;
if (chk_pushShelfPrint.Checked)
{
cbb_shelfPrintCom.Visible = true;
cbb_shelfPrintCom.Items.Clear();
cbb_shelfPrintCom.Items.AddRange(SerialPort.GetPortNames());
if (cbb_shelfPrintCom.Items.Count > 0)
{
if (cbb_shelfPrintCom.Items.Contains(MyCache.SysConfig.PushShelfPrintCom))
{
cbb_shelfPrintCom.SelectedIndex =
cbb_shelfPrintCom.Items.IndexOf(MyCache.SysConfig.PushShelfPrintCom);
}
else
{
cbb_shelfPrintCom.SelectedIndex = cbb_shelfPrintCom.Items.Count - 1;
}
}
}
else
{
cbb_shelfPrintCom.Visible = false;
}
}
private void btnColse_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnSave_Click(object sender, EventArgs e)
{
try
{
for (var i = 0; i < _helperList?.Count; i++)
{
var type = "";
switch (MyCache.ChannelCfg.readerConfig[i].type)
{
case 0:
{
type = "英频杰";
break;
}
case 1:
{
type = "索立得401";
break;
}
case 2:
{
type = "索立得401X";
break;
}
}
var superTabItems = this.superTabControl1.Tabs.Cast<SuperTabItem>();
var tab = superTabItems.FirstOrDefault(x => x.Text == $@"{MyCache.ChannelCfg.readerConfig[i].name}{type}");
if (tab == null)
{
MessageBox.Show("保存失败:错误的读写器配置标签");
return;
}
if (tab.AttachedControl.Controls["RfidConfig"] == null)
{
//未连接读写器,过滤
continue;
}
var form = tab?.AttachedControl.Controls["RfidConfig"] as RfidConfig;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0].IsEnabled = form.ant1use.Checked;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1].IsEnabled = form.ant2use.Checked;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0].TxPower = form.ant1power.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1].TxPower = form.ant2power.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0].RxSensitivity = form.ant1db.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1].RxSensitivity = form.ant2db.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0].IsUseMaxTxPower = form.ant1power.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1].IsUseMaxTxPower = form.ant2power.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[0].IsUseMaxRxSensitivity = form.ant1db.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[1].IsUseMaxRxSensitivity = form.ant2db.Value == 0;
if (_helperList[i].Reader.RFIDReaderSettings.Antennas.Length > 2)
{
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2].IsEnabled = form.ant3use.Checked;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3].IsEnabled = form.ant4use.Checked;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2].TxPower = form.ant3power.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3].TxPower = form.ant4power.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2].RxSensitivity = form.ant3db.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3].RxSensitivity = form.ant4db.Value;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2].IsUseMaxTxPower = form.ant3power.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3].IsUseMaxTxPower = form.ant4power.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[2].IsUseMaxRxSensitivity = form.ant3db.Value == 0;
_helperList[i].Reader.RFIDReaderSettings.Antennas.AntennaConfigs[3].IsUseMaxRxSensitivity = form.ant4db.Value == 0;
}
//更新配置
_helperList[i].Reader.ApplySettings(_helperList[i].Reader.RFIDReaderSettings);
}
MyCache.SysConfig.DomainUrl = txtDomain.Text;
MyCache.SysConfig.TestModel = chkTest.Checked;
if (chkTest.Checked)
{
MyCache.SysConfig.UserID = cbb_textUser.SelectedValue?.ToString();
}
else
{
MyCache.SysConfig.UserID = "";
}
MyCache.SysConfig.SpecialModel = chk_ts.Checked;
MyCache.SysConfig.SyncCfgInfo = false;
MyCache.SysConfig.SyncUserInfo = chk_face.Checked;
MyCache.SysConfig.SecretKey = txt_secretkey.Text;
MyCache.SysConfig.AppKey = txt_appkey.Text;
MyCache.SysConfig.UploadPic = txt_upload.Text;
MyCache.SysConfig.IsEnabledShelf = chk_shelf.Checked;
MyCache.SysConfig.ShelfAddress = tb_shelf.Text;
MyCache.SysConfig.IsAutoUpdate = cb_autoUpdate.Checked;
MyCache.SysConfig.AutoUpdateTime = cbb_autoUpdate.SelectedIndex;
MyCache.SysConfig.IsSyncFaces = chk_syncFace.Checked;
MyCache.SysConfig.IsSyncFinger = chk_syncFinger.Checked;
MyCache.SysConfig.IsSyncCard = chk_syncCard.Checked;
MyCache.SysConfig.IsChangeWarehouse = chk_changeWarehouse.Checked;
MyCache.SysConfig.MQTTAddress = tb_mqttIp.Text;
MyCache.SysConfig.MQTTPort = Convert.ToInt32(tb_mqttPort.Text);
MyCache.SysConfig.IsPushShelfPrint = chk_pushShelfPrint.Checked;
MyCache.SysConfig.PushShelfPrintCom = cbb_shelfPrintCom.Text;
if (chk_pushShelfPrint.Checked)
{
MyCache.SysConfig.PushShelfPrintCom = cbb_shelfPrintCom.Text;
}
else
{
MyCache.SysConfig.PushShelfPrintCom = "";
}
MyCache.SetSystemSetp();
//settings.Save(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "settings.xml");
MessageBoxEx.Show(this, "配置保存成功,软件重启后生效!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
this.DialogResult = DialogResult.Cancel;
MessageBoxEx.Show(this, "配置保存失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Log.ErrorLog(ex.ToString());
}
}
private void chkTest_CheckedChanged(object sender, EventArgs e)
{
if (sender is CheckBoxX box)
{
if (box.Checked)
{
label1.Visible = true;
cbb_textUser.Visible = true;
}
else
{
label1.Visible = false;
cbb_textUser.Visible = false;
}
}
}
private void chk_pushShelfPrint_CheckedChanged(object sender, EventArgs e)
{
if (sender is CheckBoxX box)
{
if (box.Checked)
{
cbb_shelfPrintCom.Visible = true;
cbb_shelfPrintCom.Items.Clear();
cbb_shelfPrintCom.Items.AddRange(SerialPort.GetPortNames());
if (cbb_shelfPrintCom.Items.Count > 0)
{
if (cbb_shelfPrintCom.Items.Contains(MyCache.SysConfig.PushShelfPrintCom))
{
cbb_shelfPrintCom.SelectedIndex =
cbb_shelfPrintCom.Items.IndexOf(MyCache.SysConfig.PushShelfPrintCom);
}
else
{
cbb_shelfPrintCom.SelectedIndex = cbb_shelfPrintCom.Items.Count - 1;
}
}
}
else
{
cbb_shelfPrintCom.Visible = false;
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAMMOAADDDgAAAAAAAAAA
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
AACASRMAekYSAH9JFgCLTxkAmFYdAJxYHgCdWSAAnlofAJ5aHgCeWyAAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IACeWh4AnloeAJ1ZHwCcWB4AmFYeAIxOGwCBRhYAekISAIBDEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhEcZAHpAFwCWVR0Ao10gALlqJgDbfy4A//9zAE8tCQR8RhYKkVIbD5dVHRKaVx8UmlgeFZtY
HRabWR8Wm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZHxabWB0Wm1geFZlXHhSXVR0SkVIdD31GGApRKQkE//9zANt/
LgC5aiUAo10gAJhWHQB2RBQAgUoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRHGABnNREAolwgANqALQB7RRYIolwfJK1jIkq1aCRwumslj7xs
JqjAbie2wm8nwsJvJ8rDcCjOw3Ao0MNwJ9HEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLDcCfRw3Ao0MNw
KM7DbyfKwm8nw8BuJ7a8ayaoumolj7ZoJHCuYyNKolwgJX9IFwjegC8Aol0gAF42EgB/SRkAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiNAkA/6VDAJ9bHgD/u0UAn1ofHbRn
JGS+bSetxXEo3slzKfbLdSr/zXYq/812Kv/Ndir/zXYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/zXYq/812Kv/Ndir/zXYq/8t1Kv/JdCn2xXEo375t
Jq+0ZyRln1sfHf+xQACfWx8A/6JHAFpECQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJVU
HQB/SBcAwG8oAJdWHBW1aCRxw3Ao0st0KfvNdir/znYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/LdSn8w3Ao0bVoJHCWVRwVwm4oAH5IFwCUVB0AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABmMxEAmVgfAJFTHQD//24AqWEhO79uJ7vKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0
Kfy/bie7qGAhPP//dgCSUhwAm1ceAGYzEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACaVx4AmVgeACgXAwKwZSNaxHEo4M12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4bBlI1osFgICmVceAJpXHgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJRT
HACRUhwAMRcGArVoJGXIcynszXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8hz
Ke21aCRlMBYGApFTHACUVBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAg0QIAIJJFgD//3oAsWUjW8hzKe3Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/IcynssGUjWv//eQCASBYAg0QJAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6NMAL1tKACoYCE8xHAo4c12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4ahg
ITy9bSgA/6FIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACQUxcAolwfAJdVHBW/bia7zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/79uJruXVhwVoVwfAI5UFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzQRAA/79KALRnJHLKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy1ZyRx/7RHAHFF
EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRMGACjXR8An1seHsNw
KNLNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/852Kv/DcCjSn1sfHaJdIACBRxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHtHFQDbfi0As2ckZcp1KfzNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/KdSn7s2ckZNp/LgB2QBQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJdWHQB9RxcIvm0mrs12Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/811Kf/NdSn/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/vm0mrnxFFgiWVR0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNd
IAChXCAkxXEo3s52Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdSj/zXUp/9OFQv/ThUL/zXUp/8x1
KP/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Odir/xXEo36JcHySjXSAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALlrJgCuYyJLyXQp9s12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQo/812
Kv/VjE3/5ruV//bn2v/259r/5ruV/9WMTf/Ndir/zHQo/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/yXMp9q5j
Ikq5aiYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk1QWAN2ALgC2aCRxy3Uq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/811KP/Ndir/1Y1O/+jAnf/57uT///////////////////////nu5P/owJ3/1Y1O/812
Kv/NdSj/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/y3Uq/7ZoJXDcfy0AlE4XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAdEMRAP//gwC5aiWQzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/zHQo/9OHRf/nvJf/+e7k////////////////////
////////////////////////+e7k/+e8l//Th0X/zHQo/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/7pqJY///3kAeEESAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEgVAFIsCQW8bCaozXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//QfTb/4ax///bn
2f/////////////////////////////////////////////////////////////////259n/4ax//9B9
Nv/MdCf/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/7xsJqhRKwsFgEcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjE4aAH1F
FgrAbie2zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/NdSn/zXYp/9iUWf/w1b7//vz6////////////////////////////////////////////////////
/////////////////////////vz6//DVvv/YlFn/zXYp/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8BuJ7Z7RhYKik4aAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAmFYdAJFRGw/CbyfCzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//Qfjb/5LWM//rw6P//////////////////////////////
///////////////////////////////////////////////////////////////////68Oj/5LWM/9B+
Nv/MdCf/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8Jv
J8KRURsPmFYdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnFgeAJhVHRLCbyfKznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQn/9WMTf/v0rr//v38////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////v38/+/Suv/VjE3/zHQn/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8JvJ8qYVR0SnFgeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnFkfAJlXHhTDcCjOznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kf/Ndir/3J5o//bn2v//////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////259r/3J5o/812
Kv/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8NwKM6ZVx4UnFkfAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpYHRXDcCfQznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXUp/854LP/hrH7/+/Ps////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////+/Ps/+Gsfv/OeCz/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8NwJ9CaWB0VnVkeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpX
HRbDcCfRznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/znku/+S1jP/8+PT/////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////z49P/ktYz/znku/811
Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RwKNKbWB4WnlofAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlogAJtZHxbEcCjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kf/OeC7/5beP//369///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////9+vf/5beP/854Lv/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/813K//jsYb//fn2////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////fn2/+Oxhv/Ndyv/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQo/92ib//79fD/////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////v18P/dom//zHQo/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdSj/1o5Q//fq3v//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////36t7/1o5Q/8x1KP/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/811Kf/PfDT/7tG4////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////7tG4/898NP/NdSn/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8x0J//gqXr//vv5////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////vv5/+Cpev/MdCf/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXUp/9GCPf/04dH/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////Th
0f/Rgj3/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zHQn/+Cpef/+/Pv/////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////78+//gqXn/zHQn/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znow/+/U
vf//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////v1L3/znow/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/NdSj/1YxM//rw6P//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////68Oj/1YxM/811KP/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/3qNx//78+v//////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////+/Pr/3qNx/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/47OJ////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////47OJ/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LWL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LWL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZIBbEcSjSznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnlshAJtZ
IBbEcSjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RxKNKbWSAWnlshAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnlogAJtZHxbEcCjSznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8Rx
KNKbWSAWnlshAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnVkeAJpXHRbDcCfRznYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/5LSL////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/znYq/8RwKNKbWB4WnlofAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAnVkeAJpYHRXDcCfQznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8NwJ9CaWB0VnVkeAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnFkfAJhXHhTDcCjOznYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LSL////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////5LSL/8x0
J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/znYq/8NwKM6YVx4UnFkfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm1geAJdV
HRLCbyfKznYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/MdCf/5LSL////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////5LSL/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/8JvJ8qXVR0Sm1geAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAmFYdAJFRGw/CbyfCzXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/MdCf/5LWM////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////5LWM/8x0J//Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8Jv
J8KRUhwPmFYdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAik4aAHpFFgq/bie2zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/MdCf/4rCE//369///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///9+vf/4rCE/8x0J//Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8BuJ7Z8RhYKi08aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgEcXAFErCwW8bCaozXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndin/0YI8/9ubZf/isYb/68eo//Lcyf/47OL//Pj0///+
/f//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////v3//Pj0//js4v/y3Mn/68eo/+Kxhv/bm2X/0YI8/812Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/7xsJqhRKwsFf0YWAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEESAP//eQC6aiWPzXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXUp/8x0
J//MdCf/zXYq/898M//Th0X/2Zhf/+Gsfv/pw6H/8djC//fq3v/89vH//v79////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////v79//z28f/36t7/8djC/+nDof/hrH7/2Zhf/9OHRf/PfDP/zXYq/8x0J//MdCf/zXUp/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/7pqJZD//4sAdj0RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlE4XANx/
LQC2aCVwy3Uq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kf/NdSj/zHQn/8x0J//NdSn/z3sx/9KE
Qf/YlFj/36h4/+e+mv/v07z/9ubY//v07v/+/Pr/////////////////////////////////////////
//////////////78+v/79O7/9ubY/+/TvP/nvpr/36h4/9iUWP/ShEH/z3sx/811Kf/MdCf/zHQn/811
KP/Ndin/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/y3Uq/7ZoJXHdgC4AkEwWAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALlqJgCuYyJKyXMp9s12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYp/811KP/MdCf/zHQm/811KP/OeS//0YI9/9aQUv/do2//5bmS/+7P
tf/149P/+vLr//77+f/++/n/+vLr//Xj0//uz7X/5bmS/92jb//WkFL/0YI9/855L//NdSj/zHQm/8x0
J//NdSj/zXYp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/yXQp9q5j
I0u5ayUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNdIACiXR8kxXEo3s52
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXUp/8x0J//MdCb/zHQn/854Lf/Qfzj/1o5P/9yhbP/coWz/1o5P/9B/OP/OeC3/zHQn/8x0
Jv/MdCf/zXUp/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Odir/xXEo3qFdHySjXR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJdWHQB8RhcIvm0mrs12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/NdSn/zHUo/8x0
Jv/MdCb/zHUo/811Kf/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/vm0nr39JFwiYVx0AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZAFADbfy4As2YkZMp1KfvNdir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/KdSn8s2ckZdt+LQB5RhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFH
FwChXR8AnVseHcNwKNHOdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/DcCjSn1seHqNdIACETBgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRA0A/7hKALRnJHHKdCn8zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy0aCRx/7ZHAHNC
EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOVBYAoVweAJZW
HBW/bia7zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/79uJruYVhsVoVweAI1RFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/59GAL9tJwCoYCE7xHAo4M12Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4ahgIDy+bScA/6JKAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbkQJAH9IFgD//3QAsGUjWshz
KezNdir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/IcynssGUjWv//
fgCBSBUAg0QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJRUGwCRUhsALxgGArVoJGXIcynszXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/8hzKey1aCRlMRYGApFTHACTVBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZVx4AmVcdACoVAAKwZSNaxHEo4c12
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/xHEo4LBlI1ooFwICmVgeAJpXHgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABmMxEAmVcdAJFTHAD//3MAqGAgPL9uJrvKdCn8zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/8p0Kfy/bie7qWEhO///
bgCRUx0AmVgfAGYzEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJNUHQB9RxcAwW8oAJdVGxW1aCRxw3Ao0ct0
KfzNdir/znYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812
Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/zXYq/812Kv/Ndir/znYq/812
Kv/LdCn7w3Ao0rVoJHGWVhwVv24nAH5HFwCTVB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABaMAkA/7BHAJ9aHgD/tD8An1sfHbRnJGW+bSetxXEo38lzKfbLdSr/zXYq/812Kv/Ndir/zXYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852
Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/znYq/852Kv/Odir/zXYq/812
Kv/Ndir/zXYq/8t1Kv/Jcyn2xXEo3r5tJq20ZyRkn1ofHf+2QgCfWx4A/6FBAGE0CgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBKGgBgNhMAo10gANx/LQB8RBgIolwfJa1j
Ikq2aCVwumsmj7xsJqjAbie2wW8nwsJvJ8rDcCjOw3Ao0MNwJ9HEcCjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRx
KNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRxKNLEcSjSxHEo0sRw
KNLDcCfRw3Ao0MNwKM7CbyjJwm8nwsBuJ7a7bCanumolj7ZoJHCtYyJKol0fJHtFFQjcfy4AolwfAGE3
EQCASRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgUkYAHZEFgCXVB4Ao10fALpqJQDbfi0A//9xAFEpDAR7RRcKkVIcD5ZVHRKaVx8UmlgeFZtY
HRabWR8Wm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZIBabWSAWm1kgFptZ
IBabWSAWm1kgFptZIBabWSAWm1kgFptZHxabWB0WmlgeFZpXHxSXVR4SkVEbD3tEFgpNKwkE//9pANp+
LQC5aiYAo14gAJZVHAB0QBQAgEcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQxQAekISAIBG
FwCLThoAl1YdAJtYHgCdWSAAnlofAJ5aHgCeWiAAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5b
IQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5bIQCeWyEAnlshAJ5aIACeWh4AnlofAJ5Z
IACcWB8AmFUdAIpNGgB+SBYAdT8TAHxEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////
//////////////////////gAAAAAAAAf/////wAAAAAAAAAA/////AAAAAAAAAAAP///8AAAAAAAAAAA
D///4AAAAAAAAAAAB///gAAAAAAAAAAAAf//gAAAAAAAAAAAAf//AAAAAAAAAAAAAP/+AAAAAAAAAAAA
AH/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/4AAAAAAAAAAAAAB/4AAAAAAAAAAAA
AB/4AAAAAAAAAAAAAB/4AAAAAAAAAAAAAB/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/4AAAAAAAAAAAAAB/4AAAAAAAAAAAA
AB/4AAAAAAAAAAAAAB/4AAAAAAAAAAAAAB/8AAAAAAAAAAAAAD/8AAAAAAAAAAAAAD/8AAAAAAAAAAAA
AD/+AAAAAAAAAAAAAH//AAAAAAAAAAAAAP//gAAAAAAAAAAAAf//gAAAAAAAAAAAAf//4AAAAAAAAAAA
B///8AAAAAAAAAAAD////AAAAAAAAAAAP////wAAAAAAAAAA//////gAAAAAAAAf////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
namespace JmpServiceMgr
{
partial class FrmMgr
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMgr));
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.t_auto = new System.Windows.Forms.ToolStripMenuItem();
this.t_restart = new System.Windows.Forms.ToolStripMenuItem();
this.t_exit = new System.Windows.Forms.ToolStripMenuItem();
this.style = new DevComponents.DotNetBar.StyleManager(this.components);
this.st_bar = new System.Windows.Forms.StatusStrip();
this.ddb_warehouse = new System.Windows.Forms.ToolStripDropDownButton();
this.btn_clear = new DevComponents.DotNetBar.ButtonX();
this.btn_copy = new DevComponents.DotNetBar.ButtonX();
this.btn_exit = new DevComponents.DotNetBar.ButtonX();
this.btn_restart = new DevComponents.DotNetBar.ButtonX();
this.txt_log = new System.Windows.Forms.RichTextBox();
this.btnPower = new DevComponents.DotNetBar.ButtonX();
this.contextMenuStrip.SuspendLayout();
this.st_bar.SuspendLayout();
this.SuspendLayout();
//
// notifyIcon
//
this.notifyIcon.ContextMenuStrip = this.contextMenuStrip;
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
this.notifyIcon.Text = "通道服务v1.2";
this.notifyIcon.Visible = true;
this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick);
//
// contextMenuStrip
//
this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.t_auto,
this.t_restart,
this.t_exit});
this.contextMenuStrip.Name = "contextMenuStrip";
this.contextMenuStrip.Size = new System.Drawing.Size(125, 70);
//
// t_auto
//
this.t_auto.Name = "t_auto";
this.t_auto.Size = new System.Drawing.Size(124, 22);
this.t_auto.Text = "开机自启";
this.t_auto.Click += new System.EventHandler(this.t_auto_Click);
//
// t_restart
//
this.t_restart.Name = "t_restart";
this.t_restart.Size = new System.Drawing.Size(124, 22);
this.t_restart.Text = "重启服务";
this.t_restart.Click += new System.EventHandler(this.t_restart_Click);
//
// t_exit
//
this.t_exit.Name = "t_exit";
this.t_exit.Size = new System.Drawing.Size(124, 22);
this.t_exit.Text = "退出";
this.t_exit.Click += new System.EventHandler(this.t_exit_Click);
//
// style
//
this.style.ManagerStyle = DevComponents.DotNetBar.eStyle.Office2013;
this.style.MetroColorParameters = new DevComponents.DotNetBar.Metro.ColorTables.MetroColorGeneratorParameters(System.Drawing.Color.White, System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(109)))), ((int)(((byte)(147))))));
//
// st_bar
//
this.st_bar.ImageScalingSize = new System.Drawing.Size(20, 20);
this.st_bar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ddb_warehouse});
this.st_bar.Location = new System.Drawing.Point(0, 467);
this.st_bar.Name = "st_bar";
this.st_bar.Size = new System.Drawing.Size(863, 22);
this.st_bar.TabIndex = 43;
this.st_bar.Text = "statusStrip1";
//
// ddb_warehouse
//
this.ddb_warehouse.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.ddb_warehouse.Enabled = false;
this.ddb_warehouse.Font = new System.Drawing.Font("幼圆", 12F);
this.ddb_warehouse.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ddb_warehouse.Name = "ddb_warehouse";
this.ddb_warehouse.ShowDropDownArrow = false;
this.ddb_warehouse.Size = new System.Drawing.Size(204, 20);
this.ddb_warehouse.Text = "当前仓库:未获取云端配置";
//
// btn_clear
//
this.btn_clear.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_clear.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold);
this.btn_clear.Image = ((System.Drawing.Image)(resources.GetObject("btn_clear.Image")));
this.btn_clear.ImageFixedSize = new System.Drawing.Size(24, 24);
this.btn_clear.Location = new System.Drawing.Point(278, 7);
this.btn_clear.Name = "btn_clear";
this.btn_clear.Shape = new DevComponents.DotNetBar.RoundRectangleShapeDescriptor(2);
this.btn_clear.Size = new System.Drawing.Size(111, 46);
this.btn_clear.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btn_clear.TabIndex = 42;
this.btn_clear.Text = "清空缓存";
this.btn_clear.Click += new System.EventHandler(this.btn_clear_Click);
//
// btn_copy
//
this.btn_copy.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_copy.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold);
this.btn_copy.Image = ((System.Drawing.Image)(resources.GetObject("btn_copy.Image")));
this.btn_copy.ImageFixedSize = new System.Drawing.Size(24, 24);
this.btn_copy.Location = new System.Drawing.Point(8, 7);
this.btn_copy.Name = "btn_copy";
this.btn_copy.Shape = new DevComponents.DotNetBar.RoundRectangleShapeDescriptor(2);
this.btn_copy.Size = new System.Drawing.Size(111, 46);
this.btn_copy.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btn_copy.TabIndex = 40;
this.btn_copy.Text = "复制标识";
this.btn_copy.Click += new System.EventHandler(this.btn_copy_Click);
//
// btn_exit
//
this.btn_exit.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_exit.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold);
this.btn_exit.Image = ((System.Drawing.Image)(resources.GetObject("btn_exit.Image")));
this.btn_exit.ImageFixedSize = new System.Drawing.Size(24, 24);
this.btn_exit.Location = new System.Drawing.Point(413, 7);
this.btn_exit.Name = "btn_exit";
this.btn_exit.Shape = new DevComponents.DotNetBar.RoundRectangleShapeDescriptor(2);
this.btn_exit.Size = new System.Drawing.Size(111, 46);
this.btn_exit.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btn_exit.TabIndex = 41;
this.btn_exit.Text = "退出服务";
this.btn_exit.Click += new System.EventHandler(this.btn_exit_Click);
//
// btn_restart
//
this.btn_restart.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_restart.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold);
this.btn_restart.Image = ((System.Drawing.Image)(resources.GetObject("btn_restart.Image")));
this.btn_restart.ImageFixedSize = new System.Drawing.Size(24, 24);
this.btn_restart.Location = new System.Drawing.Point(143, 7);
this.btn_restart.Name = "btn_restart";
this.btn_restart.Shape = new DevComponents.DotNetBar.RoundRectangleShapeDescriptor(2);
this.btn_restart.Size = new System.Drawing.Size(111, 46);
this.btn_restart.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btn_restart.TabIndex = 39;
this.btn_restart.Text = "重启服务";
this.btn_restart.Click += new System.EventHandler(this.btn_restart_Click);
//
// txt_log
//
this.txt_log.Dock = System.Windows.Forms.DockStyle.Bottom;
this.txt_log.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txt_log.Location = new System.Drawing.Point(0, 72);
this.txt_log.Name = "txt_log";
this.txt_log.Size = new System.Drawing.Size(863, 395);
this.txt_log.TabIndex = 45;
this.txt_log.Text = "";
//
// btnPower
//
this.btnPower.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnPower.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold);
this.btnPower.Image = ((System.Drawing.Image)(resources.GetObject("btnPower.Image")));
this.btnPower.ImageFixedSize = new System.Drawing.Size(24, 24);
this.btnPower.Location = new System.Drawing.Point(549, 7);
this.btnPower.Name = "btnPower";
this.btnPower.Shape = new DevComponents.DotNetBar.RoundRectangleShapeDescriptor(2);
this.btnPower.Size = new System.Drawing.Size(111, 46);
this.btnPower.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnPower.TabIndex = 46;
this.btnPower.Text = "系统设置";
this.btnPower.Visible = false;
this.btnPower.Click += new System.EventHandler(this.btnPower_Click);
//
// FrmMgr
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(863, 489);
this.Controls.Add(this.btnPower);
this.Controls.Add(this.txt_log);
this.Controls.Add(this.st_bar);
this.Controls.Add(this.btn_clear);
this.Controls.Add(this.btn_copy);
this.Controls.Add(this.btn_exit);
this.Controls.Add(this.btn_restart);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "FrmMgr";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "通道服务";
this.Activated += new System.EventHandler(this.FrmMgr_Activated);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMgr_FormClosing);
this.Load += new System.EventHandler(this.FrmMgr_Load);
this.SizeChanged += new System.EventHandler(this.FrmMgr_SizeChanged);
this.Leave += new System.EventHandler(this.FrmMgr_Leave);
this.contextMenuStrip.ResumeLayout(false);
this.st_bar.ResumeLayout(false);
this.st_bar.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem t_exit;
private System.Windows.Forms.ToolStripMenuItem t_restart;
private DevComponents.DotNetBar.StyleManager style;
private System.Windows.Forms.ToolStripMenuItem t_auto;
private System.Windows.Forms.StatusStrip st_bar;
private DevComponents.DotNetBar.ButtonX btn_clear;
private DevComponents.DotNetBar.ButtonX btn_copy;
private DevComponents.DotNetBar.ButtonX btn_exit;
private DevComponents.DotNetBar.ButtonX btn_restart;
private System.Windows.Forms.RichTextBox txt_log;
private DevComponents.DotNetBar.ButtonX btnPower;
private System.Windows.Forms.ToolStripDropDownButton ddb_warehouse;
}
}
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JmpServiceMgr.Properties;
using JunmpDALib;
using Microsoft.Win32;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;
using JmpServiceMgr.Helper;
using MQTTnet.Client;
namespace JmpServiceMgr
{
public partial class FrmMgr : MetroForm
{
public FrmMgr()
{
InitializeComponent();
if (!CHCNetSDK.NET_DVR_Init())
{
Log.ErrorLog("海康模块初始化失败");
}
else
{
//启用重连
CHCNetSDK.NET_DVR_SetReconnect(5000, 1);
}
}
private CancellationTokenSource cConfig;
private Task _tskConfig;
private object syncCfg = new object();
private AutoResetEvent cfgEvent = new AutoResetEvent(false);
private RemoteConfig remoteConfig;
public List<RFIDReaderHelper> ReaderHelperList;
public List<HikFaceHelper> HikFaceHelperList;
public MQTTHelper MqttHelper;
public SerialPortHelper SerialPortHelper;
private CancellationTokenSource CTol;
public string userId = string.Empty;
//private string orgId = string.Empty;
//private List<string> epcList = new List<string>();
private List<CancellationTokenSource> cReaderList;
private object syncEpc = new object();
private object syncCache = new object();
private bool isLoaded = false;
public string _unique = string.Empty;
#region 系统事件
private void FrmMgr_Load(object sender, EventArgs e)
{
this.TitleText = MyCache.SysConfig?.AppTitle ?? "通道服务";
notifyIcon.Text = MyCache.SysConfig?.AppTitle ?? "通道服务";
//winHwnd = this.Handle;
_unique = $"TD{MachineIdentity.GetFileIdentity()}";
SetLogs("初始化管理程序");
SetLogs(_unique);
if (MyCache.SysConfig != null)
{
//if (MyCache.SysConfig.SyncCfgInfo)
//{
// //启动配置轮询线程
// cConfig = new CancellationTokenSource();
// _tskConfig = new Task(PollingSyncConfig);
// _tskConfig.Start();
//}
ServiceStart();
this.ShowInTaskbar = true;
this.Activate();
if (CheckAutoStart())
{
t_auto.Checked = true;
}
else
{
t_auto.Checked = false;
}
isLoaded = true;
}
else
{
SetLogs("配置文件读取失败");
}
}
private void Restart()
{
//启动重启程序
var _startPath = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}JmpRestart.exe";
var _mgrPath = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}JmpServiceMgr.exe";
if (File.Exists(_startPath) && File.Exists(_mgrPath))
{
ServiceStop();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = _startPath;
startInfo.Arguments = HttpUtility.UrlEncode(_mgrPath, Encoding.UTF8);
startInfo.WindowStyle = ProcessWindowStyle.Normal;
Process.Start(startInfo);
}
else if (!File.Exists(_startPath))
{
SetLogs($"程序根目录不存在JmpRestart.exe");
}
else if (!File.Exists(_mgrPath))
{
SetLogs($"程序根目录不存在JmpServiceMgr.exe");
}
else
{
}
}
public void SetLogs(string msg)
{
this.Invoke((Action)delegate
{
if (txt_log.Text.Length > 30000)
{
txt_log.ResetText();
}
txt_log.Text = txt_log.Text.Insert(0, $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} - {msg}\r\n");
});
Application.DoEvents();
}
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Show();
this.notifyIcon.Visible = false;
this.Visible = true;
this.ShowInTaskbar = true;
this.Activate();
}
private void btn_clear_Click(object sender, EventArgs e)
{
LiteDBHelper.RefreshAll();
SetLogs("缓存清除成功");
}
private void FrmMgr_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide();
this.TopMost = false;
this.notifyIcon.Visible = true;
this.Visible = false;
this.ShowInTaskbar = false;
}
else
{
this.Activate();
}
}
private void FrmMgr_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
this.notifyIcon.Visible = true;
this.ShowInTaskbar = false;
}
private void t_exit_Click(object sender, EventArgs e)
{
cConfig?.Cancel();
ServiceStop();
Process.GetCurrentProcess().Kill();
}
private void t_restart_Click(object sender, EventArgs e)
{
Restart();
}
private void btn_restart_Click(object sender, EventArgs e)
{
Restart();
}
private void btn_exit_Click(object sender, EventArgs e)
{
DialogResult result = MessageBoxEx.Show("确定退出?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result == DialogResult.OK)
{
ServiceStop();
Process.GetCurrentProcess().Kill();
}
else { return; }
}
#endregion
#region 通道处理
protected void ServiceStart()
{
try
{
if (MyCache.SysConfig.TestModel)
{
userId = MyCache.SysConfig.UserID;
}
var channeCfg = HttpHelper.GetCurrentCfg(_unique);
if (channeCfg == null)
{
SetLogs("从云端获取配置失败");
XfVioceMsc.Text2Voice("通道程序启动失败");
}
else
{
MyCache.ChannelCfg = channeCfg;
//t_org.Text = "位置:" + channeCfg.showText;
ddb_warehouse.Text = "当前仓库:" + channeCfg.showText;
if (MyCache.SysConfig.IsChangeWarehouse)
{
//加载仓库信息
MyCache.WarehouseList = HttpHelper.GetWarehouseListByOrgId(channeCfg.orgId);
if (MyCache.WarehouseList.Count > 0)
{
ddb_warehouse.Enabled = true;
foreach (var info in MyCache.WarehouseList)
{
var toolStripButton = new ToolStripButton(info.name, null, (sender, args) =>
{
Invoke(new Action(() =>
{
ddb_warehouse.Text = "当前仓库:" + info.name;
MyCache.SysConfig.ChooseWarehouseId = info.id;
channeCfg.warehouseId = info.id;
channeCfg.channelReadEquTypeJson = info.isEnableChannelReadEqu == true
? info.channelReadEquTypeJson
: "";
MyCache.SetSystemSetp();
}));
});
toolStripButton.Width = info.name.Length * 16;
ddb_warehouse.DropDownItems.Add(toolStripButton);
}
if (!string.IsNullOrEmpty(MyCache.SysConfig.ChooseWarehouseId))
{
var chooseWarehouse = MyCache.WarehouseList.FirstOrDefault(x => x.id == MyCache.SysConfig.ChooseWarehouseId);
if (chooseWarehouse == null)
{
//无效仓库,清空设置
MyCache.SysConfig.ChooseWarehouseId = "";
}
else
{
ddb_warehouse.Text = "当前仓库:" + chooseWarehouse.name;
channeCfg.warehouseId = chooseWarehouse.id;
channeCfg.channelReadEquTypeJson = chooseWarehouse.isEnableChannelReadEqu == true ? chooseWarehouse.channelReadEquTypeJson : "";
}
}
}
}
//加载人员信息
MyCache.PoliceList = HttpHelper.GetPoliceInfo();
//加载物资信息
MyCache.EquInfos = HttpHelper.GetEquInfos();
//总控开关
CTol = new CancellationTokenSource();
//启动MQTT
MqttHelper = new MQTTHelper(this, CTol);
MqttHelper.InitialMQTT();
if (MyCache.SysConfig.IsPushShelfPrint)
{
//启动
SerialPortHelper = new SerialPortHelper(this, CTol);
SerialPortHelper.InitialSerialPort();
}
HikFaceHelperList = new List<HikFaceHelper>();
foreach (var config in MyCache.ChannelCfg.faceConfig)
{
var hikFaceHelper = new HikFaceHelper(config, this);
if (config.faceEnable && hikFaceHelper.InitialFace() && hikFaceHelper.LoginFace())
{
hikFaceHelper.EnabelFace();
}
HikFaceHelperList.Add(hikFaceHelper);
}
//启动读写器+gpio光电门+摄像头
ReaderHelperList = new List<RFIDReaderHelper>();
foreach (var config in MyCache.ChannelCfg.readerConfig)
{
var readerHelper = new RFIDReaderHelper(config, this, CTol);
ReaderHelperList.Add(readerHelper);
readerHelper.InitialReader();
}
var _stu = !txt_log.Text.Contains("失败");
SetLogs($"通道程序启动{(_stu ? "成功" : "失败")}");
XfVioceMsc.Text2Voice($"通道程序启动{(_stu ? "成功" : "失败")}");
if (_stu)
{
//通道启动成功,开启自动更新检查
if (MyCache.SysConfig.IsAutoUpdate)
{
var date = DateTime.Now.Date;
Task.Run(() =>
{
while (true)
{
try
{
if (DateTime.Now.Date > date && DateTime.Now.Hour == MyCache.SysConfig.AutoUpdateTime)
{
//检查更新
var update = HttpHelper.GetUpdate(MyCache.SysConfig?.AppCode ?? "");
if (update == null)
{
Log.ErrorLog("获取更新信息失败 AppCode=" + MyCache.SysConfig?.AppCode);
}
else
{
if (Version.TryParse(update.autoUpdateVersion2, out var version) && version > new Version(MyCache.SysConfig.AppVersion))
{
var fullFile = AppDomain.CurrentDomain.BaseDirectory + update.autoUpdateAddress.TrimStart('/').Replace('/', '\\');
if (!File.Exists(fullFile))
{
//下载新版本
var downloadRes = HttpHelper.HttpDownload(
MyCache.SysConfig.DomainUrl.TrimEnd('/') + "/" +
update.autoUpdateAddress.TrimStart('/'), fullFile);
if (!downloadRes)
{
//下载失败,60秒后重试
Thread.Sleep(60000);
continue;
}
}
//比较md5确认下载完整
if (update.autoUpdateFileMd5 == HttpHelper.GetMD5HashFromFile(fullFile))
{
//成功之后再更新日期
date = DateTime.Now.Date;
new AutoClosingMessageBox(this, "新版本下载完毕,是否更新?", "版本更新提示", 10, () =>
{
//var proc = new ProcessStartInfo(fullFile);
//proc.UseShellExecute = true;
//proc.Verb = "runas";
System.Diagnostics.Process.Start(fullFile);
Process.GetCurrentProcess().Kill();
}).ShowDialog();
}
else
{
//文件错误,删除
File.Delete(fullFile);
}
}
}
}
}
catch (Exception e)
{
Log.ErrorLog(e.Message);
}
//60s检查一次
Thread.Sleep(60000);
}
});
}
}
}
}
catch (Exception ex)
{
SetLogs("通道程序启动异常");
XfVioceMsc.Text2Voice("通道程序启动异常");
Log.ErrorLog(ex.ToString());
MqttHelper?.PushData("Error", "通道程序启动异常");
}
}
protected void ServiceStop()
{
try
{
HotKey.UnregisterHotKey(this.Handle, 100);
cReaderList?.ForEach(x => x?.Cancel());
CTol?.Cancel();
cConfig?.Cancel();
HikFaceHelperList?.ForEach(helper =>
{
helper.cDoorSync?.Cancel();
helper.doorEvent?.Set();
helper.faceEvent?.Set();
helper.setFaceEvent?.Set();
//退出系统撤防
if (helper.alarmHwnd >= 0)
{
CHCNetSDK.NET_DVR_CloseAlarmChan_V30(helper.alarmHwnd);
}
});
cfgEvent?.Set();
ReaderHelperList?.ForEach(readerHelper =>
{
if (readerHelper.Reader.IsInventory) { readerHelper.Reader.InventoryStop(); }
if (readerHelper.Reader.IsConnected) { readerHelper.Reader.Disconnect(); }
//readerHelper.Reader.Dal?.Close();
readerHelper.Reader.SnapCmaIn?.Cleanup();
readerHelper.Reader.SnapCmaOut?.Cleanup();
});
CHCNetSDK.NET_DVR_Cleanup();
MqttHelper?.MqttClient?.DisconnectAsync();
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
}
}
#endregion
#region 设置、取消开机自启
private string _nameKey = "JmpServiceMgr";
private bool CheckAutoStart()
{
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (reg == null)
reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
object reg_obj = reg.GetValue("JmpServiceMgr");
if (reg_obj != null && reg_obj.ToString().Contains("JmpServiceMgr"))
{
return true;
}
else { return false; }
}
private void SetAutoStart(bool isAutoRun = true)
{
try
{
var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (reg == null)
{
reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
}
object reg_obj = reg.GetValue(_nameKey);
if (reg_obj != null && reg_obj.ToString().Contains(_nameKey))
{
if (!isAutoRun)
{
reg.SetValue(_nameKey, false);
SetLogs("已取消开机自启");
t_auto.Checked = false;
}
}
else
{
if (isAutoRun)
{
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.SetValue(_nameKey, Application.ExecutablePath);
rk2.Close();
rk.Close();
SetLogs("已设置开机自启");
t_auto.Checked = true;
}
else
{
}
}
}
catch
{
t_auto.Checked = false;
SetLogs("开机自启设置失败");
}
finally
{
}
}
private void t_auto_Click(object sender, EventArgs e)
{
if (isLoaded)
{
t_auto.Checked = !t_auto.Checked;
if (t_auto.Checked) { SetAutoStart(true); }
else { SetAutoStart(false); }
}
}
private void btn_copy_Click(object sender, EventArgs e)
{
Clipboard.SetText(_unique.Length < 40 ? MachineIdentity.GetCurrentIdentity() : _unique);
MessageBoxEx.Show("标识复制成功!", "提示");
SetLogs("标识复制成功");
}
private void btnPower_Click(object sender, EventArgs e)
{
try
{
//判断是否已经打开配置界面
bool isContuine = true;
foreach (MetroForm frm in Application.OpenForms)
{
if (frm is FrmConfig)
{
isContuine = false;
break;
}
}
if (!isContuine) { return; }
var config = new FrmConfig(ReaderHelperList);
config.ShowDialog();
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
}
}
#endregion
#region 全局热键注册
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100:
btnPower_Click(default, default);
break;
}
break;
}
base.WndProc(ref m);
}
private void FrmMgr_Activated(object sender, EventArgs e)
{
HotKey.RegisterHotKey(this.Handle, 100, HotKey.KeyModifiers.Ctrl | HotKey.KeyModifiers.Alt, (int)Keys.J);
}
private void FrmMgr_Leave(object sender, EventArgs e)
{
HotKey.UnregisterHotKey(this.Handle, 100);
}
#endregion
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Impinj.OctaneSdk;
using JmpCommon;
using JmpCommon.Camera;
using JmpServiceMgr.Properties;
using JunmpDALib;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// 摄像头操作
/// </summary>
public class CameraHelper
{
private readonly IRFIDReader _reader;
private readonly FrmMgr _form;
private readonly CancellationTokenSource _cTol;
public string _snap_fileName = string.Empty;
public string _snap_directoy = string.Empty;
public object _snap_lock_obj = new object();
private byte[] _snap_buffer = default;
public Action<string, string> onSnapPic;
public Action onUploadPic;
public bool IsWork;
public CameraHelper(IRFIDReader reader, FrmMgr form, CancellationTokenSource cTol)
{
_reader = reader;
_form = form;
_cTol = cTol;
}
public void Init()
{
//启用抓拍,则开启
if (_reader.RFIDReaderSettings.IsUseSnapshot)
{
switch (_reader.RFIDReaderSettings.CamType)
{
case 0:
_reader.SnapCmaOut = new DahuaCamera();
break;
case 1:
_reader.SnapCmaOut = new HikCamera();
break;
default: break;
}
if (_reader.SnapCmaOut != null)
{
_reader.SnapCmaOut.Initial(_reader.RFIDReaderSettings.CamAddress,
_reader.RFIDReaderSettings.CamPort,
_reader.RFIDReaderSettings.CamChannel,
_reader.RFIDReaderSettings.CamUser,
_reader.RFIDReaderSettings.CamPwd);
if (!_reader.SnapCmaOut.Login())
{
Log.WorkLog("出库视频服务器登录失败");
_form.SetLogs("出库视频登录失败");
XfVioceMsc.Text2Voice("出库视频登录失败");
}
}
else
{
Log.WorkLog("出库视频厂商类型不正确");
_form.SetLogs("出库视频厂商类型不正确");
XfVioceMsc.Text2Voice("出库视频厂商类型不正确");
}
}
if (_reader.RFIDReaderSettings.IsCameraSeparate)
{
//启用抓拍,则开启
if (_reader.RFIDReaderSettings.IsUseSnapshot2)
{
switch (_reader.RFIDReaderSettings.CamType2)
{
case 0:
_reader.SnapCmaIn = new DahuaCamera();
break;
case 1:
_reader.SnapCmaIn = new HikCamera();
break;
default: break;
}
if (_reader.SnapCmaIn != null)
{
_reader.SnapCmaIn.Initial(_reader.RFIDReaderSettings.CamAddress2,
_reader.RFIDReaderSettings.CamPort2,
_reader.RFIDReaderSettings.CamChannel2,
_reader.RFIDReaderSettings.CamUser2,
_reader.RFIDReaderSettings.CamPwd2);
if (!_reader.SnapCmaIn.Login())
{
Log.WorkLog("出库视频服务器登录失败");
_form.SetLogs("出库视频登录失败");
XfVioceMsc.Text2Voice("出库视频登录失败");
}
}
else
{
Log.WorkLog("出库视频厂商类型不正确");
_form.SetLogs("出库视频厂商类型不正确");
XfVioceMsc.Text2Voice("出库视频厂商类型不正确");
}
}
}
else
{
_reader.SnapCmaIn = _reader.SnapCmaOut;
}
//绑定抓拍事件
onSnapPic = SnapPic;
onUploadPic = UploadPic;
}
/// <summary>
/// 抓拍并上传文件
/// </summary>
/// <param name="snap_fileName"></param>
/// <param name="snap_directoy"></param>
public void SnapPic(string snap_fileName, string snap_directoy)
{
var state = "";
if (_reader.GpiTrigger.Gpi1Str == "1")
{
//入库先触发
state = "in";
}
else if (_reader.GpiTrigger.Gpi2Str == "1")
{
//出库先触发
state = "out";
}
if (state == "")
{
SnapClear();
Log.WorkLog("抓拍失败,无效光电触发");
return;
}
lock (_snap_lock_obj)
{
_snap_fileName = snap_fileName;
_snap_directoy = snap_directoy;
if ((!_reader.RFIDReaderSettings.IsUseSnapshot) && state == "out")
{
SnapClear();
return;
}
if ((_reader.RFIDReaderSettings.IsCameraSeparate && !_reader.RFIDReaderSettings.IsUseSnapshot2) && state == "in")
{
SnapClear();
return;
}
if (_reader.SnapCmaOut == null || _reader.SnapCmaIn == null)
{
SnapClear();
Log.WorkLog("抓拍失败,摄像头未初始化");
return;
}
else
{
Log.WorkLog("开始抓拍");
IsWork = true;
if (state == "in")
{
_snap_buffer = _reader.SnapCmaIn.CaptureBuffer();
}
else
{
_snap_buffer = _reader.SnapCmaOut.CaptureBuffer();
}
if (_snap_buffer is { Length: > 0 })
{
Log.WorkLog("抓拍成功,暂存");
}
else
{
SnapClear();
Log.WorkLog("抓拍失败,请检查");
}
IsWork = false;
}
}
}
public void UploadPic()
{
if (_snap_buffer == null || _snap_buffer.Length == 0)
{
}
else
{
if (string.IsNullOrEmpty(_snap_fileName) || string.IsNullOrEmpty(_snap_directoy))
{
}
else
{
var buffer = _snap_buffer.ToArray();
var fileName = _snap_fileName;
var directoy = _snap_directoy;
//上传图片 尝试3次
Task.Run(() =>
{
for (int i = 0; i < 3; i++)
{
if (HttpHelper.UploadPic(buffer, fileName, directoy))
{
break;
}
}
});
}
}
SnapClear();
}
public void SnapClear()
{
_snap_fileName = string.Empty;
_snap_directoy = string.Empty;
_snap_buffer = default;
}
public void Dispose()
{
SnapClear();
_reader?.SnapCmaOut?.Cleanup();
_reader?.SnapCmaIn?.Cleanup();
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Impinj.OctaneSdk;
using JmpCommon;
using JmpServiceMgr.Properties;
using JunmpDALib;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// GPIO操作
/// </summary>
public class DalHelper
{
private readonly IRFIDReader _reader;
private readonly CameraHelper _camHelper;
private readonly FrmMgr _form;
private readonly CancellationTokenSource _cTol;
public DalHelper(IRFIDReader reader, CameraHelper camHelper, FrmMgr form, CancellationTokenSource cTol)
{
_reader = reader;
_camHelper = camHelper;
_form = form;
_cTol = cTol;
}
private AutoResetEvent ctolEvent = new AutoResetEvent(false);
private bool _ctolStatus = false;
public void InitialGpio()
{
try
{
if (MyCache.ChannelCfg == null || string.IsNullOrEmpty(_reader.RFIDReaderSettings.GpioAddr) || _reader.RFIDReaderSettings.GpioPort <= 0)
{
if (MyCache.ChannelCfg?.orgId== "E05CC28D-C189-4389-8081-DD0D6E483B40")
{
//宁波市局无gpio,通过读写器控制抓拍
_reader.GpiChanged += _reader_GpiChanged;
}
else
{
_form.SetLogs(_reader.RFIDReaderSettings.Name + "GPIO配置不正确");
}
return;
}
else
{
_reader.Dal = new DAL(_reader.RFIDReaderSettings.GpioAddr, _reader.RFIDReaderSettings.GpioPort);
if (_reader.Dal.IsOpen())
{
_form.SetLogs(_reader.RFIDReaderSettings.Name + "GPIO连接成功");
}
else
{
if (_reader.Dal.Open())
{
_form.SetLogs(_reader.RFIDReaderSettings.Name + "GPIO连接成功");
_reader.Dal.OnLinkLost += OnGpioLinkLost;
_reader.Dal.OnGPIChanged += OnGPIChanged;
_reader.Dal.GpioInit();
_ctolStatus = true;
}
else
{
_form.SetLogs(_reader.RFIDReaderSettings.Name + "GPIO连接失败");
XfVioceMsc.Text2Voice("GPIO连接失败");
}
new Task(() => PollingCtol(_cTol.Token)).Start();
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
_form.SetLogs(_reader.RFIDReaderSettings.Name + "GPIO连接异常");
XfVioceMsc.Text2Voice("GPIO连接异常");
}
}
private void _reader_GpiChanged(IRFIDReader reader, object e)
{
if (e is GpiEvent gpiEvent)
{
if (gpiEvent.State&&!_camHelper.IsWork)
{
//抓拍
var snap_fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
var snap_directoy = DateTime.Now.ToString("yyyyMMdd");
//异步抓拍开始
_camHelper.onSnapPic?.BeginInvoke(snap_fileName, snap_directoy, default, default);
}
}
}
private void PollingCtol(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
if (!_reader.Dal.IsOpen())
{
if (_reader.Dal.Open())
{
_reader.Dal.GpioInit();
_ctolStatus = true;
}
else
{
Log.WorkLog("GPIO重连失败");
}
}
if (ctolEvent.WaitOne(5000)) { continue; }
}
catch (Exception e)
{
Log.ErrorLog("GPIO重连异常" + e.ToString());
}
}
}
/// <summary>
/// 状态监控
/// </summary>
private void OnGpioLinkLost()
{
//重置状态
_ctolStatus = false;
//立即重连
ctolEvent.Set();
}
/// <summary>
/// GPIO事件
/// </summary>
/// <param name="args"></param>
private void OnGPIChanged(GPIArgs args)
{
try
{
//出入判断
if (args.Value && (string.IsNullOrEmpty(_reader.GpiTrigger.Gpi1Str) || string.IsNullOrEmpty(_reader.GpiTrigger.Gpi2Str)))
{
_reader.GpiTrigger.LastTime = DateTime.Now;
switch (args.Location)
{
case 0:
//光电2已触发
if (!string.IsNullOrEmpty(_reader.GpiTrigger.Gpi2Str))
{
_reader.GpiTrigger.Gpi1Str = "2";
}
else
{
_reader.GpiTrigger.Gpi1Str = "1";
}
break;
case 1:
//光电1已触发
if (!string.IsNullOrEmpty(_reader.GpiTrigger.Gpi1Str))
{
_reader.GpiTrigger.Gpi2Str = "2";
}
else
{
_reader.GpiTrigger.Gpi2Str = "1";
}
break;
default: break;
}
}
//读写器触发读取
switch (args.Location)
{
case 0:
case 1:
if (args.Value && !_reader.IsInventory)
{
if (_reader?.IsConnected ?? false)
{
//开始盘点并开始抓拍
var snap_fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
var snap_directoy = DateTime.Now.ToString("yyyyMMdd");
//异步抓拍开始
_camHelper.onSnapPic?.BeginInvoke(snap_fileName, snap_directoy, default, default);
_reader.IsInventory = true;
_form.SetLogs("光电触发,开始盘点");
//延迟超过5秒爆炸,切换成线程跑
Task.Run(() => _reader.InventoryStart());
}
else
{
_form.SetLogs("读写器未连接,开启盘点失败");
}
}
else
{
//_form.SetLogs("读写器盘点中,无需开启盘点");
}
break;
default:
break;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
}
}
}
}
using JmpCommon;
using JmpCommon.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// 海康门禁操作
/// </summary>
public class HikFaceHelper
{
private readonly FrmMgr _form;
private readonly FaceConfig _config;
private CHCNetSDK.RemoteConfigCallback onGetGatewayCardCallback = default;
public CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = default;
private CHCNetSDK.EXCEPYIONCALLBACK onExceptionCallBack = default;
private CHCNetSDK.MSGCallBack_V31 onDVRMessageCallBackV31 = default;
private CHCNetSDK.RemoteConfigCallback g_fCardInfoSearchCallback = default;
public int hikHwnd = -1;
public int alarmHwnd = -1;
private int cardCfgHwnd = -1;
//private string adminCard = "838668";
private IntPtr winHwnd = IntPtr.Zero;
public CancellationTokenSource cDoorSync;
private Task taskSyncDoor;
public AutoResetEvent doorEvent = new AutoResetEvent(false);
//人脸是否下发成功
private bool isSended = false;
//是否获取了人脸
private bool isExistFace = false;
public ManualResetEvent setFaceEvent = new ManualResetEvent(true);
public ManualResetEvent faceEvent = new ManualResetEvent(true);
////已同步过的卡号缓存
////private List<SyncCardInfo> cacheCardList = new List<SyncCardInfo>();
////线程阻塞器
//private ManualResetEvent cardEvent = new ManualResetEvent(true);
////门禁卡号数据
//private List<DoorCardInfo> doorCards = new List<DoorCardInfo>();
public HikFaceHelper(FaceConfig config, FrmMgr form)
{
_config = config;
_form = form;
winHwnd = form.Handle;
}
/// <summary>
/// 初始化门禁
/// </summary>
/// <returns></returns>
public bool InitialFace()
{
try
{
byte[] strIP = new byte[16 * 16];
//设置透传报警信息类型
CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离,0-不分离(COMM_VCA_ALARM返回),1-分离(分离后走COMM_ISAPI_ALARM回调返回)
int nSize = Marshal.SizeOf(struLocalCfg);
IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false);
if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg)) //NET_DVR_LOCAL_CFG_TYPE_GENERAL
{
Log.WorkLog("门禁初始化失败");
_form.SetLogs("门禁初始化失败");
XfVioceMsc.Text2Voice("门禁初始化失败");
return false;
}
Marshal.FreeHGlobal(ptrLocalCfg);
//设置异常消息回调函数
if (onExceptionCallBack == null)
{
onExceptionCallBack = new CHCNetSDK.EXCEPYIONCALLBACK(DVRExceptionCB);
}
CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, onExceptionCallBack, IntPtr.Zero);
//设置报警回调函数
if (onDVRMessageCallBackV31 == null)
{
onDVRMessageCallBackV31 = new CHCNetSDK.MSGCallBack_V31(DVRMessageCallBackV31);
}
CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(onDVRMessageCallBackV31, IntPtr.Zero);
return true;
}
catch (Exception ex)
{
XfVioceMsc.Text2Voice("门禁初始化失败");
_form.SetLogs("门禁初始化失败");
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 登录至门禁
/// </summary>
/// <returns></returns>
public bool LoginFace()
{
try
{
CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
//设备IP地址或者域名
byte[] byIP = System.Text.Encoding.Default.GetBytes(_config.faceAddress);
struLogInfo.sDeviceAddress = new byte[129];
byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
//设备用户名
byte[] byUserName = System.Text.Encoding.Default.GetBytes(_config.faceUser);
struLogInfo.sUserName = new byte[64];
byUserName.CopyTo(struLogInfo.sUserName, 0);
//设备密码
byte[] byPassword = System.Text.Encoding.Default.GetBytes(_config.facePwd);
struLogInfo.sPassword = new byte[64];
byPassword.CopyTo(struLogInfo.sPassword, 0);
struLogInfo.wPort = (ushort)_config.facePort;//设备服务端口号
struLogInfo.cbLoginResult = LoginCallBack;
struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
if ((struLogInfo.bUseAsynLogin == true) && (LoginCallBack == null))
{
LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK(HikLoginCallBack);//注册回调函数
}
struLogInfo.byLoginMode = 0; //0-Private, 1-ISAPI, 2-自适应
struLogInfo.byHttps = 0; //0-不适用tls,1-使用tls 2-自适应
CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();
//登录设备 Login the device
hikHwnd = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
if (hikHwnd < 0)
{
var errCode = CHCNetSDK.NET_DVR_GetLastError();
Log.WorkLog($"门禁登录失败,错误代码:{errCode}");
_form.SetLogs($"门禁登录失败,错误代码:{errCode}");
XfVioceMsc.Text2Voice("门禁登录失败");
return false;
}
else
{
if (MyCache.SysConfig.SyncUserInfo)
{
//启动同步线程
cDoorSync = new CancellationTokenSource();
taskSyncDoor = new Task(PollingDoorUser);
taskSyncDoor.Start();
}
//设置人脸门禁 时间
SetDeivceTime();
return true;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
XfVioceMsc.Text2Voice("门禁设备登录失败");
_form.SetLogs("门禁设备登录失败");
return false;
}
}
/// <summary>
/// 门禁布防
/// </summary>
/// <returns></returns>
public bool EnabelFace()
{
try
{
if (hikHwnd < 0) { return false; }
CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam);
struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防
struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型
struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测
alarmHwnd = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(hikHwnd, ref struAlarmParam);
if (alarmHwnd < 0)
{
var iLastErr = CHCNetSDK.NET_DVR_GetLastError();
var strErr = "布防失败,错误代码:" + iLastErr; //布防失败,输出错误号
Log.WorkLog(strErr);
XfVioceMsc.Text2Voice("门禁布防失败");
_form.SetLogs(strErr);
return false;
}
else
{
return true;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
XfVioceMsc.Text2Voice("门禁设备布防失败");
_form.SetLogs("门禁设备布防失败");
return false;
}
}
/// <summary>
/// 发送用户信息至海康
/// </summary>
/// <returns></returns>
private bool SetDoorUser(string cardNo, string name)
{
try
{
if (hikHwnd < 0) { return false; }
if (cardCfgHwnd != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_CARD_COND struCond = new CHCNetSDK.NET_DVR_CARD_COND();
struCond.Init();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwCardNum = 1;
IntPtr ptrStruCond = Marshal.AllocHGlobal((int)struCond.dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_CARD, ptrStruCond, (int)struCond.dwSize, null, winHwnd);
if (cardCfgHwnd < 0)
{
Log.WorkLog($"启动远程配置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
Marshal.FreeHGlobal(ptrStruCond);
return false;
}
else
{
CHCNetSDK.NET_DVR_CARD_RECORD struData = new CHCNetSDK.NET_DVR_CARD_RECORD();
struData.Init();
struData.dwSize = (uint)Marshal.SizeOf(struData);
struData.byCardType = 1;
byte[] byTempCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byTempCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
struData.byCardNo[i] = byTempCardNo[i];
}
struData.wCardRightPlan[0] = 1;
var employeeNo = System.Text.RegularExpressions.Regex.Replace(cardNo, @"[^0-9]+", "");
struData.dwEmployeeNo = uint.Parse(employeeNo);
byte[] btyName = new byte[CHCNetSDK.NAME_LEN];
btyName = System.Text.Encoding.UTF8.GetBytes(name);
for (int i = 0; i < btyName.Length; i++)
{
struData.byName[i] = btyName[i];
}
struData.struValid.byEnable = 1;
struData.struValid.struBeginTime.wYear = 2000;
struData.struValid.struBeginTime.byMonth = 1;
struData.struValid.struBeginTime.byDay = 1;
struData.struValid.struBeginTime.byHour = 11;
struData.struValid.struBeginTime.byMinute = 11;
struData.struValid.struBeginTime.bySecond = 11;
struData.struValid.struEndTime.wYear = 2030;
struData.struValid.struEndTime.byMonth = 1;
struData.struValid.struEndTime.byDay = 1;
struData.struValid.struEndTime.byHour = 11;
struData.struValid.struEndTime.byMinute = 11;
struData.struValid.struEndTime.bySecond = 11;
struData.byDoorRight[0] = 1;
struData.wCardRightPlan[0] = 1;
IntPtr ptrStruData = Marshal.AllocHGlobal((int)struData.dwSize);
Marshal.StructureToPtr(struData, ptrStruData, false);
CHCNetSDK.NET_DVR_CARD_STATUS struStatus = new CHCNetSDK.NET_DVR_CARD_STATUS();
struStatus.Init();
struStatus.dwSize = (uint)Marshal.SizeOf(struStatus);
IntPtr ptrdwState = Marshal.AllocHGlobal((int)struStatus.dwSize);
Marshal.StructureToPtr(struStatus, ptrdwState, false);
int dwState = (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS;
uint dwReturned = 0;
bool res = false;
while (true)
{
dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(cardCfgHwnd, ptrStruData, struData.dwSize, ptrdwState, struStatus.dwSize, ref dwReturned);
struStatus = (CHCNetSDK.NET_DVR_CARD_STATUS)Marshal.PtrToStructure(ptrdwState, typeof(CHCNetSDK.NET_DVR_CARD_STATUS));
if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT)
{
Thread.Sleep(10);
continue;
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED)
{
Log.WorkLog($"人员信息写入失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS)
{
if (struStatus.dwErrorCode != 0)
{
Log.WorkLog($"人员信息写入失败,错误代码:{struStatus.dwErrorCode}");
}
else
{
Log.WorkLog($"人员信息写入成功");
}
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FINISH)
{
Log.WorkLog($"人员信息写入完成");
res = true;
break;
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION)
{
Log.WorkLog($"人员信息写入失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
res = false;
break;
}
else
{
Log.WorkLog($"人员信息写入失败,发生未知错误:{CHCNetSDK.NET_DVR_GetLastError()}");
res = false;
break;
}
}
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
cardCfgHwnd = -1;
Marshal.FreeHGlobal(ptrStruData);
Marshal.FreeHGlobal(ptrdwState);
Marshal.FreeHGlobal(ptrStruCond);
return res;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
if (cardCfgHwnd != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
/// <summary>
/// 获取用户人脸信息
/// </summary>
/// <param name="cardNo"></param>
/// <returns></returns>
private bool GetUserFace(string cardNo)
{
try
{
isExistFace = false;
if (hikHwnd < 0) { return false; }
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FACE_PARAM_COND struCond = new CHCNetSDK.NET_DVR_FACE_PARAM_COND();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwFaceNum = 1;
struCond.byFaceID = 1;
struCond.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struCond.byEnableCardReader[0] = 1;
struCond.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
if (i > struCond.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struCond.byCardNo[i] = byTempCardNo[i];
}
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
onGetGatewayCardCallback = new CHCNetSDK.RemoteConfigCallback(ProcessGetFaceParamCallback);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_GET_FACE_PARAM_CFG, ptrStruCond, dwSize, onGetGatewayCardCallback, winHwnd);
if (-1 == cardCfgHwnd)
{
int errCode = 0;
IntPtr ptrFail = CHCNetSDK.NET_DVR_GetErrorMsg(ref errCode);
string strFail = Marshal.PtrToStringAnsi(ptrFail);
Log.WorkLog($"获取人脸异常,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}{strFail}");
Marshal.FreeHGlobal(ptrStruCond);
return false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "NET_DVR_GET_FACE_PARAM_CFG");
}
else
{
faceEvent.Reset();
faceEvent.WaitOne(5000);
Marshal.FreeHGlobal(ptrStruCond);
return isExistFace;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "NET_DVR_GET_FACE_PARAM_CFG");
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
//isExistFace = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
/// <summary>
/// 获取海康门禁中指纹数据
/// </summary>
/// <param name="cardNo"></param>
/// <returns></returns>
private bool GetUserFinger(string cardNo, byte finger_index, out string finger_info)
{
try
{
finger_info = string.Empty;
if (hikHwnd < 0) { return false; }
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FINGERPRINT_COND struCond = new CHCNetSDK.NET_DVR_FINGERPRINT_COND();
struCond.init();
struCond.dwSize = Marshal.SizeOf(struCond);
struCond.dwFingerprintNum = 1;
struCond.byFingerPrintID = finger_index;
byte[] byTemp = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTemp.Length; i++)
{
struCond.byCardNo[i] = byTemp[i];
}
struCond.dwEnableReaderNo = 1;
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_GET_FINGERPRINT, ptrStruCond, dwSize, null, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStruCond);
//MessageBox.Show("NET_DVR_GET_FINGERPRINT_CFG_V50 FAIL, ERROR CODE" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog("指纹数据获取失败");
return false;
}
Boolean flag = true;
CHCNetSDK.NET_DVR_FINGERPRINT_RECORD struOutBuff = new CHCNetSDK.NET_DVR_FINGERPRINT_RECORD();
struOutBuff.init();
int dWsize = Marshal.SizeOf(struOutBuff);
int dwStatus = 0;
while (flag)
{
dwStatus = CHCNetSDK.NET_DVR_GetNextRemoteConfig(cardCfgHwnd, ref struOutBuff, dWsize);
switch (dwStatus)
{
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS://成功读取到数据,处理完本次数据后需调用next
finger_info = ReaderFingerInfo(struOutBuff);
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT:
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FAILED" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
flag = false;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FINISH:
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FINISH", "Tips", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取成功");
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
default:
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_UNKOWN" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
}
}
Marshal.FreeHGlobal(ptrStruCond);
return !string.IsNullOrEmpty(finger_info);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
finger_info = string.Empty;
return false;
}
}
private string ReaderFingerInfo(CHCNetSDK.NET_DVR_FINGERPRINT_RECORD struOutBuff)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
ms.Write(struOutBuff.byFingerData, 0, struOutBuff.dwFingerPrintLen);
var base64 = Convert.ToBase64String(ms.ToArray());
ms.Close();
return base64;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return string.Empty;
}
}
/// <summary>
/// 比对用户信息并同步
/// </summary>
private void SyncCards()
{
if (MyCache.ChannelCfg == null || hikHwnd < 0)
{
return;
}
else
{
//先获取平台人员
if (MyCache.PoliceList == null || MyCache.PoliceList.Count == 0)
{
return;
}
else
{
//下发、更新门禁用户
var tmpList = new List<sync_police>(MyCache.PoliceList);
foreach (var _tmp in tmpList)
{
if (string.IsNullOrEmpty(_tmp.policeCode))
{
continue;
}
else
{
if (!SetDoorUser(_tmp.policeCode, _tmp.name))
{
Log.WorkLog($"人员写入门禁失败,{_tmp.policeCode}{_tmp.name}");
}
}
}
}
}
}
/// <summary>
/// 同步人脸信息
/// </summary>
private void SyncFaces()
{
if (MyCache.PoliceList == null || MyCache.PoliceList.Count == 0 || hikHwnd < 0)
{
return;
}
var policeCards = MyCache.PoliceList;
foreach (var item in policeCards)
{
//校验门禁中是否有人脸信息
var _res = GetUserFace(item.policeCode);
if (_res && string.IsNullOrEmpty(item.photo))
{
//将照片同步至平台
if (!SendFace2Http(item.policeCode, item.id))
{
Log.WorkLog($"人脸照片上传失败,{item.name},{item.policeCode}");
}
}
else if (!_res && string.IsNullOrEmpty(item.photo))
{
//服务端和门禁中都没有人脸信息,忽略
continue;
}
else
{
//尝试下载人脸图片
var buffer = HttpHelper.GetPoliceImg(item.photo);
if (buffer == null)
{
Log.WorkLog("平台人脸图片下载失败");
continue;
}
else
{
//写入至海康
var res = SendFaceImg(item.policeCode, buffer);
if (!res)
{
Log.WorkLog($"人脸写入到门禁失败,{item.name},{item.policeCode}");
}
}
}
}
}
/// <summary>
/// 同步指纹数据
/// </summary>
private void SyncFinger()
{
if (MyCache.PoliceList == null || MyCache.PoliceList.Count == 0 || hikHwnd < 0)
{
return;
}
var policeCards = MyCache.PoliceList.ToList();
foreach (var item in policeCards)
{
//校验门禁中是否有指纹信息(10个手指)
List<FingerInfo> fingerList = new List<FingerInfo>();
for (byte i = 1; i <= 10; i++)
{
var _res = GetUserFinger(item.policeCode, i, out string finger_info);
if (_res && !string.IsNullOrEmpty(finger_info))
{
fingerList.Add(new FingerInfo()
{
fingerInfo = finger_info,
fingerNum = i
});
}
}
var local_nums = fingerList.Select(s => s.fingerNum).ToList();
if (fingerList.Count > 0)
{
//将指纹同步至平台
if (!SendFinger2Http(item.id, fingerList))
{
Log.WorkLog($"指纹上传至平台失败,{item.policeCode},{item.name}");
}
continue;
}
else if (item.fingerList == null || item.fingerList.Count == 0)
{
//服务端和门禁中都没有指纹信息,忽略
continue;
}
else
{
foreach (var finger in item.fingerList)
{
byte[] buffer = Convert.FromBase64String(@finger.fingerInfo);
//写入至海康
var res = SendFingerInfo(item.policeCode, buffer, (byte)finger.fingerNum);
if (!res)
{
Log.WorkLog($"指纹写入到门禁失败,{item.name},{item.policeCode}");
}
}
}
}
}
/// <summary>
/// 人脸图片上传
/// </summary>
private bool SendFace2Http(string strCard, string id)
{
try
{
var path = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg\\{strCard}.jpg";
if (!File.Exists(path))
{
return false;
}
else
{
var buffer = new byte[] { };
using (MemoryStream ms = new MemoryStream())
{
Bitmap bitmap = new Bitmap(path);
bitmap.Save(ms, ImageFormat.Jpeg);
buffer = ms.GetBuffer();
}
if (buffer == null || buffer.Length == 0)
{
return false;
}
else
{
return HttpHelper.UploadFace(buffer, $"{strCard}.jpg", id);
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
private bool SendFinger2Http(string id, List<FingerInfo> fingerList)
{
try
{
return HttpHelper.UpdateFinger(id, fingerList);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 轮询同步人脸、用户信息
/// </summary>
private void PollingDoorUser()
{
while (!cDoorSync.IsCancellationRequested)
{
var cfg = HttpHelper.GetPoliceInfo();
if (cfg == null || cfg.Count == 0)
{ }
else
{
//更新缓存
MyCache.PoliceList = cfg;
//删除平台不存在的缓存
//var pzCardList = cfg.Select(s => s.policeCode).ToList();
//cacheCardList.RemoveAll(t => !pzCardList.Contains(t.CardNo));
//LiteDBHelper.DeleteByCard(t => !pzCardList.Contains(t.CardNo));
if (hikHwnd >= 0)
{
SyncCards();
Log.WorkLog("用户信息同步完成");
if (MyCache.SysConfig.IsSyncFaces)
{
SyncFaces();
Log.WorkLog("用户人脸同步完成");
}
if (MyCache.SysConfig.IsSyncFinger)
{
SyncFinger();
Log.WorkLog("用户指纹同步完成");
}
if (MyCache.SysConfig.IsSyncCard)
{
SyncCard();
Log.WorkLog("用户卡号同步完成");
}
}
}
doorEvent.WaitOne(18000000);
//doorEvent.WaitOne(600000); //10min
}
}
/// <summary>
/// 设置人脸门禁时间和服务器保持一致
/// </summary>
private void SetDeivceTime()
{
if (hikHwnd < 0)
{
return;
}
else
{
var now_time = DateTime.Now;
CHCNetSDK.NET_DVR_TIME CurTime = new CHCNetSDK.NET_DVR_TIME();
CurTime.dwYear = (uint)now_time.Year;
CurTime.dwMonth = (uint)now_time.Month;
CurTime.dwDay = (uint)now_time.Day;
CurTime.dwHour = (uint)now_time.Hour;
CurTime.dwMinute = (uint)now_time.Minute;
CurTime.dwSecond = (uint)now_time.Second;
int dwSize = (int)Marshal.SizeOf(CurTime);
IntPtr ptrCurTime = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(CurTime, ptrCurTime, true);
bool res = CHCNetSDK.NET_DVR_SetDVRConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_TIMECFG, 0, ptrCurTime, (uint)dwSize);
if (true == res)
{
_form.SetLogs("设置人脸门禁时间成功");
}
else
{
_form.SetLogs("设置人脸门禁时间失败");
}
Marshal.FreeHGlobal(ptrCurTime);
}
}
private bool SendFaceImg(string cardNo, byte[] buffer)
{
try
{
isSended = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FACE_PARAM_COND struCond = new CHCNetSDK.NET_DVR_FACE_PARAM_COND();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwFaceNum = 1;
struCond.byFaceID = 1;
struCond.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struCond.byEnableCardReader[0] = 1;
struCond.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempCardNo = Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
if (i > struCond.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struCond.byCardNo[i] = byTempCardNo[i];
}
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
onGetGatewayCardCallback = new CHCNetSDK.RemoteConfigCallback(ProcessSetFaceParamCallback);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_FACE_PARAM_CFG, ptrStruCond, dwSize, onGetGatewayCardCallback, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStruCond);
return false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "NET_DVR_SET_FACE_PARAM_CFG");
}
Marshal.FreeHGlobal(ptrStruCond);
CHCNetSDK.NET_DVR_FACE_PARAM_CFG struFaceParamCfg = new CHCNetSDK.NET_DVR_FACE_PARAM_CFG();
struFaceParamCfg.dwSize = (uint)Marshal.SizeOf(struFaceParamCfg);
struFaceParamCfg.byFaceID = 1;
struFaceParamCfg.byFaceDataType = 1;
struFaceParamCfg.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struFaceParamCfg.byEnableCardReader[0] = 1;
struFaceParamCfg.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempFaceCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempFaceCardNo.Length; i++)
{
if (i > struFaceParamCfg.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struFaceParamCfg.byCardNo[i] = byTempFaceCardNo[i];
}
if (0 == buffer.Length)
{
Log.WorkLog("人脸图片不正确,0kb");
return false;
}
if (200 * 1024 < buffer.Length)
{
Log.WorkLog("人脸图片不正确,大于200kb");
return false;
}
struFaceParamCfg.dwFaceLen = (uint)buffer.Length;
int len = (int)struFaceParamCfg.dwFaceLen;
struFaceParamCfg.pFaceBuffer = Marshal.AllocHGlobal(len);
Marshal.Copy(buffer, 0, struFaceParamCfg.pFaceBuffer, len);
uint dwParamSize = (uint)Marshal.SizeOf(struFaceParamCfg);
IntPtr ptrStruFaceParamCfg = Marshal.AllocHGlobal((int)dwParamSize);
Marshal.StructureToPtr(struFaceParamCfg, ptrStruFaceParamCfg, false);
if (!CHCNetSDK.NET_DVR_SendRemoteConfig(cardCfgHwnd, 9, ptrStruFaceParamCfg, dwParamSize))
{
Log.WorkLog($"设置人脸图片失败");
Marshal.FreeHGlobal(struFaceParamCfg.pFaceBuffer);
Marshal.FreeHGlobal(ptrStruFaceParamCfg);
return false;
}
else
{
setFaceEvent.Reset();
setFaceEvent.WaitOne(5000);
Marshal.FreeHGlobal(struFaceParamCfg.pFaceBuffer);
Marshal.FreeHGlobal(ptrStruFaceParamCfg);
return isSended;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
isSended = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
private bool SendFingerInfo(string cardNo, byte[] buffer, byte num)
{
if (cardCfgHwnd != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig((int)cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FINGERPRINT_COND strupond = new CHCNetSDK.NET_DVR_FINGERPRINT_COND();
strupond.init();
int dwSize = Marshal.SizeOf(strupond);
strupond.dwSize = dwSize;
strupond.byFingerPrintID = num;
strupond.dwEnableReaderNo = 1;
strupond.dwFingerprintNum = 1;//指纹数量写死的
byte[] byTempptrRec = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempptrRec.Length; i++)
{
strupond.byCardNo[i] = byTempptrRec[i];
}
IntPtr ptrStrucond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(strupond, ptrStrucond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_FINGERPRINT, ptrStrucond, dwSize, null, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStrucond);
//MessageBox.Show("NET_DVR_SET_FINGERPRINT_CFG_V50 FAIL, ERROR CODE" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
return false;
}
bool flag = true;
int dwStatus = 0;
CHCNetSDK.NET_DVR_FINGERPRINT_RECORD StruRecord = new CHCNetSDK.NET_DVR_FINGERPRINT_RECORD();
StruRecord.init();
int dwInBuffSize = Marshal.SizeOf(StruRecord);
StruRecord.dwSize = dwInBuffSize;
StruRecord.byFingerPrintID = num;
StruRecord.dwEnableReaderNo = 1;
StruRecord.dwFingerPrintLen = buffer.Length;
Array.Copy(buffer, 0, StruRecord.byFingerData, 0, buffer.Length);
byte[] byTemp = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTemp.Length; i++)
{
StruRecord.byCardNo[i] = byTemp[i];
}
CHCNetSDK.NET_DVR_FINGERPRINT_STATUS StruStatus = new CHCNetSDK.NET_DVR_FINGERPRINT_STATUS();
StruStatus.init();
int dwOutBuffSize = Marshal.SizeOf(StruStatus);
StruStatus.dwSize = dwOutBuffSize;
IntPtr ptrOutDataLen = Marshal.AllocHGlobal(sizeof(int));
bool tmp_flage = false;
while (flag)
{
dwStatus = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(cardCfgHwnd, ref StruRecord, dwInBuffSize, ref StruStatus, dwOutBuffSize, ptrOutDataLen);
switch (dwStatus)
{
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS://成功读取到数据,处理完本次数据后需调用next
ProcessSetFingerData(ref StruStatus, ref flag);
tmp_flage = flag;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT:
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FAILED" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.ErrorLog($"指纹设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
flag = false;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FINISH:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
default:
Log.ErrorLog($"指纹设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_UNKOWN" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
flag = false;
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
break;
}
}
Marshal.FreeHGlobal(ptrStrucond);
Marshal.FreeHGlobal(ptrOutDataLen);
return tmp_flage;
}
private void ProcessSetFingerData(ref CHCNetSDK.NET_DVR_FINGERPRINT_STATUS ststus, ref bool flag)
{
switch (ststus.byRecvStatus)
{
case 0:
//MessageBox.Show("SetFingegDataSuccessful", "Succeed", MessageBoxButtons.OK);
break;
default:
flag = false;
// MessageBox.Show("NET_SDK_SET_FINGER_DATA_FAILED" + ststus.byRecvStatus.ToString(), "ERROR", MessageBoxButtons.OK);
Log.ErrorLog($"指纹设置失败,错误代码:{ststus.byRecvStatus.ToString()}");
break;
}
}
private void ProcessSetFaceParamCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
if (pUserData == null)
{
return;
}
if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
{
uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "SetFaceParam Processing");
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Failed");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_SUCCESS)
{
isSended = true;
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "SetFaceParam Success");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Exception");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "Unknown Status");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
}
else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
{
var result = Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_FACE_PARAM_STATUS));
var struFaceParamStatus = (CHCNetSDK.NET_DVR_FACE_PARAM_STATUS)result;
if (struFaceParamStatus.byCardReaderRecvStatus[0] != 1)
{
isSended = false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Return Failed:byCardReaderRecvStatus " + struFaceParamStatus.byCardReaderRecvStatus[0]);
}
else
{
isSended = true;
}
}
}
private void ProcessGetFaceParamCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
if (pUserData == null)
{
return;
}
if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
{
uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "GetFaceParam Processing");
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
{
faceEvent.Set();
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_SUCCESS)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "GetFaceParam Success");
faceEvent.Set();
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "GetFaceParam Exception");
faceEvent.Set();
}
else
{
faceEvent.Set();
}
}
else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
{
var result = Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_FACE_PARAM_CFG));
var struFaceParamCfg = (CHCNetSDK.NET_DVR_FACE_PARAM_CFG)result;
if (struFaceParamCfg.byEnableCardReader[0] != 1)
{
}
if (struFaceParamCfg.dwFaceLen > 0)
{
var cardNo = Encoding.UTF8.GetString(struFaceParamCfg.byCardNo).Trim('\0');
var dir = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg";
if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); }
isExistFace = true;
using (FileStream fs = new FileStream($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg\\{cardNo}.jpg", FileMode.Create))
{
int len = (int)struFaceParamCfg.dwFaceLen;
byte[] by = new byte[len];
Marshal.Copy(struFaceParamCfg.pFaceBuffer, by, 0, len);
fs.Write(by, 0, len);
fs.Close();
}
}
faceEvent.Set();
}
return;
}
public bool DVRMessageCallBackV31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
//通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
//AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
switch (lCommand)
{
//门禁主机报警上传,人脸数据
case CHCNetSDK.COMM_ALARM_ACS:
//ProcessCommAlarm_AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
}
return true; //回调函数需要有返回,表示正常接收到数据
}
private void AcsAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
CHCNetSDK.NET_DVR_ACS_ALARM_INFO struAcsAlarm = new CHCNetSDK.NET_DVR_ACS_ALARM_INFO();
uint dwSize = (uint)Marshal.SizeOf(struAcsAlarm);
struAcsAlarm = (CHCNetSDK.NET_DVR_ACS_ALARM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ACS_ALARM_INFO));
//报警设备IP地址
string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');
//报警时间:年月日时分秒
string strTimeYear = (struAcsAlarm.struTime.dwYear).ToString();
string strTimeMonth = (struAcsAlarm.struTime.dwMonth).ToString("d2");
string strTimeDay = (struAcsAlarm.struTime.dwDay).ToString("d2");
string strTimeHour = (struAcsAlarm.struTime.dwHour).ToString("d2");
string strTimeMinute = (struAcsAlarm.struTime.dwMinute).ToString("d2");
string strTimeSecond = (struAcsAlarm.struTime.dwSecond).ToString("d2");
DateTime time = Convert.ToDateTime(strTimeYear + "-" + strTimeMonth + "-" + strTimeDay + " " + strTimeHour + ":" + strTimeMinute + ":" + strTimeSecond);
if (DateTime.Now.Subtract(time).TotalMinutes <= 5)
{
var cardNo = Encoding.UTF8.GetString(struAcsAlarm.struAcsEventInfo.byCardNo).TrimEnd('\0');
if (struAcsAlarm.dwMajor == 5 && (struAcsAlarm.dwMinor == 75 || struAcsAlarm.dwMinor == 38 || struAcsAlarm.dwMinor == 1))
{
var user_info = HttpHelper.GetPoliceInfo(cardNo);
if (user_info != null && !string.IsNullOrEmpty(user_info.policeId))
{
_form.SetLogs($"用户[{user_info.policeName}]已获取");
_form.userId = user_info.policeId;
if (MyCache.SysConfig.SpecialModel)
{
//上报缓存EPC
_form.ReaderHelperList.ForEach((readerHelper) =>
{
lock (readerHelper.Reader.CacheList)
{
readerHelper.UploadTagEpc(readerHelper.Reader.CacheList, readerHelper.Reader);
readerHelper.Reader.CacheList.Clear();
}
});
}
}
else
{
_form.SetLogs("用户数据不存在");
}
}
else if (struAcsAlarm.dwMajor == 3 && struAcsAlarm.dwMinor == 0x400) //MINOR_REMOTE_OPEN_DOOR 远程开门
{
_form.SetLogs($"远程开门成功");
}
else
{
_form.SetLogs("历史开门信息,已过滤");
}
}
}
public void HikLoginCallBack(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser)
{
string strLoginCallBack = "登录设备,lUserID:" + lUserID + ",dwResult:" + dwResult;
if (dwResult == 0)
{
uint iErrCode = CHCNetSDK.NET_DVR_GetLastError();
strLoginCallBack = strLoginCallBack + ",错误号:" + iErrCode;
Log.ErrorLog(strLoginCallBack);
}
}
public void DVRExceptionCB(uint dwType, int lUserID, int lHandle, IntPtr pUser)
{
Log.ErrorLog("门禁异常:0x" + Convert.ToString(dwType, 16) + ", lUserID:" + lUserID + ", lHandle:" + lHandle);
}
public bool RemoteOpenDoor(string userId, string name)
{
_form.userId = userId;
_form.SetLogs($"尝试远程开门,通道用户:{name}");
return CHCNetSDK.NET_DVR_ControlGateway(hikHwnd, -1, 1);
}
#region 获取卡号信息
private int cardInfoSearchHandle = -1;
private int searchCardPosition = 0;
private List<CCardInfoContent> searchCardDataList = new List<CCardInfoContent>();
/// <summary>
/// 获取卡号信息准备工作
/// </summary>
public void SyncCard()
{
if (cardInfoSearchHandle != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardInfoSearchHandle))
{
cardInfoSearchHandle = -1;
}
}
searchCardPosition = 0;
g_fCardInfoSearchCallback = new CHCNetSDK.RemoteConfigCallback(ProcessCardInfoSearchCallback);
string sURL = "POST /ISAPI/AccessControl/CardInfo/Search?format=json";
IntPtr ptrURL = Marshal.StringToHGlobalAnsi(sURL);
cardInfoSearchHandle = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_JSON_CONFIG, ptrURL, sURL.Length, g_fCardInfoSearchCallback, IntPtr.Zero);
Marshal.FreeHGlobal(ptrURL);
if (cardInfoSearchHandle == -1)
{
_form.SetLogs("SyncCard失败");
}
else
{
SearchCardInfo();
}
}
/// <summary>
/// 拉取数据
/// </summary>
/// <returns></returns>
private bool SearchCardInfo()
{
CCardInfoSearchCond JsonCardInfoSearchCond = new CCardInfoSearchCond();
JsonCardInfoSearchCond.CardInfoSearchCond = new CCardInfoSearchCondContent();
JsonCardInfoSearchCond.CardInfoSearchCond.EmployeeNoList = new List<CEmployeeNoList>();
JsonCardInfoSearchCond.CardInfoSearchCond.CardNoList = new List<CCardNoList>();
JsonCardInfoSearchCond.CardInfoSearchCond.searchID = "1";
JsonCardInfoSearchCond.CardInfoSearchCond.searchResultPosition = searchCardPosition;
JsonCardInfoSearchCond.CardInfoSearchCond.maxResults = 30;
string strCardInfoSearchCond = JsonConvert.SerializeObject(JsonCardInfoSearchCond);
IntPtr ptrCardInfoSearchCond = Marshal.StringToHGlobalAnsi(strCardInfoSearchCond);
var res = CHCNetSDK.NET_DVR_SendRemoteConfig(cardInfoSearchHandle,
(int)CHCNetSDK.LONG_CFG_SEND_DATA_TYPE_ENUM.ENUM_SEND_JSON_DATA, ptrCardInfoSearchCond,
(uint)strCardInfoSearchCond.Length);
Marshal.FreeHGlobal(ptrCardInfoSearchCond);
if (!res)
{
//_form.SetLogs("SearchCardInfo失败");
Log.ErrorLog("SearchCardInfo失败");
return false;
}
return true;
}
private void ProcessingCardData()
{
//关闭长连接
if (-1 != cardInfoSearchHandle)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardInfoSearchHandle))
{
cardInfoSearchHandle = -1;
}
}
if (searchCardDataList.Count == 0)
{
return;
}
var updateData = new List<Tuple<string, string>>();
foreach (var police in MyCache.PoliceList)
{
var policeCodeCard = searchCardDataList.FirstOrDefault(x => x.cardNo == police.policeCode);
if (policeCodeCard != null)
{
//匹配警号卡号,查询是否还有多余当前employeeNo的卡号
var cardNo = searchCardDataList.FirstOrDefault(x => x.employeeNo == policeCodeCard.employeeNo && x.cardNo != policeCodeCard.cardNo);
if (cardNo != null)
{
//只取第一个满足条件的卡号
if (cardNo.cardNo != police.cardNo)
{
updateData.Add(new Tuple<string, string>(police.policeCode, cardNo.cardNo));
}
}
}
}
if (updateData.Count > 0)
{
//更新数据
HttpHelper.UpdatePoliceCard(updateData);
}
}
/// <summary>
/// 数据回调
/// </summary>
/// <param name="dwType"></param>
/// <param name="lpBuffer"></param>
/// <param name="dwBufLen"></param>
/// <param name="pUserData"></param>
private void ProcessCardInfoSearchCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
{
uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
{
//_form.SetLogs("NET_SDK_CALLBACK_STATUS_FAILED");
//可以结束了,异常结束
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
{
//_form.SetLogs("NET_SDK_CALLBACK_STATUS_EXCEPTION");
//可以结束了,异常结束
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
{
;
}
else
{
//_form.SetLogs("NET_SDK_CALLBACK_OTHER_ERROR");
//可以结束了,异常结束
}
}
else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
{
//输出上一包解析信息, 1006
string strCardInfoSearch = Marshal.PtrToStringAnsi(lpBuffer);
Debug.WriteLine(strCardInfoSearch);
var m_JsonCardInfoSearch = JsonConvert.DeserializeObject<CCardInfoSearch>(strCardInfoSearch);
if (m_JsonCardInfoSearch.CardInfoSearch == null)
{
//此处说明返回了Response报文了
//_form.SetLogs("NET_SDK_CALLBACK_OTHER_ERROR");
return;
}
if (m_JsonCardInfoSearch.CardInfoSearch.responseStatusStrg == "NO MATCH")
{
//无数据,结束
return;
}
//提取数据
searchCardDataList.AddRange(m_JsonCardInfoSearch.CardInfoSearch.CardInfo);
searchCardPosition = searchCardDataList.Count;
if (m_JsonCardInfoSearch.CardInfoSearch.responseStatusStrg == "MORE")
{
//继续
Task.Run(SearchCardInfo);
return;
}
if (m_JsonCardInfoSearch.CardInfoSearch.responseStatusStrg == "OK")
{
//结束,处理数据
Task.Run(ProcessingCardData);
return;
}
}
}
public class CCardInfoSearch
{
public CCardInfoSearchContent CardInfoSearch { get; set; }
}
public class CCardInfoSearchContent
{
public string searchID { get; set; }
public string responseStatusStrg { get; set; }
public int numOfMatches { get; set; }
public int totalMatches { get; set; }
public List<CCardInfoContent> CardInfo { get; set; }
}
public class CCardInfoContent
{
public string employeeNo { get; set; }
public string cardNo { get; set; }
public Boolean deleteCard { get; set; }
public string cardType { get; set; }
public string leaderCard { get; set; }
[DefaultValue(null)]
public Boolean checkCardNo { get; set; }
[DefaultValue(null)]
public Boolean checkEmployeeNo { get; set; }
}
public class CCardInfoSearchCond
{
public CCardInfoSearchCondContent CardInfoSearchCond { get; set; }
}
public class CCardInfoSearchCondContent
{
public string searchID { get; set; }
public int searchResultPosition { get; set; }
public int maxResults { get; set; }
public List<CEmployeeNoList> EmployeeNoList { get; set; }
public List<CCardNoList> CardNoList { get; set; }
}
public class CEmployeeNoList
{
public string employeeNo { get; set; }
}
public class CCardNoList
{
public string cardNo { get; set; }
}
#endregion
}
}
using JmpCommon;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using MQTTnet.Protocol;
using System;
using System.Text;
using System.Threading;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// MQTT操作
/// </summary>
public class MQTTHelper
{
private readonly FrmMgr _form;
private readonly CancellationTokenSource _cTol;
private bool ReconnectFlag = false;
public MQTTHelper(FrmMgr form, CancellationTokenSource cTol)
{
_form = form;
_cTol = cTol;
}
public MqttClient MqttClient;
public async void InitialMQTT()
{
try
{
var mqttFactory = new MqttFactory();
var options = new MqttClientOptions
{
ClientId = _form._unique,
ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311,
ChannelOptions = new MqttClientTcpOptions
{
Server = MyCache.SysConfig.MQTTAddress,
Port = MyCache.SysConfig.MQTTPort
},
WillDelayInterval = 10,
WillMessage = new MqttApplicationMessage()
{
Topic = "Lost",
Payload = Encoding.UTF8.GetBytes("通道程序连接丢失"),
QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce
},
Credentials = new MqttClientCredentials
{
Username = MyCache.SysConfig.MQTTUserName,
Password = Encoding.UTF8.GetBytes(MyCache.SysConfig.MQTTPassword)
},
CleanSession = true,
KeepAlivePeriod = TimeSpan.FromSeconds(5),
};
MqttClient = mqttFactory.CreateMqttClient() as MqttClient;
MqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnMqttClientConnected);
MqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnMqttClientDisConnected);
MqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived);
var res = await MqttClient.ConnectAsync(options, _cTol.Token);
if (res.ResultCode == MqttClientConnectResultCode.Success)
{
//订阅通道code
await MqttClient.SubscribeAsync(_form._unique);
Console.WriteLine("MQTT启动成功");
Log.WorkLog("MQTT启动成功");
}
else
{
Log.ErrorLog("MQTT启动失败");
}
}
catch (Exception ex)
{
//MqttClient?.Dispose();
Log.ErrorLog("MQTT启动失败:" + ex.ToString());
}
}
public async void PushData(string topic, string message)
{
if (MqttClient.IsConnected)
{
await MqttClient.PublishAsync(new MqttApplicationMessage()
{
Topic = topic,
Payload = Encoding.UTF8.GetBytes(message),
QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,
Retain = false
});
}
}
private void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs obj)
{
//接收消息处理
var message = Encoding.UTF8.GetString(obj.ApplicationMessage.Payload);
if (message.Length > 2 && message.Substring(0, 2) == "/C") //控制消息
{
var data = message.Split('|');
if (data.Length == 3)
{
switch (data[1])
{
case "RemoteOpen":
{
var jObj = JObject.Parse(data[2]);
var userId = jObj["userId"]?.Value<string>();
var name = jObj["name"]?.Value<string>();
var token = jObj["token"]?.Value<string>();
if (_form.HikFaceHelperList[0].RemoteOpenDoor(userId, name))
{
//发送成功消息
PushData(_form._unique, $"/C|Response|{{\"token\":\"{token}\",\"code\":\"10000\",\"msg\":\"OK\"}}");
}
else
{
PushData(_form._unique, $"/C|Response|{{\"token\":\"{token}\",\"code\":\"19999\",\"msg\":\"开门失败\"}}");
}
break;
}
case "RemoteOpenShelfLight":
{
var jObj = JObject.Parse(data[2]);
var shelfUrl = jObj["shelfUrl"]?.Value<string>();
var token = jObj["token"]?.Value<string>();
_form.SerialPortHelper.PushData(shelfUrl, "30", "", false);
//发送成功消息
PushData(_form._unique, $"/C|Response|{{\"token\":\"{token}\",\"code\":\"10000\",\"msg\":\"OK\"}}");
break;
}
default:
{
//未知类型
break;
}
}
}
}
}
private async void OnMqttClientDisConnected(MqttClientDisconnectedEventArgs obj)
{
//重连
if (ReconnectFlag)
{
return;
}
while (!MqttClient.IsConnected)
{
ReconnectFlag = true;
Thread.Sleep(10000);
try
{
var res = await MqttClient.ReconnectAsync(_cTol.Token);
if (res.ResultCode == MqttClientConnectResultCode.Success)
{
//订阅通道code
await MqttClient.SubscribeAsync(_form._unique);
ReconnectFlag = false;
}
}
catch (Exception e)
{
Log.ErrorLog("MQTT重连失败:" + e.ToString());
}
}
}
private void OnMqttClientConnected(MqttClientConnectedEventArgs obj)
{
Log.WorkLog("MQTT启动成功");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
public class RFIDReaderSettings
{
public RFIDReaderSettings()
{
Antennas = new AntennasSettingGroups();
}
/// <summary>
/// 天线设置
/// </summary>
public AntennasSettingGroups Antennas { get; set; }
/// <summary>
/// 读写器类型
/// 英频杰:0
/// 索立得:1
/// </summary>
public int Type { get; set; }
/// <summary>
/// 读写器名(不能重复,涉及到配置文件命名)
/// </summary>
public string Name { get; set; }
/// <summary>
/// 读写器地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 读写器端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 读写时间(毫秒)
/// </summary>
public int ReaderTime { get; set; }
/// <summary>
/// gpio地址
/// </summary>
public string GpioAddr { get; set; }
/// <summary>
/// gpio端口
/// </summary>
public int GpioPort { get; set; }
/// <summary>
/// 是否出入库分离
/// </summary>
public bool IsCameraSeparate { get; set; }
/// <summary>
/// 是否抓拍(出库)
/// </summary>
public bool IsUseSnapshot { get; set; }
/// <summary>
/// 视频厂商(出库)
/// 大华:0
/// 海康:1
/// </summary>
public int CamType { get; set; }
/// <summary>
/// 视频地址(出库)
/// </summary>
public string CamAddress { get; set; }
/// <summary>
/// 视频端口(出库)
/// </summary>
public int CamPort { get; set; }
/// <summary>
/// 视频用户(出库)
/// </summary>
public string CamUser { get; set; }
/// <summary>
/// 视频密码(出库)
/// </summary>
public string CamPwd { get; set; }
/// <summary>
/// 视频通道(出库)
/// </summary>
public int CamChannel { get; set; }
/// <summary>
/// 是否抓拍(入库)
/// </summary>
public bool IsUseSnapshot2 { get; set; }
/// <summary>
/// 视频厂商(入库)
/// 大华:0
/// 海康:1
/// </summary>
public int CamType2 { get; set; }
/// <summary>
/// 视频地址(入库)
/// </summary>
public string CamAddress2 { get; set; }
/// <summary>
/// 视频端口(入库)
/// </summary>
public int CamPort2 { get; set; }
/// <summary>
/// 视频用户(入库)
/// </summary>
public string CamUser2 { get; set; }
/// <summary>
/// 视频密码(入库)
/// </summary>
public string CamPwd2 { get; set; }
/// <summary>
/// 视频通道(入库)
/// </summary>
public int CamChannel2 { get; set; }
}
public class AntennasSettingGroups
{
public AntennasSettingGroups(int antennaCount = 4)
{
AntennaConfigs = new AntennaConfig[antennaCount];
}
/// <summary>
/// 天线总数
/// </summary>
public int Length => AntennaConfigs.Length;
/// <summary>
/// 天线设置
/// </summary>
public AntennaConfig[] AntennaConfigs { get; set; }
}
public class AntennaConfig
{
/// <summary>
/// 是否开启
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 天线功率
/// </summary>
public double TxPower { get; set; }
/// <summary>
/// 是否使用最大天线功率
/// </summary>
public bool IsUseMaxTxPower { get; set; }
/// <summary>
/// 接收灵敏度
/// </summary>
public double RxSensitivity { get; set; }
/// <summary>
/// 是否使用最大接收灵敏度
/// </summary>
public bool IsUseMaxRxSensitivity { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
public class ShelfMessageStatus
{
public ShelfMessageStatus()
{
}
public bool IsSuccess { get; set; }
public string Message { get; set; }
public string Address { get; set; }
public bool IsNeedPushInventory { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
public class TagReportData
{
public TagReportData()
{
Tags = new List<TagData>();
}
public List<TagData> Tags { get; set; }
}
public class TagData
{
public string Epc { get; set; }
/// <summary>
/// The reader antenna port number for the antenna that last saw the tag;
/// requires this option to be enabled in the reader settings report configuration.
/// </summary>
public int AntennaPortNumber { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Impinj.OctaneSdk;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JmpServiceMgr.Properties;
using JunmpDALib;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// RFIDReader操作
/// </summary>
public class RFIDReaderHelper
{
private readonly ReaderConfig _config;
private readonly FrmMgr _form;
private readonly CancellationTokenSource _cTol;
public RFIDReaderHelper(ReaderConfig config, FrmMgr form, CancellationTokenSource cTol)
{
_config = config;
_form = form;
_cTol = cTol;
}
public IRFIDReader Reader;
public DalHelper DalHelper;
public CameraHelper CamHelper;
public CameraHelper CamHelper2;
//private bool _isInventory = false;
private AutoResetEvent readerEvent = new AutoResetEvent(false);
public void InitialReader()
{
try
{
switch (_config.type)
{
case 0:
{
Reader = new ImpinjRFIDReader();
break;
}
case 1:
{
Reader = new Solid401RFIDReader();
break;
}
case 2:
{
Reader = new Solid401XRFIDReader();
break;
}
}
Reader.ConnectionLost += OnReaderConnectionLost;
Reader.TagsReported += OnReaderTagsReported;
Reader.ReaderStarted += OnReaderStarted;
Reader.ReaderStopped += OnReaderStopped;
Reader.GpiChanged += OnGpiChanged;
Reader.Connect(_config.address + ":" + _config.port);
if (Reader.IsConnected)
{
var rfidReaderSettings = Reader.LoadSettings(_config);
Reader.ApplySettings(rfidReaderSettings);
new Task(() => PollingReader(Reader, _cTol.Token)).Start();
}
else
{
throw new Exception($"读写器{_config.name}初次启动失败");
}
//启动读写器对应摄像头
CamHelper = new CameraHelper(Reader, _form, _cTol);
CamHelper.Init();
//启动读写器对应gpio
DalHelper = new DalHelper(Reader, CamHelper, _form, _cTol);
DalHelper.InitialGpio();
}
catch (Exception ex)
{
Reader.Disconnect();
_form.SetLogs($"读写器{_config.name}初次启动失败,请重新启动程序");
XfVioceMsc.Text2Voice("读写器启动失败");
Log.ErrorLog(ex.ToString());
}
}
private void OnGpiChanged(IRFIDReader rfidReader, object e)
{
var gpiEvent = e as GpiEvent ?? new GpiEvent();
if (gpiEvent.State && (string.IsNullOrEmpty(rfidReader.GpiTrigger.Gpi1Str) || string.IsNullOrEmpty(rfidReader.GpiTrigger.Gpi2Str)))
{
rfidReader.GpiTrigger.LastTime = DateTime.Now;
switch (gpiEvent.PortNumber)
{
case 1:
//光电2已触发
if (!string.IsNullOrEmpty(rfidReader.GpiTrigger.Gpi2Str))
{
rfidReader.GpiTrigger.Gpi1Str = "2";
}
else
{
rfidReader.GpiTrigger.Gpi1Str = "1";
}
break;
case 2:
//光电1已触发
if (!string.IsNullOrEmpty(rfidReader.GpiTrigger.Gpi1Str))
{
rfidReader.GpiTrigger.Gpi2Str = "2";
}
else
{
rfidReader.GpiTrigger.Gpi2Str = "1";
}
break;
default: break;
}
}
}
private int GetStatusStr(IRFIDReader reader)
{
int status = -1;
switch (reader.GpiTrigger.StatusStr)
{
case "12":
status = 1;
break;
case "21":
status = 0;
break;
default:
status = -1;
break;
}
return status;
}
private void OnReaderStopped(IRFIDReader rfidReader, object e)
{
try
{
rfidReader.IsInventory = false;
_form.SetLogs("停止盘点,整理数据");
if (MyCache.SysConfig.SpecialModel && string.IsNullOrEmpty(_form.userId))
{
lock (rfidReader.CacheList)
{
rfidReader.EpcList.ForEach(s =>
{
if (!rfidReader.CacheList.Contains(s))
{
rfidReader.CacheList.Add(s);
}
});
}
}
//else if (string.IsNullOrEmpty(_form.userId))
//{
// CamHelper.SnapClear();
// rfidReader.GpiTrigger.SetEmpty();
// _form.SetLogs("未找到用户信息,停止上报");
// return;
//}
else
{
lock (rfidReader.EpcList)
{
UploadTagEpc(rfidReader.EpcList, rfidReader);
}
}
}
catch (Exception ex)
{
CamHelper.SnapClear();
rfidReader.GpiTrigger.SetEmpty();
Log.ErrorLog(ex.ToString());
}
}
private void OnReaderStarted(IRFIDReader rfidReader, object e)
{
lock (rfidReader.syncEpc)
{
rfidReader.EpcList.Clear();
}
}
private void OnReaderTagsReported(IRFIDReader rfidReader, TagReportData report)
{
report?.Tags.ForEach(x =>
{
var epc = x.Epc;
lock (rfidReader.syncEpc)
{
if (!rfidReader.EpcList.Contains(epc) && epc.Length >= 64)
{
rfidReader.EpcList.Add(x.Epc);
}
else if (epc.Length == 24 && epc.Substring(0, 4) == "5842")
{
//旧版箱标
rfidReader.EpcList.Add(x.Epc);
}
}
});
}
private void OnReaderConnectionLost(IRFIDReader rfidReader)
{
rfidReader.IsLost = true;
_form.SetLogs("读写器断开连接");
XfVioceMsc.Text2Voice("读写器断开连接");
}
/// <summary>
/// 上报EPC
/// </summary>
public void UploadTagEpc(List<string> scanedList, IRFIDReader reader)
{
try
{
var request = new request_head()
{
currentState = -1,
orgId = MyCache.ChannelCfg.orgId,
warehouseId = MyCache.ChannelCfg.warehouseId,
RFIDList = new List<EpcInfo>(),
policeId = _form.userId
};
//整理上报数据
List<string> tmpList = new List<string>(scanedList);
//获取出入库状态
var _state = GetStatusStr(reader);
if (_state == -1)
{
_form.SetLogs($"无效的出入库状态,{reader.GpiTrigger.StatusStr}");
reader.GpiTrigger.SetEmpty();
}
else
{
var pushResultList = new List<request_epc>();
if (tmpList.Count == 0)
{
_form.SetLogs("未读取到EPC");
CamHelper.SnapClear();
reader.GpiTrigger.SetEmpty();
}
else
{
//过滤再过滤时间内的EPC
tmpList.ForEach(x =>
{
var info = LiteDBHelper.FindByEpc(x, MyCache.ChannelCfg.warehouseId);
if (info == null)
{
request.RFIDList.Add(new EpcInfo() { RFID = x });
}
else if (DateTime.Now.Subtract(info.LastDate).TotalSeconds >= MyCache.ChannelCfg.filterTime)
{
request.RFIDList.Add(new EpcInfo() { RFID = x });
}
else { }
});
//过滤状态一致的EPC
for (int i = request.RFIDList.Count - 1; i >= 0; i--)
{
var _epc = request.RFIDList[i];
var info = LiteDBHelper.FindByEpc(_epc.RFID, MyCache.ChannelCfg.warehouseId, _state);
if (info != null && info.LastDate > DateTime.Now.AddMinutes(-30)) //只拦截30分钟内数据
{
request.RFIDList.Remove(_epc);
}
}
var pushRecordEpcList = request.RFIDList.ToList();
//剔除不受通道读取的物资(仅针对件标)
if (string.IsNullOrEmpty(MyCache.ChannelCfg.channelReadEquTypeJson))
{
//无配置,忽略
}
else
{
var channelReadEquTypeList =
JsonConvert.DeserializeObject<List<ChannelReadEquType>>(MyCache.ChannelCfg
.channelReadEquTypeJson);
var removeEpcList = new List<string>();
foreach (var epcInfo in request.RFIDList)
{
if (epcInfo.RFID.Length == 24)
{
//旧版箱标
continue;
}
var buffer = EpcConvert.ToHexByte(epcInfo.RFID);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info.TagType == 0x00 && !channelReadEquTypeList.Exists(x => x.code == epc_info.Wzdm.ToString("X")))
{
//过滤件标
removeEpcList.Add(epcInfo.RFID);
}
}
request.RFIDList.RemoveAll(x => removeEpcList.Contains(x.RFID));
}
#region 箱标
//检查epc是否存在箱标
var boxMarkEpcList = new List<string>();
foreach (var epcInfo in request.RFIDList)
{
if (epcInfo.RFID.Length == 24)
{
//旧版箱标
boxMarkEpcList.Add(epcInfo.RFID);
continue;
}
var buffer = EpcConvert.ToHexByte(epcInfo.RFID);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info.TagType == 0x01)
{
boxMarkEpcList.Add(epcInfo.RFID);
}
}
//移除箱标
request.RFIDList.RemoveAll(x => boxMarkEpcList.Contains(x.RFID));
if (boxMarkEpcList.Count > 0)
{
List<response_BoxMarkModel> xbData;
if (_state == 1)
{
//入库
//箱标获取件标信息
xbData = HttpHelper.GetEpcListByBoxMarkEpc(boxMarkEpcList);
if (xbData == null || xbData.Count == 0)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("箱标转换失败,停止上报");
XfVioceMsc.Text2Voice("箱标转换失败");
return;
}
}
else
{
//出库
//拉取单据
var orderInfo = HttpHelper.GetOpenOrderInfo();
if (orderInfo == null)
{
//无单据,停止上报
reader.GpiTrigger.SetEmpty();
_form.SetLogs("无可供箱标出库的单据,停止上报");
XfVioceMsc.Text2Voice("无可供箱标出库的单据");
return;
}
//箱标获取件标信息
xbData = HttpHelper.GetEpcListByBoxMarkEpc(boxMarkEpcList);
if (xbData == null || xbData.Count == 0)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("箱标转换失败,停止上报");
XfVioceMsc.Text2Voice("箱标转换失败");
return;
}
//判断箱标与单据的物资匹配
foreach (var boxMarkModel in xbData)
{
var realityDetail = orderInfo.realityDetailList
.FirstOrDefault(x => x.equipmentDetailId == boxMarkModel.equipmentDetailId);
if (realityDetail == null)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("物资不在单据内,停止上报 错误物资名:" + boxMarkModel.equipmentDetailName);
XfVioceMsc.Text2Voice("物资不在单据内,停止上报 错误物资名:" + boxMarkModel.equipmentDetailName);
return;
}
if (realityDetail.realCount + boxMarkModel.oneBoxNum > realityDetail.quantity)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("物资已超量,停止上报 错误物资名:" + boxMarkModel.equipmentDetailName);
XfVioceMsc.Text2Voice("物资已超量,停止上报 错误物资名:" + boxMarkModel.equipmentDetailName);
return;
}
realityDetail.realCount += boxMarkModel.oneBoxNum;
}
//判断件标与单据的物资匹配
foreach (var epcInfo in request.RFIDList)
{
var buffer = EpcConvert.ToHexByte(epcInfo.RFID);
var epc_info = EpcConvert.EpcAnlysing(buffer);
var realityDetail = orderInfo.realityDetailList
.FirstOrDefault(x => x.equipmentDetailCode == epc_info.Wzdm.ToString("X"));
if (realityDetail == null)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("物资不在单据内,停止上报 错误物资名:" + MyCache.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"))?.name);
XfVioceMsc.Text2Voice("物资不在单据内,停止上报 错误物资名:" + MyCache.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"))?.name);
return;
}
if (realityDetail.realCount + 1 > realityDetail.quantity)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("物资已超量,停止上报 错误物资名:" + realityDetail.equipmentDetailName);
XfVioceMsc.Text2Voice("物资已超量,停止上报 错误物资名:" + realityDetail.equipmentDetailName);
return;
}
realityDetail.realCount++;
}
}
//成功,统统转换成件标准备上传
List<string> xbEpcList = new List<string>();
foreach (var model in xbData)
{
xbEpcList.AddRange(model.epcList);
}
xbEpcList.AddRange(request.RFIDList.Select(x => x.RFID));
request.RFIDList = xbEpcList.Distinct().Select(x => new EpcInfo
{
RFID = x
}).ToList();
}
#endregion
#region 装备包
//检查epc是否存在装备包
var bagEpcList = new List<string>();
foreach (var epcInfo in request.RFIDList)
{
var buffer = EpcConvert.ToHexByte(epcInfo.RFID);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info.TagType == 0x02)
{
bagEpcList.Add(epcInfo.RFID);
}
}
//移除装备包
request.RFIDList.RemoveAll(x => bagEpcList.Contains(x.RFID));
if (bagEpcList.Count > 0)
{
//装备包获取件标信息
var bagData = HttpHelper.GetEpcListByBagInvEpc(bagEpcList);
if (bagData == null || bagData.Count == 0)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("装备包转换失败,停止上报");
XfVioceMsc.Text2Voice("装备包转换失败");
return;
}
//成功,移除所有装备包包含的物资epc
List<string> bagDataEpcList = new List<string>();
foreach (var model in bagData)
{
bagDataEpcList.AddRange(model.epcList);
}
request.RFIDList = request.RFIDList.Where(x => !bagDataEpcList.Contains(x.RFID)).ToList();
request.BagRFIDList = bagData.Select(x => new EpcInfo()
{
RFID = x.epc
}).ToList();
//监控数据只剔除装备包内部物资
pushRecordEpcList = pushRecordEpcList.Where(x => !bagDataEpcList.Contains(x.RFID)).ToList();
}
#endregion
//准备上报到服务器
if (request.RFIDList.Count == 0 && request.BagRFIDList.Count == 0)
{
reader.GpiTrigger.SetEmpty();
_form.SetLogs("物资已被过滤,停止上报");
}
else
{
//抓拍文件路径
var id = MyCache.ChannelCfg.warehouseId.Replace("-", "");
var url = string.Empty;
if (!string.IsNullOrEmpty(CamHelper._snap_fileName))//|| _form.hikHwnd >= 0
{
url = $"{ConstStr.UPLOAD_PATH}{id}/{CamHelper._snap_directoy}/{CamHelper._snap_fileName}";
}
request.currentState = _state;
CamHelper.onUploadPic?.BeginInvoke(default, default);
request.picUrl = url;
//提交数据
var res = HttpHelper.ApplyWzList(request);
pushResultList = res.Item2;
if (res.Item1)
{
//上报监控数据
request.BagRFIDList.Clear();
request.RFIDList = pushRecordEpcList;
HttpHelper.ApplyMonitorEpcList(request);
res.Item2?.ForEach(s =>
{
var tmp_state = -1;
switch (s.currentState)
{
//入库
case 0:
tmp_state = 1;
break;
//异常
case 6:
case 9:
case 10:
case 11:
tmp_state = -1;
break;
//出库
default:
tmp_state = 0;
break;
}
var info = LiteDBHelper.FindByEpc(s.epc, MyCache.ChannelCfg.warehouseId);
if (info == null)
{
info = new TagCacheInfo()
{
CurrentState = tmp_state,
Epc = s.epc,
WarehouseId = MyCache.ChannelCfg.warehouseId,
LastDate = DateTime.Now
};
}
else
{
info.CurrentState = tmp_state;
info.LastDate = DateTime.Now;
}
LiteDBHelper.AddOrUpdate(info);
});
}
_form.SetLogs(res?.Item3);
reader.GpiTrigger.SetEmpty();
CamHelper.SnapClear();
}
}
//入库 推送单据信息给显示屏
if (_state == 1 && MyCache.SysConfig.IsPushShelfPrint)
{
Task.Run(() =>
{
_form.SerialPortHelper.CreateOrderPushData(pushResultList);
});
}
}
}
catch (Exception ex)
{
_form.SetLogs("数据上报失败");
reader.GpiTrigger.SetEmpty();
CamHelper.SnapClear();
Log.ErrorLog(ex.ToString());
}
}
private void PollingReader(IRFIDReader reader, CancellationToken cTol)
{
while (!cTol.IsCancellationRequested)
{
try
{
if (reader.IsLost)
{
reader.Disconnect();
reader.Connect(reader.RFIDReaderSettings.Address + ":" + reader.RFIDReaderSettings.Port);
if (reader.IsConnected)
{
reader.IsLost = false;
}
}
if (readerEvent.WaitOne(5000)) { break; }
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
Thread.Sleep(5000);
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JunmpDALib;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
public interface IRFIDReader
{
delegate void ConnectionLostHandler(IRFIDReader reader);
delegate void TagsReportedHandler(IRFIDReader reader, TagReportData report);
delegate void ReaderStartedEventHandler(IRFIDReader reader, object e);
delegate void ReaderStoppedEventHandler(IRFIDReader reader, object e);
delegate void GpiChangedHandler(IRFIDReader reader, object e);
abstract event ConnectionLostHandler ConnectionLost;
abstract event TagsReportedHandler TagsReported;
abstract event ReaderStartedEventHandler ReaderStarted;
abstract event ReaderStoppedEventHandler ReaderStopped;
abstract event GpiChangedHandler GpiChanged;
/// <summary>
/// GPIO
/// </summary>
DAL Dal { get; set; }
BaseCamera SnapCmaIn { get; set; }
BaseCamera SnapCmaOut { get; set; }
bool IsConnected { get; }
bool IsLost { get; set; }
bool IsInventory { get; set; }
RFIDReaderSettings RFIDReaderSettings { get; set; }
object syncEpc { get; }
List<string> EpcList { get; set; }
List<string> CacheList { get; set; }
GpiTrigger GpiTrigger { get; }
RFIDReaderSettings LoadSettings(ReaderConfig readerConfig);
bool ApplySettings(RFIDReaderSettings settings);
void Connect(string address);
void Disconnect();
void InventoryStart();
void InventoryStop();
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Impinj.OctaneSdk;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JmpServiceMgr.Properties;
using JunmpDALib;
using Newtonsoft.Json.Linq;
namespace JmpServiceMgr.Helper
{
public class ImpinjRFIDReader : IRFIDReader
{
public event IRFIDReader.ConnectionLostHandler ConnectionLost;
public event IRFIDReader.TagsReportedHandler TagsReported;
public event IRFIDReader.ReaderStartedEventHandler ReaderStarted;
public event IRFIDReader.ReaderStoppedEventHandler ReaderStopped;
public event IRFIDReader.GpiChangedHandler GpiChanged;
private readonly ImpinjReader Reader;
private Impinj.OctaneSdk.Settings ImpinjSettings;
public ImpinjRFIDReader()
{
Reader = new ImpinjReader();
Reader.ConnectionLost += Reader_ConnectionLost;
Reader.TagsReported += Reader_TagsReported;
Reader.ReaderStarted += Reader_ReaderStarted;
Reader.ReaderStopped += Reader_ReaderStopped;
Reader.GpiChanged += Reader_GpiChanged;
syncEpc = new object();
GpiTrigger = new GpiTrigger();
EpcList = new List<string>();
CacheList = new List<string>();
}
~ImpinjRFIDReader()
{
Reader.ConnectionLost -= Reader_ConnectionLost;
Reader.TagsReported -= Reader_TagsReported;
Reader.ReaderStarted -= Reader_ReaderStarted;
Reader.ReaderStopped -= Reader_ReaderStopped;
Reader.GpiChanged -= Reader_GpiChanged;
}
public DAL Dal { get; set; }
public BaseCamera SnapCmaIn { get; set; }
public BaseCamera SnapCmaOut { get; set; }
public RFIDReaderSettings RFIDReaderSettings { get; set; }
public object syncEpc { get; }
public List<string> EpcList { get; set; }
public List<string> CacheList { get; set; }
public GpiTrigger GpiTrigger { get; }
public bool IsConnected => Reader.IsConnected;
public bool IsLost { get; set; } = false;
public bool IsInventory { get; set; } = false;
private void Reader_GpiChanged(ImpinjReader reader, GpiEvent e)
{
GpiChanged?.Invoke(this, e);
}
private void Reader_ReaderStopped(ImpinjReader reader, ReaderStoppedEvent e)
{
ReaderStopped?.Invoke(this, e);
}
private void Reader_ReaderStarted(ImpinjReader reader, ReaderStartedEvent e)
{
ReaderStarted?.Invoke(this, e);
}
private void Reader_TagsReported(ImpinjReader reader, TagReport report)
{
var tagReportData = new TagReportData();
foreach (var tag in report.Tags)
{
tagReportData.Tags.Add(new TagData
{
Epc = tag.Epc.ToHexString(),
AntennaPortNumber = tag.AntennaPortNumber
});
}
TagsReported?.Invoke(this, tagReportData);
}
private void Reader_ConnectionLost(ImpinjReader reader)
{
ConnectionLost?.Invoke(this);
}
public RFIDReaderSettings LoadSettings(ReaderConfig readerConfig)
{
if (RFIDReaderSettings != null)
{
return RFIDReaderSettings;
}
if (IsConnected)
{
ImpinjSettings = Reader.QueryDefaultSettings();
}
else
{
//无法获取配置信息
ImpinjSettings = null;
return null;
}
if (File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Impinj_settings.xml"))
{
ImpinjSettings = Impinj.OctaneSdk.Settings.Load(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Impinj_settings.xml");
}
//如果有旧版配置,优先读取旧版配置
if (File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "settings.xml"))
{
ImpinjSettings = Impinj.OctaneSdk.Settings.Load(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "settings.xml");
FileInfo fi = new FileInfo(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "settings.xml");
fi.MoveTo(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "settings_old.xml");
}
RFIDReaderSettings = new RFIDReaderSettings
{
Name = readerConfig.name,
Address = readerConfig.address,
Port = readerConfig.port,
ReaderTime = readerConfig.readerTime,
Type = readerConfig.type,
Antennas = new AntennasSettingGroups(ImpinjSettings.Antennas.Length),
GpioAddr = readerConfig.gpioAddr,
GpioPort = readerConfig.gpioPort,
IsCameraSeparate = readerConfig.isCameraSeparate,
IsUseSnapshot = readerConfig.useSnapshot,
CamType = readerConfig.camType,
CamAddress = readerConfig.camAddress,
CamChannel = readerConfig.camChannel,
CamPort = readerConfig.camPort,
CamPwd = readerConfig.camPwd,
CamUser = readerConfig.camUser,
IsUseSnapshot2 = readerConfig.useSnapshot2,
CamType2 = readerConfig.camType2,
CamAddress2 = readerConfig.camAddress2,
CamChannel2 = readerConfig.camChannel2,
CamPort2 = readerConfig.camPort2,
CamPwd2 = readerConfig.camPwd2,
CamUser2 = readerConfig.camUser2,
};
for (var i = 0; i < ImpinjSettings.Antennas.AntennaConfigs.Count; i++)
{
var antennaConfig = ImpinjSettings.Antennas.AntennaConfigs[i];
RFIDReaderSettings.Antennas.AntennaConfigs[i] = new AntennaConfig
{
IsEnabled = antennaConfig.IsEnabled,
IsUseMaxRxSensitivity = antennaConfig.MaxRxSensitivity,
IsUseMaxTxPower = antennaConfig.MaxTxPower,
RxSensitivity = antennaConfig.RxSensitivityInDbm,
TxPower = antennaConfig.TxPowerInDbm
};
}
return RFIDReaderSettings;
}
public bool ApplySettings(RFIDReaderSettings settings)
{
RFIDReaderSettings = settings;
//更新ImpinjSettings
for (var i = 0; i < RFIDReaderSettings.Antennas.AntennaConfigs.Length; i++)
{
if (ImpinjSettings.Antennas.AntennaConfigs.Count < i + 1)
{
break;
}
var antennaConfig = RFIDReaderSettings.Antennas.AntennaConfigs[i];
ImpinjSettings.Antennas.AntennaConfigs[i].IsEnabled = antennaConfig.IsEnabled;
ImpinjSettings.Antennas.AntennaConfigs[i].MaxRxSensitivity = antennaConfig.IsUseMaxRxSensitivity;
ImpinjSettings.Antennas.AntennaConfigs[i].MaxTxPower = antennaConfig.IsUseMaxTxPower;
ImpinjSettings.Antennas.AntennaConfigs[i].RxSensitivityInDbm = -Math.Abs(antennaConfig.RxSensitivity);
ImpinjSettings.Antennas.AntennaConfigs[i].TxPowerInDbm = antennaConfig.TxPower;
}
#region 设置GPIO触发、设置延时停止(不知道有没有用)
//设置GPIO触发
ImpinjSettings.AutoStart.Mode = AutoStartMode.GpiTrigger;
ImpinjSettings.AutoStart.GpiPortNumber = 1;
ImpinjSettings.AutoStart.GpiLevel = true;
ImpinjSettings.Gpis.GetGpi(1).PortNumber = 1;
ImpinjSettings.Gpis.GetGpi(1).DebounceInMs = 50;
ImpinjSettings.Gpis.GetGpi(1).IsEnabled = true;
ImpinjSettings.Gpis.GetGpi(2).DebounceInMs = 50;
ImpinjSettings.Gpis.GetGpi(2).IsEnabled = true;
ImpinjSettings.Gpis.GetGpi(2).PortNumber = 2;
ImpinjSettings.Gpis.GetGpi(3).DebounceInMs = 50;
ImpinjSettings.Gpis.GetGpi(3).IsEnabled = false;
ImpinjSettings.Gpis.GetGpi(3).PortNumber = 3;
ImpinjSettings.Gpis.GetGpi(4).DebounceInMs = 50;
ImpinjSettings.Gpis.GetGpi(4).IsEnabled = false;
ImpinjSettings.Gpis.GetGpi(4).PortNumber = 4;
////设置延时停止
ImpinjSettings.AutoStop.Mode = AutoStopMode.Duration;
ImpinjSettings.AutoStop.DurationInMs = (uint)(settings?.ReaderTime ?? 3000);
//设置读写器模式 (DenseReaderM4)
ImpinjSettings.ReaderMode = ReaderMode.DenseReaderM4;
ImpinjSettings.RfMode = (uint)ReaderMode.DenseReaderM4;
#endregion
Reader.ApplySettings(ImpinjSettings);
ImpinjSettings.Save(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase +
RFIDReaderSettings.Name + "_Impinj_settings.xml");
return true;
}
public void Connect(string address)
{
if (address.Contains(":"))
{
var arr = address.Split(':');
Reader.Connect(arr[0], Convert.ToInt32(arr[1]));
}
else
{
Reader.Connect(address);
}
}
public void Disconnect()
{
IsInventory = false;
Reader.Disconnect();
}
public void InventoryStart()
{
Reader.Start();
}
public void InventoryStop()
{
Reader.Stop();
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JunmpDALib;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SReaderAPI;
namespace JmpServiceMgr.Helper
{
public class Solid401RFIDReader : IRFIDReader
{
public event IRFIDReader.ConnectionLostHandler ConnectionLost;
public event IRFIDReader.TagsReportedHandler TagsReported;
public event IRFIDReader.ReaderStartedEventHandler ReaderStarted;
public event IRFIDReader.ReaderStoppedEventHandler ReaderStopped;
public event IRFIDReader.GpiChangedHandler GpiChanged;
private SReader _reader;
public Solid401RFIDReader()
{
syncEpc = new object();
GpiTrigger = new GpiTrigger();
EpcList = new List<string>();
CacheList = new List<string>();
}
~Solid401RFIDReader()
{
_reader?.Dispose();
}
public DAL Dal { get; set; }
public BaseCamera SnapCmaIn { get; set; }
public BaseCamera SnapCmaOut { get; set; }
public bool IsInventory { get; set; }
public RFIDReaderSettings RFIDReaderSettings { get; set; }
public object syncEpc { get; }
public List<string> EpcList { get; set; }
public List<string> CacheList { get; set; }
public bool IsConnected => _isConnected;
public bool IsLost { get; set; } = false;
private bool _isConnected = false;
private void Reader_GpiChanged(SReader reader, object e)
{
GpiChanged?.Invoke(this, e);
}
//private void Reader_ReaderStopped(Reader reader, object e)
//{
// ReaderStopped?.Invoke(this, e);
//}
//private void Reader_ReaderStarted(Reader reader, object e)
//{
// ReaderStarted?.Invoke(this, e);
//}
private void Reader_TagsReported(object sender, TagReadDataEventArgs report)
{
var tagReportData = new TagReportData();
tagReportData.Tags.Add(new TagData
{
Epc = report.TagData.EpcString,
AntennaPortNumber = report.TagData.Ant
});
TagsReported?.Invoke(this, tagReportData);
}
private void Reader_ConnectionLost(SReader reader)
{
ConnectionLost?.Invoke(this);
}
public GpiTrigger GpiTrigger { get; }
public RFIDReaderSettings LoadSettings(ReaderConfig readerConfig)
{
if (RFIDReaderSettings != null)
{
return RFIDReaderSettings;
}
if (IsConnected)
{
}
else
{
//无法获取配置信息
return null;
}
//401无配置文件
//if (File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Solid_settings.xml"))
//{
// _reader.LoadConfig(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Solid_settings.xml");
//}
var antennaCount = _reader?.GetPortReadPower()?.Length ?? 4;
RFIDReaderSettings = new RFIDReaderSettings
{
Name = readerConfig.name,
Address = readerConfig.address,
Port = readerConfig.port,
ReaderTime = readerConfig.readerTime,
Type = readerConfig.type,
Antennas = new AntennasSettingGroups(antennaCount),
GpioAddr = readerConfig.gpioAddr,
GpioPort = readerConfig.gpioPort,
IsCameraSeparate = readerConfig.isCameraSeparate,
IsUseSnapshot = readerConfig.useSnapshot,
CamType = readerConfig.camType,
CamAddress = readerConfig.camAddress,
CamChannel = readerConfig.camChannel,
CamPort = readerConfig.camPort,
CamPwd = readerConfig.camPwd,
CamUser = readerConfig.camUser,
IsUseSnapshot2 = readerConfig.useSnapshot2,
CamType2 = readerConfig.camType2,
CamAddress2 = readerConfig.camAddress2,
CamChannel2 = readerConfig.camChannel2,
CamPort2 = readerConfig.camPort2,
CamPwd2 = readerConfig.camPwd2,
CamUser2 = readerConfig.camUser2,
};
var antennaPowerList = _reader?.GetPortReadPower();
var config = _reader?.GetReaderInfo();
for (var i = 0; i < antennaCount; i++)
{
RFIDReaderSettings.Antennas.AntennaConfigs[i] = new AntennaConfig
{
IsEnabled = (config?.Ant & Convert.ToInt32(Math.Pow(2, i))) != 0,
IsUseMaxRxSensitivity = false,
IsUseMaxTxPower = false,
RxSensitivity = 0, //索立得无灵敏度设置
TxPower = antennaPowerList?.Length > i ? antennaPowerList[i] : 0
};
}
return RFIDReaderSettings;
}
public bool ApplySettings(RFIDReaderSettings settings)
{
RFIDReaderSettings = settings;
var openAntennaList = new List<int>();
var powerList = new List<int>();
var antennaCount = _reader.GetPortReadPower()?.Length ?? 4;
//更新
for (var i = 0; i < RFIDReaderSettings.Antennas.AntennaConfigs.Length; i++)
{
if (antennaCount < i + 1)
{
break;
}
var config = RFIDReaderSettings.Antennas.AntennaConfigs[i];
if (config.IsEnabled)
{
openAntennaList.Add(i + 1);
}
powerList.Add(Convert.ToInt32(config.TxPower));
}
//天线自动识别,不进行强制设置
_reader.SetCheckAnt(1);
//_reader.SetAntenna(openAntennaList.ToArray());
_reader.SetPortReadPower(powerList.ToArray());
//频段 美国频段
_reader.SetRegion(SReader.Region.US);
//_reader.SetRegion(SReader.Region.Chinese2);
Thread.Sleep(500);
//401无配置文件
//_reader.SaveConfig(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase +
// RFIDReaderSettings.Name + "_Solid_settings.xml");
return true;
}
public void Connect(string address)
{
try
{
if (_reader != null)
{
_reader.ShutDown();
_reader = null;
}
_reader = SReader.Create("tcp://" + address.Remove(address.IndexOf(':')));
_reader.TagRead += Reader_TagsReported;
_reader.Connect();
if (!string.IsNullOrEmpty(_reader.getVersion()))
{
_isConnected = true;
}
}
catch (Exception e)
{
Log.ErrorLog(e.Message + "|" + e.StackTrace);
_isConnected = false;
}
}
public void Disconnect()
{
_reader.TagRead -= Reader_TagsReported;
IsInventory = false;
_reader.ShutDown();
_isConnected = false;
}
public void InventoryStart()
{
try
{
int q = 4;
int session = 1;
int scantime = RFIDReaderSettings.ReaderTime / 100;
System.Diagnostics.Debug.WriteLine("_reader.StartReading()");
ReaderStarted?.Invoke(this, null);
Task.Run(() =>
{
//盘点停止
Thread.Sleep(RFIDReaderSettings.ReaderTime);
InventoryStop();
});
var t = 0;
while (IsInventory)
{
for (var i = 0; i < RFIDReaderSettings.Antennas.AntennaConfigs.Length; i++)
{
var config = RFIDReaderSettings.Antennas.AntennaConfigs[i];
if (config.IsEnabled)
{
_reader.Inventry(new Gen2.InventryValue(true, 0, i + 1, 10, q, session), null);
}
}
t++;
if (t > 100)
{
//防止卡死保险措施
break;
}
}
}
catch (Exception e)
{
IsInventory = false;
Log.ErrorLog(e.Message + "|" + e.StackTrace);
}
}
public void InventoryStop()
{
try
{
_reader.Inventry_stop();
}
catch (Exception e)
{
IsInventory = false;
Log.ErrorLog(e.Message + "|" + e.StackTrace);
}
finally
{
ReaderStopped?.Invoke(this, null);
}
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using JmpCommon;
using JmpCommon.Camera;
using JmpCommon.Model;
using JunmpDALib;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ThingMagic;
namespace JmpServiceMgr.Helper
{
public class Solid401XRFIDReader : IRFIDReader
{
public event IRFIDReader.ConnectionLostHandler ConnectionLost;
public event IRFIDReader.TagsReportedHandler TagsReported;
public event IRFIDReader.ReaderStartedEventHandler ReaderStarted;
public event IRFIDReader.ReaderStoppedEventHandler ReaderStopped;
public event IRFIDReader.GpiChangedHandler GpiChanged;
private ThingMagic.SerialReader _reader;
public Solid401XRFIDReader()
{
syncEpc = new object();
GpiTrigger = new GpiTrigger();
EpcList = new List<string>();
CacheList = new List<string>();
}
~Solid401XRFIDReader()
{
_reader?.Destroy();
}
public DAL Dal { get; set; }
public BaseCamera SnapCmaIn { get; set; }
public BaseCamera SnapCmaOut { get; set; }
public bool IsInventory { get; set; }
public RFIDReaderSettings RFIDReaderSettings { get; set; }
public object syncEpc { get; }
public List<string> EpcList { get; set; }
public List<string> CacheList { get; set; }
public bool IsConnected => _isConnected;
public bool IsLost { get; set; } = false;
private bool _isConnected = false;
private void Reader_GpiChanged(Reader reader, object e)
{
GpiChanged?.Invoke(this, e);
}
//private void Reader_ReaderStopped(Reader reader, object e)
//{
// ReaderStopped?.Invoke(this, e);
//}
//private void Reader_ReaderStarted(Reader reader, object e)
//{
// ReaderStarted?.Invoke(this, e);
//}
private void Reader_TagsReported(object sender, TagReadDataEventArgs report)
{
var tagReportData = new TagReportData();
tagReportData.Tags.Add(new TagData
{
Epc = report.TagReadData.EpcString,
AntennaPortNumber = report.TagReadData.Antenna
});
TagsReported?.Invoke(this, tagReportData);
}
private void Reader_ConnectionLost(Reader reader)
{
ConnectionLost?.Invoke(this);
}
public GpiTrigger GpiTrigger { get; }
public RFIDReaderSettings LoadSettings(ReaderConfig readerConfig)
{
if (RFIDReaderSettings != null)
{
return RFIDReaderSettings;
}
if (IsConnected)
{
}
else
{
//无法获取配置信息
return null;
}
if (File.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Solid_settings.xml"))
{
_reader.LoadConfig(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Solid_settings.xml");
//复写可能未载入的数据
try
{
var configStr = File.ReadAllLines(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + readerConfig.name + "_Solid_settings.xml");
var portReadPowerListStr = configStr.FirstOrDefault(x => x.Contains("/reader/radio/portReadPowerList"));
if (!string.IsNullOrEmpty(portReadPowerListStr))
{
var portReadPowerList = JsonConvert.DeserializeObject<int[][]>(portReadPowerListStr.Substring(32));
if (portReadPowerList.Length > 0)
{
_reader.ParamSet("/reader/radio/portReadPowerList", portReadPowerList);
_reader.ParamSet("/reader/radio/portWritePowerList", portReadPowerList);
}
}
var planStr = configStr.FirstOrDefault(x => x.Contains("/reader/read/plan"));
if (!string.IsNullOrEmpty(planStr))
{
var index = planStr.IndexOf("Antennas=", StringComparison.Ordinal) + 9;
var end = planStr.IndexOf("]", index, StringComparison.Ordinal);
if (end > index)
{
var antennasStr = planStr.Substring(index, end - index + 1);
var antennas = JsonConvert.DeserializeObject<int[]>(antennasStr);
if (antennas.Length > 0)
{
_reader.ParamSet("/reader/read/plan", new SimpleReadPlan(antennas, TagProtocol.GEN2, null, null, false));
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
var antennaCount = (_reader.ParamGet("/reader/antenna/portList") as int[])?.Length ?? 4;
RFIDReaderSettings = new RFIDReaderSettings
{
Name = readerConfig.name,
Address = readerConfig.address,
Port = readerConfig.port,
ReaderTime = readerConfig.readerTime,
Type = readerConfig.type,
Antennas = new AntennasSettingGroups(antennaCount),
GpioAddr = readerConfig.gpioAddr,
GpioPort = readerConfig.gpioPort,
IsCameraSeparate = readerConfig.isCameraSeparate,
IsUseSnapshot = readerConfig.useSnapshot,
CamType = readerConfig.camType,
CamAddress = readerConfig.camAddress,
CamChannel = readerConfig.camChannel,
CamPort = readerConfig.camPort,
CamPwd = readerConfig.camPwd,
CamUser = readerConfig.camUser,
IsUseSnapshot2 = readerConfig.useSnapshot2,
CamType2 = readerConfig.camType2,
CamAddress2 = readerConfig.camAddress2,
CamChannel2 = readerConfig.camChannel2,
CamPort2 = readerConfig.camPort2,
CamPwd2 = readerConfig.camPwd2,
CamUser2 = readerConfig.camUser2,
};
var antennaPowerList = (_reader.ParamGet("/reader/radio/portReadPowerList") as int[][]);
var antennaPlan = (_reader.ParamGet("/reader/read/plan") as SimpleReadPlan);
for (var i = 0; i < antennaCount; i++)
{
RFIDReaderSettings.Antennas.AntennaConfigs[i] = new AntennaConfig
{
IsEnabled = (antennaPlan.Antennas != null && antennaPlan.Antennas.Contains(i + 1)),
IsUseMaxRxSensitivity = false,
IsUseMaxTxPower = false,
RxSensitivity = 0, //索立得无灵敏度设置
TxPower = antennaPowerList.Length > i ? antennaPowerList[i][1] / 100.0 : 0
};
}
return RFIDReaderSettings;
}
public bool ApplySettings(RFIDReaderSettings settings)
{
RFIDReaderSettings = settings;
var openAntennaList = new List<int>();
var powerList = new List<int[]>();
var antennaCount = (_reader.ParamGet("/reader/antenna/portList") as int[])?.Length ?? 4;
//更新
for (var i = 0; i < RFIDReaderSettings.Antennas.AntennaConfigs.Length; i++)
{
if (antennaCount < i + 1)
{
break;
}
var config = RFIDReaderSettings.Antennas.AntennaConfigs[i];
if (config.IsEnabled)
{
openAntennaList.Add(i + 1);
}
powerList.Add(new[] { i + 1, Convert.ToInt32(config.TxPower * 100.0) });
}
_reader.ParamSet("/reader/read/plan", new SimpleReadPlan(openAntennaList.ToArray(), TagProtocol.GEN2, null, null, false));
_reader.ParamSet("/reader/radio/portReadPowerList", powerList.ToArray());
_reader.ParamSet("/reader/radio/portWritePowerList", powerList.ToArray());
//100标签左右推荐配置
_reader.ParamSet("/reader/gen2/target", Gen2.Target.A);
_reader.ParamSet("/reader/gen2/session", Gen2.Session.S0);
_reader.ParamSet("/reader/gen2/tari", Gen2.Tari.TARI_25US);
_reader.ParamSet("/reader/gen2/BLF", Gen2.LinkFrequency.LINK250KHZ);
_reader.ParamSet("/reader/gen2/q", new Gen2.DynamicQ());
_reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4);
//_reader.ParamSet("/reader/region/id", Reader.Region.PRC); //中国频段
//_reader.ParamSet("/reader/region/id", Reader.Region.NA); //美国频段
//_reader.ParamSet("/reader/region/id", Reader.Region.AU); //澳大利亚频段
//其他默认配置
_reader.ParamSet("/reader/transportTimeout", 6000);
_reader.ParamSet("/reader/read/asyncOnTime", 1000);
Thread.Sleep(500);
_reader.SaveConfig(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase +
RFIDReaderSettings.Name + "_Solid_settings.xml");
return true;
}
public void Connect(string address)
{
try
{
if (_reader != null)
{
_reader.Destroy();
_reader = null;
}
Reader.SetSerialTransport("tcp", SerialTransportTCP.CreateSerialReader);
_reader = Reader.Create("tcp://" + address) as SerialReader;
_reader.TagRead += Reader_TagsReported;
_reader.ReadException += _reader_ReadException;
_reader.Connect();
string fwver = (string)_reader.ParamGet("/reader/version/software");
if (!string.IsNullOrEmpty(fwver))
{
_isConnected = true;
}
}
catch (Exception e)
{
Log.ErrorLog(e.Message + "|" + e.StackTrace);
_isConnected = false;
}
}
private void _reader_ReadException(object sender, ReaderExceptionEventArgs e)
{
Log.ErrorLog(e.ReaderException.Message + "|" + e.ReaderException.StackTrace);
if ((e.ReaderException.Message.Contains("Connection Lost"))
|| (e.ReaderException.Message.Contains("Request timed out"))
|| (e.ReaderException.Message.Contains("Timeout"))
|| (e.ReaderException.Message.Contains("无效的 URI: 未能确定 URI 的格式。")))
{
//掉线
Reader_ConnectionLost(_reader);
}
}
public void Disconnect()
{
_reader.TagRead -= Reader_TagsReported;
IsInventory = false;
_reader.Destroy();
_isConnected = false;
}
public void InventoryStart()
{
try
{
System.Diagnostics.Debug.WriteLine("_reader.StartReading()");
_reader.StartReading();
ReaderStarted?.Invoke(this, null);
Task.Run(() =>
{
//盘点停止
Thread.Sleep(RFIDReaderSettings.ReaderTime);
InventoryStop();
});
}
catch (Exception e)
{
IsInventory = false;
Log.ErrorLog(e.Message + "|" + e.StackTrace);
}
}
public void InventoryStop()
{
try
{
_reader.StopReading();
}
catch (Exception e)
{
IsInventory = false;
Log.ErrorLog(e.Message + "|" + e.StackTrace);
}
finally
{
ReaderStopped?.Invoke(this, null);
}
}
}
}
using JmpCommon;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using JmpCommon.Model;
using Newtonsoft.Json;
namespace JmpServiceMgr.Helper
{
/// <summary>
/// 串口操作
/// </summary>
public class SerialPortHelper
{
private readonly FrmMgr _form;
private readonly CancellationTokenSource _cTol;
private bool ReconnectFlag = false;
private bool _ctolStatus = false;
private bool _isBusy = false;
private Queue<ShelfMessageStatus> shelfMessageStatusQueue = new Queue<ShelfMessageStatus>();
private ShelfMessageStatus[] shelfMessageStatusArray = new ShelfMessageStatus[255];
private readonly object tempStatusLockObj = new object();
private AutoResetEvent readerEvent = new AutoResetEvent(false);
private ManualResetEvent heartEvent = new ManualResetEvent(true);
public SerialPortHelper(FrmMgr form, CancellationTokenSource cTol)
{
_form = form;
_cTol = cTol;
}
public SerialPort SerialPort = new SerialPort();
public void InitialSerialPort()
{
try
{
// 串口名
SerialPort.PortName = MyCache.SysConfig.PushShelfPrintCom;
// 波特率
SerialPort.BaudRate = 9600;
// 数据位
SerialPort.DataBits = 8;
// 停止位
SerialPort.StopBits = StopBits.One;
// 无奇偶校验位
SerialPort.Parity = Parity.None;
SerialPort.DataReceived += SerialPort_DataReceived;
SerialPort.Encoding = Encoding.GetEncoding("GBK");
SerialPort.Open();
if (SerialPort.IsOpen)
{
Log.WorkLog("串口启动成功");
Task.Run(() => PollingCtol(_cTol.Token));
Task.Run(() => PushQueue(_cTol.Token));
Task.Run(() => PushHeart(_cTol.Token));
if (MyCache.SysConfig.TestModel)
{
//演示模式5秒拉一次订单
Task.Run(() => DemoModePushOrder(_cTol.Token));
}
//拉取货架物资信息,防止显示屏重启拉不到数据
CreateInventoryPushData();
}
else
{
Log.ErrorLog("串口启动失败");
}
}
catch (Exception ex)
{
Log.ErrorLog("串口启动失败:" + ex.ToString());
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//收到数据解析
// 等待100ms,防止读取不全的情况
Thread.Sleep(100);
ReceiveDate();
}
public void CreateOrderPushData(List<request_epc> request_epc)
{
if (_isBusy)
{
//串口忙碌,过滤
return;
}
//推送待操作订单
dynamic dObj = new List<object>();
dynamic eObj = new List<object>();
var orderInvList = HttpHelper.GetOpenOrderInfoInvData();
if (orderInvList != null)
{
try
{
dObj = orderInvList.Select(x => new
{
d1 = x.Name,
d2 = x.Count
});
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
if (request_epc != null && request_epc.Count != 0)
{
eObj = request_epc.Where(x => x.currentState == 0)
.GroupBy(x => new { x.name, x.Size })
.Select(x => new
{
e1 = x.Key.name,
e2 = x.FirstOrDefault()?.shelfAddress,
e3 = x.Key.Size
});
}
PushData("00", "12", JsonConvert.SerializeObject(new { d = dObj, e = eObj }), true);
}
public void CreateInventoryPushData()
{
var invData = HttpHelper.GetListShelfAndInventory(MyCache.ChannelCfg.warehouseId);
lock (tempStatusLockObj)
{
shelfMessageStatusArray = new ShelfMessageStatus[255];
foreach (var shelf in invData)
{
if (!int.TryParse(shelf.Url, out int address))
{
//地址非数字,排除
continue;
}
shelfMessageStatusArray[address] = new ShelfMessageStatus();
var pushData = new
{
a = shelf.OrganizationName,
b = shelf.Name,
c = shelf.InfoList.Select(x => new
{
c1 = x.Name,
c2 = x.InventoryList.Select(y => new
{
c21 = y.Name,
c22 = y.Count
})
})
};
shelfMessageStatusArray[address].Address = shelf.Url;
shelfMessageStatusArray[address].Message = JsonConvert.SerializeObject(pushData);
shelfMessageStatusArray[address].IsSuccess = false;
}
}
}
public void ReceiveDate()
{
try
{
byte[] m_recvBytes = new byte[SerialPort.BytesToRead]; //定义缓冲区大小
int result = SerialPort.Read(m_recvBytes, 0, m_recvBytes.Length); //从串口读取数据
if (result <= 0)
return;
string strResult = Encoding.GetEncoding("GBK").GetString(m_recvBytes, 0, m_recvBytes.Length); //对数据进行转换
SerialPort.DiscardInBuffer();
Debug.WriteLine("strResult:" + strResult);
lock (tempStatusLockObj)
{
if (strResult.Length >= 14)
{
var type = strResult.Substring(4, 2);
var address = Convert.ToInt32(strResult.Substring(6, 2));
if (type == "11" && shelfMessageStatusArray[address] != null)
{
//收到物资数据回调
shelfMessageStatusArray[address].IsSuccess = true;
readerEvent.Set();
}
if (type == "13")
{
//展示屏开机强制推送
PushData(shelfMessageStatusArray[address].Address, "11", shelfMessageStatusArray[address].Message, false);
dynamic dObj = new List<object>();
var orderInvList = HttpHelper.GetOpenOrderInfoInvData();
if (orderInvList != null)
{
dObj = orderInvList.Select(x => new
{
d1 = x.Name,
d2 = x.Count
});
}
PushData("00", "12", JsonConvert.SerializeObject(new { d = dObj, e = new List<object>() }), false);
}
}
}
}
catch (Exception e)
{
Log.ErrorLog("串口数据解析异常:" + e.ToString());
}
}
public void PushData(string address, string type, string json, bool isNeedPushInventory = false)
{
lock (tempStatusLockObj)
{
shelfMessageStatusQueue.Enqueue(new ShelfMessageStatus()
{
IsSuccess = false,
Message = CreateMessage(address, type, json),
Address = address,
IsNeedPushInventory = isNeedPushInventory
});
}
}
public string CreateMessage(string address, string type, string json)
{
var message = "S000" + type + address + json;
var check = makeChecksum(StringToHexString(type + address + json, Encoding.GetEncoding("GBK")));
message += check + "E000";
return message;
}
private string makeChecksum(string hexData)
{
if (string.IsNullOrEmpty(hexData))
{
return "";
}
int total = 0;
int len = hexData.Length;
int num = 0;
while (num < len)
{
string s = hexData.Substring(num, 2);
total += int.Parse(s, NumberStyles.HexNumber);
num = num + 2;
}
//用256求余最大是255,即16进制的FF
int mod = total % 256;
String hex = $"{mod:X}";
len = hex.Length;
// 如果不够校验位的长度,补0,这里用的是两位校验
if (len < 2)
{
hex = "0" + hex;
}
return hex;
}
private string StringToHexString(string s, Encoding encode)
{
byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
{
result += Convert.ToString(b[i], 16);
}
return result;
}
private void PollingCtol(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
if (!SerialPort.IsOpen)
{
SerialPort.Open();
}
Thread.Sleep(5000);
}
catch (Exception e)
{
//Log.ErrorLog("串口重连异常:" + e.ToString());
}
}
}
private void DemoModePushOrder(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
//演示模式每5秒拉取单据推送,不附带物资信息
if (!_isBusy)
{
//推送待操作订单
dynamic dObj = new List<object>();
var orderInvList = HttpHelper.GetOpenOrderInfoInvData();
if (orderInvList != null)
{
dObj = orderInvList.Select(x => new
{
d1 = x.Name,
d2 = x.Count
});
}
PushData("00", "15", JsonConvert.SerializeObject(new { d = dObj, e = new List<object>() }), false);
}
Thread.Sleep(5000);
}
catch (Exception e)
{
Log.ErrorLog("演示模式单据发送异常:" + e.ToString());
}
}
}
private void PushQueue(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
while (shelfMessageStatusQueue.Count > 0)
{
_isBusy = true;
heartEvent.Reset();
Thread.Sleep(1000);
ShelfMessageStatus tempStatus;
lock (tempStatusLockObj)
{
tempStatus = shelfMessageStatusQueue.Dequeue();
}
//推送
Debug.WriteLine(tempStatus.Message);
SerialPort.Write(tempStatus.Message);
Thread.Sleep(200);
if (tempStatus.IsNeedPushInventory)
{
CreateInventoryPushData();
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 255; j++)
{
bool flag;
lock (tempStatusLockObj)
{
if (shelfMessageStatusArray[j] == null)
{
continue;
}
flag = !shelfMessageStatusArray[j].IsSuccess;
}
if (flag)
{
//待发送指令
var text = CreateMessage(shelfMessageStatusArray[j].Address, "11",
shelfMessageStatusArray[j].Message);
Debug.WriteLine(text);
SerialPort.Write(text);
readerEvent.WaitOne(1000); //等待1s
}
}
}
}
}
_isBusy = false;
heartEvent.Set();
Thread.Sleep(1000);
}
catch (Exception e)
{
Log.ErrorLog("串口数据推送异常:" + e.ToString());
}
}
}
private void PushHeart(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
//推送心跳包
for (int i = 0; i < 255; i++)
{
if (shelfMessageStatusArray[i] == null)
{
continue;
}
heartEvent.WaitOne();
var text = CreateMessage(shelfMessageStatusArray[i].Address, "13", "");
SerialPort.Write(text);
Thread.Sleep(1000);
}
//大循环暂停5s
Thread.Sleep(5000);
}
catch (Exception e)
{
//Log.ErrorLog("串口数据心跳推送异常:" + e.ToString());
}
}
}
public void Dispose()
{
if (this.SerialPort == null)
return;
if (this.SerialPort.IsOpen)
this.SerialPort.Close();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{442DABC1-9869-4B57-BFCC-287106799248}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>JmpServiceMgr</RootNamespace>
<AssemblyName>JmpServiceMgr</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Programe\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Programe\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>door.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="DevComponents.DotNetBar2, Version=12.1.0.0, Culture=neutral, PublicKeyToken=c39c3242a43eee2b, processorArchitecture=MSIL" />
<Reference Include="Impinj.OctaneSdk, Version=3.4.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OctaneSDK.3.4.0\lib\net461\Impinj.OctaneSdk.dll</HintPath>
</Reference>
<Reference Include="JunmpDALib">
<HintPath>..\Lib\JunmpDALib.dll</HintPath>
</Reference>
<Reference Include="LLRP, Version=10.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\libltknet-sdk.10.40.0\lib\net461\LLRP.dll</HintPath>
</Reference>
<Reference Include="LLRP.Impinj, Version=10.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\libltknet-sdk.10.40.0\lib\net461\LLRP.Impinj.dll</HintPath>
</Reference>
<Reference Include="MercuryAPI">
<HintPath>..\Lib\MercuryAPI.dll</HintPath>
</Reference>
<Reference Include="MQTTnet, Version=3.1.2.0, Culture=neutral, PublicKeyToken=b69712f52770c0a7, processorArchitecture=MSIL">
<HintPath>..\packages\MQTTnet.3.1.2\lib\net461\MQTTnet.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
</Reference>
<Reference Include="SReaderAPI">
<HintPath>..\Lib\SReaderAPI.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Management" />
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Web" />
<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" />
</ItemGroup>
<ItemGroup>
<Compile Include="AutoClosingMessageBox.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AutoClosingMessageBox.Designer.cs">
<DependentUpon>AutoClosingMessageBox.cs</DependentUpon>
</Compile>
<Compile Include="FrmConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmConfig.Designer.cs">
<DependentUpon>FrmConfig.cs</DependentUpon>
</Compile>
<Compile Include="FrmMgr.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmMgr.Designer.cs">
<DependentUpon>FrmMgr.cs</DependentUpon>
</Compile>
<Compile Include="Helper\HikFaceHelper.cs" />
<Compile Include="Helper\CameraHelper.cs" />
<Compile Include="Helper\Model\ShelfMessageStatus.cs" />
<Compile Include="Helper\Model\TagReport.cs" />
<Compile Include="Helper\SerialPortHelper.cs" />
<Compile Include="Helper\Reader\Solid401RFIDReader.cs" />
<Compile Include="Helper\MQTTHelper.cs" />
<Compile Include="Helper\RFIDReaderHelper.cs" />
<Compile Include="Helper\DalHelper.cs" />
<Compile Include="Helper\Reader\Solid401XRFIDReader.cs" />
<Compile Include="Helper\Reader\ImpinjRFIDReader.cs" />
<Compile Include="Helper\Model\RFIDReaderSettings.cs" />
<Compile Include="Helper\Reader\IRFIDReader.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RfidConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="RfidConfig.Designer.cs">
<DependentUpon>RfidConfig.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="AutoClosingMessageBox.resx">
<DependentUpon>AutoClosingMessageBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmConfig.resx">
<DependentUpon>FrmConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmMgr.resx">
<DependentUpon>FrmMgr.cs</DependentUpon>
</EmbeddedResource>
<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>
<EmbeddedResource Include="app.config" />
<EmbeddedResource Include="RfidConfig.resx">
<DependentUpon>RfidConfig.cs</DependentUpon>
</EmbeddedResource>
<None Include="config.json" />
<None Include="packages.config" />
<None Include="Properties\app.manifest" />
<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>
<ProjectReference Include="..\JmpCommon\JmpCommon.csproj">
<Project>{8662BAF0-5206-4472-84AF-2E44669C3E2C}</Project>
<Name>JmpCommon</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="door.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using DevComponents.DotNetBar;
using Impinj.OctaneSdk;
using JmpCommon;
using JmpCommon.Camera;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace JmpServiceMgr
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//Thread.Sleep(10000);
MessageBoxEx.EnableGlass = false;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
System.Threading.Mutex _mutex;
_mutex = new System.Threading.Mutex(true, Process.GetCurrentProcess().ProcessName, out var ret);
if (!ret)
{
MessageBox.Show("已有另一个程序在运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
Environment.Exit(0);
}
else
{
MyCache.SysConfig = MyCache.LoadSystemStep();
if (MyCache.SysConfig == null)
{
MessageBox.Show("配置文件加载失败,创建默认配置文件");
MyCache.SysConfig = new LocalConfig();
MyCache.SetSystemSetp();
}
else
{
var _update = HttpHelper.GetUpdate(MyCache.SysConfig?.AppCode ?? "");
if (_update == null)
{
}
else
{
if (Version.TryParse(_update.version2, out var version) && version > new Version(MyCache.SysConfig.AppVersion))
{
if (MessageBox.Show("检测到新版本,是否更新?", "更新提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
System.Diagnostics.Process.Start("explorer.exe", MyCache.SysConfig.DomainUrl.TrimEnd('/') + "/" + _update.address.TrimStart('/'));
Process.GetCurrentProcess().Kill();
}
else { }
}
}
}
HttpHelper.SetLocalTime();
Application.Run(new FrmMgr());
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("JmpServiceMgr")]
[assembly: AssemblyDescription("钧普通道程序")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Junmp")]
[assembly: AssemblyProduct("JmpServiceMgr")]
[assembly: AssemblyCopyright("Copyright © Junmp 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("442dabc1-9869-4b57-bfcc-287106799248")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.14.09150")]
[assembly: AssemblyFileVersion("1.2.14.09150")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace JmpServiceMgr.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 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("JmpServiceMgr.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;
}
}
}
}
<?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>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace JmpServiceMgr.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.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;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点。n
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
元素。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表。取消评论适当的元素,
Windows 将自动选择最兼容的环境。 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>
\ No newline at end of file

namespace JmpServiceMgr
{
partial class RfidConfig
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.ant4db = new DevComponents.Editors.IntegerInput();
this.ant4power = new DevComponents.Editors.DoubleInput();
this.label7 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.ant4use = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.ant3db = new DevComponents.Editors.IntegerInput();
this.ant3power = new DevComponents.Editors.DoubleInput();
this.label3 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.ant3use = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.ant2db = new DevComponents.Editors.IntegerInput();
this.ant2power = new DevComponents.Editors.DoubleInput();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.ant2use = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.g_ant1 = new System.Windows.Forms.GroupBox();
this.ant1db = new DevComponents.Editors.IntegerInput();
this.ant1power = new DevComponents.Editors.DoubleInput();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.ant1use = new DevComponents.DotNetBar.Controls.CheckBoxX();
this.groupBox3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ant4db)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ant4power)).BeginInit();
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ant3db)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ant3power)).BeginInit();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ant2db)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ant2power)).BeginInit();
this.g_ant1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ant1db)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ant1power)).BeginInit();
this.SuspendLayout();
//
// groupBox3
//
this.groupBox3.BackColor = System.Drawing.Color.White;
this.groupBox3.Controls.Add(this.ant4db);
this.groupBox3.Controls.Add(this.ant4power);
this.groupBox3.Controls.Add(this.label7);
this.groupBox3.Controls.Add(this.label8);
this.groupBox3.Controls.Add(this.ant4use);
this.groupBox3.ForeColor = System.Drawing.Color.Black;
this.groupBox3.Location = new System.Drawing.Point(353, 154);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(335, 135);
this.groupBox3.TabIndex = 7;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "天线4";
//
// ant4db
//
this.ant4db.BackColor = System.Drawing.Color.White;
//
//
//
this.ant4db.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant4db.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant4db.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant4db.ForeColor = System.Drawing.Color.Black;
this.ant4db.Location = new System.Drawing.Point(89, 89);
this.ant4db.MaxValue = 80;
this.ant4db.MinValue = 30;
this.ant4db.Name = "ant4db";
this.ant4db.ShowUpDown = true;
this.ant4db.Size = new System.Drawing.Size(222, 24);
this.ant4db.TabIndex = 14;
this.ant4db.Value = 80;
//
// ant4power
//
this.ant4power.BackColor = System.Drawing.Color.White;
//
//
//
this.ant4power.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant4power.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant4power.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant4power.ForeColor = System.Drawing.Color.Black;
this.ant4power.Increment = 1D;
this.ant4power.Location = new System.Drawing.Point(88, 55);
this.ant4power.MaxValue = 30.5D;
this.ant4power.MinValue = 10D;
this.ant4power.Name = "ant4power";
this.ant4power.ShowUpDown = true;
this.ant4power.Size = new System.Drawing.Size(222, 24);
this.ant4power.TabIndex = 12;
this.ant4power.Value = 10D;
//
// label7
//
this.label7.AutoSize = true;
this.label7.BackColor = System.Drawing.Color.White;
this.label7.ForeColor = System.Drawing.Color.Black;
this.label7.Location = new System.Drawing.Point(17, 94);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(67, 15);
this.label7.TabIndex = 8;
this.label7.Text = "灵敏度:";
//
// label8
//
this.label8.AutoSize = true;
this.label8.BackColor = System.Drawing.Color.White;
this.label8.ForeColor = System.Drawing.Color.Black;
this.label8.Location = new System.Drawing.Point(17, 59);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(67, 15);
this.label8.TabIndex = 6;
this.label8.Text = "读功率:";
//
// ant4use
//
this.ant4use.BackColor = System.Drawing.Color.White;
//
//
//
this.ant4use.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant4use.ForeColor = System.Drawing.Color.Black;
this.ant4use.Location = new System.Drawing.Point(88, 24);
this.ant4use.Name = "ant4use";
this.ant4use.Size = new System.Drawing.Size(105, 23);
this.ant4use.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ant4use.TabIndex = 5;
this.ant4use.Text = "启用天线4";
//
// groupBox2
//
this.groupBox2.BackColor = System.Drawing.Color.White;
this.groupBox2.Controls.Add(this.ant3db);
this.groupBox2.Controls.Add(this.ant3power);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.ant3use);
this.groupBox2.ForeColor = System.Drawing.Color.Black;
this.groupBox2.Location = new System.Drawing.Point(12, 154);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(335, 135);
this.groupBox2.TabIndex = 6;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "天线3";
//
// ant3db
//
this.ant3db.BackColor = System.Drawing.Color.White;
//
//
//
this.ant3db.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant3db.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant3db.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant3db.ForeColor = System.Drawing.Color.Black;
this.ant3db.Location = new System.Drawing.Point(98, 89);
this.ant3db.MaxValue = 80;
this.ant3db.MinValue = 30;
this.ant3db.Name = "ant3db";
this.ant3db.ShowUpDown = true;
this.ant3db.Size = new System.Drawing.Size(222, 24);
this.ant3db.TabIndex = 14;
this.ant3db.Value = 80;
//
// ant3power
//
this.ant3power.BackColor = System.Drawing.Color.White;
//
//
//
this.ant3power.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant3power.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant3power.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant3power.ForeColor = System.Drawing.Color.Black;
this.ant3power.Increment = 1D;
this.ant3power.Location = new System.Drawing.Point(98, 55);
this.ant3power.MaxValue = 30.5D;
this.ant3power.MinValue = 10D;
this.ant3power.Name = "ant3power";
this.ant3power.ShowUpDown = true;
this.ant3power.Size = new System.Drawing.Size(222, 24);
this.ant3power.TabIndex = 12;
this.ant3power.Value = 10D;
//
// label3
//
this.label3.AutoSize = true;
this.label3.BackColor = System.Drawing.Color.White;
this.label3.ForeColor = System.Drawing.Color.Black;
this.label3.Location = new System.Drawing.Point(26, 94);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(67, 15);
this.label3.TabIndex = 8;
this.label3.Text = "灵敏度:";
//
// label6
//
this.label6.AutoSize = true;
this.label6.BackColor = System.Drawing.Color.White;
this.label6.ForeColor = System.Drawing.Color.Black;
this.label6.Location = new System.Drawing.Point(26, 59);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(67, 15);
this.label6.TabIndex = 6;
this.label6.Text = "读功率:";
//
// ant3use
//
this.ant3use.BackColor = System.Drawing.Color.White;
//
//
//
this.ant3use.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant3use.ForeColor = System.Drawing.Color.Black;
this.ant3use.Location = new System.Drawing.Point(98, 24);
this.ant3use.Name = "ant3use";
this.ant3use.Size = new System.Drawing.Size(105, 23);
this.ant3use.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ant3use.TabIndex = 5;
this.ant3use.Text = "启用天线3";
//
// groupBox1
//
this.groupBox1.BackColor = System.Drawing.Color.White;
this.groupBox1.Controls.Add(this.ant2db);
this.groupBox1.Controls.Add(this.ant2power);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.ant2use);
this.groupBox1.ForeColor = System.Drawing.Color.Black;
this.groupBox1.Location = new System.Drawing.Point(353, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(335, 136);
this.groupBox1.TabIndex = 5;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "天线2";
//
// ant2db
//
this.ant2db.BackColor = System.Drawing.Color.White;
//
//
//
this.ant2db.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant2db.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant2db.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant2db.ForeColor = System.Drawing.Color.Black;
this.ant2db.Location = new System.Drawing.Point(89, 89);
this.ant2db.MaxValue = 80;
this.ant2db.MinValue = 30;
this.ant2db.Name = "ant2db";
this.ant2db.ShowUpDown = true;
this.ant2db.Size = new System.Drawing.Size(222, 24);
this.ant2db.TabIndex = 13;
this.ant2db.Value = 80;
//
// ant2power
//
this.ant2power.BackColor = System.Drawing.Color.White;
//
//
//
this.ant2power.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant2power.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant2power.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant2power.ForeColor = System.Drawing.Color.Black;
this.ant2power.Increment = 1D;
this.ant2power.Location = new System.Drawing.Point(88, 54);
this.ant2power.MaxValue = 30.5D;
this.ant2power.MinValue = 10D;
this.ant2power.Name = "ant2power";
this.ant2power.ShowUpDown = true;
this.ant2power.Size = new System.Drawing.Size(222, 24);
this.ant2power.TabIndex = 12;
this.ant2power.Value = 10D;
//
// label4
//
this.label4.AutoSize = true;
this.label4.BackColor = System.Drawing.Color.White;
this.label4.ForeColor = System.Drawing.Color.Black;
this.label4.Location = new System.Drawing.Point(16, 93);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(67, 15);
this.label4.TabIndex = 8;
this.label4.Text = "灵敏度:";
//
// label5
//
this.label5.AutoSize = true;
this.label5.BackColor = System.Drawing.Color.White;
this.label5.ForeColor = System.Drawing.Color.Black;
this.label5.Location = new System.Drawing.Point(16, 58);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(67, 15);
this.label5.TabIndex = 6;
this.label5.Text = "读功率:";
//
// ant2use
//
this.ant2use.BackColor = System.Drawing.Color.White;
//
//
//
this.ant2use.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant2use.ForeColor = System.Drawing.Color.Black;
this.ant2use.Location = new System.Drawing.Point(88, 23);
this.ant2use.Name = "ant2use";
this.ant2use.Size = new System.Drawing.Size(105, 23);
this.ant2use.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ant2use.TabIndex = 5;
this.ant2use.Text = "启用天线2";
//
// g_ant1
//
this.g_ant1.BackColor = System.Drawing.Color.White;
this.g_ant1.Controls.Add(this.ant1db);
this.g_ant1.Controls.Add(this.ant1power);
this.g_ant1.Controls.Add(this.label2);
this.g_ant1.Controls.Add(this.label1);
this.g_ant1.Controls.Add(this.ant1use);
this.g_ant1.ForeColor = System.Drawing.Color.Black;
this.g_ant1.Location = new System.Drawing.Point(12, 12);
this.g_ant1.Name = "g_ant1";
this.g_ant1.Size = new System.Drawing.Size(335, 136);
this.g_ant1.TabIndex = 4;
this.g_ant1.TabStop = false;
this.g_ant1.Text = "天线1";
//
// ant1db
//
this.ant1db.BackColor = System.Drawing.Color.White;
//
//
//
this.ant1db.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant1db.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant1db.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant1db.ForeColor = System.Drawing.Color.Black;
this.ant1db.Location = new System.Drawing.Point(98, 89);
this.ant1db.MaxValue = 80;
this.ant1db.MinValue = 30;
this.ant1db.Name = "ant1db";
this.ant1db.ShowUpDown = true;
this.ant1db.Size = new System.Drawing.Size(222, 24);
this.ant1db.TabIndex = 11;
this.ant1db.Value = 80;
//
// ant1power
//
this.ant1power.BackColor = System.Drawing.Color.White;
//
//
//
this.ant1power.BackgroundStyle.Class = "DateTimeInputBackground";
this.ant1power.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant1power.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.ant1power.ForeColor = System.Drawing.Color.Black;
this.ant1power.Increment = 1D;
this.ant1power.Location = new System.Drawing.Point(98, 54);
this.ant1power.MaxValue = 30.5D;
this.ant1power.MinValue = 10D;
this.ant1power.Name = "ant1power";
this.ant1power.ShowUpDown = true;
this.ant1power.Size = new System.Drawing.Size(222, 24);
this.ant1power.TabIndex = 10;
this.ant1power.Value = 10D;
//
// label2
//
this.label2.AutoSize = true;
this.label2.BackColor = System.Drawing.Color.White;
this.label2.ForeColor = System.Drawing.Color.Black;
this.label2.Location = new System.Drawing.Point(23, 93);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(67, 15);
this.label2.TabIndex = 8;
this.label2.Text = "灵敏度:";
//
// label1
//
this.label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.White;
this.label1.ForeColor = System.Drawing.Color.Black;
this.label1.Location = new System.Drawing.Point(23, 58);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(67, 15);
this.label1.TabIndex = 6;
this.label1.Text = "读功率:";
//
// ant1use
//
this.ant1use.BackColor = System.Drawing.Color.White;
//
//
//
this.ant1use.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.ant1use.ForeColor = System.Drawing.Color.Black;
this.ant1use.Location = new System.Drawing.Point(98, 23);
this.ant1use.Name = "ant1use";
this.ant1use.Size = new System.Drawing.Size(105, 23);
this.ant1use.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ant1use.TabIndex = 5;
this.ant1use.Text = "启用天线1";
//
// RfidConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(700, 300);
this.ControlBox = false;
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.g_ant1);
this.DoubleBuffered = true;
this.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Margin = new System.Windows.Forms.Padding(4);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "RfidConfig";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ant4db)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ant4power)).EndInit();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ant3db)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ant3power)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ant2db)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ant2power)).EndInit();
this.g_ant1.ResumeLayout(false);
this.g_ant1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ant1db)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ant1power)).EndInit();
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.GroupBox groupBox3;
public DevComponents.Editors.IntegerInput ant4db;
public DevComponents.Editors.DoubleInput ant4power;
public System.Windows.Forms.Label label7;
public System.Windows.Forms.Label label8;
public DevComponents.DotNetBar.Controls.CheckBoxX ant4use;
public System.Windows.Forms.GroupBox groupBox2;
public DevComponents.Editors.IntegerInput ant3db;
public DevComponents.Editors.DoubleInput ant3power;
public System.Windows.Forms.Label label3;
public System.Windows.Forms.Label label6;
public DevComponents.DotNetBar.Controls.CheckBoxX ant3use;
public System.Windows.Forms.GroupBox groupBox1;
public DevComponents.Editors.IntegerInput ant2db;
public DevComponents.Editors.DoubleInput ant2power;
public System.Windows.Forms.Label label4;
public System.Windows.Forms.Label label5;
public DevComponents.DotNetBar.Controls.CheckBoxX ant2use;
public System.Windows.Forms.GroupBox g_ant1;
public DevComponents.Editors.IntegerInput ant1db;
public DevComponents.Editors.DoubleInput ant1power;
public System.Windows.Forms.Label label2;
public System.Windows.Forms.Label label1;
public DevComponents.DotNetBar.Controls.CheckBoxX ant1use;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
namespace JmpServiceMgr
{
public partial class RfidConfig : MetroForm
{
public RfidConfig()
{
InitializeComponent();
}
}
}
<?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>
</root>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
</startup>
</configuration>
kvcNuYri2GRhHa1vSBoxRJQ+5pXZhIA4KkvLpMPCL0odKyB3H/HARVyxZn6BH/eO3Vaoh4caajQkXEZiYFjup8aXyorxcOXGVrHv2WkDNbMtJdEnxp+l9pHnNdiXXzVLvNqNpYl8nsXL6MOscszR+iohz03P5cQICSZM/Xbq9ooVk1tjZo9aExytN7wXVsZUJNvh8kk4WPUo9LpXhnqmQgc1Pj0IKvjzowOF138pe3ff2b07qimYr6z6eGJZhIwgzaSxGxhyY5ca4IZoTu1kwUxsrDsA+3etdBIrm1p2RsP7HVFV1UlY4SleP+LZb1bq48MwFDlFHm+qDpD2a+BYQds3/UnGITJ7fkqF8aOju6Mbz9jqjPyrOY4+H1mcAyEmCqwRrbf9CMxSDOH37GEMoYWsMhcs+qaU4/w1uMA6XX8ott2BY8FImB/I/f4uA+dcsfrw7oUQQHw4iwtwmvzj9ejdxo0r8YpUfEq4LyA0P8eOBzZ5OPTQ/KoldMlRf1hW5fGLUavYkhpLg/U84Stx5P2O0NDE8lySl52z1AJ0UtW5tivskBIBoS8pIvoOrqkPJSJ15UK2j/WtIUvESKRZ71tZjyt+52VTUWY3U/XpdeMHIhLSmh+laJSPOvAgz7jdZHcaYwxUypt6rrG82WaPcILMyRwLHv5iE8L+9czR6moQEQ0VE6LXAG2xHLmfpW0GRgWuQ+aHSX6bUZjvGFht50J0u+MRhs9uRGRfBye82xVaydZuBbmg4NkNByBQOmNh7HoEb+/I7rAHr93Sn+RAkreunH3vt9A4qTFafFQ3UnpnAg+KwrpMLjNDViHfHLLrHa33dj38+qz7Lxm5pVne4BktNkk/sM+cwGO4ddprmnQSIOGDW6Tipe0l9LnzzvILQlYoxdLg/IOlmIrS8nsgpanxkgg6yNkhnvtLkx2tJ+yznXCXC730bv3JjnZpuE4tIra+9S6k65c8SsfTLQI1CUDVuzSsQA0kT+4dXk77G87MpTZ69q/xyVdLBxinjOV6aNmbcCtmqqDgz/39iqiB54vw3ruwdu8YP+huyJDIpBARa8yHVqfzl9ELoqslcvtSCO1qvBkoTH3JCzFh8/V7i4aHbSx99S++G8HguPnIWAoryFZbJKaHpg==
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="libltknet-sdk" version="10.40.0" targetFramework="net461" />
<package id="MQTTnet" version="3.1.2" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
<package id="OctaneSDK" version="3.4.0" targetFramework="net461" />
<package id="SSH.NET" version="2016.1.0" targetFramework="net461" />
<package id="System.Management" version="5.0.0" targetFramework="net461" />
</packages>
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30104.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JmpServiceMgr", "JmpServiceMgr\JmpServiceMgr.csproj", "{442DABC1-9869-4B57-BFCC-287106799248}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JmpCommon", "JmpCommon\JmpCommon.csproj", "{8662BAF0-5206-4472-84AF-2E44669C3E2C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JmpRestart", "JmpReset\JmpRestart.csproj", "{2D595EED-41D5-48DF-8121-600E08F2C273}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiteChannel", "LiteChannel\LiteChannel.csproj", "{9BD01307-0389-44A2-A4F5-E5F96F4E3683}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightCtrl", "LightCtrl\LightCtrl.csproj", "{01C90EA0-0E78-4A2C-8D72-BE8101932585}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{442DABC1-9869-4B57-BFCC-287106799248}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{442DABC1-9869-4B57-BFCC-287106799248}.Debug|Any CPU.Build.0 = Debug|Any CPU
{442DABC1-9869-4B57-BFCC-287106799248}.Release|Any CPU.ActiveCfg = Release|Any CPU
{442DABC1-9869-4B57-BFCC-287106799248}.Release|Any CPU.Build.0 = Release|Any CPU
{8662BAF0-5206-4472-84AF-2E44669C3E2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8662BAF0-5206-4472-84AF-2E44669C3E2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8662BAF0-5206-4472-84AF-2E44669C3E2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8662BAF0-5206-4472-84AF-2E44669C3E2C}.Release|Any CPU.Build.0 = Release|Any CPU
{2D595EED-41D5-48DF-8121-600E08F2C273}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2D595EED-41D5-48DF-8121-600E08F2C273}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D595EED-41D5-48DF-8121-600E08F2C273}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D595EED-41D5-48DF-8121-600E08F2C273}.Release|Any CPU.Build.0 = Release|Any CPU
{9BD01307-0389-44A2-A4F5-E5F96F4E3683}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BD01307-0389-44A2-A4F5-E5F96F4E3683}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BD01307-0389-44A2-A4F5-E5F96F4E3683}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BD01307-0389-44A2-A4F5-E5F96F4E3683}.Release|Any CPU.Build.0 = Release|Any CPU
{01C90EA0-0E78-4A2C-8D72-BE8101932585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{01C90EA0-0E78-4A2C-8D72-BE8101932585}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01C90EA0-0E78-4A2C-8D72-BE8101932585}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01C90EA0-0E78-4A2C-8D72-BE8101932585}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F1BB736E-801B-4BAD-8BC5-A7BA50F023D7}
VisualSVNWorkingCopyRoot = .
EndGlobalSection
EndGlobal
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
</configuration>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LightCtrl
{
public class Analyzingepc
{
/*---------以下为1.0、2.0版本公共参数-----------*/
public byte Header; // 标头(8bits): JY物资专用标头 0x11(00010001b)
public byte IssuerId; // 发行机构标识符(6bits):GA组织机构: 0x01(000001b) 国家组织机构:0x02(000010b)
public string OrganizationCode; // 组织机构代码(54bits):JY物资生产厂商使用GA或国家组织机构代码, 英文字母及数字的每一个字符转换为六位二进制
public byte WzdmLen; // 物资代码长度(4bits): 指定物资代码的长度(N*8bits), 此处为0x7
public UInt64 Wzdm; // 物资代码(56bits): 使用警用物资编目数据的物资代码,按十进制转换成十六进制存储
public UInt64 Hxdm;
public byte SerialLen; // 序列号长度(4bits): 指定序列号长度(N*8bits), 此处为0xD
public byte Ver; // 版本号(8bits): 0x01
public byte TagType; // 标签类型(8bits):
public byte PackingType; // 包装类型(4bits): 0x1 单品, 0x2 外包装, 0x3 内包装, 0xF 零头配箱
public UInt32 ProductionDate; // 生产日期(24bits): 0x161201
public byte ExpiryDate; // 有效期值(6bits): 0-63
public byte ExpiryDateUnit; // 有效期时间单位(2bits): 1:01b-日, 2:10b-月, 3:11b-年
public byte SubPackageNum; // 下级包装内数量(8bits):最大255
public UInt16 WzCount; // 包装数量(12bits): MAX:4095, 每箱内产品总数
public UInt32 BoxNo; // 包装箱序列号(20bits): MAX:65535
public UInt16 NoInBox; // 箱内序列号(12bits): 每箱内产品序号, MAX4095
/*---------以下为2.0版本新增参数,以下参数用于替换生产日期之后的字段,确保真唯一-----------*/
public ulong TimeSpan { get; set; } //当前日期时间戳,精确到毫秒
public byte MachineNum { get; set; } //服务器识别码(4bits),用于区分测试服务器与正式服务器生成的数据,1-15
}
public static class EpcConvert
{
private readonly static string strKeyWords = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 无源标签6位字段对应表
/// <summary>
/// 此方法用于将普通字符串转换成16进制的字符串。
/// </summary>
/// <param name="_str">要转换的字符串。</param>
/// <returns></returns>
public static string StringToHex16String(string _str)
{
//将字符串转换成字节数组。
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(_str);
//定义一个string类型的变量,用于存储转换后的值。
string result = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
//将每一个字节数组转换成16进制的字符串,以空格相隔开。
result += Convert.ToString(buffer[i], 16) + " ";
}
return result;
}
/// <summary>
/// 此方法用于将16进制的字节数组转换成16进制的字符串。
/// </summary>
/// <param name="_hex16Byte">要转换的16进制的字节数组。</param>
/// <returns></returns>
public static string Hex16ByteToHex16String(byte[] _hex16Byte)
{
string result = string.Empty;
//如果字节数组不为空。
if (_hex16Byte != null)
{
for (int i = 0; i < _hex16Byte.Length; i++)
{
//将每一个字节数组转换成16进制string类型的字符串,用空格分隔开。
result += _hex16Byte[i].ToString("X2") + " ";
}
}
return result;
}
public static byte[] ToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
{
hexString = hexString + " ";
}
byte[] buffer = new byte[hexString.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 0x10);
}
return buffer;
}
/// <summary>
/// 生成1.0EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static byte[] Epc1Gen(Analyzingepc epc)
{
byte[] buf = new byte[40];
int pos = 0;
SetData(ref buf, pos, 8, epc.Header);
pos += 8;
SetData(ref buf, pos, 6, epc.IssuerId);
pos += 6;
SetData(ref buf, pos, 54, OrganizationCodeTo6Bin(epc.OrganizationCode.ToUpper()));
pos += 54;
SetData(ref buf, pos, 4, epc.WzdmLen);
pos += 4;
var wzlen = ((epc.WzdmLen - 1) % 8) * 8;
SetData(ref buf, pos, wzlen, epc.Wzdm); // 物资代码暂时定义最长为64bits
pos += wzlen;
SetData(ref buf, pos, 8, epc.Hxdm); // 物资代码暂时定义最长为64bits
pos += 8;
SetData(ref buf, pos, 4, epc.SerialLen);
pos += 4;
SetData(ref buf, pos, 8, epc.Ver);
pos += 8;
SetData(ref buf, pos, 8, epc.TagType);
pos += 8;
SetData(ref buf, pos, 4, epc.PackingType);
pos += 4;
SetData(ref buf, pos, 24, epc.ProductionDate);
pos += 24;
SetData(ref buf, pos, 6, epc.ExpiryDate);
pos += 6;
SetData(ref buf, pos, 2, epc.ExpiryDateUnit);
pos += 2;
SetData(ref buf, pos, 8, epc.SubPackageNum);
pos += 8;
SetData(ref buf, pos, 12, epc.WzCount);
pos += 12;
SetData(ref buf, pos, 20, epc.BoxNo);
pos += 20;
SetData(ref buf, pos, 12, epc.NoInBox);
pos += 12;
// 双字节对齐, 剩余保留区
if (pos % 16 != 0)
{
pos += 16 - pos % 16;
}
// 数据体长度
var len = pos / 8;
var crc = Crc16(buf, len);
SetData(ref buf, pos, 16, crc);
byte[] rtn = new byte[len + 2];
Array.Copy(buf, rtn, len + 2);
return rtn;
}
/// <summary>
/// 生成2.0EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static byte[] Epc2Gen(Analyzingepc epc)
{
byte[] buf = new byte[40];
int pos = 0;
SetData(ref buf, pos, 8, epc.Header);
pos += 8;
SetData(ref buf, pos, 6, epc.IssuerId);
pos += 6;
SetData(ref buf, pos, 54, OrganizationCodeTo6Bin(epc.OrganizationCode.ToUpper()));
pos += 54;
SetData(ref buf, pos, 4, epc.WzdmLen);
pos += 4;
var wzlen = ((epc.WzdmLen - 1) % 8) * 8;
SetData(ref buf, pos, wzlen, epc.Wzdm); // 物资代码暂时定义最长为64bits
pos += wzlen;
SetData(ref buf, pos, 8, epc.Hxdm); // 物资代码暂时定义最长为64bits
pos += 8;
SetData(ref buf, pos, 4, epc.SerialLen);
pos += 4;
/*----------------2.0版本字段-------------*/
SetData(ref buf, pos, 8, epc.Ver);
pos += 8;
SetData(ref buf, pos, 24, epc.ProductionDate);
pos += 24;
SetData(ref buf, pos, 6, epc.ExpiryDate);
pos += 6;
SetData(ref buf, pos, 2, epc.ExpiryDateUnit);
pos += 2;
SetData(ref buf, pos, 48, epc.TimeSpan);
pos += 48;
SetData(ref buf, pos, 12, epc.NoInBox);
pos += 12;
SetData(ref buf, pos, 4, epc.MachineNum);
pos += 4;
// 双字节对齐, 剩余保留区
if (pos % 16 != 0)
{
pos += 16 - pos % 16;
}
// 数据体长度
var len = pos / 8;
var crc = Crc16(buf, len);
SetData(ref buf, pos, 16, crc);
byte[] rtn = new byte[len + 2];
Array.Copy(buf, rtn, len + 2);
return rtn;
}
/// <summary>
/// 解析EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static Analyzingepc EpcAnlysing(byte[] epc)
{
// CRC 校验
var crc_chk = Crc16(epc, epc.Length - 2);
var crc_src = epc[epc.Length - 2] << 8 | epc[epc.Length - 1];
if (crc_src != crc_chk)
{
throw new Exception("CRC校验失败");
}
// 数据解析
Analyzingepc rtn = new Analyzingepc();
int pos = 0;
rtn.Header = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.IssuerId = (byte)GetData(epc, pos, 6);
pos += 6;
var oc = GetData(epc, pos, 54);
rtn.OrganizationCode = OrganizationCodeToStr(oc);
pos += 54;
rtn.WzdmLen = (byte)(GetData(epc, pos, 4));
pos += 4;
var wzlen = ((rtn.WzdmLen - 1) % 8) * 8;
rtn.Wzdm = GetData(epc, pos, wzlen);
pos += wzlen;
rtn.Hxdm = GetData(epc, pos, 8);
pos += 8;
rtn.SerialLen = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.Ver = (byte)GetData(epc, pos, 8);
pos += 8;
//2.0版本解析
if (rtn.Ver == 0x02)
{
rtn.ProductionDate = (UInt32)GetData(epc, pos, 24);
pos += 24;
rtn.ExpiryDate = (byte)GetData(epc, pos, 6);
pos += 6;
rtn.ExpiryDateUnit = (byte)GetData(epc, pos, 2);
pos += 2;
rtn.TimeSpan = (UInt64)GetData(epc, pos, 48);
pos += 48;
rtn.NoInBox = (ushort)GetData(epc, pos, 12);
pos += 12;
rtn.MachineNum = (byte)GetData(epc, pos, 4);
pos += 4;
}
else
{
rtn.TagType = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.PackingType = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.ProductionDate = (UInt32)GetData(epc, pos, 24);
pos += 24;
rtn.ExpiryDate = (byte)GetData(epc, pos, 6);
pos += 6;
rtn.ExpiryDateUnit = (byte)GetData(epc, pos, 2);
pos += 2;
rtn.SubPackageNum = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.WzCount = (UInt16)GetData(epc, pos, 12);
pos += 12;
rtn.BoxNo = (UInt32)GetData(epc, pos, 20);
pos += 20;
rtn.NoInBox = (UInt16)GetData(epc, pos, 12);
pos += 12;
}
return rtn;
}
/// <summary>
/// 向目标数组指定位置插入数据
/// </summary>
/// <param name="data">待操作数组</param>
/// <param name="pos">起始位置</param>
/// <param name="len">写入长度bits</param>
/// <param name="value">写入的值</param>
private static void SetData(ref byte[] data, int pos, int len, UInt64 value)
{
int p = pos;
while (--len >= 0)
{
var bitPos = 7 - p % 8;
data[p++ / 8] |= (byte)(((value >> len) & 1) << bitPos);
}
}
/// <summary>
/// 从目标数组获取成员变量
/// </summary>
/// <param name="data"></param>
/// <param name="pos"></param>
/// <param name="len"></param>
/// <returns></returns>
private static UInt64 GetData(byte[] data, int pos, int len)
{
UInt64 rtn = 0;
int p = pos;
while (len-- > 0)
{
var bitPos = 7 - p % 8;
rtn <<= 1;
rtn |= (byte)((data[p++ / 8] >> bitPos) & 1);
}
return rtn;
}
/// <summary>
/// 转换成字符串
/// </summary>
/// <param name="icode"></param>
/// <returns></returns>
private static string OrganizationCodeToStr(UInt64 icode)
{
string code = "";
for (int i = 0; i < 9; i++)
{
var v = (byte)((icode >> (i * 6)) & 0x3f);
code = strKeyWords[v] + code;
}
return code;
}
/// <summary>
/// 生成十六进制组织代码, 6Bin
/// </summary>
/// <param name="code"></param>
/// <returns>0 失败, 其它:正常的组织代码编号</returns>
private static UInt64 OrganizationCodeTo6Bin(string code)
{
UInt64 iCode = 0;
if (code.Length == 9)
{
for (int i = 0; i < code.Length; i++)
{
var index = strKeyWords.IndexOf(code[i]);
if (index == -1)
{
throw new Exception("输入字符非法!");
}
iCode <<= 6;
iCode |= (byte)index;
}
}
else
{
throw new Exception("输入长度非法!");
}
return iCode;
}
/// <summary>
/// CRC运算
/// </summary>
/// <param name="data"></param>
/// <param name="len">必须是偶数</param>
/// <returns></returns>
public static UInt16 Crc16(byte[] data, int lenth)
{
ushort crc = 0x8791;
for (int i = 0; i < lenth; ++i)
{
ushort temp = 0;
ushort a = (ushort)(((crc >> 8) ^ (0xff & data[i])) << 8);
for (int j = 0; j < 8; ++j)
{
if (((temp ^ a) & 0x8000) != 0)
{
temp = (ushort)((temp << 1) ^ 0x1021);
}
else
{
temp <<= 1;
}
a <<= 1;
}
crc = (ushort)((crc << 8) ^ temp);
}
return crc;
}
}
}

namespace LightCtrl
{
partial class FrmCfg
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmCfg));
this.label1 = new System.Windows.Forms.Label();
this.btn_save = new DevComponents.DotNetBar.ButtonX();
this.txt_addr = new DevComponents.Editors.IpAddressInput();
((System.ComponentModel.ISupportInitialize)(this.txt_addr)).BeginInit();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 30);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(82, 15);
this.label1.TabIndex = 0;
this.label1.Text = "设备地址:";
//
// btn_save
//
this.btn_save.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_save.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_save.Location = new System.Drawing.Point(249, 64);
this.btn_save.Name = "btn_save";
this.btn_save.Size = new System.Drawing.Size(75, 30);
this.btn_save.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btn_save.TabIndex = 2;
this.btn_save.Text = "保存配置";
this.btn_save.Click += new System.EventHandler(this.btn_save_Click);
//
// txt_addr
//
this.txt_addr.AutoOverwrite = true;
this.txt_addr.BackColor = System.Drawing.Color.White;
//
//
//
this.txt_addr.BackgroundStyle.Class = "DateTimeInputBackground";
this.txt_addr.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.txt_addr.ButtonFreeText.Shortcut = DevComponents.DotNetBar.eShortcut.F2;
this.txt_addr.ButtonFreeText.Visible = true;
this.txt_addr.ForeColor = System.Drawing.Color.Black;
this.txt_addr.Location = new System.Drawing.Point(84, 23);
this.txt_addr.Name = "txt_addr";
this.txt_addr.Size = new System.Drawing.Size(241, 25);
this.txt_addr.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.txt_addr.TabIndex = 3;
//
// FrmCfg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(337, 114);
this.Controls.Add(this.txt_addr);
this.Controls.Add(this.btn_save);
this.Controls.Add(this.label1);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmCfg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "系统设置";
this.Load += new System.EventHandler(this.FrmCfg_Load);
((System.ComponentModel.ISupportInitialize)(this.txt_addr)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private DevComponents.DotNetBar.ButtonX btn_save;
private DevComponents.Editors.IpAddressInput txt_addr;
}
}
using DevComponents.DotNetBar.Metro;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LightCtrl
{
public partial class FrmCfg : MetroForm
{
public FrmCfg()
{
InitializeComponent();
}
private void btn_save_Click(object sender, EventArgs e)
{
MyCache.GpioCfg.Address = txt_addr.Text;
MyCache.SetSystemSetp();
MessageBox.Show(this,"配置保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
private void FrmCfg_Load(object sender, EventArgs e)
{
txt_addr.Text = MyCache.GpioCfg.Address;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAZGQAAAEAIACoogAAFgAAACgAAABkAAAAyAAAAAEAIAAAAAAAQJwAABMLAAATCwAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAcAAAAIAAAABwAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADAAA
ABQAAAAaAAAAHQAAABsAAAAVAAAADQAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAMAAAAFgAAACEAAAApAAAALQAAAC4AAAAuAAAAKgAA
ACMAAAAZAAAADgAAAAYAAAACmXpcAJl6XACZelwAmXpcAJl6XAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA
AAsAAAAWAAAAIQcGBCxoUz9rhWpQqYxwVL+JbVKxcltFfhwWETwAAAAxAAAALAAAACQAAAAZAAAADgAA
AAYAAAACmXpcAJl6XACZelwAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACwAAABUAAAAgBwYELHBZQ3eUdlnfmXpc/5l6
XP+Zelz/mXpc/5l6XP+XeFvvfWRLkh4YEj0AAAAxAAAALAAAACMAAAAYAAAADgAAAAYAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AAQAAAALAAAAFQAAACAEAwIqbVdCc5N1WNuZelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+XeFvufGNKkRwWETwAAAAxAAAALAAAACMAAAAYAAAADgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAwAAAAYAAAAPAAAAGgAAACRuV0JqkXRX1pd5
W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+Vd1rtfWNKjB4X
ETQAAAArAAAAJgAAAB4AAAATAAAACQAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAgAA
AAcAAAAOAAAAEgAAABQAAAAYAAAAHmhTP2CHbVHRjXBV/41wVf+NcFX/jXBV/41wVf+NcFX/jXBV/41w
Vf+NcFX/jXBV/41wVf+NcFX/jXBV/41wVf+NcFX/jXBV/41wVf+Lb1Psdl5GhxoWES8AAAAmAAAAIQAA
ABoAAAAVAAAADwAAAAgAAAACAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAQAAAAkAAAAYAAAAJQAAACkAAAAqVkQ0Ynlh
Sc+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4Bm
Tf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf9+ZEzraFM+iBYSDTUAAAAtAAAAKgAAACYAAAAaAAAACgAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAQAAAATPS8hP1hDMGZZRDFpYUs2em1VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21V
P5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21V
P5ttVT+bbVU/m21VP5tpUTyMV0MwaDksH00AAAAyAAAAKQAAABUAAAAFAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAATDwsHf2JGmYlp
S/2JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/el5DswkHBTAAAAAbAAAABwAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAhGVIVIlpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/9uVDyEAAAAGQAA
AAYAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAIhoSpOJaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/gGJGtAAAAA4AAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAACJaUt2iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4FjR5YAAAAFAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAgWNHEohpS92JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4doSutRPiwxAAAACAAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAANKOSkjeFxCjnpdQ6x5XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXld
Qq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXld
Qq15XUKteV1CrXldQq15XUKteV1CrXJYP5kzJxxEAAAAJgAAABMAAAAEAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAGgGZNY5V3
WeKZelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Vd1npdl5HhQAAAC0AAAAbAAAABwAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAjG9UO5l6XPyZelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP9rVUBqAAAAGgAA
AAcAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAJh5W42Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/jnFVrwAAABEAAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAACZelyFmXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5F0V6IAAAAHAAAAAQAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAmXpcJpl6XPWZelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5h6XPx2XkdGAAAABgAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAKAZk1CknRYv5V3WeKVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3
WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3
WeOVd1njlXdZ45V3WeOVd1njlXdZ449yVshmUT1jAAAAIgAAABAAAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWkUxOn1g
RLCCZEfSg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNk
R9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oJk
R9R8X0S4RDQlVQAAACwAAAAZAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdVpAIohpS/GJaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4hoSvdLOSlRAAAAGwAA
AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAIhoSoGJaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/fF9EpwAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJaUuOiWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4JkR7AAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAAiWlLP4lpS/6JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/94XEJjAAAAAwAA
AAAAAAAAAAAAACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAAAAAAAAAAAJ/YkZyiGhL8YlpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4hoSvVxVz6MAAAAGgAAAAgAAAAAAAAAAAAAAAAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAHGJS8TiG+
8uonve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye9
7f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye9
7f8hteTKBy06PQAAACYAAAARAAAAAwAAAAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAADC0FTGB/A9eQgw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xyr2qkAAAAuAAAAHgAA
AAsAAAACAAAAACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAADAAAADRyo14Ugw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gwvj6DlZuTQAAACsAAAAaAAAACQAAAAEgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAEAAAADg9aczQgwfbwIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/x205cIBBAUyAAAAKQAAABkAAAAKAAAAAiDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5AAAAAAEAAAAFAAAAEAcoMyceuOvLIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Gp/LkQAA
ADEAAAAqAAAAGwAAAAwAAAADIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAEAAAAHAAAAFAgv
PS0euOrGIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8ansmRAAAAMgAAACwAAAAfAAAAEAAA
AAUAAAABIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAIAAAAJAAAAGA9ZcUAfu+7WIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xyr26oDEhc2AAAALgAAACMAAAASAAAABgAAAAEgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAA
AAIAAAAJAAAAGRWDp14fwPXsIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/HrfpywtBU0UAAAAvAAAAJAAAABMAAAAGAAAAASDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAEAAAAJAAAAGRqfy4Mgw/n9IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fv/TtEWeEWQAA
ADAAAAAlAAAAEwAAAAUAAAABIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5AAAAAAEAAAAIAAAAGBuk0o4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9vITcpFgAAAAMAAAACQAAAASAAAABCDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAGAAAAFRun
1o8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMH28xNxkV8AAAAvAAAAIgAAAA8AAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAEAAAAERuj0H4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8fwPXuEWWBVwAAAC4AAAAeAAAACwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAAAAACAAAADBiUvF8gwvj9IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x++8uUKPU5DAAAAKwAA
ABkAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAAAAABxN3lzggwfbzIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/HrfpygILDzMAAAAnAAAAEwAAAAQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAAAAAAwgzQRcfu+/SIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8aoc6XAAAALwAAACAAAAAMAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAAAAAAQAA
AAodrt+PIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4/RNx
kV0AAAArAAAAGAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5AAAAAAQVfqEzIML4+CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fu+7aAw8UNAAAACMAAAAOAAAAAgAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5AAAAAAEAAAALHrjrvCDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xmaxIkAAAAsAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAAAAAEG6LPWSDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8fwPXvCDA+PQAAACMAAAANAAAAAQAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAAxIWCx++8tUgw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xqhzpUAAAArAAAAFgAA
AAUAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAAAAAAhyr2lcgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fv/TrBBYcNQAAACAAAAAKAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAYfvPC/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/xiRun4AAAAnAAAAEQAAAAIAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAZmsUrIMP5/SDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8euu3XAAAALAAA
ABgAAAAGAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAACHrXnfyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/w9bdE0AAAAgAAAACgAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAABR++88sgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8ansqPAAAAJgAAAA8AAAABAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAABmXwB8gw/n9IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Hrjq0AAA
ACoAAAAUAAAABAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAeuOppIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f0KPk88AAAAGQAAAAYAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAABH73xoyDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/FoiubQAAAB4AAAAIAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAh/A9dQgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xuj
0JgAAAAhAAAACgAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ABBi
fQYgwvj5IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8dseK4AAAAJAAAAAwAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAetOYoIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H7vv2wAAACYAAAANAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AHrjrRyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB
9vMAAAAnAAAADwAAAAH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB+7
7l8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/BSEqLwAAAA8AAAAB////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAfvvJsIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/Lcb5/yHD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/wxIXDkAAAAPAAAAAf///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AH77ydSDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yTE
+f9V0Pj/Z9T4/2fU+P9c0fj/K8b5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8PXHVAAAAADgAAAAH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB+/
9HAgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Lzfj/Z9T4/2fU+P9n1Pj/Z9T4/1nR
+P8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/DlZuPQAAAA0AAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAfv/RjIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/X9L4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/JsT5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/wk5SDAAAAAMAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AIMH2VSDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/2TT
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/yjF+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8AAAAiAAAACwAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB/A
9Ucgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yLE+f9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P8jxPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gwfbzAAAAHgAAAAkAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAgw/koIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8txvn/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9k0/j/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H7zw3AAAABoAAAAGAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AIMP5ByDD+fwgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Pcr5/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/W9H4/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x62
6L4AAAAUAAAABAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAgwvjWIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/1PP+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/07O
+P8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8cq9uVAAAADwAAAAIAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAIMH3oyDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yjF+f9m1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P8/yvn/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/GZfBZgAAAAoAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAACDD+Wcgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Izfj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/K8b5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/g9d
dywAAAAGAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAgw/kjIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/ZdT4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/W9H4/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x+779UAAAARAAAAAwAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+dYgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8iw/n/V9D4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/z/L+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8crt6SAAAACgAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/mAIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Ss34/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2LT+P8kxPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/FYCjOgAA
AAUAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5JSDD+f4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/Rcz4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9By/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/H7vvzwAAAA4AAAACAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/m9IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8iw/n/S834/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9c0fj/IsP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/xyr2ngAAAAGAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5RyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8txvn/WtH4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9m1Pj/MMf5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9uwNTGIXAAAAAgAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/nKIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/ynF
+f9Kzfj/ZtT4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/QMv5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8dsOGFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5TiDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/QMv5/1bQ+P9m1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Sc34/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gwffwEWqHGAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/m7IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yHD+f9Ay/n/WtH4/2DS
+P9l1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/R8z4/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/HbHjeQAAAAQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5JiDD+fggw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9EzPj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9l1Pj/PMr5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H77z1gxHWwsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/mBIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/Y9P4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9Z0fj/Lcb5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4+xum
1D0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5BCDD+cMgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/2bU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2DS+P89yvn/IcP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x636X4AAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kdIMP56yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Qz/j/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/WND4/zvK+f8ixPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/x++8rkGJzIFIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+Ukgw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/JsT5/1TP+P9n1Pj/Z9T4/2fU+P9m1Pj/XdL4/07O+P8+yvn/KcX5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9t4ZmsUYIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5aSDD
+f4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/JsT5/ynF
+f8lxPn/IcP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9+UdsOEoAAAAASDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/l0IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDC
+PEds+QxAAAAASDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+Wogw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDC+OgeuOozIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5VCDD+fggw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDB990ds+QlIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/k8IMP54iDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9r8dsuQXIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+RMgw/m0IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5+x/A9YIYkrsEIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ASDD+Wcgw/ntIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4zh+/
9Dcgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5FCDD+Z4gw/n+IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/nvIMH3bSDD+QMgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5KyDD
+aUgw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+e0gwfd/IMP5ESDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5JSDD+ZMgw/nwIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP51yDB93Igw/kMIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5CSDD+VMgw/mlIMP56CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/iDD
+dMgw/mMIMP5NyDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/krIMP5bCDD+Zkgw/nAIMP56CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n7IMP52yDD+bUgw/mMIMP5VyDD+RYgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kIIMP5FCDD+SIgw/kxIMP5KyDD+R8gw/kRIMP5AyDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////////Af//////8AAAAP//
/////AB///////AAAAD///////AAH//////wAAAA///////AAAf/////8AAAAP//////AAAB//////AA
AAD//////AAAAH/////wAAAA/////+AAAAAf////8AAAAP////+AAAAAB/////AAAAD/////AAAAAAP/
///wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAP////wAAAA/////wAA
AAAD////8AAAAP////8AAAAAB/////AAAAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP//
//8AAAAAA/////AAAAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AA
AAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAP/
///wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAf////wAAAA/////wAA
AAAH////8AAAAP////8AAAAAA/////AAAAD////+AAAAAAH////wAAAA/////AAAAAAA////8AAAAP//
//gAAAAAAH////AAAAD////gAAAAAAA////wAAAA////wAAAAAAAD///8AAAAP///4AAAAAAAAf///AA
AAD///8AAAAAAAAD///wAAAA///+AAAAAAAAAf//8AAAAP///AAAAAAAAAH///AAAAD///wAAAAAAAAA
///wAAAA///4AAAAAAAAAH//8AAAAP//8AAAAAAAAAA///AAAAD///AAAAAAAAAAP//wAAAA///gAAAA
AAAAAB//8AAAAP//wAAAAAAAAAAf//AAAAD//8AAAAAAAAAAD//wAAAA//+AAAAAAAAAAA//8AAAAP//
gAAAAAAAAAAH//AAAAD//4AAAAAAAAAAB//wAAAA//8AAAAAAAAAAAf/8AAAAP//AAAAAAAAAAAD//AA
AAD//wAAAAAAAAAAA//wAAAA//4AAAAAAAAAAAP/8AAAAP/+AAAAAAAAAAAB//AAAAD//gAAAAAAAAAA
Af/wAAAA//4AAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAAAf/wAAAA//wAAAAA
AAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAAAP/wAAAA//wAAAAAAAAAAAD/8AAAAP/8
AAAAAAAAAAAA//AAAAD//AAAAAAAAAAAAP/wAAAA//wAAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AA
AAD//AAAAAAAAAAAAf/wAAAA//wAAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAA
Af/wAAAA//4AAAAAAAAAAAH/8AAAAP/+AAAAAAAAAAAD//AAAAD//gAAAAAAAAAAA//wAAAA//4AAAAA
AAAAAAP/8AAAAP//AAAAAAAAAAAH//AAAAD//wAAAAAAAAAAB//wAAAA//8AAAAAAAAAAAf/8AAAAP//
gAAAAAAAAAAP//AAAAD//4AAAAAAAAAAD//wAAAA///AAAAAAAAAAB//8AAAAP//wAAAAAAAAAAf//AA
AAD//+AAAAAAAAAAP//wAAAA///gAAAAAAAAAD//8AAAAP//8AAAAAAAAAB///AAAAD///AAAAAAAAAA
///wAAAA///4AAAAAAAAAf//8AAAAP///AAAAAAAAAP///AAAAD///4AAAAAAAAD///wAAAA////AAAA
AAAAB///8AAAAP///4AAAAAAAB////AAAAD////AAAAAAAA////wAAAA////4AAAAAAAf///8AAAAP//
//AAAAAAAP////AAAAD////4AAAAAAP////wAAAA/////gAAAAAH////8AAAAP////+AAAAAH/////AA
AAD/////4AAAAH/////wAAAA//////gAAAP/////8AAAAP//////gAAf//////AAAAD///////wD////
///wAAAA////////////////8AAAAA==
</value>
</data>
</root>
\ No newline at end of file

namespace LightCtrl
{
partial class FrmMain
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.ri_log = new System.Windows.Forms.RichTextBox();
this.labelX1 = new DevComponents.DotNetBar.LabelX();
this.SuspendLayout();
//
// ri_log
//
this.ri_log.BackColor = System.Drawing.Color.White;
this.ri_log.Dock = System.Windows.Forms.DockStyle.Top;
this.ri_log.Font = new System.Drawing.Font("幼圆", 12F);
this.ri_log.ForeColor = System.Drawing.Color.Black;
this.ri_log.Location = new System.Drawing.Point(0, 0);
this.ri_log.Name = "ri_log";
this.ri_log.Size = new System.Drawing.Size(800, 361);
this.ri_log.TabIndex = 0;
this.ri_log.Text = "";
this.ri_log.DoubleClick += new System.EventHandler(this.ri_log_DoubleClick);
//
// labelX1
//
//
//
//
this.labelX1.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.labelX1.Font = new System.Drawing.Font("幼圆", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.labelX1.ForeColor = System.Drawing.Color.Green;
this.labelX1.Location = new System.Drawing.Point(0, 367);
this.labelX1.Name = "labelX1";
this.labelX1.SingleLineColor = System.Drawing.SystemColors.Control;
this.labelX1.Size = new System.Drawing.Size(800, 83);
this.labelX1.TabIndex = 1;
this.labelX1.Text = "<font color=\"#22B14C\">\r\n1.门禁信号输入口接IN0口,接其他口无效\r\n\r\n<br/>\r\n2.门禁开关门控制输出用OUT2口输出\r\n\r\n<b" +
"r/>\r\n3.灯光控制信号输出用OU3口输出\r\n</font>";
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.labelX1);
this.Controls.Add(this.ri_log);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "灯光门禁控制程序v1.2";
this.Load += new System.EventHandler(this.FrmMain_Load);
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.FrmMain_MouseClick);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.RichTextBox ri_log;
private DevComponents.DotNetBar.LabelX labelX1;
}
}
using DevComponents.DotNetBar.Metro;
using JunmpDALib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LightCtrl
{
public partial class FrmMain : MetroForm
{
public FrmMain()
{
InitializeComponent();
}
private JunmpDALib.DAL _ctol;
private Action<bool> OnSendCmd;
private void FrmMain_Load(object sender, EventArgs e)
{
OnSendCmd = new Action<bool>(SendCmd);
_ctol = new DAL(MyCache.GpioCfg.Address, MyCache.GpioCfg.Port);
if (_ctol.IsOpen())
{
SetLogs("GPIO连接成功");
}
else
{
if (_ctol.Open())
{
SetLogs("GPIO连接成功");
_ctol.OnLinkLost += new JunmpDALib.DAL.LinkLostDeleg(OnGpioLinkLost);
_ctol.OnGPIChanged += new JunmpDALib.DAL.GPIDeleg(OnGPIChanged);
_ctol.GpioInit();
}
else
{
SetLogs("GPIO连接失败");
}
}
}
private void OnGpioLinkLost()
{
////重置状态
//_ctolStatus = false;
////立即重连
//ctolEvent.Set();
}
/// <summary>
/// GPIO事件
/// </summary>
/// <param name="args"></param>
private void OnGPIChanged(GPIArgs args)
{
try
{
//开门、开灯
if (args.Value && args.Location == 0)
{
OnSendCmd?.BeginInvoke(true,default,default);
}
//关门、关灯
if (!args.Value && args.Location == 0)
{
OnSendCmd?.BeginInvoke(false, default, default);
}
}
catch (Exception ex)
{
SetLogs(ex?.Message ?? ex.InnerException?.Message ?? "");
}
}
private void SendCmd(bool isOpen)
{
if (_ctol.IsOpen())
{
//开门
SetLogs("正在开门中...");
_ctol.SetGpo(new GPOArgs(2, isOpen));
//开灯
SetLogs("正在开灯中...");
_ctol.SetGpo(new GPOArgs(3, isOpen));
}
else { SetLogs("GPIO未连接,不发送信号"); }
}
private void SetLogs(string msg)
{
this.Invoke((Action)delegate
{
if (ri_log.Text.Length > 30000)
{
ri_log.ResetText();
}
ri_log.Text = ri_log.Text.Insert(0, $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} - {msg}\r\n");
});
Application.DoEvents();
}
private void FrmMain_MouseClick(object sender, MouseEventArgs e)
{
}
private void ri_log_DoubleClick(object sender, EventArgs e)
{
new FrmCfg().ShowDialog(this);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAZGQAAAEAIACoogAAFgAAACgAAABkAAAAyAAAAAEAIAAAAAAAQJwAABMLAAATCwAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAcAAAAIAAAABwAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADAAA
ABQAAAAaAAAAHQAAABsAAAAVAAAADQAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAMAAAAFgAAACEAAAApAAAALQAAAC4AAAAuAAAAKgAA
ACMAAAAZAAAADgAAAAYAAAACmXpcAJl6XACZelwAmXpcAJl6XAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA
AAsAAAAWAAAAIQcGBCxoUz9rhWpQqYxwVL+JbVKxcltFfhwWETwAAAAxAAAALAAAACQAAAAZAAAADgAA
AAYAAAACmXpcAJl6XACZelwAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACwAAABUAAAAgBwYELHBZQ3eUdlnfmXpc/5l6
XP+Zelz/mXpc/5l6XP+XeFvvfWRLkh4YEj0AAAAxAAAALAAAACMAAAAYAAAADgAAAAYAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AAQAAAALAAAAFQAAACAEAwIqbVdCc5N1WNuZelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+XeFvufGNKkRwWETwAAAAxAAAALAAAACMAAAAYAAAADgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAwAAAAYAAAAPAAAAGgAAACRuV0JqkXRX1pd5
W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+XeVv/l3lb/5d5W/+Vd1rtfWNKjB4X
ETQAAAArAAAAJgAAAB4AAAATAAAACQAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAgAA
AAcAAAAOAAAAEgAAABQAAAAYAAAAHmhTP2CHbVHRjXBV/41wVf+NcFX/jXBV/41wVf+NcFX/jXBV/41w
Vf+NcFX/jXBV/41wVf+NcFX/jXBV/41wVf+NcFX/jXBV/41wVf+Lb1Psdl5GhxoWES8AAAAmAAAAIQAA
ABoAAAAVAAAADwAAAAgAAAACAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAQAAAAkAAAAYAAAAJQAAACkAAAAqVkQ0Ynlh
Sc+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf+AZk3/gGZN/4Bm
Tf+AZk3/gGZN/4BmTf+AZk3/gGZN/4BmTf9+ZEzraFM+iBYSDTUAAAAtAAAAKgAAACYAAAAaAAAACgAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAQAAAATPS8hP1hDMGZZRDFpYUs2em1VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21V
P5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21VP5ttVT+bbVU/m21V
P5ttVT+bbVU/m21VP5tpUTyMV0MwaDksH00AAAAyAAAAKQAAABUAAAAFAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAATDwsHf2JGmYlp
S/2JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/el5DswkHBTAAAAAbAAAABwAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAhGVIVIlpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/9uVDyEAAAAGQAA
AAYAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAIhoSpOJaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/gGJGtAAAAA4AAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAACJaUt2iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4FjR5YAAAAFAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAgWNHEohpS92JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4doSutRPiwxAAAACAAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAANKOSkjeFxCjnpdQ6x5XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXld
Qq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXldQq15XUKteV1CrXld
Qq15XUKteV1CrXldQq15XUKteV1CrXJYP5kzJxxEAAAAJgAAABMAAAAEAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAGgGZNY5V3
WeKZelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Vd1npdl5HhQAAAC0AAAAbAAAABwAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAjG9UO5l6XPyZelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP9rVUBqAAAAGgAA
AAcAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAJh5W42Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/jnFVrwAAABEAAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAACZelyFmXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5F0V6IAAAAHAAAAAQAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAAAAAAmXpcJpl6XPWZelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6
XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5l6XP+Zelz/mXpc/5h6XPx2XkdGAAAABgAA
AAEAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AAAAAAAAAAAKAZk1CknRYv5V3WeKVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3
WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3WeOVd1njlXdZ45V3
WeOVd1njlXdZ45V3WeOVd1njlXdZ449yVshmUT1jAAAAIgAAABAAAAADAAAAAAAAAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWkUxOn1g
RLCCZEfSg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNk
R9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oNkR9aDZEfWg2RH1oJk
R9R8X0S4RDQlVQAAACwAAAAZAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdVpAIohpS/GJaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4hoSvdLOSlRAAAAGwAA
AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAIhoSoGJaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/fF9EpwAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJaUuOiWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4JkR7AAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAAiWlLP4lpS/6JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/94XEJjAAAAAwAA
AAAAAAAAAAAAACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAAAAAAAAAAAJ/YkZyiGhL8YlpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lpS/+JaUv/iWlL/4lp
S/+JaUv/iWlL/4lpS/+JaUv/iWlL/4hoSvVxVz6MAAAAGgAAAAgAAAAAAAAAAAAAAAAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAHGJS8TiG+
8uonve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye9
7f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye97f8nve3/J73t/ye9
7f8hteTKBy06PQAAACYAAAARAAAAAwAAAAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAADC0FTGB/A9eQgw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xyr2qkAAAAuAAAAHgAA
AAsAAAACAAAAACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAADAAAADRyo14Ugw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gwvj6DlZuTQAAACsAAAAaAAAACQAAAAEgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAEAAAADg9aczQgwfbwIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/x205cIBBAUyAAAAKQAAABkAAAAKAAAAAiDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5AAAAAAEAAAAFAAAAEAcoMyceuOvLIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Gp/LkQAA
ADEAAAAqAAAAGwAAAAwAAAADIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAEAAAAHAAAAFAgv
PS0euOrGIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8ansmRAAAAMgAAACwAAAAfAAAAEAAA
AAUAAAABIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAIAAAAJAAAAGA9ZcUAfu+7WIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xyr26oDEhc2AAAALgAAACMAAAASAAAABgAAAAEgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAA
AAIAAAAJAAAAGRWDp14fwPXsIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/HrfpywtBU0UAAAAvAAAAJAAAABMAAAAGAAAAASDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAEAAAAJAAAAGRqfy4Mgw/n9IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fv/TtEWeEWQAA
ADAAAAAlAAAAEwAAAAUAAAABIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5AAAAAAEAAAAIAAAAGBuk0o4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9vITcpFgAAAAMAAAACQAAAASAAAABCDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAGAAAAFRun
1o8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMH28xNxkV8AAAAvAAAAIgAAAA8AAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAAAAAEAAAAERuj0H4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8fwPXuEWWBVwAAAC4AAAAeAAAACwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAAAAACAAAADBiUvF8gwvj9IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x++8uUKPU5DAAAAKwAA
ABkAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAAAAABxN3lzggwfbzIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/HrfpygILDzMAAAAnAAAAEwAAAAQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAAAAAAwgzQRcfu+/SIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8aoc6XAAAALwAAACAAAAAMAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAAAAAAQAA
AAodrt+PIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4/RNx
kV0AAAArAAAAGAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5AAAAAAQVfqEzIML4+CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fu+7aAw8UNAAAACMAAAAOAAAAAgAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5AAAAAAEAAAALHrjrvCDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xmaxIkAAAAsAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAAAAAEG6LPWSDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8fwPXvCDA+PQAAACMAAAANAAAAAQAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAAxIWCx++8tUgw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xqhzpUAAAArAAAAFgAA
AAUAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAAAAAAhyr2lcgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8fv/TrBBYcNQAAACAAAAAKAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAYfvPC/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/xiRun4AAAAnAAAAEQAAAAIAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAZmsUrIMP5/SDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8euu3XAAAALAAA
ABgAAAAGAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAACHrXnfyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/w9bdE0AAAAgAAAACgAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAABR++88sgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8ansqPAAAAJgAAAA8AAAABAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAABmXwB8gw/n9IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Hrjq0AAA
ACoAAAAUAAAABAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAeuOppIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f0KPk88AAAAGQAAAAYAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAABH73xoyDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/FoiubQAAAB4AAAAIAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAh/A9dQgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/xuj
0JgAAAAhAAAACgAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ABBi
fQYgwvj5IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8dseK4AAAAJAAAAAwAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAetOYoIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H7vv2wAAACYAAAANAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AHrjrRyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB
9vMAAAAnAAAADwAAAAH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB+7
7l8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/BSEqLwAAAA8AAAAB////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAfvvJsIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/Lcb5/yHD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/wxIXDkAAAAPAAAAAf///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AH77ydSDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yTE
+f9V0Pj/Z9T4/2fU+P9c0fj/K8b5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8PXHVAAAAADgAAAAH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB+/
9HAgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Lzfj/Z9T4/2fU+P9n1Pj/Z9T4/1nR
+P8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/DlZuPQAAAA0AAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAfv/RjIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/X9L4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/JsT5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/wk5SDAAAAAMAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AIMH2VSDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/2TT
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/yjF+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8AAAAiAAAACwAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AB/A
9Ucgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yLE+f9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P8jxPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gwfbzAAAAHgAAAAkAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAgw/koIMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8txvn/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9k0/j/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H7zw3AAAABoAAAAGAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AIMP5ByDD+fwgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Pcr5/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/W9H4/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x62
6L4AAAAUAAAABAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAgwvjWIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/1PP+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/07O
+P8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8cq9uVAAAADwAAAAIAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAIMH3oyDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yjF+f9m1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P8/yvn/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/GZfBZgAAAAoAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAACDD+Wcgw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Izfj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/K8b5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/g9d
dywAAAAGAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAgw/kjIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/ZdT4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/W9H4/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x+779UAAAARAAAAAwAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+dYgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8iw/n/V9D4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/z/L+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8crt6SAAAACgAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/mAIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/Ss34/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2LT+P8kxPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/FYCjOgAA
AAUAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5JSDD+f4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/Rcz4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9By/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/H7vvzwAAAA4AAAACAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/m9IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8iw/n/S834/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9c0fj/IsP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/xyr2ngAAAAGAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5RyDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8txvn/WtH4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9m1Pj/MMf5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9uwNTGIXAAAAAgAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/nKIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/ynF
+f9Kzfj/ZtT4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/QMv5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8dsOGFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5TiDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8rxvn/QMv5/1bQ+P9m1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Sc34/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gwffwEWqHGAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/m7IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yHD+f9Ay/n/WtH4/2DS
+P9l1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/R8z4/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/HbHjeQAAAAQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5JiDD+fggw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9EzPj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9l1Pj/PMr5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/H77z1gxHWwsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/mBIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/Y9P4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9Z0fj/Lcb5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4+xum
1D0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5BCDD+cMgw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/2bU+P9n1Pj/Z9T4/2fU
+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2DS+P89yvn/IcP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/x636X4AAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kdIMP56yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f9Qz/j/Z9T4/2fU+P9n1Pj/Z9T4/2fU+P9n1Pj/Z9T4/2fU
+P9n1Pj/WND4/zvK+f8ixPn/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/x++8rkGJzIFIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+Ukgw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/JsT5/1TP+P9n1Pj/Z9T4/2fU+P9m1Pj/XdL4/07O+P8+yvn/KcX5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9t4ZmsUYIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5aSDD
+f4gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/JsT5/ynF
+f8lxPn/IcP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9+UdsOEoAAAAASDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/l0IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDC
+PEds+QxAAAAASDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+Wogw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDC+OgeuOozIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5VCDD+fggw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDB990ds+QlIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/k8IMP54iDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDB9r8dsuQXIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+RMgw/m0IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5+x/A9YIYkrsEIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ASDD+Wcgw/ntIMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IML4zh+/
9Dcgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5FCDD+Z4gw/n+IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/nvIMH3bSDD+QMgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5KyDD
+aUgw/n8IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+e0gwfd/IMP5ESDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5JSDD+ZMgw/nwIMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP51yDB93Igw/kMIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
AAAAAAAAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5CSDD+VMgw/mlIMP56CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/yDD+f8gw/n/IMP5/iDD
+dMgw/mMIMP5NyDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/krIMP5bCDD+Zkgw/nAIMP56CDD+f8gw/n/IMP5/yDD
+f8gw/n/IMP5/yDD+f8gw/n7IMP52yDD+bUgw/mMIMP5VyDD+RYgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AAAAAAAAAAAAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kIIMP5FCDD+SIgw/kxIMP5KyDD+R8gw/kRIMP5AyDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD
+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAIMP5ACDD+QAgw/kAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////////Af//////8AAAAP//
/////AB///////AAAAD///////AAH//////wAAAA///////AAAf/////8AAAAP//////AAAB//////AA
AAD//////AAAAH/////wAAAA/////+AAAAAf////8AAAAP////+AAAAAB/////AAAAD/////AAAAAAP/
///wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAP////wAAAA/////wAA
AAAD////8AAAAP////8AAAAAB/////AAAAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP//
//8AAAAAA/////AAAAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AA
AAD/////AAAAAAP////wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAP/
///wAAAA/////wAAAAAD////8AAAAP////8AAAAAA/////AAAAD/////AAAAAAf////wAAAA/////wAA
AAAH////8AAAAP////8AAAAAA/////AAAAD////+AAAAAAH////wAAAA/////AAAAAAA////8AAAAP//
//gAAAAAAH////AAAAD////gAAAAAAA////wAAAA////wAAAAAAAD///8AAAAP///4AAAAAAAAf///AA
AAD///8AAAAAAAAD///wAAAA///+AAAAAAAAAf//8AAAAP///AAAAAAAAAH///AAAAD///wAAAAAAAAA
///wAAAA///4AAAAAAAAAH//8AAAAP//8AAAAAAAAAA///AAAAD///AAAAAAAAAAP//wAAAA///gAAAA
AAAAAB//8AAAAP//wAAAAAAAAAAf//AAAAD//8AAAAAAAAAAD//wAAAA//+AAAAAAAAAAA//8AAAAP//
gAAAAAAAAAAH//AAAAD//4AAAAAAAAAAB//wAAAA//8AAAAAAAAAAAf/8AAAAP//AAAAAAAAAAAD//AA
AAD//wAAAAAAAAAAA//wAAAA//4AAAAAAAAAAAP/8AAAAP/+AAAAAAAAAAAB//AAAAD//gAAAAAAAAAA
Af/wAAAA//4AAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAAAf/wAAAA//wAAAAA
AAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAAAP/wAAAA//wAAAAAAAAAAAD/8AAAAP/8
AAAAAAAAAAAA//AAAAD//AAAAAAAAAAAAP/wAAAA//wAAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AA
AAD//AAAAAAAAAAAAf/wAAAA//wAAAAAAAAAAAH/8AAAAP/8AAAAAAAAAAAB//AAAAD//AAAAAAAAAAA
Af/wAAAA//4AAAAAAAAAAAH/8AAAAP/+AAAAAAAAAAAD//AAAAD//gAAAAAAAAAAA//wAAAA//4AAAAA
AAAAAAP/8AAAAP//AAAAAAAAAAAH//AAAAD//wAAAAAAAAAAB//wAAAA//8AAAAAAAAAAAf/8AAAAP//
gAAAAAAAAAAP//AAAAD//4AAAAAAAAAAD//wAAAA///AAAAAAAAAAB//8AAAAP//wAAAAAAAAAAf//AA
AAD//+AAAAAAAAAAP//wAAAA///gAAAAAAAAAD//8AAAAP//8AAAAAAAAAB///AAAAD///AAAAAAAAAA
///wAAAA///4AAAAAAAAAf//8AAAAP///AAAAAAAAAP///AAAAD///4AAAAAAAAD///wAAAA////AAAA
AAAAB///8AAAAP///4AAAAAAAB////AAAAD////AAAAAAAA////wAAAA////4AAAAAAAf///8AAAAP//
//AAAAAAAP////AAAAD////4AAAAAAP////wAAAA/////gAAAAAH////8AAAAP////+AAAAAH/////AA
AAD/////4AAAAH/////wAAAA//////gAAAP/////8AAAAP//////gAAf//////AAAAD///////wD////
///wAAAA////////////////8AAAAA==
</value>
</data>
</root>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{01C90EA0-0E78-4A2C-8D72-BE8101932585}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>LightCtrl</RootNamespace>
<AssemblyName>LightCtrl</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</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>
<ApplicationIcon>li.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="DevComponents.DotNetBar2, Version=12.1.0.0, Culture=neutral, PublicKeyToken=c39c3242a43eee2b, processorArchitecture=MSIL" />
<Reference Include="JunmpDALib">
<HintPath>..\Lib\JunmpDALib.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<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.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MyCache.cs" />
<Compile Include="FrmCfg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmCfg.Designer.cs">
<DependentUpon>FrmCfg.cs</DependentUpon>
</Compile>
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmMain.Designer.cs">
<DependentUpon>FrmMain.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="FrmCfg.resx">
<DependentUpon>FrmCfg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
<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>
</Compile>
<None Include="config.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<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="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\JmpCommon\JmpCommon.csproj">
<Project>{8662baf0-5206-4472-84af-2e44669c3e2c}</Project>
<Name>JmpCommon</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="li.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using JmpCommon;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LightCtrl
{
public static class MyCache
{
public static GpioCfg GpioCfg { get; set; }
public static GpioCfg LoadSystemStep()
{
try
{
var path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "config.json";
if (!File.Exists(path))
{
return default;
}
else
{
string json = File.ReadAllText(path, Encoding.Default);
var des_str = JmpDes.Decrypt(json);
if (string.IsNullOrEmpty(des_str))
{
return default;
}
else
{
var cfg = JsonConvert.DeserializeObject<GpioCfg>(des_str);
if (cfg == null)
{
return default;
}
else
{
return cfg;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
public static void SetSystemSetp()
{
if (GpioCfg != null)
{
var json = JsonConvert.SerializeObject(GpioCfg, Formatting.Indented);
if (string.IsNullOrEmpty(json)) { return; }
else
{
File.WriteAllText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "config.json", JmpDes.Encrypt(json), Encoding.UTF8);
}
}
}
}
public class GpioCfg
{
public string Address { get; set; }
public int Port { get; set; }
}
}
using DevComponents.DotNetBar;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LightCtrl
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
MessageBoxEx.EnableGlass = false;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string moduleName = Process.GetCurrentProcess().MainModule.ModuleName;
//返回指定路径字符串的文件名
string processName = System.IO.Path.GetFileNameWithoutExtension(moduleName);
//根据文件名创建进程资源数组
Process[] processes = Process.GetProcessesByName(processName);
//var reader = new ImpinjReader();
//reader.Connect("192.168.101.125");
//如果该数组长度大于1,说明多次运行
if (processes.Length > 1)
{
MessageBox.Show("已有另一个程序在运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
Process.GetCurrentProcess().Kill();
}
else
{
MyCache.GpioCfg = MyCache.LoadSystemStep();
if (MyCache.GpioCfg == default)
{
MessageBox.Show("配置文件加载失败,请检查", "文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
Process.GetCurrentProcess().Kill();
}
else
{
Application.Run(new FrmMain());
}
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("LightCtrl")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("LightCtrl")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("01c90ea0-0e78-4a2c-8d72-be8101932585")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本: 4.0.30319.42000
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace LightCtrl.Properties
{
/// <summary>
/// 强类型资源类,用于查找本地化字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.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 ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LightCtrl.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;
}
}
}
}
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace LightCtrl.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.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;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
8D34v22/9Z6CeNXJlXLMX22PUiT25/RMUj8Li/roUrY2DMvGHEtKXRgOdSpmGwpm
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" />
</packages>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="CommonServiceLocator" publicKeyToken="489b6accfaf20ef0" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5.0" newVersion="2.0.5.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
\ No newline at end of file
<Application x:Class="LiteChannel.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LiteChannel"
StartupUri="LoginWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Panuon.UI.Silver;component/Control.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBlock" x:Key="FiconBase">
<Setter Property="FontFamily" Value="pack://application:,,,/font/#iconfont" />
<Setter Property="Cursor" Value="Hand" />
</Style>
<Style x:Key="TextCenterStyle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="TextAlignment" Value="Center" />
</Style>
<Style x:Key="TextLeftStyle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="TextAlignment" Value="Left" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>
using LiteChannel.Commons;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace LiteChannel
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
private System.Threading.Mutex _mutex;
public App()
{
this.Startup += App_Startup;
}
void App_Startup(object sender, StartupEventArgs e)
{
_mutex = new System.Threading.Mutex(true, Process.GetCurrentProcess().ProcessName, out var ret);
if (!ret)
{
MessageBox.Show("已有另一个程序在运行!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);//弹出提示信息
Environment.Exit(0);
}
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
LiteCaChe.SysConfig = LiteCaChe.LoadSystemStep();
if (LiteCaChe.SysConfig == null)
{
//MessageBox.Show("配置文件加载失败,请检查", "文件错误", MessageBoxButton.OK, MessageBoxImage.Error);
//Process.GetCurrentProcess().Kill();
MessageBox.Show("配置文件加载失败,创建默认配置文件");
LiteCaChe.SysConfig = new Config();
LiteCaChe.SaveSystemStep(LiteCaChe.SysConfig);
}
else
{
var update = HttpHelper.GetUpdate(LiteCaChe.SysConfig?.AppCode ?? "");
if (update == null)
{
}
else
{
if (Version.TryParse(update.version2, out var version) && version > new Version(LiteCaChe.SysConfig.AppVersion))
{
if (MessageBox.Show("检测到新版本,是否更新?", "更新提示", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
System.Diagnostics.Process.Start("explorer.exe", LiteCaChe.SysConfig.DomainUrl.TrimEnd('/') + "/" + update.address.TrimStart('/'));
Process.GetCurrentProcess().Kill();
}
else { }
}
}
}
//获取供应商
LiteCaChe.EquInfos = HttpHelper.GetEquInfos();
}
}
}
<pu:WindowX x:Class="LiteChannel.AutoClosingMessageBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
Title="标题" Height="250" Width="400" Loaded="Window_Loaded" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" FontSize="14" >
<Window.Effect>
<DropShadowEffect BlurRadius="10" Color="#FF858484" Direction="90" ShadowDepth="2"/>
</Window.Effect>
<Grid >
<Grid x:Name="g_body" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<Label x:Name="lb_Message" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24" Margin="0,0,0,20">消息</Label>
<Button x:Name="btn_Submit" Grid.Row="2" pu:ButtonHelper.CornerRadius="4" FontSize="20" Content="确定" Margin="60,10,0,0" Height="40" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btn_Submit_Click"/>
<Button x:Name="btn_Cancel" Grid.Row="2" pu:ButtonHelper.CornerRadius="4" FontSize="20" Content="取消" Margin="200,10,0,0" Height="40" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btn_Cancel_Click" Grid.ColumnSpan="2"/>
</Grid>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Panuon.UI.Silver;
using Panuon.UI.Silver.Core;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Markup;
namespace LiteChannel
{
/// <summary>
/// AutoClosingMessageBox.xaml 的交互逻辑
/// </summary>
public partial class AutoClosingMessageBox : WindowX, IComponentConnector
{
private int _count = 0;
private System.Threading.Timer _timer;
private Action _callBack;
public AutoClosingMessageBox(Window window,string content, string title, int count, Action callback)
{
InitializeComponent();
Owner = window;
Title = " " + title;
lb_Message.Content = content;
_count = count;
_callBack = callback;
_timer = new System.Threading.Timer(TimerFunction, null, 0, 1000);
//居中弹出
this.Left = System.Windows.SystemParameters.PrimaryScreenWidth / 2 - this.Width / 2;
this.Top = System.Windows.SystemParameters.PrimaryScreenHeight / 2 - this.Height / 2;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
}
private void btn_Submit_Click(object sender, RoutedEventArgs e)
{
//执行
_timer.Dispose();
_callBack.BeginInvoke(null, null);
this.Close();
}
private void btn_Cancel_Click(object sender, RoutedEventArgs e)
{
_timer.Dispose();
this.Close();
}
private void TimerFunction(object state)
{
this.Dispatcher.Invoke(() => { btn_Submit.Content = $"确定({_count})"; });
if (_count < 0)
{
_timer.Dispose();
this.Dispatcher.Invoke(() => this.btn_Submit_Click(null, null));
}
_count--;
}
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Commons
{
public class Analyzingepc
{
public byte Header; // 标头(8bits): JY物资专用标头 0x11(00010001b)
public byte IssuerId; // 发行机构标识符(6bits):GA组织机构: 0x01(000001b) 国家组织机构:0x02(000010b)
public string OrganizationCode; // 组织机构代码(54bits):JY物资生产厂商使用GA或国家组织机构代码, 英文字母及数字的每一个字符转换为六位二进制
public byte WzdmLen; // 物资代码长度(4bits): 指定物资代码的长度(N*8bits), 此处为0x7
public UInt64 Wzdm; // 物资代码(56bits): 使用警用物资编目数据的物资代码,按十进制转换成十六进制存储
public UInt64 Hxdm;
public byte SerialLen; // 序列号长度(4bits): 指定序列号长度(N*8bits), 此处为0xD
public byte Ver; // 版本号(8bits): 0x01
public byte TagType; // 标签类型(8bits): 0x00 件标 0x01 箱标
public byte PackingType; // 包装类型(4bits): 0x1 单品, 0x2 外包装, 0x3 内包装, 0xF 零头配箱
public UInt32 ProductionDate; // 生产日期(24bits): 0x161201
public byte ExpiryDate; // 有效期值(6bits): 0-63
public byte ExpiryDateUnit; // 有效期时间单位(2bits): 1:01b-日, 2:10b-月, 3:11b-年
public byte SubPackageNum; // 下级包装内数量(8bits):最大255
public UInt16 WzCount; // 包装数量(12bits): MAX:4095, 每箱内产品总数
public UInt32 BoxNo; // 包装箱序列号(20bits): MAX:65535
public UInt16 NoInBox; // 箱内序列号(12bits): 每箱内产品序号, MAX4095
}
public static class EpcConvert
{
private readonly static string strKeyWords = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 无源标签6位字段对应表
/// <summary>
/// 此方法用于将普通字符串转换成16进制的字符串。
/// </summary>
/// <param name="_str">要转换的字符串。</param>
/// <returns></returns>
public static string StringToHex16String(string _str)
{
//将字符串转换成字节数组。
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(_str);
//定义一个string类型的变量,用于存储转换后的值。
string result = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
//将每一个字节数组转换成16进制的字符串,以空格相隔开。
result += Convert.ToString(buffer[i], 16) + " ";
}
return result;
}
/// <summary>
/// 此方法用于将16进制的字节数组转换成16进制的字符串。
/// </summary>
/// <param name="_hex16Byte">要转换的16进制的字节数组。</param>
/// <returns></returns>
public static string Hex16ByteToHex16String(byte[] _hex16Byte)
{
string result = string.Empty;
//如果字节数组不为空。
if (_hex16Byte != null)
{
for (int i = 0; i < _hex16Byte.Length; i++)
{
//将每一个字节数组转换成16进制string类型的字符串,用空格分隔开。
result += _hex16Byte[i].ToString("X2") + " ";
}
}
return result;
}
public static byte[] ToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
{
hexString = hexString + " ";
}
byte[] buffer = new byte[hexString.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 0x10);
}
return buffer;
}
/// <summary>
/// 生成EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static byte[] EpcGen(Analyzingepc epc)
{
byte[] buf = new byte[40];
int pos = 0;
SetData(ref buf, pos, 8, epc.Header);
pos += 8;
SetData(ref buf, pos, 6, epc.IssuerId);
pos += 6;
SetData(ref buf, pos, 54, OrganizationCodeTo6Bin(epc.OrganizationCode.ToUpper()));
pos += 54;
SetData(ref buf, pos, 4, epc.WzdmLen);
pos += 4;
var wzlen = ((epc.WzdmLen - 1) % 8) * 8;
SetData(ref buf, pos, wzlen, epc.Wzdm); // 物资代码暂时定义最长为64bits
pos += wzlen;
SetData(ref buf, pos, 8, epc.Hxdm); // 物资代码暂时定义最长为64bits
pos += 8;
SetData(ref buf, pos, 4, epc.SerialLen);
pos += 4;
SetData(ref buf, pos, 8, epc.Ver);
pos += 8;
SetData(ref buf, pos, 8, epc.TagType);
pos += 8;
SetData(ref buf, pos, 4, epc.PackingType);
pos += 4;
SetData(ref buf, pos, 24, epc.ProductionDate);
pos += 24;
SetData(ref buf, pos, 6, epc.ExpiryDate);
pos += 6;
SetData(ref buf, pos, 2, epc.ExpiryDateUnit);
pos += 2;
SetData(ref buf, pos, 8, epc.SubPackageNum);
pos += 8;
SetData(ref buf, pos, 12, epc.WzCount);
pos += 12;
SetData(ref buf, pos, 20, epc.BoxNo);
pos += 20;
SetData(ref buf, pos, 12, epc.NoInBox);
pos += 12;
// 双字节对齐, 剩余保留区
if (pos % 16 != 0)
{
pos += 16 - pos % 16;
}
// 数据体长度
var len = pos / 8;
var crc = Crc16(buf, len);
SetData(ref buf, pos, 16, crc);
byte[] rtn = new byte[len + 2];
Array.Copy(buf, rtn, len + 2);
return rtn;
}
/// <summary>
/// 解析EPC
/// </summary>
/// <param name="epc"></param>
/// <returns></returns>
public static Analyzingepc EpcAnlysing(byte[] epc)
{
// CRC 校验
var crc_chk = Crc16(epc, epc.Length - 2);
var crc_src = epc[epc.Length - 2] << 8 | epc[epc.Length - 1];
if (crc_src != crc_chk)
{
throw new Exception("CRC校验失败");
}
// 数据解析
Analyzingepc rtn = new Analyzingepc();
int pos = 0;
rtn.Header = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.IssuerId = (byte)GetData(epc, pos, 6);
pos += 6;
var oc = GetData(epc, pos, 54);
rtn.OrganizationCode = OrganizationCodeToStr(oc);
pos += 54;
rtn.WzdmLen = (byte)(GetData(epc, pos, 4));
pos += 4;
var wzlen = ((rtn.WzdmLen - 1) % 8) * 8;
rtn.Wzdm = GetData(epc, pos, wzlen);
pos += wzlen;
rtn.Hxdm = GetData(epc, pos, 8);
pos += 8;
rtn.SerialLen = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.Ver = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.TagType = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.PackingType = (byte)GetData(epc, pos, 4);
pos += 4;
rtn.ProductionDate = (UInt32)GetData(epc, pos, 24);
pos += 24;
rtn.ExpiryDate = (byte)GetData(epc, pos, 6);
pos += 6;
rtn.ExpiryDateUnit = (byte)GetData(epc, pos, 2);
pos += 2;
rtn.SubPackageNum = (byte)GetData(epc, pos, 8);
pos += 8;
rtn.WzCount = (UInt16)GetData(epc, pos, 12);
pos += 12;
rtn.BoxNo = (UInt32)GetData(epc, pos, 20);
pos += 20;
rtn.NoInBox = (UInt16)GetData(epc, pos, 12);
pos += 12;
return rtn;
}
/// <summary>
/// 向目标数组指定位置插入数据
/// </summary>
/// <param name="data">待操作数组</param>
/// <param name="pos">起始位置</param>
/// <param name="len">写入长度bits</param>
/// <param name="value">写入的值</param>
private static void SetData(ref byte[] data, int pos, int len, UInt64 value)
{
int p = pos;
while (--len >= 0)
{
var bitPos = 7 - p % 8;
data[p++ / 8] |= (byte)(((value >> len) & 1) << bitPos);
}
}
/// <summary>
/// 从目标数组获取成员变量
/// </summary>
/// <param name="data"></param>
/// <param name="pos"></param>
/// <param name="len"></param>
/// <returns></returns>
private static UInt64 GetData(byte[] data, int pos, int len)
{
UInt64 rtn = 0;
int p = pos;
while (len-- > 0)
{
var bitPos = 7 - p % 8;
rtn <<= 1;
rtn |= (byte)((data[p++ / 8] >> bitPos) & 1);
}
return rtn;
}
/// <summary>
/// 转换成字符串
/// </summary>
/// <param name="icode"></param>
/// <returns></returns>
private static string OrganizationCodeToStr(UInt64 icode)
{
string code = "";
for (int i = 0; i < 9; i++)
{
var v = (byte)((icode >> (i * 6)) & 0x3f);
code = strKeyWords[v] + code;
}
return code;
}
/// <summary>
/// 生成十六进制组织代码, 6Bin
/// </summary>
/// <param name="code"></param>
/// <returns>0 失败, 其它:正常的组织代码编号</returns>
private static UInt64 OrganizationCodeTo6Bin(string code)
{
UInt64 iCode = 0;
if (code.Length == 9)
{
for (int i = 0; i < code.Length; i++)
{
var index = strKeyWords.IndexOf(code[i]);
if (index == -1)
{
throw new Exception("输入字符非法!");
}
iCode <<= 6;
iCode |= (byte)index;
}
}
else
{
throw new Exception("输入长度非法!");
}
return iCode;
}
/// <summary>
/// CRC运算
/// </summary>
/// <param name="data"></param>
/// <param name="len">必须是偶数</param>
/// <returns></returns>
public static UInt16 Crc16(byte[] data, int lenth)
{
ushort crc = 0x8791;
for (int i = 0; i < lenth; ++i)
{
ushort temp = 0;
ushort a = (ushort)(((crc >> 8) ^ (0xff & data[i])) << 8);
for (int j = 0; j < 8; ++j)
{
if (((temp ^ a) & 0x8000) != 0)
{
temp = (ushort)((temp << 1) ^ 0x1021);
}
else
{
temp <<= 1;
}
a <<= 1;
}
crc = (ushort)((crc << 8) ^ temp);
}
return crc;
}
}
}
using LiteChannel.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace LiteChannel.Commons
{
/// <summary>
/// 接口调用类
/// </summary>
public class HttpHelper
{
public static string HttpPost(string strUrl, string json = "")
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Method = "POST";
if (!string.IsNullOrEmpty(json))
{
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(json);
request.ContentLength = data.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
}
else { request.ContentLength = 0; }
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
response.Close();
return retString;
}
catch (Exception ex)
{
Log.ErrorLog(ex.Message.ToString() + "\r\n" + strUrl);
return string.Empty;
}
}
public static string HttpGet(string strUrl)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
response.Close();
return retString;
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n" + strUrl);
return string.Empty;
}
}
/// <summary>
/// 获取软件更新
/// </summary>
/// <param name="appCode"></param>
/// <returns></returns>
public static soft_update GetUpdate(string appCode)
{
try
{
var parame = JsonConvert.SerializeObject(new
{
appCode = appCode
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.SoftUpdate, parame);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取更新信息失败", "更新失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<soft_update>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取更新信息失败", "更新失败");
return default;
}
else
{
Log.WorkLog("获取更新信息成功", "更新成功");
return res_data.data;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取物资信息
/// </summary>
/// <returns></returns>
public static List<equ_info> GetEquInfos()
{
try
{
var body_par = string.Empty;
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<equ_info>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetEquInfo, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取获取装备基础信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<equ_info>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取获取装备基础信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取获取装备基础信息成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取仓库信息
/// </summary>
/// <returns></returns>
public static List<store_info> GetStoreInfos()
{
try
{
var body_par = string.Empty;
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<store_info>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetStoreInfo, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取获取仓库基础信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<store_info>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取获取仓库基础信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取获取仓库基础信息成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取单据信息
/// </summary>
/// <returns></returns>
public static PagedList<order_info> GetOrderInfos(int page = 1, int size = 10, string orderType = "")
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
page = page - 1,
size = size,
orderType = orderType,
warehouseId = LiteCaChe.SysConfig.WarehouseID
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new PagedList<order_info>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetOrderInfo, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取获取单据信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取获取单据信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取获取单据信息成功", "获取成功");
JObject obj = JObject.Parse(json);
var orders = JsonConvert.DeserializeObject<PagedList<order_info>>(obj["data"].ToString());
return orders;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取单据信息
/// </summary>
/// <returns></returns>
public static List<order_detail> GetOrderDetails(string orderid, string type)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
id = orderid,
warehouseId = LiteCaChe.SysConfig.WarehouseID,
type = type
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<order_detail>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetOrderDetail, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("获取获取单据明细信息失败", "获取失败");
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<order_detail>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog("获取获取单据明细信息失败", "获取失败");
return default;
}
else
{
Log.WorkLog("获取获取单据明细信息成功", "获取成功");
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 用户登录
/// </summary>
/// <param name="userName"></param>
/// <param name="userPwd"></param>
/// <returns></returns>
public static respone_user UserLogin(string userName, string userPwd)
{
try
{
var param = JsonConvert.SerializeObject(new { username = userName, password = userPwd });
var json = HttpPost(LiteCaChe.SysConfig.UserLogin, param);
if (string.IsNullOrEmpty(json))
{
return null;
}
else
{
var res_data = JObject.Parse(json);
var jobj = JObject.Parse(json);
if (!jobj.HasValues)
{
return null;
}
else
{
var user = JsonConvert.DeserializeObject<respone_user>(json);
return user;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n", MethodBase.GetCurrentMethod().Name);
return default;
}
}
/// <summary>
/// 获取平台警员信息
/// </summary>
/// <returns></returns>
public static List<sync_police> GetPoliceInfo()
{
try
{
if (string.IsNullOrEmpty(LiteCaChe.OrgId ?? ""))
{
Log.WorkLog($"平台人员同步信息获取失败,组织机构为空");
return default;
}
else
{
var body_par = JsonConvert.SerializeObject(new { orgId = LiteCaChe.OrgId });
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new List<sync_police>();
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetPolices, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<sync_police>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"平台人员同步信息获取失败,{json}");
return default;
}
else
{
return res_data.data;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 获取警员图片
/// </summary>
/// <returns></returns>
public static byte[] GetPoliceImg(string url)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(LiteCaChe.SysConfig.DomainUrl + url);
request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream st = response.GetResponseStream())
{
using (MemoryStream ms = new MemoryStream())
{
st.CopyTo(ms);
var buffer = ms.GetBuffer();
st.Close();
ms.Close();
response.Close();
return buffer;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 上传人脸照片
/// </summary>
/// <param name="buffer"></param>
/// <param name="fileName"></param>
/// <param name="directoy"></param>
/// <returns></returns>
public static bool UploadFace(byte[] buffer, string fileName, string id)
{
try
{
if (buffer == null || buffer.Length == 0)
{
return false;
}
else if (string.IsNullOrEmpty(id))
{
return false;
}
else
{
var _url = LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.UploadFace;
using (HttpClient client = new HttpClient())
{
var postContent = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
postContent.Add(new ByteArrayContent(buffer), "picture", fileName);
postContent.Add(new StringContent(id), "id");
using (HttpResponseMessage response = client.PostAsync(_url, postContent).Result)
{
var str = response.Content.ReadAsStringAsync().Result;
var res = JsonConvert.DeserializeObject<respone_upload>(str);
if (res.code == 10000)
{
Log.WorkLog("人脸图片上传成功", "图片上传");
return true;
}
else
{
Log.WorkLog(res.msg);
return false;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 更新指纹信息
/// </summary>
/// <param name="fingerList"></param>
/// <param name="policeId"></param>
/// <returns></returns>
public static bool UpdateFinger(string policeId, List<FingerInfo> fingerList)
{
try
{
if (fingerList == null || fingerList.Count == 0)
{
return false;
}
else if (string.IsNullOrEmpty(policeId))
{
return false;
}
else
{
var body_par = JsonConvert.SerializeObject(new
{
policeId = policeId,
fingerList = fingerList
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.UpdateFinger, param);
if (string.IsNullOrEmpty(json))
{
return false;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"指纹数据更新失败,JSON\r\n {json} ");
return false;
}
else
{
return true;
}
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 提交入库
/// </summary>
/// <param name="type"></param>
/// <param name="eps"></param>
/// <returns></returns>
public static Tuple<bool, string> RfidInStore(string type, List<rfid_info> eps)
{
try
{
var body_par = JsonConvert.SerializeObject(new upload_info
{
orgId = LiteCaChe.OrgId,
currentState = "1",
picUrl = string.Empty,
policeId = LiteCaChe.PoliceId,
RFIDList = eps,
warehouseId = LiteCaChe.SysConfig.WarehouseID
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new Tuple<bool, string>(false, "签名值生成失败");
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.UploadUrl, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("装备入库失败", "入库失败");
return new Tuple<bool, string>(false, "装备入库失败");
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<rfid_res>>>(json);
if (res_data == null || res_data.code != 10000
|| res_data.data == null || res_data.data.Count == 0)
{
Log.WorkLog($"装备入库失败,{json}", "入库失败");
if (res_data != null && res_data.code != 10000)
{
return new Tuple<bool, string>(false, "装备入库失败:" + res_data.msg);
}
else
{
return new Tuple<bool, string>(false, "装备入库失败");
}
}
else
{
var successCount = res_data.data.Count(x => x.currentState == 0);
var failCount = eps.Count - successCount;
var failEpcList = eps.Where(x =>
res_data.data.Where(y => y.currentState == 0).Count(y => y.epc == x.RFID) == 0)
.Select(x => x.RFID);
Log.WorkLog(
$"装备入库成功{successCount}条,失败{failCount}条:{JsonConvert.SerializeObject(failEpcList)}",
"入库成功");
//智能货架推送
if (LiteCaChe.SysConfig.IsEnabledShelf && successCount > 0)
{
var epcListRes = GetInvListByEpc(res_data.data.Where(x => x.currentState == 0).Select(x => x.epc).ToList());
if (epcListRes.Item1)
{
//直接推送
var shelfRes = HttpPost(LiteCaChe.SysConfig.ShelfAddress, epcListRes.Item2);
if (string.IsNullOrEmpty(shelfRes))
{
Log.WorkLog("智能货架推送响应失败", "智能货架推送失败");
return new Tuple<bool, string>(true, $"装备入库成功{successCount}条,失败{failCount}条,智能货架推送响应失败");
}
else
{
var shelfRes_data = JsonConvert.DeserializeObject<respone>(shelfRes);
if (shelfRes_data == null || shelfRes_data.code != 1000)
{
Log.WorkLog($"智能货架推送响应失败,{shelfRes_data}", "智能货架推送失败");
return new Tuple<bool, string>(true, $"装备入库成功{successCount}条,失败{failCount}条,智能货架推送响应失败");
}
else
{
return new Tuple<bool, string>(true, $"装备入库成功{successCount}条,失败{failCount}条,智能货架推送成功");
}
}
}
else
{
Log.WorkLog($"获取物资信息失败", "智能货架推送失败");
return new Tuple<bool, string>(true, $"装备入库成功{successCount}条,失败{failCount}条,,获取物资信息失败");
}
}
return new Tuple<bool, string>(true, $"装备入库成功{successCount}条,失败{failCount}条");
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 提交出库
/// </summary>
/// <param name="order"></param>
/// <param name="eps"></param>
/// <returns></returns>
public static Tuple<bool, string> RfidOutStore(string order, string type, List<rfid_info> eps)
{
try
{
var body_par = JsonConvert.SerializeObject(new upload_info
{
orgId = LiteCaChe.OrgId,
currentState = "0",
picUrl = string.Empty,
policeId = LiteCaChe.PoliceId,
RFIDList = eps,
warehouseId = LiteCaChe.SysConfig.WarehouseID
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new Tuple<bool, string>(false, "签名值生成失败");
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.UploadUrl, param);
//Log.DebugLog("jsonres" + json);
//Log.DebugLog("jsonreq" + param);
//Log.DebugLog("url" + LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.UploadUrl);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("装备出库失败", "出库失败");
return new Tuple<bool, string>(false, "装备出库失败");
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<rfid_res>>>(json);
if (res_data == null || res_data.code != 10000
|| res_data.data == null || res_data.data.Count == 0)
{
Log.WorkLog($"装备出库失败,{json}", "出库失败");
if (res_data != null && res_data.code != 10000)
{
return new Tuple<bool, string>(false, "装备出库失败:" + res_data.msg);
}
else
{
return new Tuple<bool, string>(false, "装备出库失败");
}
}
else
{
var successCount = res_data.data.Count(x => new[] { 1, 2, 8, 14, 15, 17 }.Contains(x.currentState));
var failCount = eps.Count - successCount;
var failEpcList = eps.Where(x =>
res_data.data.Where(y => new[] { 1, 2, 8, 14, 15, 17 }.Contains(y.currentState)).Count(y => y.epc == x.RFID) == 0)
.Select(x => x.RFID);
var message = $"装备出库成功{successCount}条,失败{failCount}条";
var safeWarringList = res_data.data.Where(x => x.safeLevel == 1).ToList();
var safeDangerList = res_data.data.Where(x => x.safeLevel == 2).ToList();
if (safeDangerList.Count > 0)
{
message += $"\r\n警告:存在已过期装备{safeDangerList.Count}件。装备名:{string.Join(",", safeDangerList.Select(x => x.name).Distinct())},请立即联系仓管员处理";
}
if (safeWarringList.Count > 0)
{
message += $"\r\n提醒:存在即将过期装备{safeWarringList.Count}件。装备名:{string.Join(",", safeWarringList.Select(x => x.name).Distinct())}";
}
Log.WorkLog($"{message}:{JsonConvert.SerializeObject(failEpcList)}", "出库成功");
return new Tuple<bool, string>(true, message);
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取箱标内epc信息
/// </summary>
/// <param name="appCode"></param>
/// <returns></returns>
public static List<response_BoxMarkModel> GetEpcListByBoxMarkEpc(List<string> boxMarkEpcList)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
epcList = boxMarkEpcList.Select(x => new
{
epc = x
})
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetEpcListByBoxMarkEpc, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<response_BoxMarkModel>>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"箱标获取失败,JSON\r\n {json} ");
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 获取仓库信息(锁库情况)
/// </summary>
/// <returns></returns>
public static BaseJpWarehouse GetWarehouseState()
{
try
{
if (string.IsNullOrEmpty(LiteCaChe.SysConfig.WarehouseID ?? ""))
{
Log.WorkLog($"仓库信息获取失败,仓库id为空");
return default;
}
var body_par = JsonConvert.SerializeObject(new { id = LiteCaChe.SysConfig.WarehouseID });
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetWarehouseById, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<BaseJpWarehouse>>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"仓库信息获取失败,{json}");
return default;
}
else
{
return res_data.data;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 设置仓库锁库状态
/// </summary>
/// <param name="isLocked">0:解除锁库,1:锁库</param>
/// <returns></returns>
public static bool SetWarehouseState(int isLocked)
{
try
{
if (string.IsNullOrEmpty(LiteCaChe.SysConfig.WarehouseID ?? ""))
{
Log.WorkLog($"设置仓库锁库状态,仓库id为空");
return default;
}
var body_par = JsonConvert.SerializeObject(new
{
warehouseId = LiteCaChe.SysConfig.WarehouseID,
isLocked = isLocked
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return default;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.SetWarehouseState, param);
if (string.IsNullOrEmpty(json))
{
return default;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"设置仓库锁库状态,{json}");
return default;
}
else
{
return true;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString() + "\r\n");
return default;
}
}
/// <summary>
/// 根据EPC集合获取物资信息
/// </summary>
/// <param name="type"></param>
/// <param name="eps"></param>
/// <returns></returns>
public static Tuple<bool, string> GetInvListByEpc(List<string> eps)
{
try
{
var data = new
{
EPCList = new List<dynamic>()
};
foreach (var epc in eps)
{
data.EPCList.Add(new { epc = epc });
}
var body_par = JsonConvert.SerializeObject(data);
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return new Tuple<bool, string>(false, "签名值生成失败");
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.GetInvListByEpc, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("根据EPC集合获取物资信息失败", "入库失败");
return new Tuple<bool, string>(false, "根据EPC集合获取物资信息失败");
}
else
{
var res_data = JsonConvert.DeserializeObject<respone<List<dynamic>>>(json);
if (res_data == null || res_data.code != 10000
|| res_data.data == null || res_data.data.Count == 0)
{
Log.WorkLog($"根据EPC集合获取物资信息失败,{json}", "入库失败");
return new Tuple<bool, string>(false, "根据EPC集合获取物资信息失败");
}
else
{
//返回json
return new Tuple<bool, string>(true, json);
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 开启单据(出库用)
/// </summary>
/// <param name="order"></param>
/// <param name="eps"></param>
/// <returns></returns>
public static bool OpenOrderWork(order_info order)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
id = order.id,
type = order.orderType,
warehouseId = LiteCaChe.SysConfig.WarehouseID
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.OpenOrderWorkUrl, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("开启单据失败,请重试", "开启单据失败");
return false;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"$开启单据失败:{res_data?.msg},请重试", "开启单据失败");
return false;
}
else
{
//Log.WorkLog($"开启单据成功,{json}", "开启单据成功");
return true;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// 关闭单据(借用 调拨使用)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static bool CloseOrder(string id,string type)
{
try
{
var body_par = JsonConvert.SerializeObject(new
{
id = id,
organizationId = LiteCaChe.OrgId,
userId=LiteCaChe.UserId,
type= type,
});
var body_result = GetBody(body_par);
if (body_result == null)
{
Log.WorkLog("签名值生成失败。");
return false;
}
else
{
var param = JsonConvert.SerializeObject(new request_sign
{
appKey = LiteCaChe.SysConfig.AppKey,
body = body_result.Item1,
sign = body_result.Item2,
timestamp = body_result.Item3,
version = LiteCaChe.SysConfig.ApiVersion,
orgId = LiteCaChe.OrgId,
});
var json = HttpPost(LiteCaChe.SysConfig.DomainUrl + LiteCaChe.SysConfig.CloseOrderUrl, param);
if (string.IsNullOrEmpty(json))
{
Log.WorkLog("关闭单据失败,请重试", "关闭单据失败");
return false;
}
else
{
var res_data = JsonConvert.DeserializeObject<respone>(json);
if (res_data == null || res_data.code != 10000)
{
Log.WorkLog($"$关闭单据失败:{res_data?.msg},请重试", "关闭单据失败");
return false;
}
else
{
//Log.WorkLog($"开启单据成功,{json}", "开启单据成功");
return true;
}
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return default;
}
}
/// <summary>
/// http下载文件
/// </summary>
/// <param name="url">下载文件地址</param>
/// <param name="path">文件存放地址,包含文件名</param>
/// <returns></returns>
public static bool HttpDownload(string url, string path)
{
string tempPath = System.IO.Path.GetDirectoryName(path) + @"\temp";
System.IO.Directory.CreateDirectory(tempPath); //创建临时文件目录
string tempFile = tempPath + @"\" + System.IO.Path.GetFileName(path) + ".temp"; //临时文件
if (System.IO.File.Exists(tempFile))
{
System.IO.File.Delete(tempFile); //存在则删除
}
try
{
FileStream fs = new FileStream(tempFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//创建本地文件写入流
//Stream stream = new FileStream(tempFile, FileMode.Create);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
//stream.Write(bArr, 0, size);
fs.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
//stream.Close();
fs.Close();
responseStream.Close();
System.IO.File.Move(tempFile, path);
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 获取文件的MD5码
/// </summary>
/// <param name="fileName">传入的文件名(含路径及后缀名)</param>
/// <returns></returns>
public static string GetMD5HashFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, System.IO.FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception ex)
{
throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
private static Tuple<string, string, string> GetBody(string json)
{
try
{
var timespan = GetTimeStamp();
var body = System.Web.HttpUtility.UrlEncode(json);
var content = $"{LiteCaChe.SysConfig.SecretKey}{timespan}{LiteCaChe.SysConfig.ApiVersion}{body}";
var sign = GetMd5(content);
return new Tuple<string, string, string>(body, sign, timespan);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return null;
}
}
private static string GetMd5(string txt)
{
//初始化MD5对象
using (MD5 md5 = MD5.Create())
{
//将源字符串转化为byte数组
byte[] soucebyte = Encoding.UTF8.GetBytes(txt);
//soucebyte转化为mf5的byte数组
byte[] md5bytes = md5.ComputeHash(soucebyte);
//将md5的byte数组再转化为MD5数组
StringBuilder sb = new StringBuilder();
foreach (byte b in md5bytes)
{
//x表示16进制,2表示2位
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
}
private static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Commons
{
public class JmpDes
{
/// <summary> 加密字符串
/// </summary>
/// <param name="strText">需被加密的字符串</param>
/// <param name="strEncrKey">密钥</param>
/// <returns></returns>
public static string Encrypt(string strText, string strKey = "jMp838668")
{
try
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byKey = Encoding.UTF8.GetBytes(strKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch
{
return "";
}
}
/// <summary> 解密字符串
/// </summary>
/// <param name="strText">需被解密的字符串</param>
/// <param name="sDecrKey">密钥</param>
/// <returns></returns>
public static string Decrypt(string strText, string strKey = "jMp838668")
{
try
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = new Byte[strText.Length];
byKey = Encoding.UTF8.GetBytes(strKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
Encoding encoding = new UTF8Encoding();
return encoding.GetString(ms.ToArray());
}
catch
{
return string.Empty;
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Commons
{
public class Log
{
//private static
private static StreamWriter sr;
private static readonly object syncWorkObj = new object();
private static readonly object syncErrorObj = new object();
private static readonly object syncDebugObj = new object();
private static bool bEnableWorkLog = true;
private static bool bEnableErrorLog = true;
private static bool bEnableDebugLog = true;
public Log()
{
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableWorkLog(bool enable)
{
bEnableWorkLog = enable;
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableErrorLog(bool enable)
{
bEnableErrorLog = enable;
}
/// <summary>
/// Log 启用
/// </summary>
/// <param name="enable"></param>
public static void EnableDebugLog(bool enable)
{
bEnableDebugLog = enable;
}
/// <summary>
/// 工作日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void WorkLog(string logTxt, [CallerMemberName] string ModuleName = default)
{
lock (syncWorkObj)
{
if (bEnableWorkLog)
{
WriteLine(logTxt, ModuleName, "WorkLog/");
}
}
}
/// <summary>
/// 异常日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void ErrorLog(string logTxt, [CallerMemberName] string ModuleName = default)
{
lock (syncErrorObj)
{
if (bEnableErrorLog)
{
WriteLine(logTxt, ModuleName, "ErrorLog/");
}
}
}
/// <summary>
/// 异常日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
public static void DebugLog(string logTxt, [CallerMemberName] string ModuleName = null)
{
lock (syncDebugObj)
{
if (bEnableDebugLog)
{
WriteLine(logTxt, ModuleName, "WorkLog/");
}
}
}
/// <summary>
/// 写日志
/// </summary>
/// <param name="logTxt"></param>
/// <param name="ModuleName"></param>
/// <param name="pathName"></param>
private static void WriteLine(string logTxt, string ModuleName, string pathName)
{
try
{
string logPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + pathName
+ DateTime.Now.ToString("yyyyMMdd") + ".log";
ClearFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + pathName);
logTxt = string.Format(" {0}|{1}|{2}",
DateTime.Now.ToString("yyyy-MM-dd HH:mm"),
ModuleName,
logTxt);
sr = new StreamWriter(logPath, true, Encoding.Default);
sr.WriteLine(logTxt);
sr.Close();
}
catch { }
}
/// <summary>
/// 日志清除文件
/// </summary>
/// <param name="FilePath"></param>
private static void ClearFile(string FilePath)
{
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
String[] Files = Directory.GetFiles(FilePath);
if (Files.Length > 30)
{
for (int i = 0; i < 1; i++)
{
try
{
File.Delete(Files[i]);
}
catch
{
}
}
}
}
}
}
using GalaSoft.MvvmLight;
using LiteChannel.Commons;
using LiteChannel.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace LiteChannel
{
public static class LiteCaChe
{
public static List<sync_police> PoliceList { get; set; }
public static string OrgId { get; set; }
public static string PoliceId { get; set; }
public static string UserId { get; set; }
public static List<equ_info> EquInfos { get; set; }
public static Config SysConfig { get; set; }
public static Config LoadSystemStep()
{
var v_path = AppDomain.CurrentDomain.BaseDirectory + "config.json";
if (!File.Exists(v_path))
{
return null;
}
else
{
var v_json = File.ReadAllText(v_path, Encoding.Default);
var des_str = JmpDes.Decrypt(v_json);
if (string.IsNullOrEmpty(des_str))
{
return null;
}
else
{
var config = JsonConvert.DeserializeObject<Config>(des_str);
//预处理
if (config.DomainUrl == "http://41.204.7.134:18761/api/service")
{
config.DomainUrl = "http://41.190.20.132:18761/api/service";
}
if (config.UserLogin == "http://41.204.7.134:10004/auth/userLogin")
{
config.UserLogin = "http://41.190.20.132:10004/auth/userLogin";
}
return config;
}
}
}
public static bool SaveSystemStep(Config config)
{
try
{
if (config == null) { return false; }
else
{
var json = JsonConvert.SerializeObject(config, Formatting.Indented);
if (string.IsNullOrEmpty(json))
{
return false;
}
else
{
System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "config.json", JmpDes.Encrypt(json), Encoding.UTF8);
return true;
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString(), MethodBase.GetCurrentMethod().Name);
return false;
}
}
}
//public class Config : ViewModelBase
//{
// private string _domainUrl = string.Empty;
// private string _userLogin = string.Empty;
// private string _appTitle = string.Empty;
// private string _appCode = string.Empty;
// private string _softUpdate = string.Empty;
// private int _appVersion = 100;
// /// <summary>
// /// 接口域名
// /// </summary>
// public string DomainUrl
// {
// get
// {
// return _domainUrl;
// }
// set
// {
// _domainUrl = value;
// RaisePropertyChanged();
// }
// }
// /// <summary>
// /// 登录
// /// </summary>
// public string UserLogin
// {
// get
// {
// return _userLogin;
// }
// set
// {
// _userLogin = value;
// RaisePropertyChanged();
// }
// }
// public string AppTitle
// {
// get
// {
// return _appTitle;
// }
// set
// {
// _appTitle = value;
// RaisePropertyChanged();
// }
// }
// public int AppVersion
// {
// get
// {
// return _appVersion;
// }
// set
// {
// _appVersion = value;
// RaisePropertyChanged();
// }
// }
// public string AppCode
// {
// get
// {
// return _appCode;
// }
// set
// {
// _appCode = value;
// RaisePropertyChanged();
// }
// }
// public string SoftUpdate
// {
// get
// {
// return _softUpdate;
// }
// set
// {
// _softUpdate = value;
// RaisePropertyChanged();
// }
// }
// private string _equInfo = string.Empty;
// public string GetEquInfo
// {
// get { return _equInfo; }
// set { _equInfo = value; }
// }
// private string _storeInfo = string.Empty;
// public string GetStoreInfo
// {
// get { return _storeInfo; }
// set { _storeInfo = value; }
// }
// private string _orderInfo = string.Empty;
// public string GetOrderInfo
// {
// get { return _orderInfo; }
// set { _orderInfo = value; }
// }
// private string _orderDetail = string.Empty;
// public string GetOrderDetail
// {
// get { return _orderDetail; }
// set { _orderDetail = value; }
// }
// private string _comMouth = string.Empty;
// public string ComMouth
// {
// get { return _comMouth; }
// set { _comMouth = value; }
// }
// private string _warehouseID = string.Empty;
// public string WarehouseID
// {
// get { return _warehouseID; }
// set { _warehouseID = value; }
// }
// private string _uploadUrl = string.Empty;
// public string UploadUrl
// {
// get { return _uploadUrl; }
// set { _uploadUrl = value; }
// }
// private string _openOrderWorkUrl = string.Empty;
// public string OpenOrderWorkUrl
// {
// get { return _openOrderWorkUrl; }
// set { _openOrderWorkUrl = value; }
// }
// public string ApiVersion { get; set; }
// public string AppKey { get; set; }
// public string SecretKey { get; set; }
// public string GetPolices { get; set; }
// private string faceAddress = string.Empty;
// public string FaceAddress
// {
// get { return faceAddress; }
// set { faceAddress = value; }
// }
// private string faceUser = string.Empty;
// public string FaceUser
// {
// get { return faceUser; }
// set { faceUser = value; }
// }
// private string facePwd = string.Empty;
// public string FacePwd
// {
// get { return facePwd; }
// set { facePwd = value; }
// }
// private string facePort = string.Empty;
// public string FacePort
// {
// get { return facePort; }
// set { facePort = value; }
// }
// public string UploadFace { get; set; }
// public string UpdateFinger { get; set; }
// public bool IsUseFace
// {
// get; set;
// }
// [JsonIgnore]
// public static new bool IsInDesignModeStatic { get; }
//}
public class Config : ViewModelBase
{
public Config()
{
AppTitle = "充电台出入库v" + Application.ResourceAssembly.GetName().Version;
AppVersion = Application.ResourceAssembly.GetName().Version.ToString();
AppCode = "10003";
DomainUrl = "http://41.190.20.132:18761/api/service";
UserLogin = "http://41.190.20.132:10004/auth/userLogin";
SoftUpdate = "/api/SoftUpdate/GetLastUpdate";
GetEquInfo = "/api/EquipmentDetail/GetListEquipmentDetail";
GetStoreInfo = "/api/Warehouse/GetListWarehouse";
GetOrderInfo = "/api/Inventory/GetOrderInfo";
GetOrderDetail = "/api/Inventory/GetOrderDetail";
ComMouth = "COM4";
WarehouseID = "d8192b23-0ec9-4b2e-a47d-f6780a66a880";
UploadUrl = "/api/Inventory/UploadRFIDNew";
OpenOrderWorkUrl = "/api/Inventory/OpenThisOrderAndCloseOther";
CloseOrderUrl = "/api/Inventory/CloseOrder";
ApiVersion = "1.0";
AppKey = "q6t0lEKOmMg5Tm+dg3XdZQ==";
SecretKey = "ba4d855b3b83eab441a51ea9bd9d9671";
GetPolices = "/api/ChannelCfg/GetOrgStaff";
FaceAddress = "192.168.8.35";
FaceUser = "admin";
FacePwd = "junmp123";
FacePort = "8000";
UploadFace = "/api/ChannelCfg/UploadFace";
UpdateFinger = "/api/ChannelCfg/UpdateFinger";
IsUseFace = true;
IsEnabledShelf = false;
ShelfAddress = "http://192.168.3.128:38080/api/BoundDocuments";
GetInvListByEpc = "/api/Inventory/GetInvListByEpc";
IsAutoUpdate = true;
AutoUpdateTime = 0;
GetWarehouseById = "/api/Warehouse/GetWarehouseById";
SetWarehouseState = "/api/Inventory/SetWarehouseState";
GetEpcListByBoxMarkEpc = "/api/EquipmentBoxMark/GetEpcListByBoxMarkEpc";
}
/// <summary>
/// 接口域名
/// </summary>
public string DomainUrl { get; set; }
/// <summary>
/// 登录
/// </summary>
public string UserLogin { get; set; }
[JsonIgnore]
public string AppTitle { get; set; }
[JsonIgnore]
public string AppVersion { get; set; }
[JsonIgnore]
public string AppCode { get; set; }
public string SoftUpdate { get; set; }
public string GetEquInfo { get; set; }
public string GetStoreInfo { get; set; }
public string GetOrderInfo { get; set; }
public string GetOrderDetail { get; set; }
public string ComMouth { get; set; }
public string WarehouseID { get; set; }
public string UploadUrl { get; set; }
public string OpenOrderWorkUrl { get; set; }
public string CloseOrderUrl { get; set; }
public string ApiVersion { get; set; }
public string AppKey { get; set; }
public string SecretKey { get; set; }
public string GetPolices { get; set; }
public string FaceAddress { get; set; }
public string FaceUser { get; set; }
public string FacePwd { get; set; }
public string FacePort { get; set; }
public string UploadFace { get; set; }
public string UpdateFinger { get; set; }
public bool IsUseFace { get; set; }
public bool IsEnabledShelf { get; set; }
public string ShelfAddress { get; set; }
public string GetInvListByEpc { get; set; }
public string GetWarehouseById { get; set; }
public string SetWarehouseState { get; set; }
/// <summary>
/// 是否自动更新
/// </summary>
public bool IsAutoUpdate { get; set; }
/// <summary>
/// 自动更新时间(小时)
/// </summary>
public int AutoUpdateTime { get; set; }
[JsonIgnore]
public static new bool IsInDesignModeStatic { get; }
public string GetEpcListByBoxMarkEpc { get; set; }
}
public class respone_user
{
public string id { get; set; }
public string username { get; set; }
public bool enabled { get; set; }
public respone_org baseJpOrganization { get; set; }
public respone_policeman policeman { get; set; }
}
public class respone_org
{
public string id { get; set; }
public string name { get; set; }
public string code { get; set; }
public string findCode { get; set; }
}
public class respone_policeman
{
public string id { get; set; }
public string name { get; set; }
public string policeCode { get; set; }
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9BD01307-0389-44A2-A4F5-E5F96F4E3683}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>LiteChannel</RootNamespace>
<AssemblyName>LiteChannel</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</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>
<ApplicationIcon>1.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="CommonServiceLocator, Version=2.0.5.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.2.0.5\lib\net46\CommonServiceLocator.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight, Version=5.4.1.0, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.4.1.1\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Extras, Version=5.4.1.0, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.4.1.1\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Platform, Version=5.4.1.0, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.4.1.1\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
</Reference>
<Reference Include="JmpRfidLp">
<HintPath>..\Lib\JmpRfidLp.dll</HintPath>
</Reference>
<Reference Include="MaterialDesignColors, Version=1.2.6.1513, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignColors.1.2.6\lib\net45\MaterialDesignColors.dll</HintPath>
</Reference>
<Reference Include="MaterialDesignThemes.Wpf, Version=3.1.3.1513, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignThemes.3.1.3\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Xaml.Behaviors.Wpf.1.1.19\lib\net45\Microsoft.Xaml.Behaviors.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Panuon.UI.Silver, Version=1.1.3.2, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Panuon.UI.Silver.1.1.3.2\lib\net45\Panuon.UI.Silver.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.4.1.1\lib\net45\System.Windows.Interactivity.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="CHCNetSDK.cs" />
<Compile Include="Commons\EpcConvert.cs" />
<Compile Include="Commons\HttpHelper.cs" />
<Compile Include="Commons\JmpDes.cs" />
<Compile Include="Commons\Log.cs" />
<Compile Include="LiteCaChe.cs" />
<Compile Include="AutoClosingMessageBox.xaml.cs">
<DependentUpon>AutoClosingMessageBox.xaml</DependentUpon>
</Compile>
<Compile Include="OutWindow.xaml.cs">
<DependentUpon>OutWindow.xaml</DependentUpon>
</Compile>
<Compile Include="MainWindow2.xaml.cs">
<DependentUpon>MainWindow2.xaml</DependentUpon>
</Compile>
<Compile Include="Models\BaseJpWarehouse.cs" />
<Compile Include="Models\respone_upload.cs" />
<Compile Include="Models\request_sign.cs" />
<Compile Include="Models\response_BoxMarkModel.cs" />
<Compile Include="Models\sync_police.cs" />
<Compile Include="Models\rfid_res.cs" />
<Compile Include="Models\upload_info.cs" />
<Compile Include="Models\scan_info.cs" />
<Compile Include="Models\order_equ.cs" />
<Compile Include="Models\equ_info.cs" />
<Compile Include="Models\order_info.cs" />
<Compile Include="Models\respone.cs" />
<Compile Include="Models\soft_update.cs" />
<Compile Include="Models\store_info.cs" />
<Compile Include="Setting.xaml.cs">
<DependentUpon>Setting.xaml</DependentUpon>
</Compile>
<Compile Include="StoreInWindow.xaml.cs">
<DependentUpon>StoreInWindow.xaml</DependentUpon>
</Compile>
<Compile Include="UsControl\PageControl.xaml.cs">
<DependentUpon>PageControl.xaml</DependentUpon>
</Compile>
<Compile Include="VOrderInfo.cs" />
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
</Compile>
<Compile Include="StoreOutWindow.xaml.cs">
<DependentUpon>StoreOutWindow.xaml</DependentUpon>
</Compile>
<Page Include="AutoClosingMessageBox.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="LoginWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="LoginWindow.xaml.cs">
<DependentUpon>LoginWindow.xaml</DependentUpon>
</Compile>
<Page Include="OutWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="MainWindow2.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="MainWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="OrderInfoWindows.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Setting.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="StoreInWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="StoreOutWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UsControl\PageControl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="OrderInfoWindows.xaml.cs">
<DependentUpon>OrderInfoWindows.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Resource Include="Font\iconfont.ttf" />
<None Include="config.json" />
<None Include="packages.config" />
<None Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Resource Include="1.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\MaterialDesignThemes.3.1.3\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.3.1.3\build\MaterialDesignThemes.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MaterialDesignThemes.3.1.3\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MaterialDesignThemes.3.1.3\build\MaterialDesignThemes.targets'))" />
</Target>
</Project>
\ No newline at end of file
<pu:WindowX x:Class="LiteChannel.LoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
mc:Ignorable="d" Icon="1.ico"
Title="射频出入库系统" Height="250" Width="400" Loaded="Window_Loaded" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" >
<Window.Resources>
<ResourceDictionary>
<RoutedUICommand x:Key="OnShowConfig" Text="配置管理"/>
</ResourceDictionary>
</Window.Resources>
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+ALT+J" Command="{ StaticResource OnShowConfig}" />
</Window.InputBindings>
<Window.CommandBindings>
<CommandBinding Command="{StaticResource OnShowConfig}"
CanExecute="OnShowConfig_CanExecute"
Executed="OnShowConfig_Executed"/>
</Window.CommandBindings>
<Window.Effect>
<DropShadowEffect BlurRadius="10" Color="#FF858484" Direction="90" ShadowDepth="2"/>
</Window.Effect>
<Grid >
<Grid x:Name="g_body" Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="60"/>
<RowDefinition Height="60"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0 0 0 0" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
<TextBox Height="30" Name="txtUser"
Width="300"
pu:TextBoxHelper.Watermark="请输入用户名"
pu:TextBoxHelper.Icon="&#xf11c;"
FontFamily="/Font/#iconfont"
pu:TextBoxHelper.FocusedBorderBrush="#B5B5B5"
pu:TextBoxHelper.FocusedShadowColor="#B5B5B5"
pu:TextBoxHelper.IsClearButtonVisible="True" />
</StackPanel>
<StackPanel Margin="0 0 0 0" Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
<PasswordBox Height="30" Name="txtPwd" KeyDown="OnKeyDown"
Width="300"
FontFamily="/Font/#iconfont"
pu:PasswordBoxHelper.Watermark="请输入密码"
pu:PasswordBoxHelper.Icon="&#xf11c;"
pu:PasswordBoxHelper.FocusedBorderBrush="#B5B5B5"
pu:PasswordBoxHelper.FocusedShadowColor="#B5B5B5"
pu:PasswordBoxHelper.IsShowPwdButtonVisible="True" />
</StackPanel>
<Button Grid.Row="3" pu:ButtonHelper.CornerRadius="4" FontSize="20" Content="登录" Margin="127,10,116.6,0" Height="45" Width="150" HorizontalAlignment="Center" VerticalAlignment="Top" Click="OnLoginClick"/>
</Grid>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Panuon.UI.Silver;
using Panuon.UI.Silver.Core;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Markup;
namespace LiteChannel
{
/// <summary>
/// Login.xaml 的交互逻辑
/// </summary>
public partial class LoginWindow : WindowX, IComponentConnector
{
private bool bLogin = false;
public LoginWindow()
{
InitializeComponent();
txtUser.Focus();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ReadHistory();
}
private void Sb_Completed(object sender, EventArgs e)
{
this.Close();
Process.GetCurrentProcess().Kill();
}
private async void OnLoginClick(object sender, RoutedEventArgs e)
{
if (bLogin) { return; }
if (string.IsNullOrEmpty(txtUser.Text))
{
bLogin = false;
MessageBox.Show(this, "用户名未填写", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrEmpty(txtPwd.Password))
{
bLogin = false;
MessageBox.Show(this, "密码未填写", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var handler = PendingBox.Show("系统登录中...", "", false, Application.Current.MainWindow, new PendingBoxConfigurations()
{
LoadingForeground = "#5DBBEC".ToColor().ToBrush(),
MaxWidth = 250,
MinHeight = 110,
MinWidth = 250,
MaxHeight = 110,
ButtonBrush = "#5DBBEC".ToColor().ToBrush(),
});
var user = txtUser.Text;
var pwd = txtPwd.Password;
var lg_res = await Task.Run(() =>
{
var result = HttpHelper.UserLogin(user, pwd);
return result;
});
if (lg_res != null)
{
SaveHistory();
handler.UpdateMessage("系统登录成功!");
LiteCaChe.OrgId = lg_res.baseJpOrganization?.id ?? "";
LiteCaChe.PoliceId = lg_res.policeman?.id ?? "";
LiteCaChe.UserId = lg_res.id;
new MainWindow().Show();
this.ShowInTaskbar = false;
this.Hide();
}
else
{
handler.UpdateMessage("系统登录失败!");
}
await Task.Delay(500);
handler.Close();
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
OnLoginClick(sender, new RoutedEventArgs());
}
}
private void OnShowConfig_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void OnShowConfig_Executed(object sender, ExecutedRoutedEventArgs e)
{
Setting settings = new Setting();
settings.ShowDialog();
}
private void SaveHistory()
{
var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "history.txt";
if (!File.Exists(path))
{
File.Create(path);
}
var txt = txtUser.Text + "|" + txtPwd.Password;
File.WriteAllText(path, txt, Encoding.UTF8);
}
public void ReadHistory()
{
var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "history.txt";
if (!File.Exists(path))
{
File.CreateText(path).Dispose();
}
var txt = File.ReadAllText(path, Encoding.UTF8);
if (!string.IsNullOrEmpty(txt))
{
var record = txt.Split('|');
if (record.Length == 2)
{
txtUser.Text = record[0];
txtPwd.Password = record[1];
}
}
}
}
}
<pu:WindowX x:Class="LiteChannel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
xmlns:usControl="clr-namespace:LiteChannel.UsControl"
mc:Ignorable="d" Icon="1.ico"
Height="720" Width="1024" Loaded="MainWindowLoaded" ResizeMode="NoResize"
AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen"
WindowState="Maximized" Closing="OnWindow_Closing" pu:WindowXCaption.DisableCloseButton="True">
<Grid x:Name="g_main">
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Button Grid.Row="1" Grid.Column="1" Margin="10,10,10,10" Click="OnInStore_Click" pu:ButtonHelper.Icon="&#xf085;" Content="入库" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="1" Grid.Column="2" Margin="10,10,10,10" Click="OnOutStore_Click" pu:ButtonHelper.Icon="&#xf085;" Content="出库" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" Click="OnClose_Click" pu:ButtonHelper.Icon="&#xf2d3;" Margin="10,10,10,10" Content="退出系统" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="24" Background="#C8FF0000" pu:ButtonHelper.HoverBrush="#FF0000" ></Button>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using GalaSoft.MvvmLight.CommandWpf;
using System.ComponentModel;
namespace LiteChannel
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : WindowX, IComponentConnector
{
public MainWindow()
{
InitializeComponent();
CHCNetSDK.NET_DVR_Init();
//检查软件更新
if (LiteCaChe.SysConfig.IsAutoUpdate)
{
var date = DateTime.Now.Date;
Task.Run(() =>
{
while (true)
{
try
{
if (DateTime.Now.Date > date && DateTime.Now.Hour == LiteCaChe.SysConfig.AutoUpdateTime)
{
//检查更新
var update = HttpHelper.GetUpdate(LiteCaChe.SysConfig?.AppCode ?? "");
if (update == null)
{
Log.ErrorLog("获取更新信息失败 AppCode=" + LiteCaChe.SysConfig?.AppCode);
}
else
{
if (Version.TryParse(update.autoUpdateVersion2, out var version) && version > new Version(LiteCaChe.SysConfig.AppVersion))
{
var fullFile = AppDomain.CurrentDomain.BaseDirectory + update.autoUpdateAddress.TrimStart('/').Replace('/', '\\');
if (!File.Exists(fullFile))
{
//下载新版本
var downloadRes = HttpHelper.HttpDownload(
LiteCaChe.SysConfig.DomainUrl.TrimEnd('/') + "/" +
update.autoUpdateAddress.TrimStart('/'), fullFile);
if (!downloadRes)
{
//下载失败,60秒后重试
Thread.Sleep(60000);
continue;
}
}
//比较md5确认下载完整
if (update.autoUpdateFileMd5 == HttpHelper.GetMD5HashFromFile(fullFile))
{
//成功之后再更新日期
date = DateTime.Now.Date;
App.Current.Dispatcher.Invoke(() =>
{
new AutoClosingMessageBox(this, "新版本下载完毕,是否更新?", "版本更新提示", 10, () =>
{
//var proc = new ProcessStartInfo(fullFile);
//proc.UseShellExecute = true;
//proc.Verb = "runas";
System.Diagnostics.Process.Start(fullFile);
Process.GetCurrentProcess().Kill();
}).ShowDialog();
});
}
else
{
//文件错误,删除
File.Delete(fullFile);
}
}
}
}
}
catch (Exception e)
{
Log.ErrorLog(e.Message);
}
//60s检查一次
Thread.Sleep(60000);
}
});
}
}
private void MainWindowLoaded(object sender, RoutedEventArgs e)
{
//开始同步人员
if (LiteCaChe.SysConfig.IsUseFace)
{
Task.Run(() =>
{
if (InitialFace() && LoginFace())
{
//启动同步线程
cDoorSync = new CancellationTokenSource();
taskSyncDoor = new Task(PollingDoorUser);
taskSyncDoor.Start();
Log.WorkLog("门禁连接成功,开始同步!");
}
else { Log.WorkLog("门禁设备初始化失败!"); }
});
}
}
private void OnOutStore_Click(object sender, RoutedEventArgs e)
{
var from = new OutWindow();
from.Owner = this;
//from.OnApplySuc += LoadData;
from.ShowDialog();
}
private void OnWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Process.GetCurrentProcess().Kill();
}
private void OnInStore_Click(object sender, RoutedEventArgs e)
{
var from = new StoreInWindow();
from.Owner = this;
//from.OnApplySuc += LoadData;
from.ShowDialog();
}
private void OnClose_Click(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
//Process.GetCurrentProcess().Kill();
}
#region 海康门禁
private CancellationTokenSource cDoorSync;
private Task taskSyncDoor;
private AutoResetEvent doorEvent = new AutoResetEvent(false);
private bool isExistFace = false;
private ManualResetEvent setFaceEvent = new ManualResetEvent(true);
private ManualResetEvent faceEvent = new ManualResetEvent(true);
//人脸是否下发成功
private bool isSended = false;
private CHCNetSDK.RemoteConfigCallback onGetGatewayCardCallback = default;
public CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = default;
private CHCNetSDK.EXCEPYIONCALLBACK onExceptionCallBack = default;
private CHCNetSDK.MSGCallBack_V31 onDVRMessageCallBackV31 = default;
private int hikHwnd = -1;
private int alarmHwnd = -1;
private int cardCfgHwnd = -1;
private string adminCard = "838668";
private IntPtr winHwnd = IntPtr.Zero;
/// <summary>
/// 初始化门禁
/// </summary>
/// <returns></returns>
private bool InitialFace()
{
try
{
byte[] strIP = new byte[16 * 16];
//设置透传报警信息类型
CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离,0-不分离(COMM_VCA_ALARM返回),1-分离(分离后走COMM_ISAPI_ALARM回调返回)
int nSize = Marshal.SizeOf(struLocalCfg);
IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false);
if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg)) //NET_DVR_LOCAL_CFG_TYPE_GENERAL
{
Log.WorkLog("门禁初始化失败");
return false;
}
Marshal.FreeHGlobal(ptrLocalCfg);
//设置异常消息回调函数
if (onExceptionCallBack == null)
{
onExceptionCallBack = new CHCNetSDK.EXCEPYIONCALLBACK(DVRExceptionCB);
}
CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, onExceptionCallBack, IntPtr.Zero);
//设置报警回调函数
if (onDVRMessageCallBackV31 == null)
{
onDVRMessageCallBackV31 = new CHCNetSDK.MSGCallBack_V31(DVRMessageCallBackV31);
}
CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(onDVRMessageCallBackV31, IntPtr.Zero);
return true;
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 登录至门禁
/// </summary>
/// <returns></returns>
private bool LoginFace()
{
try
{
CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
//设备IP地址或者域名
byte[] byIP = System.Text.Encoding.Default.GetBytes(LiteCaChe.SysConfig.FaceAddress);
struLogInfo.sDeviceAddress = new byte[129];
byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
//设备用户名
byte[] byUserName = System.Text.Encoding.Default.GetBytes(LiteCaChe.SysConfig.FaceUser);
struLogInfo.sUserName = new byte[64];
byUserName.CopyTo(struLogInfo.sUserName, 0);
//设备密码
byte[] byPassword = System.Text.Encoding.Default.GetBytes(LiteCaChe.SysConfig.FacePwd);
struLogInfo.sPassword = new byte[64];
byPassword.CopyTo(struLogInfo.sPassword, 0);
struLogInfo.wPort = ushort.Parse(LiteCaChe.SysConfig.FacePort);//设备服务端口号
struLogInfo.cbLoginResult = LoginCallBack;
struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
if ((struLogInfo.bUseAsynLogin == true) && (LoginCallBack == null))
{
LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK(HikLoginCallBack);//注册回调函数
}
struLogInfo.byLoginMode = 0; //0-Private, 1-ISAPI, 2-自适应
struLogInfo.byHttps = 0; //0-不适用tls,1-使用tls 2-自适应
CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();
//登录设备 Login the device
hikHwnd = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
if (hikHwnd < 0)
{
var errCode = CHCNetSDK.NET_DVR_GetLastError();
Log.WorkLog($"门禁登录失败,错误代码:{errCode}");
return false;
}
else
{
//设置人脸门禁 时间
SetDeivceTime();
return true;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 设置人脸门禁时间和服务器保持一致
/// </summary>
private void SetDeivceTime()
{
if (hikHwnd < 0)
{
return;
}
else
{
var now_time = DateTime.Now;
CHCNetSDK.NET_DVR_TIME CurTime = new CHCNetSDK.NET_DVR_TIME();
CurTime.dwYear = (uint)now_time.Year;
CurTime.dwMonth = (uint)now_time.Month;
CurTime.dwDay = (uint)now_time.Day;
CurTime.dwHour = (uint)now_time.Hour;
CurTime.dwMinute = (uint)now_time.Minute;
CurTime.dwSecond = (uint)now_time.Second;
int dwSize = (int)Marshal.SizeOf(CurTime);
IntPtr ptrCurTime = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(CurTime, ptrCurTime, true);
bool res = CHCNetSDK.NET_DVR_SetDVRConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_TIMECFG, 0, ptrCurTime, (uint)dwSize);
if (true == res)
{
//SetLogs("设置人脸门禁时间成功");
}
else
{
//SetLogs("设置人脸门禁时间失败");
}
Marshal.FreeHGlobal(ptrCurTime);
}
}
public void HikLoginCallBack(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser)
{
string strLoginCallBack = "登录设备,lUserID:" + lUserID + ",dwResult:" + dwResult;
if (dwResult == 0)
{
uint iErrCode = CHCNetSDK.NET_DVR_GetLastError();
strLoginCallBack = strLoginCallBack + ",错误号:" + iErrCode;
Log.ErrorLog(strLoginCallBack);
}
}
public void DVRExceptionCB(uint dwType, int lUserID, int lHandle, IntPtr pUser)
{
Log.ErrorLog("门禁异常:0x" + Convert.ToString(dwType, 16) + ", lUserID:" + lUserID + ", lHandle:" + lHandle);
}
public bool DVRMessageCallBackV31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
//通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
//AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
switch (lCommand)
{
//门禁主机报警上传,人脸数据
case CHCNetSDK.COMM_ALARM_ACS:
//ProcessCommAlarm_AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
}
return true; //回调函数需要有返回,表示正常接收到数据
}
private void AcsAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
CHCNetSDK.NET_DVR_ACS_ALARM_INFO struAcsAlarm = new CHCNetSDK.NET_DVR_ACS_ALARM_INFO();
uint dwSize = (uint)Marshal.SizeOf(struAcsAlarm);
struAcsAlarm = (CHCNetSDK.NET_DVR_ACS_ALARM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ACS_ALARM_INFO));
//报警设备IP地址
string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');
//报警时间:年月日时分秒
string strTimeYear = (struAcsAlarm.struTime.dwYear).ToString();
string strTimeMonth = (struAcsAlarm.struTime.dwMonth).ToString("d2");
string strTimeDay = (struAcsAlarm.struTime.dwDay).ToString("d2");
string strTimeHour = (struAcsAlarm.struTime.dwHour).ToString("d2");
string strTimeMinute = (struAcsAlarm.struTime.dwMinute).ToString("d2");
string strTimeSecond = (struAcsAlarm.struTime.dwSecond).ToString("d2");
DateTime time = Convert.ToDateTime(strTimeYear + "-" + strTimeMonth + "-" + strTimeDay + " " + strTimeHour + ":" + strTimeMinute + ":" + strTimeSecond);
if (DateTime.Now.Subtract(time).TotalMinutes <= 5)
{
//var cardNo = Encoding.UTF8.GetString(struAcsAlarm.struAcsEventInfo.byCardNo).TrimEnd('\0');
//if (struAcsAlarm.dwMajor == 5 && (struAcsAlarm.dwMinor == 75 || struAcsAlarm.dwMinor == 38 || struAcsAlarm.dwMinor == 1))
//{
// var user_info = HttpHelper.GetPoliceInfo(cardNo);
// if (user_info != null && !string.IsNullOrEmpty(user_info.policeId))
// {
// SetLogs($"用户[{user_info.policeName}]已获取");
// userId = user_info.policeId;
// if (LiteCaChe.SysConfig.SpecialModel)
// {
// //上报缓存EPC
// lock (cacheList)
// {
// UploadTagEpc(cacheList);
// cacheList.Clear();
// }
// }
// }
// else
// {
// SetLogs("用户数据不存在");
// }
//}
//else
//{
// SetLogs("历史开门信息,已过滤");
//}
}
}
/// <summary>
/// 轮询同步人脸、用户信息
/// </summary>
private void PollingDoorUser()
{
while (!cDoorSync.IsCancellationRequested)
{
var cfg = HttpHelper.GetPoliceInfo();
if (cfg == null || cfg.Count == 0)
{ }
else
{
//更新缓存
LiteCaChe.PoliceList = cfg;
if (hikHwnd >= 0)
{
SyncCards();
Log.WorkLog("用户信息同步完成");
SyncFaces();
Log.WorkLog("用户人脸同步完成");
SyncFinger();
Log.WorkLog("用户指纹同步完成");
}
}
doorEvent.WaitOne(18000000);
}
}
/// <summary>
/// 比对用户信息并同步
/// </summary>
private void SyncCards()
{
if (hikHwnd < 0)
{
return;
}
else
{
//先获取平台人员
if (LiteCaChe.PoliceList == null || LiteCaChe.PoliceList.Count == 0)
{
return;
}
else
{
//下发、更新门禁用户
var tmpList = new List<sync_police>(LiteCaChe.PoliceList);
foreach (var _tmp in tmpList)
{
if (string.IsNullOrEmpty(_tmp.policeCode))
{
continue;
}
else
{
if (!SetDoorUser(_tmp.policeCode, _tmp.name))
{
Log.WorkLog($"人员写入门禁失败,{_tmp.policeCode}{_tmp.name}");
}
}
}
}
}
}
/// <summary>
/// 同步人脸信息
/// </summary>
private void SyncFaces()
{
if (LiteCaChe.PoliceList == null || LiteCaChe.PoliceList.Count == 0 || hikHwnd < 0)
{
return;
}
var policeCards = LiteCaChe.PoliceList;
foreach (var item in policeCards)
{
//校验门禁中是否有人脸信息
var _res = GetUserFace(item.policeCode);
if (_res && string.IsNullOrEmpty(item.photo))
{
//将照片同步至平台
if (!SendFace2Http(item.policeCode, item.id))
{
Log.WorkLog($"人脸照片上传失败,{item.name},{item.policeCode}");
}
}
else if (!_res && string.IsNullOrEmpty(item.photo))
{
//服务端和门禁中都没有人脸信息,忽略
continue;
}
else
{
//尝试下载人脸图片
var buffer = HttpHelper.GetPoliceImg(item.photo);
if (buffer == null)
{
Log.WorkLog("平台人脸图片下载失败");
continue;
}
else
{
//写入至海康
var res = SendFaceImg(item.policeCode, buffer);
if (!res)
{
Log.WorkLog($"人脸写入到门禁失败,{item.name},{item.policeCode}");
}
}
}
}
}
/// <summary>
/// 同步指纹数据
/// </summary>
private void SyncFinger()
{
if (LiteCaChe.PoliceList == null || LiteCaChe.PoliceList.Count == 0 || hikHwnd < 0)
{
return;
}
var policeCards = LiteCaChe.PoliceList.ToList();
foreach (var item in policeCards)
{
//校验门禁中是否有指纹信息(10个手指)
List<FingerInfo> fingerList = new List<FingerInfo>();
for (byte i = 1; i <= 10; i++)
{
var _res = GetUserFinger(item.policeCode, i, out string finger_info);
if (_res && !string.IsNullOrEmpty(finger_info))
{
fingerList.Add(new FingerInfo()
{
fingerInfo = finger_info,
fingerNum = i
});
}
}
var local_nums = fingerList.Select(s => s.fingerNum).ToList();
if (fingerList.Count > 0)
{
//将指纹同步至平台
if (!SendFinger2Http(item.id, fingerList))
{
Log.WorkLog($"指纹上传至平台失败,{item.policeCode},{item.name}");
}
continue;
}
else if (item.fingerList == null || item.fingerList.Count == 0)
{
//服务端和门禁中都没有指纹信息,忽略
continue;
}
else
{
foreach (var finger in item.fingerList)
{
byte[] buffer = Convert.FromBase64String(@finger.fingerInfo);
//写入至海康
var res = SendFingerInfo(item.policeCode, buffer, (byte)finger.fingerNum);
if (!res)
{
Log.WorkLog($"指纹写入到门禁失败,{item.name},{item.policeCode}");
}
}
}
}
}
private bool SendFaceImg(string cardNo, byte[] buffer)
{
try
{
isSended = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FACE_PARAM_COND struCond = new CHCNetSDK.NET_DVR_FACE_PARAM_COND();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwFaceNum = 1;
struCond.byFaceID = 1;
struCond.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struCond.byEnableCardReader[0] = 1;
struCond.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempCardNo = Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
if (i > struCond.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struCond.byCardNo[i] = byTempCardNo[i];
}
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
onGetGatewayCardCallback = new CHCNetSDK.RemoteConfigCallback(ProcessSetFaceParamCallback);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_FACE_PARAM_CFG, ptrStruCond, dwSize, onGetGatewayCardCallback, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStruCond);
return false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "NET_DVR_SET_FACE_PARAM_CFG");
}
Marshal.FreeHGlobal(ptrStruCond);
CHCNetSDK.NET_DVR_FACE_PARAM_CFG struFaceParamCfg = new CHCNetSDK.NET_DVR_FACE_PARAM_CFG();
struFaceParamCfg.dwSize = (uint)Marshal.SizeOf(struFaceParamCfg);
struFaceParamCfg.byFaceID = 1;
struFaceParamCfg.byFaceDataType = 1;
struFaceParamCfg.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struFaceParamCfg.byEnableCardReader[0] = 1;
struFaceParamCfg.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempFaceCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempFaceCardNo.Length; i++)
{
if (i > struFaceParamCfg.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struFaceParamCfg.byCardNo[i] = byTempFaceCardNo[i];
}
if (0 == buffer.Length)
{
Log.WorkLog("人脸图片不正确,0kb");
return false;
}
if (200 * 1024 < buffer.Length)
{
Log.WorkLog("人脸图片不正确,大于200kb");
return false;
}
struFaceParamCfg.dwFaceLen = (uint)buffer.Length;
int len = (int)struFaceParamCfg.dwFaceLen;
struFaceParamCfg.pFaceBuffer = Marshal.AllocHGlobal(len);
Marshal.Copy(buffer, 0, struFaceParamCfg.pFaceBuffer, len);
uint dwParamSize = (uint)Marshal.SizeOf(struFaceParamCfg);
IntPtr ptrStruFaceParamCfg = Marshal.AllocHGlobal((int)dwParamSize);
Marshal.StructureToPtr(struFaceParamCfg, ptrStruFaceParamCfg, false);
if (!CHCNetSDK.NET_DVR_SendRemoteConfig(cardCfgHwnd, 9, ptrStruFaceParamCfg, dwParamSize))
{
Log.WorkLog($"设置人脸图片失败");
Marshal.FreeHGlobal(struFaceParamCfg.pFaceBuffer);
Marshal.FreeHGlobal(ptrStruFaceParamCfg);
return false;
}
else
{
setFaceEvent.Reset();
setFaceEvent.WaitOne(5000);
Marshal.FreeHGlobal(struFaceParamCfg.pFaceBuffer);
Marshal.FreeHGlobal(ptrStruFaceParamCfg);
return isSended;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
isSended = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
private bool SendFingerInfo(string cardNo, byte[] buffer, byte num)
{
if (cardCfgHwnd != -1)
{
CHCNetSDK.NET_DVR_StopRemoteConfig((int)cardCfgHwnd);
cardCfgHwnd = -1;
}
CHCNetSDK.NET_DVR_FINGERPRINT_COND strupond = new CHCNetSDK.NET_DVR_FINGERPRINT_COND();
strupond.init();
int dwSize = Marshal.SizeOf(strupond);
strupond.dwSize = dwSize;
strupond.byFingerPrintID = num;
strupond.dwEnableReaderNo = 1;
strupond.dwFingerprintNum = 1;//指纹数量写死的
byte[] byTempptrRec = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempptrRec.Length; i++)
{
strupond.byCardNo[i] = byTempptrRec[i];
}
IntPtr ptrStrucond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(strupond, ptrStrucond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_FINGERPRINT, ptrStrucond, dwSize, null, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStrucond);
//MessageBox.Show("NET_DVR_SET_FINGERPRINT_CFG_V50 FAIL, ERROR CODE" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
return false;
}
bool flag = true;
int dwStatus = 0;
CHCNetSDK.NET_DVR_FINGERPRINT_RECORD StruRecord = new CHCNetSDK.NET_DVR_FINGERPRINT_RECORD();
StruRecord.init();
int dwInBuffSize = Marshal.SizeOf(StruRecord);
StruRecord.dwSize = dwInBuffSize;
StruRecord.byFingerPrintID = num;
StruRecord.dwEnableReaderNo = 1;
StruRecord.dwFingerPrintLen = buffer.Length;
Array.Copy(buffer, 0, StruRecord.byFingerData, 0, buffer.Length);
byte[] byTemp = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTemp.Length; i++)
{
StruRecord.byCardNo[i] = byTemp[i];
}
CHCNetSDK.NET_DVR_FINGERPRINT_STATUS StruStatus = new CHCNetSDK.NET_DVR_FINGERPRINT_STATUS();
StruStatus.init();
int dwOutBuffSize = Marshal.SizeOf(StruStatus);
StruStatus.dwSize = dwOutBuffSize;
IntPtr ptrOutDataLen = Marshal.AllocHGlobal(sizeof(int));
bool tmp_flage = false;
while (flag)
{
dwStatus = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(cardCfgHwnd, ref StruRecord, dwInBuffSize, ref StruStatus, dwOutBuffSize, ptrOutDataLen);
switch (dwStatus)
{
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS://成功读取到数据,处理完本次数据后需调用next
ProcessSetFingerData(ref StruStatus, ref flag);
tmp_flage = flag;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT:
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FAILED" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.ErrorLog($"指纹设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
flag = false;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FINISH:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
default:
Log.ErrorLog($"指纹设置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_UNKOWN" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
flag = false;
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
break;
}
}
Marshal.FreeHGlobal(ptrStrucond);
Marshal.FreeHGlobal(ptrOutDataLen);
return tmp_flage;
}
/// <summary>
/// 人脸图片上传
/// </summary>
private bool SendFace2Http(string strCard, string id)
{
try
{
var path = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg\\{strCard}.jpg";
if (!File.Exists(path))
{
return false;
}
else
{
var buffer = new byte[] { };
using (MemoryStream ms = new MemoryStream())
{
Bitmap bitmap = new Bitmap(path);
bitmap.Save(ms, ImageFormat.Jpeg);
buffer = ms.GetBuffer();
}
if (buffer == null || buffer.Length == 0)
{
return false;
}
else
{
return HttpHelper.UploadFace(buffer, $"{strCard}.jpg", id);
}
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
private bool SendFinger2Http(string id, List<FingerInfo> fingerList)
{
try
{
return HttpHelper.UpdateFinger(id, fingerList);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
}
/// <summary>
/// 发送用户信息至海康
/// </summary>
/// <returns></returns>
private bool SetDoorUser(string cardNo, string name)
{
try
{
if (hikHwnd < 0) { return false; }
if (cardCfgHwnd != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_CARD_COND struCond = new CHCNetSDK.NET_DVR_CARD_COND();
struCond.Init();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwCardNum = 1;
IntPtr ptrStruCond = Marshal.AllocHGlobal((int)struCond.dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_SET_CARD, ptrStruCond, (int)struCond.dwSize, null, winHwnd);
if (cardCfgHwnd < 0)
{
Log.WorkLog($"启动远程配置失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
Marshal.FreeHGlobal(ptrStruCond);
return false;
}
else
{
CHCNetSDK.NET_DVR_CARD_RECORD struData = new CHCNetSDK.NET_DVR_CARD_RECORD();
struData.Init();
struData.dwSize = (uint)Marshal.SizeOf(struData);
struData.byCardType = 1;
byte[] byTempCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byTempCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
struData.byCardNo[i] = byTempCardNo[i];
}
struData.wCardRightPlan[0] = 1;
var employeeNo = System.Text.RegularExpressions.Regex.Replace(cardNo, @"[^0-9]+", "");
struData.dwEmployeeNo = uint.Parse(employeeNo);
byte[] btyName = new byte[CHCNetSDK.NAME_LEN];
btyName = System.Text.Encoding.UTF8.GetBytes(name);
for (int i = 0; i < btyName.Length; i++)
{
struData.byName[i] = btyName[i];
}
struData.struValid.byEnable = 1;
struData.struValid.struBeginTime.wYear = 2000;
struData.struValid.struBeginTime.byMonth = 1;
struData.struValid.struBeginTime.byDay = 1;
struData.struValid.struBeginTime.byHour = 11;
struData.struValid.struBeginTime.byMinute = 11;
struData.struValid.struBeginTime.bySecond = 11;
struData.struValid.struEndTime.wYear = 2030;
struData.struValid.struEndTime.byMonth = 1;
struData.struValid.struEndTime.byDay = 1;
struData.struValid.struEndTime.byHour = 11;
struData.struValid.struEndTime.byMinute = 11;
struData.struValid.struEndTime.bySecond = 11;
struData.byDoorRight[0] = 1;
struData.wCardRightPlan[0] = 1;
IntPtr ptrStruData = Marshal.AllocHGlobal((int)struData.dwSize);
Marshal.StructureToPtr(struData, ptrStruData, false);
CHCNetSDK.NET_DVR_CARD_STATUS struStatus = new CHCNetSDK.NET_DVR_CARD_STATUS();
struStatus.Init();
struStatus.dwSize = (uint)Marshal.SizeOf(struStatus);
IntPtr ptrdwState = Marshal.AllocHGlobal((int)struStatus.dwSize);
Marshal.StructureToPtr(struStatus, ptrdwState, false);
int dwState = (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS;
uint dwReturned = 0;
bool res = false;
while (true)
{
dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(cardCfgHwnd, ptrStruData, struData.dwSize, ptrdwState, struStatus.dwSize, ref dwReturned);
struStatus = (CHCNetSDK.NET_DVR_CARD_STATUS)Marshal.PtrToStructure(ptrdwState, typeof(CHCNetSDK.NET_DVR_CARD_STATUS));
if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT)
{
Thread.Sleep(10);
continue;
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED)
{
Log.WorkLog($"人员信息写入失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS)
{
if (struStatus.dwErrorCode != 0)
{
Log.WorkLog($"人员信息写入失败,错误代码:{struStatus.dwErrorCode}");
}
else
{
Log.WorkLog($"人员信息写入成功");
}
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FINISH)
{
Log.WorkLog($"人员信息写入完成");
res = true;
break;
}
else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION)
{
Log.WorkLog($"人员信息写入失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
res = false;
break;
}
else
{
Log.WorkLog($"人员信息写入失败,发生未知错误:{CHCNetSDK.NET_DVR_GetLastError()}");
res = false;
break;
}
}
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
cardCfgHwnd = -1;
Marshal.FreeHGlobal(ptrStruData);
Marshal.FreeHGlobal(ptrdwState);
Marshal.FreeHGlobal(ptrStruCond);
return res;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
if (cardCfgHwnd != -1)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
/// <summary>
/// 获取用户人脸信息
/// </summary>
/// <param name="cardNo"></param>
/// <returns></returns>
private bool GetUserFace(string cardNo)
{
try
{
isExistFace = false;
if (hikHwnd < 0) { return false; }
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FACE_PARAM_COND struCond = new CHCNetSDK.NET_DVR_FACE_PARAM_COND();
struCond.dwSize = (uint)Marshal.SizeOf(struCond);
struCond.dwFaceNum = 1;
struCond.byFaceID = 1;
struCond.byEnableCardReader = new byte[CHCNetSDK.MAX_CARD_READER_NUM_512];
struCond.byEnableCardReader[0] = 1;
struCond.byCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
byte[] byTempCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTempCardNo.Length; i++)
{
if (i > struCond.byCardNo.Length)
{
Log.WorkLog("卡号长度太长");
return false;
}
struCond.byCardNo[i] = byTempCardNo[i];
}
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
onGetGatewayCardCallback = new CHCNetSDK.RemoteConfigCallback(ProcessGetFaceParamCallback);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_GET_FACE_PARAM_CFG, ptrStruCond, dwSize, onGetGatewayCardCallback, winHwnd);
if (-1 == cardCfgHwnd)
{
int errCode = 0;
IntPtr ptrFail = CHCNetSDK.NET_DVR_GetErrorMsg(ref errCode);
string strFail = Marshal.PtrToStringAnsi(ptrFail);
Log.WorkLog($"获取人脸异常,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}{strFail}");
Marshal.FreeHGlobal(ptrStruCond);
return false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "NET_DVR_GET_FACE_PARAM_CFG");
}
else
{
faceEvent.Reset();
faceEvent.WaitOne(5000);
Marshal.FreeHGlobal(ptrStruCond);
return isExistFace;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "NET_DVR_GET_FACE_PARAM_CFG");
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return false;
}
finally
{
//isExistFace = false;
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
}
}
/// <summary>
/// 获取海康门禁中指纹数据
/// </summary>
/// <param name="cardNo"></param>
/// <returns></returns>
private bool GetUserFinger(string cardNo, byte finger_index, out string finger_info)
{
try
{
finger_info = string.Empty;
if (hikHwnd < 0) { return false; }
if (-1 != cardCfgHwnd)
{
if (CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd))
{
cardCfgHwnd = -1;
}
}
CHCNetSDK.NET_DVR_FINGERPRINT_COND struCond = new CHCNetSDK.NET_DVR_FINGERPRINT_COND();
struCond.init();
struCond.dwSize = Marshal.SizeOf(struCond);
struCond.dwFingerprintNum = 1;
struCond.byFingerPrintID = finger_index;
byte[] byTemp = System.Text.Encoding.UTF8.GetBytes(cardNo);
for (int i = 0; i < byTemp.Length; i++)
{
struCond.byCardNo[i] = byTemp[i];
}
struCond.dwEnableReaderNo = 1;
int dwSize = Marshal.SizeOf(struCond);
IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
Marshal.StructureToPtr(struCond, ptrStruCond, false);
cardCfgHwnd = CHCNetSDK.NET_DVR_StartRemoteConfig(hikHwnd, CHCNetSDK.NET_DVR_GET_FINGERPRINT, ptrStruCond, dwSize, null, IntPtr.Zero);
if (-1 == cardCfgHwnd)
{
Marshal.FreeHGlobal(ptrStruCond);
//MessageBox.Show("NET_DVR_GET_FINGERPRINT_CFG_V50 FAIL, ERROR CODE" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog("指纹数据获取失败");
return false;
}
Boolean flag = true;
CHCNetSDK.NET_DVR_FINGERPRINT_RECORD struOutBuff = new CHCNetSDK.NET_DVR_FINGERPRINT_RECORD();
struOutBuff.init();
int dWsize = Marshal.SizeOf(struOutBuff);
int dwStatus = 0;
while (flag)
{
dwStatus = CHCNetSDK.NET_DVR_GetNextRemoteConfig(cardCfgHwnd, ref struOutBuff, dWsize);
switch (dwStatus)
{
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS://成功读取到数据,处理完本次数据后需调用next
finger_info = ReaderFingerInfo(struOutBuff);
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT:
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED:
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FAILED" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
flag = false;
break;
case CHCNetSDK.NET_SDK_GET_NEXT_STATUS_FINISH:
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_FINISH", "Tips", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取成功");
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
default:
//MessageBox.Show("NET_SDK_GET_NEXT_STATUS_UNKOWN" + CHCNetSDK.NET_DVR_GetLastError().ToString(), "Error", MessageBoxButtons.OK);
Log.WorkLog($"指纹数据获取失败,错误代码:{CHCNetSDK.NET_DVR_GetLastError()}");
CHCNetSDK.NET_DVR_StopRemoteConfig(cardCfgHwnd);
flag = false;
break;
}
}
Marshal.FreeHGlobal(ptrStruCond);
return !string.IsNullOrEmpty(finger_info);
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
finger_info = string.Empty;
return false;
}
}
private string ReaderFingerInfo(CHCNetSDK.NET_DVR_FINGERPRINT_RECORD struOutBuff)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
ms.Write(struOutBuff.byFingerData, 0, struOutBuff.dwFingerPrintLen);
var base64 = Convert.ToBase64String(ms.ToArray());
ms.Close();
return base64;
}
}
catch (Exception ex)
{
Log.ErrorLog(ex.ToString());
return string.Empty;
}
}
private void ProcessGetFaceParamCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
if (pUserData == null)
{
return;
}
if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
{
uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "GetFaceParam Processing");
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
{
faceEvent.Set();
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_SUCCESS)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "GetFaceParam Success");
faceEvent.Set();
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "GetFaceParam Exception");
faceEvent.Set();
}
else
{
faceEvent.Set();
}
}
else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
{
var result = Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_FACE_PARAM_CFG));
var struFaceParamCfg = (CHCNetSDK.NET_DVR_FACE_PARAM_CFG)result;
if (struFaceParamCfg.byEnableCardReader[0] != 1)
{
}
if (struFaceParamCfg.dwFaceLen > 0)
{
var cardNo = Encoding.UTF8.GetString(struFaceParamCfg.byCardNo).Trim('\0');
var dir = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg";
if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); }
isExistFace = true;
using (FileStream fs = new FileStream($"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}\\FaceImg\\{cardNo}.jpg", FileMode.Create))
{
int len = (int)struFaceParamCfg.dwFaceLen;
byte[] by = new byte[len];
Marshal.Copy(struFaceParamCfg.pFaceBuffer, by, 0, len);
fs.Write(by, 0, len);
fs.Close();
}
}
faceEvent.Set();
}
return;
}
private void ProcessSetFingerData(ref CHCNetSDK.NET_DVR_FINGERPRINT_STATUS ststus, ref bool flag)
{
switch (ststus.byRecvStatus)
{
case 0:
//MessageBox.Show("SetFingegDataSuccessful", "Succeed", MessageBoxButtons.OK);
break;
default:
flag = false;
// MessageBox.Show("NET_SDK_SET_FINGER_DATA_FAILED" + ststus.byRecvStatus.ToString(), "ERROR", MessageBoxButtons.OK);
Log.ErrorLog($"指纹设置失败,错误代码:{ststus.byRecvStatus.ToString()}");
break;
}
}
private void ProcessSetFaceParamCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
if (pUserData == null)
{
return;
}
if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
{
uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
{
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "SetFaceParam Processing");
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Failed");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_SUCCESS)
{
isSended = true;
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_SUCC_T, "SetFaceParam Success");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Exception");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
else
{
setFaceEvent.Set();
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "Unknown Status");
//CHCNetSDK.PostMessage(pUserData, 1001, 0, 0);
}
}
else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
{
var result = Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_FACE_PARAM_STATUS));
var struFaceParamStatus = (CHCNetSDK.NET_DVR_FACE_PARAM_STATUS)result;
if (struFaceParamStatus.byCardReaderRecvStatus[0] != 1)
{
isSended = false;
//g_formList.AddLog(m_lDeviceIndex, AcsDemoPublic.OPERATION_FAIL_T, "SetFaceParam Return Failed:byCardReaderRecvStatus " + struFaceParamStatus.byCardReaderRecvStatus[0]);
}
else
{
isSended = true;
}
}
}
#endregion
}
}
<pu:WindowX x:Class="LiteChannel.MainWindow2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
xmlns:usControl="clr-namespace:LiteChannel.UsControl"
mc:Ignorable="d" Icon="1.ico"
Height="720" Width="1024" Loaded="MainWindowLoaded" ResizeMode="NoResize"
AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen"
WindowState="Maximized" pu:WindowXCaption.DisableCloseButton="True">
<Grid x:Name="g_main">
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="*"/>
<RowDefinition Height="80"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="0.05*"/>
</Grid.ColumnDefinitions>
<Label x:Name="lb_type" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="{StaticResource FontAwesome}" FontWeight="Bold" >当前业务:借用</Label>
<Button Grid.Row="0" Grid.Column="2" Click="OnRefresh_Click" pu:ButtonHelper.Icon="&#xf202;" Margin="10,0,10,0" Content="刷新单据" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="22"></Button>
<Button Grid.Row="0" Grid.Column="3" Click="OnClose_Click" pu:ButtonHelper.Icon="&#xf2d3;" Margin="10,0,10,0" Content="返回上级" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="22" Background="#C8FF0000" pu:ButtonHelper.HoverBrush="#FF0000" ></Button>
<DataGrid Grid.Column="0" Grid.Row="1" RowHeight="49" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" EnableRowVirtualization="False" Margin="3 5 -1 0" HeadersVisibility="Column"
pu:DataGridHelper.SelectedBackground="#44B5B5B5" pu:DataGridHelper.HoverBackground="#22B5B5B5" CanUserAddRows="False" Grid.ColumnSpan="3"
AutoGenerateColumns="False" LoadingRow="OnDataGridLoadingRow" SelectionMode="Single" Name="dg_order" pu:DataGridHelper.ColumnHorizontalContentAlignment="Center" CanUserSortColumns="True" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="序号" MinWidth="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock FontSize="18" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}, Path=Header}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!--<DataGridTextColumn IsReadOnly="True" Header="单据编号" MinWidth="180" FontSize="18" Binding="{Binding orderCode}" />-->
<!--<DataGridTextColumn IsReadOnly="True" Header="单据类型" Width="1*" MinWidth="100" FontSize="18" Binding="{Binding orderType}" />-->
<DataGridTextColumn x:Name="dgtc_BorrowPolice" Visibility="Collapsed" IsReadOnly="True" Header="借用警员(借用)" MinWidth="120" FontSize="18" Binding="{Binding borrowPolice}" />
<DataGridTextColumn x:Name="dgtc_ReceiveWarehouseName" Visibility="Collapsed" IsReadOnly="True" Header="目标仓库(调拨)" MinWidth="150" FontSize="18" Binding="{Binding receiveWarehouseName}" />
<DataGridTextColumn IsReadOnly="True" Header="申请日期" MinWidth="150" FontSize="18" Binding="{Binding createTime}"/>
<DataGridTextColumn IsReadOnly="True" Header="装备信息" Width="3*" MinWidth="300" FontSize="18" Binding="{Binding equNames}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid Grid.Column="3" Grid.Row="1" Grid.ColumnSpan="2" RowHeight="49" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" EnableRowVirtualization="False" Margin="-1 5 3 0" HeadersVisibility="Column"
pu:DataGridHelper.SelectedBackground="#44B5B5B5" pu:DataGridHelper.HoverBackground="#22B5B5B5" CanUserAddRows="False"
AutoGenerateColumns="False" LoadingRow="OnDataGridLoadingRow" SelectionMode="Single" Name="dg_order2" pu:DataGridHelper.ColumnHorizontalContentAlignment="Center" CanUserSortColumns="True" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="操作" Width="*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Button Content="开始出库" pu:ButtonHelper.Icon="&#xf20e;" pu:ButtonHelper.CornerRadius="5" Click="OnOutStore_Click" Padding="8" Margin="5,8,5,8" >
</Button>
<Button Content="查看明细" pu:ButtonHelper.Icon="&#xf1cb;" pu:ButtonHelper.CornerRadius="5" Click="OnShowDetail_Click" Padding="8" Margin="5,8,5,8" >
</Button>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<usControl:PageControl IsEnabled="{Binding BindButton}" x:Name="d_pager" Margin="0,0,0,0" Grid.Row="2" TotalRecord="{Binding TotalRecord,Mode=TwoWay}" TotalPage="{Binding PageTotal,Mode=TwoWay}" PageSize="{Binding PageSize,Mode=TwoWay}" PageIndex="{Binding PageIndex,Mode=TwoWay}" Grid.ColumnSpan="5"
Grid.Column="0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="OnPageChanged">
<i:InvokeCommandAction Command="{Binding OnPageChangeCmd}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</usControl:PageControl>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using GalaSoft.MvvmLight.CommandWpf;
using System.ComponentModel;
namespace LiteChannel
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
public partial class MainWindow2 : WindowX, IComponentConnector
{
private PageControl2Model model;
private readonly string _type = "";
public MainWindow2(string type)
{
InitializeComponent();
model = new PageControl2Model(this);
switch (type)
{
case "借用":
{
_type = "借用";
dgtc_BorrowPolice.Visibility = Visibility.Visible;
break;
}
case "领用":
{
_type = "领用";
break;
}
case "调拨":
{
_type = "库存调拨";
dgtc_ReceiveWarehouseName.Visibility = Visibility.Visible;
break;
}
case "跨库":
{
_type = "跨库";
break;
}
default:
{
MessageBox.Show("无效类型");
this.Close();
break;
}
}
lb_type.Content = "当前模式:" + _type;
}
private void MainWindowLoaded(object sender, RoutedEventArgs e)
{
DataContext = model;
//加载单据数据
model.PageIndex = 1;
LoadData();
}
public void LoadData()
{
var tmp = HttpHelper.GetOrderInfos(model.PageIndex, model.PageSize, _type);
model.TotalRecord = tmp?.totalElements ?? 0;
model.PageTotal = model.TotalRecord == 0 ? 0 : (model.TotalRecord + model.PageSize - 1) / model.PageSize;
dg_order.ItemsSource = tmp?.content;
dg_order2.ItemsSource = tmp?.content;
}
private void OnDataGridLoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = e.Row.GetIndex() + 1;
}
private void OnOutStore_Click(object sender, RoutedEventArgs e)
{
if (dg_order2.SelectedItem != null)
{
var item = dg_order2.SelectedItem as order_info;
var from = new StoreOutWindow(item.id, item.orderType, item);
from.Owner = this;
from.OnApplySuc += LoadData;
from.ShowDialog();
}
}
private void OnOutStoreNoOrder_Click(object sender, RoutedEventArgs e)
{
var from = new StoreOutWindow("", "NoOrder", null);
from.Owner = this;
from.OnApplySuc += LoadData;
from.ShowDialog();
}
private void OnShowDetail_Click(object sender, RoutedEventArgs e)
{
if (dg_order2.SelectedItem != null)
{
var item = dg_order2.SelectedItem as order_info;
var from = new OrderInfoWindows(item.id, item.orderType);
from.Owner = this;
from.OnApplySuc += LoadData;
from.ShowDialog();
}
}
private void OnInStore_Click(object sender, RoutedEventArgs e)
{
var from = new StoreInWindow();
from.Owner = this;
from.OnApplySuc += LoadData;
from.ShowDialog();
}
private void OnRefresh_Click(object sender, RoutedEventArgs e)
{
model.PageIndex = 1;
LoadData();
}
private void OnClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
//Process.GetCurrentProcess().Kill();
}
}
public class PageControl2Model : INotifyPropertyChanged
{
private bool _bindButton = true;
public bool BindButton
{
get { return _bindButton; }
set
{
_bindButton = value;
OnPropertyChanged("BindButton");
}
}
private int _total = 0;
public int TotalRecord
{
get { return _total; }
set
{
_total = value;
OnPropertyChanged("TotalRecord");
}
}
private int _page = 0;
public int PageIndex
{
get { return _page; }
set
{
_page = value;
OnPropertyChanged("PageIndex");
}
}
private int _pageTotal = 0;
public int PageTotal
{
get { return _pageTotal; }
set
{
_pageTotal = value;
OnPropertyChanged("PageTotal");
}
}
private int _pageSize = 50;
public int PageSize
{
get { return _pageSize; }
set
{
_pageSize = value;
OnPropertyChanged("PageSize");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string strPropertyInfo)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(strPropertyInfo));
}
}
private readonly MainWindow2 _mainWindow;
public RelayCommand OnPageChangeCmd { get; set; }
public PageControl2Model(MainWindow2 mainWindow)
{
_mainWindow = mainWindow;
PageSize = 10;
OnPageChangeCmd = new RelayCommand(OnPageChange);
}
private void OnPageChange()
{
_mainWindow.LoadData();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class BaseJpWarehouse
{
public string id { get; set; }
public int? sort { get; set; }
public string name { get; set; }
public string location { get; set; }
public string locationDetail { get; set; }
public string orgizationId { get; set; }
public string phone { get; set; }
public DateTime createTime { get; set; }
public DateTime updateTime { get; set; }
public string updateUser { get; set; }
/// <summary>
/// 是否锁库,0:未锁库,1:锁库中
/// </summary>
public bool? isLocked { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class equ_info
{
public string id { get; set; }
public string code { get; set; }
public string name { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class order_equ
{
public string equCode { get; set; }
public int equRem { get; set; }
public int equCount { get; set; }
public int equUsed { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class order_info
{
public string id { get; set; }
public string warehouseId { get; set; }
public string orderCode { get; set; }
public string orgId { get; set; }
public string createTime { get; set; }
public bool? isWork { get; set; }
public string orderType { get; set; }
public int orderQuantity { get; set; }
public string equNames { get; set; }
public string borrowPolice { get; set; }
public string receiveWarehouseId { get; set; }
public string receiveWarehouseName { get; set; }
}
public class order_detail
{
public string id { get; set; }
public string equId { get; set; }
public string equName { get; set; }
public string equCode { get; set; }
public int equCount { get; set; }
public int equUsed { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class request_sign
{
public string appKey { get; set; } = string.Empty;
public string orgId { get; set; } = string.Empty;
public string version { get; set; } = "1.0";
public string timestamp { get; set; }
public string body { get; set; }
public string sign { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class respone<T>
{
public int code { get; set; }
public string msg { get; set; }
public T data { get; set; }
}
public class respone
{
public int code { get; set; }
public string msg { get; set; }
}
public class PagedList<T>
{
public int totalElements { get; set; }
public List<T> content { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class respone_upload
{
public int code { get; set; }
public string msg { get; set; }
public int timestamp { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class response_BoxMarkModel
{
public string id { get; set; }
public string createTime { get; set; }
public string epc { get; set; }
public string oneBoxNum { get; set; }
public string warehouseId { get; set; }
public string warehouseName { get; set; }
public string orgizationId { get; set; }
public string equipmentInfoId { get; set; }
public string equipmentDetailId { get; set; }
public string equipmentDetailName { get; set; }
public string equipmentDetailCode { get; set; }
public string sizeId { get; set; }
public string sizeName { get; set; }
public string sizeCode { get; set; }
public string sizeEpcType { get; set; }
public string supplierId { get; set; }
public string supplierCode { get; set; }
public string supplierName { get; set; }
public List<string> epcList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class rfid_res
{
public string epc { get; set; }
public string name { get; set; }
public int currentState { get; set; }
public int safeLevel { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class scan_info : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int equRem { get; set; }
public string equCode { get; set; }
public string equName { get; set; }
private int _scan_qty = 0;
public int scanQty
{
get { return _scan_qty; }
set
{
_scan_qty = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("scanQty"));
}
}
public int equCount { get; set; }
public List<string> epcList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class soft_update
{
public string version2 { get; set; }
public int version { get; set; }
public string name { get; set; }
public string appCode { get; set; }
public string note { get; set; }
public string address { get; set; }
public string updateTime { get; set; }
public string fileMd5 { get; set; }
public bool isAutoUpdate { get; set; }
public string autoUpdateAddress { get; set; }
public string autoUpdateFileMd5 { get; set; }
public string autoUpdateVersion2 { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class store_info
{
public string id { get; set; }
public string name { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class sync_police
{
public string orgId { get; set; }
public string id { get; set; }
public string name { get; set; }
public string policeCode { get; set; }
public string photo { get; set; }
public DateTime udateTime { get; set; }
public DateTime createTime { get; set; }
public List<FingerInfo> fingerList { get; set; }
}
public class FingerInfo
{
public int fingerNum { get; set; }
public string fingerInfo { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel.Models
{
public class upload_info
{
public string orgId { get; set; }
public string warehouseId { get; set; }
/// <summary>
/// "当前出入库状态",//0出库,1入库
/// </summary>
public string currentState { get; set; }
public string policeId { get; set; } = string.Empty;
public string picUrl { get; set; }
public List<rfid_info> RFIDList { get; set; }
}
public class rfid_info
{
public string RFID { get; set; }
}
}
<pu:WindowX x:Class="LiteChannel.OrderInfoWindows"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
mc:Ignorable="d" Icon="1.ico"
Title="单据明细" Height="350" Width="550" Loaded="OnWindow_Loaded" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="280"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" pu:DataGridHelper.ColumnHorizontalContentAlignment="Center" x:Name="dg_detail" HorizontalAlignment="Stretch" BorderThickness="0,0,0,0" VerticalAlignment="Stretch" pu:DataGridHelper.SelectedBackground="#44B5B5B5" pu:DataGridHelper.HoverBackground="#22B5B5B5" CanUserAddRows="False" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="装备名称" Binding="{Binding equName}" Width="*" ></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="申请数量" Binding="{Binding equCount}" Width="100"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="已出库数量" Binding="{Binding equUsed}" Width="100"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="bt_CloseOrder" Visibility="Collapsed" Grid.Row="1" Click="OnCloseOrder_Click" pu:ButtonHelper.Icon="&#xf2d3;" Margin="0,0,0,0" Content="中止单据" FontFamily="{StaticResource FontAwesome}" FontSize="18" Background="#C8FF0000" pu:ButtonHelper.HoverBrush="#FF0000" ></Button>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace LiteChannel
{
/// <summary>
/// OrderInfoWindows.xaml 的交互逻辑
/// </summary>
public partial class OrderInfoWindows : WindowX, IComponentConnector
{
private string id = string.Empty;
private string type = string.Empty;
public event Action OnApplySuc;
public OrderInfoWindows(string id, string type)
{
InitializeComponent();
this.id = id;
this.type = type;
this.Title = type + "明细";
dg_detail.AutoGenerateColumns = false;
if (type == "借用" || type == "库存调拨")
{
bt_CloseOrder.Visibility = Visibility.Visible;
}
}
private void OnWindow_Loaded(object sender, RoutedEventArgs e)
{
dg_detail.ItemsSource = HttpHelper.GetOrderDetails(id, type);
}
private void OnCloseOrder_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("是否关闭此单据?此操作不可撤销", "警告", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
var orderType = "";
if (type == "借用")
{
orderType = "Borrow";
}
if (type == "库存调拨")
{
orderType = "Transfer";
}
if (HttpHelper.CloseOrder(id, orderType))
{
MessageBox.Show("关闭成功");
OnApplySuc?.Invoke();
this.Close();
}
else
{
MessageBox.Show("关闭失败");
}
}
}
}
}
<pu:WindowX x:Class="LiteChannel.OutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
xmlns:usControl="clr-namespace:LiteChannel.UsControl"
mc:Ignorable="d" Icon="1.ico"
Height="720" Width="1024" Loaded="MainWindowLoaded" ResizeMode="NoResize"
AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen"
WindowState="Maximized" pu:WindowXCaption.DisableCloseButton="True">
<Grid x:Name="g_main">
<Grid.RowDefinitions>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Button Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="10,10,10,10" Click="OnOutStoreNoOrder_Click" pu:ButtonHelper.Icon="&#xf085;" Content="无单据出库" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="2" Grid.Column="1" Margin="10,10,10,10" Click="OnOutStoreJY_Click" pu:ButtonHelper.Icon="&#xf085;" Content="借用" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="2" Grid.Column="2" Margin="10,10,10,10" Click="OnOutStoreLY_Click" pu:ButtonHelper.Icon="&#xf085;" Content="领用" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="3" Grid.Column="1" Margin="10,10,10,10" Click="OnOutStoreDB_Click" pu:ButtonHelper.Icon="&#xf085;" Content="调拨" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="3" Grid.Column="2" Margin="10,10,10,10" Click="OnOutStoreKK_Click" pu:ButtonHelper.Icon="&#xf085;" Content="跨库" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="30"></Button>
<Button Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" Click="OnClose_Click" pu:ButtonHelper.Icon="&#xf2d3;" Margin="10,10,10,10" Content="返回上级" FontFamily="{StaticResource FontAwesome}" pu:ButtonHelper.CornerRadius="5" FontSize="24" Background="#C8FF0000" pu:ButtonHelper.HoverBrush="#FF0000" ></Button>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using GalaSoft.MvvmLight.CommandWpf;
using System.ComponentModel;
namespace LiteChannel
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
public partial class OutWindow : WindowX, IComponentConnector
{
public OutWindow()
{
InitializeComponent();
}
private void MainWindowLoaded(object sender, RoutedEventArgs e)
{
}
private void OnOutStoreNoOrder_Click(object sender, RoutedEventArgs e)
{
var from = new StoreOutWindow("", "NoOrder", null);
from.Owner = this;
from.ShowDialog();
}
private void OnOutStoreJY_Click(object sender, RoutedEventArgs e)
{
var from = new MainWindow2("借用");
from.Owner = this;
from.ShowDialog();
}
private void OnOutStoreLY_Click(object sender, RoutedEventArgs e)
{
var from = new MainWindow2("领用");
from.Owner = this;
from.ShowDialog();
}
private void OnOutStoreDB_Click(object sender, RoutedEventArgs e)
{
var from = new MainWindow2("调拨");
from.Owner = this;
from.ShowDialog();
}
private void OnOutStoreKK_Click(object sender, RoutedEventArgs e)
{
var from = new MainWindow2("跨库");
from.Owner = this;
from.ShowDialog();
}
private void OnClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("LiteChannel")]
[assembly: AssemblyDescription("充电台出入库程序,提供出入库信息上报功能。")]
[assembly: AssemblyConfiguration("充电台出入库程序,提供出入库信息上报功能。")]
[assembly: AssemblyCompany("Junmp")]
[assembly: AssemblyProduct("LiteChannel")]
[assembly: AssemblyCopyright("Copyright © Junmp 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
//若要开始生成可本地化的应用程序,请设置
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
//例如,如果您在源文件中使用的是美国英语,
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
//对以下 NeutralResourceLanguage 特性的注释。 更新
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
//(未在页面中找到资源时使用,
//或应用程序资源字典中找到时使用)
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
//(未在页面中找到资源时使用,
//、应用程序或任何主题专用资源字典中找到时使用)
)]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.4.06280")]
[assembly: AssemblyFileVersion("1.2.4.06280")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本: 4.0.30319.42000
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace LiteChannel.Properties
{
/// <summary>
/// 强类型资源类,用于查找本地化字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.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 ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LiteChannel.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;
}
}
}
}
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace LiteChannel.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.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;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点。n
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
元素。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表。取消评论适当的元素,
Windows 将自动选择最兼容的环境。 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>
\ No newline at end of file
<pu:WindowX x:Class="LiteChannel.Setting"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
mc:Ignorable="d"
Title="系统配置" Height="620" Loaded="OnWindow_Loaded" Width="800" Icon="1.ico" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="10"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="1" Text="软件版本:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="2" Name="txt_ver" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="软件编码:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="4" Name="txt_code" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="接口域名:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="2" x:Name="txt_domain" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="3" Text="登录接口:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="4" x:Name="txt_login" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="装备信息:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="2" x:Name="txt_equ" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Grid.Column="3" Text="仓库信息:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="4" x:Name="txt_store" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="3" Grid.Column="1" Text="订单信息:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="3" Grid.Column="2" x:Name="txt_order" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="3" Grid.Column="3" Text="订单明细:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="3" Grid.Column="4" x:Name="txt_detail" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="4" Grid.Column="1" Text="更新接口:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="4" Grid.Column="2" x:Name="txt_update" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="4" Grid.Column="3" Text="串口编号:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ComboBox Grid.Row="4" Grid.Column="4" x:Name="cbo_com" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="5" Grid.Column="1" Text="程序标题:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="5" Grid.Column="2" x:Name="txt_title" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="5" Grid.Column="3" Text="所属仓库:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ComboBox Grid.Row="5" Grid.Column="4" x:Name="cbo_warehouse" Width="auto" Height="25"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
pu:ComboBoxHelper.HoverBackground="#1EB5B5B5"
pu:ComboBoxHelper.SelectedBackground="#32B5B5B5"
pu:ComboBoxHelper.IsSearchTextBoxVisible="True"
pu:ComboBoxHelper.SearchTextChanged="cbo_warehouse_SearchTextChanged"
pu:ComboBoxHelper.SearchTextBoxWatermark="在此搜索仓库..."></ComboBox>
<TextBlock Grid.Row="6" Grid.Column="1" Text="门禁地址:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="6" Grid.Column="2" x:Name="txt_ip" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="6" Grid.Column="3" Text="门禁端口:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="6" Grid.Column="4" x:Name="txt_port" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="7" Grid.Column="1" Text="门禁用户:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="7" Grid.Column="2" x:Name="txt_user" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="7" Grid.Column="3" Text="门禁密码:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="7" Grid.Column="4" x:Name="txt_pwd" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="8" Grid.Column="1" Text="门禁状态:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ComboBox Grid.Row="8" Grid.Column="2" x:Name="cbo_state" Width="auto" Height="25"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
pu:ComboBoxHelper.HoverBackground="#1EB5B5B5"
pu:ComboBoxHelper.SelectedBackground="#32B5B5B5"
pu:ComboBoxHelper.IsSearchTextBoxVisible="False">
<ComboBoxItem>启用</ComboBoxItem>
<ComboBoxItem>禁用</ComboBoxItem>
</ComboBox>
<TextBlock Grid.Row="9" Grid.Column="1" Text="启用智能货架:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ComboBox Grid.Row="9" Grid.Column="2" x:Name="cbo_shelf" Width="auto" Height="25"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
pu:ComboBoxHelper.HoverBackground="#1EB5B5B5"
pu:ComboBoxHelper.SelectedBackground="#32B5B5B5"
pu:ComboBoxHelper.IsSearchTextBoxVisible="False">
<ComboBoxItem>启用</ComboBoxItem>
<ComboBoxItem>禁用</ComboBoxItem>
</ComboBox>
<TextBlock Grid.Row="9" Grid.Column="3" Text="智能货架地址:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="9" Grid.Column="4" x:Name="txt_shelf" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="10" Grid.Column="1" Text="epc获取物资:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="10" Grid.Column="2" x:Name="txt_getInvListByEpc" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="11" Grid.Column="1" Text="AppKey:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="11" Grid.Column="2" x:Name="txt_appkey" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="11" Grid.Column="3" Text="SecretKey:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox Grid.Row="11" Grid.Column="4" x:Name="txt_secretkey" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<TextBlock Grid.Row="12" Grid.Column="1" Text="自动更新:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<CheckBox Grid.Row="12" Grid.Column="2" x:Name="cb_autoUpdate" Width="auto" Height="25" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="8,8,0,8" Click="cb_autoUpdate_Click">启用自动更新,检查时间:</CheckBox>
<ComboBox Grid.Row="12" Grid.Column="2" x:Name="cbb_autoUpdate" Width="auto" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="188,0,0,0"
pu:ComboBoxHelper.HoverBackground="#1EB5B5B5"
pu:ComboBoxHelper.SelectedBackground="#32B5B5B5"
pu:ComboBoxHelper.IsSearchTextBoxVisible="False">
<ComboBoxItem>0:00</ComboBoxItem>
<ComboBoxItem>1:00</ComboBoxItem>
<ComboBoxItem>2:00</ComboBoxItem>
<ComboBoxItem>3:00</ComboBoxItem>
<ComboBoxItem>4:00</ComboBoxItem>
<ComboBoxItem>5:00</ComboBoxItem>
<ComboBoxItem>6:00</ComboBoxItem>
<ComboBoxItem>7:00</ComboBoxItem>
<ComboBoxItem>8:00</ComboBoxItem>
<ComboBoxItem>9:00</ComboBoxItem>
<ComboBoxItem>10:00</ComboBoxItem>
<ComboBoxItem>11:00</ComboBoxItem>
<ComboBoxItem>12:00</ComboBoxItem>
<ComboBoxItem>13:00</ComboBoxItem>
<ComboBoxItem>14:00</ComboBoxItem>
<ComboBoxItem>15:00</ComboBoxItem>
<ComboBoxItem>16:00</ComboBoxItem>
<ComboBoxItem>17:00</ComboBoxItem>
<ComboBoxItem>18:00</ComboBoxItem>
<ComboBoxItem>19:00</ComboBoxItem>
<ComboBoxItem>20:00</ComboBoxItem>
<ComboBoxItem>21:00</ComboBoxItem>
<ComboBoxItem>22:00</ComboBoxItem>
<ComboBoxItem>23:00</ComboBoxItem>
</ComboBox>
<Button Grid.Row="14" Grid.ColumnSpan="6" Click="OnSave_Click" HorizontalAlignment="Right" Width="90" Margin="0,0,215,0">保存配置</Button>
<Button Grid.Row="14" Grid.ColumnSpan="6" Click="OnRefresh_Click" HorizontalAlignment="Right" Width="90" Margin="0,0,110,0">刷新仓库</Button>
<Button Grid.Row="14" Grid.ColumnSpan="6" Click="OnCancel_Click" HorizontalAlignment="Right" Background="#C8FF7F00" pu:ButtonHelper.HoverBrush="#FF7F00" Width="90" Margin="0,0,10,0">关闭</Button>
</Grid>
</pu:WindowX>
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace LiteChannel
{
/// <summary>
/// Setting.xaml 的交互逻辑
/// </summary>
public partial class Setting : WindowX, IComponentConnector
{
private bool IsLoaded = false;
private List<store_info> StoreList { get; set; }
public Setting()
{
InitializeComponent();
}
private void OnSave_Click(object sender, RoutedEventArgs e)
{
//int.TryParse(txt_ver.Text, out int ver);
LiteCaChe.SysConfig.UserLogin = txt_login.Text;
LiteCaChe.SysConfig.AppCode = txt_code.Text;
LiteCaChe.SysConfig.GetOrderDetail = txt_detail.Text;
LiteCaChe.SysConfig.DomainUrl = txt_domain.Text;
LiteCaChe.SysConfig.GetEquInfo = txt_equ.Text;
LiteCaChe.SysConfig.GetOrderInfo = txt_order.Text;
LiteCaChe.SysConfig.GetStoreInfo = txt_store.Text;
//LiteCaChe.SysConfig.AppTitle = txt_title.Text;
LiteCaChe.SysConfig.SoftUpdate = txt_update.Text;
//LiteCaChe.SysConfig.AppVersion = ver;
LiteCaChe.SysConfig.ComMouth = cbo_com.Text;
LiteCaChe.SysConfig.WarehouseID = cbo_warehouse.SelectedValue?.ToString() ?? "";
LiteCaChe.SysConfig.FaceAddress = txt_ip.Text;
LiteCaChe.SysConfig.FacePort = txt_port.Text;
LiteCaChe.SysConfig.FaceUser = txt_user.Text;
LiteCaChe.SysConfig.FacePwd = txt_pwd.Text;
LiteCaChe.SysConfig.IsUseFace = cbo_state.Text == "启用" ? true : false;
LiteCaChe.SysConfig.AppKey = txt_appkey.Text;
LiteCaChe.SysConfig.SecretKey = txt_secretkey.Text;
LiteCaChe.SysConfig.IsEnabledShelf = cbo_shelf.Text == "启用";
LiteCaChe.SysConfig.ShelfAddress = txt_shelf.Text;
LiteCaChe.SysConfig.GetInvListByEpc = txt_getInvListByEpc.Text;
LiteCaChe.SysConfig.IsAutoUpdate = cb_autoUpdate.IsChecked == true;
LiteCaChe.SysConfig.AutoUpdateTime = cbb_autoUpdate.SelectedIndex;
LiteCaChe.SaveSystemStep(LiteCaChe.SysConfig);
MessageBox.Show("配置保存成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
this.Close();
}
private void OnCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void OnRefresh_Click(object sender, RoutedEventArgs e)
{
StoreList = HttpHelper.GetStoreInfos();
cbo_warehouse.ItemsSource = StoreList;
}
private void OnWindow_Loaded(object sender, RoutedEventArgs e)
{
cbo_com.ItemsSource = SerialPort.GetPortNames();
StoreList = HttpHelper.GetStoreInfos();
cbo_warehouse.ItemsSource = StoreList;
cbo_warehouse.DisplayMemberPath = "name";
cbo_warehouse.SelectedValuePath = "id";
txt_login.Text = LiteCaChe.SysConfig.UserLogin;
txt_code.Text = LiteCaChe.SysConfig.AppCode;
txt_detail.Text = LiteCaChe.SysConfig.GetOrderDetail;
txt_domain.Text = LiteCaChe.SysConfig.DomainUrl;
txt_equ.Text = LiteCaChe.SysConfig.GetEquInfo;
txt_order.Text = LiteCaChe.SysConfig.GetOrderInfo;
txt_store.Text = LiteCaChe.SysConfig.GetStoreInfo;
txt_title.Text = LiteCaChe.SysConfig.AppTitle;
txt_update.Text = LiteCaChe.SysConfig.SoftUpdate;
txt_ver.Text = LiteCaChe.SysConfig.AppVersion.ToString();
cbo_com.Text = LiteCaChe.SysConfig.ComMouth;
cbo_warehouse.SelectedValue = LiteCaChe.SysConfig.WarehouseID;
txt_ip.Text = LiteCaChe.SysConfig.FaceAddress;
txt_port.Text = LiteCaChe.SysConfig.FacePort;
txt_user.Text = LiteCaChe.SysConfig.FaceUser;
txt_pwd.Text = LiteCaChe.SysConfig.FacePwd;
cbo_state.SelectedIndex = LiteCaChe.SysConfig.IsUseFace ? 0 : 1;
txt_appkey.Text = LiteCaChe.SysConfig.AppKey;
txt_secretkey.Text = LiteCaChe.SysConfig.SecretKey;
cbo_shelf.SelectedIndex = LiteCaChe.SysConfig.IsEnabledShelf ? 0 : 1;
txt_shelf.Text = LiteCaChe.SysConfig.ShelfAddress;
txt_getInvListByEpc.Text = LiteCaChe.SysConfig.GetInvListByEpc;
cb_autoUpdate.IsChecked = LiteCaChe.SysConfig.IsAutoUpdate;
if (cb_autoUpdate.IsChecked == true)
{
cbb_autoUpdate.IsEnabled = true;
}
else
{
cbb_autoUpdate.IsEnabled = false;
}
cbb_autoUpdate.SelectedIndex = LiteCaChe.SysConfig.AutoUpdateTime;
IsLoaded = true;
}
private void cbo_warehouse_SearchTextChanged(object sender, Panuon.UI.Silver.Core.SearchTextChangedEventArgs e)
{
if (!IsLoaded)
return;
cbo_warehouse.ItemsSource = StoreList.Where(t => t.name.Contains(e.Text));
}
private void OnSldCornerRadius_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!IsLoaded)
return;
}
private void cb_autoUpdate_Click(object sender, RoutedEventArgs e)
{
if (cb_autoUpdate.IsChecked == true)
{
cbb_autoUpdate.IsEnabled = true;
}
else
{
cbb_autoUpdate.IsEnabled = false;
}
}
}
}
<pu:WindowX x:Class="LiteChannel.StoreInWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
mc:Ignorable="d" Icon="1.ico"
Title="盘点入库" Height="400" Width="650" WindowState="Normal"
WindowStartupLocation="CenterScreen"
ResizeMode="NoResize" Loaded="OnWindow_Loaded" Closing="OnWindow_Closing">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="0"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" Grid.ColumnSpan="2" x:Name="dg_epc" HorizontalAlignment="Stretch" BorderThickness="0,0,0,1" VerticalAlignment="Stretch" pu:DataGridHelper.SelectedBackground="#44B5B5B5" pu:DataGridHelper.HoverBackground="#22B5B5B5" CanUserAddRows="False" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="装备名称" Binding="{Binding equName}" Width="*"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="识别数量" Binding="{Binding scanQty,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Width="100"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<!--<ComboBox Name="cbo_type" Grid.Row="1" Grid.Column="1" pu:ComboBoxHelper.Watermark="请选择入库类型..." Height="40" Margin="5,0,5,0">
<ComboBoxItem>采购</ComboBoxItem>
<ComboBoxItem>借用</ComboBoxItem>
<ComboBoxItem>跨库借用</ComboBoxItem>
<ComboBoxItem>库存调拨</ComboBoxItem>
<ComboBoxItem>维修</ComboBoxItem>
<ComboBoxItem>跨库归还</ComboBoxItem>
</ComboBox>-->
<TextBlock Grid.Row="2" Grid.ColumnSpan="2" Margin="0,0,220,0" Foreground="Red" Name="txt_stat" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="20">状态:读写器启动失败</TextBlock>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="2" Grid.ColumnSpan="2" IsEnabled="false" Name="btn_inv" HorizontalAlignment="Right" Click="OnInv_Click" Width="90" Height="35" Margin="0,0,213,0">开始读取</Button>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Width="90" Height="35" Margin="0,0,110,0" Click="OnSave_Click">提交入库</Button>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Background="#C8FF7F00" Click="OnExit_Click" pu:ButtonHelper.HoverBrush="#FF7F00" Width="90" Height="35" Margin="0,0,10,0">退出</Button>
</Grid>
</pu:WindowX>
using JmpRfidLp;
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
using Panuon.UI.Silver.Core;
namespace LiteChannel
{
/// <summary>
/// StoreWindow.xaml 的交互逻辑
/// </summary>
public partial class StoreInWindow : WindowX, IComponentConnector
{
private JmpRfidLp.Reader reader;
private List<scan_info> SourcesList = new List<scan_info>();
private List<scan_info> BoxMarkList = new List<scan_info>();
private Queue<string> _epcQueue = new Queue<string>();
private CancellationTokenSource tokenSource = new CancellationTokenSource();
private ObservableCollection<scan_info> RefreshSourcesList = new ObservableCollection<scan_info>();
private Dictionary<ulong, string> dic_equ = new Dictionary<ulong, string>();
private List<order_equ> orderWzdm = new List<order_equ>();
public event Action OnApplySuc;
public StoreInWindow()
{
InitializeComponent();
dg_epc.AutoGenerateColumns = false;
}
private void OnWindow_Loaded(object sender, RoutedEventArgs e)
{
ConnectReader();
EpcHandleTask(tokenSource.Token);
}
private bool ConnectReader()
{
try
{ //启动读写器
reader = new Reader(LiteCaChe.SysConfig.ComMouth);
reader.OnInventory += OnRadioInventory;
var state = reader.Open();
if (state)
{
var version = reader.GetFWVerion();
if (string.IsNullOrEmpty(version))
{
txt_stat.Text = "状态:读写器版本读取失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
reader.InventoryStop();
reader.SetPALevel(1);
reader.SetTxPower(0, true, 24);
txt_stat.Text = "状态:读写器连接成功";
txt_stat.Foreground = new SolidColorBrush(Colors.Green);
btn_inv.IsEnabled = true;
return true;
}
else
{
txt_stat.Text = "状态:读写器连接失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
}
catch (Exception ex)
{
reader = null;
txt_stat.Text = "状态:读写器连接失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
}
private void OnRadioInventory(TagInfo args)
{
if (!BoxMarkList.Any(t => t.epcList.Contains(args.EPC)) &&
args.EPC.Length == 24 && args.EPC.Substring(0, 4) == "5842")
{
//有效标签
lock (_epcQueue)
{
if (!_epcQueue.Contains(args.EPC))
{
_epcQueue.Enqueue(args.EPC);
return;
}
}
}
if (!SourcesList.Any(t => t.epcList.Contains(args.EPC)) &&
!BoxMarkList.Any(t => t.epcList.Contains(args.EPC)) &&
args.EPC.Length == 64)
{
var buffer = EpcConvert.ToHexByte(args.EPC);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info != null)
{
var equ_info = LiteCaChe.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
if (equ_info != null)
{
//有效标签
lock (_epcQueue)
{
if (!_epcQueue.Contains(args.EPC))
{
_epcQueue.Enqueue(args.EPC);
}
}
}
}
}
}
private void EpcHandleTask(CancellationToken token)
{
Task.Run(() =>
{
var epcList = new List<string>();
while (true)
{
if (token.IsCancellationRequested)
{
break;
}
lock (_epcQueue)
{
if (_epcQueue.Count != 0)
{
epcList = _epcQueue.ToList();
_epcQueue.Clear();
}
else
{
Thread.Sleep(500);
continue;
}
}
foreach (var epc in epcList)
{
//再次检查是否被阻塞阶段添加标签
if (!SourcesList.Any(t => t.epcList.Contains(epc))
&& !BoxMarkList.Any(t => t.epcList.Contains(epc)))
{
var tempEpc = epc;
if (tempEpc.Length == 24)
{
//旧版箱标epc
var boxMarkInfo = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = "",
equName = "",
};
lock (BoxMarkList)
{
BoxMarkList.Add(boxMarkInfo);
}
IPendingHandler handler = null;
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler = PendingBox.Show("EPC转换中...", "", false, Application.Current.MainWindow, new PendingBoxConfigurations()
{
LoadingForeground = "#5DBBEC".ToColor().ToBrush(),
MaxWidth = 250,
MinHeight = 110,
MinWidth = 250,
MaxHeight = 110,
ButtonBrush = "#5DBBEC".ToColor().ToBrush(),
});
}));
var xbData = HttpHelper.GetEpcListByBoxMarkEpc(new List<string>() { tempEpc });
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler?.Close();
}));
if (xbData == null || xbData.Count == 0)
{
//无效epc,过滤
continue;
}
tempEpc = xbData.First().epc;
}
var buffer = EpcConvert.ToHexByte(tempEpc);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info != null)
{
var equ_info = LiteCaChe.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
if (equ_info != null)
{
if (epc_info.TagType == 0x01)
{
//读取到箱标提示
IPendingHandler handler2 = null;
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler2 = PendingBox.Show("读取到箱标,箱标解析中...", "", false,
Application.Current.MainWindow, new PendingBoxConfigurations()
{
LoadingForeground = "#5DBBEC".ToColor().ToBrush(),
MaxWidth = 350,
MinHeight = 110,
MinWidth = 350,
MaxHeight = 110,
ButtonBrush = "#5DBBEC".ToColor().ToBrush(),
});
}));
//箱标
var boxMarkInfo = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
};
lock (BoxMarkList)
{
BoxMarkList.Add(boxMarkInfo);
}
var xbData = HttpHelper.GetEpcListByBoxMarkEpc(boxMarkInfo.epcList);
if (xbData == null || xbData.Count == 0)
{
//无效epc,过滤
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler2.Close();
}));
continue;
}
foreach (var innerEpc in xbData.First().epcList)
{
var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
if (tmp_info == null)
{
tmp_info = new scan_info()
{
epcList = new List<string>() { innerEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
scanQty = 1
};
lock (SourcesList)
{
SourcesList.Add(tmp_info);
}
}
else
{
tmp_info.scanQty += 1;
tmp_info.epcList.Add(innerEpc);
}
}
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<List<scan_info>>((x) =>
{
RefreshSourcesList = new ObservableCollection<scan_info>(x);
dg_epc.ItemsSource = RefreshSourcesList;
handler2.Close();
}), SourcesList);
}
else
{
var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
if (tmp_info == null)
{
tmp_info = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
scanQty = 1
};
SourcesList.Add(tmp_info);
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<List<scan_info>>((x) =>
{
RefreshSourcesList = new ObservableCollection<scan_info>(x);
dg_epc.ItemsSource = RefreshSourcesList;
}), SourcesList);
}
else
{
tmp_info.scanQty += 1;
tmp_info.epcList.Add(tempEpc);
}
}
}
}
}
}
epcList.Clear();
}
}, token);
}
private void OnInv_Click(object sender, RoutedEventArgs e)
{
if (btn_inv.Content.ToString() == "开始读取")
{
reader?.InventoryStart();
btn_inv.Content = "停止读取";
}
else
{
reader?.InventoryStop();
btn_inv.Content = "开始读取";
}
}
private void OnExit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void OnWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
tokenSource.Cancel();
if (reader?.IsOpen() ?? false)
{
reader?.InventoryStop();
reader?.Close();
}
}
private void OnSave_Click(object sender, RoutedEventArgs e)
{
if (SourcesList != null && SourcesList.Count > 0)
{
List<rfid_info> epcList = new List<rfid_info>();
SourcesList.SelectMany(t => t.epcList).ToList()
.ForEach(s => epcList.Add(new rfid_info()
{
RFID = s
}));
if (epcList.Count > 0)
{
//if (string.IsNullOrEmpty(cbo_type.Text))
//{
// MessageBox.Show(this, "入库类型未选择,请选择后重试!", "出库提示", MessageBoxButton.OK, MessageBoxImage.Information);
//}
//else
{
if (btn_inv.Content.ToString() == "停止读取")
{
OnInv_Click(default, default);
}
var _res = HttpHelper.RfidInStore("", epcList);
MessageBox.Show(this, _res.Item2, "出库提示", MessageBoxButton.OK, MessageBoxImage.Information);
if (_res.Item1)
{
OnApplySuc?.Invoke();
this.Close();
}
}
}
}
}
}
}
<pu:WindowX x:Class="LiteChannel.StoreOutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LiteChannel"
mc:Ignorable="d" Icon="1.ico"
Title="盘点出库" Height="350" Width="650" WindowState="Normal"
WindowStartupLocation="CenterScreen"
ResizeMode="NoResize" Loaded="OnWindow_Loaded" Closing="OnWindow_Closing">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" x:Name="dg_epc" HorizontalAlignment="Stretch" BorderThickness="0,0,0,1" VerticalAlignment="Stretch" pu:DataGridHelper.SelectedBackground="#44B5B5B5" pu:DataGridHelper.HoverBackground="#22B5B5B5" CanUserAddRows="False" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="装备名称" Binding="{Binding equName}" Width="*"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="申领数量" Binding="{Binding equCount}" Width="150" x:Name="equCountGridTextColumn"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="剩余数量" Binding="{Binding equRem}" Width="150" x:Name="equRemGridTextColumn"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="识别数量" Binding="{Binding scanQty,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Width="100"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<TextBlock Grid.Row="1" Margin="0,0,220,0" Foreground="Red" Name="txt_stat" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="20">状态:读写器启动失败</TextBlock>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="1" IsEnabled="false" Name="btn_inv" HorizontalAlignment="Right" Click="OnInv_Click" Width="90" Height="35" Margin="0,0,213,0">开始读取</Button>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="1" HorizontalAlignment="Right" Width="90" Height="35" Margin="0,0,110,0" Click="OnSave_Click">提交出库</Button>
<Button pu:ButtonHelper.CornerRadius="4" Grid.Row="1" HorizontalAlignment="Right" Background="#C8FF7F00" Click="OnExit_Click" pu:ButtonHelper.HoverBrush="#FF7F00" Width="90" Height="35" Margin="0,0,10,0">退出</Button>
</Grid>
</pu:WindowX>
using JmpRfidLp;
using LiteChannel.Commons;
using LiteChannel.Models;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
using Panuon.UI.Silver.Core;
namespace LiteChannel
{
/// <summary>
/// StoreWindow.xaml 的交互逻辑
/// </summary>
public partial class StoreOutWindow : WindowX, IComponentConnector
{
private JmpRfidLp.Reader reader;
private List<scan_info> SourcesList = new List<scan_info>();
private List<scan_info> BoxMarkList = new List<scan_info>();
private Queue<string> _epcQueue = new Queue<string>();
private CancellationTokenSource tokenSource = new CancellationTokenSource();
private ObservableCollection<scan_info> RefreshSourcesList = new ObservableCollection<scan_info>();
private Dictionary<ulong, string> dic_equ = new Dictionary<ulong, string>();
private List<order_equ> orderWzdm = new List<order_equ>();
private string type, id, order_code;
private order_info _orderInfo;
public event Action OnApplySuc;
private readonly bool isNoOrder;
private readonly bool isHaveBoxMark;
public StoreOutWindow(string id, string type, order_info orderInfo)
{
InitializeComponent();
if (type == "NoOrder")
{
isNoOrder = true;
dg_epc.AutoGenerateColumns = false;
equCountGridTextColumn.Visibility = Visibility.Hidden;
equRemGridTextColumn.Visibility = Visibility.Hidden;
}
else
{
this.id = id;
this.order_code = orderInfo.orderCode;
this.type = type;
dg_epc.AutoGenerateColumns = false;
_orderInfo = orderInfo;
}
}
private void OnWindow_Loaded(object sender, RoutedEventArgs e)
{
if (isNoOrder)
{
ConnectReader();
EpcHandleTask(tokenSource.Token);
return;
}
var detail_info = HttpHelper.GetOrderDetails(id, type);
if (detail_info == null)
{
txt_stat.Text = "状态:单据明细获取失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
}
else
{
detail_info.ForEach(s =>
{
orderWzdm.Add(new order_equ()
{
equCode = s.equCode,
equUsed = s.equUsed,
equRem = s.equCount - s.equUsed,
equCount = s.equCount
});
});
ConnectReader();
EpcHandleTask(tokenSource.Token);
}
}
private bool ConnectReader()
{
try
{ //启动读写器
reader = new Reader(LiteCaChe.SysConfig.ComMouth);
reader.OnInventory += OnRadioInventory;
var state = reader.Open();
if (state)
{
var version = reader.GetFWVerion();
if (string.IsNullOrEmpty(version))
{
txt_stat.Text = "状态:读写器版本读取失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
reader.InventoryStop();
reader.SetPALevel(1);
reader.SetTxPower(0, true, 24);
txt_stat.Text = "状态:读写器连接成功";
txt_stat.Foreground = new SolidColorBrush(Colors.Green);
btn_inv.IsEnabled = true;
return true;
}
else
{
txt_stat.Text = "状态:读写器连接失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
}
catch (Exception ex)
{
reader = null;
txt_stat.Text = "状态:读写器连接失败";
txt_stat.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
}
private void OnRadioInventory(TagInfo args)
{
if (!BoxMarkList.Any(t => t.epcList.Contains(args.EPC)) &&
args.EPC.Length == 24 && args.EPC.Substring(0, 4) == "5842")
{
//有效标签
lock (_epcQueue)
{
if (!_epcQueue.Contains(args.EPC))
{
_epcQueue.Enqueue(args.EPC);
return;
}
}
}
if (!SourcesList.Any(t => t.epcList.Contains(args.EPC)) &&
!BoxMarkList.Any(t => t.epcList.Contains(args.EPC)) &&
args.EPC.Length == 64)
{
var buffer = EpcConvert.ToHexByte(args.EPC);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info != null)
{
var equ_info = LiteCaChe.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
if (equ_info != null)
{
//有效标签
lock (_epcQueue)
{
if (!_epcQueue.Contains(args.EPC))
{
_epcQueue.Enqueue(args.EPC);
}
}
}
}
}
}
private void EpcHandleTask(CancellationToken token)
{
Task.Run(() =>
{
var epcList = new List<string>();
while (true)
{
if (token.IsCancellationRequested)
{
break;
}
lock (_epcQueue)
{
if (_epcQueue.Count != 0)
{
epcList = _epcQueue.ToList();
_epcQueue.Clear();
}
else
{
Thread.Sleep(500);
continue;
}
}
foreach (var epc in epcList)
{
//再次检查是否被阻塞阶段添加标签
if (!SourcesList.Any(t => t.epcList.Contains(epc))
&& !BoxMarkList.Any(t => t.epcList.Contains(epc)))
{
var tempEpc = epc;
if (tempEpc.Length == 24)
{
//旧版箱标epc
var boxMarkInfo = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = "",
equName = "",
};
lock (BoxMarkList)
{
BoxMarkList.Add(boxMarkInfo);
}
IPendingHandler handler = null;
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler = PendingBox.Show("EPC转换中...", "", false, Application.Current.MainWindow, new PendingBoxConfigurations()
{
LoadingForeground = "#5DBBEC".ToColor().ToBrush(),
MaxWidth = 250,
MinHeight = 110,
MinWidth = 250,
MaxHeight = 110,
ButtonBrush = "#5DBBEC".ToColor().ToBrush(),
});
}));
var xbData = HttpHelper.GetEpcListByBoxMarkEpc(new List<string>() { tempEpc });
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler?.Close();
}));
if (xbData == null || xbData.Count == 0)
{
//无效epc,过滤
continue;
}
tempEpc = xbData.First().epc;
}
var buffer = EpcConvert.ToHexByte(tempEpc);
var epc_info = EpcConvert.EpcAnlysing(buffer);
if (epc_info != null)
{
var equ_info = LiteCaChe.EquInfos?.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
if (equ_info != null)
{
var equCount = -1;
var equRem = -1;
if (!isNoOrder)
{
var tmp_wzdm = orderWzdm.FirstOrDefault(t => t.equCode.Contains(epc_info.Wzdm.ToString("X")));
if (tmp_wzdm != null)
{
equCount = tmp_wzdm.equCount;
equRem = tmp_wzdm.equRem;
}
else
{
//不是本单据物资,过滤
continue;
}
}
if (epc_info.TagType == 0x01)
{
//读取到箱标提示
IPendingHandler handler2 = null;
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler2 = PendingBox.Show("读取到箱标,箱标解析中...", "", false, Application.Current.MainWindow, new PendingBoxConfigurations()
{
LoadingForeground = "#5DBBEC".ToColor().ToBrush(),
MaxWidth = 350,
MinHeight = 110,
MinWidth = 350,
MaxHeight = 110,
ButtonBrush = "#5DBBEC".ToColor().ToBrush(),
});
}));
//箱标
var boxMarkInfo = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
};
lock (BoxMarkList)
{
BoxMarkList.Add(boxMarkInfo);
}
var xbData = HttpHelper.GetEpcListByBoxMarkEpc(boxMarkInfo.epcList);
if (xbData == null || xbData.Count == 0)
{
//无效epc,过滤
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() =>
{
handler2.Close();
}));
continue;
}
foreach (var innerEpc in xbData.First().epcList)
{
var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
if (tmp_info == null)
{
tmp_info = new scan_info()
{
epcList = new List<string>() { innerEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
scanQty = 1,
equCount = equCount,
equRem = equRem
};
lock (SourcesList)
{
SourcesList.Add(tmp_info);
}
}
else
{
tmp_info.scanQty += 1;
tmp_info.epcList.Add(innerEpc);
}
}
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<List<scan_info>>((x) =>
{
RefreshSourcesList = new ObservableCollection<scan_info>(x);
dg_epc.ItemsSource = RefreshSourcesList;
handler2.Close();
}), SourcesList);
}
else
{
var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
if (tmp_info == null)
{
tmp_info = new scan_info()
{
epcList = new List<string>() { tempEpc },
equCode = epc_info.Wzdm.ToString("X"),
equName = equ_info.name,
scanQty = 1,
equCount = equCount,
equRem = equRem
};
SourcesList.Add(tmp_info);
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<List<scan_info>>((x) =>
{
RefreshSourcesList = new ObservableCollection<scan_info>(x);
dg_epc.ItemsSource = RefreshSourcesList;
}), SourcesList);
}
else
{
tmp_info.scanQty += 1;
tmp_info.epcList.Add(tempEpc);
}
}
}
}
}
}
epcList.Clear();
}
}, token);
}
//private void OnRadioInventory(TagInfo args)
//{
// if (!SourcesList.Any(t => t.epcList.Contains(args.EPC)) && args.EPC.Length == 64)
// {
// var buffer = EpcConvert.ToHexByte(args.EPC);
// var epc_info = EpcConvert.EpcAnlysing(buffer);
// if (epc_info != null)
// {
// if (isNoOrder)
// {
// var equ_info = LiteCaChe.EquInfos.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
// if (equ_info != null)
// {
// var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
// if (tmp_info == null)
// {
// tmp_info = new scan_info()
// {
// epcList = new List<string>() { args.EPC },
// equCode = epc_info.Wzdm.ToString("X"),
// equName = equ_info.name,
// scanQty = 1,
// equCount = -1,
// equRem = -1
// };
// SourcesList.Add(tmp_info);
// Dispatcher.BeginInvoke(DispatcherPriority.Background,
// new Action<List<scan_info>>((x) =>
// {
// RefreshSourcesList = new ObservableCollection<scan_info>(x);
// dg_epc.ItemsSource = RefreshSourcesList;
// }), SourcesList);
// }
// else
// {
// tmp_info.scanQty += 1;
// tmp_info.epcList.Add(args.EPC);
// }
// //this.Dispatcher.Invoke(() =>
// //{
// // dg_epc.ItemsSource = default;
// // dg_epc.ItemsSource = SourcesList;
// //});
// }
// }
// else
// {
// var tmp_wzdm = orderWzdm.FirstOrDefault(t => t.equCode.Contains(epc_info.Wzdm.ToString("X")));
// if (tmp_wzdm != null)
// {
// var equ_info = LiteCaChe.EquInfos.FirstOrDefault(t => t.code == epc_info.Wzdm.ToString("X"));
// if (equ_info != null)
// {
// var tmp_info = SourcesList.FirstOrDefault(t => t.equCode == epc_info.Wzdm.ToString("X"));
// if (tmp_info == null)
// {
// tmp_info = new scan_info()
// {
// epcList = new List<string>() { args.EPC },
// equCode = epc_info.Wzdm.ToString("X"),
// equName = equ_info.name,
// scanQty = 1,
// equCount = tmp_wzdm.equCount,
// equRem = tmp_wzdm.equRem
// };
// SourcesList.Add(tmp_info);
// Dispatcher.BeginInvoke(DispatcherPriority.Background,
// new Action<List<scan_info>>((x) =>
// {
// RefreshSourcesList = new ObservableCollection<scan_info>(x);
// dg_epc.ItemsSource = RefreshSourcesList;
// }), SourcesList);
// }
// else
// {
// tmp_info.scanQty += 1;
// tmp_info.epcList.Add(args.EPC);
// }
// //this.Dispatcher.Invoke(() =>
// //{
// // dg_epc.ItemsSource = default;
// // dg_epc.ItemsSource = SourcesList;
// //});
// }
// }
// }
// }
// }
//}
private void OnInv_Click(object sender, RoutedEventArgs e)
{
if (btn_inv.Content.ToString() == "开始读取")
{
reader?.InventoryStart();
btn_inv.Content = "停止读取";
}
else
{
reader.InventoryStop();
btn_inv.Content = "开始读取";
}
}
private void OnExit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void OnSave_Click(object sender, RoutedEventArgs e)
{
if (SourcesList != null && SourcesList.Count > 0)
{
List<rfid_info> epcList = new List<rfid_info>();
SourcesList.SelectMany(t => t.epcList).ToList()
.ForEach(s => epcList.Add(new rfid_info()
{
RFID = s
}));
if (epcList.Count > 0)
{
if (btn_inv.Content.ToString() == "停止读取")
{
OnInv_Click(default, default);
}
if (isNoOrder)
{
//存在箱标,阻止提交
if (isHaveBoxMark)
{
MessageBox.Show(this, "箱标不允许无单据出库", "出库提示", MessageBoxButton.OK,
MessageBoxImage.Information);
return;
}
//关闭全部单据 传入空的单据信息
if (!HttpHelper.OpenOrderWork(new order_info() { id = "空的单据信息", orderType = "借用" }))
{
MessageBox.Show(this, "单据关闭失败,请重试", "出库提示", MessageBoxButton.OK,
MessageBoxImage.Information);
return;
}
var _res = HttpHelper.RfidOutStore("", "", epcList);
MessageBox.Show(this, _res.Item2, "出库提示", MessageBoxButton.OK, MessageBoxImage.Information);
if (_res.Item1)
{
OnApplySuc?.Invoke();
this.Close();
}
}
else
{
//判断扫描数量是否超出单据数量
var orderDetailList = HttpHelper.GetOrderDetails(id, type);
if (orderDetailList?.Count == 0)
{
Log.WorkLog("单据详情获取失败。");
return;
}
foreach (var item in orderDetailList)
{
var sources = SourcesList.FirstOrDefault(x => x.equName == item.equName);
item.equUsed += sources == null ? 0 : sources.scanQty;
if (item.equUsed > item.equCount)
{
Log.WorkLog("扫描数量超出单据限制:装备名:" + item.equName);
MessageBox.Show(this, "扫描数量超出单据限制:装备名:" + item.equName, "出库提示", MessageBoxButton.OK,
MessageBoxImage.Information);
return;
}
}
//存在箱标并且单据不是调拨,阻止提交
if (isHaveBoxMark && _orderInfo.orderType != "库存调拨")
{
MessageBox.Show(this, "箱标不允许非调拨单据出库", "出库提示", MessageBoxButton.OK,
MessageBoxImage.Information);
return;
}
//开启单据
if (!HttpHelper.OpenOrderWork(_orderInfo))
{
MessageBox.Show(this, "单据开启失败,请重试", "出库提示", MessageBoxButton.OK,
MessageBoxImage.Information);
return;
}
var _res = HttpHelper.RfidOutStore(order_code, type, epcList);
MessageBox.Show(this, _res.Item2, "出库提示", MessageBoxButton.OK, MessageBoxImage.Information);
if (_res.Item1)
{
OnApplySuc?.Invoke();
this.Close();
}
}
}
}
}
private void OnWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (reader?.IsOpen() ?? false)
{
reader?.InventoryStop();
reader?.Close();
}
}
}
}
<UserControl x:Class="LiteChannel.UsControl.InputDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:LiteChannel.UsControl"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" MaxWidth="400">
<Grid Margin="16">
<StackPanel Margin="16">
<TextBlock>请输入打印数量.</TextBlock>
<TextBox Margin="0 8 0 10" HorizontalAlignment="Stretch" x:Name="FruitTextBox" Background="White">
</TextBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
<Button Style="{StaticResource MaterialDesignFlatButton}"
IsDefault="True"
Margin="0 8 8 0"
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="{Binding ElementName=FruitTextBox,Path=Text}">
<!--<Button.CommandParameter>
<system:Boolean>True</system:Boolean>
</Button.CommandParameter>-->
确定
</Button>
<Button Style="{StaticResource MaterialDesignFlatButton}"
IsCancel="True"
Margin="0 8 8 0"
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="close">
<!--<Button.CommandParameter>
<system:Boolean>False</system:Boolean>
</Button.CommandParameter>-->
取消
</Button>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>
using System.Windows.Controls;
namespace LiteChannel.UsControl
{
/// <summary>
/// WaitDialog.xaml 的交互逻辑
/// </summary>
public partial class InputDialog : UserControl
{
public InputDialog()
{
InitializeComponent();
}
}
}
<UserControl x:Class="LiteChannel.UsControl.PageControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d"
d:DesignHeight="65" Background="white" Loaded="DataPageControl_Loaded">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"/>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBox.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.DataGrid.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBlock.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Border BorderBrush="#d9d9d9" BorderThickness="1,0,1,1">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.50*"/>
<ColumnDefinition Width="0.0*"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0">
<TextBlock Name="tbTip" FontSize="20" Grid.Column="0" Foreground="CadetBlue" HorizontalAlignment="Left" Margin="5,0,0,0" Padding="0" VerticalAlignment="Center">第0页,共0页;单页0条记录!</TextBlock>
</StackPanel>
<Button Width="60" Height="60" Click="OnFirPageClick" HorizontalAlignment="Center" ToolTip="第一页" VerticalAlignment="Center" Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Grid.Column="2" BorderThickness="0" Name="btnFirst" Cursor="Hand">
<materialDesign:PackIcon Kind="ArrowCollapseLeft" Height="32" Width="32" />
</Button>
<Button Width="60" Height="60" Click="OnPrePageClick" HorizontalAlignment="Center" ToolTip="上一页" VerticalAlignment="Center" Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Grid.Column="3" BorderThickness="0" Name="btnUp" Cursor="Hand">
<materialDesign:PackIcon Kind="ArrowLeft" Height="32" Width="32"/>
</Button>
<Button Width="60" Height="60" Click="OnNexPageClick" HorizontalAlignment="Center" ToolTip="下一页" VerticalAlignment="Center" Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Grid.Column="4" BorderThickness="0" Name="btnNext" Cursor="Hand">
<materialDesign:PackIcon Kind="ArrowRight" Height="32" Width="32"/>
</Button>
<Button Width="60" Height="60" Click="OnEndPageClick" HorizontalAlignment="Center" ToolTip="最后一页" VerticalAlignment="Center" Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Grid.Column="5" BorderThickness="0" Name="btnEnd" Cursor="Hand">
<materialDesign:PackIcon Kind="ArrowCollapseRight" Height="32" Width="32" />
</Button>
</Grid>
</Border>
</UserControl>
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace LiteChannel.UsControl
{
/// <summary>
/// PageControl.xaml 的交互逻辑
/// </summary>
public partial class PageControl : UserControl
{
#region 委托事件
//定义一个事件
public event RoutedEventHandler OnPageChanged;
#endregion
public PageControl()
{
InitializeComponent();
}
/// <summary>
/// 总页数
/// </summary>
private int pageCount = 0;
/// <summary>
/// 当前页
/// </summary>
private int pageIndex = 0;
#region 每页条数
/// <summary>
/// 注册当前页
/// </summary>
public static readonly DependencyProperty PageSizeProperty = DependencyProperty.Register("PageSize", typeof(string),
typeof(PageControl), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(PageIndexValidation));
/// <summary>
/// 当前页
/// </summary>
public string PageSize
{
get { return GetValue(PageSizeProperty).ToString(); }
set
{
SetValue(PageSizeProperty, value);
}
}
#endregion
#region 当前页
/// <summary>
/// 注册当前页
/// </summary>
public static readonly DependencyProperty PageIndexProperty = DependencyProperty.Register("PageIndex", typeof(string),
typeof(PageControl), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(OnPageIndexChanged)), new ValidateValueCallback(PageIndexValidation));
/// <summary>
/// 验证当前页
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool PageIndexValidation(object value)
{
return true;
}
/// <summary>
/// 当前页
/// </summary>
public string PageIndex
{
get { return GetValue(PageIndexProperty).ToString(); }
set
{
//if (int.Parse(value) <= 0) { value = "1"; }
SetValue(PageIndexProperty, value);
}
}
#endregion
#region 总页数
/// <summary>
/// 总页数
/// </summary>
public static readonly DependencyProperty TotalPageProperty = DependencyProperty.Register("TotalPage", typeof(string), typeof(PageControl), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(OnTotalPageChanged)), new ValidateValueCallback(PageCountPageValidation));
/// <summary>
/// 总页数进行验证
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool PageCountPageValidation(object value)
{
return true;
}
/// <summary>
/// 总页数
/// </summary>
public string TotalPage
{
get { return GetValue(TotalPageProperty).ToString(); }
set
{
SetValue(TotalPageProperty, value);
}
}
/// <summary>
/// 总数据条数
/// </summary>
public static readonly DependencyProperty TotalRecordProperty = DependencyProperty.Register("TotalRecord", typeof(string), typeof(PageControl), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(OnTotalRecodChanged)), new ValidateValueCallback(TotalRecordPageValidation));
/// <summary>
/// 总页数进行验证
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool TotalRecordPageValidation(object value)
{
return true;
}
/// <summary>
/// 总页数
/// </summary>
public string TotalRecord
{
get { return GetValue(TotalRecordProperty).ToString(); }
set
{
SetValue(TotalRecordProperty, value);
}
}
#endregion
#region 私有方法
/// <summary>
/// 值改变方法将由此方法来引发事件
/// </summary>
private void PageChangedTrigger()
{
///引发事件
OnPageChanged?.Invoke(this, new RoutedEventArgs());
}
#endregion
/// <summary>
/// 首页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFirPageClick(object sender, RoutedEventArgs e)
{
PageIndex = "1";
PageChangedTrigger();
}
/// <summary>
/// 前一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnPrePageClick(object sender, RoutedEventArgs e)
{
pageCount = GetIntVal(TotalPage);
pageIndex = GetIntVal(PageIndex);
if (pageIndex > 1)
{
pageIndex = pageIndex - 1;
PageIndex = pageIndex.ToString();
}
PageChangedTrigger();
}
/// <summary>
/// 后一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnNexPageClick(object sender, RoutedEventArgs e)
{
pageIndex = GetIntVal(PageIndex);
pageCount = GetIntVal(TotalPage);
if (pageIndex < pageCount)
{
pageIndex = pageIndex + 1;
PageIndex = pageIndex.ToString();
}
PageChangedTrigger();
}
/// <summary>
/// 尾页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnEndPageClick(object sender, RoutedEventArgs e)
{
pageIndex = GetIntVal(TotalPage);
PageIndex = pageIndex.ToString();
PageChangedTrigger();
}
/// <summary>
/// 刷新当前页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRefresh_Click(object sender, RoutedEventArgs e)
{
PageChangedTrigger();
}
/// <summary>
/// 索引转换int
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
private int GetIntVal(string val)
{
if (!int.TryParse(val, out int temp))
{
temp = 1;
}
return temp;
}
/// <summary>
/// 画每页显示等数据
/// </summary>
private static void DisplayPagingInfo(PageControl datapage)
{
if (int.Parse(datapage.PageIndex) == 1)
{
datapage.btnUp.IsEnabled = false;
datapage.btnFirst.IsEnabled = false;
}
else
{
datapage.btnUp.IsEnabled = true;
datapage.btnFirst.IsEnabled = true;
}
if (int.Parse(datapage.PageIndex) == int.Parse(datapage.TotalPage == "" ? "0" : datapage.TotalPage))
{
datapage.btnNext.IsEnabled = false;
datapage.btnEnd.IsEnabled = false;
}
else
{
datapage.btnNext.IsEnabled = true;
datapage.btnEnd.IsEnabled = true;
}
datapage.tbTip.Text = $"第{datapage.PageIndex}页,共{datapage.TotalPage}页。共{datapage.TotalRecord}条记录!";
}
/// <summary>
/// 当当前页值改变
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void OnTotalPageChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
DisplayPagingInfo(sender as PageControl);
//MyButton hsb = (MyButton)sender;
// SetValue(PageControl.CurrentPageProperty, "1");
// SetFunc();
//Image image = hsb.tehImage;
//CurrentPage = "1";
//image.Source = new BitmapImage((Uri)e.NewValue);
}
/// <summary>
/// 当当前页值改变
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void OnTotalRecodChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
DisplayPagingInfo(sender as PageControl);
}
/// <summary>
/// 当当前页值改变
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void OnPageIndexChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
DisplayPagingInfo(sender as PageControl);
//MyButton hsb = (MyButton)sender;
// SetValue(PageControl.CurrentPageProperty, "1");
// ShowMsg("event");
//Image image = hsb.tehImage;
//CurrentPage = "1";
//image.Source = new BitmapImage((Uri)e.NewValue);
}
private void DataPageControl_Loaded(object sender, RoutedEventArgs e)
{
if (this.pageCount == 1 && pageIndex == 1)
{
btnEnd.IsEnabled = false;
btnFirst.IsEnabled = false;
btnNext.IsEnabled = false;
btnUp.IsEnabled = false;
}
}
}
}
<UserControl x:Class="LiteChannel.UsControl.WaitDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:LiteChannel.UsControl"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel Margin="16">
<ProgressBar Style="{DynamicResource MaterialDesignCircularProgressBar}" x:Name="progress" Minimum="0" Value="0" Maximum="100" HorizontalAlignment="Center" Margin="16" IsIndeterminate="True" />
<TextBlock FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Center" Name="txtTip" Text="数据加载中...."></TextBlock>
</StackPanel>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace LiteChannel.UsControl
{
/// <summary>
/// InputDialog.xaml 的交互逻辑
/// </summary>
public partial class WaitDialog : UserControl
{
public WaitDialog()
{
InitializeComponent();
}
public void SetToolTop(string str, bool flag=false)
{
this.Dispatcher.Invoke(() =>
{
if (flag) { progress.Value = 99; }
this.txtTip.Text = str;
});
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiteChannel
{
public class VOrderInfo
{
public string Id { get; set; }
public string WarehouseId { get; set; }
public string OrderCode { get; set; }
public string OrgId { get; set; }
public DateTime CreateTime { get; set; }
public bool? IsWork { get; set; }
public string OrderType { get; set; }
}
}
qlY+cqBpLohGwnUHjysa+Xmllzuo+epWE1WatyIJg58QRCqFDWJnTpKftJAuzZk29ZfTyhRP2+vOqH0dfo7riorAXQpkerJ19cFrUTZy6zAjnF5qycCEvuz1YcQZ7B/3LuZZh6So0VrYLtNWTIce8gWn+rPraQwX85wXJrJHaKJfJTnl1yPMiwxrbOOpF7Awu6bkVCH5HS4gx+VVv/RHkW1mRlg6/WQUrY6otQmydjG8XEWVuuEoq8DndAjaNU2V5FtiaoLv1ANWRz8K6KXVv2eX+u+6rAdRpwohxen5dLXP1+5wFv27JYuXI2JIPg7pOqy2Di/WuzNo8k4kzA2lRenq3PFWXNRAN+ainUWXczkEKVwAJtL9OzFhMv0YGIqOZDyyFsfxM3C3gDvJ1lXgGvqaJE46oncD3s04b/m9/BXP5ahL+kWVm5KH0o1zB7tY0x5OBhikvc3DN4FTb/TlP63k9Mbvfb6yxXLAJZPEt3Sbqwz5EkqBi3Y8RBgaoi+7+B3iZgN+rxDOFGQwzCTzVzzi0Q9TheOGLTEfPIgjEUJNSfZxpIqR57WtKQ4gXTVuJ0ltVswBbsicuQj1M3Dz5ubKbVNU67e1czxiKzh7s/MdmIDGULAv/HIvyt1RapDwYbfXTLimBbogmibBy3dzdOHzCXv/rEnE6y6O0rgSBxhnA9KZ/BP9BccxSHFah57LVfOTDT73TNSvhzTk9024JhpVeGoTH0CqTOrLeMxdzzEuAGQ0x0uSyxPRKeiyhvPhIwob0Uh+otI7fB1LMEo1G66DJF8tQgTjpqeau3lOjg9ACq2bplplqh399QoSzs1D5rEl07fboQpQ8sy+L3US7R3UPnaks51bnRCbcBtjT5Z4t4d+KLhgJT8nAP8luPhGSRhwbjRdj2LE0GzcL0F2abDaOCv7JN8tkC+hOsuknXYYWryBvGwOpcU/1NJ66Yqm0t8/NQHSajDlt0CxmQBZxWWe5saw1HoLmuDaHckWN/Rf8C8R7MoP6zhS/c0SF1ZS1GUnoh5QGN39rxoP4WzK0wqGVy1VGd3pQiVVxT1MdAWQN7KZsK2LY9oy12LyBc8Xs5MNcuEQDNqJtMevebRkhq6Au6ghx+RqzG9rrWraiq5hRE56G2yXEY/oceToIuHTnhGYcyjGpv1FMBtqcNv714pI/9k6AwnaOPSmmMO5lqARoxUvyfqPDXRY06Y/+dv89fU3q1jTNndNY7atGJ+g1kWaD7ECYToul5QGsVVaHBB/AS6cz9QjuylB0HZ2F3Msg/M1VtYbaatlrBI/bU8kRdGXhJ0m5eVI0ybtDotBFvr01g23Af6V7rZQrBqRwfctfVp0WpyyMmhOF2c2p0GFY701XU4MYEn8P+atDWgz4Gxti97vvDpVKhiQp9HIqfllUztuvThHOVaMctXRYhPopw==
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonServiceLocator" version="2.0.5" targetFramework="net46" />
<package id="MaterialDesignColors" version="1.2.6" targetFramework="net46" />
<package id="MaterialDesignThemes" version="3.1.3" targetFramework="net46" />
<package id="Microsoft.CSharp" version="4.6.0" targetFramework="net46" />
<package id="Microsoft.Xaml.Behaviors.Wpf" version="1.1.19" targetFramework="net46" />
<package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" />
<package id="Panuon.UI.Silver" version="1.1.3.2" targetFramework="net46" />
<package id="System.Data.DataSetExtensions" version="4.6.0-preview3.19128.7" targetFramework="net46" />
</packages>
\ No newline at end of file
单警柜 10000
单警柜 10000
打印程序 10002
通道程序 10001
充电台出入 10003
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论